From 900d329ef5dd1f7d3e62e0213c850bbf7b1dbd89 Mon Sep 17 00:00:00 2001 From: Ilyas Shabi Date: Tue, 18 Nov 2025 08:09:43 +0100 Subject: [PATCH 01/56] node-api: add support for Float16Array PR-URL: https://github.com/nodejs/node/pull/58879 Reviewed-By: Vladimir Morozov Reviewed-By: Chengzhong Wu --- doc/api/n-api.md | 8 ++++++++ src/js_native_api_types.h | 2 ++ src/js_native_api_v8.cc | 6 ++++++ test/js-native-api/test_typedarray/test.js | 6 +++--- test/js-native-api/test_typedarray/test_typedarray.c | 5 ++--- 5 files changed, 21 insertions(+), 6 deletions(-) diff --git a/doc/api/n-api.md b/doc/api/n-api.md index b2032f2c08f730..0eceecf9fe9e31 100644 --- a/doc/api/n-api.md +++ b/doc/api/n-api.md @@ -2286,6 +2286,13 @@ object such that no properties can be set on it, and no prototype. #### `napi_typedarray_type` + + ```c typedef enum { napi_int8_array, @@ -2299,6 +2306,7 @@ typedef enum { napi_float64_array, napi_bigint64_array, napi_biguint64_array, + napi_float16_array, } napi_typedarray_type; ``` diff --git a/src/js_native_api_types.h b/src/js_native_api_types.h index eaae231b4dd4db..9642db6fba0281 100644 --- a/src/js_native_api_types.h +++ b/src/js_native_api_types.h @@ -133,6 +133,8 @@ typedef enum { napi_float64_array, napi_bigint64_array, napi_biguint64_array, +#define NODE_API_HAS_FLOAT16_ARRAY + napi_float16_array, } napi_typedarray_type; typedef enum { diff --git a/src/js_native_api_v8.cc b/src/js_native_api_v8.cc index a5e30895da68b0..8c4062c84275bc 100644 --- a/src/js_native_api_v8.cc +++ b/src/js_native_api_v8.cc @@ -3259,6 +3259,10 @@ napi_status NAPI_CDECL napi_create_typedarray(napi_env env, CREATE_TYPED_ARRAY( env, BigUint64Array, 8, buffer, byte_offset, length, typedArray); break; + case napi_float16_array: + CREATE_TYPED_ARRAY( + env, Float16Array, 2, buffer, byte_offset, length, typedArray); + break; default: return napi_set_last_error(env, napi_invalid_arg); } @@ -3297,6 +3301,8 @@ napi_status NAPI_CDECL napi_get_typedarray_info(napi_env env, *type = napi_int32_array; } else if (value->IsUint32Array()) { *type = napi_uint32_array; + } else if (value->IsFloat16Array()) { + *type = napi_float16_array; } else if (value->IsFloat32Array()) { *type = napi_float32_array; } else if (value->IsFloat64Array()) { diff --git a/test/js-native-api/test_typedarray/test.js b/test/js-native-api/test_typedarray/test.js index 3065ed30dd9984..02a6a2acba816a 100644 --- a/test/js-native-api/test_typedarray/test.js +++ b/test/js-native-api/test_typedarray/test.js @@ -41,8 +41,8 @@ assert.strictEqual(externalResult[2], 2); // Validate creation of all kinds of TypedArrays const buffer = new ArrayBuffer(128); const arrayTypes = [ Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, - Uint16Array, Int32Array, Uint32Array, Float32Array, - Float64Array, BigInt64Array, BigUint64Array ]; + Uint16Array, Int32Array, Uint32Array, Float16Array, + Float32Array, Float64Array, BigInt64Array, BigUint64Array ]; arrayTypes.forEach((currentType) => { const template = Reflect.construct(currentType, buffer); @@ -64,7 +64,7 @@ arrayTypes.forEach((currentType) => { }); const nonByteArrayTypes = [ Int16Array, Uint16Array, Int32Array, Uint32Array, - Float32Array, Float64Array, + Float16Array, Float32Array, Float64Array, BigInt64Array, BigUint64Array ]; nonByteArrayTypes.forEach((currentType) => { const template = Reflect.construct(currentType, buffer); diff --git a/test/js-native-api/test_typedarray/test_typedarray.c b/test/js-native-api/test_typedarray/test_typedarray.c index 240d024691e772..7b4241b2aae46c 100644 --- a/test/js-native-api/test_typedarray/test_typedarray.c +++ b/test/js-native-api/test_typedarray/test_typedarray.c @@ -75,10 +75,9 @@ static napi_value Multiply(napi_env env, napi_callback_info info) { return output_array; } -static void FinalizeCallback(napi_env env, +static void FinalizeCallback(node_api_basic_env env, void* finalize_data, - void* finalize_hint) -{ + void* finalize_hint) { free(finalize_data); } From 6c306b6986cab869deb7cc60610ac2ea7982084a Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Tue, 18 Nov 2025 09:57:30 +0200 Subject: [PATCH 02/56] tools: remove unsupported `cooldown` from Dependabot config MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/60747 Refs: https://docs.github.com/en/code-security/dependabot/working-with-dependabot/dependabot-options-reference#configuration-of-cooldown Reviewed-By: Michaël Zasso Reviewed-By: Ulises Gascón Reviewed-By: Colin Ihrig Reviewed-By: Luigi Pinca --- .github/dependabot.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 9f0452cfeed77b..37b865597e5d25 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -6,10 +6,6 @@ updates: directory: / schedule: interval: monthly - cooldown: - semver-major-days: 5 - semver-minor-days: 5 - semver-patch-days: 5 commit-message: prefix: meta open-pull-requests-limit: 10 From 0b6ae6df14ac7b6dbec4ad5c0473b63072d98cff Mon Sep 17 00:00:00 2001 From: Marco Ippolito Date: Tue, 18 Nov 2025 22:09:57 +0900 Subject: [PATCH 03/56] src: add permission support to config file PR-URL: https://github.com/nodejs/node/pull/60746 Reviewed-By: Rafael Gonzaga Reviewed-By: Pietro Marchini Reviewed-By: Colin Ihrig --- doc/api/permissions.md | 28 +++++ doc/node-config-schema.json | 52 +++++++++ src/node_options.cc | 30 +++-- src/node_options.h | 3 +- .../fixtures/permission/child-process-test.js | 2 + .../permission/config-addons-wasi.json | 6 + .../permission/config-child-worker.json | 6 + .../permission/config-fs-read-write.json | 10 ++ .../permission/config-net-inspector.json | 6 + test/fixtures/permission/fs-read-test.js | 1 + test/fixtures/permission/fs-write-test.js | 6 + test/parallel/test-permission-config-file.mjs | 107 ++++++++++++++++++ 12 files changed, 248 insertions(+), 9 deletions(-) create mode 100644 test/fixtures/permission/child-process-test.js create mode 100644 test/fixtures/permission/config-addons-wasi.json create mode 100644 test/fixtures/permission/config-child-worker.json create mode 100644 test/fixtures/permission/config-fs-read-write.json create mode 100644 test/fixtures/permission/config-net-inspector.json create mode 100644 test/fixtures/permission/fs-read-test.js create mode 100644 test/fixtures/permission/fs-write-test.js create mode 100644 test/parallel/test-permission-config-file.mjs diff --git a/doc/api/permissions.md b/doc/api/permissions.md index 88f485df103021..dedb314f43e7eb 100644 --- a/doc/api/permissions.md +++ b/doc/api/permissions.md @@ -153,6 +153,34 @@ does not exist, the wildcard will not be added, and access will be limited to yet, make sure to explicitly include the wildcard: `/my-path/folder-do-not-exist/*`. +#### Configuration file support + +In addition to passing permission flags on the command line, they can also be +declared in a Node.js configuration file when using the experimental +\[`--experimental-config-file`]\[] flag. Permission options must be placed inside +the `permission` top-level object. + +Example `node.config.json`: + +```json +{ + "permission": { + "allow-fs-read": ["./foo"], + "allow-fs-write": ["./bar"], + "allow-child-process": true, + "allow-worker": true, + "allow-net": true, + "allow-addons": false + } +} +``` + +Run with the configuration file: + +```console +$ node --permission --experimental-default-config-file app.js +``` + #### Using the Permission Model with `npx` If you're using [`npx`][] to execute a Node.js script, you can enable the diff --git a/doc/node-config-schema.json b/doc/node-config-schema.json index 893f55d9251ca4..916bc1c4f62002 100644 --- a/doc/node-config-schema.json +++ b/doc/node-config-schema.json @@ -603,6 +603,58 @@ }, "type": "object" }, + "permission": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-addons": { + "type": "boolean" + }, + "allow-child-process": { + "type": "boolean" + }, + "allow-fs-read": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string", + "minItems": 1 + }, + "type": "array" + } + ] + }, + "allow-fs-write": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string", + "minItems": 1 + }, + "type": "array" + } + ] + }, + "allow-inspector": { + "type": "boolean" + }, + "allow-net": { + "type": "boolean" + }, + "allow-wasi": { + "type": "boolean" + }, + "allow-worker": { + "type": "boolean" + } + } + }, "testRunner": { "type": "object", "additionalProperties": false, diff --git a/src/node_options.cc b/src/node_options.cc index 8dd186477c8875..959a5df163b609 100644 --- a/src/node_options.cc +++ b/src/node_options.cc @@ -603,35 +603,49 @@ EnvironmentOptionsParser::EnvironmentOptionsParser() { AddOption("--allow-fs-read", "allow permissions to read the filesystem", &EnvironmentOptions::allow_fs_read, - kAllowedInEnvvar); + kAllowedInEnvvar, + OptionNamespaces::kPermissionNamespace); AddOption("--allow-fs-write", "allow permissions to write in the filesystem", &EnvironmentOptions::allow_fs_write, - kAllowedInEnvvar); + kAllowedInEnvvar, + OptionNamespaces::kPermissionNamespace); AddOption("--allow-addons", "allow use of addons when any permissions are set", &EnvironmentOptions::allow_addons, - kAllowedInEnvvar); + kAllowedInEnvvar, + false, + OptionNamespaces::kPermissionNamespace); AddOption("--allow-child-process", "allow use of child process when any permissions are set", &EnvironmentOptions::allow_child_process, - kAllowedInEnvvar); + kAllowedInEnvvar, + false, + OptionNamespaces::kPermissionNamespace); AddOption("--allow-inspector", "allow use of inspector when any permissions are set", &EnvironmentOptions::allow_inspector, - kAllowedInEnvvar); + kAllowedInEnvvar, + false, + OptionNamespaces::kPermissionNamespace); AddOption("--allow-net", "allow use of network when any permissions are set", &EnvironmentOptions::allow_net, - kAllowedInEnvvar); + kAllowedInEnvvar, + false, + OptionNamespaces::kPermissionNamespace); AddOption("--allow-wasi", "allow wasi when any permissions are set", &EnvironmentOptions::allow_wasi, - kAllowedInEnvvar); + kAllowedInEnvvar, + false, + OptionNamespaces::kPermissionNamespace); AddOption("--allow-worker", "allow worker threads when any permissions are set", &EnvironmentOptions::allow_worker_threads, - kAllowedInEnvvar); + kAllowedInEnvvar, + false, + OptionNamespaces::kPermissionNamespace); AddOption("--experimental-repl-await", "experimental await keyword support in REPL", &EnvironmentOptions::experimental_repl_await, diff --git a/src/node_options.h b/src/node_options.h index 620ba0fc035a5b..9afdeb983d6b26 100644 --- a/src/node_options.h +++ b/src/node_options.h @@ -416,7 +416,8 @@ std::vector MapAvailableNamespaces(); #define OPTION_NAMESPACE_LIST(V) \ V(kNoNamespace, "") \ V(kTestRunnerNamespace, "testRunner") \ - V(kWatchNamespace, "watch") + V(kWatchNamespace, "watch") \ + V(kPermissionNamespace, "permission") enum class OptionNamespaces { #define V(name, _) name, diff --git a/test/fixtures/permission/child-process-test.js b/test/fixtures/permission/child-process-test.js new file mode 100644 index 00000000000000..364ba59f7cca3c --- /dev/null +++ b/test/fixtures/permission/child-process-test.js @@ -0,0 +1,2 @@ +const { spawnSync } = require('child_process'); +spawnSync(process.execPath, ['--version']); diff --git a/test/fixtures/permission/config-addons-wasi.json b/test/fixtures/permission/config-addons-wasi.json new file mode 100644 index 00000000000000..c0ee6d61656dd2 --- /dev/null +++ b/test/fixtures/permission/config-addons-wasi.json @@ -0,0 +1,6 @@ +{ + "permission": { + "allow-addons": true, + "allow-wasi": true + } +} \ No newline at end of file diff --git a/test/fixtures/permission/config-child-worker.json b/test/fixtures/permission/config-child-worker.json new file mode 100644 index 00000000000000..222cd1b7551f57 --- /dev/null +++ b/test/fixtures/permission/config-child-worker.json @@ -0,0 +1,6 @@ +{ + "permission": { + "allow-child-process": true, + "allow-worker": true + } +} \ No newline at end of file diff --git a/test/fixtures/permission/config-fs-read-write.json b/test/fixtures/permission/config-fs-read-write.json new file mode 100644 index 00000000000000..3e9ba75c3657d2 --- /dev/null +++ b/test/fixtures/permission/config-fs-read-write.json @@ -0,0 +1,10 @@ +{ + "permission": { + "allow-fs-read": [ + "*" + ], + "allow-fs-write": [ + "*" + ] + } +} \ No newline at end of file diff --git a/test/fixtures/permission/config-net-inspector.json b/test/fixtures/permission/config-net-inspector.json new file mode 100644 index 00000000000000..39743b8337301c --- /dev/null +++ b/test/fixtures/permission/config-net-inspector.json @@ -0,0 +1,6 @@ +{ + "permission": { + "allow-net": true, + "allow-inspector": true + } +} \ No newline at end of file diff --git a/test/fixtures/permission/fs-read-test.js b/test/fixtures/permission/fs-read-test.js new file mode 100644 index 00000000000000..dbe81615459f60 --- /dev/null +++ b/test/fixtures/permission/fs-read-test.js @@ -0,0 +1 @@ +require('fs').readFileSync(__filename); diff --git a/test/fixtures/permission/fs-write-test.js b/test/fixtures/permission/fs-write-test.js new file mode 100644 index 00000000000000..9c9c7664daa42a --- /dev/null +++ b/test/fixtures/permission/fs-write-test.js @@ -0,0 +1,6 @@ +const fs = require('fs'); +const path = require('path'); +const os = require('os'); + +const tmpFile = path.join(os.tmpdir(), 'permission-test-' + Date.now() + '.txt'); +fs.writeFileSync(tmpFile, 'test'); diff --git a/test/parallel/test-permission-config-file.mjs b/test/parallel/test-permission-config-file.mjs new file mode 100644 index 00000000000000..9ca50284435707 --- /dev/null +++ b/test/parallel/test-permission-config-file.mjs @@ -0,0 +1,107 @@ +import { spawnPromisified } from '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import assert from 'node:assert'; +import { describe, it } from 'node:test'; + +describe('Permission model config file support', () => { + it('should load filesystem read/write permissions from config file', async () => { + const configPath = fixtures.path('permission/config-fs-read-write.json'); + const readTestPath = fixtures.path('permission/fs-read-test.js'); + const writeTestPath = fixtures.path('permission/fs-write-test.js'); + + { + const result = await spawnPromisified(process.execPath, [ + '--permission', + '--experimental-config-file', + configPath, + readTestPath, + ]); + assert.strictEqual(result.code, 0); + } + + { + const result = await spawnPromisified(process.execPath, [ + '--permission', + '--experimental-config-file', + configPath, + writeTestPath, + ]); + assert.strictEqual(result.code, 0); + } + }); + + it('should load child process and worker permissions from config file', async () => { + const configPath = fixtures.path('permission/config-child-worker.json'); + const childTestPath = fixtures.path('permission/child-process-test.js'); + + const result = await spawnPromisified(process.execPath, [ + '--permission', + '--experimental-config-file', + configPath, + '--allow-fs-read=*', + childTestPath, + ]); + assert.strictEqual(result.code, 0); + }); + + it('should load network and inspector permissions from config file', async () => { + const configPath = fixtures.path('permission/config-net-inspector.json'); + + const result = await spawnPromisified(process.execPath, [ + '--permission', + '--experimental-config-file', + configPath, + '--allow-fs-read=*', + '-p', + 'process.permission.has("net") && process.permission.has("inspector")', + ]); + assert.match(result.stdout, /true/); + assert.strictEqual(result.code, 0); + }); + + it('should load addons and wasi permissions from config file', async () => { + const configPath = fixtures.path('permission/config-addons-wasi.json'); + + const result = await spawnPromisified(process.execPath, [ + '--permission', + '--experimental-config-file', + configPath, + '--allow-fs-read=*', + '-p', + 'process.permission.has("addon") && process.permission.has("wasi")', + ]); + assert.match(result.stdout, /true/); + assert.strictEqual(result.code, 0); + }); + + it('should deny operations when permissions are not in config file', async () => { + const configPath = fixtures.path('permission/config-fs-read-write.json'); + + const result = await spawnPromisified(process.execPath, [ + '--permission', + '--experimental-config-file', + configPath, + '--allow-fs-read=*', + '-p', + 'process.permission.has("child")', + ]); + assert.match(result.stdout, /false/); + assert.strictEqual(result.code, 0); + }); + + it('should combine config file permissions with CLI flags', async () => { + const configPath = fixtures.path('permission/config-fs-read-write.json'); + + const result = await spawnPromisified(process.execPath, [ + '--permission', + '--experimental-config-file', + configPath, + '--allow-child-process', + '--allow-fs-read=*', + '-p', + 'process.permission.has("child") && process.permission.has("fs.read")', + ]); + assert.match(result.stdout, /true/); + assert.strictEqual(result.code, 0); + }); +}); From 037a673b9b042ebdc454180a65ec46535c8be86f Mon Sep 17 00:00:00 2001 From: David Hidalgo Date: Mon, 17 Nov 2025 19:53:48 -0400 Subject: [PATCH 04/56] tools: update install_tools.bat old echo from 2019 to 2022 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/60736 Fixes: https://github.com/nodejs/node/issues/60733 Reviewed-By: Stefan Stojanovic Reviewed-By: René --- tools/msvs/install_tools/install_tools.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/msvs/install_tools/install_tools.bat b/tools/msvs/install_tools/install_tools.bat index 9d759f6398118f..bf9c47b8c3d0fb 100644 --- a/tools/msvs/install_tools/install_tools.bat +++ b/tools/msvs/install_tools/install_tools.bat @@ -39,7 +39,7 @@ echo license terms or not. Read and understand the license terms of the packages echo being installed and their dependencies prior to installation: echo - https://chocolatey.org/packages/chocolatey echo - https://chocolatey.org/packages/python -echo - https://chocolatey.org/packages/visualstudio2019-workload-vctools +echo - https://chocolatey.org/packages/visualstudio2022-workload-vctools echo. echo This script is provided AS-IS without any warranties of any kind echo ---------------------------------------------------------------- From d4a282b30231d32d36e71c1f28d90e56ee4b9ea8 Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Tue, 18 Nov 2025 23:45:40 +0200 Subject: [PATCH 05/56] tools: fix `paths-ignore` in gha files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/60753 Reviewed-By: Ulises Gascón Reviewed-By: Michaël Zasso Reviewed-By: Moshe Atlow Reviewed-By: Colin Ihrig Reviewed-By: Luigi Pinca --- .github/workflows/build-tarball.yml | 2 ++ .github/workflows/test-linux.yml | 4 ++-- .github/workflows/test-macos.yml | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-tarball.yml b/.github/workflows/build-tarball.yml index ede96dc70f42d3..158384975ff693 100644 --- a/.github/workflows/build-tarball.yml +++ b/.github/workflows/build-tarball.yml @@ -6,6 +6,7 @@ on: paths-ignore: - .mailmap - '**.md' + - '**.nix' - AUTHORS - doc/** - test/internet/** @@ -19,6 +20,7 @@ on: paths-ignore: - .mailmap - '**.md' + - '**.nix' - AUTHORS - doc/** - test/internet/** diff --git a/.github/workflows/test-linux.yml b/.github/workflows/test-linux.yml index ab5260542781eb..1d3b096db106ce 100644 --- a/.github/workflows/test-linux.yml +++ b/.github/workflows/test-linux.yml @@ -6,7 +6,7 @@ on: - .mailmap - README.md - test/internet/** - - '*.nix' + - '**.nix' - .github/** - '!.github/workflows/test-linux.yml' types: [opened, synchronize, reopened, ready_for_review] @@ -20,7 +20,7 @@ on: - .mailmap - README.md - test/internet/** - - '*.nix' + - '**.nix' - .github/** - '!.github/workflows/test-linux.yml' diff --git a/.github/workflows/test-macos.yml b/.github/workflows/test-macos.yml index d1ae87901cddc3..91be7add917fe3 100644 --- a/.github/workflows/test-macos.yml +++ b/.github/workflows/test-macos.yml @@ -6,7 +6,7 @@ on: paths-ignore: - .mailmap - '**.md' - - '*.nix' + - '**.nix' - AUTHORS - doc/** - test/internet/** @@ -21,7 +21,7 @@ on: paths-ignore: - .mailmap - '**.md' - - '*.nix' + - '**.nix' - AUTHORS - doc/** - test/internet/** From b5c9469d997f963fa87b2ebd2debdadc59094611 Mon Sep 17 00:00:00 2001 From: Chengzhong Wu Date: Wed, 19 Nov 2025 10:05:22 +0900 Subject: [PATCH 06/56] src: split inspector protocol domains files This splits inspector protocol domains into their own dedicated pdl files. PR-URL: https://github.com/nodejs/node/pull/60754 Refs: https://github.com/ChromeDevTools/devtools-protocol/tree/master/pdl/domains Reviewed-By: Ryuhei Shima Reviewed-By: Moshe Atlow Reviewed-By: Jithil P Ponnan Reviewed-By: Colin Ihrig Reviewed-By: Kohei Ueno --- src/inspector/domain_io.pdl | 24 ++ src/inspector/domain_network.pdl | 228 +++++++++++++++ src/inspector/domain_node_runtime.pdl | 22 ++ src/inspector/domain_node_tracing.pdl | 34 +++ src/inspector/domain_node_worker.pdl | 59 ++++ src/inspector/domain_target.pdl | 26 ++ src/inspector/node_inspector.gypi | 17 +- src/inspector/node_protocol.pdl | 397 +------------------------- 8 files changed, 412 insertions(+), 395 deletions(-) create mode 100644 src/inspector/domain_io.pdl create mode 100644 src/inspector/domain_network.pdl create mode 100644 src/inspector/domain_node_runtime.pdl create mode 100644 src/inspector/domain_node_tracing.pdl create mode 100644 src/inspector/domain_node_worker.pdl create mode 100644 src/inspector/domain_target.pdl diff --git a/src/inspector/domain_io.pdl b/src/inspector/domain_io.pdl new file mode 100644 index 00000000000000..2500db1c43a91f --- /dev/null +++ b/src/inspector/domain_io.pdl @@ -0,0 +1,24 @@ +# Partial support for IO domain of ChromeDevTools Protocol. +# https://github.com/ChromeDevTools/devtools-protocol/blob/master/pdl/domains/IO.pdl + +domain IO + type StreamHandle extends string + # Read a chunk of the stream + command read + parameters + # Handle of the stream to read. + StreamHandle handle + # Seek to the specified offset before reading (if not specified, proceed with offset + # following the last read). Some types of streams may only support sequential reads. + optional integer offset + # Maximum number of bytes to read (left upon the agent discretion if not specified). + optional integer size + returns + # Data that were read. + string data + # Set if the end-of-file condition occurred while reading. + boolean eof + command close + parameters + # Handle of the stream to close. + StreamHandle handle diff --git a/src/inspector/domain_network.pdl b/src/inspector/domain_network.pdl new file mode 100644 index 00000000000000..fdfd9ebe1fdeb4 --- /dev/null +++ b/src/inspector/domain_network.pdl @@ -0,0 +1,228 @@ +# Partial support for Network domain of ChromeDevTools Protocol. +# https://github.com/ChromeDevTools/devtools-protocol/blob/master/pdl/domains/Network.pdl + +experimental domain Network + depends on Runtime + + # Resource type as it was perceived by the rendering engine. + type ResourceType extends string + enum + Document + Stylesheet + Image + Media + Font + Script + TextTrack + XHR + Fetch + Prefetch + EventSource + WebSocket + Manifest + SignedExchange + Ping + CSPViolationReport + Preflight + Other + + # Unique request identifier. + type RequestId extends string + + # UTC time in seconds, counted from January 1, 1970. + type TimeSinceEpoch extends number + + # Monotonically increasing time in seconds since an arbitrary point in the past. + type MonotonicTime extends number + + # Information about the request initiator. + type Initiator extends object + properties + # Type of this initiator. + enum type + parser + script + preload + SignedExchange + preflight + other + # Initiator JavaScript stack trace, set for Script only. + # Requires the Debugger domain to be enabled. + optional Runtime.StackTrace stack + # Initiator URL, set for Parser type or for Script type (when script is importing module) or for SignedExchange type. + optional string url + # Initiator line number, set for Parser type or for Script type (when script is importing + # module) (0-based). + optional number lineNumber + # Initiator column number, set for Parser type or for Script type (when script is importing + # module) (0-based). + optional number columnNumber + # Set if another request triggered this request (e.g. preflight). + optional RequestId requestId + + # HTTP request data. + type Request extends object + properties + string url + string method + Headers headers + boolean hasPostData + + # HTTP response data. + type Response extends object + properties + string url + integer status + string statusText + Headers headers + string mimeType + string charset + + # Request / response headers as keys / values of JSON object. + type Headers extends object + + type LoadNetworkResourcePageResult extends object + properties + boolean success + optional IO.StreamHandle stream + + # WebSocket response data. + type WebSocketResponse extends object + properties + # HTTP response status code. + integer status + # HTTP response status text. + string statusText + # HTTP response headers. + Headers headers + + # Disables network tracking, prevents network events from being sent to the client. + command disable + + # Enables network tracking, network events will now be delivered to the client. + command enable + parameters + # Buffer size in bytes to use when preserving network payloads (XHRs, etc). + experimental optional integer maxTotalBufferSize + # Per-resource buffer size in bytes to use when preserving network payloads (XHRs, etc). + experimental optional integer maxResourceBufferSize + + # Returns post data sent with the request. Returns an error when no data was sent with the request. + command getRequestPostData + parameters + # Identifier of the network request to get content for. + RequestId requestId + returns + # Request body string, omitting files from multipart requests + string postData + + # Returns content served for the given request. + command getResponseBody + parameters + # Identifier of the network request to get content for. + RequestId requestId + returns + # Response body. + string body + # True, if content was sent as base64. + boolean base64Encoded + + # Enables streaming of the response for the given requestId. + # If enabled, the dataReceived event contains the data that was received during streaming. + experimental command streamResourceContent + parameters + # Identifier of the request to stream. + RequestId requestId + returns + # Data that has been buffered until streaming is enabled. + binary bufferedData + # Fetches the resource and returns the content. + command loadNetworkResource + parameters + # URL of the resource to get content for. + string url + returns + LoadNetworkResourcePageResult resource + + # Fired when page is about to send HTTP request. + event requestWillBeSent + parameters + # Request identifier. + RequestId requestId + # Request data. + Request request + # Request initiator. + Initiator initiator + # Timestamp. + MonotonicTime timestamp + # Timestamp. + TimeSinceEpoch wallTime + + # Fired when HTTP response is available. + event responseReceived + parameters + # Request identifier. + RequestId requestId + # Timestamp. + MonotonicTime timestamp + # Resource type. + ResourceType type + # Response data. + Response response + + event loadingFailed + parameters + # Request identifier. + RequestId requestId + # Timestamp. + MonotonicTime timestamp + # Resource type. + ResourceType type + # Error message. + string errorText + + event loadingFinished + parameters + # Request identifier. + RequestId requestId + # Timestamp. + MonotonicTime timestamp + + # Fired when data chunk was received over the network. + event dataReceived + parameters + # Request identifier. + RequestId requestId + # Timestamp. + MonotonicTime timestamp + # Data chunk length. + integer dataLength + # Actual bytes received (might be less than dataLength for compressed encodings). + integer encodedDataLength + # Data that was received. + experimental optional binary data + # Fired upon WebSocket creation. + event webSocketCreated + parameters + # Request identifier. + RequestId requestId + # WebSocket request URL. + string url + # Request initiator. + Initiator initiator + # Fired when WebSocket is closed. + event webSocketClosed + parameters + # Request identifier. + RequestId requestId + # Timestamp. + MonotonicTime timestamp + # Fired when WebSocket handshake response becomes available. + event webSocketHandshakeResponseReceived + parameters + # Request identifier. + RequestId requestId + # Timestamp. + MonotonicTime timestamp + # WebSocket response data. + WebSocketResponse response diff --git a/src/inspector/domain_node_runtime.pdl b/src/inspector/domain_node_runtime.pdl new file mode 100644 index 00000000000000..6d3e812a643020 --- /dev/null +++ b/src/inspector/domain_node_runtime.pdl @@ -0,0 +1,22 @@ +# Support for inspecting node process state. +experimental domain NodeRuntime + # Enable the NodeRuntime events except by `NodeRuntime.waitingForDisconnect`. + command enable + + # Disable NodeRuntime events + command disable + + # Enable the `NodeRuntime.waitingForDisconnect`. + command notifyWhenWaitingForDisconnect + parameters + boolean enabled + + # This event is fired instead of `Runtime.executionContextDestroyed` when + # enabled. + # It is fired when the Node process finished all code execution and is + # waiting for all frontends to disconnect. + event waitingForDisconnect + + # This event is fired when the runtime is waiting for the debugger. For + # example, when inspector.waitingForDebugger is called + event waitingForDebugger diff --git a/src/inspector/domain_node_tracing.pdl b/src/inspector/domain_node_tracing.pdl new file mode 100644 index 00000000000000..3da8514b671436 --- /dev/null +++ b/src/inspector/domain_node_tracing.pdl @@ -0,0 +1,34 @@ +experimental domain NodeTracing + type TraceConfig extends object + properties + # Controls how the trace buffer stores data. + optional enum recordMode + recordUntilFull + recordContinuously + recordAsMuchAsPossible + # Included category filters. + array of string includedCategories + + # Gets supported tracing categories. + command getCategories + returns + # A list of supported tracing categories. + array of string categories + + # Start trace events collection. + command start + parameters + TraceConfig traceConfig + + # Stop trace events collection. Remaining collected events will be sent as a sequence of + # dataCollected events followed by tracingComplete event. + command stop + + # Contains an bucket of collected trace events. + event dataCollected + parameters + array of object value + + # Signals that tracing is stopped and there is no trace buffers pending flush, all data were + # delivered via dataCollected events. + event tracingComplete diff --git a/src/inspector/domain_node_worker.pdl b/src/inspector/domain_node_worker.pdl new file mode 100644 index 00000000000000..785ed714a1afce --- /dev/null +++ b/src/inspector/domain_node_worker.pdl @@ -0,0 +1,59 @@ +# Support for sending messages to Node worker Inspector instances. +experimental domain NodeWorker + + type WorkerID extends string + + # Unique identifier of attached debugging session. + type SessionID extends string + + type WorkerInfo extends object + properties + WorkerID workerId + string type + string title + string url + + # Sends protocol message over session with given id. + command sendMessageToWorker + parameters + string message + # Identifier of the session. + SessionID sessionId + + # Instructs the inspector to attach to running workers. Will also attach to new workers + # as they start + command enable + parameters + # Whether to new workers should be paused until the frontend sends `Runtime.runIfWaitingForDebugger` + # message to run them. + boolean waitForDebuggerOnStart + + # Detaches from all running workers and disables attaching to new workers as they are started. + command disable + + # Detached from the worker with given sessionId. + command detach + parameters + SessionID sessionId + + # Issued when attached to a worker. + event attachedToWorker + parameters + # Identifier assigned to the session used to send/receive messages. + SessionID sessionId + WorkerInfo workerInfo + boolean waitingForDebugger + + # Issued when detached from the worker. + event detachedFromWorker + parameters + # Detached session identifier. + SessionID sessionId + + # Notifies about a new protocol message received from the session + # (session ID is provided in attachedToWorker notification). + event receivedMessageFromWorker + parameters + # Identifier of a session which sends a message. + SessionID sessionId + string message diff --git a/src/inspector/domain_target.pdl b/src/inspector/domain_target.pdl new file mode 100644 index 00000000000000..3195b3a441d8ab --- /dev/null +++ b/src/inspector/domain_target.pdl @@ -0,0 +1,26 @@ +# Partial support for IO domain of ChromeDevTools Protocol. +# https://github.com/ChromeDevTools/devtools-protocol/blob/master/pdl/domains/Target.pdl + +experimental domain Target + type SessionID extends string + type TargetID extends string + type TargetInfo extends object + properties + TargetID targetId + string type + string title + string url + boolean attached + boolean canAccessOpener + event targetCreated + parameters + TargetInfo targetInfo + event attachedToTarget + parameters + SessionID sessionId + TargetInfo targetInfo + boolean waitingForDebugger + command setAutoAttach + parameters + boolean autoAttach + boolean waitForDebuggerOnStart diff --git a/src/inspector/node_inspector.gypi b/src/inspector/node_inspector.gypi index ad81f837e84d76..cde02a28d03dfa 100644 --- a/src/inspector/node_inspector.gypi +++ b/src/inspector/node_inspector.gypi @@ -71,7 +71,16 @@ '<(protocol_tool_path)/templates/Imported_h.template', '<(protocol_tool_path)/templates/TypeBuilder_cpp.template', '<(protocol_tool_path)/templates/TypeBuilder_h.template', - ] + ], + 'node_pdl_files': [ + 'node_protocol.pdl', + 'domain_io.pdl', + 'domain_network.pdl', + 'domain_node_runtime.pdl', + 'domain_node_tracing.pdl', + 'domain_node_worker.pdl', + 'domain_target.pdl', + ], }, 'defines': [ 'HAVE_INSPECTOR=1', @@ -92,7 +101,7 @@ { 'action_name': 'convert_node_protocol_to_json', 'inputs': [ - 'node_protocol.pdl', + '<@(node_pdl_files)', ], 'outputs': [ '<(SHARED_INTERMEDIATE_DIR)/src/node_protocol.json', @@ -100,7 +109,7 @@ 'action': [ '<(python)', '<(protocol_tool_path)/convert_protocol_to_json.py', - '<@(_inputs)', + 'src/inspector/node_protocol.pdl', '<@(_outputs)', ], }, @@ -108,7 +117,7 @@ 'action_name': 'node_protocol_generated_sources', 'inputs': [ 'node_protocol_config.json', - 'node_protocol.pdl', + '<@(node_pdl_files)', '<(SHARED_INTERMEDIATE_DIR)/src/node_protocol.json', '<@(node_protocol_files)', '<(protocol_tool_path)/code_generator.py', diff --git a/src/inspector/node_protocol.pdl b/src/inspector/node_protocol.pdl index 24cff73585aeb7..87b3d93d39c245 100644 --- a/src/inspector/node_protocol.pdl +++ b/src/inspector/node_protocol.pdl @@ -3,394 +3,9 @@ version major 1 minor 0 -experimental domain NodeTracing - type TraceConfig extends object - properties - # Controls how the trace buffer stores data. - optional enum recordMode - recordUntilFull - recordContinuously - recordAsMuchAsPossible - # Included category filters. - array of string includedCategories - - # Gets supported tracing categories. - command getCategories - returns - # A list of supported tracing categories. - array of string categories - - # Start trace events collection. - command start - parameters - TraceConfig traceConfig - - # Stop trace events collection. Remaining collected events will be sent as a sequence of - # dataCollected events followed by tracingComplete event. - command stop - - # Contains an bucket of collected trace events. - event dataCollected - parameters - array of object value - - # Signals that tracing is stopped and there is no trace buffers pending flush, all data were - # delivered via dataCollected events. - event tracingComplete - -# Support for sending messages to Node worker Inspector instances. -experimental domain NodeWorker - - type WorkerID extends string - - # Unique identifier of attached debugging session. - type SessionID extends string - - type WorkerInfo extends object - properties - WorkerID workerId - string type - string title - string url - - # Sends protocol message over session with given id. - command sendMessageToWorker - parameters - string message - # Identifier of the session. - SessionID sessionId - - # Instructs the inspector to attach to running workers. Will also attach to new workers - # as they start - command enable - parameters - # Whether to new workers should be paused until the frontend sends `Runtime.runIfWaitingForDebugger` - # message to run them. - boolean waitForDebuggerOnStart - - # Detaches from all running workers and disables attaching to new workers as they are started. - command disable - - # Detached from the worker with given sessionId. - command detach - parameters - SessionID sessionId - - # Issued when attached to a worker. - event attachedToWorker - parameters - # Identifier assigned to the session used to send/receive messages. - SessionID sessionId - WorkerInfo workerInfo - boolean waitingForDebugger - - # Issued when detached from the worker. - event detachedFromWorker - parameters - # Detached session identifier. - SessionID sessionId - - # Notifies about a new protocol message received from the session - # (session ID is provided in attachedToWorker notification). - event receivedMessageFromWorker - parameters - # Identifier of a session which sends a message. - SessionID sessionId - string message - -# Partial support for Network domain of ChromeDevTools Protocol. -# https://chromedevtools.github.io/devtools-protocol/tot/Network -experimental domain Network - depends on Runtime - - # Resource type as it was perceived by the rendering engine. - type ResourceType extends string - enum - Document - Stylesheet - Image - Media - Font - Script - TextTrack - XHR - Fetch - Prefetch - EventSource - WebSocket - Manifest - SignedExchange - Ping - CSPViolationReport - Preflight - Other - - # Unique request identifier. - type RequestId extends string - - # UTC time in seconds, counted from January 1, 1970. - type TimeSinceEpoch extends number - - # Monotonically increasing time in seconds since an arbitrary point in the past. - type MonotonicTime extends number - - # Information about the request initiator. - type Initiator extends object - properties - # Type of this initiator. - enum type - parser - script - preload - SignedExchange - preflight - other - # Initiator JavaScript stack trace, set for Script only. - # Requires the Debugger domain to be enabled. - optional Runtime.StackTrace stack - # Initiator URL, set for Parser type or for Script type (when script is importing module) or for SignedExchange type. - optional string url - # Initiator line number, set for Parser type or for Script type (when script is importing - # module) (0-based). - optional number lineNumber - # Initiator column number, set for Parser type or for Script type (when script is importing - # module) (0-based). - optional number columnNumber - # Set if another request triggered this request (e.g. preflight). - optional RequestId requestId - - # HTTP request data. - type Request extends object - properties - string url - string method - Headers headers - boolean hasPostData - - # HTTP response data. - type Response extends object - properties - string url - integer status - string statusText - Headers headers - string mimeType - string charset - - # Request / response headers as keys / values of JSON object. - type Headers extends object - - type LoadNetworkResourcePageResult extends object - properties - boolean success - optional IO.StreamHandle stream - - # WebSocket response data. - type WebSocketResponse extends object - properties - # HTTP response status code. - integer status - # HTTP response status text. - string statusText - # HTTP response headers. - Headers headers - - # Disables network tracking, prevents network events from being sent to the client. - command disable - - # Enables network tracking, network events will now be delivered to the client. - command enable - parameters - # Buffer size in bytes to use when preserving network payloads (XHRs, etc). - experimental optional integer maxTotalBufferSize - # Per-resource buffer size in bytes to use when preserving network payloads (XHRs, etc). - experimental optional integer maxResourceBufferSize - - # Returns post data sent with the request. Returns an error when no data was sent with the request. - command getRequestPostData - parameters - # Identifier of the network request to get content for. - RequestId requestId - returns - # Request body string, omitting files from multipart requests - string postData - - # Returns content served for the given request. - command getResponseBody - parameters - # Identifier of the network request to get content for. - RequestId requestId - returns - # Response body. - string body - # True, if content was sent as base64. - boolean base64Encoded - - # Enables streaming of the response for the given requestId. - # If enabled, the dataReceived event contains the data that was received during streaming. - experimental command streamResourceContent - parameters - # Identifier of the request to stream. - RequestId requestId - returns - # Data that has been buffered until streaming is enabled. - binary bufferedData - # Fetches the resource and returns the content. - command loadNetworkResource - parameters - # URL of the resource to get content for. - string url - returns - LoadNetworkResourcePageResult resource - - # Fired when page is about to send HTTP request. - event requestWillBeSent - parameters - # Request identifier. - RequestId requestId - # Request data. - Request request - # Request initiator. - Initiator initiator - # Timestamp. - MonotonicTime timestamp - # Timestamp. - TimeSinceEpoch wallTime - - # Fired when HTTP response is available. - event responseReceived - parameters - # Request identifier. - RequestId requestId - # Timestamp. - MonotonicTime timestamp - # Resource type. - ResourceType type - # Response data. - Response response - - event loadingFailed - parameters - # Request identifier. - RequestId requestId - # Timestamp. - MonotonicTime timestamp - # Resource type. - ResourceType type - # Error message. - string errorText - - event loadingFinished - parameters - # Request identifier. - RequestId requestId - # Timestamp. - MonotonicTime timestamp - - # Fired when data chunk was received over the network. - event dataReceived - parameters - # Request identifier. - RequestId requestId - # Timestamp. - MonotonicTime timestamp - # Data chunk length. - integer dataLength - # Actual bytes received (might be less than dataLength for compressed encodings). - integer encodedDataLength - # Data that was received. - experimental optional binary data - # Fired upon WebSocket creation. - event webSocketCreated - parameters - # Request identifier. - RequestId requestId - # WebSocket request URL. - string url - # Request initiator. - Initiator initiator - # Fired when WebSocket is closed. - event webSocketClosed - parameters - # Request identifier. - RequestId requestId - # Timestamp. - MonotonicTime timestamp - # Fired when WebSocket handshake response becomes available. - event webSocketHandshakeResponseReceived - parameters - # Request identifier. - RequestId requestId - # Timestamp. - MonotonicTime timestamp - # WebSocket response data. - WebSocketResponse response - -# Support for inspecting node process state. -experimental domain NodeRuntime - # Enable the NodeRuntime events except by `NodeRuntime.waitingForDisconnect`. - command enable - - # Disable NodeRuntime events - command disable - - # Enable the `NodeRuntime.waitingForDisconnect`. - command notifyWhenWaitingForDisconnect - parameters - boolean enabled - - # This event is fired instead of `Runtime.executionContextDestroyed` when - # enabled. - # It is fired when the Node process finished all code execution and is - # waiting for all frontends to disconnect. - event waitingForDisconnect - - # This event is fired when the runtime is waiting for the debugger. For - # example, when inspector.waitingForDebugger is called - event waitingForDebugger - -# https://chromedevtools.github.io/devtools-protocol/1-3/Target/ -experimental domain Target - type SessionID extends string - type TargetID extends string - type TargetInfo extends object - properties - TargetID targetId - string type - string title - string url - boolean attached - boolean canAccessOpener - event targetCreated - parameters - TargetInfo targetInfo - event attachedToTarget - parameters - SessionID sessionId - TargetInfo targetInfo - boolean waitingForDebugger - command setAutoAttach - parameters - boolean autoAttach - boolean waitForDebuggerOnStart -domain IO - type StreamHandle extends string - # Read a chunk of the stream - command read - parameters - # Handle of the stream to read. - StreamHandle handle - # Seek to the specified offset before reading (if not specified, proceed with offset - # following the last read). Some types of streams may only support sequential reads. - optional integer offset - # Maximum number of bytes to read (left upon the agent discretion if not specified). - optional integer size - returns - # Data that were read. - string data - # Set if the end-of-file condition occurred while reading. - boolean eof - command close - parameters - # Handle of the stream to close. - StreamHandle handle +include domain_io.pdl +include domain_network.pdl +include domain_node_runtime.pdl +include domain_node_tracing.pdl +include domain_node_worker.pdl +include domain_target.pdl From 934d90735ae36bc1bd362bf28f901d7b68c1176e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Zasso?= Date: Wed, 19 Nov 2025 17:01:37 +0100 Subject: [PATCH 07/56] build: add support for Visual Studio 2026 PR-URL: https://github.com/nodejs/node/pull/60727 Reviewed-By: Luigi Pinca Reviewed-By: Colin Ihrig Reviewed-By: Yagiz Nizipli Reviewed-By: Stefan Stojanovic --- vcbuild.bat | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/vcbuild.bat b/vcbuild.bat index 672479614c54d0..2ade326302ccea 100644 --- a/vcbuild.bat +++ b/vcbuild.bat @@ -86,6 +86,7 @@ if /i "%1"=="x86" set target_arch=x86&goto arg-ok if /i "%1"=="x64" set target_arch=x64&goto arg-ok if /i "%1"=="arm64" set target_arch=arm64&goto arg-ok if /i "%1"=="vs2022" set target_env=vs2022&goto arg-ok +if /i "%1"=="vs2026" set target_env=vs2026&goto arg-ok if /i "%1"=="noprojgen" set noprojgen=1&goto arg-ok if /i "%1"=="projgen" set projgen=1&goto arg-ok if /i "%1"=="clang-cl" set clang_cl=1&goto arg-ok @@ -184,6 +185,7 @@ set "node_exe=%config%\node.exe" set "node_gyp_exe="%node_exe%" deps\npm\node_modules\node-gyp\bin\node-gyp" set "npm_exe="%~dp0%node_exe%" %~dp0deps\npm\bin\npm-cli.js" if "%target_env%"=="vs2022" set "node_gyp_exe=%node_gyp_exe% --msvs_version=2022" +if "%target_env%"=="vs2026" set "node_gyp_exe=%node_gyp_exe% --msvs_version=2026" :: skip building if the only argument received was lint if "%*"=="lint" if exist "%node_exe%" goto lint-cpp @@ -266,6 +268,33 @@ set vcvarsall_arg=%msvs_host_arch%_%target_arch% if %target_arch%==x64 if %msvs_host_arch%==amd64 set vcvarsall_arg=amd64 if %target_arch%==%msvs_host_arch% set vcvarsall_arg=%target_arch% +@rem Look for Visual Studio 2026 +:vs-set-2026 +if defined target_env if "%target_env%" NEQ "vs2026" goto msbuild-not-found +echo Looking for Visual Studio 2026 +@rem VCINSTALLDIR may be set if run from a VS Command Prompt and needs to be +@rem cleared first as vswhere_usability_wrapper.cmd doesn't when it fails to +@rem detect the version searched for +if not defined target_env set "VCINSTALLDIR=" +call tools\msvs\vswhere_usability_wrapper.cmd "[18.0,19.0)" %target_arch% "prerelease" %clang_cl% +if "_%VCINSTALLDIR%_" == "__" goto vs-set-2022 +@rem check if VS2026 is already setup, and for the requested arch +if "_%VisualStudioVersion%_" == "_18.0_" if "_%VSCMD_ARG_TGT_ARCH%_"=="_%target_arch%_" goto found_vs2026 +@rem need to clear VSINSTALLDIR for vcvarsall to work as expected +set "VSINSTALLDIR=" +@rem prevent VsDevCmd.bat from changing the current working directory +set "VSCMD_START_DIR=%CD%" +set vcvars_call="%VCINSTALLDIR%\Auxiliary\Build\vcvarsall.bat" %vcvarsall_arg% +echo calling: %vcvars_call% +call %vcvars_call% +if errorlevel 1 goto vs-set-2022 +if defined DEBUG_HELPER @ECHO ON +:found_vs2026 +echo Found MSVS version %VisualStudioVersion% +set GYP_MSVS_VERSION=2026 +set PLATFORM_TOOLSET=v145 +goto msbuild-found + @rem Look for Visual Studio 2022 :vs-set-2022 if defined target_env if "%target_env%" NEQ "vs2022" goto msbuild-not-found @@ -806,7 +835,7 @@ set exit_code=1 goto exit :help -echo vcbuild.bat [debug/release] [msi] [doc] [test/test-all/test-addons/test-doc/test-js-native-api/test-node-api/test-internet/test-tick-processor/test-known-issues/test-node-inspect/test-check-deopts/test-npm/test-v8/test-v8-intl/test-v8-benchmarks/test-v8-all] [ignore-flaky] [static/dll] [noprojgen] [projgen] [clang-cl] [ccache path-to-ccache] [small-icu/full-icu/without-intl] [nobuild] [nosnapshot] [nonpm] [ltcg] [licensetf] [sign] [x64/arm64] [vs2022] [download-all] [enable-vtune] [lint/lint-ci/lint-js/lint-md] [lint-md-build] [format-md] [package] [build-release] [upload] [no-NODE-OPTIONS] [link-module path-to-module] [debug-http2] [debug-nghttp2] [clean] [cctest] [no-cctest] [openssl-no-asm] +echo vcbuild.bat [debug/release] [msi] [doc] [test/test-all/test-addons/test-doc/test-js-native-api/test-node-api/test-internet/test-tick-processor/test-known-issues/test-node-inspect/test-check-deopts/test-npm/test-v8/test-v8-intl/test-v8-benchmarks/test-v8-all] [ignore-flaky] [static/dll] [noprojgen] [projgen] [clang-cl] [ccache path-to-ccache] [small-icu/full-icu/without-intl] [nobuild] [nosnapshot] [nonpm] [ltcg] [licensetf] [sign] [x64/arm64] [vs2022/vs2026] [download-all] [enable-vtune] [lint/lint-ci/lint-js/lint-md] [lint-md-build] [format-md] [package] [build-release] [upload] [no-NODE-OPTIONS] [link-module path-to-module] [debug-http2] [debug-nghttp2] [clean] [cctest] [no-cctest] [openssl-no-asm] echo Examples: echo vcbuild.bat : builds release build echo vcbuild.bat debug : builds debug build From eb6cb5b8270bf55c53f22d1867c654c1d56e601f Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Thu, 20 Nov 2025 00:57:41 +0200 Subject: [PATCH 08/56] build: add flag to compile V8 with Temporal support Refs: https://github.com/nodejs/node/issues/58730 Co-authored-by: =?UTF-8?q?Micha=C3=ABl=20Zasso?= Co-authored-by: Antoine du Hamel PR-URL: https://github.com/nodejs/node/pull/60701 Reviewed-By: Chengzhong Wu Reviewed-By: Joyee Cheung --- configure.py | 31 +++++++++++++++++++++++++++++++ shell.nix | 8 ++++++-- tools/nix/sharedLibDeps.nix | 4 ++++ tools/v8_gypfiles/features.gypi | 7 +++++++ tools/v8_gypfiles/v8.gyp | 15 +++++++++++++++ 5 files changed, 63 insertions(+), 2 deletions(-) diff --git a/configure.py b/configure.py index a752897e90aa25..9d252bab63cfd5 100755 --- a/configure.py +++ b/configure.py @@ -573,6 +573,28 @@ dest='shared_sqlite_libpath', help='a directory to search for the shared sqlite DLL') +shared_optgroup.add_argument('--shared-temporal_capi', + action='store_true', + dest='shared_temporal_capi', + default=None, + help='link to a shared temporal_capi DLL instead of static linking') + +shared_optgroup.add_argument('--shared-temporal_capi-includes', + action='store', + dest='shared_temporal_capi_includes', + help='directory containing temporal_capi header files') + +shared_optgroup.add_argument('--shared-temporal_capi-libname', + action='store', + dest='shared_temporal_capi_libname', + default='temporal_capi', + help='alternative lib name to link to [default: %(default)s]') + +shared_optgroup.add_argument('--shared-temporal_capi-libpath', + action='store', + dest='shared_temporal_capi_libpath', + help='a directory to search for the shared temporal_capi DLL') + shared_optgroup.add_argument('--shared-zstd', action='store_true', dest='shared_zstd', @@ -1009,6 +1031,13 @@ default=None, help='Enable the built-in snapshot compression in V8.') + +parser.add_argument('--v8-enable-temporal-support', + action='store_true', + dest='v8_enable_temporal_support', + default=None, + help='Enable Temporal support in V8.') + parser.add_argument('--node-builtin-modules-path', action='store', dest='node_builtin_modules_path', @@ -1802,6 +1831,7 @@ def configure_v8(o, configs): o['variables']['v8_enable_external_code_space'] = 1 if options.enable_pointer_compression else 0 o['variables']['v8_enable_31bit_smis_on_64bit_arch'] = 1 if options.enable_pointer_compression else 0 o['variables']['v8_enable_extensible_ro_snapshot'] = 0 + o['variables']['v8_enable_temporal_support'] = 1 if options.v8_enable_temporal_support else 0 o['variables']['v8_trace_maps'] = 1 if options.trace_maps else 0 o['variables']['node_use_v8_platform'] = b(not options.without_v8_platform) o['variables']['node_use_bundled_v8'] = b(not options.without_bundled_v8) @@ -2357,6 +2387,7 @@ def make_bin_override(): configure_library('nghttp3', output, pkgname='libnghttp3') configure_library('ngtcp2', output, pkgname='libngtcp2') configure_sqlite(output); +configure_library('temporal_capi', output) configure_library('uvwasi', output) configure_library('zstd', output, pkgname='libzstd') configure_v8(output, configurations) diff --git a/shell.nix b/shell.nix index 143955fa33ee44..b22e3d6d11e4ab 100644 --- a/shell.nix +++ b/shell.nix @@ -1,9 +1,10 @@ { pkgs ? import ./tools/nix/pkgs.nix { }, loadJSBuiltinsDynamically ? true, # Load `lib/**.js` from disk instead of embedding + withTemporal ? false, ncu-path ? null, # Provide this if you want to use a local version of NCU icu ? pkgs.icu, - sharedLibDeps ? import ./tools/nix/sharedLibDeps.nix { inherit pkgs; }, + sharedLibDeps ? import ./tools/nix/sharedLibDeps.nix { inherit pkgs withTemporal; }, ccache ? pkgs.ccache, ninja ? pkgs.ninja, devTools ? import ./tools/nix/devTools.nix { inherit pkgs ncu-path; }, @@ -11,6 +12,9 @@ extraConfigFlags ? [ "--without-npm" "--debug-node" + ] + ++ pkgs.lib.optionals withTemporal [ + "--v8-enable-temporal-support" ], }: @@ -22,7 +26,7 @@ in pkgs.mkShell { inherit (pkgs.nodejs_latest) nativeBuildInputs; - buildInputs = builtins.attrValues sharedLibDeps ++ pkgs.lib.optionals useSharedICU [ icu ]; + buildInputs = builtins.attrValues sharedLibDeps ++ pkgs.lib.optional useSharedICU icu; packages = [ ccache diff --git a/tools/nix/sharedLibDeps.nix b/tools/nix/sharedLibDeps.nix index 6a4a088a579651..ba006fc9ce39ef 100644 --- a/tools/nix/sharedLibDeps.nix +++ b/tools/nix/sharedLibDeps.nix @@ -1,5 +1,6 @@ { pkgs ? import ./pkgs.nix { }, + withTemporal ? false, }: { inherit (pkgs) @@ -45,3 +46,6 @@ ]; }); } +// (pkgs.lib.optionalAttrs withTemporal { + inherit (pkgs) temporal_capi; +}) diff --git a/tools/v8_gypfiles/features.gypi b/tools/v8_gypfiles/features.gypi index e62b69e9a7175f..c2805da739ce2a 100644 --- a/tools/v8_gypfiles/features.gypi +++ b/tools/v8_gypfiles/features.gypi @@ -295,6 +295,10 @@ # add a dependency on the ICU library. 'v8_enable_i18n_support%': 1, + # Enable Temporal API. Enabling this feature will + # add a dependency on the temporal_rs library. + 'v8_enable_temporal_support%': 0, + # Lite mode disables a number of performance optimizations to reduce memory # at the cost of performance. # Sets --DV8_LITE_MODE. @@ -410,6 +414,9 @@ ['v8_enable_i18n_support==1', { 'defines': ['V8_INTL_SUPPORT',], }], + ['v8_enable_temporal_support==1', { + 'defines': ['V8_TEMPORAL_SUPPORT',], + }], # Refs: https://github.com/nodejs/node/pull/23801 # ['v8_enable_handle_zapping==1', { # 'defines': ['ENABLE_HANDLE_ZAPPING',], diff --git a/tools/v8_gypfiles/v8.gyp b/tools/v8_gypfiles/v8.gyp index c3ec7e3ee92bfc..2b05a75ec99d67 100644 --- a/tools/v8_gypfiles/v8.gyp +++ b/tools/v8_gypfiles/v8.gyp @@ -27,6 +27,11 @@ ' Date: Thu, 20 Nov 2025 08:01:53 +0000 Subject: [PATCH 09/56] tools: bump js-yaml from 4.1.0 to 4.1.1 in /tools/doc in the doc group MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the doc group in /tools/doc with 1 update: [js-yaml](https://github.com/nodeca/js-yaml). Updates `js-yaml` from 4.1.0 to 4.1.1 - [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md) - [Commits](https://github.com/nodeca/js-yaml/compare/4.1.0...4.1.1) --- updated-dependencies: - dependency-name: js-yaml dependency-version: 4.1.1 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: doc ... Signed-off-by: dependabot[bot] PR-URL: https://github.com/nodejs/node/pull/60766 Reviewed-By: Antoine du Hamel Reviewed-By: Ulises Gascón Reviewed-By: Colin Ihrig Reviewed-By: Xuguang Mei Reviewed-By: Luigi Pinca --- tools/doc/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/doc/package-lock.json b/tools/doc/package-lock.json index 5090c22d9fbd65..369746329d9508 100644 --- a/tools/doc/package-lock.json +++ b/tools/doc/package-lock.json @@ -488,9 +488,9 @@ } }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", "dependencies": { From 93fc88036f98546f05091b244bcb806c8ddae1b3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Nov 2025 08:02:02 +0000 Subject: [PATCH 10/56] meta: bump actions/checkout from 5.0.0 to 5.0.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [actions/checkout](https://github.com/actions/checkout) from 5.0.0 to 5.0.1. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/08c6903cd8c0fde910a37f88322edcfb5dd907a8...93cb6efe18208431cddfb8368fd83d5badbf9bfd) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: 5.0.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] PR-URL: https://github.com/nodejs/node/pull/60767 Reviewed-By: Antoine du Hamel Reviewed-By: Michaël Zasso Reviewed-By: Ulises Gascón Reviewed-By: Rafael Gonzaga Reviewed-By: Colin Ihrig Reviewed-By: Luigi Pinca --- .github/workflows/auto-start-ci.yml | 2 +- .github/workflows/build-tarball.yml | 4 ++-- .github/workflows/codeql.yml | 2 +- .github/workflows/commit-lint.yml | 2 +- .github/workflows/commit-queue.yml | 2 +- .../workflows/coverage-linux-without-intl.yml | 2 +- .github/workflows/coverage-linux.yml | 2 +- .github/workflows/coverage-windows.yml | 2 +- .github/workflows/create-release-proposal.yml | 2 +- .github/workflows/daily-wpt-fyi.yml | 4 ++-- .github/workflows/daily.yml | 2 +- .github/workflows/doc.yml | 2 +- .../workflows/find-inactive-collaborators.yml | 2 +- .github/workflows/find-inactive-tsc.yml | 4 ++-- .github/workflows/license-builder.yml | 2 +- .github/workflows/lint-release-proposal.yml | 2 +- .github/workflows/linters.yml | 22 +++++++++---------- .github/workflows/notify-on-push.yml | 2 +- .github/workflows/scorecard.yml | 2 +- .github/workflows/test-internet.yml | 2 +- .github/workflows/test-linux.yml | 2 +- .github/workflows/test-macos.yml | 2 +- .github/workflows/test-shared.yml | 2 +- .github/workflows/timezone-update.yml | 4 ++-- .github/workflows/tools.yml | 2 +- .github/workflows/update-openssl.yml | 2 +- .github/workflows/update-v8.yml | 2 +- .github/workflows/update-wpt.yml | 2 +- 28 files changed, 42 insertions(+), 42 deletions(-) diff --git a/.github/workflows/auto-start-ci.yml b/.github/workflows/auto-start-ci.yml index 21d4c1a0ae86ad..791acebd609fac 100644 --- a/.github/workflows/auto-start-ci.yml +++ b/.github/workflows/auto-start-ci.yml @@ -45,7 +45,7 @@ jobs: if: needs.get-prs-for-ci.outputs.numbers != '' runs-on: ubuntu-latest steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: persist-credentials: false diff --git a/.github/workflows/build-tarball.yml b/.github/workflows/build-tarball.yml index 158384975ff693..97cea1132c6f0e 100644 --- a/.github/workflows/build-tarball.yml +++ b/.github/workflows/build-tarball.yml @@ -44,7 +44,7 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} @@ -74,7 +74,7 @@ jobs: CXX: sccache clang++-19 SCCACHE_GHA_ENABLED: 'true' steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: persist-credentials: false sparse-checkout: .github/actions/install-clang diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index dfd5f44208039e..267dd4d6ad78bf 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -23,7 +23,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/commit-lint.yml b/.github/workflows/commit-lint.yml index d7e6193f020960..0c63c82ab9eccf 100644 --- a/.github/workflows/commit-lint.yml +++ b/.github/workflows/commit-lint.yml @@ -17,7 +17,7 @@ jobs: run: | echo "plusOne=$((${{ github.event.pull_request.commits }} + 1))" >> $GITHUB_OUTPUT echo "minusOne=$((${{ github.event.pull_request.commits }} - 1))" >> $GITHUB_OUTPUT - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: fetch-depth: ${{ steps.nb-of-commits.outputs.plusOne }} persist-credentials: false diff --git a/.github/workflows/commit-queue.yml b/.github/workflows/commit-queue.yml index af118e2221d2e6..1b06445a9b556a 100644 --- a/.github/workflows/commit-queue.yml +++ b/.github/workflows/commit-queue.yml @@ -59,7 +59,7 @@ jobs: if: needs.get_mergeable_prs.outputs.numbers != '' runs-on: ubuntu-latest steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: # A personal token is required because pushing with GITHUB_TOKEN will # prevent commits from running CI after they land. It needs diff --git a/.github/workflows/coverage-linux-without-intl.yml b/.github/workflows/coverage-linux-without-intl.yml index 75f6e777a32005..949faf20db218e 100644 --- a/.github/workflows/coverage-linux-without-intl.yml +++ b/.github/workflows/coverage-linux-without-intl.yml @@ -49,7 +49,7 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: persist-credentials: false - name: Install Clang ${{ env.CLANG_VERSION }} diff --git a/.github/workflows/coverage-linux.yml b/.github/workflows/coverage-linux.yml index f9f5c879b2e3dd..ae671ebe153789 100644 --- a/.github/workflows/coverage-linux.yml +++ b/.github/workflows/coverage-linux.yml @@ -49,7 +49,7 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: persist-credentials: false - name: Install Clang ${{ env.CLANG_VERSION }} diff --git a/.github/workflows/coverage-windows.yml b/.github/workflows/coverage-windows.yml index f34af4a1494ad0..caef53f4a45500 100644 --- a/.github/workflows/coverage-windows.yml +++ b/.github/workflows/coverage-windows.yml @@ -45,7 +45,7 @@ jobs: if: github.event.pull_request.draft == false runs-on: windows-2025 steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} diff --git a/.github/workflows/create-release-proposal.yml b/.github/workflows/create-release-proposal.yml index 43599a1ab682cb..b918312dc03f40 100644 --- a/.github/workflows/create-release-proposal.yml +++ b/.github/workflows/create-release-proposal.yml @@ -33,7 +33,7 @@ jobs: RELEASE_LINE: ${{ inputs.release-line }} runs-on: ubuntu-latest steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: ref: ${{ env.STAGING_BRANCH }} persist-credentials: false diff --git a/.github/workflows/daily-wpt-fyi.yml b/.github/workflows/daily-wpt-fyi.yml index 83cc0cb68a83d1..7cbac99adff37d 100644 --- a/.github/workflows/daily-wpt-fyi.yml +++ b/.github/workflows/daily-wpt-fyi.yml @@ -64,7 +64,7 @@ jobs: SHORT_SHA=$(node -p 'process.version.split(/-nightly\d{8}/)[1]') echo "NIGHTLY_REF=$(gh api /repos/nodejs/node/commits/$SHORT_SHA --jq '.sha')" >> $GITHUB_ENV - name: Checkout ${{ steps.setup-node.outputs.node-version }} - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: persist-credentials: false ref: ${{ env.NIGHTLY_REF || steps.setup-node.outputs.node-version }} @@ -80,7 +80,7 @@ jobs: run: rm -rf wpt working-directory: test/fixtures - name: Checkout epochs/daily WPT - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: repository: web-platform-tests/wpt persist-credentials: false diff --git a/.github/workflows/daily.yml b/.github/workflows/daily.yml index d48805096bfcfb..efe534211ca255 100644 --- a/.github/workflows/daily.yml +++ b/.github/workflows/daily.yml @@ -15,7 +15,7 @@ jobs: build-lto: runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: persist-credentials: false - name: Use Node.js ${{ env.NODE_VERSION }} diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml index 7b90dc3c23f8d8..6e3feddf60f23e 100644 --- a/.github/workflows/doc.yml +++ b/.github/workflows/doc.yml @@ -24,7 +24,7 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-latest steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: persist-credentials: false - name: Use Node.js ${{ env.NODE_VERSION }} diff --git a/.github/workflows/find-inactive-collaborators.yml b/.github/workflows/find-inactive-collaborators.yml index f0898b51458df2..f7b9d22ecffeb7 100644 --- a/.github/workflows/find-inactive-collaborators.yml +++ b/.github/workflows/find-inactive-collaborators.yml @@ -19,7 +19,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: fetch-depth: 0 persist-credentials: false diff --git a/.github/workflows/find-inactive-tsc.yml b/.github/workflows/find-inactive-tsc.yml index e040d8f17cd261..8f69d07fec3691 100644 --- a/.github/workflows/find-inactive-tsc.yml +++ b/.github/workflows/find-inactive-tsc.yml @@ -20,13 +20,13 @@ jobs: steps: - name: Checkout the repo - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: fetch-depth: 0 persist-credentials: false - name: Clone nodejs/TSC repository - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: fetch-depth: 0 path: .tmp diff --git a/.github/workflows/license-builder.yml b/.github/workflows/license-builder.yml index 6c7dc8721d382b..e5c594377829ad 100644 --- a/.github/workflows/license-builder.yml +++ b/.github/workflows/license-builder.yml @@ -17,7 +17,7 @@ jobs: if: github.repository == 'nodejs/node' runs-on: ubuntu-latest steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: persist-credentials: false - run: ./tools/license-builder.sh # Run the license builder tool diff --git a/.github/workflows/lint-release-proposal.yml b/.github/workflows/lint-release-proposal.yml index bb3a3ac6778a54..f93c79ece5a9df 100644 --- a/.github/workflows/lint-release-proposal.yml +++ b/.github/workflows/lint-release-proposal.yml @@ -23,7 +23,7 @@ jobs: contents: read pull-requests: read steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: persist-credentials: false - name: Lint release commit title format diff --git a/.github/workflows/linters.yml b/.github/workflows/linters.yml index dc7eb9af0a3368..863d8f14c7ac73 100644 --- a/.github/workflows/linters.yml +++ b/.github/workflows/linters.yml @@ -25,7 +25,7 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-latest steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: persist-credentials: false - name: Use Node.js ${{ env.NODE_VERSION }} @@ -40,7 +40,7 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-latest steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} @@ -56,7 +56,7 @@ jobs: if: ${{ github.event.pull_request && github.event.pull_request.draft == false && github.base_ref == github.event.repository.default_branch }} runs-on: ubuntu-latest steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: fetch-depth: 0 persist-credentials: false @@ -95,7 +95,7 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-latest steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: persist-credentials: false - name: Use Node.js ${{ env.NODE_VERSION }} @@ -144,7 +144,7 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-latest steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: persist-credentials: false sparse-checkout: '*.nix' @@ -160,7 +160,7 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-latest steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} @@ -178,7 +178,7 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-latest steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: persist-credentials: false - name: Use Python ${{ env.PYTHON_VERSION }} @@ -197,7 +197,7 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-latest steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: persist-credentials: false - run: shellcheck -V @@ -207,7 +207,7 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-latest steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: persist-credentials: false - uses: mszostok/codeowners-validator@7f3f5e28c6d7b8dfae5731e54ce2272ca384592f @@ -217,7 +217,7 @@ jobs: if: ${{ github.event.pull_request }} runs-on: ubuntu-latest steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: fetch-depth: 2 persist-credentials: false @@ -226,7 +226,7 @@ jobs: lint-readme: runs-on: ubuntu-latest steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: persist-credentials: false - name: Get team members if possible diff --git a/.github/workflows/notify-on-push.yml b/.github/workflows/notify-on-push.yml index d21f3e7943ccfb..abbfd9ee1469a4 100644 --- a/.github/workflows/notify-on-push.yml +++ b/.github/workflows/notify-on-push.yml @@ -35,7 +35,7 @@ jobs: contents: read pull-requests: write steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: persist-credentials: false - name: Check commit message diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 53088a98823e89..5bd9a26bc08ca5 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -38,7 +38,7 @@ jobs: egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs - name: Checkout code - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: persist-credentials: false diff --git a/.github/workflows/test-internet.yml b/.github/workflows/test-internet.yml index 0df998febb7f4f..d77d4c766edebf 100644 --- a/.github/workflows/test-internet.yml +++ b/.github/workflows/test-internet.yml @@ -46,7 +46,7 @@ jobs: if: github.event_name == 'schedule' && github.repository == 'nodejs/node' || github.event.pull_request.draft == false runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: persist-credentials: false - name: Install Clang ${{ env.CLANG_VERSION }} diff --git a/.github/workflows/test-linux.yml b/.github/workflows/test-linux.yml index 1d3b096db106ce..3b4283df4163ad 100644 --- a/.github/workflows/test-linux.yml +++ b/.github/workflows/test-linux.yml @@ -48,7 +48,7 @@ jobs: matrix: os: [ubuntu-24.04, ubuntu-24.04-arm] steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: persist-credentials: false path: node diff --git a/.github/workflows/test-macos.yml b/.github/workflows/test-macos.yml index 91be7add917fe3..4551f5184f6c6a 100644 --- a/.github/workflows/test-macos.yml +++ b/.github/workflows/test-macos.yml @@ -51,7 +51,7 @@ jobs: CXX: sccache g++ SCCACHE_GHA_ENABLED: 'true' steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: persist-credentials: false path: node diff --git a/.github/workflows/test-shared.yml b/.github/workflows/test-shared.yml index 7558b1633ebc01..d8e8aa0d29c0db 100644 --- a/.github/workflows/test-shared.yml +++ b/.github/workflows/test-shared.yml @@ -76,7 +76,7 @@ jobs: name: ${{ github.event_name == 'workflow_dispatch' && 'Skipped job' || 'Build slim tarball' }} runs-on: ubuntu-24.04-arm steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 if: ${{ github.event_name != 'workflow_dispatch' }} with: persist-credentials: false diff --git a/.github/workflows/timezone-update.yml b/.github/workflows/timezone-update.yml index 51dd8f155b89fa..5f330165c35930 100644 --- a/.github/workflows/timezone-update.yml +++ b/.github/workflows/timezone-update.yml @@ -20,12 +20,12 @@ jobs: steps: - name: Checkout nodejs/node - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: persist-credentials: false - name: Checkout unicode-org/icu-data - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: path: icu-data persist-credentials: false diff --git a/.github/workflows/tools.yml b/.github/workflows/tools.yml index 8de30a4c063905..36a195ac847f54 100644 --- a/.github/workflows/tools.yml +++ b/.github/workflows/tools.yml @@ -292,7 +292,7 @@ jobs: run: | git config --global user.name "Node.js GitHub Bot" git config --global user.email "github-bot@iojs.org" - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 if: github.event_name == 'schedule' || inputs.id == 'all' || inputs.id == matrix.id with: persist-credentials: false diff --git a/.github/workflows/update-openssl.yml b/.github/workflows/update-openssl.yml index ee9a3e0fa11c03..03130109faf44a 100644 --- a/.github/workflows/update-openssl.yml +++ b/.github/workflows/update-openssl.yml @@ -14,7 +14,7 @@ jobs: if: github.repository == 'nodejs/node' runs-on: ubuntu-latest steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: persist-credentials: false - name: Check and download new OpenSSL version diff --git a/.github/workflows/update-v8.yml b/.github/workflows/update-v8.yml index 2a6e1f348a09f2..49760188333b22 100644 --- a/.github/workflows/update-v8.yml +++ b/.github/workflows/update-v8.yml @@ -16,7 +16,7 @@ jobs: if: github.repository == 'nodejs/node' runs-on: ubuntu-latest steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: persist-credentials: false - name: Cache node modules and update-v8 diff --git a/.github/workflows/update-wpt.yml b/.github/workflows/update-wpt.yml index 60cd0828919bd0..75b961d9003632 100644 --- a/.github/workflows/update-wpt.yml +++ b/.github/workflows/update-wpt.yml @@ -27,7 +27,7 @@ jobs: subsystem: ${{ fromJSON(github.event.inputs.subsystems || '["url", "urlpattern", "WebCryptoAPI"]') }} steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: persist-credentials: false From 81b53c5145a0e1f9b9edf32119800ef798400c28 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Nov 2025 08:02:11 +0000 Subject: [PATCH 11/56] meta: bump cachix/install-nix-action from 31.8.2 to 31.8.4 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [cachix/install-nix-action](https://github.com/cachix/install-nix-action) from 31.8.2 to 31.8.4. - [Release notes](https://github.com/cachix/install-nix-action/releases) - [Changelog](https://github.com/cachix/install-nix-action/blob/master/RELEASE.md) - [Commits](https://github.com/cachix/install-nix-action/compare/456688f15bc354bef6d396e4a35f4f89d40bf2b7...0b0e072294b088b73964f1d72dfdac0951439dbd) --- updated-dependencies: - dependency-name: cachix/install-nix-action dependency-version: 31.8.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] PR-URL: https://github.com/nodejs/node/pull/60768 Reviewed-By: Antoine du Hamel Reviewed-By: Michaël Zasso Reviewed-By: Ulises Gascón Reviewed-By: Rafael Gonzaga Reviewed-By: Colin Ihrig --- .github/workflows/linters.yml | 2 +- .github/workflows/test-shared.yml | 2 +- .github/workflows/tools.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/linters.yml b/.github/workflows/linters.yml index 863d8f14c7ac73..9ac4151a5a502a 100644 --- a/.github/workflows/linters.yml +++ b/.github/workflows/linters.yml @@ -149,7 +149,7 @@ jobs: persist-credentials: false sparse-checkout: '*.nix' sparse-checkout-cone-mode: false - - uses: cachix/install-nix-action@456688f15bc354bef6d396e4a35f4f89d40bf2b7 # v31.8.2 + - uses: cachix/install-nix-action@0b0e072294b088b73964f1d72dfdac0951439dbd # v31.8.4 - name: Lint Nix files run: | nix-shell -I nixpkgs=./tools/nix/pkgs.nix -p 'nixfmt-tree' --run ' diff --git a/.github/workflows/test-shared.yml b/.github/workflows/test-shared.yml index d8e8aa0d29c0db..198132a249b7fd 100644 --- a/.github/workflows/test-shared.yml +++ b/.github/workflows/test-shared.yml @@ -127,7 +127,7 @@ jobs: tar xzf tarballs/*.tar.gz -C "$RUNNER_TEMP" echo "TAR_DIR=$RUNNER_TEMP/$(basename tarballs/*.tar.gz .tar.gz)" >> "$GITHUB_ENV" - - uses: cachix/install-nix-action@456688f15bc354bef6d396e4a35f4f89d40bf2b7 # v31.8.2 + - uses: cachix/install-nix-action@0b0e072294b088b73964f1d72dfdac0951439dbd # v31.8.4 with: extra_nix_config: sandbox = true diff --git a/.github/workflows/tools.yml b/.github/workflows/tools.yml index 36a195ac847f54..ea82fd9725b4ba 100644 --- a/.github/workflows/tools.yml +++ b/.github/workflows/tools.yml @@ -306,7 +306,7 @@ jobs: allow-prereleases: true - name: Set up Nix if: matrix.id == 'nixpkgs-unstable' && (github.event_name == 'schedule' || inputs.id == 'all' || inputs.id == matrix.id) - uses: cachix/install-nix-action@456688f15bc354bef6d396e4a35f4f89d40bf2b7 # v31.8.2 + uses: cachix/install-nix-action@0b0e072294b088b73964f1d72dfdac0951439dbd # v31.8.4 - run: ${{ matrix.run }} if: github.event_name == 'schedule' || inputs.id == 'all' || inputs.id == matrix.id env: From 284c9d9bf006a43951672613b04453e98e251d2e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Nov 2025 08:02:19 +0000 Subject: [PATCH 12/56] meta: bump step-security/harden-runner from 2.13.1 to 2.13.2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [step-security/harden-runner](https://github.com/step-security/harden-runner) from 2.13.1 to 2.13.2. - [Release notes](https://github.com/step-security/harden-runner/releases) - [Commits](https://github.com/step-security/harden-runner/compare/f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a...95d9a5deda9de15063e7595e9719c11c38c90ae2) --- updated-dependencies: - dependency-name: step-security/harden-runner dependency-version: 2.13.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] PR-URL: https://github.com/nodejs/node/pull/60769 Reviewed-By: Antoine du Hamel Reviewed-By: Michaël Zasso Reviewed-By: Colin Ihrig Reviewed-By: Xuguang Mei --- .github/workflows/scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 5bd9a26bc08ca5..1d335e84d85b30 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -33,7 +33,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1 + uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 with: egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs From f65fc956d7638afb1aff1a2a56ce9166347a1a2a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Nov 2025 08:14:30 +0000 Subject: [PATCH 13/56] meta: bump github/codeql-action from 4.31.2 to 4.31.3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.31.2 to 4.31.3. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/0499de31b99561a6d14a36a5f662c2a54f91beee...014f16e7ab1402f30e7c3329d33797e7948572db) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 4.31.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] PR-URL: https://github.com/nodejs/node/pull/60770 Reviewed-By: Antoine du Hamel Reviewed-By: Michaël Zasso Reviewed-By: Ulises Gascón Reviewed-By: Colin Ihrig Reviewed-By: Luigi Pinca Reviewed-By: Xuguang Mei --- .github/workflows/codeql.yml | 6 +++--- .github/workflows/scorecard.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 267dd4d6ad78bf..348110d77a64c8 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -27,15 +27,15 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@0499de31b99561a6d14a36a5f662c2a54f91beee # v4.31.2 + uses: github/codeql-action/init@014f16e7ab1402f30e7c3329d33797e7948572db # v4.31.3 with: languages: ${{ matrix.language }} config-file: ./.github/codeql-config.yml - name: Autobuild - uses: github/codeql-action/autobuild@0499de31b99561a6d14a36a5f662c2a54f91beee # v4.31.2 + uses: github/codeql-action/autobuild@014f16e7ab1402f30e7c3329d33797e7948572db # v4.31.3 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@0499de31b99561a6d14a36a5f662c2a54f91beee # v4.31.2 + uses: github/codeql-action/analyze@014f16e7ab1402f30e7c3329d33797e7948572db # v4.31.3 with: category: /language:${{matrix.language}} diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 1d335e84d85b30..8db2ba7735691f 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -73,6 +73,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: Upload to code-scanning - uses: github/codeql-action/upload-sarif@0499de31b99561a6d14a36a5f662c2a54f91beee # v4.31.2 + uses: github/codeql-action/upload-sarif@014f16e7ab1402f30e7c3329d33797e7948572db # v4.31.3 with: sarif_file: results.sarif From 48f1934d5a9677b23dff11e6a57f647f19f45124 Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Thu, 20 Nov 2025 11:38:00 +0200 Subject: [PATCH 14/56] tools: fix linter warning in `test-shared.yml` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/60772 Reviewed-By: Michaël Zasso Reviewed-By: Ulises Gascón Reviewed-By: Richard Lau Reviewed-By: Colin Ihrig Reviewed-By: Xuguang Mei Reviewed-By: Luigi Pinca --- .github/workflows/test-shared.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-shared.yml b/.github/workflows/test-shared.yml index 198132a249b7fd..d93a4d1b6258d4 100644 --- a/.github/workflows/test-shared.yml +++ b/.github/workflows/test-shared.yml @@ -131,7 +131,7 @@ jobs: with: extra_nix_config: sandbox = true - - uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16 + - uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16 with: name: nodejs authToken: ${{ secrets.CACHIX_AUTH_TOKEN }} From 774e5647be8843f706c120459a582a4b7d542732 Mon Sep 17 00:00:00 2001 From: Azad Gupta <158742337+azadgupta1@users.noreply.github.com> Date: Thu, 20 Nov 2025 16:22:50 +0530 Subject: [PATCH 15/56] doc: correct concurrency wording in test() documentation PR-URL: https://github.com/nodejs/node/pull/60773 Reviewed-By: Ethan Arrowood Reviewed-By: Antoine du Hamel Reviewed-By: Jacob Smith Reviewed-By: Xuguang Mei --- doc/api/test.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/api/test.md b/doc/api/test.md index 21349b46b702e8..338c18aa620bf2 100644 --- a/doc/api/test.md +++ b/doc/api/test.md @@ -1619,7 +1619,7 @@ changes: * `options` {Object} Configuration options for the test. The following properties are supported: * `concurrency` {number|boolean} If a number is provided, - then that many tests would run in parallel within the application thread. + then that many tests would run asynchronously (they are still managed by the single-threaded event loop). If `true`, all scheduled asynchronous tests run concurrently within the thread. If `false`, only one test runs at a time. If unspecified, subtests inherit this value from their parent. @@ -3882,7 +3882,7 @@ changes: * `options` {Object} Configuration options for the subtest. The following properties are supported: * `concurrency` {number|boolean|null} If a number is provided, - then that many tests would run in parallel within the application thread. + then that many tests would run asynchronously (they are still managed by the single-threaded event loop). If `true`, it would run all subtests in parallel. If `false`, it would only run one test at a time. If unspecified, subtests inherit this value from their parent. From 07711379728708fd25de2d13c2d0cb78ddecbc4c Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Thu, 20 Nov 2025 13:23:33 +0000 Subject: [PATCH 16/56] build: fix OpenSSL version parsing for OpenSSL < 3 OpenSSL versions before 3.0.0 do not define - `OPENSSL_VERSION_MAJOR` - `OPENSSL_VERSION_MINOR` - `OPENSSL_VERSION_PATCH` in `openssl/opensslv.h`. For these versions, `OPENSSL_VERSION_NUMBER` is a literal which we can parse directly. PR-URL: https://github.com/nodejs/node/pull/60775 Reviewed-By: Colin Ihrig Reviewed-By: Antoine du Hamel --- configure.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/configure.py b/configure.py index 9d252bab63cfd5..ccdffa374f8984 100755 --- a/configure.py +++ b/configure.py @@ -1246,7 +1246,8 @@ def get_openssl_version(o): """Parse OpenSSL version from opensslv.h header file. Returns the version as a number matching OPENSSL_VERSION_NUMBER format: - 0xMNN00PPSL where M=major, NN=minor, PP=patch, S=status(0xf=release,0x0=pre), L=0 + 0xMNN00PPSL where M=major, NN=minor, PP=patch, S=status(0xf=release,0x0=pre), + L denotes as a long type literal """ try: @@ -1289,6 +1290,14 @@ def get_openssl_version(o): minor = int(macros.get('OPENSSL_VERSION_MINOR', '0')) patch = int(macros.get('OPENSSL_VERSION_PATCH', '0')) + # If major, minor and patch are all 0, this is probably OpenSSL < 3. + if (major, minor, patch) == (0, 0, 0): + version_number = macros.get('OPENSSL_VERSION_NUMBER') + # Prior to OpenSSL 3 the value should be in the format 0xMNN00PPSL. + # If it is, we need to strip the `L` suffix prior to parsing. + if version_number[:2] == "0x" and version_number[-1] == "L": + return int(version_number[:-1], 16) + # Check if it's a pre-release (has non-empty PRE_RELEASE string) pre_release = macros.get('OPENSSL_VERSION_PRE_RELEASE', '""').strip('"') status = 0x0 if pre_release else 0xf From 5e6ac7ede6bce266712c0818d9c30959b230ec83 Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Thu, 20 Nov 2025 16:16:04 +0200 Subject: [PATCH 17/56] test_runner: simplify code and make it more consistent PR-URL: https://github.com/nodejs/node/pull/60777 Reviewed-By: Pietro Marchini Reviewed-By: Xuguang Mei Reviewed-By: Ilyas Shabi --- lib/internal/test_runner/test.js | 31 ++++++++++--------------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/lib/internal/test_runner/test.js b/lib/internal/test_runner/test.js index fcde7e399c9e0a..0f2265bb74366a 100644 --- a/lib/internal/test_runner/test.js +++ b/lib/internal/test_runner/test.js @@ -13,7 +13,6 @@ const { MathMax, Number, NumberPrototypeToFixed, - ObjectDefineProperty, ObjectSeal, Promise, PromisePrototypeThen, @@ -55,6 +54,7 @@ const { const { kEmptyObject, once: runOnce, + setOwnProperty, } = require('internal/util'); const { isPromise } = require('internal/util/types'); const { @@ -133,20 +133,14 @@ function stopTest(timeout, signal) { if (timeout === kDefaultTimeout) { disposeFunction = abortListener[SymbolDispose]; } else { - timer = setTimeout(() => deferred.resolve(), timeout); + timer = setTimeout(deferred.resolve, timeout); timer.unref(); - - ObjectDefineProperty(deferred, 'promise', { - __proto__: null, - configurable: true, - writable: true, - value: PromisePrototypeThen(deferred.promise, () => { - throw new ERR_TEST_FAILURE( - `test timed out after ${timeout}ms`, - kTestTimeoutFailure, - ); - }), - }); + setOwnProperty(deferred, 'promise', PromisePrototypeThen(deferred.promise, () => { + throw new ERR_TEST_FAILURE( + `test timed out after ${timeout}ms`, + kTestTimeoutFailure, + ); + })); disposeFunction = () => { abortListener[SymbolDispose](); @@ -154,12 +148,7 @@ function stopTest(timeout, signal) { }; } - ObjectDefineProperty(deferred.promise, SymbolDispose, { - __proto__: null, - configurable: true, - writable: true, - value: disposeFunction, - }); + setOwnProperty(deferred.promise, SymbolDispose, disposeFunction); return deferred.promise; } @@ -994,7 +983,7 @@ class Test extends AsyncResource { if (this.root.harness.buildPromise || !this.parent.hasConcurrency()) { const deferred = PromiseWithResolvers(); - deferred.test = this; + setOwnProperty(deferred, 'test', this); this.parent.addPendingSubtest(deferred); return deferred.promise; } From d729bec97695c55b11b751038ec3c2b6e4ee174b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=90=E1=BB=97=20Tr=E1=BB=8Dng=20H=E1=BA=A3i?= <41283691+hainenber@users.noreply.github.com> Date: Fri, 21 Nov 2025 05:04:36 +0700 Subject: [PATCH 18/56] repl: tab completion targets `` instead of `new ` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: hainenber PR-URL: https://github.com/nodejs/node/pull/60319 Reviewed-By: Ruben Bridgewater Reviewed-By: René --- lib/internal/repl/completion.js | 10 +++++ .../test-repl-tab-complete-new-expression.js | 41 +++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 test/parallel/test-repl-tab-complete-new-expression.js diff --git a/lib/internal/repl/completion.js b/lib/internal/repl/completion.js index 8ff58ecd197fb4..96b646a4e4469d 100644 --- a/lib/internal/repl/completion.js +++ b/lib/internal/repl/completion.js @@ -613,6 +613,16 @@ function findExpressionCompleteTarget(code) { return findExpressionCompleteTarget(argumentCode); } + // If the last statement is an expression statement with "new" syntax + // we want to extract the callee for completion (e.g. for `new Sample` we want `Sample`) + if (lastBodyStatement.type === 'ExpressionStatement' && + lastBodyStatement.expression.type === 'NewExpression' && + lastBodyStatement.expression.callee) { + const callee = lastBodyStatement.expression.callee; + const calleeCode = code.slice(callee.start, callee.end); + return findExpressionCompleteTarget(calleeCode); + } + // Walk the AST for the current block of code, and check whether it contains any // statement or expression type that would potentially have side effects if evaluated. let isAllowed = true; diff --git a/test/parallel/test-repl-tab-complete-new-expression.js b/test/parallel/test-repl-tab-complete-new-expression.js new file mode 100644 index 00000000000000..ef269f44b7698b --- /dev/null +++ b/test/parallel/test-repl-tab-complete-new-expression.js @@ -0,0 +1,41 @@ +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const { startNewREPLServer } = require('../common/repl'); +const { describe, it } = require('node:test'); + +// This test verifies that tab completion works correctly with `new` operator +// for a class. Property access has higher precedence than `new` so the properties +// should be displayed as autocompletion result. + +describe('REPL tab completion with new expressions', () => { + it('should output completion of class properties', () => { + const { replServer, input } = startNewREPLServer({ terminal: false }); + + input.run([ + ` + class X { x = 1 }; + X.Y = class Y { y = 2 }; + `, + ]); + + // Handle completion for property of root class. + replServer.complete( + 'new X.', + common.mustSucceed((completions) => { + assert.strictEqual(completions[1], 'X.'); + }) + ); + + // Handle completion for property with another class as value. + replServer.complete( + 'new X.Y.', + common.mustSucceed((completions) => { + assert.strictEqual(completions[1], 'X.Y.'); + }) + ); + + replServer.close(); + }); +}); From b8b4350ed3b73d225eb9e628d69151df56eaf298 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Nov 2025 22:13:20 +0000 Subject: [PATCH 19/56] tools: bump js-yaml from 4.1.0 to 4.1.1 in /tools/lint-md Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 4.1.0 to 4.1.1. - [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md) - [Commits](https://github.com/nodeca/js-yaml/compare/4.1.0...4.1.1) --- updated-dependencies: - dependency-name: js-yaml dependency-version: 4.1.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] PR-URL: https://github.com/nodejs/node/pull/60781 Reviewed-By: Xuguang Mei Reviewed-By: Colin Ihrig Reviewed-By: Luigi Pinca --- tools/lint-md/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/lint-md/package-lock.json b/tools/lint-md/package-lock.json index 75355b8c78c6c7..3e889ae14d4c5f 100644 --- a/tools/lint-md/package-lock.json +++ b/tools/lint-md/package-lock.json @@ -326,9 +326,9 @@ } }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "license": "MIT", "dependencies": { "argparse": "^2.0.1" From 00a8377e5007532b204ebd63d85c406825267812 Mon Sep 17 00:00:00 2001 From: "Node.js GitHub Bot" Date: Fri, 21 Nov 2025 18:57:52 +0000 Subject: [PATCH 20/56] deps: update brotli to 1.2.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/60540 Reviewed-By: Michaël Zasso Reviewed-By: Antoine du Hamel --- deps/brotli/brotli.gyp | 4 + deps/brotli/c/common/constants.c | 14 +- deps/brotli/c/common/constants.h | 7 +- deps/brotli/c/common/context.c | 4 +- deps/brotli/c/common/context.h | 3 +- deps/brotli/c/common/dictionary.c | 5860 +---------------- deps/brotli/c/common/dictionary.h | 3 +- deps/brotli/c/common/dictionary_inc.h | 5847 ++++++++++++++++ deps/brotli/c/common/platform.c | 4 - deps/brotli/c/common/platform.h | 225 +- deps/brotli/c/common/shared_dictionary.c | 10 +- .../c/common/shared_dictionary_internal.h | 2 +- deps/brotli/c/common/static_init.h | 56 + deps/brotli/c/common/transform.c | 10 +- deps/brotli/c/common/transform.h | 3 +- deps/brotli/c/common/version.h | 6 +- deps/brotli/c/dec/bit_reader.c | 5 +- deps/brotli/c/dec/bit_reader.h | 4 - deps/brotli/c/dec/decode.c | 167 +- deps/brotli/c/dec/huffman.c | 7 +- deps/brotli/c/dec/huffman.h | 2 - deps/brotli/c/dec/prefix.c | 67 + deps/brotli/c/dec/prefix.h | 726 +- deps/brotli/c/dec/prefix_inc.h | 707 ++ deps/brotli/c/dec/state.c | 33 +- deps/brotli/c/dec/state.h | 8 +- deps/brotli/c/dec/static_init.c | 53 + deps/brotli/c/dec/static_init.h | 30 + deps/brotli/c/enc/backward_references.c | 40 +- deps/brotli/c/enc/backward_references.h | 6 +- deps/brotli/c/enc/backward_references_hq.c | 30 +- deps/brotli/c/enc/backward_references_hq.h | 6 +- deps/brotli/c/enc/bit_cost.c | 32 +- deps/brotli/c/enc/bit_cost.h | 48 +- deps/brotli/c/enc/bit_cost_inc.h | 2 +- deps/brotli/c/enc/block_splitter.c | 21 +- deps/brotli/c/enc/block_splitter.h | 3 - deps/brotli/c/enc/block_splitter_inc.h | 22 +- deps/brotli/c/enc/brotli_bit_stream.c | 19 +- deps/brotli/c/enc/brotli_bit_stream.h | 6 - deps/brotli/c/enc/cluster.c | 2 - deps/brotli/c/enc/cluster.h | 2 - deps/brotli/c/enc/command.c | 2 +- deps/brotli/c/enc/command.h | 18 +- deps/brotli/c/enc/compound_dictionary.c | 8 +- deps/brotli/c/enc/compound_dictionary.h | 5 +- deps/brotli/c/enc/compress_fragment.c | 16 +- deps/brotli/c/enc/compress_fragment.h | 2 - .../brotli/c/enc/compress_fragment_two_pass.c | 20 +- .../brotli/c/enc/compress_fragment_two_pass.h | 2 - deps/brotli/c/enc/dictionary_hash.c | 1957 +----- deps/brotli/c/enc/dictionary_hash.h | 26 +- deps/brotli/c/enc/dictionary_hash_inc.h | 1829 +++++ deps/brotli/c/enc/encode.c | 129 +- deps/brotli/c/enc/encoder_dict.c | 16 +- deps/brotli/c/enc/encoder_dict.h | 6 +- deps/brotli/c/enc/entropy_encode.c | 9 +- deps/brotli/c/enc/entropy_encode.h | 6 +- deps/brotli/c/enc/entropy_encode_static.h | 30 +- deps/brotli/c/enc/fast_log.c | 2 +- deps/brotli/c/enc/fast_log.h | 5 +- deps/brotli/c/enc/find_match_length.h | 2 - deps/brotli/c/enc/hash.h | 69 +- deps/brotli/c/enc/hash_base.h | 38 + deps/brotli/c/enc/hash_forgetful_chain_inc.h | 12 +- deps/brotli/c/enc/hash_longest_match64_inc.h | 31 +- .../c/enc/hash_longest_match64_simd_inc.h | 304 + deps/brotli/c/enc/hash_longest_match_inc.h | 41 +- .../c/enc/hash_longest_match_quickly_inc.h | 4 + .../c/enc/hash_longest_match_simd_inc.h | 278 + deps/brotli/c/enc/histogram.c | 1 + deps/brotli/c/enc/histogram.h | 4 - deps/brotli/c/enc/literal_cost.c | 10 +- deps/brotli/c/enc/literal_cost.h | 2 - deps/brotli/c/enc/matching_tag_mask.h | 69 + deps/brotli/c/enc/memory.c | 5 - deps/brotli/c/enc/memory.h | 4 - deps/brotli/c/enc/metablock.c | 16 +- deps/brotli/c/enc/metablock.h | 6 +- deps/brotli/c/enc/metablock_inc.h | 8 +- deps/brotli/c/enc/params.h | 1 - deps/brotli/c/enc/prefix.h | 2 - deps/brotli/c/enc/quality.h | 27 +- deps/brotli/c/enc/ringbuffer.h | 5 +- deps/brotli/c/enc/state.h | 4 +- deps/brotli/c/enc/static_dict.c | 16 +- deps/brotli/c/enc/static_dict.h | 4 +- deps/brotli/c/enc/static_dict_lut.c | 224 + deps/brotli/c/enc/static_dict_lut.h | 5857 +--------------- deps/brotli/c/enc/static_dict_lut_inc.h | 5830 ++++++++++++++++ deps/brotli/c/enc/static_init.c | 59 + deps/brotli/c/enc/static_init.h | 30 + deps/brotli/c/enc/static_init_lazy.cc | 26 + deps/brotli/c/enc/utf8_util.c | 2 +- deps/brotli/c/enc/utf8_util.h | 2 - deps/brotli/c/enc/write_bits.h | 2 - deps/brotli/c/include/brotli/decode.h | 2 +- deps/brotli/c/include/brotli/encode.h | 6 +- deps/brotli/c/include/brotli/port.h | 11 +- deps/brotli/c/include/brotli/types.h | 4 +- deps/brotli/c/tools/brotli.c | 350 +- deps/brotli/c/tools/brotli.md | 10 +- 102 files changed, 16727 insertions(+), 14845 deletions(-) create mode 100644 deps/brotli/c/common/dictionary_inc.h create mode 100644 deps/brotli/c/common/static_init.h create mode 100644 deps/brotli/c/dec/prefix.c create mode 100644 deps/brotli/c/dec/prefix_inc.h create mode 100644 deps/brotli/c/dec/static_init.c create mode 100644 deps/brotli/c/dec/static_init.h create mode 100644 deps/brotli/c/enc/dictionary_hash_inc.h create mode 100644 deps/brotli/c/enc/hash_base.h create mode 100644 deps/brotli/c/enc/hash_longest_match64_simd_inc.h create mode 100644 deps/brotli/c/enc/hash_longest_match_simd_inc.h create mode 100644 deps/brotli/c/enc/matching_tag_mask.h create mode 100644 deps/brotli/c/enc/static_dict_lut.c create mode 100644 deps/brotli/c/enc/static_dict_lut_inc.h create mode 100644 deps/brotli/c/enc/static_init.c create mode 100644 deps/brotli/c/enc/static_init.h create mode 100644 deps/brotli/c/enc/static_init_lazy.cc diff --git a/deps/brotli/brotli.gyp b/deps/brotli/brotli.gyp index f1f487945e5727..8c3f3b17c01821 100644 --- a/deps/brotli/brotli.gyp +++ b/deps/brotli/brotli.gyp @@ -13,7 +13,9 @@ 'c/dec/bit_reader.c', 'c/dec/decode.c', 'c/dec/huffman.c', + 'c/dec/prefix.c', 'c/dec/state.c', + 'c/dec/static_init.c', # Encoder 'c/enc/backward_references.c', @@ -36,6 +38,8 @@ 'c/enc/memory.c', 'c/enc/metablock.c', 'c/enc/static_dict.c', + 'c/enc/static_dict_lut.c', + 'c/enc/static_init.c', 'c/enc/utf8_util.c', ] }, diff --git a/deps/brotli/c/common/constants.c b/deps/brotli/c/common/constants.c index 89866b150503c6..ef5a2e2e046aa6 100644 --- a/deps/brotli/c/common/constants.c +++ b/deps/brotli/c/common/constants.c @@ -6,10 +6,10 @@ #include "constants.h" -const BrotliPrefixCodeRange - _kBrotliPrefixCodeRanges[BROTLI_NUM_BLOCK_LEN_SYMBOLS] = { - {1, 2}, {5, 2}, {9, 2}, {13, 2}, {17, 3}, {25, 3}, - {33, 3}, {41, 3}, {49, 4}, {65, 4}, {81, 4}, {97, 4}, - {113, 5}, {145, 5}, {177, 5}, {209, 5}, {241, 6}, {305, 6}, - {369, 7}, {497, 8}, {753, 9}, {1265, 10}, {2289, 11}, {4337, 12}, - {8433, 13}, {16625, 24}}; +const BROTLI_MODEL("small") +BrotliPrefixCodeRange _kBrotliPrefixCodeRanges[BROTLI_NUM_BLOCK_LEN_SYMBOLS] = { + {1, 2}, {5, 2}, {9, 2}, {13, 2}, {17, 3}, {25, 3}, + {33, 3}, {41, 3}, {49, 4}, {65, 4}, {81, 4}, {97, 4}, + {113, 5}, {145, 5}, {177, 5}, {209, 5}, {241, 6}, {305, 6}, + {369, 7}, {497, 8}, {753, 9}, {1265, 10}, {2289, 11}, {4337, 12}, + {8433, 13}, {16625, 24}}; diff --git a/deps/brotli/c/common/constants.h b/deps/brotli/c/common/constants.h index 31e5bd376e90fc..85e9802c0c87bd 100644 --- a/deps/brotli/c/common/constants.h +++ b/deps/brotli/c/common/constants.h @@ -12,9 +12,6 @@ #ifndef BROTLI_COMMON_CONSTANTS_H_ #define BROTLI_COMMON_CONSTANTS_H_ -#include -#include - #include "platform.h" /* Specification: 7.3. Encoding of the context map */ @@ -195,7 +192,7 @@ typedef struct { } BrotliPrefixCodeRange; /* "Soft-private", it is exported, but not "advertised" as API. */ -BROTLI_COMMON_API extern const BrotliPrefixCodeRange - _kBrotliPrefixCodeRanges[BROTLI_NUM_BLOCK_LEN_SYMBOLS]; +BROTLI_COMMON_API extern const BROTLI_MODEL("small") +BrotliPrefixCodeRange _kBrotliPrefixCodeRanges[BROTLI_NUM_BLOCK_LEN_SYMBOLS]; #endif /* BROTLI_COMMON_CONSTANTS_H_ */ diff --git a/deps/brotli/c/common/context.c b/deps/brotli/c/common/context.c index 7f9c95869917b3..d3c910cb1b465f 100644 --- a/deps/brotli/c/common/context.c +++ b/deps/brotli/c/common/context.c @@ -1,9 +1,9 @@ #include "context.h" -#include +#include "platform.h" /* Common context lookup table for all context modes. */ -const uint8_t _kBrotliContextLookupTable[2048] = { +const BROTLI_MODEL("small") uint8_t _kBrotliContextLookupTable[2048] = { /* CONTEXT_LSB6, last byte. */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, diff --git a/deps/brotli/c/common/context.h b/deps/brotli/c/common/context.h index 685a279dc06993..45b57d8c3edf65 100644 --- a/deps/brotli/c/common/context.h +++ b/deps/brotli/c/common/context.h @@ -88,8 +88,7 @@ #ifndef BROTLI_COMMON_CONTEXT_H_ #define BROTLI_COMMON_CONTEXT_H_ -#include -#include +#include "platform.h" typedef enum ContextType { CONTEXT_LSB6 = 0, diff --git a/deps/brotli/c/common/dictionary.c b/deps/brotli/c/common/dictionary.c index 7c015ab0ba73b3..ef43af9bfb36b5 100644 --- a/deps/brotli/c/common/dictionary.c +++ b/deps/brotli/c/common/dictionary.c @@ -12,5863 +12,11 @@ extern "C" { #endif #if !defined(BROTLI_EXTERNAL_DICTIONARY_DATA) -static const uint8_t kBrotliDictionaryData[] = -/* GENERATED CODE START */ -{ -116,105,109,101,100,111,119,110,108,105,102,101,108,101,102,116,98,97,99,107,99, -111,100,101,100,97,116,97,115,104,111,119,111,110,108,121,115,105,116,101,99,105 -,116,121,111,112,101,110,106,117,115,116,108,105,107,101,102,114,101,101,119,111 -,114,107,116,101,120,116,121,101,97,114,111,118,101,114,98,111,100,121,108,111, -118,101,102,111,114,109,98,111,111,107,112,108,97,121,108,105,118,101,108,105, -110,101,104,101,108,112,104,111,109,101,115,105,100,101,109,111,114,101,119,111, -114,100,108,111,110,103,116,104,101,109,118,105,101,119,102,105,110,100,112,97, -103,101,100,97,121,115,102,117,108,108,104,101,97,100,116,101,114,109,101,97,99, -104,97,114,101,97,102,114,111,109,116,114,117,101,109,97,114,107,97,98,108,101, -117,112,111,110,104,105,103,104,100,97,116,101,108,97,110,100,110,101,119,115, -101,118,101,110,110,101,120,116,99,97,115,101,98,111,116,104,112,111,115,116,117 -,115,101,100,109,97,100,101,104,97,110,100,104,101,114,101,119,104,97,116,110,97 -,109,101,76,105,110,107,98,108,111,103,115,105,122,101,98,97,115,101,104,101,108 -,100,109,97,107,101,109,97,105,110,117,115,101,114,39,41,32,43,104,111,108,100, -101,110,100,115,119,105,116,104,78,101,119,115,114,101,97,100,119,101,114,101, -115,105,103,110,116,97,107,101,104,97,118,101,103,97,109,101,115,101,101,110,99, -97,108,108,112,97,116,104,119,101,108,108,112,108,117,115,109,101,110,117,102, -105,108,109,112,97,114,116,106,111,105,110,116,104,105,115,108,105,115,116,103, -111,111,100,110,101,101,100,119,97,121,115,119,101,115,116,106,111,98,115,109, -105,110,100,97,108,115,111,108,111,103,111,114,105,99,104,117,115,101,115,108,97 -,115,116,116,101,97,109,97,114,109,121,102,111,111,100,107,105,110,103,119,105, -108,108,101,97,115,116,119,97,114,100,98,101,115,116,102,105,114,101,80,97,103, -101,107,110,111,119,97,119,97,121,46,112,110,103,109,111,118,101,116,104,97,110, -108,111,97,100,103,105,118,101,115,101,108,102,110,111,116,101,109,117,99,104, -102,101,101,100,109,97,110,121,114,111,99,107,105,99,111,110,111,110,99,101,108, -111,111,107,104,105,100,101,100,105,101,100,72,111,109,101,114,117,108,101,104, -111,115,116,97,106,97,120,105,110,102,111,99,108,117,98,108,97,119,115,108,101, -115,115,104,97,108,102,115,111,109,101,115,117,99,104,122,111,110,101,49,48,48, -37,111,110,101,115,99,97,114,101,84,105,109,101,114,97,99,101,98,108,117,101,102 -,111,117,114,119,101,101,107,102,97,99,101,104,111,112,101,103,97,118,101,104,97 -,114,100,108,111,115,116,119,104,101,110,112,97,114,107,107,101,112,116,112,97, -115,115,115,104,105,112,114,111,111,109,72,84,77,76,112,108,97,110,84,121,112, -101,100,111,110,101,115,97,118,101,107,101,101,112,102,108,97,103,108,105,110, -107,115,111,108,100,102,105,118,101,116,111,111,107,114,97,116,101,116,111,119, -110,106,117,109,112,116,104,117,115,100,97,114,107,99,97,114,100,102,105,108,101 -,102,101,97,114,115,116,97,121,107,105,108,108,116,104,97,116,102,97,108,108,97, -117,116,111,101,118,101,114,46,99,111,109,116,97,108,107,115,104,111,112,118,111 -,116,101,100,101,101,112,109,111,100,101,114,101,115,116,116,117,114,110,98,111, -114,110,98,97,110,100,102,101,108,108,114,111,115,101,117,114,108,40,115,107,105 -,110,114,111,108,101,99,111,109,101,97,99,116,115,97,103,101,115,109,101,101,116 -,103,111,108,100,46,106,112,103,105,116,101,109,118,97,114,121,102,101,108,116, -116,104,101,110,115,101,110,100,100,114,111,112,86,105,101,119,99,111,112,121,49 -,46,48,34,60,47,97,62,115,116,111,112,101,108,115,101,108,105,101,115,116,111, -117,114,112,97,99,107,46,103,105,102,112,97,115,116,99,115,115,63,103,114,97,121 -,109,101,97,110,38,103,116,59,114,105,100,101,115,104,111,116,108,97,116,101,115 -,97,105,100,114,111,97,100,118,97,114,32,102,101,101,108,106,111,104,110,114,105 -,99,107,112,111,114,116,102,97,115,116,39,85,65,45,100,101,97,100,60,47,98,62, -112,111,111,114,98,105,108,108,116,121,112,101,85,46,83,46,119,111,111,100,109, -117,115,116,50,112,120,59,73,110,102,111,114,97,110,107,119,105,100,101,119,97, -110,116,119,97,108,108,108,101,97,100,91,48,93,59,112,97,117,108,119,97,118,101, -115,117,114,101,36,40,39,35,119,97,105,116,109,97,115,115,97,114,109,115,103,111 -,101,115,103,97,105,110,108,97,110,103,112,97,105,100,33,45,45,32,108,111,99,107 -,117,110,105,116,114,111,111,116,119,97,108,107,102,105,114,109,119,105,102,101, -120,109,108,34,115,111,110,103,116,101,115,116,50,48,112,120,107,105,110,100,114 -,111,119,115,116,111,111,108,102,111,110,116,109,97,105,108,115,97,102,101,115, -116,97,114,109,97,112,115,99,111,114,101,114,97,105,110,102,108,111,119,98,97,98 -,121,115,112,97,110,115,97,121,115,52,112,120,59,54,112,120,59,97,114,116,115, -102,111,111,116,114,101,97,108,119,105,107,105,104,101,97,116,115,116,101,112, -116,114,105,112,111,114,103,47,108,97,107,101,119,101,97,107,116,111,108,100,70, -111,114,109,99,97,115,116,102,97,110,115,98,97,110,107,118,101,114,121,114,117, -110,115,106,117,108,121,116,97,115,107,49,112,120,59,103,111,97,108,103,114,101, -119,115,108,111,119,101,100,103,101,105,100,61,34,115,101,116,115,53,112,120,59, -46,106,115,63,52,48,112,120,105,102,32,40,115,111,111,110,115,101,97,116,110,111 -,110,101,116,117,98,101,122,101,114,111,115,101,110,116,114,101,101,100,102,97, -99,116,105,110,116,111,103,105,102,116,104,97,114,109,49,56,112,120,99,97,109, -101,104,105,108,108,98,111,108,100,122,111,111,109,118,111,105,100,101,97,115, -121,114,105,110,103,102,105,108,108,112,101,97,107,105,110,105,116,99,111,115, -116,51,112,120,59,106,97,99,107,116,97,103,115,98,105,116,115,114,111,108,108, -101,100,105,116,107,110,101,119,110,101,97,114,60,33,45,45,103,114,111,119,74,83 -,79,78,100,117,116,121,78,97,109,101,115,97,108,101,121,111,117,32,108,111,116, -115,112,97,105,110,106,97,122,122,99,111,108,100,101,121,101,115,102,105,115,104 -,119,119,119,46,114,105,115,107,116,97,98,115,112,114,101,118,49,48,112,120,114, -105,115,101,50,53,112,120,66,108,117,101,100,105,110,103,51,48,48,44,98,97,108, -108,102,111,114,100,101,97,114,110,119,105,108,100,98,111,120,46,102,97,105,114, -108,97,99,107,118,101,114,115,112,97,105,114,106,117,110,101,116,101,99,104,105, -102,40,33,112,105,99,107,101,118,105,108,36,40,34,35,119,97,114,109,108,111,114, -100,100,111,101,115,112,117,108,108,44,48,48,48,105,100,101,97,100,114,97,119, -104,117,103,101,115,112,111,116,102,117,110,100,98,117,114,110,104,114,101,102, -99,101,108,108,107,101,121,115,116,105,99,107,104,111,117,114,108,111,115,115, -102,117,101,108,49,50,112,120,115,117,105,116,100,101,97,108,82,83,83,34,97,103, -101,100,103,114,101,121,71,69,84,34,101,97,115,101,97,105,109,115,103,105,114, -108,97,105,100,115,56,112,120,59,110,97,118,121,103,114,105,100,116,105,112,115, -35,57,57,57,119,97,114,115,108,97,100,121,99,97,114,115,41,59,32,125,112,104,112 -,63,104,101,108,108,116,97,108,108,119,104,111,109,122,104,58,229,42,47,13,10,32 -,49,48,48,104,97,108,108,46,10,10,65,55,112,120,59,112,117,115,104,99,104,97,116 -,48,112,120,59,99,114,101,119,42,47,60,47,104,97,115,104,55,53,112,120,102,108, -97,116,114,97,114,101,32,38,38,32,116,101,108,108,99,97,109,112,111,110,116,111, -108,97,105,100,109,105,115,115,115,107,105,112,116,101,110,116,102,105,110,101, -109,97,108,101,103,101,116,115,112,108,111,116,52,48,48,44,13,10,13,10,99,111, -111,108,102,101,101,116,46,112,104,112,60,98,114,62,101,114,105,99,109,111,115, -116,103,117,105,100,98,101,108,108,100,101,115,99,104,97,105,114,109,97,116,104, -97,116,111,109,47,105,109,103,38,35,56,50,108,117,99,107,99,101,110,116,48,48,48 -,59,116,105,110,121,103,111,110,101,104,116,109,108,115,101,108,108,100,114,117, -103,70,82,69,69,110,111,100,101,110,105,99,107,63,105,100,61,108,111,115,101,110 -,117,108,108,118,97,115,116,119,105,110,100,82,83,83,32,119,101,97,114,114,101, -108,121,98,101,101,110,115,97,109,101,100,117,107,101,110,97,115,97,99,97,112, -101,119,105,115,104,103,117,108,102,84,50,51,58,104,105,116,115,115,108,111,116, -103,97,116,101,107,105,99,107,98,108,117,114,116,104,101,121,49,53,112,120,39,39 -,41,59,41,59,34,62,109,115,105,101,119,105,110,115,98,105,114,100,115,111,114, -116,98,101,116,97,115,101,101,107,84,49,56,58,111,114,100,115,116,114,101,101, -109,97,108,108,54,48,112,120,102,97,114,109,226,128,153,115,98,111,121,115,91,48 -,93,46,39,41,59,34,80,79,83,84,98,101,97,114,107,105,100,115,41,59,125,125,109, -97,114,121,116,101,110,100,40,85,75,41,113,117,97,100,122,104,58,230,45,115,105, -122,45,45,45,45,112,114,111,112,39,41,59,13,108,105,102,116,84,49,57,58,118,105, -99,101,97,110,100,121,100,101,98,116,62,82,83,83,112,111,111,108,110,101,99,107, -98,108,111,119,84,49,54,58,100,111,111,114,101,118,97,108,84,49,55,58,108,101, -116,115,102,97,105,108,111,114,97,108,112,111,108,108,110,111,118,97,99,111,108, -115,103,101,110,101,32,226,128,148,115,111,102,116,114,111,109,101,116,105,108, -108,114,111,115,115,60,104,51,62,112,111,117,114,102,97,100,101,112,105,110,107, -60,116,114,62,109,105,110,105,41,124,33,40,109,105,110,101,122,104,58,232,98,97, -114,115,104,101,97,114,48,48,41,59,109,105,108,107,32,45,45,62,105,114,111,110, -102,114,101,100,100,105,115,107,119,101,110,116,115,111,105,108,112,117,116,115, -47,106,115,47,104,111,108,121,84,50,50,58,73,83,66,78,84,50,48,58,97,100,97,109, -115,101,101,115,60,104,50,62,106,115,111,110,39,44,32,39,99,111,110,116,84,50,49 -,58,32,82,83,83,108,111,111,112,97,115,105,97,109,111,111,110,60,47,112,62,115, -111,117,108,76,73,78,69,102,111,114,116,99,97,114,116,84,49,52,58,60,104,49,62, -56,48,112,120,33,45,45,60,57,112,120,59,84,48,52,58,109,105,107,101,58,52,54,90, -110,105,99,101,105,110,99,104,89,111,114,107,114,105,99,101,122,104,58,228,39,41 -,41,59,112,117,114,101,109,97,103,101,112,97,114,97,116,111,110,101,98,111,110, -100,58,51,55,90,95,111,102,95,39,93,41,59,48,48,48,44,122,104,58,231,116,97,110, -107,121,97,114,100,98,111,119,108,98,117,115,104,58,53,54,90,74,97,118,97,51,48, -112,120,10,124,125,10,37,67,51,37,58,51,52,90,106,101,102,102,69,88,80,73,99,97, -115,104,118,105,115,97,103,111,108,102,115,110,111,119,122,104,58,233,113,117, -101,114,46,99,115,115,115,105,99,107,109,101,97,116,109,105,110,46,98,105,110, -100,100,101,108,108,104,105,114,101,112,105,99,115,114,101,110,116,58,51,54,90, -72,84,84,80,45,50,48,49,102,111,116,111,119,111,108,102,69,78,68,32,120,98,111, -120,58,53,52,90,66,79,68,89,100,105,99,107,59,10,125,10,101,120,105,116,58,51,53 -,90,118,97,114,115,98,101,97,116,39,125,41,59,100,105,101,116,57,57,57,59,97,110 -,110,101,125,125,60,47,91,105,93,46,76,97,110,103,107,109,194,178,119,105,114, -101,116,111,121,115,97,100,100,115,115,101,97,108,97,108,101,120,59,10,9,125,101 -,99,104,111,110,105,110,101,46,111,114,103,48,48,53,41,116,111,110,121,106,101, -119,115,115,97,110,100,108,101,103,115,114,111,111,102,48,48,48,41,32,50,48,48, -119,105,110,101,103,101,97,114,100,111,103,115,98,111,111,116,103,97,114,121,99, -117,116,115,116,121,108,101,116,101,109,112,116,105,111,110,46,120,109,108,99, -111,99,107,103,97,110,103,36,40,39,46,53,48,112,120,80,104,46,68,109,105,115,99, -97,108,97,110,108,111,97,110,100,101,115,107,109,105,108,101,114,121,97,110,117, -110,105,120,100,105,115,99,41,59,125,10,100,117,115,116,99,108,105,112,41,46,10, -10,55,48,112,120,45,50,48,48,68,86,68,115,55,93,62,60,116,97,112,101,100,101,109 -,111,105,43,43,41,119,97,103,101,101,117,114,111,112,104,105,108,111,112,116,115 -,104,111,108,101,70,65,81,115,97,115,105,110,45,50,54,84,108,97,98,115,112,101, -116,115,85,82,76,32,98,117,108,107,99,111,111,107,59,125,13,10,72,69,65,68,91,48 -,93,41,97,98,98,114,106,117,97,110,40,49,57,56,108,101,115,104,116,119,105,110, -60,47,105,62,115,111,110,121,103,117,121,115,102,117,99,107,112,105,112,101,124, -45,10,33,48,48,50,41,110,100,111,119,91,49,93,59,91,93,59,10,76,111,103,32,115, -97,108,116,13,10,9,9,98,97,110,103,116,114,105,109,98,97,116,104,41,123,13,10,48 -,48,112,120,10,125,41,59,107,111,58,236,102,101,101,115,97,100,62,13,115,58,47, -47,32,91,93,59,116,111,108,108,112,108,117,103,40,41,123,10,123,13,10,32,46,106, -115,39,50,48,48,112,100,117,97,108,98,111,97,116,46,74,80,71,41,59,10,125,113, -117,111,116,41,59,10,10,39,41,59,10,13,10,125,13,50,48,49,52,50,48,49,53,50,48, -49,54,50,48,49,55,50,48,49,56,50,48,49,57,50,48,50,48,50,48,50,49,50,48,50,50,50 -,48,50,51,50,48,50,52,50,48,50,53,50,48,50,54,50,48,50,55,50,48,50,56,50,48,50, -57,50,48,51,48,50,48,51,49,50,48,51,50,50,48,51,51,50,48,51,52,50,48,51,53,50,48 -,51,54,50,48,51,55,50,48,49,51,50,48,49,50,50,48,49,49,50,48,49,48,50,48,48,57, -50,48,48,56,50,48,48,55,50,48,48,54,50,48,48,53,50,48,48,52,50,48,48,51,50,48,48 -,50,50,48,48,49,50,48,48,48,49,57,57,57,49,57,57,56,49,57,57,55,49,57,57,54,49, -57,57,53,49,57,57,52,49,57,57,51,49,57,57,50,49,57,57,49,49,57,57,48,49,57,56,57 -,49,57,56,56,49,57,56,55,49,57,56,54,49,57,56,53,49,57,56,52,49,57,56,51,49,57, -56,50,49,57,56,49,49,57,56,48,49,57,55,57,49,57,55,56,49,57,55,55,49,57,55,54,49 -,57,55,53,49,57,55,52,49,57,55,51,49,57,55,50,49,57,55,49,49,57,55,48,49,57,54, -57,49,57,54,56,49,57,54,55,49,57,54,54,49,57,54,53,49,57,54,52,49,57,54,51,49,57 -,54,50,49,57,54,49,49,57,54,48,49,57,53,57,49,57,53,56,49,57,53,55,49,57,53,54, -49,57,53,53,49,57,53,52,49,57,53,51,49,57,53,50,49,57,53,49,49,57,53,48,49,48,48 -,48,49,48,50,52,49,51,57,52,48,48,48,48,57,57,57,57,99,111,109,111,109,195,161, -115,101,115,116,101,101,115,116,97,112,101,114,111,116,111,100,111,104,97,99,101 -,99,97,100,97,97,195,177,111,98,105,101,110,100,195,173,97,97,115,195,173,118, -105,100,97,99,97,115,111,111,116,114,111,102,111,114,111,115,111,108,111,111,116 -,114,97,99,117,97,108,100,105,106,111,115,105,100,111,103,114,97,110,116,105,112 -,111,116,101,109,97,100,101,98,101,97,108,103,111,113,117,195,169,101,115,116, -111,110,97,100,97,116,114,101,115,112,111,99,111,99,97,115,97,98,97,106,111,116, -111,100,97,115,105,110,111,97,103,117,97,112,117,101,115,117,110,111,115,97,110, -116,101,100,105,99,101,108,117,105,115,101,108,108,97,109,97,121,111,122,111,110 -,97,97,109,111,114,112,105,115,111,111,98,114,97,99,108,105,99,101,108,108,111, -100,105,111,115,104,111,114,97,99,97,115,105,208,183,208,176,208,189,208,176,208 -,190,208,188,209,128,208,176,209,128,209,131,209,130,208,176,208,189,208,181,208 -,191,208,190,208,190,209,130,208,184,208,183,208,189,208,190,208,180,208,190,209 -,130,208,190,208,182,208,181,208,190,208,189,208,184,209,133,208,157,208,176,208 -,181,208,181,208,177,209,139,208,188,209,139,208,146,209,139,209,129,208,190,208 -,178,209,139,208,178,208,190,208,157,208,190,208,190,208,177,208,159,208,190,208 -,187,208,184,208,189,208,184,208,160,208,164,208,157,208,181,208,156,209,139,209 -,130,209,139,208,158,208,189,208,184,208,188,208,180,208,176,208,151,208,176,208 -,148,208,176,208,157,209,131,208,158,208,177,209,130,208,181,208,152,208,183,208 -,181,208,185,208,189,209,131,208,188,208,188,208,162,209,139,209,131,208,182,217 -,129,217,138,216,163,217,134,217,133,216,167,217,133,216,185,217,131,217,132,216 -,163,217,136,216,177,216,175,217,138,216,167,217,129,217,137,217,135,217,136,217 -,132,217,133,217,132,217,131,216,167,217,136,217,132,217,135,216,168,216,179,216 -,167,217,132,216,165,217,134,217,135,217,138,216,163,217,138,217,130,216,175,217 -,135,217,132,216,171,217,133,216,168,217,135,217,132,217,136,217,132,217,138,216 -,168,217,132,216,167,217,138,216,168,217,131,216,180,217,138,216,167,217,133,216 -,163,217,133,217,134,216,170,216,168,217,138,217,132,217,134,216,173,216,168,217 -,135,217,133,217,133,216,180,217,136,216,180,102,105,114,115,116,118,105,100,101 -,111,108,105,103,104,116,119,111,114,108,100,109,101,100,105,97,119,104,105,116, -101,99,108,111,115,101,98,108,97,99,107,114,105,103,104,116,115,109,97,108,108, -98,111,111,107,115,112,108,97,99,101,109,117,115,105,99,102,105,101,108,100,111, -114,100,101,114,112,111,105,110,116,118,97,108,117,101,108,101,118,101,108,116, -97,98,108,101,98,111,97,114,100,104,111,117,115,101,103,114,111,117,112,119,111, -114,107,115,121,101,97,114,115,115,116,97,116,101,116,111,100,97,121,119,97,116, -101,114,115,116,97,114,116,115,116,121,108,101,100,101,97,116,104,112,111,119, -101,114,112,104,111,110,101,110,105,103,104,116,101,114,114,111,114,105,110,112, -117,116,97,98,111,117,116,116,101,114,109,115,116,105,116,108,101,116,111,111, -108,115,101,118,101,110,116,108,111,99,97,108,116,105,109,101,115,108,97,114,103 -,101,119,111,114,100,115,103,97,109,101,115,115,104,111,114,116,115,112,97,99, -101,102,111,99,117,115,99,108,101,97,114,109,111,100,101,108,98,108,111,99,107, -103,117,105,100,101,114,97,100,105,111,115,104,97,114,101,119,111,109,101,110,97 -,103,97,105,110,109,111,110,101,121,105,109,97,103,101,110,97,109,101,115,121, -111,117,110,103,108,105,110,101,115,108,97,116,101,114,99,111,108,111,114,103, -114,101,101,110,102,114,111,110,116,38,97,109,112,59,119,97,116,99,104,102,111, -114,99,101,112,114,105,99,101,114,117,108,101,115,98,101,103,105,110,97,102,116, -101,114,118,105,115,105,116,105,115,115,117,101,97,114,101,97,115,98,101,108,111 -,119,105,110,100,101,120,116,111,116,97,108,104,111,117,114,115,108,97,98,101, -108,112,114,105,110,116,112,114,101,115,115,98,117,105,108,116,108,105,110,107, -115,115,112,101,101,100,115,116,117,100,121,116,114,97,100,101,102,111,117,110, -100,115,101,110,115,101,117,110,100,101,114,115,104,111,119,110,102,111,114,109, -115,114,97,110,103,101,97,100,100,101,100,115,116,105,108,108,109,111,118,101, -100,116,97,107,101,110,97,98,111,118,101,102,108,97,115,104,102,105,120,101,100, -111,102,116,101,110,111,116,104,101,114,118,105,101,119,115,99,104,101,99,107, -108,101,103,97,108,114,105,118,101,114,105,116,101,109,115,113,117,105,99,107, -115,104,97,112,101,104,117,109,97,110,101,120,105,115,116,103,111,105,110,103, -109,111,118,105,101,116,104,105,114,100,98,97,115,105,99,112,101,97,99,101,115, -116,97,103,101,119,105,100,116,104,108,111,103,105,110,105,100,101,97,115,119, -114,111,116,101,112,97,103,101,115,117,115,101,114,115,100,114,105,118,101,115, -116,111,114,101,98,114,101,97,107,115,111,117,116,104,118,111,105,99,101,115,105 -,116,101,115,109,111,110,116,104,119,104,101,114,101,98,117,105,108,100,119,104, -105,99,104,101,97,114,116,104,102,111,114,117,109,116,104,114,101,101,115,112, -111,114,116,112,97,114,116,121,67,108,105,99,107,108,111,119,101,114,108,105,118 -,101,115,99,108,97,115,115,108,97,121,101,114,101,110,116,114,121,115,116,111, -114,121,117,115,97,103,101,115,111,117,110,100,99,111,117,114,116,121,111,117, -114,32,98,105,114,116,104,112,111,112,117,112,116,121,112,101,115,97,112,112,108 -,121,73,109,97,103,101,98,101,105,110,103,117,112,112,101,114,110,111,116,101, -115,101,118,101,114,121,115,104,111,119,115,109,101,97,110,115,101,120,116,114, -97,109,97,116,99,104,116,114,97,99,107,107,110,111,119,110,101,97,114,108,121,98 -,101,103,97,110,115,117,112,101,114,112,97,112,101,114,110,111,114,116,104,108, -101,97,114,110,103,105,118,101,110,110,97,109,101,100,101,110,100,101,100,84,101 -,114,109,115,112,97,114,116,115,71,114,111,117,112,98,114,97,110,100,117,115,105 -,110,103,119,111,109,97,110,102,97,108,115,101,114,101,97,100,121,97,117,100,105 -,111,116,97,107,101,115,119,104,105,108,101,46,99,111,109,47,108,105,118,101,100 -,99,97,115,101,115,100,97,105,108,121,99,104,105,108,100,103,114,101,97,116,106, -117,100,103,101,116,104,111,115,101,117,110,105,116,115,110,101,118,101,114,98, -114,111,97,100,99,111,97,115,116,99,111,118,101,114,97,112,112,108,101,102,105, -108,101,115,99,121,99,108,101,115,99,101,110,101,112,108,97,110,115,99,108,105, -99,107,119,114,105,116,101,113,117,101,101,110,112,105,101,99,101,101,109,97,105 -,108,102,114,97,109,101,111,108,100,101,114,112,104,111,116,111,108,105,109,105, -116,99,97,99,104,101,99,105,118,105,108,115,99,97,108,101,101,110,116,101,114, -116,104,101,109,101,116,104,101,114,101,116,111,117,99,104,98,111,117,110,100, -114,111,121,97,108,97,115,107,101,100,119,104,111,108,101,115,105,110,99,101,115 -,116,111,99,107,32,110,97,109,101,102,97,105,116,104,104,101,97,114,116,101,109, -112,116,121,111,102,102,101,114,115,99,111,112,101,111,119,110,101,100,109,105, -103,104,116,97,108,98,117,109,116,104,105,110,107,98,108,111,111,100,97,114,114, -97,121,109,97,106,111,114,116,114,117,115,116,99,97,110,111,110,117,110,105,111, -110,99,111,117,110,116,118,97,108,105,100,115,116,111,110,101,83,116,121,108,101 -,76,111,103,105,110,104,97,112,112,121,111,99,99,117,114,108,101,102,116,58,102, -114,101,115,104,113,117,105,116,101,102,105,108,109,115,103,114,97,100,101,110, -101,101,100,115,117,114,98,97,110,102,105,103,104,116,98,97,115,105,115,104,111, -118,101,114,97,117,116,111,59,114,111,117,116,101,46,104,116,109,108,109,105,120 -,101,100,102,105,110,97,108,89,111,117,114,32,115,108,105,100,101,116,111,112, -105,99,98,114,111,119,110,97,108,111,110,101,100,114,97,119,110,115,112,108,105, -116,114,101,97,99,104,82,105,103,104,116,100,97,116,101,115,109,97,114,99,104, -113,117,111,116,101,103,111,111,100,115,76,105,110,107,115,100,111,117,98,116,97 -,115,121,110,99,116,104,117,109,98,97,108,108,111,119,99,104,105,101,102,121,111 -,117,116,104,110,111,118,101,108,49,48,112,120,59,115,101,114,118,101,117,110, -116,105,108,104,97,110,100,115,67,104,101,99,107,83,112,97,99,101,113,117,101, -114,121,106,97,109,101,115,101,113,117,97,108,116,119,105,99,101,48,44,48,48,48, -83,116,97,114,116,112,97,110,101,108,115,111,110,103,115,114,111,117,110,100,101 -,105,103,104,116,115,104,105,102,116,119,111,114,116,104,112,111,115,116,115,108 -,101,97,100,115,119,101,101,107,115,97,118,111,105,100,116,104,101,115,101,109, -105,108,101,115,112,108,97,110,101,115,109,97,114,116,97,108,112,104,97,112,108, -97,110,116,109,97,114,107,115,114,97,116,101,115,112,108,97,121,115,99,108,97, -105,109,115,97,108,101,115,116,101,120,116,115,115,116,97,114,115,119,114,111, -110,103,60,47,104,51,62,116,104,105,110,103,46,111,114,103,47,109,117,108,116, -105,104,101,97,114,100,80,111,119,101,114,115,116,97,110,100,116,111,107,101,110 -,115,111,108,105,100,40,116,104,105,115,98,114,105,110,103,115,104,105,112,115, -115,116,97,102,102,116,114,105,101,100,99,97,108,108,115,102,117,108,108,121,102 -,97,99,116,115,97,103,101,110,116,84,104,105,115,32,47,47,45,45,62,97,100,109, -105,110,101,103,121,112,116,69,118,101,110,116,49,53,112,120,59,69,109,97,105, -108,116,114,117,101,34,99,114,111,115,115,115,112,101,110,116,98,108,111,103,115 -,98,111,120,34,62,110,111,116,101,100,108,101,97,118,101,99,104,105,110,97,115, -105,122,101,115,103,117,101,115,116,60,47,104,52,62,114,111,98,111,116,104,101, -97,118,121,116,114,117,101,44,115,101,118,101,110,103,114,97,110,100,99,114,105, -109,101,115,105,103,110,115,97,119,97,114,101,100,97,110,99,101,112,104,97,115, -101,62,60,33,45,45,101,110,95,85,83,38,35,51,57,59,50,48,48,112,120,95,110,97, -109,101,108,97,116,105,110,101,110,106,111,121,97,106,97,120,46,97,116,105,111, -110,115,109,105,116,104,85,46,83,46,32,104,111,108,100,115,112,101,116,101,114, -105,110,100,105,97,110,97,118,34,62,99,104,97,105,110,115,99,111,114,101,99,111, -109,101,115,100,111,105,110,103,112,114,105,111,114,83,104,97,114,101,49,57,57, -48,115,114,111,109,97,110,108,105,115,116,115,106,97,112,97,110,102,97,108,108, -115,116,114,105,97,108,111,119,110,101,114,97,103,114,101,101,60,47,104,50,62,97 -,98,117,115,101,97,108,101,114,116,111,112,101,114,97,34,45,47,47,87,99,97,114, -100,115,104,105,108,108,115,116,101,97,109,115,80,104,111,116,111,116,114,117, -116,104,99,108,101,97,110,46,112,104,112,63,115,97,105,110,116,109,101,116,97, -108,108,111,117,105,115,109,101,97,110,116,112,114,111,111,102,98,114,105,101, -102,114,111,119,34,62,103,101,110,114,101,116,114,117,99,107,108,111,111,107,115 -,86,97,108,117,101,70,114,97,109,101,46,110,101,116,47,45,45,62,10,60,116,114, -121,32,123,10,118,97,114,32,109,97,107,101,115,99,111,115,116,115,112,108,97,105 -,110,97,100,117,108,116,113,117,101,115,116,116,114,97,105,110,108,97,98,111,114 -,104,101,108,112,115,99,97,117,115,101,109,97,103,105,99,109,111,116,111,114,116 -,104,101,105,114,50,53,48,112,120,108,101,97,115,116,115,116,101,112,115,67,111, -117,110,116,99,111,117,108,100,103,108,97,115,115,115,105,100,101,115,102,117, -110,100,115,104,111,116,101,108,97,119,97,114,100,109,111,117,116,104,109,111, -118,101,115,112,97,114,105,115,103,105,118,101,115,100,117,116,99,104,116,101, -120,97,115,102,114,117,105,116,110,117,108,108,44,124,124,91,93,59,116,111,112, -34,62,10,60,33,45,45,80,79,83,84,34,111,99,101,97,110,60,98,114,47,62,102,108, -111,111,114,115,112,101,97,107,100,101,112,116,104,32,115,105,122,101,98,97,110, -107,115,99,97,116,99,104,99,104,97,114,116,50,48,112,120,59,97,108,105,103,110, -100,101,97,108,115,119,111,117,108,100,53,48,112,120,59,117,114,108,61,34,112,97 -,114,107,115,109,111,117,115,101,77,111,115,116,32,46,46,46,60,47,97,109,111,110 -,103,98,114,97,105,110,98,111,100,121,32,110,111,110,101,59,98,97,115,101,100,99 -,97,114,114,121,100,114,97,102,116,114,101,102,101,114,112,97,103,101,95,104,111 -,109,101,46,109,101,116,101,114,100,101,108,97,121,100,114,101,97,109,112,114, -111,118,101,106,111,105,110,116,60,47,116,114,62,100,114,117,103,115,60,33,45,45 -,32,97,112,114,105,108,105,100,101,97,108,97,108,108,101,110,101,120,97,99,116, -102,111,114,116,104,99,111,100,101,115,108,111,103,105,99,86,105,101,119,32,115, -101,101,109,115,98,108,97,110,107,112,111,114,116,115,32,40,50,48,48,115,97,118, -101,100,95,108,105,110,107,103,111,97,108,115,103,114,97,110,116,103,114,101,101 -,107,104,111,109,101,115,114,105,110,103,115,114,97,116,101,100,51,48,112,120,59 -,119,104,111,115,101,112,97,114,115,101,40,41,59,34,32,66,108,111,99,107,108,105 -,110,117,120,106,111,110,101,115,112,105,120,101,108,39,41,59,34,62,41,59,105, -102,40,45,108,101,102,116,100,97,118,105,100,104,111,114,115,101,70,111,99,117, -115,114,97,105,115,101,98,111,120,101,115,84,114,97,99,107,101,109,101,110,116, -60,47,101,109,62,98,97,114,34,62,46,115,114,99,61,116,111,119,101,114,97,108,116 -,61,34,99,97,98,108,101,104,101,110,114,121,50,52,112,120,59,115,101,116,117,112 -,105,116,97,108,121,115,104,97,114,112,109,105,110,111,114,116,97,115,116,101, -119,97,110,116,115,116,104,105,115,46,114,101,115,101,116,119,104,101,101,108, -103,105,114,108,115,47,99,115,115,47,49,48,48,37,59,99,108,117,98,115,115,116, -117,102,102,98,105,98,108,101,118,111,116,101,115,32,49,48,48,48,107,111,114,101 -,97,125,41,59,13,10,98,97,110,100,115,113,117,101,117,101,61,32,123,125,59,56,48 -,112,120,59,99,107,105,110,103,123,13,10,9,9,97,104,101,97,100,99,108,111,99,107 -,105,114,105,115,104,108,105,107,101,32,114,97,116,105,111,115,116,97,116,115,70 -,111,114,109,34,121,97,104,111,111,41,91,48,93,59,65,98,111,117,116,102,105,110, -100,115,60,47,104,49,62,100,101,98,117,103,116,97,115,107,115,85,82,76,32,61,99, -101,108,108,115,125,41,40,41,59,49,50,112,120,59,112,114,105,109,101,116,101,108 -,108,115,116,117,114,110,115,48,120,54,48,48,46,106,112,103,34,115,112,97,105, -110,98,101,97,99,104,116,97,120,101,115,109,105,99,114,111,97,110,103,101,108,45 -,45,62,60,47,103,105,102,116,115,115,116,101,118,101,45,108,105,110,107,98,111, -100,121,46,125,41,59,10,9,109,111,117,110,116,32,40,49,57,57,70,65,81,60,47,114, -111,103,101,114,102,114,97,110,107,67,108,97,115,115,50,56,112,120,59,102,101, -101,100,115,60,104,49,62,60,115,99,111,116,116,116,101,115,116,115,50,50,112,120 -,59,100,114,105,110,107,41,32,124,124,32,108,101,119,105,115,115,104,97,108,108, -35,48,51,57,59,32,102,111,114,32,108,111,118,101,100,119,97,115,116,101,48,48, -112,120,59,106,97,58,227,130,115,105,109,111,110,60,102,111,110,116,114,101,112, -108,121,109,101,101,116,115,117,110,116,101,114,99,104,101,97,112,116,105,103, -104,116,66,114,97,110,100,41,32,33,61,32,100,114,101,115,115,99,108,105,112,115, -114,111,111,109,115,111,110,107,101,121,109,111,98,105,108,109,97,105,110,46,78, -97,109,101,32,112,108,97,116,101,102,117,110,110,121,116,114,101,101,115,99,111, -109,47,34,49,46,106,112,103,119,109,111,100,101,112,97,114,97,109,83,84,65,82,84 -,108,101,102,116,32,105,100,100,101,110,44,32,50,48,49,41,59,10,125,10,102,111, -114,109,46,118,105,114,117,115,99,104,97,105,114,116,114,97,110,115,119,111,114, -115,116,80,97,103,101,115,105,116,105,111,110,112,97,116,99,104,60,33,45,45,10, -111,45,99,97,99,102,105,114,109,115,116,111,117,114,115,44,48,48,48,32,97,115, -105,97,110,105,43,43,41,123,97,100,111,98,101,39,41,91,48,93,105,100,61,49,48,98 -,111,116,104,59,109,101,110,117,32,46,50,46,109,105,46,112,110,103,34,107,101, -118,105,110,99,111,97,99,104,67,104,105,108,100,98,114,117,99,101,50,46,106,112, -103,85,82,76,41,43,46,106,112,103,124,115,117,105,116,101,115,108,105,99,101,104 -,97,114,114,121,49,50,48,34,32,115,119,101,101,116,116,114,62,13,10,110,97,109, -101,61,100,105,101,103,111,112,97,103,101,32,115,119,105,115,115,45,45,62,10,10, -35,102,102,102,59,34,62,76,111,103,46,99,111,109,34,116,114,101,97,116,115,104, -101,101,116,41,32,38,38,32,49,52,112,120,59,115,108,101,101,112,110,116,101,110, -116,102,105,108,101,100,106,97,58,227,131,105,100,61,34,99,78,97,109,101,34,119, -111,114,115,101,115,104,111,116,115,45,98,111,120,45,100,101,108,116,97,10,38, -108,116,59,98,101,97,114,115,58,52,56,90,60,100,97,116,97,45,114,117,114,97,108, -60,47,97,62,32,115,112,101,110,100,98,97,107,101,114,115,104,111,112,115,61,32, -34,34,59,112,104,112,34,62,99,116,105,111,110,49,51,112,120,59,98,114,105,97,110 -,104,101,108,108,111,115,105,122,101,61,111,61,37,50,70,32,106,111,105,110,109, -97,121,98,101,60,105,109,103,32,105,109,103,34,62,44,32,102,106,115,105,109,103, -34,32,34,41,91,48,93,77,84,111,112,66,84,121,112,101,34,110,101,119,108,121,68, -97,110,115,107,99,122,101,99,104,116,114,97,105,108,107,110,111,119,115,60,47, -104,53,62,102,97,113,34,62,122,104,45,99,110,49,48,41,59,10,45,49,34,41,59,116, -121,112,101,61,98,108,117,101,115,116,114,117,108,121,100,97,118,105,115,46,106, -115,39,59,62,13,10,60,33,115,116,101,101,108,32,121,111,117,32,104,50,62,13,10, -102,111,114,109,32,106,101,115,117,115,49,48,48,37,32,109,101,110,117,46,13,10,9 -,13,10,119,97,108,101,115,114,105,115,107,115,117,109,101,110,116,100,100,105, -110,103,98,45,108,105,107,116,101,97,99,104,103,105,102,34,32,118,101,103,97,115 -,100,97,110,115,107,101,101,115,116,105,115,104,113,105,112,115,117,111,109,105, -115,111,98,114,101,100,101,115,100,101,101,110,116,114,101,116,111,100,111,115, -112,117,101,100,101,97,195,177,111,115,101,115,116,195,161,116,105,101,110,101, -104,97,115,116,97,111,116,114,111,115,112,97,114,116,101,100,111,110,100,101,110 -,117,101,118,111,104,97,99,101,114,102,111,114,109,97,109,105,115,109,111,109, -101,106,111,114,109,117,110,100,111,97,113,117,195,173,100,195,173,97,115,115, -195,179,108,111,97,121,117,100,97,102,101,99,104,97,116,111,100,97,115,116,97, -110,116,111,109,101,110,111,115,100,97,116,111,115,111,116,114,97,115,115,105, -116,105,111,109,117,99,104,111,97,104,111,114,97,108,117,103,97,114,109,97,121, -111,114,101,115,116,111,115,104,111,114,97,115,116,101,110,101,114,97,110,116, -101,115,102,111,116,111,115,101,115,116,97,115,112,97,195,173,115,110,117,101, -118,97,115,97,108,117,100,102,111,114,111,115,109,101,100,105,111,113,117,105, -101,110,109,101,115,101,115,112,111,100,101,114,99,104,105,108,101,115,101,114, -195,161,118,101,99,101,115,100,101,99,105,114,106,111,115,195,169,101,115,116,97 -,114,118,101,110,116,97,103,114,117,112,111,104,101,99,104,111,101,108,108,111, -115,116,101,110,103,111,97,109,105,103,111,99,111,115,97,115,110,105,118,101,108 -,103,101,110,116,101,109,105,115,109,97,97,105,114,101,115,106,117,108,105,111, -116,101,109,97,115,104,97,99,105,97,102,97,118,111,114,106,117,110,105,111,108, -105,98,114,101,112,117,110,116,111,98,117,101,110,111,97,117,116,111,114,97,98, -114,105,108,98,117,101,110,97,116,101,120,116,111,109,97,114,122,111,115,97,98, -101,114,108,105,115,116,97,108,117,101,103,111,99,195,179,109,111,101,110,101, -114,111,106,117,101,103,111,112,101,114,195,186,104,97,98,101,114,101,115,116, -111,121,110,117,110,99,97,109,117,106,101,114,118,97,108,111,114,102,117,101,114 -,97,108,105,98,114,111,103,117,115,116,97,105,103,117,97,108,118,111,116,111,115 -,99,97,115,111,115,103,117,195,173,97,112,117,101,100,111,115,111,109,111,115,97 -,118,105,115,111,117,115,116,101,100,100,101,98,101,110,110,111,99,104,101,98, -117,115,99,97,102,97,108,116,97,101,117,114,111,115,115,101,114,105,101,100,105, -99,104,111,99,117,114,115,111,99,108,97,118,101,99,97,115,97,115,108,101,195,179 -,110,112,108,97,122,111,108,97,114,103,111,111,98,114,97,115,118,105,115,116,97, -97,112,111,121,111,106,117,110,116,111,116,114,97,116,97,118,105,115,116,111,99, -114,101,97,114,99,97,109,112,111,104,101,109,111,115,99,105,110,99,111,99,97,114 -,103,111,112,105,115,111,115,111,114,100,101,110,104,97,99,101,110,195,161,114, -101,97,100,105,115,99,111,112,101,100,114,111,99,101,114,99,97,112,117,101,100, -97,112,97,112,101,108,109,101,110,111,114,195,186,116,105,108,99,108,97,114,111, -106,111,114,103,101,99,97,108,108,101,112,111,110,101,114,116,97,114,100,101,110 -,97,100,105,101,109,97,114,99,97,115,105,103,117,101,101,108,108,97,115,115,105, -103,108,111,99,111,99,104,101,109,111,116,111,115,109,97,100,114,101,99,108,97, -115,101,114,101,115,116,111,110,105,195,177,111,113,117,101,100,97,112,97,115,97 -,114,98,97,110,99,111,104,105,106,111,115,118,105,97,106,101,112,97,98,108,111, -195,169,115,116,101,118,105,101,110,101,114,101,105,110,111,100,101,106,97,114, -102,111,110,100,111,99,97,110,97,108,110,111,114,116,101,108,101,116,114,97,99, -97,117,115,97,116,111,109,97,114,109,97,110,111,115,108,117,110,101,115,97,117, -116,111,115,118,105,108,108,97,118,101,110,100,111,112,101,115,97,114,116,105, -112,111,115,116,101,110,103,97,109,97,114,99,111,108,108,101,118,97,112,97,100, -114,101,117,110,105,100,111,118,97,109,111,115,122,111,110,97,115,97,109,98,111, -115,98,97,110,100,97,109,97,114,105,97,97,98,117,115,111,109,117,99,104,97,115, -117,98,105,114,114,105,111,106,97,118,105,118,105,114,103,114,97,100,111,99,104, -105,99,97,97,108,108,195,173,106,111,118,101,110,100,105,99,104,97,101,115,116, -97,110,116,97,108,101,115,115,97,108,105,114,115,117,101,108,111,112,101,115,111 -,115,102,105,110,101,115,108,108,97,109,97,98,117,115,99,111,195,169,115,116,97, -108,108,101,103,97,110,101,103,114,111,112,108,97,122,97,104,117,109,111,114,112 -,97,103,97,114,106,117,110,116,97,100,111,98,108,101,105,115,108,97,115,98,111, -108,115,97,98,97,195,177,111,104,97,98,108,97,108,117,99,104,97,195,129,114,101, -97,100,105,99,101,110,106,117,103,97,114,110,111,116,97,115,118,97,108,108,101, -97,108,108,195,161,99,97,114,103,97,100,111,108,111,114,97,98,97,106,111,101,115 -,116,195,169,103,117,115,116,111,109,101,110,116,101,109,97,114,105,111,102,105, -114,109,97,99,111,115,116,111,102,105,99,104,97,112,108,97,116,97,104,111,103,97 -,114,97,114,116,101,115,108,101,121,101,115,97,113,117,101,108,109,117,115,101, -111,98,97,115,101,115,112,111,99,111,115,109,105,116,97,100,99,105,101,108,111, -99,104,105,99,111,109,105,101,100,111,103,97,110,97,114,115,97,110,116,111,101, -116,97,112,97,100,101,98,101,115,112,108,97,121,97,114,101,100,101,115,115,105, -101,116,101,99,111,114,116,101,99,111,114,101,97,100,117,100,97,115,100,101,115, -101,111,118,105,101,106,111,100,101,115,101,97,97,103,117,97,115,38,113,117,111, -116,59,100,111,109,97,105,110,99,111,109,109,111,110,115,116,97,116,117,115,101, -118,101,110,116,115,109,97,115,116,101,114,115,121,115,116,101,109,97,99,116,105 -,111,110,98,97,110,110,101,114,114,101,109,111,118,101,115,99,114,111,108,108, -117,112,100,97,116,101,103,108,111,98,97,108,109,101,100,105,117,109,102,105,108 -,116,101,114,110,117,109,98,101,114,99,104,97,110,103,101,114,101,115,117,108, -116,112,117,98,108,105,99,115,99,114,101,101,110,99,104,111,111,115,101,110,111, -114,109,97,108,116,114,97,118,101,108,105,115,115,117,101,115,115,111,117,114,99 -,101,116,97,114,103,101,116,115,112,114,105,110,103,109,111,100,117,108,101,109, -111,98,105,108,101,115,119,105,116,99,104,112,104,111,116,111,115,98,111,114,100 -,101,114,114,101,103,105,111,110,105,116,115,101,108,102,115,111,99,105,97,108, -97,99,116,105,118,101,99,111,108,117,109,110,114,101,99,111,114,100,102,111,108, -108,111,119,116,105,116,108,101,62,101,105,116,104,101,114,108,101,110,103,116, -104,102,97,109,105,108,121,102,114,105,101,110,100,108,97,121,111,117,116,97,117 -,116,104,111,114,99,114,101,97,116,101,114,101,118,105,101,119,115,117,109,109, -101,114,115,101,114,118,101,114,112,108,97,121,101,100,112,108,97,121,101,114, -101,120,112,97,110,100,112,111,108,105,99,121,102,111,114,109,97,116,100,111,117 -,98,108,101,112,111,105,110,116,115,115,101,114,105,101,115,112,101,114,115,111, -110,108,105,118,105,110,103,100,101,115,105,103,110,109,111,110,116,104,115,102, -111,114,99,101,115,117,110,105,113,117,101,119,101,105,103,104,116,112,101,111, -112,108,101,101,110,101,114,103,121,110,97,116,117,114,101,115,101,97,114,99,104 -,102,105,103,117,114,101,104,97,118,105,110,103,99,117,115,116,111,109,111,102, -102,115,101,116,108,101,116,116,101,114,119,105,110,100,111,119,115,117,98,109, -105,116,114,101,110,100,101,114,103,114,111,117,112,115,117,112,108,111,97,100, -104,101,97,108,116,104,109,101,116,104,111,100,118,105,100,101,111,115,115,99, -104,111,111,108,102,117,116,117,114,101,115,104,97,100,111,119,100,101,98,97,116 -,101,118,97,108,117,101,115,79,98,106,101,99,116,111,116,104,101,114,115,114,105 -,103,104,116,115,108,101,97,103,117,101,99,104,114,111,109,101,115,105,109,112, -108,101,110,111,116,105,99,101,115,104,97,114,101,100,101,110,100,105,110,103, -115,101,97,115,111,110,114,101,112,111,114,116,111,110,108,105,110,101,115,113, -117,97,114,101,98,117,116,116,111,110,105,109,97,103,101,115,101,110,97,98,108, -101,109,111,118,105,110,103,108,97,116,101,115,116,119,105,110,116,101,114,70, -114,97,110,99,101,112,101,114,105,111,100,115,116,114,111,110,103,114,101,112, -101,97,116,76,111,110,100,111,110,100,101,116,97,105,108,102,111,114,109,101,100 -,100,101,109,97,110,100,115,101,99,117,114,101,112,97,115,115,101,100,116,111, -103,103,108,101,112,108,97,99,101,115,100,101,118,105,99,101,115,116,97,116,105, -99,99,105,116,105,101,115,115,116,114,101,97,109,121,101,108,108,111,119,97,116, -116,97,99,107,115,116,114,101,101,116,102,108,105,103,104,116,104,105,100,100, -101,110,105,110,102,111,34,62,111,112,101,110,101,100,117,115,101,102,117,108, -118,97,108,108,101,121,99,97,117,115,101,115,108,101,97,100,101,114,115,101,99, -114,101,116,115,101,99,111,110,100,100,97,109,97,103,101,115,112,111,114,116,115 -,101,120,99,101,112,116,114,97,116,105,110,103,115,105,103,110,101,100,116,104, -105,110,103,115,101,102,102,101,99,116,102,105,101,108,100,115,115,116,97,116, -101,115,111,102,102,105,99,101,118,105,115,117,97,108,101,100,105,116,111,114, -118,111,108,117,109,101,82,101,112,111,114,116,109,117,115,101,117,109,109,111, -118,105,101,115,112,97,114,101,110,116,97,99,99,101,115,115,109,111,115,116,108, -121,109,111,116,104,101,114,34,32,105,100,61,34,109,97,114,107,101,116,103,114, -111,117,110,100,99,104,97,110,99,101,115,117,114,118,101,121,98,101,102,111,114, -101,115,121,109,98,111,108,109,111,109,101,110,116,115,112,101,101,99,104,109, -111,116,105,111,110,105,110,115,105,100,101,109,97,116,116,101,114,67,101,110, -116,101,114,111,98,106,101,99,116,101,120,105,115,116,115,109,105,100,100,108, -101,69,117,114,111,112,101,103,114,111,119,116,104,108,101,103,97,99,121,109,97, -110,110,101,114,101,110,111,117,103,104,99,97,114,101,101,114,97,110,115,119,101 -,114,111,114,105,103,105,110,112,111,114,116,97,108,99,108,105,101,110,116,115, -101,108,101,99,116,114,97,110,100,111,109,99,108,111,115,101,100,116,111,112,105 -,99,115,99,111,109,105,110,103,102,97,116,104,101,114,111,112,116,105,111,110, -115,105,109,112,108,121,114,97,105,115,101,100,101,115,99,97,112,101,99,104,111, -115,101,110,99,104,117,114,99,104,100,101,102,105,110,101,114,101,97,115,111,110 -,99,111,114,110,101,114,111,117,116,112,117,116,109,101,109,111,114,121,105,102, -114,97,109,101,112,111,108,105,99,101,109,111,100,101,108,115,78,117,109,98,101, -114,100,117,114,105,110,103,111,102,102,101,114,115,115,116,121,108,101,115,107, -105,108,108,101,100,108,105,115,116,101,100,99,97,108,108,101,100,115,105,108, -118,101,114,109,97,114,103,105,110,100,101,108,101,116,101,98,101,116,116,101, -114,98,114,111,119,115,101,108,105,109,105,116,115,71,108,111,98,97,108,115,105, -110,103,108,101,119,105,100,103,101,116,99,101,110,116,101,114,98,117,100,103, -101,116,110,111,119,114,97,112,99,114,101,100,105,116,99,108,97,105,109,115,101, -110,103,105,110,101,115,97,102,101,116,121,99,104,111,105,99,101,115,112,105,114 -,105,116,45,115,116,121,108,101,115,112,114,101,97,100,109,97,107,105,110,103, -110,101,101,100,101,100,114,117,115,115,105,97,112,108,101,97,115,101,101,120, -116,101,110,116,83,99,114,105,112,116,98,114,111,107,101,110,97,108,108,111,119, -115,99,104,97,114,103,101,100,105,118,105,100,101,102,97,99,116,111,114,109,101, -109,98,101,114,45,98,97,115,101,100,116,104,101,111,114,121,99,111,110,102,105, -103,97,114,111,117,110,100,119,111,114,107,101,100,104,101,108,112,101,100,67, -104,117,114,99,104,105,109,112,97,99,116,115,104,111,117,108,100,97,108,119,97, -121,115,108,111,103,111,34,32,98,111,116,116,111,109,108,105,115,116,34,62,41, -123,118,97,114,32,112,114,101,102,105,120,111,114,97,110,103,101,72,101,97,100, -101,114,46,112,117,115,104,40,99,111,117,112,108,101,103,97,114,100,101,110,98, -114,105,100,103,101,108,97,117,110,99,104,82,101,118,105,101,119,116,97,107,105, -110,103,118,105,115,105,111,110,108,105,116,116,108,101,100,97,116,105,110,103, -66,117,116,116,111,110,98,101,97,117,116,121,116,104,101,109,101,115,102,111,114 -,103,111,116,83,101,97,114,99,104,97,110,99,104,111,114,97,108,109,111,115,116, -108,111,97,100,101,100,67,104,97,110,103,101,114,101,116,117,114,110,115,116,114 -,105,110,103,114,101,108,111,97,100,77,111,98,105,108,101,105,110,99,111,109,101 -,115,117,112,112,108,121,83,111,117,114,99,101,111,114,100,101,114,115,118,105, -101,119,101,100,38,110,98,115,112,59,99,111,117,114,115,101,65,98,111,117,116,32 -,105,115,108,97,110,100,60,104,116,109,108,32,99,111,111,107,105,101,110,97,109, -101,61,34,97,109,97,122,111,110,109,111,100,101,114,110,97,100,118,105,99,101, -105,110,60,47,97,62,58,32,84,104,101,32,100,105,97,108,111,103,104,111,117,115, -101,115,66,69,71,73,78,32,77,101,120,105,99,111,115,116,97,114,116,115,99,101, -110,116,114,101,104,101,105,103,104,116,97,100,100,105,110,103,73,115,108,97,110 -,100,97,115,115,101,116,115,69,109,112,105,114,101,83,99,104,111,111,108,101,102 -,102,111,114,116,100,105,114,101,99,116,110,101,97,114,108,121,109,97,110,117,97 -,108,83,101,108,101,99,116,46,10,10,79,110,101,106,111,105,110,101,100,109,101, -110,117,34,62,80,104,105,108,105,112,97,119,97,114,100,115,104,97,110,100,108, -101,105,109,112,111,114,116,79,102,102,105,99,101,114,101,103,97,114,100,115,107 -,105,108,108,115,110,97,116,105,111,110,83,112,111,114,116,115,100,101,103,114, -101,101,119,101,101,107,108,121,32,40,101,46,103,46,98,101,104,105,110,100,100, -111,99,116,111,114,108,111,103,103,101,100,117,110,105,116,101,100,60,47,98,62, -60,47,98,101,103,105,110,115,112,108,97,110,116,115,97,115,115,105,115,116,97, -114,116,105,115,116,105,115,115,117,101,100,51,48,48,112,120,124,99,97,110,97, -100,97,97,103,101,110,99,121,115,99,104,101,109,101,114,101,109,97,105,110,66, -114,97,122,105,108,115,97,109,112,108,101,108,111,103,111,34,62,98,101,121,111, -110,100,45,115,99,97,108,101,97,99,99,101,112,116,115,101,114,118,101,100,109,97 -,114,105,110,101,70,111,111,116,101,114,99,97,109,101,114,97,60,47,104,49,62,10, -95,102,111,114,109,34,108,101,97,118,101,115,115,116,114,101,115,115,34,32,47,62 -,13,10,46,103,105,102,34,32,111,110,108,111,97,100,108,111,97,100,101,114,79,120 -,102,111,114,100,115,105,115,116,101,114,115,117,114,118,105,118,108,105,115,116 -,101,110,102,101,109,97,108,101,68,101,115,105,103,110,115,105,122,101,61,34,97, -112,112,101,97,108,116,101,120,116,34,62,108,101,118,101,108,115,116,104,97,110, -107,115,104,105,103,104,101,114,102,111,114,99,101,100,97,110,105,109,97,108,97, -110,121,111,110,101,65,102,114,105,99,97,97,103,114,101,101,100,114,101,99,101, -110,116,80,101,111,112,108,101,60,98,114,32,47,62,119,111,110,100,101,114,112, -114,105,99,101,115,116,117,114,110,101,100,124,124,32,123,125,59,109,97,105,110, -34,62,105,110,108,105,110,101,115,117,110,100,97,121,119,114,97,112,34,62,102,97 -,105,108,101,100,99,101,110,115,117,115,109,105,110,117,116,101,98,101,97,99,111 -,110,113,117,111,116,101,115,49,53,48,112,120,124,101,115,116,97,116,101,114,101 -,109,111,116,101,101,109,97,105,108,34,108,105,110,107,101,100,114,105,103,104, -116,59,115,105,103,110,97,108,102,111,114,109,97,108,49,46,104,116,109,108,115, -105,103,110,117,112,112,114,105,110,99,101,102,108,111,97,116,58,46,112,110,103, -34,32,102,111,114,117,109,46,65,99,99,101,115,115,112,97,112,101,114,115,115,111 -,117,110,100,115,101,120,116,101,110,100,72,101,105,103,104,116,115,108,105,100, -101,114,85,84,70,45,56,34,38,97,109,112,59,32,66,101,102,111,114,101,46,32,87, -105,116,104,115,116,117,100,105,111,111,119,110,101,114,115,109,97,110,97,103, -101,112,114,111,102,105,116,106,81,117,101,114,121,97,110,110,117,97,108,112,97, -114,97,109,115,98,111,117,103,104,116,102,97,109,111,117,115,103,111,111,103,108 -,101,108,111,110,103,101,114,105,43,43,41,32,123,105,115,114,97,101,108,115,97, -121,105,110,103,100,101,99,105,100,101,104,111,109,101,34,62,104,101,97,100,101, -114,101,110,115,117,114,101,98,114,97,110,99,104,112,105,101,99,101,115,98,108, -111,99,107,59,115,116,97,116,101,100,116,111,112,34,62,60,114,97,99,105,110,103, -114,101,115,105,122,101,45,45,38,103,116,59,112,97,99,105,116,121,115,101,120, -117,97,108,98,117,114,101,97,117,46,106,112,103,34,32,49,48,44,48,48,48,111,98, -116,97,105,110,116,105,116,108,101,115,97,109,111,117,110,116,44,32,73,110,99,46 -,99,111,109,101,100,121,109,101,110,117,34,32,108,121,114,105,99,115,116,111,100 -,97,121,46,105,110,100,101,101,100,99,111,117,110,116,121,95,108,111,103,111,46, -70,97,109,105,108,121,108,111,111,107,101,100,77,97,114,107,101,116,108,115,101, -32,105,102,80,108,97,121,101,114,116,117,114,107,101,121,41,59,118,97,114,32,102 -,111,114,101,115,116,103,105,118,105,110,103,101,114,114,111,114,115,68,111,109, -97,105,110,125,101,108,115,101,123,105,110,115,101,114,116,66,108,111,103,60,47, -102,111,111,116,101,114,108,111,103,105,110,46,102,97,115,116,101,114,97,103,101 -,110,116,115,60,98,111,100,121,32,49,48,112,120,32,48,112,114,97,103,109,97,102, -114,105,100,97,121,106,117,110,105,111,114,100,111,108,108,97,114,112,108,97,99, -101,100,99,111,118,101,114,115,112,108,117,103,105,110,53,44,48,48,48,32,112,97, -103,101,34,62,98,111,115,116,111,110,46,116,101,115,116,40,97,118,97,116,97,114, -116,101,115,116,101,100,95,99,111,117,110,116,102,111,114,117,109,115,115,99,104 -,101,109,97,105,110,100,101,120,44,102,105,108,108,101,100,115,104,97,114,101, -115,114,101,97,100,101,114,97,108,101,114,116,40,97,112,112,101,97,114,83,117,98 -,109,105,116,108,105,110,101,34,62,98,111,100,121,34,62,10,42,32,84,104,101,84, -104,111,117,103,104,115,101,101,105,110,103,106,101,114,115,101,121,78,101,119, -115,60,47,118,101,114,105,102,121,101,120,112,101,114,116,105,110,106,117,114, -121,119,105,100,116,104,61,67,111,111,107,105,101,83,84,65,82,84,32,97,99,114, -111,115,115,95,105,109,97,103,101,116,104,114,101,97,100,110,97,116,105,118,101, -112,111,99,107,101,116,98,111,120,34,62,10,83,121,115,116,101,109,32,68,97,118, -105,100,99,97,110,99,101,114,116,97,98,108,101,115,112,114,111,118,101,100,65, -112,114,105,108,32,114,101,97,108,108,121,100,114,105,118,101,114,105,116,101, -109,34,62,109,111,114,101,34,62,98,111,97,114,100,115,99,111,108,111,114,115,99, -97,109,112,117,115,102,105,114,115,116,32,124,124,32,91,93,59,109,101,100,105,97 -,46,103,117,105,116,97,114,102,105,110,105,115,104,119,105,100,116,104,58,115, -104,111,119,101,100,79,116,104,101,114,32,46,112,104,112,34,32,97,115,115,117, -109,101,108,97,121,101,114,115,119,105,108,115,111,110,115,116,111,114,101,115, -114,101,108,105,101,102,115,119,101,100,101,110,67,117,115,116,111,109,101,97, -115,105,108,121,32,121,111,117,114,32,83,116,114,105,110,103,10,10,87,104,105, -108,116,97,121,108,111,114,99,108,101,97,114,58,114,101,115,111,114,116,102,114, -101,110,99,104,116,104,111,117,103,104,34,41,32,43,32,34,60,98,111,100,121,62,98 -,117,121,105,110,103,98,114,97,110,100,115,77,101,109,98,101,114,110,97,109,101, -34,62,111,112,112,105,110,103,115,101,99,116,111,114,53,112,120,59,34,62,118,115 -,112,97,99,101,112,111,115,116,101,114,109,97,106,111,114,32,99,111,102,102,101, -101,109,97,114,116,105,110,109,97,116,117,114,101,104,97,112,112,101,110,60,47, -110,97,118,62,107,97,110,115,97,115,108,105,110,107,34,62,73,109,97,103,101,115, -61,102,97,108,115,101,119,104,105,108,101,32,104,115,112,97,99,101,48,38,97,109, -112,59,32,10,10,73,110,32,32,112,111,119,101,114,80,111,108,115,107,105,45,99, -111,108,111,114,106,111,114,100,97,110,66,111,116,116,111,109,83,116,97,114,116, -32,45,99,111,117,110,116,50,46,104,116,109,108,110,101,119,115,34,62,48,49,46, -106,112,103,79,110,108,105,110,101,45,114,105,103,104,116,109,105,108,108,101, -114,115,101,110,105,111,114,73,83,66,78,32,48,48,44,48,48,48,32,103,117,105,100, -101,115,118,97,108,117,101,41,101,99,116,105,111,110,114,101,112,97,105,114,46, -120,109,108,34,32,32,114,105,103,104,116,115,46,104,116,109,108,45,98,108,111,99 -,107,114,101,103,69,120,112,58,104,111,118,101,114,119,105,116,104,105,110,118, -105,114,103,105,110,112,104,111,110,101,115,60,47,116,114,62,13,117,115,105,110, -103,32,10,9,118,97,114,32,62,39,41,59,10,9,60,47,116,100,62,10,60,47,116,114,62, -10,98,97,104,97,115,97,98,114,97,115,105,108,103,97,108,101,103,111,109,97,103, -121,97,114,112,111,108,115,107,105,115,114,112,115,107,105,216,177,216,175,217, -136,228,184,173,230,150,135,231,174,128,228,189,147,231,185,129,233,171,148,228, -191,161,230,129,175,228,184,173,229,155,189,230,136,145,228,187,172,228,184,128, -228,184,170,229,133,172,229,143,184,231,174,161,231,144,134,232,174,186,229,157, -155,229,143,175,228,187,165,230,156,141,229,138,161,230,151,182,233,151,180,228, -184,170,228,186,186,228,186,167,229,147,129,232,135,170,229,183,177,228,188,129, -228,184,154,230,159,165,231,156,139,229,183,165,228,189,156,232,129,148,231,179, -187,230,178,161,230,156,137,231,189,145,231,171,153,230,137,128,230,156,137,232, -175,132,232,174,186,228,184,173,229,191,131,230,150,135,231,171,160,231,148,168, -230,136,183,233,166,150,233,161,181,228,189,156,232,128,133,230,138,128,230,156, -175,233,151,174,233,162,152,231,155,184,229,133,179,228,184,139,232,189,189,230, -144,156,231,180,162,228,189,191,231,148,168,232,189,175,228,187,182,229,156,168, -231,186,191,228,184,187,233,162,152,232,181,132,230,150,153,232,167,134,233,162, -145,229,155,158,229,164,141,230,179,168,229,134,140,231,189,145,231,187,156,230, -148,182,232,151,143,229,134,133,229,174,185,230,142,168,232,141,144,229,184,130, -229,156,186,230,182,136,230,129,175,231,169,186,233,151,180,229,143,145,229,184, -131,228,187,128,228,185,136,229,165,189,229,143,139,231,148,159,230,180,187,229, -155,190,231,137,135,229,143,145,229,177,149,229,166,130,230,158,156,230,137,139, -230,156,186,230,150,176,233,151,187,230,156,128,230,150,176,230,150,185,229,188, -143,229,140,151,228,186,172,230,143,144,228,190,155,229,133,179,228,186,142,230, -155,180,229,164,154,232,191,153,228,184,170,231,179,187,231,187,159,231,159,165, -233,129,147,230,184,184,230,136,143,229,185,191,229,145,138,229,133,182,228,187, -150,229,143,145,232,161,168,229,174,137,229,133,168,231,172,172,228,184,128,228, -188,154,229,145,152,232,191,155,232,161,140,231,130,185,229,135,187,231,137,136, -230,157,131,231,148,181,229,173,144,228,184,150,231,149,140,232,174,190,232,174, -161,229,133,141,232,180,185,230,149,153,232,130,178,229,138,160,229,133,165,230, -180,187,229,138,168,228,187,150,228,187,172,229,149,134,229,147,129,229,141,154, -229,174,162,231,142,176,229,156,168,228,184,138,230,181,183,229,166,130,228,189, -149,229,183,178,231,187,143,231,149,153,232,168,128,232,175,166,231,187,134,231, -164,190,229,140,186,231,153,187,229,189,149,230,156,172,231,171,153,233,156,128, -232,166,129,228,187,183,230,160,188,230,148,175,230,140,129,229,155,189,233,153, -133,233,147,190,230,142,165,229,155,189,229,174,182,229,187,186,232,174,190,230, -156,139,229,143,139,233,152,133,232,175,187,230,179,149,229,190,139,228,189,141, -231,189,174,231,187,143,230,181,142,233,128,137,230,139,169,232,191,153,230,160, -183,229,189,147,229,137,141,229,136,134,231,177,187,230,142,146,232,161,140,229, -155,160,228,184,186,228,186,164,230,152,147,230,156,128,229,144,142,233,159,179, -228,185,144,228,184,141,232,131,189,233,128,154,232,191,135,232,161,140,228,184, -154,231,167,145,230,138,128,229,143,175,232,131,189,232,174,190,229,164,135,229, -144,136,228,189,156,229,164,167,229,174,182,231,164,190,228,188,154,231,160,148, -231,169,182,228,184,147,228,184,154,229,133,168,233,131,168,233,161,185,231,155, -174,232,191,153,233,135,140,232,191,152,230,152,175,229,188,128,229,167,139,230, -131,133,229,134,181,231,148,181,232,132,145,230,150,135,228,187,182,229,147,129, -231,137,140,229,184,174,229,138,169,230,150,135,229,140,150,232,181,132,230,186, -144,229,164,167,229,173,166,229,173,166,228,185,160,229,156,176,229,157,128,230, -181,143,232,167,136,230,138,149,232,181,132,229,183,165,231,168,139,232,166,129, -230,177,130,230,128,142,228,185,136,230,151,182,229,128,153,229,138,159,232,131, -189,228,184,187,232,166,129,231,155,174,229,137,141,232,181,132,232,174,175,229, -159,142,229,184,130,230,150,185,230,179,149,231,148,181,229,189,177,230,139,155, -232,129,152,229,163,176,230,152,142,228,187,187,228,189,149,229,129,165,229,186, -183,230,149,176,230,141,174,231,190,142,229,155,189,230,177,189,232,189,166,228, -187,139,231,187,141,228,189,134,230,152,175,228,186,164,230,181,129,231,148,159, -228,186,167,230,137,128,228,187,165,231,148,181,232,175,157,230,152,190,231,164, -186,228,184,128,228,186,155,229,141,149,228,189,141,228,186,186,229,145,152,229, -136,134,230,158,144,229,156,176,229,155,190,230,151,133,230,184,184,229,183,165, -229,133,183,229,173,166,231,148,159,231,179,187,229,136,151,231,189,145,229,143, -139,229,184,150,229,173,144,229,175,134,231,160,129,233,162,145,233,129,147,230, -142,167,229,136,182,229,156,176,229,140,186,229,159,186,230,156,172,229,133,168, -229,155,189,231,189,145,228,184,138,233,135,141,232,166,129,231,172,172,228,186, -140,229,150,156,230,172,162,232,191,155,229,133,165,229,143,139,230,131,133,232, -191,153,228,186,155,232,128,131,232,175,149,229,143,145,231,142,176,229,159,185, -232,174,173,228,187,165,228,184,138,230,148,191,229,186,156,230,136,144,228,184, -186,231,142,175,229,162,131,233,166,153,230,184,175,229,144,140,230,151,182,229, -168,177,228,185,144,229,143,145,233,128,129,228,184,128,229,174,154,229,188,128, -229,143,145,228,189,156,229,147,129,230,160,135,229,135,134,230,172,162,232,191, -142,232,167,163,229,134,179,229,156,176,230,150,185,228,184,128,228,184,139,228, -187,165,229,143,138,232,180,163,228,187,187,230,136,150,232,128,133,229,174,162, -230,136,183,228,187,163,232,161,168,231,167,175,229,136,134,229,165,179,228,186, -186,230,149,176,231,160,129,233,148,128,229,148,174,229,135,186,231,142,176,231, -166,187,231,186,191,229,186,148,231,148,168,229,136,151,232,161,168,228,184,141, -229,144,140,231,188,150,232,190,145,231,187,159,232,174,161,230,159,165,232,175, -162,228,184,141,232,166,129,230,156,137,229,133,179,230,156,186,230,158,132,229, -190,136,229,164,154,230,146,173,230,148,190,231,187,132,231,187,135,230,148,191, -231,173,150,231,155,180,230,142,165,232,131,189,229,138,155,230,157,165,230,186, -144,230,153,130,233,150,147,231,156,139,229,136,176,231,131,173,233,151,168,229, -133,179,233,148,174,228,184,147,229,140,186,233,157,158,229,184,184,232,139,177, -232,175,173,231,153,190,229,186,166,229,184,140,230,156,155,231,190,142,229,165, -179,230,175,148,232,190,131,231,159,165,232,175,134,232,167,132,229,174,154,229, -187,186,232,174,174,233,131,168,233,151,168,230,132,143,232,167,129,231,178,190, -229,189,169,230,151,165,230,156,172,230,143,144,233,171,152,229,143,145,232,168, -128,230,150,185,233,157,162,229,159,186,233,135,145,229,164,132,231,144,134,230, -157,131,233,153,144,229,189,177,231,137,135,233,147,182,232,161,140,232,191,152, -230,156,137,229,136,134,228,186,171,231,137,169,229,147,129,231,187,143,232,144, -165,230,183,187,229,138,160,228,184,147,229,174,182,232,191,153,231,167,141,232, -175,157,233,162,152,232,181,183,230,157,165,228,184,154,229,138,161,229,133,172, -229,145,138,232,174,176,229,189,149,231,174,128,228,187,139,232,180,168,233,135, -143,231,148,183,228,186,186,229,189,177,229,147,141,229,188,149,231,148,168,230, -138,165,229,145,138,233,131,168,229,136,134,229,191,171,233,128,159,229,146,168, -232,175,162,230,151,182,229,176,154,230,179,168,230,132,143,231,148,179,232,175, -183,229,173,166,230,160,161,229,186,148,232,175,165,229,142,134,229,143,178,229, -143,170,230,152,175,232,191,148,229,155,158,232,180,173,228,185,176,229,144,141, -231,167,176,228,184,186,228,186,134,230,136,144,229,138,159,232,175,180,230,152, -142,228,190,155,229,186,148,229,173,169,229,173,144,228,184,147,233,162,152,231, -168,139,229,186,143,228,184,128,232,136,172,230,156,131,229,147,161,229,143,170, -230,156,137,229,133,182,229,174,131,228,191,157,230,138,164,232,128,140,228,184, -148,228,187,138,229,164,169,231,170,151,229,143,163,229,138,168,230,128,129,231, -138,182,230,128,129,231,137,185,229,136,171,232,174,164,228,184,186,229,191,133, -233,161,187,230,155,180,230,150,176,229,176,143,232,175,180,230,136,145,229,128, -145,228,189,156,228,184,186,229,170,146,228,189,147,229,140,133,230,139,172,233, -130,163,228,185,136,228,184,128,230,160,183,229,155,189,229,134,133,230,152,175, -229,144,166,230,160,185,230,141,174,231,148,181,232,167,134,229,173,166,233,153, -162,229,133,183,230,156,137,232,191,135,231,168,139,231,148,177,228,186,142,228, -186,186,230,137,141,229,135,186,230,157,165,228,184,141,232,191,135,230,173,163, -229,156,168,230,152,142,230,152,159,230,149,133,228,186,139,229,133,179,231,179, -187,230,160,135,233,162,152,229,149,134,229,138,161,232,190,147,229,133,165,228, -184,128,231,155,180,229,159,186,231,161,128,230,149,153,229,173,166,228,186,134, -232,167,163,229,187,186,231,173,145,231,187,147,230,158,156,229,133,168,231,144, -131,233,128,154,231,159,165,232,174,161,229,136,146,229,175,185,228,186,142,232, -137,186,230,156,175,231,155,184,229,134,140,229,143,145,231,148,159,231,156,159, -231,154,132,229,187,186,231,171,139,231,173,137,231,186,167,231,177,187,229,158, -139,231,187,143,233,170,140,229,174,158,231,142,176,229,136,182,228,189,156,230, -157,165,232,135,170,230,160,135,231,173,190,228,187,165,228,184,139,229,142,159, -229,136,155,230,151,160,230,179,149,229,133,182,228,184,173,229,128,139,228,186, -186,228,184,128,229,136,135,230,140,135,229,141,151,229,133,179,233,151,173,233, -155,134,229,155,162,231,172,172,228,184,137,229,133,179,230,179,168,229,155,160, -230,173,164,231,133,167,231,137,135,230,183,177,229,156,179,229,149,134,228,184, -154,229,185,191,229,183,158,230,151,165,230,156,159,233,171,152,231,186,167,230, -156,128,232,191,145,231,187,188,229,144,136,232,161,168,231,164,186,228,184,147, -232,190,145,232,161,140,228,184,186,228,186,164,233,128,154,232,175,132,228,187, -183,232,167,137,229,190,151,231,178,190,229,141,142,229,174,182,229,186,173,229, -174,140,230,136,144,230,132,159,232,167,137,229,174,137,232,163,133,229,190,151, -229,136,176,233,130,174,228,187,182,229,136,182,229,186,166,233,163,159,229,147, -129,232,153,189,231,132,182,232,189,172,232,189,189,230,138,165,228,187,183,232, -174,176,232,128,133,230,150,185,230,161,136,232,161,140,230,148,191,228,186,186, -230,176,145,231,148,168,229,147,129,228,184,156,232,165,191,230,143,144,229,135, -186,233,133,146,229,186,151,231,132,182,229,144,142,228,187,152,230,172,190,231, -131,173,231,130,185,228,187,165,229,137,141,229,174,140,229,133,168,229,143,145, -229,184,150,232,174,190,231,189,174,233,162,134,229,175,188,229,183,165,228,184, -154,229,140,187,233,153,162,231,156,139,231,156,139,231,187,143,229,133,184,229, -142,159,229,155,160,229,185,179,229,143,176,229,144,132,231,167,141,229,162,158, -229,138,160,230,157,144,230,150,153,230,150,176,229,162,158,228,185,139,229,144, -142,232,129,140,228,184,154,230,149,136,230,158,156,228,187,138,229,185,180,232, -174,186,230,150,135,230,136,145,229,155,189,229,145,138,232,175,137,231,137,136, -228,184,187,228,191,174,230,148,185,229,143,130,228,184,142,230,137,147,229,141, -176,229,191,171,228,185,144,230,156,186,230,162,176,232,167,130,231,130,185,229, -173,152,229,156,168,231,178,190,231,165,158,232,142,183,229,190,151,229,136,169, -231,148,168,231,187,167,231,187,173,228,189,160,228,187,172,232,191,153,228,185, -136,230,168,161,229,188,143,232,175,173,232,168,128,232,131,189,229,164,159,233, -155,133,232,153,142,230,147,141,228,189,156,233,163,142,230,160,188,228,184,128, -232,181,183,231,167,145,229,173,166,228,189,147,232,130,178,231,159,173,228,191, -161,230,157,161,228,187,182,230,178,187,231,150,151,232,191,144,229,138,168,228, -186,167,228,184,154,228,188,154,232,174,174,229,175,188,232,136,170,229,133,136, -231,148,159,232,129,148,231,155,159,229,143,175,230,152,175,229,149,143,233,161, -140,231,187,147,230,158,132,228,189,156,231,148,168,232,176,131,230,159,165,232, -179,135,230,150,153,232,135,170,229,138,168,232,180,159,232,180,163,229,134,156, -228,184,154,232,174,191,233,151,174,229,174,158,230,150,189,230,142,165,229,143, -151,232,174,168,232,174,186,233,130,163,228,184,170,229,143,141,233,166,136,229, -138,160,229,188,186,229,165,179,230,128,167,232,140,131,229,155,180,230,156,141, -229,139,153,228,188,145,233,151,178,228,187,138,230,151,165,229,174,162,230,156, -141,232,167,128,231,156,139,229,143,130,229,138,160,231,154,132,232,175,157,228, -184,128,231,130,185,228,191,157,232,175,129,229,155,190,228,185,166,230,156,137, -230,149,136,230,181,139,232,175,149,231,167,187,229,138,168,230,137,141,232,131, -189,229,134,179,229,174,154,232,130,161,231,165,168,228,184,141,230,150,173,233, -156,128,230,177,130,228,184,141,229,190,151,229,138,158,230,179,149,228,185,139, -233,151,180,233,135,135,231,148,168,232,144,165,233,148,128,230,138,149,232,175, -137,231,155,174,230,160,135,231,136,177,230,131,133,230,145,132,229,189,177,230, -156,137,228,186,155,232,164,135,232,163,189,230,150,135,229,173,166,230,156,186, -228,188,154,230,149,176,229,173,151,232,163,133,228,191,174,232,180,173,231,137, -169,229,134,156,230,157,145,229,133,168,233,157,162,231,178,190,229,147,129,229, -133,182,229,174,158,228,186,139,230,131,133,230,176,180,229,185,179,230,143,144, -231,164,186,228,184,138,229,184,130,232,176,162,232,176,162,230,153,174,233,128, -154,230,149,153,229,184,136,228,184,138,228,188,160,231,177,187,229,136,171,230, -173,140,230,155,178,230,139,165,230,156,137,229,136,155,230,150,176,233,133,141, -228,187,182,229,143,170,232,166,129,230,151,182,228,187,163,232,179,135,232,168, -138,232,190,190,229,136,176,228,186,186,231,148,159,232,174,162,233,152,133,232, -128,129,229,184,136,229,177,149,231,164,186,229,191,131,231,144,134,232,180,180, -229,173,144,231,182,178,231,171,153,228,184,187,233,161,140,232,135,170,231,132, -182,231,186,167,229,136,171,231,174,128,229,141,149,230,148,185,233,157,169,233, -130,163,228,186,155,230,157,165,232,175,180,230,137,147,229,188,128,228,187,163, -231,160,129,229,136,160,233,153,164,232,175,129,229,136,184,232,138,130,231,155, -174,233,135,141,231,130,185,230,172,161,230,149,184,229,164,154,229,176,145,232, -167,132,229,136,146,232,181,132,233,135,145,230,137,190,229,136,176,228,187,165, -229,144,142,229,164,167,229,133,168,228,184,187,233,161,181,230,156,128,228,189, -179,229,155,158,231,173,148,229,164,169,228,184,139,228,191,157,233,154,156,231, -142,176,228,187,163,230,163,128,230,159,165,230,138,149,231,165,168,229,176,143, -230,151,182,230,178,146,230,156,137,230,173,163,229,184,184,231,148,154,232,135, -179,228,187,163,231,144,134,231,155,174,229,189,149,229,133,172,229,188,128,229, -164,141,229,136,182,233,135,145,232,158,141,229,185,184,231,166,143,231,137,136, -230,156,172,229,189,162,230,136,144,229,135,134,229,164,135,232,161,140,230,131, -133,229,155,158,229,136,176,230,128,157,230,131,179,230,128,142,230,160,183,229, -141,143,232,174,174,232,174,164,232,175,129,230,156,128,229,165,189,228,186,167, -231,148,159,230,140,137,231,133,167,230,156,141,232,163,133,229,185,191,228,184, -156,229,138,168,230,188,171,233,135,135,232,180,173,230,150,176,230,137,139,231, -187,132,229,155,190,233,157,162,230,157,191,229,143,130,232,128,131,230,148,191, -230,178,187,229,174,185,230,152,147,229,164,169,229,156,176,229,138,170,229,138, -155,228,186,186,228,187,172,229,141,135,231,186,167,233,128,159,229,186,166,228, -186,186,231,137,169,232,176,131,230,149,180,230,181,129,232,161,140,233,128,160, -230,136,144,230,150,135,229,173,151,233,159,169,229,155,189,232,180,184,230,152, -147,229,188,128,229,177,149,231,155,184,233,151,156,232,161,168,231,142,176,229, -189,177,232,167,134,229,166,130,230,173,164,231,190,142,229,174,185,229,164,167, -229,176,143,230,138,165,233,129,147,230,157,161,230,172,190,229,191,131,230,131, -133,232,174,184,229,164,154,230,179,149,232,167,132,229,174,182,229,177,133,228, -185,166,229,186,151,232,191,158,230,142,165,231,171,139,229,141,179,228,184,190, -230,138,165,230,138,128,229,183,167,229,165,165,232,191,144,231,153,187,229,133, -165,228,187,165,230,157,165,231,144,134,232,174,186,228,186,139,228,187,182,232, -135,170,231,148,177,228,184,173,229,141,142,229,138,158,229,133,172,229,166,136, -229,166,136,231,156,159,230,173,163,228,184,141,233,148,153,229,133,168,230,150, -135,229,144,136,229,144,140,228,187,183,229,128,188,229,136,171,228,186,186,231, -155,145,231,157,163,229,133,183,228,189,147,228,184,150,231,186,170,229,155,162, -233,152,159,229,136,155,228,184,154,230,137,191,230,139,133,229,162,158,233,149, -191,230,156,137,228,186,186,228,191,157,230,140,129,229,149,134,229,174,182,231, -187,180,228,191,174,229,143,176,230,185,190,229,183,166,229,143,179,232,130,161, -228,187,189,231,173,148,230,161,136,229,174,158,233,153,133,231,148,181,228,191, -161,231,187,143,231,144,134,231,148,159,229,145,189,229,174,163,228,188,160,228, -187,187,229,138,161,230,173,163,229,188,143,231,137,185,232,137,178,228,184,139, -230,157,165,229,141,143,228,188,154,229,143,170,232,131,189,229,189,147,231,132, -182,233,135,141,230,150,176,229,133,167,229,174,185,230,140,135,229,175,188,232, -191,144,232,161,140,230,151,165,229,191,151,232,179,163,229,174,182,232,182,133, -232,191,135,229,156,159,229,156,176,230,181,153,230,177,159,230,148,175,228,187, -152,230,142,168,229,135,186,231,171,153,233,149,191,230,157,173,229,183,158,230, -137,167,232,161,140,229,136,182,233,128,160,228,185,139,228,184,128,230,142,168, -229,185,191,231,142,176,229,156,186,230,143,143,232,191,176,229,143,152,229,140, -150,228,188,160,231,187,159,230,173,140,230,137,139,228,191,157,233,153,169,232, -175,190,231,168,139,229,140,187,231,150,151,231,187,143,232,191,135,232,191,135, -229,142,187,228,185,139,229,137,141,230,148,182,229,133,165,229,185,180,229,186, -166,230,157,130,229,191,151,231,190,142,228,184,189,230,156,128,233,171,152,231, -153,187,233,153,134,230,156,170,230,157,165,229,138,160,229,183,165,229,133,141, -232,180,163,230,149,153,231,168,139,231,137,136,229,157,151,232,186,171,228,189, -147,233,135,141,229,186,134,229,135,186,229,148,174,230,136,144,230,156,172,229, -189,162,229,188,143,229,156,159,232,177,134,229,135,186,229,131,185,228,184,156, -230,150,185,233,130,174,231,174,177,229,141,151,228,186,172,230,177,130,232,129, -140,229,143,150,229,190,151,232,129,140,228,189,141,231,155,184,228,191,161,233, -161,181,233,157,162,229,136,134,233,146,159,231,189,145,233,161,181,231,161,174, -229,174,154,229,155,190,228,190,139,231,189,145,229,157,128,231,167,175,230,158, -129,233,148,153,232,175,175,231,155,174,231,154,132,229,174,157,232,180,157,230, -156,186,229,133,179,233,163,142,233,153,169,230,142,136,230,157,131,231,151,133, -230,175,146,229,174,160,231,137,169,233,153,164,228,186,134,232,169,149,232,171, -150,231,150,190,231,151,133,229,143,138,230,151,182,230,177,130,232,180,173,231, -171,153,231,130,185,229,132,191,231,171,165,230,175,143,229,164,169,228,184,173, -229,164,174,232,174,164,232,175,134,230,175,143,228,184,170,229,164,169,230,180, -165,229,173,151,228,189,147,229,143,176,231,129,163,231,187,180,230,138,164,230, -156,172,233,161,181,228,184,170,230,128,167,229,174,152,230,150,185,229,184,184, -232,167,129,231,155,184,230,156,186,230,136,152,231,149,165,229,186,148,229,189, -147,229,190,139,229,184,136,230,150,185,228,190,191,230,160,161,229,155,173,232, -130,161,229,184,130,230,136,191,229,177,139,230,160,143,231,155,174,229,145,152, -229,183,165,229,175,188,232,135,180,231,170,129,231,132,182,233,129,147,229,133, -183,230,156,172,231,189,145,231,187,147,229,144,136,230,161,163,230,161,136,229, -138,179,229,138,168,229,143,166,229,164,150,231,190,142,229,133,131,229,188,149, -232,181,183,230,148,185,229,143,152,231,172,172,229,155,155,228,188,154,232,174, -161,232,170,170,230,152,142,233,154,144,231,167,129,229,174,157,229,174,157,232, -167,132,232,140,131,230,182,136,232,180,185,229,133,177,229,144,140,229,191,152, -232,174,176,228,189,147,231,179,187,229,184,166,230,157,165,229,144,141,229,173, -151,231,153,188,232,161,168,229,188,128,230,148,190,229,138,160,231,155,159,229, -143,151,229,136,176,228,186,140,230,137,139,229,164,167,233,135,143,230,136,144, -228,186,186,230,149,176,233,135,143,229,133,177,228,186,171,229,140,186,229,159, -159,229,165,179,229,173,169,229,142,159,229,136,153,230,137,128,229,156,168,231, -187,147,230,157,159,233,128,154,228,191,161,232,182,133,231,186,167,233,133,141, -231,189,174,229,189,147,230,151,182,228,188,152,231,167,128,230,128,167,230,132, -159,230,136,191,228,186,167,233,129,138,230,136,178,229,135,186,229,143,163,230, -143,144,228,186,164,229,176,177,228,184,154,228,191,157,229,129,165,231,168,139, -229,186,166,229,143,130,230,149,176,228,186,139,228,184,154,230,149,180,228,184, -170,229,177,177,228,184,156,230,131,133,230,132,159,231,137,185,230,174,138,229, -136,134,233,161,158,230,144,156,229,176,139,229,177,158,228,186,142,233,151,168, -230,136,183,232,180,162,229,138,161,229,163,176,233,159,179,229,143,138,229,133, -182,232,180,162,231,187,143,229,157,154,230,140,129,229,185,178,233,131,168,230, -136,144,231,171,139,229,136,169,231,155,138,232,128,131,232,153,145,230,136,144, -233,131,189,229,140,133,232,163,133,231,148,168,230,136,182,230,175,148,232,181, -155,230,150,135,230,152,142,230,139,155,229,149,134,229,174,140,230,149,180,231, -156,159,230,152,175,231,156,188,231,157,155,228,188,153,228,188,180,229,168,129, -230,156,155,233,162,134,229,159,159,229,141,171,231,148,159,228,188,152,230,131, -160,232,171,150,229,163,135,229,133,172,229,133,177,232,137,175,229,165,189,229, -133,133,229,136,134,231,172,166,229,144,136,233,153,132,228,187,182,231,137,185, -231,130,185,228,184,141,229,143,175,232,139,177,230,150,135,232,181,132,228,186, -167,230,160,185,230,156,172,230,152,142,230,152,190,229,175,134,231,162,188,229, -133,172,228,188,151,230,176,145,230,151,143,230,155,180,229,138,160,228,186,171, -229,143,151,229,144,140,229,173,166,229,144,175,229,138,168,233,128,130,229,144, -136,229,142,159,230,157,165,233,151,174,231,173,148,230,156,172,230,150,135,231, -190,142,233,163,159,231,187,191,232,137,178,231,168,179,229,174,154,231,187,136, -228,186,142,231,148,159,231,137,169,228,190,155,230,177,130,230,144,156,231,139, -144,229,138,155,233,135,143,228,184,165,233,135,141,230,176,184,232,191,156,229, -134,153,231,156,159,230,156,137,233,153,144,231,171,158,228,186,137,229,175,185, -232,177,161,232,180,185,231,148,168,228,184,141,229,165,189,231,187,157,229,175, -185,229,141,129,229,136,134,228,191,131,232,191,155,231,130,185,232,175,132,229, -189,177,233,159,179,228,188,152,229,138,191,228,184,141,229,176,145,230,172,163, -232,181,143,229,185,182,228,184,148,230,156,137,231,130,185,230,150,185,229,144, -145,229,133,168,230,150,176,228,191,161,231,148,168,232,174,190,230,150,189,229, -189,162,232,177,161,232,181,132,230,160,188,231,170,129,231,160,180,233,154,143, -231,157,128,233,135,141,229,164,167,228,186,142,230,152,175,230,175,149,228,184, -154,230,153,186,232,131,189,229,140,150,229,183,165,229,174,140,231,190,142,229, -149,134,229,159,142,231,187,159,228,184,128,229,135,186,231,137,136,230,137,147, -233,128,160,231,148,162,229,147,129,230,166,130,229,134,181,231,148,168,228,186, -142,228,191,157,231,149,153,229,155,160,231,180,160,228,184,173,229,156,139,229, -173,152,229,130,168,232,180,180,229,155,190,230,156,128,230,132,155,233,149,191, -230,156,159,229,143,163,228,187,183,231,144,134,232,180,162,229,159,186,229,156, -176,229,174,137,230,142,146,230,173,166,230,177,137,233,135,140,233,157,162,229, -136,155,229,187,186,229,164,169,231,169,186,233,166,150,229,133,136,229,174,140, -229,150,132,233,169,177,229,138,168,228,184,139,233,157,162,228,184,141,229,134, -141,232,175,154,228,191,161,230,132,143,228,185,137,233,152,179,229,133,137,232, -139,177,229,155,189,230,188,130,228,186,174,229,134,155,228,186,139,231,142,169, -229,174,182,231,190,164,228,188,151,229,134,156,230,176,145,229,141,179,229,143, -175,229,144,141,231,168,177,229,174,182,229,133,183,229,138,168,231,148,187,230, -131,179,229,136,176,230,179,168,230,152,142,229,176,143,229,173,166,230,128,167, -232,131,189,232,128,131,231,160,148,231,161,172,228,187,182,232,167,130,231,156, -139,230,184,133,230,165,154,230,144,158,231,172,145,233,166,150,233,160,129,233, -187,132,233,135,145,233,128,130,231,148,168,230,177,159,232,139,143,231,156,159, -229,174,158,228,184,187,231,174,161,233,152,182,230,174,181,232,168,187,229,134, -138,231,191,187,232,175,145,230,157,131,229,136,169,229,129,154,229,165,189,228, -188,188,228,185,142,233,128,154,232,174,175,230,150,189,229,183,165,231,139,128, -230,133,139,228,185,159,232,174,184,231,142,175,228,191,157,229,159,185,229,133, -187,230,166,130,229,191,181,229,164,167,229,158,139,230,156,186,231,165,168,231, -144,134,232,167,163,229,140,191,229,144,141,99,117,97,110,100,111,101,110,118, -105,97,114,109,97,100,114,105,100,98,117,115,99,97,114,105,110,105,99,105,111, -116,105,101,109,112,111,112,111,114,113,117,101,99,117,101,110,116,97,101,115, -116,97,100,111,112,117,101,100,101,110,106,117,101,103,111,115,99,111,110,116, -114,97,101,115,116,195,161,110,110,111,109,98,114,101,116,105,101,110,101,110, -112,101,114,102,105,108,109,97,110,101,114,97,97,109,105,103,111,115,99,105,117, -100,97,100,99,101,110,116,114,111,97,117,110,113,117,101,112,117,101,100,101,115 -,100,101,110,116,114,111,112,114,105,109,101,114,112,114,101,99,105,111,115,101, -103,195,186,110,98,117,101,110,111,115,118,111,108,118,101,114,112,117,110,116, -111,115,115,101,109,97,110,97,104,97,98,195,173,97,97,103,111,115,116,111,110, -117,101,118,111,115,117,110,105,100,111,115,99,97,114,108,111,115,101,113,117, -105,112,111,110,105,195,177,111,115,109,117,99,104,111,115,97,108,103,117,110,97 -,99,111,114,114,101,111,105,109,97,103,101,110,112,97,114,116,105,114,97,114,114 -,105,98,97,109,97,114,195,173,97,104,111,109,98,114,101,101,109,112,108,101,111, -118,101,114,100,97,100,99,97,109,98,105,111,109,117,99,104,97,115,102,117,101, -114,111,110,112,97,115,97,100,111,108,195,173,110,101,97,112,97,114,101,99,101, -110,117,101,118,97,115,99,117,114,115,111,115,101,115,116,97,98,97,113,117,105, -101,114,111,108,105,98,114,111,115,99,117,97,110,116,111,97,99,99,101,115,111, -109,105,103,117,101,108,118,97,114,105,111,115,99,117,97,116,114,111,116,105,101 -,110,101,115,103,114,117,112,111,115,115,101,114,195,161,110,101,117,114,111,112 -,97,109,101,100,105,111,115,102,114,101,110,116,101,97,99,101,114,99,97,100,101, -109,195,161,115,111,102,101,114,116,97,99,111,99,104,101,115,109,111,100,101,108 -,111,105,116,97,108,105,97,108,101,116,114,97,115,97,108,103,195,186,110,99,111, -109,112,114,97,99,117,97,108,101,115,101,120,105,115,116,101,99,117,101,114,112, -111,115,105,101,110,100,111,112,114,101,110,115,97,108,108,101,103,97,114,118, -105,97,106,101,115,100,105,110,101,114,111,109,117,114,99,105,97,112,111,100,114 -,195,161,112,117,101,115,116,111,100,105,97,114,105,111,112,117,101,98,108,111, -113,117,105,101,114,101,109,97,110,117,101,108,112,114,111,112,105,111,99,114, -105,115,105,115,99,105,101,114,116,111,115,101,103,117,114,111,109,117,101,114, -116,101,102,117,101,110,116,101,99,101,114,114,97,114,103,114,97,110,100,101,101 -,102,101,99,116,111,112,97,114,116,101,115,109,101,100,105,100,97,112,114,111, -112,105,97,111,102,114,101,99,101,116,105,101,114,114,97,101,45,109,97,105,108, -118,97,114,105,97,115,102,111,114,109,97,115,102,117,116,117,114,111,111,98,106, -101,116,111,115,101,103,117,105,114,114,105,101,115,103,111,110,111,114,109,97, -115,109,105,115,109,111,115,195,186,110,105,99,111,99,97,109,105,110,111,115,105 -,116,105,111,115,114,97,122,195,179,110,100,101,98,105,100,111,112,114,117,101, -98,97,116,111,108,101,100,111,116,101,110,195,173,97,106,101,115,195,186,115,101 -,115,112,101,114,111,99,111,99,105,110,97,111,114,105,103,101,110,116,105,101, -110,100,97,99,105,101,110,116,111,99,195,161,100,105,122,104,97,98,108,97,114, -115,101,114,195,173,97,108,97,116,105,110,97,102,117,101,114,122,97,101,115,116, -105,108,111,103,117,101,114,114,97,101,110,116,114,97,114,195,169,120,105,116, -111,108,195,179,112,101,122,97,103,101,110,100,97,118,195,173,100,101,111,101, -118,105,116,97,114,112,97,103,105,110,97,109,101,116,114,111,115,106,97,118,105, -101,114,112,97,100,114,101,115,102,195,161,99,105,108,99,97,98,101,122,97,195, -161,114,101,97,115,115,97,108,105,100,97,101,110,118,195,173,111,106,97,112,195, -179,110,97,98,117,115,111,115,98,105,101,110,101,115,116,101,120,116,111,115,108 -,108,101,118,97,114,112,117,101,100,97,110,102,117,101,114,116,101,99,111,109, -195,186,110,99,108,97,115,101,115,104,117,109,97,110,111,116,101,110,105,100,111 -,98,105,108,98,97,111,117,110,105,100,97,100,101,115,116,195,161,115,101,100,105 -,116,97,114,99,114,101,97,100,111,208,180,208,187,209,143,209,135,209,130,208, -190,208,186,208,176,208,186,208,184,208,187,208,184,209,141,209,130,208,190,208, -178,209,129,208,181,208,181,208,179,208,190,208,191,209,128,208,184,209,130,208, -176,208,186,208,181,209,137,208,181,209,131,208,182,208,181,208,154,208,176,208, -186,208,177,208,181,208,183,208,177,209,139,208,187,208,190,208,189,208,184,208, -146,209,129,208,181,208,191,208,190,208,180,208,173,209,130,208,190,209,130,208, -190,208,188,209,135,208,181,208,188,208,189,208,181,209,130,208,187,208,181,209, -130,209,128,208,176,208,183,208,190,208,189,208,176,208,179,208,180,208,181,208, -188,208,189,208,181,208,148,208,187,209,143,208,159,209,128,208,184,208,189,208, -176,209,129,208,189,208,184,209,133,209,130,208,181,208,188,208,186,209,130,208, -190,208,179,208,190,208,180,208,178,208,190,209,130,209,130,208,176,208,188,208, -161,208,168,208,144,208,188,208,176,209,143,208,167,209,130,208,190,208,178,208, -176,209,129,208,178,208,176,208,188,208,181,208,188,209,131,208,162,208,176,208, -186,208,180,208,178,208,176,208,189,208,176,208,188,209,141,209,130,208,184,209, -141,209,130,209,131,208,146,208,176,208,188,209,130,208,181,209,133,208,191,209, -128,208,190,209,130,209,131,209,130,208,189,208,176,208,180,208,180,208,189,209, -143,208,146,208,190,209,130,209,130,209,128,208,184,208,189,208,181,208,185,208, -146,208,176,209,129,208,189,208,184,208,188,209,129,208,176,208,188,209,130,208, -190,209,130,209,128,209,131,208,177,208,158,208,189,208,184,208,188,208,184,209, -128,208,189,208,181,208,181,208,158,208,158,208,158,208,187,208,184,209,134,209, -141,209,130,208,176,208,158,208,189,208,176,208,189,208,181,208,188,208,180,208, -190,208,188,208,188,208,190,208,185,208,180,208,178,208,181,208,190,208,189,208, -190,209,129,209,131,208,180,224,164,149,224,165,135,224,164,185,224,165,136,224, -164,149,224,165,128,224,164,184,224,165,135,224,164,149,224,164,190,224,164,149, -224,165,139,224,164,148,224,164,176,224,164,170,224,164,176,224,164,168,224,165, -135,224,164,143,224,164,149,224,164,149,224,164,191,224,164,173,224,165,128,224, -164,135,224,164,184,224,164,149,224,164,176,224,164,164,224,165,139,224,164,185, -224,165,139,224,164,134,224,164,170,224,164,185,224,165,128,224,164,175,224,164, -185,224,164,175,224,164,190,224,164,164,224,164,149,224,164,165,224,164,190,106, -97,103,114,97,110,224,164,134,224,164,156,224,164,156,224,165,139,224,164,133, -224,164,172,224,164,166,224,165,139,224,164,151,224,164,136,224,164,156,224,164, -190,224,164,151,224,164,143,224,164,185,224,164,174,224,164,135,224,164,168,224, -164,181,224,164,185,224,164,175,224,165,135,224,164,165,224,165,135,224,164,165, -224,165,128,224,164,152,224,164,176,224,164,156,224,164,172,224,164,166,224,165, -128,224,164,149,224,164,136,224,164,156,224,165,128,224,164,181,224,165,135,224, -164,168,224,164,136,224,164,168,224,164,143,224,164,185,224,164,176,224,164,137, -224,164,184,224,164,174,224,165,135,224,164,149,224,164,174,224,164,181,224,165, -139,224,164,178,224,165,135,224,164,184,224,164,172,224,164,174,224,164,136,224, -164,166,224,165,135,224,164,147,224,164,176,224,164,134,224,164,174,224,164,172, -224,164,184,224,164,173,224,164,176,224,164,172,224,164,168,224,164,154,224,164, -178,224,164,174,224,164,168,224,164,134,224,164,151,224,164,184,224,165,128,224, -164,178,224,165,128,216,185,217,132,217,137,216,165,217,132,217,137,217,135,216, -176,216,167,216,162,216,174,216,177,216,185,216,175,216,175,216,167,217,132,217, -137,217,135,216,176,217,135,216,181,217,136,216,177,216,186,217,138,216,177,217, -131,216,167,217,134,217,136,217,132,216,167,216,168,217,138,217,134,216,185,216, -177,216,182,216,176,217,132,217,131,217,135,217,134,216,167,217,138,217,136,217, -133,217,130,216,167,217,132,216,185,217,132,217,138,216,167,217,134,216,167,217, -132,217,131,217,134,216,173,216,170,217,137,217,130,216,168,217,132,217,136,216, -173,216,169,216,167,216,174,216,177,217,129,217,130,216,183,216,185,216,168,216, -175,216,177,217,131,217,134,216,165,216,176,216,167,217,131,217,133,216,167,216, -167,216,173,216,175,216,165,217,132,216,167,217,129,217,138,217,135,216,168,216, -185,216,182,217,131,217,138,217,129,216,168,216,173,216,171,217,136,217,133,217, -134,217,136,217,135,217,136,216,163,217,134,216,167,216,172,216,175,216,167,217, -132,217,135,216,167,216,179,217,132,217,133,216,185,217,134,216,175,217,132,217, -138,216,179,216,185,216,168,216,177,216,181,217,132,217,137,217,133,217,134,216, -176,216,168,217,135,216,167,216,163,217,134,217,135,217,133,216,171,217,132,217, -131,217,134,216,170,216,167,217,132,216,167,216,173,217,138,216,171,217,133,216, -181,216,177,216,180,216,177,216,173,216,173,217,136,217,132,217,136,217,129,217, -138,216,167,216,176,216,167,217,132,217,131,217,132,217,133,216,177,216,169,216, -167,217,134,216,170,216,167,217,132,217,129,216,163,216,168,217,136,216,174,216, -167,216,181,216,163,217,134,216,170,216,167,217,134,217,135,216,167,217,132,217, -138,216,185,216,182,217,136,217,136,217,130,216,175,216,167,216,168,217,134,216, -174,217,138,216,177,216,168,217,134,216,170,217,132,217,131,217,133,216,180,216, -167,216,161,217,136,217,135,217,138,216,167,216,168,217,136,217,130,216,181,216, -181,217,136,217,133,216,167,216,177,217,130,217,133,216,163,216,173,216,175,217, -134,216,173,217,134,216,185,216,175,217,133,216,177,216,163,217,138,216,167,216, -173,216,169,217,131,216,170,216,168,216,175,217,136,217,134,217,138,216,172,216, -168,217,133,217,134,217,135,216,170,216,173,216,170,216,172,217,135,216,169,216, -179,217,134,216,169,217,138,216,170,217,133,217,131,216,177,216,169,216,186,216, -178,216,169,217,134,217,129,216,179,216,168,217,138,216,170,217,132,217,132,217, -135,217,132,217,134,216,167,216,170,217,132,217,131,217,130,217,132,216,168,217, -132,217,133,216,167,216,185,217,134,217,135,216,163,217,136,217,132,216,180,217, -138,216,161,217,134,217,136,216,177,216,163,217,133,216,167,217,129,217,138,217, -131,216,168,217,131,217,132,216,176,216,167,216,170,216,177,216,170,216,168,216, -168,216,163,217,134,217,135,217,133,216,179,216,167,217,134,217,131,216,168,217, -138,216,185,217,129,217,130,216,175,216,173,216,179,217,134,217,132,217,135,217, -133,216,180,216,185,216,177,216,163,217,135,217,132,216,180,217,135,216,177,217, -130,216,183,216,177,216,183,217,132,216,168,112,114,111,102,105,108,101,115,101, -114,118,105,99,101,100,101,102,97,117,108,116,104,105,109,115,101,108,102,100, -101,116,97,105,108,115,99,111,110,116,101,110,116,115,117,112,112,111,114,116, -115,116,97,114,116,101,100,109,101,115,115,97,103,101,115,117,99,99,101,115,115, -102,97,115,104,105,111,110,60,116,105,116,108,101,62,99,111,117,110,116,114,121, -97,99,99,111,117,110,116,99,114,101,97,116,101,100,115,116,111,114,105,101,115, -114,101,115,117,108,116,115,114,117,110,110,105,110,103,112,114,111,99,101,115, -115,119,114,105,116,105,110,103,111,98,106,101,99,116,115,118,105,115,105,98,108 -,101,119,101,108,99,111,109,101,97,114,116,105,99,108,101,117,110,107,110,111, -119,110,110,101,116,119,111,114,107,99,111,109,112,97,110,121,100,121,110,97,109 -,105,99,98,114,111,119,115,101,114,112,114,105,118,97,99,121,112,114,111,98,108, -101,109,83,101,114,118,105,99,101,114,101,115,112,101,99,116,100,105,115,112,108 -,97,121,114,101,113,117,101,115,116,114,101,115,101,114,118,101,119,101,98,115, -105,116,101,104,105,115,116,111,114,121,102,114,105,101,110,100,115,111,112,116, -105,111,110,115,119,111,114,107,105,110,103,118,101,114,115,105,111,110,109,105, -108,108,105,111,110,99,104,97,110,110,101,108,119,105,110,100,111,119,46,97,100, -100,114,101,115,115,118,105,115,105,116,101,100,119,101,97,116,104,101,114,99, -111,114,114,101,99,116,112,114,111,100,117,99,116,101,100,105,114,101,99,116,102 -,111,114,119,97,114,100,121,111,117,32,99,97,110,114,101,109,111,118,101,100,115 -,117,98,106,101,99,116,99,111,110,116,114,111,108,97,114,99,104,105,118,101,99, -117,114,114,101,110,116,114,101,97,100,105,110,103,108,105,98,114,97,114,121,108 -,105,109,105,116,101,100,109,97,110,97,103,101,114,102,117,114,116,104,101,114, -115,117,109,109,97,114,121,109,97,99,104,105,110,101,109,105,110,117,116,101,115 -,112,114,105,118,97,116,101,99,111,110,116,101,120,116,112,114,111,103,114,97, -109,115,111,99,105,101,116,121,110,117,109,98,101,114,115,119,114,105,116,116, -101,110,101,110,97,98,108,101,100,116,114,105,103,103,101,114,115,111,117,114,99 -,101,115,108,111,97,100,105,110,103,101,108,101,109,101,110,116,112,97,114,116, -110,101,114,102,105,110,97,108,108,121,112,101,114,102,101,99,116,109,101,97,110 -,105,110,103,115,121,115,116,101,109,115,107,101,101,112,105,110,103,99,117,108, -116,117,114,101,38,113,117,111,116,59,44,106,111,117,114,110,97,108,112,114,111, -106,101,99,116,115,117,114,102,97,99,101,115,38,113,117,111,116,59,101,120,112, -105,114,101,115,114,101,118,105,101,119,115,98,97,108,97,110,99,101,69,110,103, -108,105,115,104,67,111,110,116,101,110,116,116,104,114,111,117,103,104,80,108, -101,97,115,101,32,111,112,105,110,105,111,110,99,111,110,116,97,99,116,97,118, -101,114,97,103,101,112,114,105,109,97,114,121,118,105,108,108,97,103,101,83,112, -97,110,105,115,104,103,97,108,108,101,114,121,100,101,99,108,105,110,101,109,101 -,101,116,105,110,103,109,105,115,115,105,111,110,112,111,112,117,108,97,114,113, -117,97,108,105,116,121,109,101,97,115,117,114,101,103,101,110,101,114,97,108,115 -,112,101,99,105,101,115,115,101,115,115,105,111,110,115,101,99,116,105,111,110, -119,114,105,116,101,114,115,99,111,117,110,116,101,114,105,110,105,116,105,97, -108,114,101,112,111,114,116,115,102,105,103,117,114,101,115,109,101,109,98,101, -114,115,104,111,108,100,105,110,103,100,105,115,112,117,116,101,101,97,114,108, -105,101,114,101,120,112,114,101,115,115,100,105,103,105,116,97,108,112,105,99, -116,117,114,101,65,110,111,116,104,101,114,109,97,114,114,105,101,100,116,114,97 -,102,102,105,99,108,101,97,100,105,110,103,99,104,97,110,103,101,100,99,101,110, -116,114,97,108,118,105,99,116,111,114,121,105,109,97,103,101,115,47,114,101,97, -115,111,110,115,115,116,117,100,105,101,115,102,101,97,116,117,114,101,108,105, -115,116,105,110,103,109,117,115,116,32,98,101,115,99,104,111,111,108,115,86,101, -114,115,105,111,110,117,115,117,97,108,108,121,101,112,105,115,111,100,101,112, -108,97,121,105,110,103,103,114,111,119,105,110,103,111,98,118,105,111,117,115, -111,118,101,114,108,97,121,112,114,101,115,101,110,116,97,99,116,105,111,110,115 -,60,47,117,108,62,13,10,119,114,97,112,112,101,114,97,108,114,101,97,100,121,99, -101,114,116,97,105,110,114,101,97,108,105,116,121,115,116,111,114,97,103,101,97, -110,111,116,104,101,114,100,101,115,107,116,111,112,111,102,102,101,114,101,100, -112,97,116,116,101,114,110,117,110,117,115,117,97,108,68,105,103,105,116,97,108, -99,97,112,105,116,97,108,87,101,98,115,105,116,101,102,97,105,108,117,114,101,99 -,111,110,110,101,99,116,114,101,100,117,99,101,100,65,110,100,114,111,105,100, -100,101,99,97,100,101,115,114,101,103,117,108,97,114,32,38,97,109,112,59,32,97, -110,105,109,97,108,115,114,101,108,101,97,115,101,65,117,116,111,109,97,116,103, -101,116,116,105,110,103,109,101,116,104,111,100,115,110,111,116,104,105,110,103, -80,111,112,117,108,97,114,99,97,112,116,105,111,110,108,101,116,116,101,114,115, -99,97,112,116,117,114,101,115,99,105,101,110,99,101,108,105,99,101,110,115,101, -99,104,97,110,103,101,115,69,110,103,108,97,110,100,61,49,38,97,109,112,59,72, -105,115,116,111,114,121,32,61,32,110,101,119,32,67,101,110,116,114,97,108,117, -112,100,97,116,101,100,83,112,101,99,105,97,108,78,101,116,119,111,114,107,114, -101,113,117,105,114,101,99,111,109,109,101,110,116,119,97,114,110,105,110,103,67 -,111,108,108,101,103,101,116,111,111,108,98,97,114,114,101,109,97,105,110,115,98 -,101,99,97,117,115,101,101,108,101,99,116,101,100,68,101,117,116,115,99,104,102, -105,110,97,110,99,101,119,111,114,107,101,114,115,113,117,105,99,107,108,121,98, -101,116,119,101,101,110,101,120,97,99,116,108,121,115,101,116,116,105,110,103, -100,105,115,101,97,115,101,83,111,99,105,101,116,121,119,101,97,112,111,110,115, -101,120,104,105,98,105,116,38,108,116,59,33,45,45,67,111,110,116,114,111,108,99, -108,97,115,115,101,115,99,111,118,101,114,101,100,111,117,116,108,105,110,101,97 -,116,116,97,99,107,115,100,101,118,105,99,101,115,40,119,105,110,100,111,119,112 -,117,114,112,111,115,101,116,105,116,108,101,61,34,77,111,98,105,108,101,32,107, -105,108,108,105,110,103,115,104,111,119,105,110,103,73,116,97,108,105,97,110,100 -,114,111,112,112,101,100,104,101,97,118,105,108,121,101,102,102,101,99,116,115, -45,49,39,93,41,59,10,99,111,110,102,105,114,109,67,117,114,114,101,110,116,97, -100,118,97,110,99,101,115,104,97,114,105,110,103,111,112,101,110,105,110,103,100 -,114,97,119,105,110,103,98,105,108,108,105,111,110,111,114,100,101,114,101,100, -71,101,114,109,97,110,121,114,101,108,97,116,101,100,60,47,102,111,114,109,62, -105,110,99,108,117,100,101,119,104,101,116,104,101,114,100,101,102,105,110,101, -100,83,99,105,101,110,99,101,99,97,116,97,108,111,103,65,114,116,105,99,108,101, -98,117,116,116,111,110,115,108,97,114,103,101,115,116,117,110,105,102,111,114, -109,106,111,117,114,110,101,121,115,105,100,101,98,97,114,67,104,105,99,97,103, -111,104,111,108,105,100,97,121,71,101,110,101,114,97,108,112,97,115,115,97,103, -101,44,38,113,117,111,116,59,97,110,105,109,97,116,101,102,101,101,108,105,110, -103,97,114,114,105,118,101,100,112,97,115,115,105,110,103,110,97,116,117,114,97, -108,114,111,117,103,104,108,121,46,10,10,84,104,101,32,98,117,116,32,110,111,116 -,100,101,110,115,105,116,121,66,114,105,116,97,105,110,67,104,105,110,101,115, -101,108,97,99,107,32,111,102,116,114,105,98,117,116,101,73,114,101,108,97,110, -100,34,32,100,97,116,97,45,102,97,99,116,111,114,115,114,101,99,101,105,118,101, -116,104,97,116,32,105,115,76,105,98,114,97,114,121,104,117,115,98,97,110,100,105 -,110,32,102,97,99,116,97,102,102,97,105,114,115,67,104,97,114,108,101,115,114,97 -,100,105,99,97,108,98,114,111,117,103,104,116,102,105,110,100,105,110,103,108,97 -,110,100,105,110,103,58,108,97,110,103,61,34,114,101,116,117,114,110,32,108,101, -97,100,101,114,115,112,108,97,110,110,101,100,112,114,101,109,105,117,109,112,97 -,99,107,97,103,101,65,109,101,114,105,99,97,69,100,105,116,105,111,110,93,38,113 -,117,111,116,59,77,101,115,115,97,103,101,110,101,101,100,32,116,111,118,97,108, -117,101,61,34,99,111,109,112,108,101,120,108,111,111,107,105,110,103,115,116,97, -116,105,111,110,98,101,108,105,101,118,101,115,109,97,108,108,101,114,45,109,111 -,98,105,108,101,114,101,99,111,114,100,115,119,97,110,116,32,116,111,107,105,110 -,100,32,111,102,70,105,114,101,102,111,120,121,111,117,32,97,114,101,115,105,109 -,105,108,97,114,115,116,117,100,105,101,100,109,97,120,105,109,117,109,104,101, -97,100,105,110,103,114,97,112,105,100,108,121,99,108,105,109,97,116,101,107,105, -110,103,100,111,109,101,109,101,114,103,101,100,97,109,111,117,110,116,115,102, -111,117,110,100,101,100,112,105,111,110,101,101,114,102,111,114,109,117,108,97, -100,121,110,97,115,116,121,104,111,119,32,116,111,32,83,117,112,112,111,114,116, -114,101,118,101,110,117,101,101,99,111,110,111,109,121,82,101,115,117,108,116, -115,98,114,111,116,104,101,114,115,111,108,100,105,101,114,108,97,114,103,101, -108,121,99,97,108,108,105,110,103,46,38,113,117,111,116,59,65,99,99,111,117,110, -116,69,100,119,97,114,100,32,115,101,103,109,101,110,116,82,111,98,101,114,116, -32,101,102,102,111,114,116,115,80,97,99,105,102,105,99,108,101,97,114,110,101, -100,117,112,32,119,105,116,104,104,101,105,103,104,116,58,119,101,32,104,97,118, -101,65,110,103,101,108,101,115,110,97,116,105,111,110,115,95,115,101,97,114,99, -104,97,112,112,108,105,101,100,97,99,113,117,105,114,101,109,97,115,115,105,118, -101,103,114,97,110,116,101,100,58,32,102,97,108,115,101,116,114,101,97,116,101, -100,98,105,103,103,101,115,116,98,101,110,101,102,105,116,100,114,105,118,105, -110,103,83,116,117,100,105,101,115,109,105,110,105,109,117,109,112,101,114,104, -97,112,115,109,111,114,110,105,110,103,115,101,108,108,105,110,103,105,115,32, -117,115,101,100,114,101,118,101,114,115,101,118,97,114,105,97,110,116,32,114,111 -,108,101,61,34,109,105,115,115,105,110,103,97,99,104,105,101,118,101,112,114,111 -,109,111,116,101,115,116,117,100,101,110,116,115,111,109,101,111,110,101,101,120 -,116,114,101,109,101,114,101,115,116,111,114,101,98,111,116,116,111,109,58,101, -118,111,108,118,101,100,97,108,108,32,116,104,101,115,105,116,101,109,97,112,101 -,110,103,108,105,115,104,119,97,121,32,116,111,32,32,65,117,103,117,115,116,115, -121,109,98,111,108,115,67,111,109,112,97,110,121,109,97,116,116,101,114,115,109, -117,115,105,99,97,108,97,103,97,105,110,115,116,115,101,114,118,105,110,103,125, -41,40,41,59,13,10,112,97,121,109,101,110,116,116,114,111,117,98,108,101,99,111, -110,99,101,112,116,99,111,109,112,97,114,101,112,97,114,101,110,116,115,112,108, -97,121,101,114,115,114,101,103,105,111,110,115,109,111,110,105,116,111,114,32,39 -,39,84,104,101,32,119,105,110,110,105,110,103,101,120,112,108,111,114,101,97,100 -,97,112,116,101,100,71,97,108,108,101,114,121,112,114,111,100,117,99,101,97,98, -105,108,105,116,121,101,110,104,97,110,99,101,99,97,114,101,101,114,115,41,46,32 -,84,104,101,32,99,111,108,108,101,99,116,83,101,97,114,99,104,32,97,110,99,105, -101,110,116,101,120,105,115,116,101,100,102,111,111,116,101,114,32,104,97,110, -100,108,101,114,112,114,105,110,116,101,100,99,111,110,115,111,108,101,69,97,115 -,116,101,114,110,101,120,112,111,114,116,115,119,105,110,100,111,119,115,67,104, -97,110,110,101,108,105,108,108,101,103,97,108,110,101,117,116,114,97,108,115,117 -,103,103,101,115,116,95,104,101,97,100,101,114,115,105,103,110,105,110,103,46, -104,116,109,108,34,62,115,101,116,116,108,101,100,119,101,115,116,101,114,110,99 -,97,117,115,105,110,103,45,119,101,98,107,105,116,99,108,97,105,109,101,100,74, -117,115,116,105,99,101,99,104,97,112,116,101,114,118,105,99,116,105,109,115,84, -104,111,109,97,115,32,109,111,122,105,108,108,97,112,114,111,109,105,115,101,112 -,97,114,116,105,101,115,101,100,105,116,105,111,110,111,117,116,115,105,100,101, -58,102,97,108,115,101,44,104,117,110,100,114,101,100,79,108,121,109,112,105,99, -95,98,117,116,116,111,110,97,117,116,104,111,114,115,114,101,97,99,104,101,100, -99,104,114,111,110,105,99,100,101,109,97,110,100,115,115,101,99,111,110,100,115, -112,114,111,116,101,99,116,97,100,111,112,116,101,100,112,114,101,112,97,114,101 -,110,101,105,116,104,101,114,103,114,101,97,116,108,121,103,114,101,97,116,101, -114,111,118,101,114,97,108,108,105,109,112,114,111,118,101,99,111,109,109,97,110 -,100,115,112,101,99,105,97,108,115,101,97,114,99,104,46,119,111,114,115,104,105, -112,102,117,110,100,105,110,103,116,104,111,117,103,104,116,104,105,103,104,101, -115,116,105,110,115,116,101,97,100,117,116,105,108,105,116,121,113,117,97,114, -116,101,114,67,117,108,116,117,114,101,116,101,115,116,105,110,103,99,108,101,97 -,114,108,121,101,120,112,111,115,101,100,66,114,111,119,115,101,114,108,105,98, -101,114,97,108,125,32,99,97,116,99,104,80,114,111,106,101,99,116,101,120,97,109, -112,108,101,104,105,100,101,40,41,59,70,108,111,114,105,100,97,97,110,115,119, -101,114,115,97,108,108,111,119,101,100,69,109,112,101,114,111,114,100,101,102, -101,110,115,101,115,101,114,105,111,117,115,102,114,101,101,100,111,109,83,101, -118,101,114,97,108,45,98,117,116,116,111,110,70,117,114,116,104,101,114,111,117, -116,32,111,102,32,33,61,32,110,117,108,108,116,114,97,105,110,101,100,68,101,110 -,109,97,114,107,118,111,105,100,40,48,41,47,97,108,108,46,106,115,112,114,101, -118,101,110,116,82,101,113,117,101,115,116,83,116,101,112,104,101,110,10,10,87, -104,101,110,32,111,98,115,101,114,118,101,60,47,104,50,62,13,10,77,111,100,101, -114,110,32,112,114,111,118,105,100,101,34,32,97,108,116,61,34,98,111,114,100,101 -,114,115,46,10,10,70,111,114,32,10,10,77,97,110,121,32,97,114,116,105,115,116, -115,112,111,119,101,114,101,100,112,101,114,102,111,114,109,102,105,99,116,105, -111,110,116,121,112,101,32,111,102,109,101,100,105,99,97,108,116,105,99,107,101, -116,115,111,112,112,111,115,101,100,67,111,117,110,99,105,108,119,105,116,110, -101,115,115,106,117,115,116,105,99,101,71,101,111,114,103,101,32,66,101,108,103, -105,117,109,46,46,46,60,47,97,62,116,119,105,116,116,101,114,110,111,116,97,98, -108,121,119,97,105,116,105,110,103,119,97,114,102,97,114,101,32,79,116,104,101, -114,32,114,97,110,107,105,110,103,112,104,114,97,115,101,115,109,101,110,116,105 -,111,110,115,117,114,118,105,118,101,115,99,104,111,108,97,114,60,47,112,62,13, -10,32,67,111,117,110,116,114,121,105,103,110,111,114,101,100,108,111,115,115,32, -111,102,106,117,115,116,32,97,115,71,101,111,114,103,105,97,115,116,114,97,110, -103,101,60,104,101,97,100,62,60,115,116,111,112,112,101,100,49,39,93,41,59,13,10 -,105,115,108,97,110,100,115,110,111,116,97,98,108,101,98,111,114,100,101,114,58, -108,105,115,116,32,111,102,99,97,114,114,105,101,100,49,48,48,44,48,48,48,60,47, -104,51,62,10,32,115,101,118,101,114,97,108,98,101,99,111,109,101,115,115,101,108 -,101,99,116,32,119,101,100,100,105,110,103,48,48,46,104,116,109,108,109,111,110, -97,114,99,104,111,102,102,32,116,104,101,116,101,97,99,104,101,114,104,105,103, -104,108,121,32,98,105,111,108,111,103,121,108,105,102,101,32,111,102,111,114,32, -101,118,101,110,114,105,115,101,32,111,102,38,114,97,113,117,111,59,112,108,117, -115,111,110,101,104,117,110,116,105,110,103,40,116,104,111,117,103,104,68,111, -117,103,108,97,115,106,111,105,110,105,110,103,99,105,114,99,108,101,115,70,111, -114,32,116,104,101,65,110,99,105,101,110,116,86,105,101,116,110,97,109,118,101, -104,105,99,108,101,115,117,99,104,32,97,115,99,114,121,115,116,97,108,118,97,108 -,117,101,32,61,87,105,110,100,111,119,115,101,110,106,111,121,101,100,97,32,115, -109,97,108,108,97,115,115,117,109,101,100,60,97,32,105,100,61,34,102,111,114,101 -,105,103,110,32,65,108,108,32,114,105,104,111,119,32,116,104,101,68,105,115,112, -108,97,121,114,101,116,105,114,101,100,104,111,119,101,118,101,114,104,105,100, -100,101,110,59,98,97,116,116,108,101,115,115,101,101,107,105,110,103,99,97,98, -105,110,101,116,119,97,115,32,110,111,116,108,111,111,107,32,97,116,99,111,110, -100,117,99,116,103,101,116,32,116,104,101,74,97,110,117,97,114,121,104,97,112, -112,101,110,115,116,117,114,110,105,110,103,97,58,104,111,118,101,114,79,110,108 -,105,110,101,32,70,114,101,110,99,104,32,108,97,99,107,105,110,103,116,121,112, -105,99,97,108,101,120,116,114,97,99,116,101,110,101,109,105,101,115,101,118,101, -110,32,105,102,103,101,110,101,114,97,116,100,101,99,105,100,101,100,97,114,101, -32,110,111,116,47,115,101,97,114,99,104,98,101,108,105,101,102,115,45,105,109,97 -,103,101,58,108,111,99,97,116,101,100,115,116,97,116,105,99,46,108,111,103,105, -110,34,62,99,111,110,118,101,114,116,118,105,111,108,101,110,116,101,110,116,101 -,114,101,100,102,105,114,115,116,34,62,99,105,114,99,117,105,116,70,105,110,108, -97,110,100,99,104,101,109,105,115,116,115,104,101,32,119,97,115,49,48,112,120,59 -,34,62,97,115,32,115,117,99,104,100,105,118,105,100,101,100,60,47,115,112,97,110 -,62,119,105,108,108,32,98,101,108,105,110,101,32,111,102,97,32,103,114,101,97, -116,109,121,115,116,101,114,121,47,105,110,100,101,120,46,102,97,108,108,105,110 -,103,100,117,101,32,116,111,32,114,97,105,108,119,97,121,99,111,108,108,101,103, -101,109,111,110,115,116,101,114,100,101,115,99,101,110,116,105,116,32,119,105, -116,104,110,117,99,108,101,97,114,74,101,119,105,115,104,32,112,114,111,116,101, -115,116,66,114,105,116,105,115,104,102,108,111,119,101,114,115,112,114,101,100, -105,99,116,114,101,102,111,114,109,115,98,117,116,116,111,110,32,119,104,111,32, -119,97,115,108,101,99,116,117,114,101,105,110,115,116,97,110,116,115,117,105,99, -105,100,101,103,101,110,101,114,105,99,112,101,114,105,111,100,115,109,97,114, -107,101,116,115,83,111,99,105,97,108,32,102,105,115,104,105,110,103,99,111,109, -98,105,110,101,103,114,97,112,104,105,99,119,105,110,110,101,114,115,60,98,114, -32,47,62,60,98,121,32,116,104,101,32,78,97,116,117,114,97,108,80,114,105,118,97, -99,121,99,111,111,107,105,101,115,111,117,116,99,111,109,101,114,101,115,111,108 -,118,101,83,119,101,100,105,115,104,98,114,105,101,102,108,121,80,101,114,115, -105,97,110,115,111,32,109,117,99,104,67,101,110,116,117,114,121,100,101,112,105, -99,116,115,99,111,108,117,109,110,115,104,111,117,115,105,110,103,115,99,114,105 -,112,116,115,110,101,120,116,32,116,111,98,101,97,114,105,110,103,109,97,112,112 -,105,110,103,114,101,118,105,115,101,100,106,81,117,101,114,121,40,45,119,105, -100,116,104,58,116,105,116,108,101,34,62,116,111,111,108,116,105,112,83,101,99, -116,105,111,110,100,101,115,105,103,110,115,84,117,114,107,105,115,104,121,111, -117,110,103,101,114,46,109,97,116,99,104,40,125,41,40,41,59,10,10,98,117,114,110 -,105,110,103,111,112,101,114,97,116,101,100,101,103,114,101,101,115,115,111,117, -114,99,101,61,82,105,99,104,97,114,100,99,108,111,115,101,108,121,112,108,97,115 -,116,105,99,101,110,116,114,105,101,115,60,47,116,114,62,13,10,99,111,108,111, -114,58,35,117,108,32,105,100,61,34,112,111,115,115,101,115,115,114,111,108,108, -105,110,103,112,104,121,115,105,99,115,102,97,105,108,105,110,103,101,120,101,99 -,117,116,101,99,111,110,116,101,115,116,108,105,110,107,32,116,111,68,101,102,97 -,117,108,116,60,98,114,32,47,62,10,58,32,116,114,117,101,44,99,104,97,114,116, -101,114,116,111,117,114,105,115,109,99,108,97,115,115,105,99,112,114,111,99,101, -101,100,101,120,112,108,97,105,110,60,47,104,49,62,13,10,111,110,108,105,110,101 -,46,63,120,109,108,32,118,101,104,101,108,112,105,110,103,100,105,97,109,111,110 -,100,117,115,101,32,116,104,101,97,105,114,108,105,110,101,101,110,100,32,45,45, -62,41,46,97,116,116,114,40,114,101,97,100,101,114,115,104,111,115,116,105,110, -103,35,102,102,102,102,102,102,114,101,97,108,105,122,101,86,105,110,99,101,110, -116,115,105,103,110,97,108,115,32,115,114,99,61,34,47,80,114,111,100,117,99,116, -100,101,115,112,105,116,101,100,105,118,101,114,115,101,116,101,108,108,105,110, -103,80,117,98,108,105,99,32,104,101,108,100,32,105,110,74,111,115,101,112,104,32 -,116,104,101,97,116,114,101,97,102,102,101,99,116,115,60,115,116,121,108,101,62, -97,32,108,97,114,103,101,100,111,101,115,110,39,116,108,97,116,101,114,44,32,69, -108,101,109,101,110,116,102,97,118,105,99,111,110,99,114,101,97,116,111,114,72, -117,110,103,97,114,121,65,105,114,112,111,114,116,115,101,101,32,116,104,101,115 -,111,32,116,104,97,116,77,105,99,104,97,101,108,83,121,115,116,101,109,115,80, -114,111,103,114,97,109,115,44,32,97,110,100,32,32,119,105,100,116,104,61,101,38, -113,117,111,116,59,116,114,97,100,105,110,103,108,101,102,116,34,62,10,112,101, -114,115,111,110,115,71,111,108,100,101,110,32,65,102,102,97,105,114,115,103,114, -97,109,109,97,114,102,111,114,109,105,110,103,100,101,115,116,114,111,121,105, -100,101,97,32,111,102,99,97,115,101,32,111,102,111,108,100,101,115,116,32,116, -104,105,115,32,105,115,46,115,114,99,32,61,32,99,97,114,116,111,111,110,114,101, -103,105,115,116,114,67,111,109,109,111,110,115,77,117,115,108,105,109,115,87,104 -,97,116,32,105,115,105,110,32,109,97,110,121,109,97,114,107,105,110,103,114,101, -118,101,97,108,115,73,110,100,101,101,100,44,101,113,117,97,108,108,121,47,115, -104,111,119,95,97,111,117,116,100,111,111,114,101,115,99,97,112,101,40,65,117, -115,116,114,105,97,103,101,110,101,116,105,99,115,121,115,116,101,109,44,73,110, -32,116,104,101,32,115,105,116,116,105,110,103,72,101,32,97,108,115,111,73,115, -108,97,110,100,115,65,99,97,100,101,109,121,10,9,9,60,33,45,45,68,97,110,105,101 -,108,32,98,105,110,100,105,110,103,98,108,111,99,107,34,62,105,109,112,111,115, -101,100,117,116,105,108,105,122,101,65,98,114,97,104,97,109,40,101,120,99,101, -112,116,123,119,105,100,116,104,58,112,117,116,116,105,110,103,41,46,104,116,109 -,108,40,124,124,32,91,93,59,10,68,65,84,65,91,32,42,107,105,116,99,104,101,110, -109,111,117,110,116,101,100,97,99,116,117,97,108,32,100,105,97,108,101,99,116, -109,97,105,110,108,121,32,95,98,108,97,110,107,39,105,110,115,116,97,108,108,101 -,120,112,101,114,116,115,105,102,40,116,121,112,101,73,116,32,97,108,115,111,38, -99,111,112,121,59,32,34,62,84,101,114,109,115,98,111,114,110,32,105,110,79,112, -116,105,111,110,115,101,97,115,116,101,114,110,116,97,108,107,105,110,103,99,111 -,110,99,101,114,110,103,97,105,110,101,100,32,111,110,103,111,105,110,103,106, -117,115,116,105,102,121,99,114,105,116,105,99,115,102,97,99,116,111,114,121,105, -116,115,32,111,119,110,97,115,115,97,117,108,116,105,110,118,105,116,101,100,108 -,97,115,116,105,110,103,104,105,115,32,111,119,110,104,114,101,102,61,34,47,34, -32,114,101,108,61,34,100,101,118,101,108,111,112,99,111,110,99,101,114,116,100, -105,97,103,114,97,109,100,111,108,108,97,114,115,99,108,117,115,116,101,114,112, -104,112,63,105,100,61,97,108,99,111,104,111,108,41,59,125,41,40,41,59,117,115, -105,110,103,32,97,62,60,115,112,97,110,62,118,101,115,115,101,108,115,114,101, -118,105,118,97,108,65,100,100,114,101,115,115,97,109,97,116,101,117,114,97,110, -100,114,111,105,100,97,108,108,101,103,101,100,105,108,108,110,101,115,115,119, -97,108,107,105,110,103,99,101,110,116,101,114,115,113,117,97,108,105,102,121,109 -,97,116,99,104,101,115,117,110,105,102,105,101,100,101,120,116,105,110,99,116,68 -,101,102,101,110,115,101,100,105,101,100,32,105,110,10,9,60,33,45,45,32,99,117, -115,116,111,109,115,108,105,110,107,105,110,103,76,105,116,116,108,101,32,66,111 -,111,107,32,111,102,101,118,101,110,105,110,103,109,105,110,46,106,115,63,97,114 -,101,32,116,104,101,107,111,110,116,97,107,116,116,111,100,97,121,39,115,46,104, -116,109,108,34,32,116,97,114,103,101,116,61,119,101,97,114,105,110,103,65,108, -108,32,82,105,103,59,10,125,41,40,41,59,114,97,105,115,105,110,103,32,65,108,115 -,111,44,32,99,114,117,99,105,97,108,97,98,111,117,116,34,62,100,101,99,108,97, -114,101,45,45,62,10,60,115,99,102,105,114,101,102,111,120,97,115,32,109,117,99, -104,97,112,112,108,105,101,115,105,110,100,101,120,44,32,115,44,32,98,117,116,32 -,116,121,112,101,32,61,32,10,13,10,60,33,45,45,116,111,119,97,114,100,115,82,101 -,99,111,114,100,115,80,114,105,118,97,116,101,70,111,114,101,105,103,110,80,114, -101,109,105,101,114,99,104,111,105,99,101,115,86,105,114,116,117,97,108,114,101, -116,117,114,110,115,67,111,109,109,101,110,116,80,111,119,101,114,101,100,105, -110,108,105,110,101,59,112,111,118,101,114,116,121,99,104,97,109,98,101,114,76, -105,118,105,110,103,32,118,111,108,117,109,101,115,65,110,116,104,111,110,121, -108,111,103,105,110,34,32,82,101,108,97,116,101,100,69,99,111,110,111,109,121, -114,101,97,99,104,101,115,99,117,116,116,105,110,103,103,114,97,118,105,116,121, -108,105,102,101,32,105,110,67,104,97,112,116,101,114,45,115,104,97,100,111,119, -78,111,116,97,98,108,101,60,47,116,100,62,13,10,32,114,101,116,117,114,110,115, -116,97,100,105,117,109,119,105,100,103,101,116,115,118,97,114,121,105,110,103, -116,114,97,118,101,108,115,104,101,108,100,32,98,121,119,104,111,32,97,114,101, -119,111,114,107,32,105,110,102,97,99,117,108,116,121,97,110,103,117,108,97,114, -119,104,111,32,104,97,100,97,105,114,112,111,114,116,116,111,119,110,32,111,102, -10,10,83,111,109,101,32,39,99,108,105,99,107,39,99,104,97,114,103,101,115,107, -101,121,119,111,114,100,105,116,32,119,105,108,108,99,105,116,121,32,111,102,40, -116,104,105,115,41,59,65,110,100,114,101,119,32,117,110,105,113,117,101,32,99, -104,101,99,107,101,100,111,114,32,109,111,114,101,51,48,48,112,120,59,32,114,101 -,116,117,114,110,59,114,115,105,111,110,61,34,112,108,117,103,105,110,115,119, -105,116,104,105,110,32,104,101,114,115,101,108,102,83,116,97,116,105,111,110,70, -101,100,101,114,97,108,118,101,110,116,117,114,101,112,117,98,108,105,115,104, -115,101,110,116,32,116,111,116,101,110,115,105,111,110,97,99,116,114,101,115,115 -,99,111,109,101,32,116,111,102,105,110,103,101,114,115,68,117,107,101,32,111,102 -,112,101,111,112,108,101,44,101,120,112,108,111,105,116,119,104,97,116,32,105, -115,104,97,114,109,111,110,121,97,32,109,97,106,111,114,34,58,34,104,116,116,112 -,105,110,32,104,105,115,32,109,101,110,117,34,62,10,109,111,110,116,104,108,121, -111,102,102,105,99,101,114,99,111,117,110,99,105,108,103,97,105,110,105,110,103, -101,118,101,110,32,105,110,83,117,109,109,97,114,121,100,97,116,101,32,111,102, -108,111,121,97,108,116,121,102,105,116,110,101,115,115,97,110,100,32,119,97,115, -101,109,112,101,114,111,114,115,117,112,114,101,109,101,83,101,99,111,110,100,32 -,104,101,97,114,105,110,103,82,117,115,115,105,97,110,108,111,110,103,101,115, -116,65,108,98,101,114,116,97,108,97,116,101,114,97,108,115,101,116,32,111,102,32 -,115,109,97,108,108,34,62,46,97,112,112,101,110,100,100,111,32,119,105,116,104, -102,101,100,101,114,97,108,98,97,110,107,32,111,102,98,101,110,101,97,116,104,68 -,101,115,112,105,116,101,67,97,112,105,116,97,108,103,114,111,117,110,100,115,41 -,44,32,97,110,100,32,112,101,114,99,101,110,116,105,116,32,102,114,111,109,99, -108,111,115,105,110,103,99,111,110,116,97,105,110,73,110,115,116,101,97,100,102, -105,102,116,101,101,110,97,115,32,119,101,108,108,46,121,97,104,111,111,46,114, -101,115,112,111,110,100,102,105,103,104,116,101,114,111,98,115,99,117,114,101, -114,101,102,108,101,99,116,111,114,103,97,110,105,99,61,32,77,97,116,104,46,101, -100,105,116,105,110,103,111,110,108,105,110,101,32,112,97,100,100,105,110,103,97 -,32,119,104,111,108,101,111,110,101,114,114,111,114,121,101,97,114,32,111,102, -101,110,100,32,111,102,32,98,97,114,114,105,101,114,119,104,101,110,32,105,116, -104,101,97,100,101,114,32,104,111,109,101,32,111,102,114,101,115,117,109,101,100 -,114,101,110,97,109,101,100,115,116,114,111,110,103,62,104,101,97,116,105,110, -103,114,101,116,97,105,110,115,99,108,111,117,100,102,114,119,97,121,32,111,102, -32,77,97,114,99,104,32,49,107,110,111,119,105,110,103,105,110,32,112,97,114,116, -66,101,116,119,101,101,110,108,101,115,115,111,110,115,99,108,111,115,101,115, -116,118,105,114,116,117,97,108,108,105,110,107,115,34,62,99,114,111,115,115,101, -100,69,78,68,32,45,45,62,102,97,109,111,117,115,32,97,119,97,114,100,101,100,76, -105,99,101,110,115,101,72,101,97,108,116,104,32,102,97,105,114,108,121,32,119, -101,97,108,116,104,121,109,105,110,105,109,97,108,65,102,114,105,99,97,110,99, -111,109,112,101,116,101,108,97,98,101,108,34,62,115,105,110,103,105,110,103,102, -97,114,109,101,114,115,66,114,97,115,105,108,41,100,105,115,99,117,115,115,114, -101,112,108,97,99,101,71,114,101,103,111,114,121,102,111,110,116,32,99,111,112, -117,114,115,117,101,100,97,112,112,101,97,114,115,109,97,107,101,32,117,112,114, -111,117,110,100,101,100,98,111,116,104,32,111,102,98,108,111,99,107,101,100,115, -97,119,32,116,104,101,111,102,102,105,99,101,115,99,111,108,111,117,114,115,105, -102,40,100,111,99,117,119,104,101,110,32,104,101,101,110,102,111,114,99,101,112, -117,115,104,40,102,117,65,117,103,117,115,116,32,85,84,70,45,56,34,62,70,97,110, -116,97,115,121,105,110,32,109,111,115,116,105,110,106,117,114,101,100,85,115,117 -,97,108,108,121,102,97,114,109,105,110,103,99,108,111,115,117,114,101,111,98,106 -,101,99,116,32,100,101,102,101,110,99,101,117,115,101,32,111,102,32,77,101,100, -105,99,97,108,60,98,111,100,121,62,10,101,118,105,100,101,110,116,98,101,32,117, -115,101,100,107,101,121,67,111,100,101,115,105,120,116,101,101,110,73,115,108,97 -,109,105,99,35,48,48,48,48,48,48,101,110,116,105,114,101,32,119,105,100,101,108, -121,32,97,99,116,105,118,101,32,40,116,121,112,101,111,102,111,110,101,32,99,97, -110,99,111,108,111,114,32,61,115,112,101,97,107,101,114,101,120,116,101,110,100, -115,80,104,121,115,105,99,115,116,101,114,114,97,105,110,60,116,98,111,100,121, -62,102,117,110,101,114,97,108,118,105,101,119,105,110,103,109,105,100,100,108, -101,32,99,114,105,99,107,101,116,112,114,111,112,104,101,116,115,104,105,102,116 -,101,100,100,111,99,116,111,114,115,82,117,115,115,101,108,108,32,116,97,114,103 -,101,116,99,111,109,112,97,99,116,97,108,103,101,98,114,97,115,111,99,105,97,108 -,45,98,117,108,107,32,111,102,109,97,110,32,97,110,100,60,47,116,100,62,10,32, -104,101,32,108,101,102,116,41,46,118,97,108,40,41,102,97,108,115,101,41,59,108, -111,103,105,99,97,108,98,97,110,107,105,110,103,104,111,109,101,32,116,111,110, -97,109,105,110,103,32,65,114,105,122,111,110,97,99,114,101,100,105,116,115,41,59 -,10,125,41,59,10,102,111,117,110,100,101,114,105,110,32,116,117,114,110,67,111, -108,108,105,110,115,98,101,102,111,114,101,32,66,117,116,32,116,104,101,99,104, -97,114,103,101,100,84,105,116,108,101,34,62,67,97,112,116,97,105,110,115,112,101 -,108,108,101,100,103,111,100,100,101,115,115,84,97,103,32,45,45,62,65,100,100, -105,110,103,58,98,117,116,32,119,97,115,82,101,99,101,110,116,32,112,97,116,105, -101,110,116,98,97,99,107,32,105,110,61,102,97,108,115,101,38,76,105,110,99,111, -108,110,119,101,32,107,110,111,119,67,111,117,110,116,101,114,74,117,100,97,105, -115,109,115,99,114,105,112,116,32,97,108,116,101,114,101,100,39,93,41,59,10,32, -32,104,97,115,32,116,104,101,117,110,99,108,101,97,114,69,118,101,110,116,39,44, -98,111,116,104,32,105,110,110,111,116,32,97,108,108,10,10,60,33,45,45,32,112,108 -,97,99,105,110,103,104,97,114,100,32,116,111,32,99,101,110,116,101,114,115,111, -114,116,32,111,102,99,108,105,101,110,116,115,115,116,114,101,101,116,115,66,101 -,114,110,97,114,100,97,115,115,101,114,116,115,116,101,110,100,32,116,111,102,97 -,110,116,97,115,121,100,111,119,110,32,105,110,104,97,114,98,111,117,114,70,114, -101,101,100,111,109,106,101,119,101,108,114,121,47,97,98,111,117,116,46,46,115, -101,97,114,99,104,108,101,103,101,110,100,115,105,115,32,109,97,100,101,109,111, -100,101,114,110,32,111,110,108,121,32,111,110,111,110,108,121,32,116,111,105,109 -,97,103,101,34,32,108,105,110,101,97,114,32,112,97,105,110,116,101,114,97,110, -100,32,110,111,116,114,97,114,101,108,121,32,97,99,114,111,110,121,109,100,101, -108,105,118,101,114,115,104,111,114,116,101,114,48,48,38,97,109,112,59,97,115,32 -,109,97,110,121,119,105,100,116,104,61,34,47,42,32,60,33,91,67,116,105,116,108, -101,32,61,111,102,32,116,104,101,32,108,111,119,101,115,116,32,112,105,99,107, -101,100,32,101,115,99,97,112,101,100,117,115,101,115,32,111,102,112,101,111,112, -108,101,115,32,80,117,98,108,105,99,77,97,116,116,104,101,119,116,97,99,116,105, -99,115,100,97,109,97,103,101,100,119,97,121,32,102,111,114,108,97,119,115,32,111 -,102,101,97,115,121,32,116,111,32,119,105,110,100,111,119,115,116,114,111,110, -103,32,32,115,105,109,112,108,101,125,99,97,116,99,104,40,115,101,118,101,110, -116,104,105,110,102,111,98,111,120,119,101,110,116,32,116,111,112,97,105,110,116 -,101,100,99,105,116,105,122,101,110,73,32,100,111,110,39,116,114,101,116,114,101 -,97,116,46,32,83,111,109,101,32,119,119,46,34,41,59,10,98,111,109,98,105,110,103 -,109,97,105,108,116,111,58,109,97,100,101,32,105,110,46,32,77,97,110,121,32,99, -97,114,114,105,101,115,124,124,123,125,59,119,105,119,111,114,107,32,111,102,115 -,121,110,111,110,121,109,100,101,102,101,97,116,115,102,97,118,111,114,101,100, -111,112,116,105,99,97,108,112,97,103,101,84,114,97,117,110,108,101,115,115,32, -115,101,110,100,105,110,103,108,101,102,116,34,62,60,99,111,109,83,99,111,114,65 -,108,108,32,116,104,101,106,81,117,101,114,121,46,116,111,117,114,105,115,116,67 -,108,97,115,115,105,99,102,97,108,115,101,34,32,87,105,108,104,101,108,109,115, -117,98,117,114,98,115,103,101,110,117,105,110,101,98,105,115,104,111,112,115,46, -115,112,108,105,116,40,103,108,111,98,97,108,32,102,111,108,108,111,119,115,98, -111,100,121,32,111,102,110,111,109,105,110,97,108,67,111,110,116,97,99,116,115, -101,99,117,108,97,114,108,101,102,116,32,116,111,99,104,105,101,102,108,121,45, -104,105,100,100,101,110,45,98,97,110,110,101,114,60,47,108,105,62,10,10,46,32,87 -,104,101,110,32,105,110,32,98,111,116,104,100,105,115,109,105,115,115,69,120,112 -,108,111,114,101,97,108,119,97,121,115,32,118,105,97,32,116,104,101,115,112,97, -195,177,111,108,119,101,108,102,97,114,101,114,117,108,105,110,103,32,97,114,114 -,97,110,103,101,99,97,112,116,97,105,110,104,105,115,32,115,111,110,114,117,108, -101,32,111,102,104,101,32,116,111,111,107,105,116,115,101,108,102,44,61,48,38,97 -,109,112,59,40,99,97,108,108,101,100,115,97,109,112,108,101,115,116,111,32,109, -97,107,101,99,111,109,47,112,97,103,77,97,114,116,105,110,32,75,101,110,110,101, -100,121,97,99,99,101,112,116,115,102,117,108,108,32,111,102,104,97,110,100,108, -101,100,66,101,115,105,100,101,115,47,47,45,45,62,60,47,97,98,108,101,32,116,111 -,116,97,114,103,101,116,115,101,115,115,101,110,99,101,104,105,109,32,116,111,32 -,105,116,115,32,98,121,32,99,111,109,109,111,110,46,109,105,110,101,114,97,108, -116,111,32,116,97,107,101,119,97,121,115,32,116,111,115,46,111,114,103,47,108,97 -,100,118,105,115,101,100,112,101,110,97,108,116,121,115,105,109,112,108,101,58, -105,102,32,116,104,101,121,76,101,116,116,101,114,115,97,32,115,104,111,114,116, -72,101,114,98,101,114,116,115,116,114,105,107,101,115,32,103,114,111,117,112,115 -,46,108,101,110,103,116,104,102,108,105,103,104,116,115,111,118,101,114,108,97, -112,115,108,111,119,108,121,32,108,101,115,115,101,114,32,115,111,99,105,97,108, -32,60,47,112,62,10,9,9,105,116,32,105,110,116,111,114,97,110,107,101,100,32,114, -97,116,101,32,111,102,117,108,62,13,10,32,32,97,116,116,101,109,112,116,112,97, -105,114,32,111,102,109,97,107,101,32,105,116,75,111,110,116,97,107,116,65,110, -116,111,110,105,111,104,97,118,105,110,103,32,114,97,116,105,110,103,115,32,97, -99,116,105,118,101,115,116,114,101,97,109,115,116,114,97,112,112,101,100,34,41, -46,99,115,115,40,104,111,115,116,105,108,101,108,101,97,100,32,116,111,108,105, -116,116,108,101,32,103,114,111,117,112,115,44,80,105,99,116,117,114,101,45,45,62 -,13,10,13,10,32,114,111,119,115,61,34,32,111,98,106,101,99,116,105,110,118,101, -114,115,101,60,102,111,111,116,101,114,67,117,115,116,111,109,86,62,60,92,47,115 -,99,114,115,111,108,118,105,110,103,67,104,97,109,98,101,114,115,108,97,118,101, -114,121,119,111,117,110,100,101,100,119,104,101,114,101,97,115,33,61,32,39,117, -110,100,102,111,114,32,97,108,108,112,97,114,116,108,121,32,45,114,105,103,104, -116,58,65,114,97,98,105,97,110,98,97,99,107,101,100,32,99,101,110,116,117,114, -121,117,110,105,116,32,111,102,109,111,98,105,108,101,45,69,117,114,111,112,101, -44,105,115,32,104,111,109,101,114,105,115,107,32,111,102,100,101,115,105,114,101 -,100,67,108,105,110,116,111,110,99,111,115,116,32,111,102,97,103,101,32,111,102, -32,98,101,99,111,109,101,32,110,111,110,101,32,111,102,112,38,113,117,111,116,59 -,77,105,100,100,108,101,32,101,97,100,39,41,91,48,67,114,105,116,105,99,115,115, -116,117,100,105,111,115,62,38,99,111,112,121,59,103,114,111,117,112,34,62,97,115 -,115,101,109,98,108,109,97,107,105,110,103,32,112,114,101,115,115,101,100,119, -105,100,103,101,116,46,112,115,58,34,32,63,32,114,101,98,117,105,108,116,98,121, -32,115,111,109,101,70,111,114,109,101,114,32,101,100,105,116,111,114,115,100,101 -,108,97,121,101,100,67,97,110,111,110,105,99,104,97,100,32,116,104,101,112,117, -115,104,105,110,103,99,108,97,115,115,61,34,98,117,116,32,97,114,101,112,97,114, -116,105,97,108,66,97,98,121,108,111,110,98,111,116,116,111,109,32,99,97,114,114, -105,101,114,67,111,109,109,97,110,100,105,116,115,32,117,115,101,65,115,32,119, -105,116,104,99,111,117,114,115,101,115,97,32,116,104,105,114,100,100,101,110,111 -,116,101,115,97,108,115,111,32,105,110,72,111,117,115,116,111,110,50,48,112,120, -59,34,62,97,99,99,117,115,101,100,100,111,117,98,108,101,32,103,111,97,108,32, -111,102,70,97,109,111,117,115,32,41,46,98,105,110,100,40,112,114,105,101,115,116 -,115,32,79,110,108,105,110,101,105,110,32,74,117,108,121,115,116,32,43,32,34,103 -,99,111,110,115,117,108,116,100,101,99,105,109,97,108,104,101,108,112,102,117, -108,114,101,118,105,118,101,100,105,115,32,118,101,114,121,114,39,43,39,105,112, -116,108,111,115,105,110,103,32,102,101,109,97,108,101,115,105,115,32,97,108,115, -111,115,116,114,105,110,103,115,100,97,121,115,32,111,102,97,114,114,105,118,97, -108,102,117,116,117,114,101,32,60,111,98,106,101,99,116,102,111,114,99,105,110, -103,83,116,114,105,110,103,40,34,32,47,62,10,9,9,104,101,114,101,32,105,115,101, -110,99,111,100,101,100,46,32,32,84,104,101,32,98,97,108,108,111,111,110,100,111, -110,101,32,98,121,47,99,111,109,109,111,110,98,103,99,111,108,111,114,108,97,119 -,32,111,102,32,73,110,100,105,97,110,97,97,118,111,105,100,101,100,98,117,116,32 -,116,104,101,50,112,120,32,51,112,120,106,113,117,101,114,121,46,97,102,116,101, -114,32,97,112,111,108,105,99,121,46,109,101,110,32,97,110,100,102,111,111,116, -101,114,45,61,32,116,114,117,101,59,102,111,114,32,117,115,101,115,99,114,101, -101,110,46,73,110,100,105,97,110,32,105,109,97,103,101,32,61,102,97,109,105,108, -121,44,104,116,116,112,58,47,47,32,38,110,98,115,112,59,100,114,105,118,101,114, -115,101,116,101,114,110,97,108,115,97,109,101,32,97,115,110,111,116,105,99,101, -100,118,105,101,119,101,114,115,125,41,40,41,59,10,32,105,115,32,109,111,114,101 -,115,101,97,115,111,110,115,102,111,114,109,101,114,32,116,104,101,32,110,101, -119,105,115,32,106,117,115,116,99,111,110,115,101,110,116,32,83,101,97,114,99, -104,119,97,115,32,116,104,101,119,104,121,32,116,104,101,115,104,105,112,112,101 -,100,98,114,62,60,98,114,62,119,105,100,116,104,58,32,104,101,105,103,104,116,61 -,109,97,100,101,32,111,102,99,117,105,115,105,110,101,105,115,32,116,104,97,116, -97,32,118,101,114,121,32,65,100,109,105,114,97,108,32,102,105,120,101,100,59,110 -,111,114,109,97,108,32,77,105,115,115,105,111,110,80,114,101,115,115,44,32,111, -110,116,97,114,105,111,99,104,97,114,115,101,116,116,114,121,32,116,111,32,105, -110,118,97,100,101,100,61,34,116,114,117,101,34,115,112,97,99,105,110,103,105, -115,32,109,111,115,116,97,32,109,111,114,101,32,116,111,116,97,108,108,121,102, -97,108,108,32,111,102,125,41,59,13,10,32,32,105,109,109,101,110,115,101,116,105, -109,101,32,105,110,115,101,116,32,111,117,116,115,97,116,105,115,102,121,116,111 -,32,102,105,110,100,100,111,119,110,32,116,111,108,111,116,32,111,102,32,80,108, -97,121,101,114,115,105,110,32,74,117,110,101,113,117,97,110,116,117,109,110,111, -116,32,116,104,101,116,105,109,101,32,116,111,100,105,115,116,97,110,116,70,105, -110,110,105,115,104,115,114,99,32,61,32,40,115,105,110,103,108,101,32,104,101, -108,112,32,111,102,71,101,114,109,97,110,32,108,97,119,32,97,110,100,108,97,98, -101,108,101,100,102,111,114,101,115,116,115,99,111,111,107,105,110,103,115,112, -97,99,101,34,62,104,101,97,100,101,114,45,119,101,108,108,32,97,115,83,116,97, -110,108,101,121,98,114,105,100,103,101,115,47,103,108,111,98,97,108,67,114,111, -97,116,105,97,32,65,98,111,117,116,32,91,48,93,59,10,32,32,105,116,44,32,97,110, -100,103,114,111,117,112,101,100,98,101,105,110,103,32,97,41,123,116,104,114,111, -119,104,101,32,109,97,100,101,108,105,103,104,116,101,114,101,116,104,105,99,97, -108,70,70,70,70,70,70,34,98,111,116,116,111,109,34,108,105,107,101,32,97,32,101, -109,112,108,111,121,115,108,105,118,101,32,105,110,97,115,32,115,101,101,110,112 -,114,105,110,116,101,114,109,111,115,116,32,111,102,117,98,45,108,105,110,107, -114,101,106,101,99,116,115,97,110,100,32,117,115,101,105,109,97,103,101,34,62, -115,117,99,99,101,101,100,102,101,101,100,105,110,103,78,117,99,108,101,97,114, -105,110,102,111,114,109,97,116,111,32,104,101,108,112,87,111,109,101,110,39,115, -78,101,105,116,104,101,114,77,101,120,105,99,97,110,112,114,111,116,101,105,110, -60,116,97,98,108,101,32,98,121,32,109,97,110,121,104,101,97,108,116,104,121,108, -97,119,115,117,105,116,100,101,118,105,115,101,100,46,112,117,115,104,40,123,115 -,101,108,108,101,114,115,115,105,109,112,108,121,32,84,104,114,111,117,103,104, -46,99,111,111,107,105,101,32,73,109,97,103,101,40,111,108,100,101,114,34,62,117, -115,46,106,115,34,62,32,83,105,110,99,101,32,117,110,105,118,101,114,115,108,97, -114,103,101,114,32,111,112,101,110,32,116,111,33,45,45,32,101,110,100,108,105, -101,115,32,105,110,39,93,41,59,13,10,32,32,109,97,114,107,101,116,119,104,111,32 -,105,115,32,40,34,68,79,77,67,111,109,97,110,97,103,101,100,111,110,101,32,102, -111,114,116,121,112,101,111,102,32,75,105,110,103,100,111,109,112,114,111,102, -105,116,115,112,114,111,112,111,115,101,116,111,32,115,104,111,119,99,101,110, -116,101,114,59,109,97,100,101,32,105,116,100,114,101,115,115,101,100,119,101,114 -,101,32,105,110,109,105,120,116,117,114,101,112,114,101,99,105,115,101,97,114, -105,115,105,110,103,115,114,99,32,61,32,39,109,97,107,101,32,97,32,115,101,99, -117,114,101,100,66,97,112,116,105,115,116,118,111,116,105,110,103,32,10,9,9,118, -97,114,32,77,97,114,99,104,32,50,103,114,101,119,32,117,112,67,108,105,109,97, -116,101,46,114,101,109,111,118,101,115,107,105,108,108,101,100,119,97,121,32,116 -,104,101,60,47,104,101,97,100,62,102,97,99,101,32,111,102,97,99,116,105,110,103, -32,114,105,103,104,116,34,62,116,111,32,119,111,114,107,114,101,100,117,99,101, -115,104,97,115,32,104,97,100,101,114,101,99,116,101,100,115,104,111,119,40,41,59 -,97,99,116,105,111,110,61,98,111,111,107,32,111,102,97,110,32,97,114,101,97,61, -61,32,34,104,116,116,60,104,101,97,100,101,114,10,60,104,116,109,108,62,99,111, -110,102,111,114,109,102,97,99,105,110,103,32,99,111,111,107,105,101,46,114,101, -108,121,32,111,110,104,111,115,116,101,100,32,46,99,117,115,116,111,109,104,101, -32,119,101,110,116,98,117,116,32,102,111,114,115,112,114,101,97,100,32,70,97,109 -,105,108,121,32,97,32,109,101,97,110,115,111,117,116,32,116,104,101,102,111,114, -117,109,115,46,102,111,111,116,97,103,101,34,62,77,111,98,105,108,67,108,101,109 -,101,110,116,115,34,32,105,100,61,34,97,115,32,104,105,103,104,105,110,116,101, -110,115,101,45,45,62,60,33,45,45,102,101,109,97,108,101,32,105,115,32,115,101, -101,110,105,109,112,108,105,101,100,115,101,116,32,116,104,101,97,32,115,116,97, -116,101,97,110,100,32,104,105,115,102,97,115,116,101,115,116,98,101,115,105,100, -101,115,98,117,116,116,111,110,95,98,111,117,110,100,101,100,34,62,60,105,109, -103,32,73,110,102,111,98,111,120,101,118,101,110,116,115,44,97,32,121,111,117, -110,103,97,110,100,32,97,114,101,78,97,116,105,118,101,32,99,104,101,97,112,101, -114,84,105,109,101,111,117,116,97,110,100,32,104,97,115,101,110,103,105,110,101, -115,119,111,110,32,116,104,101,40,109,111,115,116,108,121,114,105,103,104,116,58 -,32,102,105,110,100,32,97,32,45,98,111,116,116,111,109,80,114,105,110,99,101,32, -97,114,101,97,32,111,102,109,111,114,101,32,111,102,115,101,97,114,99,104,95,110 -,97,116,117,114,101,44,108,101,103,97,108,108,121,112,101,114,105,111,100,44,108 -,97,110,100,32,111,102,111,114,32,119,105,116,104,105,110,100,117,99,101,100,112 -,114,111,118,105,110,103,109,105,115,115,105,108,101,108,111,99,97,108,108,121, -65,103,97,105,110,115,116,116,104,101,32,119,97,121,107,38,113,117,111,116,59, -112,120,59,34,62,13,10,112,117,115,104,101,100,32,97,98,97,110,100,111,110,110, -117,109,101,114,97,108,67,101,114,116,97,105,110,73,110,32,116,104,105,115,109, -111,114,101,32,105,110,111,114,32,115,111,109,101,110,97,109,101,32,105,115,97, -110,100,44,32,105,110,99,114,111,119,110,101,100,73,83,66,78,32,48,45,99,114,101 -,97,116,101,115,79,99,116,111,98,101,114,109,97,121,32,110,111,116,99,101,110, -116,101,114,32,108,97,116,101,32,105,110,68,101,102,101,110,99,101,101,110,97,99 -,116,101,100,119,105,115,104,32,116,111,98,114,111,97,100,108,121,99,111,111,108 -,105,110,103,111,110,108,111,97,100,61,105,116,46,32,84,104,101,114,101,99,111, -118,101,114,77,101,109,98,101,114,115,104,101,105,103,104,116,32,97,115,115,117, -109,101,115,60,104,116,109,108,62,10,112,101,111,112,108,101,46,105,110,32,111, -110,101,32,61,119,105,110,100,111,119,102,111,111,116,101,114,95,97,32,103,111, -111,100,32,114,101,107,108,97,109,97,111,116,104,101,114,115,44,116,111,32,116, -104,105,115,95,99,111,111,107,105,101,112,97,110,101,108,34,62,76,111,110,100, -111,110,44,100,101,102,105,110,101,115,99,114,117,115,104,101,100,98,97,112,116, -105,115,109,99,111,97,115,116,97,108,115,116,97,116,117,115,32,116,105,116,108, -101,34,32,109,111,118,101,32,116,111,108,111,115,116,32,105,110,98,101,116,116, -101,114,32,105,109,112,108,105,101,115,114,105,118,97,108,114,121,115,101,114, -118,101,114,115,32,83,121,115,116,101,109,80,101,114,104,97,112,115,101,115,32, -97,110,100,32,99,111,110,116,101,110,100,102,108,111,119,105,110,103,108,97,115, -116,101,100,32,114,105,115,101,32,105,110,71,101,110,101,115,105,115,118,105,101 -,119,32,111,102,114,105,115,105,110,103,32,115,101,101,109,32,116,111,98,117,116 -,32,105,110,32,98,97,99,107,105,110,103,104,101,32,119,105,108,108,103,105,118, -101,110,32,97,103,105,118,105,110,103,32,99,105,116,105,101,115,46,102,108,111, -119,32,111,102,32,76,97,116,101,114,32,97,108,108,32,98,117,116,72,105,103,104, -119,97,121,111,110,108,121,32,98,121,115,105,103,110,32,111,102,104,101,32,100, -111,101,115,100,105,102,102,101,114,115,98,97,116,116,101,114,121,38,97,109,112, -59,108,97,115,105,110,103,108,101,115,116,104,114,101,97,116,115,105,110,116,101 -,103,101,114,116,97,107,101,32,111,110,114,101,102,117,115,101,100,99,97,108,108 -,101,100,32,61,85,83,38,97,109,112,83,101,101,32,116,104,101,110,97,116,105,118, -101,115,98,121,32,116,104,105,115,115,121,115,116,101,109,46,104,101,97,100,32, -111,102,58,104,111,118,101,114,44,108,101,115,98,105,97,110,115,117,114,110,97, -109,101,97,110,100,32,97,108,108,99,111,109,109,111,110,47,104,101,97,100,101, -114,95,95,112,97,114,97,109,115,72,97,114,118,97,114,100,47,112,105,120,101,108, -46,114,101,109,111,118,97,108,115,111,32,108,111,110,103,114,111,108,101,32,111, -102,106,111,105,110,116,108,121,115,107,121,115,99,114,97,85,110,105,99,111,100, -101,98,114,32,47,62,13,10,65,116,108,97,110,116,97,110,117,99,108,101,117,115,67 -,111,117,110,116,121,44,112,117,114,101,108,121,32,99,111,117,110,116,34,62,101, -97,115,105,108,121,32,98,117,105,108,100,32,97,111,110,99,108,105,99,107,97,32, -103,105,118,101,110,112,111,105,110,116,101,114,104,38,113,117,111,116,59,101, -118,101,110,116,115,32,101,108,115,101,32,123,10,100,105,116,105,111,110,115,110 -,111,119,32,116,104,101,44,32,119,105,116,104,32,109,97,110,32,119,104,111,111, -114,103,47,87,101,98,111,110,101,32,97,110,100,99,97,118,97,108,114,121,72,101, -32,100,105,101,100,115,101,97,116,116,108,101,48,48,44,48,48,48,32,123,119,105, -110,100,111,119,104,97,118,101,32,116,111,105,102,40,119,105,110,100,97,110,100, -32,105,116,115,115,111,108,101,108,121,32,109,38,113,117,111,116,59,114,101,110, -101,119,101,100,68,101,116,114,111,105,116,97,109,111,110,103,115,116,101,105, -116,104,101,114,32,116,104,101,109,32,105,110,83,101,110,97,116,111,114,85,115, -60,47,97,62,60,75,105,110,103,32,111,102,70,114,97,110,99,105,115,45,112,114,111 -,100,117,99,104,101,32,117,115,101,100,97,114,116,32,97,110,100,104,105,109,32, -97,110,100,117,115,101,100,32,98,121,115,99,111,114,105,110,103,97,116,32,104, -111,109,101,116,111,32,104,97,118,101,114,101,108,97,116,101,115,105,98,105,108, -105,116,121,102,97,99,116,105,111,110,66,117,102,102,97,108,111,108,105,110,107, -34,62,60,119,104,97,116,32,104,101,102,114,101,101,32,116,111,67,105,116,121,32, -111,102,99,111,109,101,32,105,110,115,101,99,116,111,114,115,99,111,117,110,116, -101,100,111,110,101,32,100,97,121,110,101,114,118,111,117,115,115,113,117,97,114 -,101,32,125,59,105,102,40,103,111,105,110,32,119,104,97,116,105,109,103,34,32,97 -,108,105,115,32,111,110,108,121,115,101,97,114,99,104,47,116,117,101,115,100,97, -121,108,111,111,115,101,108,121,83,111,108,111,109,111,110,115,101,120,117,97, -108,32,45,32,60,97,32,104,114,109,101,100,105,117,109,34,68,79,32,78,79,84,32,70 -,114,97,110,99,101,44,119,105,116,104,32,97,32,119,97,114,32,97,110,100,115,101, -99,111,110,100,32,116,97,107,101,32,97,32,62,13,10,13,10,13,10,109,97,114,107, -101,116,46,104,105,103,104,119,97,121,100,111,110,101,32,105,110,99,116,105,118, -105,116,121,34,108,97,115,116,34,62,111,98,108,105,103,101,100,114,105,115,101, -32,116,111,34,117,110,100,101,102,105,109,97,100,101,32,116,111,32,69,97,114,108 -,121,32,112,114,97,105,115,101,100,105,110,32,105,116,115,32,102,111,114,32,104, -105,115,97,116,104,108,101,116,101,74,117,112,105,116,101,114,89,97,104,111,111, -33,32,116,101,114,109,101,100,32,115,111,32,109,97,110,121,114,101,97,108,108, -121,32,115,46,32,84,104,101,32,97,32,119,111,109,97,110,63,118,97,108,117,101,61 -,100,105,114,101,99,116,32,114,105,103,104,116,34,32,98,105,99,121,99,108,101,97 -,99,105,110,103,61,34,100,97,121,32,97,110,100,115,116,97,116,105,110,103,82,97, -116,104,101,114,44,104,105,103,104,101,114,32,79,102,102,105,99,101,32,97,114, -101,32,110,111,119,116,105,109,101,115,44,32,119,104,101,110,32,97,32,112,97,121 -,32,102,111,114,111,110,32,116,104,105,115,45,108,105,110,107,34,62,59,98,111, -114,100,101,114,97,114,111,117,110,100,32,97,110,110,117,97,108,32,116,104,101, -32,78,101,119,112,117,116,32,116,104,101,46,99,111,109,34,32,116,97,107,105,110, -32,116,111,97,32,98,114,105,101,102,40,105,110,32,116,104,101,103,114,111,117, -112,115,46,59,32,119,105,100,116,104,101,110,122,121,109,101,115,115,105,109,112 -,108,101,32,105,110,32,108,97,116,101,123,114,101,116,117,114,110,116,104,101, -114,97,112,121,97,32,112,111,105,110,116,98,97,110,110,105,110,103,105,110,107, -115,34,62,10,40,41,59,34,32,114,101,97,32,112,108,97,99,101,92,117,48,48,51,67, -97,97,98,111,117,116,32,97,116,114,62,13,10,9,9,99,99,111,117,110,116,32,103,105 -,118,101,115,32,97,60,83,67,82,73,80,84,82,97,105,108,119,97,121,116,104,101,109 -,101,115,47,116,111,111,108,98,111,120,66,121,73,100,40,34,120,104,117,109,97, -110,115,44,119,97,116,99,104,101,115,105,110,32,115,111,109,101,32,105,102,32,40 -,119,105,99,111,109,105,110,103,32,102,111,114,109,97,116,115,32,85,110,100,101, -114,32,98,117,116,32,104,97,115,104,97,110,100,101,100,32,109,97,100,101,32,98, -121,116,104,97,110,32,105,110,102,101,97,114,32,111,102,100,101,110,111,116,101, -100,47,105,102,114,97,109,101,108,101,102,116,32,105,110,118,111,108,116,97,103, -101,105,110,32,101,97,99,104,97,38,113,117,111,116,59,98,97,115,101,32,111,102, -73,110,32,109,97,110,121,117,110,100,101,114,103,111,114,101,103,105,109,101,115 -,97,99,116,105,111,110,32,60,47,112,62,13,10,60,117,115,116,111,109,86,97,59,38, -103,116,59,60,47,105,109,112,111,114,116,115,111,114,32,116,104,97,116,109,111, -115,116,108,121,32,38,97,109,112,59,114,101,32,115,105,122,101,61,34,60,47,97,62 -,60,47,104,97,32,99,108,97,115,115,112,97,115,115,105,118,101,72,111,115,116,32, -61,32,87,104,101,116,104,101,114,102,101,114,116,105,108,101,86,97,114,105,111, -117,115,61,91,93,59,40,102,117,99,97,109,101,114,97,115,47,62,60,47,116,100,62, -97,99,116,115,32,97,115,73,110,32,115,111,109,101,62,13,10,13,10,60,33,111,114, -103,97,110,105,115,32,60,98,114,32,47,62,66,101,105,106,105,110,103,99,97,116,97 -,108,195,160,100,101,117,116,115,99,104,101,117,114,111,112,101,117,101,117,115, -107,97,114,97,103,97,101,105,108,103,101,115,118,101,110,115,107,97,101,115,112, -97,195,177,97,109,101,110,115,97,106,101,117,115,117,97,114,105,111,116,114,97, -98,97,106,111,109,195,169,120,105,99,111,112,195,161,103,105,110,97,115,105,101, -109,112,114,101,115,105,115,116,101,109,97,111,99,116,117,98,114,101,100,117,114 -,97,110,116,101,97,195,177,97,100,105,114,101,109,112,114,101,115,97,109,111,109 -,101,110,116,111,110,117,101,115,116,114,111,112,114,105,109,101,114,97,116,114, -97,118,195,169,115,103,114,97,99,105,97,115,110,117,101,115,116,114,97,112,114, -111,99,101,115,111,101,115,116,97,100,111,115,99,97,108,105,100,97,100,112,101, -114,115,111,110,97,110,195,186,109,101,114,111,97,99,117,101,114,100,111,109,195 -,186,115,105,99,97,109,105,101,109,98,114,111,111,102,101,114,116,97,115,97,108, -103,117,110,111,115,112,97,195,173,115,101,115,101,106,101,109,112,108,111,100, -101,114,101,99,104,111,97,100,101,109,195,161,115,112,114,105,118,97,100,111,97, -103,114,101,103,97,114,101,110,108,97,99,101,115,112,111,115,105,98,108,101,104, -111,116,101,108,101,115,115,101,118,105,108,108,97,112,114,105,109,101,114,111, -195,186,108,116,105,109,111,101,118,101,110,116,111,115,97,114,99,104,105,118, -111,99,117,108,116,117,114,97,109,117,106,101,114,101,115,101,110,116,114,97,100 -,97,97,110,117,110,99,105,111,101,109,98,97,114,103,111,109,101,114,99,97,100, -111,103,114,97,110,100,101,115,101,115,116,117,100,105,111,109,101,106,111,114, -101,115,102,101,98,114,101,114,111,100,105,115,101,195,177,111,116,117,114,105, -115,109,111,99,195,179,100,105,103,111,112,111,114,116,97,100,97,101,115,112,97, -99,105,111,102,97,109,105,108,105,97,97,110,116,111,110,105,111,112,101,114,109, -105,116,101,103,117,97,114,100,97,114,97,108,103,117,110,97,115,112,114,101,99, -105,111,115,97,108,103,117,105,101,110,115,101,110,116,105,100,111,118,105,115, -105,116,97,115,116,195,173,116,117,108,111,99,111,110,111,99,101,114,115,101,103 -,117,110,100,111,99,111,110,115,101,106,111,102,114,97,110,99,105,97,109,105,110 -,117,116,111,115,115,101,103,117,110,100,97,116,101,110,101,109,111,115,101,102, -101,99,116,111,115,109,195,161,108,97,103,97,115,101,115,105,195,179,110,114,101 -,118,105,115,116,97,103,114,97,110,97,100,97,99,111,109,112,114,97,114,105,110, -103,114,101,115,111,103,97,114,99,195,173,97,97,99,99,105,195,179,110,101,99,117 -,97,100,111,114,113,117,105,101,110,101,115,105,110,99,108,117,115,111,100,101, -98,101,114,195,161,109,97,116,101,114,105,97,104,111,109,98,114,101,115,109,117, -101,115,116,114,97,112,111,100,114,195,173,97,109,97,195,177,97,110,97,195,186, -108,116,105,109,97,101,115,116,97,109,111,115,111,102,105,99,105,97,108,116,97, -109,98,105,101,110,110,105,110,103,195,186,110,115,97,108,117,100,111,115,112, -111,100,101,109,111,115,109,101,106,111,114,97,114,112,111,115,105,116,105,111, -110,98,117,115,105,110,101,115,115,104,111,109,101,112,97,103,101,115,101,99,117 -,114,105,116,121,108,97,110,103,117,97,103,101,115,116,97,110,100,97,114,100,99, -97,109,112,97,105,103,110,102,101,97,116,117,114,101,115,99,97,116,101,103,111, -114,121,101,120,116,101,114,110,97,108,99,104,105,108,100,114,101,110,114,101, -115,101,114,118,101,100,114,101,115,101,97,114,99,104,101,120,99,104,97,110,103, -101,102,97,118,111,114,105,116,101,116,101,109,112,108,97,116,101,109,105,108, -105,116,97,114,121,105,110,100,117,115,116,114,121,115,101,114,118,105,99,101, -115,109,97,116,101,114,105,97,108,112,114,111,100,117,99,116,115,122,45,105,110, -100,101,120,58,99,111,109,109,101,110,116,115,115,111,102,116,119,97,114,101,99, -111,109,112,108,101,116,101,99,97,108,101,110,100,97,114,112,108,97,116,102,111, -114,109,97,114,116,105,99,108,101,115,114,101,113,117,105,114,101,100,109,111, -118,101,109,101,110,116,113,117,101,115,116,105,111,110,98,117,105,108,100,105, -110,103,112,111,108,105,116,105,99,115,112,111,115,115,105,98,108,101,114,101, -108,105,103,105,111,110,112,104,121,115,105,99,97,108,102,101,101,100,98,97,99, -107,114,101,103,105,115,116,101,114,112,105,99,116,117,114,101,115,100,105,115, -97,98,108,101,100,112,114,111,116,111,99,111,108,97,117,100,105,101,110,99,101, -115,101,116,116,105,110,103,115,97,99,116,105,118,105,116,121,101,108,101,109, -101,110,116,115,108,101,97,114,110,105,110,103,97,110,121,116,104,105,110,103,97 -,98,115,116,114,97,99,116,112,114,111,103,114,101,115,115,111,118,101,114,118, -105,101,119,109,97,103,97,122,105,110,101,101,99,111,110,111,109,105,99,116,114, -97,105,110,105,110,103,112,114,101,115,115,117,114,101,118,97,114,105,111,117, -115,32,60,115,116,114,111,110,103,62,112,114,111,112,101,114,116,121,115,104,111 -,112,112,105,110,103,116,111,103,101,116,104,101,114,97,100,118,97,110,99,101, -100,98,101,104,97,118,105,111,114,100,111,119,110,108,111,97,100,102,101,97,116, -117,114,101,100,102,111,111,116,98,97,108,108,115,101,108,101,99,116,101,100,76, -97,110,103,117,97,103,101,100,105,115,116,97,110,99,101,114,101,109,101,109,98, -101,114,116,114,97,99,107,105,110,103,112,97,115,115,119,111,114,100,109,111,100 -,105,102,105,101,100,115,116,117,100,101,110,116,115,100,105,114,101,99,116,108, -121,102,105,103,104,116,105,110,103,110,111,114,116,104,101,114,110,100,97,116, -97,98,97,115,101,102,101,115,116,105,118,97,108,98,114,101,97,107,105,110,103, -108,111,99,97,116,105,111,110,105,110,116,101,114,110,101,116,100,114,111,112, -100,111,119,110,112,114,97,99,116,105,99,101,101,118,105,100,101,110,99,101,102, -117,110,99,116,105,111,110,109,97,114,114,105,97,103,101,114,101,115,112,111,110 -,115,101,112,114,111,98,108,101,109,115,110,101,103,97,116,105,118,101,112,114, -111,103,114,97,109,115,97,110,97,108,121,115,105,115,114,101,108,101,97,115,101, -100,98,97,110,110,101,114,34,62,112,117,114,99,104,97,115,101,112,111,108,105,99 -,105,101,115,114,101,103,105,111,110,97,108,99,114,101,97,116,105,118,101,97,114 -,103,117,109,101,110,116,98,111,111,107,109,97,114,107,114,101,102,101,114,114, -101,114,99,104,101,109,105,99,97,108,100,105,118,105,115,105,111,110,99,97,108, -108,98,97,99,107,115,101,112,97,114,97,116,101,112,114,111,106,101,99,116,115,99 -,111,110,102,108,105,99,116,104,97,114,100,119,97,114,101,105,110,116,101,114, -101,115,116,100,101,108,105,118,101,114,121,109,111,117,110,116,97,105,110,111, -98,116,97,105,110,101,100,61,32,102,97,108,115,101,59,102,111,114,40,118,97,114, -32,97,99,99,101,112,116,101,100,99,97,112,97,99,105,116,121,99,111,109,112,117, -116,101,114,105,100,101,110,116,105,116,121,97,105,114,99,114,97,102,116,101,109 -,112,108,111,121,101,100,112,114,111,112,111,115,101,100,100,111,109,101,115,116 -,105,99,105,110,99,108,117,100,101,115,112,114,111,118,105,100,101,100,104,111, -115,112,105,116,97,108,118,101,114,116,105,99,97,108,99,111,108,108,97,112,115, -101,97,112,112,114,111,97,99,104,112,97,114,116,110,101,114,115,108,111,103,111, -34,62,60,97,100,97,117,103,104,116,101,114,97,117,116,104,111,114,34,32,99,117, -108,116,117,114,97,108,102,97,109,105,108,105,101,115,47,105,109,97,103,101,115, -47,97,115,115,101,109,98,108,121,112,111,119,101,114,102,117,108,116,101,97,99, -104,105,110,103,102,105,110,105,115,104,101,100,100,105,115,116,114,105,99,116, -99,114,105,116,105,99,97,108,99,103,105,45,98,105,110,47,112,117,114,112,111,115 -,101,115,114,101,113,117,105,114,101,115,101,108,101,99,116,105,111,110,98,101, -99,111,109,105,110,103,112,114,111,118,105,100,101,115,97,99,97,100,101,109,105, -99,101,120,101,114,99,105,115,101,97,99,116,117,97,108,108,121,109,101,100,105, -99,105,110,101,99,111,110,115,116,97,110,116,97,99,99,105,100,101,110,116,77,97, -103,97,122,105,110,101,100,111,99,117,109,101,110,116,115,116,97,114,116,105,110 -,103,98,111,116,116,111,109,34,62,111,98,115,101,114,118,101,100,58,32,38,113, -117,111,116,59,101,120,116,101,110,100,101,100,112,114,101,118,105,111,117,115, -83,111,102,116,119,97,114,101,99,117,115,116,111,109,101,114,100,101,99,105,115, -105,111,110,115,116,114,101,110,103,116,104,100,101,116,97,105,108,101,100,115, -108,105,103,104,116,108,121,112,108,97,110,110,105,110,103,116,101,120,116,97, -114,101,97,99,117,114,114,101,110,99,121,101,118,101,114,121,111,110,101,115,116 -,114,97,105,103,104,116,116,114,97,110,115,102,101,114,112,111,115,105,116,105, -118,101,112,114,111,100,117,99,101,100,104,101,114,105,116,97,103,101,115,104, -105,112,112,105,110,103,97,98,115,111,108,117,116,101,114,101,99,101,105,118,101 -,100,114,101,108,101,118,97,110,116,98,117,116,116,111,110,34,32,118,105,111,108 -,101,110,99,101,97,110,121,119,104,101,114,101,98,101,110,101,102,105,116,115, -108,97,117,110,99,104,101,100,114,101,99,101,110,116,108,121,97,108,108,105,97, -110,99,101,102,111,108,108,111,119,101,100,109,117,108,116,105,112,108,101,98, -117,108,108,101,116,105,110,105,110,99,108,117,100,101,100,111,99,99,117,114,114 -,101,100,105,110,116,101,114,110,97,108,36,40,116,104,105,115,41,46,114,101,112, -117,98,108,105,99,62,60,116,114,62,60,116,100,99,111,110,103,114,101,115,115,114 -,101,99,111,114,100,101,100,117,108,116,105,109,97,116,101,115,111,108,117,116, -105,111,110,60,117,108,32,105,100,61,34,100,105,115,99,111,118,101,114,72,111, -109,101,60,47,97,62,119,101,98,115,105,116,101,115,110,101,116,119,111,114,107, -115,97,108,116,104,111,117,103,104,101,110,116,105,114,101,108,121,109,101,109, -111,114,105,97,108,109,101,115,115,97,103,101,115,99,111,110,116,105,110,117,101 -,97,99,116,105,118,101,34,62,115,111,109,101,119,104,97,116,118,105,99,116,111, -114,105,97,87,101,115,116,101,114,110,32,32,116,105,116,108,101,61,34,76,111,99, -97,116,105,111,110,99,111,110,116,114,97,99,116,118,105,115,105,116,111,114,115, -68,111,119,110,108,111,97,100,119,105,116,104,111,117,116,32,114,105,103,104,116 -,34,62,10,109,101,97,115,117,114,101,115,119,105,100,116,104,32,61,32,118,97,114 -,105,97,98,108,101,105,110,118,111,108,118,101,100,118,105,114,103,105,110,105, -97,110,111,114,109,97,108,108,121,104,97,112,112,101,110,101,100,97,99,99,111, -117,110,116,115,115,116,97,110,100,105,110,103,110,97,116,105,111,110,97,108,82, -101,103,105,115,116,101,114,112,114,101,112,97,114,101,100,99,111,110,116,114, -111,108,115,97,99,99,117,114,97,116,101,98,105,114,116,104,100,97,121,115,116, -114,97,116,101,103,121,111,102,102,105,99,105,97,108,103,114,97,112,104,105,99, -115,99,114,105,109,105,110,97,108,112,111,115,115,105,98,108,121,99,111,110,115, -117,109,101,114,80,101,114,115,111,110,97,108,115,112,101,97,107,105,110,103,118 -,97,108,105,100,97,116,101,97,99,104,105,101,118,101,100,46,106,112,103,34,32,47 -,62,109,97,99,104,105,110,101,115,60,47,104,50,62,10,32,32,107,101,121,119,111, -114,100,115,102,114,105,101,110,100,108,121,98,114,111,116,104,101,114,115,99, -111,109,98,105,110,101,100,111,114,105,103,105,110,97,108,99,111,109,112,111,115 -,101,100,101,120,112,101,99,116,101,100,97,100,101,113,117,97,116,101,112,97,107 -,105,115,116,97,110,102,111,108,108,111,119,34,32,118,97,108,117,97,98,108,101, -60,47,108,97,98,101,108,62,114,101,108,97,116,105,118,101,98,114,105,110,103,105 -,110,103,105,110,99,114,101,97,115,101,103,111,118,101,114,110,111,114,112,108, -117,103,105,110,115,47,76,105,115,116,32,111,102,32,72,101,97,100,101,114,34,62, -34,32,110,97,109,101,61,34,32,40,38,113,117,111,116,59,103,114,97,100,117,97,116 -,101,60,47,104,101,97,100,62,10,99,111,109,109,101,114,99,101,109,97,108,97,121, -115,105,97,100,105,114,101,99,116,111,114,109,97,105,110,116,97,105,110,59,104, -101,105,103,104,116,58,115,99,104,101,100,117,108,101,99,104,97,110,103,105,110, -103,98,97,99,107,32,116,111,32,99,97,116,104,111,108,105,99,112,97,116,116,101, -114,110,115,99,111,108,111,114,58,32,35,103,114,101,97,116,101,115,116,115,117, -112,112,108,105,101,115,114,101,108,105,97,98,108,101,60,47,117,108,62,10,9,9,60 -,115,101,108,101,99,116,32,99,105,116,105,122,101,110,115,99,108,111,116,104,105 -,110,103,119,97,116,99,104,105,110,103,60,108,105,32,105,100,61,34,115,112,101, -99,105,102,105,99,99,97,114,114,121,105,110,103,115,101,110,116,101,110,99,101, -60,99,101,110,116,101,114,62,99,111,110,116,114,97,115,116,116,104,105,110,107, -105,110,103,99,97,116,99,104,40,101,41,115,111,117,116,104,101,114,110,77,105,99 -,104,97,101,108,32,109,101,114,99,104,97,110,116,99,97,114,111,117,115,101,108, -112,97,100,100,105,110,103,58,105,110,116,101,114,105,111,114,46,115,112,108,105 -,116,40,34,108,105,122,97,116,105,111,110,79,99,116,111,98,101,114,32,41,123,114 -,101,116,117,114,110,105,109,112,114,111,118,101,100,45,45,38,103,116,59,10,10, -99,111,118,101,114,97,103,101,99,104,97,105,114,109,97,110,46,112,110,103,34,32, -47,62,115,117,98,106,101,99,116,115,82,105,99,104,97,114,100,32,119,104,97,116, -101,118,101,114,112,114,111,98,97,98,108,121,114,101,99,111,118,101,114,121,98, -97,115,101,98,97,108,108,106,117,100,103,109,101,110,116,99,111,110,110,101,99, -116,46,46,99,115,115,34,32,47,62,32,119,101,98,115,105,116,101,114,101,112,111, -114,116,101,100,100,101,102,97,117,108,116,34,47,62,60,47,97,62,13,10,101,108, -101,99,116,114,105,99,115,99,111,116,108,97,110,100,99,114,101,97,116,105,111, -110,113,117,97,110,116,105,116,121,46,32,73,83,66,78,32,48,100,105,100,32,110, -111,116,32,105,110,115,116,97,110,99,101,45,115,101,97,114,99,104,45,34,32,108, -97,110,103,61,34,115,112,101,97,107,101,114,115,67,111,109,112,117,116,101,114, -99,111,110,116,97,105,110,115,97,114,99,104,105,118,101,115,109,105,110,105,115, -116,101,114,114,101,97,99,116,105,111,110,100,105,115,99,111,117,110,116,73,116, -97,108,105,97,110,111,99,114,105,116,101,114,105,97,115,116,114,111,110,103,108, -121,58,32,39,104,116,116,112,58,39,115,99,114,105,112,116,39,99,111,118,101,114, -105,110,103,111,102,102,101,114,105,110,103,97,112,112,101,97,114,101,100,66,114 -,105,116,105,115,104,32,105,100,101,110,116,105,102,121,70,97,99,101,98,111,111, -107,110,117,109,101,114,111,117,115,118,101,104,105,99,108,101,115,99,111,110,99 -,101,114,110,115,65,109,101,114,105,99,97,110,104,97,110,100,108,105,110,103,100 -,105,118,32,105,100,61,34,87,105,108,108,105,97,109,32,112,114,111,118,105,100, -101,114,95,99,111,110,116,101,110,116,97,99,99,117,114,97,99,121,115,101,99,116, -105,111,110,32,97,110,100,101,114,115,111,110,102,108,101,120,105,98,108,101,67, -97,116,101,103,111,114,121,108,97,119,114,101,110,99,101,60,115,99,114,105,112, -116,62,108,97,121,111,117,116,61,34,97,112,112,114,111,118,101,100,32,109,97,120 -,105,109,117,109,104,101,97,100,101,114,34,62,60,47,116,97,98,108,101,62,83,101, -114,118,105,99,101,115,104,97,109,105,108,116,111,110,99,117,114,114,101,110,116 -,32,99,97,110,97,100,105,97,110,99,104,97,110,110,101,108,115,47,116,104,101,109 -,101,115,47,47,97,114,116,105,99,108,101,111,112,116,105,111,110,97,108,112,111, -114,116,117,103,97,108,118,97,108,117,101,61,34,34,105,110,116,101,114,118,97, -108,119,105,114,101,108,101,115,115,101,110,116,105,116,108,101,100,97,103,101, -110,99,105,101,115,83,101,97,114,99,104,34,32,109,101,97,115,117,114,101,100,116 -,104,111,117,115,97,110,100,115,112,101,110,100,105,110,103,38,104,101,108,108, -105,112,59,110,101,119,32,68,97,116,101,34,32,115,105,122,101,61,34,112,97,103, -101,78,97,109,101,109,105,100,100,108,101,34,32,34,32,47,62,60,47,97,62,104,105, -100,100,101,110,34,62,115,101,113,117,101,110,99,101,112,101,114,115,111,110,97, -108,111,118,101,114,102,108,111,119,111,112,105,110,105,111,110,115,105,108,108, -105,110,111,105,115,108,105,110,107,115,34,62,10,9,60,116,105,116,108,101,62,118 -,101,114,115,105,111,110,115,115,97,116,117,114,100,97,121,116,101,114,109,105, -110,97,108,105,116,101,109,112,114,111,112,101,110,103,105,110,101,101,114,115, -101,99,116,105,111,110,115,100,101,115,105,103,110,101,114,112,114,111,112,111, -115,97,108,61,34,102,97,108,115,101,34,69,115,112,97,195,177,111,108,114,101,108 -,101,97,115,101,115,115,117,98,109,105,116,34,32,101,114,38,113,117,111,116,59, -97,100,100,105,116,105,111,110,115,121,109,112,116,111,109,115,111,114,105,101, -110,116,101,100,114,101,115,111,117,114,99,101,114,105,103,104,116,34,62,60,112, -108,101,97,115,117,114,101,115,116,97,116,105,111,110,115,104,105,115,116,111, -114,121,46,108,101,97,118,105,110,103,32,32,98,111,114,100,101,114,61,99,111,110 -,116,101,110,116,115,99,101,110,116,101,114,34,62,46,10,10,83,111,109,101,32,100 -,105,114,101,99,116,101,100,115,117,105,116,97,98,108,101,98,117,108,103,97,114, -105,97,46,115,104,111,119,40,41,59,100,101,115,105,103,110,101,100,71,101,110, -101,114,97,108,32,99,111,110,99,101,112,116,115,69,120,97,109,112,108,101,115, -119,105,108,108,105,97,109,115,79,114,105,103,105,110,97,108,34,62,60,115,112,97 -,110,62,115,101,97,114,99,104,34,62,111,112,101,114,97,116,111,114,114,101,113, -117,101,115,116,115,97,32,38,113,117,111,116,59,97,108,108,111,119,105,110,103, -68,111,99,117,109,101,110,116,114,101,118,105,115,105,111,110,46,32,10,10,84,104 -,101,32,121,111,117,114,115,101,108,102,67,111,110,116,97,99,116,32,109,105,99, -104,105,103,97,110,69,110,103,108,105,115,104,32,99,111,108,117,109,98,105,97, -112,114,105,111,114,105,116,121,112,114,105,110,116,105,110,103,100,114,105,110, -107,105,110,103,102,97,99,105,108,105,116,121,114,101,116,117,114,110,101,100,67 -,111,110,116,101,110,116,32,111,102,102,105,99,101,114,115,82,117,115,115,105,97 -,110,32,103,101,110,101,114,97,116,101,45,56,56,53,57,45,49,34,105,110,100,105, -99,97,116,101,102,97,109,105,108,105,97,114,32,113,117,97,108,105,116,121,109,97 -,114,103,105,110,58,48,32,99,111,110,116,101,110,116,118,105,101,119,112,111,114 -,116,99,111,110,116,97,99,116,115,45,116,105,116,108,101,34,62,112,111,114,116, -97,98,108,101,46,108,101,110,103,116,104,32,101,108,105,103,105,98,108,101,105, -110,118,111,108,118,101,115,97,116,108,97,110,116,105,99,111,110,108,111,97,100, -61,34,100,101,102,97,117,108,116,46,115,117,112,112,108,105,101,100,112,97,121, -109,101,110,116,115,103,108,111,115,115,97,114,121,10,10,65,102,116,101,114,32, -103,117,105,100,97,110,99,101,60,47,116,100,62,60,116,100,101,110,99,111,100,105 -,110,103,109,105,100,100,108,101,34,62,99,97,109,101,32,116,111,32,100,105,115, -112,108,97,121,115,115,99,111,116,116,105,115,104,106,111,110,97,116,104,97,110, -109,97,106,111,114,105,116,121,119,105,100,103,101,116,115,46,99,108,105,110,105 -,99,97,108,116,104,97,105,108,97,110,100,116,101,97,99,104,101,114,115,60,104, -101,97,100,62,10,9,97,102,102,101,99,116,101,100,115,117,112,112,111,114,116,115 -,112,111,105,110,116,101,114,59,116,111,83,116,114,105,110,103,60,47,115,109,97, -108,108,62,111,107,108,97,104,111,109,97,119,105,108,108,32,98,101,32,105,110, -118,101,115,116,111,114,48,34,32,97,108,116,61,34,104,111,108,105,100,97,121,115 -,82,101,115,111,117,114,99,101,108,105,99,101,110,115,101,100,32,40,119,104,105, -99,104,32,46,32,65,102,116,101,114,32,99,111,110,115,105,100,101,114,118,105,115 -,105,116,105,110,103,101,120,112,108,111,114,101,114,112,114,105,109,97,114,121, -32,115,101,97,114,99,104,34,32,97,110,100,114,111,105,100,34,113,117,105,99,107, -108,121,32,109,101,101,116,105,110,103,115,101,115,116,105,109,97,116,101,59,114 -,101,116,117,114,110,32,59,99,111,108,111,114,58,35,32,104,101,105,103,104,116, -61,97,112,112,114,111,118,97,108,44,32,38,113,117,111,116,59,32,99,104,101,99, -107,101,100,46,109,105,110,46,106,115,34,109,97,103,110,101,116,105,99,62,60,47, -97,62,60,47,104,102,111,114,101,99,97,115,116,46,32,87,104,105,108,101,32,116, -104,117,114,115,100,97,121,100,118,101,114,116,105,115,101,38,101,97,99,117,116, -101,59,104,97,115,67,108,97,115,115,101,118,97,108,117,97,116,101,111,114,100, -101,114,105,110,103,101,120,105,115,116,105,110,103,112,97,116,105,101,110,116, -115,32,79,110,108,105,110,101,32,99,111,108,111,114,97,100,111,79,112,116,105, -111,110,115,34,99,97,109,112,98,101,108,108,60,33,45,45,32,101,110,100,60,47,115 -,112,97,110,62,60,60,98,114,32,47,62,13,10,95,112,111,112,117,112,115,124,115,99 -,105,101,110,99,101,115,44,38,113,117,111,116,59,32,113,117,97,108,105,116,121, -32,87,105,110,100,111,119,115,32,97,115,115,105,103,110,101,100,104,101,105,103, -104,116,58,32,60,98,32,99,108,97,115,115,108,101,38,113,117,111,116,59,32,118,97 -,108,117,101,61,34,32,67,111,109,112,97,110,121,101,120,97,109,112,108,101,115, -60,105,102,114,97,109,101,32,98,101,108,105,101,118,101,115,112,114,101,115,101, -110,116,115,109,97,114,115,104,97,108,108,112,97,114,116,32,111,102,32,112,114, -111,112,101,114,108,121,41,46,10,10,84,104,101,32,116,97,120,111,110,111,109,121 -,109,117,99,104,32,111,102,32,60,47,115,112,97,110,62,10,34,32,100,97,116,97,45, -115,114,116,117,103,117,195,170,115,115,99,114,111,108,108,84,111,32,112,114,111 -,106,101,99,116,60,104,101,97,100,62,13,10,97,116,116,111,114,110,101,121,101, -109,112,104,97,115,105,115,115,112,111,110,115,111,114,115,102,97,110,99,121,98, -111,120,119,111,114,108,100,39,115,32,119,105,108,100,108,105,102,101,99,104,101 -,99,107,101,100,61,115,101,115,115,105,111,110,115,112,114,111,103,114,97,109, -109,112,120,59,102,111,110,116,45,32,80,114,111,106,101,99,116,106,111,117,114, -110,97,108,115,98,101,108,105,101,118,101,100,118,97,99,97,116,105,111,110,116, -104,111,109,112,115,111,110,108,105,103,104,116,105,110,103,97,110,100,32,116, -104,101,32,115,112,101,99,105,97,108,32,98,111,114,100,101,114,61,48,99,104,101, -99,107,105,110,103,60,47,116,98,111,100,121,62,60,98,117,116,116,111,110,32,67, -111,109,112,108,101,116,101,99,108,101,97,114,102,105,120,10,60,104,101,97,100, -62,10,97,114,116,105,99,108,101,32,60,115,101,99,116,105,111,110,102,105,110,100 -,105,110,103,115,114,111,108,101,32,105,110,32,112,111,112,117,108,97,114,32,32, -79,99,116,111,98,101,114,119,101,98,115,105,116,101,32,101,120,112,111,115,117, -114,101,117,115,101,100,32,116,111,32,32,99,104,97,110,103,101,115,111,112,101, -114,97,116,101,100,99,108,105,99,107,105,110,103,101,110,116,101,114,105,110,103 -,99,111,109,109,97,110,100,115,105,110,102,111,114,109,101,100,32,110,117,109,98 -,101,114,115,32,32,60,47,100,105,118,62,99,114,101,97,116,105,110,103,111,110,83 -,117,98,109,105,116,109,97,114,121,108,97,110,100,99,111,108,108,101,103,101,115 -,97,110,97,108,121,116,105,99,108,105,115,116,105,110,103,115,99,111,110,116,97, -99,116,46,108,111,103,103,101,100,73,110,97,100,118,105,115,111,114,121,115,105, -98,108,105,110,103,115,99,111,110,116,101,110,116,34,115,38,113,117,111,116,59, -41,115,46,32,84,104,105,115,32,112,97,99,107,97,103,101,115,99,104,101,99,107,98 -,111,120,115,117,103,103,101,115,116,115,112,114,101,103,110,97,110,116,116,111, -109,111,114,114,111,119,115,112,97,99,105,110,103,61,105,99,111,110,46,112,110, -103,106,97,112,97,110,101,115,101,99,111,100,101,98,97,115,101,98,117,116,116, -111,110,34,62,103,97,109,98,108,105,110,103,115,117,99,104,32,97,115,32,44,32, -119,104,105,108,101,32,60,47,115,112,97,110,62,32,109,105,115,115,111,117,114, -105,115,112,111,114,116,105,110,103,116,111,112,58,49,112,120,32,46,60,47,115, -112,97,110,62,116,101,110,115,105,111,110,115,119,105,100,116,104,61,34,50,108, -97,122,121,108,111,97,100,110,111,118,101,109,98,101,114,117,115,101,100,32,105, -110,32,104,101,105,103,104,116,61,34,99,114,105,112,116,34,62,10,38,110,98,115, -112,59,60,47,60,116,114,62,60,116,100,32,104,101,105,103,104,116,58,50,47,112, -114,111,100,117,99,116,99,111,117,110,116,114,121,32,105,110,99,108,117,100,101, -32,102,111,111,116,101,114,34,32,38,108,116,59,33,45,45,32,116,105,116,108,101, -34,62,60,47,106,113,117,101,114,121,46,60,47,102,111,114,109,62,10,40,231,174, -128,228,189,147,41,40,231,185,129,233,171,148,41,104,114,118,97,116,115,107,105, -105,116,97,108,105,97,110,111,114,111,109,195,162,110,196,131,116,195,188,114, -107,195,167,101,216,167,216,177,216,175,217,136,116,97,109,98,105,195,169,110, -110,111,116,105,99,105,97,115,109,101,110,115,97,106,101,115,112,101,114,115,111 -,110,97,115,100,101,114,101,99,104,111,115,110,97,99,105,111,110,97,108,115,101, -114,118,105,99,105,111,99,111,110,116,97,99,116,111,117,115,117,97,114,105,111, -115,112,114,111,103,114,97,109,97,103,111,98,105,101,114,110,111,101,109,112,114 -,101,115,97,115,97,110,117,110,99,105,111,115,118,97,108,101,110,99,105,97,99, -111,108,111,109,98,105,97,100,101,115,112,117,195,169,115,100,101,112,111,114, -116,101,115,112,114,111,121,101,99,116,111,112,114,111,100,117,99,116,111,112, -195,186,98,108,105,99,111,110,111,115,111,116,114,111,115,104,105,115,116,111, -114,105,97,112,114,101,115,101,110,116,101,109,105,108,108,111,110,101,115,109, -101,100,105,97,110,116,101,112,114,101,103,117,110,116,97,97,110,116,101,114,105 -,111,114,114,101,99,117,114,115,111,115,112,114,111,98,108,101,109,97,115,97,110 -,116,105,97,103,111,110,117,101,115,116,114,111,115,111,112,105,110,105,195,179, -110,105,109,112,114,105,109,105,114,109,105,101,110,116,114,97,115,97,109,195, -169,114,105,99,97,118,101,110,100,101,100,111,114,115,111,99,105,101,100,97,100, -114,101,115,112,101,99,116,111,114,101,97,108,105,122,97,114,114,101,103,105,115 -,116,114,111,112,97,108,97,98,114,97,115,105,110,116,101,114,195,169,115,101,110 -,116,111,110,99,101,115,101,115,112,101,99,105,97,108,109,105,101,109,98,114,111 -,115,114,101,97,108,105,100,97,100,99,195,179,114,100,111,98,97,122,97,114,97, -103,111,122,97,112,195,161,103,105,110,97,115,115,111,99,105,97,108,101,115,98, -108,111,113,117,101,97,114,103,101,115,116,105,195,179,110,97,108,113,117,105, -108,101,114,115,105,115,116,101,109,97,115,99,105,101,110,99,105,97,115,99,111, -109,112,108,101,116,111,118,101,114,115,105,195,179,110,99,111,109,112,108,101, -116,97,101,115,116,117,100,105,111,115,112,195,186,98,108,105,99,97,111,98,106, -101,116,105,118,111,97,108,105,99,97,110,116,101,98,117,115,99,97,100,111,114,99 -,97,110,116,105,100,97,100,101,110,116,114,97,100,97,115,97,99,99,105,111,110, -101,115,97,114,99,104,105,118,111,115,115,117,112,101,114,105,111,114,109,97,121 -,111,114,195,173,97,97,108,101,109,97,110,105,97,102,117,110,99,105,195,179,110, -195,186,108,116,105,109,111,115,104,97,99,105,101,110,100,111,97,113,117,101,108 -,108,111,115,101,100,105,99,105,195,179,110,102,101,114,110,97,110,100,111,97, -109,98,105,101,110,116,101,102,97,99,101,98,111,111,107,110,117,101,115,116,114, -97,115,99,108,105,101,110,116,101,115,112,114,111,99,101,115,111,115,98,97,115, -116,97,110,116,101,112,114,101,115,101,110,116,97,114,101,112,111,114,116,97,114 -,99,111,110,103,114,101,115,111,112,117,98,108,105,99,97,114,99,111,109,101,114, -99,105,111,99,111,110,116,114,97,116,111,106,195,179,118,101,110,101,115,100,105 -,115,116,114,105,116,111,116,195,169,99,110,105,99,97,99,111,110,106,117,110,116 -,111,101,110,101,114,103,195,173,97,116,114,97,98,97,106,97,114,97,115,116,117, -114,105,97,115,114,101,99,105,101,110,116,101,117,116,105,108,105,122,97,114,98, -111,108,101,116,195,173,110,115,97,108,118,97,100,111,114,99,111,114,114,101,99, -116,97,116,114,97,98,97,106,111,115,112,114,105,109,101,114,111,115,110,101,103, -111,99,105,111,115,108,105,98,101,114,116,97,100,100,101,116,97,108,108,101,115, -112,97,110,116,97,108,108,97,112,114,195,179,120,105,109,111,97,108,109,101,114, -195,173,97,97,110,105,109,97,108,101,115,113,117,105,195,169,110,101,115,99,111, -114,97,122,195,179,110,115,101,99,99,105,195,179,110,98,117,115,99,97,110,100, -111,111,112,99,105,111,110,101,115,101,120,116,101,114,105,111,114,99,111,110,99 -,101,112,116,111,116,111,100,97,118,195,173,97,103,97,108,101,114,195,173,97,101 -,115,99,114,105,98,105,114,109,101,100,105,99,105,110,97,108,105,99,101,110,99, -105,97,99,111,110,115,117,108,116,97,97,115,112,101,99,116,111,115,99,114,195, -173,116,105,99,97,100,195,179,108,97,114,101,115,106,117,115,116,105,99,105,97, -100,101,98,101,114,195,161,110,112,101,114,195,173,111,100,111,110,101,99,101, -115,105,116,97,109,97,110,116,101,110,101,114,112,101,113,117,101,195,177,111, -114,101,99,105,98,105,100,97,116,114,105,98,117,110,97,108,116,101,110,101,114, -105,102,101,99,97,110,99,105,195,179,110,99,97,110,97,114,105,97,115,100,101,115 -,99,97,114,103,97,100,105,118,101,114,115,111,115,109,97,108,108,111,114,99,97, -114,101,113,117,105,101,114,101,116,195,169,99,110,105,99,111,100,101,98,101,114 -,195,173,97,118,105,118,105,101,110,100,97,102,105,110,97,110,122,97,115,97,100, -101,108,97,110,116,101,102,117,110,99,105,111,110,97,99,111,110,115,101,106,111, -115,100,105,102,195,173,99,105,108,99,105,117,100,97,100,101,115,97,110,116,105, -103,117,97,115,97,118,97,110,122,97,100,97,116,195,169,114,109,105,110,111,117, -110,105,100,97,100,101,115,115,195,161,110,99,104,101,122,99,97,109,112,97,195, -177,97,115,111,102,116,111,110,105,99,114,101,118,105,115,116,97,115,99,111,110, -116,105,101,110,101,115,101,99,116,111,114,101,115,109,111,109,101,110,116,111, -115,102,97,99,117,108,116,97,100,99,114,195,169,100,105,116,111,100,105,118,101, -114,115,97,115,115,117,112,117,101,115,116,111,102,97,99,116,111,114,101,115,115 -,101,103,117,110,100,111,115,112,101,113,117,101,195,177,97,208,179,208,190,208, -180,208,176,208,181,209,129,208,187,208,184,208,181,209,129,209,130,209,140,208, -177,209,139,208,187,208,190,208,177,209,139,209,130,209,140,209,141,209,130,208, -190,208,188,208,149,209,129,208,187,208,184,209,130,208,190,208,179,208,190,208, -188,208,181,208,189,209,143,208,178,209,129,208,181,209,133,209,141,209,130,208, -190,208,185,208,180,208,176,208,182,208,181,208,177,209,139,208,187,208,184,208, -179,208,190,208,180,209,131,208,180,208,181,208,189,209,140,209,141,209,130,208, -190,209,130,208,177,209,139,208,187,208,176,209,129,208,181,208,177,209,143,208, -190,208,180,208,184,208,189,209,129,208,181,208,177,208,181,208,189,208,176,208, -180,208,190,209,129,208,176,208,185,209,130,209,132,208,190,209,130,208,190,208, -189,208,181,208,179,208,190,209,129,208,178,208,190,208,184,209,129,208,178,208, -190,208,185,208,184,208,179,209,128,209,139,209,130,208,190,208,182,208,181,208, -178,209,129,208,181,208,188,209,129,208,178,208,190,209,142,208,187,208,184,209, -136,209,140,209,141,209,130,208,184,209,133,208,191,208,190,208,186,208,176,208, -180,208,189,208,181,208,185,208,180,208,190,208,188,208,176,208,188,208,184,209, -128,208,176,208,187,208,184,208,177,208,190,209,130,208,181,208,188,209,131,209, -133,208,190,209,130,209,143,208,180,208,178,209,131,209,133,209,129,208,181,209, -130,208,184,208,187,209,142,208,180,208,184,208,180,208,181,208,187,208,190,208, -188,208,184,209,128,208,181,209,130,208,181,208,177,209,143,209,129,208,178,208, -190,208,181,208,178,208,184,208,180,208,181,209,135,208,181,208,179,208,190,209, -141,209,130,208,184,208,188,209,129,209,135,208,181,209,130,209,130,208,181,208, -188,209,139,209,134,208,181,208,189,209,139,209,129,209,130,208,176,208,187,208, -178,208,181,208,180,209,140,209,130,208,181,208,188,208,181,208,178,208,190,208, -180,209,139,209,130,208,181,208,177,208,181,208,178,209,139,209,136,208,181,208, -189,208,176,208,188,208,184,209,130,208,184,208,191,208,176,209,130,208,190,208, -188,209,131,208,191,209,128,208,176,208,178,208,187,208,184,209,134,208,176,208, -190,208,180,208,189,208,176,208,179,208,190,208,180,209,139,208,183,208,189,208, -176,209,142,208,188,208,190,208,179,209,131,208,180,209,128,209,131,208,179,208, -178,209,129,208,181,208,185,208,184,208,180,208,181,209,130,208,186,208,184,208, -189,208,190,208,190,208,180,208,189,208,190,208,180,208,181,208,187,208,176,208, -180,208,181,208,187,208,181,209,129,209,128,208,190,208,186,208,184,209,142,208, -189,209,143,208,178,208,181,209,129,209,140,208,149,209,129,209,130,209,140,209, -128,208,176,208,183,208,176,208,189,208,176,209,136,208,184,216,167,217,132,217, -132,217,135,216,167,217,132,216,170,217,138,216,172,217,133,217,138,216,185,216, -174,216,167,216,181,216,169,216,167,217,132,216,176,217,138,216,185,217,132,217, -138,217,135,216,172,216,175,217,138,216,175,216,167,217,132,216,162,217,134,216, -167,217,132,216,177,216,175,216,170,216,173,217,131,217,133,216,181,217,129,216, -173,216,169,217,131,216,167,217,134,216,170,216,167,217,132,217,132,217,138,217, -138,217,131,217,136,217,134,216,180,216,168,217,131,216,169,217,129,217,138,217, -135,216,167,216,168,217,134,216,167,216,170,216,173,217,136,216,167,216,161,216, -163,217,131,216,171,216,177,216,174,217,132,216,167,217,132,216,167,217,132,216, -173,216,168,216,175,217,132,217,138,217,132,216,175,216,177,217,136,216,179,216, -167,216,182,216,186,216,183,216,170,217,131,217,136,217,134,217,135,217,134,216, -167,217,131,216,179,216,167,216,173,216,169,217,134,216,167,216,175,217,138,216, -167,217,132,216,183,216,168,216,185,217,132,217,138,217,131,216,180,217,131,216, -177,216,167,217,138,217,133,217,131,217,134,217,133,217,134,217,135,216,167,216, -180,216,177,217,131,216,169,216,177,216,166,217,138,216,179,217,134,216,180,217, -138,216,183,217,133,216,167,216,176,216,167,216,167,217,132,217,129,217,134,216, -180,216,168,216,167,216,168,216,170,216,185,216,168,216,177,216,177,216,173,217, -133,216,169,217,131,216,167,217,129,216,169,217,138,217,130,217,136,217,132,217, -133,216,177,217,131,216,178,217,131,217,132,217,133,216,169,216,163,216,173,217, -133,216,175,217,130,217,132,216,168,217,138,217,138,216,185,217,134,217,138,216, -181,217,136,216,177,216,169,216,183,216,177,217,138,217,130,216,180,216,167,216, -177,217,131,216,172,217,136,216,167,217,132,216,163,216,174,216,177,217,137,217, -133,216,185,217,134,216,167,216,167,216,168,216,173,216,171,216,185,216,177,217, -136,216,182,216,168,216,180,217,131,217,132,217,133,216,179,216,172,217,132,216, -168,217,134,216,167,217,134,216,174,216,167,217,132,216,175,217,131,216,170,216, -167,216,168,217,131,217,132,217,138,216,169,216,168,216,175,217,136,217,134,216, -163,217,138,216,182,216,167,217,138,217,136,216,172,216,175,217,129,216,177,217, -138,217,130,217,131,216,170,216,168,216,170,216,163,217,129,216,182,217,132,217, -133,216,183,216,168,216,174,216,167,217,131,216,171,216,177,216,168,216,167,216, -177,217,131,216,167,217,129,216,182,217,132,216,167,216,173,217,132,217,137,217, -134,217,129,216,179,217,135,216,163,217,138,216,167,217,133,216,177,216,175,217, -136,216,175,216,163,217,134,217,135,216,167,216,175,217,138,217,134,216,167,216, -167,217,132,216,167,217,134,217,133,216,185,216,177,216,182,216,170,216,185,217, -132,217,133,216,175,216,167,216,174,217,132,217,133,217,133,217,131,217,134,0,0, -0,0,0,0,0,0,1,0,1,0,1,0,1,0,2,0,2,0,2,0,2,0,4,0,4,0,4,0,4,0,0,1,2,3,4,5,6,7,7,6, -5,4,3,2,1,0,8,9,10,11,12,13,14,15,15,14,13,12,11,10,9,8,16,17,18,19,20,21,22,23, -23,22,21,20,19,18,17,16,24,25,26,27,28,29,30,31,31,30,29,28,27,26,25,24,255,255, -255,255,0,0,0,0,0,0,0,0,255,255,255,255,1,0,0,0,2,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0, -3,0,0,0,255,255,0,1,0,0,0,1,0,0,255,255,0,1,0,0,0,8,0,8,0,8,0,8,0,0,0,1,0,2,0,3, -0,4,0,5,0,6,0,7,114,101,115,111,117,114,99,101,115,99,111,117,110,116,114,105, -101,115,113,117,101,115,116,105,111,110,115,101,113,117,105,112,109,101,110,116, -99,111,109,109,117,110,105,116,121,97,118,97,105,108,97,98,108,101,104,105,103, -104,108,105,103,104,116,68,84,68,47,120,104,116,109,108,109,97,114,107,101,116, -105,110,103,107,110,111,119,108,101,100,103,101,115,111,109,101,116,104,105,110, -103,99,111,110,116,97,105,110,101,114,100,105,114,101,99,116,105,111,110,115,117 -,98,115,99,114,105,98,101,97,100,118,101,114,116,105,115,101,99,104,97,114,97,99 -,116,101,114,34,32,118,97,108,117,101,61,34,60,47,115,101,108,101,99,116,62,65, -117,115,116,114,97,108,105,97,34,32,99,108,97,115,115,61,34,115,105,116,117,97, -116,105,111,110,97,117,116,104,111,114,105,116,121,102,111,108,108,111,119,105, -110,103,112,114,105,109,97,114,105,108,121,111,112,101,114,97,116,105,111,110,99 -,104,97,108,108,101,110,103,101,100,101,118,101,108,111,112,101,100,97,110,111, -110,121,109,111,117,115,102,117,110,99,116,105,111,110,32,102,117,110,99,116,105 -,111,110,115,99,111,109,112,97,110,105,101,115,115,116,114,117,99,116,117,114, -101,97,103,114,101,101,109,101,110,116,34,32,116,105,116,108,101,61,34,112,111, -116,101,110,116,105,97,108,101,100,117,99,97,116,105,111,110,97,114,103,117,109, -101,110,116,115,115,101,99,111,110,100,97,114,121,99,111,112,121,114,105,103,104 -,116,108,97,110,103,117,97,103,101,115,101,120,99,108,117,115,105,118,101,99,111 -,110,100,105,116,105,111,110,60,47,102,111,114,109,62,13,10,115,116,97,116,101, -109,101,110,116,97,116,116,101,110,116,105,111,110,66,105,111,103,114,97,112,104 -,121,125,32,101,108,115,101,32,123,10,115,111,108,117,116,105,111,110,115,119, -104,101,110,32,116,104,101,32,65,110,97,108,121,116,105,99,115,116,101,109,112, -108,97,116,101,115,100,97,110,103,101,114,111,117,115,115,97,116,101,108,108,105 -,116,101,100,111,99,117,109,101,110,116,115,112,117,98,108,105,115,104,101,114, -105,109,112,111,114,116,97,110,116,112,114,111,116,111,116,121,112,101,105,110, -102,108,117,101,110,99,101,38,114,97,113,117,111,59,60,47,101,102,102,101,99,116 -,105,118,101,103,101,110,101,114,97,108,108,121,116,114,97,110,115,102,111,114, -109,98,101,97,117,116,105,102,117,108,116,114,97,110,115,112,111,114,116,111,114 -,103,97,110,105,122,101,100,112,117,98,108,105,115,104,101,100,112,114,111,109, -105,110,101,110,116,117,110,116,105,108,32,116,104,101,116,104,117,109,98,110,97 -,105,108,78,97,116,105,111,110,97,108,32,46,102,111,99,117,115,40,41,59,111,118, -101,114,32,116,104,101,32,109,105,103,114,97,116,105,111,110,97,110,110,111,117, -110,99,101,100,102,111,111,116,101,114,34,62,10,101,120,99,101,112,116,105,111, -110,108,101,115,115,32,116,104,97,110,101,120,112,101,110,115,105,118,101,102, -111,114,109,97,116,105,111,110,102,114,97,109,101,119,111,114,107,116,101,114, -114,105,116,111,114,121,110,100,105,99,97,116,105,111,110,99,117,114,114,101,110 -,116,108,121,99,108,97,115,115,78,97,109,101,99,114,105,116,105,99,105,115,109, -116,114,97,100,105,116,105,111,110,101,108,115,101,119,104,101,114,101,65,108, -101,120,97,110,100,101,114,97,112,112,111,105,110,116,101,100,109,97,116,101,114 -,105,97,108,115,98,114,111,97,100,99,97,115,116,109,101,110,116,105,111,110,101, -100,97,102,102,105,108,105,97,116,101,60,47,111,112,116,105,111,110,62,116,114, -101,97,116,109,101,110,116,100,105,102,102,101,114,101,110,116,47,100,101,102,97 -,117,108,116,46,80,114,101,115,105,100,101,110,116,111,110,99,108,105,99,107,61, -34,98,105,111,103,114,97,112,104,121,111,116,104,101,114,119,105,115,101,112,101 -,114,109,97,110,101,110,116,70,114,97,110,195,167,97,105,115,72,111,108,108,121, -119,111,111,100,101,120,112,97,110,115,105,111,110,115,116,97,110,100,97,114,100 -,115,60,47,115,116,121,108,101,62,10,114,101,100,117,99,116,105,111,110,68,101, -99,101,109,98,101,114,32,112,114,101,102,101,114,114,101,100,67,97,109,98,114, -105,100,103,101,111,112,112,111,110,101,110,116,115,66,117,115,105,110,101,115, -115,32,99,111,110,102,117,115,105,111,110,62,10,60,116,105,116,108,101,62,112, -114,101,115,101,110,116,101,100,101,120,112,108,97,105,110,101,100,100,111,101, -115,32,110,111,116,32,119,111,114,108,100,119,105,100,101,105,110,116,101,114, -102,97,99,101,112,111,115,105,116,105,111,110,115,110,101,119,115,112,97,112,101 -,114,60,47,116,97,98,108,101,62,10,109,111,117,110,116,97,105,110,115,108,105, -107,101,32,116,104,101,32,101,115,115,101,110,116,105,97,108,102,105,110,97,110, -99,105,97,108,115,101,108,101,99,116,105,111,110,97,99,116,105,111,110,61,34,47, -97,98,97,110,100,111,110,101,100,69,100,117,99,97,116,105,111,110,112,97,114,115 -,101,73,110,116,40,115,116,97,98,105,108,105,116,121,117,110,97,98,108,101,32, -116,111,60,47,116,105,116,108,101,62,10,114,101,108,97,116,105,111,110,115,78, -111,116,101,32,116,104,97,116,101,102,102,105,99,105,101,110,116,112,101,114,102 -,111,114,109,101,100,116,119,111,32,121,101,97,114,115,83,105,110,99,101,32,116, -104,101,116,104,101,114,101,102,111,114,101,119,114,97,112,112,101,114,34,62,97, -108,116,101,114,110,97,116,101,105,110,99,114,101,97,115,101,100,66,97,116,116, -108,101,32,111,102,112,101,114,99,101,105,118,101,100,116,114,121,105,110,103,32 -,116,111,110,101,99,101,115,115,97,114,121,112,111,114,116,114,97,121,101,100, -101,108,101,99,116,105,111,110,115,69,108,105,122,97,98,101,116,104,60,47,105, -102,114,97,109,101,62,100,105,115,99,111,118,101,114,121,105,110,115,117,114,97, -110,99,101,115,46,108,101,110,103,116,104,59,108,101,103,101,110,100,97,114,121, -71,101,111,103,114,97,112,104,121,99,97,110,100,105,100,97,116,101,99,111,114, -112,111,114,97,116,101,115,111,109,101,116,105,109,101,115,115,101,114,118,105, -99,101,115,46,105,110,104,101,114,105,116,101,100,60,47,115,116,114,111,110,103, -62,67,111,109,109,117,110,105,116,121,114,101,108,105,103,105,111,117,115,108, -111,99,97,116,105,111,110,115,67,111,109,109,105,116,116,101,101,98,117,105,108, -100,105,110,103,115,116,104,101,32,119,111,114,108,100,110,111,32,108,111,110, -103,101,114,98,101,103,105,110,110,105,110,103,114,101,102,101,114,101,110,99, -101,99,97,110,110,111,116,32,98,101,102,114,101,113,117,101,110,99,121,116,121, -112,105,99,97,108,108,121,105,110,116,111,32,116,104,101,32,114,101,108,97,116, -105,118,101,59,114,101,99,111,114,100,105,110,103,112,114,101,115,105,100,101, -110,116,105,110,105,116,105,97,108,108,121,116,101,99,104,110,105,113,117,101, -116,104,101,32,111,116,104,101,114,105,116,32,99,97,110,32,98,101,101,120,105, -115,116,101,110,99,101,117,110,100,101,114,108,105,110,101,116,104,105,115,32, -116,105,109,101,116,101,108,101,112,104,111,110,101,105,116,101,109,115,99,111, -112,101,112,114,97,99,116,105,99,101,115,97,100,118,97,110,116,97,103,101,41,59, -114,101,116,117,114,110,32,70,111,114,32,111,116,104,101,114,112,114,111,118,105 -,100,105,110,103,100,101,109,111,99,114,97,99,121,98,111,116,104,32,116,104,101, -32,101,120,116,101,110,115,105,118,101,115,117,102,102,101,114,105,110,103,115, -117,112,112,111,114,116,101,100,99,111,109,112,117,116,101,114,115,32,102,117, -110,99,116,105,111,110,112,114,97,99,116,105,99,97,108,115,97,105,100,32,116,104 -,97,116,105,116,32,109,97,121,32,98,101,69,110,103,108,105,115,104,60,47,102,114 -,111,109,32,116,104,101,32,115,99,104,101,100,117,108,101,100,100,111,119,110, -108,111,97,100,115,60,47,108,97,98,101,108,62,10,115,117,115,112,101,99,116,101, -100,109,97,114,103,105,110,58,32,48,115,112,105,114,105,116,117,97,108,60,47,104 -,101,97,100,62,10,10,109,105,99,114,111,115,111,102,116,103,114,97,100,117,97, -108,108,121,100,105,115,99,117,115,115,101,100,104,101,32,98,101,99,97,109,101, -101,120,101,99,117,116,105,118,101,106,113,117,101,114,121,46,106,115,104,111, -117,115,101,104,111,108,100,99,111,110,102,105,114,109,101,100,112,117,114,99, -104,97,115,101,100,108,105,116,101,114,97,108,108,121,100,101,115,116,114,111, -121,101,100,117,112,32,116,111,32,116,104,101,118,97,114,105,97,116,105,111,110, -114,101,109,97,105,110,105,110,103,105,116,32,105,115,32,110,111,116,99,101,110, -116,117,114,105,101,115,74,97,112,97,110,101,115,101,32,97,109,111,110,103,32, -116,104,101,99,111,109,112,108,101,116,101,100,97,108,103,111,114,105,116,104, -109,105,110,116,101,114,101,115,116,115,114,101,98,101,108,108,105,111,110,117, -110,100,101,102,105,110,101,100,101,110,99,111,117,114,97,103,101,114,101,115, -105,122,97,98,108,101,105,110,118,111,108,118,105,110,103,115,101,110,115,105, -116,105,118,101,117,110,105,118,101,114,115,97,108,112,114,111,118,105,115,105, -111,110,40,97,108,116,104,111,117,103,104,102,101,97,116,117,114,105,110,103,99, -111,110,100,117,99,116,101,100,41,44,32,119,104,105,99,104,32,99,111,110,116,105 -,110,117,101,100,45,104,101,97,100,101,114,34,62,70,101,98,114,117,97,114,121,32 -,110,117,109,101,114,111,117,115,32,111,118,101,114,102,108,111,119,58,99,111, -109,112,111,110,101,110,116,102,114,97,103,109,101,110,116,115,101,120,99,101, -108,108,101,110,116,99,111,108,115,112,97,110,61,34,116,101,99,104,110,105,99,97 -,108,110,101,97,114,32,116,104,101,32,65,100,118,97,110,99,101,100,32,115,111, -117,114,99,101,32,111,102,101,120,112,114,101,115,115,101,100,72,111,110,103,32, -75,111,110,103,32,70,97,99,101,98,111,111,107,109,117,108,116,105,112,108,101,32 -,109,101,99,104,97,110,105,115,109,101,108,101,118,97,116,105,111,110,111,102, -102,101,110,115,105,118,101,60,47,102,111,114,109,62,10,9,115,112,111,110,115, -111,114,101,100,100,111,99,117,109,101,110,116,46,111,114,32,38,113,117,111,116, -59,116,104,101,114,101,32,97,114,101,116,104,111,115,101,32,119,104,111,109,111, -118,101,109,101,110,116,115,112,114,111,99,101,115,115,101,115,100,105,102,102, -105,99,117,108,116,115,117,98,109,105,116,116,101,100,114,101,99,111,109,109,101 -,110,100,99,111,110,118,105,110,99,101,100,112,114,111,109,111,116,105,110,103, -34,32,119,105,100,116,104,61,34,46,114,101,112,108,97,99,101,40,99,108,97,115, -115,105,99,97,108,99,111,97,108,105,116,105,111,110,104,105,115,32,102,105,114, -115,116,100,101,99,105,115,105,111,110,115,97,115,115,105,115,116,97,110,116,105 -,110,100,105,99,97,116,101,100,101,118,111,108,117,116,105,111,110,45,119,114,97 -,112,112,101,114,34,101,110,111,117,103,104,32,116,111,97,108,111,110,103,32,116 -,104,101,100,101,108,105,118,101,114,101,100,45,45,62,13,10,60,33,45,45,65,109, -101,114,105,99,97,110,32,112,114,111,116,101,99,116,101,100,78,111,118,101,109, -98,101,114,32,60,47,115,116,121,108,101,62,60,102,117,114,110,105,116,117,114, -101,73,110,116,101,114,110,101,116,32,32,111,110,98,108,117,114,61,34,115,117, -115,112,101,110,100,101,100,114,101,99,105,112,105,101,110,116,98,97,115,101,100 -,32,111,110,32,77,111,114,101,111,118,101,114,44,97,98,111,108,105,115,104,101, -100,99,111,108,108,101,99,116,101,100,119,101,114,101,32,109,97,100,101,101,109, -111,116,105,111,110,97,108,101,109,101,114,103,101,110,99,121,110,97,114,114,97, -116,105,118,101,97,100,118,111,99,97,116,101,115,112,120,59,98,111,114,100,101, -114,99,111,109,109,105,116,116,101,100,100,105,114,61,34,108,116,114,34,101,109, -112,108,111,121,101,101,115,114,101,115,101,97,114,99,104,46,32,115,101,108,101, -99,116,101,100,115,117,99,99,101,115,115,111,114,99,117,115,116,111,109,101,114, -115,100,105,115,112,108,97,121,101,100,83,101,112,116,101,109,98,101,114,97,100, -100,67,108,97,115,115,40,70,97,99,101,98,111,111,107,32,115,117,103,103,101,115, -116,101,100,97,110,100,32,108,97,116,101,114,111,112,101,114,97,116,105,110,103, -101,108,97,98,111,114,97,116,101,83,111,109,101,116,105,109,101,115,73,110,115, -116,105,116,117,116,101,99,101,114,116,97,105,110,108,121,105,110,115,116,97,108 -,108,101,100,102,111,108,108,111,119,101,114,115,74,101,114,117,115,97,108,101, -109,116,104,101,121,32,104,97,118,101,99,111,109,112,117,116,105,110,103,103,101 -,110,101,114,97,116,101,100,112,114,111,118,105,110,99,101,115,103,117,97,114,97 -,110,116,101,101,97,114,98,105,116,114,97,114,121,114,101,99,111,103,110,105,122 -,101,119,97,110,116,101,100,32,116,111,112,120,59,119,105,100,116,104,58,116,104 -,101,111,114,121,32,111,102,98,101,104,97,118,105,111,117,114,87,104,105,108,101 -,32,116,104,101,101,115,116,105,109,97,116,101,100,98,101,103,97,110,32,116,111, -32,105,116,32,98,101,99,97,109,101,109,97,103,110,105,116,117,100,101,109,117, -115,116,32,104,97,118,101,109,111,114,101,32,116,104,97,110,68,105,114,101,99, -116,111,114,121,101,120,116,101,110,115,105,111,110,115,101,99,114,101,116,97, -114,121,110,97,116,117,114,97,108,108,121,111,99,99,117,114,114,105,110,103,118, -97,114,105,97,98,108,101,115,103,105,118,101,110,32,116,104,101,112,108,97,116, -102,111,114,109,46,60,47,108,97,98,101,108,62,60,102,97,105,108,101,100,32,116, -111,99,111,109,112,111,117,110,100,115,107,105,110,100,115,32,111,102,32,115,111 -,99,105,101,116,105,101,115,97,108,111,110,103,115,105,100,101,32,45,45,38,103, -116,59,10,10,115,111,117,116,104,119,101,115,116,116,104,101,32,114,105,103,104, -116,114,97,100,105,97,116,105,111,110,109,97,121,32,104,97,118,101,32,117,110, -101,115,99,97,112,101,40,115,112,111,107,101,110,32,105,110,34,32,104,114,101, -102,61,34,47,112,114,111,103,114,97,109,109,101,111,110,108,121,32,116,104,101, -32,99,111,109,101,32,102,114,111,109,100,105,114,101,99,116,111,114,121,98,117, -114,105,101,100,32,105,110,97,32,115,105,109,105,108,97,114,116,104,101,121,32, -119,101,114,101,60,47,102,111,110,116,62,60,47,78,111,114,119,101,103,105,97,110 -,115,112,101,99,105,102,105,101,100,112,114,111,100,117,99,105,110,103,112,97, -115,115,101,110,103,101,114,40,110,101,119,32,68,97,116,101,116,101,109,112,111, -114,97,114,121,102,105,99,116,105,111,110,97,108,65,102,116,101,114,32,116,104, -101,101,113,117,97,116,105,111,110,115,100,111,119,110,108,111,97,100,46,114,101 -,103,117,108,97,114,108,121,100,101,118,101,108,111,112,101,114,97,98,111,118, -101,32,116,104,101,108,105,110,107,101,100,32,116,111,112,104,101,110,111,109, -101,110,97,112,101,114,105,111,100,32,111,102,116,111,111,108,116,105,112,34,62, -115,117,98,115,116,97,110,99,101,97,117,116,111,109,97,116,105,99,97,115,112,101 -,99,116,32,111,102,65,109,111,110,103,32,116,104,101,99,111,110,110,101,99,116, -101,100,101,115,116,105,109,97,116,101,115,65,105,114,32,70,111,114,99,101,115, -121,115,116,101,109,32,111,102,111,98,106,101,99,116,105,118,101,105,109,109,101 -,100,105,97,116,101,109,97,107,105,110,103,32,105,116,112,97,105,110,116,105,110 -,103,115,99,111,110,113,117,101,114,101,100,97,114,101,32,115,116,105,108,108, -112,114,111,99,101,100,117,114,101,103,114,111,119,116,104,32,111,102,104,101,97 -,100,101,100,32,98,121,69,117,114,111,112,101,97,110,32,100,105,118,105,115,105, -111,110,115,109,111,108,101,99,117,108,101,115,102,114,97,110,99,104,105,115,101 -,105,110,116,101,110,116,105,111,110,97,116,116,114,97,99,116,101,100,99,104,105 -,108,100,104,111,111,100,97,108,115,111,32,117,115,101,100,100,101,100,105,99,97 -,116,101,100,115,105,110,103,97,112,111,114,101,100,101,103,114,101,101,32,111, -102,102,97,116,104,101,114,32,111,102,99,111,110,102,108,105,99,116,115,60,47,97 -,62,60,47,112,62,10,99,97,109,101,32,102,114,111,109,119,101,114,101,32,117,115, -101,100,110,111,116,101,32,116,104,97,116,114,101,99,101,105,118,105,110,103,69, -120,101,99,117,116,105,118,101,101,118,101,110,32,109,111,114,101,97,99,99,101, -115,115,32,116,111,99,111,109,109,97,110,100,101,114,80,111,108,105,116,105,99, -97,108,109,117,115,105,99,105,97,110,115,100,101,108,105,99,105,111,117,115,112, -114,105,115,111,110,101,114,115,97,100,118,101,110,116,32,111,102,85,84,70,45,56 -,34,32,47,62,60,33,91,67,68,65,84,65,91,34,62,67,111,110,116,97,99,116,83,111, -117,116,104,101,114,110,32,98,103,99,111,108,111,114,61,34,115,101,114,105,101, -115,32,111,102,46,32,73,116,32,119,97,115,32,105,110,32,69,117,114,111,112,101, -112,101,114,109,105,116,116,101,100,118,97,108,105,100,97,116,101,46,97,112,112, -101,97,114,105,110,103,111,102,102,105,99,105,97,108,115,115,101,114,105,111,117 -,115,108,121,45,108,97,110,103,117,97,103,101,105,110,105,116,105,97,116,101,100 -,101,120,116,101,110,100,105,110,103,108,111,110,103,45,116,101,114,109,105,110, -102,108,97,116,105,111,110,115,117,99,104,32,116,104,97,116,103,101,116,67,111, -111,107,105,101,109,97,114,107,101,100,32,98,121,60,47,98,117,116,116,111,110,62 -,105,109,112,108,101,109,101,110,116,98,117,116,32,105,116,32,105,115,105,110,99 -,114,101,97,115,101,115,100,111,119,110,32,116,104,101,32,114,101,113,117,105, -114,105,110,103,100,101,112,101,110,100,101,110,116,45,45,62,10,60,33,45,45,32, -105,110,116,101,114,118,105,101,119,87,105,116,104,32,116,104,101,32,99,111,112, -105,101,115,32,111,102,99,111,110,115,101,110,115,117,115,119,97,115,32,98,117, -105,108,116,86,101,110,101,122,117,101,108,97,40,102,111,114,109,101,114,108,121 -,116,104,101,32,115,116,97,116,101,112,101,114,115,111,110,110,101,108,115,116, -114,97,116,101,103,105,99,102,97,118,111,117,114,32,111,102,105,110,118,101,110, -116,105,111,110,87,105,107,105,112,101,100,105,97,99,111,110,116,105,110,101,110 -,116,118,105,114,116,117,97,108,108,121,119,104,105,99,104,32,119,97,115,112,114 -,105,110,99,105,112,108,101,67,111,109,112,108,101,116,101,32,105,100,101,110, -116,105,99,97,108,115,104,111,119,32,116,104,97,116,112,114,105,109,105,116,105, -118,101,97,119,97,121,32,102,114,111,109,109,111,108,101,99,117,108,97,114,112, -114,101,99,105,115,101,108,121,100,105,115,115,111,108,118,101,100,85,110,100, -101,114,32,116,104,101,118,101,114,115,105,111,110,61,34,62,38,110,98,115,112,59 -,60,47,73,116,32,105,115,32,116,104,101,32,84,104,105,115,32,105,115,32,119,105, -108,108,32,104,97,118,101,111,114,103,97,110,105,115,109,115,115,111,109,101,32, -116,105,109,101,70,114,105,101,100,114,105,99,104,119,97,115,32,102,105,114,115, -116,116,104,101,32,111,110,108,121,32,102,97,99,116,32,116,104,97,116,102,111, -114,109,32,105,100,61,34,112,114,101,99,101,100,105,110,103,84,101,99,104,110, -105,99,97,108,112,104,121,115,105,99,105,115,116,111,99,99,117,114,115,32,105, -110,110,97,118,105,103,97,116,111,114,115,101,99,116,105,111,110,34,62,115,112, -97,110,32,105,100,61,34,115,111,117,103,104,116,32,116,111,98,101,108,111,119,32 -,116,104,101,115,117,114,118,105,118,105,110,103,125,60,47,115,116,121,108,101, -62,104,105,115,32,100,101,97,116,104,97,115,32,105,110,32,116,104,101,99,97,117, -115,101,100,32,98,121,112,97,114,116,105,97,108,108,121,101,120,105,115,116,105, -110,103,32,117,115,105,110,103,32,116,104,101,119,97,115,32,103,105,118,101,110, -97,32,108,105,115,116,32,111,102,108,101,118,101,108,115,32,111,102,110,111,116, -105,111,110,32,111,102,79,102,102,105,99,105,97,108,32,100,105,115,109,105,115, -115,101,100,115,99,105,101,110,116,105,115,116,114,101,115,101,109,98,108,101, -115,100,117,112,108,105,99,97,116,101,101,120,112,108,111,115,105,118,101,114, -101,99,111,118,101,114,101,100,97,108,108,32,111,116,104,101,114,103,97,108,108, -101,114,105,101,115,123,112,97,100,100,105,110,103,58,112,101,111,112,108,101,32 -,111,102,114,101,103,105,111,110,32,111,102,97,100,100,114,101,115,115,101,115, -97,115,115,111,99,105,97,116,101,105,109,103,32,97,108,116,61,34,105,110,32,109, -111,100,101,114,110,115,104,111,117,108,100,32,98,101,109,101,116,104,111,100,32 -,111,102,114,101,112,111,114,116,105,110,103,116,105,109,101,115,116,97,109,112, -110,101,101,100,101,100,32,116,111,116,104,101,32,71,114,101,97,116,114,101,103, -97,114,100,105,110,103,115,101,101,109,101,100,32,116,111,118,105,101,119,101, -100,32,97,115,105,109,112,97,99,116,32,111,110,105,100,101,97,32,116,104,97,116, -116,104,101,32,87,111,114,108,100,104,101,105,103,104,116,32,111,102,101,120,112 -,97,110,100,105,110,103,84,104,101,115,101,32,97,114,101,99,117,114,114,101,110, -116,34,62,99,97,114,101,102,117,108,108,121,109,97,105,110,116,97,105,110,115,99 -,104,97,114,103,101,32,111,102,67,108,97,115,115,105,99,97,108,97,100,100,114, -101,115,115,101,100,112,114,101,100,105,99,116,101,100,111,119,110,101,114,115, -104,105,112,60,100,105,118,32,105,100,61,34,114,105,103,104,116,34,62,13,10,114, -101,115,105,100,101,110,99,101,108,101,97,118,101,32,116,104,101,99,111,110,116, -101,110,116,34,62,97,114,101,32,111,102,116,101,110,32,32,125,41,40,41,59,13,10, -112,114,111,98,97,98,108,121,32,80,114,111,102,101,115,115,111,114,45,98,117,116 -,116,111,110,34,32,114,101,115,112,111,110,100,101,100,115,97,121,115,32,116,104 -,97,116,104,97,100,32,116,111,32,98,101,112,108,97,99,101,100,32,105,110,72,117, -110,103,97,114,105,97,110,115,116,97,116,117,115,32,111,102,115,101,114,118,101, -115,32,97,115,85,110,105,118,101,114,115,97,108,101,120,101,99,117,116,105,111, -110,97,103,103,114,101,103,97,116,101,102,111,114,32,119,104,105,99,104,105,110, -102,101,99,116,105,111,110,97,103,114,101,101,100,32,116,111,104,111,119,101,118 -,101,114,44,32,112,111,112,117,108,97,114,34,62,112,108,97,99,101,100,32,111,110 -,99,111,110,115,116,114,117,99,116,101,108,101,99,116,111,114,97,108,115,121,109 -,98,111,108,32,111,102,105,110,99,108,117,100,105,110,103,114,101,116,117,114, -110,32,116,111,97,114,99,104,105,116,101,99,116,67,104,114,105,115,116,105,97, -110,112,114,101,118,105,111,117,115,32,108,105,118,105,110,103,32,105,110,101,97 -,115,105,101,114,32,116,111,112,114,111,102,101,115,115,111,114,10,38,108,116,59 -,33,45,45,32,101,102,102,101,99,116,32,111,102,97,110,97,108,121,116,105,99,115, -119,97,115,32,116,97,107,101,110,119,104,101,114,101,32,116,104,101,116,111,111, -107,32,111,118,101,114,98,101,108,105,101,102,32,105,110,65,102,114,105,107,97, -97,110,115,97,115,32,102,97,114,32,97,115,112,114,101,118,101,110,116,101,100, -119,111,114,107,32,119,105,116,104,97,32,115,112,101,99,105,97,108,60,102,105, -101,108,100,115,101,116,67,104,114,105,115,116,109,97,115,82,101,116,114,105,101 -,118,101,100,10,10,73,110,32,116,104,101,32,98,97,99,107,32,105,110,116,111,110, -111,114,116,104,101,97,115,116,109,97,103,97,122,105,110,101,115,62,60,115,116, -114,111,110,103,62,99,111,109,109,105,116,116,101,101,103,111,118,101,114,110, -105,110,103,103,114,111,117,112,115,32,111,102,115,116,111,114,101,100,32,105, -110,101,115,116,97,98,108,105,115,104,97,32,103,101,110,101,114,97,108,105,116, -115,32,102,105,114,115,116,116,104,101,105,114,32,111,119,110,112,111,112,117, -108,97,116,101,100,97,110,32,111,98,106,101,99,116,67,97,114,105,98,98,101,97, -110,97,108,108,111,119,32,116,104,101,100,105,115,116,114,105,99,116,115,119,105 -,115,99,111,110,115,105,110,108,111,99,97,116,105,111,110,46,59,32,119,105,100, -116,104,58,32,105,110,104,97,98,105,116,101,100,83,111,99,105,97,108,105,115,116 -,74,97,110,117,97,114,121,32,49,60,47,102,111,111,116,101,114,62,115,105,109,105 -,108,97,114,108,121,99,104,111,105,99,101,32,111,102,116,104,101,32,115,97,109, -101,32,115,112,101,99,105,102,105,99,32,98,117,115,105,110,101,115,115,32,84,104 -,101,32,102,105,114,115,116,46,108,101,110,103,116,104,59,32,100,101,115,105,114 -,101,32,116,111,100,101,97,108,32,119,105,116,104,115,105,110,99,101,32,116,104, -101,117,115,101,114,65,103,101,110,116,99,111,110,99,101,105,118,101,100,105,110 -,100,101,120,46,112,104,112,97,115,32,38,113,117,111,116,59,101,110,103,97,103, -101,32,105,110,114,101,99,101,110,116,108,121,44,102,101,119,32,121,101,97,114, -115,119,101,114,101,32,97,108,115,111,10,60,104,101,97,100,62,10,60,101,100,105, -116,101,100,32,98,121,97,114,101,32,107,110,111,119,110,99,105,116,105,101,115, -32,105,110,97,99,99,101,115,115,107,101,121,99,111,110,100,101,109,110,101,100, -97,108,115,111,32,104,97,118,101,115,101,114,118,105,99,101,115,44,102,97,109, -105,108,121,32,111,102,83,99,104,111,111,108,32,111,102,99,111,110,118,101,114, -116,101,100,110,97,116,117,114,101,32,111,102,32,108,97,110,103,117,97,103,101, -109,105,110,105,115,116,101,114,115,60,47,111,98,106,101,99,116,62,116,104,101, -114,101,32,105,115,32,97,32,112,111,112,117,108,97,114,115,101,113,117,101,110, -99,101,115,97,100,118,111,99,97,116,101,100,84,104,101,121,32,119,101,114,101,97 -,110,121,32,111,116,104,101,114,108,111,99,97,116,105,111,110,61,101,110,116,101 -,114,32,116,104,101,109,117,99,104,32,109,111,114,101,114,101,102,108,101,99,116 -,101,100,119,97,115,32,110,97,109,101,100,111,114,105,103,105,110,97,108,32,97, -32,116,121,112,105,99,97,108,119,104,101,110,32,116,104,101,121,101,110,103,105, -110,101,101,114,115,99,111,117,108,100,32,110,111,116,114,101,115,105,100,101, -110,116,115,119,101,100,110,101,115,100,97,121,116,104,101,32,116,104,105,114, -100,32,112,114,111,100,117,99,116,115,74,97,110,117,97,114,121,32,50,119,104,97, -116,32,116,104,101,121,97,32,99,101,114,116,97,105,110,114,101,97,99,116,105,111 -,110,115,112,114,111,99,101,115,115,111,114,97,102,116,101,114,32,104,105,115, -116,104,101,32,108,97,115,116,32,99,111,110,116,97,105,110,101,100,34,62,60,47, -100,105,118,62,10,60,47,97,62,60,47,116,100,62,100,101,112,101,110,100,32,111, -110,115,101,97,114,99,104,34,62,10,112,105,101,99,101,115,32,111,102,99,111,109, -112,101,116,105,110,103,82,101,102,101,114,101,110,99,101,116,101,110,110,101, -115,115,101,101,119,104,105,99,104,32,104,97,115,32,118,101,114,115,105,111,110, -61,60,47,115,112,97,110,62,32,60,60,47,104,101,97,100,101,114,62,103,105,118,101 -,115,32,116,104,101,104,105,115,116,111,114,105,97,110,118,97,108,117,101,61,34, -34,62,112,97,100,100,105,110,103,58,48,118,105,101,119,32,116,104,97,116,116,111 -,103,101,116,104,101,114,44,116,104,101,32,109,111,115,116,32,119,97,115,32,102, -111,117,110,100,115,117,98,115,101,116,32,111,102,97,116,116,97,99,107,32,111, -110,99,104,105,108,100,114,101,110,44,112,111,105,110,116,115,32,111,102,112,101 -,114,115,111,110,97,108,32,112,111,115,105,116,105,111,110,58,97,108,108,101,103 -,101,100,108,121,67,108,101,118,101,108,97,110,100,119,97,115,32,108,97,116,101, -114,97,110,100,32,97,102,116,101,114,97,114,101,32,103,105,118,101,110,119,97, -115,32,115,116,105,108,108,115,99,114,111,108,108,105,110,103,100,101,115,105, -103,110,32,111,102,109,97,107,101,115,32,116,104,101,109,117,99,104,32,108,101, -115,115,65,109,101,114,105,99,97,110,115,46,10,10,65,102,116,101,114,32,44,32,98 -,117,116,32,116,104,101,77,117,115,101,117,109,32,111,102,108,111,117,105,115, -105,97,110,97,40,102,114,111,109,32,116,104,101,109,105,110,110,101,115,111,116, -97,112,97,114,116,105,99,108,101,115,97,32,112,114,111,99,101,115,115,68,111,109 -,105,110,105,99,97,110,118,111,108,117,109,101,32,111,102,114,101,116,117,114, -110,105,110,103,100,101,102,101,110,115,105,118,101,48,48,112,120,124,114,105, -103,104,109,97,100,101,32,102,114,111,109,109,111,117,115,101,111,118,101,114,34 -,32,115,116,121,108,101,61,34,115,116,97,116,101,115,32,111,102,40,119,104,105, -99,104,32,105,115,99,111,110,116,105,110,117,101,115,70,114,97,110,99,105,115,99 -,111,98,117,105,108,100,105,110,103,32,119,105,116,104,111,117,116,32,97,119,105 -,116,104,32,115,111,109,101,119,104,111,32,119,111,117,108,100,97,32,102,111,114 -,109,32,111,102,97,32,112,97,114,116,32,111,102,98,101,102,111,114,101,32,105, -116,107,110,111,119,110,32,97,115,32,32,83,101,114,118,105,99,101,115,108,111,99 -,97,116,105,111,110,32,97,110,100,32,111,102,116,101,110,109,101,97,115,117,114, -105,110,103,97,110,100,32,105,116,32,105,115,112,97,112,101,114,98,97,99,107,118 -,97,108,117,101,115,32,111,102,13,10,60,116,105,116,108,101,62,61,32,119,105,110 -,100,111,119,46,100,101,116,101,114,109,105,110,101,101,114,38,113,117,111,116, -59,32,112,108,97,121,101,100,32,98,121,97,110,100,32,101,97,114,108,121,60,47,99 -,101,110,116,101,114,62,102,114,111,109,32,116,104,105,115,116,104,101,32,116, -104,114,101,101,112,111,119,101,114,32,97,110,100,111,102,32,38,113,117,111,116, -59,105,110,110,101,114,72,84,77,76,60,97,32,104,114,101,102,61,34,121,58,105,110 -,108,105,110,101,59,67,104,117,114,99,104,32,111,102,116,104,101,32,101,118,101, -110,116,118,101,114,121,32,104,105,103,104,111,102,102,105,99,105,97,108,32,45, -104,101,105,103,104,116,58,32,99,111,110,116,101,110,116,61,34,47,99,103,105,45, -98,105,110,47,116,111,32,99,114,101,97,116,101,97,102,114,105,107,97,97,110,115, -101,115,112,101,114,97,110,116,111,102,114,97,110,195,167,97,105,115,108,97,116, -118,105,101,197,161,117,108,105,101,116,117,118,105,197,179,196,140,101,197,161, -116,105,110,97,196,141,101,197,161,116,105,110,97,224,185,132,224,184,151,224, -184,162,230,151,165,230,156,172,232,170,158,231,174,128,228,189,147,229,173,151, -231,185,129,233,171,148,229,173,151,237,149,156,234,181,173,236,150,180,228,184, -186,228,187,128,228,185,136,232,174,161,231,174,151,230,156,186,231,172,148,232, -174,176,230,156,172,232,168,142,232,171,150,229,141,128,230,156,141,229,138,161, -229,153,168,228,186,146,232,129,148,231,189,145,230,136,191,229,156,176,228,186, -167,228,191,177,228,185,144,233,131,168,229,135,186,231,137,136,231,164,190,230, -142,146,232,161,140,230,166,156,233,131,168,232,144,189,230,160,188,232,191,155, -228,184,128,230,173,165,230,148,175,228,187,152,229,174,157,233,170,140,232,175, -129,231,160,129,229,167,148,229,145,152,228,188,154,230,149,176,230,141,174,229, -186,147,230,182,136,232,180,185,232,128,133,229,138,158,229,133,172,229,174,164, -232,174,168,232,174,186,229,140,186,230,183,177,229,156,179,229,184,130,230,146, -173,230,148,190,229,153,168,229,140,151,228,186,172,229,184,130,229,164,167,229, -173,166,231,148,159,232,182,138,230,157,165,232,182,138,231,174,161,231,144,134, -229,145,152,228,191,161,230,129,175,231,189,145,115,101,114,118,105,99,105,111, -115,97,114,116,195,173,99,117,108,111,97,114,103,101,110,116,105,110,97,98,97, -114,99,101,108,111,110,97,99,117,97,108,113,117,105,101,114,112,117,98,108,105, -99,97,100,111,112,114,111,100,117,99,116,111,115,112,111,108,195,173,116,105,99, -97,114,101,115,112,117,101,115,116,97,119,105,107,105,112,101,100,105,97,115,105 -,103,117,105,101,110,116,101,98,195,186,115,113,117,101,100,97,99,111,109,117, -110,105,100,97,100,115,101,103,117,114,105,100,97,100,112,114,105,110,99,105,112 -,97,108,112,114,101,103,117,110,116,97,115,99,111,110,116,101,110,105,100,111, -114,101,115,112,111,110,100,101,114,118,101,110,101,122,117,101,108,97,112,114, -111,98,108,101,109,97,115,100,105,99,105,101,109,98,114,101,114,101,108,97,99, -105,195,179,110,110,111,118,105,101,109,98,114,101,115,105,109,105,108,97,114, -101,115,112,114,111,121,101,99,116,111,115,112,114,111,103,114,97,109,97,115,105 -,110,115,116,105,116,117,116,111,97,99,116,105,118,105,100,97,100,101,110,99,117 -,101,110,116,114,97,101,99,111,110,111,109,195,173,97,105,109,195,161,103,101, -110,101,115,99,111,110,116,97,99,116,97,114,100,101,115,99,97,114,103,97,114,110 -,101,99,101,115,97,114,105,111,97,116,101,110,99,105,195,179,110,116,101,108,195 -,169,102,111,110,111,99,111,109,105,115,105,195,179,110,99,97,110,99,105,111,110 -,101,115,99,97,112,97,99,105,100,97,100,101,110,99,111,110,116,114,97,114,97,110 -,195,161,108,105,115,105,115,102,97,118,111,114,105,116,111,115,116,195,169,114, -109,105,110,111,115,112,114,111,118,105,110,99,105,97,101,116,105,113,117,101, -116,97,115,101,108,101,109,101,110,116,111,115,102,117,110,99,105,111,110,101, -115,114,101,115,117,108,116,97,100,111,99,97,114,195,161,99,116,101,114,112,114, -111,112,105,101,100,97,100,112,114,105,110,99,105,112,105,111,110,101,99,101,115 -,105,100,97,100,109,117,110,105,99,105,112,97,108,99,114,101,97,99,105,195,179, -110,100,101,115,99,97,114,103,97,115,112,114,101,115,101,110,99,105,97,99,111, -109,101,114,99,105,97,108,111,112,105,110,105,111,110,101,115,101,106,101,114,99 -,105,99,105,111,101,100,105,116,111,114,105,97,108,115,97,108,97,109,97,110,99, -97,103,111,110,122,195,161,108,101,122,100,111,99,117,109,101,110,116,111,112, -101,108,195,173,99,117,108,97,114,101,99,105,101,110,116,101,115,103,101,110,101 -,114,97,108,101,115,116,97,114,114,97,103,111,110,97,112,114,195,161,99,116,105, -99,97,110,111,118,101,100,97,100,101,115,112,114,111,112,117,101,115,116,97,112, -97,99,105,101,110,116,101,115,116,195,169,99,110,105,99,97,115,111,98,106,101, -116,105,118,111,115,99,111,110,116,97,99,116,111,115,224,164,174,224,165,135,224 -,164,130,224,164,178,224,164,191,224,164,143,224,164,185,224,165,136,224,164,130 -,224,164,151,224,164,175,224,164,190,224,164,184,224,164,190,224,164,165,224,164 -,143,224,164,181,224,164,130,224,164,176,224,164,185,224,165,135,224,164,149,224 -,165,139,224,164,136,224,164,149,224,165,129,224,164,155,224,164,176,224,164,185 -,224,164,190,224,164,172,224,164,190,224,164,166,224,164,149,224,164,185,224,164 -,190,224,164,184,224,164,173,224,165,128,224,164,185,224,165,129,224,164,143,224 -,164,176,224,164,185,224,165,128,224,164,174,224,165,136,224,164,130,224,164,166 -,224,164,191,224,164,168,224,164,172,224,164,190,224,164,164,100,105,112,108,111 -,100,111,99,115,224,164,184,224,164,174,224,164,175,224,164,176,224,165,130,224, -164,170,224,164,168,224,164,190,224,164,174,224,164,170,224,164,164,224,164,190, -224,164,171,224,164,191,224,164,176,224,164,148,224,164,184,224,164,164,224,164, -164,224,164,176,224,164,185,224,164,178,224,165,139,224,164,151,224,164,185,224, -165,129,224,164,134,224,164,172,224,164,190,224,164,176,224,164,166,224,165,135, -224,164,182,224,164,185,224,165,129,224,164,136,224,164,150,224,165,135,224,164, -178,224,164,175,224,164,166,224,164,191,224,164,149,224,164,190,224,164,174,224, -164,181,224,165,135,224,164,172,224,164,164,224,165,128,224,164,168,224,164,172, -224,165,128,224,164,154,224,164,174,224,165,140,224,164,164,224,164,184,224,164, -190,224,164,178,224,164,178,224,165,135,224,164,150,224,164,156,224,165,137,224, -164,172,224,164,174,224,164,166,224,164,166,224,164,164,224,164,165,224,164,190, -224,164,168,224,164,185,224,165,128,224,164,182,224,164,185,224,164,176,224,164, -133,224,164,178,224,164,151,224,164,149,224,164,173,224,165,128,224,164,168,224, -164,151,224,164,176,224,164,170,224,164,190,224,164,184,224,164,176,224,164,190, -224,164,164,224,164,149,224,164,191,224,164,143,224,164,137,224,164,184,224,165, -135,224,164,151,224,164,175,224,165,128,224,164,185,224,165,130,224,164,129,224, -164,134,224,164,151,224,165,135,224,164,159,224,165,128,224,164,174,224,164,150, -224,165,139,224,164,156,224,164,149,224,164,190,224,164,176,224,164,133,224,164, -173,224,165,128,224,164,151,224,164,175,224,165,135,224,164,164,224,165,129,224, -164,174,224,164,181,224,165,139,224,164,159,224,164,166,224,165,135,224,164,130, -224,164,133,224,164,151,224,164,176,224,164,144,224,164,184,224,165,135,224,164, -174,224,165,135,224,164,178,224,164,178,224,164,151,224,164,190,224,164,185,224, -164,190,224,164,178,224,164,138,224,164,170,224,164,176,224,164,154,224,164,190, -224,164,176,224,164,144,224,164,184,224,164,190,224,164,166,224,165,135,224,164, -176,224,164,156,224,164,191,224,164,184,224,164,166,224,164,191,224,164,178,224, -164,172,224,164,130,224,164,166,224,164,172,224,164,168,224,164,190,224,164,185, -224,165,130,224,164,130,224,164,178,224,164,190,224,164,150,224,164,156,224,165, -128,224,164,164,224,164,172,224,164,159,224,164,168,224,164,174,224,164,191,224, -164,178,224,164,135,224,164,184,224,165,135,224,164,134,224,164,168,224,165,135, -224,164,168,224,164,175,224,164,190,224,164,149,224,165,129,224,164,178,224,164, -178,224,165,137,224,164,151,224,164,173,224,164,190,224,164,151,224,164,176,224, -165,135,224,164,178,224,164,156,224,164,151,224,164,185,224,164,176,224,164,190, -224,164,174,224,164,178,224,164,151,224,165,135,224,164,170,224,165,135,224,164, -156,224,164,185,224,164,190,224,164,165,224,164,135,224,164,184,224,165,128,224, -164,184,224,164,185,224,165,128,224,164,149,224,164,178,224,164,190,224,164,160, -224,165,128,224,164,149,224,164,185,224,164,190,224,164,129,224,164,166,224,165, -130,224,164,176,224,164,164,224,164,185,224,164,164,224,164,184,224,164,190,224, -164,164,224,164,175,224,164,190,224,164,166,224,164,134,224,164,175,224,164,190, -224,164,170,224,164,190,224,164,149,224,164,149,224,165,140,224,164,168,224,164, -182,224,164,190,224,164,174,224,164,166,224,165,135,224,164,150,224,164,175,224, -164,185,224,165,128,224,164,176,224,164,190,224,164,175,224,164,150,224,165,129, -224,164,166,224,164,178,224,164,151,224,165,128,99,97,116,101,103,111,114,105, -101,115,101,120,112,101,114,105,101,110,99,101,60,47,116,105,116,108,101,62,13, -10,67,111,112,121,114,105,103,104,116,32,106,97,118,97,115,99,114,105,112,116,99 -,111,110,100,105,116,105,111,110,115,101,118,101,114,121,116,104,105,110,103,60, -112,32,99,108,97,115,115,61,34,116,101,99,104,110,111,108,111,103,121,98,97,99, -107,103,114,111,117,110,100,60,97,32,99,108,97,115,115,61,34,109,97,110,97,103, -101,109,101,110,116,38,99,111,112,121,59,32,50,48,49,106,97,118,97,83,99,114,105 -,112,116,99,104,97,114,97,99,116,101,114,115,98,114,101,97,100,99,114,117,109,98 -,116,104,101,109,115,101,108,118,101,115,104,111,114,105,122,111,110,116,97,108, -103,111,118,101,114,110,109,101,110,116,67,97,108,105,102,111,114,110,105,97,97, -99,116,105,118,105,116,105,101,115,100,105,115,99,111,118,101,114,101,100,78,97, -118,105,103,97,116,105,111,110,116,114,97,110,115,105,116,105,111,110,99,111,110 -,110,101,99,116,105,111,110,110,97,118,105,103,97,116,105,111,110,97,112,112,101 -,97,114,97,110,99,101,60,47,116,105,116,108,101,62,60,109,99,104,101,99,107,98, -111,120,34,32,116,101,99,104,110,105,113,117,101,115,112,114,111,116,101,99,116, -105,111,110,97,112,112,97,114,101,110,116,108,121,97,115,32,119,101,108,108,32, -97,115,117,110,116,39,44,32,39,85,65,45,114,101,115,111,108,117,116,105,111,110, -111,112,101,114,97,116,105,111,110,115,116,101,108,101,118,105,115,105,111,110, -116,114,97,110,115,108,97,116,101,100,87,97,115,104,105,110,103,116,111,110,110, -97,118,105,103,97,116,111,114,46,32,61,32,119,105,110,100,111,119,46,105,109,112 -,114,101,115,115,105,111,110,38,108,116,59,98,114,38,103,116,59,108,105,116,101, -114,97,116,117,114,101,112,111,112,117,108,97,116,105,111,110,98,103,99,111,108, -111,114,61,34,35,101,115,112,101,99,105,97,108,108,121,32,99,111,110,116,101,110 -,116,61,34,112,114,111,100,117,99,116,105,111,110,110,101,119,115,108,101,116, -116,101,114,112,114,111,112,101,114,116,105,101,115,100,101,102,105,110,105,116, -105,111,110,108,101,97,100,101,114,115,104,105,112,84,101,99,104,110,111,108,111 -,103,121,80,97,114,108,105,97,109,101,110,116,99,111,109,112,97,114,105,115,111, -110,117,108,32,99,108,97,115,115,61,34,46,105,110,100,101,120,79,102,40,34,99, -111,110,99,108,117,115,105,111,110,100,105,115,99,117,115,115,105,111,110,99,111 -,109,112,111,110,101,110,116,115,98,105,111,108,111,103,105,99,97,108,82,101,118 -,111,108,117,116,105,111,110,95,99,111,110,116,97,105,110,101,114,117,110,100, -101,114,115,116,111,111,100,110,111,115,99,114,105,112,116,62,60,112,101,114,109 -,105,115,115,105,111,110,101,97,99,104,32,111,116,104,101,114,97,116,109,111,115 -,112,104,101,114,101,32,111,110,102,111,99,117,115,61,34,60,102,111,114,109,32, -105,100,61,34,112,114,111,99,101,115,115,105,110,103,116,104,105,115,46,118,97, -108,117,101,103,101,110,101,114,97,116,105,111,110,67,111,110,102,101,114,101, -110,99,101,115,117,98,115,101,113,117,101,110,116,119,101,108,108,45,107,110,111 -,119,110,118,97,114,105,97,116,105,111,110,115,114,101,112,117,116,97,116,105, -111,110,112,104,101,110,111,109,101,110,111,110,100,105,115,99,105,112,108,105, -110,101,108,111,103,111,46,112,110,103,34,32,40,100,111,99,117,109,101,110,116, -44,98,111,117,110,100,97,114,105,101,115,101,120,112,114,101,115,115,105,111,110 -,115,101,116,116,108,101,109,101,110,116,66,97,99,107,103,114,111,117,110,100, -111,117,116,32,111,102,32,116,104,101,101,110,116,101,114,112,114,105,115,101,40 -,34,104,116,116,112,115,58,34,32,117,110,101,115,99,97,112,101,40,34,112,97,115, -115,119,111,114,100,34,32,100,101,109,111,99,114,97,116,105,99,60,97,32,104,114, -101,102,61,34,47,119,114,97,112,112,101,114,34,62,10,109,101,109,98,101,114,115, -104,105,112,108,105,110,103,117,105,115,116,105,99,112,120,59,112,97,100,100,105 -,110,103,112,104,105,108,111,115,111,112,104,121,97,115,115,105,115,116,97,110, -99,101,117,110,105,118,101,114,115,105,116,121,102,97,99,105,108,105,116,105,101 -,115,114,101,99,111,103,110,105,122,101,100,112,114,101,102,101,114,101,110,99, -101,105,102,32,40,116,121,112,101,111,102,109,97,105,110,116,97,105,110,101,100, -118,111,99,97,98,117,108,97,114,121,104,121,112,111,116,104,101,115,105,115,46, -115,117,98,109,105,116,40,41,59,38,97,109,112,59,110,98,115,112,59,97,110,110, -111,116,97,116,105,111,110,98,101,104,105,110,100,32,116,104,101,70,111,117,110, -100,97,116,105,111,110,112,117,98,108,105,115,104,101,114,34,97,115,115,117,109, -112,116,105,111,110,105,110,116,114,111,100,117,99,101,100,99,111,114,114,117, -112,116,105,111,110,115,99,105,101,110,116,105,115,116,115,101,120,112,108,105, -99,105,116,108,121,105,110,115,116,101,97,100,32,111,102,100,105,109,101,110,115 -,105,111,110,115,32,111,110,67,108,105,99,107,61,34,99,111,110,115,105,100,101, -114,101,100,100,101,112,97,114,116,109,101,110,116,111,99,99,117,112,97,116,105, -111,110,115,111,111,110,32,97,102,116,101,114,105,110,118,101,115,116,109,101, -110,116,112,114,111,110,111,117,110,99,101,100,105,100,101,110,116,105,102,105, -101,100,101,120,112,101,114,105,109,101,110,116,77,97,110,97,103,101,109,101,110 -,116,103,101,111,103,114,97,112,104,105,99,34,32,104,101,105,103,104,116,61,34, -108,105,110,107,32,114,101,108,61,34,46,114,101,112,108,97,99,101,40,47,100,101, -112,114,101,115,115,105,111,110,99,111,110,102,101,114,101,110,99,101,112,117, -110,105,115,104,109,101,110,116,101,108,105,109,105,110,97,116,101,100,114,101, -115,105,115,116,97,110,99,101,97,100,97,112,116,97,116,105,111,110,111,112,112, -111,115,105,116,105,111,110,119,101,108,108,32,107,110,111,119,110,115,117,112, -112,108,101,109,101,110,116,100,101,116,101,114,109,105,110,101,100,104,49,32,99 -,108,97,115,115,61,34,48,112,120,59,109,97,114,103,105,110,109,101,99,104,97,110 -,105,99,97,108,115,116,97,116,105,115,116,105,99,115,99,101,108,101,98,114,97, -116,101,100,71,111,118,101,114,110,109,101,110,116,10,10,68,117,114,105,110,103, -32,116,100,101,118,101,108,111,112,101,114,115,97,114,116,105,102,105,99,105,97, -108,101,113,117,105,118,97,108,101,110,116,111,114,105,103,105,110,97,116,101, -100,67,111,109,109,105,115,115,105,111,110,97,116,116,97,99,104,109,101,110,116, -60,115,112,97,110,32,105,100,61,34,116,104,101,114,101,32,119,101,114,101,78,101 -,100,101,114,108,97,110,100,115,98,101,121,111,110,100,32,116,104,101,114,101, -103,105,115,116,101,114,101,100,106,111,117,114,110,97,108,105,115,116,102,114, -101,113,117,101,110,116,108,121,97,108,108,32,111,102,32,116,104,101,108,97,110, -103,61,34,101,110,34,32,60,47,115,116,121,108,101,62,13,10,97,98,115,111,108,117 -,116,101,59,32,115,117,112,112,111,114,116,105,110,103,101,120,116,114,101,109, -101,108,121,32,109,97,105,110,115,116,114,101,97,109,60,47,115,116,114,111,110, -103,62,32,112,111,112,117,108,97,114,105,116,121,101,109,112,108,111,121,109,101 -,110,116,60,47,116,97,98,108,101,62,13,10,32,99,111,108,115,112,97,110,61,34,60, -47,102,111,114,109,62,10,32,32,99,111,110,118,101,114,115,105,111,110,97,98,111, -117,116,32,116,104,101,32,60,47,112,62,60,47,100,105,118,62,105,110,116,101,103, -114,97,116,101,100,34,32,108,97,110,103,61,34,101,110,80,111,114,116,117,103,117 -,101,115,101,115,117,98,115,116,105,116,117,116,101,105,110,100,105,118,105,100, -117,97,108,105,109,112,111,115,115,105,98,108,101,109,117,108,116,105,109,101, -100,105,97,97,108,109,111,115,116,32,97,108,108,112,120,32,115,111,108,105,100, -32,35,97,112,97,114,116,32,102,114,111,109,115,117,98,106,101,99,116,32,116,111, -105,110,32,69,110,103,108,105,115,104,99,114,105,116,105,99,105,122,101,100,101, -120,99,101,112,116,32,102,111,114,103,117,105,100,101,108,105,110,101,115,111, -114,105,103,105,110,97,108,108,121,114,101,109,97,114,107,97,98,108,101,116,104, -101,32,115,101,99,111,110,100,104,50,32,99,108,97,115,115,61,34,60,97,32,116,105 -,116,108,101,61,34,40,105,110,99,108,117,100,105,110,103,112,97,114,97,109,101, -116,101,114,115,112,114,111,104,105,98,105,116,101,100,61,32,34,104,116,116,112, -58,47,47,100,105,99,116,105,111,110,97,114,121,112,101,114,99,101,112,116,105, -111,110,114,101,118,111,108,117,116,105,111,110,102,111,117,110,100,97,116,105, -111,110,112,120,59,104,101,105,103,104,116,58,115,117,99,99,101,115,115,102,117, -108,115,117,112,112,111,114,116,101,114,115,109,105,108,108,101,110,110,105,117, -109,104,105,115,32,102,97,116,104,101,114,116,104,101,32,38,113,117,111,116,59, -110,111,45,114,101,112,101,97,116,59,99,111,109,109,101,114,99,105,97,108,105, -110,100,117,115,116,114,105,97,108,101,110,99,111,117,114,97,103,101,100,97,109, -111,117,110,116,32,111,102,32,117,110,111,102,102,105,99,105,97,108,101,102,102, -105,99,105,101,110,99,121,82,101,102,101,114,101,110,99,101,115,99,111,111,114, -100,105,110,97,116,101,100,105,115,99,108,97,105,109,101,114,101,120,112,101,100 -,105,116,105,111,110,100,101,118,101,108,111,112,105,110,103,99,97,108,99,117, -108,97,116,101,100,115,105,109,112,108,105,102,105,101,100,108,101,103,105,116, -105,109,97,116,101,115,117,98,115,116,114,105,110,103,40,48,34,32,99,108,97,115, -115,61,34,99,111,109,112,108,101,116,101,108,121,105,108,108,117,115,116,114,97, -116,101,102,105,118,101,32,121,101,97,114,115,105,110,115,116,114,117,109,101, -110,116,80,117,98,108,105,115,104,105,110,103,49,34,32,99,108,97,115,115,61,34, -112,115,121,99,104,111,108,111,103,121,99,111,110,102,105,100,101,110,99,101,110 -,117,109,98,101,114,32,111,102,32,97,98,115,101,110,99,101,32,111,102,102,111,99 -,117,115,101,100,32,111,110,106,111,105,110,101,100,32,116,104,101,115,116,114, -117,99,116,117,114,101,115,112,114,101,118,105,111,117,115,108,121,62,60,47,105, -102,114,97,109,101,62,111,110,99,101,32,97,103,97,105,110,98,117,116,32,114,97, -116,104,101,114,105,109,109,105,103,114,97,110,116,115,111,102,32,99,111,117,114 -,115,101,44,97,32,103,114,111,117,112,32,111,102,76,105,116,101,114,97,116,117, -114,101,85,110,108,105,107,101,32,116,104,101,60,47,97,62,38,110,98,115,112,59, -10,102,117,110,99,116,105,111,110,32,105,116,32,119,97,115,32,116,104,101,67,111 -,110,118,101,110,116,105,111,110,97,117,116,111,109,111,98,105,108,101,80,114, -111,116,101,115,116,97,110,116,97,103,103,114,101,115,115,105,118,101,97,102,116 -,101,114,32,116,104,101,32,83,105,109,105,108,97,114,108,121,44,34,32,47,62,60, -47,100,105,118,62,99,111,108,108,101,99,116,105,111,110,13,10,102,117,110,99,116 -,105,111,110,118,105,115,105,98,105,108,105,116,121,116,104,101,32,117,115,101, -32,111,102,118,111,108,117,110,116,101,101,114,115,97,116,116,114,97,99,116,105, -111,110,117,110,100,101,114,32,116,104,101,32,116,104,114,101,97,116,101,110,101 -,100,42,60,33,91,67,68,65,84,65,91,105,109,112,111,114,116,97,110,99,101,105,110 -,32,103,101,110,101,114,97,108,116,104,101,32,108,97,116,116,101,114,60,47,102, -111,114,109,62,10,60,47,46,105,110,100,101,120,79,102,40,39,105,32,61,32,48,59, -32,105,32,60,100,105,102,102,101,114,101,110,99,101,100,101,118,111,116,101,100, -32,116,111,116,114,97,100,105,116,105,111,110,115,115,101,97,114,99,104,32,102, -111,114,117,108,116,105,109,97,116,101,108,121,116,111,117,114,110,97,109,101, -110,116,97,116,116,114,105,98,117,116,101,115,115,111,45,99,97,108,108,101,100, -32,125,10,60,47,115,116,121,108,101,62,101,118,97,108,117,97,116,105,111,110,101 -,109,112,104,97,115,105,122,101,100,97,99,99,101,115,115,105,98,108,101,60,47, -115,101,99,116,105,111,110,62,115,117,99,99,101,115,115,105,111,110,97,108,111, -110,103,32,119,105,116,104,77,101,97,110,119,104,105,108,101,44,105,110,100,117, -115,116,114,105,101,115,60,47,97,62,60,98,114,32,47,62,104,97,115,32,98,101,99, -111,109,101,97,115,112,101,99,116,115,32,111,102,84,101,108,101,118,105,115,105, -111,110,115,117,102,102,105,99,105,101,110,116,98,97,115,107,101,116,98,97,108, -108,98,111,116,104,32,115,105,100,101,115,99,111,110,116,105,110,117,105,110,103 -,97,110,32,97,114,116,105,99,108,101,60,105,109,103,32,97,108,116,61,34,97,100, -118,101,110,116,117,114,101,115,104,105,115,32,109,111,116,104,101,114,109,97, -110,99,104,101,115,116,101,114,112,114,105,110,99,105,112,108,101,115,112,97,114 -,116,105,99,117,108,97,114,99,111,109,109,101,110,116,97,114,121,101,102,102,101 -,99,116,115,32,111,102,100,101,99,105,100,101,100,32,116,111,34,62,60,115,116, -114,111,110,103,62,112,117,98,108,105,115,104,101,114,115,74,111,117,114,110,97, -108,32,111,102,100,105,102,102,105,99,117,108,116,121,102,97,99,105,108,105,116, -97,116,101,97,99,99,101,112,116,97,98,108,101,115,116,121,108,101,46,99,115,115, -34,9,102,117,110,99,116,105,111,110,32,105,110,110,111,118,97,116,105,111,110,62 -,67,111,112,121,114,105,103,104,116,115,105,116,117,97,116,105,111,110,115,119, -111,117,108,100,32,104,97,118,101,98,117,115,105,110,101,115,115,101,115,68,105, -99,116,105,111,110,97,114,121,115,116,97,116,101,109,101,110,116,115,111,102,116 -,101,110,32,117,115,101,100,112,101,114,115,105,115,116,101,110,116,105,110,32, -74,97,110,117,97,114,121,99,111,109,112,114,105,115,105,110,103,60,47,116,105, -116,108,101,62,10,9,100,105,112,108,111,109,97,116,105,99,99,111,110,116,97,105, -110,105,110,103,112,101,114,102,111,114,109,105,110,103,101,120,116,101,110,115, -105,111,110,115,109,97,121,32,110,111,116,32,98,101,99,111,110,99,101,112,116,32 -,111,102,32,111,110,99,108,105,99,107,61,34,73,116,32,105,115,32,97,108,115,111, -102,105,110,97,110,99,105,97,108,32,109,97,107,105,110,103,32,116,104,101,76,117 -,120,101,109,98,111,117,114,103,97,100,100,105,116,105,111,110,97,108,97,114,101 -,32,99,97,108,108,101,100,101,110,103,97,103,101,100,32,105,110,34,115,99,114, -105,112,116,34,41,59,98,117,116,32,105,116,32,119,97,115,101,108,101,99,116,114, -111,110,105,99,111,110,115,117,98,109,105,116,61,34,10,60,33,45,45,32,69,110,100 -,32,101,108,101,99,116,114,105,99,97,108,111,102,102,105,99,105,97,108,108,121, -115,117,103,103,101,115,116,105,111,110,116,111,112,32,111,102,32,116,104,101, -117,110,108,105,107,101,32,116,104,101,65,117,115,116,114,97,108,105,97,110,79, -114,105,103,105,110,97,108,108,121,114,101,102,101,114,101,110,99,101,115,10,60, -47,104,101,97,100,62,13,10,114,101,99,111,103,110,105,115,101,100,105,110,105, -116,105,97,108,105,122,101,108,105,109,105,116,101,100,32,116,111,65,108,101,120 -,97,110,100,114,105,97,114,101,116,105,114,101,109,101,110,116,65,100,118,101, -110,116,117,114,101,115,102,111,117,114,32,121,101,97,114,115,10,10,38,108,116, -59,33,45,45,32,105,110,99,114,101,97,115,105,110,103,100,101,99,111,114,97,116, -105,111,110,104,51,32,99,108,97,115,115,61,34,111,114,105,103,105,110,115,32,111 -,102,111,98,108,105,103,97,116,105,111,110,114,101,103,117,108,97,116,105,111, -110,99,108,97,115,115,105,102,105,101,100,40,102,117,110,99,116,105,111,110,40, -97,100,118,97,110,116,97,103,101,115,98,101,105,110,103,32,116,104,101,32,104, -105,115,116,111,114,105,97,110,115,60,98,97,115,101,32,104,114,101,102,114,101, -112,101,97,116,101,100,108,121,119,105,108,108,105,110,103,32,116,111,99,111,109 -,112,97,114,97,98,108,101,100,101,115,105,103,110,97,116,101,100,110,111,109,105 -,110,97,116,105,111,110,102,117,110,99,116,105,111,110,97,108,105,110,115,105, -100,101,32,116,104,101,114,101,118,101,108,97,116,105,111,110,101,110,100,32,111 -,102,32,116,104,101,115,32,102,111,114,32,116,104,101,32,97,117,116,104,111,114, -105,122,101,100,114,101,102,117,115,101,100,32,116,111,116,97,107,101,32,112,108 -,97,99,101,97,117,116,111,110,111,109,111,117,115,99,111,109,112,114,111,109,105 -,115,101,112,111,108,105,116,105,99,97,108,32,114,101,115,116,97,117,114,97,110, -116,116,119,111,32,111,102,32,116,104,101,70,101,98,114,117,97,114,121,32,50,113 -,117,97,108,105,116,121,32,111,102,115,119,102,111,98,106,101,99,116,46,117,110, -100,101,114,115,116,97,110,100,110,101,97,114,108,121,32,97,108,108,119,114,105, -116,116,101,110,32,98,121,105,110,116,101,114,118,105,101,119,115,34,32,119,105, -100,116,104,61,34,49,119,105,116,104,100,114,97,119,97,108,102,108,111,97,116,58 -,108,101,102,116,105,115,32,117,115,117,97,108,108,121,99,97,110,100,105,100,97, -116,101,115,110,101,119,115,112,97,112,101,114,115,109,121,115,116,101,114,105, -111,117,115,68,101,112,97,114,116,109,101,110,116,98,101,115,116,32,107,110,111, -119,110,112,97,114,108,105,97,109,101,110,116,115,117,112,112,114,101,115,115, -101,100,99,111,110,118,101,110,105,101,110,116,114,101,109,101,109,98,101,114, -101,100,100,105,102,102,101,114,101,110,116,32,115,121,115,116,101,109,97,116, -105,99,104,97,115,32,108,101,100,32,116,111,112,114,111,112,97,103,97,110,100,97 -,99,111,110,116,114,111,108,108,101,100,105,110,102,108,117,101,110,99,101,115, -99,101,114,101,109,111,110,105,97,108,112,114,111,99,108,97,105,109,101,100,80, -114,111,116,101,99,116,105,111,110,108,105,32,99,108,97,115,115,61,34,83,99,105, -101,110,116,105,102,105,99,99,108,97,115,115,61,34,110,111,45,116,114,97,100,101 -,109,97,114,107,115,109,111,114,101,32,116,104,97,110,32,119,105,100,101,115,112 -,114,101,97,100,76,105,98,101,114,97,116,105,111,110,116,111,111,107,32,112,108, -97,99,101,100,97,121,32,111,102,32,116,104,101,97,115,32,108,111,110,103,32,97, -115,105,109,112,114,105,115,111,110,101,100,65,100,100,105,116,105,111,110,97, -108,10,60,104,101,97,100,62,10,60,109,76,97,98,111,114,97,116,111,114,121,78,111 -,118,101,109,98,101,114,32,50,101,120,99,101,112,116,105,111,110,115,73,110,100, -117,115,116,114,105,97,108,118,97,114,105,101,116,121,32,111,102,102,108,111,97, -116,58,32,108,101,102,68,117,114,105,110,103,32,116,104,101,97,115,115,101,115, -115,109,101,110,116,104,97,118,101,32,98,101,101,110,32,100,101,97,108,115,32, -119,105,116,104,83,116,97,116,105,115,116,105,99,115,111,99,99,117,114,114,101, -110,99,101,47,117,108,62,60,47,100,105,118,62,99,108,101,97,114,102,105,120,34, -62,116,104,101,32,112,117,98,108,105,99,109,97,110,121,32,121,101,97,114,115,119 -,104,105,99,104,32,119,101,114,101,111,118,101,114,32,116,105,109,101,44,115,121 -,110,111,110,121,109,111,117,115,99,111,110,116,101,110,116,34,62,10,112,114,101 -,115,117,109,97,98,108,121,104,105,115,32,102,97,109,105,108,121,117,115,101,114 -,65,103,101,110,116,46,117,110,101,120,112,101,99,116,101,100,105,110,99,108,117 -,100,105,110,103,32,99,104,97,108,108,101,110,103,101,100,97,32,109,105,110,111, -114,105,116,121,117,110,100,101,102,105,110,101,100,34,98,101,108,111,110,103, -115,32,116,111,116,97,107,101,110,32,102,114,111,109,105,110,32,79,99,116,111,98 -,101,114,112,111,115,105,116,105,111,110,58,32,115,97,105,100,32,116,111,32,98, -101,114,101,108,105,103,105,111,117,115,32,70,101,100,101,114,97,116,105,111,110 -,32,114,111,119,115,112,97,110,61,34,111,110,108,121,32,97,32,102,101,119,109, -101,97,110,116,32,116,104,97,116,108,101,100,32,116,111,32,116,104,101,45,45,62, -13,10,60,100,105,118,32,60,102,105,101,108,100,115,101,116,62,65,114,99,104,98, -105,115,104,111,112,32,99,108,97,115,115,61,34,110,111,98,101,105,110,103,32,117 -,115,101,100,97,112,112,114,111,97,99,104,101,115,112,114,105,118,105,108,101, -103,101,115,110,111,115,99,114,105,112,116,62,10,114,101,115,117,108,116,115,32, -105,110,109,97,121,32,98,101,32,116,104,101,69,97,115,116,101,114,32,101,103,103 -,109,101,99,104,97,110,105,115,109,115,114,101,97,115,111,110,97,98,108,101,80, -111,112,117,108,97,116,105,111,110,67,111,108,108,101,99,116,105,111,110,115,101 -,108,101,99,116,101,100,34,62,110,111,115,99,114,105,112,116,62,13,47,105,110, -100,101,120,46,112,104,112,97,114,114,105,118,97,108,32,111,102,45,106,115,115, -100,107,39,41,41,59,109,97,110,97,103,101,100,32,116,111,105,110,99,111,109,112, -108,101,116,101,99,97,115,117,97,108,116,105,101,115,99,111,109,112,108,101,116, -105,111,110,67,104,114,105,115,116,105,97,110,115,83,101,112,116,101,109,98,101, -114,32,97,114,105,116,104,109,101,116,105,99,112,114,111,99,101,100,117,114,101, -115,109,105,103,104,116,32,104,97,118,101,80,114,111,100,117,99,116,105,111,110, -105,116,32,97,112,112,101,97,114,115,80,104,105,108,111,115,111,112,104,121,102, -114,105,101,110,100,115,104,105,112,108,101,97,100,105,110,103,32,116,111,103, -105,118,105,110,103,32,116,104,101,116,111,119,97,114,100,32,116,104,101,103,117 -,97,114,97,110,116,101,101,100,100,111,99,117,109,101,110,116,101,100,99,111,108 -,111,114,58,35,48,48,48,118,105,100,101,111,32,103,97,109,101,99,111,109,109,105 -,115,115,105,111,110,114,101,102,108,101,99,116,105,110,103,99,104,97,110,103, -101,32,116,104,101,97,115,115,111,99,105,97,116,101,100,115,97,110,115,45,115, -101,114,105,102,111,110,107,101,121,112,114,101,115,115,59,32,112,97,100,100,105 -,110,103,58,72,101,32,119,97,115,32,116,104,101,117,110,100,101,114,108,121,105, -110,103,116,121,112,105,99,97,108,108,121,32,44,32,97,110,100,32,116,104,101,32, -115,114,99,69,108,101,109,101,110,116,115,117,99,99,101,115,115,105,118,101,115, -105,110,99,101,32,116,104,101,32,115,104,111,117,108,100,32,98,101,32,110,101, -116,119,111,114,107,105,110,103,97,99,99,111,117,110,116,105,110,103,117,115,101 -,32,111,102,32,116,104,101,108,111,119,101,114,32,116,104,97,110,115,104,111,119 -,115,32,116,104,97,116,60,47,115,112,97,110,62,10,9,9,99,111,109,112,108,97,105, -110,116,115,99,111,110,116,105,110,117,111,117,115,113,117,97,110,116,105,116, -105,101,115,97,115,116,114,111,110,111,109,101,114,104,101,32,100,105,100,32,110 -,111,116,100,117,101,32,116,111,32,105,116,115,97,112,112,108,105,101,100,32,116 -,111,97,110,32,97,118,101,114,97,103,101,101,102,102,111,114,116,115,32,116,111, -116,104,101,32,102,117,116,117,114,101,97,116,116,101,109,112,116,32,116,111,84, -104,101,114,101,102,111,114,101,44,99,97,112,97,98,105,108,105,116,121,82,101, -112,117,98,108,105,99,97,110,119,97,115,32,102,111,114,109,101,100,69,108,101,99 -,116,114,111,110,105,99,107,105,108,111,109,101,116,101,114,115,99,104,97,108, -108,101,110,103,101,115,112,117,98,108,105,115,104,105,110,103,116,104,101,32, -102,111,114,109,101,114,105,110,100,105,103,101,110,111,117,115,100,105,114,101, -99,116,105,111,110,115,115,117,98,115,105,100,105,97,114,121,99,111,110,115,112, -105,114,97,99,121,100,101,116,97,105,108,115,32,111,102,97,110,100,32,105,110,32 -,116,104,101,97,102,102,111,114,100,97,98,108,101,115,117,98,115,116,97,110,99, -101,115,114,101,97,115,111,110,32,102,111,114,99,111,110,118,101,110,116,105,111 -,110,105,116,101,109,116,121,112,101,61,34,97,98,115,111,108,117,116,101,108,121 -,115,117,112,112,111,115,101,100,108,121,114,101,109,97,105,110,101,100,32,97,97 -,116,116,114,97,99,116,105,118,101,116,114,97,118,101,108,108,105,110,103,115, -101,112,97,114,97,116,101,108,121,102,111,99,117,115,101,115,32,111,110,101,108, -101,109,101,110,116,97,114,121,97,112,112,108,105,99,97,98,108,101,102,111,117, -110,100,32,116,104,97,116,115,116,121,108,101,115,104,101,101,116,109,97,110,117 -,115,99,114,105,112,116,115,116,97,110,100,115,32,102,111,114,32,110,111,45,114, -101,112,101,97,116,40,115,111,109,101,116,105,109,101,115,67,111,109,109,101,114 -,99,105,97,108,105,110,32,65,109,101,114,105,99,97,117,110,100,101,114,116,97, -107,101,110,113,117,97,114,116,101,114,32,111,102,97,110,32,101,120,97,109,112, -108,101,112,101,114,115,111,110,97,108,108,121,105,110,100,101,120,46,112,104, -112,63,60,47,98,117,116,116,111,110,62,10,112,101,114,99,101,110,116,97,103,101, -98,101,115,116,45,107,110,111,119,110,99,114,101,97,116,105,110,103,32,97,34,32, -100,105,114,61,34,108,116,114,76,105,101,117,116,101,110,97,110,116,10,60,100, -105,118,32,105,100,61,34,116,104,101,121,32,119,111,117,108,100,97,98,105,108, -105,116,121,32,111,102,109,97,100,101,32,117,112,32,111,102,110,111,116,101,100, -32,116,104,97,116,99,108,101,97,114,32,116,104,97,116,97,114,103,117,101,32,116, -104,97,116,116,111,32,97,110,111,116,104,101,114,99,104,105,108,100,114,101,110, -39,115,112,117,114,112,111,115,101,32,111,102,102,111,114,109,117,108,97,116,101 -,100,98,97,115,101,100,32,117,112,111,110,116,104,101,32,114,101,103,105,111,110 -,115,117,98,106,101,99,116,32,111,102,112,97,115,115,101,110,103,101,114,115,112 -,111,115,115,101,115,115,105,111,110,46,10,10,73,110,32,116,104,101,32,66,101, -102,111,114,101,32,116,104,101,97,102,116,101,114,119,97,114,100,115,99,117,114, -114,101,110,116,108,121,32,97,99,114,111,115,115,32,116,104,101,115,99,105,101, -110,116,105,102,105,99,99,111,109,109,117,110,105,116,121,46,99,97,112,105,116, -97,108,105,115,109,105,110,32,71,101,114,109,97,110,121,114,105,103,104,116,45, -119,105,110,103,116,104,101,32,115,121,115,116,101,109,83,111,99,105,101,116,121 -,32,111,102,112,111,108,105,116,105,99,105,97,110,100,105,114,101,99,116,105,111 -,110,58,119,101,110,116,32,111,110,32,116,111,114,101,109,111,118,97,108,32,111, -102,32,78,101,119,32,89,111,114,107,32,97,112,97,114,116,109,101,110,116,115,105 -,110,100,105,99,97,116,105,111,110,100,117,114,105,110,103,32,116,104,101,117, -110,108,101,115,115,32,116,104,101,104,105,115,116,111,114,105,99,97,108,104,97, -100,32,98,101,101,110,32,97,100,101,102,105,110,105,116,105,118,101,105,110,103, -114,101,100,105,101,110,116,97,116,116,101,110,100,97,110,99,101,67,101,110,116, -101,114,32,102,111,114,112,114,111,109,105,110,101,110,99,101,114,101,97,100,121 -,83,116,97,116,101,115,116,114,97,116,101,103,105,101,115,98,117,116,32,105,110, -32,116,104,101,97,115,32,112,97,114,116,32,111,102,99,111,110,115,116,105,116, -117,116,101,99,108,97,105,109,32,116,104,97,116,108,97,98,111,114,97,116,111,114 -,121,99,111,109,112,97,116,105,98,108,101,102,97,105,108,117,114,101,32,111,102, -44,32,115,117,99,104,32,97,115,32,98,101,103,97,110,32,119,105,116,104,117,115, -105,110,103,32,116,104,101,32,116,111,32,112,114,111,118,105,100,101,102,101,97, -116,117,114,101,32,111,102,102,114,111,109,32,119,104,105,99,104,47,34,32,99,108 -,97,115,115,61,34,103,101,111,108,111,103,105,99,97,108,115,101,118,101,114,97, -108,32,111,102,100,101,108,105,98,101,114,97,116,101,105,109,112,111,114,116,97, -110,116,32,104,111,108,100,115,32,116,104,97,116,105,110,103,38,113,117,111,116, -59,32,118,97,108,105,103,110,61,116,111,112,116,104,101,32,71,101,114,109,97,110 -,111,117,116,115,105,100,101,32,111,102,110,101,103,111,116,105,97,116,101,100, -104,105,115,32,99,97,114,101,101,114,115,101,112,97,114,97,116,105,111,110,105, -100,61,34,115,101,97,114,99,104,119,97,115,32,99,97,108,108,101,100,116,104,101, -32,102,111,117,114,116,104,114,101,99,114,101,97,116,105,111,110,111,116,104,101 -,114,32,116,104,97,110,112,114,101,118,101,110,116,105,111,110,119,104,105,108, -101,32,116,104,101,32,101,100,117,99,97,116,105,111,110,44,99,111,110,110,101,99 -,116,105,110,103,97,99,99,117,114,97,116,101,108,121,119,101,114,101,32,98,117, -105,108,116,119,97,115,32,107,105,108,108,101,100,97,103,114,101,101,109,101,110 -,116,115,109,117,99,104,32,109,111,114,101,32,68,117,101,32,116,111,32,116,104, -101,119,105,100,116,104,58,32,49,48,48,115,111,109,101,32,111,116,104,101,114,75 -,105,110,103,100,111,109,32,111,102,116,104,101,32,101,110,116,105,114,101,102, -97,109,111,117,115,32,102,111,114,116,111,32,99,111,110,110,101,99,116,111,98, -106,101,99,116,105,118,101,115,116,104,101,32,70,114,101,110,99,104,112,101,111, -112,108,101,32,97,110,100,102,101,97,116,117,114,101,100,34,62,105,115,32,115,97 -,105,100,32,116,111,115,116,114,117,99,116,117,114,97,108,114,101,102,101,114, -101,110,100,117,109,109,111,115,116,32,111,102,116,101,110,97,32,115,101,112,97, -114,97,116,101,45,62,10,60,100,105,118,32,105,100,32,79,102,102,105,99,105,97, -108,32,119,111,114,108,100,119,105,100,101,46,97,114,105,97,45,108,97,98,101,108 -,116,104,101,32,112,108,97,110,101,116,97,110,100,32,105,116,32,119,97,115,100, -34,32,118,97,108,117,101,61,34,108,111,111,107,105,110,103,32,97,116,98,101,110, -101,102,105,99,105,97,108,97,114,101,32,105,110,32,116,104,101,109,111,110,105, -116,111,114,105,110,103,114,101,112,111,114,116,101,100,108,121,116,104,101,32, -109,111,100,101,114,110,119,111,114,107,105,110,103,32,111,110,97,108,108,111, -119,101,100,32,116,111,119,104,101,114,101,32,116,104,101,32,105,110,110,111,118 -,97,116,105,118,101,60,47,97,62,60,47,100,105,118,62,115,111,117,110,100,116,114 -,97,99,107,115,101,97,114,99,104,70,111,114,109,116,101,110,100,32,116,111,32,98 -,101,105,110,112,117,116,32,105,100,61,34,111,112,101,110,105,110,103,32,111,102 -,114,101,115,116,114,105,99,116,101,100,97,100,111,112,116,101,100,32,98,121,97, -100,100,114,101,115,115,105,110,103,116,104,101,111,108,111,103,105,97,110,109, -101,116,104,111,100,115,32,111,102,118,97,114,105,97,110,116,32,111,102,67,104, -114,105,115,116,105,97,110,32,118,101,114,121,32,108,97,114,103,101,97,117,116, -111,109,111,116,105,118,101,98,121,32,102,97,114,32,116,104,101,114,97,110,103, -101,32,102,114,111,109,112,117,114,115,117,105,116,32,111,102,102,111,108,108, -111,119,32,116,104,101,98,114,111,117,103,104,116,32,116,111,105,110,32,69,110, -103,108,97,110,100,97,103,114,101,101,32,116,104,97,116,97,99,99,117,115,101,100 -,32,111,102,99,111,109,101,115,32,102,114,111,109,112,114,101,118,101,110,116, -105,110,103,100,105,118,32,115,116,121,108,101,61,104,105,115,32,111,114,32,104, -101,114,116,114,101,109,101,110,100,111,117,115,102,114,101,101,100,111,109,32, -111,102,99,111,110,99,101,114,110,105,110,103,48,32,49,101,109,32,49,101,109,59, -66,97,115,107,101,116,98,97,108,108,47,115,116,121,108,101,46,99,115,115,97,110, -32,101,97,114,108,105,101,114,101,118,101,110,32,97,102,116,101,114,47,34,32,116 -,105,116,108,101,61,34,46,99,111,109,47,105,110,100,101,120,116,97,107,105,110, -103,32,116,104,101,112,105,116,116,115,98,117,114,103,104,99,111,110,116,101,110 -,116,34,62,13,60,115,99,114,105,112,116,62,40,102,116,117,114,110,101,100,32,111 -,117,116,104,97,118,105,110,103,32,116,104,101,60,47,115,112,97,110,62,13,10,32, -111,99,99,97,115,105,111,110,97,108,98,101,99,97,117,115,101,32,105,116,115,116, -97,114,116,101,100,32,116,111,112,104,121,115,105,99,97,108,108,121,62,60,47,100 -,105,118,62,10,32,32,99,114,101,97,116,101,100,32,98,121,67,117,114,114,101,110, -116,108,121,44,32,98,103,99,111,108,111,114,61,34,116,97,98,105,110,100,101,120, -61,34,100,105,115,97,115,116,114,111,117,115,65,110,97,108,121,116,105,99,115,32 -,97,108,115,111,32,104,97,115,32,97,62,60,100,105,118,32,105,100,61,34,60,47,115 -,116,121,108,101,62,10,60,99,97,108,108,101,100,32,102,111,114,115,105,110,103, -101,114,32,97,110,100,46,115,114,99,32,61,32,34,47,47,118,105,111,108,97,116,105 -,111,110,115,116,104,105,115,32,112,111,105,110,116,99,111,110,115,116,97,110, -116,108,121,105,115,32,108,111,99,97,116,101,100,114,101,99,111,114,100,105,110, -103,115,100,32,102,114,111,109,32,116,104,101,110,101,100,101,114,108,97,110,100 -,115,112,111,114,116,117,103,117,195,170,115,215,162,215,145,215,168,215,153,215 -,170,217,129,216,167,216,177,216,179,219,140,100,101,115,97,114,114,111,108,108, -111,99,111,109,101,110,116,97,114,105,111,101,100,117,99,97,99,105,195,179,110, -115,101,112,116,105,101,109,98,114,101,114,101,103,105,115,116,114,97,100,111, -100,105,114,101,99,99,105,195,179,110,117,98,105,99,97,99,105,195,179,110,112, -117,98,108,105,99,105,100,97,100,114,101,115,112,117,101,115,116,97,115,114,101, -115,117,108,116,97,100,111,115,105,109,112,111,114,116,97,110,116,101,114,101, -115,101,114,118,97,100,111,115,97,114,116,195,173,99,117,108,111,115,100,105,102 -,101,114,101,110,116,101,115,115,105,103,117,105,101,110,116,101,115,114,101,112 -,195,186,98,108,105,99,97,115,105,116,117,97,99,105,195,179,110,109,105,110,105, -115,116,101,114,105,111,112,114,105,118,97,99,105,100,97,100,100,105,114,101,99, -116,111,114,105,111,102,111,114,109,97,99,105,195,179,110,112,111,98,108,97,99, -105,195,179,110,112,114,101,115,105,100,101,110,116,101,99,111,110,116,101,110, -105,100,111,115,97,99,99,101,115,111,114,105,111,115,116,101,99,104,110,111,114, -97,116,105,112,101,114,115,111,110,97,108,101,115,99,97,116,101,103,111,114,195, -173,97,101,115,112,101,99,105,97,108,101,115,100,105,115,112,111,110,105,98,108, -101,97,99,116,117,97,108,105,100,97,100,114,101,102,101,114,101,110,99,105,97, -118,97,108,108,97,100,111,108,105,100,98,105,98,108,105,111,116,101,99,97,114, -101,108,97,99,105,111,110,101,115,99,97,108,101,110,100,97,114,105,111,112,111, -108,195,173,116,105,99,97,115,97,110,116,101,114,105,111,114,101,115,100,111,99, -117,109,101,110,116,111,115,110,97,116,117,114,97,108,101,122,97,109,97,116,101, -114,105,97,108,101,115,100,105,102,101,114,101,110,99,105,97,101,99,111,110,195, -179,109,105,99,97,116,114,97,110,115,112,111,114,116,101,114,111,100,114,195,173 -,103,117,101,122,112,97,114,116,105,99,105,112,97,114,101,110,99,117,101,110,116 -,114,97,110,100,105,115,99,117,115,105,195,179,110,101,115,116,114,117,99,116, -117,114,97,102,117,110,100,97,99,105,195,179,110,102,114,101,99,117,101,110,116, -101,115,112,101,114,109,97,110,101,110,116,101,116,111,116,97,108,109,101,110, -116,101,208,188,208,190,208,182,208,189,208,190,208,177,209,131,208,180,208,181, -209,130,208,188,208,190,208,182,208,181,209,130,208,178,209,128,208,181,208,188, -209,143,209,130,208,176,208,186,208,182,208,181,209,135,209,130,208,190,208,177, -209,139,208,177,208,190,208,187,208,181,208,181,208,190,209,135,208,181,208,189, -209,140,209,141,209,130,208,190,208,179,208,190,208,186,208,190,208,179,208,180, -208,176,208,191,208,190,209,129,208,187,208,181,208,178,209,129,208,181,208,179, -208,190,209,129,208,176,208,185,209,130,208,181,209,135,208,181,209,128,208,181, -208,183,208,188,208,190,208,179,209,131,209,130,209,129,208,176,208,185,209,130, -208,176,208,182,208,184,208,183,208,189,208,184,208,188,208,181,208,182,208,180, -209,131,208,177,209,131,208,180,209,131,209,130,208,159,208,190,208,184,209,129, -208,186,208,183,208,180,208,181,209,129,209,140,208,178,208,184,208,180,208,181, -208,190,209,129,208,178,209,143,208,183,208,184,208,189,209,131,208,182,208,189, -208,190,209,129,208,178,208,190,208,181,208,185,208,187,209,142,208,180,208,181, -208,185,208,191,208,190,209,128,208,189,208,190,208,188,208,189,208,190,208,179, -208,190,208,180,208,181,209,130,208,181,208,185,209,129,208,178,208,190,208,184, -209,133,208,191,209,128,208,176,208,178,208,176,209,130,208,176,208,186,208,190, -208,185,208,188,208,181,209,129,209,130,208,190,208,184,208,188,208,181,208,181, -209,130,208,182,208,184,208,183,208,189,209,140,208,190,208,180,208,189,208,190, -208,185,208,187,209,131,209,135,209,136,208,181,208,191,208,181,209,128,208,181, -208,180,209,135,208,176,209,129,209,130,208,184,209,135,208,176,209,129,209,130, -209,140,209,128,208,176,208,177,208,190,209,130,208,189,208,190,208,178,209,139, -209,133,208,191,209,128,208,176,208,178,208,190,209,129,208,190,208,177,208,190, -208,185,208,191,208,190,209,130,208,190,208,188,208,188,208,181,208,189,208,181, -208,181,209,135,208,184,209,129,208,187,208,181,208,189,208,190,208,178,209,139, -208,181,209,131,209,129,208,187,209,131,208,179,208,190,208,186,208,190,208,187, -208,190,208,189,208,176,208,183,208,176,208,180,209,130,208,176,208,186,208,190, -208,181,209,130,208,190,208,179,208,180,208,176,208,191,208,190,209,135,209,130, -208,184,208,159,208,190,209,129,208,187,208,181,209,130,208,176,208,186,208,184, -208,181,208,189,208,190,208,178,209,139,208,185,209,129,209,130,208,190,208,184, -209,130,209,130,208,176,208,186,208,184,209,133,209,129,209,128,208,176,208,183, -209,131,208,161,208,176,208,189,208,186,209,130,209,132,208,190,209,128,209,131, -208,188,208,154,208,190,208,179,208,180,208,176,208,186,208,189,208,184,208,179, -208,184,209,129,208,187,208,190,208,178,208,176,208,189,208,176,209,136,208,181, -208,185,208,189,208,176,208,185,209,130,208,184,209,129,208,178,208,190,208,184, -208,188,209,129,208,178,209,143,208,183,209,140,208,187,209,142,208,177,208,190, -208,185,209,135,208,176,209,129,209,130,208,190,209,129,209,128,208,181,208,180, -208,184,208,154,209,128,208,190,208,188,208,181,208,164,208,190,209,128,209,131, -208,188,209,128,209,139,208,189,208,186,208,181,209,129,209,130,208,176,208,187, -208,184,208,191,208,190,208,184,209,129,208,186,209,130,209,139,209,129,209,143, -209,135,208,188,208,181,209,129,209,143,209,134,209,134,208,181,208,189,209,130, -209,128,209,130,209,128,209,131,208,180,208,176,209,129,208,176,208,188,209,139, -209,133,209,128,209,139,208,189,208,186,208,176,208,157,208,190,208,178,209,139, -208,185,209,135,208,176,209,129,208,190,208,178,208,188,208,181,209,129,209,130, -208,176,209,132,208,184,208,187,209,140,208,188,208,188,208,176,209,128,209,130, -208,176,209,129,209,130,209,128,208,176,208,189,208,188,208,181,209,129,209,130, -208,181,209,130,208,181,208,186,209,129,209,130,208,189,208,176,209,136,208,184, -209,133,208,188,208,184,208,189,209,131,209,130,208,184,208,188,208,181,208,189, -208,184,208,184,208,188,208,181,209,142,209,130,208,189,208,190,208,188,208,181, -209,128,208,179,208,190,209,128,208,190,208,180,209,129,208,176,208,188,208,190, -208,188,209,141,209,130,208,190,208,188,209,131,208,186,208,190,208,189,209,134, -208,181,209,129,208,178,208,190,208,181,208,188,208,186,208,176,208,186,208,190, -208,185,208,144,209,128,209,133,208,184,208,178,217,133,217,134,216,170,216,175, -217,137,216,165,216,177,216,179,216,167,217,132,216,177,216,179,216,167,217,132, -216,169,216,167,217,132,216,185,216,167,217,133,217,131,216,170,216,168,217,135, -216,167,216,168,216,177,216,167,217,133,216,172,216,167,217,132,217,138,217,136, -217,133,216,167,217,132,216,181,217,136,216,177,216,172,216,175,217,138,216,175, -216,169,216,167,217,132,216,185,216,182,217,136,216,165,216,182,216,167,217,129, -216,169,216,167,217,132,217,130,216,179,217,133,216,167,217,132,216,185,216,167, -216,168,216,170,216,173,217,133,217,138,217,132,217,133,217,132,217,129,216,167, -216,170,217,133,217,132,216,170,217,130,217,137,216,170,216,185,216,175,217,138, -217,132,216,167,217,132,216,180,216,185,216,177,216,163,216,174,216,168,216,167, -216,177,216,170,216,183,217,136,217,138,216,177,216,185,217,132,217,138,217,131, -217,133,216,165,216,177,217,129,216,167,217,130,216,183,217,132,216,168,216,167, -216,170,216,167,217,132,217,132,216,186,216,169,216,170,216,177,216,170,217,138, -216,168,216,167,217,132,217,134,216,167,216,179,216,167,217,132,216,180,217,138, -216,174,217,133,217,134,216,170,216,175,217,138,216,167,217,132,216,185,216,177, -216,168,216,167,217,132,217,130,216,181,216,181,216,167,217,129,217,132,216,167, -217,133,216,185,217,132,217,138,217,135,216,167,216,170,216,173,216,175,217,138, -216,171,216,167,217,132,217,132,217,135,217,133,216,167,217,132,216,185,217,133, -217,132,217,133,217,131,216,170,216,168,216,169,217,138,217,133,217,131,217,134, -217,131,216,167,217,132,216,183,217,129,217,132,217,129,217,138,216,175,217,138, -217,136,216,165,216,175,216,167,216,177,216,169,216,170,216,167,216,177,217,138, -216,174,216,167,217,132,216,181,216,173,216,169,216,170,216,179,216,172,217,138, -217,132,216,167,217,132,217,136,217,130,216,170,216,185,217,134,216,175,217,133, -216,167,217,133,216,175,217,138,217,134,216,169,216,170,216,181,217,133,217,138, -217,133,216,163,216,177,216,180,217,138,217,129,216,167,217,132,216,176,217,138, -217,134,216,185,216,177,216,168,217,138,216,169,216,168,217,136,216,167,216,168, -216,169,216,163,217,132,216,185,216,167,216,168,216,167,217,132,216,179,217,129, -216,177,217,133,216,180,216,167,217,131,217,132,216,170,216,185,216,167,217,132, -217,137,216,167,217,132,216,163,217,136,217,132,216,167,217,132,216,179,217,134, -216,169,216,172,216,167,217,133,216,185,216,169,216,167,217,132,216,181,216,173, -217,129,216,167,217,132,216,175,217,138,217,134,217,131,217,132,217,133,216,167, -216,170,216,167,217,132,216,174,216,167,216,181,216,167,217,132,217,133,217,132, -217,129,216,163,216,185,216,182,216,167,216,161,217,131,216,170,216,167,216,168, -216,169,216,167,217,132,216,174,217,138,216,177,216,177,216,179,216,167,216,166, -217,132,216,167,217,132,217,130,217,132,216,168,216,167,217,132,216,163,216,175, -216,168,217,133,217,130,216,167,216,183,216,185,217,133,216,177,216,167,216,179, -217,132,217,133,217,134,216,183,217,130,216,169,216,167,217,132,217,131,216,170, -216,168,216,167,217,132,216,177,216,172,217,132,216,167,216,180,216,170,216,177, -217,131,216,167,217,132,217,130,216,175,217,133,217,138,216,185,216,183,217,138, -217,131,115,66,121,84,97,103,78,97,109,101,40,46,106,112,103,34,32,97,108,116,61 -,34,49,112,120,32,115,111,108,105,100,32,35,46,103,105,102,34,32,97,108,116,61, -34,116,114,97,110,115,112,97,114,101,110,116,105,110,102,111,114,109,97,116,105, -111,110,97,112,112,108,105,99,97,116,105,111,110,34,32,111,110,99,108,105,99,107 -,61,34,101,115,116,97,98,108,105,115,104,101,100,97,100,118,101,114,116,105,115, -105,110,103,46,112,110,103,34,32,97,108,116,61,34,101,110,118,105,114,111,110, -109,101,110,116,112,101,114,102,111,114,109,97,110,99,101,97,112,112,114,111,112 -,114,105,97,116,101,38,97,109,112,59,109,100,97,115,104,59,105,109,109,101,100, -105,97,116,101,108,121,60,47,115,116,114,111,110,103,62,60,47,114,97,116,104,101 -,114,32,116,104,97,110,116,101,109,112,101,114,97,116,117,114,101,100,101,118, -101,108,111,112,109,101,110,116,99,111,109,112,101,116,105,116,105,111,110,112, -108,97,99,101,104,111,108,100,101,114,118,105,115,105,98,105,108,105,116,121,58, -99,111,112,121,114,105,103,104,116,34,62,48,34,32,104,101,105,103,104,116,61,34, -101,118,101,110,32,116,104,111,117,103,104,114,101,112,108,97,99,101,109,101,110 -,116,100,101,115,116,105,110,97,116,105,111,110,67,111,114,112,111,114,97,116, -105,111,110,60,117,108,32,99,108,97,115,115,61,34,65,115,115,111,99,105,97,116, -105,111,110,105,110,100,105,118,105,100,117,97,108,115,112,101,114,115,112,101, -99,116,105,118,101,115,101,116,84,105,109,101,111,117,116,40,117,114,108,40,104, -116,116,112,58,47,47,109,97,116,104,101,109,97,116,105,99,115,109,97,114,103,105 -,110,45,116,111,112,58,101,118,101,110,116,117,97,108,108,121,32,100,101,115,99, -114,105,112,116,105,111,110,41,32,110,111,45,114,101,112,101,97,116,99,111,108, -108,101,99,116,105,111,110,115,46,74,80,71,124,116,104,117,109,98,124,112,97,114 -,116,105,99,105,112,97,116,101,47,104,101,97,100,62,60,98,111,100,121,102,108, -111,97,116,58,108,101,102,116,59,60,108,105,32,99,108,97,115,115,61,34,104,117, -110,100,114,101,100,115,32,111,102,10,10,72,111,119,101,118,101,114,44,32,99,111 -,109,112,111,115,105,116,105,111,110,99,108,101,97,114,58,98,111,116,104,59,99, -111,111,112,101,114,97,116,105,111,110,119,105,116,104,105,110,32,116,104,101,32 -,108,97,98,101,108,32,102,111,114,61,34,98,111,114,100,101,114,45,116,111,112,58 -,78,101,119,32,90,101,97,108,97,110,100,114,101,99,111,109,109,101,110,100,101, -100,112,104,111,116,111,103,114,97,112,104,121,105,110,116,101,114,101,115,116, -105,110,103,38,108,116,59,115,117,112,38,103,116,59,99,111,110,116,114,111,118, -101,114,115,121,78,101,116,104,101,114,108,97,110,100,115,97,108,116,101,114,110 -,97,116,105,118,101,109,97,120,108,101,110,103,116,104,61,34,115,119,105,116,122 -,101,114,108,97,110,100,68,101,118,101,108,111,112,109,101,110,116,101,115,115, -101,110,116,105,97,108,108,121,10,10,65,108,116,104,111,117,103,104,32,60,47,116 -,101,120,116,97,114,101,97,62,116,104,117,110,100,101,114,98,105,114,100,114,101 -,112,114,101,115,101,110,116,101,100,38,97,109,112,59,110,100,97,115,104,59,115, -112,101,99,117,108,97,116,105,111,110,99,111,109,109,117,110,105,116,105,101,115 -,108,101,103,105,115,108,97,116,105,111,110,101,108,101,99,116,114,111,110,105, -99,115,10,9,60,100,105,118,32,105,100,61,34,105,108,108,117,115,116,114,97,116, -101,100,101,110,103,105,110,101,101,114,105,110,103,116,101,114,114,105,116,111, -114,105,101,115,97,117,116,104,111,114,105,116,105,101,115,100,105,115,116,114, -105,98,117,116,101,100,54,34,32,104,101,105,103,104,116,61,34,115,97,110,115,45, -115,101,114,105,102,59,99,97,112,97,98,108,101,32,111,102,32,100,105,115,97,112, -112,101,97,114,101,100,105,110,116,101,114,97,99,116,105,118,101,108,111,111,107 -,105,110,103,32,102,111,114,105,116,32,119,111,117,108,100,32,98,101,65,102,103, -104,97,110,105,115,116,97,110,119,97,115,32,99,114,101,97,116,101,100,77,97,116, -104,46,102,108,111,111,114,40,115,117,114,114,111,117,110,100,105,110,103,99,97, -110,32,97,108,115,111,32,98,101,111,98,115,101,114,118,97,116,105,111,110,109,97 -,105,110,116,101,110,97,110,99,101,101,110,99,111,117,110,116,101,114,101,100,60 -,104,50,32,99,108,97,115,115,61,34,109,111,114,101,32,114,101,99,101,110,116,105 -,116,32,104,97,115,32,98,101,101,110,105,110,118,97,115,105,111,110,32,111,102, -41,46,103,101,116,84,105,109,101,40,41,102,117,110,100,97,109,101,110,116,97,108 -,68,101,115,112,105,116,101,32,116,104,101,34,62,60,100,105,118,32,105,100,61,34 -,105,110,115,112,105,114,97,116,105,111,110,101,120,97,109,105,110,97,116,105, -111,110,112,114,101,112,97,114,97,116,105,111,110,101,120,112,108,97,110,97,116, -105,111,110,60,105,110,112,117,116,32,105,100,61,34,60,47,97,62,60,47,115,112,97 -,110,62,118,101,114,115,105,111,110,115,32,111,102,105,110,115,116,114,117,109, -101,110,116,115,98,101,102,111,114,101,32,116,104,101,32,32,61,32,39,104,116,116 -,112,58,47,47,68,101,115,99,114,105,112,116,105,111,110,114,101,108,97,116,105, -118,101,108,121,32,46,115,117,98,115,116,114,105,110,103,40,101,97,99,104,32,111 -,102,32,116,104,101,101,120,112,101,114,105,109,101,110,116,115,105,110,102,108, -117,101,110,116,105,97,108,105,110,116,101,103,114,97,116,105,111,110,109,97,110 -,121,32,112,101,111,112,108,101,100,117,101,32,116,111,32,116,104,101,32,99,111, -109,98,105,110,97,116,105,111,110,100,111,32,110,111,116,32,104,97,118,101,77, -105,100,100,108,101,32,69,97,115,116,60,110,111,115,99,114,105,112,116,62,60,99, -111,112,121,114,105,103,104,116,34,32,112,101,114,104,97,112,115,32,116,104,101, -105,110,115,116,105,116,117,116,105,111,110,105,110,32,68,101,99,101,109,98,101, -114,97,114,114,97,110,103,101,109,101,110,116,109,111,115,116,32,102,97,109,111, -117,115,112,101,114,115,111,110,97,108,105,116,121,99,114,101,97,116,105,111,110 -,32,111,102,108,105,109,105,116,97,116,105,111,110,115,101,120,99,108,117,115, -105,118,101,108,121,115,111,118,101,114,101,105,103,110,116,121,45,99,111,110, -116,101,110,116,34,62,10,60,116,100,32,99,108,97,115,115,61,34,117,110,100,101, -114,103,114,111,117,110,100,112,97,114,97,108,108,101,108,32,116,111,100,111,99, -116,114,105,110,101,32,111,102,111,99,99,117,112,105,101,100,32,98,121,116,101, -114,109,105,110,111,108,111,103,121,82,101,110,97,105,115,115,97,110,99,101,97, -32,110,117,109,98,101,114,32,111,102,115,117,112,112,111,114,116,32,102,111,114, -101,120,112,108,111,114,97,116,105,111,110,114,101,99,111,103,110,105,116,105, -111,110,112,114,101,100,101,99,101,115,115,111,114,60,105,109,103,32,115,114,99, -61,34,47,60,104,49,32,99,108,97,115,115,61,34,112,117,98,108,105,99,97,116,105, -111,110,109,97,121,32,97,108,115,111,32,98,101,115,112,101,99,105,97,108,105,122 -,101,100,60,47,102,105,101,108,100,115,101,116,62,112,114,111,103,114,101,115, -115,105,118,101,109,105,108,108,105,111,110,115,32,111,102,115,116,97,116,101, -115,32,116,104,97,116,101,110,102,111,114,99,101,109,101,110,116,97,114,111,117, -110,100,32,116,104,101,32,111,110,101,32,97,110,111,116,104,101,114,46,112,97, -114,101,110,116,78,111,100,101,97,103,114,105,99,117,108,116,117,114,101,65,108, -116,101,114,110,97,116,105,118,101,114,101,115,101,97,114,99,104,101,114,115,116 -,111,119,97,114,100,115,32,116,104,101,77,111,115,116,32,111,102,32,116,104,101, -109,97,110,121,32,111,116,104,101,114,32,40,101,115,112,101,99,105,97,108,108, -121,60,116,100,32,119,105,100,116,104,61,34,59,119,105,100,116,104,58,49,48,48, -37,105,110,100,101,112,101,110,100,101,110,116,60,104,51,32,99,108,97,115,115,61 -,34,32,111,110,99,104,97,110,103,101,61,34,41,46,97,100,100,67,108,97,115,115,40 -,105,110,116,101,114,97,99,116,105,111,110,79,110,101,32,111,102,32,116,104,101, -32,100,97,117,103,104,116,101,114,32,111,102,97,99,99,101,115,115,111,114,105, -101,115,98,114,97,110,99,104,101,115,32,111,102,13,10,60,100,105,118,32,105,100, -61,34,116,104,101,32,108,97,114,103,101,115,116,100,101,99,108,97,114,97,116,105 -,111,110,114,101,103,117,108,97,116,105,111,110,115,73,110,102,111,114,109,97, -116,105,111,110,116,114,97,110,115,108,97,116,105,111,110,100,111,99,117,109,101 -,110,116,97,114,121,105,110,32,111,114,100,101,114,32,116,111,34,62,10,60,104, -101,97,100,62,10,60,34,32,104,101,105,103,104,116,61,34,49,97,99,114,111,115,115 -,32,116,104,101,32,111,114,105,101,110,116,97,116,105,111,110,41,59,60,47,115,99 -,114,105,112,116,62,105,109,112,108,101,109,101,110,116,101,100,99,97,110,32,98, -101,32,115,101,101,110,116,104,101,114,101,32,119,97,115,32,97,100,101,109,111, -110,115,116,114,97,116,101,99,111,110,116,97,105,110,101,114,34,62,99,111,110, -110,101,99,116,105,111,110,115,116,104,101,32,66,114,105,116,105,115,104,119,97, -115,32,119,114,105,116,116,101,110,33,105,109,112,111,114,116,97,110,116,59,112, -120,59,32,109,97,114,103,105,110,45,102,111,108,108,111,119,101,100,32,98,121,97 -,98,105,108,105,116,121,32,116,111,32,99,111,109,112,108,105,99,97,116,101,100, -100,117,114,105,110,103,32,116,104,101,32,105,109,109,105,103,114,97,116,105,111 -,110,97,108,115,111,32,99,97,108,108,101,100,60,104,52,32,99,108,97,115,115,61, -34,100,105,115,116,105,110,99,116,105,111,110,114,101,112,108,97,99,101,100,32, -98,121,103,111,118,101,114,110,109,101,110,116,115,108,111,99,97,116,105,111,110 -,32,111,102,105,110,32,78,111,118,101,109,98,101,114,119,104,101,116,104,101,114 -,32,116,104,101,60,47,112,62,10,60,47,100,105,118,62,97,99,113,117,105,115,105, -116,105,111,110,99,97,108,108,101,100,32,116,104,101,32,112,101,114,115,101,99, -117,116,105,111,110,100,101,115,105,103,110,97,116,105,111,110,123,102,111,110, -116,45,115,105,122,101,58,97,112,112,101,97,114,101,100,32,105,110,105,110,118, -101,115,116,105,103,97,116,101,101,120,112,101,114,105,101,110,99,101,100,109, -111,115,116,32,108,105,107,101,108,121,119,105,100,101,108,121,32,117,115,101, -100,100,105,115,99,117,115,115,105,111,110,115,112,114,101,115,101,110,99,101,32 -,111,102,32,40,100,111,99,117,109,101,110,116,46,101,120,116,101,110,115,105,118 -,101,108,121,73,116,32,104,97,115,32,98,101,101,110,105,116,32,100,111,101,115, -32,110,111,116,99,111,110,116,114,97,114,121,32,116,111,105,110,104,97,98,105, -116,97,110,116,115,105,109,112,114,111,118,101,109,101,110,116,115,99,104,111, -108,97,114,115,104,105,112,99,111,110,115,117,109,112,116,105,111,110,105,110, -115,116,114,117,99,116,105,111,110,102,111,114,32,101,120,97,109,112,108,101,111 -,110,101,32,111,114,32,109,111,114,101,112,120,59,32,112,97,100,100,105,110,103, -116,104,101,32,99,117,114,114,101,110,116,97,32,115,101,114,105,101,115,32,111, -102,97,114,101,32,117,115,117,97,108,108,121,114,111,108,101,32,105,110,32,116, -104,101,112,114,101,118,105,111,117,115,108,121,32,100,101,114,105,118,97,116, -105,118,101,115,101,118,105,100,101,110,99,101,32,111,102,101,120,112,101,114, -105,101,110,99,101,115,99,111,108,111,114,115,99,104,101,109,101,115,116,97,116, -101,100,32,116,104,97,116,99,101,114,116,105,102,105,99,97,116,101,60,47,97,62, -60,47,100,105,118,62,10,32,115,101,108,101,99,116,101,100,61,34,104,105,103,104, -32,115,99,104,111,111,108,114,101,115,112,111,110,115,101,32,116,111,99,111,109, -102,111,114,116,97,98,108,101,97,100,111,112,116,105,111,110,32,111,102,116,104, -114,101,101,32,121,101,97,114,115,116,104,101,32,99,111,117,110,116,114,121,105, -110,32,70,101,98,114,117,97,114,121,115,111,32,116,104,97,116,32,116,104,101,112 -,101,111,112,108,101,32,119,104,111,32,112,114,111,118,105,100,101,100,32,98,121 -,60,112,97,114,97,109,32,110,97,109,101,97,102,102,101,99,116,101,100,32,98,121, -105,110,32,116,101,114,109,115,32,111,102,97,112,112,111,105,110,116,109,101,110 -,116,73,83,79,45,56,56,53,57,45,49,34,119,97,115,32,98,111,114,110,32,105,110, -104,105,115,116,111,114,105,99,97,108,32,114,101,103,97,114,100,101,100,32,97, -115,109,101,97,115,117,114,101,109,101,110,116,105,115,32,98,97,115,101,100,32, -111,110,32,97,110,100,32,111,116,104,101,114,32,58,32,102,117,110,99,116,105,111 -,110,40,115,105,103,110,105,102,105,99,97,110,116,99,101,108,101,98,114,97,116, -105,111,110,116,114,97,110,115,109,105,116,116,101,100,47,106,115,47,106,113,117 -,101,114,121,46,105,115,32,107,110,111,119,110,32,97,115,116,104,101,111,114,101 -,116,105,99,97,108,32,116,97,98,105,110,100,101,120,61,34,105,116,32,99,111,117, -108,100,32,98,101,60,110,111,115,99,114,105,112,116,62,10,104,97,118,105,110,103 -,32,98,101,101,110,13,10,60,104,101,97,100,62,13,10,60,32,38,113,117,111,116,59, -84,104,101,32,99,111,109,112,105,108,97,116,105,111,110,104,101,32,104,97,100,32 -,98,101,101,110,112,114,111,100,117,99,101,100,32,98,121,112,104,105,108,111,115 -,111,112,104,101,114,99,111,110,115,116,114,117,99,116,101,100,105,110,116,101, -110,100,101,100,32,116,111,97,109,111,110,103,32,111,116,104,101,114,99,111,109, -112,97,114,101,100,32,116,111,116,111,32,115,97,121,32,116,104,97,116,69,110,103 -,105,110,101,101,114,105,110,103,97,32,100,105,102,102,101,114,101,110,116,114, -101,102,101,114,114,101,100,32,116,111,100,105,102,102,101,114,101,110,99,101, -115,98,101,108,105,101,102,32,116,104,97,116,112,104,111,116,111,103,114,97,112, -104,115,105,100,101,110,116,105,102,121,105,110,103,72,105,115,116,111,114,121, -32,111,102,32,82,101,112,117,98,108,105,99,32,111,102,110,101,99,101,115,115,97, -114,105,108,121,112,114,111,98,97,98,105,108,105,116,121,116,101,99,104,110,105, -99,97,108,108,121,108,101,97,118,105,110,103,32,116,104,101,115,112,101,99,116, -97,99,117,108,97,114,102,114,97,99,116,105,111,110,32,111,102,101,108,101,99,116 -,114,105,99,105,116,121,104,101,97,100,32,111,102,32,116,104,101,114,101,115,116 -,97,117,114,97,110,116,115,112,97,114,116,110,101,114,115,104,105,112,101,109, -112,104,97,115,105,115,32,111,110,109,111,115,116,32,114,101,99,101,110,116,115, -104,97,114,101,32,119,105,116,104,32,115,97,121,105,110,103,32,116,104,97,116, -102,105,108,108,101,100,32,119,105,116,104,100,101,115,105,103,110,101,100,32, -116,111,105,116,32,105,115,32,111,102,116,101,110,34,62,60,47,105,102,114,97,109 -,101,62,97,115,32,102,111,108,108,111,119,115,58,109,101,114,103,101,100,32,119, -105,116,104,116,104,114,111,117,103,104,32,116,104,101,99,111,109,109,101,114,99 -,105,97,108,32,112,111,105,110,116,101,100,32,111,117,116,111,112,112,111,114, -116,117,110,105,116,121,118,105,101,119,32,111,102,32,116,104,101,114,101,113, -117,105,114,101,109,101,110,116,100,105,118,105,115,105,111,110,32,111,102,112, -114,111,103,114,97,109,109,105,110,103,104,101,32,114,101,99,101,105,118,101,100 -,115,101,116,73,110,116,101,114,118,97,108,34,62,60,47,115,112,97,110,62,60,47, -105,110,32,78,101,119,32,89,111,114,107,97,100,100,105,116,105,111,110,97,108,32 -,99,111,109,112,114,101,115,115,105,111,110,10,10,60,100,105,118,32,105,100,61, -34,105,110,99,111,114,112,111,114,97,116,101,59,60,47,115,99,114,105,112,116,62, -60,97,116,116,97,99,104,69,118,101,110,116,98,101,99,97,109,101,32,116,104,101, -32,34,32,116,97,114,103,101,116,61,34,95,99,97,114,114,105,101,100,32,111,117, -116,83,111,109,101,32,111,102,32,116,104,101,115,99,105,101,110,99,101,32,97,110 -,100,116,104,101,32,116,105,109,101,32,111,102,67,111,110,116,97,105,110,101,114 -,34,62,109,97,105,110,116,97,105,110,105,110,103,67,104,114,105,115,116,111,112, -104,101,114,77,117,99,104,32,111,102,32,116,104,101,119,114,105,116,105,110,103, -115,32,111,102,34,32,104,101,105,103,104,116,61,34,50,115,105,122,101,32,111,102 -,32,116,104,101,118,101,114,115,105,111,110,32,111,102,32,109,105,120,116,117, -114,101,32,111,102,32,98,101,116,119,101,101,110,32,116,104,101,69,120,97,109, -112,108,101,115,32,111,102,101,100,117,99,97,116,105,111,110,97,108,99,111,109, -112,101,116,105,116,105,118,101,32,111,110,115,117,98,109,105,116,61,34,100,105, -114,101,99,116,111,114,32,111,102,100,105,115,116,105,110,99,116,105,118,101,47, -68,84,68,32,88,72,84,77,76,32,114,101,108,97,116,105,110,103,32,116,111,116,101, -110,100,101,110,99,121,32,116,111,112,114,111,118,105,110,99,101,32,111,102,119, -104,105,99,104,32,119,111,117,108,100,100,101,115,112,105,116,101,32,116,104,101 -,115,99,105,101,110,116,105,102,105,99,32,108,101,103,105,115,108,97,116,117,114 -,101,46,105,110,110,101,114,72,84,77,76,32,97,108,108,101,103,97,116,105,111,110 -,115,65,103,114,105,99,117,108,116,117,114,101,119,97,115,32,117,115,101,100,32, -105,110,97,112,112,114,111,97,99,104,32,116,111,105,110,116,101,108,108,105,103, -101,110,116,121,101,97,114,115,32,108,97,116,101,114,44,115,97,110,115,45,115, -101,114,105,102,100,101,116,101,114,109,105,110,105,110,103,80,101,114,102,111, -114,109,97,110,99,101,97,112,112,101,97,114,97,110,99,101,115,44,32,119,104,105, -99,104,32,105,115,32,102,111,117,110,100,97,116,105,111,110,115,97,98,98,114,101 -,118,105,97,116,101,100,104,105,103,104,101,114,32,116,104,97,110,115,32,102,114 -,111,109,32,116,104,101,32,105,110,100,105,118,105,100,117,97,108,32,99,111,109, -112,111,115,101,100,32,111,102,115,117,112,112,111,115,101,100,32,116,111,99,108 -,97,105,109,115,32,116,104,97,116,97,116,116,114,105,98,117,116,105,111,110,102, -111,110,116,45,115,105,122,101,58,49,101,108,101,109,101,110,116,115,32,111,102, -72,105,115,116,111,114,105,99,97,108,32,104,105,115,32,98,114,111,116,104,101, -114,97,116,32,116,104,101,32,116,105,109,101,97,110,110,105,118,101,114,115,97, -114,121,103,111,118,101,114,110,101,100,32,98,121,114,101,108,97,116,101,100,32, -116,111,32,117,108,116,105,109,97,116,101,108,121,32,105,110,110,111,118,97,116, -105,111,110,115,105,116,32,105,115,32,115,116,105,108,108,99,97,110,32,111,110, -108,121,32,98,101,100,101,102,105,110,105,116,105,111,110,115,116,111,71,77,84, -83,116,114,105,110,103,65,32,110,117,109,98,101,114,32,111,102,105,109,103,32,99 -,108,97,115,115,61,34,69,118,101,110,116,117,97,108,108,121,44,119,97,115,32,99, -104,97,110,103,101,100,111,99,99,117,114,114,101,100,32,105,110,110,101,105,103, -104,98,111,114,105,110,103,100,105,115,116,105,110,103,117,105,115,104,119,104, -101,110,32,104,101,32,119,97,115,105,110,116,114,111,100,117,99,105,110,103,116, -101,114,114,101,115,116,114,105,97,108,77,97,110,121,32,111,102,32,116,104,101, -97,114,103,117,101,115,32,116,104,97,116,97,110,32,65,109,101,114,105,99,97,110, -99,111,110,113,117,101,115,116,32,111,102,119,105,100,101,115,112,114,101,97,100 -,32,119,101,114,101,32,107,105,108,108,101,100,115,99,114,101,101,110,32,97,110, -100,32,73,110,32,111,114,100,101,114,32,116,111,101,120,112,101,99,116,101,100, -32,116,111,100,101,115,99,101,110,100,97,110,116,115,97,114,101,32,108,111,99,97 -,116,101,100,108,101,103,105,115,108,97,116,105,118,101,103,101,110,101,114,97, -116,105,111,110,115,32,98,97,99,107,103,114,111,117,110,100,109,111,115,116,32, -112,101,111,112,108,101,121,101,97,114,115,32,97,102,116,101,114,116,104,101,114 -,101,32,105,115,32,110,111,116,104,101,32,104,105,103,104,101,115,116,102,114, -101,113,117,101,110,116,108,121,32,116,104,101,121,32,100,111,32,110,111,116,97, -114,103,117,101,100,32,116,104,97,116,115,104,111,119,101,100,32,116,104,97,116, -112,114,101,100,111,109,105,110,97,110,116,116,104,101,111,108,111,103,105,99,97 -,108,98,121,32,116,104,101,32,116,105,109,101,99,111,110,115,105,100,101,114,105 -,110,103,115,104,111,114,116,45,108,105,118,101,100,60,47,115,112,97,110,62,60, -47,97,62,99,97,110,32,98,101,32,117,115,101,100,118,101,114,121,32,108,105,116, -116,108,101,111,110,101,32,111,102,32,116,104,101,32,104,97,100,32,97,108,114, -101,97,100,121,105,110,116,101,114,112,114,101,116,101,100,99,111,109,109,117, -110,105,99,97,116,101,102,101,97,116,117,114,101,115,32,111,102,103,111,118,101, -114,110,109,101,110,116,44,60,47,110,111,115,99,114,105,112,116,62,101,110,116, -101,114,101,100,32,116,104,101,34,32,104,101,105,103,104,116,61,34,51,73,110,100 -,101,112,101,110,100,101,110,116,112,111,112,117,108,97,116,105,111,110,115,108, -97,114,103,101,45,115,99,97,108,101,46,32,65,108,116,104,111,117,103,104,32,117, -115,101,100,32,105,110,32,116,104,101,100,101,115,116,114,117,99,116,105,111,110 -,112,111,115,115,105,98,105,108,105,116,121,115,116,97,114,116,105,110,103,32, -105,110,116,119,111,32,111,114,32,109,111,114,101,101,120,112,114,101,115,115, -105,111,110,115,115,117,98,111,114,100,105,110,97,116,101,108,97,114,103,101,114 -,32,116,104,97,110,104,105,115,116,111,114,121,32,97,110,100,60,47,111,112,116, -105,111,110,62,13,10,67,111,110,116,105,110,101,110,116,97,108,101,108,105,109, -105,110,97,116,105,110,103,119,105,108,108,32,110,111,116,32,98,101,112,114,97, -99,116,105,99,101,32,111,102,105,110,32,102,114,111,110,116,32,111,102,115,105, -116,101,32,111,102,32,116,104,101,101,110,115,117,114,101,32,116,104,97,116,116, -111,32,99,114,101,97,116,101,32,97,109,105,115,115,105,115,115,105,112,112,105, -112,111,116,101,110,116,105,97,108,108,121,111,117,116,115,116,97,110,100,105, -110,103,98,101,116,116,101,114,32,116,104,97,110,119,104,97,116,32,105,115,32, -110,111,119,115,105,116,117,97,116,101,100,32,105,110,109,101,116,97,32,110,97, -109,101,61,34,84,114,97,100,105,116,105,111,110,97,108,115,117,103,103,101,115, -116,105,111,110,115,84,114,97,110,115,108,97,116,105,111,110,116,104,101,32,102, -111,114,109,32,111,102,97,116,109,111,115,112,104,101,114,105,99,105,100,101,111 -,108,111,103,105,99,97,108,101,110,116,101,114,112,114,105,115,101,115,99,97,108 -,99,117,108,97,116,105,110,103,101,97,115,116,32,111,102,32,116,104,101,114,101, -109,110,97,110,116,115,32,111,102,112,108,117,103,105,110,115,112,97,103,101,47, -105,110,100,101,120,46,112,104,112,63,114,101,109,97,105,110,101,100,32,105,110, -116,114,97,110,115,102,111,114,109,101,100,72,101,32,119,97,115,32,97,108,115, -111,119,97,115,32,97,108,114,101,97,100,121,115,116,97,116,105,115,116,105,99,97 -,108,105,110,32,102,97,118,111,114,32,111,102,77,105,110,105,115,116,114,121,32, -111,102,109,111,118,101,109,101,110,116,32,111,102,102,111,114,109,117,108,97, -116,105,111,110,105,115,32,114,101,113,117,105,114,101,100,60,108,105,110,107,32 -,114,101,108,61,34,84,104,105,115,32,105,115,32,116,104,101,32,60,97,32,104,114, -101,102,61,34,47,112,111,112,117,108,97,114,105,122,101,100,105,110,118,111,108, -118,101,100,32,105,110,97,114,101,32,117,115,101,100,32,116,111,97,110,100,32, -115,101,118,101,114,97,108,109,97,100,101,32,98,121,32,116,104,101,115,101,101, -109,115,32,116,111,32,98,101,108,105,107,101,108,121,32,116,104,97,116,80,97,108 -,101,115,116,105,110,105,97,110,110,97,109,101,100,32,97,102,116,101,114,105,116 -,32,104,97,100,32,98,101,101,110,109,111,115,116,32,99,111,109,109,111,110,116, -111,32,114,101,102,101,114,32,116,111,98,117,116,32,116,104,105,115,32,105,115, -99,111,110,115,101,99,117,116,105,118,101,116,101,109,112,111,114,97,114,105,108 -,121,73,110,32,103,101,110,101,114,97,108,44,99,111,110,118,101,110,116,105,111, -110,115,116,97,107,101,115,32,112,108,97,99,101,115,117,98,100,105,118,105,115, -105,111,110,116,101,114,114,105,116,111,114,105,97,108,111,112,101,114,97,116, -105,111,110,97,108,112,101,114,109,97,110,101,110,116,108,121,119,97,115,32,108, -97,114,103,101,108,121,111,117,116,98,114,101,97,107,32,111,102,105,110,32,116, -104,101,32,112,97,115,116,102,111,108,108,111,119,105,110,103,32,97,32,120,109, -108,110,115,58,111,103,61,34,62,60,97,32,99,108,97,115,115,61,34,99,108,97,115, -115,61,34,116,101,120,116,67,111,110,118,101,114,115,105,111,110,32,109,97,121, -32,98,101,32,117,115,101,100,109,97,110,117,102,97,99,116,117,114,101,97,102,116 -,101,114,32,98,101,105,110,103,99,108,101,97,114,102,105,120,34,62,10,113,117, -101,115,116,105,111,110,32,111,102,119,97,115,32,101,108,101,99,116,101,100,116, -111,32,98,101,99,111,109,101,32,97,98,101,99,97,117,115,101,32,111,102,32,115, -111,109,101,32,112,101,111,112,108,101,105,110,115,112,105,114,101,100,32,98,121 -,115,117,99,99,101,115,115,102,117,108,32,97,32,116,105,109,101,32,119,104,101, -110,109,111,114,101,32,99,111,109,109,111,110,97,109,111,110,103,115,116,32,116, -104,101,97,110,32,111,102,102,105,99,105,97,108,119,105,100,116,104,58,49,48,48, -37,59,116,101,99,104,110,111,108,111,103,121,44,119,97,115,32,97,100,111,112,116 -,101,100,116,111,32,107,101,101,112,32,116,104,101,115,101,116,116,108,101,109, -101,110,116,115,108,105,118,101,32,98,105,114,116,104,115,105,110,100,101,120,46 -,104,116,109,108,34,67,111,110,110,101,99,116,105,99,117,116,97,115,115,105,103, -110,101,100,32,116,111,38,97,109,112,59,116,105,109,101,115,59,97,99,99,111,117, -110,116,32,102,111,114,97,108,105,103,110,61,114,105,103,104,116,116,104,101,32, -99,111,109,112,97,110,121,97,108,119,97,121,115,32,98,101,101,110,114,101,116, -117,114,110,101,100,32,116,111,105,110,118,111,108,118,101,109,101,110,116,66, -101,99,97,117,115,101,32,116,104,101,116,104,105,115,32,112,101,114,105,111,100, -34,32,110,97,109,101,61,34,113,34,32,99,111,110,102,105,110,101,100,32,116,111, -97,32,114,101,115,117,108,116,32,111,102,118,97,108,117,101,61,34,34,32,47,62, -105,115,32,97,99,116,117,97,108,108,121,69,110,118,105,114,111,110,109,101,110, -116,13,10,60,47,104,101,97,100,62,13,10,67,111,110,118,101,114,115,101,108,121, -44,62,10,60,100,105,118,32,105,100,61,34,48,34,32,119,105,100,116,104,61,34,49, -105,115,32,112,114,111,98,97,98,108,121,104,97,118,101,32,98,101,99,111,109,101, -99,111,110,116,114,111,108,108,105,110,103,116,104,101,32,112,114,111,98,108,101 -,109,99,105,116,105,122,101,110,115,32,111,102,112,111,108,105,116,105,99,105,97 -,110,115,114,101,97,99,104,101,100,32,116,104,101,97,115,32,101,97,114,108,121, -32,97,115,58,110,111,110,101,59,32,111,118,101,114,60,116,97,98,108,101,32,99, -101,108,108,118,97,108,105,100,105,116,121,32,111,102,100,105,114,101,99,116,108 -,121,32,116,111,111,110,109,111,117,115,101,100,111,119,110,119,104,101,114,101, -32,105,116,32,105,115,119,104,101,110,32,105,116,32,119,97,115,109,101,109,98, -101,114,115,32,111,102,32,114,101,108,97,116,105,111,110,32,116,111,97,99,99,111 -,109,109,111,100,97,116,101,97,108,111,110,103,32,119,105,116,104,32,73,110,32, -116,104,101,32,108,97,116,101,116,104,101,32,69,110,103,108,105,115,104,100,101, -108,105,99,105,111,117,115,34,62,116,104,105,115,32,105,115,32,110,111,116,116, -104,101,32,112,114,101,115,101,110,116,105,102,32,116,104,101,121,32,97,114,101, -97,110,100,32,102,105,110,97,108,108,121,97,32,109,97,116,116,101,114,32,111,102 -,13,10,9,60,47,100,105,118,62,13,10,13,10,60,47,115,99,114,105,112,116,62,102,97 -,115,116,101,114,32,116,104,97,110,109,97,106,111,114,105,116,121,32,111,102,97, -102,116,101,114,32,119,104,105,99,104,99,111,109,112,97,114,97,116,105,118,101, -116,111,32,109,97,105,110,116,97,105,110,105,109,112,114,111,118,101,32,116,104, -101,97,119,97,114,100,101,100,32,116,104,101,101,114,34,32,99,108,97,115,115,61, -34,102,114,97,109,101,98,111,114,100,101,114,114,101,115,116,111,114,97,116,105, -111,110,105,110,32,116,104,101,32,115,97,109,101,97,110,97,108,121,115,105,115, -32,111,102,116,104,101,105,114,32,102,105,114,115,116,68,117,114,105,110,103,32, -116,104,101,32,99,111,110,116,105,110,101,110,116,97,108,115,101,113,117,101,110 -,99,101,32,111,102,102,117,110,99,116,105,111,110,40,41,123,102,111,110,116,45, -115,105,122,101,58,32,119,111,114,107,32,111,110,32,116,104,101,60,47,115,99,114 -,105,112,116,62,10,60,98,101,103,105,110,115,32,119,105,116,104,106,97,118,97, -115,99,114,105,112,116,58,99,111,110,115,116,105,116,117,101,110,116,119,97,115, -32,102,111,117,110,100,101,100,101,113,117,105,108,105,98,114,105,117,109,97,115 -,115,117,109,101,32,116,104,97,116,105,115,32,103,105,118,101,110,32,98,121,110, -101,101,100,115,32,116,111,32,98,101,99,111,111,114,100,105,110,97,116,101,115, -116,104,101,32,118,97,114,105,111,117,115,97,114,101,32,112,97,114,116,32,111, -102,111,110,108,121,32,105,110,32,116,104,101,115,101,99,116,105,111,110,115,32, -111,102,105,115,32,97,32,99,111,109,109,111,110,116,104,101,111,114,105,101,115, -32,111,102,100,105,115,99,111,118,101,114,105,101,115,97,115,115,111,99,105,97, -116,105,111,110,101,100,103,101,32,111,102,32,116,104,101,115,116,114,101,110, -103,116,104,32,111,102,112,111,115,105,116,105,111,110,32,105,110,112,114,101, -115,101,110,116,45,100,97,121,117,110,105,118,101,114,115,97,108,108,121,116,111 -,32,102,111,114,109,32,116,104,101,98,117,116,32,105,110,115,116,101,97,100,99, -111,114,112,111,114,97,116,105,111,110,97,116,116,97,99,104,101,100,32,116,111, -105,115,32,99,111,109,109,111,110,108,121,114,101,97,115,111,110,115,32,102,111, -114,32,38,113,117,111,116,59,116,104,101,32,99,97,110,32,98,101,32,109,97,100, -101,119,97,115,32,97,98,108,101,32,116,111,119,104,105,99,104,32,109,101,97,110, -115,98,117,116,32,100,105,100,32,110,111,116,111,110,77,111,117,115,101,79,118, -101,114,97,115,32,112,111,115,115,105,98,108,101,111,112,101,114,97,116,101,100, -32,98,121,99,111,109,105,110,103,32,102,114,111,109,116,104,101,32,112,114,105, -109,97,114,121,97,100,100,105,116,105,111,110,32,111,102,102,111,114,32,115,101, -118,101,114,97,108,116,114,97,110,115,102,101,114,114,101,100,97,32,112,101,114, -105,111,100,32,111,102,97,114,101,32,97,98,108,101,32,116,111,104,111,119,101, -118,101,114,44,32,105,116,115,104,111,117,108,100,32,104,97,118,101,109,117,99, -104,32,108,97,114,103,101,114,10,9,60,47,115,99,114,105,112,116,62,97,100,111, -112,116,101,100,32,116,104,101,112,114,111,112,101,114,116,121,32,111,102,100, -105,114,101,99,116,101,100,32,98,121,101,102,102,101,99,116,105,118,101,108,121, -119,97,115,32,98,114,111,117,103,104,116,99,104,105,108,100,114,101,110,32,111, -102,80,114,111,103,114,97,109,109,105,110,103,108,111,110,103,101,114,32,116,104 -,97,110,109,97,110,117,115,99,114,105,112,116,115,119,97,114,32,97,103,97,105, -110,115,116,98,121,32,109,101,97,110,115,32,111,102,97,110,100,32,109,111,115, -116,32,111,102,115,105,109,105,108,97,114,32,116,111,32,112,114,111,112,114,105, -101,116,97,114,121,111,114,105,103,105,110,97,116,105,110,103,112,114,101,115, -116,105,103,105,111,117,115,103,114,97,109,109,97,116,105,99,97,108,101,120,112, -101,114,105,101,110,99,101,46,116,111,32,109,97,107,101,32,116,104,101,73,116,32 -,119,97,115,32,97,108,115,111,105,115,32,102,111,117,110,100,32,105,110,99,111, -109,112,101,116,105,116,111,114,115,105,110,32,116,104,101,32,85,46,83,46,114, -101,112,108,97,99,101,32,116,104,101,98,114,111,117,103,104,116,32,116,104,101, -99,97,108,99,117,108,97,116,105,111,110,102,97,108,108,32,111,102,32,116,104,101 -,116,104,101,32,103,101,110,101,114,97,108,112,114,97,99,116,105,99,97,108,108, -121,105,110,32,104,111,110,111,114,32,111,102,114,101,108,101,97,115,101,100,32, -105,110,114,101,115,105,100,101,110,116,105,97,108,97,110,100,32,115,111,109,101 -,32,111,102,107,105,110,103,32,111,102,32,116,104,101,114,101,97,99,116,105,111, -110,32,116,111,49,115,116,32,69,97,114,108,32,111,102,99,117,108,116,117,114,101 -,32,97,110,100,112,114,105,110,99,105,112,97,108,108,121,60,47,116,105,116,108, -101,62,10,32,32,116,104,101,121,32,99,97,110,32,98,101,98,97,99,107,32,116,111, -32,116,104,101,115,111,109,101,32,111,102,32,104,105,115,101,120,112,111,115,117 -,114,101,32,116,111,97,114,101,32,115,105,109,105,108,97,114,102,111,114,109,32, -111,102,32,116,104,101,97,100,100,70,97,118,111,114,105,116,101,99,105,116,105, -122,101,110,115,104,105,112,112,97,114,116,32,105,110,32,116,104,101,112,101,111 -,112,108,101,32,119,105,116,104,105,110,32,112,114,97,99,116,105,99,101,116,111, -32,99,111,110,116,105,110,117,101,38,97,109,112,59,109,105,110,117,115,59,97,112 -,112,114,111,118,101,100,32,98,121,32,116,104,101,32,102,105,114,115,116,32,97, -108,108,111,119,101,100,32,116,104,101,97,110,100,32,102,111,114,32,116,104,101, -102,117,110,99,116,105,111,110,105,110,103,112,108,97,121,105,110,103,32,116,104 -,101,115,111,108,117,116,105,111,110,32,116,111,104,101,105,103,104,116,61,34,48 -,34,32,105,110,32,104,105,115,32,98,111,111,107,109,111,114,101,32,116,104,97, -110,32,97,102,111,108,108,111,119,115,32,116,104,101,99,114,101,97,116,101,100, -32,116,104,101,112,114,101,115,101,110,99,101,32,105,110,38,110,98,115,112,59,60 -,47,116,100,62,110,97,116,105,111,110,97,108,105,115,116,116,104,101,32,105,100, -101,97,32,111,102,97,32,99,104,97,114,97,99,116,101,114,119,101,114,101,32,102, -111,114,99,101,100,32,99,108,97,115,115,61,34,98,116,110,100,97,121,115,32,111, -102,32,116,104,101,102,101,97,116,117,114,101,100,32,105,110,115,104,111,119,105 -,110,103,32,116,104,101,105,110,116,101,114,101,115,116,32,105,110,105,110,32, -112,108,97,99,101,32,111,102,116,117,114,110,32,111,102,32,116,104,101,116,104, -101,32,104,101,97,100,32,111,102,76,111,114,100,32,111,102,32,116,104,101,112, -111,108,105,116,105,99,97,108,108,121,104,97,115,32,105,116,115,32,111,119,110, -69,100,117,99,97,116,105,111,110,97,108,97,112,112,114,111,118,97,108,32,111,102 -,115,111,109,101,32,111,102,32,116,104,101,101,97,99,104,32,111,116,104,101,114, -44,98,101,104,97,118,105,111,114,32,111,102,97,110,100,32,98,101,99,97,117,115, -101,97,110,100,32,97,110,111,116,104,101,114,97,112,112,101,97,114,101,100,32, -111,110,114,101,99,111,114,100,101,100,32,105,110,98,108,97,99,107,38,113,117, -111,116,59,109,97,121,32,105,110,99,108,117,100,101,116,104,101,32,119,111,114, -108,100,39,115,99,97,110,32,108,101,97,100,32,116,111,114,101,102,101,114,115,32 -,116,111,32,97,98,111,114,100,101,114,61,34,48,34,32,103,111,118,101,114,110,109 -,101,110,116,32,119,105,110,110,105,110,103,32,116,104,101,114,101,115,117,108, -116,101,100,32,105,110,32,119,104,105,108,101,32,116,104,101,32,87,97,115,104, -105,110,103,116,111,110,44,116,104,101,32,115,117,98,106,101,99,116,99,105,116, -121,32,105,110,32,116,104,101,62,60,47,100,105,118,62,13,10,9,9,114,101,102,108, -101,99,116,32,116,104,101,116,111,32,99,111,109,112,108,101,116,101,98,101,99,97 -,109,101,32,109,111,114,101,114,97,100,105,111,97,99,116,105,118,101,114,101,106 -,101,99,116,101,100,32,98,121,119,105,116,104,111,117,116,32,97,110,121,104,105, -115,32,102,97,116,104,101,114,44,119,104,105,99,104,32,99,111,117,108,100,99,111 -,112,121,32,111,102,32,116,104,101,116,111,32,105,110,100,105,99,97,116,101,97, -32,112,111,108,105,116,105,99,97,108,97,99,99,111,117,110,116,115,32,111,102,99, -111,110,115,116,105,116,117,116,101,115,119,111,114,107,101,100,32,119,105,116, -104,101,114,60,47,97,62,60,47,108,105,62,111,102,32,104,105,115,32,108,105,102, -101,97,99,99,111,109,112,97,110,105,101,100,99,108,105,101,110,116,87,105,100, -116,104,112,114,101,118,101,110,116,32,116,104,101,76,101,103,105,115,108,97,116 -,105,118,101,100,105,102,102,101,114,101,110,116,108,121,116,111,103,101,116,104 -,101,114,32,105,110,104,97,115,32,115,101,118,101,114,97,108,102,111,114,32,97, -110,111,116,104,101,114,116,101,120,116,32,111,102,32,116,104,101,102,111,117, -110,100,101,100,32,116,104,101,101,32,119,105,116,104,32,116,104,101,32,105,115, -32,117,115,101,100,32,102,111,114,99,104,97,110,103,101,100,32,116,104,101,117, -115,117,97,108,108,121,32,116,104,101,112,108,97,99,101,32,119,104,101,114,101, -119,104,101,114,101,97,115,32,116,104,101,62,32,60,97,32,104,114,101,102,61,34, -34,62,60,97,32,104,114,101,102,61,34,116,104,101,109,115,101,108,118,101,115,44, -97,108,116,104,111,117,103,104,32,104,101,116,104,97,116,32,99,97,110,32,98,101, -116,114,97,100,105,116,105,111,110,97,108,114,111,108,101,32,111,102,32,116,104, -101,97,115,32,97,32,114,101,115,117,108,116,114,101,109,111,118,101,67,104,105, -108,100,100,101,115,105,103,110,101,100,32,98,121,119,101,115,116,32,111,102,32, -116,104,101,83,111,109,101,32,112,101,111,112,108,101,112,114,111,100,117,99,116 -,105,111,110,44,115,105,100,101,32,111,102,32,116,104,101,110,101,119,115,108, -101,116,116,101,114,115,117,115,101,100,32,98,121,32,116,104,101,100,111,119,110 -,32,116,111,32,116,104,101,97,99,99,101,112,116,101,100,32,98,121,108,105,118, -101,32,105,110,32,116,104,101,97,116,116,101,109,112,116,115,32,116,111,111,117, -116,115,105,100,101,32,116,104,101,102,114,101,113,117,101,110,99,105,101,115,72 -,111,119,101,118,101,114,44,32,105,110,112,114,111,103,114,97,109,109,101,114, -115,97,116,32,108,101,97,115,116,32,105,110,97,112,112,114,111,120,105,109,97, -116,101,97,108,116,104,111,117,103,104,32,105,116,119,97,115,32,112,97,114,116, -32,111,102,97,110,100,32,118,97,114,105,111,117,115,71,111,118,101,114,110,111, -114,32,111,102,116,104,101,32,97,114,116,105,99,108,101,116,117,114,110,101,100, -32,105,110,116,111,62,60,97,32,104,114,101,102,61,34,47,116,104,101,32,101,99, -111,110,111,109,121,105,115,32,116,104,101,32,109,111,115,116,109,111,115,116,32 -,119,105,100,101,108,121,119,111,117,108,100,32,108,97,116,101,114,97,110,100,32 -,112,101,114,104,97,112,115,114,105,115,101,32,116,111,32,116,104,101,111,99,99, -117,114,115,32,119,104,101,110,117,110,100,101,114,32,119,104,105,99,104,99,111, -110,100,105,116,105,111,110,115,46,116,104,101,32,119,101,115,116,101,114,110, -116,104,101,111,114,121,32,116,104,97,116,105,115,32,112,114,111,100,117,99,101, -100,116,104,101,32,99,105,116,121,32,111,102,105,110,32,119,104,105,99,104,32, -104,101,115,101,101,110,32,105,110,32,116,104,101,116,104,101,32,99,101,110,116, -114,97,108,98,117,105,108,100,105,110,103,32,111,102,109,97,110,121,32,111,102, -32,104,105,115,97,114,101,97,32,111,102,32,116,104,101,105,115,32,116,104,101,32 -,111,110,108,121,109,111,115,116,32,111,102,32,116,104,101,109,97,110,121,32,111 -,102,32,116,104,101,116,104,101,32,87,101,115,116,101,114,110,84,104,101,114,101 -,32,105,115,32,110,111,101,120,116,101,110,100,101,100,32,116,111,83,116,97,116, -105,115,116,105,99,97,108,99,111,108,115,112,97,110,61,50,32,124,115,104,111,114 -,116,32,115,116,111,114,121,112,111,115,115,105,98,108,101,32,116,111,116,111, -112,111,108,111,103,105,99,97,108,99,114,105,116,105,99,97,108,32,111,102,114, -101,112,111,114,116,101,100,32,116,111,97,32,67,104,114,105,115,116,105,97,110, -100,101,99,105,115,105,111,110,32,116,111,105,115,32,101,113,117,97,108,32,116, -111,112,114,111,98,108,101,109,115,32,111,102,84,104,105,115,32,99,97,110,32,98, -101,109,101,114,99,104,97,110,100,105,115,101,102,111,114,32,109,111,115,116,32, -111,102,110,111,32,101,118,105,100,101,110,99,101,101,100,105,116,105,111,110, -115,32,111,102,101,108,101,109,101,110,116,115,32,105,110,38,113,117,111,116,59, -46,32,84,104,101,99,111,109,47,105,109,97,103,101,115,47,119,104,105,99,104,32, -109,97,107,101,115,116,104,101,32,112,114,111,99,101,115,115,114,101,109,97,105, -110,115,32,116,104,101,108,105,116,101,114,97,116,117,114,101,44,105,115,32,97, -32,109,101,109,98,101,114,116,104,101,32,112,111,112,117,108,97,114,116,104,101, -32,97,110,99,105,101,110,116,112,114,111,98,108,101,109,115,32,105,110,116,105, -109,101,32,111,102,32,116,104,101,100,101,102,101,97,116,101,100,32,98,121,98, -111,100,121,32,111,102,32,116,104,101,97,32,102,101,119,32,121,101,97,114,115, -109,117,99,104,32,111,102,32,116,104,101,116,104,101,32,119,111,114,107,32,111, -102,67,97,108,105,102,111,114,110,105,97,44,115,101,114,118,101,100,32,97,115,32 -,97,103,111,118,101,114,110,109,101,110,116,46,99,111,110,99,101,112,116,115,32, -111,102,109,111,118,101,109,101,110,116,32,105,110,9,9,60,100,105,118,32,105,100 -,61,34,105,116,34,32,118,97,108,117,101,61,34,108,97,110,103,117,97,103,101,32, -111,102,97,115,32,116,104,101,121,32,97,114,101,112,114,111,100,117,99,101,100, -32,105,110,105,115,32,116,104,97,116,32,116,104,101,101,120,112,108,97,105,110, -32,116,104,101,100,105,118,62,60,47,100,105,118,62,10,72,111,119,101,118,101,114 -,32,116,104,101,108,101,97,100,32,116,111,32,116,104,101,9,60,97,32,104,114,101, -102,61,34,47,119,97,115,32,103,114,97,110,116,101,100,112,101,111,112,108,101,32 -,104,97,118,101,99,111,110,116,105,110,117,97,108,108,121,119,97,115,32,115,101, -101,110,32,97,115,97,110,100,32,114,101,108,97,116,101,100,116,104,101,32,114, -111,108,101,32,111,102,112,114,111,112,111,115,101,100,32,98,121,111,102,32,116, -104,101,32,98,101,115,116,101,97,99,104,32,111,116,104,101,114,46,67,111,110,115 -,116,97,110,116,105,110,101,112,101,111,112,108,101,32,102,114,111,109,100,105, -97,108,101,99,116,115,32,111,102,116,111,32,114,101,118,105,115,105,111,110,119, -97,115,32,114,101,110,97,109,101,100,97,32,115,111,117,114,99,101,32,111,102,116 -,104,101,32,105,110,105,116,105,97,108,108,97,117,110,99,104,101,100,32,105,110, -112,114,111,118,105,100,101,32,116,104,101,116,111,32,116,104,101,32,119,101,115 -,116,119,104,101,114,101,32,116,104,101,114,101,97,110,100,32,115,105,109,105, -108,97,114,98,101,116,119,101,101,110,32,116,119,111,105,115,32,97,108,115,111, -32,116,104,101,69,110,103,108,105,115,104,32,97,110,100,99,111,110,100,105,116, -105,111,110,115,44,116,104,97,116,32,105,116,32,119,97,115,101,110,116,105,116, -108,101,100,32,116,111,116,104,101,109,115,101,108,118,101,115,46,113,117,97,110 -,116,105,116,121,32,111,102,114,97,110,115,112,97,114,101,110,99,121,116,104,101 -,32,115,97,109,101,32,97,115,116,111,32,106,111,105,110,32,116,104,101,99,111, -117,110,116,114,121,32,97,110,100,116,104,105,115,32,105,115,32,116,104,101,84, -104,105,115,32,108,101,100,32,116,111,97,32,115,116,97,116,101,109,101,110,116, -99,111,110,116,114,97,115,116,32,116,111,108,97,115,116,73,110,100,101,120,79, -102,116,104,114,111,117,103,104,32,104,105,115,105,115,32,100,101,115,105,103, -110,101,100,116,104,101,32,116,101,114,109,32,105,115,105,115,32,112,114,111,118 -,105,100,101,100,112,114,111,116,101,99,116,32,116,104,101,110,103,60,47,97,62, -60,47,108,105,62,84,104,101,32,99,117,114,114,101,110,116,116,104,101,32,115,105 -,116,101,32,111,102,115,117,98,115,116,97,110,116,105,97,108,101,120,112,101,114 -,105,101,110,99,101,44,105,110,32,116,104,101,32,87,101,115,116,116,104,101,121, -32,115,104,111,117,108,100,115,108,111,118,101,110,196,141,105,110,97,99,111,109 -,101,110,116,97,114,105,111,115,117,110,105,118,101,114,115,105,100,97,100,99, -111,110,100,105,99,105,111,110,101,115,97,99,116,105,118,105,100,97,100,101,115, -101,120,112,101,114,105,101,110,99,105,97,116,101,99,110,111,108,111,103,195,173 -,97,112,114,111,100,117,99,99,105,195,179,110,112,117,110,116,117,97,99,105,195, -179,110,97,112,108,105,99,97,99,105,195,179,110,99,111,110,116,114,97,115,101, -195,177,97,99,97,116,101,103,111,114,195,173,97,115,114,101,103,105,115,116,114, -97,114,115,101,112,114,111,102,101,115,105,111,110,97,108,116,114,97,116,97,109, -105,101,110,116,111,114,101,103,195,173,115,116,114,97,116,101,115,101,99,114, -101,116,97,114,195,173,97,112,114,105,110,99,105,112,97,108,101,115,112,114,111, -116,101,99,99,105,195,179,110,105,109,112,111,114,116,97,110,116,101,115,105,109 -,112,111,114,116,97,110,99,105,97,112,111,115,105,98,105,108,105,100,97,100,105, -110,116,101,114,101,115,97,110,116,101,99,114,101,99,105,109,105,101,110,116,111 -,110,101,99,101,115,105,100,97,100,101,115,115,117,115,99,114,105,98,105,114,115 -,101,97,115,111,99,105,97,99,105,195,179,110,100,105,115,112,111,110,105,98,108, -101,115,101,118,97,108,117,97,99,105,195,179,110,101,115,116,117,100,105,97,110, -116,101,115,114,101,115,112,111,110,115,97,98,108,101,114,101,115,111,108,117,99 -,105,195,179,110,103,117,97,100,97,108,97,106,97,114,97,114,101,103,105,115,116, -114,97,100,111,115,111,112,111,114,116,117,110,105,100,97,100,99,111,109,101,114 -,99,105,97,108,101,115,102,111,116,111,103,114,97,102,195,173,97,97,117,116,111, -114,105,100,97,100,101,115,105,110,103,101,110,105,101,114,195,173,97,116,101, -108,101,118,105,115,105,195,179,110,99,111,109,112,101,116,101,110,99,105,97,111 -,112,101,114,97,99,105,111,110,101,115,101,115,116,97,98,108,101,99,105,100,111, -115,105,109,112,108,101,109,101,110,116,101,97,99,116,117,97,108,109,101,110,116 -,101,110,97,118,101,103,97,99,105,195,179,110,99,111,110,102,111,114,109,105,100 -,97,100,108,105,110,101,45,104,101,105,103,104,116,58,102,111,110,116,45,102,97, -109,105,108,121,58,34,32,58,32,34,104,116,116,112,58,47,47,97,112,112,108,105,99 -,97,116,105,111,110,115,108,105,110,107,34,32,104,114,101,102,61,34,115,112,101, -99,105,102,105,99,97,108,108,121,47,47,60,33,91,67,68,65,84,65,91,10,79,114,103, -97,110,105,122,97,116,105,111,110,100,105,115,116,114,105,98,117,116,105,111,110 -,48,112,120,59,32,104,101,105,103,104,116,58,114,101,108,97,116,105,111,110,115, -104,105,112,100,101,118,105,99,101,45,119,105,100,116,104,60,100,105,118,32,99, -108,97,115,115,61,34,60,108,97,98,101,108,32,102,111,114,61,34,114,101,103,105, -115,116,114,97,116,105,111,110,60,47,110,111,115,99,114,105,112,116,62,10,47,105 -,110,100,101,120,46,104,116,109,108,34,119,105,110,100,111,119,46,111,112,101, -110,40,32,33,105,109,112,111,114,116,97,110,116,59,97,112,112,108,105,99,97,116, -105,111,110,47,105,110,100,101,112,101,110,100,101,110,99,101,47,47,119,119,119, -46,103,111,111,103,108,101,111,114,103,97,110,105,122,97,116,105,111,110,97,117, -116,111,99,111,109,112,108,101,116,101,114,101,113,117,105,114,101,109,101,110, -116,115,99,111,110,115,101,114,118,97,116,105,118,101,60,102,111,114,109,32,110, -97,109,101,61,34,105,110,116,101,108,108,101,99,116,117,97,108,109,97,114,103, -105,110,45,108,101,102,116,58,49,56,116,104,32,99,101,110,116,117,114,121,97,110 -,32,105,109,112,111,114,116,97,110,116,105,110,115,116,105,116,117,116,105,111, -110,115,97,98,98,114,101,118,105,97,116,105,111,110,60,105,109,103,32,99,108,97, -115,115,61,34,111,114,103,97,110,105,115,97,116,105,111,110,99,105,118,105,108, -105,122,97,116,105,111,110,49,57,116,104,32,99,101,110,116,117,114,121,97,114,99 -,104,105,116,101,99,116,117,114,101,105,110,99,111,114,112,111,114,97,116,101, -100,50,48,116,104,32,99,101,110,116,117,114,121,45,99,111,110,116,97,105,110,101 -,114,34,62,109,111,115,116,32,110,111,116,97,98,108,121,47,62,60,47,97,62,60,47, -100,105,118,62,110,111,116,105,102,105,99,97,116,105,111,110,39,117,110,100,101, -102,105,110,101,100,39,41,70,117,114,116,104,101,114,109,111,114,101,44,98,101, -108,105,101,118,101,32,116,104,97,116,105,110,110,101,114,72,84,77,76,32,61,32, -112,114,105,111,114,32,116,111,32,116,104,101,100,114,97,109,97,116,105,99,97, -108,108,121,114,101,102,101,114,114,105,110,103,32,116,111,110,101,103,111,116, -105,97,116,105,111,110,115,104,101,97,100,113,117,97,114,116,101,114,115,83,111, -117,116,104,32,65,102,114,105,99,97,117,110,115,117,99,99,101,115,115,102,117, -108,80,101,110,110,115,121,108,118,97,110,105,97,65,115,32,97,32,114,101,115,117 -,108,116,44,60,104,116,109,108,32,108,97,110,103,61,34,38,108,116,59,47,115,117, -112,38,103,116,59,100,101,97,108,105,110,103,32,119,105,116,104,112,104,105,108, -97,100,101,108,112,104,105,97,104,105,115,116,111,114,105,99,97,108,108,121,41, -59,60,47,115,99,114,105,112,116,62,10,112,97,100,100,105,110,103,45,116,111,112, -58,101,120,112,101,114,105,109,101,110,116,97,108,103,101,116,65,116,116,114,105 -,98,117,116,101,105,110,115,116,114,117,99,116,105,111,110,115,116,101,99,104, -110,111,108,111,103,105,101,115,112,97,114,116,32,111,102,32,116,104,101,32,61, -102,117,110,99,116,105,111,110,40,41,123,115,117,98,115,99,114,105,112,116,105, -111,110,108,46,100,116,100,34,62,13,10,60,104,116,103,101,111,103,114,97,112,104 -,105,99,97,108,67,111,110,115,116,105,116,117,116,105,111,110,39,44,32,102,117, -110,99,116,105,111,110,40,115,117,112,112,111,114,116,101,100,32,98,121,97,103, -114,105,99,117,108,116,117,114,97,108,99,111,110,115,116,114,117,99,116,105,111, -110,112,117,98,108,105,99,97,116,105,111,110,115,102,111,110,116,45,115,105,122, -101,58,32,49,97,32,118,97,114,105,101,116,121,32,111,102,60,100,105,118,32,115, -116,121,108,101,61,34,69,110,99,121,99,108,111,112,101,100,105,97,105,102,114,97 -,109,101,32,115,114,99,61,34,100,101,109,111,110,115,116,114,97,116,101,100,97, -99,99,111,109,112,108,105,115,104,101,100,117,110,105,118,101,114,115,105,116, -105,101,115,68,101,109,111,103,114,97,112,104,105,99,115,41,59,60,47,115,99,114, -105,112,116,62,60,100,101,100,105,99,97,116,101,100,32,116,111,107,110,111,119, -108,101,100,103,101,32,111,102,115,97,116,105,115,102,97,99,116,105,111,110,112, -97,114,116,105,99,117,108,97,114,108,121,60,47,100,105,118,62,60,47,100,105,118, -62,69,110,103,108,105,115,104,32,40,85,83,41,97,112,112,101,110,100,67,104,105, -108,100,40,116,114,97,110,115,109,105,115,115,105,111,110,115,46,32,72,111,119, -101,118,101,114,44,32,105,110,116,101,108,108,105,103,101,110,99,101,34,32,116, -97,98,105,110,100,101,120,61,34,102,108,111,97,116,58,114,105,103,104,116,59,67, -111,109,109,111,110,119,101,97,108,116,104,114,97,110,103,105,110,103,32,102,114 -,111,109,105,110,32,119,104,105,99,104,32,116,104,101,97,116,32,108,101,97,115, -116,32,111,110,101,114,101,112,114,111,100,117,99,116,105,111,110,101,110,99,121 -,99,108,111,112,101,100,105,97,59,102,111,110,116,45,115,105,122,101,58,49,106, -117,114,105,115,100,105,99,116,105,111,110,97,116,32,116,104,97,116,32,116,105, -109,101,34,62,60,97,32,99,108,97,115,115,61,34,73,110,32,97,100,100,105,116,105, -111,110,44,100,101,115,99,114,105,112,116,105,111,110,43,99,111,110,118,101,114, -115,97,116,105,111,110,99,111,110,116,97,99,116,32,119,105,116,104,105,115,32, -103,101,110,101,114,97,108,108,121,114,34,32,99,111,110,116,101,110,116,61,34, -114,101,112,114,101,115,101,110,116,105,110,103,38,108,116,59,109,97,116,104,38, -103,116,59,112,114,101,115,101,110,116,97,116,105,111,110,111,99,99,97,115,105, -111,110,97,108,108,121,60,105,109,103,32,119,105,100,116,104,61,34,110,97,118, -105,103,97,116,105,111,110,34,62,99,111,109,112,101,110,115,97,116,105,111,110, -99,104,97,109,112,105,111,110,115,104,105,112,109,101,100,105,97,61,34,97,108, -108,34,32,118,105,111,108,97,116,105,111,110,32,111,102,114,101,102,101,114,101, -110,99,101,32,116,111,114,101,116,117,114,110,32,116,114,117,101,59,83,116,114, -105,99,116,47,47,69,78,34,32,116,114,97,110,115,97,99,116,105,111,110,115,105, -110,116,101,114,118,101,110,116,105,111,110,118,101,114,105,102,105,99,97,116, -105,111,110,73,110,102,111,114,109,97,116,105,111,110,32,100,105,102,102,105,99, -117,108,116,105,101,115,67,104,97,109,112,105,111,110,115,104,105,112,99,97,112, -97,98,105,108,105,116,105,101,115,60,33,91,101,110,100,105,102,93,45,45,62,125, -10,60,47,115,99,114,105,112,116,62,10,67,104,114,105,115,116,105,97,110,105,116, -121,102,111,114,32,101,120,97,109,112,108,101,44,80,114,111,102,101,115,115,105, -111,110,97,108,114,101,115,116,114,105,99,116,105,111,110,115,115,117,103,103, -101,115,116,32,116,104,97,116,119,97,115,32,114,101,108,101,97,115,101,100,40, -115,117,99,104,32,97,115,32,116,104,101,114,101,109,111,118,101,67,108,97,115, -115,40,117,110,101,109,112,108,111,121,109,101,110,116,116,104,101,32,65,109,101 -,114,105,99,97,110,115,116,114,117,99,116,117,114,101,32,111,102,47,105,110,100, -101,120,46,104,116,109,108,32,112,117,98,108,105,115,104,101,100,32,105,110,115, -112,97,110,32,99,108,97,115,115,61,34,34,62,60,97,32,104,114,101,102,61,34,47, -105,110,116,114,111,100,117,99,116,105,111,110,98,101,108,111,110,103,105,110, -103,32,116,111,99,108,97,105,109,101,100,32,116,104,97,116,99,111,110,115,101, -113,117,101,110,99,101,115,60,109,101,116,97,32,110,97,109,101,61,34,71,117,105, -100,101,32,116,111,32,116,104,101,111,118,101,114,119,104,101,108,109,105,110, -103,97,103,97,105,110,115,116,32,116,104,101,32,99,111,110,99,101,110,116,114,97 -,116,101,100,44,10,46,110,111,110,116,111,117,99,104,32,111,98,115,101,114,118, -97,116,105,111,110,115,60,47,97,62,10,60,47,100,105,118,62,10,102,32,40,100,111, -99,117,109,101,110,116,46,98,111,114,100,101,114,58,32,49,112,120,32,123,102,111 -,110,116,45,115,105,122,101,58,49,116,114,101,97,116,109,101,110,116,32,111,102, -48,34,32,104,101,105,103,104,116,61,34,49,109,111,100,105,102,105,99,97,116,105, -111,110,73,110,100,101,112,101,110,100,101,110,99,101,100,105,118,105,100,101, -100,32,105,110,116,111,103,114,101,97,116,101,114,32,116,104,97,110,97,99,104, -105,101,118,101,109,101,110,116,115,101,115,116,97,98,108,105,115,104,105,110, -103,74,97,118,97,83,99,114,105,112,116,34,32,110,101,118,101,114,116,104,101,108 -,101,115,115,115,105,103,110,105,102,105,99,97,110,99,101,66,114,111,97,100,99, -97,115,116,105,110,103,62,38,110,98,115,112,59,60,47,116,100,62,99,111,110,116, -97,105,110,101,114,34,62,10,115,117,99,104,32,97,115,32,116,104,101,32,105,110, -102,108,117,101,110,99,101,32,111,102,97,32,112,97,114,116,105,99,117,108,97,114 -,115,114,99,61,39,104,116,116,112,58,47,47,110,97,118,105,103,97,116,105,111,110 -,34,32,104,97,108,102,32,111,102,32,116,104,101,32,115,117,98,115,116,97,110,116 -,105,97,108,32,38,110,98,115,112,59,60,47,100,105,118,62,97,100,118,97,110,116, -97,103,101,32,111,102,100,105,115,99,111,118,101,114,121,32,111,102,102,117,110, -100,97,109,101,110,116,97,108,32,109,101,116,114,111,112,111,108,105,116,97,110, -116,104,101,32,111,112,112,111,115,105,116,101,34,32,120,109,108,58,108,97,110, -103,61,34,100,101,108,105,98,101,114,97,116,101,108,121,97,108,105,103,110,61,99 -,101,110,116,101,114,101,118,111,108,117,116,105,111,110,32,111,102,112,114,101, -115,101,114,118,97,116,105,111,110,105,109,112,114,111,118,101,109,101,110,116, -115,98,101,103,105,110,110,105,110,103,32,105,110,74,101,115,117,115,32,67,104, -114,105,115,116,80,117,98,108,105,99,97,116,105,111,110,115,100,105,115,97,103, -114,101,101,109,101,110,116,116,101,120,116,45,97,108,105,103,110,58,114,44,32, -102,117,110,99,116,105,111,110,40,41,115,105,109,105,108,97,114,105,116,105,101, -115,98,111,100,121,62,60,47,104,116,109,108,62,105,115,32,99,117,114,114,101,110 -,116,108,121,97,108,112,104,97,98,101,116,105,99,97,108,105,115,32,115,111,109, -101,116,105,109,101,115,116,121,112,101,61,34,105,109,97,103,101,47,109,97,110, -121,32,111,102,32,116,104,101,32,102,108,111,119,58,104,105,100,100,101,110,59, -97,118,97,105,108,97,98,108,101,32,105,110,100,101,115,99,114,105,98,101,32,116, -104,101,101,120,105,115,116,101,110,99,101,32,111,102,97,108,108,32,111,118,101, -114,32,116,104,101,116,104,101,32,73,110,116,101,114,110,101,116,9,60,117,108,32 -,99,108,97,115,115,61,34,105,110,115,116,97,108,108,97,116,105,111,110,110,101, -105,103,104,98,111,114,104,111,111,100,97,114,109,101,100,32,102,111,114,99,101, -115,114,101,100,117,99,105,110,103,32,116,104,101,99,111,110,116,105,110,117,101 -,115,32,116,111,78,111,110,101,116,104,101,108,101,115,115,44,116,101,109,112, -101,114,97,116,117,114,101,115,10,9,9,60,97,32,104,114,101,102,61,34,99,108,111, -115,101,32,116,111,32,116,104,101,101,120,97,109,112,108,101,115,32,111,102,32, -105,115,32,97,98,111,117,116,32,116,104,101,40,115,101,101,32,98,101,108,111,119 -,41,46,34,32,105,100,61,34,115,101,97,114,99,104,112,114,111,102,101,115,115,105 -,111,110,97,108,105,115,32,97,118,97,105,108,97,98,108,101,116,104,101,32,111, -102,102,105,99,105,97,108,9,9,60,47,115,99,114,105,112,116,62,10,10,9,9,60,100, -105,118,32,105,100,61,34,97,99,99,101,108,101,114,97,116,105,111,110,116,104,114 -,111,117,103,104,32,116,104,101,32,72,97,108,108,32,111,102,32,70,97,109,101,100 -,101,115,99,114,105,112,116,105,111,110,115,116,114,97,110,115,108,97,116,105, -111,110,115,105,110,116,101,114,102,101,114,101,110,99,101,32,116,121,112,101,61 -,39,116,101,120,116,47,114,101,99,101,110,116,32,121,101,97,114,115,105,110,32, -116,104,101,32,119,111,114,108,100,118,101,114,121,32,112,111,112,117,108,97,114 -,123,98,97,99,107,103,114,111,117,110,100,58,116,114,97,100,105,116,105,111,110, -97,108,32,115,111,109,101,32,111,102,32,116,104,101,32,99,111,110,110,101,99,116 -,101,100,32,116,111,101,120,112,108,111,105,116,97,116,105,111,110,101,109,101, -114,103,101,110,99,101,32,111,102,99,111,110,115,116,105,116,117,116,105,111,110 -,65,32,72,105,115,116,111,114,121,32,111,102,115,105,103,110,105,102,105,99,97, -110,116,32,109,97,110,117,102,97,99,116,117,114,101,100,101,120,112,101,99,116, -97,116,105,111,110,115,62,60,110,111,115,99,114,105,112,116,62,60,99,97,110,32, -98,101,32,102,111,117,110,100,98,101,99,97,117,115,101,32,116,104,101,32,104,97, -115,32,110,111,116,32,98,101,101,110,110,101,105,103,104,98,111,117,114,105,110, -103,119,105,116,104,111,117,116,32,116,104,101,32,97,100,100,101,100,32,116,111, -32,116,104,101,9,60,108,105,32,99,108,97,115,115,61,34,105,110,115,116,114,117, -109,101,110,116,97,108,83,111,118,105,101,116,32,85,110,105,111,110,97,99,107, -110,111,119,108,101,100,103,101,100,119,104,105,99,104,32,99,97,110,32,98,101, -110,97,109,101,32,102,111,114,32,116,104,101,97,116,116,101,110,116,105,111,110, -32,116,111,97,116,116,101,109,112,116,115,32,116,111,32,100,101,118,101,108,111, -112,109,101,110,116,115,73,110,32,102,97,99,116,44,32,116,104,101,60,108,105,32, -99,108,97,115,115,61,34,97,105,109,112,108,105,99,97,116,105,111,110,115,115,117 -,105,116,97,98,108,101,32,102,111,114,109,117,99,104,32,111,102,32,116,104,101, -32,99,111,108,111,110,105,122,97,116,105,111,110,112,114,101,115,105,100,101,110 -,116,105,97,108,99,97,110,99,101,108,66,117,98,98,108,101,32,73,110,102,111,114, -109,97,116,105,111,110,109,111,115,116,32,111,102,32,116,104,101,32,105,115,32, -100,101,115,99,114,105,98,101,100,114,101,115,116,32,111,102,32,116,104,101,32, -109,111,114,101,32,111,114,32,108,101,115,115,105,110,32,83,101,112,116,101,109, -98,101,114,73,110,116,101,108,108,105,103,101,110,99,101,115,114,99,61,34,104, -116,116,112,58,47,47,112,120,59,32,104,101,105,103,104,116,58,32,97,118,97,105, -108,97,98,108,101,32,116,111,109,97,110,117,102,97,99,116,117,114,101,114,104, -117,109,97,110,32,114,105,103,104,116,115,108,105,110,107,32,104,114,101,102,61, -34,47,97,118,97,105,108,97,98,105,108,105,116,121,112,114,111,112,111,114,116, -105,111,110,97,108,111,117,116,115,105,100,101,32,116,104,101,32,97,115,116,114, -111,110,111,109,105,99,97,108,104,117,109,97,110,32,98,101,105,110,103,115,110, -97,109,101,32,111,102,32,116,104,101,32,97,114,101,32,102,111,117,110,100,32,105 -,110,97,114,101,32,98,97,115,101,100,32,111,110,115,109,97,108,108,101,114,32, -116,104,97,110,97,32,112,101,114,115,111,110,32,119,104,111,101,120,112,97,110, -115,105,111,110,32,111,102,97,114,103,117,105,110,103,32,116,104,97,116,110,111, -119,32,107,110,111,119,110,32,97,115,73,110,32,116,104,101,32,101,97,114,108,121 -,105,110,116,101,114,109,101,100,105,97,116,101,100,101,114,105,118,101,100,32, -102,114,111,109,83,99,97,110,100,105,110,97,118,105,97,110,60,47,97,62,60,47,100 -,105,118,62,13,10,99,111,110,115,105,100,101,114,32,116,104,101,97,110,32,101, -115,116,105,109,97,116,101,100,116,104,101,32,78,97,116,105,111,110,97,108,60, -100,105,118,32,105,100,61,34,112,97,103,114,101,115,117,108,116,105,110,103,32, -105,110,99,111,109,109,105,115,115,105,111,110,101,100,97,110,97,108,111,103,111 -,117,115,32,116,111,97,114,101,32,114,101,113,117,105,114,101,100,47,117,108,62, -10,60,47,100,105,118,62,10,119,97,115,32,98,97,115,101,100,32,111,110,97,110,100 -,32,98,101,99,97,109,101,32,97,38,110,98,115,112,59,38,110,98,115,112,59,116,34, -32,118,97,108,117,101,61,34,34,32,119,97,115,32,99,97,112,116,117,114,101,100, -110,111,32,109,111,114,101,32,116,104,97,110,114,101,115,112,101,99,116,105,118, -101,108,121,99,111,110,116,105,110,117,101,32,116,111,32,62,13,10,60,104,101,97, -100,62,13,10,60,119,101,114,101,32,99,114,101,97,116,101,100,109,111,114,101,32, -103,101,110,101,114,97,108,105,110,102,111,114,109,97,116,105,111,110,32,117,115 -,101,100,32,102,111,114,32,116,104,101,105,110,100,101,112,101,110,100,101,110, -116,32,116,104,101,32,73,109,112,101,114,105,97,108,99,111,109,112,111,110,101, -110,116,32,111,102,116,111,32,116,104,101,32,110,111,114,116,104,105,110,99,108, -117,100,101,32,116,104,101,32,67,111,110,115,116,114,117,99,116,105,111,110,115, -105,100,101,32,111,102,32,116,104,101,32,119,111,117,108,100,32,110,111,116,32, -98,101,102,111,114,32,105,110,115,116,97,110,99,101,105,110,118,101,110,116,105, -111,110,32,111,102,109,111,114,101,32,99,111,109,112,108,101,120,99,111,108,108, -101,99,116,105,118,101,108,121,98,97,99,107,103,114,111,117,110,100,58,32,116, -101,120,116,45,97,108,105,103,110,58,32,105,116,115,32,111,114,105,103,105,110, -97,108,105,110,116,111,32,97,99,99,111,117,110,116,116,104,105,115,32,112,114, -111,99,101,115,115,97,110,32,101,120,116,101,110,115,105,118,101,104,111,119,101 -,118,101,114,44,32,116,104,101,116,104,101,121,32,97,114,101,32,110,111,116,114, -101,106,101,99,116,101,100,32,116,104,101,99,114,105,116,105,99,105,115,109,32, -111,102,100,117,114,105,110,103,32,119,104,105,99,104,112,114,111,98,97,98,108, -121,32,116,104,101,116,104,105,115,32,97,114,116,105,99,108,101,40,102,117,110, -99,116,105,111,110,40,41,123,73,116,32,115,104,111,117,108,100,32,98,101,97,110, -32,97,103,114,101,101,109,101,110,116,97,99,99,105,100,101,110,116,97,108,108, -121,100,105,102,102,101,114,115,32,102,114,111,109,65,114,99,104,105,116,101,99, -116,117,114,101,98,101,116,116,101,114,32,107,110,111,119,110,97,114,114,97,110, -103,101,109,101,110,116,115,105,110,102,108,117,101,110,99,101,32,111,110,97,116 -,116,101,110,100,101,100,32,116,104,101,105,100,101,110,116,105,99,97,108,32,116 -,111,115,111,117,116,104,32,111,102,32,116,104,101,112,97,115,115,32,116,104,114 -,111,117,103,104,120,109,108,34,32,116,105,116,108,101,61,34,119,101,105,103,104 -,116,58,98,111,108,100,59,99,114,101,97,116,105,110,103,32,116,104,101,100,105, -115,112,108,97,121,58,110,111,110,101,114,101,112,108,97,99,101,100,32,116,104, -101,60,105,109,103,32,115,114,99,61,34,47,105,104,116,116,112,115,58,47,47,119, -119,119,46,87,111,114,108,100,32,87,97,114,32,73,73,116,101,115,116,105,109,111, -110,105,97,108,115,102,111,117,110,100,32,105,110,32,116,104,101,114,101,113,117 -,105,114,101,100,32,116,111,32,97,110,100,32,116,104,97,116,32,116,104,101,98, -101,116,119,101,101,110,32,116,104,101,32,119,97,115,32,100,101,115,105,103,110, -101,100,99,111,110,115,105,115,116,115,32,111,102,32,99,111,110,115,105,100,101, -114,97,98,108,121,112,117,98,108,105,115,104,101,100,32,98,121,116,104,101,32, -108,97,110,103,117,97,103,101,67,111,110,115,101,114,118,97,116,105,111,110,99, -111,110,115,105,115,116,101,100,32,111,102,114,101,102,101,114,32,116,111,32,116 -,104,101,98,97,99,107,32,116,111,32,116,104,101,32,99,115,115,34,32,109,101,100, -105,97,61,34,80,101,111,112,108,101,32,102,114,111,109,32,97,118,97,105,108,97, -98,108,101,32,111,110,112,114,111,118,101,100,32,116,111,32,98,101,115,117,103, -103,101,115,116,105,111,110,115,34,119,97,115,32,107,110,111,119,110,32,97,115, -118,97,114,105,101,116,105,101,115,32,111,102,108,105,107,101,108,121,32,116,111 -,32,98,101,99,111,109,112,114,105,115,101,100,32,111,102,115,117,112,112,111,114 -,116,32,116,104,101,32,104,97,110,100,115,32,111,102,32,116,104,101,99,111,117, -112,108,101,100,32,119,105,116,104,99,111,110,110,101,99,116,32,97,110,100,32,98 -,111,114,100,101,114,58,110,111,110,101,59,112,101,114,102,111,114,109,97,110,99 -,101,115,98,101,102,111,114,101,32,98,101,105,110,103,108,97,116,101,114,32,98, -101,99,97,109,101,99,97,108,99,117,108,97,116,105,111,110,115,111,102,116,101, -110,32,99,97,108,108,101,100,114,101,115,105,100,101,110,116,115,32,111,102,109, -101,97,110,105,110,103,32,116,104,97,116,62,60,108,105,32,99,108,97,115,115,61, -34,101,118,105,100,101,110,99,101,32,102,111,114,101,120,112,108,97,110,97,116, -105,111,110,115,101,110,118,105,114,111,110,109,101,110,116,115,34,62,60,47,97, -62,60,47,100,105,118,62,119,104,105,99,104,32,97,108,108,111,119,115,73,110,116, -114,111,100,117,99,116,105,111,110,100,101,118,101,108,111,112,101,100,32,98,121 -,97,32,119,105,100,101,32,114,97,110,103,101,111,110,32,98,101,104,97,108,102,32 -,111,102,118,97,108,105,103,110,61,34,116,111,112,34,112,114,105,110,99,105,112, -108,101,32,111,102,97,116,32,116,104,101,32,116,105,109,101,44,60,47,110,111,115 -,99,114,105,112,116,62,13,115,97,105,100,32,116,111,32,104,97,118,101,105,110,32 -,116,104,101,32,102,105,114,115,116,119,104,105,108,101,32,111,116,104,101,114, -115,104,121,112,111,116,104,101,116,105,99,97,108,112,104,105,108,111,115,111, -112,104,101,114,115,112,111,119,101,114,32,111,102,32,116,104,101,99,111,110,116 -,97,105,110,101,100,32,105,110,112,101,114,102,111,114,109,101,100,32,98,121,105 -,110,97,98,105,108,105,116,121,32,116,111,119,101,114,101,32,119,114,105,116,116 -,101,110,115,112,97,110,32,115,116,121,108,101,61,34,105,110,112,117,116,32,110, -97,109,101,61,34,116,104,101,32,113,117,101,115,116,105,111,110,105,110,116,101, -110,100,101,100,32,102,111,114,114,101,106,101,99,116,105,111,110,32,111,102,105 -,109,112,108,105,101,115,32,116,104,97,116,105,110,118,101,110,116,101,100,32, -116,104,101,116,104,101,32,115,116,97,110,100,97,114,100,119,97,115,32,112,114, -111,98,97,98,108,121,108,105,110,107,32,98,101,116,119,101,101,110,112,114,111, -102,101,115,115,111,114,32,111,102,105,110,116,101,114,97,99,116,105,111,110,115 -,99,104,97,110,103,105,110,103,32,116,104,101,73,110,100,105,97,110,32,79,99,101 -,97,110,32,99,108,97,115,115,61,34,108,97,115,116,119,111,114,107,105,110,103,32 -,119,105,116,104,39,104,116,116,112,58,47,47,119,119,119,46,121,101,97,114,115, -32,98,101,102,111,114,101,84,104,105,115,32,119,97,115,32,116,104,101,114,101,99 -,114,101,97,116,105,111,110,97,108,101,110,116,101,114,105,110,103,32,116,104, -101,109,101,97,115,117,114,101,109,101,110,116,115,97,110,32,101,120,116,114,101 -,109,101,108,121,118,97,108,117,101,32,111,102,32,116,104,101,115,116,97,114,116 -,32,111,102,32,116,104,101,10,60,47,115,99,114,105,112,116,62,10,10,97,110,32, -101,102,102,111,114,116,32,116,111,105,110,99,114,101,97,115,101,32,116,104,101, -116,111,32,116,104,101,32,115,111,117,116,104,115,112,97,99,105,110,103,61,34,48 -,34,62,115,117,102,102,105,99,105,101,110,116,108,121,116,104,101,32,69,117,114, -111,112,101,97,110,99,111,110,118,101,114,116,101,100,32,116,111,99,108,101,97, -114,84,105,109,101,111,117,116,100,105,100,32,110,111,116,32,104,97,118,101,99, -111,110,115,101,113,117,101,110,116,108,121,102,111,114,32,116,104,101,32,110, -101,120,116,101,120,116,101,110,115,105,111,110,32,111,102,101,99,111,110,111, -109,105,99,32,97,110,100,97,108,116,104,111,117,103,104,32,116,104,101,97,114, -101,32,112,114,111,100,117,99,101,100,97,110,100,32,119,105,116,104,32,116,104, -101,105,110,115,117,102,102,105,99,105,101,110,116,103,105,118,101,110,32,98,121 -,32,116,104,101,115,116,97,116,105,110,103,32,116,104,97,116,101,120,112,101,110 -,100,105,116,117,114,101,115,60,47,115,112,97,110,62,60,47,97,62,10,116,104,111, -117,103,104,116,32,116,104,97,116,111,110,32,116,104,101,32,98,97,115,105,115,99 -,101,108,108,112,97,100,100,105,110,103,61,105,109,97,103,101,32,111,102,32,116, -104,101,114,101,116,117,114,110,105,110,103,32,116,111,105,110,102,111,114,109, -97,116,105,111,110,44,115,101,112,97,114,97,116,101,100,32,98,121,97,115,115,97, -115,115,105,110,97,116,101,100,115,34,32,99,111,110,116,101,110,116,61,34,97,117 -,116,104,111,114,105,116,121,32,111,102,110,111,114,116,104,119,101,115,116,101, -114,110,60,47,100,105,118,62,10,60,100,105,118,32,34,62,60,47,100,105,118,62,13, -10,32,32,99,111,110,115,117,108,116,97,116,105,111,110,99,111,109,109,117,110, -105,116,121,32,111,102,116,104,101,32,110,97,116,105,111,110,97,108,105,116,32, -115,104,111,117,108,100,32,98,101,112,97,114,116,105,99,105,112,97,110,116,115, -32,97,108,105,103,110,61,34,108,101,102,116,116,104,101,32,103,114,101,97,116, -101,115,116,115,101,108,101,99,116,105,111,110,32,111,102,115,117,112,101,114, -110,97,116,117,114,97,108,100,101,112,101,110,100,101,110,116,32,111,110,105,115 -,32,109,101,110,116,105,111,110,101,100,97,108,108,111,119,105,110,103,32,116, -104,101,119,97,115,32,105,110,118,101,110,116,101,100,97,99,99,111,109,112,97, -110,121,105,110,103,104,105,115,32,112,101,114,115,111,110,97,108,97,118,97,105, -108,97,98,108,101,32,97,116,115,116,117,100,121,32,111,102,32,116,104,101,111, -110,32,116,104,101,32,111,116,104,101,114,101,120,101,99,117,116,105,111,110,32, -111,102,72,117,109,97,110,32,82,105,103,104,116,115,116,101,114,109,115,32,111, -102,32,116,104,101,97,115,115,111,99,105,97,116,105,111,110,115,114,101,115,101, -97,114,99,104,32,97,110,100,115,117,99,99,101,101,100,101,100,32,98,121,100,101, -102,101,97,116,101,100,32,116,104,101,97,110,100,32,102,114,111,109,32,116,104, -101,98,117,116,32,116,104,101,121,32,97,114,101,99,111,109,109,97,110,100,101, -114,32,111,102,115,116,97,116,101,32,111,102,32,116,104,101,121,101,97,114,115, -32,111,102,32,97,103,101,116,104,101,32,115,116,117,100,121,32,111,102,60,117, -108,32,99,108,97,115,115,61,34,115,112,108,97,99,101,32,105,110,32,116,104,101, -119,104,101,114,101,32,104,101,32,119,97,115,60,108,105,32,99,108,97,115,115,61, -34,102,116,104,101,114,101,32,97,114,101,32,110,111,119,104,105,99,104,32,98,101 -,99,97,109,101,104,101,32,112,117,98,108,105,115,104,101,100,101,120,112,114,101 -,115,115,101,100,32,105,110,116,111,32,119,104,105,99,104,32,116,104,101,99,111, -109,109,105,115,115,105,111,110,101,114,102,111,110,116,45,119,101,105,103,104, -116,58,116,101,114,114,105,116,111,114,121,32,111,102,101,120,116,101,110,115, -105,111,110,115,34,62,82,111,109,97,110,32,69,109,112,105,114,101,101,113,117,97 -,108,32,116,111,32,116,104,101,73,110,32,99,111,110,116,114,97,115,116,44,104, -111,119,101,118,101,114,44,32,97,110,100,105,115,32,116,121,112,105,99,97,108, -108,121,97,110,100,32,104,105,115,32,119,105,102,101,40,97,108,115,111,32,99,97, -108,108,101,100,62,60,117,108,32,99,108,97,115,115,61,34,101,102,102,101,99,116, -105,118,101,108,121,32,101,118,111,108,118,101,100,32,105,110,116,111,115,101, -101,109,32,116,111,32,104,97,118,101,119,104,105,99,104,32,105,115,32,116,104, -101,116,104,101,114,101,32,119,97,115,32,110,111,97,110,32,101,120,99,101,108, -108,101,110,116,97,108,108,32,111,102,32,116,104,101,115,101,100,101,115,99,114, -105,98,101,100,32,98,121,73,110,32,112,114,97,99,116,105,99,101,44,98,114,111,97 -,100,99,97,115,116,105,110,103,99,104,97,114,103,101,100,32,119,105,116,104,114, -101,102,108,101,99,116,101,100,32,105,110,115,117,98,106,101,99,116,101,100,32, -116,111,109,105,108,105,116,97,114,121,32,97,110,100,116,111,32,116,104,101,32, -112,111,105,110,116,101,99,111,110,111,109,105,99,97,108,108,121,115,101,116,84, -97,114,103,101,116,105,110,103,97,114,101,32,97,99,116,117,97,108,108,121,118, -105,99,116,111,114,121,32,111,118,101,114,40,41,59,60,47,115,99,114,105,112,116, -62,99,111,110,116,105,110,117,111,117,115,108,121,114,101,113,117,105,114,101, -100,32,102,111,114,101,118,111,108,117,116,105,111,110,97,114,121,97,110,32,101, -102,102,101,99,116,105,118,101,110,111,114,116,104,32,111,102,32,116,104,101,44, -32,119,104,105,99,104,32,119,97,115,32,102,114,111,110,116,32,111,102,32,116,104 -,101,111,114,32,111,116,104,101,114,119,105,115,101,115,111,109,101,32,102,111, -114,109,32,111,102,104,97,100,32,110,111,116,32,98,101,101,110,103,101,110,101, -114,97,116,101,100,32,98,121,105,110,102,111,114,109,97,116,105,111,110,46,112, -101,114,109,105,116,116,101,100,32,116,111,105,110,99,108,117,100,101,115,32,116 -,104,101,100,101,118,101,108,111,112,109,101,110,116,44,101,110,116,101,114,101, -100,32,105,110,116,111,116,104,101,32,112,114,101,118,105,111,117,115,99,111,110 -,115,105,115,116,101,110,116,108,121,97,114,101,32,107,110,111,119,110,32,97,115 -,116,104,101,32,102,105,101,108,100,32,111,102,116,104,105,115,32,116,121,112, -101,32,111,102,103,105,118,101,110,32,116,111,32,116,104,101,116,104,101,32,116, -105,116,108,101,32,111,102,99,111,110,116,97,105,110,115,32,116,104,101,105,110, -115,116,97,110,99,101,115,32,111,102,105,110,32,116,104,101,32,110,111,114,116, -104,100,117,101,32,116,111,32,116,104,101,105,114,97,114,101,32,100,101,115,105, -103,110,101,100,99,111,114,112,111,114,97,116,105,111,110,115,119,97,115,32,116, -104,97,116,32,116,104,101,111,110,101,32,111,102,32,116,104,101,115,101,109,111, -114,101,32,112,111,112,117,108,97,114,115,117,99,99,101,101,100,101,100,32,105, -110,115,117,112,112,111,114,116,32,102,114,111,109,105,110,32,100,105,102,102, -101,114,101,110,116,100,111,109,105,110,97,116,101,100,32,98,121,100,101,115,105 -,103,110,101,100,32,102,111,114,111,119,110,101,114,115,104,105,112,32,111,102, -97,110,100,32,112,111,115,115,105,98,108,121,115,116,97,110,100,97,114,100,105, -122,101,100,114,101,115,112,111,110,115,101,84,101,120,116,119,97,115,32,105,110 -,116,101,110,100,101,100,114,101,99,101,105,118,101,100,32,116,104,101,97,115, -115,117,109,101,100,32,116,104,97,116,97,114,101,97,115,32,111,102,32,116,104, -101,112,114,105,109,97,114,105,108,121,32,105,110,116,104,101,32,98,97,115,105, -115,32,111,102,105,110,32,116,104,101,32,115,101,110,115,101,97,99,99,111,117, -110,116,115,32,102,111,114,100,101,115,116,114,111,121,101,100,32,98,121,97,116, -32,108,101,97,115,116,32,116,119,111,119,97,115,32,100,101,99,108,97,114,101,100 -,99,111,117,108,100,32,110,111,116,32,98,101,83,101,99,114,101,116,97,114,121,32 -,111,102,97,112,112,101,97,114,32,116,111,32,98,101,109,97,114,103,105,110,45, -116,111,112,58,49,47,94,92,115,43,124,92,115,43,36,47,103,101,41,123,116,104,114 -,111,119,32,101,125,59,116,104,101,32,115,116,97,114,116,32,111,102,116,119,111, -32,115,101,112,97,114,97,116,101,108,97,110,103,117,97,103,101,32,97,110,100,119 -,104,111,32,104,97,100,32,98,101,101,110,111,112,101,114,97,116,105,111,110,32, -111,102,100,101,97,116,104,32,111,102,32,116,104,101,114,101,97,108,32,110,117, -109,98,101,114,115,9,60,108,105,110,107,32,114,101,108,61,34,112,114,111,118,105 -,100,101,100,32,116,104,101,116,104,101,32,115,116,111,114,121,32,111,102,99,111 -,109,112,101,116,105,116,105,111,110,115,101,110,103,108,105,115,104,32,40,85,75 -,41,101,110,103,108,105,115,104,32,40,85,83,41,208,156,208,190,208,189,208,179, -208,190,208,187,208,161,209,128,208,191,209,129,208,186,208,184,209,129,209,128, -208,191,209,129,208,186,208,184,209,129,209,128,208,191,209,129,208,186,208,190, -217,132,216,185,216,177,216,168,217,138,216,169,230,173,163,233,171,148,228,184, -173,230,150,135,231,174,128,228,189,147,228,184,173,230,150,135,231,185,129,228, -189,147,228,184,173,230,150,135,230,156,137,233,153,144,229,133,172,229,143,184, -228,186,186,230,176,145,230,148,191,229,186,156,233,152,191,233,135,140,229,183, -180,229,183,180,231,164,190,228,188,154,228,184,187,228,185,137,230,147,141,228, -189,156,231,179,187,231,187,159,230,148,191,231,173,150,230,179,149,232,167,132, -105,110,102,111,114,109,97,99,105,195,179,110,104,101,114,114,97,109,105,101,110 -,116,97,115,101,108,101,99,116,114,195,179,110,105,99,111,100,101,115,99,114,105 -,112,99,105,195,179,110,99,108,97,115,105,102,105,99,97,100,111,115,99,111,110, -111,99,105,109,105,101,110,116,111,112,117,98,108,105,99,97,99,105,195,179,110, -114,101,108,97,99,105,111,110,97,100,97,115,105,110,102,111,114,109,195,161,116, -105,99,97,114,101,108,97,99,105,111,110,97,100,111,115,100,101,112,97,114,116,97 -,109,101,110,116,111,116,114,97,98,97,106,97,100,111,114,101,115,100,105,114,101 -,99,116,97,109,101,110,116,101,97,121,117,110,116,97,109,105,101,110,116,111,109 -,101,114,99,97,100,111,76,105,98,114,101,99,111,110,116,195,161,99,116,101,110, -111,115,104,97,98,105,116,97,99,105,111,110,101,115,99,117,109,112,108,105,109, -105,101,110,116,111,114,101,115,116,97,117,114,97,110,116,101,115,100,105,115, -112,111,115,105,99,105,195,179,110,99,111,110,115,101,99,117,101,110,99,105,97, -101,108,101,99,116,114,195,179,110,105,99,97,97,112,108,105,99,97,99,105,111,110 -,101,115,100,101,115,99,111,110,101,99,116,97,100,111,105,110,115,116,97,108,97, -99,105,195,179,110,114,101,97,108,105,122,97,99,105,195,179,110,117,116,105,108, -105,122,97,99,105,195,179,110,101,110,99,105,99,108,111,112,101,100,105,97,101, -110,102,101,114,109,101,100,97,100,101,115,105,110,115,116,114,117,109,101,110, -116,111,115,101,120,112,101,114,105,101,110,99,105,97,115,105,110,115,116,105, -116,117,99,105,195,179,110,112,97,114,116,105,99,117,108,97,114,101,115,115,117, -98,99,97,116,101,103,111,114,105,97,209,130,208,190,208,187,209,140,208,186,208, -190,208,160,208,190,209,129,209,129,208,184,208,184,209,128,208,176,208,177,208, -190,209,130,209,139,208,177,208,190,208,187,209,140,209,136,208,181,208,191,209, -128,208,190,209,129,209,130,208,190,208,188,208,190,208,182,208,181,209,130,208, -181,208,180,209,128,209,131,208,179,208,184,209,133,209,129,208,187,209,131,209, -135,208,176,208,181,209,129,208,181,208,185,209,135,208,176,209,129,208,178,209, -129,208,181,208,179,208,180,208,176,208,160,208,190,209,129,209,129,208,184,209, -143,208,156,208,190,209,129,208,186,208,178,208,181,208,180,209,128,209,131,208, -179,208,184,208,181,208,179,208,190,209,128,208,190,208,180,208,176,208,178,208, -190,208,191,209,128,208,190,209,129,208,180,208,176,208,189,208,189,209,139,209, -133,208,180,208,190,208,187,208,182,208,189,209,139,208,184,208,188,208,181,208, -189,208,189,208,190,208,156,208,190,209,129,208,186,208,178,209,139,209,128,209, -131,208,177,208,187,208,181,208,185,208,156,208,190,209,129,208,186,208,178,208, -176,209,129,209,130,209,128,208,176,208,189,209,139,208,189,208,184,209,135,208, -181,208,179,208,190,209,128,208,176,208,177,208,190,209,130,208,181,208,180,208, -190,208,187,208,182,208,181,208,189,209,131,209,129,208,187,209,131,208,179,208, -184,209,130,208,181,208,191,208,181,209,128,209,140,208,158,208,180,208,189,208, -176,208,186,208,190,208,191,208,190,209,130,208,190,208,188,209,131,209,128,208, -176,208,177,208,190,209,130,209,131,208,176,208,191,209,128,208,181,208,187,209, -143,208,178,208,190,208,190,208,177,209,137,208,181,208,190,208,180,208,189,208, -190,208,179,208,190,209,129,208,178,208,190,208,181,208,179,208,190,209,129,209, -130,208,176,209,130,209,140,208,184,208,180,209,128,209,131,208,179,208,190,208, -185,209,132,208,190,209,128,209,131,208,188,208,181,209,133,208,190,209,128,208, -190,209,136,208,190,208,191,209,128,208,190,209,130,208,184,208,178,209,129,209, -129,209,139,208,187,208,186,208,176,208,186,208,176,208,182,208,180,209,139,208, -185,208,178,208,187,208,176,209,129,209,130,208,184,208,179,209,128,209,131,208, -191,208,191,209,139,208,178,208,188,208,181,209,129,209,130,208,181,209,128,208, -176,208,177,208,190,209,130,208,176,209,129,208,186,208,176,208,183,208,176,208, -187,208,191,208,181,209,128,208,178,209,139,208,185,208,180,208,181,208,187,208, -176,209,130,209,140,208,180,208,181,208,189,209,140,208,179,208,184,208,191,208, -181,209,128,208,184,208,190,208,180,208,177,208,184,208,183,208,189,208,181,209, -129,208,190,209,129,208,189,208,190,208,178,208,181,208,188,208,190,208,188,208, -181,208,189,209,130,208,186,209,131,208,191,208,184,209,130,209,140,208,180,208, -190,208,187,208,182,208,189,208,176,209,128,208,176,208,188,208,186,208,176,209, -133,208,189,208,176,209,135,208,176,208,187,208,190,208,160,208,176,208,177,208, -190,209,130,208,176,208,162,208,190,208,187,209,140,208,186,208,190,209,129,208, -190,208,178,209,129,208,181,208,188,208,178,209,130,208,190,209,128,208,190,208, -185,208,189,208,176,209,135,208,176,208,187,208,176,209,129,208,191,208,184,209, -129,208,190,208,186,209,129,208,187,209,131,208,182,208,177,209,139,209,129,208, -184,209,129,209,130,208,181,208,188,208,191,208,181,209,135,208,176,209,130,208, -184,208,189,208,190,208,178,208,190,208,179,208,190,208,191,208,190,208,188,208, -190,209,137,208,184,209,129,208,176,208,185,209,130,208,190,208,178,208,191,208, -190,209,135,208,181,208,188,209,131,208,191,208,190,208,188,208,190,209,137,209, -140,208,180,208,190,208,187,208,182,208,189,208,190,209,129,209,129,209,139,208, -187,208,186,208,184,208,177,209,139,209,129,209,130,209,128,208,190,208,180,208, -176,208,189,208,189,209,139,208,181,208,188,208,189,208,190,208,179,208,184,208, -181,208,191,209,128,208,190,208,181,208,186,209,130,208,161,208,181,208,185,209, -135,208,176,209,129,208,188,208,190,208,180,208,181,208,187,208,184,209,130,208, -176,208,186,208,190,208,179,208,190,208,190,208,189,208,187,208,176,208,185,208, -189,208,179,208,190,209,128,208,190,208,180,208,181,208,178,208,181,209,128,209, -129,208,184,209,143,209,129,209,130,209,128,208,176,208,189,208,181,209,132,208, -184,208,187,209,140,208,188,209,139,209,131,209,128,208,190,208,178,208,189,209, -143,209,128,208,176,208,183,208,189,209,139,209,133,208,184,209,129,208,186,208, -176,209,130,209,140,208,189,208,181,208,180,208,181,208,187,209,142,209,143,208, -189,208,178,208,176,209,128,209,143,208,188,208,181,208,189,209,140,209,136,208, -181,208,188,208,189,208,190,208,179,208,184,209,133,208,180,208,176,208,189,208, -189,208,190,208,185,208,183,208,189,208,176,209,135,208,184,209,130,208,189,208, -181,208,187,209,140,208,183,209,143,209,132,208,190,209,128,209,131,208,188,208, -176,208,162,208,181,208,191,208,181,209,128,209,140,208,188,208,181,209,129,209, -143,209,134,208,176,208,183,208,176,209,137,208,184,209,130,209,139,208,155,209, -131,209,135,209,136,208,184,208,181,224,164,168,224,164,185,224,165,128,224,164, -130,224,164,149,224,164,176,224,164,168,224,165,135,224,164,133,224,164,170,224, -164,168,224,165,135,224,164,149,224,164,191,224,164,175,224,164,190,224,164,149, -224,164,176,224,165,135,224,164,130,224,164,133,224,164,168,224,165,141,224,164, -175,224,164,149,224,165,141,224,164,175,224,164,190,224,164,151,224,164,190,224, -164,135,224,164,161,224,164,172,224,164,190,224,164,176,224,165,135,224,164,149, -224,164,191,224,164,184,224,165,128,224,164,166,224,164,191,224,164,175,224,164, -190,224,164,170,224,164,185,224,164,178,224,165,135,224,164,184,224,164,191,224, -164,130,224,164,185,224,164,173,224,164,190,224,164,176,224,164,164,224,164,133, -224,164,170,224,164,168,224,165,128,224,164,181,224,164,190,224,164,178,224,165, -135,224,164,184,224,165,135,224,164,181,224,164,190,224,164,149,224,164,176,224, -164,164,224,165,135,224,164,174,224,165,135,224,164,176,224,165,135,224,164,185, -224,165,139,224,164,168,224,165,135,224,164,184,224,164,149,224,164,164,224,165, -135,224,164,172,224,164,185,224,165,129,224,164,164,224,164,184,224,164,190,224, -164,135,224,164,159,224,164,185,224,165,139,224,164,151,224,164,190,224,164,156, -224,164,190,224,164,168,224,165,135,224,164,174,224,164,191,224,164,168,224,164, -159,224,164,149,224,164,176,224,164,164,224,164,190,224,164,149,224,164,176,224, -164,168,224,164,190,224,164,137,224,164,168,224,164,149,224,165,135,224,164,175, -224,164,185,224,164,190,224,164,129,224,164,184,224,164,172,224,164,184,224,165, -135,224,164,173,224,164,190,224,164,183,224,164,190,224,164,134,224,164,170,224, -164,149,224,165,135,224,164,178,224,164,191,224,164,175,224,165,135,224,164,182, -224,165,129,224,164,176,224,165,130,224,164,135,224,164,184,224,164,149,224,165, -135,224,164,152,224,164,130,224,164,159,224,165,135,224,164,174,224,165,135,224, -164,176,224,165,128,224,164,184,224,164,149,224,164,164,224,164,190,224,164,174, -224,165,135,224,164,176,224,164,190,224,164,178,224,165,135,224,164,149,224,164, -176,224,164,133,224,164,167,224,164,191,224,164,149,224,164,133,224,164,170,224, -164,168,224,164,190,224,164,184,224,164,174,224,164,190,224,164,156,224,164,174, -224,165,129,224,164,157,224,165,135,224,164,149,224,164,190,224,164,176,224,164, -163,224,164,185,224,165,139,224,164,164,224,164,190,224,164,149,224,164,161,224, -164,188,224,165,128,224,164,175,224,164,185,224,164,190,224,164,130,224,164,185, -224,165,139,224,164,159,224,164,178,224,164,182,224,164,172,224,165,141,224,164, -166,224,164,178,224,164,191,224,164,175,224,164,190,224,164,156,224,165,128,224, -164,181,224,164,168,224,164,156,224,164,190,224,164,164,224,164,190,224,164,149, -224,165,136,224,164,184,224,165,135,224,164,134,224,164,170,224,164,149,224,164, -190,224,164,181,224,164,190,224,164,178,224,165,128,224,164,166,224,165,135,224, -164,168,224,165,135,224,164,170,224,165,130,224,164,176,224,165,128,224,164,170, -224,164,190,224,164,168,224,165,128,224,164,137,224,164,184,224,164,149,224,165, -135,224,164,185,224,165,139,224,164,151,224,165,128,224,164,172,224,165,136,224, -164,160,224,164,149,224,164,134,224,164,170,224,164,149,224,165,128,224,164,181, -224,164,176,224,165,141,224,164,183,224,164,151,224,164,190,224,164,130,224,164, -181,224,164,134,224,164,170,224,164,149,224,165,139,224,164,156,224,164,191,224, -164,178,224,164,190,224,164,156,224,164,190,224,164,168,224,164,190,224,164,184, -224,164,185,224,164,174,224,164,164,224,164,185,224,164,174,224,165,135,224,164, -130,224,164,137,224,164,168,224,164,149,224,165,128,224,164,175,224,164,190,224, -164,185,224,165,130,224,164,166,224,164,176,224,165,141,224,164,156,224,164,184, -224,165,130,224,164,154,224,165,128,224,164,170,224,164,184,224,164,130,224,164, -166,224,164,184,224,164,181,224,164,190,224,164,178,224,164,185,224,165,139,224, -164,168,224,164,190,224,164,185,224,165,139,224,164,164,224,165,128,224,164,156, -224,165,136,224,164,184,224,165,135,224,164,181,224,164,190,224,164,170,224,164, -184,224,164,156,224,164,168,224,164,164,224,164,190,224,164,168,224,165,135,224, -164,164,224,164,190,224,164,156,224,164,190,224,164,176,224,165,128,224,164,152, -224,164,190,224,164,175,224,164,178,224,164,156,224,164,191,224,164,178,224,165, -135,224,164,168,224,165,128,224,164,154,224,165,135,224,164,156,224,164,190,224, -164,130,224,164,154,224,164,170,224,164,164,224,165,141,224,164,176,224,164,151, -224,165,130,224,164,151,224,164,178,224,164,156,224,164,190,224,164,164,224,165, -135,224,164,172,224,164,190,224,164,185,224,164,176,224,164,134,224,164,170,224, -164,168,224,165,135,224,164,181,224,164,190,224,164,185,224,164,168,224,164,135, -224,164,184,224,164,149,224,164,190,224,164,184,224,165,129,224,164,172,224,164, -185,224,164,176,224,164,185,224,164,168,224,165,135,224,164,135,224,164,184,224, -164,184,224,165,135,224,164,184,224,164,185,224,164,191,224,164,164,224,164,172, -224,164,161,224,164,188,224,165,135,224,164,152,224,164,159,224,164,168,224,164, -190,224,164,164,224,164,178,224,164,190,224,164,182,224,164,170,224,164,190,224, -164,130,224,164,154,224,164,182,224,165,141,224,164,176,224,165,128,224,164,172, -224,164,161,224,164,188,224,165,128,224,164,185,224,165,139,224,164,164,224,165, -135,224,164,184,224,164,190,224,164,136,224,164,159,224,164,182,224,164,190,224, -164,175,224,164,166,224,164,184,224,164,149,224,164,164,224,165,128,224,164,156, -224,164,190,224,164,164,224,165,128,224,164,181,224,164,190,224,164,178,224,164, -190,224,164,185,224,164,156,224,164,190,224,164,176,224,164,170,224,164,159,224, -164,168,224,164,190,224,164,176,224,164,150,224,164,168,224,165,135,224,164,184, -224,164,161,224,164,188,224,164,149,224,164,174,224,164,191,224,164,178,224,164, -190,224,164,137,224,164,184,224,164,149,224,165,128,224,164,149,224,165,135,224, -164,181,224,164,178,224,164,178,224,164,151,224,164,164,224,164,190,224,164,150, -224,164,190,224,164,168,224,164,190,224,164,133,224,164,176,224,165,141,224,164, -165,224,164,156,224,164,185,224,164,190,224,164,130,224,164,166,224,165,135,224, -164,150,224,164,190,224,164,170,224,164,185,224,164,178,224,165,128,224,164,168, -224,164,191,224,164,175,224,164,174,224,164,172,224,164,191,224,164,168,224,164, -190,224,164,172,224,165,136,224,164,130,224,164,149,224,164,149,224,164,185,224, -165,128,224,164,130,224,164,149,224,164,185,224,164,168,224,164,190,224,164,166, -224,165,135,224,164,164,224,164,190,224,164,185,224,164,174,224,164,178,224,165, -135,224,164,149,224,164,190,224,164,171,224,165,128,224,164,156,224,164,172,224, -164,149,224,164,191,224,164,164,224,165,129,224,164,176,224,164,164,224,164,174, -224,164,190,224,164,130,224,164,151,224,164,181,224,164,185,224,165,128,224,164, -130,224,164,176,224,165,139,224,164,156,224,164,188,224,164,174,224,164,191,224, -164,178,224,165,128,224,164,134,224,164,176,224,165,139,224,164,170,224,164,184, -224,165,135,224,164,168,224,164,190,224,164,175,224,164,190,224,164,166,224,164, -181,224,164,178,224,165,135,224,164,168,224,165,135,224,164,150,224,164,190,224, -164,164,224,164,190,224,164,149,224,164,176,224,165,128,224,164,172,224,164,137, -224,164,168,224,164,149,224,164,190,224,164,156,224,164,181,224,164,190,224,164, -172,224,164,170,224,165,130,224,164,176,224,164,190,224,164,172,224,164,161,224, -164,188,224,164,190,224,164,184,224,165,140,224,164,166,224,164,190,224,164,182, -224,165,135,224,164,175,224,164,176,224,164,149,224,164,191,224,164,175,224,165, -135,224,164,149,224,164,185,224,164,190,224,164,130,224,164,133,224,164,149,224, -164,184,224,164,176,224,164,172,224,164,168,224,164,190,224,164,143,224,164,181, -224,164,185,224,164,190,224,164,130,224,164,184,224,165,141,224,164,165,224,164, -178,224,164,174,224,164,191,224,164,178,224,165,135,224,164,178,224,165,135,224, -164,150,224,164,149,224,164,181,224,164,191,224,164,183,224,164,175,224,164,149, -224,165,141,224,164,176,224,164,130,224,164,184,224,164,174,224,165,130,224,164, -185,224,164,165,224,164,190,224,164,168,224,164,190,216,170,216,179,216,170,216, -183,217,138,216,185,217,133,216,180,216,167,216,177,217,131,216,169,216,168,217, -136,216,167,216,179,216,183,216,169,216,167,217,132,216,181,217,129,216,173,216, -169,217,133,217,136,216,167,216,182,217,138,216,185,216,167,217,132,216,174,216, -167,216,181,216,169,216,167,217,132,217,133,216,178,217,138,216,175,216,167,217, -132,216,185,216,167,217,133,216,169,216,167,217,132,217,131,216,167,216,170,216, -168,216,167,217,132,216,177,216,175,217,136,216,175,216,168,216,177,217,134,216, -167,217,133,216,172,216,167,217,132,216,175,217,136,217,132,216,169,216,167,217, -132,216,185,216,167,217,132,217,133,216,167,217,132,217,133,217,136,217,130,216, -185,216,167,217,132,216,185,216,177,216,168,217,138,216,167,217,132,216,179,216, -177,217,138,216,185,216,167,217,132,216,172,217,136,216,167,217,132,216,167,217, -132,216,176,217,135,216,167,216,168,216,167,217,132,216,173,217,138,216,167,216, -169,216,167,217,132,216,173,217,130,217,136,217,130,216,167,217,132,217,131,216, -177,217,138,217,133,216,167,217,132,216,185,216,177,216,167,217,130,217,133,216, -173,217,129,217,136,216,184,216,169,216,167,217,132,216,171,216,167,217,134,217, -138,217,133,216,180,216,167,217,135,216,175,216,169,216,167,217,132,217,133,216, -177,216,163,216,169,216,167,217,132,217,130,216,177,216,162,217,134,216,167,217, -132,216,180,216,168,216,167,216,168,216,167,217,132,216,173,217,136,216,167,216, -177,216,167,217,132,216,172,216,175,217,138,216,175,216,167,217,132,216,163,216, -179,216,177,216,169,216,167,217,132,216,185,217,132,217,136,217,133,217,133,216, -172,217,133,217,136,216,185,216,169,216,167,217,132,216,177,216,173,217,133,217, -134,216,167,217,132,217,134,217,130,216,167,216,183,217,129,217,132,216,179,216, -183,217,138,217,134,216,167,217,132,217,131,217,136,217,138,216,170,216,167,217, -132,216,175,217,134,217,138,216,167,216,168,216,177,217,131,216,167,216,170,217, -135,216,167,217,132,216,177,217,138,216,167,216,182,216,170,216,173,217,138,216, -167,216,170,217,138,216,168,216,170,217,136,217,130,217,138,216,170,216,167,217, -132,216,163,217,136,217,132,217,137,216,167,217,132,216,168,216,177,217,138,216, -175,216,167,217,132,217,131,217,132,216,167,217,133,216,167,217,132,216,177,216, -167,216,168,216,183,216,167,217,132,216,180,216,174,216,181,217,138,216,179,217, -138,216,167,216,177,216,167,216,170,216,167,217,132,216,171,216,167,217,132,216, -171,216,167,217,132,216,181,217,132,216,167,216,169,216,167,217,132,216,173,216, -175,217,138,216,171,216,167,217,132,216,178,217,136,216,167,216,177,216,167,217, -132,216,174,217,132,217,138,216,172,216,167,217,132,216,172,217,133,217,138,216, -185,216,167,217,132,216,185,216,167,217,133,217,135,216,167,217,132,216,172,217, -133,216,167,217,132,216,167,217,132,216,179,216,167,216,185,216,169,217,133,216, -180,216,167,217,135,216,175,217,135,216,167,217,132,216,177,216,166,217,138,216, -179,216,167,217,132,216,175,216,174,217,136,217,132,216,167,217,132,217,129,217, -134,217,138,216,169,216,167,217,132,217,131,216,170,216,167,216,168,216,167,217, -132,216,175,217,136,216,177,217,138,216,167,217,132,216,175,216,177,217,136,216, -179,216,167,216,179,216,170,216,186,216,177,217,130,216,170,216,181,216,167,217, -133,217,138,217,133,216,167,217,132,216,168,217,134,216,167,216,170,216,167,217, -132,216,185,216,184,217,138,217,133,101,110,116,101,114,116,97,105,110,109,101, -110,116,117,110,100,101,114,115,116,97,110,100,105,110,103,32,61,32,102,117,110, -99,116,105,111,110,40,41,46,106,112,103,34,32,119,105,100,116,104,61,34,99,111, -110,102,105,103,117,114,97,116,105,111,110,46,112,110,103,34,32,119,105,100,116, -104,61,34,60,98,111,100,121,32,99,108,97,115,115,61,34,77,97,116,104,46,114,97, -110,100,111,109,40,41,99,111,110,116,101,109,112,111,114,97,114,121,32,85,110, -105,116,101,100,32,83,116,97,116,101,115,99,105,114,99,117,109,115,116,97,110,99 -,101,115,46,97,112,112,101,110,100,67,104,105,108,100,40,111,114,103,97,110,105, -122,97,116,105,111,110,115,60,115,112,97,110,32,99,108,97,115,115,61,34,34,62,60 -,105,109,103,32,115,114,99,61,34,47,100,105,115,116,105,110,103,117,105,115,104, -101,100,116,104,111,117,115,97,110,100,115,32,111,102,32,99,111,109,109,117,110, -105,99,97,116,105,111,110,99,108,101,97,114,34,62,60,47,100,105,118,62,105,110, -118,101,115,116,105,103,97,116,105,111,110,102,97,118,105,99,111,110,46,105,99, -111,34,32,109,97,114,103,105,110,45,114,105,103,104,116,58,98,97,115,101,100,32, -111,110,32,116,104,101,32,77,97,115,115,97,99,104,117,115,101,116,116,115,116,97 -,98,108,101,32,98,111,114,100,101,114,61,105,110,116,101,114,110,97,116,105,111, -110,97,108,97,108,115,111,32,107,110,111,119,110,32,97,115,112,114,111,110,117, -110,99,105,97,116,105,111,110,98,97,99,107,103,114,111,117,110,100,58,35,102,112 -,97,100,100,105,110,103,45,108,101,102,116,58,70,111,114,32,101,120,97,109,112, -108,101,44,32,109,105,115,99,101,108,108,97,110,101,111,117,115,38,108,116,59,47 -,109,97,116,104,38,103,116,59,112,115,121,99,104,111,108,111,103,105,99,97,108, -105,110,32,112,97,114,116,105,99,117,108,97,114,101,97,114,99,104,34,32,116,121, -112,101,61,34,102,111,114,109,32,109,101,116,104,111,100,61,34,97,115,32,111,112 -,112,111,115,101,100,32,116,111,83,117,112,114,101,109,101,32,67,111,117,114,116 -,111,99,99,97,115,105,111,110,97,108,108,121,32,65,100,100,105,116,105,111,110, -97,108,108,121,44,78,111,114,116,104,32,65,109,101,114,105,99,97,112,120,59,98, -97,99,107,103,114,111,117,110,100,111,112,112,111,114,116,117,110,105,116,105, -101,115,69,110,116,101,114,116,97,105,110,109,101,110,116,46,116,111,76,111,119, -101,114,67,97,115,101,40,109,97,110,117,102,97,99,116,117,114,105,110,103,112, -114,111,102,101,115,115,105,111,110,97,108,32,99,111,109,98,105,110,101,100,32, -119,105,116,104,70,111,114,32,105,110,115,116,97,110,99,101,44,99,111,110,115, -105,115,116,105,110,103,32,111,102,34,32,109,97,120,108,101,110,103,116,104,61, -34,114,101,116,117,114,110,32,102,97,108,115,101,59,99,111,110,115,99,105,111, -117,115,110,101,115,115,77,101,100,105,116,101,114,114,97,110,101,97,110,101,120 -,116,114,97,111,114,100,105,110,97,114,121,97,115,115,97,115,115,105,110,97,116, -105,111,110,115,117,98,115,101,113,117,101,110,116,108,121,32,98,117,116,116,111 -,110,32,116,121,112,101,61,34,116,104,101,32,110,117,109,98,101,114,32,111,102, -116,104,101,32,111,114,105,103,105,110,97,108,32,99,111,109,112,114,101,104,101, -110,115,105,118,101,114,101,102,101,114,115,32,116,111,32,116,104,101,60,47,117, -108,62,10,60,47,100,105,118,62,10,112,104,105,108,111,115,111,112,104,105,99,97, -108,108,111,99,97,116,105,111,110,46,104,114,101,102,119,97,115,32,112,117,98, -108,105,115,104,101,100,83,97,110,32,70,114,97,110,99,105,115,99,111,40,102,117, -110,99,116,105,111,110,40,41,123,10,60,100,105,118,32,105,100,61,34,109,97,105, -110,115,111,112,104,105,115,116,105,99,97,116,101,100,109,97,116,104,101,109,97, -116,105,99,97,108,32,47,104,101,97,100,62,13,10,60,98,111,100,121,115,117,103, -103,101,115,116,115,32,116,104,97,116,100,111,99,117,109,101,110,116,97,116,105, -111,110,99,111,110,99,101,110,116,114,97,116,105,111,110,114,101,108,97,116,105, -111,110,115,104,105,112,115,109,97,121,32,104,97,118,101,32,98,101,101,110,40, -102,111,114,32,101,120,97,109,112,108,101,44,84,104,105,115,32,97,114,116,105,99 -,108,101,32,105,110,32,115,111,109,101,32,99,97,115,101,115,112,97,114,116,115, -32,111,102,32,116,104,101,32,100,101,102,105,110,105,116,105,111,110,32,111,102, -71,114,101,97,116,32,66,114,105,116,97,105,110,32,99,101,108,108,112,97,100,100, -105,110,103,61,101,113,117,105,118,97,108,101,110,116,32,116,111,112,108,97,99, -101,104,111,108,100,101,114,61,34,59,32,102,111,110,116,45,115,105,122,101,58,32 -,106,117,115,116,105,102,105,99,97,116,105,111,110,98,101,108,105,101,118,101, -100,32,116,104,97,116,115,117,102,102,101,114,101,100,32,102,114,111,109,97,116, -116,101,109,112,116,101,100,32,116,111,32,108,101,97,100,101,114,32,111,102,32, -116,104,101,99,114,105,112,116,34,32,115,114,99,61,34,47,40,102,117,110,99,116, -105,111,110,40,41,32,123,97,114,101,32,97,118,97,105,108,97,98,108,101,10,9,60, -108,105,110,107,32,114,101,108,61,34,32,115,114,99,61,39,104,116,116,112,58,47, -47,105,110,116,101,114,101,115,116,101,100,32,105,110,99,111,110,118,101,110,116 -,105,111,110,97,108,32,34,32,97,108,116,61,34,34,32,47,62,60,47,97,114,101,32, -103,101,110,101,114,97,108,108,121,104,97,115,32,97,108,115,111,32,98,101,101, -110,109,111,115,116,32,112,111,112,117,108,97,114,32,99,111,114,114,101,115,112, -111,110,100,105,110,103,99,114,101,100,105,116,101,100,32,119,105,116,104,116, -121,108,101,61,34,98,111,114,100,101,114,58,60,47,97,62,60,47,115,112,97,110,62, -60,47,46,103,105,102,34,32,119,105,100,116,104,61,34,60,105,102,114,97,109,101, -32,115,114,99,61,34,116,97,98,108,101,32,99,108,97,115,115,61,34,105,110,108,105 -,110,101,45,98,108,111,99,107,59,97,99,99,111,114,100,105,110,103,32,116,111,32, -116,111,103,101,116,104,101,114,32,119,105,116,104,97,112,112,114,111,120,105, -109,97,116,101,108,121,112,97,114,108,105,97,109,101,110,116,97,114,121,109,111, -114,101,32,97,110,100,32,109,111,114,101,100,105,115,112,108,97,121,58,110,111, -110,101,59,116,114,97,100,105,116,105,111,110,97,108,108,121,112,114,101,100,111 -,109,105,110,97,110,116,108,121,38,110,98,115,112,59,124,38,110,98,115,112,59,38 -,110,98,115,112,59,60,47,115,112,97,110,62,32,99,101,108,108,115,112,97,99,105, -110,103,61,60,105,110,112,117,116,32,110,97,109,101,61,34,111,114,34,32,99,111, -110,116,101,110,116,61,34,99,111,110,116,114,111,118,101,114,115,105,97,108,112, -114,111,112,101,114,116,121,61,34,111,103,58,47,120,45,115,104,111,99,107,119,97 -,118,101,45,100,101,109,111,110,115,116,114,97,116,105,111,110,115,117,114,114, -111,117,110,100,101,100,32,98,121,78,101,118,101,114,116,104,101,108,101,115,115 -,44,119,97,115,32,116,104,101,32,102,105,114,115,116,99,111,110,115,105,100,101, -114,97,98,108,101,32,65,108,116,104,111,117,103,104,32,116,104,101,32,99,111,108 -,108,97,98,111,114,97,116,105,111,110,115,104,111,117,108,100,32,110,111,116,32, -98,101,112,114,111,112,111,114,116,105,111,110,32,111,102,60,115,112,97,110,32, -115,116,121,108,101,61,34,107,110,111,119,110,32,97,115,32,116,104,101,32,115, -104,111,114,116,108,121,32,97,102,116,101,114,102,111,114,32,105,110,115,116,97, -110,99,101,44,100,101,115,99,114,105,98,101,100,32,97,115,32,47,104,101,97,100, -62,10,60,98,111,100,121,32,115,116,97,114,116,105,110,103,32,119,105,116,104,105 -,110,99,114,101,97,115,105,110,103,108,121,32,116,104,101,32,102,97,99,116,32, -116,104,97,116,100,105,115,99,117,115,115,105,111,110,32,111,102,109,105,100,100 -,108,101,32,111,102,32,116,104,101,97,110,32,105,110,100,105,118,105,100,117,97, -108,100,105,102,102,105,99,117,108,116,32,116,111,32,112,111,105,110,116,32,111, -102,32,118,105,101,119,104,111,109,111,115,101,120,117,97,108,105,116,121,97,99, -99,101,112,116,97,110,99,101,32,111,102,60,47,115,112,97,110,62,60,47,100,105, -118,62,109,97,110,117,102,97,99,116,117,114,101,114,115,111,114,105,103,105,110, -32,111,102,32,116,104,101,99,111,109,109,111,110,108,121,32,117,115,101,100,105, -109,112,111,114,116,97,110,99,101,32,111,102,100,101,110,111,109,105,110,97,116, -105,111,110,115,98,97,99,107,103,114,111,117,110,100,58,32,35,108,101,110,103, -116,104,32,111,102,32,116,104,101,100,101,116,101,114,109,105,110,97,116,105,111 -,110,97,32,115,105,103,110,105,102,105,99,97,110,116,34,32,98,111,114,100,101, -114,61,34,48,34,62,114,101,118,111,108,117,116,105,111,110,97,114,121,112,114, -105,110,99,105,112,108,101,115,32,111,102,105,115,32,99,111,110,115,105,100,101, -114,101,100,119,97,115,32,100,101,118,101,108,111,112,101,100,73,110,100,111,45, -69,117,114,111,112,101,97,110,118,117,108,110,101,114,97,98,108,101,32,116,111, -112,114,111,112,111,110,101,110,116,115,32,111,102,97,114,101,32,115,111,109,101 -,116,105,109,101,115,99,108,111,115,101,114,32,116,111,32,116,104,101,78,101,119 -,32,89,111,114,107,32,67,105,116,121,32,110,97,109,101,61,34,115,101,97,114,99, -104,97,116,116,114,105,98,117,116,101,100,32,116,111,99,111,117,114,115,101,32, -111,102,32,116,104,101,109,97,116,104,101,109,97,116,105,99,105,97,110,98,121,32 -,116,104,101,32,101,110,100,32,111,102,97,116,32,116,104,101,32,101,110,100,32, -111,102,34,32,98,111,114,100,101,114,61,34,48,34,32,116,101,99,104,110,111,108, -111,103,105,99,97,108,46,114,101,109,111,118,101,67,108,97,115,115,40,98,114,97, -110,99,104,32,111,102,32,116,104,101,101,118,105,100,101,110,99,101,32,116,104, -97,116,33,91,101,110,100,105,102,93,45,45,62,13,10,73,110,115,116,105,116,117, -116,101,32,111,102,32,105,110,116,111,32,97,32,115,105,110,103,108,101,114,101, -115,112,101,99,116,105,118,101,108,121,46,97,110,100,32,116,104,101,114,101,102, -111,114,101,112,114,111,112,101,114,116,105,101,115,32,111,102,105,115,32,108, -111,99,97,116,101,100,32,105,110,115,111,109,101,32,111,102,32,119,104,105,99, -104,84,104,101,114,101,32,105,115,32,97,108,115,111,99,111,110,116,105,110,117, -101,100,32,116,111,32,97,112,112,101,97,114,97,110,99,101,32,111,102,32,38,97, -109,112,59,110,100,97,115,104,59,32,100,101,115,99,114,105,98,101,115,32,116,104 -,101,99,111,110,115,105,100,101,114,97,116,105,111,110,97,117,116,104,111,114,32 -,111,102,32,116,104,101,105,110,100,101,112,101,110,100,101,110,116,108,121,101, -113,117,105,112,112,101,100,32,119,105,116,104,100,111,101,115,32,110,111,116,32 -,104,97,118,101,60,47,97,62,60,97,32,104,114,101,102,61,34,99,111,110,102,117, -115,101,100,32,119,105,116,104,60,108,105,110,107,32,104,114,101,102,61,34,47,97 -,116,32,116,104,101,32,97,103,101,32,111,102,97,112,112,101,97,114,32,105,110,32 -,116,104,101,84,104,101,115,101,32,105,110,99,108,117,100,101,114,101,103,97,114 -,100,108,101,115,115,32,111,102,99,111,117,108,100,32,98,101,32,117,115,101,100, -32,115,116,121,108,101,61,38,113,117,111,116,59,115,101,118,101,114,97,108,32, -116,105,109,101,115,114,101,112,114,101,115,101,110,116,32,116,104,101,98,111, -100,121,62,10,60,47,104,116,109,108,62,116,104,111,117,103,104,116,32,116,111,32 -,98,101,112,111,112,117,108,97,116,105,111,110,32,111,102,112,111,115,115,105,98 -,105,108,105,116,105,101,115,112,101,114,99,101,110,116,97,103,101,32,111,102,97 -,99,99,101,115,115,32,116,111,32,116,104,101,97,110,32,97,116,116,101,109,112, -116,32,116,111,112,114,111,100,117,99,116,105,111,110,32,111,102,106,113,117,101 -,114,121,47,106,113,117,101,114,121,116,119,111,32,100,105,102,102,101,114,101, -110,116,98,101,108,111,110,103,32,116,111,32,116,104,101,101,115,116,97,98,108, -105,115,104,109,101,110,116,114,101,112,108,97,99,105,110,103,32,116,104,101,100 -,101,115,99,114,105,112,116,105,111,110,34,32,100,101,116,101,114,109,105,110, -101,32,116,104,101,97,118,97,105,108,97,98,108,101,32,102,111,114,65,99,99,111, -114,100,105,110,103,32,116,111,32,119,105,100,101,32,114,97,110,103,101,32,111, -102,9,60,100,105,118,32,99,108,97,115,115,61,34,109,111,114,101,32,99,111,109, -109,111,110,108,121,111,114,103,97,110,105,115,97,116,105,111,110,115,102,117, -110,99,116,105,111,110,97,108,105,116,121,119,97,115,32,99,111,109,112,108,101, -116,101,100,32,38,97,109,112,59,109,100,97,115,104,59,32,112,97,114,116,105,99, -105,112,97,116,105,111,110,116,104,101,32,99,104,97,114,97,99,116,101,114,97,110 -,32,97,100,100,105,116,105,111,110,97,108,97,112,112,101,97,114,115,32,116,111, -32,98,101,102,97,99,116,32,116,104,97,116,32,116,104,101,97,110,32,101,120,97, -109,112,108,101,32,111,102,115,105,103,110,105,102,105,99,97,110,116,108,121,111 -,110,109,111,117,115,101,111,118,101,114,61,34,98,101,99,97,117,115,101,32,116, -104,101,121,32,97,115,121,110,99,32,61,32,116,114,117,101,59,112,114,111,98,108, -101,109,115,32,119,105,116,104,115,101,101,109,115,32,116,111,32,104,97,118,101, -116,104,101,32,114,101,115,117,108,116,32,111,102,32,115,114,99,61,34,104,116, -116,112,58,47,47,102,97,109,105,108,105,97,114,32,119,105,116,104,112,111,115, -115,101,115,115,105,111,110,32,111,102,102,117,110,99,116,105,111,110,32,40,41, -32,123,116,111,111,107,32,112,108,97,99,101,32,105,110,97,110,100,32,115,111,109 -,101,116,105,109,101,115,115,117,98,115,116,97,110,116,105,97,108,108,121,60,115 -,112,97,110,62,60,47,115,112,97,110,62,105,115,32,111,102,116,101,110,32,117,115 -,101,100,105,110,32,97,110,32,97,116,116,101,109,112,116,103,114,101,97,116,32, -100,101,97,108,32,111,102,69,110,118,105,114,111,110,109,101,110,116,97,108,115, -117,99,99,101,115,115,102,117,108,108,121,32,118,105,114,116,117,97,108,108,121, -32,97,108,108,50,48,116,104,32,99,101,110,116,117,114,121,44,112,114,111,102,101 -,115,115,105,111,110,97,108,115,110,101,99,101,115,115,97,114,121,32,116,111,32, -100,101,116,101,114,109,105,110,101,100,32,98,121,99,111,109,112,97,116,105,98, -105,108,105,116,121,98,101,99,97,117,115,101,32,105,116,32,105,115,68,105,99,116 -,105,111,110,97,114,121,32,111,102,109,111,100,105,102,105,99,97,116,105,111,110 -,115,84,104,101,32,102,111,108,108,111,119,105,110,103,109,97,121,32,114,101,102 -,101,114,32,116,111,58,67,111,110,115,101,113,117,101,110,116,108,121,44,73,110, -116,101,114,110,97,116,105,111,110,97,108,97,108,116,104,111,117,103,104,32,115, -111,109,101,116,104,97,116,32,119,111,117,108,100,32,98,101,119,111,114,108,100, -39,115,32,102,105,114,115,116,99,108,97,115,115,105,102,105,101,100,32,97,115,98 -,111,116,116,111,109,32,111,102,32,116,104,101,40,112,97,114,116,105,99,117,108, -97,114,108,121,97,108,105,103,110,61,34,108,101,102,116,34,32,109,111,115,116,32 -,99,111,109,109,111,110,108,121,98,97,115,105,115,32,102,111,114,32,116,104,101, -102,111,117,110,100,97,116,105,111,110,32,111,102,99,111,110,116,114,105,98,117, -116,105,111,110,115,112,111,112,117,108,97,114,105,116,121,32,111,102,99,101,110 -,116,101,114,32,111,102,32,116,104,101,116,111,32,114,101,100,117,99,101,32,116, -104,101,106,117,114,105,115,100,105,99,116,105,111,110,115,97,112,112,114,111, -120,105,109,97,116,105,111,110,32,111,110,109,111,117,115,101,111,117,116,61,34, -78,101,119,32,84,101,115,116,97,109,101,110,116,99,111,108,108,101,99,116,105, -111,110,32,111,102,60,47,115,112,97,110,62,60,47,97,62,60,47,105,110,32,116,104, -101,32,85,110,105,116,101,100,102,105,108,109,32,100,105,114,101,99,116,111,114, -45,115,116,114,105,99,116,46,100,116,100,34,62,104,97,115,32,98,101,101,110,32, -117,115,101,100,114,101,116,117,114,110,32,116,111,32,116,104,101,97,108,116,104 -,111,117,103,104,32,116,104,105,115,99,104,97,110,103,101,32,105,110,32,116,104, -101,115,101,118,101,114,97,108,32,111,116,104,101,114,98,117,116,32,116,104,101, -114,101,32,97,114,101,117,110,112,114,101,99,101,100,101,110,116,101,100,105,115 -,32,115,105,109,105,108,97,114,32,116,111,101,115,112,101,99,105,97,108,108,121, -32,105,110,119,101,105,103,104,116,58,32,98,111,108,100,59,105,115,32,99,97,108, -108,101,100,32,116,104,101,99,111,109,112,117,116,97,116,105,111,110,97,108,105, -110,100,105,99,97,116,101,32,116,104,97,116,114,101,115,116,114,105,99,116,101, -100,32,116,111,9,60,109,101,116,97,32,110,97,109,101,61,34,97,114,101,32,116,121 -,112,105,99,97,108,108,121,99,111,110,102,108,105,99,116,32,119,105,116,104,72, -111,119,101,118,101,114,44,32,116,104,101,32,65,110,32,101,120,97,109,112,108, -101,32,111,102,99,111,109,112,97,114,101,100,32,119,105,116,104,113,117,97,110, -116,105,116,105,101,115,32,111,102,114,97,116,104,101,114,32,116,104,97,110,32, -97,99,111,110,115,116,101,108,108,97,116,105,111,110,110,101,99,101,115,115,97, -114,121,32,102,111,114,114,101,112,111,114,116,101,100,32,116,104,97,116,115,112 -,101,99,105,102,105,99,97,116,105,111,110,112,111,108,105,116,105,99,97,108,32, -97,110,100,38,110,98,115,112,59,38,110,98,115,112,59,60,114,101,102,101,114,101, -110,99,101,115,32,116,111,116,104,101,32,115,97,109,101,32,121,101,97,114,71,111 -,118,101,114,110,109,101,110,116,32,111,102,103,101,110,101,114,97,116,105,111, -110,32,111,102,104,97,118,101,32,110,111,116,32,98,101,101,110,115,101,118,101, -114,97,108,32,121,101,97,114,115,99,111,109,109,105,116,109,101,110,116,32,116, -111,9,9,60,117,108,32,99,108,97,115,115,61,34,118,105,115,117,97,108,105,122,97, -116,105,111,110,49,57,116,104,32,99,101,110,116,117,114,121,44,112,114,97,99,116 -,105,116,105,111,110,101,114,115,116,104,97,116,32,104,101,32,119,111,117,108, -100,97,110,100,32,99,111,110,116,105,110,117,101,100,111,99,99,117,112,97,116, -105,111,110,32,111,102,105,115,32,100,101,102,105,110,101,100,32,97,115,99,101, -110,116,114,101,32,111,102,32,116,104,101,116,104,101,32,97,109,111,117,110,116, -32,111,102,62,60,100,105,118,32,115,116,121,108,101,61,34,101,113,117,105,118,97 -,108,101,110,116,32,111,102,100,105,102,102,101,114,101,110,116,105,97,116,101, -98,114,111,117,103,104,116,32,97,98,111,117,116,109,97,114,103,105,110,45,108, -101,102,116,58,32,97,117,116,111,109,97,116,105,99,97,108,108,121,116,104,111, -117,103,104,116,32,111,102,32,97,115,83,111,109,101,32,111,102,32,116,104,101, -115,101,10,60,100,105,118,32,99,108,97,115,115,61,34,105,110,112,117,116,32,99, -108,97,115,115,61,34,114,101,112,108,97,99,101,100,32,119,105,116,104,105,115,32 -,111,110,101,32,111,102,32,116,104,101,101,100,117,99,97,116,105,111,110,32,97, -110,100,105,110,102,108,117,101,110,99,101,100,32,98,121,114,101,112,117,116,97, -116,105,111,110,32,97,115,10,60,109,101,116,97,32,110,97,109,101,61,34,97,99,99, -111,109,109,111,100,97,116,105,111,110,60,47,100,105,118,62,10,60,47,100,105,118 -,62,108,97,114,103,101,32,112,97,114,116,32,111,102,73,110,115,116,105,116,117, -116,101,32,102,111,114,116,104,101,32,115,111,45,99,97,108,108,101,100,32,97,103 -,97,105,110,115,116,32,116,104,101,32,73,110,32,116,104,105,115,32,99,97,115,101 -,44,119,97,115,32,97,112,112,111,105,110,116,101,100,99,108,97,105,109,101,100, -32,116,111,32,98,101,72,111,119,101,118,101,114,44,32,116,104,105,115,68,101,112 -,97,114,116,109,101,110,116,32,111,102,116,104,101,32,114,101,109,97,105,110,105 -,110,103,101,102,102,101,99,116,32,111,110,32,116,104,101,112,97,114,116,105,99, -117,108,97,114,108,121,32,100,101,97,108,32,119,105,116,104,32,116,104,101,10,60 -,100,105,118,32,115,116,121,108,101,61,34,97,108,109,111,115,116,32,97,108,119, -97,121,115,97,114,101,32,99,117,114,114,101,110,116,108,121,101,120,112,114,101, -115,115,105,111,110,32,111,102,112,104,105,108,111,115,111,112,104,121,32,111, -102,102,111,114,32,109,111,114,101,32,116,104,97,110,99,105,118,105,108,105,122, -97,116,105,111,110,115,111,110,32,116,104,101,32,105,115,108,97,110,100,115,101, -108,101,99,116,101,100,73,110,100,101,120,99,97,110,32,114,101,115,117,108,116, -32,105,110,34,32,118,97,108,117,101,61,34,34,32,47,62,116,104,101,32,115,116,114 -,117,99,116,117,114,101,32,47,62,60,47,97,62,60,47,100,105,118,62,77,97,110,121, -32,111,102,32,116,104,101,115,101,99,97,117,115,101,100,32,98,121,32,116,104,101 -,111,102,32,116,104,101,32,85,110,105,116,101,100,115,112,97,110,32,99,108,97, -115,115,61,34,109,99,97,110,32,98,101,32,116,114,97,99,101,100,105,115,32,114, -101,108,97,116,101,100,32,116,111,98,101,99,97,109,101,32,111,110,101,32,111,102 -,105,115,32,102,114,101,113,117,101,110,116,108,121,108,105,118,105,110,103,32, -105,110,32,116,104,101,116,104,101,111,114,101,116,105,99,97,108,108,121,70,111, -108,108,111,119,105,110,103,32,116,104,101,82,101,118,111,108,117,116,105,111, -110,97,114,121,103,111,118,101,114,110,109,101,110,116,32,105,110,105,115,32,100 -,101,116,101,114,109,105,110,101,100,116,104,101,32,112,111,108,105,116,105,99, -97,108,105,110,116,114,111,100,117,99,101,100,32,105,110,115,117,102,102,105,99, -105,101,110,116,32,116,111,100,101,115,99,114,105,112,116,105,111,110,34,62,115, -104,111,114,116,32,115,116,111,114,105,101,115,115,101,112,97,114,97,116,105,111 -,110,32,111,102,97,115,32,116,111,32,119,104,101,116,104,101,114,107,110,111,119 -,110,32,102,111,114,32,105,116,115,119,97,115,32,105,110,105,116,105,97,108,108, -121,100,105,115,112,108,97,121,58,98,108,111,99,107,105,115,32,97,110,32,101,120 -,97,109,112,108,101,116,104,101,32,112,114,105,110,99,105,112,97,108,99,111,110, -115,105,115,116,115,32,111,102,32,97,114,101,99,111,103,110,105,122,101,100,32, -97,115,47,98,111,100,121,62,60,47,104,116,109,108,62,97,32,115,117,98,115,116,97 -,110,116,105,97,108,114,101,99,111,110,115,116,114,117,99,116,101,100,104,101,97 -,100,32,111,102,32,115,116,97,116,101,114,101,115,105,115,116,97,110,99,101,32, -116,111,117,110,100,101,114,103,114,97,100,117,97,116,101,84,104,101,114,101,32, -97,114,101,32,116,119,111,103,114,97,118,105,116,97,116,105,111,110,97,108,97, -114,101,32,100,101,115,99,114,105,98,101,100,105,110,116,101,110,116,105,111,110 -,97,108,108,121,115,101,114,118,101,100,32,97,115,32,116,104,101,99,108,97,115, -115,61,34,104,101,97,100,101,114,111,112,112,111,115,105,116,105,111,110,32,116, -111,102,117,110,100,97,109,101,110,116,97,108,108,121,100,111,109,105,110,97,116 -,101,100,32,116,104,101,97,110,100,32,116,104,101,32,111,116,104,101,114,97,108, -108,105,97,110,99,101,32,119,105,116,104,119,97,115,32,102,111,114,99,101,100,32 -,116,111,114,101,115,112,101,99,116,105,118,101,108,121,44,97,110,100,32,112,111 -,108,105,116,105,99,97,108,105,110,32,115,117,112,112,111,114,116,32,111,102,112 -,101,111,112,108,101,32,105,110,32,116,104,101,50,48,116,104,32,99,101,110,116, -117,114,121,46,97,110,100,32,112,117,98,108,105,115,104,101,100,108,111,97,100, -67,104,97,114,116,98,101,97,116,116,111,32,117,110,100,101,114,115,116,97,110, -100,109,101,109,98,101,114,32,115,116,97,116,101,115,101,110,118,105,114,111,110 -,109,101,110,116,97,108,102,105,114,115,116,32,104,97,108,102,32,111,102,99,111, -117,110,116,114,105,101,115,32,97,110,100,97,114,99,104,105,116,101,99,116,117, -114,97,108,98,101,32,99,111,110,115,105,100,101,114,101,100,99,104,97,114,97,99, -116,101,114,105,122,101,100,99,108,101,97,114,73,110,116,101,114,118,97,108,97, -117,116,104,111,114,105,116,97,116,105,118,101,70,101,100,101,114,97,116,105,111 -,110,32,111,102,119,97,115,32,115,117,99,99,101,101,100,101,100,97,110,100,32, -116,104,101,114,101,32,97,114,101,97,32,99,111,110,115,101,113,117,101,110,99, -101,116,104,101,32,80,114,101,115,105,100,101,110,116,97,108,115,111,32,105,110, -99,108,117,100,101,100,102,114,101,101,32,115,111,102,116,119,97,114,101,115,117 -,99,99,101,115,115,105,111,110,32,111,102,100,101,118,101,108,111,112,101,100,32 -,116,104,101,119,97,115,32,100,101,115,116,114,111,121,101,100,97,119,97,121,32, -102,114,111,109,32,116,104,101,59,10,60,47,115,99,114,105,112,116,62,10,60,97, -108,116,104,111,117,103,104,32,116,104,101,121,102,111,108,108,111,119,101,100, -32,98,121,32,97,109,111,114,101,32,112,111,119,101,114,102,117,108,114,101,115, -117,108,116,101,100,32,105,110,32,97,85,110,105,118,101,114,115,105,116,121,32, -111,102,72,111,119,101,118,101,114,44,32,109,97,110,121,116,104,101,32,112,114, -101,115,105,100,101,110,116,72,111,119,101,118,101,114,44,32,115,111,109,101,105 -,115,32,116,104,111,117,103,104,116,32,116,111,117,110,116,105,108,32,116,104, -101,32,101,110,100,119,97,115,32,97,110,110,111,117,110,99,101,100,97,114,101,32 -,105,109,112,111,114,116,97,110,116,97,108,115,111,32,105,110,99,108,117,100,101 -,115,62,60,105,110,112,117,116,32,116,121,112,101,61,116,104,101,32,99,101,110, -116,101,114,32,111,102,32,68,79,32,78,79,84,32,65,76,84,69,82,117,115,101,100,32 -,116,111,32,114,101,102,101,114,116,104,101,109,101,115,47,63,115,111,114,116,61 -,116,104,97,116,32,104,97,100,32,98,101,101,110,116,104,101,32,98,97,115,105,115 -,32,102,111,114,104,97,115,32,100,101,118,101,108,111,112,101,100,105,110,32,116 -,104,101,32,115,117,109,109,101,114,99,111,109,112,97,114,97,116,105,118,101,108 -,121,100,101,115,99,114,105,98,101,100,32,116,104,101,115,117,99,104,32,97,115, -32,116,104,111,115,101,116,104,101,32,114,101,115,117,108,116,105,110,103,105, -115,32,105,109,112,111,115,115,105,98,108,101,118,97,114,105,111,117,115,32,111, -116,104,101,114,83,111,117,116,104,32,65,102,114,105,99,97,110,104,97,118,101,32 -,116,104,101,32,115,97,109,101,101,102,102,101,99,116,105,118,101,110,101,115, -115,105,110,32,119,104,105,99,104,32,99,97,115,101,59,32,116,101,120,116,45,97, -108,105,103,110,58,115,116,114,117,99,116,117,114,101,32,97,110,100,59,32,98,97, -99,107,103,114,111,117,110,100,58,114,101,103,97,114,100,105,110,103,32,116,104, -101,115,117,112,112,111,114,116,101,100,32,116,104,101,105,115,32,97,108,115,111 -,32,107,110,111,119,110,115,116,121,108,101,61,34,109,97,114,103,105,110,105,110 -,99,108,117,100,105,110,103,32,116,104,101,98,97,104,97,115,97,32,77,101,108,97, -121,117,110,111,114,115,107,32,98,111,107,109,195,165,108,110,111,114,115,107,32 -,110,121,110,111,114,115,107,115,108,111,118,101,110,197,161,196,141,105,110,97, -105,110,116,101,114,110,97,99,105,111,110,97,108,99,97,108,105,102,105,99,97,99, -105,195,179,110,99,111,109,117,110,105,99,97,99,105,195,179,110,99,111,110,115, -116,114,117,99,99,105,195,179,110,34,62,60,100,105,118,32,99,108,97,115,115,61, -34,100,105,115,97,109,98,105,103,117,97,116,105,111,110,68,111,109,97,105,110,78 -,97,109,101,39,44,32,39,97,100,109,105,110,105,115,116,114,97,116,105,111,110, -115,105,109,117,108,116,97,110,101,111,117,115,108,121,116,114,97,110,115,112, -111,114,116,97,116,105,111,110,73,110,116,101,114,110,97,116,105,111,110,97,108, -32,109,97,114,103,105,110,45,98,111,116,116,111,109,58,114,101,115,112,111,110, -115,105,98,105,108,105,116,121,60,33,91,101,110,100,105,102,93,45,45,62,10,60,47 -,62,60,109,101,116,97,32,110,97,109,101,61,34,105,109,112,108,101,109,101,110, -116,97,116,105,111,110,105,110,102,114,97,115,116,114,117,99,116,117,114,101,114 -,101,112,114,101,115,101,110,116,97,116,105,111,110,98,111,114,100,101,114,45,98 -,111,116,116,111,109,58,60,47,104,101,97,100,62,10,60,98,111,100,121,62,61,104, -116,116,112,37,51,65,37,50,70,37,50,70,60,102,111,114,109,32,109,101,116,104,111 -,100,61,34,109,101,116,104,111,100,61,34,112,111,115,116,34,32,47,102,97,118,105 -,99,111,110,46,105,99,111,34,32,125,41,59,10,60,47,115,99,114,105,112,116,62,10, -46,115,101,116,65,116,116,114,105,98,117,116,101,40,65,100,109,105,110,105,115, -116,114,97,116,105,111,110,61,32,110,101,119,32,65,114,114,97,121,40,41,59,60,33 -,91,101,110,100,105,102,93,45,45,62,13,10,100,105,115,112,108,97,121,58,98,108, -111,99,107,59,85,110,102,111,114,116,117,110,97,116,101,108,121,44,34,62,38,110, -98,115,112,59,60,47,100,105,118,62,47,102,97,118,105,99,111,110,46,105,99,111,34 -,62,61,39,115,116,121,108,101,115,104,101,101,116,39,32,105,100,101,110,116,105, -102,105,99,97,116,105,111,110,44,32,102,111,114,32,101,120,97,109,112,108,101,44 -,60,108,105,62,60,97,32,104,114,101,102,61,34,47,97,110,32,97,108,116,101,114, -110,97,116,105,118,101,97,115,32,97,32,114,101,115,117,108,116,32,111,102,112, -116,34,62,60,47,115,99,114,105,112,116,62,10,116,121,112,101,61,34,115,117,98, -109,105,116,34,32,10,40,102,117,110,99,116,105,111,110,40,41,32,123,114,101,99, -111,109,109,101,110,100,97,116,105,111,110,102,111,114,109,32,97,99,116,105,111, -110,61,34,47,116,114,97,110,115,102,111,114,109,97,116,105,111,110,114,101,99, -111,110,115,116,114,117,99,116,105,111,110,46,115,116,121,108,101,46,100,105,115 -,112,108,97,121,32,65,99,99,111,114,100,105,110,103,32,116,111,32,104,105,100, -100,101,110,34,32,110,97,109,101,61,34,97,108,111,110,103,32,119,105,116,104,32, -116,104,101,100,111,99,117,109,101,110,116,46,98,111,100,121,46,97,112,112,114, -111,120,105,109,97,116,101,108,121,32,67,111,109,109,117,110,105,99,97,116,105, -111,110,115,112,111,115,116,34,32,97,99,116,105,111,110,61,34,109,101,97,110,105 -,110,103,32,38,113,117,111,116,59,45,45,60,33,91,101,110,100,105,102,93,45,45,62 -,80,114,105,109,101,32,77,105,110,105,115,116,101,114,99,104,97,114,97,99,116, -101,114,105,115,116,105,99,60,47,97,62,32,60,97,32,99,108,97,115,115,61,116,104, -101,32,104,105,115,116,111,114,121,32,111,102,32,111,110,109,111,117,115,101,111 -,118,101,114,61,34,116,104,101,32,103,111,118,101,114,110,109,101,110,116,104, -114,101,102,61,34,104,116,116,112,115,58,47,47,119,97,115,32,111,114,105,103,105 -,110,97,108,108,121,119,97,115,32,105,110,116,114,111,100,117,99,101,100,99,108, -97,115,115,105,102,105,99,97,116,105,111,110,114,101,112,114,101,115,101,110,116 -,97,116,105,118,101,97,114,101,32,99,111,110,115,105,100,101,114,101,100,60,33, -91,101,110,100,105,102,93,45,45,62,10,10,100,101,112,101,110,100,115,32,111,110, -32,116,104,101,85,110,105,118,101,114,115,105,116,121,32,111,102,32,105,110,32, -99,111,110,116,114,97,115,116,32,116,111,32,112,108,97,99,101,104,111,108,100, -101,114,61,34,105,110,32,116,104,101,32,99,97,115,101,32,111,102,105,110,116,101 -,114,110,97,116,105,111,110,97,108,32,99,111,110,115,116,105,116,117,116,105,111 -,110,97,108,115,116,121,108,101,61,34,98,111,114,100,101,114,45,58,32,102,117, -110,99,116,105,111,110,40,41,32,123,66,101,99,97,117,115,101,32,111,102,32,116, -104,101,45,115,116,114,105,99,116,46,100,116,100,34,62,10,60,116,97,98,108,101, -32,99,108,97,115,115,61,34,97,99,99,111,109,112,97,110,105,101,100,32,98,121,97, -99,99,111,117,110,116,32,111,102,32,116,104,101,60,115,99,114,105,112,116,32,115 -,114,99,61,34,47,110,97,116,117,114,101,32,111,102,32,116,104,101,32,116,104,101 -,32,112,101,111,112,108,101,32,105,110,32,105,110,32,97,100,100,105,116,105,111, -110,32,116,111,115,41,59,32,106,115,46,105,100,32,61,32,105,100,34,32,119,105, -100,116,104,61,34,49,48,48,37,34,114,101,103,97,114,100,105,110,103,32,116,104, -101,32,82,111,109,97,110,32,67,97,116,104,111,108,105,99,97,110,32,105,110,100, -101,112,101,110,100,101,110,116,102,111,108,108,111,119,105,110,103,32,116,104, -101,32,46,103,105,102,34,32,119,105,100,116,104,61,34,49,116,104,101,32,102,111, -108,108,111,119,105,110,103,32,100,105,115,99,114,105,109,105,110,97,116,105,111 -,110,97,114,99,104,97,101,111,108,111,103,105,99,97,108,112,114,105,109,101,32, -109,105,110,105,115,116,101,114,46,106,115,34,62,60,47,115,99,114,105,112,116,62 -,99,111,109,98,105,110,97,116,105,111,110,32,111,102,32,109,97,114,103,105,110, -119,105,100,116,104,61,34,99,114,101,97,116,101,69,108,101,109,101,110,116,40, -119,46,97,116,116,97,99,104,69,118,101,110,116,40,60,47,97,62,60,47,116,100,62, -60,47,116,114,62,115,114,99,61,34,104,116,116,112,115,58,47,47,97,73,110,32,112, -97,114,116,105,99,117,108,97,114,44,32,97,108,105,103,110,61,34,108,101,102,116, -34,32,67,122,101,99,104,32,82,101,112,117,98,108,105,99,85,110,105,116,101,100, -32,75,105,110,103,100,111,109,99,111,114,114,101,115,112,111,110,100,101,110,99, -101,99,111,110,99,108,117,100,101,100,32,116,104,97,116,46,104,116,109,108,34,32 -,116,105,116,108,101,61,34,40,102,117,110,99,116,105,111,110,32,40,41,32,123,99, -111,109,101,115,32,102,114,111,109,32,116,104,101,97,112,112,108,105,99,97,116, -105,111,110,32,111,102,60,115,112,97,110,32,99,108,97,115,115,61,34,115,98,101, -108,105,101,118,101,100,32,116,111,32,98,101,101,109,101,110,116,40,39,115,99, -114,105,112,116,39,60,47,97,62,10,60,47,108,105,62,10,60,108,105,118,101,114,121 -,32,100,105,102,102,101,114,101,110,116,62,60,115,112,97,110,32,99,108,97,115, -115,61,34,111,112,116,105,111,110,32,118,97,108,117,101,61,34,40,97,108,115,111, -32,107,110,111,119,110,32,97,115,9,60,108,105,62,60,97,32,104,114,101,102,61,34, -62,60,105,110,112,117,116,32,110,97,109,101,61,34,115,101,112,97,114,97,116,101, -100,32,102,114,111,109,114,101,102,101,114,114,101,100,32,116,111,32,97,115,32, -118,97,108,105,103,110,61,34,116,111,112,34,62,102,111,117,110,100,101,114,32, -111,102,32,116,104,101,97,116,116,101,109,112,116,105,110,103,32,116,111,32,99, -97,114,98,111,110,32,100,105,111,120,105,100,101,10,10,60,100,105,118,32,99,108, -97,115,115,61,34,99,108,97,115,115,61,34,115,101,97,114,99,104,45,47,98,111,100, -121,62,10,60,47,104,116,109,108,62,111,112,112,111,114,116,117,110,105,116,121, -32,116,111,99,111,109,109,117,110,105,99,97,116,105,111,110,115,60,47,104,101,97 -,100,62,13,10,60,98,111,100,121,32,115,116,121,108,101,61,34,119,105,100,116,104 -,58,84,105,225,186,191,110,103,32,86,105,225,187,135,116,99,104,97,110,103,101, -115,32,105,110,32,116,104,101,98,111,114,100,101,114,45,99,111,108,111,114,58,35 -,48,34,32,98,111,114,100,101,114,61,34,48,34,32,60,47,115,112,97,110,62,60,47, -100,105,118,62,60,119,97,115,32,100,105,115,99,111,118,101,114,101,100,34,32,116 -,121,112,101,61,34,116,101,120,116,34,32,41,59,10,60,47,115,99,114,105,112,116, -62,10,10,68,101,112,97,114,116,109,101,110,116,32,111,102,32,101,99,99,108,101, -115,105,97,115,116,105,99,97,108,116,104,101,114,101,32,104,97,115,32,98,101,101 -,110,114,101,115,117,108,116,105,110,103,32,102,114,111,109,60,47,98,111,100,121 -,62,60,47,104,116,109,108,62,104,97,115,32,110,101,118,101,114,32,98,101,101,110 -,116,104,101,32,102,105,114,115,116,32,116,105,109,101,105,110,32,114,101,115, -112,111,110,115,101,32,116,111,97,117,116,111,109,97,116,105,99,97,108,108,121, -32,60,47,100,105,118,62,10,10,60,100,105,118,32,105,119,97,115,32,99,111,110,115 -,105,100,101,114,101,100,112,101,114,99,101,110,116,32,111,102,32,116,104,101,34 -,32,47,62,60,47,97,62,60,47,100,105,118,62,99,111,108,108,101,99,116,105,111,110 -,32,111,102,32,100,101,115,99,101,110,100,101,100,32,102,114,111,109,115,101,99, -116,105,111,110,32,111,102,32,116,104,101,97,99,99,101,112,116,45,99,104,97,114, -115,101,116,116,111,32,98,101,32,99,111,110,102,117,115,101,100,109,101,109,98, -101,114,32,111,102,32,116,104,101,32,112,97,100,100,105,110,103,45,114,105,103, -104,116,58,116,114,97,110,115,108,97,116,105,111,110,32,111,102,105,110,116,101, -114,112,114,101,116,97,116,105,111,110,32,104,114,101,102,61,39,104,116,116,112, -58,47,47,119,104,101,116,104,101,114,32,111,114,32,110,111,116,84,104,101,114, -101,32,97,114,101,32,97,108,115,111,116,104,101,114,101,32,97,114,101,32,109,97, -110,121,97,32,115,109,97,108,108,32,110,117,109,98,101,114,111,116,104,101,114, -32,112,97,114,116,115,32,111,102,105,109,112,111,115,115,105,98,108,101,32,116, -111,32,32,99,108,97,115,115,61,34,98,117,116,116,111,110,108,111,99,97,116,101, -100,32,105,110,32,116,104,101,46,32,72,111,119,101,118,101,114,44,32,116,104,101 -,97,110,100,32,101,118,101,110,116,117,97,108,108,121,65,116,32,116,104,101,32, -101,110,100,32,111,102,32,98,101,99,97,117,115,101,32,111,102,32,105,116,115,114 -,101,112,114,101,115,101,110,116,115,32,116,104,101,60,102,111,114,109,32,97,99, -116,105,111,110,61,34,32,109,101,116,104,111,100,61,34,112,111,115,116,34,105, -116,32,105,115,32,112,111,115,115,105,98,108,101,109,111,114,101,32,108,105,107, -101,108,121,32,116,111,97,110,32,105,110,99,114,101,97,115,101,32,105,110,104,97 -,118,101,32,97,108,115,111,32,98,101,101,110,99,111,114,114,101,115,112,111,110, -100,115,32,116,111,97,110,110,111,117,110,99,101,100,32,116,104,97,116,97,108, -105,103,110,61,34,114,105,103,104,116,34,62,109,97,110,121,32,99,111,117,110,116 -,114,105,101,115,102,111,114,32,109,97,110,121,32,121,101,97,114,115,101,97,114, -108,105,101,115,116,32,107,110,111,119,110,98,101,99,97,117,115,101,32,105,116, -32,119,97,115,112,116,34,62,60,47,115,99,114,105,112,116,62,13,32,118,97,108,105 -,103,110,61,34,116,111,112,34,32,105,110,104,97,98,105,116,97,110,116,115,32,111 -,102,102,111,108,108,111,119,105,110,103,32,121,101,97,114,13,10,60,100,105,118, -32,99,108,97,115,115,61,34,109,105,108,108,105,111,110,32,112,101,111,112,108, -101,99,111,110,116,114,111,118,101,114,115,105,97,108,32,99,111,110,99,101,114, -110,105,110,103,32,116,104,101,97,114,103,117,101,32,116,104,97,116,32,116,104, -101,103,111,118,101,114,110,109,101,110,116,32,97,110,100,97,32,114,101,102,101, -114,101,110,99,101,32,116,111,116,114,97,110,115,102,101,114,114,101,100,32,116, -111,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,115,116,121,108,101, -61,34,99,111,108,111,114,58,97,108,116,104,111,117,103,104,32,116,104,101,114, -101,98,101,115,116,32,107,110,111,119,110,32,102,111,114,115,117,98,109,105,116, -34,32,110,97,109,101,61,34,109,117,108,116,105,112,108,105,99,97,116,105,111,110 -,109,111,114,101,32,116,104,97,110,32,111,110,101,32,114,101,99,111,103,110,105, -116,105,111,110,32,111,102,67,111,117,110,99,105,108,32,111,102,32,116,104,101, -101,100,105,116,105,111,110,32,111,102,32,116,104,101,32,32,60,109,101,116,97,32 -,110,97,109,101,61,34,69,110,116,101,114,116,97,105,110,109,101,110,116,32,97, -119,97,121,32,102,114,111,109,32,116,104,101,32,59,109,97,114,103,105,110,45,114 -,105,103,104,116,58,97,116,32,116,104,101,32,116,105,109,101,32,111,102,105,110, -118,101,115,116,105,103,97,116,105,111,110,115,99,111,110,110,101,99,116,101,100 -,32,119,105,116,104,97,110,100,32,109,97,110,121,32,111,116,104,101,114,97,108, -116,104,111,117,103,104,32,105,116,32,105,115,98,101,103,105,110,110,105,110,103 -,32,119,105,116,104,32,60,115,112,97,110,32,99,108,97,115,115,61,34,100,101,115, -99,101,110,100,97,110,116,115,32,111,102,60,115,112,97,110,32,99,108,97,115,115, -61,34,105,32,97,108,105,103,110,61,34,114,105,103,104,116,34,60,47,104,101,97, -100,62,10,60,98,111,100,121,32,97,115,112,101,99,116,115,32,111,102,32,116,104, -101,104,97,115,32,115,105,110,99,101,32,98,101,101,110,69,117,114,111,112,101,97 -,110,32,85,110,105,111,110,114,101,109,105,110,105,115,99,101,110,116,32,111,102 -,109,111,114,101,32,100,105,102,102,105,99,117,108,116,86,105,99,101,32,80,114, -101,115,105,100,101,110,116,99,111,109,112,111,115,105,116,105,111,110,32,111, -102,112,97,115,115,101,100,32,116,104,114,111,117,103,104,109,111,114,101,32,105 -,109,112,111,114,116,97,110,116,102,111,110,116,45,115,105,122,101,58,49,49,112, -120,101,120,112,108,97,110,97,116,105,111,110,32,111,102,116,104,101,32,99,111, -110,99,101,112,116,32,111,102,119,114,105,116,116,101,110,32,105,110,32,116,104, -101,9,60,115,112,97,110,32,99,108,97,115,115,61,34,105,115,32,111,110,101,32,111 -,102,32,116,104,101,32,114,101,115,101,109,98,108,97,110,99,101,32,116,111,111, -110,32,116,104,101,32,103,114,111,117,110,100,115,119,104,105,99,104,32,99,111, -110,116,97,105,110,115,105,110,99,108,117,100,105,110,103,32,116,104,101,32,100, -101,102,105,110,101,100,32,98,121,32,116,104,101,112,117,98,108,105,99,97,116, -105,111,110,32,111,102,109,101,97,110,115,32,116,104,97,116,32,116,104,101,111, -117,116,115,105,100,101,32,111,102,32,116,104,101,115,117,112,112,111,114,116,32 -,111,102,32,116,104,101,60,105,110,112,117,116,32,99,108,97,115,115,61,34,60,115 -,112,97,110,32,99,108,97,115,115,61,34,116,40,77,97,116,104,46,114,97,110,100, -111,109,40,41,109,111,115,116,32,112,114,111,109,105,110,101,110,116,100,101,115 -,99,114,105,112,116,105,111,110,32,111,102,67,111,110,115,116,97,110,116,105,110 -,111,112,108,101,119,101,114,101,32,112,117,98,108,105,115,104,101,100,60,100, -105,118,32,99,108,97,115,115,61,34,115,101,97,112,112,101,97,114,115,32,105,110, -32,116,104,101,49,34,32,104,101,105,103,104,116,61,34,49,34,32,109,111,115,116, -32,105,109,112,111,114,116,97,110,116,119,104,105,99,104,32,105,110,99,108,117, -100,101,115,119,104,105,99,104,32,104,97,100,32,98,101,101,110,100,101,115,116, -114,117,99,116,105,111,110,32,111,102,116,104,101,32,112,111,112,117,108,97,116, -105,111,110,10,9,60,100,105,118,32,99,108,97,115,115,61,34,112,111,115,115,105, -98,105,108,105,116,121,32,111,102,115,111,109,101,116,105,109,101,115,32,117,115 -,101,100,97,112,112,101,97,114,32,116,111,32,104,97,118,101,115,117,99,99,101, -115,115,32,111,102,32,116,104,101,105,110,116,101,110,100,101,100,32,116,111,32, -98,101,112,114,101,115,101,110,116,32,105,110,32,116,104,101,115,116,121,108,101 -,61,34,99,108,101,97,114,58,98,13,10,60,47,115,99,114,105,112,116,62,13,10,60, -119,97,115,32,102,111,117,110,100,101,100,32,105,110,105,110,116,101,114,118,105 -,101,119,32,119,105,116,104,95,105,100,34,32,99,111,110,116,101,110,116,61,34,99 -,97,112,105,116,97,108,32,111,102,32,116,104,101,13,10,60,108,105,110,107,32,114 -,101,108,61,34,115,114,101,108,101,97,115,101,32,111,102,32,116,104,101,112,111, -105,110,116,32,111,117,116,32,116,104,97,116,120,77,76,72,116,116,112,82,101,113 -,117,101,115,116,97,110,100,32,115,117,98,115,101,113,117,101,110,116,115,101,99 -,111,110,100,32,108,97,114,103,101,115,116,118,101,114,121,32,105,109,112,111, -114,116,97,110,116,115,112,101,99,105,102,105,99,97,116,105,111,110,115,115,117, -114,102,97,99,101,32,111,102,32,116,104,101,97,112,112,108,105,101,100,32,116, -111,32,116,104,101,102,111,114,101,105,103,110,32,112,111,108,105,99,121,95,115, -101,116,68,111,109,97,105,110,78,97,109,101,101,115,116,97,98,108,105,115,104, -101,100,32,105,110,105,115,32,98,101,108,105,101,118,101,100,32,116,111,73,110, -32,97,100,100,105,116,105,111,110,32,116,111,109,101,97,110,105,110,103,32,111, -102,32,116,104,101,105,115,32,110,97,109,101,100,32,97,102,116,101,114,116,111, -32,112,114,111,116,101,99,116,32,116,104,101,105,115,32,114,101,112,114,101,115, -101,110,116,101,100,68,101,99,108,97,114,97,116,105,111,110,32,111,102,109,111, -114,101,32,101,102,102,105,99,105,101,110,116,67,108,97,115,115,105,102,105,99, -97,116,105,111,110,111,116,104,101,114,32,102,111,114,109,115,32,111,102,104,101 -,32,114,101,116,117,114,110,101,100,32,116,111,60,115,112,97,110,32,99,108,97, -115,115,61,34,99,112,101,114,102,111,114,109,97,110,99,101,32,111,102,40,102,117 -,110,99,116,105,111,110,40,41,32,123,13,105,102,32,97,110,100,32,111,110,108,121 -,32,105,102,114,101,103,105,111,110,115,32,111,102,32,116,104,101,108,101,97,100 -,105,110,103,32,116,111,32,116,104,101,114,101,108,97,116,105,111,110,115,32,119 -,105,116,104,85,110,105,116,101,100,32,78,97,116,105,111,110,115,115,116,121,108 -,101,61,34,104,101,105,103,104,116,58,111,116,104,101,114,32,116,104,97,110,32, -116,104,101,121,112,101,34,32,99,111,110,116,101,110,116,61,34,65,115,115,111,99 -,105,97,116,105,111,110,32,111,102,10,60,47,104,101,97,100,62,10,60,98,111,100, -121,108,111,99,97,116,101,100,32,111,110,32,116,104,101,105,115,32,114,101,102, -101,114,114,101,100,32,116,111,40,105,110,99,108,117,100,105,110,103,32,116,104, -101,99,111,110,99,101,110,116,114,97,116,105,111,110,115,116,104,101,32,105,110, -100,105,118,105,100,117,97,108,97,109,111,110,103,32,116,104,101,32,109,111,115, -116,116,104,97,110,32,97,110,121,32,111,116,104,101,114,47,62,10,60,108,105,110, -107,32,114,101,108,61,34,32,114,101,116,117,114,110,32,102,97,108,115,101,59,116 -,104,101,32,112,117,114,112,111,115,101,32,111,102,116,104,101,32,97,98,105,108, -105,116,121,32,116,111,59,99,111,108,111,114,58,35,102,102,102,125,10,46,10,60, -115,112,97,110,32,99,108,97,115,115,61,34,116,104,101,32,115,117,98,106,101,99, -116,32,111,102,100,101,102,105,110,105,116,105,111,110,115,32,111,102,62,13,10, -60,108,105,110,107,32,114,101,108,61,34,99,108,97,105,109,32,116,104,97,116,32, -116,104,101,104,97,118,101,32,100,101,118,101,108,111,112,101,100,60,116,97,98, -108,101,32,119,105,100,116,104,61,34,99,101,108,101,98,114,97,116,105,111,110,32 -,111,102,70,111,108,108,111,119,105,110,103,32,116,104,101,32,116,111,32,100,105 -,115,116,105,110,103,117,105,115,104,60,115,112,97,110,32,99,108,97,115,115,61, -34,98,116,97,107,101,115,32,112,108,97,99,101,32,105,110,117,110,100,101,114,32, -116,104,101,32,110,97,109,101,110,111,116,101,100,32,116,104,97,116,32,116,104, -101,62,60,33,91,101,110,100,105,102,93,45,45,62,10,115,116,121,108,101,61,34,109 -,97,114,103,105,110,45,105,110,115,116,101,97,100,32,111,102,32,116,104,101,105, -110,116,114,111,100,117,99,101,100,32,116,104,101,116,104,101,32,112,114,111,99, -101,115,115,32,111,102,105,110,99,114,101,97,115,105,110,103,32,116,104,101,100, -105,102,102,101,114,101,110,99,101,115,32,105,110,101,115,116,105,109,97,116,101 -,100,32,116,104,97,116,101,115,112,101,99,105,97,108,108,121,32,116,104,101,47, -100,105,118,62,60,100,105,118,32,105,100,61,34,119,97,115,32,101,118,101,110,116 -,117,97,108,108,121,116,104,114,111,117,103,104,111,117,116,32,104,105,115,116, -104,101,32,100,105,102,102,101,114,101,110,99,101,115,111,109,101,116,104,105, -110,103,32,116,104,97,116,115,112,97,110,62,60,47,115,112,97,110,62,60,47,115, -105,103,110,105,102,105,99,97,110,116,108,121,32,62,60,47,115,99,114,105,112,116 -,62,13,10,13,10,101,110,118,105,114,111,110,109,101,110,116,97,108,32,116,111,32 -,112,114,101,118,101,110,116,32,116,104,101,104,97,118,101,32,98,101,101,110,32, -117,115,101,100,101,115,112,101,99,105,97,108,108,121,32,102,111,114,117,110,100 -,101,114,115,116,97,110,100,32,116,104,101,105,115,32,101,115,115,101,110,116, -105,97,108,108,121,119,101,114,101,32,116,104,101,32,102,105,114,115,116,105,115 -,32,116,104,101,32,108,97,114,103,101,115,116,104,97,118,101,32,98,101,101,110, -32,109,97,100,101,34,32,115,114,99,61,34,104,116,116,112,58,47,47,105,110,116, -101,114,112,114,101,116,101,100,32,97,115,115,101,99,111,110,100,32,104,97,108, -102,32,111,102,99,114,111,108,108,105,110,103,61,34,110,111,34,32,105,115,32,99, -111,109,112,111,115,101,100,32,111,102,73,73,44,32,72,111,108,121,32,82,111,109, -97,110,105,115,32,101,120,112,101,99,116,101,100,32,116,111,104,97,118,101,32, -116,104,101,105,114,32,111,119,110,100,101,102,105,110,101,100,32,97,115,32,116, -104,101,116,114,97,100,105,116,105,111,110,97,108,108,121,32,104,97,118,101,32, -100,105,102,102,101,114,101,110,116,97,114,101,32,111,102,116,101,110,32,117,115 -,101,100,116,111,32,101,110,115,117,114,101,32,116,104,97,116,97,103,114,101,101 -,109,101,110,116,32,119,105,116,104,99,111,110,116,97,105,110,105,110,103,32,116 -,104,101,97,114,101,32,102,114,101,113,117,101,110,116,108,121,105,110,102,111, -114,109,97,116,105,111,110,32,111,110,101,120,97,109,112,108,101,32,105,115,32, -116,104,101,114,101,115,117,108,116,105,110,103,32,105,110,32,97,60,47,97,62,60, -47,108,105,62,60,47,117,108,62,32,99,108,97,115,115,61,34,102,111,111,116,101, -114,97,110,100,32,101,115,112,101,99,105,97,108,108,121,116,121,112,101,61,34,98 -,117,116,116,111,110,34,32,60,47,115,112,97,110,62,60,47,115,112,97,110,62,119, -104,105,99,104,32,105,110,99,108,117,100,101,100,62,10,60,109,101,116,97,32,110, -97,109,101,61,34,99,111,110,115,105,100,101,114,101,100,32,116,104,101,99,97,114 -,114,105,101,100,32,111,117,116,32,98,121,72,111,119,101,118,101,114,44,32,105, -116,32,105,115,98,101,99,97,109,101,32,112,97,114,116,32,111,102,105,110,32,114, -101,108,97,116,105,111,110,32,116,111,112,111,112,117,108,97,114,32,105,110,32, -116,104,101,116,104,101,32,99,97,112,105,116,97,108,32,111,102,119,97,115,32,111 -,102,102,105,99,105,97,108,108,121,119,104,105,99,104,32,104,97,115,32,98,101, -101,110,116,104,101,32,72,105,115,116,111,114,121,32,111,102,97,108,116,101,114, -110,97,116,105,118,101,32,116,111,100,105,102,102,101,114,101,110,116,32,102,114 -,111,109,116,111,32,115,117,112,112,111,114,116,32,116,104,101,115,117,103,103, -101,115,116,101,100,32,116,104,97,116,105,110,32,116,104,101,32,112,114,111,99, -101,115,115,32,32,60,100,105,118,32,99,108,97,115,115,61,34,116,104,101,32,102, -111,117,110,100,97,116,105,111,110,98,101,99,97,117,115,101,32,111,102,32,104, -105,115,99,111,110,99,101,114,110,101,100,32,119,105,116,104,116,104,101,32,117, -110,105,118,101,114,115,105,116,121,111,112,112,111,115,101,100,32,116,111,32, -116,104,101,116,104,101,32,99,111,110,116,101,120,116,32,111,102,60,115,112,97, -110,32,99,108,97,115,115,61,34,112,116,101,120,116,34,32,110,97,109,101,61,34, -113,34,9,9,60,100,105,118,32,99,108,97,115,115,61,34,116,104,101,32,115,99,105, -101,110,116,105,102,105,99,114,101,112,114,101,115,101,110,116,101,100,32,98,121 -,109,97,116,104,101,109,97,116,105,99,105,97,110,115,101,108,101,99,116,101,100, -32,98,121,32,116,104,101,116,104,97,116,32,104,97,118,101,32,98,101,101,110,62, -60,100,105,118,32,99,108,97,115,115,61,34,99,100,105,118,32,105,100,61,34,104, -101,97,100,101,114,105,110,32,112,97,114,116,105,99,117,108,97,114,44,99,111,110 -,118,101,114,116,101,100,32,105,110,116,111,41,59,10,60,47,115,99,114,105,112, -116,62,10,60,112,104,105,108,111,115,111,112,104,105,99,97,108,32,115,114,112, -115,107,111,104,114,118,97,116,115,107,105,116,105,225,186,191,110,103,32,86,105 -,225,187,135,116,208,160,209,131,209,129,209,129,208,186,208,184,208,185,209,128 -,209,131,209,129,209,129,208,186,208,184,208,185,105,110,118,101,115,116,105,103 -,97,99,105,195,179,110,112,97,114,116,105,99,105,112,97,99,105,195,179,110,208, -186,208,190,209,130,208,190,209,128,209,139,208,181,208,190,208,177,208,187,208, -176,209,129,209,130,208,184,208,186,208,190,209,130,208,190,209,128,209,139,208, -185,209,135,208,181,208,187,208,190,208,178,208,181,208,186,209,129,208,184,209, -129,209,130,208,181,208,188,209,139,208,157,208,190,208,178,208,190,209,129,209, -130,208,184,208,186,208,190,209,130,208,190,209,128,209,139,209,133,208,190,208, -177,208,187,208,176,209,129,209,130,209,140,208,178,209,128,208,181,208,188,208, -181,208,189,208,184,208,186,208,190,209,130,208,190,209,128,208,176,209,143,209, -129,208,181,208,179,208,190,208,180,208,189,209,143,209,129,208,186,208,176,209, -135,208,176,209,130,209,140,208,189,208,190,208,178,208,190,209,129,209,130,208, -184,208,163,208,186,209,128,208,176,208,184,208,189,209,139,208,178,208,190,208, -191,209,128,208,190,209,129,209,139,208,186,208,190,209,130,208,190,209,128,208, -190,208,185,209,129,208,180,208,181,208,187,208,176,209,130,209,140,208,191,208, -190,208,188,208,190,209,137,209,140,209,142,209,129,209,128,208,181,208,180,209, -129,209,130,208,178,208,190,208,177,209,128,208,176,208,183,208,190,208,188,209, -129,209,130,208,190,209,128,208,190,208,189,209,139,209,131,209,135,208,176,209, -129,209,130,208,184,208,181,209,130,208,181,209,135,208,181,208,189,208,184,208, -181,208,147,208,187,208,176,208,178,208,189,208,176,209,143,208,184,209,129,209, -130,208,190,209,128,208,184,208,184,209,129,208,184,209,129,209,130,208,181,208, -188,208,176,209,128,208,181,209,136,208,181,208,189,208,184,209,143,208,161,208, -186,208,176,209,135,208,176,209,130,209,140,208,191,208,190,209,141,209,130,208, -190,208,188,209,131,209,129,208,187,208,181,208,180,209,131,208,181,209,130,209, -129,208,186,208,176,208,183,208,176,209,130,209,140,209,130,208,190,208,178,208, -176,209,128,208,190,208,178,208,186,208,190,208,189,208,181,209,135,208,189,208, -190,209,128,208,181,209,136,208,181,208,189,208,184,208,181,208,186,208,190,209, -130,208,190,209,128,208,190,208,181,208,190,209,128,208,179,208,176,208,189,208, -190,208,178,208,186,208,190,209,130,208,190,209,128,208,190,208,188,208,160,208, -181,208,186,208,187,208,176,208,188,208,176,216,167,217,132,217,133,217,134,216, -170,216,175,217,137,217,133,217,134,216,170,216,175,217,138,216,167,216,170,216, -167,217,132,217,133,217,136,216,182,217,136,216,185,216,167,217,132,216,168,216, -177,216,167,217,133,216,172,216,167,217,132,217,133,217,136,216,167,217,130,216, -185,216,167,217,132,216,177,216,179,216,167,216,166,217,132,217,133,216,180,216, -167,216,177,217,131,216,167,216,170,216,167,217,132,216,163,216,185,216,182,216, -167,216,161,216,167,217,132,216,177,217,138,216,167,216,182,216,169,216,167,217, -132,216,170,216,181,217,133,217,138,217,133,216,167,217,132,216,167,216,185,216, -182,216,167,216,161,216,167,217,132,217,134,216,170,216,167,216,166,216,172,216, -167,217,132,216,163,217,132,216,185,216,167,216,168,216,167,217,132,216,170,216, -179,216,172,217,138,217,132,216,167,217,132,216,163,217,130,216,179,216,167,217, -133,216,167,217,132,216,182,216,186,216,183,216,167,216,170,216,167,217,132,217, -129,217,138,216,175,217,138,217,136,216,167,217,132,216,170,216,177,216,173,217, -138,216,168,216,167,217,132,216,172,216,175,217,138,216,175,216,169,216,167,217, -132,216,170,216,185,217,132,217,138,217,133,216,167,217,132,216,163,216,174,216, -168,216,167,216,177,216,167,217,132,216,167,217,129,217,132,216,167,217,133,216, -167,217,132,216,163,217,129,217,132,216,167,217,133,216,167,217,132,216,170,216, -167,216,177,217,138,216,174,216,167,217,132,216,170,217,130,217,134,217,138,216, -169,216,167,217,132,216,167,217,132,216,185,216,167,216,168,216,167,217,132,216, -174,217,136,216,167,216,183,216,177,216,167,217,132,217,133,216,172,216,170,217, -133,216,185,216,167,217,132,216,175,217,138,217,131,217,136,216,177,216,167,217, -132,216,179,217,138,216,167,216,173,216,169,216,185,216,168,216,175,216,167,217, -132,217,132,217,135,216,167,217,132,216,170,216,177,216,168,217,138,216,169,216, -167,217,132,216,177,217,136,216,167,216,168,216,183,216,167,217,132,216,163,216, -175,216,168,217,138,216,169,216,167,217,132,216,167,216,174,216,168,216,167,216, -177,216,167,217,132,217,133,216,170,216,173,216,175,216,169,216,167,217,132,216, -167,216,186,216,167,217,134,217,138,99,117,114,115,111,114,58,112,111,105,110, -116,101,114,59,60,47,116,105,116,108,101,62,10,60,109,101,116,97,32,34,32,104, -114,101,102,61,34,104,116,116,112,58,47,47,34,62,60,115,112,97,110,32,99,108,97, -115,115,61,34,109,101,109,98,101,114,115,32,111,102,32,116,104,101,32,119,105, -110,100,111,119,46,108,111,99,97,116,105,111,110,118,101,114,116,105,99,97,108, -45,97,108,105,103,110,58,47,97,62,32,124,32,60,97,32,104,114,101,102,61,34,60,33 -,100,111,99,116,121,112,101,32,104,116,109,108,62,109,101,100,105,97,61,34,115, -99,114,101,101,110,34,32,60,111,112,116,105,111,110,32,118,97,108,117,101,61,34, -102,97,118,105,99,111,110,46,105,99,111,34,32,47,62,10,9,9,60,100,105,118,32,99, -108,97,115,115,61,34,99,104,97,114,97,99,116,101,114,105,115,116,105,99,115,34, -32,109,101,116,104,111,100,61,34,103,101,116,34,32,47,98,111,100,121,62,10,60,47 -,104,116,109,108,62,10,115,104,111,114,116,99,117,116,32,105,99,111,110,34,32, -100,111,99,117,109,101,110,116,46,119,114,105,116,101,40,112,97,100,100,105,110, -103,45,98,111,116,116,111,109,58,114,101,112,114,101,115,101,110,116,97,116,105, -118,101,115,115,117,98,109,105,116,34,32,118,97,108,117,101,61,34,97,108,105,103 -,110,61,34,99,101,110,116,101,114,34,32,116,104,114,111,117,103,104,111,117,116, -32,116,104,101,32,115,99,105,101,110,99,101,32,102,105,99,116,105,111,110,10,32, -32,60,100,105,118,32,99,108,97,115,115,61,34,115,117,98,109,105,116,34,32,99,108 -,97,115,115,61,34,111,110,101,32,111,102,32,116,104,101,32,109,111,115,116,32, -118,97,108,105,103,110,61,34,116,111,112,34,62,60,119,97,115,32,101,115,116,97, -98,108,105,115,104,101,100,41,59,13,10,60,47,115,99,114,105,112,116,62,13,10,114 -,101,116,117,114,110,32,102,97,108,115,101,59,34,62,41,46,115,116,121,108,101,46 -,100,105,115,112,108,97,121,98,101,99,97,117,115,101,32,111,102,32,116,104,101, -32,100,111,99,117,109,101,110,116,46,99,111,111,107,105,101,60,102,111,114,109, -32,97,99,116,105,111,110,61,34,47,125,98,111,100,121,123,109,97,114,103,105,110, -58,48,59,69,110,99,121,99,108,111,112,101,100,105,97,32,111,102,118,101,114,115, -105,111,110,32,111,102,32,116,104,101,32,46,99,114,101,97,116,101,69,108,101,109 -,101,110,116,40,110,97,109,101,34,32,99,111,110,116,101,110,116,61,34,60,47,100, -105,118,62,10,60,47,100,105,118,62,10,10,97,100,109,105,110,105,115,116,114,97, -116,105,118,101,32,60,47,98,111,100,121,62,10,60,47,104,116,109,108,62,104,105, -115,116,111,114,121,32,111,102,32,116,104,101,32,34,62,60,105,110,112,117,116,32 -,116,121,112,101,61,34,112,111,114,116,105,111,110,32,111,102,32,116,104,101,32, -97,115,32,112,97,114,116,32,111,102,32,116,104,101,32,38,110,98,115,112,59,60,97 -,32,104,114,101,102,61,34,111,116,104,101,114,32,99,111,117,110,116,114,105,101, -115,34,62,10,60,100,105,118,32,99,108,97,115,115,61,34,60,47,115,112,97,110,62, -60,47,115,112,97,110,62,60,73,110,32,111,116,104,101,114,32,119,111,114,100,115, -44,100,105,115,112,108,97,121,58,32,98,108,111,99,107,59,99,111,110,116,114,111, -108,32,111,102,32,116,104,101,32,105,110,116,114,111,100,117,99,116,105,111,110, -32,111,102,47,62,10,60,109,101,116,97,32,110,97,109,101,61,34,97,115,32,119,101, -108,108,32,97,115,32,116,104,101,32,105,110,32,114,101,99,101,110,116,32,121,101 -,97,114,115,13,10,9,60,100,105,118,32,99,108,97,115,115,61,34,60,47,100,105,118, -62,10,9,60,47,100,105,118,62,10,105,110,115,112,105,114,101,100,32,98,121,32,116 -,104,101,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,99,111,109,112, -97,116,105,98,108,101,32,119,105,116,104,98,101,99,97,109,101,32,107,110,111,119 -,110,32,97,115,32,115,116,121,108,101,61,34,109,97,114,103,105,110,58,46,106,115 -,34,62,60,47,115,99,114,105,112,116,62,60,32,73,110,116,101,114,110,97,116,105, -111,110,97,108,32,116,104,101,114,101,32,104,97,118,101,32,98,101,101,110,71,101 -,114,109,97,110,32,108,97,110,103,117,97,103,101,32,115,116,121,108,101,61,34,99 -,111,108,111,114,58,35,67,111,109,109,117,110,105,115,116,32,80,97,114,116,121, -99,111,110,115,105,115,116,101,110,116,32,119,105,116,104,98,111,114,100,101,114 -,61,34,48,34,32,99,101,108,108,32,109,97,114,103,105,110,104,101,105,103,104,116 -,61,34,116,104,101,32,109,97,106,111,114,105,116,121,32,111,102,34,32,97,108,105 -,103,110,61,34,99,101,110,116,101,114,114,101,108,97,116,101,100,32,116,111,32, -116,104,101,32,109,97,110,121,32,100,105,102,102,101,114,101,110,116,32,79,114, -116,104,111,100,111,120,32,67,104,117,114,99,104,115,105,109,105,108,97,114,32, -116,111,32,116,104,101,32,47,62,10,60,108,105,110,107,32,114,101,108,61,34,115, -119,97,115,32,111,110,101,32,111,102,32,116,104,101,32,117,110,116,105,108,32, -104,105,115,32,100,101,97,116,104,125,41,40,41,59,10,60,47,115,99,114,105,112, -116,62,111,116,104,101,114,32,108,97,110,103,117,97,103,101,115,99,111,109,112, -97,114,101,100,32,116,111,32,116,104,101,112,111,114,116,105,111,110,115,32,111, -102,32,116,104,101,116,104,101,32,78,101,116,104,101,114,108,97,110,100,115,116, -104,101,32,109,111,115,116,32,99,111,109,109,111,110,98,97,99,107,103,114,111, -117,110,100,58,117,114,108,40,97,114,103,117,101,100,32,116,104,97,116,32,116, -104,101,115,99,114,111,108,108,105,110,103,61,34,110,111,34,32,105,110,99,108, -117,100,101,100,32,105,110,32,116,104,101,78,111,114,116,104,32,65,109,101,114, -105,99,97,110,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,105,110 -,116,101,114,112,114,101,116,97,116,105,111,110,115,116,104,101,32,116,114,97, -100,105,116,105,111,110,97,108,100,101,118,101,108,111,112,109,101,110,116,32, -111,102,32,102,114,101,113,117,101,110,116,108,121,32,117,115,101,100,97,32,99, -111,108,108,101,99,116,105,111,110,32,111,102,118,101,114,121,32,115,105,109,105 -,108,97,114,32,116,111,115,117,114,114,111,117,110,100,105,110,103,32,116,104, -101,101,120,97,109,112,108,101,32,111,102,32,116,104,105,115,97,108,105,103,110, -61,34,99,101,110,116,101,114,34,62,119,111,117,108,100,32,104,97,118,101,32,98, -101,101,110,105,109,97,103,101,95,99,97,112,116,105,111,110,32,61,97,116,116,97, -99,104,101,100,32,116,111,32,116,104,101,115,117,103,103,101,115,116,105,110,103 -,32,116,104,97,116,105,110,32,116,104,101,32,102,111,114,109,32,111,102,32,105, -110,118,111,108,118,101,100,32,105,110,32,116,104,101,105,115,32,100,101,114,105 -,118,101,100,32,102,114,111,109,110,97,109,101,100,32,97,102,116,101,114,32,116, -104,101,73,110,116,114,111,100,117,99,116,105,111,110,32,116,111,114,101,115,116 -,114,105,99,116,105,111,110,115,32,111,110,32,115,116,121,108,101,61,34,119,105, -100,116,104,58,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,116,104, -101,32,99,114,101,97,116,105,111,110,32,111,102,109,111,115,116,32,105,109,112, -111,114,116,97,110,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,110, -100,114,101,115,117,108,116,101,100,32,105,110,32,116,104,101,99,111,108,108,97, -112,115,101,32,111,102,32,116,104,101,84,104,105,115,32,109,101,97,110,115,32, -116,104,97,116,101,108,101,109,101,110,116,115,32,111,102,32,116,104,101,119,97, -115,32,114,101,112,108,97,99,101,100,32,98,121,97,110,97,108,121,115,105,115,32, -111,102,32,116,104,101,105,110,115,112,105,114,97,116,105,111,110,32,102,111,114 -,114,101,103,97,114,100,101,100,32,97,115,32,116,104,101,109,111,115,116,32,115, -117,99,99,101,115,115,102,117,108,107,110,111,119,110,32,97,115,32,38,113,117, -111,116,59,97,32,99,111,109,112,114,101,104,101,110,115,105,118,101,72,105,115, -116,111,114,121,32,111,102,32,116,104,101,32,119,101,114,101,32,99,111,110,115, -105,100,101,114,101,100,114,101,116,117,114,110,101,100,32,116,111,32,116,104, -101,97,114,101,32,114,101,102,101,114,114,101,100,32,116,111,85,110,115,111,117, -114,99,101,100,32,105,109,97,103,101,62,10,9,60,100,105,118,32,99,108,97,115,115 -,61,34,99,111,110,115,105,115,116,115,32,111,102,32,116,104,101,115,116,111,112, -80,114,111,112,97,103,97,116,105,111,110,105,110,116,101,114,101,115,116,32,105, -110,32,116,104,101,97,118,97,105,108,97,98,105,108,105,116,121,32,111,102,97,112 -,112,101,97,114,115,32,116,111,32,104,97,118,101,101,108,101,99,116,114,111,109, -97,103,110,101,116,105,99,101,110,97,98,108,101,83,101,114,118,105,99,101,115,40 -,102,117,110,99,116,105,111,110,32,111,102,32,116,104,101,73,116,32,105,115,32, -105,109,112,111,114,116,97,110,116,60,47,115,99,114,105,112,116,62,60,47,100,105 -,118,62,102,117,110,99,116,105,111,110,40,41,123,118,97,114,32,114,101,108,97, -116,105,118,101,32,116,111,32,116,104,101,97,115,32,97,32,114,101,115,117,108, -116,32,111,102,32,116,104,101,32,112,111,115,105,116,105,111,110,32,111,102,70, -111,114,32,101,120,97,109,112,108,101,44,32,105,110,32,109,101,116,104,111,100, -61,34,112,111,115,116,34,32,119,97,115,32,102,111,108,108,111,119,101,100,32,98, -121,38,97,109,112,59,109,100,97,115,104,59,32,116,104,101,116,104,101,32,97,112, -112,108,105,99,97,116,105,111,110,106,115,34,62,60,47,115,99,114,105,112,116,62, -13,10,117,108,62,60,47,100,105,118,62,60,47,100,105,118,62,97,102,116,101,114,32 -,116,104,101,32,100,101,97,116,104,119,105,116,104,32,114,101,115,112,101,99,116 -,32,116,111,115,116,121,108,101,61,34,112,97,100,100,105,110,103,58,105,115,32, -112,97,114,116,105,99,117,108,97,114,108,121,100,105,115,112,108,97,121,58,105, -110,108,105,110,101,59,32,116,121,112,101,61,34,115,117,98,109,105,116,34,32,105 -,115,32,100,105,118,105,100,101,100,32,105,110,116,111,228,184,173,230,150,135, -32,40,231,174,128,228,189,147,41,114,101,115,112,111,110,115,97,98,105,108,105, -100,97,100,97,100,109,105,110,105,115,116,114,97,99,105,195,179,110,105,110,116, -101,114,110,97,99,105,111,110,97,108,101,115,99,111,114,114,101,115,112,111,110, -100,105,101,110,116,101,224,164,137,224,164,170,224,164,175,224,165,139,224,164, -151,224,164,170,224,165,130,224,164,176,224,165,141,224,164,181,224,164,185,224, -164,174,224,164,190,224,164,176,224,165,135,224,164,178,224,165,139,224,164,151, -224,165,139,224,164,130,224,164,154,224,165,129,224,164,168,224,164,190,224,164, -181,224,164,178,224,165,135,224,164,149,224,164,191,224,164,168,224,164,184,224, -164,176,224,164,149,224,164,190,224,164,176,224,164,170,224,165,129,224,164,178, -224,164,191,224,164,184,224,164,150,224,165,139,224,164,156,224,165,135,224,164, -130,224,164,154,224,164,190,224,164,185,224,164,191,224,164,143,224,164,173,224, -165,135,224,164,156,224,165,135,224,164,130,224,164,182,224,164,190,224,164,174, -224,164,191,224,164,178,224,164,185,224,164,174,224,164,190,224,164,176,224,165, -128,224,164,156,224,164,190,224,164,151,224,164,176,224,164,163,224,164,172,224, -164,168,224,164,190,224,164,168,224,165,135,224,164,149,224,165,129,224,164,174, -224,164,190,224,164,176,224,164,172,224,165,141,224,164,178,224,165,137,224,164, -151,224,164,174,224,164,190,224,164,178,224,164,191,224,164,149,224,164,174,224, -164,185,224,164,191,224,164,178,224,164,190,224,164,170,224,165,131,224,164,183, -224,165,141,224,164,160,224,164,172,224,164,162,224,164,188,224,164,164,224,165, -135,224,164,173,224,164,190,224,164,156,224,164,170,224,164,190,224,164,149,224, -165,141,224,164,178,224,164,191,224,164,149,224,164,159,224,165,141,224,164,176, -224,165,135,224,164,168,224,164,150,224,164,191,224,164,178,224,164,190,224,164, -171,224,164,166,224,165,140,224,164,176,224,164,190,224,164,168,224,164,174,224, -164,190,224,164,174,224,164,178,224,165,135,224,164,174,224,164,164,224,164,166, -224,164,190,224,164,168,224,164,172,224,164,190,224,164,156,224,164,190,224,164, -176,224,164,181,224,164,191,224,164,149,224,164,190,224,164,184,224,164,149,224, -165,141,224,164,175,224,165,139,224,164,130,224,164,154,224,164,190,224,164,185, -224,164,164,224,165,135,224,164,170,224,164,185,224,165,129,224,164,129,224,164, -154,224,164,172,224,164,164,224,164,190,224,164,175,224,164,190,224,164,184,224, -164,130,224,164,181,224,164,190,224,164,166,224,164,166,224,165,135,224,164,150, -224,164,168,224,165,135,224,164,170,224,164,191,224,164,155,224,164,178,224,165, -135,224,164,181,224,164,191,224,164,182,224,165,135,224,164,183,224,164,176,224, -164,190,224,164,156,224,165,141,224,164,175,224,164,137,224,164,164,224,165,141, -224,164,164,224,164,176,224,164,174,224,165,129,224,164,130,224,164,172,224,164, -136,224,164,166,224,165,139,224,164,168,224,165,139,224,164,130,224,164,137,224, -164,170,224,164,149,224,164,176,224,164,163,224,164,170,224,164,162,224,164,188, -224,165,135,224,164,130,224,164,184,224,165,141,224,164,165,224,164,191,224,164, -164,224,164,171,224,164,191,224,164,178,224,165,141,224,164,174,224,164,174,224, -165,129,224,164,150,224,165,141,224,164,175,224,164,133,224,164,154,224,165,141, -224,164,155,224,164,190,224,164,155,224,165,130,224,164,159,224,164,164,224,165, -128,224,164,184,224,164,130,224,164,151,224,165,128,224,164,164,224,164,156,224, -164,190,224,164,143,224,164,151,224,164,190,224,164,181,224,164,191,224,164,173, -224,164,190,224,164,151,224,164,152,224,164,163,224,165,141,224,164,159,224,165, -135,224,164,166,224,165,130,224,164,184,224,164,176,224,165,135,224,164,166,224, -164,191,224,164,168,224,165,139,224,164,130,224,164,185,224,164,164,224,165,141, -224,164,175,224,164,190,224,164,184,224,165,135,224,164,149,224,165,141,224,164, -184,224,164,151,224,164,190,224,164,130,224,164,167,224,165,128,224,164,181,224, -164,191,224,164,182,224,165,141,224,164,181,224,164,176,224,164,190,224,164,164, -224,165,135,224,164,130,224,164,166,224,165,136,224,164,159,224,165,141,224,164, -184,224,164,168,224,164,149,224,165,141,224,164,182,224,164,190,224,164,184,224, -164,190,224,164,174,224,164,168,224,165,135,224,164,133,224,164,166,224,164,190, -224,164,178,224,164,164,224,164,172,224,164,191,224,164,156,224,164,178,224,165, -128,224,164,170,224,165,129,224,164,176,224,165,130,224,164,183,224,164,185,224, -164,191,224,164,130,224,164,166,224,165,128,224,164,174,224,164,191,224,164,164, -224,165,141,224,164,176,224,164,149,224,164,181,224,164,191,224,164,164,224,164, -190,224,164,176,224,165,129,224,164,170,224,164,175,224,165,135,224,164,184,224, -165,141,224,164,165,224,164,190,224,164,168,224,164,149,224,164,176,224,165,139, -224,164,161,224,164,188,224,164,174,224,165,129,224,164,149,224,165,141,224,164, -164,224,164,175,224,165,139,224,164,156,224,164,168,224,164,190,224,164,149,224, -165,131,224,164,170,224,164,175,224,164,190,224,164,170,224,165,139,224,164,184, -224,165,141,224,164,159,224,164,152,224,164,176,224,165,135,224,164,178,224,165, -130,224,164,149,224,164,190,224,164,176,224,165,141,224,164,175,224,164,181,224, -164,191,224,164,154,224,164,190,224,164,176,224,164,184,224,165,130,224,164,154, -224,164,168,224,164,190,224,164,174,224,165,130,224,164,178,224,165,141,224,164, -175,224,164,166,224,165,135,224,164,150,224,165,135,224,164,130,224,164,185,224, -164,174,224,165,135,224,164,182,224,164,190,224,164,184,224,165,141,224,164,149, -224,165,130,224,164,178,224,164,174,224,165,136,224,164,130,224,164,168,224,165, -135,224,164,164,224,165,136,224,164,175,224,164,190,224,164,176,224,164,156,224, -164,191,224,164,184,224,164,149,224,165,135,114,115,115,43,120,109,108,34,32,116 -,105,116,108,101,61,34,45,116,121,112,101,34,32,99,111,110,116,101,110,116,61,34 -,116,105,116,108,101,34,32,99,111,110,116,101,110,116,61,34,97,116,32,116,104, -101,32,115,97,109,101,32,116,105,109,101,46,106,115,34,62,60,47,115,99,114,105, -112,116,62,10,60,34,32,109,101,116,104,111,100,61,34,112,111,115,116,34,32,60,47 -,115,112,97,110,62,60,47,97,62,60,47,108,105,62,118,101,114,116,105,99,97,108,45 -,97,108,105,103,110,58,116,47,106,113,117,101,114,121,46,109,105,110,46,106,115, -34,62,46,99,108,105,99,107,40,102,117,110,99,116,105,111,110,40,32,115,116,121, -108,101,61,34,112,97,100,100,105,110,103,45,125,41,40,41,59,10,60,47,115,99,114, -105,112,116,62,10,60,47,115,112,97,110,62,60,97,32,104,114,101,102,61,34,60,97, -32,104,114,101,102,61,34,104,116,116,112,58,47,47,41,59,32,114,101,116,117,114, -110,32,102,97,108,115,101,59,116,101,120,116,45,100,101,99,111,114,97,116,105, -111,110,58,32,115,99,114,111,108,108,105,110,103,61,34,110,111,34,32,98,111,114, -100,101,114,45,99,111,108,108,97,112,115,101,58,97,115,115,111,99,105,97,116,101 -,100,32,119,105,116,104,32,66,97,104,97,115,97,32,73,110,100,111,110,101,115,105 -,97,69,110,103,108,105,115,104,32,108,97,110,103,117,97,103,101,60,116,101,120, -116,32,120,109,108,58,115,112,97,99,101,61,46,103,105,102,34,32,98,111,114,100, -101,114,61,34,48,34,60,47,98,111,100,121,62,10,60,47,104,116,109,108,62,10,111, -118,101,114,102,108,111,119,58,104,105,100,100,101,110,59,105,109,103,32,115,114 -,99,61,34,104,116,116,112,58,47,47,97,100,100,69,118,101,110,116,76,105,115,116, -101,110,101,114,114,101,115,112,111,110,115,105,98,108,101,32,102,111,114,32,115 -,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10,47,102,97,118,105,99,111, -110,46,105,99,111,34,32,47,62,111,112,101,114,97,116,105,110,103,32,115,121,115, -116,101,109,34,32,115,116,121,108,101,61,34,119,105,100,116,104,58,49,116,97,114 -,103,101,116,61,34,95,98,108,97,110,107,34,62,83,116,97,116,101,32,85,110,105, -118,101,114,115,105,116,121,116,101,120,116,45,97,108,105,103,110,58,108,101,102 -,116,59,10,100,111,99,117,109,101,110,116,46,119,114,105,116,101,40,44,32,105, -110,99,108,117,100,105,110,103,32,116,104,101,32,97,114,111,117,110,100,32,116, -104,101,32,119,111,114,108,100,41,59,13,10,60,47,115,99,114,105,112,116,62,13,10 -,60,34,32,115,116,121,108,101,61,34,104,101,105,103,104,116,58,59,111,118,101, -114,102,108,111,119,58,104,105,100,100,101,110,109,111,114,101,32,105,110,102, -111,114,109,97,116,105,111,110,97,110,32,105,110,116,101,114,110,97,116,105,111, -110,97,108,97,32,109,101,109,98,101,114,32,111,102,32,116,104,101,32,111,110,101 -,32,111,102,32,116,104,101,32,102,105,114,115,116,99,97,110,32,98,101,32,102,111 -,117,110,100,32,105,110,32,60,47,100,105,118,62,10,9,9,60,47,100,105,118,62,10, -100,105,115,112,108,97,121,58,32,110,111,110,101,59,34,62,34,32,47,62,10,60,108, -105,110,107,32,114,101,108,61,34,10,32,32,40,102,117,110,99,116,105,111,110,40, -41,32,123,116,104,101,32,49,53,116,104,32,99,101,110,116,117,114,121,46,112,114, -101,118,101,110,116,68,101,102,97,117,108,116,40,108,97,114,103,101,32,110,117, -109,98,101,114,32,111,102,32,66,121,122,97,110,116,105,110,101,32,69,109,112,105 -,114,101,46,106,112,103,124,116,104,117,109,98,124,108,101,102,116,124,118,97, -115,116,32,109,97,106,111,114,105,116,121,32,111,102,109,97,106,111,114,105,116, -121,32,111,102,32,116,104,101,32,32,97,108,105,103,110,61,34,99,101,110,116,101, -114,34,62,85,110,105,118,101,114,115,105,116,121,32,80,114,101,115,115,100,111, -109,105,110,97,116,101,100,32,98,121,32,116,104,101,83,101,99,111,110,100,32,87, -111,114,108,100,32,87,97,114,100,105,115,116,114,105,98,117,116,105,111,110,32, -111,102,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,116,104, -101,32,114,101,115,116,32,111,102,32,116,104,101,32,99,104,97,114,97,99,116,101, -114,105,122,101,100,32,98,121,32,114,101,108,61,34,110,111,102,111,108,108,111, -119,34,62,100,101,114,105,118,101,115,32,102,114,111,109,32,116,104,101,114,97, -116,104,101,114,32,116,104,97,110,32,116,104,101,32,97,32,99,111,109,98,105,110, -97,116,105,111,110,32,111,102,115,116,121,108,101,61,34,119,105,100,116,104,58, -49,48,48,69,110,103,108,105,115,104,45,115,112,101,97,107,105,110,103,99,111,109 -,112,117,116,101,114,32,115,99,105,101,110,99,101,98,111,114,100,101,114,61,34, -48,34,32,97,108,116,61,34,116,104,101,32,101,120,105,115,116,101,110,99,101,32, -111,102,68,101,109,111,99,114,97,116,105,99,32,80,97,114,116,121,34,32,115,116, -121,108,101,61,34,109,97,114,103,105,110,45,70,111,114,32,116,104,105,115,32,114 -,101,97,115,111,110,44,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10,9,115 -,66,121,84,97,103,78,97,109,101,40,115,41,91,48,93,106,115,34,62,60,47,115,99, -114,105,112,116,62,13,10,60,46,106,115,34,62,60,47,115,99,114,105,112,116,62,13, -10,108,105,110,107,32,114,101,108,61,34,105,99,111,110,34,32,39,32,97,108,116,61 -,39,39,32,99,108,97,115,115,61,39,102,111,114,109,97,116,105,111,110,32,111,102, -32,116,104,101,118,101,114,115,105,111,110,115,32,111,102,32,116,104,101,32,60, -47,97,62,60,47,100,105,118,62,60,47,100,105,118,62,47,112,97,103,101,62,10,32,32 -,60,112,97,103,101,62,10,60,100,105,118,32,99,108,97,115,115,61,34,99,111,110, -116,98,101,99,97,109,101,32,116,104,101,32,102,105,114,115,116,98,97,104,97,115, -97,32,73,110,100,111,110,101,115,105,97,101,110,103,108,105,115,104,32,40,115, -105,109,112,108,101,41,206,149,206,187,206,187,206,183,206,189,206,185,206,186, -206,172,209,133,209,128,208,178,208,176,209,130,209,129,208,186,208,184,208,186, -208,190,208,188,208,191,208,176,208,189,208,184,208,184,209,143,208,178,208,187, -209,143,208,181,209,130,209,129,209,143,208,148,208,190,208,177,208,176,208,178, -208,184,209,130,209,140,209,135,208,181,208,187,208,190,208,178,208,181,208,186, -208,176,209,128,208,176,208,183,208,178,208,184,209,130,208,184,209,143,208,152, -208,189,209,130,208,181,209,128,208,189,208,181,209,130,208,158,209,130,208,178, -208,181,209,130,208,184,209,130,209,140,208,189,208,176,208,191,209,128,208,184, -208,188,208,181,209,128,208,184,208,189,209,130,208,181,209,128,208,189,208,181, -209,130,208,186,208,190,209,130,208,190,209,128,208,190,208,179,208,190,209,129, -209,130,209,128,208,176,208,189,208,184,209,134,209,139,208,186,208,176,209,135, -208,181,209,129,209,130,208,178,208,181,209,131,209,129,208,187,208,190,208,178, -208,184,209,143,209,133,208,191,209,128,208,190,208,177,208,187,208,181,208,188, -209,139,208,191,208,190,208,187,209,131,209,135,208,184,209,130,209,140,209,143, -208,178,208,187,209,143,209,142,209,130,209,129,209,143,208,189,208,176,208,184, -208,177,208,190,208,187,208,181,208,181,208,186,208,190,208,188,208,191,208,176, -208,189,208,184,209,143,208,178,208,189,208,184,208,188,208,176,208,189,208,184, -208,181,209,129,209,128,208,181,208,180,209,129,209,130,208,178,208,176,216,167, -217,132,217,133,217,136,216,167,216,182,217,138,216,185,216,167,217,132,216,177, -216,166,217,138,216,179,217,138,216,169,216,167,217,132,216,167,217,134,216,170, -217,130,216,167,217,132,217,133,216,180,216,167,216,177,217,131,216,167,216,170, -217,131,216,167,217,132,216,179,217,138,216,167,216,177,216,167,216,170,216,167, -217,132,217,133,217,131,216,170,217,136,216,168,216,169,216,167,217,132,216,179, -216,185,217,136,216,175,217,138,216,169,216,167,216,173,216,181,216,167,216,166, -217,138,216,167,216,170,216,167,217,132,216,185,216,167,217,132,217,133,217,138, -216,169,216,167,217,132,216,181,217,136,216,170,217,138,216,167,216,170,216,167, -217,132,216,167,217,134,216,170,216,177,217,134,216,170,216,167,217,132,216,170, -216,181,216,167,217,133,217,138,217,133,216,167,217,132,216,165,216,179,217,132, -216,167,217,133,217,138,216,167,217,132,217,133,216,180,216,167,216,177,217,131, -216,169,216,167,217,132,217,133,216,177,216,166,217,138,216,167,216,170,114,111, -98,111,116,115,34,32,99,111,110,116,101,110,116,61,34,60,100,105,118,32,105,100, -61,34,102,111,111,116,101,114,34,62,116,104,101,32,85,110,105,116,101,100,32,83, -116,97,116,101,115,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47, -46,106,112,103,124,114,105,103,104,116,124,116,104,117,109,98,124,46,106,115,34, -62,60,47,115,99,114,105,112,116,62,13,10,60,108,111,99,97,116,105,111,110,46,112 -,114,111,116,111,99,111,108,102,114,97,109,101,98,111,114,100,101,114,61,34,48, -34,32,115,34,32,47,62,10,60,109,101,116,97,32,110,97,109,101,61,34,60,47,97,62, -60,47,100,105,118,62,60,47,100,105,118,62,60,102,111,110,116,45,119,101,105,103, -104,116,58,98,111,108,100,59,38,113,117,111,116,59,32,97,110,100,32,38,113,117, -111,116,59,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,109, -97,114,103,105,110,58,48,59,112,97,100,100,105,110,103,58,34,32,114,101,108,61, -34,110,111,102,111,108,108,111,119,34,32,80,114,101,115,105,100,101,110,116,32, -111,102,32,116,104,101,32,116,119,101,110,116,105,101,116,104,32,99,101,110,116, -117,114,121,101,118,105,115,105,111,110,62,10,32,32,60,47,112,97,103,101,73,110, -116,101,114,110,101,116,32,69,120,112,108,111,114,101,114,97,46,97,115,121,110, -99,32,61,32,116,114,117,101,59,13,10,105,110,102,111,114,109,97,116,105,111,110, -32,97,98,111,117,116,60,100,105,118,32,105,100,61,34,104,101,97,100,101,114,34, -62,34,32,97,99,116,105,111,110,61,34,104,116,116,112,58,47,47,60,97,32,104,114, -101,102,61,34,104,116,116,112,115,58,47,47,60,100,105,118,32,105,100,61,34,99, -111,110,116,101,110,116,34,60,47,100,105,118,62,13,10,60,47,100,105,118,62,13,10 -,60,100,101,114,105,118,101,100,32,102,114,111,109,32,116,104,101,32,60,105,109, -103,32,115,114,99,61,39,104,116,116,112,58,47,47,97,99,99,111,114,100,105,110, -103,32,116,111,32,116,104,101,32,10,60,47,98,111,100,121,62,10,60,47,104,116,109 -,108,62,10,115,116,121,108,101,61,34,102,111,110,116,45,115,105,122,101,58,115, -99,114,105,112,116,32,108,97,110,103,117,97,103,101,61,34,65,114,105,97,108,44, -32,72,101,108,118,101,116,105,99,97,44,60,47,97,62,60,115,112,97,110,32,99,108, -97,115,115,61,34,60,47,115,99,114,105,112,116,62,60,115,99,114,105,112,116,32, -112,111,108,105,116,105,99,97,108,32,112,97,114,116,105,101,115,116,100,62,60,47 -,116,114,62,60,47,116,97,98,108,101,62,60,104,114,101,102,61,34,104,116,116,112, -58,47,47,119,119,119,46,105,110,116,101,114,112,114,101,116,97,116,105,111,110, -32,111,102,114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,32,100, -111,99,117,109,101,110,116,46,119,114,105,116,101,40,39,60,99,104,97,114,115,101 -,116,61,34,117,116,102,45,56,34,62,10,98,101,103,105,110,110,105,110,103,32,111, -102,32,116,104,101,32,114,101,118,101,97,108,101,100,32,116,104,97,116,32,116, -104,101,116,101,108,101,118,105,115,105,111,110,32,115,101,114,105,101,115,34,32 -,114,101,108,61,34,110,111,102,111,108,108,111,119,34,62,32,116,97,114,103,101, -116,61,34,95,98,108,97,110,107,34,62,99,108,97,105,109,105,110,103,32,116,104,97 -,116,32,116,104,101,104,116,116,112,37,51,65,37,50,70,37,50,70,119,119,119,46, -109,97,110,105,102,101,115,116,97,116,105,111,110,115,32,111,102,80,114,105,109, -101,32,77,105,110,105,115,116,101,114,32,111,102,105,110,102,108,117,101,110,99, -101,100,32,98,121,32,116,104,101,99,108,97,115,115,61,34,99,108,101,97,114,102, -105,120,34,62,47,100,105,118,62,13,10,60,47,100,105,118,62,13,10,13,10,116,104, -114,101,101,45,100,105,109,101,110,115,105,111,110,97,108,67,104,117,114,99,104, -32,111,102,32,69,110,103,108,97,110,100,111,102,32,78,111,114,116,104,32,67,97, -114,111,108,105,110,97,115,113,117,97,114,101,32,107,105,108,111,109,101,116,114 -,101,115,46,97,100,100,69,118,101,110,116,76,105,115,116,101,110,101,114,100,105 -,115,116,105,110,99,116,32,102,114,111,109,32,116,104,101,99,111,109,109,111,110 -,108,121,32,107,110,111,119,110,32,97,115,80,104,111,110,101,116,105,99,32,65, -108,112,104,97,98,101,116,100,101,99,108,97,114,101,100,32,116,104,97,116,32,116 -,104,101,99,111,110,116,114,111,108,108,101,100,32,98,121,32,116,104,101,66,101, -110,106,97,109,105,110,32,70,114,97,110,107,108,105,110,114,111,108,101,45,112, -108,97,121,105,110,103,32,103,97,109,101,116,104,101,32,85,110,105,118,101,114, -115,105,116,121,32,111,102,105,110,32,87,101,115,116,101,114,110,32,69,117,114, -111,112,101,112,101,114,115,111,110,97,108,32,99,111,109,112,117,116,101,114,80, -114,111,106,101,99,116,32,71,117,116,101,110,98,101,114,103,114,101,103,97,114, -100,108,101,115,115,32,111,102,32,116,104,101,104,97,115,32,98,101,101,110,32, -112,114,111,112,111,115,101,100,116,111,103,101,116,104,101,114,32,119,105,116, -104,32,116,104,101,62,60,47,108,105,62,60,108,105,32,99,108,97,115,115,61,34,105 -,110,32,115,111,109,101,32,99,111,117,110,116,114,105,101,115,109,105,110,46,106 -,115,34,62,60,47,115,99,114,105,112,116,62,111,102,32,116,104,101,32,112,111,112 -,117,108,97,116,105,111,110,111,102,102,105,99,105,97,108,32,108,97,110,103,117, -97,103,101,60,105,109,103,32,115,114,99,61,34,105,109,97,103,101,115,47,105,100, -101,110,116,105,102,105,101,100,32,98,121,32,116,104,101,110,97,116,117,114,97, -108,32,114,101,115,111,117,114,99,101,115,99,108,97,115,115,105,102,105,99,97, -116,105,111,110,32,111,102,99,97,110,32,98,101,32,99,111,110,115,105,100,101,114 -,101,100,113,117,97,110,116,117,109,32,109,101,99,104,97,110,105,99,115,78,101, -118,101,114,116,104,101,108,101,115,115,44,32,116,104,101,109,105,108,108,105, -111,110,32,121,101,97,114,115,32,97,103,111,60,47,98,111,100,121,62,13,10,60,47, -104,116,109,108,62,13,206,149,206,187,206,187,206,183,206,189,206,185,206,186, -206,172,10,116,97,107,101,32,97,100,118,97,110,116,97,103,101,32,111,102,97,110, -100,44,32,97,99,99,111,114,100,105,110,103,32,116,111,97,116,116,114,105,98,117, -116,101,100,32,116,111,32,116,104,101,77,105,99,114,111,115,111,102,116,32,87, -105,110,100,111,119,115,116,104,101,32,102,105,114,115,116,32,99,101,110,116,117 -,114,121,117,110,100,101,114,32,116,104,101,32,99,111,110,116,114,111,108,100, -105,118,32,99,108,97,115,115,61,34,104,101,97,100,101,114,115,104,111,114,116, -108,121,32,97,102,116,101,114,32,116,104,101,110,111,116,97,98,108,101,32,101, -120,99,101,112,116,105,111,110,116,101,110,115,32,111,102,32,116,104,111,117,115 -,97,110,100,115,115,101,118,101,114,97,108,32,100,105,102,102,101,114,101,110, -116,97,114,111,117,110,100,32,116,104,101,32,119,111,114,108,100,46,114,101,97, -99,104,105,110,103,32,109,105,108,105,116,97,114,121,105,115,111,108,97,116,101, -100,32,102,114,111,109,32,116,104,101,111,112,112,111,115,105,116,105,111,110,32 -,116,111,32,116,104,101,116,104,101,32,79,108,100,32,84,101,115,116,97,109,101, -110,116,65,102,114,105,99,97,110,32,65,109,101,114,105,99,97,110,115,105,110,115 -,101,114,116,101,100,32,105,110,116,111,32,116,104,101,115,101,112,97,114,97,116 -,101,32,102,114,111,109,32,116,104,101,109,101,116,114,111,112,111,108,105,116, -97,110,32,97,114,101,97,109,97,107,101,115,32,105,116,32,112,111,115,115,105,98, -108,101,97,99,107,110,111,119,108,101,100,103,101,100,32,116,104,97,116,97,114, -103,117,97,98,108,121,32,116,104,101,32,109,111,115,116,116,121,112,101,61,34, -116,101,120,116,47,99,115,115,34,62,10,116,104,101,32,73,110,116,101,114,110,97, -116,105,111,110,97,108,65,99,99,111,114,100,105,110,103,32,116,111,32,116,104, -101,32,112,101,61,34,116,101,120,116,47,99,115,115,34,32,47,62,10,99,111,105,110 -,99,105,100,101,32,119,105,116,104,32,116,104,101,116,119,111,45,116,104,105,114 -,100,115,32,111,102,32,116,104,101,68,117,114,105,110,103,32,116,104,105,115,32, -116,105,109,101,44,100,117,114,105,110,103,32,116,104,101,32,112,101,114,105,111 -,100,97,110,110,111,117,110,99,101,100,32,116,104,97,116,32,104,101,116,104,101, -32,105,110,116,101,114,110,97,116,105,111,110,97,108,97,110,100,32,109,111,114, -101,32,114,101,99,101,110,116,108,121,98,101,108,105,101,118,101,100,32,116,104, -97,116,32,116,104,101,99,111,110,115,99,105,111,117,115,110,101,115,115,32,97, -110,100,102,111,114,109,101,114,108,121,32,107,110,111,119,110,32,97,115,115,117 -,114,114,111,117,110,100,101,100,32,98,121,32,116,104,101,102,105,114,115,116,32 -,97,112,112,101,97,114,101,100,32,105,110,111,99,99,97,115,105,111,110,97,108, -108,121,32,117,115,101,100,112,111,115,105,116,105,111,110,58,97,98,115,111,108, -117,116,101,59,34,32,116,97,114,103,101,116,61,34,95,98,108,97,110,107,34,32,112 -,111,115,105,116,105,111,110,58,114,101,108,97,116,105,118,101,59,116,101,120, -116,45,97,108,105,103,110,58,99,101,110,116,101,114,59,106,97,120,47,108,105,98, -115,47,106,113,117,101,114,121,47,49,46,98,97,99,107,103,114,111,117,110,100,45, -99,111,108,111,114,58,35,116,121,112,101,61,34,97,112,112,108,105,99,97,116,105, -111,110,47,97,110,103,117,97,103,101,34,32,99,111,110,116,101,110,116,61,34,60, -109,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,80,114,105,118,97 -,99,121,32,80,111,108,105,99,121,60,47,97,62,101,40,34,37,51,67,115,99,114,105, -112,116,32,115,114,99,61,39,34,32,116,97,114,103,101,116,61,34,95,98,108,97,110, -107,34,62,79,110,32,116,104,101,32,111,116,104,101,114,32,104,97,110,100,44,46, -106,112,103,124,116,104,117,109,98,124,114,105,103,104,116,124,50,60,47,100,105, -118,62,60,100,105,118,32,99,108,97,115,115,61,34,60,100,105,118,32,115,116,121, -108,101,61,34,102,108,111,97,116,58,110,105,110,101,116,101,101,110,116,104,32, -99,101,110,116,117,114,121,60,47,98,111,100,121,62,13,10,60,47,104,116,109,108, -62,13,10,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,115,59,116, -101,120,116,45,97,108,105,103,110,58,99,101,110,116,101,114,102,111,110,116,45, -119,101,105,103,104,116,58,32,98,111,108,100,59,32,65,99,99,111,114,100,105,110, -103,32,116,111,32,116,104,101,32,100,105,102,102,101,114,101,110,99,101,32,98, -101,116,119,101,101,110,34,32,102,114,97,109,101,98,111,114,100,101,114,61,34,48 -,34,32,34,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,108, -105,110,107,32,104,114,101,102,61,34,104,116,116,112,58,47,47,104,116,109,108,52 -,47,108,111,111,115,101,46,100,116,100,34,62,10,100,117,114,105,110,103,32,116, -104,105,115,32,112,101,114,105,111,100,60,47,116,100,62,60,47,116,114,62,60,47, -116,97,98,108,101,62,99,108,111,115,101,108,121,32,114,101,108,97,116,101,100,32 -,116,111,102,111,114,32,116,104,101,32,102,105,114,115,116,32,116,105,109,101,59 -,102,111,110,116,45,119,101,105,103,104,116,58,98,111,108,100,59,105,110,112,117 -,116,32,116,121,112,101,61,34,116,101,120,116,34,32,60,115,112,97,110,32,115,116 -,121,108,101,61,34,102,111,110,116,45,111,110,114,101,97,100,121,115,116,97,116, -101,99,104,97,110,103,101,9,60,100,105,118,32,99,108,97,115,115,61,34,99,108,101 -,97,114,100,111,99,117,109,101,110,116,46,108,111,99,97,116,105,111,110,46,32,70 -,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,97,32,119,105,100, -101,32,118,97,114,105,101,116,121,32,111,102,32,60,33,68,79,67,84,89,80,69,32, -104,116,109,108,62,13,10,60,38,110,98,115,112,59,38,110,98,115,112,59,38,110,98, -115,112,59,34,62,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,115,116 -,121,108,101,61,34,102,108,111,97,116,58,108,101,102,116,59,99,111,110,99,101, -114,110,101,100,32,119,105,116,104,32,116,104,101,61,104,116,116,112,37,51,65,37 -,50,70,37,50,70,119,119,119,46,105,110,32,112,111,112,117,108,97,114,32,99,117, -108,116,117,114,101,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,32,47 -,62,105,116,32,105,115,32,112,111,115,115,105,98,108,101,32,116,111,32,72,97,114 -,118,97,114,100,32,85,110,105,118,101,114,115,105,116,121,116,121,108,101,115, -104,101,101,116,34,32,104,114,101,102,61,34,47,116,104,101,32,109,97,105,110,32, -99,104,97,114,97,99,116,101,114,79,120,102,111,114,100,32,85,110,105,118,101,114 -,115,105,116,121,32,32,110,97,109,101,61,34,107,101,121,119,111,114,100,115,34, -32,99,115,116,121,108,101,61,34,116,101,120,116,45,97,108,105,103,110,58,116,104 -,101,32,85,110,105,116,101,100,32,75,105,110,103,100,111,109,102,101,100,101,114 -,97,108,32,103,111,118,101,114,110,109,101,110,116,60,100,105,118,32,115,116,121 -,108,101,61,34,109,97,114,103,105,110,32,100,101,112,101,110,100,105,110,103,32, -111,110,32,116,104,101,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102, -32,116,104,101,60,100,105,118,32,99,108,97,115,115,61,34,104,101,97,100,101,114, -46,109,105,110,46,106,115,34,62,60,47,115,99,114,105,112,116,62,100,101,115,116, -114,117,99,116,105,111,110,32,111,102,32,116,104,101,115,108,105,103,104,116,108 -,121,32,100,105,102,102,101,114,101,110,116,105,110,32,97,99,99,111,114,100,97, -110,99,101,32,119,105,116,104,116,101,108,101,99,111,109,109,117,110,105,99,97, -116,105,111,110,115,105,110,100,105,99,97,116,101,115,32,116,104,97,116,32,116, -104,101,115,104,111,114,116,108,121,32,116,104,101,114,101,97,102,116,101,114, -101,115,112,101,99,105,97,108,108,121,32,105,110,32,116,104,101,32,69,117,114, -111,112,101,97,110,32,99,111,117,110,116,114,105,101,115,72,111,119,101,118,101, -114,44,32,116,104,101,114,101,32,97,114,101,115,114,99,61,34,104,116,116,112,58, -47,47,115,116,97,116,105,99,115,117,103,103,101,115,116,101,100,32,116,104,97, -116,32,116,104,101,34,32,115,114,99,61,34,104,116,116,112,58,47,47,119,119,119, -46,97,32,108,97,114,103,101,32,110,117,109,98,101,114,32,111,102,32,84,101,108, -101,99,111,109,109,117,110,105,99,97,116,105,111,110,115,34,32,114,101,108,61,34 -,110,111,102,111,108,108,111,119,34,32,116,72,111,108,121,32,82,111,109,97,110, -32,69,109,112,101,114,111,114,97,108,109,111,115,116,32,101,120,99,108,117,115, -105,118,101,108,121,34,32,98,111,114,100,101,114,61,34,48,34,32,97,108,116,61,34 -,83,101,99,114,101,116,97,114,121,32,111,102,32,83,116,97,116,101,99,117,108,109 -,105,110,97,116,105,110,103,32,105,110,32,116,104,101,67,73,65,32,87,111,114,108 -,100,32,70,97,99,116,98,111,111,107,116,104,101,32,109,111,115,116,32,105,109, -112,111,114,116,97,110,116,97,110,110,105,118,101,114,115,97,114,121,32,111,102, -32,116,104,101,115,116,121,108,101,61,34,98,97,99,107,103,114,111,117,110,100,45 -,60,108,105,62,60,101,109,62,60,97,32,104,114,101,102,61,34,47,116,104,101,32,65 -,116,108,97,110,116,105,99,32,79,99,101,97,110,115,116,114,105,99,116,108,121,32 -,115,112,101,97,107,105,110,103,44,115,104,111,114,116,108,121,32,98,101,102,111 -,114,101,32,116,104,101,100,105,102,102,101,114,101,110,116,32,116,121,112,101, -115,32,111,102,116,104,101,32,79,116,116,111,109,97,110,32,69,109,112,105,114, -101,62,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,65,110,32,73, -110,116,114,111,100,117,99,116,105,111,110,32,116,111,99,111,110,115,101,113,117 -,101,110,99,101,32,111,102,32,116,104,101,100,101,112,97,114,116,117,114,101,32, -102,114,111,109,32,116,104,101,67,111,110,102,101,100,101,114,97,116,101,32,83, -116,97,116,101,115,105,110,100,105,103,101,110,111,117,115,32,112,101,111,112, -108,101,115,80,114,111,99,101,101,100,105,110,103,115,32,111,102,32,116,104,101, -105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,116,104,101,116,104,101 -,111,114,105,101,115,32,104,97,118,101,32,98,101,101,110,105,110,118,111,108,118 -,101,109,101,110,116,32,105,110,32,116,104,101,100,105,118,105,100,101,100,32, -105,110,116,111,32,116,104,114,101,101,97,100,106,97,99,101,110,116,32,99,111, -117,110,116,114,105,101,115,105,115,32,114,101,115,112,111,110,115,105,98,108, -101,32,102,111,114,100,105,115,115,111,108,117,116,105,111,110,32,111,102,32,116 -,104,101,99,111,108,108,97,98,111,114,97,116,105,111,110,32,119,105,116,104,119, -105,100,101,108,121,32,114,101,103,97,114,100,101,100,32,97,115,104,105,115,32, -99,111,110,116,101,109,112,111,114,97,114,105,101,115,102,111,117,110,100,105, -110,103,32,109,101,109,98,101,114,32,111,102,68,111,109,105,110,105,99,97,110,32 -,82,101,112,117,98,108,105,99,103,101,110,101,114,97,108,108,121,32,97,99,99,101 -,112,116,101,100,116,104,101,32,112,111,115,115,105,98,105,108,105,116,121,32, -111,102,97,114,101,32,97,108,115,111,32,97,118,97,105,108,97,98,108,101,117,110, -100,101,114,32,99,111,110,115,116,114,117,99,116,105,111,110,114,101,115,116,111 -,114,97,116,105,111,110,32,111,102,32,116,104,101,116,104,101,32,103,101,110,101 -,114,97,108,32,112,117,98,108,105,99,105,115,32,97,108,109,111,115,116,32,101, -110,116,105,114,101,108,121,112,97,115,115,101,115,32,116,104,114,111,117,103, -104,32,116,104,101,104,97,115,32,98,101,101,110,32,115,117,103,103,101,115,116, -101,100,99,111,109,112,117,116,101,114,32,97,110,100,32,118,105,100,101,111,71, -101,114,109,97,110,105,99,32,108,97,110,103,117,97,103,101,115,32,97,99,99,111, -114,100,105,110,103,32,116,111,32,116,104,101,32,100,105,102,102,101,114,101,110 -,116,32,102,114,111,109,32,116,104,101,115,104,111,114,116,108,121,32,97,102,116 -,101,114,119,97,114,100,115,104,114,101,102,61,34,104,116,116,112,115,58,47,47, -119,119,119,46,114,101,99,101,110,116,32,100,101,118,101,108,111,112,109,101,110 -,116,66,111,97,114,100,32,111,102,32,68,105,114,101,99,116,111,114,115,60,100, -105,118,32,99,108,97,115,115,61,34,115,101,97,114,99,104,124,32,60,97,32,104,114 -,101,102,61,34,104,116,116,112,58,47,47,73,110,32,112,97,114,116,105,99,117,108, -97,114,44,32,116,104,101,77,117,108,116,105,112,108,101,32,102,111,111,116,110, -111,116,101,115,111,114,32,111,116,104,101,114,32,115,117,98,115,116,97,110,99, -101,116,104,111,117,115,97,110,100,115,32,111,102,32,121,101,97,114,115,116,114, -97,110,115,108,97,116,105,111,110,32,111,102,32,116,104,101,60,47,100,105,118,62 -,13,10,60,47,100,105,118,62,13,10,13,10,60,97,32,104,114,101,102,61,34,105,110, -100,101,120,46,112,104,112,119,97,115,32,101,115,116,97,98,108,105,115,104,101, -100,32,105,110,109,105,110,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10, -112,97,114,116,105,99,105,112,97,116,101,32,105,110,32,116,104,101,97,32,115,116 -,114,111,110,103,32,105,110,102,108,117,101,110,99,101,115,116,121,108,101,61,34 -,109,97,114,103,105,110,45,116,111,112,58,114,101,112,114,101,115,101,110,116, -101,100,32,98,121,32,116,104,101,103,114,97,100,117,97,116,101,100,32,102,114, -111,109,32,116,104,101,84,114,97,100,105,116,105,111,110,97,108,108,121,44,32, -116,104,101,69,108,101,109,101,110,116,40,34,115,99,114,105,112,116,34,41,59,72, -111,119,101,118,101,114,44,32,115,105,110,99,101,32,116,104,101,47,100,105,118, -62,10,60,47,100,105,118,62,10,60,100,105,118,32,108,101,102,116,59,32,109,97,114 -,103,105,110,45,108,101,102,116,58,112,114,111,116,101,99,116,105,111,110,32,97, -103,97,105,110,115,116,48,59,32,118,101,114,116,105,99,97,108,45,97,108,105,103, -110,58,85,110,102,111,114,116,117,110,97,116,101,108,121,44,32,116,104,101,116, -121,112,101,61,34,105,109,97,103,101,47,120,45,105,99,111,110,47,100,105,118,62, -10,60,100,105,118,32,99,108,97,115,115,61,34,32,99,108,97,115,115,61,34,99,108, -101,97,114,102,105,120,34,62,60,100,105,118,32,99,108,97,115,115,61,34,102,111, -111,116,101,114,9,9,60,47,100,105,118,62,10,9,9,60,47,100,105,118,62,10,116,104, -101,32,109,111,116,105,111,110,32,112,105,99,116,117,114,101,208,145,209,138,208 -,187,208,179,208,176,209,128,209,129,208,186,208,184,208,177,209,138,208,187,208 -,179,208,176,209,128,209,129,208,186,208,184,208,164,208,181,208,180,208,181,209 -,128,208,176,209,134,208,184,208,184,208,189,208,181,209,129,208,186,208,190,208 -,187,209,140,208,186,208,190,209,129,208,190,208,190,208,177,209,137,208,181,208 -,189,208,184,208,181,209,129,208,190,208,190,208,177,209,137,208,181,208,189,208 -,184,209,143,208,191,209,128,208,190,208,179,209,128,208,176,208,188,208,188,209 -,139,208,158,209,130,208,191,209,128,208,176,208,178,208,184,209,130,209,140,208 -,177,208,181,209,129,208,191,208,187,208,176,209,130,208,189,208,190,208,188,208 -,176,209,130,208,181,209,128,208,184,208,176,208,187,209,139,208,191,208,190,208 -,183,208,178,208,190,208,187,209,143,208,181,209,130,208,191,208,190,209,129,208 -,187,208,181,208,180,208,189,208,184,208,181,209,128,208,176,208,183,208,187,208 -,184,209,135,208,189,209,139,209,133,208,191,209,128,208,190,208,180,209,131,208 -,186,209,134,208,184,208,184,208,191,209,128,208,190,208,179,209,128,208,176,208 -,188,208,188,208,176,208,191,208,190,208,187,208,189,208,190,209,129,209,130,209 -,140,209,142,208,189,208,176,209,133,208,190,208,180,208,184,209,130,209,129,209 -,143,208,184,208,183,208,177,209,128,208,176,208,189,208,189,208,190,208,181,208 -,189,208,176,209,129,208,181,208,187,208,181,208,189,208,184,209,143,208,184,208 -,183,208,188,208,181,208,189,208,181,208,189,208,184,209,143,208,186,208,176,209 -,130,208,181,208,179,208,190,209,128,208,184,208,184,208,144,208,187,208,181,208 -,186,209,129,208,176,208,189,208,180,209,128,224,164,166,224,165,141,224,164,181 -,224,164,190,224,164,176,224,164,190,224,164,174,224,165,136,224,164,168,224,165 -,129,224,164,133,224,164,178,224,164,170,224,165,141,224,164,176,224,164,166,224 -,164,190,224,164,168,224,164,173,224,164,190,224,164,176,224,164,164,224,165,128 -,224,164,175,224,164,133,224,164,168,224,165,129,224,164,166,224,165,135,224,164 -,182,224,164,185,224,164,191,224,164,168,224,165,141,224,164,166,224,165,128,224 -,164,135,224,164,130,224,164,161,224,164,191,224,164,175,224,164,190,224,164,166 -,224,164,191,224,164,178,224,165,141,224,164,178,224,165,128,224,164,133,224,164 -,167,224,164,191,224,164,149,224,164,190,224,164,176,224,164,181,224,165,128,224 -,164,161,224,164,191,224,164,175,224,165,139,224,164,154,224,164,191,224,164,159 -,224,165,141,224,164,160,224,165,135,224,164,184,224,164,174,224,164,190,224,164 -,154,224,164,190,224,164,176,224,164,156,224,164,130,224,164,149,224,165,141,224 -,164,182,224,164,168,224,164,166,224,165,129,224,164,168,224,164,191,224,164,175 -,224,164,190,224,164,170,224,165,141,224,164,176,224,164,175,224,165,139,224,164 -,151,224,164,133,224,164,168,224,165,129,224,164,184,224,164,190,224,164,176,224 -,164,145,224,164,168,224,164,178,224,164,190,224,164,135,224,164,168,224,164,170 -,224,164,190,224,164,176,224,165,141,224,164,159,224,165,128,224,164,182,224,164 -,176,224,165,141,224,164,164,224,165,139,224,164,130,224,164,178,224,165,139,224 -,164,149,224,164,184,224,164,173,224,164,190,224,164,171,224,164,188,224,165,141 -,224,164,178,224,165,136,224,164,182,224,164,182,224,164,176,224,165,141,224,164 -,164,224,165,135,224,164,130,224,164,170,224,165,141,224,164,176,224,164,166,224 -,165,135,224,164,182,224,164,170,224,165,141,224,164,178,224,165,135,224,164,175 -,224,164,176,224,164,149,224,165,135,224,164,130,224,164,166,224,165,141,224,164 -,176,224,164,184,224,165,141,224,164,165,224,164,191,224,164,164,224,164,191,224 -,164,137,224,164,164,224,165,141,224,164,170,224,164,190,224,164,166,224,164,137 -,224,164,168,224,165,141,224,164,185,224,165,135,224,164,130,224,164,154,224,164 -,191,224,164,159,224,165,141,224,164,160,224,164,190,224,164,175,224,164,190,224 -,164,164,224,165,141,224,164,176,224,164,190,224,164,156,224,165,141,224,164,175 -,224,164,190,224,164,166,224,164,190,224,164,170,224,165,129,224,164,176,224,164 -,190,224,164,168,224,165,135,224,164,156,224,165,139,224,164,161,224,164,188,224 -,165,135,224,164,130,224,164,133,224,164,168,224,165,129,224,164,181,224,164,190 -,224,164,166,224,164,182,224,165,141,224,164,176,224,165,135,224,164,163,224,165 -,128,224,164,182,224,164,191,224,164,149,224,165,141,224,164,183,224,164,190,224 -,164,184,224,164,176,224,164,149,224,164,190,224,164,176,224,165,128,224,164,184 -,224,164,130,224,164,151,224,165,141,224,164,176,224,164,185,224,164,170,224,164 -,176,224,164,191,224,164,163,224,164,190,224,164,174,224,164,172,224,165,141,224 -,164,176,224,164,190,224,164,130,224,164,161,224,164,172,224,164,154,224,165,141 -,224,164,154,224,165,139,224,164,130,224,164,137,224,164,170,224,164,178,224,164 -,172,224,165,141,224,164,167,224,164,174,224,164,130,224,164,164,224,165,141,224 -,164,176,224,165,128,224,164,184,224,164,130,224,164,170,224,164,176,224,165,141 -,224,164,149,224,164,137,224,164,174,224,165,141,224,164,174,224,165,128,224,164 -,166,224,164,174,224,164,190,224,164,167,224,165,141,224,164,175,224,164,174,224 -,164,184,224,164,185,224,164,190,224,164,175,224,164,164,224,164,190,224,164,182 -,224,164,172,224,165,141,224,164,166,224,165,139,224,164,130,224,164,174,224,165 -,128,224,164,161,224,164,191,224,164,175,224,164,190,224,164,134,224,164,136,224 -,164,170,224,165,128,224,164,143,224,164,178,224,164,174,224,165,139,224,164,172 -,224,164,190,224,164,135,224,164,178,224,164,184,224,164,130,224,164,150,224,165 -,141,224,164,175,224,164,190,224,164,134,224,164,170,224,164,176,224,165,135,224 -,164,182,224,164,168,224,164,133,224,164,168,224,165,129,224,164,172,224,164,130 -,224,164,167,224,164,172,224,164,190,224,164,156,224,164,188,224,164,190,224,164 -,176,224,164,168,224,164,181,224,165,128,224,164,168,224,164,164,224,164,174,224 -,164,170,224,165,141,224,164,176,224,164,174,224,165,129,224,164,150,224,164,170 -,224,165,141,224,164,176,224,164,182,224,165,141,224,164,168,224,164,170,224,164 -,176,224,164,191,224,164,181,224,164,190,224,164,176,224,164,168,224,165,129,224 -,164,149,224,164,184,224,164,190,224,164,168,224,164,184,224,164,174,224,164,176 -,224,165,141,224,164,165,224,164,168,224,164,134,224,164,175,224,165,139,224,164 -,156,224,164,191,224,164,164,224,164,184,224,165,139,224,164,174,224,164,181,224 -,164,190,224,164,176,216,167,217,132,217,133,216,180,216,167,216,177,217,131,216 -,167,216,170,216,167,217,132,217,133,217,134,216,170,216,175,217,138,216,167,216 -,170,216,167,217,132,217,131,217,133,216,168,217,138,217,136,216,170,216,177,216 -,167,217,132,217,133,216,180,216,167,217,135,216,175,216,167,216,170,216,185,216 -,175,216,175,216,167,217,132,216,178,217,136,216,167,216,177,216,185,216,175,216 -,175,216,167,217,132,216,177,216,175,217,136,216,175,216,167,217,132,216,165,216 -,179,217,132,216,167,217,133,217,138,216,169,216,167,217,132,217,129,217,136,216 -,170,217,136,216,180,217,136,216,168,216,167,217,132,217,133,216,179,216,167,216 -,168,217,130,216,167,216,170,216,167,217,132,217,133,216,185,217,132,217,136,217 -,133,216,167,216,170,216,167,217,132,217,133,216,179,217,132,216,179,217,132,216 -,167,216,170,216,167,217,132,216,172,216,177,216,167,217,129,217,138,217,131,216 -,179,216,167,217,132,216,167,216,179,217,132,216,167,217,133,217,138,216,169,216 -,167,217,132,216,167,216,170,216,181,216,167,217,132,216,167,216,170,107,101,121 -,119,111,114,100,115,34,32,99,111,110,116,101,110,116,61,34,119,51,46,111,114, -103,47,49,57,57,57,47,120,104,116,109,108,34,62,60,97,32,116,97,114,103,101,116, -61,34,95,98,108,97,110,107,34,32,116,101,120,116,47,104,116,109,108,59,32,99,104 -,97,114,115,101,116,61,34,32,116,97,114,103,101,116,61,34,95,98,108,97,110,107, -34,62,60,116,97,98,108,101,32,99,101,108,108,112,97,100,100,105,110,103,61,34,97 -,117,116,111,99,111,109,112,108,101,116,101,61,34,111,102,102,34,32,116,101,120, -116,45,97,108,105,103,110,58,32,99,101,110,116,101,114,59,116,111,32,108,97,115, -116,32,118,101,114,115,105,111,110,32,98,121,32,98,97,99,107,103,114,111,117,110 -,100,45,99,111,108,111,114,58,32,35,34,32,104,114,101,102,61,34,104,116,116,112, -58,47,47,119,119,119,46,47,100,105,118,62,60,47,100,105,118,62,60,100,105,118,32 -,105,100,61,60,97,32,104,114,101,102,61,34,35,34,32,99,108,97,115,115,61,34,34, -62,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,99,114,105,112, -116,34,32,115,114,99,61,34,104,116,116,112,58,47,47,10,60,115,99,114,105,112,116 -,32,108,97,110,103,117,97,103,101,61,34,47,47,69,78,34,32,34,104,116,116,112,58, -47,47,119,119,119,46,119,101,110,99,111,100,101,85,82,73,67,111,109,112,111,110, -101,110,116,40,34,32,104,114,101,102,61,34,106,97,118,97,115,99,114,105,112,116, -58,60,100,105,118,32,99,108,97,115,115,61,34,99,111,110,116,101,110,116,100,111, -99,117,109,101,110,116,46,119,114,105,116,101,40,39,60,115,99,112,111,115,105, -116,105,111,110,58,32,97,98,115,111,108,117,116,101,59,115,99,114,105,112,116,32 -,115,114,99,61,34,104,116,116,112,58,47,47,32,115,116,121,108,101,61,34,109,97, -114,103,105,110,45,116,111,112,58,46,109,105,110,46,106,115,34,62,60,47,115,99, -114,105,112,116,62,10,60,47,100,105,118,62,10,60,100,105,118,32,99,108,97,115, -115,61,34,119,51,46,111,114,103,47,49,57,57,57,47,120,104,116,109,108,34,32,10, -13,10,60,47,98,111,100,121,62,13,10,60,47,104,116,109,108,62,100,105,115,116,105 -,110,99,116,105,111,110,32,98,101,116,119,101,101,110,47,34,32,116,97,114,103, -101,116,61,34,95,98,108,97,110,107,34,62,60,108,105,110,107,32,104,114,101,102, -61,34,104,116,116,112,58,47,47,101,110,99,111,100,105,110,103,61,34,117,116,102, -45,56,34,63,62,10,119,46,97,100,100,69,118,101,110,116,76,105,115,116,101,110, -101,114,63,97,99,116,105,111,110,61,34,104,116,116,112,58,47,47,119,119,119,46, -105,99,111,110,34,32,104,114,101,102,61,34,104,116,116,112,58,47,47,32,115,116, -121,108,101,61,34,98,97,99,107,103,114,111,117,110,100,58,116,121,112,101,61,34, -116,101,120,116,47,99,115,115,34,32,47,62,10,109,101,116,97,32,112,114,111,112, -101,114,116,121,61,34,111,103,58,116,60,105,110,112,117,116,32,116,121,112,101, -61,34,116,101,120,116,34,32,32,115,116,121,108,101,61,34,116,101,120,116,45,97, -108,105,103,110,58,116,104,101,32,100,101,118,101,108,111,112,109,101,110,116,32 -,111,102,32,116,121,108,101,115,104,101,101,116,34,32,116,121,112,101,61,34,116, -101,104,116,109,108,59,32,99,104,97,114,115,101,116,61,117,116,102,45,56,105,115 -,32,99,111,110,115,105,100,101,114,101,100,32,116,111,32,98,101,116,97,98,108, -101,32,119,105,100,116,104,61,34,49,48,48,37,34,32,73,110,32,97,100,100,105,116, -105,111,110,32,116,111,32,116,104,101,32,99,111,110,116,114,105,98,117,116,101, -100,32,116,111,32,116,104,101,32,100,105,102,102,101,114,101,110,99,101,115,32, -98,101,116,119,101,101,110,100,101,118,101,108,111,112,109,101,110,116,32,111, -102,32,116,104,101,32,73,116,32,105,115,32,105,109,112,111,114,116,97,110,116,32 -,116,111,32,60,47,115,99,114,105,112,116,62,10,10,60,115,99,114,105,112,116,32, -32,115,116,121,108,101,61,34,102,111,110,116,45,115,105,122,101,58,49,62,60,47, -115,112,97,110,62,60,115,112,97,110,32,105,100,61,103,98,76,105,98,114,97,114, -121,32,111,102,32,67,111,110,103,114,101,115,115,60,105,109,103,32,115,114,99,61 -,34,104,116,116,112,58,47,47,105,109,69,110,103,108,105,115,104,32,116,114,97, -110,115,108,97,116,105,111,110,65,99,97,100,101,109,121,32,111,102,32,83,99,105, -101,110,99,101,115,100,105,118,32,115,116,121,108,101,61,34,100,105,115,112,108, -97,121,58,99,111,110,115,116,114,117,99,116,105,111,110,32,111,102,32,116,104, -101,46,103,101,116,69,108,101,109,101,110,116,66,121,73,100,40,105,100,41,105, -110,32,99,111,110,106,117,110,99,116,105,111,110,32,119,105,116,104,69,108,101, -109,101,110,116,40,39,115,99,114,105,112,116,39,41,59,32,60,109,101,116,97,32, -112,114,111,112,101,114,116,121,61,34,111,103,58,208,145,209,138,208,187,208,179 -,208,176,209,128,209,129,208,186,208,184,10,32,116,121,112,101,61,34,116,101,120 -,116,34,32,110,97,109,101,61,34,62,80,114,105,118,97,99,121,32,80,111,108,105,99 -,121,60,47,97,62,97,100,109,105,110,105,115,116,101,114,101,100,32,98,121,32,116 -,104,101,101,110,97,98,108,101,83,105,110,103,108,101,82,101,113,117,101,115,116 -,115,116,121,108,101,61,38,113,117,111,116,59,109,97,114,103,105,110,58,60,47, -100,105,118,62,60,47,100,105,118,62,60,47,100,105,118,62,60,62,60,105,109,103,32 -,115,114,99,61,34,104,116,116,112,58,47,47,105,32,115,116,121,108,101,61,38,113, -117,111,116,59,102,108,111,97,116,58,114,101,102,101,114,114,101,100,32,116,111, -32,97,115,32,116,104,101,32,116,111,116,97,108,32,112,111,112,117,108,97,116,105 -,111,110,32,111,102,105,110,32,87,97,115,104,105,110,103,116,111,110,44,32,68,46 -,67,46,32,115,116,121,108,101,61,34,98,97,99,107,103,114,111,117,110,100,45,97, -109,111,110,103,32,111,116,104,101,114,32,116,104,105,110,103,115,44,111,114,103 -,97,110,105,122,97,116,105,111,110,32,111,102,32,116,104,101,112,97,114,116,105, -99,105,112,97,116,101,100,32,105,110,32,116,104,101,116,104,101,32,105,110,116, -114,111,100,117,99,116,105,111,110,32,111,102,105,100,101,110,116,105,102,105, -101,100,32,119,105,116,104,32,116,104,101,102,105,99,116,105,111,110,97,108,32, -99,104,97,114,97,99,116,101,114,32,79,120,102,111,114,100,32,85,110,105,118,101, -114,115,105,116,121,32,109,105,115,117,110,100,101,114,115,116,97,110,100,105, -110,103,32,111,102,84,104,101,114,101,32,97,114,101,44,32,104,111,119,101,118, -101,114,44,115,116,121,108,101,115,104,101,101,116,34,32,104,114,101,102,61,34, -47,67,111,108,117,109,98,105,97,32,85,110,105,118,101,114,115,105,116,121,101, -120,112,97,110,100,101,100,32,116,111,32,105,110,99,108,117,100,101,117,115,117, -97,108,108,121,32,114,101,102,101,114,114,101,100,32,116,111,105,110,100,105,99, -97,116,105,110,103,32,116,104,97,116,32,116,104,101,104,97,118,101,32,115,117, -103,103,101,115,116,101,100,32,116,104,97,116,97,102,102,105,108,105,97,116,101, -100,32,119,105,116,104,32,116,104,101,99,111,114,114,101,108,97,116,105,111,110, -32,98,101,116,119,101,101,110,110,117,109,98,101,114,32,111,102,32,100,105,102, -102,101,114,101,110,116,62,60,47,116,100,62,60,47,116,114,62,60,47,116,97,98,108 -,101,62,82,101,112,117,98,108,105,99,32,111,102,32,73,114,101,108,97,110,100,10, -60,47,115,99,114,105,112,116,62,10,60,115,99,114,105,112,116,32,117,110,100,101, -114,32,116,104,101,32,105,110,102,108,117,101,110,99,101,99,111,110,116,114,105, -98,117,116,105,111,110,32,116,111,32,116,104,101,79,102,102,105,99,105,97,108,32 -,119,101,98,115,105,116,101,32,111,102,104,101,97,100,113,117,97,114,116,101,114 -,115,32,111,102,32,116,104,101,99,101,110,116,101,114,101,100,32,97,114,111,117, -110,100,32,116,104,101,105,109,112,108,105,99,97,116,105,111,110,115,32,111,102, -32,116,104,101,104,97,118,101,32,98,101,101,110,32,100,101,118,101,108,111,112, -101,100,70,101,100,101,114,97,108,32,82,101,112,117,98,108,105,99,32,111,102,98, -101,99,97,109,101,32,105,110,99,114,101,97,115,105,110,103,108,121,99,111,110, -116,105,110,117,97,116,105,111,110,32,111,102,32,116,104,101,78,111,116,101,44, -32,104,111,119,101,118,101,114,44,32,116,104,97,116,115,105,109,105,108,97,114, -32,116,111,32,116,104,97,116,32,111,102,32,99,97,112,97,98,105,108,105,116,105, -101,115,32,111,102,32,116,104,101,97,99,99,111,114,100,97,110,99,101,32,119,105, -116,104,32,116,104,101,112,97,114,116,105,99,105,112,97,110,116,115,32,105,110, -32,116,104,101,102,117,114,116,104,101,114,32,100,101,118,101,108,111,112,109, -101,110,116,117,110,100,101,114,32,116,104,101,32,100,105,114,101,99,116,105,111 -,110,105,115,32,111,102,116,101,110,32,99,111,110,115,105,100,101,114,101,100, -104,105,115,32,121,111,117,110,103,101,114,32,98,114,111,116,104,101,114,60,47, -116,100,62,60,47,116,114,62,60,47,116,97,98,108,101,62,60,97,32,104,116,116,112, -45,101,113,117,105,118,61,34,88,45,85,65,45,112,104,121,115,105,99,97,108,32,112 -,114,111,112,101,114,116,105,101,115,111,102,32,66,114,105,116,105,115,104,32,67 -,111,108,117,109,98,105,97,104,97,115,32,98,101,101,110,32,99,114,105,116,105,99 -,105,122,101,100,40,119,105,116,104,32,116,104,101,32,101,120,99,101,112,116,105 -,111,110,113,117,101,115,116,105,111,110,115,32,97,98,111,117,116,32,116,104,101 -,112,97,115,115,105,110,103,32,116,104,114,111,117,103,104,32,116,104,101,48,34, -32,99,101,108,108,112,97,100,100,105,110,103,61,34,48,34,32,116,104,111,117,115, -97,110,100,115,32,111,102,32,112,101,111,112,108,101,114,101,100,105,114,101,99, -116,115,32,104,101,114,101,46,32,70,111,114,104,97,118,101,32,99,104,105,108,100 -,114,101,110,32,117,110,100,101,114,37,51,69,37,51,67,47,115,99,114,105,112,116, -37,51,69,34,41,41,59,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119 -,119,119,46,60,108,105,62,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47, -47,115,105,116,101,95,110,97,109,101,34,32,99,111,110,116,101,110,116,61,34,116, -101,120,116,45,100,101,99,111,114,97,116,105,111,110,58,110,111,110,101,115,116, -121,108,101,61,34,100,105,115,112,108,97,121,58,32,110,111,110,101,60,109,101, -116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,88,45,110,101,119,32,68, -97,116,101,40,41,46,103,101,116,84,105,109,101,40,41,32,116,121,112,101,61,34, -105,109,97,103,101,47,120,45,105,99,111,110,34,60,47,115,112,97,110,62,60,115, -112,97,110,32,99,108,97,115,115,61,34,108,97,110,103,117,97,103,101,61,34,106,97 -,118,97,115,99,114,105,112,116,119,105,110,100,111,119,46,108,111,99,97,116,105, -111,110,46,104,114,101,102,60,97,32,104,114,101,102,61,34,106,97,118,97,115,99, -114,105,112,116,58,45,45,62,13,10,60,115,99,114,105,112,116,32,116,121,112,101, -61,34,116,60,97,32,104,114,101,102,61,39,104,116,116,112,58,47,47,119,119,119,46 -,104,111,114,116,99,117,116,32,105,99,111,110,34,32,104,114,101,102,61,34,60,47, -100,105,118,62,13,10,60,100,105,118,32,99,108,97,115,115,61,34,60,115,99,114,105 -,112,116,32,115,114,99,61,34,104,116,116,112,58,47,47,34,32,114,101,108,61,34, -115,116,121,108,101,115,104,101,101,116,34,32,116,60,47,100,105,118,62,10,60,115 -,99,114,105,112,116,32,116,121,112,101,61,47,97,62,32,60,97,32,104,114,101,102, -61,34,104,116,116,112,58,47,47,32,97,108,108,111,119,84,114,97,110,115,112,97, -114,101,110,99,121,61,34,88,45,85,65,45,67,111,109,112,97,116,105,98,108,101,34, -32,99,111,110,114,101,108,97,116,105,111,110,115,104,105,112,32,98,101,116,119, -101,101,110,10,60,47,115,99,114,105,112,116,62,13,10,60,115,99,114,105,112,116, -32,60,47,97,62,60,47,108,105,62,60,47,117,108,62,60,47,100,105,118,62,97,115,115 -,111,99,105,97,116,101,100,32,119,105,116,104,32,116,104,101,32,112,114,111,103, -114,97,109,109,105,110,103,32,108,97,110,103,117,97,103,101,60,47,97,62,60,97,32 -,104,114,101,102,61,34,104,116,116,112,58,47,47,60,47,97,62,60,47,108,105,62,60, -108,105,32,99,108,97,115,115,61,34,102,111,114,109,32,97,99,116,105,111,110,61, -34,104,116,116,112,58,47,47,60,100,105,118,32,115,116,121,108,101,61,34,100,105, -115,112,108,97,121,58,116,121,112,101,61,34,116,101,120,116,34,32,110,97,109,101 -,61,34,113,34,60,116,97,98,108,101,32,119,105,100,116,104,61,34,49,48,48,37,34, -32,98,97,99,107,103,114,111,117,110,100,45,112,111,115,105,116,105,111,110,58,34 -,32,98,111,114,100,101,114,61,34,48,34,32,119,105,100,116,104,61,34,114,101,108, -61,34,115,104,111,114,116,99,117,116,32,105,99,111,110,34,32,104,54,62,60,117, -108,62,60,108,105,62,60,97,32,104,114,101,102,61,34,32,32,60,109,101,116,97,32, -104,116,116,112,45,101,113,117,105,118,61,34,99,115,115,34,32,109,101,100,105,97 -,61,34,115,99,114,101,101,110,34,32,114,101,115,112,111,110,115,105,98,108,101, -32,102,111,114,32,116,104,101,32,34,32,116,121,112,101,61,34,97,112,112,108,105, -99,97,116,105,111,110,47,34,32,115,116,121,108,101,61,34,98,97,99,107,103,114, -111,117,110,100,45,104,116,109,108,59,32,99,104,97,114,115,101,116,61,117,116, -102,45,56,34,32,97,108,108,111,119,116,114,97,110,115,112,97,114,101,110,99,121, -61,34,115,116,121,108,101,115,104,101,101,116,34,32,116,121,112,101,61,34,116, -101,13,10,60,109,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,62, -60,47,115,112,97,110,62,60,115,112,97,110,32,99,108,97,115,115,61,34,48,34,32,99 -,101,108,108,115,112,97,99,105,110,103,61,34,48,34,62,59,10,60,47,115,99,114,105 -,112,116,62,10,60,115,99,114,105,112,116,32,115,111,109,101,116,105,109,101,115, -32,99,97,108,108,101,100,32,116,104,101,100,111,101,115,32,110,111,116,32,110, -101,99,101,115,115,97,114,105,108,121,70,111,114,32,109,111,114,101,32,105,110, -102,111,114,109,97,116,105,111,110,97,116,32,116,104,101,32,98,101,103,105,110, -110,105,110,103,32,111,102,32,60,33,68,79,67,84,89,80,69,32,104,116,109,108,62, -60,104,116,109,108,112,97,114,116,105,99,117,108,97,114,108,121,32,105,110,32, -116,104,101,32,116,121,112,101,61,34,104,105,100,100,101,110,34,32,110,97,109, -101,61,34,106,97,118,97,115,99,114,105,112,116,58,118,111,105,100,40,48,41,59,34 -,101,102,102,101,99,116,105,118,101,110,101,115,115,32,111,102,32,116,104,101,32 -,97,117,116,111,99,111,109,112,108,101,116,101,61,34,111,102,102,34,32,103,101, -110,101,114,97,108,108,121,32,99,111,110,115,105,100,101,114,101,100,62,60,105, -110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,34,62,60,47,115, -99,114,105,112,116,62,13,10,60,115,99,114,105,112,116,116,104,114,111,117,103, -104,111,117,116,32,116,104,101,32,119,111,114,108,100,99,111,109,109,111,110,32, -109,105,115,99,111,110,99,101,112,116,105,111,110,97,115,115,111,99,105,97,116, -105,111,110,32,119,105,116,104,32,116,104,101,60,47,100,105,118,62,10,60,47,100, -105,118,62,10,60,100,105,118,32,99,100,117,114,105,110,103,32,104,105,115,32,108 -,105,102,101,116,105,109,101,44,99,111,114,114,101,115,112,111,110,100,105,110, -103,32,116,111,32,116,104,101,116,121,112,101,61,34,105,109,97,103,101,47,120,45 -,105,99,111,110,34,32,97,110,32,105,110,99,114,101,97,115,105,110,103,32,110,117 -,109,98,101,114,100,105,112,108,111,109,97,116,105,99,32,114,101,108,97,116,105, -111,110,115,97,114,101,32,111,102,116,101,110,32,99,111,110,115,105,100,101,114, -101,100,109,101,116,97,32,99,104,97,114,115,101,116,61,34,117,116,102,45,56,34, -32,60,105,110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,101,120 -,97,109,112,108,101,115,32,105,110,99,108,117,100,101,32,116,104,101,34,62,60, -105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,105,112,97,114,116,105, -99,105,112,97,116,105,111,110,32,105,110,32,116,104,101,116,104,101,32,101,115, -116,97,98,108,105,115,104,109,101,110,116,32,111,102,10,60,47,100,105,118,62,10, -60,100,105,118,32,99,108,97,115,115,61,34,38,97,109,112,59,110,98,115,112,59,38, -97,109,112,59,110,98,115,112,59,116,111,32,100,101,116,101,114,109,105,110,101, -32,119,104,101,116,104,101,114,113,117,105,116,101,32,100,105,102,102,101,114, -101,110,116,32,102,114,111,109,109,97,114,107,101,100,32,116,104,101,32,98,101, -103,105,110,110,105,110,103,100,105,115,116,97,110,99,101,32,98,101,116,119,101, -101,110,32,116,104,101,99,111,110,116,114,105,98,117,116,105,111,110,115,32,116, -111,32,116,104,101,99,111,110,102,108,105,99,116,32,98,101,116,119,101,101,110, -32,116,104,101,119,105,100,101,108,121,32,99,111,110,115,105,100,101,114,101,100 -,32,116,111,119,97,115,32,111,110,101,32,111,102,32,116,104,101,32,102,105,114, -115,116,119,105,116,104,32,118,97,114,121,105,110,103,32,100,101,103,114,101,101 -,115,104,97,118,101,32,115,112,101,99,117,108,97,116,101,100,32,116,104,97,116, -40,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,112, -97,114,116,105,99,105,112,97,116,105,110,103,32,105,110,32,116,104,101,111,114, -105,103,105,110,97,108,108,121,32,100,101,118,101,108,111,112,101,100,101,116,97 -,32,99,104,97,114,115,101,116,61,34,117,116,102,45,56,34,62,32,116,121,112,101, -61,34,116,101,120,116,47,99,115,115,34,32,47,62,10,105,110,116,101,114,99,104,97 -,110,103,101,97,98,108,121,32,119,105,116,104,109,111,114,101,32,99,108,111,115, -101,108,121,32,114,101,108,97,116,101,100,115,111,99,105,97,108,32,97,110,100,32 -,112,111,108,105,116,105,99,97,108,116,104,97,116,32,119,111,117,108,100,32,111, -116,104,101,114,119,105,115,101,112,101,114,112,101,110,100,105,99,117,108,97, -114,32,116,111,32,116,104,101,115,116,121,108,101,32,116,121,112,101,61,34,116, -101,120,116,47,99,115,115,116,121,112,101,61,34,115,117,98,109,105,116,34,32,110 -,97,109,101,61,34,102,97,109,105,108,105,101,115,32,114,101,115,105,100,105,110, -103,32,105,110,100,101,118,101,108,111,112,105,110,103,32,99,111,117,110,116,114 -,105,101,115,99,111,109,112,117,116,101,114,32,112,114,111,103,114,97,109,109, -105,110,103,101,99,111,110,111,109,105,99,32,100,101,118,101,108,111,112,109,101 -,110,116,100,101,116,101,114,109,105,110,97,116,105,111,110,32,111,102,32,116, -104,101,102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111 -,110,111,110,32,115,101,118,101,114,97,108,32,111,99,99,97,115,105,111,110,115, -112,111,114,116,117,103,117,195,170,115,32,40,69,117,114,111,112,101,117,41,208, -163,208,186,209,128,208,176,209,151,208,189,209,129,209,140,208,186,208,176,209, -131,208,186,209,128,208,176,209,151,208,189,209,129,209,140,208,186,208,176,208, -160,208,190,209,129,209,129,208,184,208,185,209,129,208,186,208,190,208,185,208, -188,208,176,209,130,208,181,209,128,208,184,208,176,208,187,208,190,208,178,208, -184,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,208,184,209, -131,208,191,209,128,208,176,208,178,208,187,208,181,208,189,208,184,209,143,208, -189,208,181,208,190,208,177,209,133,208,190,208,180,208,184,208,188,208,190,208, -184,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,209,143,208, -152,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,209,143,208, -160,208,181,209,129,208,191,209,131,208,177,208,187,208,184,208,186,208,184,208, -186,208,190,208,187,208,184,209,135,208,181,209,129,209,130,208,178,208,190,208, -184,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,209,142,209, -130,208,181,209,128,209,128,208,184,209,130,208,190,209,128,208,184,208,184,208, -180,208,190,209,129,209,130,208,176,209,130,208,190,209,135,208,189,208,190,216, -167,217,132,217,133,216,170,217,136,216,167,216,172,216,175,217,136,217,134,216, -167,217,132,216,167,216,180,216,170,216,177,216,167,217,131,216,167,216,170,216, -167,217,132,216,167,217,130,216,170,216,177,216,167,216,173,216,167,216,170,104, -116,109,108,59,32,99,104,97,114,115,101,116,61,85,84,70,45,56,34,32,115,101,116, -84,105,109,101,111,117,116,40,102,117,110,99,116,105,111,110,40,41,100,105,115, -112,108,97,121,58,105,110,108,105,110,101,45,98,108,111,99,107,59,60,105,110,112 -,117,116,32,116,121,112,101,61,34,115,117,98,109,105,116,34,32,116,121,112,101, -32,61,32,39,116,101,120,116,47,106,97,118,97,115,99,114,105,60,105,109,103,32, -115,114,99,61,34,104,116,116,112,58,47,47,119,119,119,46,34,32,34,104,116,116, -112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,115,104,111,114,116,99,117, -116,32,105,99,111,110,34,32,104,114,101,102,61,34,34,32,97,117,116,111,99,111, -109,112,108,101,116,101,61,34,111,102,102,34,32,60,47,97,62,60,47,100,105,118,62 -,60,100,105,118,32,99,108,97,115,115,61,60,47,97,62,60,47,108,105,62,10,60,108, -105,32,99,108,97,115,115,61,34,99,115,115,34,32,116,121,112,101,61,34,116,101, -120,116,47,99,115,115,34,32,60,102,111,114,109,32,97,99,116,105,111,110,61,34, -104,116,116,112,58,47,47,120,116,47,99,115,115,34,32,104,114,101,102,61,34,104, -116,116,112,58,47,47,108,105,110,107,32,114,101,108,61,34,97,108,116,101,114,110 -,97,116,101,34,32,13,10,60,115,99,114,105,112,116,32,116,121,112,101,61,34,116, -101,120,116,47,32,111,110,99,108,105,99,107,61,34,106,97,118,97,115,99,114,105, -112,116,58,40,110,101,119,32,68,97,116,101,41,46,103,101,116,84,105,109,101,40, -41,125,104,101,105,103,104,116,61,34,49,34,32,119,105,100,116,104,61,34,49,34,32 -,80,101,111,112,108,101,39,115,32,82,101,112,117,98,108,105,99,32,111,102,32,32, -60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,116,101, -120,116,45,100,101,99,111,114,97,116,105,111,110,58,117,110,100,101,114,116,104, -101,32,98,101,103,105,110,110,105,110,103,32,111,102,32,116,104,101,32,60,47,100 -,105,118,62,10,60,47,100,105,118,62,10,60,47,100,105,118,62,10,101,115,116,97,98 -,108,105,115,104,109,101,110,116,32,111,102,32,116,104,101,32,60,47,100,105,118, -62,60,47,100,105,118,62,60,47,100,105,118,62,60,47,100,35,118,105,101,119,112, -111,114,116,123,109,105,110,45,104,101,105,103,104,116,58,10,60,115,99,114,105, -112,116,32,115,114,99,61,34,104,116,116,112,58,47,47,111,112,116,105,111,110,62, -60,111,112,116,105,111,110,32,118,97,108,117,101,61,111,102,116,101,110,32,114, -101,102,101,114,114,101,100,32,116,111,32,97,115,32,47,111,112,116,105,111,110, -62,10,60,111,112,116,105,111,110,32,118,97,108,117,60,33,68,79,67,84,89,80,69,32 -,104,116,109,108,62,10,60,33,45,45,91,73,110,116,101,114,110,97,116,105,111,110, -97,108,32,65,105,114,112,111,114,116,62,10,60,97,32,104,114,101,102,61,34,104, -116,116,112,58,47,47,119,119,119,60,47,97,62,60,97,32,104,114,101,102,61,34,104, -116,116,112,58,47,47,119,224,184,160,224,184,178,224,184,169,224,184,178,224,185 -,132,224,184,151,224,184,162,225,131,165,225,131,144,225,131,160,225,131,151,225 -,131,163,225,131,154,225,131,152,230,173,163,233,171,148,228,184,173,230,150,135 -,32,40,231,185,129,233,171,148,41,224,164,168,224,164,191,224,164,176,224,165, -141,224,164,166,224,165,135,224,164,182,224,164,161,224,164,190,224,164,137,224, -164,168,224,164,178,224,165,139,224,164,161,224,164,149,224,165,141,224,164,183, -224,165,135,224,164,164,224,165,141,224,164,176,224,164,156,224,164,190,224,164, -168,224,164,149,224,164,190,224,164,176,224,165,128,224,164,184,224,164,130,224, -164,172,224,164,130,224,164,167,224,164,191,224,164,164,224,164,184,224,165,141, -224,164,165,224,164,190,224,164,170,224,164,168,224,164,190,224,164,184,224,165, -141,224,164,181,224,165,128,224,164,149,224,164,190,224,164,176,224,164,184,224, -164,130,224,164,184,224,165,141,224,164,149,224,164,176,224,164,163,224,164,184, -224,164,190,224,164,174,224,164,151,224,165,141,224,164,176,224,165,128,224,164, -154,224,164,191,224,164,159,224,165,141,224,164,160,224,165,139,224,164,130,224, -164,181,224,164,191,224,164,156,224,165,141,224,164,158,224,164,190,224,164,168, -224,164,133,224,164,174,224,165,135,224,164,176,224,164,191,224,164,149,224,164, -190,224,164,181,224,164,191,224,164,173,224,164,191,224,164,168,224,165,141,224, -164,168,224,164,151,224,164,190,224,164,161,224,164,191,224,164,175,224,164,190, -224,164,129,224,164,149,224,165,141,224,164,175,224,165,139,224,164,130,224,164, -149,224,164,191,224,164,184,224,165,129,224,164,176,224,164,149,224,165,141,224, -164,183,224,164,190,224,164,170,224,164,185,224,165,129,224,164,129,224,164,154, -224,164,164,224,165,128,224,164,170,224,165,141,224,164,176,224,164,172,224,164, -130,224,164,167,224,164,168,224,164,159,224,164,191,224,164,170,224,165,141,224, -164,170,224,164,163,224,165,128,224,164,149,224,165,141,224,164,176,224,164,191, -224,164,149,224,165,135,224,164,159,224,164,170,224,165,141,224,164,176,224,164, -190,224,164,176,224,164,130,224,164,173,224,164,170,224,165,141,224,164,176,224, -164,190,224,164,170,224,165,141,224,164,164,224,164,174,224,164,190,224,164,178, -224,164,191,224,164,149,224,165,139,224,164,130,224,164,176,224,164,171,224,164, -188,224,165,141,224,164,164,224,164,190,224,164,176,224,164,168,224,164,191,224, -164,176,224,165,141,224,164,174,224,164,190,224,164,163,224,164,178,224,164,191, -224,164,174,224,164,191,224,164,159,224,165,135,224,164,161,100,101,115,99,114, -105,112,116,105,111,110,34,32,99,111,110,116,101,110,116,61,34,100,111,99,117, -109,101,110,116,46,108,111,99,97,116,105,111,110,46,112,114,111,116,46,103,101, -116,69,108,101,109,101,110,116,115,66,121,84,97,103,78,97,109,101,40,60,33,68,79 -,67,84,89,80,69,32,104,116,109,108,62,10,60,104,116,109,108,32,60,109,101,116,97 -,32,99,104,97,114,115,101,116,61,34,117,116,102,45,56,34,62,58,117,114,108,34,32 -,99,111,110,116,101,110,116,61,34,104,116,116,112,58,47,47,46,99,115,115,34,32, -114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,115,116,121,108,101 -,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,62,116,121,112,101,61 -,34,116,101,120,116,47,99,115,115,34,32,104,114,101,102,61,34,119,51,46,111,114, -103,47,49,57,57,57,47,120,104,116,109,108,34,32,120,109,108,116,121,112,101,61, -34,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,34,32,109,101,116,104 -,111,100,61,34,103,101,116,34,32,97,99,116,105,111,110,61,34,108,105,110,107,32, -114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,32,32,61,32,100,111 -,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,116,121,112, -101,61,34,105,109,97,103,101,47,120,45,105,99,111,110,34,32,47,62,99,101,108,108 -,112,97,100,100,105,110,103,61,34,48,34,32,99,101,108,108,115,112,46,99,115,115, -34,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,32,60,47,97,62,60, -47,108,105,62,60,108,105,62,60,97,32,104,114,101,102,61,34,34,32,119,105,100,116 -,104,61,34,49,34,32,104,101,105,103,104,116,61,34,49,34,34,62,60,97,32,104,114, -101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,115,116,121,108,101,61,34, -100,105,115,112,108,97,121,58,110,111,110,101,59,34,62,97,108,116,101,114,110,97 -,116,101,34,32,116,121,112,101,61,34,97,112,112,108,105,45,47,47,87,51,67,47,47, -68,84,68,32,88,72,84,77,76,32,49,46,48,32,101,108,108,115,112,97,99,105,110,103, -61,34,48,34,32,99,101,108,108,112,97,100,32,116,121,112,101,61,34,104,105,100, -100,101,110,34,32,118,97,108,117,101,61,34,47,97,62,38,110,98,115,112,59,60,115, -112,97,110,32,114,111,108,101,61,34,115,10,60,105,110,112,117,116,32,116,121,112 -,101,61,34,104,105,100,100,101,110,34,32,108,97,110,103,117,97,103,101,61,34,74, -97,118,97,83,99,114,105,112,116,34,32,32,100,111,99,117,109,101,110,116,46,103, -101,116,69,108,101,109,101,110,116,115,66,103,61,34,48,34,32,99,101,108,108,115, -112,97,99,105,110,103,61,34,48,34,32,121,112,101,61,34,116,101,120,116,47,99,115 -,115,34,32,109,101,100,105,97,61,34,116,121,112,101,61,39,116,101,120,116,47,106 -,97,118,97,115,99,114,105,112,116,39,119,105,116,104,32,116,104,101,32,101,120, -99,101,112,116,105,111,110,32,111,102,32,121,112,101,61,34,116,101,120,116,47,99 -,115,115,34,32,114,101,108,61,34,115,116,32,104,101,105,103,104,116,61,34,49,34, -32,119,105,100,116,104,61,34,49,34,32,61,39,43,101,110,99,111,100,101,85,82,73, -67,111,109,112,111,110,101,110,116,40,60,108,105,110,107,32,114,101,108,61,34,97 -,108,116,101,114,110,97,116,101,34,32,10,98,111,100,121,44,32,116,114,44,32,105, -110,112,117,116,44,32,116,101,120,116,109,101,116,97,32,110,97,109,101,61,34,114 -,111,98,111,116,115,34,32,99,111,110,109,101,116,104,111,100,61,34,112,111,115, -116,34,32,97,99,116,105,111,110,61,34,62,10,60,97,32,104,114,101,102,61,34,104, -116,116,112,58,47,47,119,119,119,46,99,115,115,34,32,114,101,108,61,34,115,116, -121,108,101,115,104,101,101,116,34,32,60,47,100,105,118,62,60,47,100,105,118,62, -60,100,105,118,32,99,108,97,115,115,108,97,110,103,117,97,103,101,61,34,106,97, -118,97,115,99,114,105,112,116,34,62,97,114,105,97,45,104,105,100,100,101,110,61, -34,116,114,117,101,34,62,194,183,60,114,105,112,116,34,32,116,121,112,101,61,34, -116,101,120,116,47,106,97,118,97,115,108,61,48,59,125,41,40,41,59,10,40,102,117, -110,99,116,105,111,110,40,41,123,98,97,99,107,103,114,111,117,110,100,45,105,109 -,97,103,101,58,32,117,114,108,40,47,97,62,60,47,108,105,62,60,108,105,62,60,97, -32,104,114,101,102,61,34,104,9,9,60,108,105,62,60,97,32,104,114,101,102,61,34, -104,116,116,112,58,47,47,97,116,111,114,34,32,97,114,105,97,45,104,105,100,100, -101,110,61,34,116,114,117,62,32,60,97,32,104,114,101,102,61,34,104,116,116,112, -58,47,47,119,119,119,46,108,97,110,103,117,97,103,101,61,34,106,97,118,97,115,99 -,114,105,112,116,34,32,47,111,112,116,105,111,110,62,10,60,111,112,116,105,111, -110,32,118,97,108,117,101,47,100,105,118,62,60,47,100,105,118,62,60,100,105,118, -32,99,108,97,115,115,61,114,97,116,111,114,34,32,97,114,105,97,45,104,105,100, -100,101,110,61,34,116,114,101,61,40,110,101,119,32,68,97,116,101,41,46,103,101, -116,84,105,109,101,40,41,112,111,114,116,117,103,117,195,170,115,32,40,100,111, -32,66,114,97,115,105,108,41,208,190,209,128,208,179,208,176,208,189,208,184,208, -183,208,176,209,134,208,184,208,184,208,178,208,190,208,183,208,188,208,190,208, -182,208,189,208,190,209,129,209,130,209,140,208,190,208,177,209,128,208,176,208, -183,208,190,208,178,208,176,208,189,208,184,209,143,209,128,208,181,208,179,208, -184,209,129,209,130,209,128,208,176,209,134,208,184,208,184,208,178,208,190,208, -183,208,188,208,190,208,182,208,189,208,190,209,129,209,130,208,184,208,190,208, -177,209,143,208,183,208,176,209,130,208,181,208,187,209,140,208,189,208,176,60, -33,68,79,67,84,89,80,69,32,104,116,109,108,32,80,85,66,76,73,67,32,34,110,116,45 -,84,121,112,101,34,32,99,111,110,116,101,110,116,61,34,116,101,120,116,47,60,109 -,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,67,111,110,116,101, -114,97,110,115,105,116,105,111,110,97,108,47,47,69,78,34,32,34,104,116,116,112, -58,60,104,116,109,108,32,120,109,108,110,115,61,34,104,116,116,112,58,47,47,119, -119,119,45,47,47,87,51,67,47,47,68,84,68,32,88,72,84,77,76,32,49,46,48,32,84,68, -84,68,47,120,104,116,109,108,49,45,116,114,97,110,115,105,116,105,111,110,97,108 -,47,47,119,119,119,46,119,51,46,111,114,103,47,84,82,47,120,104,116,109,108,49, -47,112,101,32,61,32,39,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116, -39,59,60,109,101,116,97,32,110,97,109,101,61,34,100,101,115,99,114,105,112,116, -105,111,110,112,97,114,101,110,116,78,111,100,101,46,105,110,115,101,114,116,66, -101,102,111,114,101,60,105,110,112,117,116,32,116,121,112,101,61,34,104,105,100, -100,101,110,34,32,110,97,106,115,34,32,116,121,112,101,61,34,116,101,120,116,47, -106,97,118,97,115,99,114,105,40,100,111,99,117,109,101,110,116,41,46,114,101,97, -100,121,40,102,117,110,99,116,105,115,99,114,105,112,116,32,116,121,112,101,61, -34,116,101,120,116,47,106,97,118,97,115,105,109,97,103,101,34,32,99,111,110,116, -101,110,116,61,34,104,116,116,112,58,47,47,85,65,45,67,111,109,112,97,116,105,98 -,108,101,34,32,99,111,110,116,101,110,116,61,116,109,108,59,32,99,104,97,114,115 -,101,116,61,117,116,102,45,56,34,32,47,62,10,108,105,110,107,32,114,101,108,61, -34,115,104,111,114,116,99,117,116,32,105,99,111,110,60,108,105,110,107,32,114, -101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,32,60,47,115,99,114,105 -,112,116,62,10,60,115,99,114,105,112,116,32,116,121,112,101,61,61,32,100,111,99, -117,109,101,110,116,46,99,114,101,97,116,101,69,108,101,109,101,110,60,97,32,116 -,97,114,103,101,116,61,34,95,98,108,97,110,107,34,32,104,114,101,102,61,32,100, -111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,115,66,105, -110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,110,97,109,101,61 -,97,46,116,121,112,101,32,61,32,39,116,101,120,116,47,106,97,118,97,115,99,114, -105,110,112,117,116,32,116,121,112,101,61,34,104,105,100,100,101,110,34,32,110, -97,109,101,104,116,109,108,59,32,99,104,97,114,115,101,116,61,117,116,102,45,56, -34,32,47,62,100,116,100,34,62,10,60,104,116,109,108,32,120,109,108,110,115,61,34 -,104,116,116,112,45,47,47,87,51,67,47,47,68,84,68,32,72,84,77,76,32,52,46,48,49, -32,84,101,110,116,115,66,121,84,97,103,78,97,109,101,40,39,115,99,114,105,112, -116,39,41,105,110,112,117,116,32,116,121,112,101,61,34,104,105,100,100,101,110, -34,32,110,97,109,60,115,99,114,105,112,116,32,116,121,112,101,61,34,116,101,120, -116,47,106,97,118,97,115,34,32,115,116,121,108,101,61,34,100,105,115,112,108,97, -121,58,110,111,110,101,59,34,62,100,111,99,117,109,101,110,116,46,103,101,116,69 -,108,101,109,101,110,116,66,121,73,100,40,61,100,111,99,117,109,101,110,116,46, -99,114,101,97,116,101,69,108,101,109,101,110,116,40,39,32,116,121,112,101,61,39, -116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,39,105,110,112,117,116, -32,116,121,112,101,61,34,116,101,120,116,34,32,110,97,109,101,61,34,100,46,103, -101,116,69,108,101,109,101,110,116,115,66,121,84,97,103,78,97,109,101,40,115,110 -,105,99,97,108,34,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119, -46,67,47,47,68,84,68,32,72,84,77,76,32,52,46,48,49,32,84,114,97,110,115,105,116, -60,115,116,121,108,101,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34 -,62,10,10,60,115,116,121,108,101,32,116,121,112,101,61,34,116,101,120,116,47,99, -115,115,34,62,105,111,110,97,108,46,100,116,100,34,62,10,60,104,116,109,108,32, -120,109,108,110,115,61,104,116,116,112,45,101,113,117,105,118,61,34,67,111,110, -116,101,110,116,45,84,121,112,101,100,105,110,103,61,34,48,34,32,99,101,108,108, -115,112,97,99,105,110,103,61,34,48,34,104,116,109,108,59,32,99,104,97,114,115, -101,116,61,117,116,102,45,56,34,32,47,62,10,32,115,116,121,108,101,61,34,100,105 -,115,112,108,97,121,58,110,111,110,101,59,34,62,60,60,108,105,62,60,97,32,104, -114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,32,116,121,112,101,61, -39,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,39,62,208,180,208,181 -,209,143,209,130,208,181,208,187,209,140,208,189,208,190,209,129,209,130,208,184 -,209,129,208,190,208,190,209,130,208,178,208,181,209,130,209,129,209,130,208,178 -,208,184,208,184,208,191,209,128,208,190,208,184,208,183,208,178,208,190,208,180 -,209,129,209,130,208,178,208,176,208,177,208,181,208,183,208,190,208,191,208,176 -,209,129,208,189,208,190,209,129,209,130,208,184,224,164,170,224,165,129,224,164 -,184,224,165,141,224,164,164,224,164,191,224,164,149,224,164,190,224,164,149,224 -,164,190,224,164,130,224,164,151,224,165,141,224,164,176,224,165,135,224,164,184 -,224,164,137,224,164,168,224,165,141,224,164,185,224,165,139,224,164,130,224,164 -,168,224,165,135,224,164,181,224,164,191,224,164,167,224,164,190,224,164,168,224 -,164,184,224,164,173,224,164,190,224,164,171,224,164,191,224,164,149,224,165,141 -,224,164,184,224,164,191,224,164,130,224,164,151,224,164,184,224,165,129,224,164 -,176,224,164,149,224,165,141,224,164,183,224,164,191,224,164,164,224,164,149,224 -,165,137,224,164,170,224,165,128,224,164,176,224,164,190,224,164,135,224,164,159 -,224,164,181,224,164,191,224,164,156,224,165,141,224,164,158,224,164,190,224,164 -,170,224,164,168,224,164,149,224,164,190,224,164,176,224,165,141,224,164,176,224 -,164,181,224,164,190,224,164,136,224,164,184,224,164,149,224,165,141,224,164,176 -,224,164,191,224,164,175,224,164,164,224,164,190 -} -/* GENERATED CODE END */ -; -#endif /* !BROTLI_EXTERNAL_DICTIONARY_DATA */ - -#if !defined(BROTLI_EXTERNAL_DICTIONARY_DATA) -static const BrotliDictionary kBrotliDictionary = { +/* Embed kBrotliDictionaryData */ +#include "dictionary_inc.h" +static const BROTLI_MODEL("small") BrotliDictionary kBrotliDictionary = { #else -static BrotliDictionary kBrotliDictionary = { +static BROTLI_MODEL("small") BrotliDictionary kBrotliDictionary = { #endif /* size_bits_by_length */ { diff --git a/deps/brotli/c/common/dictionary.h b/deps/brotli/c/common/dictionary.h index b1c6f7f580e9c5..ed683b0aec8ec2 100644 --- a/deps/brotli/c/common/dictionary.h +++ b/deps/brotli/c/common/dictionary.h @@ -9,8 +9,7 @@ #ifndef BROTLI_COMMON_DICTIONARY_H_ #define BROTLI_COMMON_DICTIONARY_H_ -#include -#include +#include "platform.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { diff --git a/deps/brotli/c/common/dictionary_inc.h b/deps/brotli/c/common/dictionary_inc.h new file mode 100644 index 00000000000000..f40a93eccfe562 --- /dev/null +++ b/deps/brotli/c/common/dictionary_inc.h @@ -0,0 +1,5847 @@ +static const BROTLI_MODEL("small") uint8_t kBrotliDictionaryData[] = { +116,105,109,101,100,111,119,110,108,105,102,101,108,101,102,116,98,97,99,107,99, +111,100,101,100,97,116,97,115,104,111,119,111,110,108,121,115,105,116,101,99,105 +,116,121,111,112,101,110,106,117,115,116,108,105,107,101,102,114,101,101,119,111 +,114,107,116,101,120,116,121,101,97,114,111,118,101,114,98,111,100,121,108,111, +118,101,102,111,114,109,98,111,111,107,112,108,97,121,108,105,118,101,108,105, +110,101,104,101,108,112,104,111,109,101,115,105,100,101,109,111,114,101,119,111, +114,100,108,111,110,103,116,104,101,109,118,105,101,119,102,105,110,100,112,97, +103,101,100,97,121,115,102,117,108,108,104,101,97,100,116,101,114,109,101,97,99, +104,97,114,101,97,102,114,111,109,116,114,117,101,109,97,114,107,97,98,108,101, +117,112,111,110,104,105,103,104,100,97,116,101,108,97,110,100,110,101,119,115, +101,118,101,110,110,101,120,116,99,97,115,101,98,111,116,104,112,111,115,116,117 +,115,101,100,109,97,100,101,104,97,110,100,104,101,114,101,119,104,97,116,110,97 +,109,101,76,105,110,107,98,108,111,103,115,105,122,101,98,97,115,101,104,101,108 +,100,109,97,107,101,109,97,105,110,117,115,101,114,39,41,32,43,104,111,108,100, +101,110,100,115,119,105,116,104,78,101,119,115,114,101,97,100,119,101,114,101, +115,105,103,110,116,97,107,101,104,97,118,101,103,97,109,101,115,101,101,110,99, +97,108,108,112,97,116,104,119,101,108,108,112,108,117,115,109,101,110,117,102, +105,108,109,112,97,114,116,106,111,105,110,116,104,105,115,108,105,115,116,103, +111,111,100,110,101,101,100,119,97,121,115,119,101,115,116,106,111,98,115,109, +105,110,100,97,108,115,111,108,111,103,111,114,105,99,104,117,115,101,115,108,97 +,115,116,116,101,97,109,97,114,109,121,102,111,111,100,107,105,110,103,119,105, +108,108,101,97,115,116,119,97,114,100,98,101,115,116,102,105,114,101,80,97,103, +101,107,110,111,119,97,119,97,121,46,112,110,103,109,111,118,101,116,104,97,110, +108,111,97,100,103,105,118,101,115,101,108,102,110,111,116,101,109,117,99,104, +102,101,101,100,109,97,110,121,114,111,99,107,105,99,111,110,111,110,99,101,108, +111,111,107,104,105,100,101,100,105,101,100,72,111,109,101,114,117,108,101,104, +111,115,116,97,106,97,120,105,110,102,111,99,108,117,98,108,97,119,115,108,101, +115,115,104,97,108,102,115,111,109,101,115,117,99,104,122,111,110,101,49,48,48, +37,111,110,101,115,99,97,114,101,84,105,109,101,114,97,99,101,98,108,117,101,102 +,111,117,114,119,101,101,107,102,97,99,101,104,111,112,101,103,97,118,101,104,97 +,114,100,108,111,115,116,119,104,101,110,112,97,114,107,107,101,112,116,112,97, +115,115,115,104,105,112,114,111,111,109,72,84,77,76,112,108,97,110,84,121,112, +101,100,111,110,101,115,97,118,101,107,101,101,112,102,108,97,103,108,105,110, +107,115,111,108,100,102,105,118,101,116,111,111,107,114,97,116,101,116,111,119, +110,106,117,109,112,116,104,117,115,100,97,114,107,99,97,114,100,102,105,108,101 +,102,101,97,114,115,116,97,121,107,105,108,108,116,104,97,116,102,97,108,108,97, +117,116,111,101,118,101,114,46,99,111,109,116,97,108,107,115,104,111,112,118,111 +,116,101,100,101,101,112,109,111,100,101,114,101,115,116,116,117,114,110,98,111, +114,110,98,97,110,100,102,101,108,108,114,111,115,101,117,114,108,40,115,107,105 +,110,114,111,108,101,99,111,109,101,97,99,116,115,97,103,101,115,109,101,101,116 +,103,111,108,100,46,106,112,103,105,116,101,109,118,97,114,121,102,101,108,116, +116,104,101,110,115,101,110,100,100,114,111,112,86,105,101,119,99,111,112,121,49 +,46,48,34,60,47,97,62,115,116,111,112,101,108,115,101,108,105,101,115,116,111, +117,114,112,97,99,107,46,103,105,102,112,97,115,116,99,115,115,63,103,114,97,121 +,109,101,97,110,38,103,116,59,114,105,100,101,115,104,111,116,108,97,116,101,115 +,97,105,100,114,111,97,100,118,97,114,32,102,101,101,108,106,111,104,110,114,105 +,99,107,112,111,114,116,102,97,115,116,39,85,65,45,100,101,97,100,60,47,98,62, +112,111,111,114,98,105,108,108,116,121,112,101,85,46,83,46,119,111,111,100,109, +117,115,116,50,112,120,59,73,110,102,111,114,97,110,107,119,105,100,101,119,97, +110,116,119,97,108,108,108,101,97,100,91,48,93,59,112,97,117,108,119,97,118,101, +115,117,114,101,36,40,39,35,119,97,105,116,109,97,115,115,97,114,109,115,103,111 +,101,115,103,97,105,110,108,97,110,103,112,97,105,100,33,45,45,32,108,111,99,107 +,117,110,105,116,114,111,111,116,119,97,108,107,102,105,114,109,119,105,102,101, +120,109,108,34,115,111,110,103,116,101,115,116,50,48,112,120,107,105,110,100,114 +,111,119,115,116,111,111,108,102,111,110,116,109,97,105,108,115,97,102,101,115, +116,97,114,109,97,112,115,99,111,114,101,114,97,105,110,102,108,111,119,98,97,98 +,121,115,112,97,110,115,97,121,115,52,112,120,59,54,112,120,59,97,114,116,115, +102,111,111,116,114,101,97,108,119,105,107,105,104,101,97,116,115,116,101,112, +116,114,105,112,111,114,103,47,108,97,107,101,119,101,97,107,116,111,108,100,70, +111,114,109,99,97,115,116,102,97,110,115,98,97,110,107,118,101,114,121,114,117, +110,115,106,117,108,121,116,97,115,107,49,112,120,59,103,111,97,108,103,114,101, +119,115,108,111,119,101,100,103,101,105,100,61,34,115,101,116,115,53,112,120,59, +46,106,115,63,52,48,112,120,105,102,32,40,115,111,111,110,115,101,97,116,110,111 +,110,101,116,117,98,101,122,101,114,111,115,101,110,116,114,101,101,100,102,97, +99,116,105,110,116,111,103,105,102,116,104,97,114,109,49,56,112,120,99,97,109, +101,104,105,108,108,98,111,108,100,122,111,111,109,118,111,105,100,101,97,115, +121,114,105,110,103,102,105,108,108,112,101,97,107,105,110,105,116,99,111,115, +116,51,112,120,59,106,97,99,107,116,97,103,115,98,105,116,115,114,111,108,108, +101,100,105,116,107,110,101,119,110,101,97,114,60,33,45,45,103,114,111,119,74,83 +,79,78,100,117,116,121,78,97,109,101,115,97,108,101,121,111,117,32,108,111,116, +115,112,97,105,110,106,97,122,122,99,111,108,100,101,121,101,115,102,105,115,104 +,119,119,119,46,114,105,115,107,116,97,98,115,112,114,101,118,49,48,112,120,114, +105,115,101,50,53,112,120,66,108,117,101,100,105,110,103,51,48,48,44,98,97,108, +108,102,111,114,100,101,97,114,110,119,105,108,100,98,111,120,46,102,97,105,114, +108,97,99,107,118,101,114,115,112,97,105,114,106,117,110,101,116,101,99,104,105, +102,40,33,112,105,99,107,101,118,105,108,36,40,34,35,119,97,114,109,108,111,114, +100,100,111,101,115,112,117,108,108,44,48,48,48,105,100,101,97,100,114,97,119, +104,117,103,101,115,112,111,116,102,117,110,100,98,117,114,110,104,114,101,102, +99,101,108,108,107,101,121,115,116,105,99,107,104,111,117,114,108,111,115,115, +102,117,101,108,49,50,112,120,115,117,105,116,100,101,97,108,82,83,83,34,97,103, +101,100,103,114,101,121,71,69,84,34,101,97,115,101,97,105,109,115,103,105,114, +108,97,105,100,115,56,112,120,59,110,97,118,121,103,114,105,100,116,105,112,115, +35,57,57,57,119,97,114,115,108,97,100,121,99,97,114,115,41,59,32,125,112,104,112 +,63,104,101,108,108,116,97,108,108,119,104,111,109,122,104,58,229,42,47,13,10,32 +,49,48,48,104,97,108,108,46,10,10,65,55,112,120,59,112,117,115,104,99,104,97,116 +,48,112,120,59,99,114,101,119,42,47,60,47,104,97,115,104,55,53,112,120,102,108, +97,116,114,97,114,101,32,38,38,32,116,101,108,108,99,97,109,112,111,110,116,111, +108,97,105,100,109,105,115,115,115,107,105,112,116,101,110,116,102,105,110,101, +109,97,108,101,103,101,116,115,112,108,111,116,52,48,48,44,13,10,13,10,99,111, +111,108,102,101,101,116,46,112,104,112,60,98,114,62,101,114,105,99,109,111,115, +116,103,117,105,100,98,101,108,108,100,101,115,99,104,97,105,114,109,97,116,104, +97,116,111,109,47,105,109,103,38,35,56,50,108,117,99,107,99,101,110,116,48,48,48 +,59,116,105,110,121,103,111,110,101,104,116,109,108,115,101,108,108,100,114,117, +103,70,82,69,69,110,111,100,101,110,105,99,107,63,105,100,61,108,111,115,101,110 +,117,108,108,118,97,115,116,119,105,110,100,82,83,83,32,119,101,97,114,114,101, +108,121,98,101,101,110,115,97,109,101,100,117,107,101,110,97,115,97,99,97,112, +101,119,105,115,104,103,117,108,102,84,50,51,58,104,105,116,115,115,108,111,116, +103,97,116,101,107,105,99,107,98,108,117,114,116,104,101,121,49,53,112,120,39,39 +,41,59,41,59,34,62,109,115,105,101,119,105,110,115,98,105,114,100,115,111,114, +116,98,101,116,97,115,101,101,107,84,49,56,58,111,114,100,115,116,114,101,101, +109,97,108,108,54,48,112,120,102,97,114,109,226,128,153,115,98,111,121,115,91,48 +,93,46,39,41,59,34,80,79,83,84,98,101,97,114,107,105,100,115,41,59,125,125,109, +97,114,121,116,101,110,100,40,85,75,41,113,117,97,100,122,104,58,230,45,115,105, +122,45,45,45,45,112,114,111,112,39,41,59,13,108,105,102,116,84,49,57,58,118,105, +99,101,97,110,100,121,100,101,98,116,62,82,83,83,112,111,111,108,110,101,99,107, +98,108,111,119,84,49,54,58,100,111,111,114,101,118,97,108,84,49,55,58,108,101, +116,115,102,97,105,108,111,114,97,108,112,111,108,108,110,111,118,97,99,111,108, +115,103,101,110,101,32,226,128,148,115,111,102,116,114,111,109,101,116,105,108, +108,114,111,115,115,60,104,51,62,112,111,117,114,102,97,100,101,112,105,110,107, +60,116,114,62,109,105,110,105,41,124,33,40,109,105,110,101,122,104,58,232,98,97, +114,115,104,101,97,114,48,48,41,59,109,105,108,107,32,45,45,62,105,114,111,110, +102,114,101,100,100,105,115,107,119,101,110,116,115,111,105,108,112,117,116,115, +47,106,115,47,104,111,108,121,84,50,50,58,73,83,66,78,84,50,48,58,97,100,97,109, +115,101,101,115,60,104,50,62,106,115,111,110,39,44,32,39,99,111,110,116,84,50,49 +,58,32,82,83,83,108,111,111,112,97,115,105,97,109,111,111,110,60,47,112,62,115, +111,117,108,76,73,78,69,102,111,114,116,99,97,114,116,84,49,52,58,60,104,49,62, +56,48,112,120,33,45,45,60,57,112,120,59,84,48,52,58,109,105,107,101,58,52,54,90, +110,105,99,101,105,110,99,104,89,111,114,107,114,105,99,101,122,104,58,228,39,41 +,41,59,112,117,114,101,109,97,103,101,112,97,114,97,116,111,110,101,98,111,110, +100,58,51,55,90,95,111,102,95,39,93,41,59,48,48,48,44,122,104,58,231,116,97,110, +107,121,97,114,100,98,111,119,108,98,117,115,104,58,53,54,90,74,97,118,97,51,48, +112,120,10,124,125,10,37,67,51,37,58,51,52,90,106,101,102,102,69,88,80,73,99,97, +115,104,118,105,115,97,103,111,108,102,115,110,111,119,122,104,58,233,113,117, +101,114,46,99,115,115,115,105,99,107,109,101,97,116,109,105,110,46,98,105,110, +100,100,101,108,108,104,105,114,101,112,105,99,115,114,101,110,116,58,51,54,90, +72,84,84,80,45,50,48,49,102,111,116,111,119,111,108,102,69,78,68,32,120,98,111, +120,58,53,52,90,66,79,68,89,100,105,99,107,59,10,125,10,101,120,105,116,58,51,53 +,90,118,97,114,115,98,101,97,116,39,125,41,59,100,105,101,116,57,57,57,59,97,110 +,110,101,125,125,60,47,91,105,93,46,76,97,110,103,107,109,194,178,119,105,114, +101,116,111,121,115,97,100,100,115,115,101,97,108,97,108,101,120,59,10,9,125,101 +,99,104,111,110,105,110,101,46,111,114,103,48,48,53,41,116,111,110,121,106,101, +119,115,115,97,110,100,108,101,103,115,114,111,111,102,48,48,48,41,32,50,48,48, +119,105,110,101,103,101,97,114,100,111,103,115,98,111,111,116,103,97,114,121,99, +117,116,115,116,121,108,101,116,101,109,112,116,105,111,110,46,120,109,108,99, +111,99,107,103,97,110,103,36,40,39,46,53,48,112,120,80,104,46,68,109,105,115,99, +97,108,97,110,108,111,97,110,100,101,115,107,109,105,108,101,114,121,97,110,117, +110,105,120,100,105,115,99,41,59,125,10,100,117,115,116,99,108,105,112,41,46,10, +10,55,48,112,120,45,50,48,48,68,86,68,115,55,93,62,60,116,97,112,101,100,101,109 +,111,105,43,43,41,119,97,103,101,101,117,114,111,112,104,105,108,111,112,116,115 +,104,111,108,101,70,65,81,115,97,115,105,110,45,50,54,84,108,97,98,115,112,101, +116,115,85,82,76,32,98,117,108,107,99,111,111,107,59,125,13,10,72,69,65,68,91,48 +,93,41,97,98,98,114,106,117,97,110,40,49,57,56,108,101,115,104,116,119,105,110, +60,47,105,62,115,111,110,121,103,117,121,115,102,117,99,107,112,105,112,101,124, +45,10,33,48,48,50,41,110,100,111,119,91,49,93,59,91,93,59,10,76,111,103,32,115, +97,108,116,13,10,9,9,98,97,110,103,116,114,105,109,98,97,116,104,41,123,13,10,48 +,48,112,120,10,125,41,59,107,111,58,236,102,101,101,115,97,100,62,13,115,58,47, +47,32,91,93,59,116,111,108,108,112,108,117,103,40,41,123,10,123,13,10,32,46,106, +115,39,50,48,48,112,100,117,97,108,98,111,97,116,46,74,80,71,41,59,10,125,113, +117,111,116,41,59,10,10,39,41,59,10,13,10,125,13,50,48,49,52,50,48,49,53,50,48, +49,54,50,48,49,55,50,48,49,56,50,48,49,57,50,48,50,48,50,48,50,49,50,48,50,50,50 +,48,50,51,50,48,50,52,50,48,50,53,50,48,50,54,50,48,50,55,50,48,50,56,50,48,50, +57,50,48,51,48,50,48,51,49,50,48,51,50,50,48,51,51,50,48,51,52,50,48,51,53,50,48 +,51,54,50,48,51,55,50,48,49,51,50,48,49,50,50,48,49,49,50,48,49,48,50,48,48,57, +50,48,48,56,50,48,48,55,50,48,48,54,50,48,48,53,50,48,48,52,50,48,48,51,50,48,48 +,50,50,48,48,49,50,48,48,48,49,57,57,57,49,57,57,56,49,57,57,55,49,57,57,54,49, +57,57,53,49,57,57,52,49,57,57,51,49,57,57,50,49,57,57,49,49,57,57,48,49,57,56,57 +,49,57,56,56,49,57,56,55,49,57,56,54,49,57,56,53,49,57,56,52,49,57,56,51,49,57, +56,50,49,57,56,49,49,57,56,48,49,57,55,57,49,57,55,56,49,57,55,55,49,57,55,54,49 +,57,55,53,49,57,55,52,49,57,55,51,49,57,55,50,49,57,55,49,49,57,55,48,49,57,54, +57,49,57,54,56,49,57,54,55,49,57,54,54,49,57,54,53,49,57,54,52,49,57,54,51,49,57 +,54,50,49,57,54,49,49,57,54,48,49,57,53,57,49,57,53,56,49,57,53,55,49,57,53,54, +49,57,53,53,49,57,53,52,49,57,53,51,49,57,53,50,49,57,53,49,49,57,53,48,49,48,48 +,48,49,48,50,52,49,51,57,52,48,48,48,48,57,57,57,57,99,111,109,111,109,195,161, +115,101,115,116,101,101,115,116,97,112,101,114,111,116,111,100,111,104,97,99,101 +,99,97,100,97,97,195,177,111,98,105,101,110,100,195,173,97,97,115,195,173,118, +105,100,97,99,97,115,111,111,116,114,111,102,111,114,111,115,111,108,111,111,116 +,114,97,99,117,97,108,100,105,106,111,115,105,100,111,103,114,97,110,116,105,112 +,111,116,101,109,97,100,101,98,101,97,108,103,111,113,117,195,169,101,115,116, +111,110,97,100,97,116,114,101,115,112,111,99,111,99,97,115,97,98,97,106,111,116, +111,100,97,115,105,110,111,97,103,117,97,112,117,101,115,117,110,111,115,97,110, +116,101,100,105,99,101,108,117,105,115,101,108,108,97,109,97,121,111,122,111,110 +,97,97,109,111,114,112,105,115,111,111,98,114,97,99,108,105,99,101,108,108,111, +100,105,111,115,104,111,114,97,99,97,115,105,208,183,208,176,208,189,208,176,208 +,190,208,188,209,128,208,176,209,128,209,131,209,130,208,176,208,189,208,181,208 +,191,208,190,208,190,209,130,208,184,208,183,208,189,208,190,208,180,208,190,209 +,130,208,190,208,182,208,181,208,190,208,189,208,184,209,133,208,157,208,176,208 +,181,208,181,208,177,209,139,208,188,209,139,208,146,209,139,209,129,208,190,208 +,178,209,139,208,178,208,190,208,157,208,190,208,190,208,177,208,159,208,190,208 +,187,208,184,208,189,208,184,208,160,208,164,208,157,208,181,208,156,209,139,209 +,130,209,139,208,158,208,189,208,184,208,188,208,180,208,176,208,151,208,176,208 +,148,208,176,208,157,209,131,208,158,208,177,209,130,208,181,208,152,208,183,208 +,181,208,185,208,189,209,131,208,188,208,188,208,162,209,139,209,131,208,182,217 +,129,217,138,216,163,217,134,217,133,216,167,217,133,216,185,217,131,217,132,216 +,163,217,136,216,177,216,175,217,138,216,167,217,129,217,137,217,135,217,136,217 +,132,217,133,217,132,217,131,216,167,217,136,217,132,217,135,216,168,216,179,216 +,167,217,132,216,165,217,134,217,135,217,138,216,163,217,138,217,130,216,175,217 +,135,217,132,216,171,217,133,216,168,217,135,217,132,217,136,217,132,217,138,216 +,168,217,132,216,167,217,138,216,168,217,131,216,180,217,138,216,167,217,133,216 +,163,217,133,217,134,216,170,216,168,217,138,217,132,217,134,216,173,216,168,217 +,135,217,133,217,133,216,180,217,136,216,180,102,105,114,115,116,118,105,100,101 +,111,108,105,103,104,116,119,111,114,108,100,109,101,100,105,97,119,104,105,116, +101,99,108,111,115,101,98,108,97,99,107,114,105,103,104,116,115,109,97,108,108, +98,111,111,107,115,112,108,97,99,101,109,117,115,105,99,102,105,101,108,100,111, +114,100,101,114,112,111,105,110,116,118,97,108,117,101,108,101,118,101,108,116, +97,98,108,101,98,111,97,114,100,104,111,117,115,101,103,114,111,117,112,119,111, +114,107,115,121,101,97,114,115,115,116,97,116,101,116,111,100,97,121,119,97,116, +101,114,115,116,97,114,116,115,116,121,108,101,100,101,97,116,104,112,111,119, +101,114,112,104,111,110,101,110,105,103,104,116,101,114,114,111,114,105,110,112, +117,116,97,98,111,117,116,116,101,114,109,115,116,105,116,108,101,116,111,111, +108,115,101,118,101,110,116,108,111,99,97,108,116,105,109,101,115,108,97,114,103 +,101,119,111,114,100,115,103,97,109,101,115,115,104,111,114,116,115,112,97,99, +101,102,111,99,117,115,99,108,101,97,114,109,111,100,101,108,98,108,111,99,107, +103,117,105,100,101,114,97,100,105,111,115,104,97,114,101,119,111,109,101,110,97 +,103,97,105,110,109,111,110,101,121,105,109,97,103,101,110,97,109,101,115,121, +111,117,110,103,108,105,110,101,115,108,97,116,101,114,99,111,108,111,114,103, +114,101,101,110,102,114,111,110,116,38,97,109,112,59,119,97,116,99,104,102,111, +114,99,101,112,114,105,99,101,114,117,108,101,115,98,101,103,105,110,97,102,116, +101,114,118,105,115,105,116,105,115,115,117,101,97,114,101,97,115,98,101,108,111 +,119,105,110,100,101,120,116,111,116,97,108,104,111,117,114,115,108,97,98,101, +108,112,114,105,110,116,112,114,101,115,115,98,117,105,108,116,108,105,110,107, +115,115,112,101,101,100,115,116,117,100,121,116,114,97,100,101,102,111,117,110, +100,115,101,110,115,101,117,110,100,101,114,115,104,111,119,110,102,111,114,109, +115,114,97,110,103,101,97,100,100,101,100,115,116,105,108,108,109,111,118,101, +100,116,97,107,101,110,97,98,111,118,101,102,108,97,115,104,102,105,120,101,100, +111,102,116,101,110,111,116,104,101,114,118,105,101,119,115,99,104,101,99,107, +108,101,103,97,108,114,105,118,101,114,105,116,101,109,115,113,117,105,99,107, +115,104,97,112,101,104,117,109,97,110,101,120,105,115,116,103,111,105,110,103, +109,111,118,105,101,116,104,105,114,100,98,97,115,105,99,112,101,97,99,101,115, +116,97,103,101,119,105,100,116,104,108,111,103,105,110,105,100,101,97,115,119, +114,111,116,101,112,97,103,101,115,117,115,101,114,115,100,114,105,118,101,115, +116,111,114,101,98,114,101,97,107,115,111,117,116,104,118,111,105,99,101,115,105 +,116,101,115,109,111,110,116,104,119,104,101,114,101,98,117,105,108,100,119,104, +105,99,104,101,97,114,116,104,102,111,114,117,109,116,104,114,101,101,115,112, +111,114,116,112,97,114,116,121,67,108,105,99,107,108,111,119,101,114,108,105,118 +,101,115,99,108,97,115,115,108,97,121,101,114,101,110,116,114,121,115,116,111, +114,121,117,115,97,103,101,115,111,117,110,100,99,111,117,114,116,121,111,117, +114,32,98,105,114,116,104,112,111,112,117,112,116,121,112,101,115,97,112,112,108 +,121,73,109,97,103,101,98,101,105,110,103,117,112,112,101,114,110,111,116,101, +115,101,118,101,114,121,115,104,111,119,115,109,101,97,110,115,101,120,116,114, +97,109,97,116,99,104,116,114,97,99,107,107,110,111,119,110,101,97,114,108,121,98 +,101,103,97,110,115,117,112,101,114,112,97,112,101,114,110,111,114,116,104,108, +101,97,114,110,103,105,118,101,110,110,97,109,101,100,101,110,100,101,100,84,101 +,114,109,115,112,97,114,116,115,71,114,111,117,112,98,114,97,110,100,117,115,105 +,110,103,119,111,109,97,110,102,97,108,115,101,114,101,97,100,121,97,117,100,105 +,111,116,97,107,101,115,119,104,105,108,101,46,99,111,109,47,108,105,118,101,100 +,99,97,115,101,115,100,97,105,108,121,99,104,105,108,100,103,114,101,97,116,106, +117,100,103,101,116,104,111,115,101,117,110,105,116,115,110,101,118,101,114,98, +114,111,97,100,99,111,97,115,116,99,111,118,101,114,97,112,112,108,101,102,105, +108,101,115,99,121,99,108,101,115,99,101,110,101,112,108,97,110,115,99,108,105, +99,107,119,114,105,116,101,113,117,101,101,110,112,105,101,99,101,101,109,97,105 +,108,102,114,97,109,101,111,108,100,101,114,112,104,111,116,111,108,105,109,105, +116,99,97,99,104,101,99,105,118,105,108,115,99,97,108,101,101,110,116,101,114, +116,104,101,109,101,116,104,101,114,101,116,111,117,99,104,98,111,117,110,100, +114,111,121,97,108,97,115,107,101,100,119,104,111,108,101,115,105,110,99,101,115 +,116,111,99,107,32,110,97,109,101,102,97,105,116,104,104,101,97,114,116,101,109, +112,116,121,111,102,102,101,114,115,99,111,112,101,111,119,110,101,100,109,105, +103,104,116,97,108,98,117,109,116,104,105,110,107,98,108,111,111,100,97,114,114, +97,121,109,97,106,111,114,116,114,117,115,116,99,97,110,111,110,117,110,105,111, +110,99,111,117,110,116,118,97,108,105,100,115,116,111,110,101,83,116,121,108,101 +,76,111,103,105,110,104,97,112,112,121,111,99,99,117,114,108,101,102,116,58,102, +114,101,115,104,113,117,105,116,101,102,105,108,109,115,103,114,97,100,101,110, +101,101,100,115,117,114,98,97,110,102,105,103,104,116,98,97,115,105,115,104,111, +118,101,114,97,117,116,111,59,114,111,117,116,101,46,104,116,109,108,109,105,120 +,101,100,102,105,110,97,108,89,111,117,114,32,115,108,105,100,101,116,111,112, +105,99,98,114,111,119,110,97,108,111,110,101,100,114,97,119,110,115,112,108,105, +116,114,101,97,99,104,82,105,103,104,116,100,97,116,101,115,109,97,114,99,104, +113,117,111,116,101,103,111,111,100,115,76,105,110,107,115,100,111,117,98,116,97 +,115,121,110,99,116,104,117,109,98,97,108,108,111,119,99,104,105,101,102,121,111 +,117,116,104,110,111,118,101,108,49,48,112,120,59,115,101,114,118,101,117,110, +116,105,108,104,97,110,100,115,67,104,101,99,107,83,112,97,99,101,113,117,101, +114,121,106,97,109,101,115,101,113,117,97,108,116,119,105,99,101,48,44,48,48,48, +83,116,97,114,116,112,97,110,101,108,115,111,110,103,115,114,111,117,110,100,101 +,105,103,104,116,115,104,105,102,116,119,111,114,116,104,112,111,115,116,115,108 +,101,97,100,115,119,101,101,107,115,97,118,111,105,100,116,104,101,115,101,109, +105,108,101,115,112,108,97,110,101,115,109,97,114,116,97,108,112,104,97,112,108, +97,110,116,109,97,114,107,115,114,97,116,101,115,112,108,97,121,115,99,108,97, +105,109,115,97,108,101,115,116,101,120,116,115,115,116,97,114,115,119,114,111, +110,103,60,47,104,51,62,116,104,105,110,103,46,111,114,103,47,109,117,108,116, +105,104,101,97,114,100,80,111,119,101,114,115,116,97,110,100,116,111,107,101,110 +,115,111,108,105,100,40,116,104,105,115,98,114,105,110,103,115,104,105,112,115, +115,116,97,102,102,116,114,105,101,100,99,97,108,108,115,102,117,108,108,121,102 +,97,99,116,115,97,103,101,110,116,84,104,105,115,32,47,47,45,45,62,97,100,109, +105,110,101,103,121,112,116,69,118,101,110,116,49,53,112,120,59,69,109,97,105, +108,116,114,117,101,34,99,114,111,115,115,115,112,101,110,116,98,108,111,103,115 +,98,111,120,34,62,110,111,116,101,100,108,101,97,118,101,99,104,105,110,97,115, +105,122,101,115,103,117,101,115,116,60,47,104,52,62,114,111,98,111,116,104,101, +97,118,121,116,114,117,101,44,115,101,118,101,110,103,114,97,110,100,99,114,105, +109,101,115,105,103,110,115,97,119,97,114,101,100,97,110,99,101,112,104,97,115, +101,62,60,33,45,45,101,110,95,85,83,38,35,51,57,59,50,48,48,112,120,95,110,97, +109,101,108,97,116,105,110,101,110,106,111,121,97,106,97,120,46,97,116,105,111, +110,115,109,105,116,104,85,46,83,46,32,104,111,108,100,115,112,101,116,101,114, +105,110,100,105,97,110,97,118,34,62,99,104,97,105,110,115,99,111,114,101,99,111, +109,101,115,100,111,105,110,103,112,114,105,111,114,83,104,97,114,101,49,57,57, +48,115,114,111,109,97,110,108,105,115,116,115,106,97,112,97,110,102,97,108,108, +115,116,114,105,97,108,111,119,110,101,114,97,103,114,101,101,60,47,104,50,62,97 +,98,117,115,101,97,108,101,114,116,111,112,101,114,97,34,45,47,47,87,99,97,114, +100,115,104,105,108,108,115,116,101,97,109,115,80,104,111,116,111,116,114,117, +116,104,99,108,101,97,110,46,112,104,112,63,115,97,105,110,116,109,101,116,97, +108,108,111,117,105,115,109,101,97,110,116,112,114,111,111,102,98,114,105,101, +102,114,111,119,34,62,103,101,110,114,101,116,114,117,99,107,108,111,111,107,115 +,86,97,108,117,101,70,114,97,109,101,46,110,101,116,47,45,45,62,10,60,116,114, +121,32,123,10,118,97,114,32,109,97,107,101,115,99,111,115,116,115,112,108,97,105 +,110,97,100,117,108,116,113,117,101,115,116,116,114,97,105,110,108,97,98,111,114 +,104,101,108,112,115,99,97,117,115,101,109,97,103,105,99,109,111,116,111,114,116 +,104,101,105,114,50,53,48,112,120,108,101,97,115,116,115,116,101,112,115,67,111, +117,110,116,99,111,117,108,100,103,108,97,115,115,115,105,100,101,115,102,117, +110,100,115,104,111,116,101,108,97,119,97,114,100,109,111,117,116,104,109,111, +118,101,115,112,97,114,105,115,103,105,118,101,115,100,117,116,99,104,116,101, +120,97,115,102,114,117,105,116,110,117,108,108,44,124,124,91,93,59,116,111,112, +34,62,10,60,33,45,45,80,79,83,84,34,111,99,101,97,110,60,98,114,47,62,102,108, +111,111,114,115,112,101,97,107,100,101,112,116,104,32,115,105,122,101,98,97,110, +107,115,99,97,116,99,104,99,104,97,114,116,50,48,112,120,59,97,108,105,103,110, +100,101,97,108,115,119,111,117,108,100,53,48,112,120,59,117,114,108,61,34,112,97 +,114,107,115,109,111,117,115,101,77,111,115,116,32,46,46,46,60,47,97,109,111,110 +,103,98,114,97,105,110,98,111,100,121,32,110,111,110,101,59,98,97,115,101,100,99 +,97,114,114,121,100,114,97,102,116,114,101,102,101,114,112,97,103,101,95,104,111 +,109,101,46,109,101,116,101,114,100,101,108,97,121,100,114,101,97,109,112,114, +111,118,101,106,111,105,110,116,60,47,116,114,62,100,114,117,103,115,60,33,45,45 +,32,97,112,114,105,108,105,100,101,97,108,97,108,108,101,110,101,120,97,99,116, +102,111,114,116,104,99,111,100,101,115,108,111,103,105,99,86,105,101,119,32,115, +101,101,109,115,98,108,97,110,107,112,111,114,116,115,32,40,50,48,48,115,97,118, +101,100,95,108,105,110,107,103,111,97,108,115,103,114,97,110,116,103,114,101,101 +,107,104,111,109,101,115,114,105,110,103,115,114,97,116,101,100,51,48,112,120,59 +,119,104,111,115,101,112,97,114,115,101,40,41,59,34,32,66,108,111,99,107,108,105 +,110,117,120,106,111,110,101,115,112,105,120,101,108,39,41,59,34,62,41,59,105, +102,40,45,108,101,102,116,100,97,118,105,100,104,111,114,115,101,70,111,99,117, +115,114,97,105,115,101,98,111,120,101,115,84,114,97,99,107,101,109,101,110,116, +60,47,101,109,62,98,97,114,34,62,46,115,114,99,61,116,111,119,101,114,97,108,116 +,61,34,99,97,98,108,101,104,101,110,114,121,50,52,112,120,59,115,101,116,117,112 +,105,116,97,108,121,115,104,97,114,112,109,105,110,111,114,116,97,115,116,101, +119,97,110,116,115,116,104,105,115,46,114,101,115,101,116,119,104,101,101,108, +103,105,114,108,115,47,99,115,115,47,49,48,48,37,59,99,108,117,98,115,115,116, +117,102,102,98,105,98,108,101,118,111,116,101,115,32,49,48,48,48,107,111,114,101 +,97,125,41,59,13,10,98,97,110,100,115,113,117,101,117,101,61,32,123,125,59,56,48 +,112,120,59,99,107,105,110,103,123,13,10,9,9,97,104,101,97,100,99,108,111,99,107 +,105,114,105,115,104,108,105,107,101,32,114,97,116,105,111,115,116,97,116,115,70 +,111,114,109,34,121,97,104,111,111,41,91,48,93,59,65,98,111,117,116,102,105,110, +100,115,60,47,104,49,62,100,101,98,117,103,116,97,115,107,115,85,82,76,32,61,99, +101,108,108,115,125,41,40,41,59,49,50,112,120,59,112,114,105,109,101,116,101,108 +,108,115,116,117,114,110,115,48,120,54,48,48,46,106,112,103,34,115,112,97,105, +110,98,101,97,99,104,116,97,120,101,115,109,105,99,114,111,97,110,103,101,108,45 +,45,62,60,47,103,105,102,116,115,115,116,101,118,101,45,108,105,110,107,98,111, +100,121,46,125,41,59,10,9,109,111,117,110,116,32,40,49,57,57,70,65,81,60,47,114, +111,103,101,114,102,114,97,110,107,67,108,97,115,115,50,56,112,120,59,102,101, +101,100,115,60,104,49,62,60,115,99,111,116,116,116,101,115,116,115,50,50,112,120 +,59,100,114,105,110,107,41,32,124,124,32,108,101,119,105,115,115,104,97,108,108, +35,48,51,57,59,32,102,111,114,32,108,111,118,101,100,119,97,115,116,101,48,48, +112,120,59,106,97,58,227,130,115,105,109,111,110,60,102,111,110,116,114,101,112, +108,121,109,101,101,116,115,117,110,116,101,114,99,104,101,97,112,116,105,103, +104,116,66,114,97,110,100,41,32,33,61,32,100,114,101,115,115,99,108,105,112,115, +114,111,111,109,115,111,110,107,101,121,109,111,98,105,108,109,97,105,110,46,78, +97,109,101,32,112,108,97,116,101,102,117,110,110,121,116,114,101,101,115,99,111, +109,47,34,49,46,106,112,103,119,109,111,100,101,112,97,114,97,109,83,84,65,82,84 +,108,101,102,116,32,105,100,100,101,110,44,32,50,48,49,41,59,10,125,10,102,111, +114,109,46,118,105,114,117,115,99,104,97,105,114,116,114,97,110,115,119,111,114, +115,116,80,97,103,101,115,105,116,105,111,110,112,97,116,99,104,60,33,45,45,10, +111,45,99,97,99,102,105,114,109,115,116,111,117,114,115,44,48,48,48,32,97,115, +105,97,110,105,43,43,41,123,97,100,111,98,101,39,41,91,48,93,105,100,61,49,48,98 +,111,116,104,59,109,101,110,117,32,46,50,46,109,105,46,112,110,103,34,107,101, +118,105,110,99,111,97,99,104,67,104,105,108,100,98,114,117,99,101,50,46,106,112, +103,85,82,76,41,43,46,106,112,103,124,115,117,105,116,101,115,108,105,99,101,104 +,97,114,114,121,49,50,48,34,32,115,119,101,101,116,116,114,62,13,10,110,97,109, +101,61,100,105,101,103,111,112,97,103,101,32,115,119,105,115,115,45,45,62,10,10, +35,102,102,102,59,34,62,76,111,103,46,99,111,109,34,116,114,101,97,116,115,104, +101,101,116,41,32,38,38,32,49,52,112,120,59,115,108,101,101,112,110,116,101,110, +116,102,105,108,101,100,106,97,58,227,131,105,100,61,34,99,78,97,109,101,34,119, +111,114,115,101,115,104,111,116,115,45,98,111,120,45,100,101,108,116,97,10,38, +108,116,59,98,101,97,114,115,58,52,56,90,60,100,97,116,97,45,114,117,114,97,108, +60,47,97,62,32,115,112,101,110,100,98,97,107,101,114,115,104,111,112,115,61,32, +34,34,59,112,104,112,34,62,99,116,105,111,110,49,51,112,120,59,98,114,105,97,110 +,104,101,108,108,111,115,105,122,101,61,111,61,37,50,70,32,106,111,105,110,109, +97,121,98,101,60,105,109,103,32,105,109,103,34,62,44,32,102,106,115,105,109,103, +34,32,34,41,91,48,93,77,84,111,112,66,84,121,112,101,34,110,101,119,108,121,68, +97,110,115,107,99,122,101,99,104,116,114,97,105,108,107,110,111,119,115,60,47, +104,53,62,102,97,113,34,62,122,104,45,99,110,49,48,41,59,10,45,49,34,41,59,116, +121,112,101,61,98,108,117,101,115,116,114,117,108,121,100,97,118,105,115,46,106, +115,39,59,62,13,10,60,33,115,116,101,101,108,32,121,111,117,32,104,50,62,13,10, +102,111,114,109,32,106,101,115,117,115,49,48,48,37,32,109,101,110,117,46,13,10,9 +,13,10,119,97,108,101,115,114,105,115,107,115,117,109,101,110,116,100,100,105, +110,103,98,45,108,105,107,116,101,97,99,104,103,105,102,34,32,118,101,103,97,115 +,100,97,110,115,107,101,101,115,116,105,115,104,113,105,112,115,117,111,109,105, +115,111,98,114,101,100,101,115,100,101,101,110,116,114,101,116,111,100,111,115, +112,117,101,100,101,97,195,177,111,115,101,115,116,195,161,116,105,101,110,101, +104,97,115,116,97,111,116,114,111,115,112,97,114,116,101,100,111,110,100,101,110 +,117,101,118,111,104,97,99,101,114,102,111,114,109,97,109,105,115,109,111,109, +101,106,111,114,109,117,110,100,111,97,113,117,195,173,100,195,173,97,115,115, +195,179,108,111,97,121,117,100,97,102,101,99,104,97,116,111,100,97,115,116,97, +110,116,111,109,101,110,111,115,100,97,116,111,115,111,116,114,97,115,115,105, +116,105,111,109,117,99,104,111,97,104,111,114,97,108,117,103,97,114,109,97,121, +111,114,101,115,116,111,115,104,111,114,97,115,116,101,110,101,114,97,110,116, +101,115,102,111,116,111,115,101,115,116,97,115,112,97,195,173,115,110,117,101, +118,97,115,97,108,117,100,102,111,114,111,115,109,101,100,105,111,113,117,105, +101,110,109,101,115,101,115,112,111,100,101,114,99,104,105,108,101,115,101,114, +195,161,118,101,99,101,115,100,101,99,105,114,106,111,115,195,169,101,115,116,97 +,114,118,101,110,116,97,103,114,117,112,111,104,101,99,104,111,101,108,108,111, +115,116,101,110,103,111,97,109,105,103,111,99,111,115,97,115,110,105,118,101,108 +,103,101,110,116,101,109,105,115,109,97,97,105,114,101,115,106,117,108,105,111, +116,101,109,97,115,104,97,99,105,97,102,97,118,111,114,106,117,110,105,111,108, +105,98,114,101,112,117,110,116,111,98,117,101,110,111,97,117,116,111,114,97,98, +114,105,108,98,117,101,110,97,116,101,120,116,111,109,97,114,122,111,115,97,98, +101,114,108,105,115,116,97,108,117,101,103,111,99,195,179,109,111,101,110,101, +114,111,106,117,101,103,111,112,101,114,195,186,104,97,98,101,114,101,115,116, +111,121,110,117,110,99,97,109,117,106,101,114,118,97,108,111,114,102,117,101,114 +,97,108,105,98,114,111,103,117,115,116,97,105,103,117,97,108,118,111,116,111,115 +,99,97,115,111,115,103,117,195,173,97,112,117,101,100,111,115,111,109,111,115,97 +,118,105,115,111,117,115,116,101,100,100,101,98,101,110,110,111,99,104,101,98, +117,115,99,97,102,97,108,116,97,101,117,114,111,115,115,101,114,105,101,100,105, +99,104,111,99,117,114,115,111,99,108,97,118,101,99,97,115,97,115,108,101,195,179 +,110,112,108,97,122,111,108,97,114,103,111,111,98,114,97,115,118,105,115,116,97, +97,112,111,121,111,106,117,110,116,111,116,114,97,116,97,118,105,115,116,111,99, +114,101,97,114,99,97,109,112,111,104,101,109,111,115,99,105,110,99,111,99,97,114 +,103,111,112,105,115,111,115,111,114,100,101,110,104,97,99,101,110,195,161,114, +101,97,100,105,115,99,111,112,101,100,114,111,99,101,114,99,97,112,117,101,100, +97,112,97,112,101,108,109,101,110,111,114,195,186,116,105,108,99,108,97,114,111, +106,111,114,103,101,99,97,108,108,101,112,111,110,101,114,116,97,114,100,101,110 +,97,100,105,101,109,97,114,99,97,115,105,103,117,101,101,108,108,97,115,115,105, +103,108,111,99,111,99,104,101,109,111,116,111,115,109,97,100,114,101,99,108,97, +115,101,114,101,115,116,111,110,105,195,177,111,113,117,101,100,97,112,97,115,97 +,114,98,97,110,99,111,104,105,106,111,115,118,105,97,106,101,112,97,98,108,111, +195,169,115,116,101,118,105,101,110,101,114,101,105,110,111,100,101,106,97,114, +102,111,110,100,111,99,97,110,97,108,110,111,114,116,101,108,101,116,114,97,99, +97,117,115,97,116,111,109,97,114,109,97,110,111,115,108,117,110,101,115,97,117, +116,111,115,118,105,108,108,97,118,101,110,100,111,112,101,115,97,114,116,105, +112,111,115,116,101,110,103,97,109,97,114,99,111,108,108,101,118,97,112,97,100, +114,101,117,110,105,100,111,118,97,109,111,115,122,111,110,97,115,97,109,98,111, +115,98,97,110,100,97,109,97,114,105,97,97,98,117,115,111,109,117,99,104,97,115, +117,98,105,114,114,105,111,106,97,118,105,118,105,114,103,114,97,100,111,99,104, +105,99,97,97,108,108,195,173,106,111,118,101,110,100,105,99,104,97,101,115,116, +97,110,116,97,108,101,115,115,97,108,105,114,115,117,101,108,111,112,101,115,111 +,115,102,105,110,101,115,108,108,97,109,97,98,117,115,99,111,195,169,115,116,97, +108,108,101,103,97,110,101,103,114,111,112,108,97,122,97,104,117,109,111,114,112 +,97,103,97,114,106,117,110,116,97,100,111,98,108,101,105,115,108,97,115,98,111, +108,115,97,98,97,195,177,111,104,97,98,108,97,108,117,99,104,97,195,129,114,101, +97,100,105,99,101,110,106,117,103,97,114,110,111,116,97,115,118,97,108,108,101, +97,108,108,195,161,99,97,114,103,97,100,111,108,111,114,97,98,97,106,111,101,115 +,116,195,169,103,117,115,116,111,109,101,110,116,101,109,97,114,105,111,102,105, +114,109,97,99,111,115,116,111,102,105,99,104,97,112,108,97,116,97,104,111,103,97 +,114,97,114,116,101,115,108,101,121,101,115,97,113,117,101,108,109,117,115,101, +111,98,97,115,101,115,112,111,99,111,115,109,105,116,97,100,99,105,101,108,111, +99,104,105,99,111,109,105,101,100,111,103,97,110,97,114,115,97,110,116,111,101, +116,97,112,97,100,101,98,101,115,112,108,97,121,97,114,101,100,101,115,115,105, +101,116,101,99,111,114,116,101,99,111,114,101,97,100,117,100,97,115,100,101,115, +101,111,118,105,101,106,111,100,101,115,101,97,97,103,117,97,115,38,113,117,111, +116,59,100,111,109,97,105,110,99,111,109,109,111,110,115,116,97,116,117,115,101, +118,101,110,116,115,109,97,115,116,101,114,115,121,115,116,101,109,97,99,116,105 +,111,110,98,97,110,110,101,114,114,101,109,111,118,101,115,99,114,111,108,108, +117,112,100,97,116,101,103,108,111,98,97,108,109,101,100,105,117,109,102,105,108 +,116,101,114,110,117,109,98,101,114,99,104,97,110,103,101,114,101,115,117,108, +116,112,117,98,108,105,99,115,99,114,101,101,110,99,104,111,111,115,101,110,111, +114,109,97,108,116,114,97,118,101,108,105,115,115,117,101,115,115,111,117,114,99 +,101,116,97,114,103,101,116,115,112,114,105,110,103,109,111,100,117,108,101,109, +111,98,105,108,101,115,119,105,116,99,104,112,104,111,116,111,115,98,111,114,100 +,101,114,114,101,103,105,111,110,105,116,115,101,108,102,115,111,99,105,97,108, +97,99,116,105,118,101,99,111,108,117,109,110,114,101,99,111,114,100,102,111,108, +108,111,119,116,105,116,108,101,62,101,105,116,104,101,114,108,101,110,103,116, +104,102,97,109,105,108,121,102,114,105,101,110,100,108,97,121,111,117,116,97,117 +,116,104,111,114,99,114,101,97,116,101,114,101,118,105,101,119,115,117,109,109, +101,114,115,101,114,118,101,114,112,108,97,121,101,100,112,108,97,121,101,114, +101,120,112,97,110,100,112,111,108,105,99,121,102,111,114,109,97,116,100,111,117 +,98,108,101,112,111,105,110,116,115,115,101,114,105,101,115,112,101,114,115,111, +110,108,105,118,105,110,103,100,101,115,105,103,110,109,111,110,116,104,115,102, +111,114,99,101,115,117,110,105,113,117,101,119,101,105,103,104,116,112,101,111, +112,108,101,101,110,101,114,103,121,110,97,116,117,114,101,115,101,97,114,99,104 +,102,105,103,117,114,101,104,97,118,105,110,103,99,117,115,116,111,109,111,102, +102,115,101,116,108,101,116,116,101,114,119,105,110,100,111,119,115,117,98,109, +105,116,114,101,110,100,101,114,103,114,111,117,112,115,117,112,108,111,97,100, +104,101,97,108,116,104,109,101,116,104,111,100,118,105,100,101,111,115,115,99, +104,111,111,108,102,117,116,117,114,101,115,104,97,100,111,119,100,101,98,97,116 +,101,118,97,108,117,101,115,79,98,106,101,99,116,111,116,104,101,114,115,114,105 +,103,104,116,115,108,101,97,103,117,101,99,104,114,111,109,101,115,105,109,112, +108,101,110,111,116,105,99,101,115,104,97,114,101,100,101,110,100,105,110,103, +115,101,97,115,111,110,114,101,112,111,114,116,111,110,108,105,110,101,115,113, +117,97,114,101,98,117,116,116,111,110,105,109,97,103,101,115,101,110,97,98,108, +101,109,111,118,105,110,103,108,97,116,101,115,116,119,105,110,116,101,114,70, +114,97,110,99,101,112,101,114,105,111,100,115,116,114,111,110,103,114,101,112, +101,97,116,76,111,110,100,111,110,100,101,116,97,105,108,102,111,114,109,101,100 +,100,101,109,97,110,100,115,101,99,117,114,101,112,97,115,115,101,100,116,111, +103,103,108,101,112,108,97,99,101,115,100,101,118,105,99,101,115,116,97,116,105, +99,99,105,116,105,101,115,115,116,114,101,97,109,121,101,108,108,111,119,97,116, +116,97,99,107,115,116,114,101,101,116,102,108,105,103,104,116,104,105,100,100, +101,110,105,110,102,111,34,62,111,112,101,110,101,100,117,115,101,102,117,108, +118,97,108,108,101,121,99,97,117,115,101,115,108,101,97,100,101,114,115,101,99, +114,101,116,115,101,99,111,110,100,100,97,109,97,103,101,115,112,111,114,116,115 +,101,120,99,101,112,116,114,97,116,105,110,103,115,105,103,110,101,100,116,104, +105,110,103,115,101,102,102,101,99,116,102,105,101,108,100,115,115,116,97,116, +101,115,111,102,102,105,99,101,118,105,115,117,97,108,101,100,105,116,111,114, +118,111,108,117,109,101,82,101,112,111,114,116,109,117,115,101,117,109,109,111, +118,105,101,115,112,97,114,101,110,116,97,99,99,101,115,115,109,111,115,116,108, +121,109,111,116,104,101,114,34,32,105,100,61,34,109,97,114,107,101,116,103,114, +111,117,110,100,99,104,97,110,99,101,115,117,114,118,101,121,98,101,102,111,114, +101,115,121,109,98,111,108,109,111,109,101,110,116,115,112,101,101,99,104,109, +111,116,105,111,110,105,110,115,105,100,101,109,97,116,116,101,114,67,101,110, +116,101,114,111,98,106,101,99,116,101,120,105,115,116,115,109,105,100,100,108, +101,69,117,114,111,112,101,103,114,111,119,116,104,108,101,103,97,99,121,109,97, +110,110,101,114,101,110,111,117,103,104,99,97,114,101,101,114,97,110,115,119,101 +,114,111,114,105,103,105,110,112,111,114,116,97,108,99,108,105,101,110,116,115, +101,108,101,99,116,114,97,110,100,111,109,99,108,111,115,101,100,116,111,112,105 +,99,115,99,111,109,105,110,103,102,97,116,104,101,114,111,112,116,105,111,110, +115,105,109,112,108,121,114,97,105,115,101,100,101,115,99,97,112,101,99,104,111, +115,101,110,99,104,117,114,99,104,100,101,102,105,110,101,114,101,97,115,111,110 +,99,111,114,110,101,114,111,117,116,112,117,116,109,101,109,111,114,121,105,102, +114,97,109,101,112,111,108,105,99,101,109,111,100,101,108,115,78,117,109,98,101, +114,100,117,114,105,110,103,111,102,102,101,114,115,115,116,121,108,101,115,107, +105,108,108,101,100,108,105,115,116,101,100,99,97,108,108,101,100,115,105,108, +118,101,114,109,97,114,103,105,110,100,101,108,101,116,101,98,101,116,116,101, +114,98,114,111,119,115,101,108,105,109,105,116,115,71,108,111,98,97,108,115,105, +110,103,108,101,119,105,100,103,101,116,99,101,110,116,101,114,98,117,100,103, +101,116,110,111,119,114,97,112,99,114,101,100,105,116,99,108,97,105,109,115,101, +110,103,105,110,101,115,97,102,101,116,121,99,104,111,105,99,101,115,112,105,114 +,105,116,45,115,116,121,108,101,115,112,114,101,97,100,109,97,107,105,110,103, +110,101,101,100,101,100,114,117,115,115,105,97,112,108,101,97,115,101,101,120, +116,101,110,116,83,99,114,105,112,116,98,114,111,107,101,110,97,108,108,111,119, +115,99,104,97,114,103,101,100,105,118,105,100,101,102,97,99,116,111,114,109,101, +109,98,101,114,45,98,97,115,101,100,116,104,101,111,114,121,99,111,110,102,105, +103,97,114,111,117,110,100,119,111,114,107,101,100,104,101,108,112,101,100,67, +104,117,114,99,104,105,109,112,97,99,116,115,104,111,117,108,100,97,108,119,97, +121,115,108,111,103,111,34,32,98,111,116,116,111,109,108,105,115,116,34,62,41, +123,118,97,114,32,112,114,101,102,105,120,111,114,97,110,103,101,72,101,97,100, +101,114,46,112,117,115,104,40,99,111,117,112,108,101,103,97,114,100,101,110,98, +114,105,100,103,101,108,97,117,110,99,104,82,101,118,105,101,119,116,97,107,105, +110,103,118,105,115,105,111,110,108,105,116,116,108,101,100,97,116,105,110,103, +66,117,116,116,111,110,98,101,97,117,116,121,116,104,101,109,101,115,102,111,114 +,103,111,116,83,101,97,114,99,104,97,110,99,104,111,114,97,108,109,111,115,116, +108,111,97,100,101,100,67,104,97,110,103,101,114,101,116,117,114,110,115,116,114 +,105,110,103,114,101,108,111,97,100,77,111,98,105,108,101,105,110,99,111,109,101 +,115,117,112,112,108,121,83,111,117,114,99,101,111,114,100,101,114,115,118,105, +101,119,101,100,38,110,98,115,112,59,99,111,117,114,115,101,65,98,111,117,116,32 +,105,115,108,97,110,100,60,104,116,109,108,32,99,111,111,107,105,101,110,97,109, +101,61,34,97,109,97,122,111,110,109,111,100,101,114,110,97,100,118,105,99,101, +105,110,60,47,97,62,58,32,84,104,101,32,100,105,97,108,111,103,104,111,117,115, +101,115,66,69,71,73,78,32,77,101,120,105,99,111,115,116,97,114,116,115,99,101, +110,116,114,101,104,101,105,103,104,116,97,100,100,105,110,103,73,115,108,97,110 +,100,97,115,115,101,116,115,69,109,112,105,114,101,83,99,104,111,111,108,101,102 +,102,111,114,116,100,105,114,101,99,116,110,101,97,114,108,121,109,97,110,117,97 +,108,83,101,108,101,99,116,46,10,10,79,110,101,106,111,105,110,101,100,109,101, +110,117,34,62,80,104,105,108,105,112,97,119,97,114,100,115,104,97,110,100,108, +101,105,109,112,111,114,116,79,102,102,105,99,101,114,101,103,97,114,100,115,107 +,105,108,108,115,110,97,116,105,111,110,83,112,111,114,116,115,100,101,103,114, +101,101,119,101,101,107,108,121,32,40,101,46,103,46,98,101,104,105,110,100,100, +111,99,116,111,114,108,111,103,103,101,100,117,110,105,116,101,100,60,47,98,62, +60,47,98,101,103,105,110,115,112,108,97,110,116,115,97,115,115,105,115,116,97, +114,116,105,115,116,105,115,115,117,101,100,51,48,48,112,120,124,99,97,110,97, +100,97,97,103,101,110,99,121,115,99,104,101,109,101,114,101,109,97,105,110,66, +114,97,122,105,108,115,97,109,112,108,101,108,111,103,111,34,62,98,101,121,111, +110,100,45,115,99,97,108,101,97,99,99,101,112,116,115,101,114,118,101,100,109,97 +,114,105,110,101,70,111,111,116,101,114,99,97,109,101,114,97,60,47,104,49,62,10, +95,102,111,114,109,34,108,101,97,118,101,115,115,116,114,101,115,115,34,32,47,62 +,13,10,46,103,105,102,34,32,111,110,108,111,97,100,108,111,97,100,101,114,79,120 +,102,111,114,100,115,105,115,116,101,114,115,117,114,118,105,118,108,105,115,116 +,101,110,102,101,109,97,108,101,68,101,115,105,103,110,115,105,122,101,61,34,97, +112,112,101,97,108,116,101,120,116,34,62,108,101,118,101,108,115,116,104,97,110, +107,115,104,105,103,104,101,114,102,111,114,99,101,100,97,110,105,109,97,108,97, +110,121,111,110,101,65,102,114,105,99,97,97,103,114,101,101,100,114,101,99,101, +110,116,80,101,111,112,108,101,60,98,114,32,47,62,119,111,110,100,101,114,112, +114,105,99,101,115,116,117,114,110,101,100,124,124,32,123,125,59,109,97,105,110, +34,62,105,110,108,105,110,101,115,117,110,100,97,121,119,114,97,112,34,62,102,97 +,105,108,101,100,99,101,110,115,117,115,109,105,110,117,116,101,98,101,97,99,111 +,110,113,117,111,116,101,115,49,53,48,112,120,124,101,115,116,97,116,101,114,101 +,109,111,116,101,101,109,97,105,108,34,108,105,110,107,101,100,114,105,103,104, +116,59,115,105,103,110,97,108,102,111,114,109,97,108,49,46,104,116,109,108,115, +105,103,110,117,112,112,114,105,110,99,101,102,108,111,97,116,58,46,112,110,103, +34,32,102,111,114,117,109,46,65,99,99,101,115,115,112,97,112,101,114,115,115,111 +,117,110,100,115,101,120,116,101,110,100,72,101,105,103,104,116,115,108,105,100, +101,114,85,84,70,45,56,34,38,97,109,112,59,32,66,101,102,111,114,101,46,32,87, +105,116,104,115,116,117,100,105,111,111,119,110,101,114,115,109,97,110,97,103, +101,112,114,111,102,105,116,106,81,117,101,114,121,97,110,110,117,97,108,112,97, +114,97,109,115,98,111,117,103,104,116,102,97,109,111,117,115,103,111,111,103,108 +,101,108,111,110,103,101,114,105,43,43,41,32,123,105,115,114,97,101,108,115,97, +121,105,110,103,100,101,99,105,100,101,104,111,109,101,34,62,104,101,97,100,101, +114,101,110,115,117,114,101,98,114,97,110,99,104,112,105,101,99,101,115,98,108, +111,99,107,59,115,116,97,116,101,100,116,111,112,34,62,60,114,97,99,105,110,103, +114,101,115,105,122,101,45,45,38,103,116,59,112,97,99,105,116,121,115,101,120, +117,97,108,98,117,114,101,97,117,46,106,112,103,34,32,49,48,44,48,48,48,111,98, +116,97,105,110,116,105,116,108,101,115,97,109,111,117,110,116,44,32,73,110,99,46 +,99,111,109,101,100,121,109,101,110,117,34,32,108,121,114,105,99,115,116,111,100 +,97,121,46,105,110,100,101,101,100,99,111,117,110,116,121,95,108,111,103,111,46, +70,97,109,105,108,121,108,111,111,107,101,100,77,97,114,107,101,116,108,115,101, +32,105,102,80,108,97,121,101,114,116,117,114,107,101,121,41,59,118,97,114,32,102 +,111,114,101,115,116,103,105,118,105,110,103,101,114,114,111,114,115,68,111,109, +97,105,110,125,101,108,115,101,123,105,110,115,101,114,116,66,108,111,103,60,47, +102,111,111,116,101,114,108,111,103,105,110,46,102,97,115,116,101,114,97,103,101 +,110,116,115,60,98,111,100,121,32,49,48,112,120,32,48,112,114,97,103,109,97,102, +114,105,100,97,121,106,117,110,105,111,114,100,111,108,108,97,114,112,108,97,99, +101,100,99,111,118,101,114,115,112,108,117,103,105,110,53,44,48,48,48,32,112,97, +103,101,34,62,98,111,115,116,111,110,46,116,101,115,116,40,97,118,97,116,97,114, +116,101,115,116,101,100,95,99,111,117,110,116,102,111,114,117,109,115,115,99,104 +,101,109,97,105,110,100,101,120,44,102,105,108,108,101,100,115,104,97,114,101, +115,114,101,97,100,101,114,97,108,101,114,116,40,97,112,112,101,97,114,83,117,98 +,109,105,116,108,105,110,101,34,62,98,111,100,121,34,62,10,42,32,84,104,101,84, +104,111,117,103,104,115,101,101,105,110,103,106,101,114,115,101,121,78,101,119, +115,60,47,118,101,114,105,102,121,101,120,112,101,114,116,105,110,106,117,114, +121,119,105,100,116,104,61,67,111,111,107,105,101,83,84,65,82,84,32,97,99,114, +111,115,115,95,105,109,97,103,101,116,104,114,101,97,100,110,97,116,105,118,101, +112,111,99,107,101,116,98,111,120,34,62,10,83,121,115,116,101,109,32,68,97,118, +105,100,99,97,110,99,101,114,116,97,98,108,101,115,112,114,111,118,101,100,65, +112,114,105,108,32,114,101,97,108,108,121,100,114,105,118,101,114,105,116,101, +109,34,62,109,111,114,101,34,62,98,111,97,114,100,115,99,111,108,111,114,115,99, +97,109,112,117,115,102,105,114,115,116,32,124,124,32,91,93,59,109,101,100,105,97 +,46,103,117,105,116,97,114,102,105,110,105,115,104,119,105,100,116,104,58,115, +104,111,119,101,100,79,116,104,101,114,32,46,112,104,112,34,32,97,115,115,117, +109,101,108,97,121,101,114,115,119,105,108,115,111,110,115,116,111,114,101,115, +114,101,108,105,101,102,115,119,101,100,101,110,67,117,115,116,111,109,101,97, +115,105,108,121,32,121,111,117,114,32,83,116,114,105,110,103,10,10,87,104,105, +108,116,97,121,108,111,114,99,108,101,97,114,58,114,101,115,111,114,116,102,114, +101,110,99,104,116,104,111,117,103,104,34,41,32,43,32,34,60,98,111,100,121,62,98 +,117,121,105,110,103,98,114,97,110,100,115,77,101,109,98,101,114,110,97,109,101, +34,62,111,112,112,105,110,103,115,101,99,116,111,114,53,112,120,59,34,62,118,115 +,112,97,99,101,112,111,115,116,101,114,109,97,106,111,114,32,99,111,102,102,101, +101,109,97,114,116,105,110,109,97,116,117,114,101,104,97,112,112,101,110,60,47, +110,97,118,62,107,97,110,115,97,115,108,105,110,107,34,62,73,109,97,103,101,115, +61,102,97,108,115,101,119,104,105,108,101,32,104,115,112,97,99,101,48,38,97,109, +112,59,32,10,10,73,110,32,32,112,111,119,101,114,80,111,108,115,107,105,45,99, +111,108,111,114,106,111,114,100,97,110,66,111,116,116,111,109,83,116,97,114,116, +32,45,99,111,117,110,116,50,46,104,116,109,108,110,101,119,115,34,62,48,49,46, +106,112,103,79,110,108,105,110,101,45,114,105,103,104,116,109,105,108,108,101, +114,115,101,110,105,111,114,73,83,66,78,32,48,48,44,48,48,48,32,103,117,105,100, +101,115,118,97,108,117,101,41,101,99,116,105,111,110,114,101,112,97,105,114,46, +120,109,108,34,32,32,114,105,103,104,116,115,46,104,116,109,108,45,98,108,111,99 +,107,114,101,103,69,120,112,58,104,111,118,101,114,119,105,116,104,105,110,118, +105,114,103,105,110,112,104,111,110,101,115,60,47,116,114,62,13,117,115,105,110, +103,32,10,9,118,97,114,32,62,39,41,59,10,9,60,47,116,100,62,10,60,47,116,114,62, +10,98,97,104,97,115,97,98,114,97,115,105,108,103,97,108,101,103,111,109,97,103, +121,97,114,112,111,108,115,107,105,115,114,112,115,107,105,216,177,216,175,217, +136,228,184,173,230,150,135,231,174,128,228,189,147,231,185,129,233,171,148,228, +191,161,230,129,175,228,184,173,229,155,189,230,136,145,228,187,172,228,184,128, +228,184,170,229,133,172,229,143,184,231,174,161,231,144,134,232,174,186,229,157, +155,229,143,175,228,187,165,230,156,141,229,138,161,230,151,182,233,151,180,228, +184,170,228,186,186,228,186,167,229,147,129,232,135,170,229,183,177,228,188,129, +228,184,154,230,159,165,231,156,139,229,183,165,228,189,156,232,129,148,231,179, +187,230,178,161,230,156,137,231,189,145,231,171,153,230,137,128,230,156,137,232, +175,132,232,174,186,228,184,173,229,191,131,230,150,135,231,171,160,231,148,168, +230,136,183,233,166,150,233,161,181,228,189,156,232,128,133,230,138,128,230,156, +175,233,151,174,233,162,152,231,155,184,229,133,179,228,184,139,232,189,189,230, +144,156,231,180,162,228,189,191,231,148,168,232,189,175,228,187,182,229,156,168, +231,186,191,228,184,187,233,162,152,232,181,132,230,150,153,232,167,134,233,162, +145,229,155,158,229,164,141,230,179,168,229,134,140,231,189,145,231,187,156,230, +148,182,232,151,143,229,134,133,229,174,185,230,142,168,232,141,144,229,184,130, +229,156,186,230,182,136,230,129,175,231,169,186,233,151,180,229,143,145,229,184, +131,228,187,128,228,185,136,229,165,189,229,143,139,231,148,159,230,180,187,229, +155,190,231,137,135,229,143,145,229,177,149,229,166,130,230,158,156,230,137,139, +230,156,186,230,150,176,233,151,187,230,156,128,230,150,176,230,150,185,229,188, +143,229,140,151,228,186,172,230,143,144,228,190,155,229,133,179,228,186,142,230, +155,180,229,164,154,232,191,153,228,184,170,231,179,187,231,187,159,231,159,165, +233,129,147,230,184,184,230,136,143,229,185,191,229,145,138,229,133,182,228,187, +150,229,143,145,232,161,168,229,174,137,229,133,168,231,172,172,228,184,128,228, +188,154,229,145,152,232,191,155,232,161,140,231,130,185,229,135,187,231,137,136, +230,157,131,231,148,181,229,173,144,228,184,150,231,149,140,232,174,190,232,174, +161,229,133,141,232,180,185,230,149,153,232,130,178,229,138,160,229,133,165,230, +180,187,229,138,168,228,187,150,228,187,172,229,149,134,229,147,129,229,141,154, +229,174,162,231,142,176,229,156,168,228,184,138,230,181,183,229,166,130,228,189, +149,229,183,178,231,187,143,231,149,153,232,168,128,232,175,166,231,187,134,231, +164,190,229,140,186,231,153,187,229,189,149,230,156,172,231,171,153,233,156,128, +232,166,129,228,187,183,230,160,188,230,148,175,230,140,129,229,155,189,233,153, +133,233,147,190,230,142,165,229,155,189,229,174,182,229,187,186,232,174,190,230, +156,139,229,143,139,233,152,133,232,175,187,230,179,149,229,190,139,228,189,141, +231,189,174,231,187,143,230,181,142,233,128,137,230,139,169,232,191,153,230,160, +183,229,189,147,229,137,141,229,136,134,231,177,187,230,142,146,232,161,140,229, +155,160,228,184,186,228,186,164,230,152,147,230,156,128,229,144,142,233,159,179, +228,185,144,228,184,141,232,131,189,233,128,154,232,191,135,232,161,140,228,184, +154,231,167,145,230,138,128,229,143,175,232,131,189,232,174,190,229,164,135,229, +144,136,228,189,156,229,164,167,229,174,182,231,164,190,228,188,154,231,160,148, +231,169,182,228,184,147,228,184,154,229,133,168,233,131,168,233,161,185,231,155, +174,232,191,153,233,135,140,232,191,152,230,152,175,229,188,128,229,167,139,230, +131,133,229,134,181,231,148,181,232,132,145,230,150,135,228,187,182,229,147,129, +231,137,140,229,184,174,229,138,169,230,150,135,229,140,150,232,181,132,230,186, +144,229,164,167,229,173,166,229,173,166,228,185,160,229,156,176,229,157,128,230, +181,143,232,167,136,230,138,149,232,181,132,229,183,165,231,168,139,232,166,129, +230,177,130,230,128,142,228,185,136,230,151,182,229,128,153,229,138,159,232,131, +189,228,184,187,232,166,129,231,155,174,229,137,141,232,181,132,232,174,175,229, +159,142,229,184,130,230,150,185,230,179,149,231,148,181,229,189,177,230,139,155, +232,129,152,229,163,176,230,152,142,228,187,187,228,189,149,229,129,165,229,186, +183,230,149,176,230,141,174,231,190,142,229,155,189,230,177,189,232,189,166,228, +187,139,231,187,141,228,189,134,230,152,175,228,186,164,230,181,129,231,148,159, +228,186,167,230,137,128,228,187,165,231,148,181,232,175,157,230,152,190,231,164, +186,228,184,128,228,186,155,229,141,149,228,189,141,228,186,186,229,145,152,229, +136,134,230,158,144,229,156,176,229,155,190,230,151,133,230,184,184,229,183,165, +229,133,183,229,173,166,231,148,159,231,179,187,229,136,151,231,189,145,229,143, +139,229,184,150,229,173,144,229,175,134,231,160,129,233,162,145,233,129,147,230, +142,167,229,136,182,229,156,176,229,140,186,229,159,186,230,156,172,229,133,168, +229,155,189,231,189,145,228,184,138,233,135,141,232,166,129,231,172,172,228,186, +140,229,150,156,230,172,162,232,191,155,229,133,165,229,143,139,230,131,133,232, +191,153,228,186,155,232,128,131,232,175,149,229,143,145,231,142,176,229,159,185, +232,174,173,228,187,165,228,184,138,230,148,191,229,186,156,230,136,144,228,184, +186,231,142,175,229,162,131,233,166,153,230,184,175,229,144,140,230,151,182,229, +168,177,228,185,144,229,143,145,233,128,129,228,184,128,229,174,154,229,188,128, +229,143,145,228,189,156,229,147,129,230,160,135,229,135,134,230,172,162,232,191, +142,232,167,163,229,134,179,229,156,176,230,150,185,228,184,128,228,184,139,228, +187,165,229,143,138,232,180,163,228,187,187,230,136,150,232,128,133,229,174,162, +230,136,183,228,187,163,232,161,168,231,167,175,229,136,134,229,165,179,228,186, +186,230,149,176,231,160,129,233,148,128,229,148,174,229,135,186,231,142,176,231, +166,187,231,186,191,229,186,148,231,148,168,229,136,151,232,161,168,228,184,141, +229,144,140,231,188,150,232,190,145,231,187,159,232,174,161,230,159,165,232,175, +162,228,184,141,232,166,129,230,156,137,229,133,179,230,156,186,230,158,132,229, +190,136,229,164,154,230,146,173,230,148,190,231,187,132,231,187,135,230,148,191, +231,173,150,231,155,180,230,142,165,232,131,189,229,138,155,230,157,165,230,186, +144,230,153,130,233,150,147,231,156,139,229,136,176,231,131,173,233,151,168,229, +133,179,233,148,174,228,184,147,229,140,186,233,157,158,229,184,184,232,139,177, +232,175,173,231,153,190,229,186,166,229,184,140,230,156,155,231,190,142,229,165, +179,230,175,148,232,190,131,231,159,165,232,175,134,232,167,132,229,174,154,229, +187,186,232,174,174,233,131,168,233,151,168,230,132,143,232,167,129,231,178,190, +229,189,169,230,151,165,230,156,172,230,143,144,233,171,152,229,143,145,232,168, +128,230,150,185,233,157,162,229,159,186,233,135,145,229,164,132,231,144,134,230, +157,131,233,153,144,229,189,177,231,137,135,233,147,182,232,161,140,232,191,152, +230,156,137,229,136,134,228,186,171,231,137,169,229,147,129,231,187,143,232,144, +165,230,183,187,229,138,160,228,184,147,229,174,182,232,191,153,231,167,141,232, +175,157,233,162,152,232,181,183,230,157,165,228,184,154,229,138,161,229,133,172, +229,145,138,232,174,176,229,189,149,231,174,128,228,187,139,232,180,168,233,135, +143,231,148,183,228,186,186,229,189,177,229,147,141,229,188,149,231,148,168,230, +138,165,229,145,138,233,131,168,229,136,134,229,191,171,233,128,159,229,146,168, +232,175,162,230,151,182,229,176,154,230,179,168,230,132,143,231,148,179,232,175, +183,229,173,166,230,160,161,229,186,148,232,175,165,229,142,134,229,143,178,229, +143,170,230,152,175,232,191,148,229,155,158,232,180,173,228,185,176,229,144,141, +231,167,176,228,184,186,228,186,134,230,136,144,229,138,159,232,175,180,230,152, +142,228,190,155,229,186,148,229,173,169,229,173,144,228,184,147,233,162,152,231, +168,139,229,186,143,228,184,128,232,136,172,230,156,131,229,147,161,229,143,170, +230,156,137,229,133,182,229,174,131,228,191,157,230,138,164,232,128,140,228,184, +148,228,187,138,229,164,169,231,170,151,229,143,163,229,138,168,230,128,129,231, +138,182,230,128,129,231,137,185,229,136,171,232,174,164,228,184,186,229,191,133, +233,161,187,230,155,180,230,150,176,229,176,143,232,175,180,230,136,145,229,128, +145,228,189,156,228,184,186,229,170,146,228,189,147,229,140,133,230,139,172,233, +130,163,228,185,136,228,184,128,230,160,183,229,155,189,229,134,133,230,152,175, +229,144,166,230,160,185,230,141,174,231,148,181,232,167,134,229,173,166,233,153, +162,229,133,183,230,156,137,232,191,135,231,168,139,231,148,177,228,186,142,228, +186,186,230,137,141,229,135,186,230,157,165,228,184,141,232,191,135,230,173,163, +229,156,168,230,152,142,230,152,159,230,149,133,228,186,139,229,133,179,231,179, +187,230,160,135,233,162,152,229,149,134,229,138,161,232,190,147,229,133,165,228, +184,128,231,155,180,229,159,186,231,161,128,230,149,153,229,173,166,228,186,134, +232,167,163,229,187,186,231,173,145,231,187,147,230,158,156,229,133,168,231,144, +131,233,128,154,231,159,165,232,174,161,229,136,146,229,175,185,228,186,142,232, +137,186,230,156,175,231,155,184,229,134,140,229,143,145,231,148,159,231,156,159, +231,154,132,229,187,186,231,171,139,231,173,137,231,186,167,231,177,187,229,158, +139,231,187,143,233,170,140,229,174,158,231,142,176,229,136,182,228,189,156,230, +157,165,232,135,170,230,160,135,231,173,190,228,187,165,228,184,139,229,142,159, +229,136,155,230,151,160,230,179,149,229,133,182,228,184,173,229,128,139,228,186, +186,228,184,128,229,136,135,230,140,135,229,141,151,229,133,179,233,151,173,233, +155,134,229,155,162,231,172,172,228,184,137,229,133,179,230,179,168,229,155,160, +230,173,164,231,133,167,231,137,135,230,183,177,229,156,179,229,149,134,228,184, +154,229,185,191,229,183,158,230,151,165,230,156,159,233,171,152,231,186,167,230, +156,128,232,191,145,231,187,188,229,144,136,232,161,168,231,164,186,228,184,147, +232,190,145,232,161,140,228,184,186,228,186,164,233,128,154,232,175,132,228,187, +183,232,167,137,229,190,151,231,178,190,229,141,142,229,174,182,229,186,173,229, +174,140,230,136,144,230,132,159,232,167,137,229,174,137,232,163,133,229,190,151, +229,136,176,233,130,174,228,187,182,229,136,182,229,186,166,233,163,159,229,147, +129,232,153,189,231,132,182,232,189,172,232,189,189,230,138,165,228,187,183,232, +174,176,232,128,133,230,150,185,230,161,136,232,161,140,230,148,191,228,186,186, +230,176,145,231,148,168,229,147,129,228,184,156,232,165,191,230,143,144,229,135, +186,233,133,146,229,186,151,231,132,182,229,144,142,228,187,152,230,172,190,231, +131,173,231,130,185,228,187,165,229,137,141,229,174,140,229,133,168,229,143,145, +229,184,150,232,174,190,231,189,174,233,162,134,229,175,188,229,183,165,228,184, +154,229,140,187,233,153,162,231,156,139,231,156,139,231,187,143,229,133,184,229, +142,159,229,155,160,229,185,179,229,143,176,229,144,132,231,167,141,229,162,158, +229,138,160,230,157,144,230,150,153,230,150,176,229,162,158,228,185,139,229,144, +142,232,129,140,228,184,154,230,149,136,230,158,156,228,187,138,229,185,180,232, +174,186,230,150,135,230,136,145,229,155,189,229,145,138,232,175,137,231,137,136, +228,184,187,228,191,174,230,148,185,229,143,130,228,184,142,230,137,147,229,141, +176,229,191,171,228,185,144,230,156,186,230,162,176,232,167,130,231,130,185,229, +173,152,229,156,168,231,178,190,231,165,158,232,142,183,229,190,151,229,136,169, +231,148,168,231,187,167,231,187,173,228,189,160,228,187,172,232,191,153,228,185, +136,230,168,161,229,188,143,232,175,173,232,168,128,232,131,189,229,164,159,233, +155,133,232,153,142,230,147,141,228,189,156,233,163,142,230,160,188,228,184,128, +232,181,183,231,167,145,229,173,166,228,189,147,232,130,178,231,159,173,228,191, +161,230,157,161,228,187,182,230,178,187,231,150,151,232,191,144,229,138,168,228, +186,167,228,184,154,228,188,154,232,174,174,229,175,188,232,136,170,229,133,136, +231,148,159,232,129,148,231,155,159,229,143,175,230,152,175,229,149,143,233,161, +140,231,187,147,230,158,132,228,189,156,231,148,168,232,176,131,230,159,165,232, +179,135,230,150,153,232,135,170,229,138,168,232,180,159,232,180,163,229,134,156, +228,184,154,232,174,191,233,151,174,229,174,158,230,150,189,230,142,165,229,143, +151,232,174,168,232,174,186,233,130,163,228,184,170,229,143,141,233,166,136,229, +138,160,229,188,186,229,165,179,230,128,167,232,140,131,229,155,180,230,156,141, +229,139,153,228,188,145,233,151,178,228,187,138,230,151,165,229,174,162,230,156, +141,232,167,128,231,156,139,229,143,130,229,138,160,231,154,132,232,175,157,228, +184,128,231,130,185,228,191,157,232,175,129,229,155,190,228,185,166,230,156,137, +230,149,136,230,181,139,232,175,149,231,167,187,229,138,168,230,137,141,232,131, +189,229,134,179,229,174,154,232,130,161,231,165,168,228,184,141,230,150,173,233, +156,128,230,177,130,228,184,141,229,190,151,229,138,158,230,179,149,228,185,139, +233,151,180,233,135,135,231,148,168,232,144,165,233,148,128,230,138,149,232,175, +137,231,155,174,230,160,135,231,136,177,230,131,133,230,145,132,229,189,177,230, +156,137,228,186,155,232,164,135,232,163,189,230,150,135,229,173,166,230,156,186, +228,188,154,230,149,176,229,173,151,232,163,133,228,191,174,232,180,173,231,137, +169,229,134,156,230,157,145,229,133,168,233,157,162,231,178,190,229,147,129,229, +133,182,229,174,158,228,186,139,230,131,133,230,176,180,229,185,179,230,143,144, +231,164,186,228,184,138,229,184,130,232,176,162,232,176,162,230,153,174,233,128, +154,230,149,153,229,184,136,228,184,138,228,188,160,231,177,187,229,136,171,230, +173,140,230,155,178,230,139,165,230,156,137,229,136,155,230,150,176,233,133,141, +228,187,182,229,143,170,232,166,129,230,151,182,228,187,163,232,179,135,232,168, +138,232,190,190,229,136,176,228,186,186,231,148,159,232,174,162,233,152,133,232, +128,129,229,184,136,229,177,149,231,164,186,229,191,131,231,144,134,232,180,180, +229,173,144,231,182,178,231,171,153,228,184,187,233,161,140,232,135,170,231,132, +182,231,186,167,229,136,171,231,174,128,229,141,149,230,148,185,233,157,169,233, +130,163,228,186,155,230,157,165,232,175,180,230,137,147,229,188,128,228,187,163, +231,160,129,229,136,160,233,153,164,232,175,129,229,136,184,232,138,130,231,155, +174,233,135,141,231,130,185,230,172,161,230,149,184,229,164,154,229,176,145,232, +167,132,229,136,146,232,181,132,233,135,145,230,137,190,229,136,176,228,187,165, +229,144,142,229,164,167,229,133,168,228,184,187,233,161,181,230,156,128,228,189, +179,229,155,158,231,173,148,229,164,169,228,184,139,228,191,157,233,154,156,231, +142,176,228,187,163,230,163,128,230,159,165,230,138,149,231,165,168,229,176,143, +230,151,182,230,178,146,230,156,137,230,173,163,229,184,184,231,148,154,232,135, +179,228,187,163,231,144,134,231,155,174,229,189,149,229,133,172,229,188,128,229, +164,141,229,136,182,233,135,145,232,158,141,229,185,184,231,166,143,231,137,136, +230,156,172,229,189,162,230,136,144,229,135,134,229,164,135,232,161,140,230,131, +133,229,155,158,229,136,176,230,128,157,230,131,179,230,128,142,230,160,183,229, +141,143,232,174,174,232,174,164,232,175,129,230,156,128,229,165,189,228,186,167, +231,148,159,230,140,137,231,133,167,230,156,141,232,163,133,229,185,191,228,184, +156,229,138,168,230,188,171,233,135,135,232,180,173,230,150,176,230,137,139,231, +187,132,229,155,190,233,157,162,230,157,191,229,143,130,232,128,131,230,148,191, +230,178,187,229,174,185,230,152,147,229,164,169,229,156,176,229,138,170,229,138, +155,228,186,186,228,187,172,229,141,135,231,186,167,233,128,159,229,186,166,228, +186,186,231,137,169,232,176,131,230,149,180,230,181,129,232,161,140,233,128,160, +230,136,144,230,150,135,229,173,151,233,159,169,229,155,189,232,180,184,230,152, +147,229,188,128,229,177,149,231,155,184,233,151,156,232,161,168,231,142,176,229, +189,177,232,167,134,229,166,130,230,173,164,231,190,142,229,174,185,229,164,167, +229,176,143,230,138,165,233,129,147,230,157,161,230,172,190,229,191,131,230,131, +133,232,174,184,229,164,154,230,179,149,232,167,132,229,174,182,229,177,133,228, +185,166,229,186,151,232,191,158,230,142,165,231,171,139,229,141,179,228,184,190, +230,138,165,230,138,128,229,183,167,229,165,165,232,191,144,231,153,187,229,133, +165,228,187,165,230,157,165,231,144,134,232,174,186,228,186,139,228,187,182,232, +135,170,231,148,177,228,184,173,229,141,142,229,138,158,229,133,172,229,166,136, +229,166,136,231,156,159,230,173,163,228,184,141,233,148,153,229,133,168,230,150, +135,229,144,136,229,144,140,228,187,183,229,128,188,229,136,171,228,186,186,231, +155,145,231,157,163,229,133,183,228,189,147,228,184,150,231,186,170,229,155,162, +233,152,159,229,136,155,228,184,154,230,137,191,230,139,133,229,162,158,233,149, +191,230,156,137,228,186,186,228,191,157,230,140,129,229,149,134,229,174,182,231, +187,180,228,191,174,229,143,176,230,185,190,229,183,166,229,143,179,232,130,161, +228,187,189,231,173,148,230,161,136,229,174,158,233,153,133,231,148,181,228,191, +161,231,187,143,231,144,134,231,148,159,229,145,189,229,174,163,228,188,160,228, +187,187,229,138,161,230,173,163,229,188,143,231,137,185,232,137,178,228,184,139, +230,157,165,229,141,143,228,188,154,229,143,170,232,131,189,229,189,147,231,132, +182,233,135,141,230,150,176,229,133,167,229,174,185,230,140,135,229,175,188,232, +191,144,232,161,140,230,151,165,229,191,151,232,179,163,229,174,182,232,182,133, +232,191,135,229,156,159,229,156,176,230,181,153,230,177,159,230,148,175,228,187, +152,230,142,168,229,135,186,231,171,153,233,149,191,230,157,173,229,183,158,230, +137,167,232,161,140,229,136,182,233,128,160,228,185,139,228,184,128,230,142,168, +229,185,191,231,142,176,229,156,186,230,143,143,232,191,176,229,143,152,229,140, +150,228,188,160,231,187,159,230,173,140,230,137,139,228,191,157,233,153,169,232, +175,190,231,168,139,229,140,187,231,150,151,231,187,143,232,191,135,232,191,135, +229,142,187,228,185,139,229,137,141,230,148,182,229,133,165,229,185,180,229,186, +166,230,157,130,229,191,151,231,190,142,228,184,189,230,156,128,233,171,152,231, +153,187,233,153,134,230,156,170,230,157,165,229,138,160,229,183,165,229,133,141, +232,180,163,230,149,153,231,168,139,231,137,136,229,157,151,232,186,171,228,189, +147,233,135,141,229,186,134,229,135,186,229,148,174,230,136,144,230,156,172,229, +189,162,229,188,143,229,156,159,232,177,134,229,135,186,229,131,185,228,184,156, +230,150,185,233,130,174,231,174,177,229,141,151,228,186,172,230,177,130,232,129, +140,229,143,150,229,190,151,232,129,140,228,189,141,231,155,184,228,191,161,233, +161,181,233,157,162,229,136,134,233,146,159,231,189,145,233,161,181,231,161,174, +229,174,154,229,155,190,228,190,139,231,189,145,229,157,128,231,167,175,230,158, +129,233,148,153,232,175,175,231,155,174,231,154,132,229,174,157,232,180,157,230, +156,186,229,133,179,233,163,142,233,153,169,230,142,136,230,157,131,231,151,133, +230,175,146,229,174,160,231,137,169,233,153,164,228,186,134,232,169,149,232,171, +150,231,150,190,231,151,133,229,143,138,230,151,182,230,177,130,232,180,173,231, +171,153,231,130,185,229,132,191,231,171,165,230,175,143,229,164,169,228,184,173, +229,164,174,232,174,164,232,175,134,230,175,143,228,184,170,229,164,169,230,180, +165,229,173,151,228,189,147,229,143,176,231,129,163,231,187,180,230,138,164,230, +156,172,233,161,181,228,184,170,230,128,167,229,174,152,230,150,185,229,184,184, +232,167,129,231,155,184,230,156,186,230,136,152,231,149,165,229,186,148,229,189, +147,229,190,139,229,184,136,230,150,185,228,190,191,230,160,161,229,155,173,232, +130,161,229,184,130,230,136,191,229,177,139,230,160,143,231,155,174,229,145,152, +229,183,165,229,175,188,232,135,180,231,170,129,231,132,182,233,129,147,229,133, +183,230,156,172,231,189,145,231,187,147,229,144,136,230,161,163,230,161,136,229, +138,179,229,138,168,229,143,166,229,164,150,231,190,142,229,133,131,229,188,149, +232,181,183,230,148,185,229,143,152,231,172,172,229,155,155,228,188,154,232,174, +161,232,170,170,230,152,142,233,154,144,231,167,129,229,174,157,229,174,157,232, +167,132,232,140,131,230,182,136,232,180,185,229,133,177,229,144,140,229,191,152, +232,174,176,228,189,147,231,179,187,229,184,166,230,157,165,229,144,141,229,173, +151,231,153,188,232,161,168,229,188,128,230,148,190,229,138,160,231,155,159,229, +143,151,229,136,176,228,186,140,230,137,139,229,164,167,233,135,143,230,136,144, +228,186,186,230,149,176,233,135,143,229,133,177,228,186,171,229,140,186,229,159, +159,229,165,179,229,173,169,229,142,159,229,136,153,230,137,128,229,156,168,231, +187,147,230,157,159,233,128,154,228,191,161,232,182,133,231,186,167,233,133,141, +231,189,174,229,189,147,230,151,182,228,188,152,231,167,128,230,128,167,230,132, +159,230,136,191,228,186,167,233,129,138,230,136,178,229,135,186,229,143,163,230, +143,144,228,186,164,229,176,177,228,184,154,228,191,157,229,129,165,231,168,139, +229,186,166,229,143,130,230,149,176,228,186,139,228,184,154,230,149,180,228,184, +170,229,177,177,228,184,156,230,131,133,230,132,159,231,137,185,230,174,138,229, +136,134,233,161,158,230,144,156,229,176,139,229,177,158,228,186,142,233,151,168, +230,136,183,232,180,162,229,138,161,229,163,176,233,159,179,229,143,138,229,133, +182,232,180,162,231,187,143,229,157,154,230,140,129,229,185,178,233,131,168,230, +136,144,231,171,139,229,136,169,231,155,138,232,128,131,232,153,145,230,136,144, +233,131,189,229,140,133,232,163,133,231,148,168,230,136,182,230,175,148,232,181, +155,230,150,135,230,152,142,230,139,155,229,149,134,229,174,140,230,149,180,231, +156,159,230,152,175,231,156,188,231,157,155,228,188,153,228,188,180,229,168,129, +230,156,155,233,162,134,229,159,159,229,141,171,231,148,159,228,188,152,230,131, +160,232,171,150,229,163,135,229,133,172,229,133,177,232,137,175,229,165,189,229, +133,133,229,136,134,231,172,166,229,144,136,233,153,132,228,187,182,231,137,185, +231,130,185,228,184,141,229,143,175,232,139,177,230,150,135,232,181,132,228,186, +167,230,160,185,230,156,172,230,152,142,230,152,190,229,175,134,231,162,188,229, +133,172,228,188,151,230,176,145,230,151,143,230,155,180,229,138,160,228,186,171, +229,143,151,229,144,140,229,173,166,229,144,175,229,138,168,233,128,130,229,144, +136,229,142,159,230,157,165,233,151,174,231,173,148,230,156,172,230,150,135,231, +190,142,233,163,159,231,187,191,232,137,178,231,168,179,229,174,154,231,187,136, +228,186,142,231,148,159,231,137,169,228,190,155,230,177,130,230,144,156,231,139, +144,229,138,155,233,135,143,228,184,165,233,135,141,230,176,184,232,191,156,229, +134,153,231,156,159,230,156,137,233,153,144,231,171,158,228,186,137,229,175,185, +232,177,161,232,180,185,231,148,168,228,184,141,229,165,189,231,187,157,229,175, +185,229,141,129,229,136,134,228,191,131,232,191,155,231,130,185,232,175,132,229, +189,177,233,159,179,228,188,152,229,138,191,228,184,141,229,176,145,230,172,163, +232,181,143,229,185,182,228,184,148,230,156,137,231,130,185,230,150,185,229,144, +145,229,133,168,230,150,176,228,191,161,231,148,168,232,174,190,230,150,189,229, +189,162,232,177,161,232,181,132,230,160,188,231,170,129,231,160,180,233,154,143, +231,157,128,233,135,141,229,164,167,228,186,142,230,152,175,230,175,149,228,184, +154,230,153,186,232,131,189,229,140,150,229,183,165,229,174,140,231,190,142,229, +149,134,229,159,142,231,187,159,228,184,128,229,135,186,231,137,136,230,137,147, +233,128,160,231,148,162,229,147,129,230,166,130,229,134,181,231,148,168,228,186, +142,228,191,157,231,149,153,229,155,160,231,180,160,228,184,173,229,156,139,229, +173,152,229,130,168,232,180,180,229,155,190,230,156,128,230,132,155,233,149,191, +230,156,159,229,143,163,228,187,183,231,144,134,232,180,162,229,159,186,229,156, +176,229,174,137,230,142,146,230,173,166,230,177,137,233,135,140,233,157,162,229, +136,155,229,187,186,229,164,169,231,169,186,233,166,150,229,133,136,229,174,140, +229,150,132,233,169,177,229,138,168,228,184,139,233,157,162,228,184,141,229,134, +141,232,175,154,228,191,161,230,132,143,228,185,137,233,152,179,229,133,137,232, +139,177,229,155,189,230,188,130,228,186,174,229,134,155,228,186,139,231,142,169, +229,174,182,231,190,164,228,188,151,229,134,156,230,176,145,229,141,179,229,143, +175,229,144,141,231,168,177,229,174,182,229,133,183,229,138,168,231,148,187,230, +131,179,229,136,176,230,179,168,230,152,142,229,176,143,229,173,166,230,128,167, +232,131,189,232,128,131,231,160,148,231,161,172,228,187,182,232,167,130,231,156, +139,230,184,133,230,165,154,230,144,158,231,172,145,233,166,150,233,160,129,233, +187,132,233,135,145,233,128,130,231,148,168,230,177,159,232,139,143,231,156,159, +229,174,158,228,184,187,231,174,161,233,152,182,230,174,181,232,168,187,229,134, +138,231,191,187,232,175,145,230,157,131,229,136,169,229,129,154,229,165,189,228, +188,188,228,185,142,233,128,154,232,174,175,230,150,189,229,183,165,231,139,128, +230,133,139,228,185,159,232,174,184,231,142,175,228,191,157,229,159,185,229,133, +187,230,166,130,229,191,181,229,164,167,229,158,139,230,156,186,231,165,168,231, +144,134,232,167,163,229,140,191,229,144,141,99,117,97,110,100,111,101,110,118, +105,97,114,109,97,100,114,105,100,98,117,115,99,97,114,105,110,105,99,105,111, +116,105,101,109,112,111,112,111,114,113,117,101,99,117,101,110,116,97,101,115, +116,97,100,111,112,117,101,100,101,110,106,117,101,103,111,115,99,111,110,116, +114,97,101,115,116,195,161,110,110,111,109,98,114,101,116,105,101,110,101,110, +112,101,114,102,105,108,109,97,110,101,114,97,97,109,105,103,111,115,99,105,117, +100,97,100,99,101,110,116,114,111,97,117,110,113,117,101,112,117,101,100,101,115 +,100,101,110,116,114,111,112,114,105,109,101,114,112,114,101,99,105,111,115,101, +103,195,186,110,98,117,101,110,111,115,118,111,108,118,101,114,112,117,110,116, +111,115,115,101,109,97,110,97,104,97,98,195,173,97,97,103,111,115,116,111,110, +117,101,118,111,115,117,110,105,100,111,115,99,97,114,108,111,115,101,113,117, +105,112,111,110,105,195,177,111,115,109,117,99,104,111,115,97,108,103,117,110,97 +,99,111,114,114,101,111,105,109,97,103,101,110,112,97,114,116,105,114,97,114,114 +,105,98,97,109,97,114,195,173,97,104,111,109,98,114,101,101,109,112,108,101,111, +118,101,114,100,97,100,99,97,109,98,105,111,109,117,99,104,97,115,102,117,101, +114,111,110,112,97,115,97,100,111,108,195,173,110,101,97,112,97,114,101,99,101, +110,117,101,118,97,115,99,117,114,115,111,115,101,115,116,97,98,97,113,117,105, +101,114,111,108,105,98,114,111,115,99,117,97,110,116,111,97,99,99,101,115,111, +109,105,103,117,101,108,118,97,114,105,111,115,99,117,97,116,114,111,116,105,101 +,110,101,115,103,114,117,112,111,115,115,101,114,195,161,110,101,117,114,111,112 +,97,109,101,100,105,111,115,102,114,101,110,116,101,97,99,101,114,99,97,100,101, +109,195,161,115,111,102,101,114,116,97,99,111,99,104,101,115,109,111,100,101,108 +,111,105,116,97,108,105,97,108,101,116,114,97,115,97,108,103,195,186,110,99,111, +109,112,114,97,99,117,97,108,101,115,101,120,105,115,116,101,99,117,101,114,112, +111,115,105,101,110,100,111,112,114,101,110,115,97,108,108,101,103,97,114,118, +105,97,106,101,115,100,105,110,101,114,111,109,117,114,99,105,97,112,111,100,114 +,195,161,112,117,101,115,116,111,100,105,97,114,105,111,112,117,101,98,108,111, +113,117,105,101,114,101,109,97,110,117,101,108,112,114,111,112,105,111,99,114, +105,115,105,115,99,105,101,114,116,111,115,101,103,117,114,111,109,117,101,114, +116,101,102,117,101,110,116,101,99,101,114,114,97,114,103,114,97,110,100,101,101 +,102,101,99,116,111,112,97,114,116,101,115,109,101,100,105,100,97,112,114,111, +112,105,97,111,102,114,101,99,101,116,105,101,114,114,97,101,45,109,97,105,108, +118,97,114,105,97,115,102,111,114,109,97,115,102,117,116,117,114,111,111,98,106, +101,116,111,115,101,103,117,105,114,114,105,101,115,103,111,110,111,114,109,97, +115,109,105,115,109,111,115,195,186,110,105,99,111,99,97,109,105,110,111,115,105 +,116,105,111,115,114,97,122,195,179,110,100,101,98,105,100,111,112,114,117,101, +98,97,116,111,108,101,100,111,116,101,110,195,173,97,106,101,115,195,186,115,101 +,115,112,101,114,111,99,111,99,105,110,97,111,114,105,103,101,110,116,105,101, +110,100,97,99,105,101,110,116,111,99,195,161,100,105,122,104,97,98,108,97,114, +115,101,114,195,173,97,108,97,116,105,110,97,102,117,101,114,122,97,101,115,116, +105,108,111,103,117,101,114,114,97,101,110,116,114,97,114,195,169,120,105,116, +111,108,195,179,112,101,122,97,103,101,110,100,97,118,195,173,100,101,111,101, +118,105,116,97,114,112,97,103,105,110,97,109,101,116,114,111,115,106,97,118,105, +101,114,112,97,100,114,101,115,102,195,161,99,105,108,99,97,98,101,122,97,195, +161,114,101,97,115,115,97,108,105,100,97,101,110,118,195,173,111,106,97,112,195, +179,110,97,98,117,115,111,115,98,105,101,110,101,115,116,101,120,116,111,115,108 +,108,101,118,97,114,112,117,101,100,97,110,102,117,101,114,116,101,99,111,109, +195,186,110,99,108,97,115,101,115,104,117,109,97,110,111,116,101,110,105,100,111 +,98,105,108,98,97,111,117,110,105,100,97,100,101,115,116,195,161,115,101,100,105 +,116,97,114,99,114,101,97,100,111,208,180,208,187,209,143,209,135,209,130,208, +190,208,186,208,176,208,186,208,184,208,187,208,184,209,141,209,130,208,190,208, +178,209,129,208,181,208,181,208,179,208,190,208,191,209,128,208,184,209,130,208, +176,208,186,208,181,209,137,208,181,209,131,208,182,208,181,208,154,208,176,208, +186,208,177,208,181,208,183,208,177,209,139,208,187,208,190,208,189,208,184,208, +146,209,129,208,181,208,191,208,190,208,180,208,173,209,130,208,190,209,130,208, +190,208,188,209,135,208,181,208,188,208,189,208,181,209,130,208,187,208,181,209, +130,209,128,208,176,208,183,208,190,208,189,208,176,208,179,208,180,208,181,208, +188,208,189,208,181,208,148,208,187,209,143,208,159,209,128,208,184,208,189,208, +176,209,129,208,189,208,184,209,133,209,130,208,181,208,188,208,186,209,130,208, +190,208,179,208,190,208,180,208,178,208,190,209,130,209,130,208,176,208,188,208, +161,208,168,208,144,208,188,208,176,209,143,208,167,209,130,208,190,208,178,208, +176,209,129,208,178,208,176,208,188,208,181,208,188,209,131,208,162,208,176,208, +186,208,180,208,178,208,176,208,189,208,176,208,188,209,141,209,130,208,184,209, +141,209,130,209,131,208,146,208,176,208,188,209,130,208,181,209,133,208,191,209, +128,208,190,209,130,209,131,209,130,208,189,208,176,208,180,208,180,208,189,209, +143,208,146,208,190,209,130,209,130,209,128,208,184,208,189,208,181,208,185,208, +146,208,176,209,129,208,189,208,184,208,188,209,129,208,176,208,188,209,130,208, +190,209,130,209,128,209,131,208,177,208,158,208,189,208,184,208,188,208,184,209, +128,208,189,208,181,208,181,208,158,208,158,208,158,208,187,208,184,209,134,209, +141,209,130,208,176,208,158,208,189,208,176,208,189,208,181,208,188,208,180,208, +190,208,188,208,188,208,190,208,185,208,180,208,178,208,181,208,190,208,189,208, +190,209,129,209,131,208,180,224,164,149,224,165,135,224,164,185,224,165,136,224, +164,149,224,165,128,224,164,184,224,165,135,224,164,149,224,164,190,224,164,149, +224,165,139,224,164,148,224,164,176,224,164,170,224,164,176,224,164,168,224,165, +135,224,164,143,224,164,149,224,164,149,224,164,191,224,164,173,224,165,128,224, +164,135,224,164,184,224,164,149,224,164,176,224,164,164,224,165,139,224,164,185, +224,165,139,224,164,134,224,164,170,224,164,185,224,165,128,224,164,175,224,164, +185,224,164,175,224,164,190,224,164,164,224,164,149,224,164,165,224,164,190,106, +97,103,114,97,110,224,164,134,224,164,156,224,164,156,224,165,139,224,164,133, +224,164,172,224,164,166,224,165,139,224,164,151,224,164,136,224,164,156,224,164, +190,224,164,151,224,164,143,224,164,185,224,164,174,224,164,135,224,164,168,224, +164,181,224,164,185,224,164,175,224,165,135,224,164,165,224,165,135,224,164,165, +224,165,128,224,164,152,224,164,176,224,164,156,224,164,172,224,164,166,224,165, +128,224,164,149,224,164,136,224,164,156,224,165,128,224,164,181,224,165,135,224, +164,168,224,164,136,224,164,168,224,164,143,224,164,185,224,164,176,224,164,137, +224,164,184,224,164,174,224,165,135,224,164,149,224,164,174,224,164,181,224,165, +139,224,164,178,224,165,135,224,164,184,224,164,172,224,164,174,224,164,136,224, +164,166,224,165,135,224,164,147,224,164,176,224,164,134,224,164,174,224,164,172, +224,164,184,224,164,173,224,164,176,224,164,172,224,164,168,224,164,154,224,164, +178,224,164,174,224,164,168,224,164,134,224,164,151,224,164,184,224,165,128,224, +164,178,224,165,128,216,185,217,132,217,137,216,165,217,132,217,137,217,135,216, +176,216,167,216,162,216,174,216,177,216,185,216,175,216,175,216,167,217,132,217, +137,217,135,216,176,217,135,216,181,217,136,216,177,216,186,217,138,216,177,217, +131,216,167,217,134,217,136,217,132,216,167,216,168,217,138,217,134,216,185,216, +177,216,182,216,176,217,132,217,131,217,135,217,134,216,167,217,138,217,136,217, +133,217,130,216,167,217,132,216,185,217,132,217,138,216,167,217,134,216,167,217, +132,217,131,217,134,216,173,216,170,217,137,217,130,216,168,217,132,217,136,216, +173,216,169,216,167,216,174,216,177,217,129,217,130,216,183,216,185,216,168,216, +175,216,177,217,131,217,134,216,165,216,176,216,167,217,131,217,133,216,167,216, +167,216,173,216,175,216,165,217,132,216,167,217,129,217,138,217,135,216,168,216, +185,216,182,217,131,217,138,217,129,216,168,216,173,216,171,217,136,217,133,217, +134,217,136,217,135,217,136,216,163,217,134,216,167,216,172,216,175,216,167,217, +132,217,135,216,167,216,179,217,132,217,133,216,185,217,134,216,175,217,132,217, +138,216,179,216,185,216,168,216,177,216,181,217,132,217,137,217,133,217,134,216, +176,216,168,217,135,216,167,216,163,217,134,217,135,217,133,216,171,217,132,217, +131,217,134,216,170,216,167,217,132,216,167,216,173,217,138,216,171,217,133,216, +181,216,177,216,180,216,177,216,173,216,173,217,136,217,132,217,136,217,129,217, +138,216,167,216,176,216,167,217,132,217,131,217,132,217,133,216,177,216,169,216, +167,217,134,216,170,216,167,217,132,217,129,216,163,216,168,217,136,216,174,216, +167,216,181,216,163,217,134,216,170,216,167,217,134,217,135,216,167,217,132,217, +138,216,185,216,182,217,136,217,136,217,130,216,175,216,167,216,168,217,134,216, +174,217,138,216,177,216,168,217,134,216,170,217,132,217,131,217,133,216,180,216, +167,216,161,217,136,217,135,217,138,216,167,216,168,217,136,217,130,216,181,216, +181,217,136,217,133,216,167,216,177,217,130,217,133,216,163,216,173,216,175,217, +134,216,173,217,134,216,185,216,175,217,133,216,177,216,163,217,138,216,167,216, +173,216,169,217,131,216,170,216,168,216,175,217,136,217,134,217,138,216,172,216, +168,217,133,217,134,217,135,216,170,216,173,216,170,216,172,217,135,216,169,216, +179,217,134,216,169,217,138,216,170,217,133,217,131,216,177,216,169,216,186,216, +178,216,169,217,134,217,129,216,179,216,168,217,138,216,170,217,132,217,132,217, +135,217,132,217,134,216,167,216,170,217,132,217,131,217,130,217,132,216,168,217, +132,217,133,216,167,216,185,217,134,217,135,216,163,217,136,217,132,216,180,217, +138,216,161,217,134,217,136,216,177,216,163,217,133,216,167,217,129,217,138,217, +131,216,168,217,131,217,132,216,176,216,167,216,170,216,177,216,170,216,168,216, +168,216,163,217,134,217,135,217,133,216,179,216,167,217,134,217,131,216,168,217, +138,216,185,217,129,217,130,216,175,216,173,216,179,217,134,217,132,217,135,217, +133,216,180,216,185,216,177,216,163,217,135,217,132,216,180,217,135,216,177,217, +130,216,183,216,177,216,183,217,132,216,168,112,114,111,102,105,108,101,115,101, +114,118,105,99,101,100,101,102,97,117,108,116,104,105,109,115,101,108,102,100, +101,116,97,105,108,115,99,111,110,116,101,110,116,115,117,112,112,111,114,116, +115,116,97,114,116,101,100,109,101,115,115,97,103,101,115,117,99,99,101,115,115, +102,97,115,104,105,111,110,60,116,105,116,108,101,62,99,111,117,110,116,114,121, +97,99,99,111,117,110,116,99,114,101,97,116,101,100,115,116,111,114,105,101,115, +114,101,115,117,108,116,115,114,117,110,110,105,110,103,112,114,111,99,101,115, +115,119,114,105,116,105,110,103,111,98,106,101,99,116,115,118,105,115,105,98,108 +,101,119,101,108,99,111,109,101,97,114,116,105,99,108,101,117,110,107,110,111, +119,110,110,101,116,119,111,114,107,99,111,109,112,97,110,121,100,121,110,97,109 +,105,99,98,114,111,119,115,101,114,112,114,105,118,97,99,121,112,114,111,98,108, +101,109,83,101,114,118,105,99,101,114,101,115,112,101,99,116,100,105,115,112,108 +,97,121,114,101,113,117,101,115,116,114,101,115,101,114,118,101,119,101,98,115, +105,116,101,104,105,115,116,111,114,121,102,114,105,101,110,100,115,111,112,116, +105,111,110,115,119,111,114,107,105,110,103,118,101,114,115,105,111,110,109,105, +108,108,105,111,110,99,104,97,110,110,101,108,119,105,110,100,111,119,46,97,100, +100,114,101,115,115,118,105,115,105,116,101,100,119,101,97,116,104,101,114,99, +111,114,114,101,99,116,112,114,111,100,117,99,116,101,100,105,114,101,99,116,102 +,111,114,119,97,114,100,121,111,117,32,99,97,110,114,101,109,111,118,101,100,115 +,117,98,106,101,99,116,99,111,110,116,114,111,108,97,114,99,104,105,118,101,99, +117,114,114,101,110,116,114,101,97,100,105,110,103,108,105,98,114,97,114,121,108 +,105,109,105,116,101,100,109,97,110,97,103,101,114,102,117,114,116,104,101,114, +115,117,109,109,97,114,121,109,97,99,104,105,110,101,109,105,110,117,116,101,115 +,112,114,105,118,97,116,101,99,111,110,116,101,120,116,112,114,111,103,114,97, +109,115,111,99,105,101,116,121,110,117,109,98,101,114,115,119,114,105,116,116, +101,110,101,110,97,98,108,101,100,116,114,105,103,103,101,114,115,111,117,114,99 +,101,115,108,111,97,100,105,110,103,101,108,101,109,101,110,116,112,97,114,116, +110,101,114,102,105,110,97,108,108,121,112,101,114,102,101,99,116,109,101,97,110 +,105,110,103,115,121,115,116,101,109,115,107,101,101,112,105,110,103,99,117,108, +116,117,114,101,38,113,117,111,116,59,44,106,111,117,114,110,97,108,112,114,111, +106,101,99,116,115,117,114,102,97,99,101,115,38,113,117,111,116,59,101,120,112, +105,114,101,115,114,101,118,105,101,119,115,98,97,108,97,110,99,101,69,110,103, +108,105,115,104,67,111,110,116,101,110,116,116,104,114,111,117,103,104,80,108, +101,97,115,101,32,111,112,105,110,105,111,110,99,111,110,116,97,99,116,97,118, +101,114,97,103,101,112,114,105,109,97,114,121,118,105,108,108,97,103,101,83,112, +97,110,105,115,104,103,97,108,108,101,114,121,100,101,99,108,105,110,101,109,101 +,101,116,105,110,103,109,105,115,115,105,111,110,112,111,112,117,108,97,114,113, +117,97,108,105,116,121,109,101,97,115,117,114,101,103,101,110,101,114,97,108,115 +,112,101,99,105,101,115,115,101,115,115,105,111,110,115,101,99,116,105,111,110, +119,114,105,116,101,114,115,99,111,117,110,116,101,114,105,110,105,116,105,97, +108,114,101,112,111,114,116,115,102,105,103,117,114,101,115,109,101,109,98,101, +114,115,104,111,108,100,105,110,103,100,105,115,112,117,116,101,101,97,114,108, +105,101,114,101,120,112,114,101,115,115,100,105,103,105,116,97,108,112,105,99, +116,117,114,101,65,110,111,116,104,101,114,109,97,114,114,105,101,100,116,114,97 +,102,102,105,99,108,101,97,100,105,110,103,99,104,97,110,103,101,100,99,101,110, +116,114,97,108,118,105,99,116,111,114,121,105,109,97,103,101,115,47,114,101,97, +115,111,110,115,115,116,117,100,105,101,115,102,101,97,116,117,114,101,108,105, +115,116,105,110,103,109,117,115,116,32,98,101,115,99,104,111,111,108,115,86,101, +114,115,105,111,110,117,115,117,97,108,108,121,101,112,105,115,111,100,101,112, +108,97,121,105,110,103,103,114,111,119,105,110,103,111,98,118,105,111,117,115, +111,118,101,114,108,97,121,112,114,101,115,101,110,116,97,99,116,105,111,110,115 +,60,47,117,108,62,13,10,119,114,97,112,112,101,114,97,108,114,101,97,100,121,99, +101,114,116,97,105,110,114,101,97,108,105,116,121,115,116,111,114,97,103,101,97, +110,111,116,104,101,114,100,101,115,107,116,111,112,111,102,102,101,114,101,100, +112,97,116,116,101,114,110,117,110,117,115,117,97,108,68,105,103,105,116,97,108, +99,97,112,105,116,97,108,87,101,98,115,105,116,101,102,97,105,108,117,114,101,99 +,111,110,110,101,99,116,114,101,100,117,99,101,100,65,110,100,114,111,105,100, +100,101,99,97,100,101,115,114,101,103,117,108,97,114,32,38,97,109,112,59,32,97, +110,105,109,97,108,115,114,101,108,101,97,115,101,65,117,116,111,109,97,116,103, +101,116,116,105,110,103,109,101,116,104,111,100,115,110,111,116,104,105,110,103, +80,111,112,117,108,97,114,99,97,112,116,105,111,110,108,101,116,116,101,114,115, +99,97,112,116,117,114,101,115,99,105,101,110,99,101,108,105,99,101,110,115,101, +99,104,97,110,103,101,115,69,110,103,108,97,110,100,61,49,38,97,109,112,59,72, +105,115,116,111,114,121,32,61,32,110,101,119,32,67,101,110,116,114,97,108,117, +112,100,97,116,101,100,83,112,101,99,105,97,108,78,101,116,119,111,114,107,114, +101,113,117,105,114,101,99,111,109,109,101,110,116,119,97,114,110,105,110,103,67 +,111,108,108,101,103,101,116,111,111,108,98,97,114,114,101,109,97,105,110,115,98 +,101,99,97,117,115,101,101,108,101,99,116,101,100,68,101,117,116,115,99,104,102, +105,110,97,110,99,101,119,111,114,107,101,114,115,113,117,105,99,107,108,121,98, +101,116,119,101,101,110,101,120,97,99,116,108,121,115,101,116,116,105,110,103, +100,105,115,101,97,115,101,83,111,99,105,101,116,121,119,101,97,112,111,110,115, +101,120,104,105,98,105,116,38,108,116,59,33,45,45,67,111,110,116,114,111,108,99, +108,97,115,115,101,115,99,111,118,101,114,101,100,111,117,116,108,105,110,101,97 +,116,116,97,99,107,115,100,101,118,105,99,101,115,40,119,105,110,100,111,119,112 +,117,114,112,111,115,101,116,105,116,108,101,61,34,77,111,98,105,108,101,32,107, +105,108,108,105,110,103,115,104,111,119,105,110,103,73,116,97,108,105,97,110,100 +,114,111,112,112,101,100,104,101,97,118,105,108,121,101,102,102,101,99,116,115, +45,49,39,93,41,59,10,99,111,110,102,105,114,109,67,117,114,114,101,110,116,97, +100,118,97,110,99,101,115,104,97,114,105,110,103,111,112,101,110,105,110,103,100 +,114,97,119,105,110,103,98,105,108,108,105,111,110,111,114,100,101,114,101,100, +71,101,114,109,97,110,121,114,101,108,97,116,101,100,60,47,102,111,114,109,62, +105,110,99,108,117,100,101,119,104,101,116,104,101,114,100,101,102,105,110,101, +100,83,99,105,101,110,99,101,99,97,116,97,108,111,103,65,114,116,105,99,108,101, +98,117,116,116,111,110,115,108,97,114,103,101,115,116,117,110,105,102,111,114, +109,106,111,117,114,110,101,121,115,105,100,101,98,97,114,67,104,105,99,97,103, +111,104,111,108,105,100,97,121,71,101,110,101,114,97,108,112,97,115,115,97,103, +101,44,38,113,117,111,116,59,97,110,105,109,97,116,101,102,101,101,108,105,110, +103,97,114,114,105,118,101,100,112,97,115,115,105,110,103,110,97,116,117,114,97, +108,114,111,117,103,104,108,121,46,10,10,84,104,101,32,98,117,116,32,110,111,116 +,100,101,110,115,105,116,121,66,114,105,116,97,105,110,67,104,105,110,101,115, +101,108,97,99,107,32,111,102,116,114,105,98,117,116,101,73,114,101,108,97,110, +100,34,32,100,97,116,97,45,102,97,99,116,111,114,115,114,101,99,101,105,118,101, +116,104,97,116,32,105,115,76,105,98,114,97,114,121,104,117,115,98,97,110,100,105 +,110,32,102,97,99,116,97,102,102,97,105,114,115,67,104,97,114,108,101,115,114,97 +,100,105,99,97,108,98,114,111,117,103,104,116,102,105,110,100,105,110,103,108,97 +,110,100,105,110,103,58,108,97,110,103,61,34,114,101,116,117,114,110,32,108,101, +97,100,101,114,115,112,108,97,110,110,101,100,112,114,101,109,105,117,109,112,97 +,99,107,97,103,101,65,109,101,114,105,99,97,69,100,105,116,105,111,110,93,38,113 +,117,111,116,59,77,101,115,115,97,103,101,110,101,101,100,32,116,111,118,97,108, +117,101,61,34,99,111,109,112,108,101,120,108,111,111,107,105,110,103,115,116,97, +116,105,111,110,98,101,108,105,101,118,101,115,109,97,108,108,101,114,45,109,111 +,98,105,108,101,114,101,99,111,114,100,115,119,97,110,116,32,116,111,107,105,110 +,100,32,111,102,70,105,114,101,102,111,120,121,111,117,32,97,114,101,115,105,109 +,105,108,97,114,115,116,117,100,105,101,100,109,97,120,105,109,117,109,104,101, +97,100,105,110,103,114,97,112,105,100,108,121,99,108,105,109,97,116,101,107,105, +110,103,100,111,109,101,109,101,114,103,101,100,97,109,111,117,110,116,115,102, +111,117,110,100,101,100,112,105,111,110,101,101,114,102,111,114,109,117,108,97, +100,121,110,97,115,116,121,104,111,119,32,116,111,32,83,117,112,112,111,114,116, +114,101,118,101,110,117,101,101,99,111,110,111,109,121,82,101,115,117,108,116, +115,98,114,111,116,104,101,114,115,111,108,100,105,101,114,108,97,114,103,101, +108,121,99,97,108,108,105,110,103,46,38,113,117,111,116,59,65,99,99,111,117,110, +116,69,100,119,97,114,100,32,115,101,103,109,101,110,116,82,111,98,101,114,116, +32,101,102,102,111,114,116,115,80,97,99,105,102,105,99,108,101,97,114,110,101, +100,117,112,32,119,105,116,104,104,101,105,103,104,116,58,119,101,32,104,97,118, +101,65,110,103,101,108,101,115,110,97,116,105,111,110,115,95,115,101,97,114,99, +104,97,112,112,108,105,101,100,97,99,113,117,105,114,101,109,97,115,115,105,118, +101,103,114,97,110,116,101,100,58,32,102,97,108,115,101,116,114,101,97,116,101, +100,98,105,103,103,101,115,116,98,101,110,101,102,105,116,100,114,105,118,105, +110,103,83,116,117,100,105,101,115,109,105,110,105,109,117,109,112,101,114,104, +97,112,115,109,111,114,110,105,110,103,115,101,108,108,105,110,103,105,115,32, +117,115,101,100,114,101,118,101,114,115,101,118,97,114,105,97,110,116,32,114,111 +,108,101,61,34,109,105,115,115,105,110,103,97,99,104,105,101,118,101,112,114,111 +,109,111,116,101,115,116,117,100,101,110,116,115,111,109,101,111,110,101,101,120 +,116,114,101,109,101,114,101,115,116,111,114,101,98,111,116,116,111,109,58,101, +118,111,108,118,101,100,97,108,108,32,116,104,101,115,105,116,101,109,97,112,101 +,110,103,108,105,115,104,119,97,121,32,116,111,32,32,65,117,103,117,115,116,115, +121,109,98,111,108,115,67,111,109,112,97,110,121,109,97,116,116,101,114,115,109, +117,115,105,99,97,108,97,103,97,105,110,115,116,115,101,114,118,105,110,103,125, +41,40,41,59,13,10,112,97,121,109,101,110,116,116,114,111,117,98,108,101,99,111, +110,99,101,112,116,99,111,109,112,97,114,101,112,97,114,101,110,116,115,112,108, +97,121,101,114,115,114,101,103,105,111,110,115,109,111,110,105,116,111,114,32,39 +,39,84,104,101,32,119,105,110,110,105,110,103,101,120,112,108,111,114,101,97,100 +,97,112,116,101,100,71,97,108,108,101,114,121,112,114,111,100,117,99,101,97,98, +105,108,105,116,121,101,110,104,97,110,99,101,99,97,114,101,101,114,115,41,46,32 +,84,104,101,32,99,111,108,108,101,99,116,83,101,97,114,99,104,32,97,110,99,105, +101,110,116,101,120,105,115,116,101,100,102,111,111,116,101,114,32,104,97,110, +100,108,101,114,112,114,105,110,116,101,100,99,111,110,115,111,108,101,69,97,115 +,116,101,114,110,101,120,112,111,114,116,115,119,105,110,100,111,119,115,67,104, +97,110,110,101,108,105,108,108,101,103,97,108,110,101,117,116,114,97,108,115,117 +,103,103,101,115,116,95,104,101,97,100,101,114,115,105,103,110,105,110,103,46, +104,116,109,108,34,62,115,101,116,116,108,101,100,119,101,115,116,101,114,110,99 +,97,117,115,105,110,103,45,119,101,98,107,105,116,99,108,97,105,109,101,100,74, +117,115,116,105,99,101,99,104,97,112,116,101,114,118,105,99,116,105,109,115,84, +104,111,109,97,115,32,109,111,122,105,108,108,97,112,114,111,109,105,115,101,112 +,97,114,116,105,101,115,101,100,105,116,105,111,110,111,117,116,115,105,100,101, +58,102,97,108,115,101,44,104,117,110,100,114,101,100,79,108,121,109,112,105,99, +95,98,117,116,116,111,110,97,117,116,104,111,114,115,114,101,97,99,104,101,100, +99,104,114,111,110,105,99,100,101,109,97,110,100,115,115,101,99,111,110,100,115, +112,114,111,116,101,99,116,97,100,111,112,116,101,100,112,114,101,112,97,114,101 +,110,101,105,116,104,101,114,103,114,101,97,116,108,121,103,114,101,97,116,101, +114,111,118,101,114,97,108,108,105,109,112,114,111,118,101,99,111,109,109,97,110 +,100,115,112,101,99,105,97,108,115,101,97,114,99,104,46,119,111,114,115,104,105, +112,102,117,110,100,105,110,103,116,104,111,117,103,104,116,104,105,103,104,101, +115,116,105,110,115,116,101,97,100,117,116,105,108,105,116,121,113,117,97,114, +116,101,114,67,117,108,116,117,114,101,116,101,115,116,105,110,103,99,108,101,97 +,114,108,121,101,120,112,111,115,101,100,66,114,111,119,115,101,114,108,105,98, +101,114,97,108,125,32,99,97,116,99,104,80,114,111,106,101,99,116,101,120,97,109, +112,108,101,104,105,100,101,40,41,59,70,108,111,114,105,100,97,97,110,115,119, +101,114,115,97,108,108,111,119,101,100,69,109,112,101,114,111,114,100,101,102, +101,110,115,101,115,101,114,105,111,117,115,102,114,101,101,100,111,109,83,101, +118,101,114,97,108,45,98,117,116,116,111,110,70,117,114,116,104,101,114,111,117, +116,32,111,102,32,33,61,32,110,117,108,108,116,114,97,105,110,101,100,68,101,110 +,109,97,114,107,118,111,105,100,40,48,41,47,97,108,108,46,106,115,112,114,101, +118,101,110,116,82,101,113,117,101,115,116,83,116,101,112,104,101,110,10,10,87, +104,101,110,32,111,98,115,101,114,118,101,60,47,104,50,62,13,10,77,111,100,101, +114,110,32,112,114,111,118,105,100,101,34,32,97,108,116,61,34,98,111,114,100,101 +,114,115,46,10,10,70,111,114,32,10,10,77,97,110,121,32,97,114,116,105,115,116, +115,112,111,119,101,114,101,100,112,101,114,102,111,114,109,102,105,99,116,105, +111,110,116,121,112,101,32,111,102,109,101,100,105,99,97,108,116,105,99,107,101, +116,115,111,112,112,111,115,101,100,67,111,117,110,99,105,108,119,105,116,110, +101,115,115,106,117,115,116,105,99,101,71,101,111,114,103,101,32,66,101,108,103, +105,117,109,46,46,46,60,47,97,62,116,119,105,116,116,101,114,110,111,116,97,98, +108,121,119,97,105,116,105,110,103,119,97,114,102,97,114,101,32,79,116,104,101, +114,32,114,97,110,107,105,110,103,112,104,114,97,115,101,115,109,101,110,116,105 +,111,110,115,117,114,118,105,118,101,115,99,104,111,108,97,114,60,47,112,62,13, +10,32,67,111,117,110,116,114,121,105,103,110,111,114,101,100,108,111,115,115,32, +111,102,106,117,115,116,32,97,115,71,101,111,114,103,105,97,115,116,114,97,110, +103,101,60,104,101,97,100,62,60,115,116,111,112,112,101,100,49,39,93,41,59,13,10 +,105,115,108,97,110,100,115,110,111,116,97,98,108,101,98,111,114,100,101,114,58, +108,105,115,116,32,111,102,99,97,114,114,105,101,100,49,48,48,44,48,48,48,60,47, +104,51,62,10,32,115,101,118,101,114,97,108,98,101,99,111,109,101,115,115,101,108 +,101,99,116,32,119,101,100,100,105,110,103,48,48,46,104,116,109,108,109,111,110, +97,114,99,104,111,102,102,32,116,104,101,116,101,97,99,104,101,114,104,105,103, +104,108,121,32,98,105,111,108,111,103,121,108,105,102,101,32,111,102,111,114,32, +101,118,101,110,114,105,115,101,32,111,102,38,114,97,113,117,111,59,112,108,117, +115,111,110,101,104,117,110,116,105,110,103,40,116,104,111,117,103,104,68,111, +117,103,108,97,115,106,111,105,110,105,110,103,99,105,114,99,108,101,115,70,111, +114,32,116,104,101,65,110,99,105,101,110,116,86,105,101,116,110,97,109,118,101, +104,105,99,108,101,115,117,99,104,32,97,115,99,114,121,115,116,97,108,118,97,108 +,117,101,32,61,87,105,110,100,111,119,115,101,110,106,111,121,101,100,97,32,115, +109,97,108,108,97,115,115,117,109,101,100,60,97,32,105,100,61,34,102,111,114,101 +,105,103,110,32,65,108,108,32,114,105,104,111,119,32,116,104,101,68,105,115,112, +108,97,121,114,101,116,105,114,101,100,104,111,119,101,118,101,114,104,105,100, +100,101,110,59,98,97,116,116,108,101,115,115,101,101,107,105,110,103,99,97,98, +105,110,101,116,119,97,115,32,110,111,116,108,111,111,107,32,97,116,99,111,110, +100,117,99,116,103,101,116,32,116,104,101,74,97,110,117,97,114,121,104,97,112, +112,101,110,115,116,117,114,110,105,110,103,97,58,104,111,118,101,114,79,110,108 +,105,110,101,32,70,114,101,110,99,104,32,108,97,99,107,105,110,103,116,121,112, +105,99,97,108,101,120,116,114,97,99,116,101,110,101,109,105,101,115,101,118,101, +110,32,105,102,103,101,110,101,114,97,116,100,101,99,105,100,101,100,97,114,101, +32,110,111,116,47,115,101,97,114,99,104,98,101,108,105,101,102,115,45,105,109,97 +,103,101,58,108,111,99,97,116,101,100,115,116,97,116,105,99,46,108,111,103,105, +110,34,62,99,111,110,118,101,114,116,118,105,111,108,101,110,116,101,110,116,101 +,114,101,100,102,105,114,115,116,34,62,99,105,114,99,117,105,116,70,105,110,108, +97,110,100,99,104,101,109,105,115,116,115,104,101,32,119,97,115,49,48,112,120,59 +,34,62,97,115,32,115,117,99,104,100,105,118,105,100,101,100,60,47,115,112,97,110 +,62,119,105,108,108,32,98,101,108,105,110,101,32,111,102,97,32,103,114,101,97, +116,109,121,115,116,101,114,121,47,105,110,100,101,120,46,102,97,108,108,105,110 +,103,100,117,101,32,116,111,32,114,97,105,108,119,97,121,99,111,108,108,101,103, +101,109,111,110,115,116,101,114,100,101,115,99,101,110,116,105,116,32,119,105, +116,104,110,117,99,108,101,97,114,74,101,119,105,115,104,32,112,114,111,116,101, +115,116,66,114,105,116,105,115,104,102,108,111,119,101,114,115,112,114,101,100, +105,99,116,114,101,102,111,114,109,115,98,117,116,116,111,110,32,119,104,111,32, +119,97,115,108,101,99,116,117,114,101,105,110,115,116,97,110,116,115,117,105,99, +105,100,101,103,101,110,101,114,105,99,112,101,114,105,111,100,115,109,97,114, +107,101,116,115,83,111,99,105,97,108,32,102,105,115,104,105,110,103,99,111,109, +98,105,110,101,103,114,97,112,104,105,99,119,105,110,110,101,114,115,60,98,114, +32,47,62,60,98,121,32,116,104,101,32,78,97,116,117,114,97,108,80,114,105,118,97, +99,121,99,111,111,107,105,101,115,111,117,116,99,111,109,101,114,101,115,111,108 +,118,101,83,119,101,100,105,115,104,98,114,105,101,102,108,121,80,101,114,115, +105,97,110,115,111,32,109,117,99,104,67,101,110,116,117,114,121,100,101,112,105, +99,116,115,99,111,108,117,109,110,115,104,111,117,115,105,110,103,115,99,114,105 +,112,116,115,110,101,120,116,32,116,111,98,101,97,114,105,110,103,109,97,112,112 +,105,110,103,114,101,118,105,115,101,100,106,81,117,101,114,121,40,45,119,105, +100,116,104,58,116,105,116,108,101,34,62,116,111,111,108,116,105,112,83,101,99, +116,105,111,110,100,101,115,105,103,110,115,84,117,114,107,105,115,104,121,111, +117,110,103,101,114,46,109,97,116,99,104,40,125,41,40,41,59,10,10,98,117,114,110 +,105,110,103,111,112,101,114,97,116,101,100,101,103,114,101,101,115,115,111,117, +114,99,101,61,82,105,99,104,97,114,100,99,108,111,115,101,108,121,112,108,97,115 +,116,105,99,101,110,116,114,105,101,115,60,47,116,114,62,13,10,99,111,108,111, +114,58,35,117,108,32,105,100,61,34,112,111,115,115,101,115,115,114,111,108,108, +105,110,103,112,104,121,115,105,99,115,102,97,105,108,105,110,103,101,120,101,99 +,117,116,101,99,111,110,116,101,115,116,108,105,110,107,32,116,111,68,101,102,97 +,117,108,116,60,98,114,32,47,62,10,58,32,116,114,117,101,44,99,104,97,114,116, +101,114,116,111,117,114,105,115,109,99,108,97,115,115,105,99,112,114,111,99,101, +101,100,101,120,112,108,97,105,110,60,47,104,49,62,13,10,111,110,108,105,110,101 +,46,63,120,109,108,32,118,101,104,101,108,112,105,110,103,100,105,97,109,111,110 +,100,117,115,101,32,116,104,101,97,105,114,108,105,110,101,101,110,100,32,45,45, +62,41,46,97,116,116,114,40,114,101,97,100,101,114,115,104,111,115,116,105,110, +103,35,102,102,102,102,102,102,114,101,97,108,105,122,101,86,105,110,99,101,110, +116,115,105,103,110,97,108,115,32,115,114,99,61,34,47,80,114,111,100,117,99,116, +100,101,115,112,105,116,101,100,105,118,101,114,115,101,116,101,108,108,105,110, +103,80,117,98,108,105,99,32,104,101,108,100,32,105,110,74,111,115,101,112,104,32 +,116,104,101,97,116,114,101,97,102,102,101,99,116,115,60,115,116,121,108,101,62, +97,32,108,97,114,103,101,100,111,101,115,110,39,116,108,97,116,101,114,44,32,69, +108,101,109,101,110,116,102,97,118,105,99,111,110,99,114,101,97,116,111,114,72, +117,110,103,97,114,121,65,105,114,112,111,114,116,115,101,101,32,116,104,101,115 +,111,32,116,104,97,116,77,105,99,104,97,101,108,83,121,115,116,101,109,115,80, +114,111,103,114,97,109,115,44,32,97,110,100,32,32,119,105,100,116,104,61,101,38, +113,117,111,116,59,116,114,97,100,105,110,103,108,101,102,116,34,62,10,112,101, +114,115,111,110,115,71,111,108,100,101,110,32,65,102,102,97,105,114,115,103,114, +97,109,109,97,114,102,111,114,109,105,110,103,100,101,115,116,114,111,121,105, +100,101,97,32,111,102,99,97,115,101,32,111,102,111,108,100,101,115,116,32,116, +104,105,115,32,105,115,46,115,114,99,32,61,32,99,97,114,116,111,111,110,114,101, +103,105,115,116,114,67,111,109,109,111,110,115,77,117,115,108,105,109,115,87,104 +,97,116,32,105,115,105,110,32,109,97,110,121,109,97,114,107,105,110,103,114,101, +118,101,97,108,115,73,110,100,101,101,100,44,101,113,117,97,108,108,121,47,115, +104,111,119,95,97,111,117,116,100,111,111,114,101,115,99,97,112,101,40,65,117, +115,116,114,105,97,103,101,110,101,116,105,99,115,121,115,116,101,109,44,73,110, +32,116,104,101,32,115,105,116,116,105,110,103,72,101,32,97,108,115,111,73,115, +108,97,110,100,115,65,99,97,100,101,109,121,10,9,9,60,33,45,45,68,97,110,105,101 +,108,32,98,105,110,100,105,110,103,98,108,111,99,107,34,62,105,109,112,111,115, +101,100,117,116,105,108,105,122,101,65,98,114,97,104,97,109,40,101,120,99,101, +112,116,123,119,105,100,116,104,58,112,117,116,116,105,110,103,41,46,104,116,109 +,108,40,124,124,32,91,93,59,10,68,65,84,65,91,32,42,107,105,116,99,104,101,110, +109,111,117,110,116,101,100,97,99,116,117,97,108,32,100,105,97,108,101,99,116, +109,97,105,110,108,121,32,95,98,108,97,110,107,39,105,110,115,116,97,108,108,101 +,120,112,101,114,116,115,105,102,40,116,121,112,101,73,116,32,97,108,115,111,38, +99,111,112,121,59,32,34,62,84,101,114,109,115,98,111,114,110,32,105,110,79,112, +116,105,111,110,115,101,97,115,116,101,114,110,116,97,108,107,105,110,103,99,111 +,110,99,101,114,110,103,97,105,110,101,100,32,111,110,103,111,105,110,103,106, +117,115,116,105,102,121,99,114,105,116,105,99,115,102,97,99,116,111,114,121,105, +116,115,32,111,119,110,97,115,115,97,117,108,116,105,110,118,105,116,101,100,108 +,97,115,116,105,110,103,104,105,115,32,111,119,110,104,114,101,102,61,34,47,34, +32,114,101,108,61,34,100,101,118,101,108,111,112,99,111,110,99,101,114,116,100, +105,97,103,114,97,109,100,111,108,108,97,114,115,99,108,117,115,116,101,114,112, +104,112,63,105,100,61,97,108,99,111,104,111,108,41,59,125,41,40,41,59,117,115, +105,110,103,32,97,62,60,115,112,97,110,62,118,101,115,115,101,108,115,114,101, +118,105,118,97,108,65,100,100,114,101,115,115,97,109,97,116,101,117,114,97,110, +100,114,111,105,100,97,108,108,101,103,101,100,105,108,108,110,101,115,115,119, +97,108,107,105,110,103,99,101,110,116,101,114,115,113,117,97,108,105,102,121,109 +,97,116,99,104,101,115,117,110,105,102,105,101,100,101,120,116,105,110,99,116,68 +,101,102,101,110,115,101,100,105,101,100,32,105,110,10,9,60,33,45,45,32,99,117, +115,116,111,109,115,108,105,110,107,105,110,103,76,105,116,116,108,101,32,66,111 +,111,107,32,111,102,101,118,101,110,105,110,103,109,105,110,46,106,115,63,97,114 +,101,32,116,104,101,107,111,110,116,97,107,116,116,111,100,97,121,39,115,46,104, +116,109,108,34,32,116,97,114,103,101,116,61,119,101,97,114,105,110,103,65,108, +108,32,82,105,103,59,10,125,41,40,41,59,114,97,105,115,105,110,103,32,65,108,115 +,111,44,32,99,114,117,99,105,97,108,97,98,111,117,116,34,62,100,101,99,108,97, +114,101,45,45,62,10,60,115,99,102,105,114,101,102,111,120,97,115,32,109,117,99, +104,97,112,112,108,105,101,115,105,110,100,101,120,44,32,115,44,32,98,117,116,32 +,116,121,112,101,32,61,32,10,13,10,60,33,45,45,116,111,119,97,114,100,115,82,101 +,99,111,114,100,115,80,114,105,118,97,116,101,70,111,114,101,105,103,110,80,114, +101,109,105,101,114,99,104,111,105,99,101,115,86,105,114,116,117,97,108,114,101, +116,117,114,110,115,67,111,109,109,101,110,116,80,111,119,101,114,101,100,105, +110,108,105,110,101,59,112,111,118,101,114,116,121,99,104,97,109,98,101,114,76, +105,118,105,110,103,32,118,111,108,117,109,101,115,65,110,116,104,111,110,121, +108,111,103,105,110,34,32,82,101,108,97,116,101,100,69,99,111,110,111,109,121, +114,101,97,99,104,101,115,99,117,116,116,105,110,103,103,114,97,118,105,116,121, +108,105,102,101,32,105,110,67,104,97,112,116,101,114,45,115,104,97,100,111,119, +78,111,116,97,98,108,101,60,47,116,100,62,13,10,32,114,101,116,117,114,110,115, +116,97,100,105,117,109,119,105,100,103,101,116,115,118,97,114,121,105,110,103, +116,114,97,118,101,108,115,104,101,108,100,32,98,121,119,104,111,32,97,114,101, +119,111,114,107,32,105,110,102,97,99,117,108,116,121,97,110,103,117,108,97,114, +119,104,111,32,104,97,100,97,105,114,112,111,114,116,116,111,119,110,32,111,102, +10,10,83,111,109,101,32,39,99,108,105,99,107,39,99,104,97,114,103,101,115,107, +101,121,119,111,114,100,105,116,32,119,105,108,108,99,105,116,121,32,111,102,40, +116,104,105,115,41,59,65,110,100,114,101,119,32,117,110,105,113,117,101,32,99, +104,101,99,107,101,100,111,114,32,109,111,114,101,51,48,48,112,120,59,32,114,101 +,116,117,114,110,59,114,115,105,111,110,61,34,112,108,117,103,105,110,115,119, +105,116,104,105,110,32,104,101,114,115,101,108,102,83,116,97,116,105,111,110,70, +101,100,101,114,97,108,118,101,110,116,117,114,101,112,117,98,108,105,115,104, +115,101,110,116,32,116,111,116,101,110,115,105,111,110,97,99,116,114,101,115,115 +,99,111,109,101,32,116,111,102,105,110,103,101,114,115,68,117,107,101,32,111,102 +,112,101,111,112,108,101,44,101,120,112,108,111,105,116,119,104,97,116,32,105, +115,104,97,114,109,111,110,121,97,32,109,97,106,111,114,34,58,34,104,116,116,112 +,105,110,32,104,105,115,32,109,101,110,117,34,62,10,109,111,110,116,104,108,121, +111,102,102,105,99,101,114,99,111,117,110,99,105,108,103,97,105,110,105,110,103, +101,118,101,110,32,105,110,83,117,109,109,97,114,121,100,97,116,101,32,111,102, +108,111,121,97,108,116,121,102,105,116,110,101,115,115,97,110,100,32,119,97,115, +101,109,112,101,114,111,114,115,117,112,114,101,109,101,83,101,99,111,110,100,32 +,104,101,97,114,105,110,103,82,117,115,115,105,97,110,108,111,110,103,101,115, +116,65,108,98,101,114,116,97,108,97,116,101,114,97,108,115,101,116,32,111,102,32 +,115,109,97,108,108,34,62,46,97,112,112,101,110,100,100,111,32,119,105,116,104, +102,101,100,101,114,97,108,98,97,110,107,32,111,102,98,101,110,101,97,116,104,68 +,101,115,112,105,116,101,67,97,112,105,116,97,108,103,114,111,117,110,100,115,41 +,44,32,97,110,100,32,112,101,114,99,101,110,116,105,116,32,102,114,111,109,99, +108,111,115,105,110,103,99,111,110,116,97,105,110,73,110,115,116,101,97,100,102, +105,102,116,101,101,110,97,115,32,119,101,108,108,46,121,97,104,111,111,46,114, +101,115,112,111,110,100,102,105,103,104,116,101,114,111,98,115,99,117,114,101, +114,101,102,108,101,99,116,111,114,103,97,110,105,99,61,32,77,97,116,104,46,101, +100,105,116,105,110,103,111,110,108,105,110,101,32,112,97,100,100,105,110,103,97 +,32,119,104,111,108,101,111,110,101,114,114,111,114,121,101,97,114,32,111,102, +101,110,100,32,111,102,32,98,97,114,114,105,101,114,119,104,101,110,32,105,116, +104,101,97,100,101,114,32,104,111,109,101,32,111,102,114,101,115,117,109,101,100 +,114,101,110,97,109,101,100,115,116,114,111,110,103,62,104,101,97,116,105,110, +103,114,101,116,97,105,110,115,99,108,111,117,100,102,114,119,97,121,32,111,102, +32,77,97,114,99,104,32,49,107,110,111,119,105,110,103,105,110,32,112,97,114,116, +66,101,116,119,101,101,110,108,101,115,115,111,110,115,99,108,111,115,101,115, +116,118,105,114,116,117,97,108,108,105,110,107,115,34,62,99,114,111,115,115,101, +100,69,78,68,32,45,45,62,102,97,109,111,117,115,32,97,119,97,114,100,101,100,76, +105,99,101,110,115,101,72,101,97,108,116,104,32,102,97,105,114,108,121,32,119, +101,97,108,116,104,121,109,105,110,105,109,97,108,65,102,114,105,99,97,110,99, +111,109,112,101,116,101,108,97,98,101,108,34,62,115,105,110,103,105,110,103,102, +97,114,109,101,114,115,66,114,97,115,105,108,41,100,105,115,99,117,115,115,114, +101,112,108,97,99,101,71,114,101,103,111,114,121,102,111,110,116,32,99,111,112, +117,114,115,117,101,100,97,112,112,101,97,114,115,109,97,107,101,32,117,112,114, +111,117,110,100,101,100,98,111,116,104,32,111,102,98,108,111,99,107,101,100,115, +97,119,32,116,104,101,111,102,102,105,99,101,115,99,111,108,111,117,114,115,105, +102,40,100,111,99,117,119,104,101,110,32,104,101,101,110,102,111,114,99,101,112, +117,115,104,40,102,117,65,117,103,117,115,116,32,85,84,70,45,56,34,62,70,97,110, +116,97,115,121,105,110,32,109,111,115,116,105,110,106,117,114,101,100,85,115,117 +,97,108,108,121,102,97,114,109,105,110,103,99,108,111,115,117,114,101,111,98,106 +,101,99,116,32,100,101,102,101,110,99,101,117,115,101,32,111,102,32,77,101,100, +105,99,97,108,60,98,111,100,121,62,10,101,118,105,100,101,110,116,98,101,32,117, +115,101,100,107,101,121,67,111,100,101,115,105,120,116,101,101,110,73,115,108,97 +,109,105,99,35,48,48,48,48,48,48,101,110,116,105,114,101,32,119,105,100,101,108, +121,32,97,99,116,105,118,101,32,40,116,121,112,101,111,102,111,110,101,32,99,97, +110,99,111,108,111,114,32,61,115,112,101,97,107,101,114,101,120,116,101,110,100, +115,80,104,121,115,105,99,115,116,101,114,114,97,105,110,60,116,98,111,100,121, +62,102,117,110,101,114,97,108,118,105,101,119,105,110,103,109,105,100,100,108, +101,32,99,114,105,99,107,101,116,112,114,111,112,104,101,116,115,104,105,102,116 +,101,100,100,111,99,116,111,114,115,82,117,115,115,101,108,108,32,116,97,114,103 +,101,116,99,111,109,112,97,99,116,97,108,103,101,98,114,97,115,111,99,105,97,108 +,45,98,117,108,107,32,111,102,109,97,110,32,97,110,100,60,47,116,100,62,10,32, +104,101,32,108,101,102,116,41,46,118,97,108,40,41,102,97,108,115,101,41,59,108, +111,103,105,99,97,108,98,97,110,107,105,110,103,104,111,109,101,32,116,111,110, +97,109,105,110,103,32,65,114,105,122,111,110,97,99,114,101,100,105,116,115,41,59 +,10,125,41,59,10,102,111,117,110,100,101,114,105,110,32,116,117,114,110,67,111, +108,108,105,110,115,98,101,102,111,114,101,32,66,117,116,32,116,104,101,99,104, +97,114,103,101,100,84,105,116,108,101,34,62,67,97,112,116,97,105,110,115,112,101 +,108,108,101,100,103,111,100,100,101,115,115,84,97,103,32,45,45,62,65,100,100, +105,110,103,58,98,117,116,32,119,97,115,82,101,99,101,110,116,32,112,97,116,105, +101,110,116,98,97,99,107,32,105,110,61,102,97,108,115,101,38,76,105,110,99,111, +108,110,119,101,32,107,110,111,119,67,111,117,110,116,101,114,74,117,100,97,105, +115,109,115,99,114,105,112,116,32,97,108,116,101,114,101,100,39,93,41,59,10,32, +32,104,97,115,32,116,104,101,117,110,99,108,101,97,114,69,118,101,110,116,39,44, +98,111,116,104,32,105,110,110,111,116,32,97,108,108,10,10,60,33,45,45,32,112,108 +,97,99,105,110,103,104,97,114,100,32,116,111,32,99,101,110,116,101,114,115,111, +114,116,32,111,102,99,108,105,101,110,116,115,115,116,114,101,101,116,115,66,101 +,114,110,97,114,100,97,115,115,101,114,116,115,116,101,110,100,32,116,111,102,97 +,110,116,97,115,121,100,111,119,110,32,105,110,104,97,114,98,111,117,114,70,114, +101,101,100,111,109,106,101,119,101,108,114,121,47,97,98,111,117,116,46,46,115, +101,97,114,99,104,108,101,103,101,110,100,115,105,115,32,109,97,100,101,109,111, +100,101,114,110,32,111,110,108,121,32,111,110,111,110,108,121,32,116,111,105,109 +,97,103,101,34,32,108,105,110,101,97,114,32,112,97,105,110,116,101,114,97,110, +100,32,110,111,116,114,97,114,101,108,121,32,97,99,114,111,110,121,109,100,101, +108,105,118,101,114,115,104,111,114,116,101,114,48,48,38,97,109,112,59,97,115,32 +,109,97,110,121,119,105,100,116,104,61,34,47,42,32,60,33,91,67,116,105,116,108, +101,32,61,111,102,32,116,104,101,32,108,111,119,101,115,116,32,112,105,99,107, +101,100,32,101,115,99,97,112,101,100,117,115,101,115,32,111,102,112,101,111,112, +108,101,115,32,80,117,98,108,105,99,77,97,116,116,104,101,119,116,97,99,116,105, +99,115,100,97,109,97,103,101,100,119,97,121,32,102,111,114,108,97,119,115,32,111 +,102,101,97,115,121,32,116,111,32,119,105,110,100,111,119,115,116,114,111,110, +103,32,32,115,105,109,112,108,101,125,99,97,116,99,104,40,115,101,118,101,110, +116,104,105,110,102,111,98,111,120,119,101,110,116,32,116,111,112,97,105,110,116 +,101,100,99,105,116,105,122,101,110,73,32,100,111,110,39,116,114,101,116,114,101 +,97,116,46,32,83,111,109,101,32,119,119,46,34,41,59,10,98,111,109,98,105,110,103 +,109,97,105,108,116,111,58,109,97,100,101,32,105,110,46,32,77,97,110,121,32,99, +97,114,114,105,101,115,124,124,123,125,59,119,105,119,111,114,107,32,111,102,115 +,121,110,111,110,121,109,100,101,102,101,97,116,115,102,97,118,111,114,101,100, +111,112,116,105,99,97,108,112,97,103,101,84,114,97,117,110,108,101,115,115,32, +115,101,110,100,105,110,103,108,101,102,116,34,62,60,99,111,109,83,99,111,114,65 +,108,108,32,116,104,101,106,81,117,101,114,121,46,116,111,117,114,105,115,116,67 +,108,97,115,115,105,99,102,97,108,115,101,34,32,87,105,108,104,101,108,109,115, +117,98,117,114,98,115,103,101,110,117,105,110,101,98,105,115,104,111,112,115,46, +115,112,108,105,116,40,103,108,111,98,97,108,32,102,111,108,108,111,119,115,98, +111,100,121,32,111,102,110,111,109,105,110,97,108,67,111,110,116,97,99,116,115, +101,99,117,108,97,114,108,101,102,116,32,116,111,99,104,105,101,102,108,121,45, +104,105,100,100,101,110,45,98,97,110,110,101,114,60,47,108,105,62,10,10,46,32,87 +,104,101,110,32,105,110,32,98,111,116,104,100,105,115,109,105,115,115,69,120,112 +,108,111,114,101,97,108,119,97,121,115,32,118,105,97,32,116,104,101,115,112,97, +195,177,111,108,119,101,108,102,97,114,101,114,117,108,105,110,103,32,97,114,114 +,97,110,103,101,99,97,112,116,97,105,110,104,105,115,32,115,111,110,114,117,108, +101,32,111,102,104,101,32,116,111,111,107,105,116,115,101,108,102,44,61,48,38,97 +,109,112,59,40,99,97,108,108,101,100,115,97,109,112,108,101,115,116,111,32,109, +97,107,101,99,111,109,47,112,97,103,77,97,114,116,105,110,32,75,101,110,110,101, +100,121,97,99,99,101,112,116,115,102,117,108,108,32,111,102,104,97,110,100,108, +101,100,66,101,115,105,100,101,115,47,47,45,45,62,60,47,97,98,108,101,32,116,111 +,116,97,114,103,101,116,115,101,115,115,101,110,99,101,104,105,109,32,116,111,32 +,105,116,115,32,98,121,32,99,111,109,109,111,110,46,109,105,110,101,114,97,108, +116,111,32,116,97,107,101,119,97,121,115,32,116,111,115,46,111,114,103,47,108,97 +,100,118,105,115,101,100,112,101,110,97,108,116,121,115,105,109,112,108,101,58, +105,102,32,116,104,101,121,76,101,116,116,101,114,115,97,32,115,104,111,114,116, +72,101,114,98,101,114,116,115,116,114,105,107,101,115,32,103,114,111,117,112,115 +,46,108,101,110,103,116,104,102,108,105,103,104,116,115,111,118,101,114,108,97, +112,115,108,111,119,108,121,32,108,101,115,115,101,114,32,115,111,99,105,97,108, +32,60,47,112,62,10,9,9,105,116,32,105,110,116,111,114,97,110,107,101,100,32,114, +97,116,101,32,111,102,117,108,62,13,10,32,32,97,116,116,101,109,112,116,112,97, +105,114,32,111,102,109,97,107,101,32,105,116,75,111,110,116,97,107,116,65,110, +116,111,110,105,111,104,97,118,105,110,103,32,114,97,116,105,110,103,115,32,97, +99,116,105,118,101,115,116,114,101,97,109,115,116,114,97,112,112,101,100,34,41, +46,99,115,115,40,104,111,115,116,105,108,101,108,101,97,100,32,116,111,108,105, +116,116,108,101,32,103,114,111,117,112,115,44,80,105,99,116,117,114,101,45,45,62 +,13,10,13,10,32,114,111,119,115,61,34,32,111,98,106,101,99,116,105,110,118,101, +114,115,101,60,102,111,111,116,101,114,67,117,115,116,111,109,86,62,60,92,47,115 +,99,114,115,111,108,118,105,110,103,67,104,97,109,98,101,114,115,108,97,118,101, +114,121,119,111,117,110,100,101,100,119,104,101,114,101,97,115,33,61,32,39,117, +110,100,102,111,114,32,97,108,108,112,97,114,116,108,121,32,45,114,105,103,104, +116,58,65,114,97,98,105,97,110,98,97,99,107,101,100,32,99,101,110,116,117,114, +121,117,110,105,116,32,111,102,109,111,98,105,108,101,45,69,117,114,111,112,101, +44,105,115,32,104,111,109,101,114,105,115,107,32,111,102,100,101,115,105,114,101 +,100,67,108,105,110,116,111,110,99,111,115,116,32,111,102,97,103,101,32,111,102, +32,98,101,99,111,109,101,32,110,111,110,101,32,111,102,112,38,113,117,111,116,59 +,77,105,100,100,108,101,32,101,97,100,39,41,91,48,67,114,105,116,105,99,115,115, +116,117,100,105,111,115,62,38,99,111,112,121,59,103,114,111,117,112,34,62,97,115 +,115,101,109,98,108,109,97,107,105,110,103,32,112,114,101,115,115,101,100,119, +105,100,103,101,116,46,112,115,58,34,32,63,32,114,101,98,117,105,108,116,98,121, +32,115,111,109,101,70,111,114,109,101,114,32,101,100,105,116,111,114,115,100,101 +,108,97,121,101,100,67,97,110,111,110,105,99,104,97,100,32,116,104,101,112,117, +115,104,105,110,103,99,108,97,115,115,61,34,98,117,116,32,97,114,101,112,97,114, +116,105,97,108,66,97,98,121,108,111,110,98,111,116,116,111,109,32,99,97,114,114, +105,101,114,67,111,109,109,97,110,100,105,116,115,32,117,115,101,65,115,32,119, +105,116,104,99,111,117,114,115,101,115,97,32,116,104,105,114,100,100,101,110,111 +,116,101,115,97,108,115,111,32,105,110,72,111,117,115,116,111,110,50,48,112,120, +59,34,62,97,99,99,117,115,101,100,100,111,117,98,108,101,32,103,111,97,108,32, +111,102,70,97,109,111,117,115,32,41,46,98,105,110,100,40,112,114,105,101,115,116 +,115,32,79,110,108,105,110,101,105,110,32,74,117,108,121,115,116,32,43,32,34,103 +,99,111,110,115,117,108,116,100,101,99,105,109,97,108,104,101,108,112,102,117, +108,114,101,118,105,118,101,100,105,115,32,118,101,114,121,114,39,43,39,105,112, +116,108,111,115,105,110,103,32,102,101,109,97,108,101,115,105,115,32,97,108,115, +111,115,116,114,105,110,103,115,100,97,121,115,32,111,102,97,114,114,105,118,97, +108,102,117,116,117,114,101,32,60,111,98,106,101,99,116,102,111,114,99,105,110, +103,83,116,114,105,110,103,40,34,32,47,62,10,9,9,104,101,114,101,32,105,115,101, +110,99,111,100,101,100,46,32,32,84,104,101,32,98,97,108,108,111,111,110,100,111, +110,101,32,98,121,47,99,111,109,109,111,110,98,103,99,111,108,111,114,108,97,119 +,32,111,102,32,73,110,100,105,97,110,97,97,118,111,105,100,101,100,98,117,116,32 +,116,104,101,50,112,120,32,51,112,120,106,113,117,101,114,121,46,97,102,116,101, +114,32,97,112,111,108,105,99,121,46,109,101,110,32,97,110,100,102,111,111,116, +101,114,45,61,32,116,114,117,101,59,102,111,114,32,117,115,101,115,99,114,101, +101,110,46,73,110,100,105,97,110,32,105,109,97,103,101,32,61,102,97,109,105,108, +121,44,104,116,116,112,58,47,47,32,38,110,98,115,112,59,100,114,105,118,101,114, +115,101,116,101,114,110,97,108,115,97,109,101,32,97,115,110,111,116,105,99,101, +100,118,105,101,119,101,114,115,125,41,40,41,59,10,32,105,115,32,109,111,114,101 +,115,101,97,115,111,110,115,102,111,114,109,101,114,32,116,104,101,32,110,101, +119,105,115,32,106,117,115,116,99,111,110,115,101,110,116,32,83,101,97,114,99, +104,119,97,115,32,116,104,101,119,104,121,32,116,104,101,115,104,105,112,112,101 +,100,98,114,62,60,98,114,62,119,105,100,116,104,58,32,104,101,105,103,104,116,61 +,109,97,100,101,32,111,102,99,117,105,115,105,110,101,105,115,32,116,104,97,116, +97,32,118,101,114,121,32,65,100,109,105,114,97,108,32,102,105,120,101,100,59,110 +,111,114,109,97,108,32,77,105,115,115,105,111,110,80,114,101,115,115,44,32,111, +110,116,97,114,105,111,99,104,97,114,115,101,116,116,114,121,32,116,111,32,105, +110,118,97,100,101,100,61,34,116,114,117,101,34,115,112,97,99,105,110,103,105, +115,32,109,111,115,116,97,32,109,111,114,101,32,116,111,116,97,108,108,121,102, +97,108,108,32,111,102,125,41,59,13,10,32,32,105,109,109,101,110,115,101,116,105, +109,101,32,105,110,115,101,116,32,111,117,116,115,97,116,105,115,102,121,116,111 +,32,102,105,110,100,100,111,119,110,32,116,111,108,111,116,32,111,102,32,80,108, +97,121,101,114,115,105,110,32,74,117,110,101,113,117,97,110,116,117,109,110,111, +116,32,116,104,101,116,105,109,101,32,116,111,100,105,115,116,97,110,116,70,105, +110,110,105,115,104,115,114,99,32,61,32,40,115,105,110,103,108,101,32,104,101, +108,112,32,111,102,71,101,114,109,97,110,32,108,97,119,32,97,110,100,108,97,98, +101,108,101,100,102,111,114,101,115,116,115,99,111,111,107,105,110,103,115,112, +97,99,101,34,62,104,101,97,100,101,114,45,119,101,108,108,32,97,115,83,116,97, +110,108,101,121,98,114,105,100,103,101,115,47,103,108,111,98,97,108,67,114,111, +97,116,105,97,32,65,98,111,117,116,32,91,48,93,59,10,32,32,105,116,44,32,97,110, +100,103,114,111,117,112,101,100,98,101,105,110,103,32,97,41,123,116,104,114,111, +119,104,101,32,109,97,100,101,108,105,103,104,116,101,114,101,116,104,105,99,97, +108,70,70,70,70,70,70,34,98,111,116,116,111,109,34,108,105,107,101,32,97,32,101, +109,112,108,111,121,115,108,105,118,101,32,105,110,97,115,32,115,101,101,110,112 +,114,105,110,116,101,114,109,111,115,116,32,111,102,117,98,45,108,105,110,107, +114,101,106,101,99,116,115,97,110,100,32,117,115,101,105,109,97,103,101,34,62, +115,117,99,99,101,101,100,102,101,101,100,105,110,103,78,117,99,108,101,97,114, +105,110,102,111,114,109,97,116,111,32,104,101,108,112,87,111,109,101,110,39,115, +78,101,105,116,104,101,114,77,101,120,105,99,97,110,112,114,111,116,101,105,110, +60,116,97,98,108,101,32,98,121,32,109,97,110,121,104,101,97,108,116,104,121,108, +97,119,115,117,105,116,100,101,118,105,115,101,100,46,112,117,115,104,40,123,115 +,101,108,108,101,114,115,115,105,109,112,108,121,32,84,104,114,111,117,103,104, +46,99,111,111,107,105,101,32,73,109,97,103,101,40,111,108,100,101,114,34,62,117, +115,46,106,115,34,62,32,83,105,110,99,101,32,117,110,105,118,101,114,115,108,97, +114,103,101,114,32,111,112,101,110,32,116,111,33,45,45,32,101,110,100,108,105, +101,115,32,105,110,39,93,41,59,13,10,32,32,109,97,114,107,101,116,119,104,111,32 +,105,115,32,40,34,68,79,77,67,111,109,97,110,97,103,101,100,111,110,101,32,102, +111,114,116,121,112,101,111,102,32,75,105,110,103,100,111,109,112,114,111,102, +105,116,115,112,114,111,112,111,115,101,116,111,32,115,104,111,119,99,101,110, +116,101,114,59,109,97,100,101,32,105,116,100,114,101,115,115,101,100,119,101,114 +,101,32,105,110,109,105,120,116,117,114,101,112,114,101,99,105,115,101,97,114, +105,115,105,110,103,115,114,99,32,61,32,39,109,97,107,101,32,97,32,115,101,99, +117,114,101,100,66,97,112,116,105,115,116,118,111,116,105,110,103,32,10,9,9,118, +97,114,32,77,97,114,99,104,32,50,103,114,101,119,32,117,112,67,108,105,109,97, +116,101,46,114,101,109,111,118,101,115,107,105,108,108,101,100,119,97,121,32,116 +,104,101,60,47,104,101,97,100,62,102,97,99,101,32,111,102,97,99,116,105,110,103, +32,114,105,103,104,116,34,62,116,111,32,119,111,114,107,114,101,100,117,99,101, +115,104,97,115,32,104,97,100,101,114,101,99,116,101,100,115,104,111,119,40,41,59 +,97,99,116,105,111,110,61,98,111,111,107,32,111,102,97,110,32,97,114,101,97,61, +61,32,34,104,116,116,60,104,101,97,100,101,114,10,60,104,116,109,108,62,99,111, +110,102,111,114,109,102,97,99,105,110,103,32,99,111,111,107,105,101,46,114,101, +108,121,32,111,110,104,111,115,116,101,100,32,46,99,117,115,116,111,109,104,101, +32,119,101,110,116,98,117,116,32,102,111,114,115,112,114,101,97,100,32,70,97,109 +,105,108,121,32,97,32,109,101,97,110,115,111,117,116,32,116,104,101,102,111,114, +117,109,115,46,102,111,111,116,97,103,101,34,62,77,111,98,105,108,67,108,101,109 +,101,110,116,115,34,32,105,100,61,34,97,115,32,104,105,103,104,105,110,116,101, +110,115,101,45,45,62,60,33,45,45,102,101,109,97,108,101,32,105,115,32,115,101, +101,110,105,109,112,108,105,101,100,115,101,116,32,116,104,101,97,32,115,116,97, +116,101,97,110,100,32,104,105,115,102,97,115,116,101,115,116,98,101,115,105,100, +101,115,98,117,116,116,111,110,95,98,111,117,110,100,101,100,34,62,60,105,109, +103,32,73,110,102,111,98,111,120,101,118,101,110,116,115,44,97,32,121,111,117, +110,103,97,110,100,32,97,114,101,78,97,116,105,118,101,32,99,104,101,97,112,101, +114,84,105,109,101,111,117,116,97,110,100,32,104,97,115,101,110,103,105,110,101, +115,119,111,110,32,116,104,101,40,109,111,115,116,108,121,114,105,103,104,116,58 +,32,102,105,110,100,32,97,32,45,98,111,116,116,111,109,80,114,105,110,99,101,32, +97,114,101,97,32,111,102,109,111,114,101,32,111,102,115,101,97,114,99,104,95,110 +,97,116,117,114,101,44,108,101,103,97,108,108,121,112,101,114,105,111,100,44,108 +,97,110,100,32,111,102,111,114,32,119,105,116,104,105,110,100,117,99,101,100,112 +,114,111,118,105,110,103,109,105,115,115,105,108,101,108,111,99,97,108,108,121, +65,103,97,105,110,115,116,116,104,101,32,119,97,121,107,38,113,117,111,116,59, +112,120,59,34,62,13,10,112,117,115,104,101,100,32,97,98,97,110,100,111,110,110, +117,109,101,114,97,108,67,101,114,116,97,105,110,73,110,32,116,104,105,115,109, +111,114,101,32,105,110,111,114,32,115,111,109,101,110,97,109,101,32,105,115,97, +110,100,44,32,105,110,99,114,111,119,110,101,100,73,83,66,78,32,48,45,99,114,101 +,97,116,101,115,79,99,116,111,98,101,114,109,97,121,32,110,111,116,99,101,110, +116,101,114,32,108,97,116,101,32,105,110,68,101,102,101,110,99,101,101,110,97,99 +,116,101,100,119,105,115,104,32,116,111,98,114,111,97,100,108,121,99,111,111,108 +,105,110,103,111,110,108,111,97,100,61,105,116,46,32,84,104,101,114,101,99,111, +118,101,114,77,101,109,98,101,114,115,104,101,105,103,104,116,32,97,115,115,117, +109,101,115,60,104,116,109,108,62,10,112,101,111,112,108,101,46,105,110,32,111, +110,101,32,61,119,105,110,100,111,119,102,111,111,116,101,114,95,97,32,103,111, +111,100,32,114,101,107,108,97,109,97,111,116,104,101,114,115,44,116,111,32,116, +104,105,115,95,99,111,111,107,105,101,112,97,110,101,108,34,62,76,111,110,100, +111,110,44,100,101,102,105,110,101,115,99,114,117,115,104,101,100,98,97,112,116, +105,115,109,99,111,97,115,116,97,108,115,116,97,116,117,115,32,116,105,116,108, +101,34,32,109,111,118,101,32,116,111,108,111,115,116,32,105,110,98,101,116,116, +101,114,32,105,109,112,108,105,101,115,114,105,118,97,108,114,121,115,101,114, +118,101,114,115,32,83,121,115,116,101,109,80,101,114,104,97,112,115,101,115,32, +97,110,100,32,99,111,110,116,101,110,100,102,108,111,119,105,110,103,108,97,115, +116,101,100,32,114,105,115,101,32,105,110,71,101,110,101,115,105,115,118,105,101 +,119,32,111,102,114,105,115,105,110,103,32,115,101,101,109,32,116,111,98,117,116 +,32,105,110,32,98,97,99,107,105,110,103,104,101,32,119,105,108,108,103,105,118, +101,110,32,97,103,105,118,105,110,103,32,99,105,116,105,101,115,46,102,108,111, +119,32,111,102,32,76,97,116,101,114,32,97,108,108,32,98,117,116,72,105,103,104, +119,97,121,111,110,108,121,32,98,121,115,105,103,110,32,111,102,104,101,32,100, +111,101,115,100,105,102,102,101,114,115,98,97,116,116,101,114,121,38,97,109,112, +59,108,97,115,105,110,103,108,101,115,116,104,114,101,97,116,115,105,110,116,101 +,103,101,114,116,97,107,101,32,111,110,114,101,102,117,115,101,100,99,97,108,108 +,101,100,32,61,85,83,38,97,109,112,83,101,101,32,116,104,101,110,97,116,105,118, +101,115,98,121,32,116,104,105,115,115,121,115,116,101,109,46,104,101,97,100,32, +111,102,58,104,111,118,101,114,44,108,101,115,98,105,97,110,115,117,114,110,97, +109,101,97,110,100,32,97,108,108,99,111,109,109,111,110,47,104,101,97,100,101, +114,95,95,112,97,114,97,109,115,72,97,114,118,97,114,100,47,112,105,120,101,108, +46,114,101,109,111,118,97,108,115,111,32,108,111,110,103,114,111,108,101,32,111, +102,106,111,105,110,116,108,121,115,107,121,115,99,114,97,85,110,105,99,111,100, +101,98,114,32,47,62,13,10,65,116,108,97,110,116,97,110,117,99,108,101,117,115,67 +,111,117,110,116,121,44,112,117,114,101,108,121,32,99,111,117,110,116,34,62,101, +97,115,105,108,121,32,98,117,105,108,100,32,97,111,110,99,108,105,99,107,97,32, +103,105,118,101,110,112,111,105,110,116,101,114,104,38,113,117,111,116,59,101, +118,101,110,116,115,32,101,108,115,101,32,123,10,100,105,116,105,111,110,115,110 +,111,119,32,116,104,101,44,32,119,105,116,104,32,109,97,110,32,119,104,111,111, +114,103,47,87,101,98,111,110,101,32,97,110,100,99,97,118,97,108,114,121,72,101, +32,100,105,101,100,115,101,97,116,116,108,101,48,48,44,48,48,48,32,123,119,105, +110,100,111,119,104,97,118,101,32,116,111,105,102,40,119,105,110,100,97,110,100, +32,105,116,115,115,111,108,101,108,121,32,109,38,113,117,111,116,59,114,101,110, +101,119,101,100,68,101,116,114,111,105,116,97,109,111,110,103,115,116,101,105, +116,104,101,114,32,116,104,101,109,32,105,110,83,101,110,97,116,111,114,85,115, +60,47,97,62,60,75,105,110,103,32,111,102,70,114,97,110,99,105,115,45,112,114,111 +,100,117,99,104,101,32,117,115,101,100,97,114,116,32,97,110,100,104,105,109,32, +97,110,100,117,115,101,100,32,98,121,115,99,111,114,105,110,103,97,116,32,104, +111,109,101,116,111,32,104,97,118,101,114,101,108,97,116,101,115,105,98,105,108, +105,116,121,102,97,99,116,105,111,110,66,117,102,102,97,108,111,108,105,110,107, +34,62,60,119,104,97,116,32,104,101,102,114,101,101,32,116,111,67,105,116,121,32, +111,102,99,111,109,101,32,105,110,115,101,99,116,111,114,115,99,111,117,110,116, +101,100,111,110,101,32,100,97,121,110,101,114,118,111,117,115,115,113,117,97,114 +,101,32,125,59,105,102,40,103,111,105,110,32,119,104,97,116,105,109,103,34,32,97 +,108,105,115,32,111,110,108,121,115,101,97,114,99,104,47,116,117,101,115,100,97, +121,108,111,111,115,101,108,121,83,111,108,111,109,111,110,115,101,120,117,97, +108,32,45,32,60,97,32,104,114,109,101,100,105,117,109,34,68,79,32,78,79,84,32,70 +,114,97,110,99,101,44,119,105,116,104,32,97,32,119,97,114,32,97,110,100,115,101, +99,111,110,100,32,116,97,107,101,32,97,32,62,13,10,13,10,13,10,109,97,114,107, +101,116,46,104,105,103,104,119,97,121,100,111,110,101,32,105,110,99,116,105,118, +105,116,121,34,108,97,115,116,34,62,111,98,108,105,103,101,100,114,105,115,101, +32,116,111,34,117,110,100,101,102,105,109,97,100,101,32,116,111,32,69,97,114,108 +,121,32,112,114,97,105,115,101,100,105,110,32,105,116,115,32,102,111,114,32,104, +105,115,97,116,104,108,101,116,101,74,117,112,105,116,101,114,89,97,104,111,111, +33,32,116,101,114,109,101,100,32,115,111,32,109,97,110,121,114,101,97,108,108, +121,32,115,46,32,84,104,101,32,97,32,119,111,109,97,110,63,118,97,108,117,101,61 +,100,105,114,101,99,116,32,114,105,103,104,116,34,32,98,105,99,121,99,108,101,97 +,99,105,110,103,61,34,100,97,121,32,97,110,100,115,116,97,116,105,110,103,82,97, +116,104,101,114,44,104,105,103,104,101,114,32,79,102,102,105,99,101,32,97,114, +101,32,110,111,119,116,105,109,101,115,44,32,119,104,101,110,32,97,32,112,97,121 +,32,102,111,114,111,110,32,116,104,105,115,45,108,105,110,107,34,62,59,98,111, +114,100,101,114,97,114,111,117,110,100,32,97,110,110,117,97,108,32,116,104,101, +32,78,101,119,112,117,116,32,116,104,101,46,99,111,109,34,32,116,97,107,105,110, +32,116,111,97,32,98,114,105,101,102,40,105,110,32,116,104,101,103,114,111,117, +112,115,46,59,32,119,105,100,116,104,101,110,122,121,109,101,115,115,105,109,112 +,108,101,32,105,110,32,108,97,116,101,123,114,101,116,117,114,110,116,104,101, +114,97,112,121,97,32,112,111,105,110,116,98,97,110,110,105,110,103,105,110,107, +115,34,62,10,40,41,59,34,32,114,101,97,32,112,108,97,99,101,92,117,48,48,51,67, +97,97,98,111,117,116,32,97,116,114,62,13,10,9,9,99,99,111,117,110,116,32,103,105 +,118,101,115,32,97,60,83,67,82,73,80,84,82,97,105,108,119,97,121,116,104,101,109 +,101,115,47,116,111,111,108,98,111,120,66,121,73,100,40,34,120,104,117,109,97, +110,115,44,119,97,116,99,104,101,115,105,110,32,115,111,109,101,32,105,102,32,40 +,119,105,99,111,109,105,110,103,32,102,111,114,109,97,116,115,32,85,110,100,101, +114,32,98,117,116,32,104,97,115,104,97,110,100,101,100,32,109,97,100,101,32,98, +121,116,104,97,110,32,105,110,102,101,97,114,32,111,102,100,101,110,111,116,101, +100,47,105,102,114,97,109,101,108,101,102,116,32,105,110,118,111,108,116,97,103, +101,105,110,32,101,97,99,104,97,38,113,117,111,116,59,98,97,115,101,32,111,102, +73,110,32,109,97,110,121,117,110,100,101,114,103,111,114,101,103,105,109,101,115 +,97,99,116,105,111,110,32,60,47,112,62,13,10,60,117,115,116,111,109,86,97,59,38, +103,116,59,60,47,105,109,112,111,114,116,115,111,114,32,116,104,97,116,109,111, +115,116,108,121,32,38,97,109,112,59,114,101,32,115,105,122,101,61,34,60,47,97,62 +,60,47,104,97,32,99,108,97,115,115,112,97,115,115,105,118,101,72,111,115,116,32, +61,32,87,104,101,116,104,101,114,102,101,114,116,105,108,101,86,97,114,105,111, +117,115,61,91,93,59,40,102,117,99,97,109,101,114,97,115,47,62,60,47,116,100,62, +97,99,116,115,32,97,115,73,110,32,115,111,109,101,62,13,10,13,10,60,33,111,114, +103,97,110,105,115,32,60,98,114,32,47,62,66,101,105,106,105,110,103,99,97,116,97 +,108,195,160,100,101,117,116,115,99,104,101,117,114,111,112,101,117,101,117,115, +107,97,114,97,103,97,101,105,108,103,101,115,118,101,110,115,107,97,101,115,112, +97,195,177,97,109,101,110,115,97,106,101,117,115,117,97,114,105,111,116,114,97, +98,97,106,111,109,195,169,120,105,99,111,112,195,161,103,105,110,97,115,105,101, +109,112,114,101,115,105,115,116,101,109,97,111,99,116,117,98,114,101,100,117,114 +,97,110,116,101,97,195,177,97,100,105,114,101,109,112,114,101,115,97,109,111,109 +,101,110,116,111,110,117,101,115,116,114,111,112,114,105,109,101,114,97,116,114, +97,118,195,169,115,103,114,97,99,105,97,115,110,117,101,115,116,114,97,112,114, +111,99,101,115,111,101,115,116,97,100,111,115,99,97,108,105,100,97,100,112,101, +114,115,111,110,97,110,195,186,109,101,114,111,97,99,117,101,114,100,111,109,195 +,186,115,105,99,97,109,105,101,109,98,114,111,111,102,101,114,116,97,115,97,108, +103,117,110,111,115,112,97,195,173,115,101,115,101,106,101,109,112,108,111,100, +101,114,101,99,104,111,97,100,101,109,195,161,115,112,114,105,118,97,100,111,97, +103,114,101,103,97,114,101,110,108,97,99,101,115,112,111,115,105,98,108,101,104, +111,116,101,108,101,115,115,101,118,105,108,108,97,112,114,105,109,101,114,111, +195,186,108,116,105,109,111,101,118,101,110,116,111,115,97,114,99,104,105,118, +111,99,117,108,116,117,114,97,109,117,106,101,114,101,115,101,110,116,114,97,100 +,97,97,110,117,110,99,105,111,101,109,98,97,114,103,111,109,101,114,99,97,100, +111,103,114,97,110,100,101,115,101,115,116,117,100,105,111,109,101,106,111,114, +101,115,102,101,98,114,101,114,111,100,105,115,101,195,177,111,116,117,114,105, +115,109,111,99,195,179,100,105,103,111,112,111,114,116,97,100,97,101,115,112,97, +99,105,111,102,97,109,105,108,105,97,97,110,116,111,110,105,111,112,101,114,109, +105,116,101,103,117,97,114,100,97,114,97,108,103,117,110,97,115,112,114,101,99, +105,111,115,97,108,103,117,105,101,110,115,101,110,116,105,100,111,118,105,115, +105,116,97,115,116,195,173,116,117,108,111,99,111,110,111,99,101,114,115,101,103 +,117,110,100,111,99,111,110,115,101,106,111,102,114,97,110,99,105,97,109,105,110 +,117,116,111,115,115,101,103,117,110,100,97,116,101,110,101,109,111,115,101,102, +101,99,116,111,115,109,195,161,108,97,103,97,115,101,115,105,195,179,110,114,101 +,118,105,115,116,97,103,114,97,110,97,100,97,99,111,109,112,114,97,114,105,110, +103,114,101,115,111,103,97,114,99,195,173,97,97,99,99,105,195,179,110,101,99,117 +,97,100,111,114,113,117,105,101,110,101,115,105,110,99,108,117,115,111,100,101, +98,101,114,195,161,109,97,116,101,114,105,97,104,111,109,98,114,101,115,109,117, +101,115,116,114,97,112,111,100,114,195,173,97,109,97,195,177,97,110,97,195,186, +108,116,105,109,97,101,115,116,97,109,111,115,111,102,105,99,105,97,108,116,97, +109,98,105,101,110,110,105,110,103,195,186,110,115,97,108,117,100,111,115,112, +111,100,101,109,111,115,109,101,106,111,114,97,114,112,111,115,105,116,105,111, +110,98,117,115,105,110,101,115,115,104,111,109,101,112,97,103,101,115,101,99,117 +,114,105,116,121,108,97,110,103,117,97,103,101,115,116,97,110,100,97,114,100,99, +97,109,112,97,105,103,110,102,101,97,116,117,114,101,115,99,97,116,101,103,111, +114,121,101,120,116,101,114,110,97,108,99,104,105,108,100,114,101,110,114,101, +115,101,114,118,101,100,114,101,115,101,97,114,99,104,101,120,99,104,97,110,103, +101,102,97,118,111,114,105,116,101,116,101,109,112,108,97,116,101,109,105,108, +105,116,97,114,121,105,110,100,117,115,116,114,121,115,101,114,118,105,99,101, +115,109,97,116,101,114,105,97,108,112,114,111,100,117,99,116,115,122,45,105,110, +100,101,120,58,99,111,109,109,101,110,116,115,115,111,102,116,119,97,114,101,99, +111,109,112,108,101,116,101,99,97,108,101,110,100,97,114,112,108,97,116,102,111, +114,109,97,114,116,105,99,108,101,115,114,101,113,117,105,114,101,100,109,111, +118,101,109,101,110,116,113,117,101,115,116,105,111,110,98,117,105,108,100,105, +110,103,112,111,108,105,116,105,99,115,112,111,115,115,105,98,108,101,114,101, +108,105,103,105,111,110,112,104,121,115,105,99,97,108,102,101,101,100,98,97,99, +107,114,101,103,105,115,116,101,114,112,105,99,116,117,114,101,115,100,105,115, +97,98,108,101,100,112,114,111,116,111,99,111,108,97,117,100,105,101,110,99,101, +115,101,116,116,105,110,103,115,97,99,116,105,118,105,116,121,101,108,101,109, +101,110,116,115,108,101,97,114,110,105,110,103,97,110,121,116,104,105,110,103,97 +,98,115,116,114,97,99,116,112,114,111,103,114,101,115,115,111,118,101,114,118, +105,101,119,109,97,103,97,122,105,110,101,101,99,111,110,111,109,105,99,116,114, +97,105,110,105,110,103,112,114,101,115,115,117,114,101,118,97,114,105,111,117, +115,32,60,115,116,114,111,110,103,62,112,114,111,112,101,114,116,121,115,104,111 +,112,112,105,110,103,116,111,103,101,116,104,101,114,97,100,118,97,110,99,101, +100,98,101,104,97,118,105,111,114,100,111,119,110,108,111,97,100,102,101,97,116, +117,114,101,100,102,111,111,116,98,97,108,108,115,101,108,101,99,116,101,100,76, +97,110,103,117,97,103,101,100,105,115,116,97,110,99,101,114,101,109,101,109,98, +101,114,116,114,97,99,107,105,110,103,112,97,115,115,119,111,114,100,109,111,100 +,105,102,105,101,100,115,116,117,100,101,110,116,115,100,105,114,101,99,116,108, +121,102,105,103,104,116,105,110,103,110,111,114,116,104,101,114,110,100,97,116, +97,98,97,115,101,102,101,115,116,105,118,97,108,98,114,101,97,107,105,110,103, +108,111,99,97,116,105,111,110,105,110,116,101,114,110,101,116,100,114,111,112, +100,111,119,110,112,114,97,99,116,105,99,101,101,118,105,100,101,110,99,101,102, +117,110,99,116,105,111,110,109,97,114,114,105,97,103,101,114,101,115,112,111,110 +,115,101,112,114,111,98,108,101,109,115,110,101,103,97,116,105,118,101,112,114, +111,103,114,97,109,115,97,110,97,108,121,115,105,115,114,101,108,101,97,115,101, +100,98,97,110,110,101,114,34,62,112,117,114,99,104,97,115,101,112,111,108,105,99 +,105,101,115,114,101,103,105,111,110,97,108,99,114,101,97,116,105,118,101,97,114 +,103,117,109,101,110,116,98,111,111,107,109,97,114,107,114,101,102,101,114,114, +101,114,99,104,101,109,105,99,97,108,100,105,118,105,115,105,111,110,99,97,108, +108,98,97,99,107,115,101,112,97,114,97,116,101,112,114,111,106,101,99,116,115,99 +,111,110,102,108,105,99,116,104,97,114,100,119,97,114,101,105,110,116,101,114, +101,115,116,100,101,108,105,118,101,114,121,109,111,117,110,116,97,105,110,111, +98,116,97,105,110,101,100,61,32,102,97,108,115,101,59,102,111,114,40,118,97,114, +32,97,99,99,101,112,116,101,100,99,97,112,97,99,105,116,121,99,111,109,112,117, +116,101,114,105,100,101,110,116,105,116,121,97,105,114,99,114,97,102,116,101,109 +,112,108,111,121,101,100,112,114,111,112,111,115,101,100,100,111,109,101,115,116 +,105,99,105,110,99,108,117,100,101,115,112,114,111,118,105,100,101,100,104,111, +115,112,105,116,97,108,118,101,114,116,105,99,97,108,99,111,108,108,97,112,115, +101,97,112,112,114,111,97,99,104,112,97,114,116,110,101,114,115,108,111,103,111, +34,62,60,97,100,97,117,103,104,116,101,114,97,117,116,104,111,114,34,32,99,117, +108,116,117,114,97,108,102,97,109,105,108,105,101,115,47,105,109,97,103,101,115, +47,97,115,115,101,109,98,108,121,112,111,119,101,114,102,117,108,116,101,97,99, +104,105,110,103,102,105,110,105,115,104,101,100,100,105,115,116,114,105,99,116, +99,114,105,116,105,99,97,108,99,103,105,45,98,105,110,47,112,117,114,112,111,115 +,101,115,114,101,113,117,105,114,101,115,101,108,101,99,116,105,111,110,98,101, +99,111,109,105,110,103,112,114,111,118,105,100,101,115,97,99,97,100,101,109,105, +99,101,120,101,114,99,105,115,101,97,99,116,117,97,108,108,121,109,101,100,105, +99,105,110,101,99,111,110,115,116,97,110,116,97,99,99,105,100,101,110,116,77,97, +103,97,122,105,110,101,100,111,99,117,109,101,110,116,115,116,97,114,116,105,110 +,103,98,111,116,116,111,109,34,62,111,98,115,101,114,118,101,100,58,32,38,113, +117,111,116,59,101,120,116,101,110,100,101,100,112,114,101,118,105,111,117,115, +83,111,102,116,119,97,114,101,99,117,115,116,111,109,101,114,100,101,99,105,115, +105,111,110,115,116,114,101,110,103,116,104,100,101,116,97,105,108,101,100,115, +108,105,103,104,116,108,121,112,108,97,110,110,105,110,103,116,101,120,116,97, +114,101,97,99,117,114,114,101,110,99,121,101,118,101,114,121,111,110,101,115,116 +,114,97,105,103,104,116,116,114,97,110,115,102,101,114,112,111,115,105,116,105, +118,101,112,114,111,100,117,99,101,100,104,101,114,105,116,97,103,101,115,104, +105,112,112,105,110,103,97,98,115,111,108,117,116,101,114,101,99,101,105,118,101 +,100,114,101,108,101,118,97,110,116,98,117,116,116,111,110,34,32,118,105,111,108 +,101,110,99,101,97,110,121,119,104,101,114,101,98,101,110,101,102,105,116,115, +108,97,117,110,99,104,101,100,114,101,99,101,110,116,108,121,97,108,108,105,97, +110,99,101,102,111,108,108,111,119,101,100,109,117,108,116,105,112,108,101,98, +117,108,108,101,116,105,110,105,110,99,108,117,100,101,100,111,99,99,117,114,114 +,101,100,105,110,116,101,114,110,97,108,36,40,116,104,105,115,41,46,114,101,112, +117,98,108,105,99,62,60,116,114,62,60,116,100,99,111,110,103,114,101,115,115,114 +,101,99,111,114,100,101,100,117,108,116,105,109,97,116,101,115,111,108,117,116, +105,111,110,60,117,108,32,105,100,61,34,100,105,115,99,111,118,101,114,72,111, +109,101,60,47,97,62,119,101,98,115,105,116,101,115,110,101,116,119,111,114,107, +115,97,108,116,104,111,117,103,104,101,110,116,105,114,101,108,121,109,101,109, +111,114,105,97,108,109,101,115,115,97,103,101,115,99,111,110,116,105,110,117,101 +,97,99,116,105,118,101,34,62,115,111,109,101,119,104,97,116,118,105,99,116,111, +114,105,97,87,101,115,116,101,114,110,32,32,116,105,116,108,101,61,34,76,111,99, +97,116,105,111,110,99,111,110,116,114,97,99,116,118,105,115,105,116,111,114,115, +68,111,119,110,108,111,97,100,119,105,116,104,111,117,116,32,114,105,103,104,116 +,34,62,10,109,101,97,115,117,114,101,115,119,105,100,116,104,32,61,32,118,97,114 +,105,97,98,108,101,105,110,118,111,108,118,101,100,118,105,114,103,105,110,105, +97,110,111,114,109,97,108,108,121,104,97,112,112,101,110,101,100,97,99,99,111, +117,110,116,115,115,116,97,110,100,105,110,103,110,97,116,105,111,110,97,108,82, +101,103,105,115,116,101,114,112,114,101,112,97,114,101,100,99,111,110,116,114, +111,108,115,97,99,99,117,114,97,116,101,98,105,114,116,104,100,97,121,115,116, +114,97,116,101,103,121,111,102,102,105,99,105,97,108,103,114,97,112,104,105,99, +115,99,114,105,109,105,110,97,108,112,111,115,115,105,98,108,121,99,111,110,115, +117,109,101,114,80,101,114,115,111,110,97,108,115,112,101,97,107,105,110,103,118 +,97,108,105,100,97,116,101,97,99,104,105,101,118,101,100,46,106,112,103,34,32,47 +,62,109,97,99,104,105,110,101,115,60,47,104,50,62,10,32,32,107,101,121,119,111, +114,100,115,102,114,105,101,110,100,108,121,98,114,111,116,104,101,114,115,99, +111,109,98,105,110,101,100,111,114,105,103,105,110,97,108,99,111,109,112,111,115 +,101,100,101,120,112,101,99,116,101,100,97,100,101,113,117,97,116,101,112,97,107 +,105,115,116,97,110,102,111,108,108,111,119,34,32,118,97,108,117,97,98,108,101, +60,47,108,97,98,101,108,62,114,101,108,97,116,105,118,101,98,114,105,110,103,105 +,110,103,105,110,99,114,101,97,115,101,103,111,118,101,114,110,111,114,112,108, +117,103,105,110,115,47,76,105,115,116,32,111,102,32,72,101,97,100,101,114,34,62, +34,32,110,97,109,101,61,34,32,40,38,113,117,111,116,59,103,114,97,100,117,97,116 +,101,60,47,104,101,97,100,62,10,99,111,109,109,101,114,99,101,109,97,108,97,121, +115,105,97,100,105,114,101,99,116,111,114,109,97,105,110,116,97,105,110,59,104, +101,105,103,104,116,58,115,99,104,101,100,117,108,101,99,104,97,110,103,105,110, +103,98,97,99,107,32,116,111,32,99,97,116,104,111,108,105,99,112,97,116,116,101, +114,110,115,99,111,108,111,114,58,32,35,103,114,101,97,116,101,115,116,115,117, +112,112,108,105,101,115,114,101,108,105,97,98,108,101,60,47,117,108,62,10,9,9,60 +,115,101,108,101,99,116,32,99,105,116,105,122,101,110,115,99,108,111,116,104,105 +,110,103,119,97,116,99,104,105,110,103,60,108,105,32,105,100,61,34,115,112,101, +99,105,102,105,99,99,97,114,114,121,105,110,103,115,101,110,116,101,110,99,101, +60,99,101,110,116,101,114,62,99,111,110,116,114,97,115,116,116,104,105,110,107, +105,110,103,99,97,116,99,104,40,101,41,115,111,117,116,104,101,114,110,77,105,99 +,104,97,101,108,32,109,101,114,99,104,97,110,116,99,97,114,111,117,115,101,108, +112,97,100,100,105,110,103,58,105,110,116,101,114,105,111,114,46,115,112,108,105 +,116,40,34,108,105,122,97,116,105,111,110,79,99,116,111,98,101,114,32,41,123,114 +,101,116,117,114,110,105,109,112,114,111,118,101,100,45,45,38,103,116,59,10,10, +99,111,118,101,114,97,103,101,99,104,97,105,114,109,97,110,46,112,110,103,34,32, +47,62,115,117,98,106,101,99,116,115,82,105,99,104,97,114,100,32,119,104,97,116, +101,118,101,114,112,114,111,98,97,98,108,121,114,101,99,111,118,101,114,121,98, +97,115,101,98,97,108,108,106,117,100,103,109,101,110,116,99,111,110,110,101,99, +116,46,46,99,115,115,34,32,47,62,32,119,101,98,115,105,116,101,114,101,112,111, +114,116,101,100,100,101,102,97,117,108,116,34,47,62,60,47,97,62,13,10,101,108, +101,99,116,114,105,99,115,99,111,116,108,97,110,100,99,114,101,97,116,105,111, +110,113,117,97,110,116,105,116,121,46,32,73,83,66,78,32,48,100,105,100,32,110, +111,116,32,105,110,115,116,97,110,99,101,45,115,101,97,114,99,104,45,34,32,108, +97,110,103,61,34,115,112,101,97,107,101,114,115,67,111,109,112,117,116,101,114, +99,111,110,116,97,105,110,115,97,114,99,104,105,118,101,115,109,105,110,105,115, +116,101,114,114,101,97,99,116,105,111,110,100,105,115,99,111,117,110,116,73,116, +97,108,105,97,110,111,99,114,105,116,101,114,105,97,115,116,114,111,110,103,108, +121,58,32,39,104,116,116,112,58,39,115,99,114,105,112,116,39,99,111,118,101,114, +105,110,103,111,102,102,101,114,105,110,103,97,112,112,101,97,114,101,100,66,114 +,105,116,105,115,104,32,105,100,101,110,116,105,102,121,70,97,99,101,98,111,111, +107,110,117,109,101,114,111,117,115,118,101,104,105,99,108,101,115,99,111,110,99 +,101,114,110,115,65,109,101,114,105,99,97,110,104,97,110,100,108,105,110,103,100 +,105,118,32,105,100,61,34,87,105,108,108,105,97,109,32,112,114,111,118,105,100, +101,114,95,99,111,110,116,101,110,116,97,99,99,117,114,97,99,121,115,101,99,116, +105,111,110,32,97,110,100,101,114,115,111,110,102,108,101,120,105,98,108,101,67, +97,116,101,103,111,114,121,108,97,119,114,101,110,99,101,60,115,99,114,105,112, +116,62,108,97,121,111,117,116,61,34,97,112,112,114,111,118,101,100,32,109,97,120 +,105,109,117,109,104,101,97,100,101,114,34,62,60,47,116,97,98,108,101,62,83,101, +114,118,105,99,101,115,104,97,109,105,108,116,111,110,99,117,114,114,101,110,116 +,32,99,97,110,97,100,105,97,110,99,104,97,110,110,101,108,115,47,116,104,101,109 +,101,115,47,47,97,114,116,105,99,108,101,111,112,116,105,111,110,97,108,112,111, +114,116,117,103,97,108,118,97,108,117,101,61,34,34,105,110,116,101,114,118,97, +108,119,105,114,101,108,101,115,115,101,110,116,105,116,108,101,100,97,103,101, +110,99,105,101,115,83,101,97,114,99,104,34,32,109,101,97,115,117,114,101,100,116 +,104,111,117,115,97,110,100,115,112,101,110,100,105,110,103,38,104,101,108,108, +105,112,59,110,101,119,32,68,97,116,101,34,32,115,105,122,101,61,34,112,97,103, +101,78,97,109,101,109,105,100,100,108,101,34,32,34,32,47,62,60,47,97,62,104,105, +100,100,101,110,34,62,115,101,113,117,101,110,99,101,112,101,114,115,111,110,97, +108,111,118,101,114,102,108,111,119,111,112,105,110,105,111,110,115,105,108,108, +105,110,111,105,115,108,105,110,107,115,34,62,10,9,60,116,105,116,108,101,62,118 +,101,114,115,105,111,110,115,115,97,116,117,114,100,97,121,116,101,114,109,105, +110,97,108,105,116,101,109,112,114,111,112,101,110,103,105,110,101,101,114,115, +101,99,116,105,111,110,115,100,101,115,105,103,110,101,114,112,114,111,112,111, +115,97,108,61,34,102,97,108,115,101,34,69,115,112,97,195,177,111,108,114,101,108 +,101,97,115,101,115,115,117,98,109,105,116,34,32,101,114,38,113,117,111,116,59, +97,100,100,105,116,105,111,110,115,121,109,112,116,111,109,115,111,114,105,101, +110,116,101,100,114,101,115,111,117,114,99,101,114,105,103,104,116,34,62,60,112, +108,101,97,115,117,114,101,115,116,97,116,105,111,110,115,104,105,115,116,111, +114,121,46,108,101,97,118,105,110,103,32,32,98,111,114,100,101,114,61,99,111,110 +,116,101,110,116,115,99,101,110,116,101,114,34,62,46,10,10,83,111,109,101,32,100 +,105,114,101,99,116,101,100,115,117,105,116,97,98,108,101,98,117,108,103,97,114, +105,97,46,115,104,111,119,40,41,59,100,101,115,105,103,110,101,100,71,101,110, +101,114,97,108,32,99,111,110,99,101,112,116,115,69,120,97,109,112,108,101,115, +119,105,108,108,105,97,109,115,79,114,105,103,105,110,97,108,34,62,60,115,112,97 +,110,62,115,101,97,114,99,104,34,62,111,112,101,114,97,116,111,114,114,101,113, +117,101,115,116,115,97,32,38,113,117,111,116,59,97,108,108,111,119,105,110,103, +68,111,99,117,109,101,110,116,114,101,118,105,115,105,111,110,46,32,10,10,84,104 +,101,32,121,111,117,114,115,101,108,102,67,111,110,116,97,99,116,32,109,105,99, +104,105,103,97,110,69,110,103,108,105,115,104,32,99,111,108,117,109,98,105,97, +112,114,105,111,114,105,116,121,112,114,105,110,116,105,110,103,100,114,105,110, +107,105,110,103,102,97,99,105,108,105,116,121,114,101,116,117,114,110,101,100,67 +,111,110,116,101,110,116,32,111,102,102,105,99,101,114,115,82,117,115,115,105,97 +,110,32,103,101,110,101,114,97,116,101,45,56,56,53,57,45,49,34,105,110,100,105, +99,97,116,101,102,97,109,105,108,105,97,114,32,113,117,97,108,105,116,121,109,97 +,114,103,105,110,58,48,32,99,111,110,116,101,110,116,118,105,101,119,112,111,114 +,116,99,111,110,116,97,99,116,115,45,116,105,116,108,101,34,62,112,111,114,116, +97,98,108,101,46,108,101,110,103,116,104,32,101,108,105,103,105,98,108,101,105, +110,118,111,108,118,101,115,97,116,108,97,110,116,105,99,111,110,108,111,97,100, +61,34,100,101,102,97,117,108,116,46,115,117,112,112,108,105,101,100,112,97,121, +109,101,110,116,115,103,108,111,115,115,97,114,121,10,10,65,102,116,101,114,32, +103,117,105,100,97,110,99,101,60,47,116,100,62,60,116,100,101,110,99,111,100,105 +,110,103,109,105,100,100,108,101,34,62,99,97,109,101,32,116,111,32,100,105,115, +112,108,97,121,115,115,99,111,116,116,105,115,104,106,111,110,97,116,104,97,110, +109,97,106,111,114,105,116,121,119,105,100,103,101,116,115,46,99,108,105,110,105 +,99,97,108,116,104,97,105,108,97,110,100,116,101,97,99,104,101,114,115,60,104, +101,97,100,62,10,9,97,102,102,101,99,116,101,100,115,117,112,112,111,114,116,115 +,112,111,105,110,116,101,114,59,116,111,83,116,114,105,110,103,60,47,115,109,97, +108,108,62,111,107,108,97,104,111,109,97,119,105,108,108,32,98,101,32,105,110, +118,101,115,116,111,114,48,34,32,97,108,116,61,34,104,111,108,105,100,97,121,115 +,82,101,115,111,117,114,99,101,108,105,99,101,110,115,101,100,32,40,119,104,105, +99,104,32,46,32,65,102,116,101,114,32,99,111,110,115,105,100,101,114,118,105,115 +,105,116,105,110,103,101,120,112,108,111,114,101,114,112,114,105,109,97,114,121, +32,115,101,97,114,99,104,34,32,97,110,100,114,111,105,100,34,113,117,105,99,107, +108,121,32,109,101,101,116,105,110,103,115,101,115,116,105,109,97,116,101,59,114 +,101,116,117,114,110,32,59,99,111,108,111,114,58,35,32,104,101,105,103,104,116, +61,97,112,112,114,111,118,97,108,44,32,38,113,117,111,116,59,32,99,104,101,99, +107,101,100,46,109,105,110,46,106,115,34,109,97,103,110,101,116,105,99,62,60,47, +97,62,60,47,104,102,111,114,101,99,97,115,116,46,32,87,104,105,108,101,32,116, +104,117,114,115,100,97,121,100,118,101,114,116,105,115,101,38,101,97,99,117,116, +101,59,104,97,115,67,108,97,115,115,101,118,97,108,117,97,116,101,111,114,100, +101,114,105,110,103,101,120,105,115,116,105,110,103,112,97,116,105,101,110,116, +115,32,79,110,108,105,110,101,32,99,111,108,111,114,97,100,111,79,112,116,105, +111,110,115,34,99,97,109,112,98,101,108,108,60,33,45,45,32,101,110,100,60,47,115 +,112,97,110,62,60,60,98,114,32,47,62,13,10,95,112,111,112,117,112,115,124,115,99 +,105,101,110,99,101,115,44,38,113,117,111,116,59,32,113,117,97,108,105,116,121, +32,87,105,110,100,111,119,115,32,97,115,115,105,103,110,101,100,104,101,105,103, +104,116,58,32,60,98,32,99,108,97,115,115,108,101,38,113,117,111,116,59,32,118,97 +,108,117,101,61,34,32,67,111,109,112,97,110,121,101,120,97,109,112,108,101,115, +60,105,102,114,97,109,101,32,98,101,108,105,101,118,101,115,112,114,101,115,101, +110,116,115,109,97,114,115,104,97,108,108,112,97,114,116,32,111,102,32,112,114, +111,112,101,114,108,121,41,46,10,10,84,104,101,32,116,97,120,111,110,111,109,121 +,109,117,99,104,32,111,102,32,60,47,115,112,97,110,62,10,34,32,100,97,116,97,45, +115,114,116,117,103,117,195,170,115,115,99,114,111,108,108,84,111,32,112,114,111 +,106,101,99,116,60,104,101,97,100,62,13,10,97,116,116,111,114,110,101,121,101, +109,112,104,97,115,105,115,115,112,111,110,115,111,114,115,102,97,110,99,121,98, +111,120,119,111,114,108,100,39,115,32,119,105,108,100,108,105,102,101,99,104,101 +,99,107,101,100,61,115,101,115,115,105,111,110,115,112,114,111,103,114,97,109, +109,112,120,59,102,111,110,116,45,32,80,114,111,106,101,99,116,106,111,117,114, +110,97,108,115,98,101,108,105,101,118,101,100,118,97,99,97,116,105,111,110,116, +104,111,109,112,115,111,110,108,105,103,104,116,105,110,103,97,110,100,32,116, +104,101,32,115,112,101,99,105,97,108,32,98,111,114,100,101,114,61,48,99,104,101, +99,107,105,110,103,60,47,116,98,111,100,121,62,60,98,117,116,116,111,110,32,67, +111,109,112,108,101,116,101,99,108,101,97,114,102,105,120,10,60,104,101,97,100, +62,10,97,114,116,105,99,108,101,32,60,115,101,99,116,105,111,110,102,105,110,100 +,105,110,103,115,114,111,108,101,32,105,110,32,112,111,112,117,108,97,114,32,32, +79,99,116,111,98,101,114,119,101,98,115,105,116,101,32,101,120,112,111,115,117, +114,101,117,115,101,100,32,116,111,32,32,99,104,97,110,103,101,115,111,112,101, +114,97,116,101,100,99,108,105,99,107,105,110,103,101,110,116,101,114,105,110,103 +,99,111,109,109,97,110,100,115,105,110,102,111,114,109,101,100,32,110,117,109,98 +,101,114,115,32,32,60,47,100,105,118,62,99,114,101,97,116,105,110,103,111,110,83 +,117,98,109,105,116,109,97,114,121,108,97,110,100,99,111,108,108,101,103,101,115 +,97,110,97,108,121,116,105,99,108,105,115,116,105,110,103,115,99,111,110,116,97, +99,116,46,108,111,103,103,101,100,73,110,97,100,118,105,115,111,114,121,115,105, +98,108,105,110,103,115,99,111,110,116,101,110,116,34,115,38,113,117,111,116,59, +41,115,46,32,84,104,105,115,32,112,97,99,107,97,103,101,115,99,104,101,99,107,98 +,111,120,115,117,103,103,101,115,116,115,112,114,101,103,110,97,110,116,116,111, +109,111,114,114,111,119,115,112,97,99,105,110,103,61,105,99,111,110,46,112,110, +103,106,97,112,97,110,101,115,101,99,111,100,101,98,97,115,101,98,117,116,116, +111,110,34,62,103,97,109,98,108,105,110,103,115,117,99,104,32,97,115,32,44,32, +119,104,105,108,101,32,60,47,115,112,97,110,62,32,109,105,115,115,111,117,114, +105,115,112,111,114,116,105,110,103,116,111,112,58,49,112,120,32,46,60,47,115, +112,97,110,62,116,101,110,115,105,111,110,115,119,105,100,116,104,61,34,50,108, +97,122,121,108,111,97,100,110,111,118,101,109,98,101,114,117,115,101,100,32,105, +110,32,104,101,105,103,104,116,61,34,99,114,105,112,116,34,62,10,38,110,98,115, +112,59,60,47,60,116,114,62,60,116,100,32,104,101,105,103,104,116,58,50,47,112, +114,111,100,117,99,116,99,111,117,110,116,114,121,32,105,110,99,108,117,100,101, +32,102,111,111,116,101,114,34,32,38,108,116,59,33,45,45,32,116,105,116,108,101, +34,62,60,47,106,113,117,101,114,121,46,60,47,102,111,114,109,62,10,40,231,174, +128,228,189,147,41,40,231,185,129,233,171,148,41,104,114,118,97,116,115,107,105, +105,116,97,108,105,97,110,111,114,111,109,195,162,110,196,131,116,195,188,114, +107,195,167,101,216,167,216,177,216,175,217,136,116,97,109,98,105,195,169,110, +110,111,116,105,99,105,97,115,109,101,110,115,97,106,101,115,112,101,114,115,111 +,110,97,115,100,101,114,101,99,104,111,115,110,97,99,105,111,110,97,108,115,101, +114,118,105,99,105,111,99,111,110,116,97,99,116,111,117,115,117,97,114,105,111, +115,112,114,111,103,114,97,109,97,103,111,98,105,101,114,110,111,101,109,112,114 +,101,115,97,115,97,110,117,110,99,105,111,115,118,97,108,101,110,99,105,97,99, +111,108,111,109,98,105,97,100,101,115,112,117,195,169,115,100,101,112,111,114, +116,101,115,112,114,111,121,101,99,116,111,112,114,111,100,117,99,116,111,112, +195,186,98,108,105,99,111,110,111,115,111,116,114,111,115,104,105,115,116,111, +114,105,97,112,114,101,115,101,110,116,101,109,105,108,108,111,110,101,115,109, +101,100,105,97,110,116,101,112,114,101,103,117,110,116,97,97,110,116,101,114,105 +,111,114,114,101,99,117,114,115,111,115,112,114,111,98,108,101,109,97,115,97,110 +,116,105,97,103,111,110,117,101,115,116,114,111,115,111,112,105,110,105,195,179, +110,105,109,112,114,105,109,105,114,109,105,101,110,116,114,97,115,97,109,195, +169,114,105,99,97,118,101,110,100,101,100,111,114,115,111,99,105,101,100,97,100, +114,101,115,112,101,99,116,111,114,101,97,108,105,122,97,114,114,101,103,105,115 +,116,114,111,112,97,108,97,98,114,97,115,105,110,116,101,114,195,169,115,101,110 +,116,111,110,99,101,115,101,115,112,101,99,105,97,108,109,105,101,109,98,114,111 +,115,114,101,97,108,105,100,97,100,99,195,179,114,100,111,98,97,122,97,114,97, +103,111,122,97,112,195,161,103,105,110,97,115,115,111,99,105,97,108,101,115,98, +108,111,113,117,101,97,114,103,101,115,116,105,195,179,110,97,108,113,117,105, +108,101,114,115,105,115,116,101,109,97,115,99,105,101,110,99,105,97,115,99,111, +109,112,108,101,116,111,118,101,114,115,105,195,179,110,99,111,109,112,108,101, +116,97,101,115,116,117,100,105,111,115,112,195,186,98,108,105,99,97,111,98,106, +101,116,105,118,111,97,108,105,99,97,110,116,101,98,117,115,99,97,100,111,114,99 +,97,110,116,105,100,97,100,101,110,116,114,97,100,97,115,97,99,99,105,111,110, +101,115,97,114,99,104,105,118,111,115,115,117,112,101,114,105,111,114,109,97,121 +,111,114,195,173,97,97,108,101,109,97,110,105,97,102,117,110,99,105,195,179,110, +195,186,108,116,105,109,111,115,104,97,99,105,101,110,100,111,97,113,117,101,108 +,108,111,115,101,100,105,99,105,195,179,110,102,101,114,110,97,110,100,111,97, +109,98,105,101,110,116,101,102,97,99,101,98,111,111,107,110,117,101,115,116,114, +97,115,99,108,105,101,110,116,101,115,112,114,111,99,101,115,111,115,98,97,115, +116,97,110,116,101,112,114,101,115,101,110,116,97,114,101,112,111,114,116,97,114 +,99,111,110,103,114,101,115,111,112,117,98,108,105,99,97,114,99,111,109,101,114, +99,105,111,99,111,110,116,114,97,116,111,106,195,179,118,101,110,101,115,100,105 +,115,116,114,105,116,111,116,195,169,99,110,105,99,97,99,111,110,106,117,110,116 +,111,101,110,101,114,103,195,173,97,116,114,97,98,97,106,97,114,97,115,116,117, +114,105,97,115,114,101,99,105,101,110,116,101,117,116,105,108,105,122,97,114,98, +111,108,101,116,195,173,110,115,97,108,118,97,100,111,114,99,111,114,114,101,99, +116,97,116,114,97,98,97,106,111,115,112,114,105,109,101,114,111,115,110,101,103, +111,99,105,111,115,108,105,98,101,114,116,97,100,100,101,116,97,108,108,101,115, +112,97,110,116,97,108,108,97,112,114,195,179,120,105,109,111,97,108,109,101,114, +195,173,97,97,110,105,109,97,108,101,115,113,117,105,195,169,110,101,115,99,111, +114,97,122,195,179,110,115,101,99,99,105,195,179,110,98,117,115,99,97,110,100, +111,111,112,99,105,111,110,101,115,101,120,116,101,114,105,111,114,99,111,110,99 +,101,112,116,111,116,111,100,97,118,195,173,97,103,97,108,101,114,195,173,97,101 +,115,99,114,105,98,105,114,109,101,100,105,99,105,110,97,108,105,99,101,110,99, +105,97,99,111,110,115,117,108,116,97,97,115,112,101,99,116,111,115,99,114,195, +173,116,105,99,97,100,195,179,108,97,114,101,115,106,117,115,116,105,99,105,97, +100,101,98,101,114,195,161,110,112,101,114,195,173,111,100,111,110,101,99,101, +115,105,116,97,109,97,110,116,101,110,101,114,112,101,113,117,101,195,177,111, +114,101,99,105,98,105,100,97,116,114,105,98,117,110,97,108,116,101,110,101,114, +105,102,101,99,97,110,99,105,195,179,110,99,97,110,97,114,105,97,115,100,101,115 +,99,97,114,103,97,100,105,118,101,114,115,111,115,109,97,108,108,111,114,99,97, +114,101,113,117,105,101,114,101,116,195,169,99,110,105,99,111,100,101,98,101,114 +,195,173,97,118,105,118,105,101,110,100,97,102,105,110,97,110,122,97,115,97,100, +101,108,97,110,116,101,102,117,110,99,105,111,110,97,99,111,110,115,101,106,111, +115,100,105,102,195,173,99,105,108,99,105,117,100,97,100,101,115,97,110,116,105, +103,117,97,115,97,118,97,110,122,97,100,97,116,195,169,114,109,105,110,111,117, +110,105,100,97,100,101,115,115,195,161,110,99,104,101,122,99,97,109,112,97,195, +177,97,115,111,102,116,111,110,105,99,114,101,118,105,115,116,97,115,99,111,110, +116,105,101,110,101,115,101,99,116,111,114,101,115,109,111,109,101,110,116,111, +115,102,97,99,117,108,116,97,100,99,114,195,169,100,105,116,111,100,105,118,101, +114,115,97,115,115,117,112,117,101,115,116,111,102,97,99,116,111,114,101,115,115 +,101,103,117,110,100,111,115,112,101,113,117,101,195,177,97,208,179,208,190,208, +180,208,176,208,181,209,129,208,187,208,184,208,181,209,129,209,130,209,140,208, +177,209,139,208,187,208,190,208,177,209,139,209,130,209,140,209,141,209,130,208, +190,208,188,208,149,209,129,208,187,208,184,209,130,208,190,208,179,208,190,208, +188,208,181,208,189,209,143,208,178,209,129,208,181,209,133,209,141,209,130,208, +190,208,185,208,180,208,176,208,182,208,181,208,177,209,139,208,187,208,184,208, +179,208,190,208,180,209,131,208,180,208,181,208,189,209,140,209,141,209,130,208, +190,209,130,208,177,209,139,208,187,208,176,209,129,208,181,208,177,209,143,208, +190,208,180,208,184,208,189,209,129,208,181,208,177,208,181,208,189,208,176,208, +180,208,190,209,129,208,176,208,185,209,130,209,132,208,190,209,130,208,190,208, +189,208,181,208,179,208,190,209,129,208,178,208,190,208,184,209,129,208,178,208, +190,208,185,208,184,208,179,209,128,209,139,209,130,208,190,208,182,208,181,208, +178,209,129,208,181,208,188,209,129,208,178,208,190,209,142,208,187,208,184,209, +136,209,140,209,141,209,130,208,184,209,133,208,191,208,190,208,186,208,176,208, +180,208,189,208,181,208,185,208,180,208,190,208,188,208,176,208,188,208,184,209, +128,208,176,208,187,208,184,208,177,208,190,209,130,208,181,208,188,209,131,209, +133,208,190,209,130,209,143,208,180,208,178,209,131,209,133,209,129,208,181,209, +130,208,184,208,187,209,142,208,180,208,184,208,180,208,181,208,187,208,190,208, +188,208,184,209,128,208,181,209,130,208,181,208,177,209,143,209,129,208,178,208, +190,208,181,208,178,208,184,208,180,208,181,209,135,208,181,208,179,208,190,209, +141,209,130,208,184,208,188,209,129,209,135,208,181,209,130,209,130,208,181,208, +188,209,139,209,134,208,181,208,189,209,139,209,129,209,130,208,176,208,187,208, +178,208,181,208,180,209,140,209,130,208,181,208,188,208,181,208,178,208,190,208, +180,209,139,209,130,208,181,208,177,208,181,208,178,209,139,209,136,208,181,208, +189,208,176,208,188,208,184,209,130,208,184,208,191,208,176,209,130,208,190,208, +188,209,131,208,191,209,128,208,176,208,178,208,187,208,184,209,134,208,176,208, +190,208,180,208,189,208,176,208,179,208,190,208,180,209,139,208,183,208,189,208, +176,209,142,208,188,208,190,208,179,209,131,208,180,209,128,209,131,208,179,208, +178,209,129,208,181,208,185,208,184,208,180,208,181,209,130,208,186,208,184,208, +189,208,190,208,190,208,180,208,189,208,190,208,180,208,181,208,187,208,176,208, +180,208,181,208,187,208,181,209,129,209,128,208,190,208,186,208,184,209,142,208, +189,209,143,208,178,208,181,209,129,209,140,208,149,209,129,209,130,209,140,209, +128,208,176,208,183,208,176,208,189,208,176,209,136,208,184,216,167,217,132,217, +132,217,135,216,167,217,132,216,170,217,138,216,172,217,133,217,138,216,185,216, +174,216,167,216,181,216,169,216,167,217,132,216,176,217,138,216,185,217,132,217, +138,217,135,216,172,216,175,217,138,216,175,216,167,217,132,216,162,217,134,216, +167,217,132,216,177,216,175,216,170,216,173,217,131,217,133,216,181,217,129,216, +173,216,169,217,131,216,167,217,134,216,170,216,167,217,132,217,132,217,138,217, +138,217,131,217,136,217,134,216,180,216,168,217,131,216,169,217,129,217,138,217, +135,216,167,216,168,217,134,216,167,216,170,216,173,217,136,216,167,216,161,216, +163,217,131,216,171,216,177,216,174,217,132,216,167,217,132,216,167,217,132,216, +173,216,168,216,175,217,132,217,138,217,132,216,175,216,177,217,136,216,179,216, +167,216,182,216,186,216,183,216,170,217,131,217,136,217,134,217,135,217,134,216, +167,217,131,216,179,216,167,216,173,216,169,217,134,216,167,216,175,217,138,216, +167,217,132,216,183,216,168,216,185,217,132,217,138,217,131,216,180,217,131,216, +177,216,167,217,138,217,133,217,131,217,134,217,133,217,134,217,135,216,167,216, +180,216,177,217,131,216,169,216,177,216,166,217,138,216,179,217,134,216,180,217, +138,216,183,217,133,216,167,216,176,216,167,216,167,217,132,217,129,217,134,216, +180,216,168,216,167,216,168,216,170,216,185,216,168,216,177,216,177,216,173,217, +133,216,169,217,131,216,167,217,129,216,169,217,138,217,130,217,136,217,132,217, +133,216,177,217,131,216,178,217,131,217,132,217,133,216,169,216,163,216,173,217, +133,216,175,217,130,217,132,216,168,217,138,217,138,216,185,217,134,217,138,216, +181,217,136,216,177,216,169,216,183,216,177,217,138,217,130,216,180,216,167,216, +177,217,131,216,172,217,136,216,167,217,132,216,163,216,174,216,177,217,137,217, +133,216,185,217,134,216,167,216,167,216,168,216,173,216,171,216,185,216,177,217, +136,216,182,216,168,216,180,217,131,217,132,217,133,216,179,216,172,217,132,216, +168,217,134,216,167,217,134,216,174,216,167,217,132,216,175,217,131,216,170,216, +167,216,168,217,131,217,132,217,138,216,169,216,168,216,175,217,136,217,134,216, +163,217,138,216,182,216,167,217,138,217,136,216,172,216,175,217,129,216,177,217, +138,217,130,217,131,216,170,216,168,216,170,216,163,217,129,216,182,217,132,217, +133,216,183,216,168,216,174,216,167,217,131,216,171,216,177,216,168,216,167,216, +177,217,131,216,167,217,129,216,182,217,132,216,167,216,173,217,132,217,137,217, +134,217,129,216,179,217,135,216,163,217,138,216,167,217,133,216,177,216,175,217, +136,216,175,216,163,217,134,217,135,216,167,216,175,217,138,217,134,216,167,216, +167,217,132,216,167,217,134,217,133,216,185,216,177,216,182,216,170,216,185,217, +132,217,133,216,175,216,167,216,174,217,132,217,133,217,133,217,131,217,134,0,0, +0,0,0,0,0,0,1,0,1,0,1,0,1,0,2,0,2,0,2,0,2,0,4,0,4,0,4,0,4,0,0,1,2,3,4,5,6,7,7,6, +5,4,3,2,1,0,8,9,10,11,12,13,14,15,15,14,13,12,11,10,9,8,16,17,18,19,20,21,22,23, +23,22,21,20,19,18,17,16,24,25,26,27,28,29,30,31,31,30,29,28,27,26,25,24,255,255, +255,255,0,0,0,0,0,0,0,0,255,255,255,255,1,0,0,0,2,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0, +3,0,0,0,255,255,0,1,0,0,0,1,0,0,255,255,0,1,0,0,0,8,0,8,0,8,0,8,0,0,0,1,0,2,0,3, +0,4,0,5,0,6,0,7,114,101,115,111,117,114,99,101,115,99,111,117,110,116,114,105, +101,115,113,117,101,115,116,105,111,110,115,101,113,117,105,112,109,101,110,116, +99,111,109,109,117,110,105,116,121,97,118,97,105,108,97,98,108,101,104,105,103, +104,108,105,103,104,116,68,84,68,47,120,104,116,109,108,109,97,114,107,101,116, +105,110,103,107,110,111,119,108,101,100,103,101,115,111,109,101,116,104,105,110, +103,99,111,110,116,97,105,110,101,114,100,105,114,101,99,116,105,111,110,115,117 +,98,115,99,114,105,98,101,97,100,118,101,114,116,105,115,101,99,104,97,114,97,99 +,116,101,114,34,32,118,97,108,117,101,61,34,60,47,115,101,108,101,99,116,62,65, +117,115,116,114,97,108,105,97,34,32,99,108,97,115,115,61,34,115,105,116,117,97, +116,105,111,110,97,117,116,104,111,114,105,116,121,102,111,108,108,111,119,105, +110,103,112,114,105,109,97,114,105,108,121,111,112,101,114,97,116,105,111,110,99 +,104,97,108,108,101,110,103,101,100,101,118,101,108,111,112,101,100,97,110,111, +110,121,109,111,117,115,102,117,110,99,116,105,111,110,32,102,117,110,99,116,105 +,111,110,115,99,111,109,112,97,110,105,101,115,115,116,114,117,99,116,117,114, +101,97,103,114,101,101,109,101,110,116,34,32,116,105,116,108,101,61,34,112,111, +116,101,110,116,105,97,108,101,100,117,99,97,116,105,111,110,97,114,103,117,109, +101,110,116,115,115,101,99,111,110,100,97,114,121,99,111,112,121,114,105,103,104 +,116,108,97,110,103,117,97,103,101,115,101,120,99,108,117,115,105,118,101,99,111 +,110,100,105,116,105,111,110,60,47,102,111,114,109,62,13,10,115,116,97,116,101, +109,101,110,116,97,116,116,101,110,116,105,111,110,66,105,111,103,114,97,112,104 +,121,125,32,101,108,115,101,32,123,10,115,111,108,117,116,105,111,110,115,119, +104,101,110,32,116,104,101,32,65,110,97,108,121,116,105,99,115,116,101,109,112, +108,97,116,101,115,100,97,110,103,101,114,111,117,115,115,97,116,101,108,108,105 +,116,101,100,111,99,117,109,101,110,116,115,112,117,98,108,105,115,104,101,114, +105,109,112,111,114,116,97,110,116,112,114,111,116,111,116,121,112,101,105,110, +102,108,117,101,110,99,101,38,114,97,113,117,111,59,60,47,101,102,102,101,99,116 +,105,118,101,103,101,110,101,114,97,108,108,121,116,114,97,110,115,102,111,114, +109,98,101,97,117,116,105,102,117,108,116,114,97,110,115,112,111,114,116,111,114 +,103,97,110,105,122,101,100,112,117,98,108,105,115,104,101,100,112,114,111,109, +105,110,101,110,116,117,110,116,105,108,32,116,104,101,116,104,117,109,98,110,97 +,105,108,78,97,116,105,111,110,97,108,32,46,102,111,99,117,115,40,41,59,111,118, +101,114,32,116,104,101,32,109,105,103,114,97,116,105,111,110,97,110,110,111,117, +110,99,101,100,102,111,111,116,101,114,34,62,10,101,120,99,101,112,116,105,111, +110,108,101,115,115,32,116,104,97,110,101,120,112,101,110,115,105,118,101,102, +111,114,109,97,116,105,111,110,102,114,97,109,101,119,111,114,107,116,101,114, +114,105,116,111,114,121,110,100,105,99,97,116,105,111,110,99,117,114,114,101,110 +,116,108,121,99,108,97,115,115,78,97,109,101,99,114,105,116,105,99,105,115,109, +116,114,97,100,105,116,105,111,110,101,108,115,101,119,104,101,114,101,65,108, +101,120,97,110,100,101,114,97,112,112,111,105,110,116,101,100,109,97,116,101,114 +,105,97,108,115,98,114,111,97,100,99,97,115,116,109,101,110,116,105,111,110,101, +100,97,102,102,105,108,105,97,116,101,60,47,111,112,116,105,111,110,62,116,114, +101,97,116,109,101,110,116,100,105,102,102,101,114,101,110,116,47,100,101,102,97 +,117,108,116,46,80,114,101,115,105,100,101,110,116,111,110,99,108,105,99,107,61, +34,98,105,111,103,114,97,112,104,121,111,116,104,101,114,119,105,115,101,112,101 +,114,109,97,110,101,110,116,70,114,97,110,195,167,97,105,115,72,111,108,108,121, +119,111,111,100,101,120,112,97,110,115,105,111,110,115,116,97,110,100,97,114,100 +,115,60,47,115,116,121,108,101,62,10,114,101,100,117,99,116,105,111,110,68,101, +99,101,109,98,101,114,32,112,114,101,102,101,114,114,101,100,67,97,109,98,114, +105,100,103,101,111,112,112,111,110,101,110,116,115,66,117,115,105,110,101,115, +115,32,99,111,110,102,117,115,105,111,110,62,10,60,116,105,116,108,101,62,112, +114,101,115,101,110,116,101,100,101,120,112,108,97,105,110,101,100,100,111,101, +115,32,110,111,116,32,119,111,114,108,100,119,105,100,101,105,110,116,101,114, +102,97,99,101,112,111,115,105,116,105,111,110,115,110,101,119,115,112,97,112,101 +,114,60,47,116,97,98,108,101,62,10,109,111,117,110,116,97,105,110,115,108,105, +107,101,32,116,104,101,32,101,115,115,101,110,116,105,97,108,102,105,110,97,110, +99,105,97,108,115,101,108,101,99,116,105,111,110,97,99,116,105,111,110,61,34,47, +97,98,97,110,100,111,110,101,100,69,100,117,99,97,116,105,111,110,112,97,114,115 +,101,73,110,116,40,115,116,97,98,105,108,105,116,121,117,110,97,98,108,101,32, +116,111,60,47,116,105,116,108,101,62,10,114,101,108,97,116,105,111,110,115,78, +111,116,101,32,116,104,97,116,101,102,102,105,99,105,101,110,116,112,101,114,102 +,111,114,109,101,100,116,119,111,32,121,101,97,114,115,83,105,110,99,101,32,116, +104,101,116,104,101,114,101,102,111,114,101,119,114,97,112,112,101,114,34,62,97, +108,116,101,114,110,97,116,101,105,110,99,114,101,97,115,101,100,66,97,116,116, +108,101,32,111,102,112,101,114,99,101,105,118,101,100,116,114,121,105,110,103,32 +,116,111,110,101,99,101,115,115,97,114,121,112,111,114,116,114,97,121,101,100, +101,108,101,99,116,105,111,110,115,69,108,105,122,97,98,101,116,104,60,47,105, +102,114,97,109,101,62,100,105,115,99,111,118,101,114,121,105,110,115,117,114,97, +110,99,101,115,46,108,101,110,103,116,104,59,108,101,103,101,110,100,97,114,121, +71,101,111,103,114,97,112,104,121,99,97,110,100,105,100,97,116,101,99,111,114, +112,111,114,97,116,101,115,111,109,101,116,105,109,101,115,115,101,114,118,105, +99,101,115,46,105,110,104,101,114,105,116,101,100,60,47,115,116,114,111,110,103, +62,67,111,109,109,117,110,105,116,121,114,101,108,105,103,105,111,117,115,108, +111,99,97,116,105,111,110,115,67,111,109,109,105,116,116,101,101,98,117,105,108, +100,105,110,103,115,116,104,101,32,119,111,114,108,100,110,111,32,108,111,110, +103,101,114,98,101,103,105,110,110,105,110,103,114,101,102,101,114,101,110,99, +101,99,97,110,110,111,116,32,98,101,102,114,101,113,117,101,110,99,121,116,121, +112,105,99,97,108,108,121,105,110,116,111,32,116,104,101,32,114,101,108,97,116, +105,118,101,59,114,101,99,111,114,100,105,110,103,112,114,101,115,105,100,101, +110,116,105,110,105,116,105,97,108,108,121,116,101,99,104,110,105,113,117,101, +116,104,101,32,111,116,104,101,114,105,116,32,99,97,110,32,98,101,101,120,105, +115,116,101,110,99,101,117,110,100,101,114,108,105,110,101,116,104,105,115,32, +116,105,109,101,116,101,108,101,112,104,111,110,101,105,116,101,109,115,99,111, +112,101,112,114,97,99,116,105,99,101,115,97,100,118,97,110,116,97,103,101,41,59, +114,101,116,117,114,110,32,70,111,114,32,111,116,104,101,114,112,114,111,118,105 +,100,105,110,103,100,101,109,111,99,114,97,99,121,98,111,116,104,32,116,104,101, +32,101,120,116,101,110,115,105,118,101,115,117,102,102,101,114,105,110,103,115, +117,112,112,111,114,116,101,100,99,111,109,112,117,116,101,114,115,32,102,117, +110,99,116,105,111,110,112,114,97,99,116,105,99,97,108,115,97,105,100,32,116,104 +,97,116,105,116,32,109,97,121,32,98,101,69,110,103,108,105,115,104,60,47,102,114 +,111,109,32,116,104,101,32,115,99,104,101,100,117,108,101,100,100,111,119,110, +108,111,97,100,115,60,47,108,97,98,101,108,62,10,115,117,115,112,101,99,116,101, +100,109,97,114,103,105,110,58,32,48,115,112,105,114,105,116,117,97,108,60,47,104 +,101,97,100,62,10,10,109,105,99,114,111,115,111,102,116,103,114,97,100,117,97, +108,108,121,100,105,115,99,117,115,115,101,100,104,101,32,98,101,99,97,109,101, +101,120,101,99,117,116,105,118,101,106,113,117,101,114,121,46,106,115,104,111, +117,115,101,104,111,108,100,99,111,110,102,105,114,109,101,100,112,117,114,99, +104,97,115,101,100,108,105,116,101,114,97,108,108,121,100,101,115,116,114,111, +121,101,100,117,112,32,116,111,32,116,104,101,118,97,114,105,97,116,105,111,110, +114,101,109,97,105,110,105,110,103,105,116,32,105,115,32,110,111,116,99,101,110, +116,117,114,105,101,115,74,97,112,97,110,101,115,101,32,97,109,111,110,103,32, +116,104,101,99,111,109,112,108,101,116,101,100,97,108,103,111,114,105,116,104, +109,105,110,116,101,114,101,115,116,115,114,101,98,101,108,108,105,111,110,117, +110,100,101,102,105,110,101,100,101,110,99,111,117,114,97,103,101,114,101,115, +105,122,97,98,108,101,105,110,118,111,108,118,105,110,103,115,101,110,115,105, +116,105,118,101,117,110,105,118,101,114,115,97,108,112,114,111,118,105,115,105, +111,110,40,97,108,116,104,111,117,103,104,102,101,97,116,117,114,105,110,103,99, +111,110,100,117,99,116,101,100,41,44,32,119,104,105,99,104,32,99,111,110,116,105 +,110,117,101,100,45,104,101,97,100,101,114,34,62,70,101,98,114,117,97,114,121,32 +,110,117,109,101,114,111,117,115,32,111,118,101,114,102,108,111,119,58,99,111, +109,112,111,110,101,110,116,102,114,97,103,109,101,110,116,115,101,120,99,101, +108,108,101,110,116,99,111,108,115,112,97,110,61,34,116,101,99,104,110,105,99,97 +,108,110,101,97,114,32,116,104,101,32,65,100,118,97,110,99,101,100,32,115,111, +117,114,99,101,32,111,102,101,120,112,114,101,115,115,101,100,72,111,110,103,32, +75,111,110,103,32,70,97,99,101,98,111,111,107,109,117,108,116,105,112,108,101,32 +,109,101,99,104,97,110,105,115,109,101,108,101,118,97,116,105,111,110,111,102, +102,101,110,115,105,118,101,60,47,102,111,114,109,62,10,9,115,112,111,110,115, +111,114,101,100,100,111,99,117,109,101,110,116,46,111,114,32,38,113,117,111,116, +59,116,104,101,114,101,32,97,114,101,116,104,111,115,101,32,119,104,111,109,111, +118,101,109,101,110,116,115,112,114,111,99,101,115,115,101,115,100,105,102,102, +105,99,117,108,116,115,117,98,109,105,116,116,101,100,114,101,99,111,109,109,101 +,110,100,99,111,110,118,105,110,99,101,100,112,114,111,109,111,116,105,110,103, +34,32,119,105,100,116,104,61,34,46,114,101,112,108,97,99,101,40,99,108,97,115, +115,105,99,97,108,99,111,97,108,105,116,105,111,110,104,105,115,32,102,105,114, +115,116,100,101,99,105,115,105,111,110,115,97,115,115,105,115,116,97,110,116,105 +,110,100,105,99,97,116,101,100,101,118,111,108,117,116,105,111,110,45,119,114,97 +,112,112,101,114,34,101,110,111,117,103,104,32,116,111,97,108,111,110,103,32,116 +,104,101,100,101,108,105,118,101,114,101,100,45,45,62,13,10,60,33,45,45,65,109, +101,114,105,99,97,110,32,112,114,111,116,101,99,116,101,100,78,111,118,101,109, +98,101,114,32,60,47,115,116,121,108,101,62,60,102,117,114,110,105,116,117,114, +101,73,110,116,101,114,110,101,116,32,32,111,110,98,108,117,114,61,34,115,117, +115,112,101,110,100,101,100,114,101,99,105,112,105,101,110,116,98,97,115,101,100 +,32,111,110,32,77,111,114,101,111,118,101,114,44,97,98,111,108,105,115,104,101, +100,99,111,108,108,101,99,116,101,100,119,101,114,101,32,109,97,100,101,101,109, +111,116,105,111,110,97,108,101,109,101,114,103,101,110,99,121,110,97,114,114,97, +116,105,118,101,97,100,118,111,99,97,116,101,115,112,120,59,98,111,114,100,101, +114,99,111,109,109,105,116,116,101,100,100,105,114,61,34,108,116,114,34,101,109, +112,108,111,121,101,101,115,114,101,115,101,97,114,99,104,46,32,115,101,108,101, +99,116,101,100,115,117,99,99,101,115,115,111,114,99,117,115,116,111,109,101,114, +115,100,105,115,112,108,97,121,101,100,83,101,112,116,101,109,98,101,114,97,100, +100,67,108,97,115,115,40,70,97,99,101,98,111,111,107,32,115,117,103,103,101,115, +116,101,100,97,110,100,32,108,97,116,101,114,111,112,101,114,97,116,105,110,103, +101,108,97,98,111,114,97,116,101,83,111,109,101,116,105,109,101,115,73,110,115, +116,105,116,117,116,101,99,101,114,116,97,105,110,108,121,105,110,115,116,97,108 +,108,101,100,102,111,108,108,111,119,101,114,115,74,101,114,117,115,97,108,101, +109,116,104,101,121,32,104,97,118,101,99,111,109,112,117,116,105,110,103,103,101 +,110,101,114,97,116,101,100,112,114,111,118,105,110,99,101,115,103,117,97,114,97 +,110,116,101,101,97,114,98,105,116,114,97,114,121,114,101,99,111,103,110,105,122 +,101,119,97,110,116,101,100,32,116,111,112,120,59,119,105,100,116,104,58,116,104 +,101,111,114,121,32,111,102,98,101,104,97,118,105,111,117,114,87,104,105,108,101 +,32,116,104,101,101,115,116,105,109,97,116,101,100,98,101,103,97,110,32,116,111, +32,105,116,32,98,101,99,97,109,101,109,97,103,110,105,116,117,100,101,109,117, +115,116,32,104,97,118,101,109,111,114,101,32,116,104,97,110,68,105,114,101,99, +116,111,114,121,101,120,116,101,110,115,105,111,110,115,101,99,114,101,116,97, +114,121,110,97,116,117,114,97,108,108,121,111,99,99,117,114,114,105,110,103,118, +97,114,105,97,98,108,101,115,103,105,118,101,110,32,116,104,101,112,108,97,116, +102,111,114,109,46,60,47,108,97,98,101,108,62,60,102,97,105,108,101,100,32,116, +111,99,111,109,112,111,117,110,100,115,107,105,110,100,115,32,111,102,32,115,111 +,99,105,101,116,105,101,115,97,108,111,110,103,115,105,100,101,32,45,45,38,103, +116,59,10,10,115,111,117,116,104,119,101,115,116,116,104,101,32,114,105,103,104, +116,114,97,100,105,97,116,105,111,110,109,97,121,32,104,97,118,101,32,117,110, +101,115,99,97,112,101,40,115,112,111,107,101,110,32,105,110,34,32,104,114,101, +102,61,34,47,112,114,111,103,114,97,109,109,101,111,110,108,121,32,116,104,101, +32,99,111,109,101,32,102,114,111,109,100,105,114,101,99,116,111,114,121,98,117, +114,105,101,100,32,105,110,97,32,115,105,109,105,108,97,114,116,104,101,121,32, +119,101,114,101,60,47,102,111,110,116,62,60,47,78,111,114,119,101,103,105,97,110 +,115,112,101,99,105,102,105,101,100,112,114,111,100,117,99,105,110,103,112,97, +115,115,101,110,103,101,114,40,110,101,119,32,68,97,116,101,116,101,109,112,111, +114,97,114,121,102,105,99,116,105,111,110,97,108,65,102,116,101,114,32,116,104, +101,101,113,117,97,116,105,111,110,115,100,111,119,110,108,111,97,100,46,114,101 +,103,117,108,97,114,108,121,100,101,118,101,108,111,112,101,114,97,98,111,118, +101,32,116,104,101,108,105,110,107,101,100,32,116,111,112,104,101,110,111,109, +101,110,97,112,101,114,105,111,100,32,111,102,116,111,111,108,116,105,112,34,62, +115,117,98,115,116,97,110,99,101,97,117,116,111,109,97,116,105,99,97,115,112,101 +,99,116,32,111,102,65,109,111,110,103,32,116,104,101,99,111,110,110,101,99,116, +101,100,101,115,116,105,109,97,116,101,115,65,105,114,32,70,111,114,99,101,115, +121,115,116,101,109,32,111,102,111,98,106,101,99,116,105,118,101,105,109,109,101 +,100,105,97,116,101,109,97,107,105,110,103,32,105,116,112,97,105,110,116,105,110 +,103,115,99,111,110,113,117,101,114,101,100,97,114,101,32,115,116,105,108,108, +112,114,111,99,101,100,117,114,101,103,114,111,119,116,104,32,111,102,104,101,97 +,100,101,100,32,98,121,69,117,114,111,112,101,97,110,32,100,105,118,105,115,105, +111,110,115,109,111,108,101,99,117,108,101,115,102,114,97,110,99,104,105,115,101 +,105,110,116,101,110,116,105,111,110,97,116,116,114,97,99,116,101,100,99,104,105 +,108,100,104,111,111,100,97,108,115,111,32,117,115,101,100,100,101,100,105,99,97 +,116,101,100,115,105,110,103,97,112,111,114,101,100,101,103,114,101,101,32,111, +102,102,97,116,104,101,114,32,111,102,99,111,110,102,108,105,99,116,115,60,47,97 +,62,60,47,112,62,10,99,97,109,101,32,102,114,111,109,119,101,114,101,32,117,115, +101,100,110,111,116,101,32,116,104,97,116,114,101,99,101,105,118,105,110,103,69, +120,101,99,117,116,105,118,101,101,118,101,110,32,109,111,114,101,97,99,99,101, +115,115,32,116,111,99,111,109,109,97,110,100,101,114,80,111,108,105,116,105,99, +97,108,109,117,115,105,99,105,97,110,115,100,101,108,105,99,105,111,117,115,112, +114,105,115,111,110,101,114,115,97,100,118,101,110,116,32,111,102,85,84,70,45,56 +,34,32,47,62,60,33,91,67,68,65,84,65,91,34,62,67,111,110,116,97,99,116,83,111, +117,116,104,101,114,110,32,98,103,99,111,108,111,114,61,34,115,101,114,105,101, +115,32,111,102,46,32,73,116,32,119,97,115,32,105,110,32,69,117,114,111,112,101, +112,101,114,109,105,116,116,101,100,118,97,108,105,100,97,116,101,46,97,112,112, +101,97,114,105,110,103,111,102,102,105,99,105,97,108,115,115,101,114,105,111,117 +,115,108,121,45,108,97,110,103,117,97,103,101,105,110,105,116,105,97,116,101,100 +,101,120,116,101,110,100,105,110,103,108,111,110,103,45,116,101,114,109,105,110, +102,108,97,116,105,111,110,115,117,99,104,32,116,104,97,116,103,101,116,67,111, +111,107,105,101,109,97,114,107,101,100,32,98,121,60,47,98,117,116,116,111,110,62 +,105,109,112,108,101,109,101,110,116,98,117,116,32,105,116,32,105,115,105,110,99 +,114,101,97,115,101,115,100,111,119,110,32,116,104,101,32,114,101,113,117,105, +114,105,110,103,100,101,112,101,110,100,101,110,116,45,45,62,10,60,33,45,45,32, +105,110,116,101,114,118,105,101,119,87,105,116,104,32,116,104,101,32,99,111,112, +105,101,115,32,111,102,99,111,110,115,101,110,115,117,115,119,97,115,32,98,117, +105,108,116,86,101,110,101,122,117,101,108,97,40,102,111,114,109,101,114,108,121 +,116,104,101,32,115,116,97,116,101,112,101,114,115,111,110,110,101,108,115,116, +114,97,116,101,103,105,99,102,97,118,111,117,114,32,111,102,105,110,118,101,110, +116,105,111,110,87,105,107,105,112,101,100,105,97,99,111,110,116,105,110,101,110 +,116,118,105,114,116,117,97,108,108,121,119,104,105,99,104,32,119,97,115,112,114 +,105,110,99,105,112,108,101,67,111,109,112,108,101,116,101,32,105,100,101,110, +116,105,99,97,108,115,104,111,119,32,116,104,97,116,112,114,105,109,105,116,105, +118,101,97,119,97,121,32,102,114,111,109,109,111,108,101,99,117,108,97,114,112, +114,101,99,105,115,101,108,121,100,105,115,115,111,108,118,101,100,85,110,100, +101,114,32,116,104,101,118,101,114,115,105,111,110,61,34,62,38,110,98,115,112,59 +,60,47,73,116,32,105,115,32,116,104,101,32,84,104,105,115,32,105,115,32,119,105, +108,108,32,104,97,118,101,111,114,103,97,110,105,115,109,115,115,111,109,101,32, +116,105,109,101,70,114,105,101,100,114,105,99,104,119,97,115,32,102,105,114,115, +116,116,104,101,32,111,110,108,121,32,102,97,99,116,32,116,104,97,116,102,111, +114,109,32,105,100,61,34,112,114,101,99,101,100,105,110,103,84,101,99,104,110, +105,99,97,108,112,104,121,115,105,99,105,115,116,111,99,99,117,114,115,32,105, +110,110,97,118,105,103,97,116,111,114,115,101,99,116,105,111,110,34,62,115,112, +97,110,32,105,100,61,34,115,111,117,103,104,116,32,116,111,98,101,108,111,119,32 +,116,104,101,115,117,114,118,105,118,105,110,103,125,60,47,115,116,121,108,101, +62,104,105,115,32,100,101,97,116,104,97,115,32,105,110,32,116,104,101,99,97,117, +115,101,100,32,98,121,112,97,114,116,105,97,108,108,121,101,120,105,115,116,105, +110,103,32,117,115,105,110,103,32,116,104,101,119,97,115,32,103,105,118,101,110, +97,32,108,105,115,116,32,111,102,108,101,118,101,108,115,32,111,102,110,111,116, +105,111,110,32,111,102,79,102,102,105,99,105,97,108,32,100,105,115,109,105,115, +115,101,100,115,99,105,101,110,116,105,115,116,114,101,115,101,109,98,108,101, +115,100,117,112,108,105,99,97,116,101,101,120,112,108,111,115,105,118,101,114, +101,99,111,118,101,114,101,100,97,108,108,32,111,116,104,101,114,103,97,108,108, +101,114,105,101,115,123,112,97,100,100,105,110,103,58,112,101,111,112,108,101,32 +,111,102,114,101,103,105,111,110,32,111,102,97,100,100,114,101,115,115,101,115, +97,115,115,111,99,105,97,116,101,105,109,103,32,97,108,116,61,34,105,110,32,109, +111,100,101,114,110,115,104,111,117,108,100,32,98,101,109,101,116,104,111,100,32 +,111,102,114,101,112,111,114,116,105,110,103,116,105,109,101,115,116,97,109,112, +110,101,101,100,101,100,32,116,111,116,104,101,32,71,114,101,97,116,114,101,103, +97,114,100,105,110,103,115,101,101,109,101,100,32,116,111,118,105,101,119,101, +100,32,97,115,105,109,112,97,99,116,32,111,110,105,100,101,97,32,116,104,97,116, +116,104,101,32,87,111,114,108,100,104,101,105,103,104,116,32,111,102,101,120,112 +,97,110,100,105,110,103,84,104,101,115,101,32,97,114,101,99,117,114,114,101,110, +116,34,62,99,97,114,101,102,117,108,108,121,109,97,105,110,116,97,105,110,115,99 +,104,97,114,103,101,32,111,102,67,108,97,115,115,105,99,97,108,97,100,100,114, +101,115,115,101,100,112,114,101,100,105,99,116,101,100,111,119,110,101,114,115, +104,105,112,60,100,105,118,32,105,100,61,34,114,105,103,104,116,34,62,13,10,114, +101,115,105,100,101,110,99,101,108,101,97,118,101,32,116,104,101,99,111,110,116, +101,110,116,34,62,97,114,101,32,111,102,116,101,110,32,32,125,41,40,41,59,13,10, +112,114,111,98,97,98,108,121,32,80,114,111,102,101,115,115,111,114,45,98,117,116 +,116,111,110,34,32,114,101,115,112,111,110,100,101,100,115,97,121,115,32,116,104 +,97,116,104,97,100,32,116,111,32,98,101,112,108,97,99,101,100,32,105,110,72,117, +110,103,97,114,105,97,110,115,116,97,116,117,115,32,111,102,115,101,114,118,101, +115,32,97,115,85,110,105,118,101,114,115,97,108,101,120,101,99,117,116,105,111, +110,97,103,103,114,101,103,97,116,101,102,111,114,32,119,104,105,99,104,105,110, +102,101,99,116,105,111,110,97,103,114,101,101,100,32,116,111,104,111,119,101,118 +,101,114,44,32,112,111,112,117,108,97,114,34,62,112,108,97,99,101,100,32,111,110 +,99,111,110,115,116,114,117,99,116,101,108,101,99,116,111,114,97,108,115,121,109 +,98,111,108,32,111,102,105,110,99,108,117,100,105,110,103,114,101,116,117,114, +110,32,116,111,97,114,99,104,105,116,101,99,116,67,104,114,105,115,116,105,97, +110,112,114,101,118,105,111,117,115,32,108,105,118,105,110,103,32,105,110,101,97 +,115,105,101,114,32,116,111,112,114,111,102,101,115,115,111,114,10,38,108,116,59 +,33,45,45,32,101,102,102,101,99,116,32,111,102,97,110,97,108,121,116,105,99,115, +119,97,115,32,116,97,107,101,110,119,104,101,114,101,32,116,104,101,116,111,111, +107,32,111,118,101,114,98,101,108,105,101,102,32,105,110,65,102,114,105,107,97, +97,110,115,97,115,32,102,97,114,32,97,115,112,114,101,118,101,110,116,101,100, +119,111,114,107,32,119,105,116,104,97,32,115,112,101,99,105,97,108,60,102,105, +101,108,100,115,101,116,67,104,114,105,115,116,109,97,115,82,101,116,114,105,101 +,118,101,100,10,10,73,110,32,116,104,101,32,98,97,99,107,32,105,110,116,111,110, +111,114,116,104,101,97,115,116,109,97,103,97,122,105,110,101,115,62,60,115,116, +114,111,110,103,62,99,111,109,109,105,116,116,101,101,103,111,118,101,114,110, +105,110,103,103,114,111,117,112,115,32,111,102,115,116,111,114,101,100,32,105, +110,101,115,116,97,98,108,105,115,104,97,32,103,101,110,101,114,97,108,105,116, +115,32,102,105,114,115,116,116,104,101,105,114,32,111,119,110,112,111,112,117, +108,97,116,101,100,97,110,32,111,98,106,101,99,116,67,97,114,105,98,98,101,97, +110,97,108,108,111,119,32,116,104,101,100,105,115,116,114,105,99,116,115,119,105 +,115,99,111,110,115,105,110,108,111,99,97,116,105,111,110,46,59,32,119,105,100, +116,104,58,32,105,110,104,97,98,105,116,101,100,83,111,99,105,97,108,105,115,116 +,74,97,110,117,97,114,121,32,49,60,47,102,111,111,116,101,114,62,115,105,109,105 +,108,97,114,108,121,99,104,111,105,99,101,32,111,102,116,104,101,32,115,97,109, +101,32,115,112,101,99,105,102,105,99,32,98,117,115,105,110,101,115,115,32,84,104 +,101,32,102,105,114,115,116,46,108,101,110,103,116,104,59,32,100,101,115,105,114 +,101,32,116,111,100,101,97,108,32,119,105,116,104,115,105,110,99,101,32,116,104, +101,117,115,101,114,65,103,101,110,116,99,111,110,99,101,105,118,101,100,105,110 +,100,101,120,46,112,104,112,97,115,32,38,113,117,111,116,59,101,110,103,97,103, +101,32,105,110,114,101,99,101,110,116,108,121,44,102,101,119,32,121,101,97,114, +115,119,101,114,101,32,97,108,115,111,10,60,104,101,97,100,62,10,60,101,100,105, +116,101,100,32,98,121,97,114,101,32,107,110,111,119,110,99,105,116,105,101,115, +32,105,110,97,99,99,101,115,115,107,101,121,99,111,110,100,101,109,110,101,100, +97,108,115,111,32,104,97,118,101,115,101,114,118,105,99,101,115,44,102,97,109, +105,108,121,32,111,102,83,99,104,111,111,108,32,111,102,99,111,110,118,101,114, +116,101,100,110,97,116,117,114,101,32,111,102,32,108,97,110,103,117,97,103,101, +109,105,110,105,115,116,101,114,115,60,47,111,98,106,101,99,116,62,116,104,101, +114,101,32,105,115,32,97,32,112,111,112,117,108,97,114,115,101,113,117,101,110, +99,101,115,97,100,118,111,99,97,116,101,100,84,104,101,121,32,119,101,114,101,97 +,110,121,32,111,116,104,101,114,108,111,99,97,116,105,111,110,61,101,110,116,101 +,114,32,116,104,101,109,117,99,104,32,109,111,114,101,114,101,102,108,101,99,116 +,101,100,119,97,115,32,110,97,109,101,100,111,114,105,103,105,110,97,108,32,97, +32,116,121,112,105,99,97,108,119,104,101,110,32,116,104,101,121,101,110,103,105, +110,101,101,114,115,99,111,117,108,100,32,110,111,116,114,101,115,105,100,101, +110,116,115,119,101,100,110,101,115,100,97,121,116,104,101,32,116,104,105,114, +100,32,112,114,111,100,117,99,116,115,74,97,110,117,97,114,121,32,50,119,104,97, +116,32,116,104,101,121,97,32,99,101,114,116,97,105,110,114,101,97,99,116,105,111 +,110,115,112,114,111,99,101,115,115,111,114,97,102,116,101,114,32,104,105,115, +116,104,101,32,108,97,115,116,32,99,111,110,116,97,105,110,101,100,34,62,60,47, +100,105,118,62,10,60,47,97,62,60,47,116,100,62,100,101,112,101,110,100,32,111, +110,115,101,97,114,99,104,34,62,10,112,105,101,99,101,115,32,111,102,99,111,109, +112,101,116,105,110,103,82,101,102,101,114,101,110,99,101,116,101,110,110,101, +115,115,101,101,119,104,105,99,104,32,104,97,115,32,118,101,114,115,105,111,110, +61,60,47,115,112,97,110,62,32,60,60,47,104,101,97,100,101,114,62,103,105,118,101 +,115,32,116,104,101,104,105,115,116,111,114,105,97,110,118,97,108,117,101,61,34, +34,62,112,97,100,100,105,110,103,58,48,118,105,101,119,32,116,104,97,116,116,111 +,103,101,116,104,101,114,44,116,104,101,32,109,111,115,116,32,119,97,115,32,102, +111,117,110,100,115,117,98,115,101,116,32,111,102,97,116,116,97,99,107,32,111, +110,99,104,105,108,100,114,101,110,44,112,111,105,110,116,115,32,111,102,112,101 +,114,115,111,110,97,108,32,112,111,115,105,116,105,111,110,58,97,108,108,101,103 +,101,100,108,121,67,108,101,118,101,108,97,110,100,119,97,115,32,108,97,116,101, +114,97,110,100,32,97,102,116,101,114,97,114,101,32,103,105,118,101,110,119,97, +115,32,115,116,105,108,108,115,99,114,111,108,108,105,110,103,100,101,115,105, +103,110,32,111,102,109,97,107,101,115,32,116,104,101,109,117,99,104,32,108,101, +115,115,65,109,101,114,105,99,97,110,115,46,10,10,65,102,116,101,114,32,44,32,98 +,117,116,32,116,104,101,77,117,115,101,117,109,32,111,102,108,111,117,105,115, +105,97,110,97,40,102,114,111,109,32,116,104,101,109,105,110,110,101,115,111,116, +97,112,97,114,116,105,99,108,101,115,97,32,112,114,111,99,101,115,115,68,111,109 +,105,110,105,99,97,110,118,111,108,117,109,101,32,111,102,114,101,116,117,114, +110,105,110,103,100,101,102,101,110,115,105,118,101,48,48,112,120,124,114,105, +103,104,109,97,100,101,32,102,114,111,109,109,111,117,115,101,111,118,101,114,34 +,32,115,116,121,108,101,61,34,115,116,97,116,101,115,32,111,102,40,119,104,105, +99,104,32,105,115,99,111,110,116,105,110,117,101,115,70,114,97,110,99,105,115,99 +,111,98,117,105,108,100,105,110,103,32,119,105,116,104,111,117,116,32,97,119,105 +,116,104,32,115,111,109,101,119,104,111,32,119,111,117,108,100,97,32,102,111,114 +,109,32,111,102,97,32,112,97,114,116,32,111,102,98,101,102,111,114,101,32,105, +116,107,110,111,119,110,32,97,115,32,32,83,101,114,118,105,99,101,115,108,111,99 +,97,116,105,111,110,32,97,110,100,32,111,102,116,101,110,109,101,97,115,117,114, +105,110,103,97,110,100,32,105,116,32,105,115,112,97,112,101,114,98,97,99,107,118 +,97,108,117,101,115,32,111,102,13,10,60,116,105,116,108,101,62,61,32,119,105,110 +,100,111,119,46,100,101,116,101,114,109,105,110,101,101,114,38,113,117,111,116, +59,32,112,108,97,121,101,100,32,98,121,97,110,100,32,101,97,114,108,121,60,47,99 +,101,110,116,101,114,62,102,114,111,109,32,116,104,105,115,116,104,101,32,116, +104,114,101,101,112,111,119,101,114,32,97,110,100,111,102,32,38,113,117,111,116, +59,105,110,110,101,114,72,84,77,76,60,97,32,104,114,101,102,61,34,121,58,105,110 +,108,105,110,101,59,67,104,117,114,99,104,32,111,102,116,104,101,32,101,118,101, +110,116,118,101,114,121,32,104,105,103,104,111,102,102,105,99,105,97,108,32,45, +104,101,105,103,104,116,58,32,99,111,110,116,101,110,116,61,34,47,99,103,105,45, +98,105,110,47,116,111,32,99,114,101,97,116,101,97,102,114,105,107,97,97,110,115, +101,115,112,101,114,97,110,116,111,102,114,97,110,195,167,97,105,115,108,97,116, +118,105,101,197,161,117,108,105,101,116,117,118,105,197,179,196,140,101,197,161, +116,105,110,97,196,141,101,197,161,116,105,110,97,224,185,132,224,184,151,224, +184,162,230,151,165,230,156,172,232,170,158,231,174,128,228,189,147,229,173,151, +231,185,129,233,171,148,229,173,151,237,149,156,234,181,173,236,150,180,228,184, +186,228,187,128,228,185,136,232,174,161,231,174,151,230,156,186,231,172,148,232, +174,176,230,156,172,232,168,142,232,171,150,229,141,128,230,156,141,229,138,161, +229,153,168,228,186,146,232,129,148,231,189,145,230,136,191,229,156,176,228,186, +167,228,191,177,228,185,144,233,131,168,229,135,186,231,137,136,231,164,190,230, +142,146,232,161,140,230,166,156,233,131,168,232,144,189,230,160,188,232,191,155, +228,184,128,230,173,165,230,148,175,228,187,152,229,174,157,233,170,140,232,175, +129,231,160,129,229,167,148,229,145,152,228,188,154,230,149,176,230,141,174,229, +186,147,230,182,136,232,180,185,232,128,133,229,138,158,229,133,172,229,174,164, +232,174,168,232,174,186,229,140,186,230,183,177,229,156,179,229,184,130,230,146, +173,230,148,190,229,153,168,229,140,151,228,186,172,229,184,130,229,164,167,229, +173,166,231,148,159,232,182,138,230,157,165,232,182,138,231,174,161,231,144,134, +229,145,152,228,191,161,230,129,175,231,189,145,115,101,114,118,105,99,105,111, +115,97,114,116,195,173,99,117,108,111,97,114,103,101,110,116,105,110,97,98,97, +114,99,101,108,111,110,97,99,117,97,108,113,117,105,101,114,112,117,98,108,105, +99,97,100,111,112,114,111,100,117,99,116,111,115,112,111,108,195,173,116,105,99, +97,114,101,115,112,117,101,115,116,97,119,105,107,105,112,101,100,105,97,115,105 +,103,117,105,101,110,116,101,98,195,186,115,113,117,101,100,97,99,111,109,117, +110,105,100,97,100,115,101,103,117,114,105,100,97,100,112,114,105,110,99,105,112 +,97,108,112,114,101,103,117,110,116,97,115,99,111,110,116,101,110,105,100,111, +114,101,115,112,111,110,100,101,114,118,101,110,101,122,117,101,108,97,112,114, +111,98,108,101,109,97,115,100,105,99,105,101,109,98,114,101,114,101,108,97,99, +105,195,179,110,110,111,118,105,101,109,98,114,101,115,105,109,105,108,97,114, +101,115,112,114,111,121,101,99,116,111,115,112,114,111,103,114,97,109,97,115,105 +,110,115,116,105,116,117,116,111,97,99,116,105,118,105,100,97,100,101,110,99,117 +,101,110,116,114,97,101,99,111,110,111,109,195,173,97,105,109,195,161,103,101, +110,101,115,99,111,110,116,97,99,116,97,114,100,101,115,99,97,114,103,97,114,110 +,101,99,101,115,97,114,105,111,97,116,101,110,99,105,195,179,110,116,101,108,195 +,169,102,111,110,111,99,111,109,105,115,105,195,179,110,99,97,110,99,105,111,110 +,101,115,99,97,112,97,99,105,100,97,100,101,110,99,111,110,116,114,97,114,97,110 +,195,161,108,105,115,105,115,102,97,118,111,114,105,116,111,115,116,195,169,114, +109,105,110,111,115,112,114,111,118,105,110,99,105,97,101,116,105,113,117,101, +116,97,115,101,108,101,109,101,110,116,111,115,102,117,110,99,105,111,110,101, +115,114,101,115,117,108,116,97,100,111,99,97,114,195,161,99,116,101,114,112,114, +111,112,105,101,100,97,100,112,114,105,110,99,105,112,105,111,110,101,99,101,115 +,105,100,97,100,109,117,110,105,99,105,112,97,108,99,114,101,97,99,105,195,179, +110,100,101,115,99,97,114,103,97,115,112,114,101,115,101,110,99,105,97,99,111, +109,101,114,99,105,97,108,111,112,105,110,105,111,110,101,115,101,106,101,114,99 +,105,99,105,111,101,100,105,116,111,114,105,97,108,115,97,108,97,109,97,110,99, +97,103,111,110,122,195,161,108,101,122,100,111,99,117,109,101,110,116,111,112, +101,108,195,173,99,117,108,97,114,101,99,105,101,110,116,101,115,103,101,110,101 +,114,97,108,101,115,116,97,114,114,97,103,111,110,97,112,114,195,161,99,116,105, +99,97,110,111,118,101,100,97,100,101,115,112,114,111,112,117,101,115,116,97,112, +97,99,105,101,110,116,101,115,116,195,169,99,110,105,99,97,115,111,98,106,101, +116,105,118,111,115,99,111,110,116,97,99,116,111,115,224,164,174,224,165,135,224 +,164,130,224,164,178,224,164,191,224,164,143,224,164,185,224,165,136,224,164,130 +,224,164,151,224,164,175,224,164,190,224,164,184,224,164,190,224,164,165,224,164 +,143,224,164,181,224,164,130,224,164,176,224,164,185,224,165,135,224,164,149,224 +,165,139,224,164,136,224,164,149,224,165,129,224,164,155,224,164,176,224,164,185 +,224,164,190,224,164,172,224,164,190,224,164,166,224,164,149,224,164,185,224,164 +,190,224,164,184,224,164,173,224,165,128,224,164,185,224,165,129,224,164,143,224 +,164,176,224,164,185,224,165,128,224,164,174,224,165,136,224,164,130,224,164,166 +,224,164,191,224,164,168,224,164,172,224,164,190,224,164,164,100,105,112,108,111 +,100,111,99,115,224,164,184,224,164,174,224,164,175,224,164,176,224,165,130,224, +164,170,224,164,168,224,164,190,224,164,174,224,164,170,224,164,164,224,164,190, +224,164,171,224,164,191,224,164,176,224,164,148,224,164,184,224,164,164,224,164, +164,224,164,176,224,164,185,224,164,178,224,165,139,224,164,151,224,164,185,224, +165,129,224,164,134,224,164,172,224,164,190,224,164,176,224,164,166,224,165,135, +224,164,182,224,164,185,224,165,129,224,164,136,224,164,150,224,165,135,224,164, +178,224,164,175,224,164,166,224,164,191,224,164,149,224,164,190,224,164,174,224, +164,181,224,165,135,224,164,172,224,164,164,224,165,128,224,164,168,224,164,172, +224,165,128,224,164,154,224,164,174,224,165,140,224,164,164,224,164,184,224,164, +190,224,164,178,224,164,178,224,165,135,224,164,150,224,164,156,224,165,137,224, +164,172,224,164,174,224,164,166,224,164,166,224,164,164,224,164,165,224,164,190, +224,164,168,224,164,185,224,165,128,224,164,182,224,164,185,224,164,176,224,164, +133,224,164,178,224,164,151,224,164,149,224,164,173,224,165,128,224,164,168,224, +164,151,224,164,176,224,164,170,224,164,190,224,164,184,224,164,176,224,164,190, +224,164,164,224,164,149,224,164,191,224,164,143,224,164,137,224,164,184,224,165, +135,224,164,151,224,164,175,224,165,128,224,164,185,224,165,130,224,164,129,224, +164,134,224,164,151,224,165,135,224,164,159,224,165,128,224,164,174,224,164,150, +224,165,139,224,164,156,224,164,149,224,164,190,224,164,176,224,164,133,224,164, +173,224,165,128,224,164,151,224,164,175,224,165,135,224,164,164,224,165,129,224, +164,174,224,164,181,224,165,139,224,164,159,224,164,166,224,165,135,224,164,130, +224,164,133,224,164,151,224,164,176,224,164,144,224,164,184,224,165,135,224,164, +174,224,165,135,224,164,178,224,164,178,224,164,151,224,164,190,224,164,185,224, +164,190,224,164,178,224,164,138,224,164,170,224,164,176,224,164,154,224,164,190, +224,164,176,224,164,144,224,164,184,224,164,190,224,164,166,224,165,135,224,164, +176,224,164,156,224,164,191,224,164,184,224,164,166,224,164,191,224,164,178,224, +164,172,224,164,130,224,164,166,224,164,172,224,164,168,224,164,190,224,164,185, +224,165,130,224,164,130,224,164,178,224,164,190,224,164,150,224,164,156,224,165, +128,224,164,164,224,164,172,224,164,159,224,164,168,224,164,174,224,164,191,224, +164,178,224,164,135,224,164,184,224,165,135,224,164,134,224,164,168,224,165,135, +224,164,168,224,164,175,224,164,190,224,164,149,224,165,129,224,164,178,224,164, +178,224,165,137,224,164,151,224,164,173,224,164,190,224,164,151,224,164,176,224, +165,135,224,164,178,224,164,156,224,164,151,224,164,185,224,164,176,224,164,190, +224,164,174,224,164,178,224,164,151,224,165,135,224,164,170,224,165,135,224,164, +156,224,164,185,224,164,190,224,164,165,224,164,135,224,164,184,224,165,128,224, +164,184,224,164,185,224,165,128,224,164,149,224,164,178,224,164,190,224,164,160, +224,165,128,224,164,149,224,164,185,224,164,190,224,164,129,224,164,166,224,165, +130,224,164,176,224,164,164,224,164,185,224,164,164,224,164,184,224,164,190,224, +164,164,224,164,175,224,164,190,224,164,166,224,164,134,224,164,175,224,164,190, +224,164,170,224,164,190,224,164,149,224,164,149,224,165,140,224,164,168,224,164, +182,224,164,190,224,164,174,224,164,166,224,165,135,224,164,150,224,164,175,224, +164,185,224,165,128,224,164,176,224,164,190,224,164,175,224,164,150,224,165,129, +224,164,166,224,164,178,224,164,151,224,165,128,99,97,116,101,103,111,114,105, +101,115,101,120,112,101,114,105,101,110,99,101,60,47,116,105,116,108,101,62,13, +10,67,111,112,121,114,105,103,104,116,32,106,97,118,97,115,99,114,105,112,116,99 +,111,110,100,105,116,105,111,110,115,101,118,101,114,121,116,104,105,110,103,60, +112,32,99,108,97,115,115,61,34,116,101,99,104,110,111,108,111,103,121,98,97,99, +107,103,114,111,117,110,100,60,97,32,99,108,97,115,115,61,34,109,97,110,97,103, +101,109,101,110,116,38,99,111,112,121,59,32,50,48,49,106,97,118,97,83,99,114,105 +,112,116,99,104,97,114,97,99,116,101,114,115,98,114,101,97,100,99,114,117,109,98 +,116,104,101,109,115,101,108,118,101,115,104,111,114,105,122,111,110,116,97,108, +103,111,118,101,114,110,109,101,110,116,67,97,108,105,102,111,114,110,105,97,97, +99,116,105,118,105,116,105,101,115,100,105,115,99,111,118,101,114,101,100,78,97, +118,105,103,97,116,105,111,110,116,114,97,110,115,105,116,105,111,110,99,111,110 +,110,101,99,116,105,111,110,110,97,118,105,103,97,116,105,111,110,97,112,112,101 +,97,114,97,110,99,101,60,47,116,105,116,108,101,62,60,109,99,104,101,99,107,98, +111,120,34,32,116,101,99,104,110,105,113,117,101,115,112,114,111,116,101,99,116, +105,111,110,97,112,112,97,114,101,110,116,108,121,97,115,32,119,101,108,108,32, +97,115,117,110,116,39,44,32,39,85,65,45,114,101,115,111,108,117,116,105,111,110, +111,112,101,114,97,116,105,111,110,115,116,101,108,101,118,105,115,105,111,110, +116,114,97,110,115,108,97,116,101,100,87,97,115,104,105,110,103,116,111,110,110, +97,118,105,103,97,116,111,114,46,32,61,32,119,105,110,100,111,119,46,105,109,112 +,114,101,115,115,105,111,110,38,108,116,59,98,114,38,103,116,59,108,105,116,101, +114,97,116,117,114,101,112,111,112,117,108,97,116,105,111,110,98,103,99,111,108, +111,114,61,34,35,101,115,112,101,99,105,97,108,108,121,32,99,111,110,116,101,110 +,116,61,34,112,114,111,100,117,99,116,105,111,110,110,101,119,115,108,101,116, +116,101,114,112,114,111,112,101,114,116,105,101,115,100,101,102,105,110,105,116, +105,111,110,108,101,97,100,101,114,115,104,105,112,84,101,99,104,110,111,108,111 +,103,121,80,97,114,108,105,97,109,101,110,116,99,111,109,112,97,114,105,115,111, +110,117,108,32,99,108,97,115,115,61,34,46,105,110,100,101,120,79,102,40,34,99, +111,110,99,108,117,115,105,111,110,100,105,115,99,117,115,115,105,111,110,99,111 +,109,112,111,110,101,110,116,115,98,105,111,108,111,103,105,99,97,108,82,101,118 +,111,108,117,116,105,111,110,95,99,111,110,116,97,105,110,101,114,117,110,100, +101,114,115,116,111,111,100,110,111,115,99,114,105,112,116,62,60,112,101,114,109 +,105,115,115,105,111,110,101,97,99,104,32,111,116,104,101,114,97,116,109,111,115 +,112,104,101,114,101,32,111,110,102,111,99,117,115,61,34,60,102,111,114,109,32, +105,100,61,34,112,114,111,99,101,115,115,105,110,103,116,104,105,115,46,118,97, +108,117,101,103,101,110,101,114,97,116,105,111,110,67,111,110,102,101,114,101, +110,99,101,115,117,98,115,101,113,117,101,110,116,119,101,108,108,45,107,110,111 +,119,110,118,97,114,105,97,116,105,111,110,115,114,101,112,117,116,97,116,105, +111,110,112,104,101,110,111,109,101,110,111,110,100,105,115,99,105,112,108,105, +110,101,108,111,103,111,46,112,110,103,34,32,40,100,111,99,117,109,101,110,116, +44,98,111,117,110,100,97,114,105,101,115,101,120,112,114,101,115,115,105,111,110 +,115,101,116,116,108,101,109,101,110,116,66,97,99,107,103,114,111,117,110,100, +111,117,116,32,111,102,32,116,104,101,101,110,116,101,114,112,114,105,115,101,40 +,34,104,116,116,112,115,58,34,32,117,110,101,115,99,97,112,101,40,34,112,97,115, +115,119,111,114,100,34,32,100,101,109,111,99,114,97,116,105,99,60,97,32,104,114, +101,102,61,34,47,119,114,97,112,112,101,114,34,62,10,109,101,109,98,101,114,115, +104,105,112,108,105,110,103,117,105,115,116,105,99,112,120,59,112,97,100,100,105 +,110,103,112,104,105,108,111,115,111,112,104,121,97,115,115,105,115,116,97,110, +99,101,117,110,105,118,101,114,115,105,116,121,102,97,99,105,108,105,116,105,101 +,115,114,101,99,111,103,110,105,122,101,100,112,114,101,102,101,114,101,110,99, +101,105,102,32,40,116,121,112,101,111,102,109,97,105,110,116,97,105,110,101,100, +118,111,99,97,98,117,108,97,114,121,104,121,112,111,116,104,101,115,105,115,46, +115,117,98,109,105,116,40,41,59,38,97,109,112,59,110,98,115,112,59,97,110,110, +111,116,97,116,105,111,110,98,101,104,105,110,100,32,116,104,101,70,111,117,110, +100,97,116,105,111,110,112,117,98,108,105,115,104,101,114,34,97,115,115,117,109, +112,116,105,111,110,105,110,116,114,111,100,117,99,101,100,99,111,114,114,117, +112,116,105,111,110,115,99,105,101,110,116,105,115,116,115,101,120,112,108,105, +99,105,116,108,121,105,110,115,116,101,97,100,32,111,102,100,105,109,101,110,115 +,105,111,110,115,32,111,110,67,108,105,99,107,61,34,99,111,110,115,105,100,101, +114,101,100,100,101,112,97,114,116,109,101,110,116,111,99,99,117,112,97,116,105, +111,110,115,111,111,110,32,97,102,116,101,114,105,110,118,101,115,116,109,101, +110,116,112,114,111,110,111,117,110,99,101,100,105,100,101,110,116,105,102,105, +101,100,101,120,112,101,114,105,109,101,110,116,77,97,110,97,103,101,109,101,110 +,116,103,101,111,103,114,97,112,104,105,99,34,32,104,101,105,103,104,116,61,34, +108,105,110,107,32,114,101,108,61,34,46,114,101,112,108,97,99,101,40,47,100,101, +112,114,101,115,115,105,111,110,99,111,110,102,101,114,101,110,99,101,112,117, +110,105,115,104,109,101,110,116,101,108,105,109,105,110,97,116,101,100,114,101, +115,105,115,116,97,110,99,101,97,100,97,112,116,97,116,105,111,110,111,112,112, +111,115,105,116,105,111,110,119,101,108,108,32,107,110,111,119,110,115,117,112, +112,108,101,109,101,110,116,100,101,116,101,114,109,105,110,101,100,104,49,32,99 +,108,97,115,115,61,34,48,112,120,59,109,97,114,103,105,110,109,101,99,104,97,110 +,105,99,97,108,115,116,97,116,105,115,116,105,99,115,99,101,108,101,98,114,97, +116,101,100,71,111,118,101,114,110,109,101,110,116,10,10,68,117,114,105,110,103, +32,116,100,101,118,101,108,111,112,101,114,115,97,114,116,105,102,105,99,105,97, +108,101,113,117,105,118,97,108,101,110,116,111,114,105,103,105,110,97,116,101, +100,67,111,109,109,105,115,115,105,111,110,97,116,116,97,99,104,109,101,110,116, +60,115,112,97,110,32,105,100,61,34,116,104,101,114,101,32,119,101,114,101,78,101 +,100,101,114,108,97,110,100,115,98,101,121,111,110,100,32,116,104,101,114,101, +103,105,115,116,101,114,101,100,106,111,117,114,110,97,108,105,115,116,102,114, +101,113,117,101,110,116,108,121,97,108,108,32,111,102,32,116,104,101,108,97,110, +103,61,34,101,110,34,32,60,47,115,116,121,108,101,62,13,10,97,98,115,111,108,117 +,116,101,59,32,115,117,112,112,111,114,116,105,110,103,101,120,116,114,101,109, +101,108,121,32,109,97,105,110,115,116,114,101,97,109,60,47,115,116,114,111,110, +103,62,32,112,111,112,117,108,97,114,105,116,121,101,109,112,108,111,121,109,101 +,110,116,60,47,116,97,98,108,101,62,13,10,32,99,111,108,115,112,97,110,61,34,60, +47,102,111,114,109,62,10,32,32,99,111,110,118,101,114,115,105,111,110,97,98,111, +117,116,32,116,104,101,32,60,47,112,62,60,47,100,105,118,62,105,110,116,101,103, +114,97,116,101,100,34,32,108,97,110,103,61,34,101,110,80,111,114,116,117,103,117 +,101,115,101,115,117,98,115,116,105,116,117,116,101,105,110,100,105,118,105,100, +117,97,108,105,109,112,111,115,115,105,98,108,101,109,117,108,116,105,109,101, +100,105,97,97,108,109,111,115,116,32,97,108,108,112,120,32,115,111,108,105,100, +32,35,97,112,97,114,116,32,102,114,111,109,115,117,98,106,101,99,116,32,116,111, +105,110,32,69,110,103,108,105,115,104,99,114,105,116,105,99,105,122,101,100,101, +120,99,101,112,116,32,102,111,114,103,117,105,100,101,108,105,110,101,115,111, +114,105,103,105,110,97,108,108,121,114,101,109,97,114,107,97,98,108,101,116,104, +101,32,115,101,99,111,110,100,104,50,32,99,108,97,115,115,61,34,60,97,32,116,105 +,116,108,101,61,34,40,105,110,99,108,117,100,105,110,103,112,97,114,97,109,101, +116,101,114,115,112,114,111,104,105,98,105,116,101,100,61,32,34,104,116,116,112, +58,47,47,100,105,99,116,105,111,110,97,114,121,112,101,114,99,101,112,116,105, +111,110,114,101,118,111,108,117,116,105,111,110,102,111,117,110,100,97,116,105, +111,110,112,120,59,104,101,105,103,104,116,58,115,117,99,99,101,115,115,102,117, +108,115,117,112,112,111,114,116,101,114,115,109,105,108,108,101,110,110,105,117, +109,104,105,115,32,102,97,116,104,101,114,116,104,101,32,38,113,117,111,116,59, +110,111,45,114,101,112,101,97,116,59,99,111,109,109,101,114,99,105,97,108,105, +110,100,117,115,116,114,105,97,108,101,110,99,111,117,114,97,103,101,100,97,109, +111,117,110,116,32,111,102,32,117,110,111,102,102,105,99,105,97,108,101,102,102, +105,99,105,101,110,99,121,82,101,102,101,114,101,110,99,101,115,99,111,111,114, +100,105,110,97,116,101,100,105,115,99,108,97,105,109,101,114,101,120,112,101,100 +,105,116,105,111,110,100,101,118,101,108,111,112,105,110,103,99,97,108,99,117, +108,97,116,101,100,115,105,109,112,108,105,102,105,101,100,108,101,103,105,116, +105,109,97,116,101,115,117,98,115,116,114,105,110,103,40,48,34,32,99,108,97,115, +115,61,34,99,111,109,112,108,101,116,101,108,121,105,108,108,117,115,116,114,97, +116,101,102,105,118,101,32,121,101,97,114,115,105,110,115,116,114,117,109,101, +110,116,80,117,98,108,105,115,104,105,110,103,49,34,32,99,108,97,115,115,61,34, +112,115,121,99,104,111,108,111,103,121,99,111,110,102,105,100,101,110,99,101,110 +,117,109,98,101,114,32,111,102,32,97,98,115,101,110,99,101,32,111,102,102,111,99 +,117,115,101,100,32,111,110,106,111,105,110,101,100,32,116,104,101,115,116,114, +117,99,116,117,114,101,115,112,114,101,118,105,111,117,115,108,121,62,60,47,105, +102,114,97,109,101,62,111,110,99,101,32,97,103,97,105,110,98,117,116,32,114,97, +116,104,101,114,105,109,109,105,103,114,97,110,116,115,111,102,32,99,111,117,114 +,115,101,44,97,32,103,114,111,117,112,32,111,102,76,105,116,101,114,97,116,117, +114,101,85,110,108,105,107,101,32,116,104,101,60,47,97,62,38,110,98,115,112,59, +10,102,117,110,99,116,105,111,110,32,105,116,32,119,97,115,32,116,104,101,67,111 +,110,118,101,110,116,105,111,110,97,117,116,111,109,111,98,105,108,101,80,114, +111,116,101,115,116,97,110,116,97,103,103,114,101,115,115,105,118,101,97,102,116 +,101,114,32,116,104,101,32,83,105,109,105,108,97,114,108,121,44,34,32,47,62,60, +47,100,105,118,62,99,111,108,108,101,99,116,105,111,110,13,10,102,117,110,99,116 +,105,111,110,118,105,115,105,98,105,108,105,116,121,116,104,101,32,117,115,101, +32,111,102,118,111,108,117,110,116,101,101,114,115,97,116,116,114,97,99,116,105, +111,110,117,110,100,101,114,32,116,104,101,32,116,104,114,101,97,116,101,110,101 +,100,42,60,33,91,67,68,65,84,65,91,105,109,112,111,114,116,97,110,99,101,105,110 +,32,103,101,110,101,114,97,108,116,104,101,32,108,97,116,116,101,114,60,47,102, +111,114,109,62,10,60,47,46,105,110,100,101,120,79,102,40,39,105,32,61,32,48,59, +32,105,32,60,100,105,102,102,101,114,101,110,99,101,100,101,118,111,116,101,100, +32,116,111,116,114,97,100,105,116,105,111,110,115,115,101,97,114,99,104,32,102, +111,114,117,108,116,105,109,97,116,101,108,121,116,111,117,114,110,97,109,101, +110,116,97,116,116,114,105,98,117,116,101,115,115,111,45,99,97,108,108,101,100, +32,125,10,60,47,115,116,121,108,101,62,101,118,97,108,117,97,116,105,111,110,101 +,109,112,104,97,115,105,122,101,100,97,99,99,101,115,115,105,98,108,101,60,47, +115,101,99,116,105,111,110,62,115,117,99,99,101,115,115,105,111,110,97,108,111, +110,103,32,119,105,116,104,77,101,97,110,119,104,105,108,101,44,105,110,100,117, +115,116,114,105,101,115,60,47,97,62,60,98,114,32,47,62,104,97,115,32,98,101,99, +111,109,101,97,115,112,101,99,116,115,32,111,102,84,101,108,101,118,105,115,105, +111,110,115,117,102,102,105,99,105,101,110,116,98,97,115,107,101,116,98,97,108, +108,98,111,116,104,32,115,105,100,101,115,99,111,110,116,105,110,117,105,110,103 +,97,110,32,97,114,116,105,99,108,101,60,105,109,103,32,97,108,116,61,34,97,100, +118,101,110,116,117,114,101,115,104,105,115,32,109,111,116,104,101,114,109,97, +110,99,104,101,115,116,101,114,112,114,105,110,99,105,112,108,101,115,112,97,114 +,116,105,99,117,108,97,114,99,111,109,109,101,110,116,97,114,121,101,102,102,101 +,99,116,115,32,111,102,100,101,99,105,100,101,100,32,116,111,34,62,60,115,116, +114,111,110,103,62,112,117,98,108,105,115,104,101,114,115,74,111,117,114,110,97, +108,32,111,102,100,105,102,102,105,99,117,108,116,121,102,97,99,105,108,105,116, +97,116,101,97,99,99,101,112,116,97,98,108,101,115,116,121,108,101,46,99,115,115, +34,9,102,117,110,99,116,105,111,110,32,105,110,110,111,118,97,116,105,111,110,62 +,67,111,112,121,114,105,103,104,116,115,105,116,117,97,116,105,111,110,115,119, +111,117,108,100,32,104,97,118,101,98,117,115,105,110,101,115,115,101,115,68,105, +99,116,105,111,110,97,114,121,115,116,97,116,101,109,101,110,116,115,111,102,116 +,101,110,32,117,115,101,100,112,101,114,115,105,115,116,101,110,116,105,110,32, +74,97,110,117,97,114,121,99,111,109,112,114,105,115,105,110,103,60,47,116,105, +116,108,101,62,10,9,100,105,112,108,111,109,97,116,105,99,99,111,110,116,97,105, +110,105,110,103,112,101,114,102,111,114,109,105,110,103,101,120,116,101,110,115, +105,111,110,115,109,97,121,32,110,111,116,32,98,101,99,111,110,99,101,112,116,32 +,111,102,32,111,110,99,108,105,99,107,61,34,73,116,32,105,115,32,97,108,115,111, +102,105,110,97,110,99,105,97,108,32,109,97,107,105,110,103,32,116,104,101,76,117 +,120,101,109,98,111,117,114,103,97,100,100,105,116,105,111,110,97,108,97,114,101 +,32,99,97,108,108,101,100,101,110,103,97,103,101,100,32,105,110,34,115,99,114, +105,112,116,34,41,59,98,117,116,32,105,116,32,119,97,115,101,108,101,99,116,114, +111,110,105,99,111,110,115,117,98,109,105,116,61,34,10,60,33,45,45,32,69,110,100 +,32,101,108,101,99,116,114,105,99,97,108,111,102,102,105,99,105,97,108,108,121, +115,117,103,103,101,115,116,105,111,110,116,111,112,32,111,102,32,116,104,101, +117,110,108,105,107,101,32,116,104,101,65,117,115,116,114,97,108,105,97,110,79, +114,105,103,105,110,97,108,108,121,114,101,102,101,114,101,110,99,101,115,10,60, +47,104,101,97,100,62,13,10,114,101,99,111,103,110,105,115,101,100,105,110,105, +116,105,97,108,105,122,101,108,105,109,105,116,101,100,32,116,111,65,108,101,120 +,97,110,100,114,105,97,114,101,116,105,114,101,109,101,110,116,65,100,118,101, +110,116,117,114,101,115,102,111,117,114,32,121,101,97,114,115,10,10,38,108,116, +59,33,45,45,32,105,110,99,114,101,97,115,105,110,103,100,101,99,111,114,97,116, +105,111,110,104,51,32,99,108,97,115,115,61,34,111,114,105,103,105,110,115,32,111 +,102,111,98,108,105,103,97,116,105,111,110,114,101,103,117,108,97,116,105,111, +110,99,108,97,115,115,105,102,105,101,100,40,102,117,110,99,116,105,111,110,40, +97,100,118,97,110,116,97,103,101,115,98,101,105,110,103,32,116,104,101,32,104, +105,115,116,111,114,105,97,110,115,60,98,97,115,101,32,104,114,101,102,114,101, +112,101,97,116,101,100,108,121,119,105,108,108,105,110,103,32,116,111,99,111,109 +,112,97,114,97,98,108,101,100,101,115,105,103,110,97,116,101,100,110,111,109,105 +,110,97,116,105,111,110,102,117,110,99,116,105,111,110,97,108,105,110,115,105, +100,101,32,116,104,101,114,101,118,101,108,97,116,105,111,110,101,110,100,32,111 +,102,32,116,104,101,115,32,102,111,114,32,116,104,101,32,97,117,116,104,111,114, +105,122,101,100,114,101,102,117,115,101,100,32,116,111,116,97,107,101,32,112,108 +,97,99,101,97,117,116,111,110,111,109,111,117,115,99,111,109,112,114,111,109,105 +,115,101,112,111,108,105,116,105,99,97,108,32,114,101,115,116,97,117,114,97,110, +116,116,119,111,32,111,102,32,116,104,101,70,101,98,114,117,97,114,121,32,50,113 +,117,97,108,105,116,121,32,111,102,115,119,102,111,98,106,101,99,116,46,117,110, +100,101,114,115,116,97,110,100,110,101,97,114,108,121,32,97,108,108,119,114,105, +116,116,101,110,32,98,121,105,110,116,101,114,118,105,101,119,115,34,32,119,105, +100,116,104,61,34,49,119,105,116,104,100,114,97,119,97,108,102,108,111,97,116,58 +,108,101,102,116,105,115,32,117,115,117,97,108,108,121,99,97,110,100,105,100,97, +116,101,115,110,101,119,115,112,97,112,101,114,115,109,121,115,116,101,114,105, +111,117,115,68,101,112,97,114,116,109,101,110,116,98,101,115,116,32,107,110,111, +119,110,112,97,114,108,105,97,109,101,110,116,115,117,112,112,114,101,115,115, +101,100,99,111,110,118,101,110,105,101,110,116,114,101,109,101,109,98,101,114, +101,100,100,105,102,102,101,114,101,110,116,32,115,121,115,116,101,109,97,116, +105,99,104,97,115,32,108,101,100,32,116,111,112,114,111,112,97,103,97,110,100,97 +,99,111,110,116,114,111,108,108,101,100,105,110,102,108,117,101,110,99,101,115, +99,101,114,101,109,111,110,105,97,108,112,114,111,99,108,97,105,109,101,100,80, +114,111,116,101,99,116,105,111,110,108,105,32,99,108,97,115,115,61,34,83,99,105, +101,110,116,105,102,105,99,99,108,97,115,115,61,34,110,111,45,116,114,97,100,101 +,109,97,114,107,115,109,111,114,101,32,116,104,97,110,32,119,105,100,101,115,112 +,114,101,97,100,76,105,98,101,114,97,116,105,111,110,116,111,111,107,32,112,108, +97,99,101,100,97,121,32,111,102,32,116,104,101,97,115,32,108,111,110,103,32,97, +115,105,109,112,114,105,115,111,110,101,100,65,100,100,105,116,105,111,110,97, +108,10,60,104,101,97,100,62,10,60,109,76,97,98,111,114,97,116,111,114,121,78,111 +,118,101,109,98,101,114,32,50,101,120,99,101,112,116,105,111,110,115,73,110,100, +117,115,116,114,105,97,108,118,97,114,105,101,116,121,32,111,102,102,108,111,97, +116,58,32,108,101,102,68,117,114,105,110,103,32,116,104,101,97,115,115,101,115, +115,109,101,110,116,104,97,118,101,32,98,101,101,110,32,100,101,97,108,115,32, +119,105,116,104,83,116,97,116,105,115,116,105,99,115,111,99,99,117,114,114,101, +110,99,101,47,117,108,62,60,47,100,105,118,62,99,108,101,97,114,102,105,120,34, +62,116,104,101,32,112,117,98,108,105,99,109,97,110,121,32,121,101,97,114,115,119 +,104,105,99,104,32,119,101,114,101,111,118,101,114,32,116,105,109,101,44,115,121 +,110,111,110,121,109,111,117,115,99,111,110,116,101,110,116,34,62,10,112,114,101 +,115,117,109,97,98,108,121,104,105,115,32,102,97,109,105,108,121,117,115,101,114 +,65,103,101,110,116,46,117,110,101,120,112,101,99,116,101,100,105,110,99,108,117 +,100,105,110,103,32,99,104,97,108,108,101,110,103,101,100,97,32,109,105,110,111, +114,105,116,121,117,110,100,101,102,105,110,101,100,34,98,101,108,111,110,103, +115,32,116,111,116,97,107,101,110,32,102,114,111,109,105,110,32,79,99,116,111,98 +,101,114,112,111,115,105,116,105,111,110,58,32,115,97,105,100,32,116,111,32,98, +101,114,101,108,105,103,105,111,117,115,32,70,101,100,101,114,97,116,105,111,110 +,32,114,111,119,115,112,97,110,61,34,111,110,108,121,32,97,32,102,101,119,109, +101,97,110,116,32,116,104,97,116,108,101,100,32,116,111,32,116,104,101,45,45,62, +13,10,60,100,105,118,32,60,102,105,101,108,100,115,101,116,62,65,114,99,104,98, +105,115,104,111,112,32,99,108,97,115,115,61,34,110,111,98,101,105,110,103,32,117 +,115,101,100,97,112,112,114,111,97,99,104,101,115,112,114,105,118,105,108,101, +103,101,115,110,111,115,99,114,105,112,116,62,10,114,101,115,117,108,116,115,32, +105,110,109,97,121,32,98,101,32,116,104,101,69,97,115,116,101,114,32,101,103,103 +,109,101,99,104,97,110,105,115,109,115,114,101,97,115,111,110,97,98,108,101,80, +111,112,117,108,97,116,105,111,110,67,111,108,108,101,99,116,105,111,110,115,101 +,108,101,99,116,101,100,34,62,110,111,115,99,114,105,112,116,62,13,47,105,110, +100,101,120,46,112,104,112,97,114,114,105,118,97,108,32,111,102,45,106,115,115, +100,107,39,41,41,59,109,97,110,97,103,101,100,32,116,111,105,110,99,111,109,112, +108,101,116,101,99,97,115,117,97,108,116,105,101,115,99,111,109,112,108,101,116, +105,111,110,67,104,114,105,115,116,105,97,110,115,83,101,112,116,101,109,98,101, +114,32,97,114,105,116,104,109,101,116,105,99,112,114,111,99,101,100,117,114,101, +115,109,105,103,104,116,32,104,97,118,101,80,114,111,100,117,99,116,105,111,110, +105,116,32,97,112,112,101,97,114,115,80,104,105,108,111,115,111,112,104,121,102, +114,105,101,110,100,115,104,105,112,108,101,97,100,105,110,103,32,116,111,103, +105,118,105,110,103,32,116,104,101,116,111,119,97,114,100,32,116,104,101,103,117 +,97,114,97,110,116,101,101,100,100,111,99,117,109,101,110,116,101,100,99,111,108 +,111,114,58,35,48,48,48,118,105,100,101,111,32,103,97,109,101,99,111,109,109,105 +,115,115,105,111,110,114,101,102,108,101,99,116,105,110,103,99,104,97,110,103, +101,32,116,104,101,97,115,115,111,99,105,97,116,101,100,115,97,110,115,45,115, +101,114,105,102,111,110,107,101,121,112,114,101,115,115,59,32,112,97,100,100,105 +,110,103,58,72,101,32,119,97,115,32,116,104,101,117,110,100,101,114,108,121,105, +110,103,116,121,112,105,99,97,108,108,121,32,44,32,97,110,100,32,116,104,101,32, +115,114,99,69,108,101,109,101,110,116,115,117,99,99,101,115,115,105,118,101,115, +105,110,99,101,32,116,104,101,32,115,104,111,117,108,100,32,98,101,32,110,101, +116,119,111,114,107,105,110,103,97,99,99,111,117,110,116,105,110,103,117,115,101 +,32,111,102,32,116,104,101,108,111,119,101,114,32,116,104,97,110,115,104,111,119 +,115,32,116,104,97,116,60,47,115,112,97,110,62,10,9,9,99,111,109,112,108,97,105, +110,116,115,99,111,110,116,105,110,117,111,117,115,113,117,97,110,116,105,116, +105,101,115,97,115,116,114,111,110,111,109,101,114,104,101,32,100,105,100,32,110 +,111,116,100,117,101,32,116,111,32,105,116,115,97,112,112,108,105,101,100,32,116 +,111,97,110,32,97,118,101,114,97,103,101,101,102,102,111,114,116,115,32,116,111, +116,104,101,32,102,117,116,117,114,101,97,116,116,101,109,112,116,32,116,111,84, +104,101,114,101,102,111,114,101,44,99,97,112,97,98,105,108,105,116,121,82,101, +112,117,98,108,105,99,97,110,119,97,115,32,102,111,114,109,101,100,69,108,101,99 +,116,114,111,110,105,99,107,105,108,111,109,101,116,101,114,115,99,104,97,108, +108,101,110,103,101,115,112,117,98,108,105,115,104,105,110,103,116,104,101,32, +102,111,114,109,101,114,105,110,100,105,103,101,110,111,117,115,100,105,114,101, +99,116,105,111,110,115,115,117,98,115,105,100,105,97,114,121,99,111,110,115,112, +105,114,97,99,121,100,101,116,97,105,108,115,32,111,102,97,110,100,32,105,110,32 +,116,104,101,97,102,102,111,114,100,97,98,108,101,115,117,98,115,116,97,110,99, +101,115,114,101,97,115,111,110,32,102,111,114,99,111,110,118,101,110,116,105,111 +,110,105,116,101,109,116,121,112,101,61,34,97,98,115,111,108,117,116,101,108,121 +,115,117,112,112,111,115,101,100,108,121,114,101,109,97,105,110,101,100,32,97,97 +,116,116,114,97,99,116,105,118,101,116,114,97,118,101,108,108,105,110,103,115, +101,112,97,114,97,116,101,108,121,102,111,99,117,115,101,115,32,111,110,101,108, +101,109,101,110,116,97,114,121,97,112,112,108,105,99,97,98,108,101,102,111,117, +110,100,32,116,104,97,116,115,116,121,108,101,115,104,101,101,116,109,97,110,117 +,115,99,114,105,112,116,115,116,97,110,100,115,32,102,111,114,32,110,111,45,114, +101,112,101,97,116,40,115,111,109,101,116,105,109,101,115,67,111,109,109,101,114 +,99,105,97,108,105,110,32,65,109,101,114,105,99,97,117,110,100,101,114,116,97, +107,101,110,113,117,97,114,116,101,114,32,111,102,97,110,32,101,120,97,109,112, +108,101,112,101,114,115,111,110,97,108,108,121,105,110,100,101,120,46,112,104, +112,63,60,47,98,117,116,116,111,110,62,10,112,101,114,99,101,110,116,97,103,101, +98,101,115,116,45,107,110,111,119,110,99,114,101,97,116,105,110,103,32,97,34,32, +100,105,114,61,34,108,116,114,76,105,101,117,116,101,110,97,110,116,10,60,100, +105,118,32,105,100,61,34,116,104,101,121,32,119,111,117,108,100,97,98,105,108, +105,116,121,32,111,102,109,97,100,101,32,117,112,32,111,102,110,111,116,101,100, +32,116,104,97,116,99,108,101,97,114,32,116,104,97,116,97,114,103,117,101,32,116, +104,97,116,116,111,32,97,110,111,116,104,101,114,99,104,105,108,100,114,101,110, +39,115,112,117,114,112,111,115,101,32,111,102,102,111,114,109,117,108,97,116,101 +,100,98,97,115,101,100,32,117,112,111,110,116,104,101,32,114,101,103,105,111,110 +,115,117,98,106,101,99,116,32,111,102,112,97,115,115,101,110,103,101,114,115,112 +,111,115,115,101,115,115,105,111,110,46,10,10,73,110,32,116,104,101,32,66,101, +102,111,114,101,32,116,104,101,97,102,116,101,114,119,97,114,100,115,99,117,114, +114,101,110,116,108,121,32,97,99,114,111,115,115,32,116,104,101,115,99,105,101, +110,116,105,102,105,99,99,111,109,109,117,110,105,116,121,46,99,97,112,105,116, +97,108,105,115,109,105,110,32,71,101,114,109,97,110,121,114,105,103,104,116,45, +119,105,110,103,116,104,101,32,115,121,115,116,101,109,83,111,99,105,101,116,121 +,32,111,102,112,111,108,105,116,105,99,105,97,110,100,105,114,101,99,116,105,111 +,110,58,119,101,110,116,32,111,110,32,116,111,114,101,109,111,118,97,108,32,111, +102,32,78,101,119,32,89,111,114,107,32,97,112,97,114,116,109,101,110,116,115,105 +,110,100,105,99,97,116,105,111,110,100,117,114,105,110,103,32,116,104,101,117, +110,108,101,115,115,32,116,104,101,104,105,115,116,111,114,105,99,97,108,104,97, +100,32,98,101,101,110,32,97,100,101,102,105,110,105,116,105,118,101,105,110,103, +114,101,100,105,101,110,116,97,116,116,101,110,100,97,110,99,101,67,101,110,116, +101,114,32,102,111,114,112,114,111,109,105,110,101,110,99,101,114,101,97,100,121 +,83,116,97,116,101,115,116,114,97,116,101,103,105,101,115,98,117,116,32,105,110, +32,116,104,101,97,115,32,112,97,114,116,32,111,102,99,111,110,115,116,105,116, +117,116,101,99,108,97,105,109,32,116,104,97,116,108,97,98,111,114,97,116,111,114 +,121,99,111,109,112,97,116,105,98,108,101,102,97,105,108,117,114,101,32,111,102, +44,32,115,117,99,104,32,97,115,32,98,101,103,97,110,32,119,105,116,104,117,115, +105,110,103,32,116,104,101,32,116,111,32,112,114,111,118,105,100,101,102,101,97, +116,117,114,101,32,111,102,102,114,111,109,32,119,104,105,99,104,47,34,32,99,108 +,97,115,115,61,34,103,101,111,108,111,103,105,99,97,108,115,101,118,101,114,97, +108,32,111,102,100,101,108,105,98,101,114,97,116,101,105,109,112,111,114,116,97, +110,116,32,104,111,108,100,115,32,116,104,97,116,105,110,103,38,113,117,111,116, +59,32,118,97,108,105,103,110,61,116,111,112,116,104,101,32,71,101,114,109,97,110 +,111,117,116,115,105,100,101,32,111,102,110,101,103,111,116,105,97,116,101,100, +104,105,115,32,99,97,114,101,101,114,115,101,112,97,114,97,116,105,111,110,105, +100,61,34,115,101,97,114,99,104,119,97,115,32,99,97,108,108,101,100,116,104,101, +32,102,111,117,114,116,104,114,101,99,114,101,97,116,105,111,110,111,116,104,101 +,114,32,116,104,97,110,112,114,101,118,101,110,116,105,111,110,119,104,105,108, +101,32,116,104,101,32,101,100,117,99,97,116,105,111,110,44,99,111,110,110,101,99 +,116,105,110,103,97,99,99,117,114,97,116,101,108,121,119,101,114,101,32,98,117, +105,108,116,119,97,115,32,107,105,108,108,101,100,97,103,114,101,101,109,101,110 +,116,115,109,117,99,104,32,109,111,114,101,32,68,117,101,32,116,111,32,116,104, +101,119,105,100,116,104,58,32,49,48,48,115,111,109,101,32,111,116,104,101,114,75 +,105,110,103,100,111,109,32,111,102,116,104,101,32,101,110,116,105,114,101,102, +97,109,111,117,115,32,102,111,114,116,111,32,99,111,110,110,101,99,116,111,98, +106,101,99,116,105,118,101,115,116,104,101,32,70,114,101,110,99,104,112,101,111, +112,108,101,32,97,110,100,102,101,97,116,117,114,101,100,34,62,105,115,32,115,97 +,105,100,32,116,111,115,116,114,117,99,116,117,114,97,108,114,101,102,101,114, +101,110,100,117,109,109,111,115,116,32,111,102,116,101,110,97,32,115,101,112,97, +114,97,116,101,45,62,10,60,100,105,118,32,105,100,32,79,102,102,105,99,105,97, +108,32,119,111,114,108,100,119,105,100,101,46,97,114,105,97,45,108,97,98,101,108 +,116,104,101,32,112,108,97,110,101,116,97,110,100,32,105,116,32,119,97,115,100, +34,32,118,97,108,117,101,61,34,108,111,111,107,105,110,103,32,97,116,98,101,110, +101,102,105,99,105,97,108,97,114,101,32,105,110,32,116,104,101,109,111,110,105, +116,111,114,105,110,103,114,101,112,111,114,116,101,100,108,121,116,104,101,32, +109,111,100,101,114,110,119,111,114,107,105,110,103,32,111,110,97,108,108,111, +119,101,100,32,116,111,119,104,101,114,101,32,116,104,101,32,105,110,110,111,118 +,97,116,105,118,101,60,47,97,62,60,47,100,105,118,62,115,111,117,110,100,116,114 +,97,99,107,115,101,97,114,99,104,70,111,114,109,116,101,110,100,32,116,111,32,98 +,101,105,110,112,117,116,32,105,100,61,34,111,112,101,110,105,110,103,32,111,102 +,114,101,115,116,114,105,99,116,101,100,97,100,111,112,116,101,100,32,98,121,97, +100,100,114,101,115,115,105,110,103,116,104,101,111,108,111,103,105,97,110,109, +101,116,104,111,100,115,32,111,102,118,97,114,105,97,110,116,32,111,102,67,104, +114,105,115,116,105,97,110,32,118,101,114,121,32,108,97,114,103,101,97,117,116, +111,109,111,116,105,118,101,98,121,32,102,97,114,32,116,104,101,114,97,110,103, +101,32,102,114,111,109,112,117,114,115,117,105,116,32,111,102,102,111,108,108, +111,119,32,116,104,101,98,114,111,117,103,104,116,32,116,111,105,110,32,69,110, +103,108,97,110,100,97,103,114,101,101,32,116,104,97,116,97,99,99,117,115,101,100 +,32,111,102,99,111,109,101,115,32,102,114,111,109,112,114,101,118,101,110,116, +105,110,103,100,105,118,32,115,116,121,108,101,61,104,105,115,32,111,114,32,104, +101,114,116,114,101,109,101,110,100,111,117,115,102,114,101,101,100,111,109,32, +111,102,99,111,110,99,101,114,110,105,110,103,48,32,49,101,109,32,49,101,109,59, +66,97,115,107,101,116,98,97,108,108,47,115,116,121,108,101,46,99,115,115,97,110, +32,101,97,114,108,105,101,114,101,118,101,110,32,97,102,116,101,114,47,34,32,116 +,105,116,108,101,61,34,46,99,111,109,47,105,110,100,101,120,116,97,107,105,110, +103,32,116,104,101,112,105,116,116,115,98,117,114,103,104,99,111,110,116,101,110 +,116,34,62,13,60,115,99,114,105,112,116,62,40,102,116,117,114,110,101,100,32,111 +,117,116,104,97,118,105,110,103,32,116,104,101,60,47,115,112,97,110,62,13,10,32, +111,99,99,97,115,105,111,110,97,108,98,101,99,97,117,115,101,32,105,116,115,116, +97,114,116,101,100,32,116,111,112,104,121,115,105,99,97,108,108,121,62,60,47,100 +,105,118,62,10,32,32,99,114,101,97,116,101,100,32,98,121,67,117,114,114,101,110, +116,108,121,44,32,98,103,99,111,108,111,114,61,34,116,97,98,105,110,100,101,120, +61,34,100,105,115,97,115,116,114,111,117,115,65,110,97,108,121,116,105,99,115,32 +,97,108,115,111,32,104,97,115,32,97,62,60,100,105,118,32,105,100,61,34,60,47,115 +,116,121,108,101,62,10,60,99,97,108,108,101,100,32,102,111,114,115,105,110,103, +101,114,32,97,110,100,46,115,114,99,32,61,32,34,47,47,118,105,111,108,97,116,105 +,111,110,115,116,104,105,115,32,112,111,105,110,116,99,111,110,115,116,97,110, +116,108,121,105,115,32,108,111,99,97,116,101,100,114,101,99,111,114,100,105,110, +103,115,100,32,102,114,111,109,32,116,104,101,110,101,100,101,114,108,97,110,100 +,115,112,111,114,116,117,103,117,195,170,115,215,162,215,145,215,168,215,153,215 +,170,217,129,216,167,216,177,216,179,219,140,100,101,115,97,114,114,111,108,108, +111,99,111,109,101,110,116,97,114,105,111,101,100,117,99,97,99,105,195,179,110, +115,101,112,116,105,101,109,98,114,101,114,101,103,105,115,116,114,97,100,111, +100,105,114,101,99,99,105,195,179,110,117,98,105,99,97,99,105,195,179,110,112, +117,98,108,105,99,105,100,97,100,114,101,115,112,117,101,115,116,97,115,114,101, +115,117,108,116,97,100,111,115,105,109,112,111,114,116,97,110,116,101,114,101, +115,101,114,118,97,100,111,115,97,114,116,195,173,99,117,108,111,115,100,105,102 +,101,114,101,110,116,101,115,115,105,103,117,105,101,110,116,101,115,114,101,112 +,195,186,98,108,105,99,97,115,105,116,117,97,99,105,195,179,110,109,105,110,105, +115,116,101,114,105,111,112,114,105,118,97,99,105,100,97,100,100,105,114,101,99, +116,111,114,105,111,102,111,114,109,97,99,105,195,179,110,112,111,98,108,97,99, +105,195,179,110,112,114,101,115,105,100,101,110,116,101,99,111,110,116,101,110, +105,100,111,115,97,99,99,101,115,111,114,105,111,115,116,101,99,104,110,111,114, +97,116,105,112,101,114,115,111,110,97,108,101,115,99,97,116,101,103,111,114,195, +173,97,101,115,112,101,99,105,97,108,101,115,100,105,115,112,111,110,105,98,108, +101,97,99,116,117,97,108,105,100,97,100,114,101,102,101,114,101,110,99,105,97, +118,97,108,108,97,100,111,108,105,100,98,105,98,108,105,111,116,101,99,97,114, +101,108,97,99,105,111,110,101,115,99,97,108,101,110,100,97,114,105,111,112,111, +108,195,173,116,105,99,97,115,97,110,116,101,114,105,111,114,101,115,100,111,99, +117,109,101,110,116,111,115,110,97,116,117,114,97,108,101,122,97,109,97,116,101, +114,105,97,108,101,115,100,105,102,101,114,101,110,99,105,97,101,99,111,110,195, +179,109,105,99,97,116,114,97,110,115,112,111,114,116,101,114,111,100,114,195,173 +,103,117,101,122,112,97,114,116,105,99,105,112,97,114,101,110,99,117,101,110,116 +,114,97,110,100,105,115,99,117,115,105,195,179,110,101,115,116,114,117,99,116, +117,114,97,102,117,110,100,97,99,105,195,179,110,102,114,101,99,117,101,110,116, +101,115,112,101,114,109,97,110,101,110,116,101,116,111,116,97,108,109,101,110, +116,101,208,188,208,190,208,182,208,189,208,190,208,177,209,131,208,180,208,181, +209,130,208,188,208,190,208,182,208,181,209,130,208,178,209,128,208,181,208,188, +209,143,209,130,208,176,208,186,208,182,208,181,209,135,209,130,208,190,208,177, +209,139,208,177,208,190,208,187,208,181,208,181,208,190,209,135,208,181,208,189, +209,140,209,141,209,130,208,190,208,179,208,190,208,186,208,190,208,179,208,180, +208,176,208,191,208,190,209,129,208,187,208,181,208,178,209,129,208,181,208,179, +208,190,209,129,208,176,208,185,209,130,208,181,209,135,208,181,209,128,208,181, +208,183,208,188,208,190,208,179,209,131,209,130,209,129,208,176,208,185,209,130, +208,176,208,182,208,184,208,183,208,189,208,184,208,188,208,181,208,182,208,180, +209,131,208,177,209,131,208,180,209,131,209,130,208,159,208,190,208,184,209,129, +208,186,208,183,208,180,208,181,209,129,209,140,208,178,208,184,208,180,208,181, +208,190,209,129,208,178,209,143,208,183,208,184,208,189,209,131,208,182,208,189, +208,190,209,129,208,178,208,190,208,181,208,185,208,187,209,142,208,180,208,181, +208,185,208,191,208,190,209,128,208,189,208,190,208,188,208,189,208,190,208,179, +208,190,208,180,208,181,209,130,208,181,208,185,209,129,208,178,208,190,208,184, +209,133,208,191,209,128,208,176,208,178,208,176,209,130,208,176,208,186,208,190, +208,185,208,188,208,181,209,129,209,130,208,190,208,184,208,188,208,181,208,181, +209,130,208,182,208,184,208,183,208,189,209,140,208,190,208,180,208,189,208,190, +208,185,208,187,209,131,209,135,209,136,208,181,208,191,208,181,209,128,208,181, +208,180,209,135,208,176,209,129,209,130,208,184,209,135,208,176,209,129,209,130, +209,140,209,128,208,176,208,177,208,190,209,130,208,189,208,190,208,178,209,139, +209,133,208,191,209,128,208,176,208,178,208,190,209,129,208,190,208,177,208,190, +208,185,208,191,208,190,209,130,208,190,208,188,208,188,208,181,208,189,208,181, +208,181,209,135,208,184,209,129,208,187,208,181,208,189,208,190,208,178,209,139, +208,181,209,131,209,129,208,187,209,131,208,179,208,190,208,186,208,190,208,187, +208,190,208,189,208,176,208,183,208,176,208,180,209,130,208,176,208,186,208,190, +208,181,209,130,208,190,208,179,208,180,208,176,208,191,208,190,209,135,209,130, +208,184,208,159,208,190,209,129,208,187,208,181,209,130,208,176,208,186,208,184, +208,181,208,189,208,190,208,178,209,139,208,185,209,129,209,130,208,190,208,184, +209,130,209,130,208,176,208,186,208,184,209,133,209,129,209,128,208,176,208,183, +209,131,208,161,208,176,208,189,208,186,209,130,209,132,208,190,209,128,209,131, +208,188,208,154,208,190,208,179,208,180,208,176,208,186,208,189,208,184,208,179, +208,184,209,129,208,187,208,190,208,178,208,176,208,189,208,176,209,136,208,181, +208,185,208,189,208,176,208,185,209,130,208,184,209,129,208,178,208,190,208,184, +208,188,209,129,208,178,209,143,208,183,209,140,208,187,209,142,208,177,208,190, +208,185,209,135,208,176,209,129,209,130,208,190,209,129,209,128,208,181,208,180, +208,184,208,154,209,128,208,190,208,188,208,181,208,164,208,190,209,128,209,131, +208,188,209,128,209,139,208,189,208,186,208,181,209,129,209,130,208,176,208,187, +208,184,208,191,208,190,208,184,209,129,208,186,209,130,209,139,209,129,209,143, +209,135,208,188,208,181,209,129,209,143,209,134,209,134,208,181,208,189,209,130, +209,128,209,130,209,128,209,131,208,180,208,176,209,129,208,176,208,188,209,139, +209,133,209,128,209,139,208,189,208,186,208,176,208,157,208,190,208,178,209,139, +208,185,209,135,208,176,209,129,208,190,208,178,208,188,208,181,209,129,209,130, +208,176,209,132,208,184,208,187,209,140,208,188,208,188,208,176,209,128,209,130, +208,176,209,129,209,130,209,128,208,176,208,189,208,188,208,181,209,129,209,130, +208,181,209,130,208,181,208,186,209,129,209,130,208,189,208,176,209,136,208,184, +209,133,208,188,208,184,208,189,209,131,209,130,208,184,208,188,208,181,208,189, +208,184,208,184,208,188,208,181,209,142,209,130,208,189,208,190,208,188,208,181, +209,128,208,179,208,190,209,128,208,190,208,180,209,129,208,176,208,188,208,190, +208,188,209,141,209,130,208,190,208,188,209,131,208,186,208,190,208,189,209,134, +208,181,209,129,208,178,208,190,208,181,208,188,208,186,208,176,208,186,208,190, +208,185,208,144,209,128,209,133,208,184,208,178,217,133,217,134,216,170,216,175, +217,137,216,165,216,177,216,179,216,167,217,132,216,177,216,179,216,167,217,132, +216,169,216,167,217,132,216,185,216,167,217,133,217,131,216,170,216,168,217,135, +216,167,216,168,216,177,216,167,217,133,216,172,216,167,217,132,217,138,217,136, +217,133,216,167,217,132,216,181,217,136,216,177,216,172,216,175,217,138,216,175, +216,169,216,167,217,132,216,185,216,182,217,136,216,165,216,182,216,167,217,129, +216,169,216,167,217,132,217,130,216,179,217,133,216,167,217,132,216,185,216,167, +216,168,216,170,216,173,217,133,217,138,217,132,217,133,217,132,217,129,216,167, +216,170,217,133,217,132,216,170,217,130,217,137,216,170,216,185,216,175,217,138, +217,132,216,167,217,132,216,180,216,185,216,177,216,163,216,174,216,168,216,167, +216,177,216,170,216,183,217,136,217,138,216,177,216,185,217,132,217,138,217,131, +217,133,216,165,216,177,217,129,216,167,217,130,216,183,217,132,216,168,216,167, +216,170,216,167,217,132,217,132,216,186,216,169,216,170,216,177,216,170,217,138, +216,168,216,167,217,132,217,134,216,167,216,179,216,167,217,132,216,180,217,138, +216,174,217,133,217,134,216,170,216,175,217,138,216,167,217,132,216,185,216,177, +216,168,216,167,217,132,217,130,216,181,216,181,216,167,217,129,217,132,216,167, +217,133,216,185,217,132,217,138,217,135,216,167,216,170,216,173,216,175,217,138, +216,171,216,167,217,132,217,132,217,135,217,133,216,167,217,132,216,185,217,133, +217,132,217,133,217,131,216,170,216,168,216,169,217,138,217,133,217,131,217,134, +217,131,216,167,217,132,216,183,217,129,217,132,217,129,217,138,216,175,217,138, +217,136,216,165,216,175,216,167,216,177,216,169,216,170,216,167,216,177,217,138, +216,174,216,167,217,132,216,181,216,173,216,169,216,170,216,179,216,172,217,138, +217,132,216,167,217,132,217,136,217,130,216,170,216,185,217,134,216,175,217,133, +216,167,217,133,216,175,217,138,217,134,216,169,216,170,216,181,217,133,217,138, +217,133,216,163,216,177,216,180,217,138,217,129,216,167,217,132,216,176,217,138, +217,134,216,185,216,177,216,168,217,138,216,169,216,168,217,136,216,167,216,168, +216,169,216,163,217,132,216,185,216,167,216,168,216,167,217,132,216,179,217,129, +216,177,217,133,216,180,216,167,217,131,217,132,216,170,216,185,216,167,217,132, +217,137,216,167,217,132,216,163,217,136,217,132,216,167,217,132,216,179,217,134, +216,169,216,172,216,167,217,133,216,185,216,169,216,167,217,132,216,181,216,173, +217,129,216,167,217,132,216,175,217,138,217,134,217,131,217,132,217,133,216,167, +216,170,216,167,217,132,216,174,216,167,216,181,216,167,217,132,217,133,217,132, +217,129,216,163,216,185,216,182,216,167,216,161,217,131,216,170,216,167,216,168, +216,169,216,167,217,132,216,174,217,138,216,177,216,177,216,179,216,167,216,166, +217,132,216,167,217,132,217,130,217,132,216,168,216,167,217,132,216,163,216,175, +216,168,217,133,217,130,216,167,216,183,216,185,217,133,216,177,216,167,216,179, +217,132,217,133,217,134,216,183,217,130,216,169,216,167,217,132,217,131,216,170, +216,168,216,167,217,132,216,177,216,172,217,132,216,167,216,180,216,170,216,177, +217,131,216,167,217,132,217,130,216,175,217,133,217,138,216,185,216,183,217,138, +217,131,115,66,121,84,97,103,78,97,109,101,40,46,106,112,103,34,32,97,108,116,61 +,34,49,112,120,32,115,111,108,105,100,32,35,46,103,105,102,34,32,97,108,116,61, +34,116,114,97,110,115,112,97,114,101,110,116,105,110,102,111,114,109,97,116,105, +111,110,97,112,112,108,105,99,97,116,105,111,110,34,32,111,110,99,108,105,99,107 +,61,34,101,115,116,97,98,108,105,115,104,101,100,97,100,118,101,114,116,105,115, +105,110,103,46,112,110,103,34,32,97,108,116,61,34,101,110,118,105,114,111,110, +109,101,110,116,112,101,114,102,111,114,109,97,110,99,101,97,112,112,114,111,112 +,114,105,97,116,101,38,97,109,112,59,109,100,97,115,104,59,105,109,109,101,100, +105,97,116,101,108,121,60,47,115,116,114,111,110,103,62,60,47,114,97,116,104,101 +,114,32,116,104,97,110,116,101,109,112,101,114,97,116,117,114,101,100,101,118, +101,108,111,112,109,101,110,116,99,111,109,112,101,116,105,116,105,111,110,112, +108,97,99,101,104,111,108,100,101,114,118,105,115,105,98,105,108,105,116,121,58, +99,111,112,121,114,105,103,104,116,34,62,48,34,32,104,101,105,103,104,116,61,34, +101,118,101,110,32,116,104,111,117,103,104,114,101,112,108,97,99,101,109,101,110 +,116,100,101,115,116,105,110,97,116,105,111,110,67,111,114,112,111,114,97,116, +105,111,110,60,117,108,32,99,108,97,115,115,61,34,65,115,115,111,99,105,97,116, +105,111,110,105,110,100,105,118,105,100,117,97,108,115,112,101,114,115,112,101, +99,116,105,118,101,115,101,116,84,105,109,101,111,117,116,40,117,114,108,40,104, +116,116,112,58,47,47,109,97,116,104,101,109,97,116,105,99,115,109,97,114,103,105 +,110,45,116,111,112,58,101,118,101,110,116,117,97,108,108,121,32,100,101,115,99, +114,105,112,116,105,111,110,41,32,110,111,45,114,101,112,101,97,116,99,111,108, +108,101,99,116,105,111,110,115,46,74,80,71,124,116,104,117,109,98,124,112,97,114 +,116,105,99,105,112,97,116,101,47,104,101,97,100,62,60,98,111,100,121,102,108, +111,97,116,58,108,101,102,116,59,60,108,105,32,99,108,97,115,115,61,34,104,117, +110,100,114,101,100,115,32,111,102,10,10,72,111,119,101,118,101,114,44,32,99,111 +,109,112,111,115,105,116,105,111,110,99,108,101,97,114,58,98,111,116,104,59,99, +111,111,112,101,114,97,116,105,111,110,119,105,116,104,105,110,32,116,104,101,32 +,108,97,98,101,108,32,102,111,114,61,34,98,111,114,100,101,114,45,116,111,112,58 +,78,101,119,32,90,101,97,108,97,110,100,114,101,99,111,109,109,101,110,100,101, +100,112,104,111,116,111,103,114,97,112,104,121,105,110,116,101,114,101,115,116, +105,110,103,38,108,116,59,115,117,112,38,103,116,59,99,111,110,116,114,111,118, +101,114,115,121,78,101,116,104,101,114,108,97,110,100,115,97,108,116,101,114,110 +,97,116,105,118,101,109,97,120,108,101,110,103,116,104,61,34,115,119,105,116,122 +,101,114,108,97,110,100,68,101,118,101,108,111,112,109,101,110,116,101,115,115, +101,110,116,105,97,108,108,121,10,10,65,108,116,104,111,117,103,104,32,60,47,116 +,101,120,116,97,114,101,97,62,116,104,117,110,100,101,114,98,105,114,100,114,101 +,112,114,101,115,101,110,116,101,100,38,97,109,112,59,110,100,97,115,104,59,115, +112,101,99,117,108,97,116,105,111,110,99,111,109,109,117,110,105,116,105,101,115 +,108,101,103,105,115,108,97,116,105,111,110,101,108,101,99,116,114,111,110,105, +99,115,10,9,60,100,105,118,32,105,100,61,34,105,108,108,117,115,116,114,97,116, +101,100,101,110,103,105,110,101,101,114,105,110,103,116,101,114,114,105,116,111, +114,105,101,115,97,117,116,104,111,114,105,116,105,101,115,100,105,115,116,114, +105,98,117,116,101,100,54,34,32,104,101,105,103,104,116,61,34,115,97,110,115,45, +115,101,114,105,102,59,99,97,112,97,98,108,101,32,111,102,32,100,105,115,97,112, +112,101,97,114,101,100,105,110,116,101,114,97,99,116,105,118,101,108,111,111,107 +,105,110,103,32,102,111,114,105,116,32,119,111,117,108,100,32,98,101,65,102,103, +104,97,110,105,115,116,97,110,119,97,115,32,99,114,101,97,116,101,100,77,97,116, +104,46,102,108,111,111,114,40,115,117,114,114,111,117,110,100,105,110,103,99,97, +110,32,97,108,115,111,32,98,101,111,98,115,101,114,118,97,116,105,111,110,109,97 +,105,110,116,101,110,97,110,99,101,101,110,99,111,117,110,116,101,114,101,100,60 +,104,50,32,99,108,97,115,115,61,34,109,111,114,101,32,114,101,99,101,110,116,105 +,116,32,104,97,115,32,98,101,101,110,105,110,118,97,115,105,111,110,32,111,102, +41,46,103,101,116,84,105,109,101,40,41,102,117,110,100,97,109,101,110,116,97,108 +,68,101,115,112,105,116,101,32,116,104,101,34,62,60,100,105,118,32,105,100,61,34 +,105,110,115,112,105,114,97,116,105,111,110,101,120,97,109,105,110,97,116,105, +111,110,112,114,101,112,97,114,97,116,105,111,110,101,120,112,108,97,110,97,116, +105,111,110,60,105,110,112,117,116,32,105,100,61,34,60,47,97,62,60,47,115,112,97 +,110,62,118,101,114,115,105,111,110,115,32,111,102,105,110,115,116,114,117,109, +101,110,116,115,98,101,102,111,114,101,32,116,104,101,32,32,61,32,39,104,116,116 +,112,58,47,47,68,101,115,99,114,105,112,116,105,111,110,114,101,108,97,116,105, +118,101,108,121,32,46,115,117,98,115,116,114,105,110,103,40,101,97,99,104,32,111 +,102,32,116,104,101,101,120,112,101,114,105,109,101,110,116,115,105,110,102,108, +117,101,110,116,105,97,108,105,110,116,101,103,114,97,116,105,111,110,109,97,110 +,121,32,112,101,111,112,108,101,100,117,101,32,116,111,32,116,104,101,32,99,111, +109,98,105,110,97,116,105,111,110,100,111,32,110,111,116,32,104,97,118,101,77, +105,100,100,108,101,32,69,97,115,116,60,110,111,115,99,114,105,112,116,62,60,99, +111,112,121,114,105,103,104,116,34,32,112,101,114,104,97,112,115,32,116,104,101, +105,110,115,116,105,116,117,116,105,111,110,105,110,32,68,101,99,101,109,98,101, +114,97,114,114,97,110,103,101,109,101,110,116,109,111,115,116,32,102,97,109,111, +117,115,112,101,114,115,111,110,97,108,105,116,121,99,114,101,97,116,105,111,110 +,32,111,102,108,105,109,105,116,97,116,105,111,110,115,101,120,99,108,117,115, +105,118,101,108,121,115,111,118,101,114,101,105,103,110,116,121,45,99,111,110, +116,101,110,116,34,62,10,60,116,100,32,99,108,97,115,115,61,34,117,110,100,101, +114,103,114,111,117,110,100,112,97,114,97,108,108,101,108,32,116,111,100,111,99, +116,114,105,110,101,32,111,102,111,99,99,117,112,105,101,100,32,98,121,116,101, +114,109,105,110,111,108,111,103,121,82,101,110,97,105,115,115,97,110,99,101,97, +32,110,117,109,98,101,114,32,111,102,115,117,112,112,111,114,116,32,102,111,114, +101,120,112,108,111,114,97,116,105,111,110,114,101,99,111,103,110,105,116,105, +111,110,112,114,101,100,101,99,101,115,115,111,114,60,105,109,103,32,115,114,99, +61,34,47,60,104,49,32,99,108,97,115,115,61,34,112,117,98,108,105,99,97,116,105, +111,110,109,97,121,32,97,108,115,111,32,98,101,115,112,101,99,105,97,108,105,122 +,101,100,60,47,102,105,101,108,100,115,101,116,62,112,114,111,103,114,101,115, +115,105,118,101,109,105,108,108,105,111,110,115,32,111,102,115,116,97,116,101, +115,32,116,104,97,116,101,110,102,111,114,99,101,109,101,110,116,97,114,111,117, +110,100,32,116,104,101,32,111,110,101,32,97,110,111,116,104,101,114,46,112,97, +114,101,110,116,78,111,100,101,97,103,114,105,99,117,108,116,117,114,101,65,108, +116,101,114,110,97,116,105,118,101,114,101,115,101,97,114,99,104,101,114,115,116 +,111,119,97,114,100,115,32,116,104,101,77,111,115,116,32,111,102,32,116,104,101, +109,97,110,121,32,111,116,104,101,114,32,40,101,115,112,101,99,105,97,108,108, +121,60,116,100,32,119,105,100,116,104,61,34,59,119,105,100,116,104,58,49,48,48, +37,105,110,100,101,112,101,110,100,101,110,116,60,104,51,32,99,108,97,115,115,61 +,34,32,111,110,99,104,97,110,103,101,61,34,41,46,97,100,100,67,108,97,115,115,40 +,105,110,116,101,114,97,99,116,105,111,110,79,110,101,32,111,102,32,116,104,101, +32,100,97,117,103,104,116,101,114,32,111,102,97,99,99,101,115,115,111,114,105, +101,115,98,114,97,110,99,104,101,115,32,111,102,13,10,60,100,105,118,32,105,100, +61,34,116,104,101,32,108,97,114,103,101,115,116,100,101,99,108,97,114,97,116,105 +,111,110,114,101,103,117,108,97,116,105,111,110,115,73,110,102,111,114,109,97, +116,105,111,110,116,114,97,110,115,108,97,116,105,111,110,100,111,99,117,109,101 +,110,116,97,114,121,105,110,32,111,114,100,101,114,32,116,111,34,62,10,60,104, +101,97,100,62,10,60,34,32,104,101,105,103,104,116,61,34,49,97,99,114,111,115,115 +,32,116,104,101,32,111,114,105,101,110,116,97,116,105,111,110,41,59,60,47,115,99 +,114,105,112,116,62,105,109,112,108,101,109,101,110,116,101,100,99,97,110,32,98, +101,32,115,101,101,110,116,104,101,114,101,32,119,97,115,32,97,100,101,109,111, +110,115,116,114,97,116,101,99,111,110,116,97,105,110,101,114,34,62,99,111,110, +110,101,99,116,105,111,110,115,116,104,101,32,66,114,105,116,105,115,104,119,97, +115,32,119,114,105,116,116,101,110,33,105,109,112,111,114,116,97,110,116,59,112, +120,59,32,109,97,114,103,105,110,45,102,111,108,108,111,119,101,100,32,98,121,97 +,98,105,108,105,116,121,32,116,111,32,99,111,109,112,108,105,99,97,116,101,100, +100,117,114,105,110,103,32,116,104,101,32,105,109,109,105,103,114,97,116,105,111 +,110,97,108,115,111,32,99,97,108,108,101,100,60,104,52,32,99,108,97,115,115,61, +34,100,105,115,116,105,110,99,116,105,111,110,114,101,112,108,97,99,101,100,32, +98,121,103,111,118,101,114,110,109,101,110,116,115,108,111,99,97,116,105,111,110 +,32,111,102,105,110,32,78,111,118,101,109,98,101,114,119,104,101,116,104,101,114 +,32,116,104,101,60,47,112,62,10,60,47,100,105,118,62,97,99,113,117,105,115,105, +116,105,111,110,99,97,108,108,101,100,32,116,104,101,32,112,101,114,115,101,99, +117,116,105,111,110,100,101,115,105,103,110,97,116,105,111,110,123,102,111,110, +116,45,115,105,122,101,58,97,112,112,101,97,114,101,100,32,105,110,105,110,118, +101,115,116,105,103,97,116,101,101,120,112,101,114,105,101,110,99,101,100,109, +111,115,116,32,108,105,107,101,108,121,119,105,100,101,108,121,32,117,115,101, +100,100,105,115,99,117,115,115,105,111,110,115,112,114,101,115,101,110,99,101,32 +,111,102,32,40,100,111,99,117,109,101,110,116,46,101,120,116,101,110,115,105,118 +,101,108,121,73,116,32,104,97,115,32,98,101,101,110,105,116,32,100,111,101,115, +32,110,111,116,99,111,110,116,114,97,114,121,32,116,111,105,110,104,97,98,105, +116,97,110,116,115,105,109,112,114,111,118,101,109,101,110,116,115,99,104,111, +108,97,114,115,104,105,112,99,111,110,115,117,109,112,116,105,111,110,105,110, +115,116,114,117,99,116,105,111,110,102,111,114,32,101,120,97,109,112,108,101,111 +,110,101,32,111,114,32,109,111,114,101,112,120,59,32,112,97,100,100,105,110,103, +116,104,101,32,99,117,114,114,101,110,116,97,32,115,101,114,105,101,115,32,111, +102,97,114,101,32,117,115,117,97,108,108,121,114,111,108,101,32,105,110,32,116, +104,101,112,114,101,118,105,111,117,115,108,121,32,100,101,114,105,118,97,116, +105,118,101,115,101,118,105,100,101,110,99,101,32,111,102,101,120,112,101,114, +105,101,110,99,101,115,99,111,108,111,114,115,99,104,101,109,101,115,116,97,116, +101,100,32,116,104,97,116,99,101,114,116,105,102,105,99,97,116,101,60,47,97,62, +60,47,100,105,118,62,10,32,115,101,108,101,99,116,101,100,61,34,104,105,103,104, +32,115,99,104,111,111,108,114,101,115,112,111,110,115,101,32,116,111,99,111,109, +102,111,114,116,97,98,108,101,97,100,111,112,116,105,111,110,32,111,102,116,104, +114,101,101,32,121,101,97,114,115,116,104,101,32,99,111,117,110,116,114,121,105, +110,32,70,101,98,114,117,97,114,121,115,111,32,116,104,97,116,32,116,104,101,112 +,101,111,112,108,101,32,119,104,111,32,112,114,111,118,105,100,101,100,32,98,121 +,60,112,97,114,97,109,32,110,97,109,101,97,102,102,101,99,116,101,100,32,98,121, +105,110,32,116,101,114,109,115,32,111,102,97,112,112,111,105,110,116,109,101,110 +,116,73,83,79,45,56,56,53,57,45,49,34,119,97,115,32,98,111,114,110,32,105,110, +104,105,115,116,111,114,105,99,97,108,32,114,101,103,97,114,100,101,100,32,97, +115,109,101,97,115,117,114,101,109,101,110,116,105,115,32,98,97,115,101,100,32, +111,110,32,97,110,100,32,111,116,104,101,114,32,58,32,102,117,110,99,116,105,111 +,110,40,115,105,103,110,105,102,105,99,97,110,116,99,101,108,101,98,114,97,116, +105,111,110,116,114,97,110,115,109,105,116,116,101,100,47,106,115,47,106,113,117 +,101,114,121,46,105,115,32,107,110,111,119,110,32,97,115,116,104,101,111,114,101 +,116,105,99,97,108,32,116,97,98,105,110,100,101,120,61,34,105,116,32,99,111,117, +108,100,32,98,101,60,110,111,115,99,114,105,112,116,62,10,104,97,118,105,110,103 +,32,98,101,101,110,13,10,60,104,101,97,100,62,13,10,60,32,38,113,117,111,116,59, +84,104,101,32,99,111,109,112,105,108,97,116,105,111,110,104,101,32,104,97,100,32 +,98,101,101,110,112,114,111,100,117,99,101,100,32,98,121,112,104,105,108,111,115 +,111,112,104,101,114,99,111,110,115,116,114,117,99,116,101,100,105,110,116,101, +110,100,101,100,32,116,111,97,109,111,110,103,32,111,116,104,101,114,99,111,109, +112,97,114,101,100,32,116,111,116,111,32,115,97,121,32,116,104,97,116,69,110,103 +,105,110,101,101,114,105,110,103,97,32,100,105,102,102,101,114,101,110,116,114, +101,102,101,114,114,101,100,32,116,111,100,105,102,102,101,114,101,110,99,101, +115,98,101,108,105,101,102,32,116,104,97,116,112,104,111,116,111,103,114,97,112, +104,115,105,100,101,110,116,105,102,121,105,110,103,72,105,115,116,111,114,121, +32,111,102,32,82,101,112,117,98,108,105,99,32,111,102,110,101,99,101,115,115,97, +114,105,108,121,112,114,111,98,97,98,105,108,105,116,121,116,101,99,104,110,105, +99,97,108,108,121,108,101,97,118,105,110,103,32,116,104,101,115,112,101,99,116, +97,99,117,108,97,114,102,114,97,99,116,105,111,110,32,111,102,101,108,101,99,116 +,114,105,99,105,116,121,104,101,97,100,32,111,102,32,116,104,101,114,101,115,116 +,97,117,114,97,110,116,115,112,97,114,116,110,101,114,115,104,105,112,101,109, +112,104,97,115,105,115,32,111,110,109,111,115,116,32,114,101,99,101,110,116,115, +104,97,114,101,32,119,105,116,104,32,115,97,121,105,110,103,32,116,104,97,116, +102,105,108,108,101,100,32,119,105,116,104,100,101,115,105,103,110,101,100,32, +116,111,105,116,32,105,115,32,111,102,116,101,110,34,62,60,47,105,102,114,97,109 +,101,62,97,115,32,102,111,108,108,111,119,115,58,109,101,114,103,101,100,32,119, +105,116,104,116,104,114,111,117,103,104,32,116,104,101,99,111,109,109,101,114,99 +,105,97,108,32,112,111,105,110,116,101,100,32,111,117,116,111,112,112,111,114, +116,117,110,105,116,121,118,105,101,119,32,111,102,32,116,104,101,114,101,113, +117,105,114,101,109,101,110,116,100,105,118,105,115,105,111,110,32,111,102,112, +114,111,103,114,97,109,109,105,110,103,104,101,32,114,101,99,101,105,118,101,100 +,115,101,116,73,110,116,101,114,118,97,108,34,62,60,47,115,112,97,110,62,60,47, +105,110,32,78,101,119,32,89,111,114,107,97,100,100,105,116,105,111,110,97,108,32 +,99,111,109,112,114,101,115,115,105,111,110,10,10,60,100,105,118,32,105,100,61, +34,105,110,99,111,114,112,111,114,97,116,101,59,60,47,115,99,114,105,112,116,62, +60,97,116,116,97,99,104,69,118,101,110,116,98,101,99,97,109,101,32,116,104,101, +32,34,32,116,97,114,103,101,116,61,34,95,99,97,114,114,105,101,100,32,111,117, +116,83,111,109,101,32,111,102,32,116,104,101,115,99,105,101,110,99,101,32,97,110 +,100,116,104,101,32,116,105,109,101,32,111,102,67,111,110,116,97,105,110,101,114 +,34,62,109,97,105,110,116,97,105,110,105,110,103,67,104,114,105,115,116,111,112, +104,101,114,77,117,99,104,32,111,102,32,116,104,101,119,114,105,116,105,110,103, +115,32,111,102,34,32,104,101,105,103,104,116,61,34,50,115,105,122,101,32,111,102 +,32,116,104,101,118,101,114,115,105,111,110,32,111,102,32,109,105,120,116,117, +114,101,32,111,102,32,98,101,116,119,101,101,110,32,116,104,101,69,120,97,109, +112,108,101,115,32,111,102,101,100,117,99,97,116,105,111,110,97,108,99,111,109, +112,101,116,105,116,105,118,101,32,111,110,115,117,98,109,105,116,61,34,100,105, +114,101,99,116,111,114,32,111,102,100,105,115,116,105,110,99,116,105,118,101,47, +68,84,68,32,88,72,84,77,76,32,114,101,108,97,116,105,110,103,32,116,111,116,101, +110,100,101,110,99,121,32,116,111,112,114,111,118,105,110,99,101,32,111,102,119, +104,105,99,104,32,119,111,117,108,100,100,101,115,112,105,116,101,32,116,104,101 +,115,99,105,101,110,116,105,102,105,99,32,108,101,103,105,115,108,97,116,117,114 +,101,46,105,110,110,101,114,72,84,77,76,32,97,108,108,101,103,97,116,105,111,110 +,115,65,103,114,105,99,117,108,116,117,114,101,119,97,115,32,117,115,101,100,32, +105,110,97,112,112,114,111,97,99,104,32,116,111,105,110,116,101,108,108,105,103, +101,110,116,121,101,97,114,115,32,108,97,116,101,114,44,115,97,110,115,45,115, +101,114,105,102,100,101,116,101,114,109,105,110,105,110,103,80,101,114,102,111, +114,109,97,110,99,101,97,112,112,101,97,114,97,110,99,101,115,44,32,119,104,105, +99,104,32,105,115,32,102,111,117,110,100,97,116,105,111,110,115,97,98,98,114,101 +,118,105,97,116,101,100,104,105,103,104,101,114,32,116,104,97,110,115,32,102,114 +,111,109,32,116,104,101,32,105,110,100,105,118,105,100,117,97,108,32,99,111,109, +112,111,115,101,100,32,111,102,115,117,112,112,111,115,101,100,32,116,111,99,108 +,97,105,109,115,32,116,104,97,116,97,116,116,114,105,98,117,116,105,111,110,102, +111,110,116,45,115,105,122,101,58,49,101,108,101,109,101,110,116,115,32,111,102, +72,105,115,116,111,114,105,99,97,108,32,104,105,115,32,98,114,111,116,104,101, +114,97,116,32,116,104,101,32,116,105,109,101,97,110,110,105,118,101,114,115,97, +114,121,103,111,118,101,114,110,101,100,32,98,121,114,101,108,97,116,101,100,32, +116,111,32,117,108,116,105,109,97,116,101,108,121,32,105,110,110,111,118,97,116, +105,111,110,115,105,116,32,105,115,32,115,116,105,108,108,99,97,110,32,111,110, +108,121,32,98,101,100,101,102,105,110,105,116,105,111,110,115,116,111,71,77,84, +83,116,114,105,110,103,65,32,110,117,109,98,101,114,32,111,102,105,109,103,32,99 +,108,97,115,115,61,34,69,118,101,110,116,117,97,108,108,121,44,119,97,115,32,99, +104,97,110,103,101,100,111,99,99,117,114,114,101,100,32,105,110,110,101,105,103, +104,98,111,114,105,110,103,100,105,115,116,105,110,103,117,105,115,104,119,104, +101,110,32,104,101,32,119,97,115,105,110,116,114,111,100,117,99,105,110,103,116, +101,114,114,101,115,116,114,105,97,108,77,97,110,121,32,111,102,32,116,104,101, +97,114,103,117,101,115,32,116,104,97,116,97,110,32,65,109,101,114,105,99,97,110, +99,111,110,113,117,101,115,116,32,111,102,119,105,100,101,115,112,114,101,97,100 +,32,119,101,114,101,32,107,105,108,108,101,100,115,99,114,101,101,110,32,97,110, +100,32,73,110,32,111,114,100,101,114,32,116,111,101,120,112,101,99,116,101,100, +32,116,111,100,101,115,99,101,110,100,97,110,116,115,97,114,101,32,108,111,99,97 +,116,101,100,108,101,103,105,115,108,97,116,105,118,101,103,101,110,101,114,97, +116,105,111,110,115,32,98,97,99,107,103,114,111,117,110,100,109,111,115,116,32, +112,101,111,112,108,101,121,101,97,114,115,32,97,102,116,101,114,116,104,101,114 +,101,32,105,115,32,110,111,116,104,101,32,104,105,103,104,101,115,116,102,114, +101,113,117,101,110,116,108,121,32,116,104,101,121,32,100,111,32,110,111,116,97, +114,103,117,101,100,32,116,104,97,116,115,104,111,119,101,100,32,116,104,97,116, +112,114,101,100,111,109,105,110,97,110,116,116,104,101,111,108,111,103,105,99,97 +,108,98,121,32,116,104,101,32,116,105,109,101,99,111,110,115,105,100,101,114,105 +,110,103,115,104,111,114,116,45,108,105,118,101,100,60,47,115,112,97,110,62,60, +47,97,62,99,97,110,32,98,101,32,117,115,101,100,118,101,114,121,32,108,105,116, +116,108,101,111,110,101,32,111,102,32,116,104,101,32,104,97,100,32,97,108,114, +101,97,100,121,105,110,116,101,114,112,114,101,116,101,100,99,111,109,109,117, +110,105,99,97,116,101,102,101,97,116,117,114,101,115,32,111,102,103,111,118,101, +114,110,109,101,110,116,44,60,47,110,111,115,99,114,105,112,116,62,101,110,116, +101,114,101,100,32,116,104,101,34,32,104,101,105,103,104,116,61,34,51,73,110,100 +,101,112,101,110,100,101,110,116,112,111,112,117,108,97,116,105,111,110,115,108, +97,114,103,101,45,115,99,97,108,101,46,32,65,108,116,104,111,117,103,104,32,117, +115,101,100,32,105,110,32,116,104,101,100,101,115,116,114,117,99,116,105,111,110 +,112,111,115,115,105,98,105,108,105,116,121,115,116,97,114,116,105,110,103,32, +105,110,116,119,111,32,111,114,32,109,111,114,101,101,120,112,114,101,115,115, +105,111,110,115,115,117,98,111,114,100,105,110,97,116,101,108,97,114,103,101,114 +,32,116,104,97,110,104,105,115,116,111,114,121,32,97,110,100,60,47,111,112,116, +105,111,110,62,13,10,67,111,110,116,105,110,101,110,116,97,108,101,108,105,109, +105,110,97,116,105,110,103,119,105,108,108,32,110,111,116,32,98,101,112,114,97, +99,116,105,99,101,32,111,102,105,110,32,102,114,111,110,116,32,111,102,115,105, +116,101,32,111,102,32,116,104,101,101,110,115,117,114,101,32,116,104,97,116,116, +111,32,99,114,101,97,116,101,32,97,109,105,115,115,105,115,115,105,112,112,105, +112,111,116,101,110,116,105,97,108,108,121,111,117,116,115,116,97,110,100,105, +110,103,98,101,116,116,101,114,32,116,104,97,110,119,104,97,116,32,105,115,32, +110,111,119,115,105,116,117,97,116,101,100,32,105,110,109,101,116,97,32,110,97, +109,101,61,34,84,114,97,100,105,116,105,111,110,97,108,115,117,103,103,101,115, +116,105,111,110,115,84,114,97,110,115,108,97,116,105,111,110,116,104,101,32,102, +111,114,109,32,111,102,97,116,109,111,115,112,104,101,114,105,99,105,100,101,111 +,108,111,103,105,99,97,108,101,110,116,101,114,112,114,105,115,101,115,99,97,108 +,99,117,108,97,116,105,110,103,101,97,115,116,32,111,102,32,116,104,101,114,101, +109,110,97,110,116,115,32,111,102,112,108,117,103,105,110,115,112,97,103,101,47, +105,110,100,101,120,46,112,104,112,63,114,101,109,97,105,110,101,100,32,105,110, +116,114,97,110,115,102,111,114,109,101,100,72,101,32,119,97,115,32,97,108,115, +111,119,97,115,32,97,108,114,101,97,100,121,115,116,97,116,105,115,116,105,99,97 +,108,105,110,32,102,97,118,111,114,32,111,102,77,105,110,105,115,116,114,121,32, +111,102,109,111,118,101,109,101,110,116,32,111,102,102,111,114,109,117,108,97, +116,105,111,110,105,115,32,114,101,113,117,105,114,101,100,60,108,105,110,107,32 +,114,101,108,61,34,84,104,105,115,32,105,115,32,116,104,101,32,60,97,32,104,114, +101,102,61,34,47,112,111,112,117,108,97,114,105,122,101,100,105,110,118,111,108, +118,101,100,32,105,110,97,114,101,32,117,115,101,100,32,116,111,97,110,100,32, +115,101,118,101,114,97,108,109,97,100,101,32,98,121,32,116,104,101,115,101,101, +109,115,32,116,111,32,98,101,108,105,107,101,108,121,32,116,104,97,116,80,97,108 +,101,115,116,105,110,105,97,110,110,97,109,101,100,32,97,102,116,101,114,105,116 +,32,104,97,100,32,98,101,101,110,109,111,115,116,32,99,111,109,109,111,110,116, +111,32,114,101,102,101,114,32,116,111,98,117,116,32,116,104,105,115,32,105,115, +99,111,110,115,101,99,117,116,105,118,101,116,101,109,112,111,114,97,114,105,108 +,121,73,110,32,103,101,110,101,114,97,108,44,99,111,110,118,101,110,116,105,111, +110,115,116,97,107,101,115,32,112,108,97,99,101,115,117,98,100,105,118,105,115, +105,111,110,116,101,114,114,105,116,111,114,105,97,108,111,112,101,114,97,116, +105,111,110,97,108,112,101,114,109,97,110,101,110,116,108,121,119,97,115,32,108, +97,114,103,101,108,121,111,117,116,98,114,101,97,107,32,111,102,105,110,32,116, +104,101,32,112,97,115,116,102,111,108,108,111,119,105,110,103,32,97,32,120,109, +108,110,115,58,111,103,61,34,62,60,97,32,99,108,97,115,115,61,34,99,108,97,115, +115,61,34,116,101,120,116,67,111,110,118,101,114,115,105,111,110,32,109,97,121, +32,98,101,32,117,115,101,100,109,97,110,117,102,97,99,116,117,114,101,97,102,116 +,101,114,32,98,101,105,110,103,99,108,101,97,114,102,105,120,34,62,10,113,117, +101,115,116,105,111,110,32,111,102,119,97,115,32,101,108,101,99,116,101,100,116, +111,32,98,101,99,111,109,101,32,97,98,101,99,97,117,115,101,32,111,102,32,115, +111,109,101,32,112,101,111,112,108,101,105,110,115,112,105,114,101,100,32,98,121 +,115,117,99,99,101,115,115,102,117,108,32,97,32,116,105,109,101,32,119,104,101, +110,109,111,114,101,32,99,111,109,109,111,110,97,109,111,110,103,115,116,32,116, +104,101,97,110,32,111,102,102,105,99,105,97,108,119,105,100,116,104,58,49,48,48, +37,59,116,101,99,104,110,111,108,111,103,121,44,119,97,115,32,97,100,111,112,116 +,101,100,116,111,32,107,101,101,112,32,116,104,101,115,101,116,116,108,101,109, +101,110,116,115,108,105,118,101,32,98,105,114,116,104,115,105,110,100,101,120,46 +,104,116,109,108,34,67,111,110,110,101,99,116,105,99,117,116,97,115,115,105,103, +110,101,100,32,116,111,38,97,109,112,59,116,105,109,101,115,59,97,99,99,111,117, +110,116,32,102,111,114,97,108,105,103,110,61,114,105,103,104,116,116,104,101,32, +99,111,109,112,97,110,121,97,108,119,97,121,115,32,98,101,101,110,114,101,116, +117,114,110,101,100,32,116,111,105,110,118,111,108,118,101,109,101,110,116,66, +101,99,97,117,115,101,32,116,104,101,116,104,105,115,32,112,101,114,105,111,100, +34,32,110,97,109,101,61,34,113,34,32,99,111,110,102,105,110,101,100,32,116,111, +97,32,114,101,115,117,108,116,32,111,102,118,97,108,117,101,61,34,34,32,47,62, +105,115,32,97,99,116,117,97,108,108,121,69,110,118,105,114,111,110,109,101,110, +116,13,10,60,47,104,101,97,100,62,13,10,67,111,110,118,101,114,115,101,108,121, +44,62,10,60,100,105,118,32,105,100,61,34,48,34,32,119,105,100,116,104,61,34,49, +105,115,32,112,114,111,98,97,98,108,121,104,97,118,101,32,98,101,99,111,109,101, +99,111,110,116,114,111,108,108,105,110,103,116,104,101,32,112,114,111,98,108,101 +,109,99,105,116,105,122,101,110,115,32,111,102,112,111,108,105,116,105,99,105,97 +,110,115,114,101,97,99,104,101,100,32,116,104,101,97,115,32,101,97,114,108,121, +32,97,115,58,110,111,110,101,59,32,111,118,101,114,60,116,97,98,108,101,32,99, +101,108,108,118,97,108,105,100,105,116,121,32,111,102,100,105,114,101,99,116,108 +,121,32,116,111,111,110,109,111,117,115,101,100,111,119,110,119,104,101,114,101, +32,105,116,32,105,115,119,104,101,110,32,105,116,32,119,97,115,109,101,109,98, +101,114,115,32,111,102,32,114,101,108,97,116,105,111,110,32,116,111,97,99,99,111 +,109,109,111,100,97,116,101,97,108,111,110,103,32,119,105,116,104,32,73,110,32, +116,104,101,32,108,97,116,101,116,104,101,32,69,110,103,108,105,115,104,100,101, +108,105,99,105,111,117,115,34,62,116,104,105,115,32,105,115,32,110,111,116,116, +104,101,32,112,114,101,115,101,110,116,105,102,32,116,104,101,121,32,97,114,101, +97,110,100,32,102,105,110,97,108,108,121,97,32,109,97,116,116,101,114,32,111,102 +,13,10,9,60,47,100,105,118,62,13,10,13,10,60,47,115,99,114,105,112,116,62,102,97 +,115,116,101,114,32,116,104,97,110,109,97,106,111,114,105,116,121,32,111,102,97, +102,116,101,114,32,119,104,105,99,104,99,111,109,112,97,114,97,116,105,118,101, +116,111,32,109,97,105,110,116,97,105,110,105,109,112,114,111,118,101,32,116,104, +101,97,119,97,114,100,101,100,32,116,104,101,101,114,34,32,99,108,97,115,115,61, +34,102,114,97,109,101,98,111,114,100,101,114,114,101,115,116,111,114,97,116,105, +111,110,105,110,32,116,104,101,32,115,97,109,101,97,110,97,108,121,115,105,115, +32,111,102,116,104,101,105,114,32,102,105,114,115,116,68,117,114,105,110,103,32, +116,104,101,32,99,111,110,116,105,110,101,110,116,97,108,115,101,113,117,101,110 +,99,101,32,111,102,102,117,110,99,116,105,111,110,40,41,123,102,111,110,116,45, +115,105,122,101,58,32,119,111,114,107,32,111,110,32,116,104,101,60,47,115,99,114 +,105,112,116,62,10,60,98,101,103,105,110,115,32,119,105,116,104,106,97,118,97, +115,99,114,105,112,116,58,99,111,110,115,116,105,116,117,101,110,116,119,97,115, +32,102,111,117,110,100,101,100,101,113,117,105,108,105,98,114,105,117,109,97,115 +,115,117,109,101,32,116,104,97,116,105,115,32,103,105,118,101,110,32,98,121,110, +101,101,100,115,32,116,111,32,98,101,99,111,111,114,100,105,110,97,116,101,115, +116,104,101,32,118,97,114,105,111,117,115,97,114,101,32,112,97,114,116,32,111, +102,111,110,108,121,32,105,110,32,116,104,101,115,101,99,116,105,111,110,115,32, +111,102,105,115,32,97,32,99,111,109,109,111,110,116,104,101,111,114,105,101,115, +32,111,102,100,105,115,99,111,118,101,114,105,101,115,97,115,115,111,99,105,97, +116,105,111,110,101,100,103,101,32,111,102,32,116,104,101,115,116,114,101,110, +103,116,104,32,111,102,112,111,115,105,116,105,111,110,32,105,110,112,114,101, +115,101,110,116,45,100,97,121,117,110,105,118,101,114,115,97,108,108,121,116,111 +,32,102,111,114,109,32,116,104,101,98,117,116,32,105,110,115,116,101,97,100,99, +111,114,112,111,114,97,116,105,111,110,97,116,116,97,99,104,101,100,32,116,111, +105,115,32,99,111,109,109,111,110,108,121,114,101,97,115,111,110,115,32,102,111, +114,32,38,113,117,111,116,59,116,104,101,32,99,97,110,32,98,101,32,109,97,100, +101,119,97,115,32,97,98,108,101,32,116,111,119,104,105,99,104,32,109,101,97,110, +115,98,117,116,32,100,105,100,32,110,111,116,111,110,77,111,117,115,101,79,118, +101,114,97,115,32,112,111,115,115,105,98,108,101,111,112,101,114,97,116,101,100, +32,98,121,99,111,109,105,110,103,32,102,114,111,109,116,104,101,32,112,114,105, +109,97,114,121,97,100,100,105,116,105,111,110,32,111,102,102,111,114,32,115,101, +118,101,114,97,108,116,114,97,110,115,102,101,114,114,101,100,97,32,112,101,114, +105,111,100,32,111,102,97,114,101,32,97,98,108,101,32,116,111,104,111,119,101, +118,101,114,44,32,105,116,115,104,111,117,108,100,32,104,97,118,101,109,117,99, +104,32,108,97,114,103,101,114,10,9,60,47,115,99,114,105,112,116,62,97,100,111, +112,116,101,100,32,116,104,101,112,114,111,112,101,114,116,121,32,111,102,100, +105,114,101,99,116,101,100,32,98,121,101,102,102,101,99,116,105,118,101,108,121, +119,97,115,32,98,114,111,117,103,104,116,99,104,105,108,100,114,101,110,32,111, +102,80,114,111,103,114,97,109,109,105,110,103,108,111,110,103,101,114,32,116,104 +,97,110,109,97,110,117,115,99,114,105,112,116,115,119,97,114,32,97,103,97,105, +110,115,116,98,121,32,109,101,97,110,115,32,111,102,97,110,100,32,109,111,115, +116,32,111,102,115,105,109,105,108,97,114,32,116,111,32,112,114,111,112,114,105, +101,116,97,114,121,111,114,105,103,105,110,97,116,105,110,103,112,114,101,115, +116,105,103,105,111,117,115,103,114,97,109,109,97,116,105,99,97,108,101,120,112, +101,114,105,101,110,99,101,46,116,111,32,109,97,107,101,32,116,104,101,73,116,32 +,119,97,115,32,97,108,115,111,105,115,32,102,111,117,110,100,32,105,110,99,111, +109,112,101,116,105,116,111,114,115,105,110,32,116,104,101,32,85,46,83,46,114, +101,112,108,97,99,101,32,116,104,101,98,114,111,117,103,104,116,32,116,104,101, +99,97,108,99,117,108,97,116,105,111,110,102,97,108,108,32,111,102,32,116,104,101 +,116,104,101,32,103,101,110,101,114,97,108,112,114,97,99,116,105,99,97,108,108, +121,105,110,32,104,111,110,111,114,32,111,102,114,101,108,101,97,115,101,100,32, +105,110,114,101,115,105,100,101,110,116,105,97,108,97,110,100,32,115,111,109,101 +,32,111,102,107,105,110,103,32,111,102,32,116,104,101,114,101,97,99,116,105,111, +110,32,116,111,49,115,116,32,69,97,114,108,32,111,102,99,117,108,116,117,114,101 +,32,97,110,100,112,114,105,110,99,105,112,97,108,108,121,60,47,116,105,116,108, +101,62,10,32,32,116,104,101,121,32,99,97,110,32,98,101,98,97,99,107,32,116,111, +32,116,104,101,115,111,109,101,32,111,102,32,104,105,115,101,120,112,111,115,117 +,114,101,32,116,111,97,114,101,32,115,105,109,105,108,97,114,102,111,114,109,32, +111,102,32,116,104,101,97,100,100,70,97,118,111,114,105,116,101,99,105,116,105, +122,101,110,115,104,105,112,112,97,114,116,32,105,110,32,116,104,101,112,101,111 +,112,108,101,32,119,105,116,104,105,110,32,112,114,97,99,116,105,99,101,116,111, +32,99,111,110,116,105,110,117,101,38,97,109,112,59,109,105,110,117,115,59,97,112 +,112,114,111,118,101,100,32,98,121,32,116,104,101,32,102,105,114,115,116,32,97, +108,108,111,119,101,100,32,116,104,101,97,110,100,32,102,111,114,32,116,104,101, +102,117,110,99,116,105,111,110,105,110,103,112,108,97,121,105,110,103,32,116,104 +,101,115,111,108,117,116,105,111,110,32,116,111,104,101,105,103,104,116,61,34,48 +,34,32,105,110,32,104,105,115,32,98,111,111,107,109,111,114,101,32,116,104,97, +110,32,97,102,111,108,108,111,119,115,32,116,104,101,99,114,101,97,116,101,100, +32,116,104,101,112,114,101,115,101,110,99,101,32,105,110,38,110,98,115,112,59,60 +,47,116,100,62,110,97,116,105,111,110,97,108,105,115,116,116,104,101,32,105,100, +101,97,32,111,102,97,32,99,104,97,114,97,99,116,101,114,119,101,114,101,32,102, +111,114,99,101,100,32,99,108,97,115,115,61,34,98,116,110,100,97,121,115,32,111, +102,32,116,104,101,102,101,97,116,117,114,101,100,32,105,110,115,104,111,119,105 +,110,103,32,116,104,101,105,110,116,101,114,101,115,116,32,105,110,105,110,32, +112,108,97,99,101,32,111,102,116,117,114,110,32,111,102,32,116,104,101,116,104, +101,32,104,101,97,100,32,111,102,76,111,114,100,32,111,102,32,116,104,101,112, +111,108,105,116,105,99,97,108,108,121,104,97,115,32,105,116,115,32,111,119,110, +69,100,117,99,97,116,105,111,110,97,108,97,112,112,114,111,118,97,108,32,111,102 +,115,111,109,101,32,111,102,32,116,104,101,101,97,99,104,32,111,116,104,101,114, +44,98,101,104,97,118,105,111,114,32,111,102,97,110,100,32,98,101,99,97,117,115, +101,97,110,100,32,97,110,111,116,104,101,114,97,112,112,101,97,114,101,100,32, +111,110,114,101,99,111,114,100,101,100,32,105,110,98,108,97,99,107,38,113,117, +111,116,59,109,97,121,32,105,110,99,108,117,100,101,116,104,101,32,119,111,114, +108,100,39,115,99,97,110,32,108,101,97,100,32,116,111,114,101,102,101,114,115,32 +,116,111,32,97,98,111,114,100,101,114,61,34,48,34,32,103,111,118,101,114,110,109 +,101,110,116,32,119,105,110,110,105,110,103,32,116,104,101,114,101,115,117,108, +116,101,100,32,105,110,32,119,104,105,108,101,32,116,104,101,32,87,97,115,104, +105,110,103,116,111,110,44,116,104,101,32,115,117,98,106,101,99,116,99,105,116, +121,32,105,110,32,116,104,101,62,60,47,100,105,118,62,13,10,9,9,114,101,102,108, +101,99,116,32,116,104,101,116,111,32,99,111,109,112,108,101,116,101,98,101,99,97 +,109,101,32,109,111,114,101,114,97,100,105,111,97,99,116,105,118,101,114,101,106 +,101,99,116,101,100,32,98,121,119,105,116,104,111,117,116,32,97,110,121,104,105, +115,32,102,97,116,104,101,114,44,119,104,105,99,104,32,99,111,117,108,100,99,111 +,112,121,32,111,102,32,116,104,101,116,111,32,105,110,100,105,99,97,116,101,97, +32,112,111,108,105,116,105,99,97,108,97,99,99,111,117,110,116,115,32,111,102,99, +111,110,115,116,105,116,117,116,101,115,119,111,114,107,101,100,32,119,105,116, +104,101,114,60,47,97,62,60,47,108,105,62,111,102,32,104,105,115,32,108,105,102, +101,97,99,99,111,109,112,97,110,105,101,100,99,108,105,101,110,116,87,105,100, +116,104,112,114,101,118,101,110,116,32,116,104,101,76,101,103,105,115,108,97,116 +,105,118,101,100,105,102,102,101,114,101,110,116,108,121,116,111,103,101,116,104 +,101,114,32,105,110,104,97,115,32,115,101,118,101,114,97,108,102,111,114,32,97, +110,111,116,104,101,114,116,101,120,116,32,111,102,32,116,104,101,102,111,117, +110,100,101,100,32,116,104,101,101,32,119,105,116,104,32,116,104,101,32,105,115, +32,117,115,101,100,32,102,111,114,99,104,97,110,103,101,100,32,116,104,101,117, +115,117,97,108,108,121,32,116,104,101,112,108,97,99,101,32,119,104,101,114,101, +119,104,101,114,101,97,115,32,116,104,101,62,32,60,97,32,104,114,101,102,61,34, +34,62,60,97,32,104,114,101,102,61,34,116,104,101,109,115,101,108,118,101,115,44, +97,108,116,104,111,117,103,104,32,104,101,116,104,97,116,32,99,97,110,32,98,101, +116,114,97,100,105,116,105,111,110,97,108,114,111,108,101,32,111,102,32,116,104, +101,97,115,32,97,32,114,101,115,117,108,116,114,101,109,111,118,101,67,104,105, +108,100,100,101,115,105,103,110,101,100,32,98,121,119,101,115,116,32,111,102,32, +116,104,101,83,111,109,101,32,112,101,111,112,108,101,112,114,111,100,117,99,116 +,105,111,110,44,115,105,100,101,32,111,102,32,116,104,101,110,101,119,115,108, +101,116,116,101,114,115,117,115,101,100,32,98,121,32,116,104,101,100,111,119,110 +,32,116,111,32,116,104,101,97,99,99,101,112,116,101,100,32,98,121,108,105,118, +101,32,105,110,32,116,104,101,97,116,116,101,109,112,116,115,32,116,111,111,117, +116,115,105,100,101,32,116,104,101,102,114,101,113,117,101,110,99,105,101,115,72 +,111,119,101,118,101,114,44,32,105,110,112,114,111,103,114,97,109,109,101,114, +115,97,116,32,108,101,97,115,116,32,105,110,97,112,112,114,111,120,105,109,97, +116,101,97,108,116,104,111,117,103,104,32,105,116,119,97,115,32,112,97,114,116, +32,111,102,97,110,100,32,118,97,114,105,111,117,115,71,111,118,101,114,110,111, +114,32,111,102,116,104,101,32,97,114,116,105,99,108,101,116,117,114,110,101,100, +32,105,110,116,111,62,60,97,32,104,114,101,102,61,34,47,116,104,101,32,101,99, +111,110,111,109,121,105,115,32,116,104,101,32,109,111,115,116,109,111,115,116,32 +,119,105,100,101,108,121,119,111,117,108,100,32,108,97,116,101,114,97,110,100,32 +,112,101,114,104,97,112,115,114,105,115,101,32,116,111,32,116,104,101,111,99,99, +117,114,115,32,119,104,101,110,117,110,100,101,114,32,119,104,105,99,104,99,111, +110,100,105,116,105,111,110,115,46,116,104,101,32,119,101,115,116,101,114,110, +116,104,101,111,114,121,32,116,104,97,116,105,115,32,112,114,111,100,117,99,101, +100,116,104,101,32,99,105,116,121,32,111,102,105,110,32,119,104,105,99,104,32, +104,101,115,101,101,110,32,105,110,32,116,104,101,116,104,101,32,99,101,110,116, +114,97,108,98,117,105,108,100,105,110,103,32,111,102,109,97,110,121,32,111,102, +32,104,105,115,97,114,101,97,32,111,102,32,116,104,101,105,115,32,116,104,101,32 +,111,110,108,121,109,111,115,116,32,111,102,32,116,104,101,109,97,110,121,32,111 +,102,32,116,104,101,116,104,101,32,87,101,115,116,101,114,110,84,104,101,114,101 +,32,105,115,32,110,111,101,120,116,101,110,100,101,100,32,116,111,83,116,97,116, +105,115,116,105,99,97,108,99,111,108,115,112,97,110,61,50,32,124,115,104,111,114 +,116,32,115,116,111,114,121,112,111,115,115,105,98,108,101,32,116,111,116,111, +112,111,108,111,103,105,99,97,108,99,114,105,116,105,99,97,108,32,111,102,114, +101,112,111,114,116,101,100,32,116,111,97,32,67,104,114,105,115,116,105,97,110, +100,101,99,105,115,105,111,110,32,116,111,105,115,32,101,113,117,97,108,32,116, +111,112,114,111,98,108,101,109,115,32,111,102,84,104,105,115,32,99,97,110,32,98, +101,109,101,114,99,104,97,110,100,105,115,101,102,111,114,32,109,111,115,116,32, +111,102,110,111,32,101,118,105,100,101,110,99,101,101,100,105,116,105,111,110, +115,32,111,102,101,108,101,109,101,110,116,115,32,105,110,38,113,117,111,116,59, +46,32,84,104,101,99,111,109,47,105,109,97,103,101,115,47,119,104,105,99,104,32, +109,97,107,101,115,116,104,101,32,112,114,111,99,101,115,115,114,101,109,97,105, +110,115,32,116,104,101,108,105,116,101,114,97,116,117,114,101,44,105,115,32,97, +32,109,101,109,98,101,114,116,104,101,32,112,111,112,117,108,97,114,116,104,101, +32,97,110,99,105,101,110,116,112,114,111,98,108,101,109,115,32,105,110,116,105, +109,101,32,111,102,32,116,104,101,100,101,102,101,97,116,101,100,32,98,121,98, +111,100,121,32,111,102,32,116,104,101,97,32,102,101,119,32,121,101,97,114,115, +109,117,99,104,32,111,102,32,116,104,101,116,104,101,32,119,111,114,107,32,111, +102,67,97,108,105,102,111,114,110,105,97,44,115,101,114,118,101,100,32,97,115,32 +,97,103,111,118,101,114,110,109,101,110,116,46,99,111,110,99,101,112,116,115,32, +111,102,109,111,118,101,109,101,110,116,32,105,110,9,9,60,100,105,118,32,105,100 +,61,34,105,116,34,32,118,97,108,117,101,61,34,108,97,110,103,117,97,103,101,32, +111,102,97,115,32,116,104,101,121,32,97,114,101,112,114,111,100,117,99,101,100, +32,105,110,105,115,32,116,104,97,116,32,116,104,101,101,120,112,108,97,105,110, +32,116,104,101,100,105,118,62,60,47,100,105,118,62,10,72,111,119,101,118,101,114 +,32,116,104,101,108,101,97,100,32,116,111,32,116,104,101,9,60,97,32,104,114,101, +102,61,34,47,119,97,115,32,103,114,97,110,116,101,100,112,101,111,112,108,101,32 +,104,97,118,101,99,111,110,116,105,110,117,97,108,108,121,119,97,115,32,115,101, +101,110,32,97,115,97,110,100,32,114,101,108,97,116,101,100,116,104,101,32,114, +111,108,101,32,111,102,112,114,111,112,111,115,101,100,32,98,121,111,102,32,116, +104,101,32,98,101,115,116,101,97,99,104,32,111,116,104,101,114,46,67,111,110,115 +,116,97,110,116,105,110,101,112,101,111,112,108,101,32,102,114,111,109,100,105, +97,108,101,99,116,115,32,111,102,116,111,32,114,101,118,105,115,105,111,110,119, +97,115,32,114,101,110,97,109,101,100,97,32,115,111,117,114,99,101,32,111,102,116 +,104,101,32,105,110,105,116,105,97,108,108,97,117,110,99,104,101,100,32,105,110, +112,114,111,118,105,100,101,32,116,104,101,116,111,32,116,104,101,32,119,101,115 +,116,119,104,101,114,101,32,116,104,101,114,101,97,110,100,32,115,105,109,105, +108,97,114,98,101,116,119,101,101,110,32,116,119,111,105,115,32,97,108,115,111, +32,116,104,101,69,110,103,108,105,115,104,32,97,110,100,99,111,110,100,105,116, +105,111,110,115,44,116,104,97,116,32,105,116,32,119,97,115,101,110,116,105,116, +108,101,100,32,116,111,116,104,101,109,115,101,108,118,101,115,46,113,117,97,110 +,116,105,116,121,32,111,102,114,97,110,115,112,97,114,101,110,99,121,116,104,101 +,32,115,97,109,101,32,97,115,116,111,32,106,111,105,110,32,116,104,101,99,111, +117,110,116,114,121,32,97,110,100,116,104,105,115,32,105,115,32,116,104,101,84, +104,105,115,32,108,101,100,32,116,111,97,32,115,116,97,116,101,109,101,110,116, +99,111,110,116,114,97,115,116,32,116,111,108,97,115,116,73,110,100,101,120,79, +102,116,104,114,111,117,103,104,32,104,105,115,105,115,32,100,101,115,105,103, +110,101,100,116,104,101,32,116,101,114,109,32,105,115,105,115,32,112,114,111,118 +,105,100,101,100,112,114,111,116,101,99,116,32,116,104,101,110,103,60,47,97,62, +60,47,108,105,62,84,104,101,32,99,117,114,114,101,110,116,116,104,101,32,115,105 +,116,101,32,111,102,115,117,98,115,116,97,110,116,105,97,108,101,120,112,101,114 +,105,101,110,99,101,44,105,110,32,116,104,101,32,87,101,115,116,116,104,101,121, +32,115,104,111,117,108,100,115,108,111,118,101,110,196,141,105,110,97,99,111,109 +,101,110,116,97,114,105,111,115,117,110,105,118,101,114,115,105,100,97,100,99, +111,110,100,105,99,105,111,110,101,115,97,99,116,105,118,105,100,97,100,101,115, +101,120,112,101,114,105,101,110,99,105,97,116,101,99,110,111,108,111,103,195,173 +,97,112,114,111,100,117,99,99,105,195,179,110,112,117,110,116,117,97,99,105,195, +179,110,97,112,108,105,99,97,99,105,195,179,110,99,111,110,116,114,97,115,101, +195,177,97,99,97,116,101,103,111,114,195,173,97,115,114,101,103,105,115,116,114, +97,114,115,101,112,114,111,102,101,115,105,111,110,97,108,116,114,97,116,97,109, +105,101,110,116,111,114,101,103,195,173,115,116,114,97,116,101,115,101,99,114, +101,116,97,114,195,173,97,112,114,105,110,99,105,112,97,108,101,115,112,114,111, +116,101,99,99,105,195,179,110,105,109,112,111,114,116,97,110,116,101,115,105,109 +,112,111,114,116,97,110,99,105,97,112,111,115,105,98,105,108,105,100,97,100,105, +110,116,101,114,101,115,97,110,116,101,99,114,101,99,105,109,105,101,110,116,111 +,110,101,99,101,115,105,100,97,100,101,115,115,117,115,99,114,105,98,105,114,115 +,101,97,115,111,99,105,97,99,105,195,179,110,100,105,115,112,111,110,105,98,108, +101,115,101,118,97,108,117,97,99,105,195,179,110,101,115,116,117,100,105,97,110, +116,101,115,114,101,115,112,111,110,115,97,98,108,101,114,101,115,111,108,117,99 +,105,195,179,110,103,117,97,100,97,108,97,106,97,114,97,114,101,103,105,115,116, +114,97,100,111,115,111,112,111,114,116,117,110,105,100,97,100,99,111,109,101,114 +,99,105,97,108,101,115,102,111,116,111,103,114,97,102,195,173,97,97,117,116,111, +114,105,100,97,100,101,115,105,110,103,101,110,105,101,114,195,173,97,116,101, +108,101,118,105,115,105,195,179,110,99,111,109,112,101,116,101,110,99,105,97,111 +,112,101,114,97,99,105,111,110,101,115,101,115,116,97,98,108,101,99,105,100,111, +115,105,109,112,108,101,109,101,110,116,101,97,99,116,117,97,108,109,101,110,116 +,101,110,97,118,101,103,97,99,105,195,179,110,99,111,110,102,111,114,109,105,100 +,97,100,108,105,110,101,45,104,101,105,103,104,116,58,102,111,110,116,45,102,97, +109,105,108,121,58,34,32,58,32,34,104,116,116,112,58,47,47,97,112,112,108,105,99 +,97,116,105,111,110,115,108,105,110,107,34,32,104,114,101,102,61,34,115,112,101, +99,105,102,105,99,97,108,108,121,47,47,60,33,91,67,68,65,84,65,91,10,79,114,103, +97,110,105,122,97,116,105,111,110,100,105,115,116,114,105,98,117,116,105,111,110 +,48,112,120,59,32,104,101,105,103,104,116,58,114,101,108,97,116,105,111,110,115, +104,105,112,100,101,118,105,99,101,45,119,105,100,116,104,60,100,105,118,32,99, +108,97,115,115,61,34,60,108,97,98,101,108,32,102,111,114,61,34,114,101,103,105, +115,116,114,97,116,105,111,110,60,47,110,111,115,99,114,105,112,116,62,10,47,105 +,110,100,101,120,46,104,116,109,108,34,119,105,110,100,111,119,46,111,112,101, +110,40,32,33,105,109,112,111,114,116,97,110,116,59,97,112,112,108,105,99,97,116, +105,111,110,47,105,110,100,101,112,101,110,100,101,110,99,101,47,47,119,119,119, +46,103,111,111,103,108,101,111,114,103,97,110,105,122,97,116,105,111,110,97,117, +116,111,99,111,109,112,108,101,116,101,114,101,113,117,105,114,101,109,101,110, +116,115,99,111,110,115,101,114,118,97,116,105,118,101,60,102,111,114,109,32,110, +97,109,101,61,34,105,110,116,101,108,108,101,99,116,117,97,108,109,97,114,103, +105,110,45,108,101,102,116,58,49,56,116,104,32,99,101,110,116,117,114,121,97,110 +,32,105,109,112,111,114,116,97,110,116,105,110,115,116,105,116,117,116,105,111, +110,115,97,98,98,114,101,118,105,97,116,105,111,110,60,105,109,103,32,99,108,97, +115,115,61,34,111,114,103,97,110,105,115,97,116,105,111,110,99,105,118,105,108, +105,122,97,116,105,111,110,49,57,116,104,32,99,101,110,116,117,114,121,97,114,99 +,104,105,116,101,99,116,117,114,101,105,110,99,111,114,112,111,114,97,116,101, +100,50,48,116,104,32,99,101,110,116,117,114,121,45,99,111,110,116,97,105,110,101 +,114,34,62,109,111,115,116,32,110,111,116,97,98,108,121,47,62,60,47,97,62,60,47, +100,105,118,62,110,111,116,105,102,105,99,97,116,105,111,110,39,117,110,100,101, +102,105,110,101,100,39,41,70,117,114,116,104,101,114,109,111,114,101,44,98,101, +108,105,101,118,101,32,116,104,97,116,105,110,110,101,114,72,84,77,76,32,61,32, +112,114,105,111,114,32,116,111,32,116,104,101,100,114,97,109,97,116,105,99,97, +108,108,121,114,101,102,101,114,114,105,110,103,32,116,111,110,101,103,111,116, +105,97,116,105,111,110,115,104,101,97,100,113,117,97,114,116,101,114,115,83,111, +117,116,104,32,65,102,114,105,99,97,117,110,115,117,99,99,101,115,115,102,117, +108,80,101,110,110,115,121,108,118,97,110,105,97,65,115,32,97,32,114,101,115,117 +,108,116,44,60,104,116,109,108,32,108,97,110,103,61,34,38,108,116,59,47,115,117, +112,38,103,116,59,100,101,97,108,105,110,103,32,119,105,116,104,112,104,105,108, +97,100,101,108,112,104,105,97,104,105,115,116,111,114,105,99,97,108,108,121,41, +59,60,47,115,99,114,105,112,116,62,10,112,97,100,100,105,110,103,45,116,111,112, +58,101,120,112,101,114,105,109,101,110,116,97,108,103,101,116,65,116,116,114,105 +,98,117,116,101,105,110,115,116,114,117,99,116,105,111,110,115,116,101,99,104, +110,111,108,111,103,105,101,115,112,97,114,116,32,111,102,32,116,104,101,32,61, +102,117,110,99,116,105,111,110,40,41,123,115,117,98,115,99,114,105,112,116,105, +111,110,108,46,100,116,100,34,62,13,10,60,104,116,103,101,111,103,114,97,112,104 +,105,99,97,108,67,111,110,115,116,105,116,117,116,105,111,110,39,44,32,102,117, +110,99,116,105,111,110,40,115,117,112,112,111,114,116,101,100,32,98,121,97,103, +114,105,99,117,108,116,117,114,97,108,99,111,110,115,116,114,117,99,116,105,111, +110,112,117,98,108,105,99,97,116,105,111,110,115,102,111,110,116,45,115,105,122, +101,58,32,49,97,32,118,97,114,105,101,116,121,32,111,102,60,100,105,118,32,115, +116,121,108,101,61,34,69,110,99,121,99,108,111,112,101,100,105,97,105,102,114,97 +,109,101,32,115,114,99,61,34,100,101,109,111,110,115,116,114,97,116,101,100,97, +99,99,111,109,112,108,105,115,104,101,100,117,110,105,118,101,114,115,105,116, +105,101,115,68,101,109,111,103,114,97,112,104,105,99,115,41,59,60,47,115,99,114, +105,112,116,62,60,100,101,100,105,99,97,116,101,100,32,116,111,107,110,111,119, +108,101,100,103,101,32,111,102,115,97,116,105,115,102,97,99,116,105,111,110,112, +97,114,116,105,99,117,108,97,114,108,121,60,47,100,105,118,62,60,47,100,105,118, +62,69,110,103,108,105,115,104,32,40,85,83,41,97,112,112,101,110,100,67,104,105, +108,100,40,116,114,97,110,115,109,105,115,115,105,111,110,115,46,32,72,111,119, +101,118,101,114,44,32,105,110,116,101,108,108,105,103,101,110,99,101,34,32,116, +97,98,105,110,100,101,120,61,34,102,108,111,97,116,58,114,105,103,104,116,59,67, +111,109,109,111,110,119,101,97,108,116,104,114,97,110,103,105,110,103,32,102,114 +,111,109,105,110,32,119,104,105,99,104,32,116,104,101,97,116,32,108,101,97,115, +116,32,111,110,101,114,101,112,114,111,100,117,99,116,105,111,110,101,110,99,121 +,99,108,111,112,101,100,105,97,59,102,111,110,116,45,115,105,122,101,58,49,106, +117,114,105,115,100,105,99,116,105,111,110,97,116,32,116,104,97,116,32,116,105, +109,101,34,62,60,97,32,99,108,97,115,115,61,34,73,110,32,97,100,100,105,116,105, +111,110,44,100,101,115,99,114,105,112,116,105,111,110,43,99,111,110,118,101,114, +115,97,116,105,111,110,99,111,110,116,97,99,116,32,119,105,116,104,105,115,32, +103,101,110,101,114,97,108,108,121,114,34,32,99,111,110,116,101,110,116,61,34, +114,101,112,114,101,115,101,110,116,105,110,103,38,108,116,59,109,97,116,104,38, +103,116,59,112,114,101,115,101,110,116,97,116,105,111,110,111,99,99,97,115,105, +111,110,97,108,108,121,60,105,109,103,32,119,105,100,116,104,61,34,110,97,118, +105,103,97,116,105,111,110,34,62,99,111,109,112,101,110,115,97,116,105,111,110, +99,104,97,109,112,105,111,110,115,104,105,112,109,101,100,105,97,61,34,97,108, +108,34,32,118,105,111,108,97,116,105,111,110,32,111,102,114,101,102,101,114,101, +110,99,101,32,116,111,114,101,116,117,114,110,32,116,114,117,101,59,83,116,114, +105,99,116,47,47,69,78,34,32,116,114,97,110,115,97,99,116,105,111,110,115,105, +110,116,101,114,118,101,110,116,105,111,110,118,101,114,105,102,105,99,97,116, +105,111,110,73,110,102,111,114,109,97,116,105,111,110,32,100,105,102,102,105,99, +117,108,116,105,101,115,67,104,97,109,112,105,111,110,115,104,105,112,99,97,112, +97,98,105,108,105,116,105,101,115,60,33,91,101,110,100,105,102,93,45,45,62,125, +10,60,47,115,99,114,105,112,116,62,10,67,104,114,105,115,116,105,97,110,105,116, +121,102,111,114,32,101,120,97,109,112,108,101,44,80,114,111,102,101,115,115,105, +111,110,97,108,114,101,115,116,114,105,99,116,105,111,110,115,115,117,103,103, +101,115,116,32,116,104,97,116,119,97,115,32,114,101,108,101,97,115,101,100,40, +115,117,99,104,32,97,115,32,116,104,101,114,101,109,111,118,101,67,108,97,115, +115,40,117,110,101,109,112,108,111,121,109,101,110,116,116,104,101,32,65,109,101 +,114,105,99,97,110,115,116,114,117,99,116,117,114,101,32,111,102,47,105,110,100, +101,120,46,104,116,109,108,32,112,117,98,108,105,115,104,101,100,32,105,110,115, +112,97,110,32,99,108,97,115,115,61,34,34,62,60,97,32,104,114,101,102,61,34,47, +105,110,116,114,111,100,117,99,116,105,111,110,98,101,108,111,110,103,105,110, +103,32,116,111,99,108,97,105,109,101,100,32,116,104,97,116,99,111,110,115,101, +113,117,101,110,99,101,115,60,109,101,116,97,32,110,97,109,101,61,34,71,117,105, +100,101,32,116,111,32,116,104,101,111,118,101,114,119,104,101,108,109,105,110, +103,97,103,97,105,110,115,116,32,116,104,101,32,99,111,110,99,101,110,116,114,97 +,116,101,100,44,10,46,110,111,110,116,111,117,99,104,32,111,98,115,101,114,118, +97,116,105,111,110,115,60,47,97,62,10,60,47,100,105,118,62,10,102,32,40,100,111, +99,117,109,101,110,116,46,98,111,114,100,101,114,58,32,49,112,120,32,123,102,111 +,110,116,45,115,105,122,101,58,49,116,114,101,97,116,109,101,110,116,32,111,102, +48,34,32,104,101,105,103,104,116,61,34,49,109,111,100,105,102,105,99,97,116,105, +111,110,73,110,100,101,112,101,110,100,101,110,99,101,100,105,118,105,100,101, +100,32,105,110,116,111,103,114,101,97,116,101,114,32,116,104,97,110,97,99,104, +105,101,118,101,109,101,110,116,115,101,115,116,97,98,108,105,115,104,105,110, +103,74,97,118,97,83,99,114,105,112,116,34,32,110,101,118,101,114,116,104,101,108 +,101,115,115,115,105,103,110,105,102,105,99,97,110,99,101,66,114,111,97,100,99, +97,115,116,105,110,103,62,38,110,98,115,112,59,60,47,116,100,62,99,111,110,116, +97,105,110,101,114,34,62,10,115,117,99,104,32,97,115,32,116,104,101,32,105,110, +102,108,117,101,110,99,101,32,111,102,97,32,112,97,114,116,105,99,117,108,97,114 +,115,114,99,61,39,104,116,116,112,58,47,47,110,97,118,105,103,97,116,105,111,110 +,34,32,104,97,108,102,32,111,102,32,116,104,101,32,115,117,98,115,116,97,110,116 +,105,97,108,32,38,110,98,115,112,59,60,47,100,105,118,62,97,100,118,97,110,116, +97,103,101,32,111,102,100,105,115,99,111,118,101,114,121,32,111,102,102,117,110, +100,97,109,101,110,116,97,108,32,109,101,116,114,111,112,111,108,105,116,97,110, +116,104,101,32,111,112,112,111,115,105,116,101,34,32,120,109,108,58,108,97,110, +103,61,34,100,101,108,105,98,101,114,97,116,101,108,121,97,108,105,103,110,61,99 +,101,110,116,101,114,101,118,111,108,117,116,105,111,110,32,111,102,112,114,101, +115,101,114,118,97,116,105,111,110,105,109,112,114,111,118,101,109,101,110,116, +115,98,101,103,105,110,110,105,110,103,32,105,110,74,101,115,117,115,32,67,104, +114,105,115,116,80,117,98,108,105,99,97,116,105,111,110,115,100,105,115,97,103, +114,101,101,109,101,110,116,116,101,120,116,45,97,108,105,103,110,58,114,44,32, +102,117,110,99,116,105,111,110,40,41,115,105,109,105,108,97,114,105,116,105,101, +115,98,111,100,121,62,60,47,104,116,109,108,62,105,115,32,99,117,114,114,101,110 +,116,108,121,97,108,112,104,97,98,101,116,105,99,97,108,105,115,32,115,111,109, +101,116,105,109,101,115,116,121,112,101,61,34,105,109,97,103,101,47,109,97,110, +121,32,111,102,32,116,104,101,32,102,108,111,119,58,104,105,100,100,101,110,59, +97,118,97,105,108,97,98,108,101,32,105,110,100,101,115,99,114,105,98,101,32,116, +104,101,101,120,105,115,116,101,110,99,101,32,111,102,97,108,108,32,111,118,101, +114,32,116,104,101,116,104,101,32,73,110,116,101,114,110,101,116,9,60,117,108,32 +,99,108,97,115,115,61,34,105,110,115,116,97,108,108,97,116,105,111,110,110,101, +105,103,104,98,111,114,104,111,111,100,97,114,109,101,100,32,102,111,114,99,101, +115,114,101,100,117,99,105,110,103,32,116,104,101,99,111,110,116,105,110,117,101 +,115,32,116,111,78,111,110,101,116,104,101,108,101,115,115,44,116,101,109,112, +101,114,97,116,117,114,101,115,10,9,9,60,97,32,104,114,101,102,61,34,99,108,111, +115,101,32,116,111,32,116,104,101,101,120,97,109,112,108,101,115,32,111,102,32, +105,115,32,97,98,111,117,116,32,116,104,101,40,115,101,101,32,98,101,108,111,119 +,41,46,34,32,105,100,61,34,115,101,97,114,99,104,112,114,111,102,101,115,115,105 +,111,110,97,108,105,115,32,97,118,97,105,108,97,98,108,101,116,104,101,32,111, +102,102,105,99,105,97,108,9,9,60,47,115,99,114,105,112,116,62,10,10,9,9,60,100, +105,118,32,105,100,61,34,97,99,99,101,108,101,114,97,116,105,111,110,116,104,114 +,111,117,103,104,32,116,104,101,32,72,97,108,108,32,111,102,32,70,97,109,101,100 +,101,115,99,114,105,112,116,105,111,110,115,116,114,97,110,115,108,97,116,105, +111,110,115,105,110,116,101,114,102,101,114,101,110,99,101,32,116,121,112,101,61 +,39,116,101,120,116,47,114,101,99,101,110,116,32,121,101,97,114,115,105,110,32, +116,104,101,32,119,111,114,108,100,118,101,114,121,32,112,111,112,117,108,97,114 +,123,98,97,99,107,103,114,111,117,110,100,58,116,114,97,100,105,116,105,111,110, +97,108,32,115,111,109,101,32,111,102,32,116,104,101,32,99,111,110,110,101,99,116 +,101,100,32,116,111,101,120,112,108,111,105,116,97,116,105,111,110,101,109,101, +114,103,101,110,99,101,32,111,102,99,111,110,115,116,105,116,117,116,105,111,110 +,65,32,72,105,115,116,111,114,121,32,111,102,115,105,103,110,105,102,105,99,97, +110,116,32,109,97,110,117,102,97,99,116,117,114,101,100,101,120,112,101,99,116, +97,116,105,111,110,115,62,60,110,111,115,99,114,105,112,116,62,60,99,97,110,32, +98,101,32,102,111,117,110,100,98,101,99,97,117,115,101,32,116,104,101,32,104,97, +115,32,110,111,116,32,98,101,101,110,110,101,105,103,104,98,111,117,114,105,110, +103,119,105,116,104,111,117,116,32,116,104,101,32,97,100,100,101,100,32,116,111, +32,116,104,101,9,60,108,105,32,99,108,97,115,115,61,34,105,110,115,116,114,117, +109,101,110,116,97,108,83,111,118,105,101,116,32,85,110,105,111,110,97,99,107, +110,111,119,108,101,100,103,101,100,119,104,105,99,104,32,99,97,110,32,98,101, +110,97,109,101,32,102,111,114,32,116,104,101,97,116,116,101,110,116,105,111,110, +32,116,111,97,116,116,101,109,112,116,115,32,116,111,32,100,101,118,101,108,111, +112,109,101,110,116,115,73,110,32,102,97,99,116,44,32,116,104,101,60,108,105,32, +99,108,97,115,115,61,34,97,105,109,112,108,105,99,97,116,105,111,110,115,115,117 +,105,116,97,98,108,101,32,102,111,114,109,117,99,104,32,111,102,32,116,104,101, +32,99,111,108,111,110,105,122,97,116,105,111,110,112,114,101,115,105,100,101,110 +,116,105,97,108,99,97,110,99,101,108,66,117,98,98,108,101,32,73,110,102,111,114, +109,97,116,105,111,110,109,111,115,116,32,111,102,32,116,104,101,32,105,115,32, +100,101,115,99,114,105,98,101,100,114,101,115,116,32,111,102,32,116,104,101,32, +109,111,114,101,32,111,114,32,108,101,115,115,105,110,32,83,101,112,116,101,109, +98,101,114,73,110,116,101,108,108,105,103,101,110,99,101,115,114,99,61,34,104, +116,116,112,58,47,47,112,120,59,32,104,101,105,103,104,116,58,32,97,118,97,105, +108,97,98,108,101,32,116,111,109,97,110,117,102,97,99,116,117,114,101,114,104, +117,109,97,110,32,114,105,103,104,116,115,108,105,110,107,32,104,114,101,102,61, +34,47,97,118,97,105,108,97,98,105,108,105,116,121,112,114,111,112,111,114,116, +105,111,110,97,108,111,117,116,115,105,100,101,32,116,104,101,32,97,115,116,114, +111,110,111,109,105,99,97,108,104,117,109,97,110,32,98,101,105,110,103,115,110, +97,109,101,32,111,102,32,116,104,101,32,97,114,101,32,102,111,117,110,100,32,105 +,110,97,114,101,32,98,97,115,101,100,32,111,110,115,109,97,108,108,101,114,32, +116,104,97,110,97,32,112,101,114,115,111,110,32,119,104,111,101,120,112,97,110, +115,105,111,110,32,111,102,97,114,103,117,105,110,103,32,116,104,97,116,110,111, +119,32,107,110,111,119,110,32,97,115,73,110,32,116,104,101,32,101,97,114,108,121 +,105,110,116,101,114,109,101,100,105,97,116,101,100,101,114,105,118,101,100,32, +102,114,111,109,83,99,97,110,100,105,110,97,118,105,97,110,60,47,97,62,60,47,100 +,105,118,62,13,10,99,111,110,115,105,100,101,114,32,116,104,101,97,110,32,101, +115,116,105,109,97,116,101,100,116,104,101,32,78,97,116,105,111,110,97,108,60, +100,105,118,32,105,100,61,34,112,97,103,114,101,115,117,108,116,105,110,103,32, +105,110,99,111,109,109,105,115,115,105,111,110,101,100,97,110,97,108,111,103,111 +,117,115,32,116,111,97,114,101,32,114,101,113,117,105,114,101,100,47,117,108,62, +10,60,47,100,105,118,62,10,119,97,115,32,98,97,115,101,100,32,111,110,97,110,100 +,32,98,101,99,97,109,101,32,97,38,110,98,115,112,59,38,110,98,115,112,59,116,34, +32,118,97,108,117,101,61,34,34,32,119,97,115,32,99,97,112,116,117,114,101,100, +110,111,32,109,111,114,101,32,116,104,97,110,114,101,115,112,101,99,116,105,118, +101,108,121,99,111,110,116,105,110,117,101,32,116,111,32,62,13,10,60,104,101,97, +100,62,13,10,60,119,101,114,101,32,99,114,101,97,116,101,100,109,111,114,101,32, +103,101,110,101,114,97,108,105,110,102,111,114,109,97,116,105,111,110,32,117,115 +,101,100,32,102,111,114,32,116,104,101,105,110,100,101,112,101,110,100,101,110, +116,32,116,104,101,32,73,109,112,101,114,105,97,108,99,111,109,112,111,110,101, +110,116,32,111,102,116,111,32,116,104,101,32,110,111,114,116,104,105,110,99,108, +117,100,101,32,116,104,101,32,67,111,110,115,116,114,117,99,116,105,111,110,115, +105,100,101,32,111,102,32,116,104,101,32,119,111,117,108,100,32,110,111,116,32, +98,101,102,111,114,32,105,110,115,116,97,110,99,101,105,110,118,101,110,116,105, +111,110,32,111,102,109,111,114,101,32,99,111,109,112,108,101,120,99,111,108,108, +101,99,116,105,118,101,108,121,98,97,99,107,103,114,111,117,110,100,58,32,116, +101,120,116,45,97,108,105,103,110,58,32,105,116,115,32,111,114,105,103,105,110, +97,108,105,110,116,111,32,97,99,99,111,117,110,116,116,104,105,115,32,112,114, +111,99,101,115,115,97,110,32,101,120,116,101,110,115,105,118,101,104,111,119,101 +,118,101,114,44,32,116,104,101,116,104,101,121,32,97,114,101,32,110,111,116,114, +101,106,101,99,116,101,100,32,116,104,101,99,114,105,116,105,99,105,115,109,32, +111,102,100,117,114,105,110,103,32,119,104,105,99,104,112,114,111,98,97,98,108, +121,32,116,104,101,116,104,105,115,32,97,114,116,105,99,108,101,40,102,117,110, +99,116,105,111,110,40,41,123,73,116,32,115,104,111,117,108,100,32,98,101,97,110, +32,97,103,114,101,101,109,101,110,116,97,99,99,105,100,101,110,116,97,108,108, +121,100,105,102,102,101,114,115,32,102,114,111,109,65,114,99,104,105,116,101,99, +116,117,114,101,98,101,116,116,101,114,32,107,110,111,119,110,97,114,114,97,110, +103,101,109,101,110,116,115,105,110,102,108,117,101,110,99,101,32,111,110,97,116 +,116,101,110,100,101,100,32,116,104,101,105,100,101,110,116,105,99,97,108,32,116 +,111,115,111,117,116,104,32,111,102,32,116,104,101,112,97,115,115,32,116,104,114 +,111,117,103,104,120,109,108,34,32,116,105,116,108,101,61,34,119,101,105,103,104 +,116,58,98,111,108,100,59,99,114,101,97,116,105,110,103,32,116,104,101,100,105, +115,112,108,97,121,58,110,111,110,101,114,101,112,108,97,99,101,100,32,116,104, +101,60,105,109,103,32,115,114,99,61,34,47,105,104,116,116,112,115,58,47,47,119, +119,119,46,87,111,114,108,100,32,87,97,114,32,73,73,116,101,115,116,105,109,111, +110,105,97,108,115,102,111,117,110,100,32,105,110,32,116,104,101,114,101,113,117 +,105,114,101,100,32,116,111,32,97,110,100,32,116,104,97,116,32,116,104,101,98, +101,116,119,101,101,110,32,116,104,101,32,119,97,115,32,100,101,115,105,103,110, +101,100,99,111,110,115,105,115,116,115,32,111,102,32,99,111,110,115,105,100,101, +114,97,98,108,121,112,117,98,108,105,115,104,101,100,32,98,121,116,104,101,32, +108,97,110,103,117,97,103,101,67,111,110,115,101,114,118,97,116,105,111,110,99, +111,110,115,105,115,116,101,100,32,111,102,114,101,102,101,114,32,116,111,32,116 +,104,101,98,97,99,107,32,116,111,32,116,104,101,32,99,115,115,34,32,109,101,100, +105,97,61,34,80,101,111,112,108,101,32,102,114,111,109,32,97,118,97,105,108,97, +98,108,101,32,111,110,112,114,111,118,101,100,32,116,111,32,98,101,115,117,103, +103,101,115,116,105,111,110,115,34,119,97,115,32,107,110,111,119,110,32,97,115, +118,97,114,105,101,116,105,101,115,32,111,102,108,105,107,101,108,121,32,116,111 +,32,98,101,99,111,109,112,114,105,115,101,100,32,111,102,115,117,112,112,111,114 +,116,32,116,104,101,32,104,97,110,100,115,32,111,102,32,116,104,101,99,111,117, +112,108,101,100,32,119,105,116,104,99,111,110,110,101,99,116,32,97,110,100,32,98 +,111,114,100,101,114,58,110,111,110,101,59,112,101,114,102,111,114,109,97,110,99 +,101,115,98,101,102,111,114,101,32,98,101,105,110,103,108,97,116,101,114,32,98, +101,99,97,109,101,99,97,108,99,117,108,97,116,105,111,110,115,111,102,116,101, +110,32,99,97,108,108,101,100,114,101,115,105,100,101,110,116,115,32,111,102,109, +101,97,110,105,110,103,32,116,104,97,116,62,60,108,105,32,99,108,97,115,115,61, +34,101,118,105,100,101,110,99,101,32,102,111,114,101,120,112,108,97,110,97,116, +105,111,110,115,101,110,118,105,114,111,110,109,101,110,116,115,34,62,60,47,97, +62,60,47,100,105,118,62,119,104,105,99,104,32,97,108,108,111,119,115,73,110,116, +114,111,100,117,99,116,105,111,110,100,101,118,101,108,111,112,101,100,32,98,121 +,97,32,119,105,100,101,32,114,97,110,103,101,111,110,32,98,101,104,97,108,102,32 +,111,102,118,97,108,105,103,110,61,34,116,111,112,34,112,114,105,110,99,105,112, +108,101,32,111,102,97,116,32,116,104,101,32,116,105,109,101,44,60,47,110,111,115 +,99,114,105,112,116,62,13,115,97,105,100,32,116,111,32,104,97,118,101,105,110,32 +,116,104,101,32,102,105,114,115,116,119,104,105,108,101,32,111,116,104,101,114, +115,104,121,112,111,116,104,101,116,105,99,97,108,112,104,105,108,111,115,111, +112,104,101,114,115,112,111,119,101,114,32,111,102,32,116,104,101,99,111,110,116 +,97,105,110,101,100,32,105,110,112,101,114,102,111,114,109,101,100,32,98,121,105 +,110,97,98,105,108,105,116,121,32,116,111,119,101,114,101,32,119,114,105,116,116 +,101,110,115,112,97,110,32,115,116,121,108,101,61,34,105,110,112,117,116,32,110, +97,109,101,61,34,116,104,101,32,113,117,101,115,116,105,111,110,105,110,116,101, +110,100,101,100,32,102,111,114,114,101,106,101,99,116,105,111,110,32,111,102,105 +,109,112,108,105,101,115,32,116,104,97,116,105,110,118,101,110,116,101,100,32, +116,104,101,116,104,101,32,115,116,97,110,100,97,114,100,119,97,115,32,112,114, +111,98,97,98,108,121,108,105,110,107,32,98,101,116,119,101,101,110,112,114,111, +102,101,115,115,111,114,32,111,102,105,110,116,101,114,97,99,116,105,111,110,115 +,99,104,97,110,103,105,110,103,32,116,104,101,73,110,100,105,97,110,32,79,99,101 +,97,110,32,99,108,97,115,115,61,34,108,97,115,116,119,111,114,107,105,110,103,32 +,119,105,116,104,39,104,116,116,112,58,47,47,119,119,119,46,121,101,97,114,115, +32,98,101,102,111,114,101,84,104,105,115,32,119,97,115,32,116,104,101,114,101,99 +,114,101,97,116,105,111,110,97,108,101,110,116,101,114,105,110,103,32,116,104, +101,109,101,97,115,117,114,101,109,101,110,116,115,97,110,32,101,120,116,114,101 +,109,101,108,121,118,97,108,117,101,32,111,102,32,116,104,101,115,116,97,114,116 +,32,111,102,32,116,104,101,10,60,47,115,99,114,105,112,116,62,10,10,97,110,32, +101,102,102,111,114,116,32,116,111,105,110,99,114,101,97,115,101,32,116,104,101, +116,111,32,116,104,101,32,115,111,117,116,104,115,112,97,99,105,110,103,61,34,48 +,34,62,115,117,102,102,105,99,105,101,110,116,108,121,116,104,101,32,69,117,114, +111,112,101,97,110,99,111,110,118,101,114,116,101,100,32,116,111,99,108,101,97, +114,84,105,109,101,111,117,116,100,105,100,32,110,111,116,32,104,97,118,101,99, +111,110,115,101,113,117,101,110,116,108,121,102,111,114,32,116,104,101,32,110, +101,120,116,101,120,116,101,110,115,105,111,110,32,111,102,101,99,111,110,111, +109,105,99,32,97,110,100,97,108,116,104,111,117,103,104,32,116,104,101,97,114, +101,32,112,114,111,100,117,99,101,100,97,110,100,32,119,105,116,104,32,116,104, +101,105,110,115,117,102,102,105,99,105,101,110,116,103,105,118,101,110,32,98,121 +,32,116,104,101,115,116,97,116,105,110,103,32,116,104,97,116,101,120,112,101,110 +,100,105,116,117,114,101,115,60,47,115,112,97,110,62,60,47,97,62,10,116,104,111, +117,103,104,116,32,116,104,97,116,111,110,32,116,104,101,32,98,97,115,105,115,99 +,101,108,108,112,97,100,100,105,110,103,61,105,109,97,103,101,32,111,102,32,116, +104,101,114,101,116,117,114,110,105,110,103,32,116,111,105,110,102,111,114,109, +97,116,105,111,110,44,115,101,112,97,114,97,116,101,100,32,98,121,97,115,115,97, +115,115,105,110,97,116,101,100,115,34,32,99,111,110,116,101,110,116,61,34,97,117 +,116,104,111,114,105,116,121,32,111,102,110,111,114,116,104,119,101,115,116,101, +114,110,60,47,100,105,118,62,10,60,100,105,118,32,34,62,60,47,100,105,118,62,13, +10,32,32,99,111,110,115,117,108,116,97,116,105,111,110,99,111,109,109,117,110, +105,116,121,32,111,102,116,104,101,32,110,97,116,105,111,110,97,108,105,116,32, +115,104,111,117,108,100,32,98,101,112,97,114,116,105,99,105,112,97,110,116,115, +32,97,108,105,103,110,61,34,108,101,102,116,116,104,101,32,103,114,101,97,116, +101,115,116,115,101,108,101,99,116,105,111,110,32,111,102,115,117,112,101,114, +110,97,116,117,114,97,108,100,101,112,101,110,100,101,110,116,32,111,110,105,115 +,32,109,101,110,116,105,111,110,101,100,97,108,108,111,119,105,110,103,32,116, +104,101,119,97,115,32,105,110,118,101,110,116,101,100,97,99,99,111,109,112,97, +110,121,105,110,103,104,105,115,32,112,101,114,115,111,110,97,108,97,118,97,105, +108,97,98,108,101,32,97,116,115,116,117,100,121,32,111,102,32,116,104,101,111, +110,32,116,104,101,32,111,116,104,101,114,101,120,101,99,117,116,105,111,110,32, +111,102,72,117,109,97,110,32,82,105,103,104,116,115,116,101,114,109,115,32,111, +102,32,116,104,101,97,115,115,111,99,105,97,116,105,111,110,115,114,101,115,101, +97,114,99,104,32,97,110,100,115,117,99,99,101,101,100,101,100,32,98,121,100,101, +102,101,97,116,101,100,32,116,104,101,97,110,100,32,102,114,111,109,32,116,104, +101,98,117,116,32,116,104,101,121,32,97,114,101,99,111,109,109,97,110,100,101, +114,32,111,102,115,116,97,116,101,32,111,102,32,116,104,101,121,101,97,114,115, +32,111,102,32,97,103,101,116,104,101,32,115,116,117,100,121,32,111,102,60,117, +108,32,99,108,97,115,115,61,34,115,112,108,97,99,101,32,105,110,32,116,104,101, +119,104,101,114,101,32,104,101,32,119,97,115,60,108,105,32,99,108,97,115,115,61, +34,102,116,104,101,114,101,32,97,114,101,32,110,111,119,104,105,99,104,32,98,101 +,99,97,109,101,104,101,32,112,117,98,108,105,115,104,101,100,101,120,112,114,101 +,115,115,101,100,32,105,110,116,111,32,119,104,105,99,104,32,116,104,101,99,111, +109,109,105,115,115,105,111,110,101,114,102,111,110,116,45,119,101,105,103,104, +116,58,116,101,114,114,105,116,111,114,121,32,111,102,101,120,116,101,110,115, +105,111,110,115,34,62,82,111,109,97,110,32,69,109,112,105,114,101,101,113,117,97 +,108,32,116,111,32,116,104,101,73,110,32,99,111,110,116,114,97,115,116,44,104, +111,119,101,118,101,114,44,32,97,110,100,105,115,32,116,121,112,105,99,97,108, +108,121,97,110,100,32,104,105,115,32,119,105,102,101,40,97,108,115,111,32,99,97, +108,108,101,100,62,60,117,108,32,99,108,97,115,115,61,34,101,102,102,101,99,116, +105,118,101,108,121,32,101,118,111,108,118,101,100,32,105,110,116,111,115,101, +101,109,32,116,111,32,104,97,118,101,119,104,105,99,104,32,105,115,32,116,104, +101,116,104,101,114,101,32,119,97,115,32,110,111,97,110,32,101,120,99,101,108, +108,101,110,116,97,108,108,32,111,102,32,116,104,101,115,101,100,101,115,99,114, +105,98,101,100,32,98,121,73,110,32,112,114,97,99,116,105,99,101,44,98,114,111,97 +,100,99,97,115,116,105,110,103,99,104,97,114,103,101,100,32,119,105,116,104,114, +101,102,108,101,99,116,101,100,32,105,110,115,117,98,106,101,99,116,101,100,32, +116,111,109,105,108,105,116,97,114,121,32,97,110,100,116,111,32,116,104,101,32, +112,111,105,110,116,101,99,111,110,111,109,105,99,97,108,108,121,115,101,116,84, +97,114,103,101,116,105,110,103,97,114,101,32,97,99,116,117,97,108,108,121,118, +105,99,116,111,114,121,32,111,118,101,114,40,41,59,60,47,115,99,114,105,112,116, +62,99,111,110,116,105,110,117,111,117,115,108,121,114,101,113,117,105,114,101, +100,32,102,111,114,101,118,111,108,117,116,105,111,110,97,114,121,97,110,32,101, +102,102,101,99,116,105,118,101,110,111,114,116,104,32,111,102,32,116,104,101,44, +32,119,104,105,99,104,32,119,97,115,32,102,114,111,110,116,32,111,102,32,116,104 +,101,111,114,32,111,116,104,101,114,119,105,115,101,115,111,109,101,32,102,111, +114,109,32,111,102,104,97,100,32,110,111,116,32,98,101,101,110,103,101,110,101, +114,97,116,101,100,32,98,121,105,110,102,111,114,109,97,116,105,111,110,46,112, +101,114,109,105,116,116,101,100,32,116,111,105,110,99,108,117,100,101,115,32,116 +,104,101,100,101,118,101,108,111,112,109,101,110,116,44,101,110,116,101,114,101, +100,32,105,110,116,111,116,104,101,32,112,114,101,118,105,111,117,115,99,111,110 +,115,105,115,116,101,110,116,108,121,97,114,101,32,107,110,111,119,110,32,97,115 +,116,104,101,32,102,105,101,108,100,32,111,102,116,104,105,115,32,116,121,112, +101,32,111,102,103,105,118,101,110,32,116,111,32,116,104,101,116,104,101,32,116, +105,116,108,101,32,111,102,99,111,110,116,97,105,110,115,32,116,104,101,105,110, +115,116,97,110,99,101,115,32,111,102,105,110,32,116,104,101,32,110,111,114,116, +104,100,117,101,32,116,111,32,116,104,101,105,114,97,114,101,32,100,101,115,105, +103,110,101,100,99,111,114,112,111,114,97,116,105,111,110,115,119,97,115,32,116, +104,97,116,32,116,104,101,111,110,101,32,111,102,32,116,104,101,115,101,109,111, +114,101,32,112,111,112,117,108,97,114,115,117,99,99,101,101,100,101,100,32,105, +110,115,117,112,112,111,114,116,32,102,114,111,109,105,110,32,100,105,102,102, +101,114,101,110,116,100,111,109,105,110,97,116,101,100,32,98,121,100,101,115,105 +,103,110,101,100,32,102,111,114,111,119,110,101,114,115,104,105,112,32,111,102, +97,110,100,32,112,111,115,115,105,98,108,121,115,116,97,110,100,97,114,100,105, +122,101,100,114,101,115,112,111,110,115,101,84,101,120,116,119,97,115,32,105,110 +,116,101,110,100,101,100,114,101,99,101,105,118,101,100,32,116,104,101,97,115, +115,117,109,101,100,32,116,104,97,116,97,114,101,97,115,32,111,102,32,116,104, +101,112,114,105,109,97,114,105,108,121,32,105,110,116,104,101,32,98,97,115,105, +115,32,111,102,105,110,32,116,104,101,32,115,101,110,115,101,97,99,99,111,117, +110,116,115,32,102,111,114,100,101,115,116,114,111,121,101,100,32,98,121,97,116, +32,108,101,97,115,116,32,116,119,111,119,97,115,32,100,101,99,108,97,114,101,100 +,99,111,117,108,100,32,110,111,116,32,98,101,83,101,99,114,101,116,97,114,121,32 +,111,102,97,112,112,101,97,114,32,116,111,32,98,101,109,97,114,103,105,110,45, +116,111,112,58,49,47,94,92,115,43,124,92,115,43,36,47,103,101,41,123,116,104,114 +,111,119,32,101,125,59,116,104,101,32,115,116,97,114,116,32,111,102,116,119,111, +32,115,101,112,97,114,97,116,101,108,97,110,103,117,97,103,101,32,97,110,100,119 +,104,111,32,104,97,100,32,98,101,101,110,111,112,101,114,97,116,105,111,110,32, +111,102,100,101,97,116,104,32,111,102,32,116,104,101,114,101,97,108,32,110,117, +109,98,101,114,115,9,60,108,105,110,107,32,114,101,108,61,34,112,114,111,118,105 +,100,101,100,32,116,104,101,116,104,101,32,115,116,111,114,121,32,111,102,99,111 +,109,112,101,116,105,116,105,111,110,115,101,110,103,108,105,115,104,32,40,85,75 +,41,101,110,103,108,105,115,104,32,40,85,83,41,208,156,208,190,208,189,208,179, +208,190,208,187,208,161,209,128,208,191,209,129,208,186,208,184,209,129,209,128, +208,191,209,129,208,186,208,184,209,129,209,128,208,191,209,129,208,186,208,190, +217,132,216,185,216,177,216,168,217,138,216,169,230,173,163,233,171,148,228,184, +173,230,150,135,231,174,128,228,189,147,228,184,173,230,150,135,231,185,129,228, +189,147,228,184,173,230,150,135,230,156,137,233,153,144,229,133,172,229,143,184, +228,186,186,230,176,145,230,148,191,229,186,156,233,152,191,233,135,140,229,183, +180,229,183,180,231,164,190,228,188,154,228,184,187,228,185,137,230,147,141,228, +189,156,231,179,187,231,187,159,230,148,191,231,173,150,230,179,149,232,167,132, +105,110,102,111,114,109,97,99,105,195,179,110,104,101,114,114,97,109,105,101,110 +,116,97,115,101,108,101,99,116,114,195,179,110,105,99,111,100,101,115,99,114,105 +,112,99,105,195,179,110,99,108,97,115,105,102,105,99,97,100,111,115,99,111,110, +111,99,105,109,105,101,110,116,111,112,117,98,108,105,99,97,99,105,195,179,110, +114,101,108,97,99,105,111,110,97,100,97,115,105,110,102,111,114,109,195,161,116, +105,99,97,114,101,108,97,99,105,111,110,97,100,111,115,100,101,112,97,114,116,97 +,109,101,110,116,111,116,114,97,98,97,106,97,100,111,114,101,115,100,105,114,101 +,99,116,97,109,101,110,116,101,97,121,117,110,116,97,109,105,101,110,116,111,109 +,101,114,99,97,100,111,76,105,98,114,101,99,111,110,116,195,161,99,116,101,110, +111,115,104,97,98,105,116,97,99,105,111,110,101,115,99,117,109,112,108,105,109, +105,101,110,116,111,114,101,115,116,97,117,114,97,110,116,101,115,100,105,115, +112,111,115,105,99,105,195,179,110,99,111,110,115,101,99,117,101,110,99,105,97, +101,108,101,99,116,114,195,179,110,105,99,97,97,112,108,105,99,97,99,105,111,110 +,101,115,100,101,115,99,111,110,101,99,116,97,100,111,105,110,115,116,97,108,97, +99,105,195,179,110,114,101,97,108,105,122,97,99,105,195,179,110,117,116,105,108, +105,122,97,99,105,195,179,110,101,110,99,105,99,108,111,112,101,100,105,97,101, +110,102,101,114,109,101,100,97,100,101,115,105,110,115,116,114,117,109,101,110, +116,111,115,101,120,112,101,114,105,101,110,99,105,97,115,105,110,115,116,105, +116,117,99,105,195,179,110,112,97,114,116,105,99,117,108,97,114,101,115,115,117, +98,99,97,116,101,103,111,114,105,97,209,130,208,190,208,187,209,140,208,186,208, +190,208,160,208,190,209,129,209,129,208,184,208,184,209,128,208,176,208,177,208, +190,209,130,209,139,208,177,208,190,208,187,209,140,209,136,208,181,208,191,209, +128,208,190,209,129,209,130,208,190,208,188,208,190,208,182,208,181,209,130,208, +181,208,180,209,128,209,131,208,179,208,184,209,133,209,129,208,187,209,131,209, +135,208,176,208,181,209,129,208,181,208,185,209,135,208,176,209,129,208,178,209, +129,208,181,208,179,208,180,208,176,208,160,208,190,209,129,209,129,208,184,209, +143,208,156,208,190,209,129,208,186,208,178,208,181,208,180,209,128,209,131,208, +179,208,184,208,181,208,179,208,190,209,128,208,190,208,180,208,176,208,178,208, +190,208,191,209,128,208,190,209,129,208,180,208,176,208,189,208,189,209,139,209, +133,208,180,208,190,208,187,208,182,208,189,209,139,208,184,208,188,208,181,208, +189,208,189,208,190,208,156,208,190,209,129,208,186,208,178,209,139,209,128,209, +131,208,177,208,187,208,181,208,185,208,156,208,190,209,129,208,186,208,178,208, +176,209,129,209,130,209,128,208,176,208,189,209,139,208,189,208,184,209,135,208, +181,208,179,208,190,209,128,208,176,208,177,208,190,209,130,208,181,208,180,208, +190,208,187,208,182,208,181,208,189,209,131,209,129,208,187,209,131,208,179,208, +184,209,130,208,181,208,191,208,181,209,128,209,140,208,158,208,180,208,189,208, +176,208,186,208,190,208,191,208,190,209,130,208,190,208,188,209,131,209,128,208, +176,208,177,208,190,209,130,209,131,208,176,208,191,209,128,208,181,208,187,209, +143,208,178,208,190,208,190,208,177,209,137,208,181,208,190,208,180,208,189,208, +190,208,179,208,190,209,129,208,178,208,190,208,181,208,179,208,190,209,129,209, +130,208,176,209,130,209,140,208,184,208,180,209,128,209,131,208,179,208,190,208, +185,209,132,208,190,209,128,209,131,208,188,208,181,209,133,208,190,209,128,208, +190,209,136,208,190,208,191,209,128,208,190,209,130,208,184,208,178,209,129,209, +129,209,139,208,187,208,186,208,176,208,186,208,176,208,182,208,180,209,139,208, +185,208,178,208,187,208,176,209,129,209,130,208,184,208,179,209,128,209,131,208, +191,208,191,209,139,208,178,208,188,208,181,209,129,209,130,208,181,209,128,208, +176,208,177,208,190,209,130,208,176,209,129,208,186,208,176,208,183,208,176,208, +187,208,191,208,181,209,128,208,178,209,139,208,185,208,180,208,181,208,187,208, +176,209,130,209,140,208,180,208,181,208,189,209,140,208,179,208,184,208,191,208, +181,209,128,208,184,208,190,208,180,208,177,208,184,208,183,208,189,208,181,209, +129,208,190,209,129,208,189,208,190,208,178,208,181,208,188,208,190,208,188,208, +181,208,189,209,130,208,186,209,131,208,191,208,184,209,130,209,140,208,180,208, +190,208,187,208,182,208,189,208,176,209,128,208,176,208,188,208,186,208,176,209, +133,208,189,208,176,209,135,208,176,208,187,208,190,208,160,208,176,208,177,208, +190,209,130,208,176,208,162,208,190,208,187,209,140,208,186,208,190,209,129,208, +190,208,178,209,129,208,181,208,188,208,178,209,130,208,190,209,128,208,190,208, +185,208,189,208,176,209,135,208,176,208,187,208,176,209,129,208,191,208,184,209, +129,208,190,208,186,209,129,208,187,209,131,208,182,208,177,209,139,209,129,208, +184,209,129,209,130,208,181,208,188,208,191,208,181,209,135,208,176,209,130,208, +184,208,189,208,190,208,178,208,190,208,179,208,190,208,191,208,190,208,188,208, +190,209,137,208,184,209,129,208,176,208,185,209,130,208,190,208,178,208,191,208, +190,209,135,208,181,208,188,209,131,208,191,208,190,208,188,208,190,209,137,209, +140,208,180,208,190,208,187,208,182,208,189,208,190,209,129,209,129,209,139,208, +187,208,186,208,184,208,177,209,139,209,129,209,130,209,128,208,190,208,180,208, +176,208,189,208,189,209,139,208,181,208,188,208,189,208,190,208,179,208,184,208, +181,208,191,209,128,208,190,208,181,208,186,209,130,208,161,208,181,208,185,209, +135,208,176,209,129,208,188,208,190,208,180,208,181,208,187,208,184,209,130,208, +176,208,186,208,190,208,179,208,190,208,190,208,189,208,187,208,176,208,185,208, +189,208,179,208,190,209,128,208,190,208,180,208,181,208,178,208,181,209,128,209, +129,208,184,209,143,209,129,209,130,209,128,208,176,208,189,208,181,209,132,208, +184,208,187,209,140,208,188,209,139,209,131,209,128,208,190,208,178,208,189,209, +143,209,128,208,176,208,183,208,189,209,139,209,133,208,184,209,129,208,186,208, +176,209,130,209,140,208,189,208,181,208,180,208,181,208,187,209,142,209,143,208, +189,208,178,208,176,209,128,209,143,208,188,208,181,208,189,209,140,209,136,208, +181,208,188,208,189,208,190,208,179,208,184,209,133,208,180,208,176,208,189,208, +189,208,190,208,185,208,183,208,189,208,176,209,135,208,184,209,130,208,189,208, +181,208,187,209,140,208,183,209,143,209,132,208,190,209,128,209,131,208,188,208, +176,208,162,208,181,208,191,208,181,209,128,209,140,208,188,208,181,209,129,209, +143,209,134,208,176,208,183,208,176,209,137,208,184,209,130,209,139,208,155,209, +131,209,135,209,136,208,184,208,181,224,164,168,224,164,185,224,165,128,224,164, +130,224,164,149,224,164,176,224,164,168,224,165,135,224,164,133,224,164,170,224, +164,168,224,165,135,224,164,149,224,164,191,224,164,175,224,164,190,224,164,149, +224,164,176,224,165,135,224,164,130,224,164,133,224,164,168,224,165,141,224,164, +175,224,164,149,224,165,141,224,164,175,224,164,190,224,164,151,224,164,190,224, +164,135,224,164,161,224,164,172,224,164,190,224,164,176,224,165,135,224,164,149, +224,164,191,224,164,184,224,165,128,224,164,166,224,164,191,224,164,175,224,164, +190,224,164,170,224,164,185,224,164,178,224,165,135,224,164,184,224,164,191,224, +164,130,224,164,185,224,164,173,224,164,190,224,164,176,224,164,164,224,164,133, +224,164,170,224,164,168,224,165,128,224,164,181,224,164,190,224,164,178,224,165, +135,224,164,184,224,165,135,224,164,181,224,164,190,224,164,149,224,164,176,224, +164,164,224,165,135,224,164,174,224,165,135,224,164,176,224,165,135,224,164,185, +224,165,139,224,164,168,224,165,135,224,164,184,224,164,149,224,164,164,224,165, +135,224,164,172,224,164,185,224,165,129,224,164,164,224,164,184,224,164,190,224, +164,135,224,164,159,224,164,185,224,165,139,224,164,151,224,164,190,224,164,156, +224,164,190,224,164,168,224,165,135,224,164,174,224,164,191,224,164,168,224,164, +159,224,164,149,224,164,176,224,164,164,224,164,190,224,164,149,224,164,176,224, +164,168,224,164,190,224,164,137,224,164,168,224,164,149,224,165,135,224,164,175, +224,164,185,224,164,190,224,164,129,224,164,184,224,164,172,224,164,184,224,165, +135,224,164,173,224,164,190,224,164,183,224,164,190,224,164,134,224,164,170,224, +164,149,224,165,135,224,164,178,224,164,191,224,164,175,224,165,135,224,164,182, +224,165,129,224,164,176,224,165,130,224,164,135,224,164,184,224,164,149,224,165, +135,224,164,152,224,164,130,224,164,159,224,165,135,224,164,174,224,165,135,224, +164,176,224,165,128,224,164,184,224,164,149,224,164,164,224,164,190,224,164,174, +224,165,135,224,164,176,224,164,190,224,164,178,224,165,135,224,164,149,224,164, +176,224,164,133,224,164,167,224,164,191,224,164,149,224,164,133,224,164,170,224, +164,168,224,164,190,224,164,184,224,164,174,224,164,190,224,164,156,224,164,174, +224,165,129,224,164,157,224,165,135,224,164,149,224,164,190,224,164,176,224,164, +163,224,164,185,224,165,139,224,164,164,224,164,190,224,164,149,224,164,161,224, +164,188,224,165,128,224,164,175,224,164,185,224,164,190,224,164,130,224,164,185, +224,165,139,224,164,159,224,164,178,224,164,182,224,164,172,224,165,141,224,164, +166,224,164,178,224,164,191,224,164,175,224,164,190,224,164,156,224,165,128,224, +164,181,224,164,168,224,164,156,224,164,190,224,164,164,224,164,190,224,164,149, +224,165,136,224,164,184,224,165,135,224,164,134,224,164,170,224,164,149,224,164, +190,224,164,181,224,164,190,224,164,178,224,165,128,224,164,166,224,165,135,224, +164,168,224,165,135,224,164,170,224,165,130,224,164,176,224,165,128,224,164,170, +224,164,190,224,164,168,224,165,128,224,164,137,224,164,184,224,164,149,224,165, +135,224,164,185,224,165,139,224,164,151,224,165,128,224,164,172,224,165,136,224, +164,160,224,164,149,224,164,134,224,164,170,224,164,149,224,165,128,224,164,181, +224,164,176,224,165,141,224,164,183,224,164,151,224,164,190,224,164,130,224,164, +181,224,164,134,224,164,170,224,164,149,224,165,139,224,164,156,224,164,191,224, +164,178,224,164,190,224,164,156,224,164,190,224,164,168,224,164,190,224,164,184, +224,164,185,224,164,174,224,164,164,224,164,185,224,164,174,224,165,135,224,164, +130,224,164,137,224,164,168,224,164,149,224,165,128,224,164,175,224,164,190,224, +164,185,224,165,130,224,164,166,224,164,176,224,165,141,224,164,156,224,164,184, +224,165,130,224,164,154,224,165,128,224,164,170,224,164,184,224,164,130,224,164, +166,224,164,184,224,164,181,224,164,190,224,164,178,224,164,185,224,165,139,224, +164,168,224,164,190,224,164,185,224,165,139,224,164,164,224,165,128,224,164,156, +224,165,136,224,164,184,224,165,135,224,164,181,224,164,190,224,164,170,224,164, +184,224,164,156,224,164,168,224,164,164,224,164,190,224,164,168,224,165,135,224, +164,164,224,164,190,224,164,156,224,164,190,224,164,176,224,165,128,224,164,152, +224,164,190,224,164,175,224,164,178,224,164,156,224,164,191,224,164,178,224,165, +135,224,164,168,224,165,128,224,164,154,224,165,135,224,164,156,224,164,190,224, +164,130,224,164,154,224,164,170,224,164,164,224,165,141,224,164,176,224,164,151, +224,165,130,224,164,151,224,164,178,224,164,156,224,164,190,224,164,164,224,165, +135,224,164,172,224,164,190,224,164,185,224,164,176,224,164,134,224,164,170,224, +164,168,224,165,135,224,164,181,224,164,190,224,164,185,224,164,168,224,164,135, +224,164,184,224,164,149,224,164,190,224,164,184,224,165,129,224,164,172,224,164, +185,224,164,176,224,164,185,224,164,168,224,165,135,224,164,135,224,164,184,224, +164,184,224,165,135,224,164,184,224,164,185,224,164,191,224,164,164,224,164,172, +224,164,161,224,164,188,224,165,135,224,164,152,224,164,159,224,164,168,224,164, +190,224,164,164,224,164,178,224,164,190,224,164,182,224,164,170,224,164,190,224, +164,130,224,164,154,224,164,182,224,165,141,224,164,176,224,165,128,224,164,172, +224,164,161,224,164,188,224,165,128,224,164,185,224,165,139,224,164,164,224,165, +135,224,164,184,224,164,190,224,164,136,224,164,159,224,164,182,224,164,190,224, +164,175,224,164,166,224,164,184,224,164,149,224,164,164,224,165,128,224,164,156, +224,164,190,224,164,164,224,165,128,224,164,181,224,164,190,224,164,178,224,164, +190,224,164,185,224,164,156,224,164,190,224,164,176,224,164,170,224,164,159,224, +164,168,224,164,190,224,164,176,224,164,150,224,164,168,224,165,135,224,164,184, +224,164,161,224,164,188,224,164,149,224,164,174,224,164,191,224,164,178,224,164, +190,224,164,137,224,164,184,224,164,149,224,165,128,224,164,149,224,165,135,224, +164,181,224,164,178,224,164,178,224,164,151,224,164,164,224,164,190,224,164,150, +224,164,190,224,164,168,224,164,190,224,164,133,224,164,176,224,165,141,224,164, +165,224,164,156,224,164,185,224,164,190,224,164,130,224,164,166,224,165,135,224, +164,150,224,164,190,224,164,170,224,164,185,224,164,178,224,165,128,224,164,168, +224,164,191,224,164,175,224,164,174,224,164,172,224,164,191,224,164,168,224,164, +190,224,164,172,224,165,136,224,164,130,224,164,149,224,164,149,224,164,185,224, +165,128,224,164,130,224,164,149,224,164,185,224,164,168,224,164,190,224,164,166, +224,165,135,224,164,164,224,164,190,224,164,185,224,164,174,224,164,178,224,165, +135,224,164,149,224,164,190,224,164,171,224,165,128,224,164,156,224,164,172,224, +164,149,224,164,191,224,164,164,224,165,129,224,164,176,224,164,164,224,164,174, +224,164,190,224,164,130,224,164,151,224,164,181,224,164,185,224,165,128,224,164, +130,224,164,176,224,165,139,224,164,156,224,164,188,224,164,174,224,164,191,224, +164,178,224,165,128,224,164,134,224,164,176,224,165,139,224,164,170,224,164,184, +224,165,135,224,164,168,224,164,190,224,164,175,224,164,190,224,164,166,224,164, +181,224,164,178,224,165,135,224,164,168,224,165,135,224,164,150,224,164,190,224, +164,164,224,164,190,224,164,149,224,164,176,224,165,128,224,164,172,224,164,137, +224,164,168,224,164,149,224,164,190,224,164,156,224,164,181,224,164,190,224,164, +172,224,164,170,224,165,130,224,164,176,224,164,190,224,164,172,224,164,161,224, +164,188,224,164,190,224,164,184,224,165,140,224,164,166,224,164,190,224,164,182, +224,165,135,224,164,175,224,164,176,224,164,149,224,164,191,224,164,175,224,165, +135,224,164,149,224,164,185,224,164,190,224,164,130,224,164,133,224,164,149,224, +164,184,224,164,176,224,164,172,224,164,168,224,164,190,224,164,143,224,164,181, +224,164,185,224,164,190,224,164,130,224,164,184,224,165,141,224,164,165,224,164, +178,224,164,174,224,164,191,224,164,178,224,165,135,224,164,178,224,165,135,224, +164,150,224,164,149,224,164,181,224,164,191,224,164,183,224,164,175,224,164,149, +224,165,141,224,164,176,224,164,130,224,164,184,224,164,174,224,165,130,224,164, +185,224,164,165,224,164,190,224,164,168,224,164,190,216,170,216,179,216,170,216, +183,217,138,216,185,217,133,216,180,216,167,216,177,217,131,216,169,216,168,217, +136,216,167,216,179,216,183,216,169,216,167,217,132,216,181,217,129,216,173,216, +169,217,133,217,136,216,167,216,182,217,138,216,185,216,167,217,132,216,174,216, +167,216,181,216,169,216,167,217,132,217,133,216,178,217,138,216,175,216,167,217, +132,216,185,216,167,217,133,216,169,216,167,217,132,217,131,216,167,216,170,216, +168,216,167,217,132,216,177,216,175,217,136,216,175,216,168,216,177,217,134,216, +167,217,133,216,172,216,167,217,132,216,175,217,136,217,132,216,169,216,167,217, +132,216,185,216,167,217,132,217,133,216,167,217,132,217,133,217,136,217,130,216, +185,216,167,217,132,216,185,216,177,216,168,217,138,216,167,217,132,216,179,216, +177,217,138,216,185,216,167,217,132,216,172,217,136,216,167,217,132,216,167,217, +132,216,176,217,135,216,167,216,168,216,167,217,132,216,173,217,138,216,167,216, +169,216,167,217,132,216,173,217,130,217,136,217,130,216,167,217,132,217,131,216, +177,217,138,217,133,216,167,217,132,216,185,216,177,216,167,217,130,217,133,216, +173,217,129,217,136,216,184,216,169,216,167,217,132,216,171,216,167,217,134,217, +138,217,133,216,180,216,167,217,135,216,175,216,169,216,167,217,132,217,133,216, +177,216,163,216,169,216,167,217,132,217,130,216,177,216,162,217,134,216,167,217, +132,216,180,216,168,216,167,216,168,216,167,217,132,216,173,217,136,216,167,216, +177,216,167,217,132,216,172,216,175,217,138,216,175,216,167,217,132,216,163,216, +179,216,177,216,169,216,167,217,132,216,185,217,132,217,136,217,133,217,133,216, +172,217,133,217,136,216,185,216,169,216,167,217,132,216,177,216,173,217,133,217, +134,216,167,217,132,217,134,217,130,216,167,216,183,217,129,217,132,216,179,216, +183,217,138,217,134,216,167,217,132,217,131,217,136,217,138,216,170,216,167,217, +132,216,175,217,134,217,138,216,167,216,168,216,177,217,131,216,167,216,170,217, +135,216,167,217,132,216,177,217,138,216,167,216,182,216,170,216,173,217,138,216, +167,216,170,217,138,216,168,216,170,217,136,217,130,217,138,216,170,216,167,217, +132,216,163,217,136,217,132,217,137,216,167,217,132,216,168,216,177,217,138,216, +175,216,167,217,132,217,131,217,132,216,167,217,133,216,167,217,132,216,177,216, +167,216,168,216,183,216,167,217,132,216,180,216,174,216,181,217,138,216,179,217, +138,216,167,216,177,216,167,216,170,216,167,217,132,216,171,216,167,217,132,216, +171,216,167,217,132,216,181,217,132,216,167,216,169,216,167,217,132,216,173,216, +175,217,138,216,171,216,167,217,132,216,178,217,136,216,167,216,177,216,167,217, +132,216,174,217,132,217,138,216,172,216,167,217,132,216,172,217,133,217,138,216, +185,216,167,217,132,216,185,216,167,217,133,217,135,216,167,217,132,216,172,217, +133,216,167,217,132,216,167,217,132,216,179,216,167,216,185,216,169,217,133,216, +180,216,167,217,135,216,175,217,135,216,167,217,132,216,177,216,166,217,138,216, +179,216,167,217,132,216,175,216,174,217,136,217,132,216,167,217,132,217,129,217, +134,217,138,216,169,216,167,217,132,217,131,216,170,216,167,216,168,216,167,217, +132,216,175,217,136,216,177,217,138,216,167,217,132,216,175,216,177,217,136,216, +179,216,167,216,179,216,170,216,186,216,177,217,130,216,170,216,181,216,167,217, +133,217,138,217,133,216,167,217,132,216,168,217,134,216,167,216,170,216,167,217, +132,216,185,216,184,217,138,217,133,101,110,116,101,114,116,97,105,110,109,101, +110,116,117,110,100,101,114,115,116,97,110,100,105,110,103,32,61,32,102,117,110, +99,116,105,111,110,40,41,46,106,112,103,34,32,119,105,100,116,104,61,34,99,111, +110,102,105,103,117,114,97,116,105,111,110,46,112,110,103,34,32,119,105,100,116, +104,61,34,60,98,111,100,121,32,99,108,97,115,115,61,34,77,97,116,104,46,114,97, +110,100,111,109,40,41,99,111,110,116,101,109,112,111,114,97,114,121,32,85,110, +105,116,101,100,32,83,116,97,116,101,115,99,105,114,99,117,109,115,116,97,110,99 +,101,115,46,97,112,112,101,110,100,67,104,105,108,100,40,111,114,103,97,110,105, +122,97,116,105,111,110,115,60,115,112,97,110,32,99,108,97,115,115,61,34,34,62,60 +,105,109,103,32,115,114,99,61,34,47,100,105,115,116,105,110,103,117,105,115,104, +101,100,116,104,111,117,115,97,110,100,115,32,111,102,32,99,111,109,109,117,110, +105,99,97,116,105,111,110,99,108,101,97,114,34,62,60,47,100,105,118,62,105,110, +118,101,115,116,105,103,97,116,105,111,110,102,97,118,105,99,111,110,46,105,99, +111,34,32,109,97,114,103,105,110,45,114,105,103,104,116,58,98,97,115,101,100,32, +111,110,32,116,104,101,32,77,97,115,115,97,99,104,117,115,101,116,116,115,116,97 +,98,108,101,32,98,111,114,100,101,114,61,105,110,116,101,114,110,97,116,105,111, +110,97,108,97,108,115,111,32,107,110,111,119,110,32,97,115,112,114,111,110,117, +110,99,105,97,116,105,111,110,98,97,99,107,103,114,111,117,110,100,58,35,102,112 +,97,100,100,105,110,103,45,108,101,102,116,58,70,111,114,32,101,120,97,109,112, +108,101,44,32,109,105,115,99,101,108,108,97,110,101,111,117,115,38,108,116,59,47 +,109,97,116,104,38,103,116,59,112,115,121,99,104,111,108,111,103,105,99,97,108, +105,110,32,112,97,114,116,105,99,117,108,97,114,101,97,114,99,104,34,32,116,121, +112,101,61,34,102,111,114,109,32,109,101,116,104,111,100,61,34,97,115,32,111,112 +,112,111,115,101,100,32,116,111,83,117,112,114,101,109,101,32,67,111,117,114,116 +,111,99,99,97,115,105,111,110,97,108,108,121,32,65,100,100,105,116,105,111,110, +97,108,108,121,44,78,111,114,116,104,32,65,109,101,114,105,99,97,112,120,59,98, +97,99,107,103,114,111,117,110,100,111,112,112,111,114,116,117,110,105,116,105, +101,115,69,110,116,101,114,116,97,105,110,109,101,110,116,46,116,111,76,111,119, +101,114,67,97,115,101,40,109,97,110,117,102,97,99,116,117,114,105,110,103,112, +114,111,102,101,115,115,105,111,110,97,108,32,99,111,109,98,105,110,101,100,32, +119,105,116,104,70,111,114,32,105,110,115,116,97,110,99,101,44,99,111,110,115, +105,115,116,105,110,103,32,111,102,34,32,109,97,120,108,101,110,103,116,104,61, +34,114,101,116,117,114,110,32,102,97,108,115,101,59,99,111,110,115,99,105,111, +117,115,110,101,115,115,77,101,100,105,116,101,114,114,97,110,101,97,110,101,120 +,116,114,97,111,114,100,105,110,97,114,121,97,115,115,97,115,115,105,110,97,116, +105,111,110,115,117,98,115,101,113,117,101,110,116,108,121,32,98,117,116,116,111 +,110,32,116,121,112,101,61,34,116,104,101,32,110,117,109,98,101,114,32,111,102, +116,104,101,32,111,114,105,103,105,110,97,108,32,99,111,109,112,114,101,104,101, +110,115,105,118,101,114,101,102,101,114,115,32,116,111,32,116,104,101,60,47,117, +108,62,10,60,47,100,105,118,62,10,112,104,105,108,111,115,111,112,104,105,99,97, +108,108,111,99,97,116,105,111,110,46,104,114,101,102,119,97,115,32,112,117,98, +108,105,115,104,101,100,83,97,110,32,70,114,97,110,99,105,115,99,111,40,102,117, +110,99,116,105,111,110,40,41,123,10,60,100,105,118,32,105,100,61,34,109,97,105, +110,115,111,112,104,105,115,116,105,99,97,116,101,100,109,97,116,104,101,109,97, +116,105,99,97,108,32,47,104,101,97,100,62,13,10,60,98,111,100,121,115,117,103, +103,101,115,116,115,32,116,104,97,116,100,111,99,117,109,101,110,116,97,116,105, +111,110,99,111,110,99,101,110,116,114,97,116,105,111,110,114,101,108,97,116,105, +111,110,115,104,105,112,115,109,97,121,32,104,97,118,101,32,98,101,101,110,40, +102,111,114,32,101,120,97,109,112,108,101,44,84,104,105,115,32,97,114,116,105,99 +,108,101,32,105,110,32,115,111,109,101,32,99,97,115,101,115,112,97,114,116,115, +32,111,102,32,116,104,101,32,100,101,102,105,110,105,116,105,111,110,32,111,102, +71,114,101,97,116,32,66,114,105,116,97,105,110,32,99,101,108,108,112,97,100,100, +105,110,103,61,101,113,117,105,118,97,108,101,110,116,32,116,111,112,108,97,99, +101,104,111,108,100,101,114,61,34,59,32,102,111,110,116,45,115,105,122,101,58,32 +,106,117,115,116,105,102,105,99,97,116,105,111,110,98,101,108,105,101,118,101, +100,32,116,104,97,116,115,117,102,102,101,114,101,100,32,102,114,111,109,97,116, +116,101,109,112,116,101,100,32,116,111,32,108,101,97,100,101,114,32,111,102,32, +116,104,101,99,114,105,112,116,34,32,115,114,99,61,34,47,40,102,117,110,99,116, +105,111,110,40,41,32,123,97,114,101,32,97,118,97,105,108,97,98,108,101,10,9,60, +108,105,110,107,32,114,101,108,61,34,32,115,114,99,61,39,104,116,116,112,58,47, +47,105,110,116,101,114,101,115,116,101,100,32,105,110,99,111,110,118,101,110,116 +,105,111,110,97,108,32,34,32,97,108,116,61,34,34,32,47,62,60,47,97,114,101,32, +103,101,110,101,114,97,108,108,121,104,97,115,32,97,108,115,111,32,98,101,101, +110,109,111,115,116,32,112,111,112,117,108,97,114,32,99,111,114,114,101,115,112, +111,110,100,105,110,103,99,114,101,100,105,116,101,100,32,119,105,116,104,116, +121,108,101,61,34,98,111,114,100,101,114,58,60,47,97,62,60,47,115,112,97,110,62, +60,47,46,103,105,102,34,32,119,105,100,116,104,61,34,60,105,102,114,97,109,101, +32,115,114,99,61,34,116,97,98,108,101,32,99,108,97,115,115,61,34,105,110,108,105 +,110,101,45,98,108,111,99,107,59,97,99,99,111,114,100,105,110,103,32,116,111,32, +116,111,103,101,116,104,101,114,32,119,105,116,104,97,112,112,114,111,120,105, +109,97,116,101,108,121,112,97,114,108,105,97,109,101,110,116,97,114,121,109,111, +114,101,32,97,110,100,32,109,111,114,101,100,105,115,112,108,97,121,58,110,111, +110,101,59,116,114,97,100,105,116,105,111,110,97,108,108,121,112,114,101,100,111 +,109,105,110,97,110,116,108,121,38,110,98,115,112,59,124,38,110,98,115,112,59,38 +,110,98,115,112,59,60,47,115,112,97,110,62,32,99,101,108,108,115,112,97,99,105, +110,103,61,60,105,110,112,117,116,32,110,97,109,101,61,34,111,114,34,32,99,111, +110,116,101,110,116,61,34,99,111,110,116,114,111,118,101,114,115,105,97,108,112, +114,111,112,101,114,116,121,61,34,111,103,58,47,120,45,115,104,111,99,107,119,97 +,118,101,45,100,101,109,111,110,115,116,114,97,116,105,111,110,115,117,114,114, +111,117,110,100,101,100,32,98,121,78,101,118,101,114,116,104,101,108,101,115,115 +,44,119,97,115,32,116,104,101,32,102,105,114,115,116,99,111,110,115,105,100,101, +114,97,98,108,101,32,65,108,116,104,111,117,103,104,32,116,104,101,32,99,111,108 +,108,97,98,111,114,97,116,105,111,110,115,104,111,117,108,100,32,110,111,116,32, +98,101,112,114,111,112,111,114,116,105,111,110,32,111,102,60,115,112,97,110,32, +115,116,121,108,101,61,34,107,110,111,119,110,32,97,115,32,116,104,101,32,115, +104,111,114,116,108,121,32,97,102,116,101,114,102,111,114,32,105,110,115,116,97, +110,99,101,44,100,101,115,99,114,105,98,101,100,32,97,115,32,47,104,101,97,100, +62,10,60,98,111,100,121,32,115,116,97,114,116,105,110,103,32,119,105,116,104,105 +,110,99,114,101,97,115,105,110,103,108,121,32,116,104,101,32,102,97,99,116,32, +116,104,97,116,100,105,115,99,117,115,115,105,111,110,32,111,102,109,105,100,100 +,108,101,32,111,102,32,116,104,101,97,110,32,105,110,100,105,118,105,100,117,97, +108,100,105,102,102,105,99,117,108,116,32,116,111,32,112,111,105,110,116,32,111, +102,32,118,105,101,119,104,111,109,111,115,101,120,117,97,108,105,116,121,97,99, +99,101,112,116,97,110,99,101,32,111,102,60,47,115,112,97,110,62,60,47,100,105, +118,62,109,97,110,117,102,97,99,116,117,114,101,114,115,111,114,105,103,105,110, +32,111,102,32,116,104,101,99,111,109,109,111,110,108,121,32,117,115,101,100,105, +109,112,111,114,116,97,110,99,101,32,111,102,100,101,110,111,109,105,110,97,116, +105,111,110,115,98,97,99,107,103,114,111,117,110,100,58,32,35,108,101,110,103, +116,104,32,111,102,32,116,104,101,100,101,116,101,114,109,105,110,97,116,105,111 +,110,97,32,115,105,103,110,105,102,105,99,97,110,116,34,32,98,111,114,100,101, +114,61,34,48,34,62,114,101,118,111,108,117,116,105,111,110,97,114,121,112,114, +105,110,99,105,112,108,101,115,32,111,102,105,115,32,99,111,110,115,105,100,101, +114,101,100,119,97,115,32,100,101,118,101,108,111,112,101,100,73,110,100,111,45, +69,117,114,111,112,101,97,110,118,117,108,110,101,114,97,98,108,101,32,116,111, +112,114,111,112,111,110,101,110,116,115,32,111,102,97,114,101,32,115,111,109,101 +,116,105,109,101,115,99,108,111,115,101,114,32,116,111,32,116,104,101,78,101,119 +,32,89,111,114,107,32,67,105,116,121,32,110,97,109,101,61,34,115,101,97,114,99, +104,97,116,116,114,105,98,117,116,101,100,32,116,111,99,111,117,114,115,101,32, +111,102,32,116,104,101,109,97,116,104,101,109,97,116,105,99,105,97,110,98,121,32 +,116,104,101,32,101,110,100,32,111,102,97,116,32,116,104,101,32,101,110,100,32, +111,102,34,32,98,111,114,100,101,114,61,34,48,34,32,116,101,99,104,110,111,108, +111,103,105,99,97,108,46,114,101,109,111,118,101,67,108,97,115,115,40,98,114,97, +110,99,104,32,111,102,32,116,104,101,101,118,105,100,101,110,99,101,32,116,104, +97,116,33,91,101,110,100,105,102,93,45,45,62,13,10,73,110,115,116,105,116,117, +116,101,32,111,102,32,105,110,116,111,32,97,32,115,105,110,103,108,101,114,101, +115,112,101,99,116,105,118,101,108,121,46,97,110,100,32,116,104,101,114,101,102, +111,114,101,112,114,111,112,101,114,116,105,101,115,32,111,102,105,115,32,108, +111,99,97,116,101,100,32,105,110,115,111,109,101,32,111,102,32,119,104,105,99, +104,84,104,101,114,101,32,105,115,32,97,108,115,111,99,111,110,116,105,110,117, +101,100,32,116,111,32,97,112,112,101,97,114,97,110,99,101,32,111,102,32,38,97, +109,112,59,110,100,97,115,104,59,32,100,101,115,99,114,105,98,101,115,32,116,104 +,101,99,111,110,115,105,100,101,114,97,116,105,111,110,97,117,116,104,111,114,32 +,111,102,32,116,104,101,105,110,100,101,112,101,110,100,101,110,116,108,121,101, +113,117,105,112,112,101,100,32,119,105,116,104,100,111,101,115,32,110,111,116,32 +,104,97,118,101,60,47,97,62,60,97,32,104,114,101,102,61,34,99,111,110,102,117, +115,101,100,32,119,105,116,104,60,108,105,110,107,32,104,114,101,102,61,34,47,97 +,116,32,116,104,101,32,97,103,101,32,111,102,97,112,112,101,97,114,32,105,110,32 +,116,104,101,84,104,101,115,101,32,105,110,99,108,117,100,101,114,101,103,97,114 +,100,108,101,115,115,32,111,102,99,111,117,108,100,32,98,101,32,117,115,101,100, +32,115,116,121,108,101,61,38,113,117,111,116,59,115,101,118,101,114,97,108,32, +116,105,109,101,115,114,101,112,114,101,115,101,110,116,32,116,104,101,98,111, +100,121,62,10,60,47,104,116,109,108,62,116,104,111,117,103,104,116,32,116,111,32 +,98,101,112,111,112,117,108,97,116,105,111,110,32,111,102,112,111,115,115,105,98 +,105,108,105,116,105,101,115,112,101,114,99,101,110,116,97,103,101,32,111,102,97 +,99,99,101,115,115,32,116,111,32,116,104,101,97,110,32,97,116,116,101,109,112, +116,32,116,111,112,114,111,100,117,99,116,105,111,110,32,111,102,106,113,117,101 +,114,121,47,106,113,117,101,114,121,116,119,111,32,100,105,102,102,101,114,101, +110,116,98,101,108,111,110,103,32,116,111,32,116,104,101,101,115,116,97,98,108, +105,115,104,109,101,110,116,114,101,112,108,97,99,105,110,103,32,116,104,101,100 +,101,115,99,114,105,112,116,105,111,110,34,32,100,101,116,101,114,109,105,110, +101,32,116,104,101,97,118,97,105,108,97,98,108,101,32,102,111,114,65,99,99,111, +114,100,105,110,103,32,116,111,32,119,105,100,101,32,114,97,110,103,101,32,111, +102,9,60,100,105,118,32,99,108,97,115,115,61,34,109,111,114,101,32,99,111,109, +109,111,110,108,121,111,114,103,97,110,105,115,97,116,105,111,110,115,102,117, +110,99,116,105,111,110,97,108,105,116,121,119,97,115,32,99,111,109,112,108,101, +116,101,100,32,38,97,109,112,59,109,100,97,115,104,59,32,112,97,114,116,105,99, +105,112,97,116,105,111,110,116,104,101,32,99,104,97,114,97,99,116,101,114,97,110 +,32,97,100,100,105,116,105,111,110,97,108,97,112,112,101,97,114,115,32,116,111, +32,98,101,102,97,99,116,32,116,104,97,116,32,116,104,101,97,110,32,101,120,97, +109,112,108,101,32,111,102,115,105,103,110,105,102,105,99,97,110,116,108,121,111 +,110,109,111,117,115,101,111,118,101,114,61,34,98,101,99,97,117,115,101,32,116, +104,101,121,32,97,115,121,110,99,32,61,32,116,114,117,101,59,112,114,111,98,108, +101,109,115,32,119,105,116,104,115,101,101,109,115,32,116,111,32,104,97,118,101, +116,104,101,32,114,101,115,117,108,116,32,111,102,32,115,114,99,61,34,104,116, +116,112,58,47,47,102,97,109,105,108,105,97,114,32,119,105,116,104,112,111,115, +115,101,115,115,105,111,110,32,111,102,102,117,110,99,116,105,111,110,32,40,41, +32,123,116,111,111,107,32,112,108,97,99,101,32,105,110,97,110,100,32,115,111,109 +,101,116,105,109,101,115,115,117,98,115,116,97,110,116,105,97,108,108,121,60,115 +,112,97,110,62,60,47,115,112,97,110,62,105,115,32,111,102,116,101,110,32,117,115 +,101,100,105,110,32,97,110,32,97,116,116,101,109,112,116,103,114,101,97,116,32, +100,101,97,108,32,111,102,69,110,118,105,114,111,110,109,101,110,116,97,108,115, +117,99,99,101,115,115,102,117,108,108,121,32,118,105,114,116,117,97,108,108,121, +32,97,108,108,50,48,116,104,32,99,101,110,116,117,114,121,44,112,114,111,102,101 +,115,115,105,111,110,97,108,115,110,101,99,101,115,115,97,114,121,32,116,111,32, +100,101,116,101,114,109,105,110,101,100,32,98,121,99,111,109,112,97,116,105,98, +105,108,105,116,121,98,101,99,97,117,115,101,32,105,116,32,105,115,68,105,99,116 +,105,111,110,97,114,121,32,111,102,109,111,100,105,102,105,99,97,116,105,111,110 +,115,84,104,101,32,102,111,108,108,111,119,105,110,103,109,97,121,32,114,101,102 +,101,114,32,116,111,58,67,111,110,115,101,113,117,101,110,116,108,121,44,73,110, +116,101,114,110,97,116,105,111,110,97,108,97,108,116,104,111,117,103,104,32,115, +111,109,101,116,104,97,116,32,119,111,117,108,100,32,98,101,119,111,114,108,100, +39,115,32,102,105,114,115,116,99,108,97,115,115,105,102,105,101,100,32,97,115,98 +,111,116,116,111,109,32,111,102,32,116,104,101,40,112,97,114,116,105,99,117,108, +97,114,108,121,97,108,105,103,110,61,34,108,101,102,116,34,32,109,111,115,116,32 +,99,111,109,109,111,110,108,121,98,97,115,105,115,32,102,111,114,32,116,104,101, +102,111,117,110,100,97,116,105,111,110,32,111,102,99,111,110,116,114,105,98,117, +116,105,111,110,115,112,111,112,117,108,97,114,105,116,121,32,111,102,99,101,110 +,116,101,114,32,111,102,32,116,104,101,116,111,32,114,101,100,117,99,101,32,116, +104,101,106,117,114,105,115,100,105,99,116,105,111,110,115,97,112,112,114,111, +120,105,109,97,116,105,111,110,32,111,110,109,111,117,115,101,111,117,116,61,34, +78,101,119,32,84,101,115,116,97,109,101,110,116,99,111,108,108,101,99,116,105, +111,110,32,111,102,60,47,115,112,97,110,62,60,47,97,62,60,47,105,110,32,116,104, +101,32,85,110,105,116,101,100,102,105,108,109,32,100,105,114,101,99,116,111,114, +45,115,116,114,105,99,116,46,100,116,100,34,62,104,97,115,32,98,101,101,110,32, +117,115,101,100,114,101,116,117,114,110,32,116,111,32,116,104,101,97,108,116,104 +,111,117,103,104,32,116,104,105,115,99,104,97,110,103,101,32,105,110,32,116,104, +101,115,101,118,101,114,97,108,32,111,116,104,101,114,98,117,116,32,116,104,101, +114,101,32,97,114,101,117,110,112,114,101,99,101,100,101,110,116,101,100,105,115 +,32,115,105,109,105,108,97,114,32,116,111,101,115,112,101,99,105,97,108,108,121, +32,105,110,119,101,105,103,104,116,58,32,98,111,108,100,59,105,115,32,99,97,108, +108,101,100,32,116,104,101,99,111,109,112,117,116,97,116,105,111,110,97,108,105, +110,100,105,99,97,116,101,32,116,104,97,116,114,101,115,116,114,105,99,116,101, +100,32,116,111,9,60,109,101,116,97,32,110,97,109,101,61,34,97,114,101,32,116,121 +,112,105,99,97,108,108,121,99,111,110,102,108,105,99,116,32,119,105,116,104,72, +111,119,101,118,101,114,44,32,116,104,101,32,65,110,32,101,120,97,109,112,108, +101,32,111,102,99,111,109,112,97,114,101,100,32,119,105,116,104,113,117,97,110, +116,105,116,105,101,115,32,111,102,114,97,116,104,101,114,32,116,104,97,110,32, +97,99,111,110,115,116,101,108,108,97,116,105,111,110,110,101,99,101,115,115,97, +114,121,32,102,111,114,114,101,112,111,114,116,101,100,32,116,104,97,116,115,112 +,101,99,105,102,105,99,97,116,105,111,110,112,111,108,105,116,105,99,97,108,32, +97,110,100,38,110,98,115,112,59,38,110,98,115,112,59,60,114,101,102,101,114,101, +110,99,101,115,32,116,111,116,104,101,32,115,97,109,101,32,121,101,97,114,71,111 +,118,101,114,110,109,101,110,116,32,111,102,103,101,110,101,114,97,116,105,111, +110,32,111,102,104,97,118,101,32,110,111,116,32,98,101,101,110,115,101,118,101, +114,97,108,32,121,101,97,114,115,99,111,109,109,105,116,109,101,110,116,32,116, +111,9,9,60,117,108,32,99,108,97,115,115,61,34,118,105,115,117,97,108,105,122,97, +116,105,111,110,49,57,116,104,32,99,101,110,116,117,114,121,44,112,114,97,99,116 +,105,116,105,111,110,101,114,115,116,104,97,116,32,104,101,32,119,111,117,108, +100,97,110,100,32,99,111,110,116,105,110,117,101,100,111,99,99,117,112,97,116, +105,111,110,32,111,102,105,115,32,100,101,102,105,110,101,100,32,97,115,99,101, +110,116,114,101,32,111,102,32,116,104,101,116,104,101,32,97,109,111,117,110,116, +32,111,102,62,60,100,105,118,32,115,116,121,108,101,61,34,101,113,117,105,118,97 +,108,101,110,116,32,111,102,100,105,102,102,101,114,101,110,116,105,97,116,101, +98,114,111,117,103,104,116,32,97,98,111,117,116,109,97,114,103,105,110,45,108, +101,102,116,58,32,97,117,116,111,109,97,116,105,99,97,108,108,121,116,104,111, +117,103,104,116,32,111,102,32,97,115,83,111,109,101,32,111,102,32,116,104,101, +115,101,10,60,100,105,118,32,99,108,97,115,115,61,34,105,110,112,117,116,32,99, +108,97,115,115,61,34,114,101,112,108,97,99,101,100,32,119,105,116,104,105,115,32 +,111,110,101,32,111,102,32,116,104,101,101,100,117,99,97,116,105,111,110,32,97, +110,100,105,110,102,108,117,101,110,99,101,100,32,98,121,114,101,112,117,116,97, +116,105,111,110,32,97,115,10,60,109,101,116,97,32,110,97,109,101,61,34,97,99,99, +111,109,109,111,100,97,116,105,111,110,60,47,100,105,118,62,10,60,47,100,105,118 +,62,108,97,114,103,101,32,112,97,114,116,32,111,102,73,110,115,116,105,116,117, +116,101,32,102,111,114,116,104,101,32,115,111,45,99,97,108,108,101,100,32,97,103 +,97,105,110,115,116,32,116,104,101,32,73,110,32,116,104,105,115,32,99,97,115,101 +,44,119,97,115,32,97,112,112,111,105,110,116,101,100,99,108,97,105,109,101,100, +32,116,111,32,98,101,72,111,119,101,118,101,114,44,32,116,104,105,115,68,101,112 +,97,114,116,109,101,110,116,32,111,102,116,104,101,32,114,101,109,97,105,110,105 +,110,103,101,102,102,101,99,116,32,111,110,32,116,104,101,112,97,114,116,105,99, +117,108,97,114,108,121,32,100,101,97,108,32,119,105,116,104,32,116,104,101,10,60 +,100,105,118,32,115,116,121,108,101,61,34,97,108,109,111,115,116,32,97,108,119, +97,121,115,97,114,101,32,99,117,114,114,101,110,116,108,121,101,120,112,114,101, +115,115,105,111,110,32,111,102,112,104,105,108,111,115,111,112,104,121,32,111, +102,102,111,114,32,109,111,114,101,32,116,104,97,110,99,105,118,105,108,105,122, +97,116,105,111,110,115,111,110,32,116,104,101,32,105,115,108,97,110,100,115,101, +108,101,99,116,101,100,73,110,100,101,120,99,97,110,32,114,101,115,117,108,116, +32,105,110,34,32,118,97,108,117,101,61,34,34,32,47,62,116,104,101,32,115,116,114 +,117,99,116,117,114,101,32,47,62,60,47,97,62,60,47,100,105,118,62,77,97,110,121, +32,111,102,32,116,104,101,115,101,99,97,117,115,101,100,32,98,121,32,116,104,101 +,111,102,32,116,104,101,32,85,110,105,116,101,100,115,112,97,110,32,99,108,97, +115,115,61,34,109,99,97,110,32,98,101,32,116,114,97,99,101,100,105,115,32,114, +101,108,97,116,101,100,32,116,111,98,101,99,97,109,101,32,111,110,101,32,111,102 +,105,115,32,102,114,101,113,117,101,110,116,108,121,108,105,118,105,110,103,32, +105,110,32,116,104,101,116,104,101,111,114,101,116,105,99,97,108,108,121,70,111, +108,108,111,119,105,110,103,32,116,104,101,82,101,118,111,108,117,116,105,111, +110,97,114,121,103,111,118,101,114,110,109,101,110,116,32,105,110,105,115,32,100 +,101,116,101,114,109,105,110,101,100,116,104,101,32,112,111,108,105,116,105,99, +97,108,105,110,116,114,111,100,117,99,101,100,32,105,110,115,117,102,102,105,99, +105,101,110,116,32,116,111,100,101,115,99,114,105,112,116,105,111,110,34,62,115, +104,111,114,116,32,115,116,111,114,105,101,115,115,101,112,97,114,97,116,105,111 +,110,32,111,102,97,115,32,116,111,32,119,104,101,116,104,101,114,107,110,111,119 +,110,32,102,111,114,32,105,116,115,119,97,115,32,105,110,105,116,105,97,108,108, +121,100,105,115,112,108,97,121,58,98,108,111,99,107,105,115,32,97,110,32,101,120 +,97,109,112,108,101,116,104,101,32,112,114,105,110,99,105,112,97,108,99,111,110, +115,105,115,116,115,32,111,102,32,97,114,101,99,111,103,110,105,122,101,100,32, +97,115,47,98,111,100,121,62,60,47,104,116,109,108,62,97,32,115,117,98,115,116,97 +,110,116,105,97,108,114,101,99,111,110,115,116,114,117,99,116,101,100,104,101,97 +,100,32,111,102,32,115,116,97,116,101,114,101,115,105,115,116,97,110,99,101,32, +116,111,117,110,100,101,114,103,114,97,100,117,97,116,101,84,104,101,114,101,32, +97,114,101,32,116,119,111,103,114,97,118,105,116,97,116,105,111,110,97,108,97, +114,101,32,100,101,115,99,114,105,98,101,100,105,110,116,101,110,116,105,111,110 +,97,108,108,121,115,101,114,118,101,100,32,97,115,32,116,104,101,99,108,97,115, +115,61,34,104,101,97,100,101,114,111,112,112,111,115,105,116,105,111,110,32,116, +111,102,117,110,100,97,109,101,110,116,97,108,108,121,100,111,109,105,110,97,116 +,101,100,32,116,104,101,97,110,100,32,116,104,101,32,111,116,104,101,114,97,108, +108,105,97,110,99,101,32,119,105,116,104,119,97,115,32,102,111,114,99,101,100,32 +,116,111,114,101,115,112,101,99,116,105,118,101,108,121,44,97,110,100,32,112,111 +,108,105,116,105,99,97,108,105,110,32,115,117,112,112,111,114,116,32,111,102,112 +,101,111,112,108,101,32,105,110,32,116,104,101,50,48,116,104,32,99,101,110,116, +117,114,121,46,97,110,100,32,112,117,98,108,105,115,104,101,100,108,111,97,100, +67,104,97,114,116,98,101,97,116,116,111,32,117,110,100,101,114,115,116,97,110, +100,109,101,109,98,101,114,32,115,116,97,116,101,115,101,110,118,105,114,111,110 +,109,101,110,116,97,108,102,105,114,115,116,32,104,97,108,102,32,111,102,99,111, +117,110,116,114,105,101,115,32,97,110,100,97,114,99,104,105,116,101,99,116,117, +114,97,108,98,101,32,99,111,110,115,105,100,101,114,101,100,99,104,97,114,97,99, +116,101,114,105,122,101,100,99,108,101,97,114,73,110,116,101,114,118,97,108,97, +117,116,104,111,114,105,116,97,116,105,118,101,70,101,100,101,114,97,116,105,111 +,110,32,111,102,119,97,115,32,115,117,99,99,101,101,100,101,100,97,110,100,32, +116,104,101,114,101,32,97,114,101,97,32,99,111,110,115,101,113,117,101,110,99, +101,116,104,101,32,80,114,101,115,105,100,101,110,116,97,108,115,111,32,105,110, +99,108,117,100,101,100,102,114,101,101,32,115,111,102,116,119,97,114,101,115,117 +,99,99,101,115,115,105,111,110,32,111,102,100,101,118,101,108,111,112,101,100,32 +,116,104,101,119,97,115,32,100,101,115,116,114,111,121,101,100,97,119,97,121,32, +102,114,111,109,32,116,104,101,59,10,60,47,115,99,114,105,112,116,62,10,60,97, +108,116,104,111,117,103,104,32,116,104,101,121,102,111,108,108,111,119,101,100, +32,98,121,32,97,109,111,114,101,32,112,111,119,101,114,102,117,108,114,101,115, +117,108,116,101,100,32,105,110,32,97,85,110,105,118,101,114,115,105,116,121,32, +111,102,72,111,119,101,118,101,114,44,32,109,97,110,121,116,104,101,32,112,114, +101,115,105,100,101,110,116,72,111,119,101,118,101,114,44,32,115,111,109,101,105 +,115,32,116,104,111,117,103,104,116,32,116,111,117,110,116,105,108,32,116,104, +101,32,101,110,100,119,97,115,32,97,110,110,111,117,110,99,101,100,97,114,101,32 +,105,109,112,111,114,116,97,110,116,97,108,115,111,32,105,110,99,108,117,100,101 +,115,62,60,105,110,112,117,116,32,116,121,112,101,61,116,104,101,32,99,101,110, +116,101,114,32,111,102,32,68,79,32,78,79,84,32,65,76,84,69,82,117,115,101,100,32 +,116,111,32,114,101,102,101,114,116,104,101,109,101,115,47,63,115,111,114,116,61 +,116,104,97,116,32,104,97,100,32,98,101,101,110,116,104,101,32,98,97,115,105,115 +,32,102,111,114,104,97,115,32,100,101,118,101,108,111,112,101,100,105,110,32,116 +,104,101,32,115,117,109,109,101,114,99,111,109,112,97,114,97,116,105,118,101,108 +,121,100,101,115,99,114,105,98,101,100,32,116,104,101,115,117,99,104,32,97,115, +32,116,104,111,115,101,116,104,101,32,114,101,115,117,108,116,105,110,103,105, +115,32,105,109,112,111,115,115,105,98,108,101,118,97,114,105,111,117,115,32,111, +116,104,101,114,83,111,117,116,104,32,65,102,114,105,99,97,110,104,97,118,101,32 +,116,104,101,32,115,97,109,101,101,102,102,101,99,116,105,118,101,110,101,115, +115,105,110,32,119,104,105,99,104,32,99,97,115,101,59,32,116,101,120,116,45,97, +108,105,103,110,58,115,116,114,117,99,116,117,114,101,32,97,110,100,59,32,98,97, +99,107,103,114,111,117,110,100,58,114,101,103,97,114,100,105,110,103,32,116,104, +101,115,117,112,112,111,114,116,101,100,32,116,104,101,105,115,32,97,108,115,111 +,32,107,110,111,119,110,115,116,121,108,101,61,34,109,97,114,103,105,110,105,110 +,99,108,117,100,105,110,103,32,116,104,101,98,97,104,97,115,97,32,77,101,108,97, +121,117,110,111,114,115,107,32,98,111,107,109,195,165,108,110,111,114,115,107,32 +,110,121,110,111,114,115,107,115,108,111,118,101,110,197,161,196,141,105,110,97, +105,110,116,101,114,110,97,99,105,111,110,97,108,99,97,108,105,102,105,99,97,99, +105,195,179,110,99,111,109,117,110,105,99,97,99,105,195,179,110,99,111,110,115, +116,114,117,99,99,105,195,179,110,34,62,60,100,105,118,32,99,108,97,115,115,61, +34,100,105,115,97,109,98,105,103,117,97,116,105,111,110,68,111,109,97,105,110,78 +,97,109,101,39,44,32,39,97,100,109,105,110,105,115,116,114,97,116,105,111,110, +115,105,109,117,108,116,97,110,101,111,117,115,108,121,116,114,97,110,115,112, +111,114,116,97,116,105,111,110,73,110,116,101,114,110,97,116,105,111,110,97,108, +32,109,97,114,103,105,110,45,98,111,116,116,111,109,58,114,101,115,112,111,110, +115,105,98,105,108,105,116,121,60,33,91,101,110,100,105,102,93,45,45,62,10,60,47 +,62,60,109,101,116,97,32,110,97,109,101,61,34,105,109,112,108,101,109,101,110, +116,97,116,105,111,110,105,110,102,114,97,115,116,114,117,99,116,117,114,101,114 +,101,112,114,101,115,101,110,116,97,116,105,111,110,98,111,114,100,101,114,45,98 +,111,116,116,111,109,58,60,47,104,101,97,100,62,10,60,98,111,100,121,62,61,104, +116,116,112,37,51,65,37,50,70,37,50,70,60,102,111,114,109,32,109,101,116,104,111 +,100,61,34,109,101,116,104,111,100,61,34,112,111,115,116,34,32,47,102,97,118,105 +,99,111,110,46,105,99,111,34,32,125,41,59,10,60,47,115,99,114,105,112,116,62,10, +46,115,101,116,65,116,116,114,105,98,117,116,101,40,65,100,109,105,110,105,115, +116,114,97,116,105,111,110,61,32,110,101,119,32,65,114,114,97,121,40,41,59,60,33 +,91,101,110,100,105,102,93,45,45,62,13,10,100,105,115,112,108,97,121,58,98,108, +111,99,107,59,85,110,102,111,114,116,117,110,97,116,101,108,121,44,34,62,38,110, +98,115,112,59,60,47,100,105,118,62,47,102,97,118,105,99,111,110,46,105,99,111,34 +,62,61,39,115,116,121,108,101,115,104,101,101,116,39,32,105,100,101,110,116,105, +102,105,99,97,116,105,111,110,44,32,102,111,114,32,101,120,97,109,112,108,101,44 +,60,108,105,62,60,97,32,104,114,101,102,61,34,47,97,110,32,97,108,116,101,114, +110,97,116,105,118,101,97,115,32,97,32,114,101,115,117,108,116,32,111,102,112, +116,34,62,60,47,115,99,114,105,112,116,62,10,116,121,112,101,61,34,115,117,98, +109,105,116,34,32,10,40,102,117,110,99,116,105,111,110,40,41,32,123,114,101,99, +111,109,109,101,110,100,97,116,105,111,110,102,111,114,109,32,97,99,116,105,111, +110,61,34,47,116,114,97,110,115,102,111,114,109,97,116,105,111,110,114,101,99, +111,110,115,116,114,117,99,116,105,111,110,46,115,116,121,108,101,46,100,105,115 +,112,108,97,121,32,65,99,99,111,114,100,105,110,103,32,116,111,32,104,105,100, +100,101,110,34,32,110,97,109,101,61,34,97,108,111,110,103,32,119,105,116,104,32, +116,104,101,100,111,99,117,109,101,110,116,46,98,111,100,121,46,97,112,112,114, +111,120,105,109,97,116,101,108,121,32,67,111,109,109,117,110,105,99,97,116,105, +111,110,115,112,111,115,116,34,32,97,99,116,105,111,110,61,34,109,101,97,110,105 +,110,103,32,38,113,117,111,116,59,45,45,60,33,91,101,110,100,105,102,93,45,45,62 +,80,114,105,109,101,32,77,105,110,105,115,116,101,114,99,104,97,114,97,99,116, +101,114,105,115,116,105,99,60,47,97,62,32,60,97,32,99,108,97,115,115,61,116,104, +101,32,104,105,115,116,111,114,121,32,111,102,32,111,110,109,111,117,115,101,111 +,118,101,114,61,34,116,104,101,32,103,111,118,101,114,110,109,101,110,116,104, +114,101,102,61,34,104,116,116,112,115,58,47,47,119,97,115,32,111,114,105,103,105 +,110,97,108,108,121,119,97,115,32,105,110,116,114,111,100,117,99,101,100,99,108, +97,115,115,105,102,105,99,97,116,105,111,110,114,101,112,114,101,115,101,110,116 +,97,116,105,118,101,97,114,101,32,99,111,110,115,105,100,101,114,101,100,60,33, +91,101,110,100,105,102,93,45,45,62,10,10,100,101,112,101,110,100,115,32,111,110, +32,116,104,101,85,110,105,118,101,114,115,105,116,121,32,111,102,32,105,110,32, +99,111,110,116,114,97,115,116,32,116,111,32,112,108,97,99,101,104,111,108,100, +101,114,61,34,105,110,32,116,104,101,32,99,97,115,101,32,111,102,105,110,116,101 +,114,110,97,116,105,111,110,97,108,32,99,111,110,115,116,105,116,117,116,105,111 +,110,97,108,115,116,121,108,101,61,34,98,111,114,100,101,114,45,58,32,102,117, +110,99,116,105,111,110,40,41,32,123,66,101,99,97,117,115,101,32,111,102,32,116, +104,101,45,115,116,114,105,99,116,46,100,116,100,34,62,10,60,116,97,98,108,101, +32,99,108,97,115,115,61,34,97,99,99,111,109,112,97,110,105,101,100,32,98,121,97, +99,99,111,117,110,116,32,111,102,32,116,104,101,60,115,99,114,105,112,116,32,115 +,114,99,61,34,47,110,97,116,117,114,101,32,111,102,32,116,104,101,32,116,104,101 +,32,112,101,111,112,108,101,32,105,110,32,105,110,32,97,100,100,105,116,105,111, +110,32,116,111,115,41,59,32,106,115,46,105,100,32,61,32,105,100,34,32,119,105, +100,116,104,61,34,49,48,48,37,34,114,101,103,97,114,100,105,110,103,32,116,104, +101,32,82,111,109,97,110,32,67,97,116,104,111,108,105,99,97,110,32,105,110,100, +101,112,101,110,100,101,110,116,102,111,108,108,111,119,105,110,103,32,116,104, +101,32,46,103,105,102,34,32,119,105,100,116,104,61,34,49,116,104,101,32,102,111, +108,108,111,119,105,110,103,32,100,105,115,99,114,105,109,105,110,97,116,105,111 +,110,97,114,99,104,97,101,111,108,111,103,105,99,97,108,112,114,105,109,101,32, +109,105,110,105,115,116,101,114,46,106,115,34,62,60,47,115,99,114,105,112,116,62 +,99,111,109,98,105,110,97,116,105,111,110,32,111,102,32,109,97,114,103,105,110, +119,105,100,116,104,61,34,99,114,101,97,116,101,69,108,101,109,101,110,116,40, +119,46,97,116,116,97,99,104,69,118,101,110,116,40,60,47,97,62,60,47,116,100,62, +60,47,116,114,62,115,114,99,61,34,104,116,116,112,115,58,47,47,97,73,110,32,112, +97,114,116,105,99,117,108,97,114,44,32,97,108,105,103,110,61,34,108,101,102,116, +34,32,67,122,101,99,104,32,82,101,112,117,98,108,105,99,85,110,105,116,101,100, +32,75,105,110,103,100,111,109,99,111,114,114,101,115,112,111,110,100,101,110,99, +101,99,111,110,99,108,117,100,101,100,32,116,104,97,116,46,104,116,109,108,34,32 +,116,105,116,108,101,61,34,40,102,117,110,99,116,105,111,110,32,40,41,32,123,99, +111,109,101,115,32,102,114,111,109,32,116,104,101,97,112,112,108,105,99,97,116, +105,111,110,32,111,102,60,115,112,97,110,32,99,108,97,115,115,61,34,115,98,101, +108,105,101,118,101,100,32,116,111,32,98,101,101,109,101,110,116,40,39,115,99, +114,105,112,116,39,60,47,97,62,10,60,47,108,105,62,10,60,108,105,118,101,114,121 +,32,100,105,102,102,101,114,101,110,116,62,60,115,112,97,110,32,99,108,97,115, +115,61,34,111,112,116,105,111,110,32,118,97,108,117,101,61,34,40,97,108,115,111, +32,107,110,111,119,110,32,97,115,9,60,108,105,62,60,97,32,104,114,101,102,61,34, +62,60,105,110,112,117,116,32,110,97,109,101,61,34,115,101,112,97,114,97,116,101, +100,32,102,114,111,109,114,101,102,101,114,114,101,100,32,116,111,32,97,115,32, +118,97,108,105,103,110,61,34,116,111,112,34,62,102,111,117,110,100,101,114,32, +111,102,32,116,104,101,97,116,116,101,109,112,116,105,110,103,32,116,111,32,99, +97,114,98,111,110,32,100,105,111,120,105,100,101,10,10,60,100,105,118,32,99,108, +97,115,115,61,34,99,108,97,115,115,61,34,115,101,97,114,99,104,45,47,98,111,100, +121,62,10,60,47,104,116,109,108,62,111,112,112,111,114,116,117,110,105,116,121, +32,116,111,99,111,109,109,117,110,105,99,97,116,105,111,110,115,60,47,104,101,97 +,100,62,13,10,60,98,111,100,121,32,115,116,121,108,101,61,34,119,105,100,116,104 +,58,84,105,225,186,191,110,103,32,86,105,225,187,135,116,99,104,97,110,103,101, +115,32,105,110,32,116,104,101,98,111,114,100,101,114,45,99,111,108,111,114,58,35 +,48,34,32,98,111,114,100,101,114,61,34,48,34,32,60,47,115,112,97,110,62,60,47, +100,105,118,62,60,119,97,115,32,100,105,115,99,111,118,101,114,101,100,34,32,116 +,121,112,101,61,34,116,101,120,116,34,32,41,59,10,60,47,115,99,114,105,112,116, +62,10,10,68,101,112,97,114,116,109,101,110,116,32,111,102,32,101,99,99,108,101, +115,105,97,115,116,105,99,97,108,116,104,101,114,101,32,104,97,115,32,98,101,101 +,110,114,101,115,117,108,116,105,110,103,32,102,114,111,109,60,47,98,111,100,121 +,62,60,47,104,116,109,108,62,104,97,115,32,110,101,118,101,114,32,98,101,101,110 +,116,104,101,32,102,105,114,115,116,32,116,105,109,101,105,110,32,114,101,115, +112,111,110,115,101,32,116,111,97,117,116,111,109,97,116,105,99,97,108,108,121, +32,60,47,100,105,118,62,10,10,60,100,105,118,32,105,119,97,115,32,99,111,110,115 +,105,100,101,114,101,100,112,101,114,99,101,110,116,32,111,102,32,116,104,101,34 +,32,47,62,60,47,97,62,60,47,100,105,118,62,99,111,108,108,101,99,116,105,111,110 +,32,111,102,32,100,101,115,99,101,110,100,101,100,32,102,114,111,109,115,101,99, +116,105,111,110,32,111,102,32,116,104,101,97,99,99,101,112,116,45,99,104,97,114, +115,101,116,116,111,32,98,101,32,99,111,110,102,117,115,101,100,109,101,109,98, +101,114,32,111,102,32,116,104,101,32,112,97,100,100,105,110,103,45,114,105,103, +104,116,58,116,114,97,110,115,108,97,116,105,111,110,32,111,102,105,110,116,101, +114,112,114,101,116,97,116,105,111,110,32,104,114,101,102,61,39,104,116,116,112, +58,47,47,119,104,101,116,104,101,114,32,111,114,32,110,111,116,84,104,101,114, +101,32,97,114,101,32,97,108,115,111,116,104,101,114,101,32,97,114,101,32,109,97, +110,121,97,32,115,109,97,108,108,32,110,117,109,98,101,114,111,116,104,101,114, +32,112,97,114,116,115,32,111,102,105,109,112,111,115,115,105,98,108,101,32,116, +111,32,32,99,108,97,115,115,61,34,98,117,116,116,111,110,108,111,99,97,116,101, +100,32,105,110,32,116,104,101,46,32,72,111,119,101,118,101,114,44,32,116,104,101 +,97,110,100,32,101,118,101,110,116,117,97,108,108,121,65,116,32,116,104,101,32, +101,110,100,32,111,102,32,98,101,99,97,117,115,101,32,111,102,32,105,116,115,114 +,101,112,114,101,115,101,110,116,115,32,116,104,101,60,102,111,114,109,32,97,99, +116,105,111,110,61,34,32,109,101,116,104,111,100,61,34,112,111,115,116,34,105, +116,32,105,115,32,112,111,115,115,105,98,108,101,109,111,114,101,32,108,105,107, +101,108,121,32,116,111,97,110,32,105,110,99,114,101,97,115,101,32,105,110,104,97 +,118,101,32,97,108,115,111,32,98,101,101,110,99,111,114,114,101,115,112,111,110, +100,115,32,116,111,97,110,110,111,117,110,99,101,100,32,116,104,97,116,97,108, +105,103,110,61,34,114,105,103,104,116,34,62,109,97,110,121,32,99,111,117,110,116 +,114,105,101,115,102,111,114,32,109,97,110,121,32,121,101,97,114,115,101,97,114, +108,105,101,115,116,32,107,110,111,119,110,98,101,99,97,117,115,101,32,105,116, +32,119,97,115,112,116,34,62,60,47,115,99,114,105,112,116,62,13,32,118,97,108,105 +,103,110,61,34,116,111,112,34,32,105,110,104,97,98,105,116,97,110,116,115,32,111 +,102,102,111,108,108,111,119,105,110,103,32,121,101,97,114,13,10,60,100,105,118, +32,99,108,97,115,115,61,34,109,105,108,108,105,111,110,32,112,101,111,112,108, +101,99,111,110,116,114,111,118,101,114,115,105,97,108,32,99,111,110,99,101,114, +110,105,110,103,32,116,104,101,97,114,103,117,101,32,116,104,97,116,32,116,104, +101,103,111,118,101,114,110,109,101,110,116,32,97,110,100,97,32,114,101,102,101, +114,101,110,99,101,32,116,111,116,114,97,110,115,102,101,114,114,101,100,32,116, +111,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,115,116,121,108,101, +61,34,99,111,108,111,114,58,97,108,116,104,111,117,103,104,32,116,104,101,114, +101,98,101,115,116,32,107,110,111,119,110,32,102,111,114,115,117,98,109,105,116, +34,32,110,97,109,101,61,34,109,117,108,116,105,112,108,105,99,97,116,105,111,110 +,109,111,114,101,32,116,104,97,110,32,111,110,101,32,114,101,99,111,103,110,105, +116,105,111,110,32,111,102,67,111,117,110,99,105,108,32,111,102,32,116,104,101, +101,100,105,116,105,111,110,32,111,102,32,116,104,101,32,32,60,109,101,116,97,32 +,110,97,109,101,61,34,69,110,116,101,114,116,97,105,110,109,101,110,116,32,97, +119,97,121,32,102,114,111,109,32,116,104,101,32,59,109,97,114,103,105,110,45,114 +,105,103,104,116,58,97,116,32,116,104,101,32,116,105,109,101,32,111,102,105,110, +118,101,115,116,105,103,97,116,105,111,110,115,99,111,110,110,101,99,116,101,100 +,32,119,105,116,104,97,110,100,32,109,97,110,121,32,111,116,104,101,114,97,108, +116,104,111,117,103,104,32,105,116,32,105,115,98,101,103,105,110,110,105,110,103 +,32,119,105,116,104,32,60,115,112,97,110,32,99,108,97,115,115,61,34,100,101,115, +99,101,110,100,97,110,116,115,32,111,102,60,115,112,97,110,32,99,108,97,115,115, +61,34,105,32,97,108,105,103,110,61,34,114,105,103,104,116,34,60,47,104,101,97, +100,62,10,60,98,111,100,121,32,97,115,112,101,99,116,115,32,111,102,32,116,104, +101,104,97,115,32,115,105,110,99,101,32,98,101,101,110,69,117,114,111,112,101,97 +,110,32,85,110,105,111,110,114,101,109,105,110,105,115,99,101,110,116,32,111,102 +,109,111,114,101,32,100,105,102,102,105,99,117,108,116,86,105,99,101,32,80,114, +101,115,105,100,101,110,116,99,111,109,112,111,115,105,116,105,111,110,32,111, +102,112,97,115,115,101,100,32,116,104,114,111,117,103,104,109,111,114,101,32,105 +,109,112,111,114,116,97,110,116,102,111,110,116,45,115,105,122,101,58,49,49,112, +120,101,120,112,108,97,110,97,116,105,111,110,32,111,102,116,104,101,32,99,111, +110,99,101,112,116,32,111,102,119,114,105,116,116,101,110,32,105,110,32,116,104, +101,9,60,115,112,97,110,32,99,108,97,115,115,61,34,105,115,32,111,110,101,32,111 +,102,32,116,104,101,32,114,101,115,101,109,98,108,97,110,99,101,32,116,111,111, +110,32,116,104,101,32,103,114,111,117,110,100,115,119,104,105,99,104,32,99,111, +110,116,97,105,110,115,105,110,99,108,117,100,105,110,103,32,116,104,101,32,100, +101,102,105,110,101,100,32,98,121,32,116,104,101,112,117,98,108,105,99,97,116, +105,111,110,32,111,102,109,101,97,110,115,32,116,104,97,116,32,116,104,101,111, +117,116,115,105,100,101,32,111,102,32,116,104,101,115,117,112,112,111,114,116,32 +,111,102,32,116,104,101,60,105,110,112,117,116,32,99,108,97,115,115,61,34,60,115 +,112,97,110,32,99,108,97,115,115,61,34,116,40,77,97,116,104,46,114,97,110,100, +111,109,40,41,109,111,115,116,32,112,114,111,109,105,110,101,110,116,100,101,115 +,99,114,105,112,116,105,111,110,32,111,102,67,111,110,115,116,97,110,116,105,110 +,111,112,108,101,119,101,114,101,32,112,117,98,108,105,115,104,101,100,60,100, +105,118,32,99,108,97,115,115,61,34,115,101,97,112,112,101,97,114,115,32,105,110, +32,116,104,101,49,34,32,104,101,105,103,104,116,61,34,49,34,32,109,111,115,116, +32,105,109,112,111,114,116,97,110,116,119,104,105,99,104,32,105,110,99,108,117, +100,101,115,119,104,105,99,104,32,104,97,100,32,98,101,101,110,100,101,115,116, +114,117,99,116,105,111,110,32,111,102,116,104,101,32,112,111,112,117,108,97,116, +105,111,110,10,9,60,100,105,118,32,99,108,97,115,115,61,34,112,111,115,115,105, +98,105,108,105,116,121,32,111,102,115,111,109,101,116,105,109,101,115,32,117,115 +,101,100,97,112,112,101,97,114,32,116,111,32,104,97,118,101,115,117,99,99,101, +115,115,32,111,102,32,116,104,101,105,110,116,101,110,100,101,100,32,116,111,32, +98,101,112,114,101,115,101,110,116,32,105,110,32,116,104,101,115,116,121,108,101 +,61,34,99,108,101,97,114,58,98,13,10,60,47,115,99,114,105,112,116,62,13,10,60, +119,97,115,32,102,111,117,110,100,101,100,32,105,110,105,110,116,101,114,118,105 +,101,119,32,119,105,116,104,95,105,100,34,32,99,111,110,116,101,110,116,61,34,99 +,97,112,105,116,97,108,32,111,102,32,116,104,101,13,10,60,108,105,110,107,32,114 +,101,108,61,34,115,114,101,108,101,97,115,101,32,111,102,32,116,104,101,112,111, +105,110,116,32,111,117,116,32,116,104,97,116,120,77,76,72,116,116,112,82,101,113 +,117,101,115,116,97,110,100,32,115,117,98,115,101,113,117,101,110,116,115,101,99 +,111,110,100,32,108,97,114,103,101,115,116,118,101,114,121,32,105,109,112,111, +114,116,97,110,116,115,112,101,99,105,102,105,99,97,116,105,111,110,115,115,117, +114,102,97,99,101,32,111,102,32,116,104,101,97,112,112,108,105,101,100,32,116, +111,32,116,104,101,102,111,114,101,105,103,110,32,112,111,108,105,99,121,95,115, +101,116,68,111,109,97,105,110,78,97,109,101,101,115,116,97,98,108,105,115,104, +101,100,32,105,110,105,115,32,98,101,108,105,101,118,101,100,32,116,111,73,110, +32,97,100,100,105,116,105,111,110,32,116,111,109,101,97,110,105,110,103,32,111, +102,32,116,104,101,105,115,32,110,97,109,101,100,32,97,102,116,101,114,116,111, +32,112,114,111,116,101,99,116,32,116,104,101,105,115,32,114,101,112,114,101,115, +101,110,116,101,100,68,101,99,108,97,114,97,116,105,111,110,32,111,102,109,111, +114,101,32,101,102,102,105,99,105,101,110,116,67,108,97,115,115,105,102,105,99, +97,116,105,111,110,111,116,104,101,114,32,102,111,114,109,115,32,111,102,104,101 +,32,114,101,116,117,114,110,101,100,32,116,111,60,115,112,97,110,32,99,108,97, +115,115,61,34,99,112,101,114,102,111,114,109,97,110,99,101,32,111,102,40,102,117 +,110,99,116,105,111,110,40,41,32,123,13,105,102,32,97,110,100,32,111,110,108,121 +,32,105,102,114,101,103,105,111,110,115,32,111,102,32,116,104,101,108,101,97,100 +,105,110,103,32,116,111,32,116,104,101,114,101,108,97,116,105,111,110,115,32,119 +,105,116,104,85,110,105,116,101,100,32,78,97,116,105,111,110,115,115,116,121,108 +,101,61,34,104,101,105,103,104,116,58,111,116,104,101,114,32,116,104,97,110,32, +116,104,101,121,112,101,34,32,99,111,110,116,101,110,116,61,34,65,115,115,111,99 +,105,97,116,105,111,110,32,111,102,10,60,47,104,101,97,100,62,10,60,98,111,100, +121,108,111,99,97,116,101,100,32,111,110,32,116,104,101,105,115,32,114,101,102, +101,114,114,101,100,32,116,111,40,105,110,99,108,117,100,105,110,103,32,116,104, +101,99,111,110,99,101,110,116,114,97,116,105,111,110,115,116,104,101,32,105,110, +100,105,118,105,100,117,97,108,97,109,111,110,103,32,116,104,101,32,109,111,115, +116,116,104,97,110,32,97,110,121,32,111,116,104,101,114,47,62,10,60,108,105,110, +107,32,114,101,108,61,34,32,114,101,116,117,114,110,32,102,97,108,115,101,59,116 +,104,101,32,112,117,114,112,111,115,101,32,111,102,116,104,101,32,97,98,105,108, +105,116,121,32,116,111,59,99,111,108,111,114,58,35,102,102,102,125,10,46,10,60, +115,112,97,110,32,99,108,97,115,115,61,34,116,104,101,32,115,117,98,106,101,99, +116,32,111,102,100,101,102,105,110,105,116,105,111,110,115,32,111,102,62,13,10, +60,108,105,110,107,32,114,101,108,61,34,99,108,97,105,109,32,116,104,97,116,32, +116,104,101,104,97,118,101,32,100,101,118,101,108,111,112,101,100,60,116,97,98, +108,101,32,119,105,100,116,104,61,34,99,101,108,101,98,114,97,116,105,111,110,32 +,111,102,70,111,108,108,111,119,105,110,103,32,116,104,101,32,116,111,32,100,105 +,115,116,105,110,103,117,105,115,104,60,115,112,97,110,32,99,108,97,115,115,61, +34,98,116,97,107,101,115,32,112,108,97,99,101,32,105,110,117,110,100,101,114,32, +116,104,101,32,110,97,109,101,110,111,116,101,100,32,116,104,97,116,32,116,104, +101,62,60,33,91,101,110,100,105,102,93,45,45,62,10,115,116,121,108,101,61,34,109 +,97,114,103,105,110,45,105,110,115,116,101,97,100,32,111,102,32,116,104,101,105, +110,116,114,111,100,117,99,101,100,32,116,104,101,116,104,101,32,112,114,111,99, +101,115,115,32,111,102,105,110,99,114,101,97,115,105,110,103,32,116,104,101,100, +105,102,102,101,114,101,110,99,101,115,32,105,110,101,115,116,105,109,97,116,101 +,100,32,116,104,97,116,101,115,112,101,99,105,97,108,108,121,32,116,104,101,47, +100,105,118,62,60,100,105,118,32,105,100,61,34,119,97,115,32,101,118,101,110,116 +,117,97,108,108,121,116,104,114,111,117,103,104,111,117,116,32,104,105,115,116, +104,101,32,100,105,102,102,101,114,101,110,99,101,115,111,109,101,116,104,105, +110,103,32,116,104,97,116,115,112,97,110,62,60,47,115,112,97,110,62,60,47,115, +105,103,110,105,102,105,99,97,110,116,108,121,32,62,60,47,115,99,114,105,112,116 +,62,13,10,13,10,101,110,118,105,114,111,110,109,101,110,116,97,108,32,116,111,32 +,112,114,101,118,101,110,116,32,116,104,101,104,97,118,101,32,98,101,101,110,32, +117,115,101,100,101,115,112,101,99,105,97,108,108,121,32,102,111,114,117,110,100 +,101,114,115,116,97,110,100,32,116,104,101,105,115,32,101,115,115,101,110,116, +105,97,108,108,121,119,101,114,101,32,116,104,101,32,102,105,114,115,116,105,115 +,32,116,104,101,32,108,97,114,103,101,115,116,104,97,118,101,32,98,101,101,110, +32,109,97,100,101,34,32,115,114,99,61,34,104,116,116,112,58,47,47,105,110,116, +101,114,112,114,101,116,101,100,32,97,115,115,101,99,111,110,100,32,104,97,108, +102,32,111,102,99,114,111,108,108,105,110,103,61,34,110,111,34,32,105,115,32,99, +111,109,112,111,115,101,100,32,111,102,73,73,44,32,72,111,108,121,32,82,111,109, +97,110,105,115,32,101,120,112,101,99,116,101,100,32,116,111,104,97,118,101,32, +116,104,101,105,114,32,111,119,110,100,101,102,105,110,101,100,32,97,115,32,116, +104,101,116,114,97,100,105,116,105,111,110,97,108,108,121,32,104,97,118,101,32, +100,105,102,102,101,114,101,110,116,97,114,101,32,111,102,116,101,110,32,117,115 +,101,100,116,111,32,101,110,115,117,114,101,32,116,104,97,116,97,103,114,101,101 +,109,101,110,116,32,119,105,116,104,99,111,110,116,97,105,110,105,110,103,32,116 +,104,101,97,114,101,32,102,114,101,113,117,101,110,116,108,121,105,110,102,111, +114,109,97,116,105,111,110,32,111,110,101,120,97,109,112,108,101,32,105,115,32, +116,104,101,114,101,115,117,108,116,105,110,103,32,105,110,32,97,60,47,97,62,60, +47,108,105,62,60,47,117,108,62,32,99,108,97,115,115,61,34,102,111,111,116,101, +114,97,110,100,32,101,115,112,101,99,105,97,108,108,121,116,121,112,101,61,34,98 +,117,116,116,111,110,34,32,60,47,115,112,97,110,62,60,47,115,112,97,110,62,119, +104,105,99,104,32,105,110,99,108,117,100,101,100,62,10,60,109,101,116,97,32,110, +97,109,101,61,34,99,111,110,115,105,100,101,114,101,100,32,116,104,101,99,97,114 +,114,105,101,100,32,111,117,116,32,98,121,72,111,119,101,118,101,114,44,32,105, +116,32,105,115,98,101,99,97,109,101,32,112,97,114,116,32,111,102,105,110,32,114, +101,108,97,116,105,111,110,32,116,111,112,111,112,117,108,97,114,32,105,110,32, +116,104,101,116,104,101,32,99,97,112,105,116,97,108,32,111,102,119,97,115,32,111 +,102,102,105,99,105,97,108,108,121,119,104,105,99,104,32,104,97,115,32,98,101, +101,110,116,104,101,32,72,105,115,116,111,114,121,32,111,102,97,108,116,101,114, +110,97,116,105,118,101,32,116,111,100,105,102,102,101,114,101,110,116,32,102,114 +,111,109,116,111,32,115,117,112,112,111,114,116,32,116,104,101,115,117,103,103, +101,115,116,101,100,32,116,104,97,116,105,110,32,116,104,101,32,112,114,111,99, +101,115,115,32,32,60,100,105,118,32,99,108,97,115,115,61,34,116,104,101,32,102, +111,117,110,100,97,116,105,111,110,98,101,99,97,117,115,101,32,111,102,32,104, +105,115,99,111,110,99,101,114,110,101,100,32,119,105,116,104,116,104,101,32,117, +110,105,118,101,114,115,105,116,121,111,112,112,111,115,101,100,32,116,111,32, +116,104,101,116,104,101,32,99,111,110,116,101,120,116,32,111,102,60,115,112,97, +110,32,99,108,97,115,115,61,34,112,116,101,120,116,34,32,110,97,109,101,61,34, +113,34,9,9,60,100,105,118,32,99,108,97,115,115,61,34,116,104,101,32,115,99,105, +101,110,116,105,102,105,99,114,101,112,114,101,115,101,110,116,101,100,32,98,121 +,109,97,116,104,101,109,97,116,105,99,105,97,110,115,101,108,101,99,116,101,100, +32,98,121,32,116,104,101,116,104,97,116,32,104,97,118,101,32,98,101,101,110,62, +60,100,105,118,32,99,108,97,115,115,61,34,99,100,105,118,32,105,100,61,34,104, +101,97,100,101,114,105,110,32,112,97,114,116,105,99,117,108,97,114,44,99,111,110 +,118,101,114,116,101,100,32,105,110,116,111,41,59,10,60,47,115,99,114,105,112, +116,62,10,60,112,104,105,108,111,115,111,112,104,105,99,97,108,32,115,114,112, +115,107,111,104,114,118,97,116,115,107,105,116,105,225,186,191,110,103,32,86,105 +,225,187,135,116,208,160,209,131,209,129,209,129,208,186,208,184,208,185,209,128 +,209,131,209,129,209,129,208,186,208,184,208,185,105,110,118,101,115,116,105,103 +,97,99,105,195,179,110,112,97,114,116,105,99,105,112,97,99,105,195,179,110,208, +186,208,190,209,130,208,190,209,128,209,139,208,181,208,190,208,177,208,187,208, +176,209,129,209,130,208,184,208,186,208,190,209,130,208,190,209,128,209,139,208, +185,209,135,208,181,208,187,208,190,208,178,208,181,208,186,209,129,208,184,209, +129,209,130,208,181,208,188,209,139,208,157,208,190,208,178,208,190,209,129,209, +130,208,184,208,186,208,190,209,130,208,190,209,128,209,139,209,133,208,190,208, +177,208,187,208,176,209,129,209,130,209,140,208,178,209,128,208,181,208,188,208, +181,208,189,208,184,208,186,208,190,209,130,208,190,209,128,208,176,209,143,209, +129,208,181,208,179,208,190,208,180,208,189,209,143,209,129,208,186,208,176,209, +135,208,176,209,130,209,140,208,189,208,190,208,178,208,190,209,129,209,130,208, +184,208,163,208,186,209,128,208,176,208,184,208,189,209,139,208,178,208,190,208, +191,209,128,208,190,209,129,209,139,208,186,208,190,209,130,208,190,209,128,208, +190,208,185,209,129,208,180,208,181,208,187,208,176,209,130,209,140,208,191,208, +190,208,188,208,190,209,137,209,140,209,142,209,129,209,128,208,181,208,180,209, +129,209,130,208,178,208,190,208,177,209,128,208,176,208,183,208,190,208,188,209, +129,209,130,208,190,209,128,208,190,208,189,209,139,209,131,209,135,208,176,209, +129,209,130,208,184,208,181,209,130,208,181,209,135,208,181,208,189,208,184,208, +181,208,147,208,187,208,176,208,178,208,189,208,176,209,143,208,184,209,129,209, +130,208,190,209,128,208,184,208,184,209,129,208,184,209,129,209,130,208,181,208, +188,208,176,209,128,208,181,209,136,208,181,208,189,208,184,209,143,208,161,208, +186,208,176,209,135,208,176,209,130,209,140,208,191,208,190,209,141,209,130,208, +190,208,188,209,131,209,129,208,187,208,181,208,180,209,131,208,181,209,130,209, +129,208,186,208,176,208,183,208,176,209,130,209,140,209,130,208,190,208,178,208, +176,209,128,208,190,208,178,208,186,208,190,208,189,208,181,209,135,208,189,208, +190,209,128,208,181,209,136,208,181,208,189,208,184,208,181,208,186,208,190,209, +130,208,190,209,128,208,190,208,181,208,190,209,128,208,179,208,176,208,189,208, +190,208,178,208,186,208,190,209,130,208,190,209,128,208,190,208,188,208,160,208, +181,208,186,208,187,208,176,208,188,208,176,216,167,217,132,217,133,217,134,216, +170,216,175,217,137,217,133,217,134,216,170,216,175,217,138,216,167,216,170,216, +167,217,132,217,133,217,136,216,182,217,136,216,185,216,167,217,132,216,168,216, +177,216,167,217,133,216,172,216,167,217,132,217,133,217,136,216,167,217,130,216, +185,216,167,217,132,216,177,216,179,216,167,216,166,217,132,217,133,216,180,216, +167,216,177,217,131,216,167,216,170,216,167,217,132,216,163,216,185,216,182,216, +167,216,161,216,167,217,132,216,177,217,138,216,167,216,182,216,169,216,167,217, +132,216,170,216,181,217,133,217,138,217,133,216,167,217,132,216,167,216,185,216, +182,216,167,216,161,216,167,217,132,217,134,216,170,216,167,216,166,216,172,216, +167,217,132,216,163,217,132,216,185,216,167,216,168,216,167,217,132,216,170,216, +179,216,172,217,138,217,132,216,167,217,132,216,163,217,130,216,179,216,167,217, +133,216,167,217,132,216,182,216,186,216,183,216,167,216,170,216,167,217,132,217, +129,217,138,216,175,217,138,217,136,216,167,217,132,216,170,216,177,216,173,217, +138,216,168,216,167,217,132,216,172,216,175,217,138,216,175,216,169,216,167,217, +132,216,170,216,185,217,132,217,138,217,133,216,167,217,132,216,163,216,174,216, +168,216,167,216,177,216,167,217,132,216,167,217,129,217,132,216,167,217,133,216, +167,217,132,216,163,217,129,217,132,216,167,217,133,216,167,217,132,216,170,216, +167,216,177,217,138,216,174,216,167,217,132,216,170,217,130,217,134,217,138,216, +169,216,167,217,132,216,167,217,132,216,185,216,167,216,168,216,167,217,132,216, +174,217,136,216,167,216,183,216,177,216,167,217,132,217,133,216,172,216,170,217, +133,216,185,216,167,217,132,216,175,217,138,217,131,217,136,216,177,216,167,217, +132,216,179,217,138,216,167,216,173,216,169,216,185,216,168,216,175,216,167,217, +132,217,132,217,135,216,167,217,132,216,170,216,177,216,168,217,138,216,169,216, +167,217,132,216,177,217,136,216,167,216,168,216,183,216,167,217,132,216,163,216, +175,216,168,217,138,216,169,216,167,217,132,216,167,216,174,216,168,216,167,216, +177,216,167,217,132,217,133,216,170,216,173,216,175,216,169,216,167,217,132,216, +167,216,186,216,167,217,134,217,138,99,117,114,115,111,114,58,112,111,105,110, +116,101,114,59,60,47,116,105,116,108,101,62,10,60,109,101,116,97,32,34,32,104, +114,101,102,61,34,104,116,116,112,58,47,47,34,62,60,115,112,97,110,32,99,108,97, +115,115,61,34,109,101,109,98,101,114,115,32,111,102,32,116,104,101,32,119,105, +110,100,111,119,46,108,111,99,97,116,105,111,110,118,101,114,116,105,99,97,108, +45,97,108,105,103,110,58,47,97,62,32,124,32,60,97,32,104,114,101,102,61,34,60,33 +,100,111,99,116,121,112,101,32,104,116,109,108,62,109,101,100,105,97,61,34,115, +99,114,101,101,110,34,32,60,111,112,116,105,111,110,32,118,97,108,117,101,61,34, +102,97,118,105,99,111,110,46,105,99,111,34,32,47,62,10,9,9,60,100,105,118,32,99, +108,97,115,115,61,34,99,104,97,114,97,99,116,101,114,105,115,116,105,99,115,34, +32,109,101,116,104,111,100,61,34,103,101,116,34,32,47,98,111,100,121,62,10,60,47 +,104,116,109,108,62,10,115,104,111,114,116,99,117,116,32,105,99,111,110,34,32, +100,111,99,117,109,101,110,116,46,119,114,105,116,101,40,112,97,100,100,105,110, +103,45,98,111,116,116,111,109,58,114,101,112,114,101,115,101,110,116,97,116,105, +118,101,115,115,117,98,109,105,116,34,32,118,97,108,117,101,61,34,97,108,105,103 +,110,61,34,99,101,110,116,101,114,34,32,116,104,114,111,117,103,104,111,117,116, +32,116,104,101,32,115,99,105,101,110,99,101,32,102,105,99,116,105,111,110,10,32, +32,60,100,105,118,32,99,108,97,115,115,61,34,115,117,98,109,105,116,34,32,99,108 +,97,115,115,61,34,111,110,101,32,111,102,32,116,104,101,32,109,111,115,116,32, +118,97,108,105,103,110,61,34,116,111,112,34,62,60,119,97,115,32,101,115,116,97, +98,108,105,115,104,101,100,41,59,13,10,60,47,115,99,114,105,112,116,62,13,10,114 +,101,116,117,114,110,32,102,97,108,115,101,59,34,62,41,46,115,116,121,108,101,46 +,100,105,115,112,108,97,121,98,101,99,97,117,115,101,32,111,102,32,116,104,101, +32,100,111,99,117,109,101,110,116,46,99,111,111,107,105,101,60,102,111,114,109, +32,97,99,116,105,111,110,61,34,47,125,98,111,100,121,123,109,97,114,103,105,110, +58,48,59,69,110,99,121,99,108,111,112,101,100,105,97,32,111,102,118,101,114,115, +105,111,110,32,111,102,32,116,104,101,32,46,99,114,101,97,116,101,69,108,101,109 +,101,110,116,40,110,97,109,101,34,32,99,111,110,116,101,110,116,61,34,60,47,100, +105,118,62,10,60,47,100,105,118,62,10,10,97,100,109,105,110,105,115,116,114,97, +116,105,118,101,32,60,47,98,111,100,121,62,10,60,47,104,116,109,108,62,104,105, +115,116,111,114,121,32,111,102,32,116,104,101,32,34,62,60,105,110,112,117,116,32 +,116,121,112,101,61,34,112,111,114,116,105,111,110,32,111,102,32,116,104,101,32, +97,115,32,112,97,114,116,32,111,102,32,116,104,101,32,38,110,98,115,112,59,60,97 +,32,104,114,101,102,61,34,111,116,104,101,114,32,99,111,117,110,116,114,105,101, +115,34,62,10,60,100,105,118,32,99,108,97,115,115,61,34,60,47,115,112,97,110,62, +60,47,115,112,97,110,62,60,73,110,32,111,116,104,101,114,32,119,111,114,100,115, +44,100,105,115,112,108,97,121,58,32,98,108,111,99,107,59,99,111,110,116,114,111, +108,32,111,102,32,116,104,101,32,105,110,116,114,111,100,117,99,116,105,111,110, +32,111,102,47,62,10,60,109,101,116,97,32,110,97,109,101,61,34,97,115,32,119,101, +108,108,32,97,115,32,116,104,101,32,105,110,32,114,101,99,101,110,116,32,121,101 +,97,114,115,13,10,9,60,100,105,118,32,99,108,97,115,115,61,34,60,47,100,105,118, +62,10,9,60,47,100,105,118,62,10,105,110,115,112,105,114,101,100,32,98,121,32,116 +,104,101,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,99,111,109,112, +97,116,105,98,108,101,32,119,105,116,104,98,101,99,97,109,101,32,107,110,111,119 +,110,32,97,115,32,115,116,121,108,101,61,34,109,97,114,103,105,110,58,46,106,115 +,34,62,60,47,115,99,114,105,112,116,62,60,32,73,110,116,101,114,110,97,116,105, +111,110,97,108,32,116,104,101,114,101,32,104,97,118,101,32,98,101,101,110,71,101 +,114,109,97,110,32,108,97,110,103,117,97,103,101,32,115,116,121,108,101,61,34,99 +,111,108,111,114,58,35,67,111,109,109,117,110,105,115,116,32,80,97,114,116,121, +99,111,110,115,105,115,116,101,110,116,32,119,105,116,104,98,111,114,100,101,114 +,61,34,48,34,32,99,101,108,108,32,109,97,114,103,105,110,104,101,105,103,104,116 +,61,34,116,104,101,32,109,97,106,111,114,105,116,121,32,111,102,34,32,97,108,105 +,103,110,61,34,99,101,110,116,101,114,114,101,108,97,116,101,100,32,116,111,32, +116,104,101,32,109,97,110,121,32,100,105,102,102,101,114,101,110,116,32,79,114, +116,104,111,100,111,120,32,67,104,117,114,99,104,115,105,109,105,108,97,114,32, +116,111,32,116,104,101,32,47,62,10,60,108,105,110,107,32,114,101,108,61,34,115, +119,97,115,32,111,110,101,32,111,102,32,116,104,101,32,117,110,116,105,108,32, +104,105,115,32,100,101,97,116,104,125,41,40,41,59,10,60,47,115,99,114,105,112, +116,62,111,116,104,101,114,32,108,97,110,103,117,97,103,101,115,99,111,109,112, +97,114,101,100,32,116,111,32,116,104,101,112,111,114,116,105,111,110,115,32,111, +102,32,116,104,101,116,104,101,32,78,101,116,104,101,114,108,97,110,100,115,116, +104,101,32,109,111,115,116,32,99,111,109,109,111,110,98,97,99,107,103,114,111, +117,110,100,58,117,114,108,40,97,114,103,117,101,100,32,116,104,97,116,32,116, +104,101,115,99,114,111,108,108,105,110,103,61,34,110,111,34,32,105,110,99,108, +117,100,101,100,32,105,110,32,116,104,101,78,111,114,116,104,32,65,109,101,114, +105,99,97,110,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,105,110 +,116,101,114,112,114,101,116,97,116,105,111,110,115,116,104,101,32,116,114,97, +100,105,116,105,111,110,97,108,100,101,118,101,108,111,112,109,101,110,116,32, +111,102,32,102,114,101,113,117,101,110,116,108,121,32,117,115,101,100,97,32,99, +111,108,108,101,99,116,105,111,110,32,111,102,118,101,114,121,32,115,105,109,105 +,108,97,114,32,116,111,115,117,114,114,111,117,110,100,105,110,103,32,116,104, +101,101,120,97,109,112,108,101,32,111,102,32,116,104,105,115,97,108,105,103,110, +61,34,99,101,110,116,101,114,34,62,119,111,117,108,100,32,104,97,118,101,32,98, +101,101,110,105,109,97,103,101,95,99,97,112,116,105,111,110,32,61,97,116,116,97, +99,104,101,100,32,116,111,32,116,104,101,115,117,103,103,101,115,116,105,110,103 +,32,116,104,97,116,105,110,32,116,104,101,32,102,111,114,109,32,111,102,32,105, +110,118,111,108,118,101,100,32,105,110,32,116,104,101,105,115,32,100,101,114,105 +,118,101,100,32,102,114,111,109,110,97,109,101,100,32,97,102,116,101,114,32,116, +104,101,73,110,116,114,111,100,117,99,116,105,111,110,32,116,111,114,101,115,116 +,114,105,99,116,105,111,110,115,32,111,110,32,115,116,121,108,101,61,34,119,105, +100,116,104,58,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,116,104, +101,32,99,114,101,97,116,105,111,110,32,111,102,109,111,115,116,32,105,109,112, +111,114,116,97,110,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,110, +100,114,101,115,117,108,116,101,100,32,105,110,32,116,104,101,99,111,108,108,97, +112,115,101,32,111,102,32,116,104,101,84,104,105,115,32,109,101,97,110,115,32, +116,104,97,116,101,108,101,109,101,110,116,115,32,111,102,32,116,104,101,119,97, +115,32,114,101,112,108,97,99,101,100,32,98,121,97,110,97,108,121,115,105,115,32, +111,102,32,116,104,101,105,110,115,112,105,114,97,116,105,111,110,32,102,111,114 +,114,101,103,97,114,100,101,100,32,97,115,32,116,104,101,109,111,115,116,32,115, +117,99,99,101,115,115,102,117,108,107,110,111,119,110,32,97,115,32,38,113,117, +111,116,59,97,32,99,111,109,112,114,101,104,101,110,115,105,118,101,72,105,115, +116,111,114,121,32,111,102,32,116,104,101,32,119,101,114,101,32,99,111,110,115, +105,100,101,114,101,100,114,101,116,117,114,110,101,100,32,116,111,32,116,104, +101,97,114,101,32,114,101,102,101,114,114,101,100,32,116,111,85,110,115,111,117, +114,99,101,100,32,105,109,97,103,101,62,10,9,60,100,105,118,32,99,108,97,115,115 +,61,34,99,111,110,115,105,115,116,115,32,111,102,32,116,104,101,115,116,111,112, +80,114,111,112,97,103,97,116,105,111,110,105,110,116,101,114,101,115,116,32,105, +110,32,116,104,101,97,118,97,105,108,97,98,105,108,105,116,121,32,111,102,97,112 +,112,101,97,114,115,32,116,111,32,104,97,118,101,101,108,101,99,116,114,111,109, +97,103,110,101,116,105,99,101,110,97,98,108,101,83,101,114,118,105,99,101,115,40 +,102,117,110,99,116,105,111,110,32,111,102,32,116,104,101,73,116,32,105,115,32, +105,109,112,111,114,116,97,110,116,60,47,115,99,114,105,112,116,62,60,47,100,105 +,118,62,102,117,110,99,116,105,111,110,40,41,123,118,97,114,32,114,101,108,97, +116,105,118,101,32,116,111,32,116,104,101,97,115,32,97,32,114,101,115,117,108, +116,32,111,102,32,116,104,101,32,112,111,115,105,116,105,111,110,32,111,102,70, +111,114,32,101,120,97,109,112,108,101,44,32,105,110,32,109,101,116,104,111,100, +61,34,112,111,115,116,34,32,119,97,115,32,102,111,108,108,111,119,101,100,32,98, +121,38,97,109,112,59,109,100,97,115,104,59,32,116,104,101,116,104,101,32,97,112, +112,108,105,99,97,116,105,111,110,106,115,34,62,60,47,115,99,114,105,112,116,62, +13,10,117,108,62,60,47,100,105,118,62,60,47,100,105,118,62,97,102,116,101,114,32 +,116,104,101,32,100,101,97,116,104,119,105,116,104,32,114,101,115,112,101,99,116 +,32,116,111,115,116,121,108,101,61,34,112,97,100,100,105,110,103,58,105,115,32, +112,97,114,116,105,99,117,108,97,114,108,121,100,105,115,112,108,97,121,58,105, +110,108,105,110,101,59,32,116,121,112,101,61,34,115,117,98,109,105,116,34,32,105 +,115,32,100,105,118,105,100,101,100,32,105,110,116,111,228,184,173,230,150,135, +32,40,231,174,128,228,189,147,41,114,101,115,112,111,110,115,97,98,105,108,105, +100,97,100,97,100,109,105,110,105,115,116,114,97,99,105,195,179,110,105,110,116, +101,114,110,97,99,105,111,110,97,108,101,115,99,111,114,114,101,115,112,111,110, +100,105,101,110,116,101,224,164,137,224,164,170,224,164,175,224,165,139,224,164, +151,224,164,170,224,165,130,224,164,176,224,165,141,224,164,181,224,164,185,224, +164,174,224,164,190,224,164,176,224,165,135,224,164,178,224,165,139,224,164,151, +224,165,139,224,164,130,224,164,154,224,165,129,224,164,168,224,164,190,224,164, +181,224,164,178,224,165,135,224,164,149,224,164,191,224,164,168,224,164,184,224, +164,176,224,164,149,224,164,190,224,164,176,224,164,170,224,165,129,224,164,178, +224,164,191,224,164,184,224,164,150,224,165,139,224,164,156,224,165,135,224,164, +130,224,164,154,224,164,190,224,164,185,224,164,191,224,164,143,224,164,173,224, +165,135,224,164,156,224,165,135,224,164,130,224,164,182,224,164,190,224,164,174, +224,164,191,224,164,178,224,164,185,224,164,174,224,164,190,224,164,176,224,165, +128,224,164,156,224,164,190,224,164,151,224,164,176,224,164,163,224,164,172,224, +164,168,224,164,190,224,164,168,224,165,135,224,164,149,224,165,129,224,164,174, +224,164,190,224,164,176,224,164,172,224,165,141,224,164,178,224,165,137,224,164, +151,224,164,174,224,164,190,224,164,178,224,164,191,224,164,149,224,164,174,224, +164,185,224,164,191,224,164,178,224,164,190,224,164,170,224,165,131,224,164,183, +224,165,141,224,164,160,224,164,172,224,164,162,224,164,188,224,164,164,224,165, +135,224,164,173,224,164,190,224,164,156,224,164,170,224,164,190,224,164,149,224, +165,141,224,164,178,224,164,191,224,164,149,224,164,159,224,165,141,224,164,176, +224,165,135,224,164,168,224,164,150,224,164,191,224,164,178,224,164,190,224,164, +171,224,164,166,224,165,140,224,164,176,224,164,190,224,164,168,224,164,174,224, +164,190,224,164,174,224,164,178,224,165,135,224,164,174,224,164,164,224,164,166, +224,164,190,224,164,168,224,164,172,224,164,190,224,164,156,224,164,190,224,164, +176,224,164,181,224,164,191,224,164,149,224,164,190,224,164,184,224,164,149,224, +165,141,224,164,175,224,165,139,224,164,130,224,164,154,224,164,190,224,164,185, +224,164,164,224,165,135,224,164,170,224,164,185,224,165,129,224,164,129,224,164, +154,224,164,172,224,164,164,224,164,190,224,164,175,224,164,190,224,164,184,224, +164,130,224,164,181,224,164,190,224,164,166,224,164,166,224,165,135,224,164,150, +224,164,168,224,165,135,224,164,170,224,164,191,224,164,155,224,164,178,224,165, +135,224,164,181,224,164,191,224,164,182,224,165,135,224,164,183,224,164,176,224, +164,190,224,164,156,224,165,141,224,164,175,224,164,137,224,164,164,224,165,141, +224,164,164,224,164,176,224,164,174,224,165,129,224,164,130,224,164,172,224,164, +136,224,164,166,224,165,139,224,164,168,224,165,139,224,164,130,224,164,137,224, +164,170,224,164,149,224,164,176,224,164,163,224,164,170,224,164,162,224,164,188, +224,165,135,224,164,130,224,164,184,224,165,141,224,164,165,224,164,191,224,164, +164,224,164,171,224,164,191,224,164,178,224,165,141,224,164,174,224,164,174,224, +165,129,224,164,150,224,165,141,224,164,175,224,164,133,224,164,154,224,165,141, +224,164,155,224,164,190,224,164,155,224,165,130,224,164,159,224,164,164,224,165, +128,224,164,184,224,164,130,224,164,151,224,165,128,224,164,164,224,164,156,224, +164,190,224,164,143,224,164,151,224,164,190,224,164,181,224,164,191,224,164,173, +224,164,190,224,164,151,224,164,152,224,164,163,224,165,141,224,164,159,224,165, +135,224,164,166,224,165,130,224,164,184,224,164,176,224,165,135,224,164,166,224, +164,191,224,164,168,224,165,139,224,164,130,224,164,185,224,164,164,224,165,141, +224,164,175,224,164,190,224,164,184,224,165,135,224,164,149,224,165,141,224,164, +184,224,164,151,224,164,190,224,164,130,224,164,167,224,165,128,224,164,181,224, +164,191,224,164,182,224,165,141,224,164,181,224,164,176,224,164,190,224,164,164, +224,165,135,224,164,130,224,164,166,224,165,136,224,164,159,224,165,141,224,164, +184,224,164,168,224,164,149,224,165,141,224,164,182,224,164,190,224,164,184,224, +164,190,224,164,174,224,164,168,224,165,135,224,164,133,224,164,166,224,164,190, +224,164,178,224,164,164,224,164,172,224,164,191,224,164,156,224,164,178,224,165, +128,224,164,170,224,165,129,224,164,176,224,165,130,224,164,183,224,164,185,224, +164,191,224,164,130,224,164,166,224,165,128,224,164,174,224,164,191,224,164,164, +224,165,141,224,164,176,224,164,149,224,164,181,224,164,191,224,164,164,224,164, +190,224,164,176,224,165,129,224,164,170,224,164,175,224,165,135,224,164,184,224, +165,141,224,164,165,224,164,190,224,164,168,224,164,149,224,164,176,224,165,139, +224,164,161,224,164,188,224,164,174,224,165,129,224,164,149,224,165,141,224,164, +164,224,164,175,224,165,139,224,164,156,224,164,168,224,164,190,224,164,149,224, +165,131,224,164,170,224,164,175,224,164,190,224,164,170,224,165,139,224,164,184, +224,165,141,224,164,159,224,164,152,224,164,176,224,165,135,224,164,178,224,165, +130,224,164,149,224,164,190,224,164,176,224,165,141,224,164,175,224,164,181,224, +164,191,224,164,154,224,164,190,224,164,176,224,164,184,224,165,130,224,164,154, +224,164,168,224,164,190,224,164,174,224,165,130,224,164,178,224,165,141,224,164, +175,224,164,166,224,165,135,224,164,150,224,165,135,224,164,130,224,164,185,224, +164,174,224,165,135,224,164,182,224,164,190,224,164,184,224,165,141,224,164,149, +224,165,130,224,164,178,224,164,174,224,165,136,224,164,130,224,164,168,224,165, +135,224,164,164,224,165,136,224,164,175,224,164,190,224,164,176,224,164,156,224, +164,191,224,164,184,224,164,149,224,165,135,114,115,115,43,120,109,108,34,32,116 +,105,116,108,101,61,34,45,116,121,112,101,34,32,99,111,110,116,101,110,116,61,34 +,116,105,116,108,101,34,32,99,111,110,116,101,110,116,61,34,97,116,32,116,104, +101,32,115,97,109,101,32,116,105,109,101,46,106,115,34,62,60,47,115,99,114,105, +112,116,62,10,60,34,32,109,101,116,104,111,100,61,34,112,111,115,116,34,32,60,47 +,115,112,97,110,62,60,47,97,62,60,47,108,105,62,118,101,114,116,105,99,97,108,45 +,97,108,105,103,110,58,116,47,106,113,117,101,114,121,46,109,105,110,46,106,115, +34,62,46,99,108,105,99,107,40,102,117,110,99,116,105,111,110,40,32,115,116,121, +108,101,61,34,112,97,100,100,105,110,103,45,125,41,40,41,59,10,60,47,115,99,114, +105,112,116,62,10,60,47,115,112,97,110,62,60,97,32,104,114,101,102,61,34,60,97, +32,104,114,101,102,61,34,104,116,116,112,58,47,47,41,59,32,114,101,116,117,114, +110,32,102,97,108,115,101,59,116,101,120,116,45,100,101,99,111,114,97,116,105, +111,110,58,32,115,99,114,111,108,108,105,110,103,61,34,110,111,34,32,98,111,114, +100,101,114,45,99,111,108,108,97,112,115,101,58,97,115,115,111,99,105,97,116,101 +,100,32,119,105,116,104,32,66,97,104,97,115,97,32,73,110,100,111,110,101,115,105 +,97,69,110,103,108,105,115,104,32,108,97,110,103,117,97,103,101,60,116,101,120, +116,32,120,109,108,58,115,112,97,99,101,61,46,103,105,102,34,32,98,111,114,100, +101,114,61,34,48,34,60,47,98,111,100,121,62,10,60,47,104,116,109,108,62,10,111, +118,101,114,102,108,111,119,58,104,105,100,100,101,110,59,105,109,103,32,115,114 +,99,61,34,104,116,116,112,58,47,47,97,100,100,69,118,101,110,116,76,105,115,116, +101,110,101,114,114,101,115,112,111,110,115,105,98,108,101,32,102,111,114,32,115 +,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10,47,102,97,118,105,99,111, +110,46,105,99,111,34,32,47,62,111,112,101,114,97,116,105,110,103,32,115,121,115, +116,101,109,34,32,115,116,121,108,101,61,34,119,105,100,116,104,58,49,116,97,114 +,103,101,116,61,34,95,98,108,97,110,107,34,62,83,116,97,116,101,32,85,110,105, +118,101,114,115,105,116,121,116,101,120,116,45,97,108,105,103,110,58,108,101,102 +,116,59,10,100,111,99,117,109,101,110,116,46,119,114,105,116,101,40,44,32,105, +110,99,108,117,100,105,110,103,32,116,104,101,32,97,114,111,117,110,100,32,116, +104,101,32,119,111,114,108,100,41,59,13,10,60,47,115,99,114,105,112,116,62,13,10 +,60,34,32,115,116,121,108,101,61,34,104,101,105,103,104,116,58,59,111,118,101, +114,102,108,111,119,58,104,105,100,100,101,110,109,111,114,101,32,105,110,102, +111,114,109,97,116,105,111,110,97,110,32,105,110,116,101,114,110,97,116,105,111, +110,97,108,97,32,109,101,109,98,101,114,32,111,102,32,116,104,101,32,111,110,101 +,32,111,102,32,116,104,101,32,102,105,114,115,116,99,97,110,32,98,101,32,102,111 +,117,110,100,32,105,110,32,60,47,100,105,118,62,10,9,9,60,47,100,105,118,62,10, +100,105,115,112,108,97,121,58,32,110,111,110,101,59,34,62,34,32,47,62,10,60,108, +105,110,107,32,114,101,108,61,34,10,32,32,40,102,117,110,99,116,105,111,110,40, +41,32,123,116,104,101,32,49,53,116,104,32,99,101,110,116,117,114,121,46,112,114, +101,118,101,110,116,68,101,102,97,117,108,116,40,108,97,114,103,101,32,110,117, +109,98,101,114,32,111,102,32,66,121,122,97,110,116,105,110,101,32,69,109,112,105 +,114,101,46,106,112,103,124,116,104,117,109,98,124,108,101,102,116,124,118,97, +115,116,32,109,97,106,111,114,105,116,121,32,111,102,109,97,106,111,114,105,116, +121,32,111,102,32,116,104,101,32,32,97,108,105,103,110,61,34,99,101,110,116,101, +114,34,62,85,110,105,118,101,114,115,105,116,121,32,80,114,101,115,115,100,111, +109,105,110,97,116,101,100,32,98,121,32,116,104,101,83,101,99,111,110,100,32,87, +111,114,108,100,32,87,97,114,100,105,115,116,114,105,98,117,116,105,111,110,32, +111,102,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,116,104, +101,32,114,101,115,116,32,111,102,32,116,104,101,32,99,104,97,114,97,99,116,101, +114,105,122,101,100,32,98,121,32,114,101,108,61,34,110,111,102,111,108,108,111, +119,34,62,100,101,114,105,118,101,115,32,102,114,111,109,32,116,104,101,114,97, +116,104,101,114,32,116,104,97,110,32,116,104,101,32,97,32,99,111,109,98,105,110, +97,116,105,111,110,32,111,102,115,116,121,108,101,61,34,119,105,100,116,104,58, +49,48,48,69,110,103,108,105,115,104,45,115,112,101,97,107,105,110,103,99,111,109 +,112,117,116,101,114,32,115,99,105,101,110,99,101,98,111,114,100,101,114,61,34, +48,34,32,97,108,116,61,34,116,104,101,32,101,120,105,115,116,101,110,99,101,32, +111,102,68,101,109,111,99,114,97,116,105,99,32,80,97,114,116,121,34,32,115,116, +121,108,101,61,34,109,97,114,103,105,110,45,70,111,114,32,116,104,105,115,32,114 +,101,97,115,111,110,44,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10,9,115 +,66,121,84,97,103,78,97,109,101,40,115,41,91,48,93,106,115,34,62,60,47,115,99, +114,105,112,116,62,13,10,60,46,106,115,34,62,60,47,115,99,114,105,112,116,62,13, +10,108,105,110,107,32,114,101,108,61,34,105,99,111,110,34,32,39,32,97,108,116,61 +,39,39,32,99,108,97,115,115,61,39,102,111,114,109,97,116,105,111,110,32,111,102, +32,116,104,101,118,101,114,115,105,111,110,115,32,111,102,32,116,104,101,32,60, +47,97,62,60,47,100,105,118,62,60,47,100,105,118,62,47,112,97,103,101,62,10,32,32 +,60,112,97,103,101,62,10,60,100,105,118,32,99,108,97,115,115,61,34,99,111,110, +116,98,101,99,97,109,101,32,116,104,101,32,102,105,114,115,116,98,97,104,97,115, +97,32,73,110,100,111,110,101,115,105,97,101,110,103,108,105,115,104,32,40,115, +105,109,112,108,101,41,206,149,206,187,206,187,206,183,206,189,206,185,206,186, +206,172,209,133,209,128,208,178,208,176,209,130,209,129,208,186,208,184,208,186, +208,190,208,188,208,191,208,176,208,189,208,184,208,184,209,143,208,178,208,187, +209,143,208,181,209,130,209,129,209,143,208,148,208,190,208,177,208,176,208,178, +208,184,209,130,209,140,209,135,208,181,208,187,208,190,208,178,208,181,208,186, +208,176,209,128,208,176,208,183,208,178,208,184,209,130,208,184,209,143,208,152, +208,189,209,130,208,181,209,128,208,189,208,181,209,130,208,158,209,130,208,178, +208,181,209,130,208,184,209,130,209,140,208,189,208,176,208,191,209,128,208,184, +208,188,208,181,209,128,208,184,208,189,209,130,208,181,209,128,208,189,208,181, +209,130,208,186,208,190,209,130,208,190,209,128,208,190,208,179,208,190,209,129, +209,130,209,128,208,176,208,189,208,184,209,134,209,139,208,186,208,176,209,135, +208,181,209,129,209,130,208,178,208,181,209,131,209,129,208,187,208,190,208,178, +208,184,209,143,209,133,208,191,209,128,208,190,208,177,208,187,208,181,208,188, +209,139,208,191,208,190,208,187,209,131,209,135,208,184,209,130,209,140,209,143, +208,178,208,187,209,143,209,142,209,130,209,129,209,143,208,189,208,176,208,184, +208,177,208,190,208,187,208,181,208,181,208,186,208,190,208,188,208,191,208,176, +208,189,208,184,209,143,208,178,208,189,208,184,208,188,208,176,208,189,208,184, +208,181,209,129,209,128,208,181,208,180,209,129,209,130,208,178,208,176,216,167, +217,132,217,133,217,136,216,167,216,182,217,138,216,185,216,167,217,132,216,177, +216,166,217,138,216,179,217,138,216,169,216,167,217,132,216,167,217,134,216,170, +217,130,216,167,217,132,217,133,216,180,216,167,216,177,217,131,216,167,216,170, +217,131,216,167,217,132,216,179,217,138,216,167,216,177,216,167,216,170,216,167, +217,132,217,133,217,131,216,170,217,136,216,168,216,169,216,167,217,132,216,179, +216,185,217,136,216,175,217,138,216,169,216,167,216,173,216,181,216,167,216,166, +217,138,216,167,216,170,216,167,217,132,216,185,216,167,217,132,217,133,217,138, +216,169,216,167,217,132,216,181,217,136,216,170,217,138,216,167,216,170,216,167, +217,132,216,167,217,134,216,170,216,177,217,134,216,170,216,167,217,132,216,170, +216,181,216,167,217,133,217,138,217,133,216,167,217,132,216,165,216,179,217,132, +216,167,217,133,217,138,216,167,217,132,217,133,216,180,216,167,216,177,217,131, +216,169,216,167,217,132,217,133,216,177,216,166,217,138,216,167,216,170,114,111, +98,111,116,115,34,32,99,111,110,116,101,110,116,61,34,60,100,105,118,32,105,100, +61,34,102,111,111,116,101,114,34,62,116,104,101,32,85,110,105,116,101,100,32,83, +116,97,116,101,115,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47, +46,106,112,103,124,114,105,103,104,116,124,116,104,117,109,98,124,46,106,115,34, +62,60,47,115,99,114,105,112,116,62,13,10,60,108,111,99,97,116,105,111,110,46,112 +,114,111,116,111,99,111,108,102,114,97,109,101,98,111,114,100,101,114,61,34,48, +34,32,115,34,32,47,62,10,60,109,101,116,97,32,110,97,109,101,61,34,60,47,97,62, +60,47,100,105,118,62,60,47,100,105,118,62,60,102,111,110,116,45,119,101,105,103, +104,116,58,98,111,108,100,59,38,113,117,111,116,59,32,97,110,100,32,38,113,117, +111,116,59,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,109, +97,114,103,105,110,58,48,59,112,97,100,100,105,110,103,58,34,32,114,101,108,61, +34,110,111,102,111,108,108,111,119,34,32,80,114,101,115,105,100,101,110,116,32, +111,102,32,116,104,101,32,116,119,101,110,116,105,101,116,104,32,99,101,110,116, +117,114,121,101,118,105,115,105,111,110,62,10,32,32,60,47,112,97,103,101,73,110, +116,101,114,110,101,116,32,69,120,112,108,111,114,101,114,97,46,97,115,121,110, +99,32,61,32,116,114,117,101,59,13,10,105,110,102,111,114,109,97,116,105,111,110, +32,97,98,111,117,116,60,100,105,118,32,105,100,61,34,104,101,97,100,101,114,34, +62,34,32,97,99,116,105,111,110,61,34,104,116,116,112,58,47,47,60,97,32,104,114, +101,102,61,34,104,116,116,112,115,58,47,47,60,100,105,118,32,105,100,61,34,99, +111,110,116,101,110,116,34,60,47,100,105,118,62,13,10,60,47,100,105,118,62,13,10 +,60,100,101,114,105,118,101,100,32,102,114,111,109,32,116,104,101,32,60,105,109, +103,32,115,114,99,61,39,104,116,116,112,58,47,47,97,99,99,111,114,100,105,110, +103,32,116,111,32,116,104,101,32,10,60,47,98,111,100,121,62,10,60,47,104,116,109 +,108,62,10,115,116,121,108,101,61,34,102,111,110,116,45,115,105,122,101,58,115, +99,114,105,112,116,32,108,97,110,103,117,97,103,101,61,34,65,114,105,97,108,44, +32,72,101,108,118,101,116,105,99,97,44,60,47,97,62,60,115,112,97,110,32,99,108, +97,115,115,61,34,60,47,115,99,114,105,112,116,62,60,115,99,114,105,112,116,32, +112,111,108,105,116,105,99,97,108,32,112,97,114,116,105,101,115,116,100,62,60,47 +,116,114,62,60,47,116,97,98,108,101,62,60,104,114,101,102,61,34,104,116,116,112, +58,47,47,119,119,119,46,105,110,116,101,114,112,114,101,116,97,116,105,111,110, +32,111,102,114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,32,100, +111,99,117,109,101,110,116,46,119,114,105,116,101,40,39,60,99,104,97,114,115,101 +,116,61,34,117,116,102,45,56,34,62,10,98,101,103,105,110,110,105,110,103,32,111, +102,32,116,104,101,32,114,101,118,101,97,108,101,100,32,116,104,97,116,32,116, +104,101,116,101,108,101,118,105,115,105,111,110,32,115,101,114,105,101,115,34,32 +,114,101,108,61,34,110,111,102,111,108,108,111,119,34,62,32,116,97,114,103,101, +116,61,34,95,98,108,97,110,107,34,62,99,108,97,105,109,105,110,103,32,116,104,97 +,116,32,116,104,101,104,116,116,112,37,51,65,37,50,70,37,50,70,119,119,119,46, +109,97,110,105,102,101,115,116,97,116,105,111,110,115,32,111,102,80,114,105,109, +101,32,77,105,110,105,115,116,101,114,32,111,102,105,110,102,108,117,101,110,99, +101,100,32,98,121,32,116,104,101,99,108,97,115,115,61,34,99,108,101,97,114,102, +105,120,34,62,47,100,105,118,62,13,10,60,47,100,105,118,62,13,10,13,10,116,104, +114,101,101,45,100,105,109,101,110,115,105,111,110,97,108,67,104,117,114,99,104, +32,111,102,32,69,110,103,108,97,110,100,111,102,32,78,111,114,116,104,32,67,97, +114,111,108,105,110,97,115,113,117,97,114,101,32,107,105,108,111,109,101,116,114 +,101,115,46,97,100,100,69,118,101,110,116,76,105,115,116,101,110,101,114,100,105 +,115,116,105,110,99,116,32,102,114,111,109,32,116,104,101,99,111,109,109,111,110 +,108,121,32,107,110,111,119,110,32,97,115,80,104,111,110,101,116,105,99,32,65, +108,112,104,97,98,101,116,100,101,99,108,97,114,101,100,32,116,104,97,116,32,116 +,104,101,99,111,110,116,114,111,108,108,101,100,32,98,121,32,116,104,101,66,101, +110,106,97,109,105,110,32,70,114,97,110,107,108,105,110,114,111,108,101,45,112, +108,97,121,105,110,103,32,103,97,109,101,116,104,101,32,85,110,105,118,101,114, +115,105,116,121,32,111,102,105,110,32,87,101,115,116,101,114,110,32,69,117,114, +111,112,101,112,101,114,115,111,110,97,108,32,99,111,109,112,117,116,101,114,80, +114,111,106,101,99,116,32,71,117,116,101,110,98,101,114,103,114,101,103,97,114, +100,108,101,115,115,32,111,102,32,116,104,101,104,97,115,32,98,101,101,110,32, +112,114,111,112,111,115,101,100,116,111,103,101,116,104,101,114,32,119,105,116, +104,32,116,104,101,62,60,47,108,105,62,60,108,105,32,99,108,97,115,115,61,34,105 +,110,32,115,111,109,101,32,99,111,117,110,116,114,105,101,115,109,105,110,46,106 +,115,34,62,60,47,115,99,114,105,112,116,62,111,102,32,116,104,101,32,112,111,112 +,117,108,97,116,105,111,110,111,102,102,105,99,105,97,108,32,108,97,110,103,117, +97,103,101,60,105,109,103,32,115,114,99,61,34,105,109,97,103,101,115,47,105,100, +101,110,116,105,102,105,101,100,32,98,121,32,116,104,101,110,97,116,117,114,97, +108,32,114,101,115,111,117,114,99,101,115,99,108,97,115,115,105,102,105,99,97, +116,105,111,110,32,111,102,99,97,110,32,98,101,32,99,111,110,115,105,100,101,114 +,101,100,113,117,97,110,116,117,109,32,109,101,99,104,97,110,105,99,115,78,101, +118,101,114,116,104,101,108,101,115,115,44,32,116,104,101,109,105,108,108,105, +111,110,32,121,101,97,114,115,32,97,103,111,60,47,98,111,100,121,62,13,10,60,47, +104,116,109,108,62,13,206,149,206,187,206,187,206,183,206,189,206,185,206,186, +206,172,10,116,97,107,101,32,97,100,118,97,110,116,97,103,101,32,111,102,97,110, +100,44,32,97,99,99,111,114,100,105,110,103,32,116,111,97,116,116,114,105,98,117, +116,101,100,32,116,111,32,116,104,101,77,105,99,114,111,115,111,102,116,32,87, +105,110,100,111,119,115,116,104,101,32,102,105,114,115,116,32,99,101,110,116,117 +,114,121,117,110,100,101,114,32,116,104,101,32,99,111,110,116,114,111,108,100, +105,118,32,99,108,97,115,115,61,34,104,101,97,100,101,114,115,104,111,114,116, +108,121,32,97,102,116,101,114,32,116,104,101,110,111,116,97,98,108,101,32,101, +120,99,101,112,116,105,111,110,116,101,110,115,32,111,102,32,116,104,111,117,115 +,97,110,100,115,115,101,118,101,114,97,108,32,100,105,102,102,101,114,101,110, +116,97,114,111,117,110,100,32,116,104,101,32,119,111,114,108,100,46,114,101,97, +99,104,105,110,103,32,109,105,108,105,116,97,114,121,105,115,111,108,97,116,101, +100,32,102,114,111,109,32,116,104,101,111,112,112,111,115,105,116,105,111,110,32 +,116,111,32,116,104,101,116,104,101,32,79,108,100,32,84,101,115,116,97,109,101, +110,116,65,102,114,105,99,97,110,32,65,109,101,114,105,99,97,110,115,105,110,115 +,101,114,116,101,100,32,105,110,116,111,32,116,104,101,115,101,112,97,114,97,116 +,101,32,102,114,111,109,32,116,104,101,109,101,116,114,111,112,111,108,105,116, +97,110,32,97,114,101,97,109,97,107,101,115,32,105,116,32,112,111,115,115,105,98, +108,101,97,99,107,110,111,119,108,101,100,103,101,100,32,116,104,97,116,97,114, +103,117,97,98,108,121,32,116,104,101,32,109,111,115,116,116,121,112,101,61,34, +116,101,120,116,47,99,115,115,34,62,10,116,104,101,32,73,110,116,101,114,110,97, +116,105,111,110,97,108,65,99,99,111,114,100,105,110,103,32,116,111,32,116,104, +101,32,112,101,61,34,116,101,120,116,47,99,115,115,34,32,47,62,10,99,111,105,110 +,99,105,100,101,32,119,105,116,104,32,116,104,101,116,119,111,45,116,104,105,114 +,100,115,32,111,102,32,116,104,101,68,117,114,105,110,103,32,116,104,105,115,32, +116,105,109,101,44,100,117,114,105,110,103,32,116,104,101,32,112,101,114,105,111 +,100,97,110,110,111,117,110,99,101,100,32,116,104,97,116,32,104,101,116,104,101, +32,105,110,116,101,114,110,97,116,105,111,110,97,108,97,110,100,32,109,111,114, +101,32,114,101,99,101,110,116,108,121,98,101,108,105,101,118,101,100,32,116,104, +97,116,32,116,104,101,99,111,110,115,99,105,111,117,115,110,101,115,115,32,97, +110,100,102,111,114,109,101,114,108,121,32,107,110,111,119,110,32,97,115,115,117 +,114,114,111,117,110,100,101,100,32,98,121,32,116,104,101,102,105,114,115,116,32 +,97,112,112,101,97,114,101,100,32,105,110,111,99,99,97,115,105,111,110,97,108, +108,121,32,117,115,101,100,112,111,115,105,116,105,111,110,58,97,98,115,111,108, +117,116,101,59,34,32,116,97,114,103,101,116,61,34,95,98,108,97,110,107,34,32,112 +,111,115,105,116,105,111,110,58,114,101,108,97,116,105,118,101,59,116,101,120, +116,45,97,108,105,103,110,58,99,101,110,116,101,114,59,106,97,120,47,108,105,98, +115,47,106,113,117,101,114,121,47,49,46,98,97,99,107,103,114,111,117,110,100,45, +99,111,108,111,114,58,35,116,121,112,101,61,34,97,112,112,108,105,99,97,116,105, +111,110,47,97,110,103,117,97,103,101,34,32,99,111,110,116,101,110,116,61,34,60, +109,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,80,114,105,118,97 +,99,121,32,80,111,108,105,99,121,60,47,97,62,101,40,34,37,51,67,115,99,114,105, +112,116,32,115,114,99,61,39,34,32,116,97,114,103,101,116,61,34,95,98,108,97,110, +107,34,62,79,110,32,116,104,101,32,111,116,104,101,114,32,104,97,110,100,44,46, +106,112,103,124,116,104,117,109,98,124,114,105,103,104,116,124,50,60,47,100,105, +118,62,60,100,105,118,32,99,108,97,115,115,61,34,60,100,105,118,32,115,116,121, +108,101,61,34,102,108,111,97,116,58,110,105,110,101,116,101,101,110,116,104,32, +99,101,110,116,117,114,121,60,47,98,111,100,121,62,13,10,60,47,104,116,109,108, +62,13,10,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,115,59,116, +101,120,116,45,97,108,105,103,110,58,99,101,110,116,101,114,102,111,110,116,45, +119,101,105,103,104,116,58,32,98,111,108,100,59,32,65,99,99,111,114,100,105,110, +103,32,116,111,32,116,104,101,32,100,105,102,102,101,114,101,110,99,101,32,98, +101,116,119,101,101,110,34,32,102,114,97,109,101,98,111,114,100,101,114,61,34,48 +,34,32,34,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,108, +105,110,107,32,104,114,101,102,61,34,104,116,116,112,58,47,47,104,116,109,108,52 +,47,108,111,111,115,101,46,100,116,100,34,62,10,100,117,114,105,110,103,32,116, +104,105,115,32,112,101,114,105,111,100,60,47,116,100,62,60,47,116,114,62,60,47, +116,97,98,108,101,62,99,108,111,115,101,108,121,32,114,101,108,97,116,101,100,32 +,116,111,102,111,114,32,116,104,101,32,102,105,114,115,116,32,116,105,109,101,59 +,102,111,110,116,45,119,101,105,103,104,116,58,98,111,108,100,59,105,110,112,117 +,116,32,116,121,112,101,61,34,116,101,120,116,34,32,60,115,112,97,110,32,115,116 +,121,108,101,61,34,102,111,110,116,45,111,110,114,101,97,100,121,115,116,97,116, +101,99,104,97,110,103,101,9,60,100,105,118,32,99,108,97,115,115,61,34,99,108,101 +,97,114,100,111,99,117,109,101,110,116,46,108,111,99,97,116,105,111,110,46,32,70 +,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,97,32,119,105,100, +101,32,118,97,114,105,101,116,121,32,111,102,32,60,33,68,79,67,84,89,80,69,32, +104,116,109,108,62,13,10,60,38,110,98,115,112,59,38,110,98,115,112,59,38,110,98, +115,112,59,34,62,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,115,116 +,121,108,101,61,34,102,108,111,97,116,58,108,101,102,116,59,99,111,110,99,101, +114,110,101,100,32,119,105,116,104,32,116,104,101,61,104,116,116,112,37,51,65,37 +,50,70,37,50,70,119,119,119,46,105,110,32,112,111,112,117,108,97,114,32,99,117, +108,116,117,114,101,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,32,47 +,62,105,116,32,105,115,32,112,111,115,115,105,98,108,101,32,116,111,32,72,97,114 +,118,97,114,100,32,85,110,105,118,101,114,115,105,116,121,116,121,108,101,115, +104,101,101,116,34,32,104,114,101,102,61,34,47,116,104,101,32,109,97,105,110,32, +99,104,97,114,97,99,116,101,114,79,120,102,111,114,100,32,85,110,105,118,101,114 +,115,105,116,121,32,32,110,97,109,101,61,34,107,101,121,119,111,114,100,115,34, +32,99,115,116,121,108,101,61,34,116,101,120,116,45,97,108,105,103,110,58,116,104 +,101,32,85,110,105,116,101,100,32,75,105,110,103,100,111,109,102,101,100,101,114 +,97,108,32,103,111,118,101,114,110,109,101,110,116,60,100,105,118,32,115,116,121 +,108,101,61,34,109,97,114,103,105,110,32,100,101,112,101,110,100,105,110,103,32, +111,110,32,116,104,101,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102, +32,116,104,101,60,100,105,118,32,99,108,97,115,115,61,34,104,101,97,100,101,114, +46,109,105,110,46,106,115,34,62,60,47,115,99,114,105,112,116,62,100,101,115,116, +114,117,99,116,105,111,110,32,111,102,32,116,104,101,115,108,105,103,104,116,108 +,121,32,100,105,102,102,101,114,101,110,116,105,110,32,97,99,99,111,114,100,97, +110,99,101,32,119,105,116,104,116,101,108,101,99,111,109,109,117,110,105,99,97, +116,105,111,110,115,105,110,100,105,99,97,116,101,115,32,116,104,97,116,32,116, +104,101,115,104,111,114,116,108,121,32,116,104,101,114,101,97,102,116,101,114, +101,115,112,101,99,105,97,108,108,121,32,105,110,32,116,104,101,32,69,117,114, +111,112,101,97,110,32,99,111,117,110,116,114,105,101,115,72,111,119,101,118,101, +114,44,32,116,104,101,114,101,32,97,114,101,115,114,99,61,34,104,116,116,112,58, +47,47,115,116,97,116,105,99,115,117,103,103,101,115,116,101,100,32,116,104,97, +116,32,116,104,101,34,32,115,114,99,61,34,104,116,116,112,58,47,47,119,119,119, +46,97,32,108,97,114,103,101,32,110,117,109,98,101,114,32,111,102,32,84,101,108, +101,99,111,109,109,117,110,105,99,97,116,105,111,110,115,34,32,114,101,108,61,34 +,110,111,102,111,108,108,111,119,34,32,116,72,111,108,121,32,82,111,109,97,110, +32,69,109,112,101,114,111,114,97,108,109,111,115,116,32,101,120,99,108,117,115, +105,118,101,108,121,34,32,98,111,114,100,101,114,61,34,48,34,32,97,108,116,61,34 +,83,101,99,114,101,116,97,114,121,32,111,102,32,83,116,97,116,101,99,117,108,109 +,105,110,97,116,105,110,103,32,105,110,32,116,104,101,67,73,65,32,87,111,114,108 +,100,32,70,97,99,116,98,111,111,107,116,104,101,32,109,111,115,116,32,105,109, +112,111,114,116,97,110,116,97,110,110,105,118,101,114,115,97,114,121,32,111,102, +32,116,104,101,115,116,121,108,101,61,34,98,97,99,107,103,114,111,117,110,100,45 +,60,108,105,62,60,101,109,62,60,97,32,104,114,101,102,61,34,47,116,104,101,32,65 +,116,108,97,110,116,105,99,32,79,99,101,97,110,115,116,114,105,99,116,108,121,32 +,115,112,101,97,107,105,110,103,44,115,104,111,114,116,108,121,32,98,101,102,111 +,114,101,32,116,104,101,100,105,102,102,101,114,101,110,116,32,116,121,112,101, +115,32,111,102,116,104,101,32,79,116,116,111,109,97,110,32,69,109,112,105,114, +101,62,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,65,110,32,73, +110,116,114,111,100,117,99,116,105,111,110,32,116,111,99,111,110,115,101,113,117 +,101,110,99,101,32,111,102,32,116,104,101,100,101,112,97,114,116,117,114,101,32, +102,114,111,109,32,116,104,101,67,111,110,102,101,100,101,114,97,116,101,32,83, +116,97,116,101,115,105,110,100,105,103,101,110,111,117,115,32,112,101,111,112, +108,101,115,80,114,111,99,101,101,100,105,110,103,115,32,111,102,32,116,104,101, +105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,116,104,101,116,104,101 +,111,114,105,101,115,32,104,97,118,101,32,98,101,101,110,105,110,118,111,108,118 +,101,109,101,110,116,32,105,110,32,116,104,101,100,105,118,105,100,101,100,32, +105,110,116,111,32,116,104,114,101,101,97,100,106,97,99,101,110,116,32,99,111, +117,110,116,114,105,101,115,105,115,32,114,101,115,112,111,110,115,105,98,108, +101,32,102,111,114,100,105,115,115,111,108,117,116,105,111,110,32,111,102,32,116 +,104,101,99,111,108,108,97,98,111,114,97,116,105,111,110,32,119,105,116,104,119, +105,100,101,108,121,32,114,101,103,97,114,100,101,100,32,97,115,104,105,115,32, +99,111,110,116,101,109,112,111,114,97,114,105,101,115,102,111,117,110,100,105, +110,103,32,109,101,109,98,101,114,32,111,102,68,111,109,105,110,105,99,97,110,32 +,82,101,112,117,98,108,105,99,103,101,110,101,114,97,108,108,121,32,97,99,99,101 +,112,116,101,100,116,104,101,32,112,111,115,115,105,98,105,108,105,116,121,32, +111,102,97,114,101,32,97,108,115,111,32,97,118,97,105,108,97,98,108,101,117,110, +100,101,114,32,99,111,110,115,116,114,117,99,116,105,111,110,114,101,115,116,111 +,114,97,116,105,111,110,32,111,102,32,116,104,101,116,104,101,32,103,101,110,101 +,114,97,108,32,112,117,98,108,105,99,105,115,32,97,108,109,111,115,116,32,101, +110,116,105,114,101,108,121,112,97,115,115,101,115,32,116,104,114,111,117,103, +104,32,116,104,101,104,97,115,32,98,101,101,110,32,115,117,103,103,101,115,116, +101,100,99,111,109,112,117,116,101,114,32,97,110,100,32,118,105,100,101,111,71, +101,114,109,97,110,105,99,32,108,97,110,103,117,97,103,101,115,32,97,99,99,111, +114,100,105,110,103,32,116,111,32,116,104,101,32,100,105,102,102,101,114,101,110 +,116,32,102,114,111,109,32,116,104,101,115,104,111,114,116,108,121,32,97,102,116 +,101,114,119,97,114,100,115,104,114,101,102,61,34,104,116,116,112,115,58,47,47, +119,119,119,46,114,101,99,101,110,116,32,100,101,118,101,108,111,112,109,101,110 +,116,66,111,97,114,100,32,111,102,32,68,105,114,101,99,116,111,114,115,60,100, +105,118,32,99,108,97,115,115,61,34,115,101,97,114,99,104,124,32,60,97,32,104,114 +,101,102,61,34,104,116,116,112,58,47,47,73,110,32,112,97,114,116,105,99,117,108, +97,114,44,32,116,104,101,77,117,108,116,105,112,108,101,32,102,111,111,116,110, +111,116,101,115,111,114,32,111,116,104,101,114,32,115,117,98,115,116,97,110,99, +101,116,104,111,117,115,97,110,100,115,32,111,102,32,121,101,97,114,115,116,114, +97,110,115,108,97,116,105,111,110,32,111,102,32,116,104,101,60,47,100,105,118,62 +,13,10,60,47,100,105,118,62,13,10,13,10,60,97,32,104,114,101,102,61,34,105,110, +100,101,120,46,112,104,112,119,97,115,32,101,115,116,97,98,108,105,115,104,101, +100,32,105,110,109,105,110,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10, +112,97,114,116,105,99,105,112,97,116,101,32,105,110,32,116,104,101,97,32,115,116 +,114,111,110,103,32,105,110,102,108,117,101,110,99,101,115,116,121,108,101,61,34 +,109,97,114,103,105,110,45,116,111,112,58,114,101,112,114,101,115,101,110,116, +101,100,32,98,121,32,116,104,101,103,114,97,100,117,97,116,101,100,32,102,114, +111,109,32,116,104,101,84,114,97,100,105,116,105,111,110,97,108,108,121,44,32, +116,104,101,69,108,101,109,101,110,116,40,34,115,99,114,105,112,116,34,41,59,72, +111,119,101,118,101,114,44,32,115,105,110,99,101,32,116,104,101,47,100,105,118, +62,10,60,47,100,105,118,62,10,60,100,105,118,32,108,101,102,116,59,32,109,97,114 +,103,105,110,45,108,101,102,116,58,112,114,111,116,101,99,116,105,111,110,32,97, +103,97,105,110,115,116,48,59,32,118,101,114,116,105,99,97,108,45,97,108,105,103, +110,58,85,110,102,111,114,116,117,110,97,116,101,108,121,44,32,116,104,101,116, +121,112,101,61,34,105,109,97,103,101,47,120,45,105,99,111,110,47,100,105,118,62, +10,60,100,105,118,32,99,108,97,115,115,61,34,32,99,108,97,115,115,61,34,99,108, +101,97,114,102,105,120,34,62,60,100,105,118,32,99,108,97,115,115,61,34,102,111, +111,116,101,114,9,9,60,47,100,105,118,62,10,9,9,60,47,100,105,118,62,10,116,104, +101,32,109,111,116,105,111,110,32,112,105,99,116,117,114,101,208,145,209,138,208 +,187,208,179,208,176,209,128,209,129,208,186,208,184,208,177,209,138,208,187,208 +,179,208,176,209,128,209,129,208,186,208,184,208,164,208,181,208,180,208,181,209 +,128,208,176,209,134,208,184,208,184,208,189,208,181,209,129,208,186,208,190,208 +,187,209,140,208,186,208,190,209,129,208,190,208,190,208,177,209,137,208,181,208 +,189,208,184,208,181,209,129,208,190,208,190,208,177,209,137,208,181,208,189,208 +,184,209,143,208,191,209,128,208,190,208,179,209,128,208,176,208,188,208,188,209 +,139,208,158,209,130,208,191,209,128,208,176,208,178,208,184,209,130,209,140,208 +,177,208,181,209,129,208,191,208,187,208,176,209,130,208,189,208,190,208,188,208 +,176,209,130,208,181,209,128,208,184,208,176,208,187,209,139,208,191,208,190,208 +,183,208,178,208,190,208,187,209,143,208,181,209,130,208,191,208,190,209,129,208 +,187,208,181,208,180,208,189,208,184,208,181,209,128,208,176,208,183,208,187,208 +,184,209,135,208,189,209,139,209,133,208,191,209,128,208,190,208,180,209,131,208 +,186,209,134,208,184,208,184,208,191,209,128,208,190,208,179,209,128,208,176,208 +,188,208,188,208,176,208,191,208,190,208,187,208,189,208,190,209,129,209,130,209 +,140,209,142,208,189,208,176,209,133,208,190,208,180,208,184,209,130,209,129,209 +,143,208,184,208,183,208,177,209,128,208,176,208,189,208,189,208,190,208,181,208 +,189,208,176,209,129,208,181,208,187,208,181,208,189,208,184,209,143,208,184,208 +,183,208,188,208,181,208,189,208,181,208,189,208,184,209,143,208,186,208,176,209 +,130,208,181,208,179,208,190,209,128,208,184,208,184,208,144,208,187,208,181,208 +,186,209,129,208,176,208,189,208,180,209,128,224,164,166,224,165,141,224,164,181 +,224,164,190,224,164,176,224,164,190,224,164,174,224,165,136,224,164,168,224,165 +,129,224,164,133,224,164,178,224,164,170,224,165,141,224,164,176,224,164,166,224 +,164,190,224,164,168,224,164,173,224,164,190,224,164,176,224,164,164,224,165,128 +,224,164,175,224,164,133,224,164,168,224,165,129,224,164,166,224,165,135,224,164 +,182,224,164,185,224,164,191,224,164,168,224,165,141,224,164,166,224,165,128,224 +,164,135,224,164,130,224,164,161,224,164,191,224,164,175,224,164,190,224,164,166 +,224,164,191,224,164,178,224,165,141,224,164,178,224,165,128,224,164,133,224,164 +,167,224,164,191,224,164,149,224,164,190,224,164,176,224,164,181,224,165,128,224 +,164,161,224,164,191,224,164,175,224,165,139,224,164,154,224,164,191,224,164,159 +,224,165,141,224,164,160,224,165,135,224,164,184,224,164,174,224,164,190,224,164 +,154,224,164,190,224,164,176,224,164,156,224,164,130,224,164,149,224,165,141,224 +,164,182,224,164,168,224,164,166,224,165,129,224,164,168,224,164,191,224,164,175 +,224,164,190,224,164,170,224,165,141,224,164,176,224,164,175,224,165,139,224,164 +,151,224,164,133,224,164,168,224,165,129,224,164,184,224,164,190,224,164,176,224 +,164,145,224,164,168,224,164,178,224,164,190,224,164,135,224,164,168,224,164,170 +,224,164,190,224,164,176,224,165,141,224,164,159,224,165,128,224,164,182,224,164 +,176,224,165,141,224,164,164,224,165,139,224,164,130,224,164,178,224,165,139,224 +,164,149,224,164,184,224,164,173,224,164,190,224,164,171,224,164,188,224,165,141 +,224,164,178,224,165,136,224,164,182,224,164,182,224,164,176,224,165,141,224,164 +,164,224,165,135,224,164,130,224,164,170,224,165,141,224,164,176,224,164,166,224 +,165,135,224,164,182,224,164,170,224,165,141,224,164,178,224,165,135,224,164,175 +,224,164,176,224,164,149,224,165,135,224,164,130,224,164,166,224,165,141,224,164 +,176,224,164,184,224,165,141,224,164,165,224,164,191,224,164,164,224,164,191,224 +,164,137,224,164,164,224,165,141,224,164,170,224,164,190,224,164,166,224,164,137 +,224,164,168,224,165,141,224,164,185,224,165,135,224,164,130,224,164,154,224,164 +,191,224,164,159,224,165,141,224,164,160,224,164,190,224,164,175,224,164,190,224 +,164,164,224,165,141,224,164,176,224,164,190,224,164,156,224,165,141,224,164,175 +,224,164,190,224,164,166,224,164,190,224,164,170,224,165,129,224,164,176,224,164 +,190,224,164,168,224,165,135,224,164,156,224,165,139,224,164,161,224,164,188,224 +,165,135,224,164,130,224,164,133,224,164,168,224,165,129,224,164,181,224,164,190 +,224,164,166,224,164,182,224,165,141,224,164,176,224,165,135,224,164,163,224,165 +,128,224,164,182,224,164,191,224,164,149,224,165,141,224,164,183,224,164,190,224 +,164,184,224,164,176,224,164,149,224,164,190,224,164,176,224,165,128,224,164,184 +,224,164,130,224,164,151,224,165,141,224,164,176,224,164,185,224,164,170,224,164 +,176,224,164,191,224,164,163,224,164,190,224,164,174,224,164,172,224,165,141,224 +,164,176,224,164,190,224,164,130,224,164,161,224,164,172,224,164,154,224,165,141 +,224,164,154,224,165,139,224,164,130,224,164,137,224,164,170,224,164,178,224,164 +,172,224,165,141,224,164,167,224,164,174,224,164,130,224,164,164,224,165,141,224 +,164,176,224,165,128,224,164,184,224,164,130,224,164,170,224,164,176,224,165,141 +,224,164,149,224,164,137,224,164,174,224,165,141,224,164,174,224,165,128,224,164 +,166,224,164,174,224,164,190,224,164,167,224,165,141,224,164,175,224,164,174,224 +,164,184,224,164,185,224,164,190,224,164,175,224,164,164,224,164,190,224,164,182 +,224,164,172,224,165,141,224,164,166,224,165,139,224,164,130,224,164,174,224,165 +,128,224,164,161,224,164,191,224,164,175,224,164,190,224,164,134,224,164,136,224 +,164,170,224,165,128,224,164,143,224,164,178,224,164,174,224,165,139,224,164,172 +,224,164,190,224,164,135,224,164,178,224,164,184,224,164,130,224,164,150,224,165 +,141,224,164,175,224,164,190,224,164,134,224,164,170,224,164,176,224,165,135,224 +,164,182,224,164,168,224,164,133,224,164,168,224,165,129,224,164,172,224,164,130 +,224,164,167,224,164,172,224,164,190,224,164,156,224,164,188,224,164,190,224,164 +,176,224,164,168,224,164,181,224,165,128,224,164,168,224,164,164,224,164,174,224 +,164,170,224,165,141,224,164,176,224,164,174,224,165,129,224,164,150,224,164,170 +,224,165,141,224,164,176,224,164,182,224,165,141,224,164,168,224,164,170,224,164 +,176,224,164,191,224,164,181,224,164,190,224,164,176,224,164,168,224,165,129,224 +,164,149,224,164,184,224,164,190,224,164,168,224,164,184,224,164,174,224,164,176 +,224,165,141,224,164,165,224,164,168,224,164,134,224,164,175,224,165,139,224,164 +,156,224,164,191,224,164,164,224,164,184,224,165,139,224,164,174,224,164,181,224 +,164,190,224,164,176,216,167,217,132,217,133,216,180,216,167,216,177,217,131,216 +,167,216,170,216,167,217,132,217,133,217,134,216,170,216,175,217,138,216,167,216 +,170,216,167,217,132,217,131,217,133,216,168,217,138,217,136,216,170,216,177,216 +,167,217,132,217,133,216,180,216,167,217,135,216,175,216,167,216,170,216,185,216 +,175,216,175,216,167,217,132,216,178,217,136,216,167,216,177,216,185,216,175,216 +,175,216,167,217,132,216,177,216,175,217,136,216,175,216,167,217,132,216,165,216 +,179,217,132,216,167,217,133,217,138,216,169,216,167,217,132,217,129,217,136,216 +,170,217,136,216,180,217,136,216,168,216,167,217,132,217,133,216,179,216,167,216 +,168,217,130,216,167,216,170,216,167,217,132,217,133,216,185,217,132,217,136,217 +,133,216,167,216,170,216,167,217,132,217,133,216,179,217,132,216,179,217,132,216 +,167,216,170,216,167,217,132,216,172,216,177,216,167,217,129,217,138,217,131,216 +,179,216,167,217,132,216,167,216,179,217,132,216,167,217,133,217,138,216,169,216 +,167,217,132,216,167,216,170,216,181,216,167,217,132,216,167,216,170,107,101,121 +,119,111,114,100,115,34,32,99,111,110,116,101,110,116,61,34,119,51,46,111,114, +103,47,49,57,57,57,47,120,104,116,109,108,34,62,60,97,32,116,97,114,103,101,116, +61,34,95,98,108,97,110,107,34,32,116,101,120,116,47,104,116,109,108,59,32,99,104 +,97,114,115,101,116,61,34,32,116,97,114,103,101,116,61,34,95,98,108,97,110,107, +34,62,60,116,97,98,108,101,32,99,101,108,108,112,97,100,100,105,110,103,61,34,97 +,117,116,111,99,111,109,112,108,101,116,101,61,34,111,102,102,34,32,116,101,120, +116,45,97,108,105,103,110,58,32,99,101,110,116,101,114,59,116,111,32,108,97,115, +116,32,118,101,114,115,105,111,110,32,98,121,32,98,97,99,107,103,114,111,117,110 +,100,45,99,111,108,111,114,58,32,35,34,32,104,114,101,102,61,34,104,116,116,112, +58,47,47,119,119,119,46,47,100,105,118,62,60,47,100,105,118,62,60,100,105,118,32 +,105,100,61,60,97,32,104,114,101,102,61,34,35,34,32,99,108,97,115,115,61,34,34, +62,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,99,114,105,112, +116,34,32,115,114,99,61,34,104,116,116,112,58,47,47,10,60,115,99,114,105,112,116 +,32,108,97,110,103,117,97,103,101,61,34,47,47,69,78,34,32,34,104,116,116,112,58, +47,47,119,119,119,46,119,101,110,99,111,100,101,85,82,73,67,111,109,112,111,110, +101,110,116,40,34,32,104,114,101,102,61,34,106,97,118,97,115,99,114,105,112,116, +58,60,100,105,118,32,99,108,97,115,115,61,34,99,111,110,116,101,110,116,100,111, +99,117,109,101,110,116,46,119,114,105,116,101,40,39,60,115,99,112,111,115,105, +116,105,111,110,58,32,97,98,115,111,108,117,116,101,59,115,99,114,105,112,116,32 +,115,114,99,61,34,104,116,116,112,58,47,47,32,115,116,121,108,101,61,34,109,97, +114,103,105,110,45,116,111,112,58,46,109,105,110,46,106,115,34,62,60,47,115,99, +114,105,112,116,62,10,60,47,100,105,118,62,10,60,100,105,118,32,99,108,97,115, +115,61,34,119,51,46,111,114,103,47,49,57,57,57,47,120,104,116,109,108,34,32,10, +13,10,60,47,98,111,100,121,62,13,10,60,47,104,116,109,108,62,100,105,115,116,105 +,110,99,116,105,111,110,32,98,101,116,119,101,101,110,47,34,32,116,97,114,103, +101,116,61,34,95,98,108,97,110,107,34,62,60,108,105,110,107,32,104,114,101,102, +61,34,104,116,116,112,58,47,47,101,110,99,111,100,105,110,103,61,34,117,116,102, +45,56,34,63,62,10,119,46,97,100,100,69,118,101,110,116,76,105,115,116,101,110, +101,114,63,97,99,116,105,111,110,61,34,104,116,116,112,58,47,47,119,119,119,46, +105,99,111,110,34,32,104,114,101,102,61,34,104,116,116,112,58,47,47,32,115,116, +121,108,101,61,34,98,97,99,107,103,114,111,117,110,100,58,116,121,112,101,61,34, +116,101,120,116,47,99,115,115,34,32,47,62,10,109,101,116,97,32,112,114,111,112, +101,114,116,121,61,34,111,103,58,116,60,105,110,112,117,116,32,116,121,112,101, +61,34,116,101,120,116,34,32,32,115,116,121,108,101,61,34,116,101,120,116,45,97, +108,105,103,110,58,116,104,101,32,100,101,118,101,108,111,112,109,101,110,116,32 +,111,102,32,116,121,108,101,115,104,101,101,116,34,32,116,121,112,101,61,34,116, +101,104,116,109,108,59,32,99,104,97,114,115,101,116,61,117,116,102,45,56,105,115 +,32,99,111,110,115,105,100,101,114,101,100,32,116,111,32,98,101,116,97,98,108, +101,32,119,105,100,116,104,61,34,49,48,48,37,34,32,73,110,32,97,100,100,105,116, +105,111,110,32,116,111,32,116,104,101,32,99,111,110,116,114,105,98,117,116,101, +100,32,116,111,32,116,104,101,32,100,105,102,102,101,114,101,110,99,101,115,32, +98,101,116,119,101,101,110,100,101,118,101,108,111,112,109,101,110,116,32,111, +102,32,116,104,101,32,73,116,32,105,115,32,105,109,112,111,114,116,97,110,116,32 +,116,111,32,60,47,115,99,114,105,112,116,62,10,10,60,115,99,114,105,112,116,32, +32,115,116,121,108,101,61,34,102,111,110,116,45,115,105,122,101,58,49,62,60,47, +115,112,97,110,62,60,115,112,97,110,32,105,100,61,103,98,76,105,98,114,97,114, +121,32,111,102,32,67,111,110,103,114,101,115,115,60,105,109,103,32,115,114,99,61 +,34,104,116,116,112,58,47,47,105,109,69,110,103,108,105,115,104,32,116,114,97, +110,115,108,97,116,105,111,110,65,99,97,100,101,109,121,32,111,102,32,83,99,105, +101,110,99,101,115,100,105,118,32,115,116,121,108,101,61,34,100,105,115,112,108, +97,121,58,99,111,110,115,116,114,117,99,116,105,111,110,32,111,102,32,116,104, +101,46,103,101,116,69,108,101,109,101,110,116,66,121,73,100,40,105,100,41,105, +110,32,99,111,110,106,117,110,99,116,105,111,110,32,119,105,116,104,69,108,101, +109,101,110,116,40,39,115,99,114,105,112,116,39,41,59,32,60,109,101,116,97,32, +112,114,111,112,101,114,116,121,61,34,111,103,58,208,145,209,138,208,187,208,179 +,208,176,209,128,209,129,208,186,208,184,10,32,116,121,112,101,61,34,116,101,120 +,116,34,32,110,97,109,101,61,34,62,80,114,105,118,97,99,121,32,80,111,108,105,99 +,121,60,47,97,62,97,100,109,105,110,105,115,116,101,114,101,100,32,98,121,32,116 +,104,101,101,110,97,98,108,101,83,105,110,103,108,101,82,101,113,117,101,115,116 +,115,116,121,108,101,61,38,113,117,111,116,59,109,97,114,103,105,110,58,60,47, +100,105,118,62,60,47,100,105,118,62,60,47,100,105,118,62,60,62,60,105,109,103,32 +,115,114,99,61,34,104,116,116,112,58,47,47,105,32,115,116,121,108,101,61,38,113, +117,111,116,59,102,108,111,97,116,58,114,101,102,101,114,114,101,100,32,116,111, +32,97,115,32,116,104,101,32,116,111,116,97,108,32,112,111,112,117,108,97,116,105 +,111,110,32,111,102,105,110,32,87,97,115,104,105,110,103,116,111,110,44,32,68,46 +,67,46,32,115,116,121,108,101,61,34,98,97,99,107,103,114,111,117,110,100,45,97, +109,111,110,103,32,111,116,104,101,114,32,116,104,105,110,103,115,44,111,114,103 +,97,110,105,122,97,116,105,111,110,32,111,102,32,116,104,101,112,97,114,116,105, +99,105,112,97,116,101,100,32,105,110,32,116,104,101,116,104,101,32,105,110,116, +114,111,100,117,99,116,105,111,110,32,111,102,105,100,101,110,116,105,102,105, +101,100,32,119,105,116,104,32,116,104,101,102,105,99,116,105,111,110,97,108,32, +99,104,97,114,97,99,116,101,114,32,79,120,102,111,114,100,32,85,110,105,118,101, +114,115,105,116,121,32,109,105,115,117,110,100,101,114,115,116,97,110,100,105, +110,103,32,111,102,84,104,101,114,101,32,97,114,101,44,32,104,111,119,101,118, +101,114,44,115,116,121,108,101,115,104,101,101,116,34,32,104,114,101,102,61,34, +47,67,111,108,117,109,98,105,97,32,85,110,105,118,101,114,115,105,116,121,101, +120,112,97,110,100,101,100,32,116,111,32,105,110,99,108,117,100,101,117,115,117, +97,108,108,121,32,114,101,102,101,114,114,101,100,32,116,111,105,110,100,105,99, +97,116,105,110,103,32,116,104,97,116,32,116,104,101,104,97,118,101,32,115,117, +103,103,101,115,116,101,100,32,116,104,97,116,97,102,102,105,108,105,97,116,101, +100,32,119,105,116,104,32,116,104,101,99,111,114,114,101,108,97,116,105,111,110, +32,98,101,116,119,101,101,110,110,117,109,98,101,114,32,111,102,32,100,105,102, +102,101,114,101,110,116,62,60,47,116,100,62,60,47,116,114,62,60,47,116,97,98,108 +,101,62,82,101,112,117,98,108,105,99,32,111,102,32,73,114,101,108,97,110,100,10, +60,47,115,99,114,105,112,116,62,10,60,115,99,114,105,112,116,32,117,110,100,101, +114,32,116,104,101,32,105,110,102,108,117,101,110,99,101,99,111,110,116,114,105, +98,117,116,105,111,110,32,116,111,32,116,104,101,79,102,102,105,99,105,97,108,32 +,119,101,98,115,105,116,101,32,111,102,104,101,97,100,113,117,97,114,116,101,114 +,115,32,111,102,32,116,104,101,99,101,110,116,101,114,101,100,32,97,114,111,117, +110,100,32,116,104,101,105,109,112,108,105,99,97,116,105,111,110,115,32,111,102, +32,116,104,101,104,97,118,101,32,98,101,101,110,32,100,101,118,101,108,111,112, +101,100,70,101,100,101,114,97,108,32,82,101,112,117,98,108,105,99,32,111,102,98, +101,99,97,109,101,32,105,110,99,114,101,97,115,105,110,103,108,121,99,111,110, +116,105,110,117,97,116,105,111,110,32,111,102,32,116,104,101,78,111,116,101,44, +32,104,111,119,101,118,101,114,44,32,116,104,97,116,115,105,109,105,108,97,114, +32,116,111,32,116,104,97,116,32,111,102,32,99,97,112,97,98,105,108,105,116,105, +101,115,32,111,102,32,116,104,101,97,99,99,111,114,100,97,110,99,101,32,119,105, +116,104,32,116,104,101,112,97,114,116,105,99,105,112,97,110,116,115,32,105,110, +32,116,104,101,102,117,114,116,104,101,114,32,100,101,118,101,108,111,112,109, +101,110,116,117,110,100,101,114,32,116,104,101,32,100,105,114,101,99,116,105,111 +,110,105,115,32,111,102,116,101,110,32,99,111,110,115,105,100,101,114,101,100, +104,105,115,32,121,111,117,110,103,101,114,32,98,114,111,116,104,101,114,60,47, +116,100,62,60,47,116,114,62,60,47,116,97,98,108,101,62,60,97,32,104,116,116,112, +45,101,113,117,105,118,61,34,88,45,85,65,45,112,104,121,115,105,99,97,108,32,112 +,114,111,112,101,114,116,105,101,115,111,102,32,66,114,105,116,105,115,104,32,67 +,111,108,117,109,98,105,97,104,97,115,32,98,101,101,110,32,99,114,105,116,105,99 +,105,122,101,100,40,119,105,116,104,32,116,104,101,32,101,120,99,101,112,116,105 +,111,110,113,117,101,115,116,105,111,110,115,32,97,98,111,117,116,32,116,104,101 +,112,97,115,115,105,110,103,32,116,104,114,111,117,103,104,32,116,104,101,48,34, +32,99,101,108,108,112,97,100,100,105,110,103,61,34,48,34,32,116,104,111,117,115, +97,110,100,115,32,111,102,32,112,101,111,112,108,101,114,101,100,105,114,101,99, +116,115,32,104,101,114,101,46,32,70,111,114,104,97,118,101,32,99,104,105,108,100 +,114,101,110,32,117,110,100,101,114,37,51,69,37,51,67,47,115,99,114,105,112,116, +37,51,69,34,41,41,59,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119 +,119,119,46,60,108,105,62,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47, +47,115,105,116,101,95,110,97,109,101,34,32,99,111,110,116,101,110,116,61,34,116, +101,120,116,45,100,101,99,111,114,97,116,105,111,110,58,110,111,110,101,115,116, +121,108,101,61,34,100,105,115,112,108,97,121,58,32,110,111,110,101,60,109,101, +116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,88,45,110,101,119,32,68, +97,116,101,40,41,46,103,101,116,84,105,109,101,40,41,32,116,121,112,101,61,34, +105,109,97,103,101,47,120,45,105,99,111,110,34,60,47,115,112,97,110,62,60,115, +112,97,110,32,99,108,97,115,115,61,34,108,97,110,103,117,97,103,101,61,34,106,97 +,118,97,115,99,114,105,112,116,119,105,110,100,111,119,46,108,111,99,97,116,105, +111,110,46,104,114,101,102,60,97,32,104,114,101,102,61,34,106,97,118,97,115,99, +114,105,112,116,58,45,45,62,13,10,60,115,99,114,105,112,116,32,116,121,112,101, +61,34,116,60,97,32,104,114,101,102,61,39,104,116,116,112,58,47,47,119,119,119,46 +,104,111,114,116,99,117,116,32,105,99,111,110,34,32,104,114,101,102,61,34,60,47, +100,105,118,62,13,10,60,100,105,118,32,99,108,97,115,115,61,34,60,115,99,114,105 +,112,116,32,115,114,99,61,34,104,116,116,112,58,47,47,34,32,114,101,108,61,34, +115,116,121,108,101,115,104,101,101,116,34,32,116,60,47,100,105,118,62,10,60,115 +,99,114,105,112,116,32,116,121,112,101,61,47,97,62,32,60,97,32,104,114,101,102, +61,34,104,116,116,112,58,47,47,32,97,108,108,111,119,84,114,97,110,115,112,97, +114,101,110,99,121,61,34,88,45,85,65,45,67,111,109,112,97,116,105,98,108,101,34, +32,99,111,110,114,101,108,97,116,105,111,110,115,104,105,112,32,98,101,116,119, +101,101,110,10,60,47,115,99,114,105,112,116,62,13,10,60,115,99,114,105,112,116, +32,60,47,97,62,60,47,108,105,62,60,47,117,108,62,60,47,100,105,118,62,97,115,115 +,111,99,105,97,116,101,100,32,119,105,116,104,32,116,104,101,32,112,114,111,103, +114,97,109,109,105,110,103,32,108,97,110,103,117,97,103,101,60,47,97,62,60,97,32 +,104,114,101,102,61,34,104,116,116,112,58,47,47,60,47,97,62,60,47,108,105,62,60, +108,105,32,99,108,97,115,115,61,34,102,111,114,109,32,97,99,116,105,111,110,61, +34,104,116,116,112,58,47,47,60,100,105,118,32,115,116,121,108,101,61,34,100,105, +115,112,108,97,121,58,116,121,112,101,61,34,116,101,120,116,34,32,110,97,109,101 +,61,34,113,34,60,116,97,98,108,101,32,119,105,100,116,104,61,34,49,48,48,37,34, +32,98,97,99,107,103,114,111,117,110,100,45,112,111,115,105,116,105,111,110,58,34 +,32,98,111,114,100,101,114,61,34,48,34,32,119,105,100,116,104,61,34,114,101,108, +61,34,115,104,111,114,116,99,117,116,32,105,99,111,110,34,32,104,54,62,60,117, +108,62,60,108,105,62,60,97,32,104,114,101,102,61,34,32,32,60,109,101,116,97,32, +104,116,116,112,45,101,113,117,105,118,61,34,99,115,115,34,32,109,101,100,105,97 +,61,34,115,99,114,101,101,110,34,32,114,101,115,112,111,110,115,105,98,108,101, +32,102,111,114,32,116,104,101,32,34,32,116,121,112,101,61,34,97,112,112,108,105, +99,97,116,105,111,110,47,34,32,115,116,121,108,101,61,34,98,97,99,107,103,114, +111,117,110,100,45,104,116,109,108,59,32,99,104,97,114,115,101,116,61,117,116, +102,45,56,34,32,97,108,108,111,119,116,114,97,110,115,112,97,114,101,110,99,121, +61,34,115,116,121,108,101,115,104,101,101,116,34,32,116,121,112,101,61,34,116, +101,13,10,60,109,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,62, +60,47,115,112,97,110,62,60,115,112,97,110,32,99,108,97,115,115,61,34,48,34,32,99 +,101,108,108,115,112,97,99,105,110,103,61,34,48,34,62,59,10,60,47,115,99,114,105 +,112,116,62,10,60,115,99,114,105,112,116,32,115,111,109,101,116,105,109,101,115, +32,99,97,108,108,101,100,32,116,104,101,100,111,101,115,32,110,111,116,32,110, +101,99,101,115,115,97,114,105,108,121,70,111,114,32,109,111,114,101,32,105,110, +102,111,114,109,97,116,105,111,110,97,116,32,116,104,101,32,98,101,103,105,110, +110,105,110,103,32,111,102,32,60,33,68,79,67,84,89,80,69,32,104,116,109,108,62, +60,104,116,109,108,112,97,114,116,105,99,117,108,97,114,108,121,32,105,110,32, +116,104,101,32,116,121,112,101,61,34,104,105,100,100,101,110,34,32,110,97,109, +101,61,34,106,97,118,97,115,99,114,105,112,116,58,118,111,105,100,40,48,41,59,34 +,101,102,102,101,99,116,105,118,101,110,101,115,115,32,111,102,32,116,104,101,32 +,97,117,116,111,99,111,109,112,108,101,116,101,61,34,111,102,102,34,32,103,101, +110,101,114,97,108,108,121,32,99,111,110,115,105,100,101,114,101,100,62,60,105, +110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,34,62,60,47,115, +99,114,105,112,116,62,13,10,60,115,99,114,105,112,116,116,104,114,111,117,103, +104,111,117,116,32,116,104,101,32,119,111,114,108,100,99,111,109,109,111,110,32, +109,105,115,99,111,110,99,101,112,116,105,111,110,97,115,115,111,99,105,97,116, +105,111,110,32,119,105,116,104,32,116,104,101,60,47,100,105,118,62,10,60,47,100, +105,118,62,10,60,100,105,118,32,99,100,117,114,105,110,103,32,104,105,115,32,108 +,105,102,101,116,105,109,101,44,99,111,114,114,101,115,112,111,110,100,105,110, +103,32,116,111,32,116,104,101,116,121,112,101,61,34,105,109,97,103,101,47,120,45 +,105,99,111,110,34,32,97,110,32,105,110,99,114,101,97,115,105,110,103,32,110,117 +,109,98,101,114,100,105,112,108,111,109,97,116,105,99,32,114,101,108,97,116,105, +111,110,115,97,114,101,32,111,102,116,101,110,32,99,111,110,115,105,100,101,114, +101,100,109,101,116,97,32,99,104,97,114,115,101,116,61,34,117,116,102,45,56,34, +32,60,105,110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,101,120 +,97,109,112,108,101,115,32,105,110,99,108,117,100,101,32,116,104,101,34,62,60, +105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,105,112,97,114,116,105, +99,105,112,97,116,105,111,110,32,105,110,32,116,104,101,116,104,101,32,101,115, +116,97,98,108,105,115,104,109,101,110,116,32,111,102,10,60,47,100,105,118,62,10, +60,100,105,118,32,99,108,97,115,115,61,34,38,97,109,112,59,110,98,115,112,59,38, +97,109,112,59,110,98,115,112,59,116,111,32,100,101,116,101,114,109,105,110,101, +32,119,104,101,116,104,101,114,113,117,105,116,101,32,100,105,102,102,101,114, +101,110,116,32,102,114,111,109,109,97,114,107,101,100,32,116,104,101,32,98,101, +103,105,110,110,105,110,103,100,105,115,116,97,110,99,101,32,98,101,116,119,101, +101,110,32,116,104,101,99,111,110,116,114,105,98,117,116,105,111,110,115,32,116, +111,32,116,104,101,99,111,110,102,108,105,99,116,32,98,101,116,119,101,101,110, +32,116,104,101,119,105,100,101,108,121,32,99,111,110,115,105,100,101,114,101,100 +,32,116,111,119,97,115,32,111,110,101,32,111,102,32,116,104,101,32,102,105,114, +115,116,119,105,116,104,32,118,97,114,121,105,110,103,32,100,101,103,114,101,101 +,115,104,97,118,101,32,115,112,101,99,117,108,97,116,101,100,32,116,104,97,116, +40,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,112, +97,114,116,105,99,105,112,97,116,105,110,103,32,105,110,32,116,104,101,111,114, +105,103,105,110,97,108,108,121,32,100,101,118,101,108,111,112,101,100,101,116,97 +,32,99,104,97,114,115,101,116,61,34,117,116,102,45,56,34,62,32,116,121,112,101, +61,34,116,101,120,116,47,99,115,115,34,32,47,62,10,105,110,116,101,114,99,104,97 +,110,103,101,97,98,108,121,32,119,105,116,104,109,111,114,101,32,99,108,111,115, +101,108,121,32,114,101,108,97,116,101,100,115,111,99,105,97,108,32,97,110,100,32 +,112,111,108,105,116,105,99,97,108,116,104,97,116,32,119,111,117,108,100,32,111, +116,104,101,114,119,105,115,101,112,101,114,112,101,110,100,105,99,117,108,97, +114,32,116,111,32,116,104,101,115,116,121,108,101,32,116,121,112,101,61,34,116, +101,120,116,47,99,115,115,116,121,112,101,61,34,115,117,98,109,105,116,34,32,110 +,97,109,101,61,34,102,97,109,105,108,105,101,115,32,114,101,115,105,100,105,110, +103,32,105,110,100,101,118,101,108,111,112,105,110,103,32,99,111,117,110,116,114 +,105,101,115,99,111,109,112,117,116,101,114,32,112,114,111,103,114,97,109,109, +105,110,103,101,99,111,110,111,109,105,99,32,100,101,118,101,108,111,112,109,101 +,110,116,100,101,116,101,114,109,105,110,97,116,105,111,110,32,111,102,32,116, +104,101,102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111 +,110,111,110,32,115,101,118,101,114,97,108,32,111,99,99,97,115,105,111,110,115, +112,111,114,116,117,103,117,195,170,115,32,40,69,117,114,111,112,101,117,41,208, +163,208,186,209,128,208,176,209,151,208,189,209,129,209,140,208,186,208,176,209, +131,208,186,209,128,208,176,209,151,208,189,209,129,209,140,208,186,208,176,208, +160,208,190,209,129,209,129,208,184,208,185,209,129,208,186,208,190,208,185,208, +188,208,176,209,130,208,181,209,128,208,184,208,176,208,187,208,190,208,178,208, +184,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,208,184,209, +131,208,191,209,128,208,176,208,178,208,187,208,181,208,189,208,184,209,143,208, +189,208,181,208,190,208,177,209,133,208,190,208,180,208,184,208,188,208,190,208, +184,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,209,143,208, +152,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,209,143,208, +160,208,181,209,129,208,191,209,131,208,177,208,187,208,184,208,186,208,184,208, +186,208,190,208,187,208,184,209,135,208,181,209,129,209,130,208,178,208,190,208, +184,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,209,142,209, +130,208,181,209,128,209,128,208,184,209,130,208,190,209,128,208,184,208,184,208, +180,208,190,209,129,209,130,208,176,209,130,208,190,209,135,208,189,208,190,216, +167,217,132,217,133,216,170,217,136,216,167,216,172,216,175,217,136,217,134,216, +167,217,132,216,167,216,180,216,170,216,177,216,167,217,131,216,167,216,170,216, +167,217,132,216,167,217,130,216,170,216,177,216,167,216,173,216,167,216,170,104, +116,109,108,59,32,99,104,97,114,115,101,116,61,85,84,70,45,56,34,32,115,101,116, +84,105,109,101,111,117,116,40,102,117,110,99,116,105,111,110,40,41,100,105,115, +112,108,97,121,58,105,110,108,105,110,101,45,98,108,111,99,107,59,60,105,110,112 +,117,116,32,116,121,112,101,61,34,115,117,98,109,105,116,34,32,116,121,112,101, +32,61,32,39,116,101,120,116,47,106,97,118,97,115,99,114,105,60,105,109,103,32, +115,114,99,61,34,104,116,116,112,58,47,47,119,119,119,46,34,32,34,104,116,116, +112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,115,104,111,114,116,99,117, +116,32,105,99,111,110,34,32,104,114,101,102,61,34,34,32,97,117,116,111,99,111, +109,112,108,101,116,101,61,34,111,102,102,34,32,60,47,97,62,60,47,100,105,118,62 +,60,100,105,118,32,99,108,97,115,115,61,60,47,97,62,60,47,108,105,62,10,60,108, +105,32,99,108,97,115,115,61,34,99,115,115,34,32,116,121,112,101,61,34,116,101, +120,116,47,99,115,115,34,32,60,102,111,114,109,32,97,99,116,105,111,110,61,34, +104,116,116,112,58,47,47,120,116,47,99,115,115,34,32,104,114,101,102,61,34,104, +116,116,112,58,47,47,108,105,110,107,32,114,101,108,61,34,97,108,116,101,114,110 +,97,116,101,34,32,13,10,60,115,99,114,105,112,116,32,116,121,112,101,61,34,116, +101,120,116,47,32,111,110,99,108,105,99,107,61,34,106,97,118,97,115,99,114,105, +112,116,58,40,110,101,119,32,68,97,116,101,41,46,103,101,116,84,105,109,101,40, +41,125,104,101,105,103,104,116,61,34,49,34,32,119,105,100,116,104,61,34,49,34,32 +,80,101,111,112,108,101,39,115,32,82,101,112,117,98,108,105,99,32,111,102,32,32, +60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,116,101, +120,116,45,100,101,99,111,114,97,116,105,111,110,58,117,110,100,101,114,116,104, +101,32,98,101,103,105,110,110,105,110,103,32,111,102,32,116,104,101,32,60,47,100 +,105,118,62,10,60,47,100,105,118,62,10,60,47,100,105,118,62,10,101,115,116,97,98 +,108,105,115,104,109,101,110,116,32,111,102,32,116,104,101,32,60,47,100,105,118, +62,60,47,100,105,118,62,60,47,100,105,118,62,60,47,100,35,118,105,101,119,112, +111,114,116,123,109,105,110,45,104,101,105,103,104,116,58,10,60,115,99,114,105, +112,116,32,115,114,99,61,34,104,116,116,112,58,47,47,111,112,116,105,111,110,62, +60,111,112,116,105,111,110,32,118,97,108,117,101,61,111,102,116,101,110,32,114, +101,102,101,114,114,101,100,32,116,111,32,97,115,32,47,111,112,116,105,111,110, +62,10,60,111,112,116,105,111,110,32,118,97,108,117,60,33,68,79,67,84,89,80,69,32 +,104,116,109,108,62,10,60,33,45,45,91,73,110,116,101,114,110,97,116,105,111,110, +97,108,32,65,105,114,112,111,114,116,62,10,60,97,32,104,114,101,102,61,34,104, +116,116,112,58,47,47,119,119,119,60,47,97,62,60,97,32,104,114,101,102,61,34,104, +116,116,112,58,47,47,119,224,184,160,224,184,178,224,184,169,224,184,178,224,185 +,132,224,184,151,224,184,162,225,131,165,225,131,144,225,131,160,225,131,151,225 +,131,163,225,131,154,225,131,152,230,173,163,233,171,148,228,184,173,230,150,135 +,32,40,231,185,129,233,171,148,41,224,164,168,224,164,191,224,164,176,224,165, +141,224,164,166,224,165,135,224,164,182,224,164,161,224,164,190,224,164,137,224, +164,168,224,164,178,224,165,139,224,164,161,224,164,149,224,165,141,224,164,183, +224,165,135,224,164,164,224,165,141,224,164,176,224,164,156,224,164,190,224,164, +168,224,164,149,224,164,190,224,164,176,224,165,128,224,164,184,224,164,130,224, +164,172,224,164,130,224,164,167,224,164,191,224,164,164,224,164,184,224,165,141, +224,164,165,224,164,190,224,164,170,224,164,168,224,164,190,224,164,184,224,165, +141,224,164,181,224,165,128,224,164,149,224,164,190,224,164,176,224,164,184,224, +164,130,224,164,184,224,165,141,224,164,149,224,164,176,224,164,163,224,164,184, +224,164,190,224,164,174,224,164,151,224,165,141,224,164,176,224,165,128,224,164, +154,224,164,191,224,164,159,224,165,141,224,164,160,224,165,139,224,164,130,224, +164,181,224,164,191,224,164,156,224,165,141,224,164,158,224,164,190,224,164,168, +224,164,133,224,164,174,224,165,135,224,164,176,224,164,191,224,164,149,224,164, +190,224,164,181,224,164,191,224,164,173,224,164,191,224,164,168,224,165,141,224, +164,168,224,164,151,224,164,190,224,164,161,224,164,191,224,164,175,224,164,190, +224,164,129,224,164,149,224,165,141,224,164,175,224,165,139,224,164,130,224,164, +149,224,164,191,224,164,184,224,165,129,224,164,176,224,164,149,224,165,141,224, +164,183,224,164,190,224,164,170,224,164,185,224,165,129,224,164,129,224,164,154, +224,164,164,224,165,128,224,164,170,224,165,141,224,164,176,224,164,172,224,164, +130,224,164,167,224,164,168,224,164,159,224,164,191,224,164,170,224,165,141,224, +164,170,224,164,163,224,165,128,224,164,149,224,165,141,224,164,176,224,164,191, +224,164,149,224,165,135,224,164,159,224,164,170,224,165,141,224,164,176,224,164, +190,224,164,176,224,164,130,224,164,173,224,164,170,224,165,141,224,164,176,224, +164,190,224,164,170,224,165,141,224,164,164,224,164,174,224,164,190,224,164,178, +224,164,191,224,164,149,224,165,139,224,164,130,224,164,176,224,164,171,224,164, +188,224,165,141,224,164,164,224,164,190,224,164,176,224,164,168,224,164,191,224, +164,176,224,165,141,224,164,174,224,164,190,224,164,163,224,164,178,224,164,191, +224,164,174,224,164,191,224,164,159,224,165,135,224,164,161,100,101,115,99,114, +105,112,116,105,111,110,34,32,99,111,110,116,101,110,116,61,34,100,111,99,117, +109,101,110,116,46,108,111,99,97,116,105,111,110,46,112,114,111,116,46,103,101, +116,69,108,101,109,101,110,116,115,66,121,84,97,103,78,97,109,101,40,60,33,68,79 +,67,84,89,80,69,32,104,116,109,108,62,10,60,104,116,109,108,32,60,109,101,116,97 +,32,99,104,97,114,115,101,116,61,34,117,116,102,45,56,34,62,58,117,114,108,34,32 +,99,111,110,116,101,110,116,61,34,104,116,116,112,58,47,47,46,99,115,115,34,32, +114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,115,116,121,108,101 +,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,62,116,121,112,101,61 +,34,116,101,120,116,47,99,115,115,34,32,104,114,101,102,61,34,119,51,46,111,114, +103,47,49,57,57,57,47,120,104,116,109,108,34,32,120,109,108,116,121,112,101,61, +34,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,34,32,109,101,116,104 +,111,100,61,34,103,101,116,34,32,97,99,116,105,111,110,61,34,108,105,110,107,32, +114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,32,32,61,32,100,111 +,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,116,121,112, +101,61,34,105,109,97,103,101,47,120,45,105,99,111,110,34,32,47,62,99,101,108,108 +,112,97,100,100,105,110,103,61,34,48,34,32,99,101,108,108,115,112,46,99,115,115, +34,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,32,60,47,97,62,60, +47,108,105,62,60,108,105,62,60,97,32,104,114,101,102,61,34,34,32,119,105,100,116 +,104,61,34,49,34,32,104,101,105,103,104,116,61,34,49,34,34,62,60,97,32,104,114, +101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,115,116,121,108,101,61,34, +100,105,115,112,108,97,121,58,110,111,110,101,59,34,62,97,108,116,101,114,110,97 +,116,101,34,32,116,121,112,101,61,34,97,112,112,108,105,45,47,47,87,51,67,47,47, +68,84,68,32,88,72,84,77,76,32,49,46,48,32,101,108,108,115,112,97,99,105,110,103, +61,34,48,34,32,99,101,108,108,112,97,100,32,116,121,112,101,61,34,104,105,100, +100,101,110,34,32,118,97,108,117,101,61,34,47,97,62,38,110,98,115,112,59,60,115, +112,97,110,32,114,111,108,101,61,34,115,10,60,105,110,112,117,116,32,116,121,112 +,101,61,34,104,105,100,100,101,110,34,32,108,97,110,103,117,97,103,101,61,34,74, +97,118,97,83,99,114,105,112,116,34,32,32,100,111,99,117,109,101,110,116,46,103, +101,116,69,108,101,109,101,110,116,115,66,103,61,34,48,34,32,99,101,108,108,115, +112,97,99,105,110,103,61,34,48,34,32,121,112,101,61,34,116,101,120,116,47,99,115 +,115,34,32,109,101,100,105,97,61,34,116,121,112,101,61,39,116,101,120,116,47,106 +,97,118,97,115,99,114,105,112,116,39,119,105,116,104,32,116,104,101,32,101,120, +99,101,112,116,105,111,110,32,111,102,32,121,112,101,61,34,116,101,120,116,47,99 +,115,115,34,32,114,101,108,61,34,115,116,32,104,101,105,103,104,116,61,34,49,34, +32,119,105,100,116,104,61,34,49,34,32,61,39,43,101,110,99,111,100,101,85,82,73, +67,111,109,112,111,110,101,110,116,40,60,108,105,110,107,32,114,101,108,61,34,97 +,108,116,101,114,110,97,116,101,34,32,10,98,111,100,121,44,32,116,114,44,32,105, +110,112,117,116,44,32,116,101,120,116,109,101,116,97,32,110,97,109,101,61,34,114 +,111,98,111,116,115,34,32,99,111,110,109,101,116,104,111,100,61,34,112,111,115, +116,34,32,97,99,116,105,111,110,61,34,62,10,60,97,32,104,114,101,102,61,34,104, +116,116,112,58,47,47,119,119,119,46,99,115,115,34,32,114,101,108,61,34,115,116, +121,108,101,115,104,101,101,116,34,32,60,47,100,105,118,62,60,47,100,105,118,62, +60,100,105,118,32,99,108,97,115,115,108,97,110,103,117,97,103,101,61,34,106,97, +118,97,115,99,114,105,112,116,34,62,97,114,105,97,45,104,105,100,100,101,110,61, +34,116,114,117,101,34,62,194,183,60,114,105,112,116,34,32,116,121,112,101,61,34, +116,101,120,116,47,106,97,118,97,115,108,61,48,59,125,41,40,41,59,10,40,102,117, +110,99,116,105,111,110,40,41,123,98,97,99,107,103,114,111,117,110,100,45,105,109 +,97,103,101,58,32,117,114,108,40,47,97,62,60,47,108,105,62,60,108,105,62,60,97, +32,104,114,101,102,61,34,104,9,9,60,108,105,62,60,97,32,104,114,101,102,61,34, +104,116,116,112,58,47,47,97,116,111,114,34,32,97,114,105,97,45,104,105,100,100, +101,110,61,34,116,114,117,62,32,60,97,32,104,114,101,102,61,34,104,116,116,112, +58,47,47,119,119,119,46,108,97,110,103,117,97,103,101,61,34,106,97,118,97,115,99 +,114,105,112,116,34,32,47,111,112,116,105,111,110,62,10,60,111,112,116,105,111, +110,32,118,97,108,117,101,47,100,105,118,62,60,47,100,105,118,62,60,100,105,118, +32,99,108,97,115,115,61,114,97,116,111,114,34,32,97,114,105,97,45,104,105,100, +100,101,110,61,34,116,114,101,61,40,110,101,119,32,68,97,116,101,41,46,103,101, +116,84,105,109,101,40,41,112,111,114,116,117,103,117,195,170,115,32,40,100,111, +32,66,114,97,115,105,108,41,208,190,209,128,208,179,208,176,208,189,208,184,208, +183,208,176,209,134,208,184,208,184,208,178,208,190,208,183,208,188,208,190,208, +182,208,189,208,190,209,129,209,130,209,140,208,190,208,177,209,128,208,176,208, +183,208,190,208,178,208,176,208,189,208,184,209,143,209,128,208,181,208,179,208, +184,209,129,209,130,209,128,208,176,209,134,208,184,208,184,208,178,208,190,208, +183,208,188,208,190,208,182,208,189,208,190,209,129,209,130,208,184,208,190,208, +177,209,143,208,183,208,176,209,130,208,181,208,187,209,140,208,189,208,176,60, +33,68,79,67,84,89,80,69,32,104,116,109,108,32,80,85,66,76,73,67,32,34,110,116,45 +,84,121,112,101,34,32,99,111,110,116,101,110,116,61,34,116,101,120,116,47,60,109 +,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,67,111,110,116,101, +114,97,110,115,105,116,105,111,110,97,108,47,47,69,78,34,32,34,104,116,116,112, +58,60,104,116,109,108,32,120,109,108,110,115,61,34,104,116,116,112,58,47,47,119, +119,119,45,47,47,87,51,67,47,47,68,84,68,32,88,72,84,77,76,32,49,46,48,32,84,68, +84,68,47,120,104,116,109,108,49,45,116,114,97,110,115,105,116,105,111,110,97,108 +,47,47,119,119,119,46,119,51,46,111,114,103,47,84,82,47,120,104,116,109,108,49, +47,112,101,32,61,32,39,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116, +39,59,60,109,101,116,97,32,110,97,109,101,61,34,100,101,115,99,114,105,112,116, +105,111,110,112,97,114,101,110,116,78,111,100,101,46,105,110,115,101,114,116,66, +101,102,111,114,101,60,105,110,112,117,116,32,116,121,112,101,61,34,104,105,100, +100,101,110,34,32,110,97,106,115,34,32,116,121,112,101,61,34,116,101,120,116,47, +106,97,118,97,115,99,114,105,40,100,111,99,117,109,101,110,116,41,46,114,101,97, +100,121,40,102,117,110,99,116,105,115,99,114,105,112,116,32,116,121,112,101,61, +34,116,101,120,116,47,106,97,118,97,115,105,109,97,103,101,34,32,99,111,110,116, +101,110,116,61,34,104,116,116,112,58,47,47,85,65,45,67,111,109,112,97,116,105,98 +,108,101,34,32,99,111,110,116,101,110,116,61,116,109,108,59,32,99,104,97,114,115 +,101,116,61,117,116,102,45,56,34,32,47,62,10,108,105,110,107,32,114,101,108,61, +34,115,104,111,114,116,99,117,116,32,105,99,111,110,60,108,105,110,107,32,114, +101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,32,60,47,115,99,114,105 +,112,116,62,10,60,115,99,114,105,112,116,32,116,121,112,101,61,61,32,100,111,99, +117,109,101,110,116,46,99,114,101,97,116,101,69,108,101,109,101,110,60,97,32,116 +,97,114,103,101,116,61,34,95,98,108,97,110,107,34,32,104,114,101,102,61,32,100, +111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,115,66,105, +110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,110,97,109,101,61 +,97,46,116,121,112,101,32,61,32,39,116,101,120,116,47,106,97,118,97,115,99,114, +105,110,112,117,116,32,116,121,112,101,61,34,104,105,100,100,101,110,34,32,110, +97,109,101,104,116,109,108,59,32,99,104,97,114,115,101,116,61,117,116,102,45,56, +34,32,47,62,100,116,100,34,62,10,60,104,116,109,108,32,120,109,108,110,115,61,34 +,104,116,116,112,45,47,47,87,51,67,47,47,68,84,68,32,72,84,77,76,32,52,46,48,49, +32,84,101,110,116,115,66,121,84,97,103,78,97,109,101,40,39,115,99,114,105,112, +116,39,41,105,110,112,117,116,32,116,121,112,101,61,34,104,105,100,100,101,110, +34,32,110,97,109,60,115,99,114,105,112,116,32,116,121,112,101,61,34,116,101,120, +116,47,106,97,118,97,115,34,32,115,116,121,108,101,61,34,100,105,115,112,108,97, +121,58,110,111,110,101,59,34,62,100,111,99,117,109,101,110,116,46,103,101,116,69 +,108,101,109,101,110,116,66,121,73,100,40,61,100,111,99,117,109,101,110,116,46, +99,114,101,97,116,101,69,108,101,109,101,110,116,40,39,32,116,121,112,101,61,39, +116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,39,105,110,112,117,116, +32,116,121,112,101,61,34,116,101,120,116,34,32,110,97,109,101,61,34,100,46,103, +101,116,69,108,101,109,101,110,116,115,66,121,84,97,103,78,97,109,101,40,115,110 +,105,99,97,108,34,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119, +46,67,47,47,68,84,68,32,72,84,77,76,32,52,46,48,49,32,84,114,97,110,115,105,116, +60,115,116,121,108,101,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34 +,62,10,10,60,115,116,121,108,101,32,116,121,112,101,61,34,116,101,120,116,47,99, +115,115,34,62,105,111,110,97,108,46,100,116,100,34,62,10,60,104,116,109,108,32, +120,109,108,110,115,61,104,116,116,112,45,101,113,117,105,118,61,34,67,111,110, +116,101,110,116,45,84,121,112,101,100,105,110,103,61,34,48,34,32,99,101,108,108, +115,112,97,99,105,110,103,61,34,48,34,104,116,109,108,59,32,99,104,97,114,115, +101,116,61,117,116,102,45,56,34,32,47,62,10,32,115,116,121,108,101,61,34,100,105 +,115,112,108,97,121,58,110,111,110,101,59,34,62,60,60,108,105,62,60,97,32,104, +114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,32,116,121,112,101,61, +39,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,39,62,208,180,208,181 +,209,143,209,130,208,181,208,187,209,140,208,189,208,190,209,129,209,130,208,184 +,209,129,208,190,208,190,209,130,208,178,208,181,209,130,209,129,209,130,208,178 +,208,184,208,184,208,191,209,128,208,190,208,184,208,183,208,178,208,190,208,180 +,209,129,209,130,208,178,208,176,208,177,208,181,208,183,208,190,208,191,208,176 +,209,129,208,189,208,190,209,129,209,130,208,184,224,164,170,224,165,129,224,164 +,184,224,165,141,224,164,164,224,164,191,224,164,149,224,164,190,224,164,149,224 +,164,190,224,164,130,224,164,151,224,165,141,224,164,176,224,165,135,224,164,184 +,224,164,137,224,164,168,224,165,141,224,164,185,224,165,139,224,164,130,224,164 +,168,224,165,135,224,164,181,224,164,191,224,164,167,224,164,190,224,164,168,224 +,164,184,224,164,173,224,164,190,224,164,171,224,164,191,224,164,149,224,165,141 +,224,164,184,224,164,191,224,164,130,224,164,151,224,164,184,224,165,129,224,164 +,176,224,164,149,224,165,141,224,164,183,224,164,191,224,164,164,224,164,149,224 +,165,137,224,164,170,224,165,128,224,164,176,224,164,190,224,164,135,224,164,159 +,224,164,181,224,164,191,224,164,156,224,165,141,224,164,158,224,164,190,224,164 +,170,224,164,168,224,164,149,224,164,190,224,164,176,224,165,141,224,164,176,224 +,164,181,224,164,190,224,164,136,224,164,184,224,164,149,224,165,141,224,164,176 +,224,164,191,224,164,175,224,164,164,224,164,190 +}; diff --git a/deps/brotli/c/common/platform.c b/deps/brotli/c/common/platform.c index 25d84a94672155..1e047ced792e17 100644 --- a/deps/brotli/c/common/platform.c +++ b/deps/brotli/c/common/platform.c @@ -4,10 +4,6 @@ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ -#include - -#include - #include "platform.h" /* Default brotli_alloc_func */ diff --git a/deps/brotli/c/common/platform.h b/deps/brotli/c/common/platform.h index 7406f3fe6968e0..b59f9b8091c291 100644 --- a/deps/brotli/c/common/platform.h +++ b/deps/brotli/c/common/platform.h @@ -24,22 +24,12 @@ #ifndef BROTLI_COMMON_PLATFORM_H_ #define BROTLI_COMMON_PLATFORM_H_ -#include /* memcpy */ +#include /* IWYU pragma: export memcmp, memcpy, memset */ +#include /* IWYU pragma: export exit, free, malloc */ +#include /* should include endian.h for us */ -#include -#include - -#if defined(OS_LINUX) || defined(OS_CYGWIN) || defined(__EMSCRIPTEN__) -#include -#elif defined(OS_FREEBSD) -#include -#elif defined(OS_MACOSX) -#include -/* Let's try and follow the Linux convention */ -#define BROTLI_X_BYTE_ORDER BYTE_ORDER -#define BROTLI_X_LITTLE_ENDIAN LITTLE_ENDIAN -#define BROTLI_X_BIG_ENDIAN BIG_ENDIAN -#endif +#include /* IWYU pragma: export */ +#include /* IWYU pragma: export */ #if BROTLI_MSVC_VERSION_CHECK(18, 0, 0) #include @@ -213,9 +203,19 @@ To apply compiler hint, enclose the branching condition into macros, like this: #define BROTLI_TARGET_LOONGARCH64 #endif +/* This does not seem to be an indicator of z/Architecture (64-bit); neither + that allows to use unaligned loads. */ +#if defined(__s390x__) +#define BROTLI_TARGET_S390X +#endif + +#if defined(__mips64) +#define BROTLI_TARGET_MIPS64 +#endif + #if defined(BROTLI_TARGET_X64) || defined(BROTLI_TARGET_ARMV8_64) || \ defined(BROTLI_TARGET_POWERPC64) || defined(BROTLI_TARGET_RISCV64) || \ - defined(BROTLI_TARGET_LOONGARCH64) + defined(BROTLI_TARGET_LOONGARCH64) || defined(BROTLI_TARGET_MIPS64) #define BROTLI_TARGET_64_BITS 1 #else #define BROTLI_TARGET_64_BITS 0 @@ -248,13 +248,12 @@ To apply compiler hint, enclose the branching condition into macros, like this: #define BROTLI_LITTLE_ENDIAN 1 #elif defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) #define BROTLI_BIG_ENDIAN 1 -#elif defined(BROTLI_X_BYTE_ORDER) -#if BROTLI_X_BYTE_ORDER == BROTLI_X_LITTLE_ENDIAN +/* Likely target platform is iOS / OSX. */ +#elif defined(BYTE_ORDER) && (BYTE_ORDER == LITTLE_ENDIAN) #define BROTLI_LITTLE_ENDIAN 1 -#elif BROTLI_X_BYTE_ORDER == BROTLI_X_BIG_ENDIAN +#elif defined(BYTE_ORDER) && (BYTE_ORDER == BIG_ENDIAN) #define BROTLI_BIG_ENDIAN 1 #endif -#endif /* BROTLI_X_BYTE_ORDER */ #if !defined(BROTLI_LITTLE_ENDIAN) #define BROTLI_LITTLE_ENDIAN 0 @@ -264,12 +263,6 @@ To apply compiler hint, enclose the branching condition into macros, like this: #define BROTLI_BIG_ENDIAN 0 #endif -#if defined(BROTLI_X_BYTE_ORDER) -#undef BROTLI_X_BYTE_ORDER -#undef BROTLI_X_LITTLE_ENDIAN -#undef BROTLI_X_BIG_ENDIAN -#endif - #if defined(BROTLI_BUILD_NO_UNALIGNED_READ_FAST) #define BROTLI_UNALIGNED_READ_FAST (!!0) #elif defined(BROTLI_TARGET_X86) || defined(BROTLI_TARGET_X64) || \ @@ -284,6 +277,46 @@ To apply compiler hint, enclose the branching condition into macros, like this: #endif /* Portable unaligned memory access: read / write values via memcpy. */ +#if !defined(BROTLI_USE_PACKED_FOR_UNALIGNED) +#if defined(__mips__) && (!defined(__mips_isa_rev) || __mips_isa_rev < 6) +#define BROTLI_USE_PACKED_FOR_UNALIGNED 1 +#else +#define BROTLI_USE_PACKED_FOR_UNALIGNED 0 +#endif +#endif /* defined(BROTLI_USE_PACKED_FOR_UNALIGNED) */ + +#if BROTLI_USE_PACKED_FOR_UNALIGNED + +typedef union BrotliPackedValue { + uint16_t u16; + uint32_t u32; + uint64_t u64; + size_t szt; +} __attribute__ ((packed)) BrotliPackedValue; + +static BROTLI_INLINE uint16_t BrotliUnalignedRead16(const void* p) { + const BrotliPackedValue* address = (const BrotliPackedValue*)p; + return address->u16; +} +static BROTLI_INLINE uint32_t BrotliUnalignedRead32(const void* p) { + const BrotliPackedValue* address = (const BrotliPackedValue*)p; + return address->u32; +} +static BROTLI_INLINE uint64_t BrotliUnalignedRead64(const void* p) { + const BrotliPackedValue* address = (const BrotliPackedValue*)p; + return address->u64; +} +static BROTLI_INLINE size_t BrotliUnalignedReadSizeT(const void* p) { + const BrotliPackedValue* address = (const BrotliPackedValue*)p; + return address->szt; +} +static BROTLI_INLINE void BrotliUnalignedWrite64(void* p, uint64_t v) { + BrotliPackedValue* address = (BrotliPackedValue*)p; + address->u64 = v; +} + +#else /* not BROTLI_USE_PACKED_FOR_UNALIGNED */ + static BROTLI_INLINE uint16_t BrotliUnalignedRead16(const void* p) { uint16_t t; memcpy(&t, p, sizeof t); @@ -299,10 +332,43 @@ static BROTLI_INLINE uint64_t BrotliUnalignedRead64(const void* p) { memcpy(&t, p, sizeof t); return t; } +static BROTLI_INLINE size_t BrotliUnalignedReadSizeT(const void* p) { + size_t t; + memcpy(&t, p, sizeof t); + return t; +} static BROTLI_INLINE void BrotliUnalignedWrite64(void* p, uint64_t v) { memcpy(p, &v, sizeof v); } +#endif /* BROTLI_USE_PACKED_FOR_UNALIGNED */ + +#if BROTLI_GNUC_HAS_BUILTIN(__builtin_bswap16, 4, 3, 0) +#define BROTLI_BSWAP16(V) ((uint16_t)__builtin_bswap16(V)) +#else +#define BROTLI_BSWAP16(V) ((uint16_t)( \ + (((V) & 0xFFU) << 8) | \ + (((V) >> 8) & 0xFFU))) +#endif + +#if BROTLI_GNUC_HAS_BUILTIN(__builtin_bswap32, 4, 3, 0) +#define BROTLI_BSWAP32(V) ((uint32_t)__builtin_bswap32(V)) +#else +#define BROTLI_BSWAP32(V) ((uint32_t)( \ + (((V) & 0xFFU) << 24) | (((V) & 0xFF00U) << 8) | \ + (((V) >> 8) & 0xFF00U) | (((V) >> 24) & 0xFFU))) +#endif + +#if BROTLI_GNUC_HAS_BUILTIN(__builtin_bswap64, 4, 3, 0) +#define BROTLI_BSWAP64(V) ((uint64_t)__builtin_bswap64(V)) +#else +#define BROTLI_BSWAP64(V) ((uint64_t)( \ + (((V) & 0xFFU) << 56) | (((V) & 0xFF00U) << 40) | \ + (((V) & 0xFF0000U) << 24) | (((V) & 0xFF000000U) << 8) | \ + (((V) >> 8) & 0xFF000000U) | (((V) >> 24) & 0xFF0000U) | \ + (((V) >> 40) & 0xFF00U) | (((V) >> 56) & 0xFFU))) +#endif + #if BROTLI_LITTLE_ENDIAN /* Straight endianness. Just read / write values. */ #define BROTLI_UNALIGNED_LOAD16LE BrotliUnalignedRead16 @@ -310,32 +376,20 @@ static BROTLI_INLINE void BrotliUnalignedWrite64(void* p, uint64_t v) { #define BROTLI_UNALIGNED_LOAD64LE BrotliUnalignedRead64 #define BROTLI_UNALIGNED_STORE64LE BrotliUnalignedWrite64 #elif BROTLI_BIG_ENDIAN /* BROTLI_LITTLE_ENDIAN */ -/* Explain compiler to byte-swap values. */ -#define BROTLI_BSWAP16_(V) ((uint16_t)( \ - (((V) & 0xFFU) << 8) | \ - (((V) >> 8) & 0xFFU))) static BROTLI_INLINE uint16_t BROTLI_UNALIGNED_LOAD16LE(const void* p) { uint16_t value = BrotliUnalignedRead16(p); - return BROTLI_BSWAP16_(value); + return BROTLI_BSWAP16(value); } -#define BROTLI_BSWAP32_(V) ( \ - (((V) & 0xFFU) << 24) | (((V) & 0xFF00U) << 8) | \ - (((V) >> 8) & 0xFF00U) | (((V) >> 24) & 0xFFU)) static BROTLI_INLINE uint32_t BROTLI_UNALIGNED_LOAD32LE(const void* p) { uint32_t value = BrotliUnalignedRead32(p); - return BROTLI_BSWAP32_(value); + return BROTLI_BSWAP32(value); } -#define BROTLI_BSWAP64_(V) ( \ - (((V) & 0xFFU) << 56) | (((V) & 0xFF00U) << 40) | \ - (((V) & 0xFF0000U) << 24) | (((V) & 0xFF000000U) << 8) | \ - (((V) >> 8) & 0xFF000000U) | (((V) >> 24) & 0xFF0000U) | \ - (((V) >> 40) & 0xFF00U) | (((V) >> 56) & 0xFFU)) static BROTLI_INLINE uint64_t BROTLI_UNALIGNED_LOAD64LE(const void* p) { uint64_t value = BrotliUnalignedRead64(p); - return BROTLI_BSWAP64_(value); + return BROTLI_BSWAP64(value); } static BROTLI_INLINE void BROTLI_UNALIGNED_STORE64LE(void* p, uint64_t v) { - uint64_t value = BROTLI_BSWAP64_(v); + uint64_t value = BROTLI_BSWAP64(v); BrotliUnalignedWrite64(p, value); } #else /* BROTLI_LITTLE_ENDIAN */ @@ -475,7 +529,7 @@ BROTLI_MIN_MAX(size_t) BROTLI_MIN_MAX(uint32_t) BROTLI_MIN_MAX(uint8_t) BROTLI_INTEL_VERSION_CHECK(16, 0, 0) #define BROTLI_TZCNT64 __builtin_ctzll #elif BROTLI_MSVC_VERSION_CHECK(18, 0, 0) -#if defined(BROTLI_TARGET_X64) +#if defined(BROTLI_TARGET_X64) && !defined(_M_ARM64EC) #define BROTLI_TZCNT64 _tzcnt_u64 #else /* BROTLI_TARGET_X64 */ static BROTLI_INLINE uint32_t BrotliBsf64Msvc(uint64_t x) { @@ -506,11 +560,29 @@ BROTLI_COMMON_API void* BrotliDefaultAllocFunc(void* opaque, size_t size); /* Default brotli_free_func */ BROTLI_COMMON_API void BrotliDefaultFreeFunc(void* opaque, void* address); +/* Circular logical rotates. */ +static BROTLI_INLINE uint16_t BrotliRotateRight16(uint16_t const value, + size_t count) { + count &= 0x0F; /* for fickle pattern recognition */ + return (value >> count) | (uint16_t)(value << ((0U - count) & 0x0F)); +} +static BROTLI_INLINE uint32_t BrotliRotateRight32(uint32_t const value, + size_t count) { + count &= 0x1F; /* for fickle pattern recognition */ + return (value >> count) | (uint32_t)(value << ((0U - count) & 0x1F)); +} +static BROTLI_INLINE uint64_t BrotliRotateRight64(uint64_t const value, + size_t count) { + count &= 0x3F; /* for fickle pattern recognition */ + return (value >> count) | (uint64_t)(value << ((0U - count) & 0x3F)); +} + BROTLI_UNUSED_FUNCTION void BrotliSuppressUnusedFunctions(void) { BROTLI_UNUSED(&BrotliSuppressUnusedFunctions); BROTLI_UNUSED(&BrotliUnalignedRead16); BROTLI_UNUSED(&BrotliUnalignedRead32); BROTLI_UNUSED(&BrotliUnalignedRead64); + BROTLI_UNUSED(&BrotliUnalignedReadSizeT); BROTLI_UNUSED(&BrotliUnalignedWrite64); BROTLI_UNUSED(&BROTLI_UNALIGNED_LOAD16LE); BROTLI_UNUSED(&BROTLI_UNALIGNED_LOAD32LE); @@ -533,9 +605,76 @@ BROTLI_UNUSED_FUNCTION void BrotliSuppressUnusedFunctions(void) { BROTLI_UNUSED(&brotli_max_uint8_t); BROTLI_UNUSED(&BrotliDefaultAllocFunc); BROTLI_UNUSED(&BrotliDefaultFreeFunc); + BROTLI_UNUSED(&BrotliRotateRight16); + BROTLI_UNUSED(&BrotliRotateRight32); + BROTLI_UNUSED(&BrotliRotateRight64); #if BROTLI_ENABLE_DUMP BROTLI_UNUSED(&BrotliDump); #endif + +#if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_I86)) && \ + !defined(_M_ARM64EC) +/* _mm_prefetch() is not defined outside of x86/x64 */ +/* https://msdn.microsoft.com/fr-fr/library/84szxsww(v=vs.90).aspx */ +#include +#define PREFETCH_L1(ptr) _mm_prefetch((const char*)(ptr), _MM_HINT_T0) +#define PREFETCH_L2(ptr) _mm_prefetch((const char*)(ptr), _MM_HINT_T1) +#elif BROTLI_GNUC_HAS_BUILTIN(__builtin_prefetch, 3, 1, 0) +#define PREFETCH_L1(ptr) \ + __builtin_prefetch((ptr), 0 /* rw==read */, 3 /* locality */) +#define PREFETCH_L2(ptr) \ + __builtin_prefetch((ptr), 0 /* rw==read */, 2 /* locality */) +#elif defined(__aarch64__) +#define PREFETCH_L1(ptr) \ + do { \ + __asm__ __volatile__("prfm pldl1keep, %0" ::"Q"(*(ptr))); \ + } while (0) +#define PREFETCH_L2(ptr) \ + do { \ + __asm__ __volatile__("prfm pldl2keep, %0" ::"Q"(*(ptr))); \ + } while (0) +#else +#define PREFETCH_L1(ptr) \ + do { \ + (void)(ptr); \ + } while (0) /* disabled */ +#define PREFETCH_L2(ptr) \ + do { \ + (void)(ptr); \ + } while (0) /* disabled */ +#endif + +/* The SIMD matchers are only faster at certain quality levels. */ +#if defined(_M_X64) && defined(BROTLI_TZCNT64) +#define BROTLI_MAX_SIMD_QUALITY 7 +#elif defined(BROTLI_TZCNT64) +#define BROTLI_MAX_SIMD_QUALITY 6 +#endif } +#if defined(_MSC_VER) +#define BROTLI_CRASH() __debugbreak(), (void)abort() +#elif BROTLI_GNUC_HAS_BUILTIN(__builtin_trap, 3, 0, 0) +#define BROTLI_CRASH() (void)__builtin_trap() +#else +#define BROTLI_CRASH() (void)abort() +#endif + +/* Make BROTLI_TEST=0 act same as undefined. */ +#if defined(BROTLI_TEST) && ((1-BROTLI_TEST-1) == 0) +#undef BROTLI_TEST +#endif + +#if BROTLI_GNUC_HAS_ATTRIBUTE(model, 3, 0, 3) +#define BROTLI_MODEL(M) __attribute__((model(M))) +#else +#define BROTLI_MODEL(M) /* M */ +#endif + +#if BROTLI_GNUC_HAS_ATTRIBUTE(cold, 4, 3, 0) +#define BROTLI_COLD __attribute__((cold)) +#else +#define BROTLI_COLD /* cold */ +#endif + #endif /* BROTLI_COMMON_PLATFORM_H_ */ diff --git a/deps/brotli/c/common/shared_dictionary.c b/deps/brotli/c/common/shared_dictionary.c index 49f1c9b075fd6e..cef4e20fcd8ac1 100644 --- a/deps/brotli/c/common/shared_dictionary.c +++ b/deps/brotli/c/common/shared_dictionary.c @@ -8,10 +8,6 @@ #include -#include -#include /* malloc, free */ -#include - #include "dictionary.h" #include "platform.h" #include "shared_dictionary_internal.h" @@ -279,7 +275,7 @@ static BROTLI_BOOL ParseDictionary(const uint8_t* encoded, size_t size, size_t pos = 0; uint32_t chunk_size = 0; size_t total_prefix_suffix_count = 0; - size_t trasform_list_start[SHARED_BROTLI_NUM_DICTIONARY_CONTEXTS]; + size_t transform_list_start[SHARED_BROTLI_NUM_DICTIONARY_CONTEXTS]; uint16_t temporary_prefix_suffix_table[256]; /* Skip magic header bytes. */ @@ -333,7 +329,7 @@ static BROTLI_BOOL ParseDictionary(const uint8_t* encoded, size_t size, for (i = 0; i < dict->num_transform_lists; i++) { BROTLI_BOOL ok = BROTLI_FALSE; size_t prefix_suffix_count = 0; - trasform_list_start[i] = pos; + transform_list_start[i] = pos; dict->transforms_instances[i].prefix_suffix_map = temporary_prefix_suffix_table; ok = ParseTransformsList( @@ -351,7 +347,7 @@ static BROTLI_BOOL ParseDictionary(const uint8_t* encoded, size_t size, total_prefix_suffix_count = 0; for (i = 0; i < dict->num_transform_lists; i++) { size_t prefix_suffix_count = 0; - size_t position = trasform_list_start[i]; + size_t position = transform_list_start[i]; uint16_t* prefix_suffix_map = &dict->prefix_suffix_maps[total_prefix_suffix_count]; BROTLI_BOOL ok = ParsePrefixSuffixTable( diff --git a/deps/brotli/c/common/shared_dictionary_internal.h b/deps/brotli/c/common/shared_dictionary_internal.h index 963762e43250d8..c6a90fa741599f 100644 --- a/deps/brotli/c/common/shared_dictionary_internal.h +++ b/deps/brotli/c/common/shared_dictionary_internal.h @@ -10,9 +10,9 @@ #define BROTLI_COMMON_SHARED_DICTIONARY_INTERNAL_H_ #include -#include #include "dictionary.h" +#include "platform.h" #include "transform.h" #if defined(__cplusplus) || defined(c_plusplus) diff --git a/deps/brotli/c/common/static_init.h b/deps/brotli/c/common/static_init.h new file mode 100644 index 00000000000000..12744de8f9847a --- /dev/null +++ b/deps/brotli/c/common/static_init.h @@ -0,0 +1,56 @@ +/* Copyright 2025 Google Inc. All Rights Reserved. + + Distributed under MIT license. + See file LICENSE for detail or copy at https://opensource.org/licenses/MIT +*/ + +/* + Central point for static initialization. + + In case of "lazy" mode `BrotliXxxLazyStaticInit` is not provided by the + library. Embedder is responsible for providing it. This function should call + `BrotliXxxLazyStaticInitInner` on the first invocation. This function should + not return until execution of `BrotliXxxLazyStaticInitInner` is finished. + In C or before C++11 it is possible to call `BrotliXxxLazyStaticInitInner` + on start-up path and then `BrotliEncoderLazyStaticInit` is could be no-op; + another option is to use available thread execution controls to meet the + requirements. For possible C++11 implementation see static_init_lazy.cc. +*/ + +#ifndef THIRD_PARTY_BROTLI_COMMON_STATIC_INIT_H_ +#define THIRD_PARTY_BROTLI_COMMON_STATIC_INIT_H_ + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +/* Static data is "initialized" in compile time. */ +#define BROTLI_STATIC_INIT_NONE 0 +/* Static data is initialized before "main". */ +#define BROTLI_STATIC_INIT_EARLY 1 +/* Static data is initialized when first encoder is created. */ +#define BROTLI_STATIC_INIT_LAZY 2 + +#define BROTLI_STATIC_INIT_DEFAULT BROTLI_STATIC_INIT_NONE + +#if !defined(BROTLI_STATIC_INIT) +#define BROTLI_STATIC_INIT BROTLI_STATIC_INIT_DEFAULT +#endif + +#if (BROTLI_STATIC_INIT != BROTLI_STATIC_INIT_NONE) && \ + (BROTLI_STATIC_INIT != BROTLI_STATIC_INIT_EARLY) && \ + (BROTLI_STATIC_INIT != BROTLI_STATIC_INIT_LAZY) +#error Invalid value for BROTLI_STATIC_INIT +#endif + +#if (BROTLI_STATIC_INIT == BROTLI_STATIC_INIT_EARLY) +#if defined(BROTLI_EXTERNAL_DICTIONARY_DATA) +#error BROTLI_STATIC_INIT_EARLY will fail with BROTLI_EXTERNAL_DICTIONARY_DATA +#endif +#endif /* BROTLI_STATIC_INIT */ + +#if defined(__cplusplus) || defined(c_plusplus) +} /* extern "C" */ +#endif + +#endif // THIRD_PARTY_BROTLI_COMMON_STATIC_INIT_H_ diff --git a/deps/brotli/c/common/transform.c b/deps/brotli/c/common/transform.c index 49455fc496f022..968b9123870243 100644 --- a/deps/brotli/c/common/transform.c +++ b/deps/brotli/c/common/transform.c @@ -4,6 +4,7 @@ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ +#include "platform.h" #include "transform.h" #if defined(__cplusplus) || defined(c_plusplus) @@ -11,7 +12,7 @@ extern "C" { #endif /* RFC 7932 transforms string data */ -static const char kPrefixSuffix[217] = +static const BROTLI_MODEL("small") char kPrefixSuffix[217] = "\1 \2, \10 of the \4 of \2s \1.\5 and \4 " /* 0x _0 _2 __5 _E _3 _6 _8 _E */ "in \1\"\4 to \2\">\1\n\2. \1]\5 for \3 a \6 " @@ -27,7 +28,7 @@ static const char kPrefixSuffix[217] = "t \4ize \2\xc2\xa0\4ous \5 the \2e "; /* \0 - implicit trailing zero. */ /* Cx _2 _7___ ___ _A _F _5 _8 */ -static const uint16_t kPrefixSuffixMap[50] = { +static const BROTLI_MODEL("small") uint16_t kPrefixSuffixMap[50] = { 0x00, 0x02, 0x05, 0x0E, 0x13, 0x16, 0x18, 0x1E, 0x23, 0x25, 0x2A, 0x2D, 0x2F, 0x32, 0x34, 0x3A, 0x3E, 0x45, 0x47, 0x4E, 0x55, 0x5A, 0x5C, 0x63, 0x68, 0x6D, 0x72, 0x77, 0x7A, 0x7C, @@ -36,7 +37,7 @@ static const uint16_t kPrefixSuffixMap[50] = { }; /* RFC 7932 transforms */ -static const uint8_t kTransformsData[] = { +static const BROTLI_MODEL("small") uint8_t kTransformsData[] = { 49, BROTLI_TRANSFORM_IDENTITY, 49, 49, BROTLI_TRANSFORM_IDENTITY, 0, 0, BROTLI_TRANSFORM_IDENTITY, 0, @@ -160,7 +161,8 @@ static const uint8_t kTransformsData[] = { 0, BROTLI_TRANSFORM_UPPERCASE_FIRST, 34, }; -static const BrotliTransforms kBrotliTransforms = { +static const BROTLI_MODEL("small") +BrotliTransforms kBrotliTransforms = { sizeof(kPrefixSuffix), (const uint8_t*)kPrefixSuffix, kPrefixSuffixMap, diff --git a/deps/brotli/c/common/transform.h b/deps/brotli/c/common/transform.h index b6f86cc7d5ad24..c6176d834049c3 100644 --- a/deps/brotli/c/common/transform.h +++ b/deps/brotli/c/common/transform.h @@ -8,8 +8,7 @@ #ifndef BROTLI_COMMON_TRANSFORM_H_ #define BROTLI_COMMON_TRANSFORM_H_ -#include -#include +#include "platform.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { diff --git a/deps/brotli/c/common/version.h b/deps/brotli/c/common/version.h index 8098040f646bc5..0d6fcc50a02935 100644 --- a/deps/brotli/c/common/version.h +++ b/deps/brotli/c/common/version.h @@ -18,7 +18,7 @@ BrotliEncoderVersion methods. */ #define BROTLI_VERSION_MAJOR 1 -#define BROTLI_VERSION_MINOR 1 +#define BROTLI_VERSION_MINOR 2 #define BROTLI_VERSION_PATCH 0 #define BROTLI_VERSION BROTLI_MAKE_HEX_VERSION( \ @@ -32,9 +32,9 @@ - interfaces not changed -> current:revision+1:age */ -#define BROTLI_ABI_CURRENT 2 +#define BROTLI_ABI_CURRENT 3 #define BROTLI_ABI_REVISION 0 -#define BROTLI_ABI_AGE 1 +#define BROTLI_ABI_AGE 2 #if BROTLI_VERSION_MAJOR != (BROTLI_ABI_CURRENT - BROTLI_ABI_AGE) #error ABI/API version inconsistency diff --git a/deps/brotli/c/dec/bit_reader.c b/deps/brotli/c/dec/bit_reader.c index 35101ddc1a3428..fae034fd8d8926 100644 --- a/deps/brotli/c/dec/bit_reader.c +++ b/deps/brotli/c/dec/bit_reader.c @@ -8,15 +8,14 @@ #include "bit_reader.h" -#include - #include "../common/platform.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif -const brotli_reg_t kBrotliBitMask[33] = { 0x00000000, +const BROTLI_MODEL("small") +brotli_reg_t kBrotliBitMask[33] = { 0x00000000, 0x00000001, 0x00000003, 0x00000007, 0x0000000F, 0x0000001F, 0x0000003F, 0x0000007F, 0x000000FF, 0x000001FF, 0x000003FF, 0x000007FF, 0x00000FFF, diff --git a/deps/brotli/c/dec/bit_reader.h b/deps/brotli/c/dec/bit_reader.h index 930dc60f1d6dac..ef6b047ae6e45c 100644 --- a/deps/brotli/c/dec/bit_reader.h +++ b/deps/brotli/c/dec/bit_reader.h @@ -9,10 +9,6 @@ #ifndef BROTLI_DEC_BIT_READER_H_ #define BROTLI_DEC_BIT_READER_H_ -#include /* memcpy */ - -#include - #include "../common/constants.h" #include "../common/platform.h" diff --git a/deps/brotli/c/dec/decode.c b/deps/brotli/c/dec/decode.c index 220c7e85c6331b..e87e7f5ea0f9d0 100644 --- a/deps/brotli/c/dec/decode.c +++ b/deps/brotli/c/dec/decode.c @@ -6,9 +6,6 @@ #include -#include /* free, malloc */ -#include /* memcpy, memset */ - #include "../common/constants.h" #include "../common/context.h" #include "../common/dictionary.h" @@ -20,6 +17,7 @@ #include "huffman.h" #include "prefix.h" #include "state.h" +#include "static_init.h" #if defined(BROTLI_TARGET_NEON) #include @@ -46,16 +44,19 @@ extern "C" { 255 prefix + 32 base + 255 suffix */ static const brotli_reg_t kRingBufferWriteAheadSlack = 542; -static const uint8_t kCodeLengthCodeOrder[BROTLI_CODE_LENGTH_CODES] = { +static const BROTLI_MODEL("small") +uint8_t kCodeLengthCodeOrder[BROTLI_CODE_LENGTH_CODES] = { 1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15, }; /* Static prefix code for the complex code length code lengths. */ -static const uint8_t kCodeLengthPrefixLength[16] = { +static const BROTLI_MODEL("small") +uint8_t kCodeLengthPrefixLength[16] = { 2, 2, 2, 3, 2, 2, 2, 4, 2, 2, 2, 3, 2, 2, 2, 4, }; -static const uint8_t kCodeLengthPrefixValue[16] = { +static const BROTLI_MODEL("small") +uint8_t kCodeLengthPrefixValue[16] = { 0, 4, 3, 2, 0, 4, 3, 1, 0, 4, 3, 2, 0, 4, 3, 5, }; @@ -78,6 +79,10 @@ BROTLI_BOOL BrotliDecoderSetParameter( BrotliDecoderState* BrotliDecoderCreateInstance( brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque) { BrotliDecoderState* state = 0; + if (!BrotliDecoderEnsureStaticInit()) { + BROTLI_DUMP(); + return 0; + } if (!alloc_func && !free_func) { state = (BrotliDecoderState*)malloc(sizeof(BrotliDecoderState)); } else if (alloc_func && free_func) { @@ -217,7 +222,7 @@ static BROTLI_NOINLINE BrotliDecoderErrorCode DecodeVarLenUint8( s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_LONG; return BROTLI_DECODER_NEEDS_MORE_INPUT; } - *value = (1U << *value) + bits; + *value = ((brotli_reg_t)1U << *value) + bits; s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_NONE; return BROTLI_DECODER_SUCCESS; @@ -466,6 +471,53 @@ static BROTLI_INLINE brotli_reg_t ReadPreloadedSymbol(const HuffmanCode* table, return result; } +/* Reads up to limit symbols from br and copies them into ringbuffer, + starting from pos. Caller must ensure that there is enough space + for the write. Returns the amount of symbols actually copied. */ +static BROTLI_INLINE int BrotliCopyPreloadedSymbolsToU8(const HuffmanCode* table, + BrotliBitReader* br, + brotli_reg_t* bits, + brotli_reg_t* value, + uint8_t* ringbuffer, + int pos, + const int limit) { + /* Calculate range where CheckInputAmount is always true. + Start with the number of bytes we can read. */ + int64_t new_lim = br->guard_in - br->next_in; + /* Convert to bits, since symbols use variable number of bits. */ + new_lim *= 8; + /* At most 15 bits per symbol, so this is safe. */ + new_lim /= 15; + const int kMaximalOverread = 4; + int pos_limit = limit; + int copies = 0; + if ((new_lim - kMaximalOverread) <= limit) { + // Safe cast, since new_lim is already < num_steps + pos_limit = (int)(new_lim - kMaximalOverread); + } + if (pos_limit < 0) { + pos_limit = 0; + } + copies = pos_limit; + pos_limit += pos; + /* Fast path, caller made sure it is safe to write, + we verified that is is safe to read. */ + for (; pos < pos_limit; pos++) { + BROTLI_DCHECK(BrotliCheckInputAmount(br)); + ringbuffer[pos] = (uint8_t)ReadPreloadedSymbol(table, br, bits, value); + BROTLI_LOG_ARRAY_INDEX(ringbuffer, pos); + } + /* Do the remainder, caller made sure it is safe to write, + we need to bverify that it is safe to read. */ + while (BrotliCheckInputAmount(br) && copies < limit) { + ringbuffer[pos] = (uint8_t)ReadPreloadedSymbol(table, br, bits, value); + BROTLI_LOG_ARRAY_INDEX(ringbuffer, pos); + pos++; + copies++; + } + return copies; +} + static BROTLI_INLINE brotli_reg_t Log2Floor(brotli_reg_t x) { brotli_reg_t result = 0; while (x) { @@ -1089,7 +1141,7 @@ static BrotliDecoderErrorCode DecodeContextMap(brotli_reg_t context_map_size, h->context_index = context_index; return BROTLI_DECODER_NEEDS_MORE_INPUT; } - reps += 1U << code; + reps += (brotli_reg_t)1U << code; BROTLI_LOG_UINT(reps); if (context_index + reps > context_map_size) { return @@ -1363,6 +1415,7 @@ static BROTLI_BOOL BROTLI_NOINLINE BrotliEnsureRingBuffer( static BrotliDecoderErrorCode BROTLI_NOINLINE SkipMetadataBlock(BrotliDecoderState* s) { BrotliBitReader* br = &s->br; + int nbytes; if (s->meta_block_remaining_len == 0) { return BROTLI_DECODER_SUCCESS; @@ -1373,7 +1426,7 @@ SkipMetadataBlock(BrotliDecoderState* s) { /* Drain accumulator. */ if (BrotliGetAvailableBits(br) >= 8) { uint8_t buffer[8]; - int nbytes = (int)(BrotliGetAvailableBits(br)) >> 3; + nbytes = (int)(BrotliGetAvailableBits(br)) >> 3; BROTLI_DCHECK(nbytes <= 8); if (nbytes > s->meta_block_remaining_len) { nbytes = s->meta_block_remaining_len; @@ -1390,7 +1443,7 @@ SkipMetadataBlock(BrotliDecoderState* s) { } /* Direct access to metadata is possible. */ - int nbytes = (int)BrotliGetRemainingBytes(br); + nbytes = (int)BrotliGetRemainingBytes(br); if (nbytes > s->meta_block_remaining_len) { nbytes = s->meta_block_remaining_len; } @@ -1486,7 +1539,7 @@ static BROTLI_BOOL AttachCompoundDictionary( return BROTLI_TRUE; } -static void EnsureCoumpoundDictionaryInitialized(BrotliDecoderState* state) { +static void EnsureCompoundDictionaryInitialized(BrotliDecoderState* state) { BrotliDecoderCompoundDictionary* addon = state->compound_dictionary; /* 256 = (1 << 8) slots in block map. */ int block_bits = 8; @@ -1507,7 +1560,7 @@ static BROTLI_BOOL InitializeCompoundDictionaryCopy(BrotliDecoderState* s, int address, int length) { BrotliDecoderCompoundDictionary* addon = s->compound_dictionary; int index; - EnsureCoumpoundDictionaryInitialized(s); + EnsureCompoundDictionaryInitialized(s); index = addon->block_map[address >> addon->block_bits]; while (address >= addon->chunk_offsets[index + 1]) index++; if (addon->total_size < address + length) return BROTLI_FALSE; @@ -1753,7 +1806,7 @@ static void CalculateDistanceLut(BrotliDecoderState* s) { brotli_reg_t npostfix = s->distance_postfix_bits; brotli_reg_t ndirect = s->num_direct_distance_codes; brotli_reg_t alphabet_size_limit = s->distance_hgroup.alphabet_size_limit; - brotli_reg_t postfix = 1u << npostfix; + brotli_reg_t postfix = (brotli_reg_t)1u << npostfix; brotli_reg_t j; brotli_reg_t bits = 1; brotli_reg_t half = 0; @@ -1959,35 +2012,72 @@ static BROTLI_INLINE BrotliDecoderErrorCode ProcessCommandsInternal( brotli_reg_t bits; brotli_reg_t value; PreloadSymbol(safe, s->literal_htree, br, &bits, &value); - do { - if (!CheckInputAmount(safe, br)) { - s->state = BROTLI_STATE_COMMAND_INNER; - result = BROTLI_DECODER_NEEDS_MORE_INPUT; - goto saveStateAndReturn; + if (!safe) { + // This is a hottest part of the decode, so we copy the loop below + // and optimize it by calculating the number of steps where all checks + // evaluate to false (ringbuffer size/block size/input size). + // Since all checks are loop invariant, we just need to find + // minimal number of iterations for a simple loop, and run + // the full version for the remainder. + int num_steps = i - 1; + if (num_steps > 0 && ((brotli_reg_t)(num_steps) > s->block_length[0])) { + // Safe cast, since block_length < steps + num_steps = (int)s->block_length[0]; } - if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) { - goto NextLiteralBlock; + if (s->ringbuffer_size >= pos && + (s->ringbuffer_size - pos) <= num_steps) { + num_steps = s->ringbuffer_size - pos - 1; } - if (!safe) { - s->ringbuffer[pos] = - (uint8_t)ReadPreloadedSymbol(s->literal_htree, br, &bits, &value); - } else { + if (num_steps < 0) { + num_steps = 0; + } + num_steps = BrotliCopyPreloadedSymbolsToU8(s->literal_htree, br, &bits, + &value, s->ringbuffer, pos, + num_steps); + pos += num_steps; + s->block_length[0] -= (brotli_reg_t)num_steps; + i -= num_steps; + do { + if (!CheckInputAmount(safe, br)) { + s->state = BROTLI_STATE_COMMAND_INNER; + result = BROTLI_DECODER_NEEDS_MORE_INPUT; + goto saveStateAndReturn; + } + if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) { + goto NextLiteralBlock; + } + BrotliCopyPreloadedSymbolsToU8(s->literal_htree, br, &bits, &value, + s->ringbuffer, pos, 1); + --s->block_length[0]; + BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos); + ++pos; + if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) { + s->state = BROTLI_STATE_COMMAND_INNER_WRITE; + --i; + goto saveStateAndReturn; + } + } while (--i != 0); + } else { /* safe */ + do { + if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) { + goto NextLiteralBlock; + } brotli_reg_t literal; if (!SafeReadSymbol(s->literal_htree, br, &literal)) { result = BROTLI_DECODER_NEEDS_MORE_INPUT; goto saveStateAndReturn; } s->ringbuffer[pos] = (uint8_t)literal; - } - --s->block_length[0]; - BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos); - ++pos; - if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) { - s->state = BROTLI_STATE_COMMAND_INNER_WRITE; - --i; - goto saveStateAndReturn; - } - } while (--i != 0); + --s->block_length[0]; + BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos); + ++pos; + if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) { + s->state = BROTLI_STATE_COMMAND_INNER_WRITE; + --i; + goto saveStateAndReturn; + } + } while (--i != 0); + } } else { uint8_t p1 = s->ringbuffer[(pos - 1) & s->ringbuffer_mask]; uint8_t p2 = s->ringbuffer[(pos - 2) & s->ringbuffer_mask]; @@ -2855,16 +2945,15 @@ void BrotliDecoderSetMetadataCallbacks( /* Escalate internal functions visibility; for testing purposes only. */ #if defined(BROTLI_TEST) -BROTLI_BOOL SafeReadSymbolForTest( +BROTLI_BOOL BrotliSafeReadSymbolForTest( const HuffmanCode*, BrotliBitReader*, brotli_reg_t*); -BROTLI_BOOL SafeReadSymbolForTest( +BROTLI_BOOL BrotliSafeReadSymbolForTest( const HuffmanCode* table, BrotliBitReader* br, brotli_reg_t* result) { return SafeReadSymbol(table, br, result); } - -void InverseMoveToFrontTransformForTest( +void BrotliInverseMoveToFrontTransformForTest( uint8_t*, brotli_reg_t, BrotliDecoderState*); -void InverseMoveToFrontTransformForTest( +void BrotliInverseMoveToFrontTransformForTest( uint8_t* v, brotli_reg_t l, BrotliDecoderState* s) { InverseMoveToFrontTransform(v, l, s); } diff --git a/deps/brotli/c/dec/huffman.c b/deps/brotli/c/dec/huffman.c index 38064548640472..06486cf8105427 100644 --- a/deps/brotli/c/dec/huffman.c +++ b/deps/brotli/c/dec/huffman.c @@ -8,10 +8,6 @@ #include "huffman.h" -#include /* memcpy, memset */ - -#include - #include "../common/constants.h" #include "../common/platform.h" @@ -26,7 +22,8 @@ extern "C" { ((sizeof(brotli_reg_t) << 3) - BROTLI_REVERSE_BITS_MAX) #else #define BROTLI_REVERSE_BITS_BASE 0 -static uint8_t kReverseBits[1 << BROTLI_REVERSE_BITS_MAX] = { +static BROTLI_MODEL("small") +uint8_t kReverseBits[1 << BROTLI_REVERSE_BITS_MAX] = { 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, diff --git a/deps/brotli/c/dec/huffman.h b/deps/brotli/c/dec/huffman.h index 50360962c73473..53daf600efcba8 100644 --- a/deps/brotli/c/dec/huffman.h +++ b/deps/brotli/c/dec/huffman.h @@ -9,8 +9,6 @@ #ifndef BROTLI_DEC_HUFFMAN_H_ #define BROTLI_DEC_HUFFMAN_H_ -#include - #include "../common/platform.h" #if defined(__cplusplus) || defined(c_plusplus) diff --git a/deps/brotli/c/dec/prefix.c b/deps/brotli/c/dec/prefix.c new file mode 100644 index 00000000000000..ce3998f2412363 --- /dev/null +++ b/deps/brotli/c/dec/prefix.c @@ -0,0 +1,67 @@ +/* Copyright 2025 Google Inc. All Rights Reserved. + + Distributed under MIT license. + See file LICENSE for detail or copy at https://opensource.org/licenses/MIT +*/ + +#include "prefix.h" + +#include "../common/platform.h" /* IWYU pragma: keep */ +#include "../common/static_init.h" + +#if (BROTLI_STATIC_INIT != BROTLI_STATIC_INIT_NONE) +#include "../common/constants.h" +#endif + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#if (BROTLI_STATIC_INIT == BROTLI_STATIC_INIT_NONE) +/* Embed kCmdLut. */ +#include "prefix_inc.h" +#else +BROTLI_COLD BROTLI_BOOL BrotliDecoderInitCmdLut(CmdLutElement* items) { + static const uint8_t kInsertLengthExtraBits[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, + 0x04, 0x04, 0x05, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0C, 0x0E, 0x18}; + static const uint8_t kCopyLengthExtraBits[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, + 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x18}; + static const uint8_t kCellPos[11] = {0, 1, 0, 1, 8, 9, 2, 16, 10, 17, 18}; + + uint16_t insert_length_offsets[24]; + uint16_t copy_length_offsets[24]; + insert_length_offsets[0] = 0; + copy_length_offsets[0] = 2; + for (size_t i = 0; i < 23; ++i) { + insert_length_offsets[i + 1] = + insert_length_offsets[i] + (uint16_t)(1u << kInsertLengthExtraBits[i]); + copy_length_offsets[i + 1] = + copy_length_offsets[i] + (uint16_t)(1u << kCopyLengthExtraBits[i]); + } + + for (size_t symbol = 0; symbol < BROTLI_NUM_COMMAND_SYMBOLS; ++symbol) { + CmdLutElement* item = items + symbol; + const size_t cell_idx = symbol >> 6; + const size_t cell_pos = kCellPos[cell_idx]; + const size_t copy_code = ((cell_pos << 3) & 0x18) + (symbol & 0x7); + const uint16_t copy_len_offset = copy_length_offsets[copy_code]; + const size_t insert_code = (cell_pos & 0x18) + ((symbol >> 3) & 0x7); + item->copy_len_extra_bits = kCopyLengthExtraBits[copy_code]; + item->context = (copy_len_offset > 4) ? 3 : ((uint8_t)copy_len_offset - 2); + item->copy_len_offset = copy_len_offset; + item->distance_code = (cell_idx >= 2) ? -1 : 0; + item->insert_len_extra_bits = kInsertLengthExtraBits[insert_code]; + item->insert_len_offset = insert_length_offsets[insert_code]; + } + return BROTLI_TRUE; +} + +BROTLI_MODEL("small") +CmdLutElement kCmdLut[BROTLI_NUM_COMMAND_SYMBOLS]; +#endif /* BROTLI_STATIC_INIT */ + +#if defined(__cplusplus) || defined(c_plusplus) +} /* extern "C" */ +#endif diff --git a/deps/brotli/c/dec/prefix.h b/deps/brotli/c/dec/prefix.h index e8acf0774006ee..f45b8be404173d 100644 --- a/deps/brotli/c/dec/prefix.h +++ b/deps/brotli/c/dec/prefix.h @@ -10,9 +10,13 @@ #ifndef BROTLI_DEC_PREFIX_H_ #define BROTLI_DEC_PREFIX_H_ -#include - #include "../common/constants.h" +#include "../common/platform.h" /* IWYU pragma: keep */ +#include "../common/static_init.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif typedef struct CmdLutElement { uint8_t insert_len_extra_bits; @@ -23,711 +27,17 @@ typedef struct CmdLutElement { uint16_t copy_len_offset; } CmdLutElement; -static const CmdLutElement kCmdLut[BROTLI_NUM_COMMAND_SYMBOLS] = { - { 0x00, 0x00, 0, 0x00, 0x0000, 0x0002 }, - { 0x00, 0x00, 0, 0x01, 0x0000, 0x0003 }, - { 0x00, 0x00, 0, 0x02, 0x0000, 0x0004 }, - { 0x00, 0x00, 0, 0x03, 0x0000, 0x0005 }, - { 0x00, 0x00, 0, 0x03, 0x0000, 0x0006 }, - { 0x00, 0x00, 0, 0x03, 0x0000, 0x0007 }, - { 0x00, 0x00, 0, 0x03, 0x0000, 0x0008 }, - { 0x00, 0x00, 0, 0x03, 0x0000, 0x0009 }, - { 0x00, 0x00, 0, 0x00, 0x0001, 0x0002 }, - { 0x00, 0x00, 0, 0x01, 0x0001, 0x0003 }, - { 0x00, 0x00, 0, 0x02, 0x0001, 0x0004 }, - { 0x00, 0x00, 0, 0x03, 0x0001, 0x0005 }, - { 0x00, 0x00, 0, 0x03, 0x0001, 0x0006 }, - { 0x00, 0x00, 0, 0x03, 0x0001, 0x0007 }, - { 0x00, 0x00, 0, 0x03, 0x0001, 0x0008 }, - { 0x00, 0x00, 0, 0x03, 0x0001, 0x0009 }, - { 0x00, 0x00, 0, 0x00, 0x0002, 0x0002 }, - { 0x00, 0x00, 0, 0x01, 0x0002, 0x0003 }, - { 0x00, 0x00, 0, 0x02, 0x0002, 0x0004 }, - { 0x00, 0x00, 0, 0x03, 0x0002, 0x0005 }, - { 0x00, 0x00, 0, 0x03, 0x0002, 0x0006 }, - { 0x00, 0x00, 0, 0x03, 0x0002, 0x0007 }, - { 0x00, 0x00, 0, 0x03, 0x0002, 0x0008 }, - { 0x00, 0x00, 0, 0x03, 0x0002, 0x0009 }, - { 0x00, 0x00, 0, 0x00, 0x0003, 0x0002 }, - { 0x00, 0x00, 0, 0x01, 0x0003, 0x0003 }, - { 0x00, 0x00, 0, 0x02, 0x0003, 0x0004 }, - { 0x00, 0x00, 0, 0x03, 0x0003, 0x0005 }, - { 0x00, 0x00, 0, 0x03, 0x0003, 0x0006 }, - { 0x00, 0x00, 0, 0x03, 0x0003, 0x0007 }, - { 0x00, 0x00, 0, 0x03, 0x0003, 0x0008 }, - { 0x00, 0x00, 0, 0x03, 0x0003, 0x0009 }, - { 0x00, 0x00, 0, 0x00, 0x0004, 0x0002 }, - { 0x00, 0x00, 0, 0x01, 0x0004, 0x0003 }, - { 0x00, 0x00, 0, 0x02, 0x0004, 0x0004 }, - { 0x00, 0x00, 0, 0x03, 0x0004, 0x0005 }, - { 0x00, 0x00, 0, 0x03, 0x0004, 0x0006 }, - { 0x00, 0x00, 0, 0x03, 0x0004, 0x0007 }, - { 0x00, 0x00, 0, 0x03, 0x0004, 0x0008 }, - { 0x00, 0x00, 0, 0x03, 0x0004, 0x0009 }, - { 0x00, 0x00, 0, 0x00, 0x0005, 0x0002 }, - { 0x00, 0x00, 0, 0x01, 0x0005, 0x0003 }, - { 0x00, 0x00, 0, 0x02, 0x0005, 0x0004 }, - { 0x00, 0x00, 0, 0x03, 0x0005, 0x0005 }, - { 0x00, 0x00, 0, 0x03, 0x0005, 0x0006 }, - { 0x00, 0x00, 0, 0x03, 0x0005, 0x0007 }, - { 0x00, 0x00, 0, 0x03, 0x0005, 0x0008 }, - { 0x00, 0x00, 0, 0x03, 0x0005, 0x0009 }, - { 0x01, 0x00, 0, 0x00, 0x0006, 0x0002 }, - { 0x01, 0x00, 0, 0x01, 0x0006, 0x0003 }, - { 0x01, 0x00, 0, 0x02, 0x0006, 0x0004 }, - { 0x01, 0x00, 0, 0x03, 0x0006, 0x0005 }, - { 0x01, 0x00, 0, 0x03, 0x0006, 0x0006 }, - { 0x01, 0x00, 0, 0x03, 0x0006, 0x0007 }, - { 0x01, 0x00, 0, 0x03, 0x0006, 0x0008 }, - { 0x01, 0x00, 0, 0x03, 0x0006, 0x0009 }, - { 0x01, 0x00, 0, 0x00, 0x0008, 0x0002 }, - { 0x01, 0x00, 0, 0x01, 0x0008, 0x0003 }, - { 0x01, 0x00, 0, 0x02, 0x0008, 0x0004 }, - { 0x01, 0x00, 0, 0x03, 0x0008, 0x0005 }, - { 0x01, 0x00, 0, 0x03, 0x0008, 0x0006 }, - { 0x01, 0x00, 0, 0x03, 0x0008, 0x0007 }, - { 0x01, 0x00, 0, 0x03, 0x0008, 0x0008 }, - { 0x01, 0x00, 0, 0x03, 0x0008, 0x0009 }, - { 0x00, 0x01, 0, 0x03, 0x0000, 0x000a }, - { 0x00, 0x01, 0, 0x03, 0x0000, 0x000c }, - { 0x00, 0x02, 0, 0x03, 0x0000, 0x000e }, - { 0x00, 0x02, 0, 0x03, 0x0000, 0x0012 }, - { 0x00, 0x03, 0, 0x03, 0x0000, 0x0016 }, - { 0x00, 0x03, 0, 0x03, 0x0000, 0x001e }, - { 0x00, 0x04, 0, 0x03, 0x0000, 0x0026 }, - { 0x00, 0x04, 0, 0x03, 0x0000, 0x0036 }, - { 0x00, 0x01, 0, 0x03, 0x0001, 0x000a }, - { 0x00, 0x01, 0, 0x03, 0x0001, 0x000c }, - { 0x00, 0x02, 0, 0x03, 0x0001, 0x000e }, - { 0x00, 0x02, 0, 0x03, 0x0001, 0x0012 }, - { 0x00, 0x03, 0, 0x03, 0x0001, 0x0016 }, - { 0x00, 0x03, 0, 0x03, 0x0001, 0x001e }, - { 0x00, 0x04, 0, 0x03, 0x0001, 0x0026 }, - { 0x00, 0x04, 0, 0x03, 0x0001, 0x0036 }, - { 0x00, 0x01, 0, 0x03, 0x0002, 0x000a }, - { 0x00, 0x01, 0, 0x03, 0x0002, 0x000c }, - { 0x00, 0x02, 0, 0x03, 0x0002, 0x000e }, - { 0x00, 0x02, 0, 0x03, 0x0002, 0x0012 }, - { 0x00, 0x03, 0, 0x03, 0x0002, 0x0016 }, - { 0x00, 0x03, 0, 0x03, 0x0002, 0x001e }, - { 0x00, 0x04, 0, 0x03, 0x0002, 0x0026 }, - { 0x00, 0x04, 0, 0x03, 0x0002, 0x0036 }, - { 0x00, 0x01, 0, 0x03, 0x0003, 0x000a }, - { 0x00, 0x01, 0, 0x03, 0x0003, 0x000c }, - { 0x00, 0x02, 0, 0x03, 0x0003, 0x000e }, - { 0x00, 0x02, 0, 0x03, 0x0003, 0x0012 }, - { 0x00, 0x03, 0, 0x03, 0x0003, 0x0016 }, - { 0x00, 0x03, 0, 0x03, 0x0003, 0x001e }, - { 0x00, 0x04, 0, 0x03, 0x0003, 0x0026 }, - { 0x00, 0x04, 0, 0x03, 0x0003, 0x0036 }, - { 0x00, 0x01, 0, 0x03, 0x0004, 0x000a }, - { 0x00, 0x01, 0, 0x03, 0x0004, 0x000c }, - { 0x00, 0x02, 0, 0x03, 0x0004, 0x000e }, - { 0x00, 0x02, 0, 0x03, 0x0004, 0x0012 }, - { 0x00, 0x03, 0, 0x03, 0x0004, 0x0016 }, - { 0x00, 0x03, 0, 0x03, 0x0004, 0x001e }, - { 0x00, 0x04, 0, 0x03, 0x0004, 0x0026 }, - { 0x00, 0x04, 0, 0x03, 0x0004, 0x0036 }, - { 0x00, 0x01, 0, 0x03, 0x0005, 0x000a }, - { 0x00, 0x01, 0, 0x03, 0x0005, 0x000c }, - { 0x00, 0x02, 0, 0x03, 0x0005, 0x000e }, - { 0x00, 0x02, 0, 0x03, 0x0005, 0x0012 }, - { 0x00, 0x03, 0, 0x03, 0x0005, 0x0016 }, - { 0x00, 0x03, 0, 0x03, 0x0005, 0x001e }, - { 0x00, 0x04, 0, 0x03, 0x0005, 0x0026 }, - { 0x00, 0x04, 0, 0x03, 0x0005, 0x0036 }, - { 0x01, 0x01, 0, 0x03, 0x0006, 0x000a }, - { 0x01, 0x01, 0, 0x03, 0x0006, 0x000c }, - { 0x01, 0x02, 0, 0x03, 0x0006, 0x000e }, - { 0x01, 0x02, 0, 0x03, 0x0006, 0x0012 }, - { 0x01, 0x03, 0, 0x03, 0x0006, 0x0016 }, - { 0x01, 0x03, 0, 0x03, 0x0006, 0x001e }, - { 0x01, 0x04, 0, 0x03, 0x0006, 0x0026 }, - { 0x01, 0x04, 0, 0x03, 0x0006, 0x0036 }, - { 0x01, 0x01, 0, 0x03, 0x0008, 0x000a }, - { 0x01, 0x01, 0, 0x03, 0x0008, 0x000c }, - { 0x01, 0x02, 0, 0x03, 0x0008, 0x000e }, - { 0x01, 0x02, 0, 0x03, 0x0008, 0x0012 }, - { 0x01, 0x03, 0, 0x03, 0x0008, 0x0016 }, - { 0x01, 0x03, 0, 0x03, 0x0008, 0x001e }, - { 0x01, 0x04, 0, 0x03, 0x0008, 0x0026 }, - { 0x01, 0x04, 0, 0x03, 0x0008, 0x0036 }, - { 0x00, 0x00, -1, 0x00, 0x0000, 0x0002 }, - { 0x00, 0x00, -1, 0x01, 0x0000, 0x0003 }, - { 0x00, 0x00, -1, 0x02, 0x0000, 0x0004 }, - { 0x00, 0x00, -1, 0x03, 0x0000, 0x0005 }, - { 0x00, 0x00, -1, 0x03, 0x0000, 0x0006 }, - { 0x00, 0x00, -1, 0x03, 0x0000, 0x0007 }, - { 0x00, 0x00, -1, 0x03, 0x0000, 0x0008 }, - { 0x00, 0x00, -1, 0x03, 0x0000, 0x0009 }, - { 0x00, 0x00, -1, 0x00, 0x0001, 0x0002 }, - { 0x00, 0x00, -1, 0x01, 0x0001, 0x0003 }, - { 0x00, 0x00, -1, 0x02, 0x0001, 0x0004 }, - { 0x00, 0x00, -1, 0x03, 0x0001, 0x0005 }, - { 0x00, 0x00, -1, 0x03, 0x0001, 0x0006 }, - { 0x00, 0x00, -1, 0x03, 0x0001, 0x0007 }, - { 0x00, 0x00, -1, 0x03, 0x0001, 0x0008 }, - { 0x00, 0x00, -1, 0x03, 0x0001, 0x0009 }, - { 0x00, 0x00, -1, 0x00, 0x0002, 0x0002 }, - { 0x00, 0x00, -1, 0x01, 0x0002, 0x0003 }, - { 0x00, 0x00, -1, 0x02, 0x0002, 0x0004 }, - { 0x00, 0x00, -1, 0x03, 0x0002, 0x0005 }, - { 0x00, 0x00, -1, 0x03, 0x0002, 0x0006 }, - { 0x00, 0x00, -1, 0x03, 0x0002, 0x0007 }, - { 0x00, 0x00, -1, 0x03, 0x0002, 0x0008 }, - { 0x00, 0x00, -1, 0x03, 0x0002, 0x0009 }, - { 0x00, 0x00, -1, 0x00, 0x0003, 0x0002 }, - { 0x00, 0x00, -1, 0x01, 0x0003, 0x0003 }, - { 0x00, 0x00, -1, 0x02, 0x0003, 0x0004 }, - { 0x00, 0x00, -1, 0x03, 0x0003, 0x0005 }, - { 0x00, 0x00, -1, 0x03, 0x0003, 0x0006 }, - { 0x00, 0x00, -1, 0x03, 0x0003, 0x0007 }, - { 0x00, 0x00, -1, 0x03, 0x0003, 0x0008 }, - { 0x00, 0x00, -1, 0x03, 0x0003, 0x0009 }, - { 0x00, 0x00, -1, 0x00, 0x0004, 0x0002 }, - { 0x00, 0x00, -1, 0x01, 0x0004, 0x0003 }, - { 0x00, 0x00, -1, 0x02, 0x0004, 0x0004 }, - { 0x00, 0x00, -1, 0x03, 0x0004, 0x0005 }, - { 0x00, 0x00, -1, 0x03, 0x0004, 0x0006 }, - { 0x00, 0x00, -1, 0x03, 0x0004, 0x0007 }, - { 0x00, 0x00, -1, 0x03, 0x0004, 0x0008 }, - { 0x00, 0x00, -1, 0x03, 0x0004, 0x0009 }, - { 0x00, 0x00, -1, 0x00, 0x0005, 0x0002 }, - { 0x00, 0x00, -1, 0x01, 0x0005, 0x0003 }, - { 0x00, 0x00, -1, 0x02, 0x0005, 0x0004 }, - { 0x00, 0x00, -1, 0x03, 0x0005, 0x0005 }, - { 0x00, 0x00, -1, 0x03, 0x0005, 0x0006 }, - { 0x00, 0x00, -1, 0x03, 0x0005, 0x0007 }, - { 0x00, 0x00, -1, 0x03, 0x0005, 0x0008 }, - { 0x00, 0x00, -1, 0x03, 0x0005, 0x0009 }, - { 0x01, 0x00, -1, 0x00, 0x0006, 0x0002 }, - { 0x01, 0x00, -1, 0x01, 0x0006, 0x0003 }, - { 0x01, 0x00, -1, 0x02, 0x0006, 0x0004 }, - { 0x01, 0x00, -1, 0x03, 0x0006, 0x0005 }, - { 0x01, 0x00, -1, 0x03, 0x0006, 0x0006 }, - { 0x01, 0x00, -1, 0x03, 0x0006, 0x0007 }, - { 0x01, 0x00, -1, 0x03, 0x0006, 0x0008 }, - { 0x01, 0x00, -1, 0x03, 0x0006, 0x0009 }, - { 0x01, 0x00, -1, 0x00, 0x0008, 0x0002 }, - { 0x01, 0x00, -1, 0x01, 0x0008, 0x0003 }, - { 0x01, 0x00, -1, 0x02, 0x0008, 0x0004 }, - { 0x01, 0x00, -1, 0x03, 0x0008, 0x0005 }, - { 0x01, 0x00, -1, 0x03, 0x0008, 0x0006 }, - { 0x01, 0x00, -1, 0x03, 0x0008, 0x0007 }, - { 0x01, 0x00, -1, 0x03, 0x0008, 0x0008 }, - { 0x01, 0x00, -1, 0x03, 0x0008, 0x0009 }, - { 0x00, 0x01, -1, 0x03, 0x0000, 0x000a }, - { 0x00, 0x01, -1, 0x03, 0x0000, 0x000c }, - { 0x00, 0x02, -1, 0x03, 0x0000, 0x000e }, - { 0x00, 0x02, -1, 0x03, 0x0000, 0x0012 }, - { 0x00, 0x03, -1, 0x03, 0x0000, 0x0016 }, - { 0x00, 0x03, -1, 0x03, 0x0000, 0x001e }, - { 0x00, 0x04, -1, 0x03, 0x0000, 0x0026 }, - { 0x00, 0x04, -1, 0x03, 0x0000, 0x0036 }, - { 0x00, 0x01, -1, 0x03, 0x0001, 0x000a }, - { 0x00, 0x01, -1, 0x03, 0x0001, 0x000c }, - { 0x00, 0x02, -1, 0x03, 0x0001, 0x000e }, - { 0x00, 0x02, -1, 0x03, 0x0001, 0x0012 }, - { 0x00, 0x03, -1, 0x03, 0x0001, 0x0016 }, - { 0x00, 0x03, -1, 0x03, 0x0001, 0x001e }, - { 0x00, 0x04, -1, 0x03, 0x0001, 0x0026 }, - { 0x00, 0x04, -1, 0x03, 0x0001, 0x0036 }, - { 0x00, 0x01, -1, 0x03, 0x0002, 0x000a }, - { 0x00, 0x01, -1, 0x03, 0x0002, 0x000c }, - { 0x00, 0x02, -1, 0x03, 0x0002, 0x000e }, - { 0x00, 0x02, -1, 0x03, 0x0002, 0x0012 }, - { 0x00, 0x03, -1, 0x03, 0x0002, 0x0016 }, - { 0x00, 0x03, -1, 0x03, 0x0002, 0x001e }, - { 0x00, 0x04, -1, 0x03, 0x0002, 0x0026 }, - { 0x00, 0x04, -1, 0x03, 0x0002, 0x0036 }, - { 0x00, 0x01, -1, 0x03, 0x0003, 0x000a }, - { 0x00, 0x01, -1, 0x03, 0x0003, 0x000c }, - { 0x00, 0x02, -1, 0x03, 0x0003, 0x000e }, - { 0x00, 0x02, -1, 0x03, 0x0003, 0x0012 }, - { 0x00, 0x03, -1, 0x03, 0x0003, 0x0016 }, - { 0x00, 0x03, -1, 0x03, 0x0003, 0x001e }, - { 0x00, 0x04, -1, 0x03, 0x0003, 0x0026 }, - { 0x00, 0x04, -1, 0x03, 0x0003, 0x0036 }, - { 0x00, 0x01, -1, 0x03, 0x0004, 0x000a }, - { 0x00, 0x01, -1, 0x03, 0x0004, 0x000c }, - { 0x00, 0x02, -1, 0x03, 0x0004, 0x000e }, - { 0x00, 0x02, -1, 0x03, 0x0004, 0x0012 }, - { 0x00, 0x03, -1, 0x03, 0x0004, 0x0016 }, - { 0x00, 0x03, -1, 0x03, 0x0004, 0x001e }, - { 0x00, 0x04, -1, 0x03, 0x0004, 0x0026 }, - { 0x00, 0x04, -1, 0x03, 0x0004, 0x0036 }, - { 0x00, 0x01, -1, 0x03, 0x0005, 0x000a }, - { 0x00, 0x01, -1, 0x03, 0x0005, 0x000c }, - { 0x00, 0x02, -1, 0x03, 0x0005, 0x000e }, - { 0x00, 0x02, -1, 0x03, 0x0005, 0x0012 }, - { 0x00, 0x03, -1, 0x03, 0x0005, 0x0016 }, - { 0x00, 0x03, -1, 0x03, 0x0005, 0x001e }, - { 0x00, 0x04, -1, 0x03, 0x0005, 0x0026 }, - { 0x00, 0x04, -1, 0x03, 0x0005, 0x0036 }, - { 0x01, 0x01, -1, 0x03, 0x0006, 0x000a }, - { 0x01, 0x01, -1, 0x03, 0x0006, 0x000c }, - { 0x01, 0x02, -1, 0x03, 0x0006, 0x000e }, - { 0x01, 0x02, -1, 0x03, 0x0006, 0x0012 }, - { 0x01, 0x03, -1, 0x03, 0x0006, 0x0016 }, - { 0x01, 0x03, -1, 0x03, 0x0006, 0x001e }, - { 0x01, 0x04, -1, 0x03, 0x0006, 0x0026 }, - { 0x01, 0x04, -1, 0x03, 0x0006, 0x0036 }, - { 0x01, 0x01, -1, 0x03, 0x0008, 0x000a }, - { 0x01, 0x01, -1, 0x03, 0x0008, 0x000c }, - { 0x01, 0x02, -1, 0x03, 0x0008, 0x000e }, - { 0x01, 0x02, -1, 0x03, 0x0008, 0x0012 }, - { 0x01, 0x03, -1, 0x03, 0x0008, 0x0016 }, - { 0x01, 0x03, -1, 0x03, 0x0008, 0x001e }, - { 0x01, 0x04, -1, 0x03, 0x0008, 0x0026 }, - { 0x01, 0x04, -1, 0x03, 0x0008, 0x0036 }, - { 0x02, 0x00, -1, 0x00, 0x000a, 0x0002 }, - { 0x02, 0x00, -1, 0x01, 0x000a, 0x0003 }, - { 0x02, 0x00, -1, 0x02, 0x000a, 0x0004 }, - { 0x02, 0x00, -1, 0x03, 0x000a, 0x0005 }, - { 0x02, 0x00, -1, 0x03, 0x000a, 0x0006 }, - { 0x02, 0x00, -1, 0x03, 0x000a, 0x0007 }, - { 0x02, 0x00, -1, 0x03, 0x000a, 0x0008 }, - { 0x02, 0x00, -1, 0x03, 0x000a, 0x0009 }, - { 0x02, 0x00, -1, 0x00, 0x000e, 0x0002 }, - { 0x02, 0x00, -1, 0x01, 0x000e, 0x0003 }, - { 0x02, 0x00, -1, 0x02, 0x000e, 0x0004 }, - { 0x02, 0x00, -1, 0x03, 0x000e, 0x0005 }, - { 0x02, 0x00, -1, 0x03, 0x000e, 0x0006 }, - { 0x02, 0x00, -1, 0x03, 0x000e, 0x0007 }, - { 0x02, 0x00, -1, 0x03, 0x000e, 0x0008 }, - { 0x02, 0x00, -1, 0x03, 0x000e, 0x0009 }, - { 0x03, 0x00, -1, 0x00, 0x0012, 0x0002 }, - { 0x03, 0x00, -1, 0x01, 0x0012, 0x0003 }, - { 0x03, 0x00, -1, 0x02, 0x0012, 0x0004 }, - { 0x03, 0x00, -1, 0x03, 0x0012, 0x0005 }, - { 0x03, 0x00, -1, 0x03, 0x0012, 0x0006 }, - { 0x03, 0x00, -1, 0x03, 0x0012, 0x0007 }, - { 0x03, 0x00, -1, 0x03, 0x0012, 0x0008 }, - { 0x03, 0x00, -1, 0x03, 0x0012, 0x0009 }, - { 0x03, 0x00, -1, 0x00, 0x001a, 0x0002 }, - { 0x03, 0x00, -1, 0x01, 0x001a, 0x0003 }, - { 0x03, 0x00, -1, 0x02, 0x001a, 0x0004 }, - { 0x03, 0x00, -1, 0x03, 0x001a, 0x0005 }, - { 0x03, 0x00, -1, 0x03, 0x001a, 0x0006 }, - { 0x03, 0x00, -1, 0x03, 0x001a, 0x0007 }, - { 0x03, 0x00, -1, 0x03, 0x001a, 0x0008 }, - { 0x03, 0x00, -1, 0x03, 0x001a, 0x0009 }, - { 0x04, 0x00, -1, 0x00, 0x0022, 0x0002 }, - { 0x04, 0x00, -1, 0x01, 0x0022, 0x0003 }, - { 0x04, 0x00, -1, 0x02, 0x0022, 0x0004 }, - { 0x04, 0x00, -1, 0x03, 0x0022, 0x0005 }, - { 0x04, 0x00, -1, 0x03, 0x0022, 0x0006 }, - { 0x04, 0x00, -1, 0x03, 0x0022, 0x0007 }, - { 0x04, 0x00, -1, 0x03, 0x0022, 0x0008 }, - { 0x04, 0x00, -1, 0x03, 0x0022, 0x0009 }, - { 0x04, 0x00, -1, 0x00, 0x0032, 0x0002 }, - { 0x04, 0x00, -1, 0x01, 0x0032, 0x0003 }, - { 0x04, 0x00, -1, 0x02, 0x0032, 0x0004 }, - { 0x04, 0x00, -1, 0x03, 0x0032, 0x0005 }, - { 0x04, 0x00, -1, 0x03, 0x0032, 0x0006 }, - { 0x04, 0x00, -1, 0x03, 0x0032, 0x0007 }, - { 0x04, 0x00, -1, 0x03, 0x0032, 0x0008 }, - { 0x04, 0x00, -1, 0x03, 0x0032, 0x0009 }, - { 0x05, 0x00, -1, 0x00, 0x0042, 0x0002 }, - { 0x05, 0x00, -1, 0x01, 0x0042, 0x0003 }, - { 0x05, 0x00, -1, 0x02, 0x0042, 0x0004 }, - { 0x05, 0x00, -1, 0x03, 0x0042, 0x0005 }, - { 0x05, 0x00, -1, 0x03, 0x0042, 0x0006 }, - { 0x05, 0x00, -1, 0x03, 0x0042, 0x0007 }, - { 0x05, 0x00, -1, 0x03, 0x0042, 0x0008 }, - { 0x05, 0x00, -1, 0x03, 0x0042, 0x0009 }, - { 0x05, 0x00, -1, 0x00, 0x0062, 0x0002 }, - { 0x05, 0x00, -1, 0x01, 0x0062, 0x0003 }, - { 0x05, 0x00, -1, 0x02, 0x0062, 0x0004 }, - { 0x05, 0x00, -1, 0x03, 0x0062, 0x0005 }, - { 0x05, 0x00, -1, 0x03, 0x0062, 0x0006 }, - { 0x05, 0x00, -1, 0x03, 0x0062, 0x0007 }, - { 0x05, 0x00, -1, 0x03, 0x0062, 0x0008 }, - { 0x05, 0x00, -1, 0x03, 0x0062, 0x0009 }, - { 0x02, 0x01, -1, 0x03, 0x000a, 0x000a }, - { 0x02, 0x01, -1, 0x03, 0x000a, 0x000c }, - { 0x02, 0x02, -1, 0x03, 0x000a, 0x000e }, - { 0x02, 0x02, -1, 0x03, 0x000a, 0x0012 }, - { 0x02, 0x03, -1, 0x03, 0x000a, 0x0016 }, - { 0x02, 0x03, -1, 0x03, 0x000a, 0x001e }, - { 0x02, 0x04, -1, 0x03, 0x000a, 0x0026 }, - { 0x02, 0x04, -1, 0x03, 0x000a, 0x0036 }, - { 0x02, 0x01, -1, 0x03, 0x000e, 0x000a }, - { 0x02, 0x01, -1, 0x03, 0x000e, 0x000c }, - { 0x02, 0x02, -1, 0x03, 0x000e, 0x000e }, - { 0x02, 0x02, -1, 0x03, 0x000e, 0x0012 }, - { 0x02, 0x03, -1, 0x03, 0x000e, 0x0016 }, - { 0x02, 0x03, -1, 0x03, 0x000e, 0x001e }, - { 0x02, 0x04, -1, 0x03, 0x000e, 0x0026 }, - { 0x02, 0x04, -1, 0x03, 0x000e, 0x0036 }, - { 0x03, 0x01, -1, 0x03, 0x0012, 0x000a }, - { 0x03, 0x01, -1, 0x03, 0x0012, 0x000c }, - { 0x03, 0x02, -1, 0x03, 0x0012, 0x000e }, - { 0x03, 0x02, -1, 0x03, 0x0012, 0x0012 }, - { 0x03, 0x03, -1, 0x03, 0x0012, 0x0016 }, - { 0x03, 0x03, -1, 0x03, 0x0012, 0x001e }, - { 0x03, 0x04, -1, 0x03, 0x0012, 0x0026 }, - { 0x03, 0x04, -1, 0x03, 0x0012, 0x0036 }, - { 0x03, 0x01, -1, 0x03, 0x001a, 0x000a }, - { 0x03, 0x01, -1, 0x03, 0x001a, 0x000c }, - { 0x03, 0x02, -1, 0x03, 0x001a, 0x000e }, - { 0x03, 0x02, -1, 0x03, 0x001a, 0x0012 }, - { 0x03, 0x03, -1, 0x03, 0x001a, 0x0016 }, - { 0x03, 0x03, -1, 0x03, 0x001a, 0x001e }, - { 0x03, 0x04, -1, 0x03, 0x001a, 0x0026 }, - { 0x03, 0x04, -1, 0x03, 0x001a, 0x0036 }, - { 0x04, 0x01, -1, 0x03, 0x0022, 0x000a }, - { 0x04, 0x01, -1, 0x03, 0x0022, 0x000c }, - { 0x04, 0x02, -1, 0x03, 0x0022, 0x000e }, - { 0x04, 0x02, -1, 0x03, 0x0022, 0x0012 }, - { 0x04, 0x03, -1, 0x03, 0x0022, 0x0016 }, - { 0x04, 0x03, -1, 0x03, 0x0022, 0x001e }, - { 0x04, 0x04, -1, 0x03, 0x0022, 0x0026 }, - { 0x04, 0x04, -1, 0x03, 0x0022, 0x0036 }, - { 0x04, 0x01, -1, 0x03, 0x0032, 0x000a }, - { 0x04, 0x01, -1, 0x03, 0x0032, 0x000c }, - { 0x04, 0x02, -1, 0x03, 0x0032, 0x000e }, - { 0x04, 0x02, -1, 0x03, 0x0032, 0x0012 }, - { 0x04, 0x03, -1, 0x03, 0x0032, 0x0016 }, - { 0x04, 0x03, -1, 0x03, 0x0032, 0x001e }, - { 0x04, 0x04, -1, 0x03, 0x0032, 0x0026 }, - { 0x04, 0x04, -1, 0x03, 0x0032, 0x0036 }, - { 0x05, 0x01, -1, 0x03, 0x0042, 0x000a }, - { 0x05, 0x01, -1, 0x03, 0x0042, 0x000c }, - { 0x05, 0x02, -1, 0x03, 0x0042, 0x000e }, - { 0x05, 0x02, -1, 0x03, 0x0042, 0x0012 }, - { 0x05, 0x03, -1, 0x03, 0x0042, 0x0016 }, - { 0x05, 0x03, -1, 0x03, 0x0042, 0x001e }, - { 0x05, 0x04, -1, 0x03, 0x0042, 0x0026 }, - { 0x05, 0x04, -1, 0x03, 0x0042, 0x0036 }, - { 0x05, 0x01, -1, 0x03, 0x0062, 0x000a }, - { 0x05, 0x01, -1, 0x03, 0x0062, 0x000c }, - { 0x05, 0x02, -1, 0x03, 0x0062, 0x000e }, - { 0x05, 0x02, -1, 0x03, 0x0062, 0x0012 }, - { 0x05, 0x03, -1, 0x03, 0x0062, 0x0016 }, - { 0x05, 0x03, -1, 0x03, 0x0062, 0x001e }, - { 0x05, 0x04, -1, 0x03, 0x0062, 0x0026 }, - { 0x05, 0x04, -1, 0x03, 0x0062, 0x0036 }, - { 0x00, 0x05, -1, 0x03, 0x0000, 0x0046 }, - { 0x00, 0x05, -1, 0x03, 0x0000, 0x0066 }, - { 0x00, 0x06, -1, 0x03, 0x0000, 0x0086 }, - { 0x00, 0x07, -1, 0x03, 0x0000, 0x00c6 }, - { 0x00, 0x08, -1, 0x03, 0x0000, 0x0146 }, - { 0x00, 0x09, -1, 0x03, 0x0000, 0x0246 }, - { 0x00, 0x0a, -1, 0x03, 0x0000, 0x0446 }, - { 0x00, 0x18, -1, 0x03, 0x0000, 0x0846 }, - { 0x00, 0x05, -1, 0x03, 0x0001, 0x0046 }, - { 0x00, 0x05, -1, 0x03, 0x0001, 0x0066 }, - { 0x00, 0x06, -1, 0x03, 0x0001, 0x0086 }, - { 0x00, 0x07, -1, 0x03, 0x0001, 0x00c6 }, - { 0x00, 0x08, -1, 0x03, 0x0001, 0x0146 }, - { 0x00, 0x09, -1, 0x03, 0x0001, 0x0246 }, - { 0x00, 0x0a, -1, 0x03, 0x0001, 0x0446 }, - { 0x00, 0x18, -1, 0x03, 0x0001, 0x0846 }, - { 0x00, 0x05, -1, 0x03, 0x0002, 0x0046 }, - { 0x00, 0x05, -1, 0x03, 0x0002, 0x0066 }, - { 0x00, 0x06, -1, 0x03, 0x0002, 0x0086 }, - { 0x00, 0x07, -1, 0x03, 0x0002, 0x00c6 }, - { 0x00, 0x08, -1, 0x03, 0x0002, 0x0146 }, - { 0x00, 0x09, -1, 0x03, 0x0002, 0x0246 }, - { 0x00, 0x0a, -1, 0x03, 0x0002, 0x0446 }, - { 0x00, 0x18, -1, 0x03, 0x0002, 0x0846 }, - { 0x00, 0x05, -1, 0x03, 0x0003, 0x0046 }, - { 0x00, 0x05, -1, 0x03, 0x0003, 0x0066 }, - { 0x00, 0x06, -1, 0x03, 0x0003, 0x0086 }, - { 0x00, 0x07, -1, 0x03, 0x0003, 0x00c6 }, - { 0x00, 0x08, -1, 0x03, 0x0003, 0x0146 }, - { 0x00, 0x09, -1, 0x03, 0x0003, 0x0246 }, - { 0x00, 0x0a, -1, 0x03, 0x0003, 0x0446 }, - { 0x00, 0x18, -1, 0x03, 0x0003, 0x0846 }, - { 0x00, 0x05, -1, 0x03, 0x0004, 0x0046 }, - { 0x00, 0x05, -1, 0x03, 0x0004, 0x0066 }, - { 0x00, 0x06, -1, 0x03, 0x0004, 0x0086 }, - { 0x00, 0x07, -1, 0x03, 0x0004, 0x00c6 }, - { 0x00, 0x08, -1, 0x03, 0x0004, 0x0146 }, - { 0x00, 0x09, -1, 0x03, 0x0004, 0x0246 }, - { 0x00, 0x0a, -1, 0x03, 0x0004, 0x0446 }, - { 0x00, 0x18, -1, 0x03, 0x0004, 0x0846 }, - { 0x00, 0x05, -1, 0x03, 0x0005, 0x0046 }, - { 0x00, 0x05, -1, 0x03, 0x0005, 0x0066 }, - { 0x00, 0x06, -1, 0x03, 0x0005, 0x0086 }, - { 0x00, 0x07, -1, 0x03, 0x0005, 0x00c6 }, - { 0x00, 0x08, -1, 0x03, 0x0005, 0x0146 }, - { 0x00, 0x09, -1, 0x03, 0x0005, 0x0246 }, - { 0x00, 0x0a, -1, 0x03, 0x0005, 0x0446 }, - { 0x00, 0x18, -1, 0x03, 0x0005, 0x0846 }, - { 0x01, 0x05, -1, 0x03, 0x0006, 0x0046 }, - { 0x01, 0x05, -1, 0x03, 0x0006, 0x0066 }, - { 0x01, 0x06, -1, 0x03, 0x0006, 0x0086 }, - { 0x01, 0x07, -1, 0x03, 0x0006, 0x00c6 }, - { 0x01, 0x08, -1, 0x03, 0x0006, 0x0146 }, - { 0x01, 0x09, -1, 0x03, 0x0006, 0x0246 }, - { 0x01, 0x0a, -1, 0x03, 0x0006, 0x0446 }, - { 0x01, 0x18, -1, 0x03, 0x0006, 0x0846 }, - { 0x01, 0x05, -1, 0x03, 0x0008, 0x0046 }, - { 0x01, 0x05, -1, 0x03, 0x0008, 0x0066 }, - { 0x01, 0x06, -1, 0x03, 0x0008, 0x0086 }, - { 0x01, 0x07, -1, 0x03, 0x0008, 0x00c6 }, - { 0x01, 0x08, -1, 0x03, 0x0008, 0x0146 }, - { 0x01, 0x09, -1, 0x03, 0x0008, 0x0246 }, - { 0x01, 0x0a, -1, 0x03, 0x0008, 0x0446 }, - { 0x01, 0x18, -1, 0x03, 0x0008, 0x0846 }, - { 0x06, 0x00, -1, 0x00, 0x0082, 0x0002 }, - { 0x06, 0x00, -1, 0x01, 0x0082, 0x0003 }, - { 0x06, 0x00, -1, 0x02, 0x0082, 0x0004 }, - { 0x06, 0x00, -1, 0x03, 0x0082, 0x0005 }, - { 0x06, 0x00, -1, 0x03, 0x0082, 0x0006 }, - { 0x06, 0x00, -1, 0x03, 0x0082, 0x0007 }, - { 0x06, 0x00, -1, 0x03, 0x0082, 0x0008 }, - { 0x06, 0x00, -1, 0x03, 0x0082, 0x0009 }, - { 0x07, 0x00, -1, 0x00, 0x00c2, 0x0002 }, - { 0x07, 0x00, -1, 0x01, 0x00c2, 0x0003 }, - { 0x07, 0x00, -1, 0x02, 0x00c2, 0x0004 }, - { 0x07, 0x00, -1, 0x03, 0x00c2, 0x0005 }, - { 0x07, 0x00, -1, 0x03, 0x00c2, 0x0006 }, - { 0x07, 0x00, -1, 0x03, 0x00c2, 0x0007 }, - { 0x07, 0x00, -1, 0x03, 0x00c2, 0x0008 }, - { 0x07, 0x00, -1, 0x03, 0x00c2, 0x0009 }, - { 0x08, 0x00, -1, 0x00, 0x0142, 0x0002 }, - { 0x08, 0x00, -1, 0x01, 0x0142, 0x0003 }, - { 0x08, 0x00, -1, 0x02, 0x0142, 0x0004 }, - { 0x08, 0x00, -1, 0x03, 0x0142, 0x0005 }, - { 0x08, 0x00, -1, 0x03, 0x0142, 0x0006 }, - { 0x08, 0x00, -1, 0x03, 0x0142, 0x0007 }, - { 0x08, 0x00, -1, 0x03, 0x0142, 0x0008 }, - { 0x08, 0x00, -1, 0x03, 0x0142, 0x0009 }, - { 0x09, 0x00, -1, 0x00, 0x0242, 0x0002 }, - { 0x09, 0x00, -1, 0x01, 0x0242, 0x0003 }, - { 0x09, 0x00, -1, 0x02, 0x0242, 0x0004 }, - { 0x09, 0x00, -1, 0x03, 0x0242, 0x0005 }, - { 0x09, 0x00, -1, 0x03, 0x0242, 0x0006 }, - { 0x09, 0x00, -1, 0x03, 0x0242, 0x0007 }, - { 0x09, 0x00, -1, 0x03, 0x0242, 0x0008 }, - { 0x09, 0x00, -1, 0x03, 0x0242, 0x0009 }, - { 0x0a, 0x00, -1, 0x00, 0x0442, 0x0002 }, - { 0x0a, 0x00, -1, 0x01, 0x0442, 0x0003 }, - { 0x0a, 0x00, -1, 0x02, 0x0442, 0x0004 }, - { 0x0a, 0x00, -1, 0x03, 0x0442, 0x0005 }, - { 0x0a, 0x00, -1, 0x03, 0x0442, 0x0006 }, - { 0x0a, 0x00, -1, 0x03, 0x0442, 0x0007 }, - { 0x0a, 0x00, -1, 0x03, 0x0442, 0x0008 }, - { 0x0a, 0x00, -1, 0x03, 0x0442, 0x0009 }, - { 0x0c, 0x00, -1, 0x00, 0x0842, 0x0002 }, - { 0x0c, 0x00, -1, 0x01, 0x0842, 0x0003 }, - { 0x0c, 0x00, -1, 0x02, 0x0842, 0x0004 }, - { 0x0c, 0x00, -1, 0x03, 0x0842, 0x0005 }, - { 0x0c, 0x00, -1, 0x03, 0x0842, 0x0006 }, - { 0x0c, 0x00, -1, 0x03, 0x0842, 0x0007 }, - { 0x0c, 0x00, -1, 0x03, 0x0842, 0x0008 }, - { 0x0c, 0x00, -1, 0x03, 0x0842, 0x0009 }, - { 0x0e, 0x00, -1, 0x00, 0x1842, 0x0002 }, - { 0x0e, 0x00, -1, 0x01, 0x1842, 0x0003 }, - { 0x0e, 0x00, -1, 0x02, 0x1842, 0x0004 }, - { 0x0e, 0x00, -1, 0x03, 0x1842, 0x0005 }, - { 0x0e, 0x00, -1, 0x03, 0x1842, 0x0006 }, - { 0x0e, 0x00, -1, 0x03, 0x1842, 0x0007 }, - { 0x0e, 0x00, -1, 0x03, 0x1842, 0x0008 }, - { 0x0e, 0x00, -1, 0x03, 0x1842, 0x0009 }, - { 0x18, 0x00, -1, 0x00, 0x5842, 0x0002 }, - { 0x18, 0x00, -1, 0x01, 0x5842, 0x0003 }, - { 0x18, 0x00, -1, 0x02, 0x5842, 0x0004 }, - { 0x18, 0x00, -1, 0x03, 0x5842, 0x0005 }, - { 0x18, 0x00, -1, 0x03, 0x5842, 0x0006 }, - { 0x18, 0x00, -1, 0x03, 0x5842, 0x0007 }, - { 0x18, 0x00, -1, 0x03, 0x5842, 0x0008 }, - { 0x18, 0x00, -1, 0x03, 0x5842, 0x0009 }, - { 0x02, 0x05, -1, 0x03, 0x000a, 0x0046 }, - { 0x02, 0x05, -1, 0x03, 0x000a, 0x0066 }, - { 0x02, 0x06, -1, 0x03, 0x000a, 0x0086 }, - { 0x02, 0x07, -1, 0x03, 0x000a, 0x00c6 }, - { 0x02, 0x08, -1, 0x03, 0x000a, 0x0146 }, - { 0x02, 0x09, -1, 0x03, 0x000a, 0x0246 }, - { 0x02, 0x0a, -1, 0x03, 0x000a, 0x0446 }, - { 0x02, 0x18, -1, 0x03, 0x000a, 0x0846 }, - { 0x02, 0x05, -1, 0x03, 0x000e, 0x0046 }, - { 0x02, 0x05, -1, 0x03, 0x000e, 0x0066 }, - { 0x02, 0x06, -1, 0x03, 0x000e, 0x0086 }, - { 0x02, 0x07, -1, 0x03, 0x000e, 0x00c6 }, - { 0x02, 0x08, -1, 0x03, 0x000e, 0x0146 }, - { 0x02, 0x09, -1, 0x03, 0x000e, 0x0246 }, - { 0x02, 0x0a, -1, 0x03, 0x000e, 0x0446 }, - { 0x02, 0x18, -1, 0x03, 0x000e, 0x0846 }, - { 0x03, 0x05, -1, 0x03, 0x0012, 0x0046 }, - { 0x03, 0x05, -1, 0x03, 0x0012, 0x0066 }, - { 0x03, 0x06, -1, 0x03, 0x0012, 0x0086 }, - { 0x03, 0x07, -1, 0x03, 0x0012, 0x00c6 }, - { 0x03, 0x08, -1, 0x03, 0x0012, 0x0146 }, - { 0x03, 0x09, -1, 0x03, 0x0012, 0x0246 }, - { 0x03, 0x0a, -1, 0x03, 0x0012, 0x0446 }, - { 0x03, 0x18, -1, 0x03, 0x0012, 0x0846 }, - { 0x03, 0x05, -1, 0x03, 0x001a, 0x0046 }, - { 0x03, 0x05, -1, 0x03, 0x001a, 0x0066 }, - { 0x03, 0x06, -1, 0x03, 0x001a, 0x0086 }, - { 0x03, 0x07, -1, 0x03, 0x001a, 0x00c6 }, - { 0x03, 0x08, -1, 0x03, 0x001a, 0x0146 }, - { 0x03, 0x09, -1, 0x03, 0x001a, 0x0246 }, - { 0x03, 0x0a, -1, 0x03, 0x001a, 0x0446 }, - { 0x03, 0x18, -1, 0x03, 0x001a, 0x0846 }, - { 0x04, 0x05, -1, 0x03, 0x0022, 0x0046 }, - { 0x04, 0x05, -1, 0x03, 0x0022, 0x0066 }, - { 0x04, 0x06, -1, 0x03, 0x0022, 0x0086 }, - { 0x04, 0x07, -1, 0x03, 0x0022, 0x00c6 }, - { 0x04, 0x08, -1, 0x03, 0x0022, 0x0146 }, - { 0x04, 0x09, -1, 0x03, 0x0022, 0x0246 }, - { 0x04, 0x0a, -1, 0x03, 0x0022, 0x0446 }, - { 0x04, 0x18, -1, 0x03, 0x0022, 0x0846 }, - { 0x04, 0x05, -1, 0x03, 0x0032, 0x0046 }, - { 0x04, 0x05, -1, 0x03, 0x0032, 0x0066 }, - { 0x04, 0x06, -1, 0x03, 0x0032, 0x0086 }, - { 0x04, 0x07, -1, 0x03, 0x0032, 0x00c6 }, - { 0x04, 0x08, -1, 0x03, 0x0032, 0x0146 }, - { 0x04, 0x09, -1, 0x03, 0x0032, 0x0246 }, - { 0x04, 0x0a, -1, 0x03, 0x0032, 0x0446 }, - { 0x04, 0x18, -1, 0x03, 0x0032, 0x0846 }, - { 0x05, 0x05, -1, 0x03, 0x0042, 0x0046 }, - { 0x05, 0x05, -1, 0x03, 0x0042, 0x0066 }, - { 0x05, 0x06, -1, 0x03, 0x0042, 0x0086 }, - { 0x05, 0x07, -1, 0x03, 0x0042, 0x00c6 }, - { 0x05, 0x08, -1, 0x03, 0x0042, 0x0146 }, - { 0x05, 0x09, -1, 0x03, 0x0042, 0x0246 }, - { 0x05, 0x0a, -1, 0x03, 0x0042, 0x0446 }, - { 0x05, 0x18, -1, 0x03, 0x0042, 0x0846 }, - { 0x05, 0x05, -1, 0x03, 0x0062, 0x0046 }, - { 0x05, 0x05, -1, 0x03, 0x0062, 0x0066 }, - { 0x05, 0x06, -1, 0x03, 0x0062, 0x0086 }, - { 0x05, 0x07, -1, 0x03, 0x0062, 0x00c6 }, - { 0x05, 0x08, -1, 0x03, 0x0062, 0x0146 }, - { 0x05, 0x09, -1, 0x03, 0x0062, 0x0246 }, - { 0x05, 0x0a, -1, 0x03, 0x0062, 0x0446 }, - { 0x05, 0x18, -1, 0x03, 0x0062, 0x0846 }, - { 0x06, 0x01, -1, 0x03, 0x0082, 0x000a }, - { 0x06, 0x01, -1, 0x03, 0x0082, 0x000c }, - { 0x06, 0x02, -1, 0x03, 0x0082, 0x000e }, - { 0x06, 0x02, -1, 0x03, 0x0082, 0x0012 }, - { 0x06, 0x03, -1, 0x03, 0x0082, 0x0016 }, - { 0x06, 0x03, -1, 0x03, 0x0082, 0x001e }, - { 0x06, 0x04, -1, 0x03, 0x0082, 0x0026 }, - { 0x06, 0x04, -1, 0x03, 0x0082, 0x0036 }, - { 0x07, 0x01, -1, 0x03, 0x00c2, 0x000a }, - { 0x07, 0x01, -1, 0x03, 0x00c2, 0x000c }, - { 0x07, 0x02, -1, 0x03, 0x00c2, 0x000e }, - { 0x07, 0x02, -1, 0x03, 0x00c2, 0x0012 }, - { 0x07, 0x03, -1, 0x03, 0x00c2, 0x0016 }, - { 0x07, 0x03, -1, 0x03, 0x00c2, 0x001e }, - { 0x07, 0x04, -1, 0x03, 0x00c2, 0x0026 }, - { 0x07, 0x04, -1, 0x03, 0x00c2, 0x0036 }, - { 0x08, 0x01, -1, 0x03, 0x0142, 0x000a }, - { 0x08, 0x01, -1, 0x03, 0x0142, 0x000c }, - { 0x08, 0x02, -1, 0x03, 0x0142, 0x000e }, - { 0x08, 0x02, -1, 0x03, 0x0142, 0x0012 }, - { 0x08, 0x03, -1, 0x03, 0x0142, 0x0016 }, - { 0x08, 0x03, -1, 0x03, 0x0142, 0x001e }, - { 0x08, 0x04, -1, 0x03, 0x0142, 0x0026 }, - { 0x08, 0x04, -1, 0x03, 0x0142, 0x0036 }, - { 0x09, 0x01, -1, 0x03, 0x0242, 0x000a }, - { 0x09, 0x01, -1, 0x03, 0x0242, 0x000c }, - { 0x09, 0x02, -1, 0x03, 0x0242, 0x000e }, - { 0x09, 0x02, -1, 0x03, 0x0242, 0x0012 }, - { 0x09, 0x03, -1, 0x03, 0x0242, 0x0016 }, - { 0x09, 0x03, -1, 0x03, 0x0242, 0x001e }, - { 0x09, 0x04, -1, 0x03, 0x0242, 0x0026 }, - { 0x09, 0x04, -1, 0x03, 0x0242, 0x0036 }, - { 0x0a, 0x01, -1, 0x03, 0x0442, 0x000a }, - { 0x0a, 0x01, -1, 0x03, 0x0442, 0x000c }, - { 0x0a, 0x02, -1, 0x03, 0x0442, 0x000e }, - { 0x0a, 0x02, -1, 0x03, 0x0442, 0x0012 }, - { 0x0a, 0x03, -1, 0x03, 0x0442, 0x0016 }, - { 0x0a, 0x03, -1, 0x03, 0x0442, 0x001e }, - { 0x0a, 0x04, -1, 0x03, 0x0442, 0x0026 }, - { 0x0a, 0x04, -1, 0x03, 0x0442, 0x0036 }, - { 0x0c, 0x01, -1, 0x03, 0x0842, 0x000a }, - { 0x0c, 0x01, -1, 0x03, 0x0842, 0x000c }, - { 0x0c, 0x02, -1, 0x03, 0x0842, 0x000e }, - { 0x0c, 0x02, -1, 0x03, 0x0842, 0x0012 }, - { 0x0c, 0x03, -1, 0x03, 0x0842, 0x0016 }, - { 0x0c, 0x03, -1, 0x03, 0x0842, 0x001e }, - { 0x0c, 0x04, -1, 0x03, 0x0842, 0x0026 }, - { 0x0c, 0x04, -1, 0x03, 0x0842, 0x0036 }, - { 0x0e, 0x01, -1, 0x03, 0x1842, 0x000a }, - { 0x0e, 0x01, -1, 0x03, 0x1842, 0x000c }, - { 0x0e, 0x02, -1, 0x03, 0x1842, 0x000e }, - { 0x0e, 0x02, -1, 0x03, 0x1842, 0x0012 }, - { 0x0e, 0x03, -1, 0x03, 0x1842, 0x0016 }, - { 0x0e, 0x03, -1, 0x03, 0x1842, 0x001e }, - { 0x0e, 0x04, -1, 0x03, 0x1842, 0x0026 }, - { 0x0e, 0x04, -1, 0x03, 0x1842, 0x0036 }, - { 0x18, 0x01, -1, 0x03, 0x5842, 0x000a }, - { 0x18, 0x01, -1, 0x03, 0x5842, 0x000c }, - { 0x18, 0x02, -1, 0x03, 0x5842, 0x000e }, - { 0x18, 0x02, -1, 0x03, 0x5842, 0x0012 }, - { 0x18, 0x03, -1, 0x03, 0x5842, 0x0016 }, - { 0x18, 0x03, -1, 0x03, 0x5842, 0x001e }, - { 0x18, 0x04, -1, 0x03, 0x5842, 0x0026 }, - { 0x18, 0x04, -1, 0x03, 0x5842, 0x0036 }, - { 0x06, 0x05, -1, 0x03, 0x0082, 0x0046 }, - { 0x06, 0x05, -1, 0x03, 0x0082, 0x0066 }, - { 0x06, 0x06, -1, 0x03, 0x0082, 0x0086 }, - { 0x06, 0x07, -1, 0x03, 0x0082, 0x00c6 }, - { 0x06, 0x08, -1, 0x03, 0x0082, 0x0146 }, - { 0x06, 0x09, -1, 0x03, 0x0082, 0x0246 }, - { 0x06, 0x0a, -1, 0x03, 0x0082, 0x0446 }, - { 0x06, 0x18, -1, 0x03, 0x0082, 0x0846 }, - { 0x07, 0x05, -1, 0x03, 0x00c2, 0x0046 }, - { 0x07, 0x05, -1, 0x03, 0x00c2, 0x0066 }, - { 0x07, 0x06, -1, 0x03, 0x00c2, 0x0086 }, - { 0x07, 0x07, -1, 0x03, 0x00c2, 0x00c6 }, - { 0x07, 0x08, -1, 0x03, 0x00c2, 0x0146 }, - { 0x07, 0x09, -1, 0x03, 0x00c2, 0x0246 }, - { 0x07, 0x0a, -1, 0x03, 0x00c2, 0x0446 }, - { 0x07, 0x18, -1, 0x03, 0x00c2, 0x0846 }, - { 0x08, 0x05, -1, 0x03, 0x0142, 0x0046 }, - { 0x08, 0x05, -1, 0x03, 0x0142, 0x0066 }, - { 0x08, 0x06, -1, 0x03, 0x0142, 0x0086 }, - { 0x08, 0x07, -1, 0x03, 0x0142, 0x00c6 }, - { 0x08, 0x08, -1, 0x03, 0x0142, 0x0146 }, - { 0x08, 0x09, -1, 0x03, 0x0142, 0x0246 }, - { 0x08, 0x0a, -1, 0x03, 0x0142, 0x0446 }, - { 0x08, 0x18, -1, 0x03, 0x0142, 0x0846 }, - { 0x09, 0x05, -1, 0x03, 0x0242, 0x0046 }, - { 0x09, 0x05, -1, 0x03, 0x0242, 0x0066 }, - { 0x09, 0x06, -1, 0x03, 0x0242, 0x0086 }, - { 0x09, 0x07, -1, 0x03, 0x0242, 0x00c6 }, - { 0x09, 0x08, -1, 0x03, 0x0242, 0x0146 }, - { 0x09, 0x09, -1, 0x03, 0x0242, 0x0246 }, - { 0x09, 0x0a, -1, 0x03, 0x0242, 0x0446 }, - { 0x09, 0x18, -1, 0x03, 0x0242, 0x0846 }, - { 0x0a, 0x05, -1, 0x03, 0x0442, 0x0046 }, - { 0x0a, 0x05, -1, 0x03, 0x0442, 0x0066 }, - { 0x0a, 0x06, -1, 0x03, 0x0442, 0x0086 }, - { 0x0a, 0x07, -1, 0x03, 0x0442, 0x00c6 }, - { 0x0a, 0x08, -1, 0x03, 0x0442, 0x0146 }, - { 0x0a, 0x09, -1, 0x03, 0x0442, 0x0246 }, - { 0x0a, 0x0a, -1, 0x03, 0x0442, 0x0446 }, - { 0x0a, 0x18, -1, 0x03, 0x0442, 0x0846 }, - { 0x0c, 0x05, -1, 0x03, 0x0842, 0x0046 }, - { 0x0c, 0x05, -1, 0x03, 0x0842, 0x0066 }, - { 0x0c, 0x06, -1, 0x03, 0x0842, 0x0086 }, - { 0x0c, 0x07, -1, 0x03, 0x0842, 0x00c6 }, - { 0x0c, 0x08, -1, 0x03, 0x0842, 0x0146 }, - { 0x0c, 0x09, -1, 0x03, 0x0842, 0x0246 }, - { 0x0c, 0x0a, -1, 0x03, 0x0842, 0x0446 }, - { 0x0c, 0x18, -1, 0x03, 0x0842, 0x0846 }, - { 0x0e, 0x05, -1, 0x03, 0x1842, 0x0046 }, - { 0x0e, 0x05, -1, 0x03, 0x1842, 0x0066 }, - { 0x0e, 0x06, -1, 0x03, 0x1842, 0x0086 }, - { 0x0e, 0x07, -1, 0x03, 0x1842, 0x00c6 }, - { 0x0e, 0x08, -1, 0x03, 0x1842, 0x0146 }, - { 0x0e, 0x09, -1, 0x03, 0x1842, 0x0246 }, - { 0x0e, 0x0a, -1, 0x03, 0x1842, 0x0446 }, - { 0x0e, 0x18, -1, 0x03, 0x1842, 0x0846 }, - { 0x18, 0x05, -1, 0x03, 0x5842, 0x0046 }, - { 0x18, 0x05, -1, 0x03, 0x5842, 0x0066 }, - { 0x18, 0x06, -1, 0x03, 0x5842, 0x0086 }, - { 0x18, 0x07, -1, 0x03, 0x5842, 0x00c6 }, - { 0x18, 0x08, -1, 0x03, 0x5842, 0x0146 }, - { 0x18, 0x09, -1, 0x03, 0x5842, 0x0246 }, - { 0x18, 0x0a, -1, 0x03, 0x5842, 0x0446 }, - { 0x18, 0x18, -1, 0x03, 0x5842, 0x0846 }, -}; +#if (BROTLI_STATIC_INIT == BROTLI_STATIC_INIT_NONE) +BROTLI_INTERNAL extern const BROTLI_MODEL("small") + CmdLutElement kCmdLut[BROTLI_NUM_COMMAND_SYMBOLS]; +#else +BROTLI_INTERNAL BROTLI_BOOL BrotliDecoderInitCmdLut(CmdLutElement* items); +BROTLI_INTERNAL extern BROTLI_MODEL("small") + CmdLutElement kCmdLut[BROTLI_NUM_COMMAND_SYMBOLS]; +#endif + +#if defined(__cplusplus) || defined(c_plusplus) +} /* extern "C" */ +#endif #endif /* BROTLI_DEC_PREFIX_H_ */ diff --git a/deps/brotli/c/dec/prefix_inc.h b/deps/brotli/c/dec/prefix_inc.h new file mode 100644 index 00000000000000..91d81b846b314d --- /dev/null +++ b/deps/brotli/c/dec/prefix_inc.h @@ -0,0 +1,707 @@ +const BROTLI_MODEL("small") +CmdLutElement kCmdLut[BROTLI_NUM_COMMAND_SYMBOLS] = { + { 0x00, 0x00, 0, 0x00, 0x0000, 0x0002 }, + { 0x00, 0x00, 0, 0x01, 0x0000, 0x0003 }, + { 0x00, 0x00, 0, 0x02, 0x0000, 0x0004 }, + { 0x00, 0x00, 0, 0x03, 0x0000, 0x0005 }, + { 0x00, 0x00, 0, 0x03, 0x0000, 0x0006 }, + { 0x00, 0x00, 0, 0x03, 0x0000, 0x0007 }, + { 0x00, 0x00, 0, 0x03, 0x0000, 0x0008 }, + { 0x00, 0x00, 0, 0x03, 0x0000, 0x0009 }, + { 0x00, 0x00, 0, 0x00, 0x0001, 0x0002 }, + { 0x00, 0x00, 0, 0x01, 0x0001, 0x0003 }, + { 0x00, 0x00, 0, 0x02, 0x0001, 0x0004 }, + { 0x00, 0x00, 0, 0x03, 0x0001, 0x0005 }, + { 0x00, 0x00, 0, 0x03, 0x0001, 0x0006 }, + { 0x00, 0x00, 0, 0x03, 0x0001, 0x0007 }, + { 0x00, 0x00, 0, 0x03, 0x0001, 0x0008 }, + { 0x00, 0x00, 0, 0x03, 0x0001, 0x0009 }, + { 0x00, 0x00, 0, 0x00, 0x0002, 0x0002 }, + { 0x00, 0x00, 0, 0x01, 0x0002, 0x0003 }, + { 0x00, 0x00, 0, 0x02, 0x0002, 0x0004 }, + { 0x00, 0x00, 0, 0x03, 0x0002, 0x0005 }, + { 0x00, 0x00, 0, 0x03, 0x0002, 0x0006 }, + { 0x00, 0x00, 0, 0x03, 0x0002, 0x0007 }, + { 0x00, 0x00, 0, 0x03, 0x0002, 0x0008 }, + { 0x00, 0x00, 0, 0x03, 0x0002, 0x0009 }, + { 0x00, 0x00, 0, 0x00, 0x0003, 0x0002 }, + { 0x00, 0x00, 0, 0x01, 0x0003, 0x0003 }, + { 0x00, 0x00, 0, 0x02, 0x0003, 0x0004 }, + { 0x00, 0x00, 0, 0x03, 0x0003, 0x0005 }, + { 0x00, 0x00, 0, 0x03, 0x0003, 0x0006 }, + { 0x00, 0x00, 0, 0x03, 0x0003, 0x0007 }, + { 0x00, 0x00, 0, 0x03, 0x0003, 0x0008 }, + { 0x00, 0x00, 0, 0x03, 0x0003, 0x0009 }, + { 0x00, 0x00, 0, 0x00, 0x0004, 0x0002 }, + { 0x00, 0x00, 0, 0x01, 0x0004, 0x0003 }, + { 0x00, 0x00, 0, 0x02, 0x0004, 0x0004 }, + { 0x00, 0x00, 0, 0x03, 0x0004, 0x0005 }, + { 0x00, 0x00, 0, 0x03, 0x0004, 0x0006 }, + { 0x00, 0x00, 0, 0x03, 0x0004, 0x0007 }, + { 0x00, 0x00, 0, 0x03, 0x0004, 0x0008 }, + { 0x00, 0x00, 0, 0x03, 0x0004, 0x0009 }, + { 0x00, 0x00, 0, 0x00, 0x0005, 0x0002 }, + { 0x00, 0x00, 0, 0x01, 0x0005, 0x0003 }, + { 0x00, 0x00, 0, 0x02, 0x0005, 0x0004 }, + { 0x00, 0x00, 0, 0x03, 0x0005, 0x0005 }, + { 0x00, 0x00, 0, 0x03, 0x0005, 0x0006 }, + { 0x00, 0x00, 0, 0x03, 0x0005, 0x0007 }, + { 0x00, 0x00, 0, 0x03, 0x0005, 0x0008 }, + { 0x00, 0x00, 0, 0x03, 0x0005, 0x0009 }, + { 0x01, 0x00, 0, 0x00, 0x0006, 0x0002 }, + { 0x01, 0x00, 0, 0x01, 0x0006, 0x0003 }, + { 0x01, 0x00, 0, 0x02, 0x0006, 0x0004 }, + { 0x01, 0x00, 0, 0x03, 0x0006, 0x0005 }, + { 0x01, 0x00, 0, 0x03, 0x0006, 0x0006 }, + { 0x01, 0x00, 0, 0x03, 0x0006, 0x0007 }, + { 0x01, 0x00, 0, 0x03, 0x0006, 0x0008 }, + { 0x01, 0x00, 0, 0x03, 0x0006, 0x0009 }, + { 0x01, 0x00, 0, 0x00, 0x0008, 0x0002 }, + { 0x01, 0x00, 0, 0x01, 0x0008, 0x0003 }, + { 0x01, 0x00, 0, 0x02, 0x0008, 0x0004 }, + { 0x01, 0x00, 0, 0x03, 0x0008, 0x0005 }, + { 0x01, 0x00, 0, 0x03, 0x0008, 0x0006 }, + { 0x01, 0x00, 0, 0x03, 0x0008, 0x0007 }, + { 0x01, 0x00, 0, 0x03, 0x0008, 0x0008 }, + { 0x01, 0x00, 0, 0x03, 0x0008, 0x0009 }, + { 0x00, 0x01, 0, 0x03, 0x0000, 0x000a }, + { 0x00, 0x01, 0, 0x03, 0x0000, 0x000c }, + { 0x00, 0x02, 0, 0x03, 0x0000, 0x000e }, + { 0x00, 0x02, 0, 0x03, 0x0000, 0x0012 }, + { 0x00, 0x03, 0, 0x03, 0x0000, 0x0016 }, + { 0x00, 0x03, 0, 0x03, 0x0000, 0x001e }, + { 0x00, 0x04, 0, 0x03, 0x0000, 0x0026 }, + { 0x00, 0x04, 0, 0x03, 0x0000, 0x0036 }, + { 0x00, 0x01, 0, 0x03, 0x0001, 0x000a }, + { 0x00, 0x01, 0, 0x03, 0x0001, 0x000c }, + { 0x00, 0x02, 0, 0x03, 0x0001, 0x000e }, + { 0x00, 0x02, 0, 0x03, 0x0001, 0x0012 }, + { 0x00, 0x03, 0, 0x03, 0x0001, 0x0016 }, + { 0x00, 0x03, 0, 0x03, 0x0001, 0x001e }, + { 0x00, 0x04, 0, 0x03, 0x0001, 0x0026 }, + { 0x00, 0x04, 0, 0x03, 0x0001, 0x0036 }, + { 0x00, 0x01, 0, 0x03, 0x0002, 0x000a }, + { 0x00, 0x01, 0, 0x03, 0x0002, 0x000c }, + { 0x00, 0x02, 0, 0x03, 0x0002, 0x000e }, + { 0x00, 0x02, 0, 0x03, 0x0002, 0x0012 }, + { 0x00, 0x03, 0, 0x03, 0x0002, 0x0016 }, + { 0x00, 0x03, 0, 0x03, 0x0002, 0x001e }, + { 0x00, 0x04, 0, 0x03, 0x0002, 0x0026 }, + { 0x00, 0x04, 0, 0x03, 0x0002, 0x0036 }, + { 0x00, 0x01, 0, 0x03, 0x0003, 0x000a }, + { 0x00, 0x01, 0, 0x03, 0x0003, 0x000c }, + { 0x00, 0x02, 0, 0x03, 0x0003, 0x000e }, + { 0x00, 0x02, 0, 0x03, 0x0003, 0x0012 }, + { 0x00, 0x03, 0, 0x03, 0x0003, 0x0016 }, + { 0x00, 0x03, 0, 0x03, 0x0003, 0x001e }, + { 0x00, 0x04, 0, 0x03, 0x0003, 0x0026 }, + { 0x00, 0x04, 0, 0x03, 0x0003, 0x0036 }, + { 0x00, 0x01, 0, 0x03, 0x0004, 0x000a }, + { 0x00, 0x01, 0, 0x03, 0x0004, 0x000c }, + { 0x00, 0x02, 0, 0x03, 0x0004, 0x000e }, + { 0x00, 0x02, 0, 0x03, 0x0004, 0x0012 }, + { 0x00, 0x03, 0, 0x03, 0x0004, 0x0016 }, + { 0x00, 0x03, 0, 0x03, 0x0004, 0x001e }, + { 0x00, 0x04, 0, 0x03, 0x0004, 0x0026 }, + { 0x00, 0x04, 0, 0x03, 0x0004, 0x0036 }, + { 0x00, 0x01, 0, 0x03, 0x0005, 0x000a }, + { 0x00, 0x01, 0, 0x03, 0x0005, 0x000c }, + { 0x00, 0x02, 0, 0x03, 0x0005, 0x000e }, + { 0x00, 0x02, 0, 0x03, 0x0005, 0x0012 }, + { 0x00, 0x03, 0, 0x03, 0x0005, 0x0016 }, + { 0x00, 0x03, 0, 0x03, 0x0005, 0x001e }, + { 0x00, 0x04, 0, 0x03, 0x0005, 0x0026 }, + { 0x00, 0x04, 0, 0x03, 0x0005, 0x0036 }, + { 0x01, 0x01, 0, 0x03, 0x0006, 0x000a }, + { 0x01, 0x01, 0, 0x03, 0x0006, 0x000c }, + { 0x01, 0x02, 0, 0x03, 0x0006, 0x000e }, + { 0x01, 0x02, 0, 0x03, 0x0006, 0x0012 }, + { 0x01, 0x03, 0, 0x03, 0x0006, 0x0016 }, + { 0x01, 0x03, 0, 0x03, 0x0006, 0x001e }, + { 0x01, 0x04, 0, 0x03, 0x0006, 0x0026 }, + { 0x01, 0x04, 0, 0x03, 0x0006, 0x0036 }, + { 0x01, 0x01, 0, 0x03, 0x0008, 0x000a }, + { 0x01, 0x01, 0, 0x03, 0x0008, 0x000c }, + { 0x01, 0x02, 0, 0x03, 0x0008, 0x000e }, + { 0x01, 0x02, 0, 0x03, 0x0008, 0x0012 }, + { 0x01, 0x03, 0, 0x03, 0x0008, 0x0016 }, + { 0x01, 0x03, 0, 0x03, 0x0008, 0x001e }, + { 0x01, 0x04, 0, 0x03, 0x0008, 0x0026 }, + { 0x01, 0x04, 0, 0x03, 0x0008, 0x0036 }, + { 0x00, 0x00, -1, 0x00, 0x0000, 0x0002 }, + { 0x00, 0x00, -1, 0x01, 0x0000, 0x0003 }, + { 0x00, 0x00, -1, 0x02, 0x0000, 0x0004 }, + { 0x00, 0x00, -1, 0x03, 0x0000, 0x0005 }, + { 0x00, 0x00, -1, 0x03, 0x0000, 0x0006 }, + { 0x00, 0x00, -1, 0x03, 0x0000, 0x0007 }, + { 0x00, 0x00, -1, 0x03, 0x0000, 0x0008 }, + { 0x00, 0x00, -1, 0x03, 0x0000, 0x0009 }, + { 0x00, 0x00, -1, 0x00, 0x0001, 0x0002 }, + { 0x00, 0x00, -1, 0x01, 0x0001, 0x0003 }, + { 0x00, 0x00, -1, 0x02, 0x0001, 0x0004 }, + { 0x00, 0x00, -1, 0x03, 0x0001, 0x0005 }, + { 0x00, 0x00, -1, 0x03, 0x0001, 0x0006 }, + { 0x00, 0x00, -1, 0x03, 0x0001, 0x0007 }, + { 0x00, 0x00, -1, 0x03, 0x0001, 0x0008 }, + { 0x00, 0x00, -1, 0x03, 0x0001, 0x0009 }, + { 0x00, 0x00, -1, 0x00, 0x0002, 0x0002 }, + { 0x00, 0x00, -1, 0x01, 0x0002, 0x0003 }, + { 0x00, 0x00, -1, 0x02, 0x0002, 0x0004 }, + { 0x00, 0x00, -1, 0x03, 0x0002, 0x0005 }, + { 0x00, 0x00, -1, 0x03, 0x0002, 0x0006 }, + { 0x00, 0x00, -1, 0x03, 0x0002, 0x0007 }, + { 0x00, 0x00, -1, 0x03, 0x0002, 0x0008 }, + { 0x00, 0x00, -1, 0x03, 0x0002, 0x0009 }, + { 0x00, 0x00, -1, 0x00, 0x0003, 0x0002 }, + { 0x00, 0x00, -1, 0x01, 0x0003, 0x0003 }, + { 0x00, 0x00, -1, 0x02, 0x0003, 0x0004 }, + { 0x00, 0x00, -1, 0x03, 0x0003, 0x0005 }, + { 0x00, 0x00, -1, 0x03, 0x0003, 0x0006 }, + { 0x00, 0x00, -1, 0x03, 0x0003, 0x0007 }, + { 0x00, 0x00, -1, 0x03, 0x0003, 0x0008 }, + { 0x00, 0x00, -1, 0x03, 0x0003, 0x0009 }, + { 0x00, 0x00, -1, 0x00, 0x0004, 0x0002 }, + { 0x00, 0x00, -1, 0x01, 0x0004, 0x0003 }, + { 0x00, 0x00, -1, 0x02, 0x0004, 0x0004 }, + { 0x00, 0x00, -1, 0x03, 0x0004, 0x0005 }, + { 0x00, 0x00, -1, 0x03, 0x0004, 0x0006 }, + { 0x00, 0x00, -1, 0x03, 0x0004, 0x0007 }, + { 0x00, 0x00, -1, 0x03, 0x0004, 0x0008 }, + { 0x00, 0x00, -1, 0x03, 0x0004, 0x0009 }, + { 0x00, 0x00, -1, 0x00, 0x0005, 0x0002 }, + { 0x00, 0x00, -1, 0x01, 0x0005, 0x0003 }, + { 0x00, 0x00, -1, 0x02, 0x0005, 0x0004 }, + { 0x00, 0x00, -1, 0x03, 0x0005, 0x0005 }, + { 0x00, 0x00, -1, 0x03, 0x0005, 0x0006 }, + { 0x00, 0x00, -1, 0x03, 0x0005, 0x0007 }, + { 0x00, 0x00, -1, 0x03, 0x0005, 0x0008 }, + { 0x00, 0x00, -1, 0x03, 0x0005, 0x0009 }, + { 0x01, 0x00, -1, 0x00, 0x0006, 0x0002 }, + { 0x01, 0x00, -1, 0x01, 0x0006, 0x0003 }, + { 0x01, 0x00, -1, 0x02, 0x0006, 0x0004 }, + { 0x01, 0x00, -1, 0x03, 0x0006, 0x0005 }, + { 0x01, 0x00, -1, 0x03, 0x0006, 0x0006 }, + { 0x01, 0x00, -1, 0x03, 0x0006, 0x0007 }, + { 0x01, 0x00, -1, 0x03, 0x0006, 0x0008 }, + { 0x01, 0x00, -1, 0x03, 0x0006, 0x0009 }, + { 0x01, 0x00, -1, 0x00, 0x0008, 0x0002 }, + { 0x01, 0x00, -1, 0x01, 0x0008, 0x0003 }, + { 0x01, 0x00, -1, 0x02, 0x0008, 0x0004 }, + { 0x01, 0x00, -1, 0x03, 0x0008, 0x0005 }, + { 0x01, 0x00, -1, 0x03, 0x0008, 0x0006 }, + { 0x01, 0x00, -1, 0x03, 0x0008, 0x0007 }, + { 0x01, 0x00, -1, 0x03, 0x0008, 0x0008 }, + { 0x01, 0x00, -1, 0x03, 0x0008, 0x0009 }, + { 0x00, 0x01, -1, 0x03, 0x0000, 0x000a }, + { 0x00, 0x01, -1, 0x03, 0x0000, 0x000c }, + { 0x00, 0x02, -1, 0x03, 0x0000, 0x000e }, + { 0x00, 0x02, -1, 0x03, 0x0000, 0x0012 }, + { 0x00, 0x03, -1, 0x03, 0x0000, 0x0016 }, + { 0x00, 0x03, -1, 0x03, 0x0000, 0x001e }, + { 0x00, 0x04, -1, 0x03, 0x0000, 0x0026 }, + { 0x00, 0x04, -1, 0x03, 0x0000, 0x0036 }, + { 0x00, 0x01, -1, 0x03, 0x0001, 0x000a }, + { 0x00, 0x01, -1, 0x03, 0x0001, 0x000c }, + { 0x00, 0x02, -1, 0x03, 0x0001, 0x000e }, + { 0x00, 0x02, -1, 0x03, 0x0001, 0x0012 }, + { 0x00, 0x03, -1, 0x03, 0x0001, 0x0016 }, + { 0x00, 0x03, -1, 0x03, 0x0001, 0x001e }, + { 0x00, 0x04, -1, 0x03, 0x0001, 0x0026 }, + { 0x00, 0x04, -1, 0x03, 0x0001, 0x0036 }, + { 0x00, 0x01, -1, 0x03, 0x0002, 0x000a }, + { 0x00, 0x01, -1, 0x03, 0x0002, 0x000c }, + { 0x00, 0x02, -1, 0x03, 0x0002, 0x000e }, + { 0x00, 0x02, -1, 0x03, 0x0002, 0x0012 }, + { 0x00, 0x03, -1, 0x03, 0x0002, 0x0016 }, + { 0x00, 0x03, -1, 0x03, 0x0002, 0x001e }, + { 0x00, 0x04, -1, 0x03, 0x0002, 0x0026 }, + { 0x00, 0x04, -1, 0x03, 0x0002, 0x0036 }, + { 0x00, 0x01, -1, 0x03, 0x0003, 0x000a }, + { 0x00, 0x01, -1, 0x03, 0x0003, 0x000c }, + { 0x00, 0x02, -1, 0x03, 0x0003, 0x000e }, + { 0x00, 0x02, -1, 0x03, 0x0003, 0x0012 }, + { 0x00, 0x03, -1, 0x03, 0x0003, 0x0016 }, + { 0x00, 0x03, -1, 0x03, 0x0003, 0x001e }, + { 0x00, 0x04, -1, 0x03, 0x0003, 0x0026 }, + { 0x00, 0x04, -1, 0x03, 0x0003, 0x0036 }, + { 0x00, 0x01, -1, 0x03, 0x0004, 0x000a }, + { 0x00, 0x01, -1, 0x03, 0x0004, 0x000c }, + { 0x00, 0x02, -1, 0x03, 0x0004, 0x000e }, + { 0x00, 0x02, -1, 0x03, 0x0004, 0x0012 }, + { 0x00, 0x03, -1, 0x03, 0x0004, 0x0016 }, + { 0x00, 0x03, -1, 0x03, 0x0004, 0x001e }, + { 0x00, 0x04, -1, 0x03, 0x0004, 0x0026 }, + { 0x00, 0x04, -1, 0x03, 0x0004, 0x0036 }, + { 0x00, 0x01, -1, 0x03, 0x0005, 0x000a }, + { 0x00, 0x01, -1, 0x03, 0x0005, 0x000c }, + { 0x00, 0x02, -1, 0x03, 0x0005, 0x000e }, + { 0x00, 0x02, -1, 0x03, 0x0005, 0x0012 }, + { 0x00, 0x03, -1, 0x03, 0x0005, 0x0016 }, + { 0x00, 0x03, -1, 0x03, 0x0005, 0x001e }, + { 0x00, 0x04, -1, 0x03, 0x0005, 0x0026 }, + { 0x00, 0x04, -1, 0x03, 0x0005, 0x0036 }, + { 0x01, 0x01, -1, 0x03, 0x0006, 0x000a }, + { 0x01, 0x01, -1, 0x03, 0x0006, 0x000c }, + { 0x01, 0x02, -1, 0x03, 0x0006, 0x000e }, + { 0x01, 0x02, -1, 0x03, 0x0006, 0x0012 }, + { 0x01, 0x03, -1, 0x03, 0x0006, 0x0016 }, + { 0x01, 0x03, -1, 0x03, 0x0006, 0x001e }, + { 0x01, 0x04, -1, 0x03, 0x0006, 0x0026 }, + { 0x01, 0x04, -1, 0x03, 0x0006, 0x0036 }, + { 0x01, 0x01, -1, 0x03, 0x0008, 0x000a }, + { 0x01, 0x01, -1, 0x03, 0x0008, 0x000c }, + { 0x01, 0x02, -1, 0x03, 0x0008, 0x000e }, + { 0x01, 0x02, -1, 0x03, 0x0008, 0x0012 }, + { 0x01, 0x03, -1, 0x03, 0x0008, 0x0016 }, + { 0x01, 0x03, -1, 0x03, 0x0008, 0x001e }, + { 0x01, 0x04, -1, 0x03, 0x0008, 0x0026 }, + { 0x01, 0x04, -1, 0x03, 0x0008, 0x0036 }, + { 0x02, 0x00, -1, 0x00, 0x000a, 0x0002 }, + { 0x02, 0x00, -1, 0x01, 0x000a, 0x0003 }, + { 0x02, 0x00, -1, 0x02, 0x000a, 0x0004 }, + { 0x02, 0x00, -1, 0x03, 0x000a, 0x0005 }, + { 0x02, 0x00, -1, 0x03, 0x000a, 0x0006 }, + { 0x02, 0x00, -1, 0x03, 0x000a, 0x0007 }, + { 0x02, 0x00, -1, 0x03, 0x000a, 0x0008 }, + { 0x02, 0x00, -1, 0x03, 0x000a, 0x0009 }, + { 0x02, 0x00, -1, 0x00, 0x000e, 0x0002 }, + { 0x02, 0x00, -1, 0x01, 0x000e, 0x0003 }, + { 0x02, 0x00, -1, 0x02, 0x000e, 0x0004 }, + { 0x02, 0x00, -1, 0x03, 0x000e, 0x0005 }, + { 0x02, 0x00, -1, 0x03, 0x000e, 0x0006 }, + { 0x02, 0x00, -1, 0x03, 0x000e, 0x0007 }, + { 0x02, 0x00, -1, 0x03, 0x000e, 0x0008 }, + { 0x02, 0x00, -1, 0x03, 0x000e, 0x0009 }, + { 0x03, 0x00, -1, 0x00, 0x0012, 0x0002 }, + { 0x03, 0x00, -1, 0x01, 0x0012, 0x0003 }, + { 0x03, 0x00, -1, 0x02, 0x0012, 0x0004 }, + { 0x03, 0x00, -1, 0x03, 0x0012, 0x0005 }, + { 0x03, 0x00, -1, 0x03, 0x0012, 0x0006 }, + { 0x03, 0x00, -1, 0x03, 0x0012, 0x0007 }, + { 0x03, 0x00, -1, 0x03, 0x0012, 0x0008 }, + { 0x03, 0x00, -1, 0x03, 0x0012, 0x0009 }, + { 0x03, 0x00, -1, 0x00, 0x001a, 0x0002 }, + { 0x03, 0x00, -1, 0x01, 0x001a, 0x0003 }, + { 0x03, 0x00, -1, 0x02, 0x001a, 0x0004 }, + { 0x03, 0x00, -1, 0x03, 0x001a, 0x0005 }, + { 0x03, 0x00, -1, 0x03, 0x001a, 0x0006 }, + { 0x03, 0x00, -1, 0x03, 0x001a, 0x0007 }, + { 0x03, 0x00, -1, 0x03, 0x001a, 0x0008 }, + { 0x03, 0x00, -1, 0x03, 0x001a, 0x0009 }, + { 0x04, 0x00, -1, 0x00, 0x0022, 0x0002 }, + { 0x04, 0x00, -1, 0x01, 0x0022, 0x0003 }, + { 0x04, 0x00, -1, 0x02, 0x0022, 0x0004 }, + { 0x04, 0x00, -1, 0x03, 0x0022, 0x0005 }, + { 0x04, 0x00, -1, 0x03, 0x0022, 0x0006 }, + { 0x04, 0x00, -1, 0x03, 0x0022, 0x0007 }, + { 0x04, 0x00, -1, 0x03, 0x0022, 0x0008 }, + { 0x04, 0x00, -1, 0x03, 0x0022, 0x0009 }, + { 0x04, 0x00, -1, 0x00, 0x0032, 0x0002 }, + { 0x04, 0x00, -1, 0x01, 0x0032, 0x0003 }, + { 0x04, 0x00, -1, 0x02, 0x0032, 0x0004 }, + { 0x04, 0x00, -1, 0x03, 0x0032, 0x0005 }, + { 0x04, 0x00, -1, 0x03, 0x0032, 0x0006 }, + { 0x04, 0x00, -1, 0x03, 0x0032, 0x0007 }, + { 0x04, 0x00, -1, 0x03, 0x0032, 0x0008 }, + { 0x04, 0x00, -1, 0x03, 0x0032, 0x0009 }, + { 0x05, 0x00, -1, 0x00, 0x0042, 0x0002 }, + { 0x05, 0x00, -1, 0x01, 0x0042, 0x0003 }, + { 0x05, 0x00, -1, 0x02, 0x0042, 0x0004 }, + { 0x05, 0x00, -1, 0x03, 0x0042, 0x0005 }, + { 0x05, 0x00, -1, 0x03, 0x0042, 0x0006 }, + { 0x05, 0x00, -1, 0x03, 0x0042, 0x0007 }, + { 0x05, 0x00, -1, 0x03, 0x0042, 0x0008 }, + { 0x05, 0x00, -1, 0x03, 0x0042, 0x0009 }, + { 0x05, 0x00, -1, 0x00, 0x0062, 0x0002 }, + { 0x05, 0x00, -1, 0x01, 0x0062, 0x0003 }, + { 0x05, 0x00, -1, 0x02, 0x0062, 0x0004 }, + { 0x05, 0x00, -1, 0x03, 0x0062, 0x0005 }, + { 0x05, 0x00, -1, 0x03, 0x0062, 0x0006 }, + { 0x05, 0x00, -1, 0x03, 0x0062, 0x0007 }, + { 0x05, 0x00, -1, 0x03, 0x0062, 0x0008 }, + { 0x05, 0x00, -1, 0x03, 0x0062, 0x0009 }, + { 0x02, 0x01, -1, 0x03, 0x000a, 0x000a }, + { 0x02, 0x01, -1, 0x03, 0x000a, 0x000c }, + { 0x02, 0x02, -1, 0x03, 0x000a, 0x000e }, + { 0x02, 0x02, -1, 0x03, 0x000a, 0x0012 }, + { 0x02, 0x03, -1, 0x03, 0x000a, 0x0016 }, + { 0x02, 0x03, -1, 0x03, 0x000a, 0x001e }, + { 0x02, 0x04, -1, 0x03, 0x000a, 0x0026 }, + { 0x02, 0x04, -1, 0x03, 0x000a, 0x0036 }, + { 0x02, 0x01, -1, 0x03, 0x000e, 0x000a }, + { 0x02, 0x01, -1, 0x03, 0x000e, 0x000c }, + { 0x02, 0x02, -1, 0x03, 0x000e, 0x000e }, + { 0x02, 0x02, -1, 0x03, 0x000e, 0x0012 }, + { 0x02, 0x03, -1, 0x03, 0x000e, 0x0016 }, + { 0x02, 0x03, -1, 0x03, 0x000e, 0x001e }, + { 0x02, 0x04, -1, 0x03, 0x000e, 0x0026 }, + { 0x02, 0x04, -1, 0x03, 0x000e, 0x0036 }, + { 0x03, 0x01, -1, 0x03, 0x0012, 0x000a }, + { 0x03, 0x01, -1, 0x03, 0x0012, 0x000c }, + { 0x03, 0x02, -1, 0x03, 0x0012, 0x000e }, + { 0x03, 0x02, -1, 0x03, 0x0012, 0x0012 }, + { 0x03, 0x03, -1, 0x03, 0x0012, 0x0016 }, + { 0x03, 0x03, -1, 0x03, 0x0012, 0x001e }, + { 0x03, 0x04, -1, 0x03, 0x0012, 0x0026 }, + { 0x03, 0x04, -1, 0x03, 0x0012, 0x0036 }, + { 0x03, 0x01, -1, 0x03, 0x001a, 0x000a }, + { 0x03, 0x01, -1, 0x03, 0x001a, 0x000c }, + { 0x03, 0x02, -1, 0x03, 0x001a, 0x000e }, + { 0x03, 0x02, -1, 0x03, 0x001a, 0x0012 }, + { 0x03, 0x03, -1, 0x03, 0x001a, 0x0016 }, + { 0x03, 0x03, -1, 0x03, 0x001a, 0x001e }, + { 0x03, 0x04, -1, 0x03, 0x001a, 0x0026 }, + { 0x03, 0x04, -1, 0x03, 0x001a, 0x0036 }, + { 0x04, 0x01, -1, 0x03, 0x0022, 0x000a }, + { 0x04, 0x01, -1, 0x03, 0x0022, 0x000c }, + { 0x04, 0x02, -1, 0x03, 0x0022, 0x000e }, + { 0x04, 0x02, -1, 0x03, 0x0022, 0x0012 }, + { 0x04, 0x03, -1, 0x03, 0x0022, 0x0016 }, + { 0x04, 0x03, -1, 0x03, 0x0022, 0x001e }, + { 0x04, 0x04, -1, 0x03, 0x0022, 0x0026 }, + { 0x04, 0x04, -1, 0x03, 0x0022, 0x0036 }, + { 0x04, 0x01, -1, 0x03, 0x0032, 0x000a }, + { 0x04, 0x01, -1, 0x03, 0x0032, 0x000c }, + { 0x04, 0x02, -1, 0x03, 0x0032, 0x000e }, + { 0x04, 0x02, -1, 0x03, 0x0032, 0x0012 }, + { 0x04, 0x03, -1, 0x03, 0x0032, 0x0016 }, + { 0x04, 0x03, -1, 0x03, 0x0032, 0x001e }, + { 0x04, 0x04, -1, 0x03, 0x0032, 0x0026 }, + { 0x04, 0x04, -1, 0x03, 0x0032, 0x0036 }, + { 0x05, 0x01, -1, 0x03, 0x0042, 0x000a }, + { 0x05, 0x01, -1, 0x03, 0x0042, 0x000c }, + { 0x05, 0x02, -1, 0x03, 0x0042, 0x000e }, + { 0x05, 0x02, -1, 0x03, 0x0042, 0x0012 }, + { 0x05, 0x03, -1, 0x03, 0x0042, 0x0016 }, + { 0x05, 0x03, -1, 0x03, 0x0042, 0x001e }, + { 0x05, 0x04, -1, 0x03, 0x0042, 0x0026 }, + { 0x05, 0x04, -1, 0x03, 0x0042, 0x0036 }, + { 0x05, 0x01, -1, 0x03, 0x0062, 0x000a }, + { 0x05, 0x01, -1, 0x03, 0x0062, 0x000c }, + { 0x05, 0x02, -1, 0x03, 0x0062, 0x000e }, + { 0x05, 0x02, -1, 0x03, 0x0062, 0x0012 }, + { 0x05, 0x03, -1, 0x03, 0x0062, 0x0016 }, + { 0x05, 0x03, -1, 0x03, 0x0062, 0x001e }, + { 0x05, 0x04, -1, 0x03, 0x0062, 0x0026 }, + { 0x05, 0x04, -1, 0x03, 0x0062, 0x0036 }, + { 0x00, 0x05, -1, 0x03, 0x0000, 0x0046 }, + { 0x00, 0x05, -1, 0x03, 0x0000, 0x0066 }, + { 0x00, 0x06, -1, 0x03, 0x0000, 0x0086 }, + { 0x00, 0x07, -1, 0x03, 0x0000, 0x00c6 }, + { 0x00, 0x08, -1, 0x03, 0x0000, 0x0146 }, + { 0x00, 0x09, -1, 0x03, 0x0000, 0x0246 }, + { 0x00, 0x0a, -1, 0x03, 0x0000, 0x0446 }, + { 0x00, 0x18, -1, 0x03, 0x0000, 0x0846 }, + { 0x00, 0x05, -1, 0x03, 0x0001, 0x0046 }, + { 0x00, 0x05, -1, 0x03, 0x0001, 0x0066 }, + { 0x00, 0x06, -1, 0x03, 0x0001, 0x0086 }, + { 0x00, 0x07, -1, 0x03, 0x0001, 0x00c6 }, + { 0x00, 0x08, -1, 0x03, 0x0001, 0x0146 }, + { 0x00, 0x09, -1, 0x03, 0x0001, 0x0246 }, + { 0x00, 0x0a, -1, 0x03, 0x0001, 0x0446 }, + { 0x00, 0x18, -1, 0x03, 0x0001, 0x0846 }, + { 0x00, 0x05, -1, 0x03, 0x0002, 0x0046 }, + { 0x00, 0x05, -1, 0x03, 0x0002, 0x0066 }, + { 0x00, 0x06, -1, 0x03, 0x0002, 0x0086 }, + { 0x00, 0x07, -1, 0x03, 0x0002, 0x00c6 }, + { 0x00, 0x08, -1, 0x03, 0x0002, 0x0146 }, + { 0x00, 0x09, -1, 0x03, 0x0002, 0x0246 }, + { 0x00, 0x0a, -1, 0x03, 0x0002, 0x0446 }, + { 0x00, 0x18, -1, 0x03, 0x0002, 0x0846 }, + { 0x00, 0x05, -1, 0x03, 0x0003, 0x0046 }, + { 0x00, 0x05, -1, 0x03, 0x0003, 0x0066 }, + { 0x00, 0x06, -1, 0x03, 0x0003, 0x0086 }, + { 0x00, 0x07, -1, 0x03, 0x0003, 0x00c6 }, + { 0x00, 0x08, -1, 0x03, 0x0003, 0x0146 }, + { 0x00, 0x09, -1, 0x03, 0x0003, 0x0246 }, + { 0x00, 0x0a, -1, 0x03, 0x0003, 0x0446 }, + { 0x00, 0x18, -1, 0x03, 0x0003, 0x0846 }, + { 0x00, 0x05, -1, 0x03, 0x0004, 0x0046 }, + { 0x00, 0x05, -1, 0x03, 0x0004, 0x0066 }, + { 0x00, 0x06, -1, 0x03, 0x0004, 0x0086 }, + { 0x00, 0x07, -1, 0x03, 0x0004, 0x00c6 }, + { 0x00, 0x08, -1, 0x03, 0x0004, 0x0146 }, + { 0x00, 0x09, -1, 0x03, 0x0004, 0x0246 }, + { 0x00, 0x0a, -1, 0x03, 0x0004, 0x0446 }, + { 0x00, 0x18, -1, 0x03, 0x0004, 0x0846 }, + { 0x00, 0x05, -1, 0x03, 0x0005, 0x0046 }, + { 0x00, 0x05, -1, 0x03, 0x0005, 0x0066 }, + { 0x00, 0x06, -1, 0x03, 0x0005, 0x0086 }, + { 0x00, 0x07, -1, 0x03, 0x0005, 0x00c6 }, + { 0x00, 0x08, -1, 0x03, 0x0005, 0x0146 }, + { 0x00, 0x09, -1, 0x03, 0x0005, 0x0246 }, + { 0x00, 0x0a, -1, 0x03, 0x0005, 0x0446 }, + { 0x00, 0x18, -1, 0x03, 0x0005, 0x0846 }, + { 0x01, 0x05, -1, 0x03, 0x0006, 0x0046 }, + { 0x01, 0x05, -1, 0x03, 0x0006, 0x0066 }, + { 0x01, 0x06, -1, 0x03, 0x0006, 0x0086 }, + { 0x01, 0x07, -1, 0x03, 0x0006, 0x00c6 }, + { 0x01, 0x08, -1, 0x03, 0x0006, 0x0146 }, + { 0x01, 0x09, -1, 0x03, 0x0006, 0x0246 }, + { 0x01, 0x0a, -1, 0x03, 0x0006, 0x0446 }, + { 0x01, 0x18, -1, 0x03, 0x0006, 0x0846 }, + { 0x01, 0x05, -1, 0x03, 0x0008, 0x0046 }, + { 0x01, 0x05, -1, 0x03, 0x0008, 0x0066 }, + { 0x01, 0x06, -1, 0x03, 0x0008, 0x0086 }, + { 0x01, 0x07, -1, 0x03, 0x0008, 0x00c6 }, + { 0x01, 0x08, -1, 0x03, 0x0008, 0x0146 }, + { 0x01, 0x09, -1, 0x03, 0x0008, 0x0246 }, + { 0x01, 0x0a, -1, 0x03, 0x0008, 0x0446 }, + { 0x01, 0x18, -1, 0x03, 0x0008, 0x0846 }, + { 0x06, 0x00, -1, 0x00, 0x0082, 0x0002 }, + { 0x06, 0x00, -1, 0x01, 0x0082, 0x0003 }, + { 0x06, 0x00, -1, 0x02, 0x0082, 0x0004 }, + { 0x06, 0x00, -1, 0x03, 0x0082, 0x0005 }, + { 0x06, 0x00, -1, 0x03, 0x0082, 0x0006 }, + { 0x06, 0x00, -1, 0x03, 0x0082, 0x0007 }, + { 0x06, 0x00, -1, 0x03, 0x0082, 0x0008 }, + { 0x06, 0x00, -1, 0x03, 0x0082, 0x0009 }, + { 0x07, 0x00, -1, 0x00, 0x00c2, 0x0002 }, + { 0x07, 0x00, -1, 0x01, 0x00c2, 0x0003 }, + { 0x07, 0x00, -1, 0x02, 0x00c2, 0x0004 }, + { 0x07, 0x00, -1, 0x03, 0x00c2, 0x0005 }, + { 0x07, 0x00, -1, 0x03, 0x00c2, 0x0006 }, + { 0x07, 0x00, -1, 0x03, 0x00c2, 0x0007 }, + { 0x07, 0x00, -1, 0x03, 0x00c2, 0x0008 }, + { 0x07, 0x00, -1, 0x03, 0x00c2, 0x0009 }, + { 0x08, 0x00, -1, 0x00, 0x0142, 0x0002 }, + { 0x08, 0x00, -1, 0x01, 0x0142, 0x0003 }, + { 0x08, 0x00, -1, 0x02, 0x0142, 0x0004 }, + { 0x08, 0x00, -1, 0x03, 0x0142, 0x0005 }, + { 0x08, 0x00, -1, 0x03, 0x0142, 0x0006 }, + { 0x08, 0x00, -1, 0x03, 0x0142, 0x0007 }, + { 0x08, 0x00, -1, 0x03, 0x0142, 0x0008 }, + { 0x08, 0x00, -1, 0x03, 0x0142, 0x0009 }, + { 0x09, 0x00, -1, 0x00, 0x0242, 0x0002 }, + { 0x09, 0x00, -1, 0x01, 0x0242, 0x0003 }, + { 0x09, 0x00, -1, 0x02, 0x0242, 0x0004 }, + { 0x09, 0x00, -1, 0x03, 0x0242, 0x0005 }, + { 0x09, 0x00, -1, 0x03, 0x0242, 0x0006 }, + { 0x09, 0x00, -1, 0x03, 0x0242, 0x0007 }, + { 0x09, 0x00, -1, 0x03, 0x0242, 0x0008 }, + { 0x09, 0x00, -1, 0x03, 0x0242, 0x0009 }, + { 0x0a, 0x00, -1, 0x00, 0x0442, 0x0002 }, + { 0x0a, 0x00, -1, 0x01, 0x0442, 0x0003 }, + { 0x0a, 0x00, -1, 0x02, 0x0442, 0x0004 }, + { 0x0a, 0x00, -1, 0x03, 0x0442, 0x0005 }, + { 0x0a, 0x00, -1, 0x03, 0x0442, 0x0006 }, + { 0x0a, 0x00, -1, 0x03, 0x0442, 0x0007 }, + { 0x0a, 0x00, -1, 0x03, 0x0442, 0x0008 }, + { 0x0a, 0x00, -1, 0x03, 0x0442, 0x0009 }, + { 0x0c, 0x00, -1, 0x00, 0x0842, 0x0002 }, + { 0x0c, 0x00, -1, 0x01, 0x0842, 0x0003 }, + { 0x0c, 0x00, -1, 0x02, 0x0842, 0x0004 }, + { 0x0c, 0x00, -1, 0x03, 0x0842, 0x0005 }, + { 0x0c, 0x00, -1, 0x03, 0x0842, 0x0006 }, + { 0x0c, 0x00, -1, 0x03, 0x0842, 0x0007 }, + { 0x0c, 0x00, -1, 0x03, 0x0842, 0x0008 }, + { 0x0c, 0x00, -1, 0x03, 0x0842, 0x0009 }, + { 0x0e, 0x00, -1, 0x00, 0x1842, 0x0002 }, + { 0x0e, 0x00, -1, 0x01, 0x1842, 0x0003 }, + { 0x0e, 0x00, -1, 0x02, 0x1842, 0x0004 }, + { 0x0e, 0x00, -1, 0x03, 0x1842, 0x0005 }, + { 0x0e, 0x00, -1, 0x03, 0x1842, 0x0006 }, + { 0x0e, 0x00, -1, 0x03, 0x1842, 0x0007 }, + { 0x0e, 0x00, -1, 0x03, 0x1842, 0x0008 }, + { 0x0e, 0x00, -1, 0x03, 0x1842, 0x0009 }, + { 0x18, 0x00, -1, 0x00, 0x5842, 0x0002 }, + { 0x18, 0x00, -1, 0x01, 0x5842, 0x0003 }, + { 0x18, 0x00, -1, 0x02, 0x5842, 0x0004 }, + { 0x18, 0x00, -1, 0x03, 0x5842, 0x0005 }, + { 0x18, 0x00, -1, 0x03, 0x5842, 0x0006 }, + { 0x18, 0x00, -1, 0x03, 0x5842, 0x0007 }, + { 0x18, 0x00, -1, 0x03, 0x5842, 0x0008 }, + { 0x18, 0x00, -1, 0x03, 0x5842, 0x0009 }, + { 0x02, 0x05, -1, 0x03, 0x000a, 0x0046 }, + { 0x02, 0x05, -1, 0x03, 0x000a, 0x0066 }, + { 0x02, 0x06, -1, 0x03, 0x000a, 0x0086 }, + { 0x02, 0x07, -1, 0x03, 0x000a, 0x00c6 }, + { 0x02, 0x08, -1, 0x03, 0x000a, 0x0146 }, + { 0x02, 0x09, -1, 0x03, 0x000a, 0x0246 }, + { 0x02, 0x0a, -1, 0x03, 0x000a, 0x0446 }, + { 0x02, 0x18, -1, 0x03, 0x000a, 0x0846 }, + { 0x02, 0x05, -1, 0x03, 0x000e, 0x0046 }, + { 0x02, 0x05, -1, 0x03, 0x000e, 0x0066 }, + { 0x02, 0x06, -1, 0x03, 0x000e, 0x0086 }, + { 0x02, 0x07, -1, 0x03, 0x000e, 0x00c6 }, + { 0x02, 0x08, -1, 0x03, 0x000e, 0x0146 }, + { 0x02, 0x09, -1, 0x03, 0x000e, 0x0246 }, + { 0x02, 0x0a, -1, 0x03, 0x000e, 0x0446 }, + { 0x02, 0x18, -1, 0x03, 0x000e, 0x0846 }, + { 0x03, 0x05, -1, 0x03, 0x0012, 0x0046 }, + { 0x03, 0x05, -1, 0x03, 0x0012, 0x0066 }, + { 0x03, 0x06, -1, 0x03, 0x0012, 0x0086 }, + { 0x03, 0x07, -1, 0x03, 0x0012, 0x00c6 }, + { 0x03, 0x08, -1, 0x03, 0x0012, 0x0146 }, + { 0x03, 0x09, -1, 0x03, 0x0012, 0x0246 }, + { 0x03, 0x0a, -1, 0x03, 0x0012, 0x0446 }, + { 0x03, 0x18, -1, 0x03, 0x0012, 0x0846 }, + { 0x03, 0x05, -1, 0x03, 0x001a, 0x0046 }, + { 0x03, 0x05, -1, 0x03, 0x001a, 0x0066 }, + { 0x03, 0x06, -1, 0x03, 0x001a, 0x0086 }, + { 0x03, 0x07, -1, 0x03, 0x001a, 0x00c6 }, + { 0x03, 0x08, -1, 0x03, 0x001a, 0x0146 }, + { 0x03, 0x09, -1, 0x03, 0x001a, 0x0246 }, + { 0x03, 0x0a, -1, 0x03, 0x001a, 0x0446 }, + { 0x03, 0x18, -1, 0x03, 0x001a, 0x0846 }, + { 0x04, 0x05, -1, 0x03, 0x0022, 0x0046 }, + { 0x04, 0x05, -1, 0x03, 0x0022, 0x0066 }, + { 0x04, 0x06, -1, 0x03, 0x0022, 0x0086 }, + { 0x04, 0x07, -1, 0x03, 0x0022, 0x00c6 }, + { 0x04, 0x08, -1, 0x03, 0x0022, 0x0146 }, + { 0x04, 0x09, -1, 0x03, 0x0022, 0x0246 }, + { 0x04, 0x0a, -1, 0x03, 0x0022, 0x0446 }, + { 0x04, 0x18, -1, 0x03, 0x0022, 0x0846 }, + { 0x04, 0x05, -1, 0x03, 0x0032, 0x0046 }, + { 0x04, 0x05, -1, 0x03, 0x0032, 0x0066 }, + { 0x04, 0x06, -1, 0x03, 0x0032, 0x0086 }, + { 0x04, 0x07, -1, 0x03, 0x0032, 0x00c6 }, + { 0x04, 0x08, -1, 0x03, 0x0032, 0x0146 }, + { 0x04, 0x09, -1, 0x03, 0x0032, 0x0246 }, + { 0x04, 0x0a, -1, 0x03, 0x0032, 0x0446 }, + { 0x04, 0x18, -1, 0x03, 0x0032, 0x0846 }, + { 0x05, 0x05, -1, 0x03, 0x0042, 0x0046 }, + { 0x05, 0x05, -1, 0x03, 0x0042, 0x0066 }, + { 0x05, 0x06, -1, 0x03, 0x0042, 0x0086 }, + { 0x05, 0x07, -1, 0x03, 0x0042, 0x00c6 }, + { 0x05, 0x08, -1, 0x03, 0x0042, 0x0146 }, + { 0x05, 0x09, -1, 0x03, 0x0042, 0x0246 }, + { 0x05, 0x0a, -1, 0x03, 0x0042, 0x0446 }, + { 0x05, 0x18, -1, 0x03, 0x0042, 0x0846 }, + { 0x05, 0x05, -1, 0x03, 0x0062, 0x0046 }, + { 0x05, 0x05, -1, 0x03, 0x0062, 0x0066 }, + { 0x05, 0x06, -1, 0x03, 0x0062, 0x0086 }, + { 0x05, 0x07, -1, 0x03, 0x0062, 0x00c6 }, + { 0x05, 0x08, -1, 0x03, 0x0062, 0x0146 }, + { 0x05, 0x09, -1, 0x03, 0x0062, 0x0246 }, + { 0x05, 0x0a, -1, 0x03, 0x0062, 0x0446 }, + { 0x05, 0x18, -1, 0x03, 0x0062, 0x0846 }, + { 0x06, 0x01, -1, 0x03, 0x0082, 0x000a }, + { 0x06, 0x01, -1, 0x03, 0x0082, 0x000c }, + { 0x06, 0x02, -1, 0x03, 0x0082, 0x000e }, + { 0x06, 0x02, -1, 0x03, 0x0082, 0x0012 }, + { 0x06, 0x03, -1, 0x03, 0x0082, 0x0016 }, + { 0x06, 0x03, -1, 0x03, 0x0082, 0x001e }, + { 0x06, 0x04, -1, 0x03, 0x0082, 0x0026 }, + { 0x06, 0x04, -1, 0x03, 0x0082, 0x0036 }, + { 0x07, 0x01, -1, 0x03, 0x00c2, 0x000a }, + { 0x07, 0x01, -1, 0x03, 0x00c2, 0x000c }, + { 0x07, 0x02, -1, 0x03, 0x00c2, 0x000e }, + { 0x07, 0x02, -1, 0x03, 0x00c2, 0x0012 }, + { 0x07, 0x03, -1, 0x03, 0x00c2, 0x0016 }, + { 0x07, 0x03, -1, 0x03, 0x00c2, 0x001e }, + { 0x07, 0x04, -1, 0x03, 0x00c2, 0x0026 }, + { 0x07, 0x04, -1, 0x03, 0x00c2, 0x0036 }, + { 0x08, 0x01, -1, 0x03, 0x0142, 0x000a }, + { 0x08, 0x01, -1, 0x03, 0x0142, 0x000c }, + { 0x08, 0x02, -1, 0x03, 0x0142, 0x000e }, + { 0x08, 0x02, -1, 0x03, 0x0142, 0x0012 }, + { 0x08, 0x03, -1, 0x03, 0x0142, 0x0016 }, + { 0x08, 0x03, -1, 0x03, 0x0142, 0x001e }, + { 0x08, 0x04, -1, 0x03, 0x0142, 0x0026 }, + { 0x08, 0x04, -1, 0x03, 0x0142, 0x0036 }, + { 0x09, 0x01, -1, 0x03, 0x0242, 0x000a }, + { 0x09, 0x01, -1, 0x03, 0x0242, 0x000c }, + { 0x09, 0x02, -1, 0x03, 0x0242, 0x000e }, + { 0x09, 0x02, -1, 0x03, 0x0242, 0x0012 }, + { 0x09, 0x03, -1, 0x03, 0x0242, 0x0016 }, + { 0x09, 0x03, -1, 0x03, 0x0242, 0x001e }, + { 0x09, 0x04, -1, 0x03, 0x0242, 0x0026 }, + { 0x09, 0x04, -1, 0x03, 0x0242, 0x0036 }, + { 0x0a, 0x01, -1, 0x03, 0x0442, 0x000a }, + { 0x0a, 0x01, -1, 0x03, 0x0442, 0x000c }, + { 0x0a, 0x02, -1, 0x03, 0x0442, 0x000e }, + { 0x0a, 0x02, -1, 0x03, 0x0442, 0x0012 }, + { 0x0a, 0x03, -1, 0x03, 0x0442, 0x0016 }, + { 0x0a, 0x03, -1, 0x03, 0x0442, 0x001e }, + { 0x0a, 0x04, -1, 0x03, 0x0442, 0x0026 }, + { 0x0a, 0x04, -1, 0x03, 0x0442, 0x0036 }, + { 0x0c, 0x01, -1, 0x03, 0x0842, 0x000a }, + { 0x0c, 0x01, -1, 0x03, 0x0842, 0x000c }, + { 0x0c, 0x02, -1, 0x03, 0x0842, 0x000e }, + { 0x0c, 0x02, -1, 0x03, 0x0842, 0x0012 }, + { 0x0c, 0x03, -1, 0x03, 0x0842, 0x0016 }, + { 0x0c, 0x03, -1, 0x03, 0x0842, 0x001e }, + { 0x0c, 0x04, -1, 0x03, 0x0842, 0x0026 }, + { 0x0c, 0x04, -1, 0x03, 0x0842, 0x0036 }, + { 0x0e, 0x01, -1, 0x03, 0x1842, 0x000a }, + { 0x0e, 0x01, -1, 0x03, 0x1842, 0x000c }, + { 0x0e, 0x02, -1, 0x03, 0x1842, 0x000e }, + { 0x0e, 0x02, -1, 0x03, 0x1842, 0x0012 }, + { 0x0e, 0x03, -1, 0x03, 0x1842, 0x0016 }, + { 0x0e, 0x03, -1, 0x03, 0x1842, 0x001e }, + { 0x0e, 0x04, -1, 0x03, 0x1842, 0x0026 }, + { 0x0e, 0x04, -1, 0x03, 0x1842, 0x0036 }, + { 0x18, 0x01, -1, 0x03, 0x5842, 0x000a }, + { 0x18, 0x01, -1, 0x03, 0x5842, 0x000c }, + { 0x18, 0x02, -1, 0x03, 0x5842, 0x000e }, + { 0x18, 0x02, -1, 0x03, 0x5842, 0x0012 }, + { 0x18, 0x03, -1, 0x03, 0x5842, 0x0016 }, + { 0x18, 0x03, -1, 0x03, 0x5842, 0x001e }, + { 0x18, 0x04, -1, 0x03, 0x5842, 0x0026 }, + { 0x18, 0x04, -1, 0x03, 0x5842, 0x0036 }, + { 0x06, 0x05, -1, 0x03, 0x0082, 0x0046 }, + { 0x06, 0x05, -1, 0x03, 0x0082, 0x0066 }, + { 0x06, 0x06, -1, 0x03, 0x0082, 0x0086 }, + { 0x06, 0x07, -1, 0x03, 0x0082, 0x00c6 }, + { 0x06, 0x08, -1, 0x03, 0x0082, 0x0146 }, + { 0x06, 0x09, -1, 0x03, 0x0082, 0x0246 }, + { 0x06, 0x0a, -1, 0x03, 0x0082, 0x0446 }, + { 0x06, 0x18, -1, 0x03, 0x0082, 0x0846 }, + { 0x07, 0x05, -1, 0x03, 0x00c2, 0x0046 }, + { 0x07, 0x05, -1, 0x03, 0x00c2, 0x0066 }, + { 0x07, 0x06, -1, 0x03, 0x00c2, 0x0086 }, + { 0x07, 0x07, -1, 0x03, 0x00c2, 0x00c6 }, + { 0x07, 0x08, -1, 0x03, 0x00c2, 0x0146 }, + { 0x07, 0x09, -1, 0x03, 0x00c2, 0x0246 }, + { 0x07, 0x0a, -1, 0x03, 0x00c2, 0x0446 }, + { 0x07, 0x18, -1, 0x03, 0x00c2, 0x0846 }, + { 0x08, 0x05, -1, 0x03, 0x0142, 0x0046 }, + { 0x08, 0x05, -1, 0x03, 0x0142, 0x0066 }, + { 0x08, 0x06, -1, 0x03, 0x0142, 0x0086 }, + { 0x08, 0x07, -1, 0x03, 0x0142, 0x00c6 }, + { 0x08, 0x08, -1, 0x03, 0x0142, 0x0146 }, + { 0x08, 0x09, -1, 0x03, 0x0142, 0x0246 }, + { 0x08, 0x0a, -1, 0x03, 0x0142, 0x0446 }, + { 0x08, 0x18, -1, 0x03, 0x0142, 0x0846 }, + { 0x09, 0x05, -1, 0x03, 0x0242, 0x0046 }, + { 0x09, 0x05, -1, 0x03, 0x0242, 0x0066 }, + { 0x09, 0x06, -1, 0x03, 0x0242, 0x0086 }, + { 0x09, 0x07, -1, 0x03, 0x0242, 0x00c6 }, + { 0x09, 0x08, -1, 0x03, 0x0242, 0x0146 }, + { 0x09, 0x09, -1, 0x03, 0x0242, 0x0246 }, + { 0x09, 0x0a, -1, 0x03, 0x0242, 0x0446 }, + { 0x09, 0x18, -1, 0x03, 0x0242, 0x0846 }, + { 0x0a, 0x05, -1, 0x03, 0x0442, 0x0046 }, + { 0x0a, 0x05, -1, 0x03, 0x0442, 0x0066 }, + { 0x0a, 0x06, -1, 0x03, 0x0442, 0x0086 }, + { 0x0a, 0x07, -1, 0x03, 0x0442, 0x00c6 }, + { 0x0a, 0x08, -1, 0x03, 0x0442, 0x0146 }, + { 0x0a, 0x09, -1, 0x03, 0x0442, 0x0246 }, + { 0x0a, 0x0a, -1, 0x03, 0x0442, 0x0446 }, + { 0x0a, 0x18, -1, 0x03, 0x0442, 0x0846 }, + { 0x0c, 0x05, -1, 0x03, 0x0842, 0x0046 }, + { 0x0c, 0x05, -1, 0x03, 0x0842, 0x0066 }, + { 0x0c, 0x06, -1, 0x03, 0x0842, 0x0086 }, + { 0x0c, 0x07, -1, 0x03, 0x0842, 0x00c6 }, + { 0x0c, 0x08, -1, 0x03, 0x0842, 0x0146 }, + { 0x0c, 0x09, -1, 0x03, 0x0842, 0x0246 }, + { 0x0c, 0x0a, -1, 0x03, 0x0842, 0x0446 }, + { 0x0c, 0x18, -1, 0x03, 0x0842, 0x0846 }, + { 0x0e, 0x05, -1, 0x03, 0x1842, 0x0046 }, + { 0x0e, 0x05, -1, 0x03, 0x1842, 0x0066 }, + { 0x0e, 0x06, -1, 0x03, 0x1842, 0x0086 }, + { 0x0e, 0x07, -1, 0x03, 0x1842, 0x00c6 }, + { 0x0e, 0x08, -1, 0x03, 0x1842, 0x0146 }, + { 0x0e, 0x09, -1, 0x03, 0x1842, 0x0246 }, + { 0x0e, 0x0a, -1, 0x03, 0x1842, 0x0446 }, + { 0x0e, 0x18, -1, 0x03, 0x1842, 0x0846 }, + { 0x18, 0x05, -1, 0x03, 0x5842, 0x0046 }, + { 0x18, 0x05, -1, 0x03, 0x5842, 0x0066 }, + { 0x18, 0x06, -1, 0x03, 0x5842, 0x0086 }, + { 0x18, 0x07, -1, 0x03, 0x5842, 0x00c6 }, + { 0x18, 0x08, -1, 0x03, 0x5842, 0x0146 }, + { 0x18, 0x09, -1, 0x03, 0x5842, 0x0246 }, + { 0x18, 0x0a, -1, 0x03, 0x5842, 0x0446 }, + { 0x18, 0x18, -1, 0x03, 0x5842, 0x0846 }, +}; diff --git a/deps/brotli/c/dec/state.c b/deps/brotli/c/dec/state.c index be6a26680bb04c..dcf61b9eb3a1af 100644 --- a/deps/brotli/c/dec/state.c +++ b/deps/brotli/c/dec/state.c @@ -6,19 +6,32 @@ #include "state.h" -#include /* free, malloc */ - -#include - #include "../common/dictionary.h" +#include "../common/platform.h" #include "huffman.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif +#ifdef BROTLI_REPORTING +/* When BROTLI_REPORTING is defined extra reporting module have to be linked. */ +void BrotliDecoderOnStart(const BrotliDecoderState* s); +void BrotliDecoderOnFinish(const BrotliDecoderState* s); +#define BROTLI_DECODER_ON_START(s) BrotliDecoderOnStart(s); +#define BROTLI_DECODER_ON_FINISH(s) BrotliDecoderOnFinish(s); +#else +#if !defined(BROTLI_DECODER_ON_START) +#define BROTLI_DECODER_ON_START(s) (void)(s); +#endif +#if !defined(BROTLI_DECODER_ON_FINISH) +#define BROTLI_DECODER_ON_FINISH(s) (void)(s); +#endif +#endif + BROTLI_BOOL BrotliDecoderStateInit(BrotliDecoderState* s, brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque) { + BROTLI_DECODER_ON_START(s); if (!alloc_func) { s->alloc_func = BrotliDefaultAllocFunc; s->free_func = BrotliDefaultFreeFunc; @@ -135,16 +148,6 @@ void BrotliDecoderStateCleanupAfterMetablock(BrotliDecoderState* s) { BROTLI_DECODER_FREE(s, s->distance_hgroup.htrees); } -#ifdef BROTLI_REPORTING -/* When BROTLI_REPORTING is defined extra reporting module have to be linked. */ -void BrotliDecoderOnFinish(const BrotliDecoderState* s); -#define BROTLI_DECODER_ON_FINISH(s) BrotliDecoderOnFinish(s); -#else -#if !defined(BROTLI_DECODER_ON_FINISH) -#define BROTLI_DECODER_ON_FINISH(s) (void)(s); -#endif -#endif - void BrotliDecoderStateCleanup(BrotliDecoderState* s) { BrotliDecoderStateCleanupAfterMetablock(s); @@ -174,7 +177,7 @@ BROTLI_BOOL BrotliDecoderHuffmanTreeGroupInit(BrotliDecoderState* s, group->alphabet_size_limit = (uint16_t)alphabet_size_limit; group->num_htrees = (uint16_t)ntrees; group->htrees = p; - group->codes = (HuffmanCode*)(&p[ntrees]); + group->codes = p ? (HuffmanCode*)(&p[ntrees]) : NULL; return !!p; } diff --git a/deps/brotli/c/dec/state.h b/deps/brotli/c/dec/state.h index fd250b6842a460..aa371fba2d8295 100644 --- a/deps/brotli/c/dec/state.h +++ b/deps/brotli/c/dec/state.h @@ -9,14 +9,10 @@ #ifndef BROTLI_DEC_STATE_H_ #define BROTLI_DEC_STATE_H_ -#include -#include -#include - #include "../common/constants.h" -#include "../common/dictionary.h" #include "../common/platform.h" -#include "../common/transform.h" +#include +#include #include "bit_reader.h" #include "huffman.h" diff --git a/deps/brotli/c/dec/static_init.c b/deps/brotli/c/dec/static_init.c new file mode 100644 index 00000000000000..1345052c541505 --- /dev/null +++ b/deps/brotli/c/dec/static_init.c @@ -0,0 +1,53 @@ +/* Copyright 2025 Google Inc. All Rights Reserved. + + Distributed under MIT license. + See file LICENSE for detail or copy at https://opensource.org/licenses/MIT +*/ + +#include "static_init.h" + +#include "../common/platform.h" +#include "../common/static_init.h" + +#if (BROTLI_STATIC_INIT != BROTLI_STATIC_INIT_NONE) +#include "../common/dictionary.h" +#include "prefix.h" +#endif + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#if (BROTLI_STATIC_INIT != BROTLI_STATIC_INIT_NONE) +static BROTLI_BOOL DoBrotliDecoderStaticInit(void) { + BROTLI_BOOL ok = BrotliDecoderInitCmdLut(kCmdLut); + if (!ok) return BROTLI_FALSE; + return BROTLI_TRUE; +} +#endif /* BROTLI_STATIC_INIT_NONE */ + +#if (BROTLI_STATIC_INIT == BROTLI_STATIC_INIT_EARLY) +static BROTLI_BOOL kEarlyInitOk; +static __attribute__((constructor)) void BrotliDecoderStaticInitEarly(void) { + kEarlyInitOk = DoBrotliDecoderStaticInit(); +} +#elif (BROTLI_STATIC_INIT == BROTLI_STATIC_INIT_LAZY) +static BROTLI_BOOL kLazyInitOk; +void BrotliDecoderLazyStaticInitInner(void) { + kLazyInitOk = DoBrotliDecoderStaticInit(); +} +#endif /* BROTLI_STATIC_INIT_EARLY */ + +BROTLI_BOOL BrotliDecoderEnsureStaticInit(void) { +#if (BROTLI_STATIC_INIT == BROTLI_STATIC_INIT_NONE) + return BROTLI_TRUE; +#elif (BROTLI_STATIC_INIT == BROTLI_STATIC_INIT_EARLY) + return kEarlyInitOk; +#else + return kLazyInitOk; +#endif +} + +#if defined(__cplusplus) || defined(c_plusplus) +} /* extern "C" */ +#endif diff --git a/deps/brotli/c/dec/static_init.h b/deps/brotli/c/dec/static_init.h new file mode 100644 index 00000000000000..4ae063ef5e356e --- /dev/null +++ b/deps/brotli/c/dec/static_init.h @@ -0,0 +1,30 @@ +/* Copyright 2025 Google Inc. All Rights Reserved. + + Distributed under MIT license. + See file LICENSE for detail or copy at https://opensource.org/licenses/MIT +*/ + +/* Central point for static initialization. */ + +#ifndef THIRD_PARTY_BROTLI_DEC_STATIC_INIT_H_ +#define THIRD_PARTY_BROTLI_DEC_STATIC_INIT_H_ + +#include "../common/platform.h" +#include "../common/static_init.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#if (BROTLI_STATIC_INIT == BROTLI_STATIC_INIT_LAZY) +BROTLI_INTERNAL void BrotliDecoderLazyStaticInitInner(void); +BROTLI_INTERNAL void BrotliDecoderLazyStaticInit(void); +#endif /* BROTLI_STATIC_INIT */ + +BROTLI_INTERNAL BROTLI_BOOL BrotliDecoderEnsureStaticInit(void); + +#if defined(__cplusplus) || defined(c_plusplus) +} /* extern "C" */ +#endif + +#endif // THIRD_PARTY_BROTLI_DEC_STATIC_INIT_H_ diff --git a/deps/brotli/c/enc/backward_references.c b/deps/brotli/c/enc/backward_references.c index f600e6452ff17d..5d1c0ed63e727d 100644 --- a/deps/brotli/c/enc/backward_references.c +++ b/deps/brotli/c/enc/backward_references.c @@ -8,17 +8,15 @@ #include "backward_references.h" -#include - #include "../common/constants.h" -#include "../common/dictionary.h" +#include "../common/context.h" #include "../common/platform.h" #include "command.h" #include "compound_dictionary.h" -#include "dictionary_hash.h" #include "encoder_dict.h" -#include "memory.h" -#include "quality.h" +#include "hash.h" +#include "params.h" +#include "quality.h" /* IWYU pragma: keep for inc */ #if defined(__cplusplus) || defined(c_plusplus) extern "C" { @@ -116,6 +114,18 @@ static BROTLI_INLINE size_t ComputeDistanceCode(size_t distance, #include "backward_references_inc.h" #undef HASHER +#if defined(BROTLI_MAX_SIMD_QUALITY) +#define HASHER() H58 +/* NOLINTNEXTLINE(build/include) */ +#include "backward_references_inc.h" +#undef HASHER + +#define HASHER() H68 +/* NOLINTNEXTLINE(build/include) */ +#include "backward_references_inc.h" +#undef HASHER +#endif + #undef ENABLE_COMPOUND_DICTIONARY #undef PREFIX #define PREFIX() D @@ -149,6 +159,16 @@ static BROTLI_INLINE size_t ComputeDistanceCode(size_t distance, /* NOLINTNEXTLINE(build/include) */ #include "backward_references_inc.h" #undef HASHER +#if defined(BROTLI_MAX_SIMD_QUALITY) +#define HASHER() H58 +/* NOLINTNEXTLINE(build/include) */ +#include "backward_references_inc.h" +#undef HASHER +#define HASHER() H68 +/* NOLINTNEXTLINE(build/include) */ +#include "backward_references_inc.h" +#undef HASHER +#endif #undef ENABLE_COMPOUND_DICTIONARY #undef PREFIX @@ -174,6 +194,10 @@ void BrotliCreateBackwardReferences(size_t num_bytes, return; CASE_(5) CASE_(6) +#if defined(BROTLI_MAX_SIMD_QUALITY) + CASE_(58) + CASE_(68) +#endif CASE_(40) CASE_(41) CASE_(42) @@ -181,7 +205,7 @@ void BrotliCreateBackwardReferences(size_t num_bytes, CASE_(65) #undef CASE_ default: - BROTLI_DCHECK(false); + BROTLI_DCHECK(BROTLI_FALSE); break; } } @@ -197,7 +221,7 @@ void BrotliCreateBackwardReferences(size_t num_bytes, FOR_GENERIC_HASHERS(CASE_) #undef CASE_ default: - BROTLI_DCHECK(false); + BROTLI_DCHECK(BROTLI_FALSE); break; } } diff --git a/deps/brotli/c/enc/backward_references.h b/deps/brotli/c/enc/backward_references.h index 20fb98a4d88eb8..17f0c8495b9cb1 100644 --- a/deps/brotli/c/enc/backward_references.h +++ b/deps/brotli/c/enc/backward_references.h @@ -9,15 +9,11 @@ #ifndef BROTLI_ENC_BACKWARD_REFERENCES_H_ #define BROTLI_ENC_BACKWARD_REFERENCES_H_ -#include - -#include "../common/constants.h" #include "../common/context.h" -#include "../common/dictionary.h" #include "../common/platform.h" #include "command.h" #include "hash.h" -#include "quality.h" +#include "params.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { diff --git a/deps/brotli/c/enc/backward_references_hq.c b/deps/brotli/c/enc/backward_references_hq.c index 6325032e1cd66f..ab8b12187b3eb6 100644 --- a/deps/brotli/c/enc/backward_references_hq.c +++ b/deps/brotli/c/enc/backward_references_hq.c @@ -8,17 +8,15 @@ #include "backward_references_hq.h" -#include /* memcpy, memset */ - -#include - #include "../common/constants.h" +#include "../common/context.h" #include "../common/platform.h" #include "command.h" #include "compound_dictionary.h" #include "encoder_dict.h" #include "fast_log.h" #include "find_match_length.h" +#include "hash.h" #include "literal_cost.h" #include "memory.h" #include "params.h" @@ -34,10 +32,10 @@ extern "C" { static const float kInfinity = 1.7e38f; /* ~= 2 ^ 127 */ -static const uint32_t kDistanceCacheIndex[] = { +static const BROTLI_MODEL("small") uint32_t kDistanceCacheIndex[] = { 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, }; -static const int kDistanceCacheOffset[] = { +static const BROTLI_MODEL("small") int kDistanceCacheOffset[] = { 0, 0, 0, 0, -1, 1, -2, 2, -3, 3, -1, 1, -2, 2, -3, 3 }; @@ -345,22 +343,22 @@ static uint32_t ComputeDistanceShortcut(const size_t block_start, const size_t max_backward_limit, const size_t gap, const ZopfliNode* nodes) { - const size_t clen = ZopfliNodeCopyLength(&nodes[pos]); - const size_t ilen = nodes[pos].dcode_insert_length & 0x7FFFFFF; + const size_t c_len = ZopfliNodeCopyLength(&nodes[pos]); + const size_t i_len = nodes[pos].dcode_insert_length & 0x7FFFFFF; const size_t dist = ZopfliNodeCopyDistance(&nodes[pos]); /* Since |block_start + pos| is the end position of the command, the copy part - starts from |block_start + pos - clen|. Distances that are greater than + starts from |block_start + pos - c_len|. Distances that are greater than this or greater than |max_backward_limit| + |gap| are static dictionary references, and do not update the last distances. Also distance code 0 (last distance) does not update the last distances. */ if (pos == 0) { return 0; - } else if (dist + clen <= block_start + pos + gap && + } else if (dist + c_len <= block_start + pos + gap && dist <= max_backward_limit + gap && ZopfliNodeDistanceCode(&nodes[pos]) > 0) { return (uint32_t)pos; } else { - return nodes[pos - clen - ilen].u.shortcut; + return nodes[pos - c_len - i_len].u.shortcut; } } @@ -378,12 +376,12 @@ static void ComputeDistanceCache(const size_t pos, int idx = 0; size_t p = nodes[pos].u.shortcut; while (idx < 4 && p > 0) { - const size_t ilen = nodes[p].dcode_insert_length & 0x7FFFFFF; - const size_t clen = ZopfliNodeCopyLength(&nodes[p]); + const size_t i_len = nodes[p].dcode_insert_length & 0x7FFFFFF; + const size_t c_len = ZopfliNodeCopyLength(&nodes[p]); const size_t dist = ZopfliNodeCopyDistance(&nodes[p]); dist_cache[idx++] = (int)dist; - /* Because of prerequisite, p >= clen + ilen >= 2. */ - p = nodes[p - clen - ilen].u.shortcut; + /* Because of prerequisite, p >= c_len + i_len >= 2. */ + p = nodes[p - c_len - i_len].u.shortcut; } for (; idx < 4; ++idx) { dist_cache[idx] = *starting_dist_cache++; @@ -435,6 +433,8 @@ static size_t UpdateNodes( const CompoundDictionary* addon = ¶ms->dictionary.compound; size_t gap = addon->total_size; + BROTLI_DCHECK(cur_ix_masked + max_len <= ringbuffer_mask); + EvaluateNode(block_start + stream_offset, pos, max_backward_limit, gap, starting_dist_cache, model, queue, nodes); diff --git a/deps/brotli/c/enc/backward_references_hq.h b/deps/brotli/c/enc/backward_references_hq.h index 8acf975ab98fe2..4aa270674e37f2 100644 --- a/deps/brotli/c/enc/backward_references_hq.h +++ b/deps/brotli/c/enc/backward_references_hq.h @@ -9,16 +9,12 @@ #ifndef BROTLI_ENC_BACKWARD_REFERENCES_HQ_H_ #define BROTLI_ENC_BACKWARD_REFERENCES_HQ_H_ -#include - -#include "../common/constants.h" #include "../common/context.h" -#include "../common/dictionary.h" #include "../common/platform.h" #include "command.h" #include "hash.h" #include "memory.h" -#include "quality.h" +#include "params.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { diff --git a/deps/brotli/c/enc/bit_cost.c b/deps/brotli/c/enc/bit_cost.c index 6b7c904cede9e2..059f8d9964ecda 100644 --- a/deps/brotli/c/enc/bit_cost.c +++ b/deps/brotli/c/enc/bit_cost.c @@ -8,17 +8,41 @@ #include "bit_cost.h" -#include - -#include "../common/constants.h" #include "../common/platform.h" #include "fast_log.h" -#include "histogram.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif +double BrotliBitsEntropy(const uint32_t* population, size_t size) { + size_t sum = 0; + double retval = 0; + const uint32_t* population_end = population + size; + size_t p; + if (size & 1) { + goto odd_number_of_elements_left; + } + while (population < population_end) { + p = *population++; + sum += p; + retval -= (double)p * FastLog2(p); + odd_number_of_elements_left: + p = *population++; + sum += p; + retval -= (double)p * FastLog2(p); + } + if (sum) retval += (double)sum * FastLog2(sum); + + if (retval < (double)sum) { + /* TODO(eustas): consider doing that per-symbol? */ + /* At least one bit per literal is needed. */ + retval = (double)sum; + } + + return retval; +} + #define FN(X) X ## Literal #include "bit_cost_inc.h" /* NOLINT(build/include) */ #undef FN diff --git a/deps/brotli/c/enc/bit_cost.h b/deps/brotli/c/enc/bit_cost.h index f6f2773994a454..90313c4c33fa64 100644 --- a/deps/brotli/c/enc/bit_cost.h +++ b/deps/brotli/c/enc/bit_cost.h @@ -9,53 +9,21 @@ #ifndef BROTLI_ENC_BIT_COST_H_ #define BROTLI_ENC_BIT_COST_H_ -#include - #include "../common/platform.h" -#include "fast_log.h" #include "histogram.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif -static BROTLI_INLINE double ShannonEntropy( - const uint32_t* population, size_t size, size_t* total) { - size_t sum = 0; - double retval = 0; - const uint32_t* population_end = population + size; - size_t p; - if (size & 1) { - goto odd_number_of_elements_left; - } - while (population < population_end) { - p = *population++; - sum += p; - retval -= (double)p * FastLog2(p); - odd_number_of_elements_left: - p = *population++; - sum += p; - retval -= (double)p * FastLog2(p); - } - if (sum) retval += (double)sum * FastLog2(sum); - *total = sum; - return retval; -} - -static BROTLI_INLINE double BitsEntropy( - const uint32_t* population, size_t size) { - size_t sum; - double retval = ShannonEntropy(population, size, &sum); - if (retval < (double)sum) { - /* At least one bit per literal is needed. */ - retval = (double)sum; - } - return retval; -} - -BROTLI_INTERNAL double BrotliPopulationCostLiteral(const HistogramLiteral*); -BROTLI_INTERNAL double BrotliPopulationCostCommand(const HistogramCommand*); -BROTLI_INTERNAL double BrotliPopulationCostDistance(const HistogramDistance*); +BROTLI_INTERNAL double BrotliBitsEntropy( + const uint32_t* population, size_t size); +BROTLI_INTERNAL double BrotliPopulationCostLiteral( + const HistogramLiteral* histogram); +BROTLI_INTERNAL double BrotliPopulationCostCommand( + const HistogramCommand* histogram); +BROTLI_INTERNAL double BrotliPopulationCostDistance( + const HistogramDistance* histogram); #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ diff --git a/deps/brotli/c/enc/bit_cost_inc.h b/deps/brotli/c/enc/bit_cost_inc.h index 453c2260420932..8e67f2503cd166 100644 --- a/deps/brotli/c/enc/bit_cost_inc.h +++ b/deps/brotli/c/enc/bit_cost_inc.h @@ -119,7 +119,7 @@ double FN(BrotliPopulationCost)(const HistogramType* histogram) { /* Add the estimated encoding cost of the code length code histogram. */ bits += (double)(18 + 2 * max_depth); /* Add the entropy of the code length code histogram. */ - bits += BitsEntropy(depth_histo, BROTLI_CODE_LENGTH_CODES); + bits += BrotliBitsEntropy(depth_histo, BROTLI_CODE_LENGTH_CODES); } return bits; } diff --git a/deps/brotli/c/enc/block_splitter.c b/deps/brotli/c/enc/block_splitter.c index eba1b691e51006..13e924f09d6e13 100644 --- a/deps/brotli/c/enc/block_splitter.c +++ b/deps/brotli/c/enc/block_splitter.c @@ -8,8 +8,6 @@ #include "block_splitter.h" -#include /* memcpy, memset */ - #include "../common/platform.h" #include "bit_cost.h" #include "cluster.h" @@ -140,7 +138,7 @@ void BrotliSplitBlock(MemoryManager* m, CopyLiteralsToByteArray(cmds, num_commands, data, pos, mask, literals); /* Create the block split on the array of literals. * Literal histograms can have alphabet size up to 256. - * Though, to accomodate context modeling, less than half of maximum size + * Though, to accommodate context modeling, less than half of maximum size * is allowed. */ SplitByteVectorLiteral( m, literals, literals_count, @@ -150,7 +148,7 @@ void BrotliSplitBlock(MemoryManager* m, if (BROTLI_IS_OOM(m)) return; BROTLI_FREE(m, literals); /* NB: this might be a good place for injecting extra splitting without - * increasing encoder complexity; however, output parition would be less + * increasing encoder complexity; however, output partition would be less * optimal than one produced with forced splitting inside * SplitByteVector (FindBlocks / ClusterBlocks). */ } @@ -198,16 +196,15 @@ void BrotliSplitBlock(MemoryManager* m, } #if defined(BROTLI_TEST) -size_t CountLiteralsForTest(const Command*, const size_t); -size_t CountLiteralsForTest(const Command* cmds, const size_t num_commands) { +size_t BrotliCountLiteralsForTest(const Command*, size_t); +size_t BrotliCountLiteralsForTest(const Command* cmds, size_t num_commands) { return CountLiterals(cmds, num_commands); } - -void CopyLiteralsToByteArrayForTest(const Command*, - const size_t, const uint8_t*, const size_t, const size_t, uint8_t*); -void CopyLiteralsToByteArrayForTest(const Command* cmds, - const size_t num_commands, const uint8_t* data, const size_t offset, - const size_t mask, uint8_t* literals) { +void BrotliCopyLiteralsToByteArrayForTest( + const Command*, size_t, const uint8_t*, size_t, size_t, uint8_t*); +void BrotliCopyLiteralsToByteArrayForTest(const Command* cmds, + size_t num_commands, const uint8_t* data, size_t offset, size_t mask, + uint8_t* literals) { CopyLiteralsToByteArray(cmds, num_commands, data, offset, mask, literals); } #endif diff --git a/deps/brotli/c/enc/block_splitter.h b/deps/brotli/c/enc/block_splitter.h index 6046b90a5deb7b..c927794ebd6b6f 100644 --- a/deps/brotli/c/enc/block_splitter.h +++ b/deps/brotli/c/enc/block_splitter.h @@ -9,12 +9,9 @@ #ifndef BROTLI_ENC_BLOCK_SPLITTER_H_ #define BROTLI_ENC_BLOCK_SPLITTER_H_ -#include - #include "../common/platform.h" #include "command.h" #include "memory.h" -#include "quality.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { diff --git a/deps/brotli/c/enc/block_splitter_inc.h b/deps/brotli/c/enc/block_splitter_inc.h index aa40bfd329d540..5e34cb9c994772 100644 --- a/deps/brotli/c/enc/block_splitter_inc.h +++ b/deps/brotli/c/enc/block_splitter_inc.h @@ -79,7 +79,7 @@ static size_t FN(FindBlocks)(const DataType* data, const size_t length, size_t j; BROTLI_DCHECK(num_histograms <= 256); - /* Trivial case: single historgram -> single block type. */ + /* Trivial case: single histogram -> single block type. */ if (num_histograms <= 1) { for (i = 0; i < length; ++i) { block_id[i] = 0; @@ -118,6 +118,8 @@ static size_t FN(FindBlocks)(const DataType* data, const size_t length, size_t insert_cost_ix = symbol * num_histograms; double min_cost = 1e99; double block_switch_cost = block_switch_bitcost; + static const size_t prologue_length = 2000; + static const double multiplier = 0.07 / 2000; size_t k; for (k = 0; k < num_histograms; ++k) { /* We are coding the symbol with entropy code k. */ @@ -128,8 +130,8 @@ static size_t FN(FindBlocks)(const DataType* data, const size_t length, } } /* More blocks for the beginning. */ - if (byte_ix < 2000) { - block_switch_cost *= 0.77 + 0.07 * (double)byte_ix / 2000; + if (byte_ix < prologue_length) { + block_switch_cost *= 0.77 + multiplier * (double)byte_ix; } for (k = 0; k < num_histograms; ++k) { cost[k] -= min_cost; @@ -228,12 +230,16 @@ static void FN(ClusterBlocks)(MemoryManager* m, static const uint32_t kInvalidIndex = BROTLI_UINT32_MAX; uint32_t* new_index; size_t i; - uint32_t* BROTLI_RESTRICT const sizes = u32 + 0 * HISTOGRAMS_PER_BATCH; - uint32_t* BROTLI_RESTRICT const new_clusters = u32 + 1 * HISTOGRAMS_PER_BATCH; - uint32_t* BROTLI_RESTRICT const symbols = u32 + 2 * HISTOGRAMS_PER_BATCH; - uint32_t* BROTLI_RESTRICT const remap = u32 + 3 * HISTOGRAMS_PER_BATCH; + uint32_t* BROTLI_RESTRICT const sizes = + u32 ? (u32 + 0 * HISTOGRAMS_PER_BATCH) : NULL; + uint32_t* BROTLI_RESTRICT const new_clusters = + u32 ? (u32 + 1 * HISTOGRAMS_PER_BATCH) : NULL; + uint32_t* BROTLI_RESTRICT const symbols = + u32 ? (u32 + 2 * HISTOGRAMS_PER_BATCH) : NULL; + uint32_t* BROTLI_RESTRICT const remap = + u32 ? (u32 + 3 * HISTOGRAMS_PER_BATCH) : NULL; uint32_t* BROTLI_RESTRICT const block_lengths = - u32 + 4 * HISTOGRAMS_PER_BATCH; + u32 ? (u32 + 4 * HISTOGRAMS_PER_BATCH) : NULL; /* TODO(eustas): move to arena? */ HistogramType* tmp = BROTLI_ALLOC(m, HistogramType, 2); diff --git a/deps/brotli/c/enc/brotli_bit_stream.c b/deps/brotli/c/enc/brotli_bit_stream.c index 5fa0c69aa843dc..1e9e946fe1532c 100644 --- a/deps/brotli/c/enc/brotli_bit_stream.c +++ b/deps/brotli/c/enc/brotli_bit_stream.c @@ -10,10 +10,6 @@ #include "brotli_bit_stream.h" -#include /* memcpy, memset */ - -#include - #include "../common/constants.h" #include "../common/context.h" #include "../common/platform.h" @@ -169,7 +165,8 @@ static void BrotliStoreUncompressedMetaBlockHeader(size_t length, static void BrotliStoreHuffmanTreeOfHuffmanTreeToBitMask( const int num_codes, const uint8_t* code_length_bitdepth, size_t* storage_ix, uint8_t* storage) { - static const uint8_t kStorageOrder[BROTLI_CODE_LENGTH_CODES] = { + static const BROTLI_MODEL("small") + uint8_t kStorageOrder[BROTLI_CODE_LENGTH_CODES] = { 1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; /* The bit lengths of the Huffman code over the code length alphabet @@ -182,10 +179,12 @@ static void BrotliStoreHuffmanTreeOfHuffmanTreeToBitMask( 3 01 4 10 5 1111 */ - static const uint8_t kHuffmanBitLengthHuffmanCodeSymbols[6] = { + static const BROTLI_MODEL("small") + uint8_t kHuffmanBitLengthHuffmanCodeSymbols[6] = { 0, 7, 3, 2, 1, 15 }; - static const uint8_t kHuffmanBitLengthHuffmanCodeBitLengths[6] = { + static const BROTLI_MODEL("small") + uint8_t kHuffmanBitLengthHuffmanCodeBitLengths[6] = { 2, 4, 3, 2, 2, 4 }; @@ -1325,8 +1324,10 @@ void BrotliStoreUncompressedMetaBlock(BROTLI_BOOL is_final_block, } #if defined(BROTLI_TEST) -void GetBlockLengthPrefixCodeForTest(uint32_t len, size_t* code, - uint32_t* n_extra, uint32_t* extra) { +void BrotliGetBlockLengthPrefixCodeForTest(uint32_t len, size_t* code, + uint32_t* n_extra, uint32_t* extra); +void BrotliGetBlockLengthPrefixCodeForTest(uint32_t len, size_t* code, + uint32_t* n_extra, uint32_t* extra) { GetBlockLengthPrefixCode(len, code, n_extra, extra); } #endif diff --git a/deps/brotli/c/enc/brotli_bit_stream.h b/deps/brotli/c/enc/brotli_bit_stream.h index a289509af35a85..7b72bdceeb40b7 100644 --- a/deps/brotli/c/enc/brotli_bit_stream.h +++ b/deps/brotli/c/enc/brotli_bit_stream.h @@ -16,8 +16,6 @@ #ifndef BROTLI_ENC_BROTLI_BIT_STREAM_H_ #define BROTLI_ENC_BROTLI_BIT_STREAM_H_ -#include - #include "../common/context.h" #include "../common/platform.h" #include "command.h" @@ -78,10 +76,6 @@ BROTLI_INTERNAL void BrotliStoreUncompressedMetaBlock( size_t position, size_t mask, size_t len, size_t* BROTLI_RESTRICT storage_ix, uint8_t* BROTLI_RESTRICT storage); -#if defined(BROTLI_TEST) -void GetBlockLengthPrefixCodeForTest(uint32_t, size_t*, uint32_t*, uint32_t*); -#endif - #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif diff --git a/deps/brotli/c/enc/cluster.c b/deps/brotli/c/enc/cluster.c index b0faf8114c52f9..4bf94ab76bfa53 100644 --- a/deps/brotli/c/enc/cluster.c +++ b/deps/brotli/c/enc/cluster.c @@ -8,8 +8,6 @@ #include "cluster.h" -#include - #include "../common/platform.h" #include "bit_cost.h" /* BrotliPopulationCost */ #include "fast_log.h" diff --git a/deps/brotli/c/enc/cluster.h b/deps/brotli/c/enc/cluster.h index 013629c6d95ed2..6519116c4fd400 100644 --- a/deps/brotli/c/enc/cluster.h +++ b/deps/brotli/c/enc/cluster.h @@ -9,8 +9,6 @@ #ifndef BROTLI_ENC_CLUSTER_H_ #define BROTLI_ENC_CLUSTER_H_ -#include - #include "../common/platform.h" #include "histogram.h" #include "memory.h" diff --git a/deps/brotli/c/enc/command.c b/deps/brotli/c/enc/command.c index bf80561bcab809..699fa80985ff7b 100644 --- a/deps/brotli/c/enc/command.c +++ b/deps/brotli/c/enc/command.c @@ -6,7 +6,7 @@ #include "command.h" -#include +#include "../common/platform.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { diff --git a/deps/brotli/c/enc/command.h b/deps/brotli/c/enc/command.h index ba4de7eab3bab4..c1cb208e6a1e74 100644 --- a/deps/brotli/c/enc/command.h +++ b/deps/brotli/c/enc/command.h @@ -9,8 +9,6 @@ #ifndef BROTLI_ENC_COMMAND_H_ #define BROTLI_ENC_COMMAND_H_ -#include - #include "../common/constants.h" #include "../common/platform.h" #include "fast_log.h" @@ -21,14 +19,14 @@ extern "C" { #endif -BROTLI_INTERNAL extern const uint32_t - kBrotliInsBase[BROTLI_NUM_INS_COPY_CODES]; -BROTLI_INTERNAL extern const uint32_t - kBrotliInsExtra[BROTLI_NUM_INS_COPY_CODES]; -BROTLI_INTERNAL extern const uint32_t - kBrotliCopyBase[BROTLI_NUM_INS_COPY_CODES]; -BROTLI_INTERNAL extern const uint32_t - kBrotliCopyExtra[BROTLI_NUM_INS_COPY_CODES]; +BROTLI_INTERNAL extern const BROTLI_MODEL("small") +uint32_t kBrotliInsBase[BROTLI_NUM_INS_COPY_CODES]; +BROTLI_INTERNAL extern const BROTLI_MODEL("small") +uint32_t kBrotliInsExtra[BROTLI_NUM_INS_COPY_CODES]; +BROTLI_INTERNAL extern const BROTLI_MODEL("small") +uint32_t kBrotliCopyBase[BROTLI_NUM_INS_COPY_CODES]; +BROTLI_INTERNAL extern const BROTLI_MODEL("small") +uint32_t kBrotliCopyExtra[BROTLI_NUM_INS_COPY_CODES]; static BROTLI_INLINE uint16_t GetInsertLengthCode(size_t insertlen) { if (insertlen < 6) { diff --git a/deps/brotli/c/enc/compound_dictionary.c b/deps/brotli/c/enc/compound_dictionary.c index a3b5e6933dd1c7..bf323a4b3a317c 100644 --- a/deps/brotli/c/enc/compound_dictionary.c +++ b/deps/brotli/c/enc/compound_dictionary.c @@ -6,11 +6,9 @@ #include "compound_dictionary.h" -#include - #include "../common/platform.h" +#include #include "memory.h" -#include "quality.h" static PreparedDictionary* CreatePreparedDictionaryWithParams(MemoryManager* m, const uint8_t* source, size_t source_size, uint32_t bucket_bits, @@ -191,8 +189,8 @@ BROTLI_BOOL AttachPreparedDictionary( compound->chunk_offsets[index + 1] = compound->total_size; { uint32_t* slot_offsets = (uint32_t*)(&dictionary[1]); - uint16_t* heads = (uint16_t*)(&slot_offsets[1u << dictionary->slot_bits]); - uint32_t* items = (uint32_t*)(&heads[1u << dictionary->bucket_bits]); + uint16_t* heads = (uint16_t*)(&slot_offsets[(size_t)1u << dictionary->slot_bits]); + uint32_t* items = (uint32_t*)(&heads[(size_t)1u << dictionary->bucket_bits]); const void* tail = (void*)&items[dictionary->num_items]; if (dictionary->magic == kPreparedDictionaryMagic) { compound->chunk_source[index] = (const uint8_t*)tail; diff --git a/deps/brotli/c/enc/compound_dictionary.h b/deps/brotli/c/enc/compound_dictionary.h index 9c531d5b194b96..686f92fda32a2d 100644 --- a/deps/brotli/c/enc/compound_dictionary.h +++ b/deps/brotli/c/enc/compound_dictionary.h @@ -7,11 +7,8 @@ #ifndef BROTLI_ENC_PREPARED_DICTIONARY_H_ #define BROTLI_ENC_PREPARED_DICTIONARY_H_ -#include -#include - #include "../common/platform.h" -#include "../common/constants.h" +#include #include "memory.h" /* "Fat" prepared dictionary, could be cooked outside of C implementation, diff --git a/deps/brotli/c/enc/compress_fragment.c b/deps/brotli/c/enc/compress_fragment.c index 13890eabf62922..14fec4fbf28fa8 100644 --- a/deps/brotli/c/enc/compress_fragment.c +++ b/deps/brotli/c/enc/compress_fragment.c @@ -14,15 +14,13 @@ #include "compress_fragment.h" -#include /* memcmp, memcpy, memset */ - -#include - +#include "../common/constants.h" #include "../common/platform.h" #include "brotli_bit_stream.h" #include "entropy_encode.h" #include "fast_log.h" #include "find_match_length.h" +#include "hash_base.h" #include "write_bits.h" #if defined(__cplusplus) || defined(c_plusplus) @@ -31,14 +29,6 @@ extern "C" { #define MAX_DISTANCE (long)BROTLI_MAX_BACKWARD_LIMIT(18) -/* kHashMul32 multiplier has these properties: - * The multiplier must be odd. Otherwise we may lose the highest bit. - * No long streaks of ones or zeros. - * There is no effort to ensure that it is a prime, the oddity is enough - for this use. - * The number has been tuned heuristically against compression benchmarks. */ -static const uint32_t kHashMul32 = 0x1E35A7BD; - static BROTLI_INLINE uint32_t Hash(const uint8_t* p, size_t shift) { const uint64_t h = (BROTLI_UNALIGNED_LOAD64LE(p) << 24) * kHashMul32; return (uint32_t)(h >> shift); @@ -417,7 +407,7 @@ static void EmitUncompressedMetaBlock(const uint8_t* begin, const uint8_t* end, storage[*storage_ix >> 3] = 0; } -static uint32_t kCmdHistoSeed[128] = { +static BROTLI_MODEL("small") uint32_t kCmdHistoSeed[128] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, diff --git a/deps/brotli/c/enc/compress_fragment.h b/deps/brotli/c/enc/compress_fragment.h index 9c0780f8c99f73..462f366b3cfaf6 100644 --- a/deps/brotli/c/enc/compress_fragment.h +++ b/deps/brotli/c/enc/compress_fragment.h @@ -12,8 +12,6 @@ #ifndef BROTLI_ENC_COMPRESS_FRAGMENT_H_ #define BROTLI_ENC_COMPRESS_FRAGMENT_H_ -#include - #include "../common/constants.h" #include "../common/platform.h" #include "entropy_encode.h" diff --git a/deps/brotli/c/enc/compress_fragment_two_pass.c b/deps/brotli/c/enc/compress_fragment_two_pass.c index a762679c1f8b87..01e4794d8b29bb 100644 --- a/deps/brotli/c/enc/compress_fragment_two_pass.c +++ b/deps/brotli/c/enc/compress_fragment_two_pass.c @@ -12,10 +12,6 @@ #include "compress_fragment_two_pass.h" -#include /* memcmp, memcpy, memset */ - -#include - #include "../common/constants.h" #include "../common/platform.h" #include "bit_cost.h" @@ -23,6 +19,7 @@ #include "entropy_encode.h" #include "fast_log.h" #include "find_match_length.h" +#include "hash_base.h" #include "write_bits.h" #if defined(__cplusplus) || defined(c_plusplus) @@ -31,14 +28,6 @@ extern "C" { #define MAX_DISTANCE (long)BROTLI_MAX_BACKWARD_LIMIT(18) -/* kHashMul32 multiplier has these properties: - * The multiplier must be odd. Otherwise we may lose the highest bit. - * No long streaks of ones or zeros. - * There is no effort to ensure that it is a prime, the oddity is enough - for this use. - * The number has been tuned heuristically against compression benchmarks. */ -static const uint32_t kHashMul32 = 0x1E35A7BD; - static BROTLI_INLINE uint32_t Hash(const uint8_t* p, size_t shift, size_t length) { const uint64_t h = @@ -470,7 +459,7 @@ static void StoreCommands(BrotliTwoPassArena* s, const uint8_t* literals, const size_t num_literals, const uint32_t* commands, const size_t num_commands, size_t* storage_ix, uint8_t* storage) { - static const uint32_t kNumExtraBits[128] = { + static const BROTLI_MODEL("small") uint32_t kNumExtraBits[128] = { 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 9, 10, 12, 14, 24, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, @@ -480,7 +469,7 @@ static void StoreCommands(BrotliTwoPassArena* s, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, }; - static const uint32_t kInsertOffset[24] = { + static const BROTLI_MODEL("small") uint32_t kInsertOffset[24] = { 0, 1, 2, 3, 4, 5, 6, 8, 10, 14, 18, 26, 34, 50, 66, 98, 130, 194, 322, 578, 1090, 2114, 6210, 22594, }; @@ -546,7 +535,8 @@ static BROTLI_BOOL ShouldCompress(BrotliTwoPassArena* s, for (i = 0; i < input_size; i += SAMPLE_RATE) { ++s->lit_histo[input[i]]; } - return TO_BROTLI_BOOL(BitsEntropy(s->lit_histo, 256) < max_total_bit_cost); + return TO_BROTLI_BOOL( + BrotliBitsEntropy(s->lit_histo, 256) < max_total_bit_cost); } } diff --git a/deps/brotli/c/enc/compress_fragment_two_pass.h b/deps/brotli/c/enc/compress_fragment_two_pass.h index 6d28d9bb78e458..e98b5e0e2e3dbd 100644 --- a/deps/brotli/c/enc/compress_fragment_two_pass.h +++ b/deps/brotli/c/enc/compress_fragment_two_pass.h @@ -13,8 +13,6 @@ #ifndef BROTLI_ENC_COMPRESS_FRAGMENT_TWO_PASS_H_ #define BROTLI_ENC_COMPRESS_FRAGMENT_TWO_PASS_H_ -#include - #include "../common/constants.h" #include "../common/platform.h" #include "entropy_encode.h" diff --git a/deps/brotli/c/enc/dictionary_hash.c b/deps/brotli/c/enc/dictionary_hash.c index 1a60eb3cdaa95c..193f7a41c4c3ae 100644 --- a/deps/brotli/c/enc/dictionary_hash.c +++ b/deps/brotli/c/enc/dictionary_hash.c @@ -6,1842 +6,139 @@ /* Hash table on the 4-byte prefixes of static dictionary words. */ -#include "../common/platform.h" #include "dictionary_hash.h" +#include "../common/platform.h" /* IWYU pragma: keep */ +#include "../common/static_init.h" + +#if (BROTLI_STATIC_INIT != BROTLI_STATIC_INIT_NONE) +#include "../common/dictionary.h" +#include "hash_base.h" +#endif + #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif -/* GENERATED CODE START */ -BROTLI_INTERNAL const uint16_t kStaticDictionaryHashWords[32768] = { -1002,0,0,0,0,0,0,0,0,683,0,0,0,0,0,0,0,1265,0,0,0,0,0,1431,0,0,0,0,0,0,40,0,0,0, -0,155,8,741,0,624,0,0,0,0,0,0,0,0,0,0,0,0,66,503,0,0,0,451,0,0,0,0,0,0,0,835,70, -0,0,539,0,0,0,0,0,0,0,0,0,113,0,0,0,0,718,0,0,0,0,0,0,520,0,1070,0,0,0,0,0,1515, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,610,0,0,750,0,0,0,307,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,964,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,0,0,0, -645,75,0,649,52,282,0,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1621,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,211,225,0,0,687,718,0,0,110,0,58,0,0,0,0,0,0,345,0,0,301,0,0, -0,203,0,0,1154,674,1949,0,0,0,0,0,0,0,0,0,259,0,0,0,0,0,0,0,1275,0,0,0,1231,254, -0,0,0,0,0,0,0,277,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,0,0,800,0,0,0,29, -116,100,490,0,0,0,0,0,1641,0,543,0,0,0,0,41,181,0,657,0,0,202,25,0,0,0,0,0,0,0, -0,0,0,423,0,0,0,113,0,0,0,927,963,0,976,0,206,0,0,0,0,0,0,0,0,0,2002,0,0,0,0,0, -0,0,0,0,0,0,696,0,1170,0,0,0,0,226,13,0,769,678,551,0,0,0,0,0,0,57,0,0,0,10,188, -0,0,0,624,0,0,0,0,0,0,0,0,0,1941,130,0,0,0,0,378,269,0,0,528,0,1146,0,0,0,1105, -0,1616,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,656,0,1940,0,0,0,0,0,173,0,0,0,0,0,0,0,0,0, -0,0,457,342,810,0,0,0,0,620,0,0,0,0,0,0,0,967,95,447,406,0,0,0,477,0,1268,944, -1941,0,0,0,629,0,0,0,0,0,375,0,0,0,1636,0,0,0,0,774,0,1,1034,0,0,0,0,0,824,0,0, -0,0,0,118,0,0,560,296,0,0,0,0,0,0,0,0,1009,894,0,0,0,0,0,0,0,0,0,0,0,0,0,1474, -366,0,0,0,0,0,0,0,0,0,79,1723,0,0,200,0,0,0,0,0,0,0,0,1759,372,0,16,0,943,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,258,0,0,900,1839,707,30,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,2004,0,0,10,115,0,50,0,0,0,0,0,0,0,0,0,0,520,1,0,738,98,482,0,0,0,0, -0,0,0,0,0,0,701,2,0,0,0,0,0,0,0,0,557,0,0,0,0,0,0,0,0,0,347,0,0,0,0,572,0,0,0,0, -0,0,0,0,0,832,0,0,797,809,0,0,0,0,0,0,0,0,0,0,0,528,0,0,0,861,0,0,294,0,0,0,109, -0,0,0,0,0,0,0,0,1187,290,266,0,0,0,0,49,50,748,0,0,466,399,0,0,0,0,0,0,0,378,0, -519,0,0,0,0,0,0,0,0,0,0,0,0,667,351,902,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,180, -0,0,869,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,523,36,0,0,587,510,809,29,260,0,0, -0,0,0,0,0,0,570,0,565,0,1464,0,0,0,0,0,0,10,0,0,787,399,380,200,0,0,0,0,516,0, -844,887,0,0,0,0,0,0,0,44,0,0,0,305,1655,0,0,0,0,0,0,0,0,0,0,0,0,0,0,786,10,0,0, -0,0,0,0,0,0,0,2031,0,0,0,0,0,684,0,0,0,0,0,1480,0,0,0,27,0,0,0,395,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,813,511,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,0,0,0,206, -496,0,0,0,0,0,909,0,891,0,0,0,0,0,0,0,0,0,687,0,0,0,1342,0,0,0,0,0,0,0,0,0,0, -160,41,0,0,0,0,0,0,0,0,0,0,0,1718,778,0,0,0,0,0,0,0,0,0,0,1610,0,0,0,0,0,115,0, -0,0,0,314,294,0,0,0,983,178,193,0,0,0,0,0,0,0,0,0,174,0,0,0,0,0,0,0,0,0,0,848, -1796,0,0,0,0,0,0,221,0,687,1660,0,0,0,0,262,0,0,179,0,0,0,0,0,66,0,773,0,352,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35,0,152,0,0,1197,0,0,0,0,0,0,0,0,0,0,0,0,560,0,0, -564,0,0,0,797,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,556,0,819,0,0,0,0,0,0,0,0,719,544, -637,5,0,0,0,0,0,0,0,0,0,0,0,101,0,1441,0,0,0,893,0,0,0,0,0,0,0,0,0,238,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,1296,0,0,969,1729,314,60,0,0,0,0,0,1144,0,1147,0,0,0,0,0, -0,0,0,0,0,437,1853,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,828,0,176,0,0,0,0,0,0,434,39,0, -0,0,0,0,159,0,0,0,902,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,270,0,0,0,0,801,556,0,0, -0,0,0,0,0,416,19,197,369,0,0,0,0,0,0,0,0,0,28,34,0,757,0,0,898,1553,0,721,0,0,0, -0,1012,0,0,0,0,1102,0,898,183,0,0,0,0,0,0,0,136,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,277,0,0,0,435,0,0,0,0,0,1311,0,0,0,0, -0,0,211,437,0,0,0,28,0,0,750,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2012,0,702, -0,808,0,0,0,0,739,166,0,0,0,0,0,0,719,170,500,0,0,0,0,0,0,0,0,1500,327,0,0,450, -0,0,0,1318,0,0,0,1602,0,0,331,754,0,0,0,0,0,1368,0,0,557,0,0,0,799,850,0,0,0,0, -0,0,0,0,908,0,0,0,0,0,19,62,459,0,0,0,0,0,0,0,0,0,0,0,0,1802,0,0,0,0,0,0,0,0,0, -1397,0,0,0,0,120,238,0,0,0,0,0,0,0,0,0,0,0,1324,0,0,0,0,0,0,0,0,602,201,0,0,164, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,615,0,0,0,0,0,0,0,0,0,0,0,0,0,1243,0,0,0,0,968,0,0, -0,0,0,0,882,0,0,0,907,329,100,0,0,0,0,0,0,0,0,0,0,0,176,26,9,0,0,265,256,0,0,0, -0,0,0,0,0,0,643,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,610,0,0,0,0,973,2001,0, -0,0,0,0,0,522,0,0,0,0,0,0,0,0,0,0,0,553,0,0,0,0,0,0,1582,0,1578,0,0,0,0,0,0,0,0, -0,0,0,795,0,0,0,432,0,0,0,0,0,0,84,126,0,0,0,0,790,0,377,64,0,1529,0,0,0,0,530, -1857,539,1104,0,0,0,0,0,0,0,0,0,0,0,0,977,0,0,0,34,0,0,0,0,0,0,0,0,0,0,0,24,26, -0,0,918,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,183,379,0,0,0,0,0,0,0,792, -0,0,0,0,0,0,0,0,0,1920,0,0,0,0,0,0,0,0,0,771,0,0,0,1979,0,901,254,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,0,0,0,0,0,440,37,0, -508,0,0,0,513,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,533,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,752,920,0,1048,0,153,0, -0,391,0,0,1952,0,0,0,0,0,0,0,0,0,0,126,0,0,0,0,640,0,483,69,1616,0,0,0,0,0,734, -0,0,0,0,0,0,480,0,495,0,472,0,0,0,0,0,0,0,0,874,229,0,0,0,0,948,0,0,0,0,0,0,0,0, -1009,748,0,555,0,0,0,0,0,0,193,0,653,0,0,0,0,0,0,0,0,0,0,984,0,0,0,172,0,0,0,0, -0,0,0,0,83,1568,0,0,384,0,0,0,0,0,0,0,164,880,0,0,0,0,0,0,0,0,0,0,0,367,121,0,0, -828,0,0,0,0,0,0,0,1541,0,0,0,0,0,0,0,343,0,0,0,0,0,0,0,0,561,57,0,0,0,0,0,0,0, -926,0,0,0,0,827,0,194,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0, -0,0,0,896,1249,0,0,0,0,0,1614,0,0,0,860,0,0,0,0,0,0,0,0,964,102,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,899,0,569,0,0,0,0,795,2045,0,0,0, -0,0,0,104,52,0,0,0,0,0,604,0,0,0,0,779,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0, -494,0,677,0,0,0,0,0,0,0,508,0,0,0,0,0,0,0,0,0,1014,0,957,0,0,630,310,0,0,0,570, -0,0,449,0,64,537,0,0,0,0,0,0,0,244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,702,1650,49,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,338,0,0,0,0,1279,0,0,0,0,0,0,0,896,0,0, -178,0,0,0,0,0,0,0,0,0,0,0,0,0,808,695,0,0,0,0,539,1117,0,0,0,0,0,0,0,0,257,0, -1003,0,0,0,1,448,0,516,0,0,960,0,125,4,0,1268,30,748,0,0,852,0,0,0,6,0,0,848, -236,1385,862,1811,0,0,0,0,698,803,0,0,0,0,0,0,0,610,992,0,0,878,0,1847,0,0,0,0, -0,0,0,383,0,1404,0,0,0,0,986,0,347,0,0,0,0,0,0,0,0,0,0,0,592,572,0,1411,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,606,0,0,0,0,0,0, -0,0,0,0,0,0,0,1829,0,0,0,0,0,0,0,0,0,0,0,0,700,748,0,0,0,0,0,0,365,0,0,127,0,0, -83,198,0,0,0,0,0,0,864,55,0,0,0,0,726,1752,0,0,0,0,0,0,0,0,0,0,0,0,0,1066,0,764, -0,0,0,0,683,0,550,309,0,0,874,1212,0,0,0,1364,0,986,381,723,0,0,0,1573,0,0,0,0, -0,1025,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1559,0,0,0,0,493,133,0,0,0,0,148, -119,0,0,0,0,0,0,537,14,541,0,635,126,0,0,0,495,0,0,0,0,861,998,1009,0,0,0,0,0,0, -0,359,368,0,0,0,0,304,1577,0,0,0,0,0,1107,0,0,0,0,0,929,0,0,0,1142,0,0,0,0,289, -175,0,432,0,219,0,0,0,0,0,785,0,0,595,0,0,0,0,0,0,0,0,0,0,0,0,0,80,0,0,0,0,0,0, -931,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1323,0,0,0,0,290,0,559,1751,127,0,0,0, -934,1167,0,963,0,260,0,0,0,573,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -580,1689,0,0,0,0,0,0,0,0,0,1164,0,0,982,1922,0,63,0,0,0,0,0,793,0,0,0,0,0,0,0,0, -0,0,0,0,0,67,790,0,0,0,0,0,0,0,0,0,0,391,443,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,271,0,0,0,0,0,0,0,0,0,0,0,1140,0,0,0,0,340,300,0,897,0,0,0,0,0,0, -0,0,0,0,890,0,0,0,0,818,321,53,0,0,0,0,0,0,0,0,0,468,0,243,0,870,0,0,0,1765,121, -0,0,0,180,518,0,822,419,634,0,0,0,0,0,0,0,0,0,898,0,0,0,0,454,36,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,806,0,0,0,0,0,0,0,0,0,0,0,0,1326,0,104,0,0,0,0,0,0,0, -0,0,260,0,0,0,0,0,0,0,0,0,0,0,0,542,45,0,0,263,1516,42,0,0,0,0,0,468,0,1005,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,288,87,0,0,0,0,0,0,0,0,502,988,133,0,0,0,0,0,0, -141,0,0,872,1842,0,0,0,0,0,0,0,0,261,619,0,0,0,0,189,246,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,678,0,0,0,0,0,0,0,0,0,0,0,0,285,35,0,517,0,0,0,0,0,0,0,0,0,0, -540,214,667,0,74,0,0,125,0,0,0,0,0,761,131,0,0,0,0,0,0,0,0,0,0,0,0,0,333,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1338,94,0,0,0,0,0,0,0,0,0,0,0,0,449,0,646,103, -86,641,2028,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,869,87,277,117,39,0,0,0,0,0,0,0,0,938, -297,0,0,0,0,558,464,0,0,0,0,0,0,0,0,0,0,731,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1608,0, -0,0,0,0,0,0,1429,0,0,733,1010,0,0,338,1656,0,0,0,1038,979,2010,0,0,0,0,0,0,0, -1005,0,0,121,0,0,0,219,20,0,0,0,0,0,0,872,1440,0,0,0,683,0,1070,0,0,522,0,0,0,0, -439,669,0,0,0,0,0,0,0,0,1245,0,0,0,0,0,1218,0,0,547,233,0,0,0,0,0,0,0,0,0,482,0, -0,0,0,0,0,0,886,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,795,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,371,0,0,0,0,0,0,0,0,0,0,0,0,0,622,0,625,0,0,0,339,29,0,0,338,0,0,0, -0,130,0,0,0,0,0,0,0,0,0,307,0,0,0,0,0,0,0,0,0,0,2044,0,0,0,0,0,0,0,0,308,770,0, -0,0,0,0,1266,0,0,0,0,0,0,0,0,0,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,690,739,0,0, -0,0,0,0,0,990,0,0,0,1831,0,0,0,0,0,0,0,0,0,0,0,0,0,613,0,0,0,0,0,0,0,0,0,0,0,0, -0,763,0,878,0,0,0,977,0,100,0,0,0,0,0,0,0,0,0,463,0,0,0,0,623,318,0,0,296,463, -137,0,0,454,0,0,0,1527,58,0,0,0,0,0,0,0,18,48,0,0,0,0,0,729,0,0,0,442,0,0,0,0, -40,449,0,853,0,0,0,0,0,0,227,0,0,0,0,0,0,1491,0,0,0,0,0,0,0,0,0,0,161,55,0,450, -0,1174,62,0,207,0,0,0,0,0,0,0,0,869,0,0,0,0,80,213,0,0,0,0,0,0,0,0,0,0,354,820, -0,0,747,0,0,0,954,0,0,1073,0,556,0,0,0,692,0,191,0,804,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,831,162,0,0,35,0,0,0,0,0,0,0,0,1235,0,0,0,0,0,1234,0,0, -0,0,0,0,0,0,0,0,96,0,0,0,0,0,0,0,149,0,0,0,902,204,0,0,833,0,287,366,0,0,0,0,0, -0,992,2020,0,0,0,0,0,0,0,0,0,0,0,356,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,784,0,0,567, -630,0,0,0,539,0,0,27,0,0,0,0,0,0,0,0,0,0,755,0,0,0,0,0,0,0,0,0,0,0,0,814,0,0,0, -0,0,0,0,0,0,0,0,0,0,987,0,0,255,761,194,0,1086,0,0,0,0,0,0,1016,0,0,1396,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,562,271,913,0,0,0,0,0,0,0,0,320,153,45,475,0,0, -0,0,0,0,0,713,0,327,0,0,0,0,0,0,604,552,3,359,0,0,0,0,853,80,0,0,0,0,0,0,0,2016, -6,887,0,0,0,0,975,0,961,0,0,0,0,0,916,1891,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,100,101,390,708,0,0,0,587,983,512,0,0,0,0,0,0,0,0,0,0,0,645,0,0,0,851,0,0,0, -0,0,498,140,217,0,0,0,1448,0,0,0,0,0,0,0,0,0,905,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -643,105,0,792,0,0,0,0,0,0,0,0,0,0,0,0,56,0,0,0,0,0,0,0,0,0,0,535,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1748,0,0,0,0,0,754,0,0,0,0,0,0,0,0,0,0,0,0,91,0,0,1565,0,91,792, -939,3,370,0,0,0,0,95,0,0,0,0,551,7,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1150,0, -0,0,0,0,0,0,0,0,0,0,0,0,671,0,0,0,0,0,888,368,149,0,0,105,1134,0,983,0,0,458,31, -0,643,0,0,0,312,0,740,0,0,0,1642,0,0,0,0,0,0,0,236,0,0,0,0,0,0,0,59,68,0,0,0,0, -0,867,795,0,0,0,0,970,1977,0,0,0,0,0,0,0,1148,0,775,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,970,0,0,0,0,0,0,0,0,0,665,71,0,0,0,0,827,0,0,0,0,0,0,0,0,0, -0,479,0,0,0,0,0,0,0,0,99,607,0,0,0,0,0,0,0,1960,0,0,0,793,0,0,871,41,0,0,241,94, -0,0,0,0,209,0,0,1497,0,0,0,0,0,0,0,0,0,98,0,0,0,463,0,0,0,0,291,0,0,0,0,0,0,0,0, -0,0,984,0,0,0,0,0,205,0,0,0,0,0,0,205,42,0,801,0,0,0,0,0,635,0,0,533,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,371,0,1282,0,0,0,825,0,0,0,0,0,0,0,0,0,357,879,467,0,317,0,0, -0,0,0,0,0,924,0,0,0,0,849,1795,0,0,0,0,895,1799,43,0,0,0,0,0,0,0,0,0,0,1820,0,0, -0,0,0,0,0,525,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,0,493,0,174,417,0,0, -0,0,0,583,733,0,0,0,0,0,0,481,215,0,0,0,0,477,0,0,0,0,0,0,0,0,308,0,0,0,0,0,0,0, -0,297,126,0,0,361,1551,0,0,0,0,0,0,871,1807,0,0,0,0,0,1307,0,685,0,0,0,0,0,0,0, -797,0,858,0,565,0,0,0,0,0,0,0,0,0,0,0,0,434,252,826,0,0,0,0,0,0,791,0,0,0,0,509, -231,178,601,0,0,0,0,0,0,0,0,43,1591,0,0,0,0,0,1683,0,0,0,0,45,0,0,0,0,0,0,0,0,0, -0,1120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,556,494,0,398,0,0,0,1030,0,0,0,0,0,0, -168,0,0,0,0,0,0,0,0,0,0,973,0,642,0,0,0,0,0,0,0,0,0,1615,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,378,594,0,1093,0,679,112,0,0,0,0,1492,540,1374,714, -1486,0,0,0,0,825,1511,0,0,0,0,0,0,0,0,0,0,0,0,0,952,0,0,736,143,0,700,0,1540,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1557,0,0,0,860,990,0,0,0,807,0,0,0,0,0,131, -515,0,646,0,0,0,0,117,728,508,121,0,0,0,0,0,0,357,0,0,0,0,0,0,237,0,0,0,0,0,0,0, -0,0,1784,0,0,0,0,0,0,0,0,0,0,0,713,348,1536,0,738,0,0,0,0,0,0,0,434,0,0,0,0,0,0, -366,1877,39,0,0,0,0,0,0,580,0,0,0,0,0,0,0,0,0,0,0,0,0,0,873,0,0,0,0,171,0,625, -550,107,343,943,0,0,0,0,0,0,0,768,0,0,0,0,0,0,0,799,0,0,0,894,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1673,0,0,0,0,0,0,0,0,0,0,0,1052,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -272,0,441,0,0,3,9,0,0,0,1182,0,1346,0,0,0,0,0,0,0,0,682,0,0,1004,24,0,0,968,0,0, -0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,185,0,0,0,578, -474,0,0,0,0,0,0,0,0,0,0,0,0,0,0,113,530,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,556,0,0,0,0,0,0,16,1317,0,0,97,0,0,0,703,0,0,0,0,0,0,0,0,892,0,0,0,1571,0,0, -426,186,0,1101,0,0,0,0,0,0,0,0,937,585,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,644,291, -0,0,0,0,749,0,162,0,0,381,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,762,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,628,21,0,0,0,0,0,0,0,0,919,0,0,0,0,0,0,0,0,0, -633,0,0,0,0,332,0,0,0,0,0,0,0,0,0,1489,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,832,398,0,645,0,0,0,13,0,0,0,0,0,0,0,0,0,0,20,0,800,0,0,0,0,0,0,0,0,0, -0,0,0,0,1993,0,0,0,0,769,0,0,0,665,0,0,0,0,0,0,0,0,0,0,1426,0,0,0,0,60,0,0,0, -641,1874,0,644,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1757,0,0,0,0,0,937,0,1652,0,654,0, -0,0,0,0,0,0,527,0,0,0,0,0,0,0,0,0,0,0,0,0,226,0,0,0,0,0,1486,0,0,0,0,0,0,0,0,0, -0,0,325,0,0,0,0,0,0,0,1345,0,0,91,0,404,0,0,0,0,0,0,0,0,0,0,0,0,973,0,0,0,0,0,0, -0,1176,0,549,0,0,0,0,0,0,0,0,0,0,976,0,0,0,0,0,21,0,0,0,0,0,51,0,0,0,0,314,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,198,6,0,1093,0,0,0,0,0,0,0,0,0, -0,0,0,0,1776,0,0,0,0,0,1528,0,419,0,0,0,0,0,0,0,0,76,138,0,0,0,0,638,29,0,0,0,0, -0,0,0,1418,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1710,0,0,0,0,0, -0,0,0,0,0,0,0,532,23,0,0,0,0,0,0,0,862,0,0,946,592,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,70,0,0,0,0,0,0,0,0,0,812,0,0,0,76,0,0,988,0,442,0,0,0,896,0,0,0,0,0,0, -483,0,0,0,0,1709,0,0,0,0,0,0,119,0,0,0,117,0,309,0,0,0,0,0,596,976,0,0,0,0,0,0, -0,0,0,0,0,768,0,0,0,0,0,0,0,0,0,518,0,0,0,0,0,0,0,0,0,0,0,0,0,0,863,0,0,0,24, -145,1020,0,0,1984,0,0,0,0,0,0,0,658,0,0,0,0,0,0,0,0,0,0,106,1827,0,1010,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,582,87,0,0,0,0,0,0,0,267,0,0,0,703,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,496,0,0,0,0,1121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249,561,0,0,0,0,0, -0,0,760,0,0,154,0,0,0,255,0,419,323,0,0,0,0,0,368,0,0,0,0,0,0,0,0,0,0,522,0,0,0, -0,0,0,0,551,562,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,92,0,0,0,0, -0,0,0,284,525,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,958,0,0,594,0,0,0,0,0,0,6,479,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,61,0,0,0,0,0,0,0,820,1641,0,1556,0,0,0,0,0,0,0,302,0,0, -0,0,0,148,0,0,676,0,0,0,0,0,0,1674,0,0,0,0,0,0,178,0,0,0,0,0,0,0,94,389,0,0,0,0, -91,8,0,0,0,0,0,0,0,0,0,0,112,0,0,0,0,0,0,0,0,0,0,747,0,0,0,0,0,0,0,1746,0,0,0,0, -0,24,0,1352,158,1530,0,0,718,130,280,1401,0,0,0,0,0,1946,8,0,0,0,0,1607,0,0,0,0, -0,0,882,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,417,0,0,0,1597,633,433,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,234,0,0,0,0,0,0,0,0,680,1950,0,0,0,0,249,5,0,0,0, -0,0,0,0,0,0,1216,0,1773,0,0,0,0,0,0,0,0,0,0,0,0,0,0,509,180,0,0,0,0,0,0,0,1002, -0,0,0,0,0,0,0,0,0,0,0,0,0,931,0,0,0,0,0,0,0,0,747,943,0,1837,0,0,0,0,0,0,0,641, -0,0,0,0,280,0,0,0,5,0,0,0,0,0,72,545,0,0,0,0,0,0,0,0,0,742,0,0,254,151,872,0,0, -0,0,0,0,0,0,0,0,0,0,921,0,0,517,833,0,1680,0,0,436,251,584,0,0,0,0,0,0,0,0,0,0, -0,24,500,0,0,0,0,0,0,0,0,195,1775,514,389,0,0,0,0,0,0,0,743,0,0,0,0,0,0,292,0,0, -0,227,1283,774,1805,0,0,0,0,0,0,0,0,0,0,119,81,0,0,0,0,0,0,0,0,0,0,0,0,0,0,913, -1910,0,0,0,1826,490,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1162,700,30, -0,0,0,721,839,0,0,0,617,0,0,0,0,0,0,0,0,0,169,428,0,0,0,0,0,1648,637,1205,0,0,0, -1596,0,0,4,266,0,0,0,0,0,0,0,0,0,0,0,862,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0, -0,279,157,391,604,0,0,713,945,877,973,0,0,0,0,0,0,0,0,0,0,0,0,0,0,859,567,628, -1846,0,0,0,0,0,0,0,0,0,762,0,0,191,0,0,0,0,298,0,0,767,909,0,0,0,0,0,0,0,795,0, -0,301,0,0,1970,0,0,0,0,0,0,0,0,0,1236,0,0,0,0,0,0,644,369,15,0,160,71,0,0,0,0,0, -1447,0,0,0,0,0,0,0,0,735,1255,76,0,0,0,0,0,0,0,0,0,0,474,0,0,0,0,0,0,0,0,0,0, -841,0,0,0,0,0,0,0,0,0,0,836,0,0,0,0,0,1622,0,0,735,0,0,0,0,1601,804,1390,394,0, -0,0,0,0,0,96,0,289,0,0,35,688,0,0,0,667,0,513,0,0,0,0,0,0,0,2034,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,704,0,1524,0,1078,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,306, -0,0,0,0,0,0,0,431,0,1196,0,0,54,0,15,1448,0,1418,0,0,0,0,0,0,0,0,0,907,0,0,0,0, -0,0,194,1767,0,0,0,0,0,840,0,900,0,0,0,0,0,0,0,0,0,0,0,1436,0,0,0,0,642,1560,0, -0,0,0,0,0,94,386,0,0,0,0,0,0,0,0,0,0,830,416,0,0,20,731,0,0,0,0,0,0,0,0,697,0,0, -662,0,0,0,0,0,0,0,0,0,861,0,0,0,0,0,0,0,871,671,864,0,928,7,0,332,0,0,0,0,1055, -0,0,0,0,0,0,986,0,0,0,0,0,44,76,0,0,0,0,0,0,0,0,0,0,300,0,0,0,0,0,0,0,175,518, -831,1108,0,0,0,836,0,1852,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,843,1804,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,246,0,0,0,610,202,0,0,36,0,0,0,240,654,13,0,0,0,0,0,0,0, -0,391,0,403,0,0,0,0,0,0,0,0,0,0,75,0,366,815,0,0,631,0,0,0,0,0,0,0,0,345,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,952,0,0,0,0,0,0,0,0,0,0,0,673,35,662,0,287,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,5,34,0,0,0,0,0,0,0,0,151,0,427,0,0,382,0,0,0,329,0,0,279,0,0,0, -0,0,0,0,0,0,0,906,0,0,366,843,0,1443,0,1372,992,0,36,123,0,649,0,0,0,0,0,767,0, -1018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,995,0,0,0,0,0,0,0,72,368,0,0,1345,0,0,0, -589,0,0,0,0,0,0,0,0,0,1988,0,0,220,541,0,0,0,686,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,32,196,0,0,0,0,0,0,0,0,0,0,0,0,0,381,0,0,0,0,0,0,0,0,0,1452,0, -0,0,616,0,0,0,0,0,0,0,0,0,1229,0,0,0,0,0,0,0,0,0,0,667,120,0,0,0,0,0,0,0,1146,0, -0,0,0,0,0,0,0,0,0,0,352,0,0,0,0,0,293,0,0,0,0,0,0,0,0,0,0,0,0,0,935,0,1050,0, -147,88,0,0,923,0,0,0,0,0,934,0,0,0,0,0,0,0,0,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,341,222,0,0,0,0,0,0,0,0,0,0,293,0,0,0,0,0,0,0,0,0,0,0,0, -637,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1159,0,0,0,847,0,0,0,0,0,0,683,0,867,944,0,0, -0,0,0,1809,0,0,0,0,0,0,0,0,0,0,395,170,0,0,0,0,0,0,0,0,0,0,618,535,0,1625,0,0,0, -0,0,0,0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,778,0,0,0,0,0,46,0,2032,0,0,37, -1458,0,938,363,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,314,0,0,0,0,0,0,889,0,0,0,0,0,0,0, -0,0,0,0,462,0,0,0,0,525,0,0,23,0,0,0,0,0,0,0,0,0,0,0,676,0,0,0,0,0,0,0,0,0,0,0, -0,498,725,0,0,0,0,7,0,0,0,0,773,0,0,0,164,0,0,0,0,0,0,0,0,936,583,659,1462,0, -220,0,0,0,0,803,0,0,544,119,0,0,0,0,0,0,0,0,0,0,0,181,176,0,1192,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,1878,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,0,0,0,0,0,0, -944,0,0,0,0,0,0,0,273,0,0,0,0,0,855,0,0,0,0,5,127,0,0,0,0,0,0,0,0,752,230,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,162,0,654,48,156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,197, -0,0,0,0,0,0,0,963,0,0,0,0,0,0,0,0,0,0,858,0,0,0,0,0,0,0,0,0,0,676,1978,0,0,102, -972,0,0,0,0,0,0,0,361,0,461,0,0,0,472,0,0,0,0,0,0,0,0,0,0,0,0,0,0,747,905,0,0,0, -155,0,0,0,0,0,0,0,0,0,0,319,163,0,0,0,0,0,0,0,0,0,848,0,0,36,631,0,0,0,0,0,1769, -0,0,0,0,0,144,0,0,0,0,0,0,0,0,0,0,369,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,247,0,0, -996,0,0,189,0,0,0,0,0,0,0,0,0,0,280,0,0,0,0,0,0,0,0,0,0,0,526,746,0,0,345,0,0,0, -1017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,651,428,0,0,0,1162,230,327,546,792,0,0,0, -1203,0,0,0,0,0,0,0,0,0,672,189,0,0,0,0,0,0,99,0,0,0,298,0,0,0,0,0,0,555,397,0,0, -0,0,0,1157,0,0,0,0,0,0,0,0,0,0,398,1523,0,366,0,0,787,0,0,0,282,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,157,0,941,0,0,0,0,0,1336,0,0,116,0,0,0,0,0,0,787,0,0,0,0,0,0,0,0,0, -0,170,160,0,1815,0,0,0,0,0,866,0,0,0,0,0,0,0,0,0,689,0,0,0,0,820,0,498,108,0,0, -0,1119,0,0,0,244,609,1005,0,581,0,0,0,0,0,895,0,0,0,1898,0,0,0,0,0,926,0,0,0,0, -0,0,0,0,0,0,0,0,0,538,496,294,301,0,0,0,18,0,0,757,0,0,0,0,0,1263,0,820,0,722,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2028,0,0,0,0,124,1875,0,0,0,881,0,0,0,1348, -0,0,0,0,0,0,0,911,0,954,0,0,0,0,414,0,0,0,0,517,0,0,0,0,0,816,0,0,0,0,0,0,0,0, -713,0,0,0,0,0,0,0,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,593,150,0,0,0,0, -0,553,0,0,0,0,0,0,0,0,0,0,108,0,0,0,0,420,0,0,0,0,0,0,0,0,0,0,0,1777,0,0,55,493, -0,0,81,0,321,980,0,0,0,0,0,0,0,0,0,0,0,0,0,0,362,112,0,74,0,0,0,0,0,0,0,625,0,0, -0,0,0,0,377,16,0,0,61,281,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,1031,0,0,0,0,0,0,51,0, -0,0,0,0,0,0,211,309,15,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,789,173,0,439,9,648, -0,0,294,0,0,0,0,0,0,0,374,8,0,1099,0,0,0,0,0,0,0,575,0,0,0,518,0,0,0,702,0,0,0, -0,0,0,87,0,0,0,438,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,464,122,0,0,0,1802,0,0,0,0, -0,0,499,0,0,0,87,476,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,840,283,0,0,0,0,1620,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,609,1160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,600, -323,372,0,0,0,0,471,722,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0, -477,1304,0,1774,0,0,88,0,438,12,0,0,0,0,0,0,0,0,671,997,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,639,22,0,0,782,681,0,0,0,0,0,0,0,0,0,0,1013,664,0,942,0,1349,0,0,0,0,0,0,0, -0,0,0,0,0,356,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,215,289,0,1975, -109,450,0,0,0,0,0,0,0,0,0,0,705,0,0,664,0,0,0,0,0,0,0,1238,0,0,318,0,0,0,0,0,0, -0,0,0,0,0,0,0,960,1872,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,0,0,0,0,0,0,0,0,0,239, -777,0,26,0,0,0,0,0,0,0,0,0,0,0,0,375,414,0,17,0,0,0,1350,0,955,0,0,0,0,0,0,0,0, -887,960,0,0,0,0,0,0,0,0,0,0,708,710,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,919,0,0,0, -0,502,280,7,45,0,0,0,0,777,0,0,0,0,410,0,1110,0,0,0,0,0,0,414,341,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,787,0,0,0,436,0,0,0,0,0,0,0,1707,613,377,96,0,0,0,0,451, -0,0,0,0,0,0,0,0,0,0,0,0,0,680,0,483,916,0,0,0,0,0,0,937,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,739,0,0,0,0,0,0,0,0,82,0,0,663,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,128,0,0,0,0,0,0,0,0,1087,0,0,0,0,0,0,0,503,0,0,0,0,0,0,9,113,104,324,0,460,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,935,702,434,485,1014,949,423,0,900, -0,0,0,0,0,0,0,2018,574,0,0,0,0,0,0,0,0,0,0,0,0,1206,0,0,0,0,0,0,0,0,38,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1022,0,0,0,0,143,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2029,0,0,0,0,0,0,0,0,0,0,0,0,523,0,0,0,0,0,0,625,0,0,425,37,0,0,0,1943,0,0,0, -0,0,765,0,0,0,0,0,0,0,0,0,0,551,0,0,0,0,0,0,0,0,0,0,0,0,168,0,0,1010,0,0,1994,0, -0,0,91,0,0,0,0,532,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1884,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,240,15,0,0,0,1227,0,1534,0,0,0,0,0,0,0,0,0,0,0,0,0,0,392,0, -0,0,0,0,0,0,0,0,0,0,0,655,562,395,0,0,0,501,1019,0,0,0,0,509,267,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1099,0,0,0,0,0,0,948,0,0,0,0,0,0,0, -462,114,0,0,258,404,0,1717,0,0,0,0,82,1061,0,724,0,0,0,0,0,1133,0,0,0,0,0,0, -1021,841,0,1021,0,0,0,0,0,0,0,0,0,0,488,373,37,0,0,0,0,564,0,0,0,0,0,513,0,0,0, -825,0,0,899,0,0,778,0,0,12,1417,0,1116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,114,545,0,5, -0,0,0,0,0,0,0,192,0,0,763,0,0,0,0,0,0,0,755,759,0,0,0,0,0,0,0,0,0,370,0,1237,0, -0,0,0,0,0,298,87,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,0,0, -0,0,0,0,814,991,0,757,57,0,0,0,0,0,0,0,0,0,540,0,0,0,0,608,0,0,0,0,0,0,0,0,1014, -0,0,0,902,0,0,0,0,553,1668,0,0,0,0,0,0,0,0,0,559,60,0,0,0,0,0,511,0,0,675,0,0, -156,0,0,0,0,0,0,709,0,698,0,0,0,1745,0,0,0,0,0,0,0,0,0,714,0,0,0,0,0,0,0,0,206, -8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,776,0,0,0,0,0,0,0,0,0,1272,0,0, -0,0,0,1059,0,0,0,0,0,0,406,0,0,0,0,0,0,0,0,0,0,947,0,0,0,0,0,0,168,0,0,0,0,0,0, -870,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,554,0,0,0,0,784,908,0,0,0,0,0,0, -0,396,358,0,0,0,0,0,0,0,0,2,228,0,0,0,0,0,0,0,0,0,0,0,845,14,0,716,1820,594,0, -81,1428,0,161,0,782,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,998,0, -0,0,0,0,0,0,0,0,0,0,0,1043,0,1496,0,0,0,0,0,0,0,0,781,0,0,0,0,0,0,0,817,1114,0, -1814,958,0,0,0,0,812,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,236,643,0,0,0,0,0,0,0,0,0,1172,0,0,0,0,0,0,0,0,0,1338,0,0,0, -0,0,0,0,0,0,0,0,54,0,0,0,256,0,0,351,0,955,1885,0,469,0,0,0,1270,0,744,0,313,0, -0,0,0,0,0,0,0,402,969,0,0,0,0,0,0,50,0,0,0,0,572,0,0,0,0,847,0,0,0,0,0,0,0,248, -43,0,369,0,0,0,0,0,0,0,0,0,0,0,0,0,766,0,363,0,0,0,0,0,0,0,0,0,0,0,678,0,0,409, -258,82,249,0,0,0,0,0,0,0,0,0,0,0,0,32,393,0,788,0,0,0,1281,509,1968,0,0,0,0,39, -291,0,0,0,589,0,0,54,1059,0,0,0,0,0,0,824,0,0,0,0,0,0,0,0,0,0,1005,0,1598,0,0,0, -0,0,919,0,0,0,0,0,0,0,0,52,132,0,0,0,0,0,328,0,0,0,0,173,0,0,0,0,0,65,1411,0,0, -0,0,0,0,0,0,0,0,442,0,842,0,0,0,0,0,0,0,0,0,534,0,0,0,0,0,0,0,0,0,0,0,0,0,845, -210,0,0,0,0,0,0,0,0,892,0,0,223,0,0,0,0,529,0,0,0,807,0,137,218,0,1444,0,0,0,0, -0,332,661,0,0,0,0,0,0,0,76,1517,0,0,0,0,0,0,0,0,0,0,0,418,0,0,0,0,0,0,0,0,481, -379,0,0,0,0,0,149,18,0,0,0,0,0,0,0,0,742,304,142,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,799,925,195,51,0,0,0,0,688,0,0,0,0,697,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1169,751,0,0,0,452,929,0,221,0,1437,0,0,0,0,955,1251,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,0,132,0,0,0,0,0,865,0,0,0,0,0,0,0,767, -672,42,0,0,0,1050,0,0,0,0,0,0,0,0,368,44,0,0,0,0,0,0,0,570,29,0,0,0,0,0,0,227,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,522,0,0,0,0,0,0,0,1529,0,0,0,0,0,0,739,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1667,0,0,0,0,0,0,132,511,0,138,208,1020,0,0,23,565,0,344,0,0,0, -0,0,922,0,0,0,0,0,0,0,240,0,0,415,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,402,0,0,754,31,716,0,982,731,0,0,0,0,0,0,0,888,0,0,0,803,847,0,0,823, -0,0,0,0,0,0,785,0,0,2,0,0,0,0,0,0,0,532,0,0,681,0,0,314,0,384,684,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,649,447,0,1818,1007,0,321,0,66,360,0,0,0,385,0,0,0,0,0,0, -0,900,73,254,0,0,0,0,683,1959,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,86,0,0,725,0,0,0,0,0,196,0,0,0,0,0,831,0,0,0,0,723,0,0,0,0,0,994,627,0,0, -0,0,0,0,0,0,0,0,764,66,0,0,0,0,205,36,0,0,0,0,0,0,0,950,0,0,0,887,111,0,0,831, -388,165,0,0,0,0,0,155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,780,755,0,0,0,0,898,146,0,0,0, -0,0,0,0,45,7,0,0,0,0,0,0,0,0,607,0,0,0,0,0,0,65,0,0,0,0,0,0,0,0,0,88,0,0,0,0,0, -621,600,0,367,0,0,0,0,0,0,0,561,0,559,0,585,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -287,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,672,157,0,0,0,0,714,0,0,0, -0,0,456,0,925,0,0,0,0,0,0,0,0,19,0,0,0,0,1473,0,0,0,0,0,0,0,0,0,0,113,0,0,0,0,0, -0,0,0,0,0,0,0,0,69,463,0,0,82,193,2,471,0,0,0,0,633,0,0,0,0,0,0,1148,129,1392, -542,803,0,0,0,0,0,0,0,0,0,0,0,0,438,0,0,0,0,0,0,875,0,0,0,0,0,237,0,0,0,0,0,0,0, -65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,563,0,0,0,9,444,0,0,43,1260,0,0,0,0,0,0, -971,0,0,699,0,0,0,0,0,1116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,829,242,0, -0,593,0,0,0,0,0,0,0,0,201,36,224,0,0,0,0,0,0,1430,0,1806,0,523,0,0,212,1889,0,0, -0,827,0,0,0,0,0,2043,136,242,0,0,0,0,0,0,284,148,10,0,0,0,0,0,0,1249,0,0,0,807, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,94,0,0,0,494,0,0,0,0,0,0,0,0,1510,0,0,0,0,0, -0,0,0,0,0,505,1306,0,0,764,268,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1703,0,0,0,0,159,964,583,0,0,0, -0,0,0,515,0,0,854,0,0,0,0,0,0,0,0,0,0,0,0,1123,0,0,0,0,0,0,0,136,0,0,0,0,0,1782, -0,0,44,1287,0,0,0,0,0,732,0,0,0,0,313,679,0,0,316,0,0,0,0,595,0,0,0,0,0,0,753, -147,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,137,0,0,0,0,414,0,1762,0,0,0,0,0,0,0,0, -0,0,0,599,0,0,0,0,0,0,0,0,0,1749,0,0,0,1627,0,488,0,0,0,0,0,83,0,0,0,0,676,0,0, -1639,0,0,0,0,0,0,0,0,0,278,0,0,0,0,0,0,97,0,14,1085,0,0,0,0,0,0,781,388,0,849, -59,229,0,0,0,0,0,1115,0,0,0,0,108,0,0,0,0,700,0,0,0,0,0,0,0,0,0,1414,0,0,0,0,0, -0,0,0,0,0,0,0,0,660,737,1035,0,0,0,0,0,0,521,690,0,0,0,0,0,0,0,0,0,0,0,0,272,0, -0,0,0,0,0,0,0,0,0,1744,0,0,0,0,0,0,128,733,0,0,277,0,0,0,0,0,0,0,0,0,4,0,0,0,0, -0,0,0,0,0,0,0,0,0,936,1981,40,0,0,0,0,0,0,0,0,775,0,0,0,0,0,0,0,0,0,306,0,0,0,0, -0,0,0,979,0,0,0,0,0,611,0,0,0,0,0,178,0,0,0,1969,0,0,0,0,0,0,0,664,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,390,0,0,0,1510,0,0,0,0,0,0,0,0,0,0,0,493,0,0,37,0,0,0,0,724,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,1537,0,0,168,473,0,0,0,105,0,0,0,0, -627,438,0,0,0,0,0,0,0,0,0,0,11,1256,0,0,0,1626,0,779,0,0,0,0,25,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,308,0,0,0,0,0,741,0,671,0,0,0,0,649,150,0,0,99,521,0,0,3,339,0,0,0, -543,0,0,0,0,0,0,0,0,0,1358,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,234,155, -0,0,0,0,0,0,0,1628,0,766,0,0,0,0,0,0,0,0,0,0,0,0,0,829,0,0,0,1445,0,0,0,486,0,0, -0,0,2,1635,0,0,0,0,558,0,0,0,0,0,0,0,0,0,0,1461,0,0,0,0,0,599,0,0,0,0,0,0,0,0,0, -1376,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,93,0,0,0,0,0,0,447,0,0,66,1432,0,0,0,0, -0,0,307,0,413,609,0,0,0,930,0,0,0,0,21,939,0,0,0,0,0,962,4,651,0,0,0,0,15,579,0, -0,0,0,0,597,0,0,0,0,0,981,0,0,0,545,0,0,0,0,0,0,0,1558,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,800,17,0,0,17,0,907,0,0,0,110,0,0,0,53,458,0,1983,0,0,0,0,0,0,0,0,0,0,443,0, -0,0,0,0,0,0,0,0,0,0,924,1844,0,1232,0,0,0,0,70,519,0,993,0,0,0,0,0,0,14,530,0, -907,0,0,0,0,0,733,0,0,0,0,0,0,0,0,55,0,188,531,56,0,0,1693,0,0,0,0,0,0,0,0,441, -0,192,928,0,0,0,0,0,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1525,0,259,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,512,185,0,464,1603,0,0,0,0,0,0,0,0,0,0,0,1113, -284,720,0,0,722,0,0,0,0,0,13,0,0,0,0,0,0,0,4,289,43,0,0,0,0,0,0,1694,0,0,0,0, -193,0,0,0,0,409,0,0,0,0,0,0,0,0,0,0,0,0,308,0,0,1863,0,0,0,0,0,0,0,0,0,790,0,0, -745,1002,0,0,0,0,0,0,0,0,0,289,68,477,13,0,0,0,0,0,0,0,0,0,0,609,0,0,0,0,0,0,0, -0,0,0,0,367,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,528,0,0,0,0,0,0,0,0,0,694,58, -548,0,0,0,0,0,0,687,0,0,0,0,1749,0,0,0,0,0,0,0,0,1004,661,0,0,0,0,0,0,445,0,0,0, -74,0,0,0,0,213,0,0,0,0,0,0,0,0,0,0,0,0,0,834,0,0,189,1672,0,0,0,0,0,0,0,1548, -192,0,0,0,0,0,0,0,0,0,0,0,0,0,32,751,0,78,0,0,0,0,0,0,544,1602,105,473,0,0,0,0, -0,0,156,1949,0,1779,0,0,0,0,0,0,0,0,0,0,0,763,0,0,0,0,0,0,0,0,29,0,0,0,0,0,0,0, -0,0,0,883,0,0,0,0,0,0,0,488,0,617,0,0,50,0,694,1518,785,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,546,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,1016,0,0,0,577,0,0,0,0,0,0, -184,935,114,720,0,0,100,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,95,14,0,969,0,0,0,0,0,0,0, -727,0,1021,0,0,0,0,0,1190,0,0,0,0,0,0,0,0,0,0,0,0,0,153,0,0,0,0,0,0,0,0,0,798,0, -587,0,0,695,42,0,1929,141,957,0,465,7,908,0,0,450,148,0,0,0,1166,0,0,0,0,0,0,0, -0,0,0,0,0,253,0,1003,0,0,0,0,0,0,0,0,0,0,0,46,0,0,879,0,806,0,1868,0,0,0,0,0, -1846,0,0,0,730,0,0,0,0,0,0,0,965,0,0,0,0,506,0,0,0,10,0,0,0,22,0,0,0,0,0,0,0,0, -0,0,0,0,0,960,296,0,0,0,0,0,0,0,0,0,0,0,587,0,0,0,0,20,0,0,0,32,982,0,0,0,0,0,0, -0,0,0,0,941,0,0,0,0,435,0,0,0,0,0,0,71,419,0,0,0,0,0,0,688,740,94,345,0,0,679, -582,0,0,0,0,0,0,0,945,0,0,0,0,0,0,0,0,0,0,0,0,539,0,684,1993,0,0,0,659,0,583,0, -803,0,704,0,0,0,0,0,198,181,347,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,481,405,203,0,0,99,826,0,0,0,0,0,0,0,492,0,408,0,0,0,0,0,0,0,0,0,0,4,0,0, -0,0,665,349,137,0,0,0,0,612,1270,0,0,0,0,0,371,0,0,0,826,0,0,0,0,21,1535,858, -374,0,0,0,0,0,0,311,0,0,0,991,1968,0,0,0,0,494,1647,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,769,0,0,0,0,0,642,0,0,157,123,0,0,0,1435,0,0,0,0,0,0,0,0,0,0,79,0,0,0, -0,0,0,1425,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,106,393,486,1690,0,0,0,0, -0,0,0,0,0,0,0,0,756,184,0,0,0,1382,0,0,0,175,0,1493,0,1007,0,0,0,0,0,0,0,0,0,0, -0,219,0,0,0,0,515,99,0,851,0,0,0,0,0,1278,0,0,0,0,0,0,0,1000,982,0,762,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,910,1819,0,0,0,0,0,0,906,0,0,0,0,0,0,0,0,0,0,1730,0,0, -0,0,0,0,0,0,0,0,0,1185,0,0,0,0,0,0,0,0,40,0,0,0,147,0,0,0,0,0,0,0,0,0,0,0,0,0, -650,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,30,0,553,0,0,20,597,0,1614,0,0,0,0,0,327, -49,0,0,0,0,0,0,0,78,0,0,786,134,0,0,0,12,496,0,0,0,0,0,0,0,0,0,0,42,204,0,614,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,147,247,0,0,0,0,942,0,0,2023,0,0,0,0, -0,0,67,285,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1309,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,532,0,0,0,0,0,0,0, -1692,0,0,0,0,55,1704,0,0,0,0,988,0,0,0,223,0,0,0,0,0,0,0,57,1123,0,0,0,0,0,1764, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2015,0,0,0,1599,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,129,0,0,0,0,0,0,0,0,0,0,0,534,0,0,0,0,0,0,0,0,0,0,0, -0,0,504,621,1248,321,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1397,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,441,75,0,0,0,0,0,0,0,0,0,0,841,0,0,0,0,0,693,0,650,314,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,913,0,0,0,0,0,0,0,0,0,0,0,0,0,0,880,0,475,0, -0,1016,179,602,111,329,0,0,0,1864,0,0,0,0,846,1888,0,0,780,0,0,0,82,0,0,0,0,821, -0,0,0,0,0,0,0,0,0,0,0,956,112,0,0,0,261,455,0,0,0,0,0,0,337,385,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,184,1865,0,0,721,16,0,486,0,0,0,265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,621,0,0,0,0,0,0,0,0,234,0,0,815,0,0,743, -1987,205,197,0,0,0,0,0,0,0,0,0,314,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219,452,589,0, -176,333,0,0,0,0,0,0,0,1110,47,0,0,0,0,0,0,0,0,0,0,0,864,0,0,300,0,1237,0,0,0,0, -0,0,0,0,0,0,0,1685,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,135,395,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,631,0,0,0,0,0,0,835,0,0,0,606,459,0,979,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,612,0,0,0,0,0,0,0,0,158,372,0,854,0,0,0,0,0, -0,0,1492,0,0,0,833,0,0,0,0,0,0,0,1739,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -195,0,0,0,0,0,0,0,0,730,1997,0,0,0,0,0,0,0,0,61,0,0,0,0,0,0,0,266,751,0,0,0,0,0, -0,0,821,0,0,0,715,0,0,0,868,0,959,0,0,0,0,0,0,0,0,0,0,0,1053,0,0,0,950,0,1081,0, -1595,0,0,0,0,59,0,0,0,0,0,0,0,0,0,0,47,684,0,0,0,0,0,0,1606,0,777,0,1020,0,0,0, -1094,0,0,0,0,0,0,0,350,0,0,0,0,0,0,242,1812,0,0,0,967,0,0,0,473,286,0,0,0,0,0,0, -798,629,222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,513,337,306,0,0,0,0,0,0,0,0,0, -146,0,0,1646,0,0,0,0,0,465,0,0,0,525,0,0,0,0,0,0,299,165,0,0,0,0,0,0,0,1064,0,0, -0,0,0,596,0,0,0,0,0,0,0,0,0,0,0,0,0,0,238,1741,0,1233,451,1824,0,0,0,0,733,495, -0,0,0,0,0,1204,0,0,0,559,341,0,224,21,0,0,0,0,0,0,0,0,97,1446,0,0,0,0,0,0,0,729, -0,0,565,727,0,1948,0,0,0,519,0,0,0,0,0,0,0,0,0,1193,0,0,0,0,0,0,790,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,323,2,201,0,0,59,0,0,34,0,896,961,0,1285,0,0,46,0,479,0,0, -0,0,549,0,663,0,0,0,0,0,783,65,682,0,0,0,0,0,11,0,0,0,0,0,522,0,0,0,52,0,0,0,0, -0,383,0,0,0,0,0,0,0,0,127,0,0,0,0,0,397,194,0,0,635,0,0,0,0,0,0,0,0,0,0,975,0,0, -0,0,0,0,0,0,0,0,116,0,51,0,0,858,0,1075,535,448,0,0,0,0,0,610,0,0,0,0,0,0,0,0,0, -0,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,267,673,319,94,92,0,551,0,0,218, -1406,69,256,0,0,952,1980,0,833,0,0,0,0,0,0,0,0,0,0,0,0,39,0,0,0,0,0,0,0,81,0,0, -0,352,634,0,0,0,0,0,618,0,0,0,0,0,0,73,339,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,759, -0,0,0,0,0,0,0,0,0,0,0,0,0,1075,0,0,0,0,0,0,482,649,0,0,0,0,0,0,0,0,386,336,0,0, -0,1035,0,0,0,0,0,0,0,0,0,0,0,924,0,73,0,0,0,0,0,1971,0,0,0,0,0,0,0,0,0,1344,0, -501,0,0,0,0,0,0,0,0,46,799,0,0,0,0,0,0,0,276,0,0,0,0,0,0,0,770,0,0,0,0,0,0,0,0, -0,0,0,0,0,158,0,0,0,0,0,1432,0,0,0,0,0,0,0,0,0,0,25,0,0,2001,0,0,0,0,0,0,0,0,0, -0,0,0,0,478,0,0,0,0,0,0,91,1461,211,602,0,0,0,0,0,0,0,0,0,1068,0,0,124,567,0,0, -0,1006,0,0,0,0,0,0,0,0,0,735,812,0,0,323,0,0,0,304,0,0,0,0,0,0,0,0,0,148,0,0,0, -0,0,0,0,0,0,523,0,0,144,730,0,0,981,0,0,111,0,0,132,0,0,0,0,0,0,890,0,0,0,0,0, -444,0,1787,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,2041,932,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,937,0,995,0,0,255,0,0,138,863,965,0,0,631,0,0,0,0,1394,16,652,0,0,0,0,0,0, -0,0,0,0,0,0,0,897,0,321,0,0,0,0,0,922,0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,844,0,0,0,0,0,0,1659,0,1100,0,0,0,1173,0,1930,268,251,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,390,711,0,0,0,0,0,0,0,0,0,0,0,0,0,744,0,0,0,0,0,0,0,0,0,624,0,0,0, -1998,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1125,0,0,0,594,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,268,0,0,0,0,0,0,0,563,0,0,0,0,0,0,0,0,2,39,0,0,0,1332,0,0,0,0,0, -0,0,508,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66,796,0,0,0,0,527,0,0,0,0,98,0,0,576,0, -0,0,0,0,122,0,276,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,645,0,0,0,0, -0,0,0,0,0,0,0,290,0,0,762,1292,0,0,0,1315,0,1955,0,0,0,0,0,0,0,0,0,0,210,131,0, -0,0,0,797,0,38,0,11,488,0,936,0,441,0,0,0,0,0,595,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -991,0,0,0,0,0,0,0,0,0,0,0,653,0,523,0,0,0,903,0,0,0,0,0,0,0,0,0,0,0,0,80,0,0,0, -0,0,0,0,0,0,432,0,0,314,0,0,0,0,232,1368,534,0,0,0,0,0,27,0,0,0,12,0,0,0,0,0,0, -0,0,0,264,736,0,1657,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1117,0,127,0,0,0,1208,0,1294, -0,0,0,0,364,0,0,0,0,0,125,1334,0,0,0,0,0,0,0,0,0,0,0,0,0,0,792,0,0,0,0,0,0,0, -849,699,0,0,0,0,0,968,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1446, -124,397,0,0,0,0,0,0,0,0,0,0,0,641,0,0,0,0,0,0,0,0,0,0,0,0,127,346,0,0,517,75,0, -0,0,0,0,0,0,0,83,0,0,0,0,0,0,1031,0,0,0,0,0,0,0,1470,0,954,0,0,345,304,410,0,0, -0,0,734,0,0,0,0,0,1822,0,0,0,1798,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,161, -1865,69,0,0,0,0,0,0,922,0,0,0,0,0,0,0,0,0,0,0,541,0,627,0,0,0,0,0,0,0,0,0,166,0, -0,0,0,0,0,0,0,0,849,0,0,0,0,0,0,0,717,0,0,0,0,0,0,0,0,0,0,0,0,0,0,600,0,0,0,0,0, -0,654,0,0,188,273,0,0,0,543,0,410,87,0,0,941,0,0,186,250,0,1785,0,0,0,0,0,1339, -462,961,0,780,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,529,0,0,0,0,0,0,474,1276,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,24,948,0,0,0,0,657,753,0,0,0,0,941,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,706,985,837,0,1861,0,0,0,0,0,0,0,0,0,0,0,0,0,0,292,933,0,0,0,0,0, -0,0,0,0,767,0,0,0,0,0,0,0,641,0,0,0,1233,114,0,883,0,274,2008,0,1794,285,0,0, -571,0,0,0,0,0,0,0,0,0,0,823,960,16,617,0,431,0,0,0,0,0,0,0,0,0,0,567,0,401,0,2, -781,424,33,0,2006,0,0,274,0,0,1882,0,794,0,0,0,1848,0,0,0,0,0,0,448,47,0,0,0, -1199,0,0,0,0,0,0,0,0,417,0,0,0,0,0,0,0,0,0,0,295,0,0,0,0,0,0,0,1019,0,0,0,0,0,0, -0,0,0,0,0,0,0,620,0,0,0,0,464,0,0,0,0,208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,442,0,930,0,0,0,0,0,516,68,0,0,0,0,0,1128,104,0,0,0,0,0,0,0,0,787,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,491,0,0,0,0,0,0,711,0,0,9,0,101,441,0,0,0,0,0,0,0,0, -0,0,160,396,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,679,326,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,1128,0,0,0,0,0,737,0,1796,0,0,0,0,0,0,0,0,0,0,0,0,338,574,0,0, -0,0,0,1096,491,405,0,0,0,0,0,1081,0,0,0,0,0,0,0,0,0,0,0,0,0,1676,0,1207,0,0,0,0, -0,0,969,354,0,0,0,0,598,0,297,0,0,0,0,0,0,0,0,1772,751,0,37,0,0,1828,0,0,0,0,0, -0,0,0,0,257,191,582,0,0,0,0,0,0,790,0,0,0,0,0,47,0,0,0,0,0,0,0,449,306,1011,0,0, -0,0,0,299,0,0,0,0,0,0,837,0,0,0,0,0,0,10,329,0,0,0,0,0,1320,0,0,0,0,0,0,158,657, -0,1191,0,0,0,0,0,0,7,0,974,1939,0,1665,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,288, -66,0,0,0,0,494,175,0,1643,0,0,0,0,0,0,0,0,570,750,719,0,0,0,0,0,0,0,0,0,0,0,0,0, -13,0,0,1247,0,0,221,356,0,0,0,0,0,0,0,0,0,0,694,1809,0,0,0,0,0,0,0,411,0,44,31, -0,0,0,0,669,0,673,0,0,0,0,0,0,0,0,0,1303,704,299,0,0,0,275,0,0,216,1761,0,0,0,0, -0,0,0,0,0,0,0,1319,0,0,428,0,0,0,0,0,0,0,0,0,0,514,0,0,0,0,0,0,49,55,102,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,364,0,0,0,0,379,0,921,971,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1258,0,0,0,1058,0,0,0,0,0,656,0,0,0,0,0,144,0,0,0,0,0,0,0,0,0,0, -0,1373,10,605,0,0,0,0,0,0,0,838,0,1012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,154,365,0,0, -0,0,0,0,0,0,0,340,0,0,0,0,0,810,0,0,0,0,0,0,495,0,0,0,0,0,0,0,0,0,261,0,535,248, -0,358,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,567,445,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,697,0,0,0,1336,0,0,0,0,0,0,0,0,917,174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,972,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,351,0,0,0,0,0,0,0,0,0,0, -0,0,0,286,0,0,56,438,0,0,0,0,0,1950,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,738,0,0,0,0,0, -0,0,0,0,0,969,2047,0,0,0,0,0,0,0,818,0,0,0,0,0,0,0,866,0,0,0,0,0,0,0,1467,0,0,0, -0,0,0,0,0,0,0,0,0,0,972,0,355,0,0,0,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,267,189,104,0,0,0,0,1613,0,0,0,0,0,0,0,116,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,886,0,86,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,45,0,0,863,0,0,0,0,0, -0,0,1953,450,1773,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,381,0,0,0,0,0,0,0, -0,0,0,0,0,1142,0,1189,0,0,0,663,0,0,0,0,0,0,0,846,0,0,528,0,393,378,0,0,0,0,0,0, -325,899,680,1880,0,1770,0,0,0,0,0,648,0,0,0,0,0,0,185,167,0,2046,0,0,0,0,0,0, -249,1645,0,152,0,0,0,1733,0,0,0,0,0,1006,0,0,0,0,0,420,0,0,0,832,0,0,0,0,0,351, -0,0,0,0,6,40,0,0,60,0,0,0,0,1354,745,724,0,0,0,0,0,0,0,0,772,1951,275,108,639,0, -0,0,0,0,0,0,0,0,500,1758,0,0,0,0,0,0,0,0,0,0,0,1886,711,205,0,0,965,865,0,0,0, -534,0,0,0,0,691,0,0,0,237,443,0,878,0,0,0,0,0,1410,0,0,0,0,0,0,0,0,0,0,0,0,0, -995,0,0,0,0,0,0,0,0,0,0,0,0,0,578,0,0,0,0,881,0,0,0,0,0,0,0,0,822,0,923,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,924,0,0,0,665,0,0,0,0,0,1901,0,0,0,0,0,950,498,93, -0,0,0,1451,0,0,0,0,0,747,828,788,400,184,0,198,0,0,0,0,0,0,0,0,0,0,0,994,0,0,0, -0,0,0,0,0,615,320,0,0,0,978,843,905,0,0,0,0,0,0,0,0,850,974,0,0,0,0,6,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,509,0,0,0,0,0,273,0,0,0,0,0,0,0,0,0,0,0,0,0, -201,0,0,0,1041,0,0,0,1040,0,0,0,0,0,0,0,0,0,693,234,774,0,336,0,1399,22,0,805, -802,777,167,789,0,0,1705,0,0,0,0,0,0,0,0,0,0,0,10,13,11,0,0,204,264,0,0,56,0,0, -1917,0,470,0,0,0,0,0,0,0,0,0,0,0,1198,0,0,0,0,0,0,0,0,0,0,1015,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,715,0,0,1002,0,0,0,298,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,867,0,0,724,0,0,0,0,0,0,0,0,0,0,0,0,768,0,0,0,0,0,1066,0,0,0,0,67,0,174,948, -0,0,0,0,0,0,0,0,0,0,0,0,0,764,0,0,0,0,75,137,0,756,0,0,0,0,0,0,1008,842,643,0,0, -0,67,0,0,0,0,0,0,0,0,0,0,0,135,821,0,0,0,0,0,0,0,0,736,0,389,355,0,0,786,0,0,0, -0,0,0,2044,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1030,0,0,0,1083,0,0,0,0,0, -1226,0,0,0,0,356,319,8,389,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,474,0,0,0,427, -0,413,0,730,0,0,0,0,0,373,0,0,0,0,0,0,0,0,0,799,0,0,0,1793,0,0,0,322,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,290,2,0,0,0,0,0,0,0,0,0,0,672, -699,1860,0,0,0,737,0,0,0,1612,0,0,0,0,0,0,0,0,0,0,0,145,124,884,0,0,0,0,0,387,0, -0,0,0,0,0,0,0,0,0,0,679,0,550,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1305,0,0,0,0,0,0,0, -576,0,0,0,0,0,0,0,686,0,607,0,0,37,0,0,0,0,0,0,0,0,0,101,1726,0,0,0,0,0,958,0,0, -0,903,0,0,0,0,147,0,0,0,0,0,0,0,0,0,0,0,367,0,0,0,0,690,0,705,273,0,0,887,0,0,0, -0,0,0,0,0,0,0,0,90,0,0,0,0,0,0,0,908,0,0,0,0,0,0,0,1261,0,0,497,1235,0,429,0,0, -0,0,904,0,12,125,0,0,0,841,0,0,0,0,0,860,946,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,768,0,770,160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,271,0,0,0,0,0,0,0,719,0,699,581,0,0,0,0,0,0,0,0,0,0,862,304,0,631,0,0,0,0,880, -1513,0,0,0,0,0,981,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,434,0,0,0,0,0,550,0,0,476,930, -824,553,0,0,452,0,151,0,0,0,0,0,0,772,0,292,135,0,0,0,0,0,0,0,504,0,0,1089,0,0, -0,0,0,0,0,0,0,0,0,783,0,0,0,0,0,0,206,393,0,0,0,0,0,0,0,0,232,912,0,0,0,0,0,977, -0,0,716,98,0,0,0,0,0,733,0,0,0,0,0,0,0,0,19,0,0,0,0,668,0,360,0,0,0,0,0,0,656,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,726,0,0,0,0,0,0,0,0,0,0,0,0,72,0,0,1269,0,0,463,0, -0,0,0,0,0,1454,0,1287,245,0,989,0,0,0,0,0,0,0,0,0,107,164,0,0,0,0,0,0,0,1061,0, -0,0,0,2,484,0,0,0,0,0,0,0,1127,0,0,0,0,0,0,0,460,0,0,0,0,0,932,0,0,0,0,0,0,0, -588,625,0,0,0,0,76,92,0,0,0,0,0,0,0,0,0,0,0,0,0,104,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -763,0,622,0,0,0,253,0,546,0,0,110,0,256,916,0,0,35,212,0,0,746,0,0,0,150,0,0, -1466,0,0,0,1299,0,0,0,0,0,0,0,0,0,1518,0,0,0,0,0,0,0,0,0,0,0,0,0,1229,0,0,0,816, -0,0,0,0,0,0,159,0,0,0,0,0,734,869,126,1716,0,0,0,0,0,0,202,232,0,0,0,0,212,0,0, -0,0,0,111,1003,0,0,0,0,0,0,0,0,0,0,0,1712,0,0,216,0,0,0,0,516,0,0,0,0,0,650,0,0, -0,0,57,99,0,0,0,0,300,574,0,0,0,0,1023,0,0,302,0,1871,0,728,252,0,0,461,0,0,0, -323,0,0,0,0,0,0,775,461,0,0,0,0,0,0,172,0,0,464,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,73,727,0,1023,0,0,0,0,0,0,0,0,0,0,577,0,0,0,0,0,0,0,0,1037,0,0,0,0,0,0, -0,0,280,677,0,0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,159,0,446,1730,0,0,0,0,0,0,0,0,0, -395,0,0,0,0,145,0,0,0,0,0,0,0,20,0,0,426,608,0,0,0,0,0,977,0,250,0,0,0,0,0,100, -0,0,0,0,1982,0,0,0,0,0,476,0,0,0,0,0,0,594,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,447,0,0,0,0,526,0,0,14,1124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,188,0,0,0,0,0,0,0,0,362,301,0,0,0,1743,0,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,872,0,831,0,0,208,202,0,0,0,0,0,0,0,1954,0, -0,0,0,516,872,0,0,313,224,0,0,24,0,11,546,0,0,0,1937,242,241,46,0,0,0,830,1273, -0,0,0,0,0,0,0,825,327,1006,0,0,0,0,0,1580,516,366,0,0,0,0,0,1736,0,0,0,0,0,0,0, -0,0,0,0,1935,0,826,0,0,0,0,139,331,0,0,0,0,0,0,0,0,0,0,0,288,0,916,0,0,0,0,0, -1888,0,0,0,0,0,0,0,1471,0,1570,0,394,0,0,0,0,0,0,0,1931,0,1719,0,658,228,0,0,0, -0,0,374,0,0,0,0,735,0,0,0,0,0,0,323,498,0,1063,0,0,0,0,155,0,0,0,0,0,0,0,0,906, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,616, -902,0,0,0,0,0,692,0,0,0,0,0,0,823,0,0,0,305,0,0,0,0,0,0,0,681,0,0,0,0,0,214, -1004,0,0,0,0,0,0,0,23,0,0,1703,0,0,0,0,0,0,0,0,0,1443,0,0,19,714,0,0,0,0,64,737, -0,0,345,1758,0,0,579,47,0,0,539,139,0,0,0,0,388,0,0,0,0,253,0,0,0,0,0,0,252,0, -745,0,0,0,0,0,0,0,0,0,0,0,504,107,0,871,0,0,0,229,0,0,0,0,0,903,0,0,71,0,0,549, -6,47,0,0,0,0,0,0,0,0,0,980,865,705,0,0,0,161,0,0,0,0,143,1331,0,0,0,1388,33,724, -0,0,0,19,0,0,0,395,0,0,0,0,0,846,210,0,0,0,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,695,937,497,0,0,0,0,0,718,0,0,0,0,0,0,0,1581,0, -0,0,0,0,0,161,49,0,0,0,0,0,0,0,0,0,597,0,0,0,1094,0,0,0,811,908,0,0,0,0,0,0,0,0, -0,0,1471,0,0,0,0,0,0,0,0,0,0,42,1935,0,0,0,2014,66,2007,0,0,586,0,0,0,0,0,0,0,0, -0,28,1077,0,0,0,1221,0,0,62,0,0,0,0,0,0,0,0,0,0,1766,0,0,0,0,0,0,0,0,0,0,0,0,25, -0,499,1388,0,0,97,10,0,0,0,0,0,481,0,0,0,0,0,0,0,0,0,0,37,134,155,486,0,1442,0, -0,0,0,0,591,0,0,0,0,0,0,310,1173,0,0,0,0,409,1156,0,0,0,482,0,0,263,926,0,0,0,0, -0,0,0,0,0,0,0,0,0,804,0,0,0,0,0,0,0,0,0,0,0,0,0,1265,0,415,0,348,0,0,0,1012,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,165,1803,0,0,0,0,0,0,0,408, -0,0,0,0,0,0,257,1321,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1138,0,0,0,249,0, -0,0,576,0,0,0,0,231,0,0,0,288,0,0,0,0,0,0,0,0,0,433,1487,569,1678,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,87,0,0,0,0,0,779,538,0,0,0,413,0,0,0, -0,0,0,0,0,0,0,495,0,0,0,0,0,191,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,530,567, -0,0,0,0,0,1484,0,0,0,0,0,0,815,609,0,0,0,0,0,484,0,0,0,0,0,0,0,0,0,0,900,0,0,0, -0,1335,0,1724,0,0,0,0,0,0,0,0,0,0,0,640,0,0,0,0,0,0,0,0,0,0,0,1831,0,0,0,0,0,0, -0,0,0,0,0,0,0,474,0,0,0,0,0,0,0,0,0,1103,0,1504,655,1034,0,0,0,0,0,305,0,0,0,0, -0,0,0,0,0,1236,0,0,429,217,0,0,0,0,739,278,0,0,0,0,0,0,0,708,0,0,0,0,0,1840,233, -0,0,0,0,0,0,0,0,2017,0,0,0,0,0,1488,0,0,0,1590,0,0,0,0,0,1800,28,0,0,0,0,0,0,0, -0,0,45,0,36,0,22,1442,378,0,0,0,0,0,0,1507,0,0,0,0,0,0,0,0,0,0,39,0,0,1054,725, -1955,0,2036,0,0,0,0,0,0,0,0,0,0,896,1871,0,0,0,0,0,0,0,0,0,0,805,0,0,0,0,2046,0, -0,0,0,17,712,0,617,55,320,271,0,0,0,0,0,0,0,0,0,445,0,184,103,0,0,0,0,0,0,0,0, -659,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,676,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -337,0,0,0,506,0,0,0,0,0,843,77,0,458,0,0,0,0,0,1420,382,109,142,330,0,0,0,0,0,0, -0,0,0,0,0,0,87,0,0,0,492,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1239,0,0,0,0,0,0, -211,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1049,0,321,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,1985,0,0,122,0,0,234,0,0,0,1098,0,0,0,0,0,0,549,253,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,522,131,0,0,149,0,0,0,0,0,0,0,0,0,0,0,0,0,0,507,0,0,0,0,811,630,0,0,0,343, -0,0,0,0,0,448,591,455,0,1381,0,0,0,0,0,0,0,575,0,0,0,0,0,1175,0,0,0,0,0,0,0,0,0, -653,0,0,0,1761,0,1198,0,0,0,0,297,1127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,678,0,0, -164,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35,0,45,0,0,0,0,0,121,0,0,0,0,0,0, -0,0,125,0,0,0,1622,0,0,0,0,0,721,145,0,0,0,970,792,0,0,0,715,0,0,0,0,0,1999,0,0, -74,531,0,0,65,0,0,0,105,220,0,0,0,0,0,0,0,960,0,0,0,0,0,0,428,19,0,0,401,96,0,0, -0,0,0,1595,116,0,1021,0,0,0,0,0,750,1961,0,0,148,0,0,0,0,0,0,0,0,0,0,0,0,0,75,0, -0,1383,0,0,0,0,0,0,0,0,0,0,0,0,0,0,779,0,0,0,0,0,0,0,0,598,0,424,0,0,0,0,0,0,0, -1222,0,0,0,876,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133,0,0,0,0,187,0,8,0,0,0,0,0, -0,0,429,0,685,0,0,0,0,0,0,0,0,0,0,0,132,472,0,0,0,0,0,0,0,0,0,938,0,0,874,0,0,0, -0,0,774,0,0,0,0,0,92,0,0,0,0,0,0,830,701,0,0,0,0,0,426,350,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,603,59,0,0,0,0,0,0,0,0,0,0,293,0,0,0,0,0,0,0,0,0,0,0,0,0,0,441,163,4,0, -0,0,0,0,0,0,0,0,806,0,0,0,0,0,0,233,0,0,0,0,1994,0,1739,0,0,393,0,47,1038,0,0,0, -309,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,363,0,0,0,175,0,0,0,0,0,0,0,666, -0,0,1675,0,1600,0,0,0,808,0,0,0,0,0,0,0,0,0,0,0,280,54,0,0,0,0,0,0,0,0,421,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249,0,0,103,254,0,262,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,805,0,0,0,0,0,0,0,0,0,1630,0,0,0,0,0,0,0,0,0,0,0,0,0,671,972,989,0,0, -0,0,0,0,0,889,0,0,0,1382,0,0,0,0,0,0,0,775,0,0,0,0,0,0,0,0,0,0,388,202,0,0,0,0, -16,560,0,0,0,841,0,0,566,0,0,0,938,0,0,0,0,0,0,0,0,0,0,912,0,0,0,1361,0,0,0,0,0, -0,618,236,0,1854,0,0,318,190,0,1376,0,0,0,0,0,0,0,349,0,0,0,0,951,1972,0,0,0,0, -0,0,344,0,0,0,0,0,0,0,0,850,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,910,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,0,163,85,0,487,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,145,0,83,0,0,1013,0,0,0,1922,0,0,169,557,66,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1193,82,0,352,454,57,0,0,1333,396,107,0,370,0,0,0,0,0,0,0,0,0,204,0,0,0, -0,0,1706,0,0,0,0,0,0,0,0,0,0,0,0,394,1204,0,0,0,0,0,1007,0,0,0,1696,0,1519,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,981,0,0,0,0,1072,0,0,0,712,0,1629,0,0,0,0,0,0,0,728,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1271,0,0,0,1608,16,0,0,0,0,485,0,0,0,0,0,0, -153,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1991,0,0,0,0,0,0,0,0,52,0,21,0, -0,0,0,0,0,0,0,0,819,0,0,0,0,0,917,0,0,0,0,784,0,0,0,0,135,0,0,0,0,0,454,0,0,0,0, -0,0,0,0,0,852,1719,0,0,0,0,0,852,0,0,0,0,0,952,0,0,0,0,568,0,0,0,0,0,448,0,0,0, -67,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1826,657,0,729,666,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -669,0,0,0,0,0,0,0,402,0,0,152,0,0,0,0,912,0,0,0,0,0,0,51,320,0,445,0,0,0,0,308, -0,0,0,0,0,386,0,0,239,0,0,130,83,0,143,0,348,0,0,0,0,0,0,0,958,0,0,0,0,0,210,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,430,0,0,0,0,0,0,0,0,0,0,0,0,7,213,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,801,0,0,0,0,0,0,0,0,0,936,0,108,0,0, -0,0,0,0,0,0,0,885,587,219,398,364,0,1165,0,0,342,241,303,0,0,0,0,0,0,0,0,0,0, -1454,0,0,0,0,0,0,0,0,0,0,254,562,0,786,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1294,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,493,216,0,0,0,0,219,341,0,0,0,0,0, -0,0,0,0,0,130,1734,154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,701,604,0,0,879,0,195, -666,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1669,0,0,0,1791,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1228,0,0,0,0,0,623,0,0,0,0,0,0,0,798,0,0,0,0,0,0,0,0,0,0,0,0,84, -122,0,0,0,837,0,0,0,0,0,0,1013,0,0,577,0,0,0,460,932,0,0,0,0,0,0,0,0,0,0,0,31, -131,0,0,0,605,0,0,0,1246,0,0,0,0,68,278,165,307,781,0,0,0,0,0,0,33,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,1113,0,0,720,1953,203,0,0,0,0,0,0,0,425,326,0,0,0,0,0, -0,0,0,0,0,241,1316,0,0,0,0,0,416,0,0,0,1300,0,847,0,0,662,358,0,0,0,0,839,1823, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,654,1522,0,0,0,0,0,0,163,0,0,0,0,0,314,978,0,0,0, -601,0,0,0,0,0,946,434,0,0,0,402,411,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,1467, -410,0,0,0,0,0,0,0,0,0,0,0,0,0,0,483,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,677,0,0,0,0,0,0,0,0,0,0,0,0,70,0,0,0,0,1405,0,0,0,0,0,0,108,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,777,0,0,0,0,0,747,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,505,0,326,0,0,164,628,654,0,0,0, -37,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,668,152,0,0,0,0,0,0,0,0,0,0,0,581, -0,0,0,0,44,126,89,0,0,0,0,0,0,0,0,1531,0,0,0,0,0,0,0,0,203,1167,0,0,0,0,0,0,0,0, -531,1232,0,0,0,0,0,943,0,670,231,880,0,1617,0,0,0,1957,0,0,0,0,0,0,0,975,0,0,0, -0,0,0,0,0,0,0,0,242,0,0,0,0,0,0,0,0,0,421,0,0,14,834,0,0,0,0,0,0,0,0,0,0,0,0, -465,0,0,0,0,0,834,688,413,855,0,0,0,590,0,0,0,0,0,0,0,0,114,0,0,0,0,0,0,0,0,0,0, -0,45,169,0,0,0,0,0,0,0,0,0,0,0,198,0,0,565,585,0,0,0,0,0,0,0,0,0,0,0,0,0,691,0, -0,0,593,0,0,0,0,0,0,0,0,0,913,116,0,0,0,0,1360,0,0,0,802,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,673,308,0,709,1006,1895,0,228,0,0,0,1840,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,608,0,0,0,0,0,0,0,0,0,1573,0,2039,136,540,0,0,0,0,0,0,0, -897,0,0,938,1878,0,0,0,0,0,0,0,0,0,1469,0,999,0,299,0,0,0,0,0,0,0,578,0,0,0,0,0, -456,0,0,0,1679,163,693,0,0,0,0,0,0,48,755,0,0,0,0,0,0,0,0,0,0,0,0,338,0,0,0,0, -1091,0,0,0,0,695,0,0,1464,0,0,0,0,0,975,0,0,335,0,0,1979,0,0,0,0,269,1566,630, -396,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1815,634,0,0,0,966,0,0,0,0,0,0,0,9, -412,0,958,0,0,579,382,0,212,0,0,0,0,965,681,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,655, -0,0,0,0,67,0,0,0,0,0,0,751,0,0,0,0,423,231,0,0,1016,300,0,0,0,0,100,237,0,0,0, -1370,0,0,0,1208,0,0,0,0,0,1219,129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199,0,0,427,0,0, -0,0,949,665,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,712,0,0,0,0,0,1186,0,0,0,0,0,0,0,0,0,0,295,312,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -151,0,0,0,0,588,4,0,0,0,0,0,414,104,0,0,757,263,0,561,0,0,0,320,0,0,0,0,0,0,0,0, -0,0,0,225,0,0,0,0,37,817,0,974,0,0,0,0,0,0,0,0,0,0,0,0,0,2026,131,235,16,0,590, -1157,0,0,0,0,0,0,0,0,221,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,390,0,0,0,0, -0,0,0,1144,0,0,0,464,0,0,0,0,0,0,0,0,0,0,0,0,204,407,303,1218,0,0,0,0,5,325,0,0, -0,0,12,800,0,1783,0,0,0,0,0,0,0,0,0,0,504,621,0,0,0,0,0,0,0,0,0,920,0,376,0,0,0, -0,0,218,580,0,768,454,0,0,0,0,0,0,0,0,0,0,0,0,676,0,0,0,0,0,0,164,0,0,0,0,0,0,0, -0,50,0,0,0,0,0,0,0,0,0,0,0,0,0,120,285,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,226,343, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,0,0,1812,0,0,8,0,0,0,21,1125,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,1327,0,0,0,0,575,1598,0,0,0,0,0,0,0,0,0,895,0,0,0,959,0,0, -0,0,0,1759,173,0,0,0,0,266,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1427,0,0,300,1033,0,0,0,0,0,0,0,0,0,0,0,584,0,0,0,0,52,734, -0,0,217,239,0,1129,0,0,0,0,0,0,0,0,732,20,0,0,0,0,0,0,0,0,0,0,0,418,0,0,0,613,0, -0,0,0,0,0,0,0,0,632,0,0,85,984,0,0,0,0,909,694,7,1109,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,167,0,0,0,0,280,62,0,0,33,0,0,359,186,980,0,0,0,0,0,0,0,0,0,0,0,585,0,0,0, -211,0,0,336,145,0,1130,0,873,0,0,840,263,0,0,0,0,0,0,0,0,0,916,0,0,0,0,0,0,0,0, -0,0,155,0,0,0,461,97,0,0,0,0,0,1356,0,0,0,0,0,0,0,593,0,0,0,0,0,1392,0,0,0,0, -126,0,0,0,0,1179,0,0,0,0,0,162,0,0,0,0,0,765,0,187,0,1286,0,0,0,0,0,0,0,0,0,635, -0,0,23,215,0,0,0,1306,0,0,97,716,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,657,0, -0,0,0,0,0,0,0,299,0,0,0,0,0,0,134,0,0,0,0,0,0,0,0,0,0,0,658,1082,0,0,0,0,0,2002, -0,0,0,0,0,0,833,248,0,0,0,0,0,1654,0,0,531,0,0,0,0,0,0,634,0,0,0,0,0,0,0,0,0, -853,573,249,0,0,0,0,0,0,0,0,527,0,0,0,0,1419,0,0,0,0,0,0,20,49,0,0,0,992,0,0,0, -728,0,0,0,0,0,0,0,0,0,0,0,0,497,1579,0,0,0,0,62,268,0,0,0,0,0,0,0,1201,0,0,0,0, -0,0,0,0,0,0,0,0,495,193,0,0,0,0,106,0,0,859,0,0,23,0,0,0,0,0,0,0,813,925,0,0, -223,613,953,0,0,0,0,0,0,0,0,666,0,0,0,0,0,0,0,0,0,670,0,0,40,216,0,0,0,0,0,0, -259,0,0,0,440,1114,0,0,0,0,0,0,0,0,74,475,0,0,188,139,0,797,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,1572,0,0,0,0,39,0,0,0,0,0,0,0,0,0,0,0,0,1594,0,0,0,0,0,0,0,290,0,232, -0,0,887,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,521,14,0,0,0,0,0,741,0,0,0,992,0, -0,0,0,0,0,0,0,111,0,0,425,0,0,0,0,0,789,0,0,0,1593,0,1768,0,0,233,0,0,0,0,943,0, -0,0,0,0,0,0,955,225,245,0,0,0,0,0,0,241,0,0,0,0,1943,0,0,0,1284,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,709,0,0,0,0,0,0,554,0,0,0,0,0,0,0,0,1564,0,0,0, -443,0,0,0,0,0,0,280,0,0,0,0,0,0,0,0,729,0,0,0,348,0,0,0,0,0,0,0,758,848,298,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,829,1422,189,121,0,0,632,812,0,0,556,0,0,0,0,0,436,172, -530,844,232,984,0,0,0,0,0,0,0,0,0,0,147,0,0,0,0,0,0,0,0,537,0,0,0,0,0,859,0,0, -842,0,0,0,0,0,0,0,0,0,0,1291,0,0,0,0,0,0,0,0,0,0,0,1482,612,392,0,0,0,262,31,0, -0,0,0,0,0,0,0,0,0,753,549,0,0,0,0,0,0,696,0,0,0,0,0,0,0,834,0,0,0,0,0,771,0,0,0, -0,0,0,0,0,0,0,0,0,0,921,0,0,0,674,0,0,0,0,0,0,0,0,0,0,308,444,0,0,0,0,0,0,805, -180,0,0,278,271,0,0,214,505,0,1215,0,0,0,0,0,0,387,271,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,1645,42,92,0,459,0,0,330,1557,0,0,0,0,0,0,0,0,113,18,0,0,0, -1742,0,0,0,965,0,0,0,0,0,0,0,0,0,0,0,0,0,182,0,0,65,0,0,0,0,0,0,0,0,0,0,0,0,973, -0,0,0,0,0,328,0,0,588,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1786, -0,0,962,1985,0,0,0,308,508,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,588,0,0,0,0,0,0,614,793,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,290,0,0,0,0,0,0,0,0,0,0,1136,0,0,0,0,0,0,0,0,0,0,796,719,0,0, -326,210,0,0,0,701,758,472,0,0,0,1947,278,1079,0,0,0,0,0,0,497,41,0,0,634,46,961, -0,810,524,0,0,33,0,0,0,0,0,0,0,0,0,0,0,0,532,0,997,0,0,0,0,0,0,0,0,0,0,0,1301,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1298,0,671,0,0,0,306,0,0,0,0,0,0,0,0,0,0, -693,1823,0,0,0,759,0,0,0,0,0,1932,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,182,0,0,0,1964, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,521,0,0,0,0,0,0,424,857,0,0,0,0,671,328,0, -529,0,0,0,0,0,716,0,1509,80,67,0,0,0,0,59,141,0,0,0,0,0,0,783,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1498,0,0,0,0,343,430,803,1183,677, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1357,53,0,0,0,0,590,0,0,0,0,0,0,0,0,0,0, -0,0,0,329,0,0,0,0,0,0,0,469,0,0,0,0,0,0,0,0,0,0,460,0,0,1743,0,0,963,340,0,0,0, -0,0,1603,0,0,250,0,0,0,0,0,646,218,0,1794,0,0,0,571,0,455,0,0,0,1012,0,0,0,0,0, -0,0,0,0,0,0,0,597,161,0,349,0,524,0,0,0,0,0,0,0,0,0,0,0,0,322,432,0,0,0,0,0,0, -325,223,0,0,0,0,0,566,0,0,0,1394,481,436,0,48,457,610,756,618,0,0,0,755,0,1217, -0,0,0,0,0,197,0,0,0,0,0,0,0,0,0,0,0,0,0,0,544,492,107,414,0,0,0,0,0,0,0,0,0,0,0, -1007,0,0,0,0,5,0,0,1580,0,0,0,0,0,0,0,0,0,0,0,0,0,673,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1843,0,0,0,0,0,0,0,0,0,165,0,0,0,0,0,0,809,885,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,498,0,0,0,306,9,0,0,0,0,0,0,0,437,721,146,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0, -0,0,0,1377,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,0,959,0,0,0,1928,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1435,0,481,0,0,0,0,0,0,142,84,0,0,0,0,0, -1015,0,0,0,315,0,0,0,0,0,0,759,0,0,0,0,0,0,0,0,712,0,0,0,1722,0,0,0,0,0,0,0,0,0, -0,0,0,222,0,985,1414,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1273, -538,706,0,0,0,0,0,0,0,0,115,0,0,0,0,0,0,0,0,0,0,1781,0,0,0,0,0,431,97,665,42, -237,0,0,0,264,0,0,213,0,0,0,0,0,0,0,455,0,0,0,906,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -624,0,574,0,0,0,0,0,0,0,0,0,0,0,0,354,0,0,0,1558,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68, -235,723,1813,0,0,0,957,0,830,0,0,0,0,0,0,0,0,0,0,0,0,23,0,0,496,0,0,0,0,0,0,0, -547,239,88,0,0,0,0,0,0,0,0,0,1310,0,0,0,0,0,0,0,0,80,1076,0,0,118,0,0,0,479,274, -0,0,0,0,0,0,0,0,0,0,0,497,0,0,669,261,0,0,0,0,13,0,0,0,0,0,0,791,250,642,0,0,0, -1429,939,949,0,0,0,0,0,0,0,0,0,0,0,0,0,818,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,982,330,0,0,0,0,545,0,0,0,0,0,0,947,0,1188,0,0,0,0,0,904,0,0,0,0,0,1372,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,693,377,0,0,0,0,0,0,0,0,0,0,0,0,0,0,695,0,0, -713,386,0,0,0,0,128,1575,0,0,0,0,0,0,424,893,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,904,0,0,0,0,0,552,322,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,1808,49,0,0,0,0, -1832,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,421,0,0,442,415,0,0,289, -0,0,0,0,0,206,110,0,0,0,0,0,205,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -19,1539,0,0,0,0,0,1340,0,1194,0,0,0,0,0,0,0,0,549,0,0,0,0,0,0,0,0,1720,0,0,0,0, -0,0,0,0,0,319,0,0,0,0,112,1180,0,0,0,0,0,0,0,0,0,0,0,967,0,0,0,0,0,0,0,0,0,1940, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,735,0,0,0,0,0,0,0,0,0,897,132,0,0,0,0,0,0,0, -0,0,0,38,838,0,0,0,379,218,8,660,1017,0,0,0,0,0,0,111,387,647,877,0,0,53,790,0, -0,0,0,0,0,0,0,458,0,0,0,0,0,0,954,0,0,0,394,0,1367,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,882,0,0,0,0,0,0,0,1409,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,124,342,199,0,0,0,0, -0,0,0,0,0,0,724,628,0,0,0,0,804,266,0,0,0,0,0,208,0,79,0,0,0,0,0,0,0,0,741,0,0, -0,0,0,0,0,0,0,0,606,0,1494,821,1553,0,0,135,405,0,0,178,100,0,0,0,0,0,0,0,0,0,0, -0,0,0,481,0,0,0,1378,0,0,0,0,0,0,0,0,0,0,0,0,0,791,33,1227,857,0,467,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,447,0,0,0,0,0,0,86,128,0,0,0,0,0,0,587,0,0,0,692,1018,0, -195,0,0,0,0,0,0,0,1546,0,0,0,0,0,0,0,0,0,0,0,684,0,0,345,0,0,0,0,0,0,365,0,1683, -0,0,472,0,433,0,0,0,0,0,0,0,28,0,0,0,997,0,705,3,0,0,0,0,0,0,0,0,0,229,0,0,0,0, -102,0,0,0,0,866,1022,0,0,0,0,0,0,0,0,0,55,0,115,0,0,0,0,933,0,0,0,0,0,0,0,702,0, -0,0,0,0,0,0,1728,26,484,0,0,0,185,618,417,0,803,0,0,0,0,0,0,0,0,0,0,0,1262,0,0, -0,0,0,0,0,0,0,0,0,0,0,633,0,0,0,0,0,0,0,0,0,0,0,0,0,479,262,0,0,0,0,0,0,830,0,0, -0,0,26,70,0,0,0,0,0,0,0,0,217,0,640,51,0,0,360,1586,0,0,0,0,0,652,0,0,0,0,0,766, -0,0,0,0,298,737,0,0,0,0,0,0,0,0,0,0,655,222,906,0,0,1013,991,2009,0,0,0,0,503,0, -0,0,216,154,0,0,0,716,0,844,0,0,0,0,621,252,0,0,0,0,748,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,103,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,576,0,0,0,648,0,0,0,331,0,0,0, -0,0,0,0,0,0,0,0,0,632,0,0,0,518,107,0,0,0,0,0,0,0,0,851,0,0,0,0,504,0,0,0,0,0,0, -0,0,0,0,0,0,7,883,0,0,0,0,0,0,0,922,0,0,0,0,0,0,0,0,91,993,0,0,0,0,0,0,200,131, -10,0,0,0,0,0,0,0,0,0,0,0,0,0,365,1433,0,0,0,0,28,103,0,0,798,1013,0,0,0,0,0,0,0, -0,39,1925,0,853,0,0,271,519,0,0,0,0,338,0,0,300,470,419,0,0,0,0,0,0,836,0,0,0,0, -0,0,1937,0,0,0,0,0,393,0,0,357,0,0,0,0,0,703,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,387,0,0,0,0,0,0,75,708,453,1351,0,303,0,0,772,0,0,0,0,0,0,0,0,749,0,0, -0,0,0,0,0,0,0,0,0,0,0,1065,0,0,717,226,0,0,0,0,0,890,431,626,0,0,0,0,706,0,0,0, -51,698,0,0,0,0,0,0,0,0,0,0,0,828,0,0,17,0,0,0,0,1929,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,871,498,0,101,1793,0,0,0,0,0,0,435,0, -0,0,0,0,966,0,129,1644,0,0,0,0,0,0,0,0,0,0,0,0,0,997,502,0,0,0,0,0,0,0,0,0,0,0, -0,823,0,1927,0,0,0,0,98,1756,0,0,0,0,0,0,0,0,0,0,0,0,8,0,160,1046,0,492,0,0,0,0, -0,0,129,45,0,0,0,0,0,0,353,558,0,0,0,0,0,785,0,0,0,1145,189,0,0,0,26,353,0,0,0, -0,0,2024,0,0,0,606,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,855,0,0,0,0,0,0,0,0,0,0,0, -0,0,2011,0,0,5,4,0,0,461,764,0,0,0,1449,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1445,0,0, -0,1168,0,0,0,233,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,216,0,0,0,286,0,0,0, -3,0,0,0,723,536,0,0,0,0,0,285,0,0,0,560,0,0,0,0,0,690,0,0,0,0,0,1246,0,0,63,0, -33,0,0,0,0,0,520,1862,0,0,0,0,0,0,0,0,0,0,0,0,630,0,0,0,0,554,0,0,0,0,0,1001,0, -0,0,0,0,446,0,0,0,0,0,0,0,1313,0,0,837,636,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,278, -0,0,0,0,0,0,0,0,868,0,0,0,0,1010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1231,0,304,0,506,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,0,93,1408,794, -843,704,0,285,114,485,898,145,0,19,2035,0,0,0,1933,0,0,0,0,0,0,0,1728,0,0,0,0,0, -0,0,0,746,0,0,0,0,0,0,0,995,1964,0,0,0,0,0,0,0,0,0,0,0,1550,0,874,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,1018,0,0,0,814,126,0,0,1264,0,0,814,955,0,0,0,0,0,0, -0,981,0,0,0,0,0,0,0,0,915,56,0,0,100,0,0,0,0,0,0,0,0,0,638,0,0,0,0,738,0,0,0,0, -0,0,0,0,0,758,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1112,0,0,214,0,0,0,133,0,196, -168,0,0,0,0,0,1152,0,1245,0,0,538,169,871,1816,0,0,413,133,0,0,0,978,0,0,43,93, -371,0,0,0,0,0,0,526,25,0,754,335,0,0,0,0,182,0,0,0,0,0,0,0,0,0,0,0,39,601,0,0,0, -0,0,0,0,181,370,0,0,1652,358,0,0,0,0,0,0,0,0,0,176,286,0,788,0,0,0,0,0,1223,780, -254,1003,896,0,0,0,1447,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,744,0,0,0,0,0,126,0, -41,788,0,0,0,629,0,0,0,0,0,0,0,0,0,0,0,293,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,420,37,1900,0,0,0,0,542,1570,957,0,0,0,0,0,0, -0,373,31,0,0,0,0,125,325,0,0,0,0,0,0,323,0,0,1547,0,0,0,0,0,0,0,0,0,0,0,0,0, -1216,0,0,0,0,0,0,198,1905,629,15,0,0,0,0,0,0,20,75,543,1353,0,0,0,533,0,0,6,0,0, -0,0,0,0,538,0,0,0,0,0,0,0,0,0,0,0,338,0,0,0,0,11,0,0,0,284,659,0,989,0,0,0,0,0, -0,0,0,0,848,0,0,507,0,0,0,0,0,0,0,0,188,991,884,0,0,0,0,60,959,0,0,0,0,0,1653,0, -0,922,337,0,638,0,0,500,0,0,0,0,0,0,0,0,0,0,0,166,0,0,0,0,0,0,0,0,0,0,0,0,418,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,760,0,0,0,0,0,0,1277,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,770,0,0,0,0,0,0,0,243,89,0,0,0,0,0,0,0,0,0,1396,0, -560,0,0,3,1658,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,586,0,0,1271,0,0,0,505,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,637,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1947, -41,445,0,0,0,0,0,0,0,0,57,189,0,0,371,0,0,0,0,552,0,883,0,923,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,875,0,0,0,1788,49,0,0,0,0,0, -0,0,0,0,0,0,661,0,0,1945,0,0,0,0,0,794,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,1135,0,0,0,745,0,0,0,0,0,0,0,84,0,0,0,0,0,0,0,410,0,976,0,0,0,0,0,703,0,0, -0,0,0,0,187,322,0,0,0,227,0,0,0,0,560,0,31,1395,0,0,0,0,0,466,0,0,0,0,643,167,0, -0,0,1428,0,412,0,0,0,0,0,0,0,0,0,1118,562,0,0,0,0,0,256,0,0,0,0,0,0,1771,0,0,0, -0,0,1190,132,0,66,0,0,0,0,0,0,0,0,0,0,317,0,0,0,63,0,0,0,0,0,0,0,1475,0,0,0,0,0, -0,0,288,0,0,0,0,608,0,0,0,0,0,0,0,0,1225,0,1189,0,0,0,0,0,0,0,1468,0,0,0,0,0, -689,120,0,0,0,0,0,0,0,1,0,329,0,0,0,0,226,0,0,0,0,0,1855,0,0,461,0,0,0,0,1346,0, -0,0,0,0,85,0,0,299,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1171,0,0, -0,980,0,0,0,0,0,0,0,0,637,279,0,0,0,0,0,293,0,0,0,0,528,17,0,0,0,0,5,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,0,0,0,0,0,0,0,601,0,0,0,0,0,0,779,0, -196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1322,737,752,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,412,192,80,0,0,8,1470,0,0,0,0,0,0,0,0,0,873,0,0,0,0,0,835,0,0,0,0,256, -38,986,0,0,0,0,0,0,0,0,0,91,257,278,911,0,0,0,0,0,0,0,0,749,151,0,0,0,0,0,0,0,0, -0,0,0,0,989,0,0,990,0,0,90,194,0,0,0,0,0,425,0,0,0,0,0,774,0,0,0,0,0,0,0,0,0,0, -646,827,752,0,0,0,662,0,22,21,0,0,0,0,0,0,95,239,0,0,0,431,0,0,0,0,0,874,0,0, -265,65,0,0,0,1350,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1887,0,0,0,0,0,0,0,809, -0,696,0,1074,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,630,0,0,802,0,0,0,56,776,0, -970,0,0,797,0,0,0,0,0,400,0,0,1951,0,0,41,0,11,118,0,0,0,0,0,0,0,0,251,615,0,0, -0,1044,0,0,0,0,0,0,0,0,0,0,0,225,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,370,0,0,0,0, -104,48,209,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,930,0,0,0,0, -0,0,0,0,0,0,0,1286,0,759,0,120,385,0,0,0,429,0,0,0,0,0,0,0,0,820,0,0,0,0,0,0, -199,0,10,151,0,0,0,761,365,0,0,0,0,0,0,0,0,0,46,1086,0,0,0,0,11,1624,58,344,0,0, -1008,1868,0,0,0,888,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,711,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,440,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,914,1913,0,958,0,885,0,0,0,0,0,0,0,0,0,0,0, -0,0,847,276,0,302,65,0,0,0,510,0,1514,0,0,0,0,0,0,152,291,0,0,0,0,0,0,0,0,0,0,0, -0,282,589,0,0,0,0,0,0,0,0,0,0,0,0,0,130,0,0,463,42,0,0,0,0,0,372,0,0,0,0,0,0,0, -0,0,680,0,0,0,0,0,0,0,0,977,1997,0,0,0,810,0,0,0,0,0,0,0,0,0,1390,0,0,0,644,0,0, -867,982,0,0,0,0,0,0,0,540,0,123,0,0,0,1978,0,0,0,0,789,623,0,1723,0,1220,0,0,0, -0,0,0,0,480,0,0,0,0,0,0,0,0,0,0,0,888,0,0,0,0,0,0,0,0,0,0,0,0,299,1995,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,788,179,0,0,0,0,0,0,431,156,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1373,39,80,196,0,0,507,0,0,0,646,0,0,0,0, -0,1214,0,0,0,0,926,0,0,0,1,114,0,0,0,0,0,446,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,490,0,0,0,491,0,1584,0,0,507,250,0,0,0,158, -10,362,1,0,0,0,0,0,0,0,0,0,408,228,860,480,0,779,0,0,0,557,0,0,142,197,0,0,0,0, -0,0,0,0,0,0,0,1490,11,378,316,1057,0,0,18,579,299,1546,0,177,0,0,0,0,0,0,0,0,0, -411,0,0,0,0,727,439,0,0,0,0,0,1528,0,0,0,0,0,0,58,0,482,0,0,0,505,1952,0,0,0,0, -0,0,0,0,0,0,0,242,0,0,0,0,0,0,0,953,0,0,0,0,802,0,0,0,0,0,0,0,0,0,0,290,0,0,791, -52,0,0,0,0,0,0,0,0,0,0,0,112,0,0,0,0,0,1028,0,0,138,0,0,0,0,1811,0,0,0,0,0,0, -934,1821,0,0,0,0,371,38,0,0,0,1296,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,723,0,0,0,0,0, -0,0,0,0,0,0,0,0,1330,0,0,0,0,0,0,0,1255,296,109,0,0,0,0,0,660,0,0,0,0,270,591,0, -0,0,0,0,0,0,1090,81,0,0,0,0,391,0,0,0,0,249,322,0,0,0,0,0,0,0,1412,0,0,0,0,0,0, -0,0,0,0,526,632,0,0,0,0,0,0,235,144,0,0,0,0,0,940,0,0,0,52,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,309,196,0,0,0,0,0,1912,0,1290,0,686,0,0,625,0,0,0,0,0,0,0,0,0,0,0,412,0, -0,0,0,43,0,0,0,0,11,967,758,0,0,0,0,0,0,0,0,0,0,0,0,0,0,220,0,0,0,0,0,0,0,0,0,0, -873,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,890,0,0,2,0,0,0,0,0,0,0,0,1774, -393,263,0,0,0,0,0,0,818,456,0,0,251,178,393,97,0,0,0,0,0,674,168,0,0,0,0,0,0,0, -159,1639,0,0,0,0,0,0,0,0,59,934,0,191,0,0,0,0,346,165,0,877,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,128,0,0,0,0,0,0,1297,0,0,0,0,0,0,164,0,0,0,15,132,241,1073,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,324,53,0,0,910,0,0,0,0,0,0,0,0,734,705, -217,73,0,0,0,0,0,0,0,0,636,389,0,1409,0,0,0,0,0,893,0,0,0,0,21,0,0,0,0,0,0,0,0, -0,0,0,0,0,721,0,0,0,959,0,0,0,0,1433,0,0,0,0,0,0,0,0,0,0,0,0,174,189,0,0,0,0,0, -0,0,0,0,0,22,2,0,0,815,354,0,0,0,0,425,0,411,60,13,1611,0,0,0,0,0,0,0,0,0,0,0,0, -0,1478,596,0,0,398,0,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,1159,0,0,0,0,0, -592,223,0,0,0,0,0,0,0,245,64,0,0,0,0,278,0,604,0,0,1502,265,0,0,0,0,0,0,0,310, -1763,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,129,0,0,0,0,0,0,0,0,0,1356,0,0,0,0,0,0,0, -0,505,0,0,0,0,0,0,0,1000,0,0,966,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,839,0,0,0,0,0,0, -0,0,0,0,0,0,0,637,0,0,0,0,0,0,0,0,0,0,0,0,0,0,590,0,0,0,0,280,0,0,0,1386,0,0,0, -281,0,1064,0,0,0,0,0,917,0,0,15,555,0,0,1014,1883,0,0,0,965,0,0,117,33,0,0,0, -801,0,0,0,0,0,877,0,824,0,0,0,0,0,0,0,0,0,0,0,365,0,0,0,0,0,0,774,7,0,430,0,0, -231,360,0,0,0,0,0,0,0,0,822,740,0,0,929,1485,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,852,0,0,0,0,17,0,0,0,0,0,0,1001,0,0,0,0,35,831,0,0,384,457,0,0,0,1351,0,27, -0,0,984,0,264,552,0,401,0,0,0,710,0,1211,0,0,11,205,0,0,0,0,0,0,0,0,0,0,0,0,5, -579,0,717,0,0,1011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,805,0,0,0,0,0,0,0,0,0,0,0,489,0, -0,0,1024,0,0,0,0,0,0,0,0,0,892,0,0,0,0,0,0,0,0,0,0,0,0,473,0,0,0,659,864,0,0,0, -0,0,0,152,819,0,51,0,0,0,0,0,0,0,0,0,0,130,0,0,0,0,0,229,0,0,0,0,674,0,0,0,0,0, -0,0,0,0,770,52,79,0,0,0,1666,0,409,0,0,0,0,0,0,0,195,0,688,0,0,0,0,0,0,0,0,0,0, -0,889,174,160,0,0,0,0,0,0,0,0,0,0,0,0,0,872,0,918,569,268,0,0,0,1224,0,1361,0,0, -0,0,0,0,0,0,0,374,0,0,0,0,0,731,0,0,0,0,190,0,0,0,0,0,0,0,202,506,444,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,835,0,17,1526,0,0,0,0,0,477,0,0, -994,1374,76,0,0,0,0,0,0,0,355,287,0,1389,0,0,0,0,0,0,455,384,0,0,0,264,0,0,0,0, -0,0,0,0,0,0,0,0,1001,0,0,0,0,0,0,0,0,0,0,0,0,28,0,0,0,851,175,359,0,0,0,0,0,0,0, -0,287,740,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,857,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -819,1402,0,0,0,0,0,0,174,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1649, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,655,573,0,0,0,0,0,0,0,0,128,351,0,0,0,0,0,0, -0,0,0,0,0,918,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,687,0,0,0,0,0,0,0,0,0,1525, -0,0,0,1009,0,0,0,0,0,0,0,340,0,0,0,0,0,0,0,0,0,0,861,0,176,0,0,0,0,0,0,0,0,0,96, -985,0,615,0,0,0,0,0,0,0,1919,0,0,0,0,0,1131,0,0,0,0,0,0,0,247,0,0,0,0,27,23,0,0, -0,0,0,0,0,0,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1015,0,0,0,0,0,1088,0,0, -0,0,0,1585,0,0,0,0,227,0,0,0,478,360,0,0,0,95,0,0,0,0,0,0,699,0,0,0,26,0,0,0,0, -1119,0,0,0,739,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,741,67,0,0,0,0,0,0,464,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,0,96,0,0,0,26,342,0,0,0,0,0,0,203,0,0,449,0, -0,0,0,0,0,0,0,0,0,256,311,0,0,0,0,0,0,758,0,0,0,0,0,0,0,0,827,0,0,0,0,581,64,0, -1047,0,0,0,0,0,288,0,0,0,0,0,1375,0,0,0,0,0,0,0,0,0,0,0,1309,0,0,0,0,0,0,0,0, -376,12,0,0,0,0,0,154,0,1520,0,1753,95,502,0,0,0,0,0,0,0,269,291,1197,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,1341,0,1017,0,0,0,0,0,0,0, -0,857,1810,533,0,0,1453,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,836,211,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,19,0,156,0,0,0,0,1009,0,0,0,0,0,0,0,0,0,0,0,0,0,820,0,0, -0,0,0,0,0,0,0,228,0,0,0,1131,0,1276,0,0,0,0,0,0,0,0,0,0,0,0,849,1792,0,0,389, -291,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,525,0,0, -0,453,0,0,0,0,666,0,0,0,422,0,355,0,0,0,0,165,0,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,865,0,0,0,0,0,0,0,1625,0,0,0,234,0,1383,0,0,0,0,0,0,0,0,306,0,0,0,802,1921, -0,0,0,0,0,0,180,0,0,0,0,1312,814,0,0,0,0,0,0,0,0,0,0,707,0,0,0,1493,11,61,733,0, -0,0,341,0,0,0,98,0,0,0,0,0,0,0,0,0,0,0,1014,0,0,0,0,0,0,0,142,102,0,0,30,0,0, -823,0,1045,0,0,0,1930,0,1512,0,0,0,0,0,0,0,87,0,1243,245,0,0,0,0,0,0,0,48,68,0, -0,0,0,0,0,0,0,126,77,625,938,0,0,351,0,0,0,174,1668,0,707,0,0,0,0,0,0,0,0,0,0,0, -403,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,282,0,0,0,0,0,0,8,44,0,0,363,115,0,0,0,0,0,0, -0,0,0,0,0,0,545,761,0,0,835,1254,0,0,0,0,930,1936,0,0,0,0,0,0,0,0,653,0,0,0,0,0, -344,0,0,1483,673,185,0,0,460,93,753,478,0,0,0,0,0,1020,0,0,0,0,0,0,0,103,0,0,0, -499,0,0,0,0,0,0,207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,0,968,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,3,0,0,0,0,399,0,0,0,0,224,563,0,0,0,0,0,704,0,0,0,0,0,0,0,0,0,0,0, -1559,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,861,0,0,0,0,946,333,746,0,0,0,0,0, -0,0,910,0,0,0,0,0,0,0,0,0,0,0,0,0,652,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1393,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1514,0,0,0,0,201,0,510,717,0,0,528,0,0,0,0, -20,0,0,0,1251,0,0,0,1163,0,0,0,307,0,0,0,0,0,1091,0,0,0,0,0,0,0,0,0,0,0,429,0,0, -0,881,0,0,0,0,0,621,0,0,0,0,0,0,0,736,0,348,0,868,0,0,0,0,433,0,0,0,771,1495,0, -0,0,0,215,0,0,0,0,0,124,0,0,0,0,0,0,0,0,0,0,0,55,0,0,0,0,0,0,0,112,62,0,856,270, -0,572,0,0,0,0,939,0,0,0,0,0,0,0,352,0,0,0,0,0,0,0,0,0,647,0,0,0,0,10,0,0,0,0,0, -0,0,220,0,0,0,0,0,0,0,0,0,0,0,0,0,464,0,0,109,0,0,0,1746,0,0,0,515,0,0,0,566,0, -0,0,0,0,0,67,40,0,0,722,992,0,0,923,0,0,0,0,0,0,1145,0,0,0,0,0,0,0,0,0,0,0,568, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,0,0,0,0,645,0,0,328,0,0,0,0,0,0,0,0,0,0,0,0, -1363,0,0,0,0,0,1280,0,0,0,0,0,0,0,0,0,0,7,28,360,162,0,0,0,0,0,0,0,0,0,0,0,764, -0,0,833,862,0,856,0,0,0,0,0,0,736,92,0,0,948,1944,0,1479,63,590,0,0,0,1521,0,0, -0,709,0,0,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,483,0,0,0,0,1213, -0,0,0,0,29,1022,0,1712,0,466,0,0,0,0,0,0,0,0,0,0,0,0,0,731,0,0,0,0,0,0,171,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,241,0,0,0,0,0,0,0,0,0,0,0,964,2005,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1100,0,0,0,954,0,0,0,0,0,0,0,0,0,1958,0,0,34,549,994,0,0,449, -137,850,0,0,670,146,0,0,0,0,518,159,0,0,0,0,0,0,0,0,151,0,0,1027,0,0,0,0,0,0,0, -0,0,0,983,0,0,0,0,993,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,141,501,0,0,0, -0,0,0,0,0,0,452,0,0,0,0,0,0,0,0,0,0,233,149,0,0,0,0,0,0,0,0,582,0,0,0,801,0,0,0, -0,0,0,70,0,0,369,0,36,0,0,0,0,0,0,0,204,721,430,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1817,16,1078,1021,0,0, -406,0,0,0,0,0,69,0,0,0,0,0,1830,0,0,0,824,0,0,0,0,0,0,0,0,0,826,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,816,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,717,1845,0,423,0,0, -0,0,0,0,0,0,510,0,0,1048,0,0,0,618,0,0,0,520,0,0,0,0,990,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,321,0,0,0,0,0,0,0,1135,0,0,921,0,0,0,24,397,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,856,0,0,0,139,282,981,0,288,0,0,0,1890,651,56,0,0,0,0,0,0,0, -0,261,0,0,0,0,0,0,0,0,0,0,0,617,1403,0,1205,0,0,563,0,0,0,0,0,0,0,0,333,0,0,0,0, -0,369,0,0,0,0,0,0,0,0,0,622,0,0,0,1407,0,0,0,0,0,0,0,0,0,0,0,0,624,160,0,363,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,619,0,174,292,0,0,656,616,0,0,0,685,0,0,0,0,0,0,0,0,0,0,0,0,0,647,0,0,0,631,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1267,0,0,0,1797,0,0,0,1684,0,0,469,0,531, -1230,73,0,0,0,0,0,0,0,0,0,268,0,0,0,0,0,102,558,109,65,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,595,0,0,0,0,0,374,1832,0,0,0,0,0,0,16,0,405,6,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,881,0,1495,0,0,0,0,0,0,0,0,0,142,0,0,0,0,0,0,0,0,0,0,21,466,23, -257,0,0,0,0,0,0,77,404,0,0,0,0,0,0,712,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,860, -1848,0,0,652,629,0,0,0,0,13,377,0,1842,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1501,0, -0,0,1906,0,0,0,0,0,0,0,0,0,0,0,0,0,491,234,171,0,0,0,0,631,1186,0,0,0,0,0,0,0,0, -0,0,0,0,931,0,170,0,0,0,0,0,0,0,0,0,0,1587,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -765,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,424,0,0,714,0,0,0,0,685,0,0,0,0,0, -0,285,0,0,0,0,0,0,429,0,0,0,0,0,0,0,0,0,0,71,18,0,0,0,0,0,0,0,0,0,0,116,828,0,0, -0,0,0,0,289,0,0,0,0,0,0,0,0,675,0,0,0,1424,0,0,0,0,0,647,0,0,0,1334,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,36,209,0,0,0,0,0,0,0,342,0,0,0,928,0,0,0,0,0,1838,118,856,654, -318,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,915,895,454,0,0,513,1425,0,0, -0,0,0,0,791,0,153,0,0,0,0,0,0,796,909,445,345,0,0,0,0,0,0,0,0,578,0,0,0,1387,0, -0,0,555,0,0,0,0,0,0,766,0,0,0,0,0,0,0,0,0,0,541,0,0,0,0,0,0,0,0,0,0,0,0,0,880,0, -0,0,0,0,1506,0,0,983,0,768,0,0,0,0,584,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,737, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,226,30,426,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,462,0,0,0,385,0,398,0,0,0,0,0,0, -0,0,0,347,0,0,0,0,125,1259,644,136,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,469,0,0,0,0,0, -1367,0,0,0,0,0,0,0,0,0,0,0,719,0,0,0,0,0,0,0,0,0,0,0,0,0,1423,0,0,0,0,0,0,0,0,0, -749,0,0,0,0,546,645,0,0,0,0,0,0,277,0,0,1275,0,0,0,0,0,0,0,453,536,555,0,0,987, -1107,0,0,90,0,0,0,0,0,0,0,0,860,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -257,0,1768,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1071,0,0,0,0,0,0,0,0,0,0,0,0,0,83, -0,835,0,0,0,0,0,0,0,2006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,696,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,95,1718,0,0,0,0,0,0,0,26,0,550,0,0,0,0,0,901,0,0,0,0,0, -0,822,0,0,122,0,0,0,807,0,0,0,0,0,262,0,620,601,34,0,0,170,0,0,0,0,537,0,0,0,0, -0,0,0,0,0,332,0,0,208,1909,182,261,0,0,0,1721,0,0,0,0,0,933,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,1609,0,895,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,812,0,0,942,1916,0,0,0,0, -0,0,0,778,0,0,0,137,0,1314,0,0,0,0,0,0,0,1661,0,0,0,0,0,0,0,1591,0,0,0,0,0,0, -820,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,185,89,0,1160,230,6,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,63,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1740,0,0,177, -170,0,1961,0,0,0,0,0,0,0,0,0,0,0,0,91,0,17,44,0,0,0,0,0,0,0,0,0,270,0,296,0,0,0, -0,0,0,0,1523,0,0,0,0,0,0,0,0,0,0,757,7,0,0,0,0,0,0,0,0,0,0,530,588,0,0,0,0,0,0, -0,0,0,786,0,0,0,0,0,580,627,88,447,57,0,0,0,0,0,0,0,0,845,735,0,0,0,0,0,31,15,0, -460,521,12,424,0,0,0,1302,0,0,0,0,0,0,0,595,0,0,0,13,548,97,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,1472,452,1767,0,0,0,0,0,0,0,0,0,0,115,0,0,0,0,0,0,1543,0,1111,0,0,0,0, -1,0,359,488,0,267,0,0,0,1983,0,0,0,0,0,0,0,1155,0,1575,0,1438,31,0,0,377,101,0, -0,0,0,0,0,0,0,0,0,0,0,0,476,0,0,0,0,0,0,0,0,2023,0,0,0,0,0,1836,0,0,0,0,35,843, -0,0,0,0,0,0,0,554,0,0,0,536,625,207,0,1371,0,0,0,424,785,336,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,896,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,750,0,0,0,0,238,0,0, -0,0,0,383,0,0,0,0,0,0,0,0,603,725,11,0,0,0,0,0,0,0,0,0,476,0,0,0,0,0,1552,0,0,0, -0,0,0,0,680,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,435,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1431,0,0,13,112,0,0,356,0,0,0,0,0,0,0,0,0,0,1963,0,0,0,1244,18,0,0,0,0,0,0,867, -0,0,0,0,0,0,50,708,73,592,0,502,0,0,0,0,0,0,161,347,0,0,0,0,470,33,0,246,571,10, -0,465,614,0,237,0,0,0,0,0,24,18,0,506,0,0,0,0,0,0,33,309,0,0,0,0,0,0,0,0,0,0, -140,0,0,0,0,1056,0,0,0,1704,0,0,0,0,0,0,0,1036,0,0,0,0,0,0,0,0,0,1315,432,86, -264,524,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,107,0,0,0,0,0,123,927,0,0,957,1149,0,0, -0,0,0,778,0,502,196,0,0,0,0,1312,0,0,0,0,0,0,0,855,0,0,0,0,0,0,0,0,0,0,45,1400, -0,0,0,1003,0,0,0,0,0,1097,0,0,0,0,0,0,0,0,545,612,0,0,0,0,0,0,0,0,0,0,0,0,54,0, -0,0,0,172,0,0,0,1029,0,0,0,0,0,0,0,0,0,568,0,0,0,732,617,0,0,974,94,989,733,0,0, -0,0,0,0,1789,0,0,665,2015,0,0,0,0,0,0,806,287,0,0,0,0,0,1539,0,0,0,0,0,0,0,0,0, -0,182,1563,0,0,0,0,0,0,0,0,0,484,0,0,0,0,0,1623,0,0,0,0,0,0,0,0,878,1833,0,1569, -0,0,0,0,0,0,0,0,93,0,715,994,0,0,0,0,0,63,0,591,0,0,0,0,0,0,0,749,0,0,0,0,547, -366,0,0,0,1747,0,0,0,0,0,0,0,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1463,0,772, -893,0,0,0,48,0,0,941,0,0,690,1785,106,440,0,0,0,0,0,0,0,0,0,0,32,0,332,216,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,852,0, -0,416,564,0,918,0,1764,0,0,3,0,0,274,0,0,0,0,501,0,0,0,0,0,0,0,851,743,0,49,0, -879,0,0,47,0,0,0,0,0,0,865,0,1202,0,0,0,0,0,0,47,272,0,0,0,0,0,0,0,0,0,0,0,1455, -0,0,0,0,891,1911,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,761,0,0,0,0,0,0,0,0,0,407,0, -183,0,0,490,0,0,0,0,0,0,0,35,731,0,0,0,0,0,0,0,819,0,0,0,0,0,0,0,0,0,0,0,0,0, -575,0,0,0,0,45,818,0,0,77,222,0,0,0,0,849,1880,0,0,0,633,0,1308,0,0,0,0,0,0,0,0, -0,0,86,0,0,0,0,0,0,0,0,0,0,0,0,0,0,817,0,0,0,0,0,0,0,0,0,882,0,0,0,914,0,0,0,0, -0,0,0,0,0,0,865,0,0,426,399,58,0,0,0,0,0,0,538,102,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,876,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,566,0,63,12,0,0,0, -0,0,0,0,0,0,0,0,0,0,3,114,0,0,0,0,0,0,0,0,576,0,0,0,0,0,0,0,0,933,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,692,0,0,0,0,0,0,0,0,0,0,0,0,752,0,0,0,0, -0,0,0,0,375,0,1011,0,0,96,0,0,0,0,0,0,0,0,0,148,0,0,0,0,0,0,0,0,0,0,0,337,56, -666,0,246,394,0,0,0,0,0,0,0,0,437,0,0,0,506,0,0,0,0,1003,0,1163,0,328,0,0,0,0,0, -0,0,0,1000,0,0,0,0,0,744,101,0,0,0,0,0,726,0,0,176,0,146,9,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,839,0,0,0,0,0,0,223,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,246,1931,29,0,0,1771,0,0,0,0,0,846,6,157,0,0,0,0,0,0,0,0,0,875,0,0,477, -773,177,639,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1747,0,0,0,0,158,873,0,659,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,391,0,0,0,0,0,0,0,0,0,0,0,0,668,883,0,78,628,0,0,0, -0,0,0,0,0,0,0,0,0,1460,0,962,0,0,0,0,0,460,0,0,0,0,0,0,0,0,0,0,0,0,0,0,34,199,0, -0,0,388,474,0,271,0,333,608,0,0,0,0,0,0,49,0,988,0,707,617,0,0,0,0,0,0,0,756,0, -0,0,0,0,1583,0,0,0,0,0,0,0,0,0,0,285,0,0,0,0,0,0,0,0,0,0,0,0,0,0,344,0,0,0,0,0, -0,0,0,515,1709,0,0,0,0,0,0,0,0,404,0,0,0,0,500,0,0,0,0,0,0,0,0,0,68,216,0,0,0,0, -0,0,0,488,353,0,0,177,236,0,0,458,490,0,0,0,0,0,0,756,1504,0,757,0,1735,0,0,108, -598,0,0,0,0}; -BROTLI_INTERNAL const uint8_t kStaticDictionaryHashLengths[32768] = { -8,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,0,0,12,0,0,0,0,4,22,5,0, -4,0,0,0,0,0,0,0,0,0,0,0,0,14,6,0,0,0,5,0,0,0,0,0,0,0,7,13,0,0,4,0,0,0,0,0,0,0,0, -0,6,0,0,0,0,8,0,0,0,0,0,0,7,0,7,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,4,0,0,0,4, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,10,4,0,5,13,7,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,6,0,0,8,7,0,0,9,0,8,0,0,0,0,0,0,6,0, -0,9,0,0,0,11,0,0,6,8,7,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,7,0,0,0,6,8,0,0,0,0,0, -0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,9,0,0,0,8,4,13,7,0,0,0,0,0, -7,0,5,0,0,0,0,8,5,0,5,0,0,8,7,0,0,0,0,0,0,0,0,0,0,9,0,0,0,8,0,0,0,10,4,0,5,0,4, -0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,6,0,6,0,0,0,0,8,7,0,4,9,4,0,0,0,0,0,0, -9,0,0,0,8,5,0,0,0,6,0,0,0,0,0,0,0,0,0,7,18,0,0,0,0,4,9,0,0,4,0,6,0,0,0,6,0,6,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,6,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,5,8,7,0,0,0, -0,9,0,0,0,0,0,0,0,8,6,10,6,0,0,0,4,0,6,8,6,0,0,0,4,0,0,0,0,0,5,0,0,0,6,0,0,0,0, -10,0,12,7,0,0,0,0,0,4,0,0,0,0,0,5,0,0,8,7,0,0,0,0,0,0,0,0,9,5,0,0,0,0,0,0,0,0,0, -0,0,0,0,6,11,0,0,0,0,0,0,0,0,0,8,7,0,0,10,0,0,0,0,0,0,0,0,6,10,0,17,0,8,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,8,6,9,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -7,0,0,11,4,0,5,0,0,0,0,0,0,0,0,0,0,10,5,0,6,8,5,0,0,0,0,0,0,0,0,0,0,11,5,0,0,0, -0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,9,0,0,0,0,5,0,0,0,0,0,0,0,0,0,6,0,0,8,7,0,0,0,0,0, -0,0,0,0,0,0,5,0,0,0,6,0,0,10,0,0,0,20,0,0,0,0,0,0,0,0,6,9,5,0,0,0,0,10,4,8,0,0, -4,13,0,0,0,0,0,0,0,9,0,9,0,0,0,0,0,0,0,0,0,0,0,0,4,8,6,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,12,0,0,4,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,12,5,0,0,10,4,10,7,13, -0,0,0,0,0,0,0,0,6,0,6,0,6,0,0,0,0,0,0,19,0,0,4,12,6,9,0,0,0,0,4,0,4,11,0,0,0,0, -0,0,0,12,0,0,0,8,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,4,0,0,0,0,0,0,0,0,0,6,0,0,0,0, -0,5,0,0,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,8,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,9,6,0,0,0,0,0,4,0,4,0,0,0,0,0,0,0,0,0,4,0,0,0, -6,0,0,0,0,0,0,0,0,0,0,13,6,0,0,0,0,0,0,0,0,0,0,0,6,8,0,0,0,0,0,0,0,0,0,0,6,0,0, -0,0,0,5,0,0,0,0,14,4,0,0,0,4,12,5,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,8,6,0, -0,0,0,0,0,12,0,9,6,0,0,0,0,13,0,0,5,0,0,0,0,0,4,0,6,0,7,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,13,0,9,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,5,0,0,0,6,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,6,0,6,0,0,0,0,0,0,0,0,8,7,8,4,0,0,0,0,0,0,0,0,0,0,0,7,0,7,0,0,0,4,0, -0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,8,6,8,4,0,0,0,0,0,6,0,7,0, -0,0,0,0,0,0,0,0,0,10,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,7,0,0,0,0,0,0,9,5,0,0, -0,0,0,7,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,9,4,0,0,0,0,0,0,0,4, -12,5,11,0,0,0,0,0,0,0,0,0,8,7,0,5,0,0,8,7,0,5,0,0,0,0,8,0,0,0,0,7,0,4,10,0,0,0, -0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -13,5,0,0,0,4,0,0,0,0,0,6,0,0,0,0,0,0,14,5,0,0,0,7,0,0,10,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,6,0,4,0,5,0,0,0,0,8,5,0,0,0,0,0,0,9,5,9,0,0,0,0,0,0,0,0,6,9,0, -0,4,0,0,0,7,0,0,0,6,0,0,10,4,0,0,0,0,0,6,0,0,10,0,0,0,8,5,0,0,0,0,0,0,0,0,10,0, -0,0,0,0,18,4,12,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,6,0,0,0,0,8,7,0,0,0, -0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,8,4,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, -0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,8,0,0,0,0,0,0,6,0,0,0,4,10,5,0,0,0,0,0,0,0,0,0,0, -0,4,8,7,0,0,8,6,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,6,0, -0,0,0,8,6,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,6,0,7,0,0,0,0,0,0, -0,0,0,0,0,6,0,0,0,7,0,0,0,0,0,0,8,7,0,0,0,0,8,0,12,6,0,6,0,0,0,0,9,7,11,7,0,0,0, -0,0,0,0,0,0,0,0,0,11,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,8,7,0,0,10,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,6,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0, -0,0,0,6,0,0,0,7,0,4,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,14,0,0,0,0,0,8,4,0,4,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,20,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,12,5,0,7,0,5,0,0,10,0,0,7,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,6,0,4,9,7,0,0,0, -0,0,7,0,0,0,0,0,0,10,0,9,0,9,0,0,0,0,0,0,0,0,4,9,0,0,0,0,6,0,0,0,0,0,0,0,0,11,4, -0,6,0,0,0,0,0,0,8,0,8,0,0,0,0,0,0,0,0,0,0,4,0,0,0,5,0,0,0,0,0,0,0,0,13,6,0,0,11, -0,0,0,0,0,0,0,9,7,0,0,0,0,0,0,0,0,0,0,0,6,18,0,0,4,0,0,0,0,0,0,0,6,0,0,0,0,0,0, -0,5,0,0,0,0,0,0,0,0,9,7,0,0,0,0,0,0,0,6,0,0,0,0,9,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,11,7,0,0,0,0,0,6,0,0,0,7,0,0,0,0,0,0,0,0,11, -4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,4,0,0,0,0,8, -6,0,0,0,0,0,0,9,6,0,0,0,0,0,4,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,0,0,0, -0,6,0,6,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,6,0,6,0,0,10,6,0,0,0,7,0,0,8,0,8,7,0, -0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,6,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,9,0,0,0,0,6,0,0,0,0,0,0,0,5,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,9,6,0, -0,0,0,8,7,0,0,0,0,0,0,0,0,12,0,12,0,0,0,11,6,0,5,0,0,12,0,12,5,0,7,11,6,0,0,11, -0,0,0,12,0,0,4,12,7,8,6,0,0,0,0,8,5,0,0,0,0,0,0,0,4,11,0,0,6,0,7,0,0,0,0,0,0,0, -5,0,6,0,0,0,0,8,0,10,0,0,0,0,0,0,0,0,0,0,0,9,7,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0, -0,0,0,0,0,0,0,0,0,11,7,0,0,0,0,0,0,10,0,0,5,0,0,12,6,0,0,0,0,0,0,10,6,0,0,0,0,8, -6,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,5,0,0,0,0,11,0,10,6,0,0,8,6,0,0,0,6,0,7,10,6,0, -0,0,7,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,10,7,0,0,0,0, -10,6,0,0,0,0,0,0,8,5,11,0,8,4,0,0,0,4,0,0,0,0,9,4,8,0,0,0,0,0,0,0,11,6,0,0,0,0, -10,7,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0,7,0,0,0,0,9,6,0,5,0,7,0,0,0,0,0,7,0,0,11,0,0, -0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6, -0,0,0,0,13,0,8,6,13,0,0,0,11,7,0,7,0,6,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,9,6,0,0,0,0,0,0,0,0,0,6,0,0,9,6,0,6,0,0,0,0,0,5,0,0,0,0,0,0,0,0, -0,0,0,0,0,5,9,0,0,0,0,0,0,0,0,0,0,4,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,9,7,0,7,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0, -5,11,5,0,0,0,0,0,0,0,0,0,4,0,7,0,6,0,0,0,6,20,0,0,0,10,7,0,5,14,4,0,0,0,0,0,0,0, -0,0,6,0,0,0,0,8,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0, -0,0,6,0,4,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,9,7,0,0,11,6,15,0,0,0,0,0, -10,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,7,0,0,0,0,0,0,0,0,9,7,13,0,0,0,0,0, -0,7,0,0,8,6,0,0,0,0,0,0,0,0,9,4,0,0,0,0,8,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,5,0,0,0,0,0,0,0,0,0,0,0,0,8,5,0,4,0,0,0,0,0,0,0,0,0,0,12,6,8,0,12,0,0,7,0,0,0, -0,0,5,10,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7, -14,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,8,7,10,7,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,6,18,6, -14,7,0,0,0,0,0,0,0,0,11,6,0,0,0,0,8,7,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,6,0,0,0,0,0,0,0,6,0,0,11,7,0,0,10,7,0,0,0,6,8,6,0,0,0,0,0,0,0,6,0,0, -19,0,0,0,9,5,0,0,0,0,0,0,11,7,0,0,0,7,0,6,0,0,11,0,0,0,0,4,8,0,0,0,0,0,0,0,0,6, -0,0,0,0,0,6,0,0,8,4,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,7, -0,7,0,0,0,7,15,0,0,5,0,0,0,0,10,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,7,0,0, -0,0,0,0,0,0,9,6,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -11,7,0,0,0,0,0,0,0,6,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0, -0,0,5,0,4,0,0,0,4,0,4,0,0,0,0,0,0,0,0,0,6,0,0,0,0,11,6,0,0,8,5,14,0,0,4,0,0,0,7, -17,0,0,0,0,0,0,0,13,5,0,0,0,0,0,5,0,0,0,5,0,0,0,0,16,6,0,4,0,0,0,0,0,0,12,0,0,0, -0,0,0,6,0,0,0,0,0,0,0,0,0,0,12,5,0,5,0,6,10,0,12,0,0,0,0,0,0,0,0,7,0,0,0,0,8,4, -0,0,0,0,0,0,0,0,0,0,8,7,0,0,8,0,0,0,8,0,0,6,0,7,0,0,0,5,0,6,0,4,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,6,0,0,22,0,0,0,0,0,0,0,0,7,0,0,0,0,0,6,0,0,0, -0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,18,0,0,0,9,4,0,0,8,0,9,7,0,0,0,0,0,0,8,6,0,0,0,0, -0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,9,7,0,0,0,6,0,0,14,0,0,0,0, -0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,7,10,4, -0,6,0,0,0,0,0,0,8,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,9,6,0,0,0,0,0,0, -0,0,11,6,12,7,0,0,0,0,0,0,0,6,0,5,0,0,0,0,0,0,9,6,11,6,0,0,0,0,9,5,0,0,0,0,0,0, -0,6,8,5,0,0,0,0,8,0,10,0,0,0,0,0,9,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9, -5,10,7,0,0,0,5,8,7,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,6,0,0,0,0,0,4,8,7,0,0,0,6,0,0, -0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,7,0,6,0,0,0,0,0,0,0,0,0,0,0,0,22, -0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,5,0,0,0,0,0,0,0, -0,0,0,0,0,17,0,0,6,0,6,12,4,19,6,0,0,0,0,16,0,0,0,0,7,15,7,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,4,10,4,0,0,8,7,0,7,0,0,9, -4,0,6,0,0,0,4,0,5,0,0,0,7,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,7,10,0,0,0,0,0,11,7,0,0, -0,0,12,6,0,0,0,0,0,0,0,6,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8, -0,0,0,0,0,0,0,0,0,10,4,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,8,7,0,0, -0,0,0,0,0,6,0,0,0,4,0,0,11,4,0,0,12,7,0,0,0,0,9,0,0,6,0,0,0,0,0,0,0,0,0,5,0,0,0, -4,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,6,0,0,0,0,0,0,9,4,0,6,0,0,0,0,0,4, -0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,6,0,0,0,5,0,0,0,0,0,0,0,0,0,7,9,6,0,7,0, -0,0,0,0,0,0,6,0,0,0,0,8,6,0,0,0,0,10,6,11,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,5, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,5,0,4,8,0,0,0,0,0,9,7,0,0,0,0,0,0, -13,5,0,0,0,0,8,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,8,5,0,0,11,7,0,0,0,0,0,0,8,6,0, -0,0,0,0,7,0,4,0,0,0,0,0,0,0,5,0,6,0,5,0,0,0,0,0,0,0,0,0,0,0,0,10,4,9,0,0,0,0,0, -0,4,0,0,0,0,10,5,10,7,0,0,0,0,0,0,0,0,16,7,0,0,0,0,0,7,0,0,0,0,11,0,0,0,0,0,0,0, -0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,5,0,4,0,0,0,7,0,0,0,0,0,0,13,0,0, -0,0,0,0,0,0,0,0,7,0,4,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,13,7,0,7,0,4,16,0,0,0,0,6,8,7,9,7,0,0,0,0,8,6,0,0,0,0,0,0,0,0,0,0,0,0, -0,6,0,0,8,5,0,4,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,5,11,7,0,0,11, -0,0,0,0,0,9,5,0,4,0,0,0,0,9,7,8,6,0,0,0,0,0,0,10,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0, -0,7,0,0,0,0,0,0,0,0,0,0,0,4,10,6,0,7,0,0,0,0,0,0,0,5,0,0,0,0,0,0,10,7,10,0,0,0, -0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,7,0,6,8,7,12,4,0,0,0,0,0,0,0,5,14, -0,0,0,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0, -6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,4,0,0,20,4,0,0,0,7,0,6,0,0,0,0,0,0,0,0,8,0, -0,6,15,0,0,6,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,12,0,0,0,9,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,5,0,0,0,0,0,0,8,6,0,0,18,0,0,0,10,0,0,0,0,0,0,0,0,6,0,0,0,6,0,0,9,6,0, -6,0,0,0,0,0,0,0,0,9,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,7,0,0,0,0,9,0,9,0,0,4, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,9,5,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,10,0,0,0,0,7,0,0,0,0,0,0,0,0,0,7,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,8,0,8,0,0,0,16,0,0,0,0,0,0,0, -0,0,0,6,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,8,0,0,0,11,0,0,0,0,0,0,0,0,0,0, -6,0,0,0,0,11,0,0,0,9,7,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,7,0,7,0,6, -0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,6, -0,0,0,0,0,0,0,6,0,0,18,0,8,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,7,0,4,0,0,0, -0,0,0,0,0,0,0,8,0,0,0,0,0,16,0,0,0,0,0,16,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,18,0,0,0,0,0,0,0,0,0,9,7,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,6,0,4,0, -0,0,0,0,0,0,0,9,4,0,0,0,0,12,5,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,12,5,0,0,0,0,0,0,0,5,0,0,10,6,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,9,0,0,0,11,0,0,6,0,6,0,0, -0,7,0,0,0,0,0,0,8,0,0,0,0,6,0,0,0,0,0,0,19,0,0,0,12,0,9,0,0,0,0,0,10,7,0,0,0,0, -0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,16,7,12, -0,0,6,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,12,6,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,10,5,0,0,0,0,0,0,0,4,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,7,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,4,0,0,0,0,0,0,0,4,0,0,9,0,0,0,8,0,12,4,0,0,0,0, -0,4,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,8,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,12,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,5,0, -0,0,0,0,0,13,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,8,6,0,6,0,0,0,0,0,0, -0,4,0,0,0,0,0,6,0,0,9,0,0,0,0,0,0,6,0,0,0,0,0,0,11,0,0,0,0,0,0,0,10,6,0,0,0,0,8, -6,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,7,0,0,0,0,0,7,0,6, -10,7,0,0,10,5,11,6,0,0,0,0,0,7,16,0,0,0,0,6,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,5,0,0,0,7,9,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,6,0,0,0, -0,0,0,0,0,8,7,0,0,0,0,11,6,0,0,0,0,0,0,0,0,0,6,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -8,7,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,12,7,0,7,0,0,0, -0,0,0,0,6,0,0,0,0,9,0,0,0,23,0,0,0,0,0,10,5,0,0,0,0,0,0,0,0,0,4,0,0,11,7,10,0,0, -0,0,0,0,0,0,0,0,0,0,6,0,0,8,7,0,7,0,0,8,7,8,0,0,0,0,0,0,0,0,0,0,0,14,5,0,0,0,0, -0,0,0,0,18,6,8,7,0,0,0,0,0,0,0,4,0,0,0,0,0,0,11,0,0,0,9,7,12,6,0,0,0,0,0,0,0,0, -0,0,12,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,6,0,0,0,7,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,6,8,7,0,0,0,6,10,0,0,0,9,0,0,0,0,0,0,0,0,0,8,6,0,0,0,0,0,6, -10,7,0,0,0,7,0,0,8,4,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,19,0,0,0,0,0,0, -0,0,0,8,7,8,6,0,0,11,7,10,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,4,8,7,0,0,0,0,0,0,0,0, -0,5,0,0,13,0,0,0,0,5,0,0,9,7,0,0,0,0,0,0,0,4,0,0,11,0,0,7,0,0,0,0,0,0,0,0,0,6,0, -0,0,0,0,0,12,7,19,0,8,6,0,0,0,0,0,6,0,0,0,0,0,0,0,0,10,6,8,0,0,0,0,0,0,0,0,0,0, -6,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,7,0,0,12,0,0,0,0,6,9,6, -14,0,0,0,0,0,0,6,0,5,0,0,8,7,0,0,0,6,0,4,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,4,0,6,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,5,0, -7,0,0,10,0,9,7,0,6,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,12,6,0,0,0,0,0,5,0,6,0,0,0,0, -0,0,0,0,0,0,0,6,0,0,0,0,9,7,0,0,0,0,0,0,11,6,0,0,0,0,0,0,0,0,0,0,11,7,0,0,13,7, -0,0,0,0,0,0,0,0,12,0,0,4,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,6,11,5,0,5,13,0,8,0, -0,0,0,6,0,0,0,0,0,0,11,0,0,0,0,0,8,7,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,11,5, -9,6,0,0,0,4,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,6,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,10,0,0,0,8,5,0,0,9,0,0,0,8,7,9,0,0,0,0,0,0,0,0,7,0,6,0,0,0,0,0,0,0,0,0, -0,11,0,13,6,0,0,9,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0, -0,0,0,0,0,5,21,6,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,5,0,0,0,0,0,0,0,0,10,0,8,0, -0,6,0,0,0,4,0,0,9,0,0,0,0,0,0,0,0,0,0,4,0,0,8,6,0,6,0,7,10,0,8,4,0,4,0,0,0,0,0, -5,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,6,12,0,0,7,0,0,0,5,0,0, -0,0,0,0,0,0,0,6,0,0,8,6,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -15,7,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,6,0,0,24,7,0,0,0,0,0,0,0,0,0, -7,0,0,0,0,0,0,0,0,0,0,9,6,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,6,0, -0,0,0,0,0,0,0,0,0,0,0,0,6,0,6,0,4,12,0,0,7,0,0,0,0,0,5,0,0,0,0,0,0,0,0,15,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,7,0,0,0,0,0,0,0,0,0,0,8,0,0,0, -0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,6,0,0,0,0,0,0,9,0,9,6, -0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,8,6,0,0,0,0,0,0,0,0,0,0,8,4,0,7,0,0,0,0,0,0,0,0, -22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,4,0,7,0,0,21,7,0,7,9,6,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,8,0,0,6, -0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,8,7,0,0,0,0,23,0,0,0,0,7,0,0,0, -4,0,0,0,0,0,0,0,0,9,4,11,7,0,5,0,0,0,0,11,0,0,4,20,0,0,0,0,0,0,0,0,0,0,0,11,5,0, -7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -21,0,0,0,0,0,0,7,0,0,0,0,0,0,0,5,0,0,0,0,0,6,0,0,0,0,11,6,0,0,0,0,0,0,0,0,9,6,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,5,0,4,9,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0, -0,0,0,10,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,8,7,0,0,11,7,0,0,0,0,0,0,0,4, -0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,6,0,0,0,5,0,0,0,0,0,0,0,0,0,0,8,7,0, -0,0,0,0,0,0,0,0,6,0,0,21,6,0,0,0,0,0,6,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,14,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,9,6,0,0,8,0,0,7,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0, -0,0,0,8,7,0,0,11,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,5,0,0,0,7,13,7,10,4,0, -0,0,6,0,0,0,0,0,0,0,0,0,5,10,0,0,0,0,0,0,5,0,0,0,7,0,0,0,0,0,0,8,4,0,0,0,0,0,6, -0,0,0,0,0,0,0,0,0,0,12,7,0,6,0,0,10,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,6,0, -0,0,0,0,7,0,0,8,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,10,5,0,6,0,0,0,0,0,4,0,0,0,0, -0,0,0,0,0,4,0,0,0,0,9,0,11,4,0,0,0,6,0,0,0,5,12,7,0,5,0,0,0,0,0,4,0,0,0,7,0,0,0, -0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,4,13,6,10,0,0,0,17,0,0,4,0,0,0,0,0,6,0,4,0,5,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,11,7,0,0,0,7,0,0,0,6,0,0,0,0,0,0, -0,6,0,4,0,0,0,0,8,0,0,0,0,5,0,0,0,0,0,4,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,9,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,5,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,12,0,0, -0,0,7,0,0,0,0,0,0,0,0,0,0,0,7,0,0,16,4,0,0,11,0,8,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -8,7,0,4,0,0,0,0,0,0,0,4,0,0,0,0,0,0,8,6,0,0,8,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10, -7,0,0,0,0,0,0,9,0,0,0,0,0,0,0,12,5,10,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,5,0, -5,18,7,0,0,14,0,0,0,0,0,0,0,9,4,0,7,0,0,0,0,0,0,0,5,0,0,0,6,0,0,0,6,0,0,0,0,0,0, -8,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,5,0,0,0,7,0,0,0,0,0,0,11,0,0,0, -10,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,14,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -11,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,14,6,0,0,0,0,11,4,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,10,7,0,6,0,0,9,0,9,5,0,0,0,0,0, -0,0,0,10,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,6,0,0,8,5,0,0,0,0,0,0,0,0,0,0,11,4,0,6, -0,6,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,12,4,0,6,8,6,0,0,0,0,0,0,0,0,0,0,8,0,0,5,0,0,0,0,0,0,0,7,0,0,13,0,0,0,0,0,0,0, -0,0,0,0,0,0,9,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,12,7,0,6,0,0,0, -0,0,0,0,0,0,0,0,0,13,4,0,7,0,0,0,7,0,7,0,0,0,0,0,0,0,0,10,4,0,0,0,0,0,0,0,0,0,0, -9,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,10,6,21,5,0,0,0,0,8,0,0,0,0,4,0, -7,0,0,0,0,0,0,11,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,4,0,0,0,0,0,0, -0,7,9,6,11,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,7,10,0,0,0,0,0,0,6,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,19,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,7,0,0,0,0,0,0,9,4,10,4,0,7,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,9,7,9,7,10,4,0,7,0,0,0,0,0,0,0,6,12,0, -0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0, -0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,8,0, -0,0,0,0,0,5,0,0,8,7,0,0,0,7,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0, -0,0,0,0,4,0,0,8,0,0,6,0,0,0,7,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,6,0,0,0,6,0,6,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,7,9,7,0,0,0,4,8,0,0,0,0,6,11,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,10,0,0,0,0,0,0,0,13,4,0,0, -12,6,0,6,0,0,0,0,8,7,0,7,0,0,0,0,0,6,0,0,0,0,0,0,12,6,0,4,0,0,0,0,0,0,0,0,0,0,9, -7,22,0,0,0,0,4,0,0,0,0,0,6,0,0,0,4,0,0,9,0,0,6,0,0,24,7,0,7,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,10,6,0,5,0,0,0,0,0,0,0,7,0,0,8,0,0,0,0,0,0,0,10,5,0,0,0,0,0,0,0,0,0,7,0, -7,0,0,0,0,0,0,13,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0, -0,0,0,0,0,7,12,0,9,4,0,0,0,0,0,0,0,0,0,4,0,0,0,0,8,0,0,0,0,0,0,0,0,4,0,0,0,7,0, -0,0,0,8,7,0,0,0,0,0,0,0,0,0,4,18,0,0,0,0,0,10,0,0,5,0,0,11,0,0,0,0,0,0,5,0,6,0, -0,0,6,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,8,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,6,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0, -4,0,0,0,0,0,0,10,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0, -0,0,0,5,8,0,0,0,0,0,0,0,8,6,0,0,0,0,0,0,0,0,20,7,0,0,0,0,0,0,0,0,0,0,0,4,9,0,12, -6,8,0,14,7,0,5,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,10,0,0, -0,0,0,0,0,0,0,0,0,0,6,0,6,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,9,6,0,7,12,0,0,0,0,4, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,7, -0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,4,0,0,9,0, -12,6,0,5,0,0,0,6,0,4,0,6,0,0,0,0,0,0,0,0,10,7,0,0,0,0,0,0,8,0,0,0,0,4,0,0,0,0, -10,0,0,0,0,0,0,0,8,6,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0, -6,0,0,12,6,20,5,0,0,0,0,0,0,0,0,0,0,0,0,9,5,0,5,0,0,0,6,13,7,0,0,0,0,15,6,0,0,0, -6,0,0,13,7,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,5,0,7,0,0,0,0,0,4,0,0,0,0,0,0,0,0, -10,6,0,0,0,0,0,6,0,0,0,0,9,0,0,0,0,0,19,6,0,0,0,0,0,0,0,0,0,0,13,0,11,0,0,0,0,0, -0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,10,6,0,0,0,0,0,0,0,0,10,0,0,6,0,0,0,0,8,0,0, -0,9,0,15,4,0,6,0,0,0,0,0,6,12,0,0,0,0,0,0,0,14,7,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, -0,0,0,0,0,8,7,0,0,0,0,0,6,10,0,0,0,0,0,0,0,0,7,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,7,10,5,0,0,0,0,8,0,0,0,0,4,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,6,12,0,0,0,10,7,0,5,0,6,0,0,0,0,8,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,6,0,4,0,0,0,0,0,7,0,0,0,0,0,0,0,4,9,6,0,0,0,7,0,0,0,0,0,0,0,0,8,6,0,0, -0,0,0,0,0,4,12,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,7,0, -0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,12,6,0,6,9,4,0,0,8,4,0,6, -0,0,0,0,0,4,0,0,0,0,0,0,0,6,0,0,9,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,8,0,0,6,13,4,0,5,8,0,0,0,0,0,0,0,8,0,0,0,10,5,0,0,9,0,0,0,0,0,0,6,0,0, -24,0,0,0,0,0,0,0,8,0,0,7,0,0,12,0,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,7,0, -6,8,0,10,0,9,7,0,0,0,5,0,0,0,0,0,0,0,4,8,5,0,0,0,0,8,7,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,0,0,4,0,0,0,0,0,6,0,0,0,0,0,5,0,0,0,0,8,0,0, -0,0,0,8,6,0,0,0,0,0,0,0,0,0,0,8,6,0,0,0,0,10,4,0,0,0,0,0,0,0,6,0,0,0,4,20,0,0,7, -10,6,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,7,0,0,0,0,9,6,0,0,0,0,0,0,0,4, -12,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,9,4,0,5,0,0, -0,0,0,0,0,6,0,6,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,6,9,0,0,0,0,7,0,0,0,0,0,6,0,5,0,0,0,0,0,0,0,0,9,0,0,0, -0,6,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,17,7,0,0,13,6,14,6,0,0,0,0, -8,0,0,0,0,0,0,7,12,7,8,7,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,4,0,0,0,0,0,4,0, -0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,12,4,0,0,10,7,0,0,0, -0,0,0,10,0,0,6,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,12,0,0,6, -0,0,0,0,0,0,0,0,8,7,12,0,0,0,0,0,0,6,0,6,0,4,0,0,18,6,0,0,0,6,0,0,0,0,0,6,10,6, -0,0,0,0,0,0,8,7,14,0,0,0,0,0,0,6,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19, -0,0,0,8,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,8,7,0,0,10,5,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0, -0,0,9,4,8,0,0,0,0,0,0,4,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,4,0,0,0,0, -0,6,0,0,9,7,0,0,0,0,0,5,0,0,0,0,8,7,0,0,14,0,0,0,0,6,0,0,0,0,0,0,9,6,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,5,0,7,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0, -0,0,0,6,0,0,0,6,0,4,0,0,0,0,0,4,0,0,0,0,12,0,0,7,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0, -0,12,0,16,6,0,0,0,0,0,0,11,7,0,4,8,7,0,0,0,0,0,6,0,0,0,0,16,0,0,0,0,6,0,0,0,0,0, -0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,4,10,7,0,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0, -0,0,10,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,13,4,0,0,10,0,0,0,0,0,0,0,0,0,19,0,0,0, -0,0,0,0,0,0,0,0,0,0,8,6,22,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0, -5,0,0,0,0,0,5,0,0,0,0,0,5,0,0,0,6,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -4,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,7,0,0,18,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,14,7,0,0,11,5,0,0,0,5,0,0,0,0,12,5,0,0,0,0,0,0,0,0,0,0,24,6,0,0, -0,7,0,4,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,7,0,4,0,0,0,0,8,7,0,0, -9,6,0,0,14,5,0,0,0,6,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,12,6,0,0,0,0,0,0,0,6,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,7,0,0,0,5,0,0, -0,0,12,7,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,6,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,6,0,0,13,7,0,0,0,0,0,0,14,0,11,4,0, -0,0,4,0,0,0,0,14,5,0,0,0,0,0,5,11,5,0,0,0,0,22,5,0,0,0,0,0,7,0,0,0,0,0,4,0,0,0, -4,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,6,0,0,17,0,10,0,0,0,8,0,0,0,19, -5,18,7,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,10,6,0,6,0,0,0,0,10,4,0,4,0, -0,0,0,0,0,14,7,0,5,0,0,0,0,0,6,0,0,0,0,0,0,0,0,8,0,9,6,12,0,0,6,0,0,0,0,0,0,0,0, -12,0,10,6,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,4,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,5,13,0,9,7,0,0,0,0,0,0,0,0,0,0,0,7,9,7,0,0,8,0,0,0,0,0, -22,0,0,0,0,0,0,0,23,6,14,0,0,0,0,0,0,7,0,0,0,0,11,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0, -0,0,10,0,0,6,0,0,0,0,0,0,0,0,0,6,0,0,8,5,0,0,0,0,0,0,0,0,0,7,11,6,21,0,0,0,0,0, -0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0, -0,0,0,0,0,0,0,4,9,7,0,0,0,0,0,0,12,0,0,0,0,7,0,0,0,0,0,0,0,0,10,4,0,0,0,0,0,0,9, -0,0,0,20,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,11,7,0,0,0,0,0,0,0,6,15,0,0, -0,0,0,0,0,0,0,0,0,0,0,12,4,0,5,0,0,0,0,0,0,11,7,17,6,0,0,0,0,0,0,15,6,0,7,0,0,0, -0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,6,0,5, -0,0,11,0,11,7,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0, -17,0,0,0,0,6,0,0,0,5,0,0,0,0,0,0,8,7,9,6,0,0,14,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0, -8,7,0,4,0,0,0,0,0,0,0,6,0,5,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0, -0,0,0,5,0,4,0,0,8,7,0,6,12,5,0,7,18,7,0,0,8,5,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0, -10,0,11,0,0,0,0,0,0,0,0,0,0,0,9,0,0,4,0,6,0,7,0,0,0,0,0,6,0,0,0,6,0,0,0,0,0,0,0, -7,0,0,0,0,8,0,0,0,15,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,6,0,0,0,0,0,0,0,0,0, -0,0,6,0,0,0,0,23,0,0,0,10,7,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,5,0,0,0,0,0,0,8,6,0,0, -0,0,0,0,12,7,9,7,0,0,10,6,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,9,0,8,7,0,0,0, -6,0,6,0,4,0,5,0,0,0,0,0,5,8,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,7,10,5,0,0,11,6,0,0,0,0,0,0,0,6,0,6,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,4,9,7,0, -0,0,0,11,7,0,0,0,0,0,5,0,0,0,7,0,0,0,0,23,6,11,4,0,0,0,0,0,0,9,0,0,0,10,6,0,0,0, -0,9,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,6,0,0,10,6,0,0,0,7,0,0, -0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13, -6,11,7,0,0,0,0,0,0,0,0,0,0,0,0,10,5,0,0,0,6,0,0,0,5,0,6,0,6,0,0,0,0,0,0,0,0,0,0, -0,6,0,0,0,0,8,7,0,5,0,0,0,0,0,6,0,0,0,0,0,0,0,4,10,0,8,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,10,6,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,6,0,0, -0,0,0,0,0,0,10,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,11,6,0,4,0,0,14,5,0,7,0,0,0,0,0,6,16,0,0,0,0,0,0,0,10,0,0,7,15,0,0,0,11,7,0,0, -0,0,0,0,0,0,0,0,8,7,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,5,0,0,0, -0,8,0,0,6,0,0,0,0,0,0,9,5,0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,6,0, -0,0,0,0,0,0,7,0,0,0,0,15,7,0,0,0,0,8,0,0,0,14,0,0,0,0,0,0,0,16,7,0,0,0,0,0,7,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,12,6,11,7, -9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13, -7,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,12,0,10,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,8,0,0,5,8,7,10,6,0,0,0,7,0,0,0,0,12,6, -0,0,9,0,0,0,12,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,4,10,0,0,0,10,5,0,0,0,0,0,0,9,6, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,6,0,0,9,5,0,4,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,9,0,0,5,0,0,8,7,8, -6,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,6,10,0,9,4,0,0,0,0,0,0,0,6, -11,0,0,0,0,0,0,0,0,0,0,0,8,0,0,6,0,6,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,8,7,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0, -0,0,0,10,0,0,0,8,7,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0, -0,0,8,4,0,5,0,0,0,0,0,0,0,7,0,0,0,6,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,8,7,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,8,5,0,0,0, -0,0,0,0,7,0,0,0,6,0,0,0,6,0,6,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,5,0,6,0,7,0,0,0,0, -20,0,0,0,0,0,0,0,0,0,0,7,9,0,0,0,0,0,0,6,0,6,0,7,0,0,0,7,0,0,0,0,0,0,0,4,0,0,0, -0,0,0,14,7,0,0,0,5,0,0,22,4,10,0,0,0,0,0,0,4,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,11,5,13,0,0,0,0,0,0,0,0,0,8,0,0,7,0,0,0,0,0,4,0,0,0,4,0,0,0,0,0,0,10,7,0, -0,0,0,0,0,0,6,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,7,0,7,14,6,0,0,0,0,9,5, -0,0,0,0,0,6,0,0,0,5,10,0,8,6,0,0,0,0,0,0,0,0,9,7,0,0,0,0,0,0,0,6,0,0,8,4,0,6,0, -0,0,5,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,7, -14,0,0,5,0,0,18,0,8,4,0,6,0,0,20,0,13,0,0,0,0,7,0,4,0,0,0,0,0,4,8,4,0,0,0,0,0,6, -0,0,0,0,0,4,0,0,0,4,0,0,0,0,0,4,0,0,0,0,0,0,0,0,14,0,0,0,0,0,9,7,0,0,9,0,0,0,0, -0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,20,0,14,0,0,4,0,6,8,5,0,0,0,0,0,7,0,0,0,0,0,0, -0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,10,4,12,7,0,6,0,0,9,7,10,5, -0,0,8,6,0,4,0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,18,0,0,0,14,7,0,0,0,0,0,4, -0,0,0,0,0,0,17,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,4,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0, -0,0,0,0,0,8,6,0,0,0,0,0,0,0,0,8,5,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,5,0,7,0,0,0,0,0, -7,0,0,0,0,0,0,0,0,0,7,0,6,0,0,0,0,0,0,0,0,8,5,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,5,0, -0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,23,0,0,7,0,0,0,0,0,0, -0,0,0,0,0,0,0,4,0,0,0,0,0,0,12,7,8,4,0,0,0,0,0,0,0,0,0,6,0,0,9,5,0,0,0,7,0,0,0, -0,0,0,0,0,0,4,10,0,0,7,0,0,0,5,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,5,0,0,18,7, -0,0,8,0,0,5,0,0,10,0,0,0,0,0,0,6,0,0,0,0,0,5,0,7,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0, -6,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,6,0,0,10,0,0,5,10,4,0,0,12,0,0,0,0, -6,22,4,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,5,0,0,0,0,0,7,0,5,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,6,0,7,0,0,0,6,0,6,8,5,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,8,5,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,5,0,0,0,7,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0, -0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,16,6,0,0,0,6,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,12,7,0,0,0,0,9,0,0,0,0,6,0,0,11,0,0,0,0,0,13,0,9,6,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,4,0,0,10,7,0,0,0,7,0,6,0, -0,0,0,0,0,0,0,0,0,8,7,0,0,0,0,11,0,15,0,22,7,0,4,0,6,0,0,0,0,0,7,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,4,0,7,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0, -18,0,0,0,0,0,0,0,0,0,14,0,0,4,0,0,0,0,8,7,9,0,0,0,0,0,9,0,0,0,14,0,0,0,0,0,0,0, -0,0,11,7,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,7,0,0,0,6,0,6,0,0,0,0,8,0,0,0,0, -0,11,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,9,4,0,0,0,0,0,4,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,8,7,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0, -0,0,0,0,0,0,8,6,0,0,9,5,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,6,0,0,0,0,0,0,0,6,0,5,0, -0,10,6,9,0,0,0,0,6,0,0,0,0,0,6,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0, -11,7,12,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,4,0,5,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0, -0,0,0,0,6,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,5,0,0,10,6, -0,0,0,4,0,7,13,0,0,4,0,0,11,4,0,6,0,0,0,0,0,6,8,7,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,5,0,0,0,0,0,0,8,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,5,0,0,0,0,12,6,0,0,0,0, -11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,11,5,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8, -7,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,4,0,0,0,6,17,0,9,0,10,6,0,6,12,0,0,4,0,0,0, -0,0,0,0,0,0,0,8,5,12,7,0,4,0,0,0,0,0,0,0,0,0,0,11,0,9,0,10,6,11,5,0,7,0,0,8,0,0, -7,0,4,0,0,0,7,0,0,0,0,0,0,8,6,0,0,0,6,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,6,0, -0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,11,0,0,0,0,6,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,0,8,6,0,0,0,0,0,6,12,0,0,0,0,0, -0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,6,0,0,16,0,11,5,0,0,0,0,0, -0,0,0,0,0,10,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,9,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,6,0,7,0,0,0,0,0,0,0,0,0,0,0,0,8,4,0,0,0,0,0,6,10, -7,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,6,0,0,0,0,0,0,9,5,0,0,0,0,8,0,9,0,0, -0,0,0,0,0,0,7,10,0,13,0,0,6,0,0,0,0,0,0,0,0,0,6,9,4,0,0,0,0,0,0,10,0,0,0,0,0,10, -0,0,0,0,0,0,0,10,6,11,0,0,0,0,0,9,0,0,0,0,0,0,4,0,0,0,0,0,0,10,5,0,0,0,0,0,6,0, -0,0,0,0,0,18,4,0,7,0,0,0,0,0,0,24,0,8,6,0,7,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0, -0,8,5,0,0,0,0,10,7,0,6,0,0,0,0,0,0,0,0,8,5,10,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0, -6,0,0,8,7,0,0,0,0,0,0,0,0,0,0,12,6,0,0,0,0,0,0,0,4,0,5,15,0,0,0,0,7,0,7,0,0,0,0, -0,0,0,0,0,6,10,5,0,0,0,6,0,0,8,7,0,0,0,0,0,0,0,0,0,0,0,7,0,0,12,0,0,0,0,0,0,0,0, -0,0,5,0,0,0,0,0,0,14,4,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,11,0,10,4,9,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,6,0,0,0,0,0,4,0,0,0,0,0,7,0,0,0, -0,0,0,0,0,0,0,0,7,13,7,0,0,0,0,0,0,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,7,0,0, -0,0,0,0,0,0,0,5,0,0,0,0,0,6,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,8,0,10,6,0,4,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,6,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,6,0, -0,0,0,0,0,0,0,10,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,9,7,0,0,0,0,0,6, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,10,6,0,0,0,0,0,0,0,6,0,0,0, -0,0,0,0,5,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,6,0,0,0,5,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,6,11,0,0,0,0,6,0,0,0,0,0,0,0,6, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0, -6,0,0,0,0,0,0,0,6,10,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0, -0,0,0,0,0,0,0,6,0,6,0,0,0,5,0,0,0,0,0,0,0,5,0,0,10,0,11,5,0,0,0,0,0,0,14,7,9,7, -0,6,0,0,0,0,0,4,0,0,0,0,0,0,11,7,0,6,0,0,0,0,0,0,9,7,0,4,0,0,0,7,0,0,0,0,0,5,0, -0,0,0,0,5,0,0,0,7,0,0,0,0,0,5,0,0,0,0,17,5,0,0,8,0,0,0,0,6,9,4,0,0,0,0,0,0,0,0, -8,7,11,7,9,0,0,0,0,0,0,0,0,0,8,7,0,0,0,0,0,0,0,0,0,0,0,6,9,5,0,0,8,6,0,0,0,5,0, -0,0,0,9,0,0,0,9,6,0,7,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0, -0,0,0,0,4,0,0,0,0,10,0,0,0,0,0,0,0,0,4,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,4,0,0,0,5,0,0,0,0,0,7,0,0,0,0,0,7,13,5,0,0,0,7,0,0,0,0,0,7,9,6,11,7,0,7,0,0,0, -0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,8,5,0,0,0,5,9,4,0,0,0,0,0,0,0,0,8,4,0,0,0,0, -24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0, -0,0,0,0,6,0,0,0,7,0,0,0,6,0,0,0,0,0,0,0,0,0,5,11,6,0,4,0,7,20,0,8,5,9,5,9,0,0,6, -0,0,0,0,0,0,0,0,0,0,0,7,23,5,0,0,8,4,0,0,10,0,0,6,0,5,0,0,0,0,0,0,0,0,0,0,0,7,0, -0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,9,0,0,0, -10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0, -6,0,0,0,0,14,0,18,4,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,9,6,0,4,0,0,0,0,0,0,8,4, -11,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,8,4,0,0,0,0,0,0,0,0,12,0,10,7,0,0,10,0,0,0,0, -0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,6,0,0,0,0,0,6,0,0,0,0,8, -6,10,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,4,0,6,0,4,0,0,0,0,0,5,0,0, -0,0,0,0,0,0,0,7,0,0,0,7,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,17,7,11,0,0,0,0,0,0,0,0,0,0,4,12,6,0,0,0,5,0,0,0,6,0,0,0,0,0,0,0,0,0,0, -0,5,12,7,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,6,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -7,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,6,0,6,0,0,20,0,0,0,0,0,0,0,0,0,8,7,0,0,0,0,0,4, -0,0,0,5,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,6,0,4,13,0,0,7,0,0,0,0,0,0, -0,0,0,0,0,6,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,6,0,0,12,6,0,7,0,0,0,0,10,0,23,6,0,0, -0,4,0,0,0,0,0,6,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -10,0,9,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,11,0,9,7,0,0, -0,0,0,0,0,0,0,0,9,7,0,4,0,0,0,0,8,7,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, -0,0,0,0,0,6,0,0,10,7,10,5,0,0,8,0,8,0,0,0,0,0,0,4,0,5,10,0,0,0,0,0,0,0,9,0,0,6, -0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,11,7,0,0,0,0,0,0,0,0,9,4,0,0,0,0,0,6,0,0,8, -7,0,0,0,0,0,5,0,0,0,0,0,0,0,0,10,0,0,0,0,5,0,4,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,24,7,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,6,0,0,9,0,0,0,0,0,0,7,0,6,13,0,8, -0,0,0,0,0,0,0,0,0,9,7,0,0,0,0,0,0,0,6,0,0,0,0,8,5,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0, -4,0,0,0,0,0,4,0,0,0,0,0,0,0,6,8,0,0,0,0,6,8,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,4,0,4,0,0,0,5,0,7,0,0,10,0,10,7,0,0,12,5,0,0,9,0,0,0,10,0, -0,6,0,0,0,6,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,5,0,0,0,0,0,0, -12,0,0,0,0,0,8,5,13,6,0,0,0,0,0,0,9,4,0,0,0,0,8,0,0,0,0,0,8,7,0,0,0,0,0,0,0,0,0, -0,0,6,0,0,14,0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,17,6,0,0,0,0,12,6,0,0,0,0,8,0,0,7,0, -7,0,4,9,0,0,6,0,0,0,6,0,0,0,0,0,0,8,7,0,0,0,0,0,0,11,0,0,4,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,18,7,0,4,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,6,0,0,0,0,0, -0,0,0,12,5,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,8,0,11,7,0,0,0,0,0,0,0,0,0,4,0,0,0,0, -11,0,0,0,0,0,0,0,21,0,0,6,10,0,0,0,0,0,9,0,10,0,0,0,0,0,11,0,0,0,0,6,0,0,0,0,0, -5,0,0,0,0,0,0,10,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,4,0,0,23,7,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,9,7,0,0,0,7, -0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,6,0,0, -11,6,0,0,0,0,0,0,0,6,0,0,0,0,10,7,0,0,9,4,0,0,11,0,8,5,0,0,0,7,8,5,22,0,0,0,9,6, -0,0,0,0,0,0,0,6,10,4,0,0,0,0,0,7,9,4,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,6,0,4,0, -0,0,0,11,6,0,0,0,0,0,0,0,0,0,0,0,7,0,6,0,0,0,0,0,7,0,0,0,0,0,0,0,6,0,6,0,4,0,0, -0,0,0,0,0,7,0,7,0,4,13,0,0,0,0,0,8,0,0,0,0,7,0,0,0,0,0,0,11,6,0,7,0,0,0,0,9,0,0, -0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,4,8,0,0,0,0,0,8,0,0,0,0,0,0,6,0,0,0,4,0,0,0,0,0,0,0,6,0,0,0,0,13,5,8,0,0, -0,0,0,0,0,14,0,0,6,0,0,0,0,0,0,0,0,0,7,0,0,17,6,0,0,0,0,13,4,0,0,9,6,0,0,10,5,0, -0,10,5,0,0,0,0,13,0,0,0,0,6,0,0,0,0,0,0,10,0,12,0,0,0,0,0,0,0,0,0,0,0,8,4,0,4,0, -0,0,4,0,0,0,0,0,4,0,0,12,0,0,5,9,4,0,0,0,0,0,0,0,0,0,5,8,5,0,0,0,7,0,0,0,0,8,7, -0,0,0,6,12,5,0,0,0,5,0,0,0,5,0,0,0,0,0,4,12,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,8,7,0,0,0,0,0,6,0,0,0,0,0,0,0,6,0,0,0,0,0, -0,9,6,0,0,0,0,0,0,0,0,0,4,0,0,0,6,0,0,0,4,11,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0, -0,0,0,0,12,7,0,0,0,7,10,7,0,0,11,0,0,0,0,0,0,0,0,0,11,7,0,0,0,6,0,0,11,0,0,0,0, -0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,22,0,10,7,0,0,8,5,0,0,0,0,0,5,0,0,0,0,0,0, -0,0,0,0,9,6,8,7,0,6,0,0,0,0,0,5,0,0,0,0,0,0,8,7,0,0,0,0,9,7,0,0,0,6,0,0,8,7,0,0, -0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,4,0,5,0,0,0,4,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,6,0,0,0,0,0,0,0,4,0,0,0,0,0,0,9, -6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,4,0,0,0,5,0,0,0,0,14,0,0,0, -9,0,0,0,0,0,0,0,0,0,9,7,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,12,0,0,0,0,0,12,7,0,0,0,5,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,10,7,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,8,7,0,0,0,0,0,6,0,0,0,0,0,0,9,6,0,0,0,0,0,6,0,0,0,0,0, -0,0,0,0,0,9,0,0,0,0,7,0,6,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0, -0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,6,0,7,12,6,0,0,0,0,0,5,0,0,0,0,0,0,0,0, -0,7,0,0,8,6,0,0,0,0,10,7,0,0,0,0,0,0,0,6,0,0,0,0,0,6,12,0,0,0,0,0,0,0,0,6,0,0,0, -0,0,6,0,0,0,6,0,0,0,0,0,6,16,0,0,0,0,0,0,0,0,0,9,0,17,0,14,7,8,0,0,0,0,0,0,6,0, -0,0,0,0,0,0,0,0,0,11,0,0,6,8,7,0,6,0,0,0,0,0,0,0,0,0,0,12,6,0,0,0,0,0,0,0,0,0,0, -9,0,0,0,0,7,0,0,0,0,11,5,0,4,9,6,8,0,0,0,0,0,0,0,0,0,10,0,11,7,0,0,0,0,0,0,0,0, -9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11, -0,0,0,12,0,0,0,0,0,10,5,0,4,0,0,0,0,0,7,10,6,11,6,0,0,0,0,0,0,0,0,0,0,0,0,17,0, -0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,6,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,8,0,0,4,0,0,0,6,0,0,0, -0,0,0,8,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,6,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,4,0,0,0,0,9,6,0,0,0,4,0,0,0,0,0,4,10,7,0,7,0,0,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0, -0,0,0,0,0,0,6,0,0,0,6,0,6,0,0,0,0,10,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,18,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,13,0,0,0,0,0,10,0,0,0,0,0,0,0,0,4, -0,0,0,6,0,0,0,0,0,4,8,0,0,0,11,7,0,0,0,4,0,0,0,0,0,7,0,0,8,5,0,0,16,0,0,0,13,6, -0,0,0,0,0,0,0,6,0,0,0,0,20,0,11,6,0,0,8,7,0,0,0,0,0,6,17,0,8,0,0,0,0,0,8,7,0,0, -9,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0, -0,0,4,0,7,0,0,0,0,0,0,0,6,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,8, -0,8,0,0,0,0,0,0,0,11,0,8,0,0,0,0,0,0,0,0,0,0,0,8,6,0,0,0,0,0,0,0,0,0,6,0,0,9,0, -0,0,0,0,8,0,0,0,0,0,18,0,0,0,0,0,0,4,9,0,0,0,0,0,8,5,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,9,6,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,8,7,0,0,0,0,0,0,0,0, -0,4,0,0,0,0,0,0,14,0,0,0,0,7,0,6,0,0,8,0,20,7,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,8,0,0,0,14,0,0,0,0,0,0,0,8,0,0,7,0,6,0,0,0,7,0,0,0,0,0,0,0,0, -0,0,0,4,12,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,10,6,0, -5,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0, -0,0,0,5,8,4,0,0,0,0,0,0,0,4,0,0,0,7,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,12,7,0, -0,0,0,13,6,0,0,0,7,0,0,8,0,0,0,8,0,0,0,0,0,0,0,0,0,0,5,0,0,0,7,0,0,0,0,0,0,11,5, -0,6,0,0,8,5,0,7,0,0,0,0,0,0,0,7,0,0,0,0,8,6,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,4,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -14,0,10,7,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,19,0,0,4,0,0,0,7, -0,0,11,5,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,16,0,10,5,18,0,0,7,9,6,0,5,0,0,0,0,0, -0,0,0,0,5,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,8,7,0,0,0,0,0,5,0,0,0,7,0,6,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,6,0,0,0,4,0,6,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,6,0,0,0,7,23,0,0,0,0,5,0,0,0,0,0,0,8,5,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,14,0,20,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0, -11,0,0,0,0,7,0,0,0,0,15,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,9,6,0,0,0,0,0,7,0,0,0,0, -0,4,0,0,0,0,10,0,0,0,0,0,9,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,10,0,11,6,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,5,0,0,11,0,0,0,0,7,0,0,0,0,0,0,8,7,0, -4,0,0,0,0,11,0,0,0,0,0,11,0,0,5,0,0,8,7,0,4,0,7,0,0,0,0,0,0,0,6,0,0,0,0,0,4,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,10,5,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,6,0,5,0,0,0,0,0,0,0, -0,0,4,11,5,10,7,0,7,0,0,9,6,9,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,9,4,0,4, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,8,6,0,0,0,0,11,7,0,0,0,0,0,0,0,0,0,0,11,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,8,5,0,0,8,0,9,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,6,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,4,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0, -10,7,0,0,0,6,0,0,0,0,0,0,8,0,0,6,0,0,0,6,10,0,0,0,0,0,0,0,0,0,0,0,8,5,0,0,0,6,0, -0,0,6,0,0,0,0,9,5,8,5,8,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0, -0,8,7,10,0,0,0,0,0,0,0,9,6,0,0,0,0,0,0,0,0,0,0,11,7,0,0,0,0,0,5,0,0,0,6,0,7,0,0, -10,5,0,0,0,0,8,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,6,0,0,0,0,0,0,11,0,0,0,0,0,13,4, -0,0,0,4,0,0,0,0,0,5,8,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,14,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,7,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,4,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,5,0,0,15,6,10,0,0,0,8,6,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,9,6,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,14,6,10,0,0,0,0,0,0,0,0,6,0, -0,0,0,0,0,0,0,12,6,0,0,0,0,0,0,0,0,9,7,0,0,0,0,0,6,0,5,11,4,0,6,0,0,0,7,0,0,0,0, -0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,5,0,0,8,5,0,0,0,0,0,0,0,0,0,0, -0,0,10,0,0,0,0,0,9,6,9,4,0,0,0,4,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,8,5,0, -0,0,0,0,0,0,0,0,0,0,4,0,0,11,5,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,5,0,0,0,0,0,0, -0,0,0,7,12,0,0,0,0,6,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,6,0, -4,9,6,0,4,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,6,0, -7,8,6,0,0,0,0,0,0,0,4,0,0,9,6,0,0,0,0,0,0,0,0,0,6,0,5,0,4,0,0,0,0,0,0,0,5,0,0,0, -0,0,5,0,0,0,7,12,7,0,0,0,0,0,0,18,4,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,6,0,0,0, -0,12,0,0,7,0,0,0,0,0,7,0,0,13,0,0,6,0,0,0,0,8,7,9,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,7,10,5,0,0,8,0,0,0,0,0,0,0,8,6,0,7,0,0,8,4,0,4,0,0,0,0,10,4,0,0,14,0, -0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,17,0,0,0,0,0,0,6,0,0,0,0,8,6,0,0,10,5,0,0,0,0,8, -6,0,0,0,6,0,0,0,7,0,0,0,0,0,6,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,12,0,0,0,0,6, -8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0, -0,0,0,6,0,0,0,0,0,0,0,0,0,0,12,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,4,24,0,0, -0,0,0,12,6,0,0,10,6,0,5,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,17,7,0,5,0,0,0, -0,0,0,0,0,0,0,0,0,0,6,11,5,9,0,8,7,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,10,7,0,0,0,0,0,0,0,7,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,11,5,8,7,0,0,0, -0,8,5,0,0,0,0,10,7,0,7,0,0,0,0,0,0,0,0,0,0,13,6,0,0,0,0,0,0,0,0,0,6,0,4,0,0,0,0, -0,6,12,0,8,7,0,0,0,0,0,0,0,0,0,0,16,0,10,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,22,0,0,0, -0,0,0,0,0,0,0,0,0,0,13,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,6,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,22,0,0,6,0,0,21,0,0,0,22,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -6,0,0,0,0,9,6,0,0,0,0,0,0,0,0,0,6,0,0,0,5,0,0,0,0,0,7,8,0,0,0,0,6,14,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,8,6,0,0,0,0,0,0, -0,0,0,0,0,6,0,0,0,0,8,5,0,0,11,7,0,6,0,0,0,0,0,0,0,0,8,7,0,0,0,0,0,0,0,0,0,0,0, -6,0,0,0,5,0,0,0,0,0,0,0,0,0,4,0,0,8,7,0,0,0,0,8,5,11,7,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,4,0,0,0,0,8,5,0,0,10,0,0,4,13,7,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,5,0,0,13,6, -0,6,0,7,0,0,8,4,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,15,0,0,0,10,7,0,0,0,0,0, -7,0,0,0,0,0,0,0,4,0,0,0,0,0,6,0,0,0,0,19,0,0,0,0,6,0,0,0,0,0,4,0,0,0,0,0,6,0,5, -0,7,0,0,0,0,0,0,0,0,0,6,0,0,11,4,0,0,0,6,0,0,13,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,8,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,12,6,0,0,0,0, -0,7,0,0,0,0,0,0,11,7,0,0,0,0,0,6,0,0,10,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,5,11,6, -0,0,0,0,0,0,0,0,10,0,0,0,0,6,0,0,0,0,0,0,8,7,0,0,0,5,0,0,0,5,0,0,0,0,0,0,0,0,0, -0,0,0,8,7,0,0,0,0,9,6,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,10,7,0,0,0,0,10,0, -0,6,0,0,13,0,0,0,0,0,0,0,9,6,0,0,8,6,8,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,4,0, -0,9,7,0,0,0,0,0,0,11,0,0,0,10,7,0,0,0,0,0,0,0,0,9,6,0,0,12,4,0,4,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,6,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,6,0,5,0,0, -9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,4,0,0,0,0,0,6,0,0,0,6,0,0,0,0,0,0,0,0, -16,0,0,4,0,0,0,0,0,7,0,0,0,6,0,6,0,0,11,0,0,0,0,5,0,0,0,0,0,0,0,4,8,5,0,0,0,0,0, -0,14,0,0,0,0,6,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0, -0,0,8,0,0,0,0,0,0,0,0,6,0,0,0,4,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0, -0,0,0,0,6,9,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,6,14,7,0,0,9,7,0,0,11,0,0,0,0,0,10, -4,11,5,13,6,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,5,0,0,0,0,0,4,0,0,9,0,0,0,0, -0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,6,12,5,0,0,0,6,14,0,0,0,0,0,0,0,0,0,0,4,9,4, -0,0,0,0,0,5,0,0,0,0,0,0,0,4,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0,0, -0,0,0,0,0,0,0,0,8,6,0,0,0,0,0,0,11,6,0,0,13,7,0,0,13,6,0,7,0,0,0,0,0,0,8,6,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,10,6,0,4,0,0,12,6,0,0,0,0,0,0,0,0,10,6, -0,0,0,6,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,6,0, -0,0,0,0,7,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,8,6,0, -0,0,7,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0, -0,0,0,5,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0, -0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,8,7,0,0,8,5,0,0,0,4,9,5,0,0,0,7,10,6,0,0, -0,0,0,0,9,7,0,0,8,5,8,0,8,4,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,0,0,0,0,0,0, -0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,6,0,0,0,4,0,0,0,0,0,0,0,0,0, -0,11,7,0,0,0,7,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,5,0,0,0,7,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,9,7,0,0,0,0,8,5,0,4,0,0,0,0,0,6,0,6,14, -6,0,0,0,0,9,6,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,6,0,0,0,0,14,7,9,7,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,16, -0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,14,0, -0,6,0,0,8,6,0,0,0,0,0,6,0,0,12,0,0,0,0,0,8,5,0,7,11,0,0,5,0,4,0,0,0,6,0,0,0,0,0, -0,0,0,0,0,0,0,9,6,0,4,0,6,0,0,0,0,0,0,0,0,0,0,0,0,11,6,0,0,0,0,0,0,10,5,0,0,0,0, -0,4,0,0,0,7,11,6,0,4,8,5,9,5,0,0,0,5,0,7,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,8,5,14,7,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,16,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,4, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,9,6,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,9,0,0,0,12,5,0,0,0,0,0,0,0,4,10,5,0,0,0,0,0,0,0,0,0,0,0,6,0, -0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,4,0,0,0,6,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,6,0,0,0,0,0,0,10,4,0,0,0,0,0,5,0,0,0,4, -0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,6,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,8,0,10,7,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,10,7,0,0,0,0,0,0,0,0,15,0,0,0, -0,0,0,0,0,0,0,7,0,0,0,0,0,7,10,7,9,7,0,0,0,7,0,0,8,0,0,0,0,0,0,0,9,0,0,0,8,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,8,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,7,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,15,7,12,6,0,0,0,7,0,5,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,5,0,0,0,0, -0,0,0,6,9,5,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,9,7,0,0,14,0,0,0,11,7,0,0,0,0,0, -0,0,0,0,0,0,4,0,0,11,7,0,0,0,0,8,0,0,0,0,0,0,6,8,7,0,0,0,7,10,4,0,0,0,0,0,0,0,0, -0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,7,0,0,0,0,10,0,0,0,0,0,0, -6,0,6,0,0,0,0,0,4,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,11,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,7,0,0,10,7,0,0,0,0,9,7,0,0,0,0,0,0,13,7,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,9,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,6,12,0, -0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,9,6,0,0,11,0,0, -0,0,0,14,4,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,7,0,0, -0,0,0,6,0,7,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,5,0,0,0,0,20, -7,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,8,0,0,0,0,0,0,0,0,0,11,5,0,0,0,0,0,0,0,0,0,0,10,4,0,0,0,5,8,5,10,4,0,0,0,0,0, -0,13,6,9,7,0,0,10,7,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,6,0,0,0,7,0,6,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,7,10,7,0,0, -0,0,0,0,0,0,0,0,12,4,0,0,0,0,8,7,0,0,0,0,0,7,0,6,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0, -0,0,0,0,6,0,6,9,6,0,0,12,5,0,0,8,6,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,6,0,0,0,0, -0,0,0,0,0,0,0,0,0,5,8,7,9,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,11, -4,0,0,0,0,0,0,8,0,0,0,10,7,0,4,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,6,0,0,8,0, -0,0,0,0,0,5,0,6,0,0,10,0,14,0,0,0,0,0,0,0,23,0,0,0,12,0,10,5,0,0,0,0,0,0,0,0,0, -5,0,0,0,0,8,0,0,0,0,6,8,0,0,0,0,0,0,0,0,0,22,0,8,0,0,0,0,6,0,0,0,0,0,0,0,5,0,0, -0,0,0,0,0,6,18,4,0,0,0,7,10,6,0,6,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0, -0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,7,10,0,0,0,0,0,0,6,0,0,0,0,11,5,0,0,0,0,0,0,0,0, -15,0,8,6,0,0,13,7,0,0,0,0,0,7,0,0,0,0,0,7,0,0,0,0,8,7,0,0,0,0,0,0,0,0,0,0,9,5,9, -0,0,6,8,6,0,0,0,0,10,0,0,0,18,5,0,0,0,5,0,7,0,0,0,0,8,6,0,0,0,0,9,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,14,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,6,0,0,0,5,0, -0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,8,5,0,0,0,0,0,0,0,0,9,0,0,0,0,4,0,0,0,0,0,0,0,0, -0,0,0,0,20,5,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,9,5,0,0,0,0,0,0,8,4,24,0,0,0,0,0,0, -0,0,0,0,0,0,0,9,7,0,0,0,0,10,5,0,0,8,5,0,0,0,0,0,0,0,0,12,7,0,6,0,0,10,6,0,0,0, -0,14,0,0,4,9,5,0,0,0,0,0,0,9,0,0,0,0,0,0,6,0,0,0,0,0,4,0,0,8,0,0,0,0,0,11,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,8,5,11,7,0,4,0,0,10,0,0,0,0, -0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,11,6,0,0,0,0,0,5,14,6,0,0,0,0,10,0,0, -0,13,4,0,0,0,0,0,0,0,0,0,0,0,6,0,0,10,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,7,12,0,10,6,0,0,0,0,0,0,10,0,0,0,0,0,10,0,9, -7,0,0,0,0,0,0,0,0,0,0,0,0,0,7,8,0,0,0,0,0,0,0,0,0,0,0,0,4,0,7,0,0,0,0,9,7,0,0,0, -0,0,0,0,0,0,0,0,0,24,0,11,7,0,7,0,0,0,0,0,0,8,6,0,0,0,0,0,0,8,7,0,0,0,0,0,5,0,0, -0,6,9,0,0,0,23,5,0,0,0,0,0,6,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,7,0,0,0, -0,0,0,0,0,0,0,0,0,0,6,0,0,18,4,0,0,11,7,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6, -0,0,0,6,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,9,0,0,0,11,0,0,0,23,0,0, -0,10,4,0,0,0,0,0,7,0,0,0,7,0,0,0,0,0,4,0,0,0,0,0,7,0,0,19,0,11,0,0,0,0,0,12,7,0, -0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,5,0,0,0,0,0,5,0,0,0,0,0,5,0,0,0,0,0,0,0,6,0,0, -9,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,4,0,0,0,0,10,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,4,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,22,0,8,7,10,4,11,0,13,5,8,7,9,0,8,7,0,0,0,7,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0, -0,8,0,0,0,0,0,0,0,8,6,0,0,0,0,0,0,0,0,0,0,0,6,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,4,0,0,0,4,11,0,0,6,0,0,8,5,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,8,5,0,0, -20,0,0,0,0,0,0,0,0,0,11,0,0,0,0,5,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,7,0,0,14,0,0,0,9,0,13,7,0,0,0,0,0,6,0,7,0,0,8,6,10,6,0,0,8,6,0,0,0,6,0, -0,12,6,9,0,0,0,0,0,0,5,9,0,12,4,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,8,5,0,0,0,0,0, -0,0,4,8,0,0,6,8,0,0,0,0,0,0,0,0,0,13,6,0,7,0,0,0,0,0,6,8,7,8,6,0,0,0,7,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,18,0,11,4,0,0,0,5,0,0,0,0,0,0,0,0,0,0, -0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,14, -6,0,0,0,0,12,7,8,0,0,0,0,0,0,0,8,7,0,0,0,0,10,4,0,0,0,0,0,0,10,0,0,6,0,0,0,0,0, -0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,15,6,9,7,0,0,0,0,0,0,15,6,11,7,0,0,0,7,0,0,21,0,0, -0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,17,6,0,0,10,5,0,5,0,0,0,0,0,0,0,0,0,7, -0,0,10,0,0,0,0,0,0,0,0,4,11,5,0,0,0,0,16,7,0,0,0,0,0,6,0,0,8,7,0,4,0,0,10,0,0,0, -0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,8,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0, -0,0,0,10,4,0,0,0,0,0,0,0,0,0,6,0,5,0,0,9,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0, -0,7,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,6,10,7,0,0,0,0,0,0,0,0,8,4,0,0,10,0,0,0,0,4,0,6,0,6,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,7,17,0,0,0,0,0, -0,0,0,0,0,0,10,0,0,7,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -6,0,0,0,5,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,5,0,4,0,0,0,0,0,6,0,0,0,0,0,0,10,5,0,0, -0,5,0,0,0,0,9,0,19,7,0,0,0,0,0,7,0,0,0,0,10,6,0,0,0,6,0,5,0,0,0,0,0,0,0,0,0,6,8, -0,0,0,0,0,11,0,0,0,0,0,0,6,0,0,0,0,0,7,9,0,15,0,0,0,0,0,0,0,0,0,0,4,0,0,0,5,0,0, -0,0,0,0,0,6,0,0,0,0,0,0,0,4,0,0,0,0,9,0,0,0,0,0,0,0,0,6,0,7,0,0,0,0,0,0,0,6,0,0, -0,0,0,6,10,0,0,0,0,0,0,0,23,0,14,0,0,0,0,7,0,0,0,0,0,7,0,0,9,0,0,0,0,7,0,0,0,0, -0,6,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,4,0,0,0, -0,0,0,0,0,9,5,0,0,0,0,0,4,0,0,0,0,9,5,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,10,0,0,0,0,0,0,5,0,4,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,6,11,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,14,7,0,0,12,7,0,0,0, -0,0,0,0,0,0,4,0,0,0,0,0,6,0,0,0,0,8,6,10,0,0,0,0,0,0,0,0,0,10,7,8,5,0,0,0,0,0,0, -0,0,8,4,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,5,0,0,9,5,0,0,0,0,0,5,0,0,0,0,0,4,0,0,0, -0,0,0,0,0,0,0,12,4,11,0,0,0,9,0,11,7,0,0,0,0,0,0,10,6,0,0,0,6,0,0,0,0,15,5,0,0, -11,6,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,4,0,4,0,6,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,8,0,0,0,19,7,0,4,0,0,9,0,0,0,0,0,10,0, -0,6,0,0,13,0,12,6,0,0,0,0,0,0,0,0,10,7,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,13,7,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,6,0,6,0,4,9,0,0,0,10,0,0,0,0,0,0,0, -0,5,0,0,0,0,0,0,10,0,23,6,0,0,0,6,8,0,0,0,0,0,0,0,0,0,17,7,0,0,0,0,11,6,22,5,0, -0,9,6,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,9,6,0,5,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,4,11,0,9,4,0,0, -0,7,0,7,0,0,0,0,0,0,12,4,0,0,0,0,0,0,0,0,0,0,0,0,11,4,0,0,0,0,0,0,0,0,0,0,0,0,0, -4,0,0,11,5,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,8,6,0,0,0,4,0,0,0,0, -0,0,0,0,0,7,0,0,0,4,0,0,10,4,0,0,0,0,0,0,0,7,0,7,0,0,0,6,0,0,0,0,8,6,0,6,0,6,0, -0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,8,7,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,6,0,0,0,0,0,0,9,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,6,22,6,12,0,0,6,0,0,0,6,0,0,0,0,0,7,0,0,0,0,11,0,0,0, -9,7,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,6,0,0,0,6,0,6,0,0,8,7,0,0,0,4,9,7,19,0,0,0,0,0,0,0,0,0,9,6,10,6,0,6,0,0,0, -4,0,0,8,7,0,0,0,0,0,0,0,0,0,0,0,6,16,7,10,6,0,0,23,6,11,7,0,4,0,0,0,0,0,0,0,0,0, -5,0,0,0,0,10,7,0,0,0,0,0,7,0,0,0,0,0,0,15,0,10,0,0,0,14,6,0,0,0,0,0,0,0,0,0,0,0, -5,0,0,0,0,0,0,0,5,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,5,0,0,11,5,0,0,0,0,0,0,0,0,0,0, -0,4,0,0,0,0,0,6,0,0,10,0,0,0,0,7,0,0,0,0,0,0,10,6,0,0,0,0,8,4,0,0,0,7,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,7,12,5,0,0,0,0, -0,6,0,0,0,0,9,6,0,0,0,0,0,0,0,6,9,0,0,0,0,6,0,0,0,0,8,7,0,0,0,0,0,0,0,6,0,0,0,0, -0,0,0,0,0,0,10,5,0,0,0,0,0,0,8,6,0,0,0,0,0,6,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,8,5,0,0,0,0,0,7,0,7,0,4,0,0,10,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,5,0,0,0,0,13, -7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,8,7,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,7,0,0,13,0,0,0,0,0,0,0,0,7,10,5,0,0,0,0,0,0,9,7,0,0,8,6,9, -5,0,0,0,0,0,6,12,0,0,0,0,0,0,0,18,6,0,0,0,0,0,0,0,0,19,7,0,4,0,0,0,0,9,5,0,5,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,7,0,0,0,0,0,0,14,0,0,0,23,7,8,7,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,6,22,0,0,7,0,0,0,0,0,0,0,0,9,7,8,4,0, -0,0,0,0,0,0,0,8,5,0,6,0,0,0,0,0,6,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0, -8,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,12,5,0,0,0,0,0,0,0,0,0,0,8,6,0,0,11,7,0,0,0, -0,12,0,8,6,19,7,0,0,0,0,0,0,0,0,0,0,0,0,0,6,11,0,0,6,0,7,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,11,7,0,0,0,0,0,4,10,0,0,0,0,0,0,0,8,7,0,0,0,0,14,0,8,0,0,6,10,0,0, -0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,6,0,0,0,0, -0,0,0,0,13,0,0,0,0,0,0,0,11,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0, -0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,5,0,0,0,6,0,0,0,5,0,7,0,0,0, -0,0,6,0,0,21,7,0,0,9,6,0,0,0,6,0,0,13,7,0,0,0,5,0,0,0,0,0,4,0,6,0,0,0,0,0,0,0,0, -0,0,0,4,0,0,0,0,0,0,11,5,0,6,0,0,10,5,0,0,0,0,0,0,0,0,9,6,0,0,8,7,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,9,0,0,0,0,0,0,6,0,0,0,0,15,4,0,0,12,7,0,0,0,6, -0,7,0,0,8,0,9,5,0,4,0,0,0,6,0,6,0,0,23,4,0,0,0,0,0,0,0,0,0,0,0,0,10,7,0,4,0,0,8, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,6,0,0,0,0,0,0,0,0,0, -7,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,12,6,0,0,0,0,0,0,10,7,0,7,0,0,0,0,0,0,0,0,0,0, -9,0,0,0,0,0,8,0,0,0,0,4,0,0,0,0,0,0,0,0,0,4,11,5,0,0,0,6,0,6,0,0,0,0,0,0,0,6,0, -4,0,0,0,0,0,0,0,0,0,0,0,5,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,6,8,7,0,0,0,6,0,6,0, -0,0,0,0,0,0,0,0,5,0,0,0,0,0,5,0,0,0,0,11,0,0,0,0,0,0,0,10,5,9,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,23,7,0,0,0,0,0,7,0,0,10,6,18,0,0,0, -0,0,0,0,8,7,0,6,0,0,0,0,0,0,8,5,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0, -0,0,0,0,0,6,0,0,0,4,12,7,0,0,0,0,0,0,0,0,10,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,6,0,0,0,0,0,0,13,5,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,4,0,0,0,0,0,0,0,0, -11,7,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0, -0,0,0,0,6,0,0,0,4,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,10,0,11,0,0,0,0,0,0,0,0,0, -17,5,0,4,0,0,0,0,0,0,0,7,0,0,0,0,0,6,0,0,0,0,0,0,0,4,0,0,0,0,8,7,0,0,0,0,0,0,0, -0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0,0, -10,0,0,0,8,6,0,0,0,7,0,0,0,0,0,0,8,0,0,0,14,0,0,0,0,7,0,0,0,4,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,9,4,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0, -10,0,0,0,16,5,0,0,0,0,0,0,8,0,0,4,0,0,0,0,0,0,0,0,0,0,9,6,0,0,0,0,0,0,10,0,0,0, -0,0,0,0,0,5,0,0,0,0,12,5,0,7,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,7,0, -0,0,0,0,0,0,0,12,6,0,0,0,0,0,7,0,6,0,6,12,6,0,0,0,0,0,0,0,4,8,7,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,6,0,6,0,0,0,0,0,0,0,0,10,6,8,0,0, -6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -16,0,8,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,23,5,0,0,0,7,0,6,0, -0,0,0,0,0,0,0,0,0,0,0,10,6,0,0,9,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,14,0,0,0,0,7,0,0,0,4,17,5,0,0,0,0,11,0,9,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,6,0,0,0,5,0,7,0,0,0,0,0,0,0,0,8,0,0,0, -12,6,0,0,0,0,0,0,13,0,0,0,0,7,9,0,0,0,0,0,0,0,0,0,0,5,0,0,0,7,10,7,12,0,0,0,9,0, -0,0,14,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,15,6,0,0,23,0,0,7,0,6,0,0,0,7,0,6, -0,0,0,0,0,0,0,6,0,6,9,0,0,0,0,0,0,0,8,7,0,0,0,0,0,0,0,0,8,7,9,4,0,0,10,0,0,0,10, -6,0,7,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,23,0,0,6,0,0,0,0,0,0,9,4, -0,0,10,7,0,0,0,0,0,0,0,0,0,0,0,0,9,7,0,0,9,6,0,0,0,0,8,6,0,0,0,0,0,0,0,0,12,0,0, -0,0,0,8,0,0,6,11,6,0,0,8,7,8,5,0,0,0,0,0,5,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,0,0,0, -10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0, -7,0,0,0,0,9,6,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,8,0,0,0,0,6,12,5,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,10,0,10, -7,0,0,8,0,0,0,0,4,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,5,0, -0,0,4,0,0,0,0,0,4,0,0,0,0,0,0,0,6,0,6,0,5,0,0,0,0,8,0,0,0,10,7,0,0,0,0,10,0,0,0, -0,0,13,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,19,7,0,4,12,0,8,0,0,0,0,6,0,0,0,0, -0,0,0,6,0,0,0,0,0,0,0,0,0,4,0,0,0,0,18,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0, -0,14,0,0,4,0,0,0,6,0,0,0,6,0,0,0,7,0,0,0,0,0,0,10,4,0,0,9,7,0,0,11,0,0,0,0,0,0, -7,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,4,0,0,12,0,0,0, -0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,22,5,9,7,0,0,0,0,0,0,0,0,0, -0,0,6,0,0,9,6,0,5,0,0,0,0,0,0,10,5,0,0,8,6,0,6,10,5,0,0,0,6,0,0,0,6,0,0,20,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,6,0,0,0,0,17,4,0,7,0,6, -0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10, -0,0,0,0,0,0,0,0,0,0,0,8,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,7,0,0,0,0,0,0,0, -0,0,7,0,0,8,6,12,0,0,7,18,7,0,0,8,4,0,0,0,0,9,6,0,0,0,0,0,0,0,0,13,0,0,6,0,0,0, -0,0,0,0,0,0,0,10,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,7,0,0, -0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,8,5,0,0,0,0,0,0,0,0,12,0,0,0,8,0,0,0,0,0,0, -4,0,0,10,0,16,0,0,0,0,0,0,0,12,7,10,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,16,6,10,0,0,5,0,0,0,0,0,6,0,0,0,0, -0,7,0,0,0,7,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,5,8,7,0,7,0,0,0,0,0,0,0,0,8,0,0,6,0,0,0,6,0,0,0,4,0,0,0,0, -8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,7,0,0,8,0,0,0, -9,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,7,13,5,0,5,0,0,0,7,8,4,0,0,0,0,0,0,0, -0,12,0,0,0,0,0,0,0,0,0,0,0,8,6,0,6,0,0,11,0,0,0,0,0,0,0,0,6,0,0,0,0,0,4,0,0,0,0, -0,0,0,0,0,6,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,10,7,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,11,6,0,0,10,6,0,0, -0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6, -0,0,0,6,0,0,0,7,0,0,9,0,8,7,11,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,9,6,10,5,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,10,7,0,0,0,0,0,0,11,0,9,6,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,5,0,6,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,15,5,12,5, -0,0,0,0,0,0,12,7,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,6,0,0,12,6,0, -0,0,0,24,4,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,7,0,0,0,0,0,0,0,0,0,0, -0,0,0,4,10,4,0,0,0,0,10,7,0,0,0,0,0,0,0,0,0,0,0,0,9,0,11,0,0,0,0,0,0,0,0,0,0,6, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5, -0,0,8,0,0,0,0,7,0,0,0,0,0,0,10,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,10,7,0,0,0,0,0, -0,0,0,0,0,14,7,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,4,0,0,0,6,0,0,0,0,0,6,0,0,0,6,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,11,6,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,0,0,7,20,7,11,4,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,7,9,6,0,0,12,7,0,0,0,0,0,0,10,0,12,0, -0,0,0,0,0,4,9,6,13,0,0,0,0,0,0,0,0,6,0,0,0,6,0,0,0,5,0,0,0,0,0,0,8,0,0,0,0,0,0, -0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,6,0,0,11,0,9,0,0,0,0,4,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,8,5,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0, -0,4,0,5,0,0,0,0,0,0,0,0,0,4,0,0,0,0,9,7,8,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0, -0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,6, -0,0,0,0,8,7,0,0,0,0,0,0,12,0,0,6,0,0,0,0,0,0,0,6,8,4,0,0,10,7,0,0,10,0,0,0,0,0, -0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,7,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,4,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,7,0,0,0,0,0,0,0,5, -0,4,0,0,0,0,0,6,0,0,0,0,0,0,8,0,0,6,0,0,0,6,0,0,0,0,0,7,0,5,8,4,0,0,9,0,0,0,0,4, -0,0,0,0,0,0,0,0,0,5,0,0,15,6,8,6,0,0,0,6,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,6,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,9,6,0,0,0,0,0,0,0,7,0,0,0,4,0, -6,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,6,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,9,5,0,6,12,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,6,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,8,7,0,6,0,0,0,0,0,0,0,0,0,0,0,0,11,0,12,7,0,0,0,0, -0,0,0,0,0,5,0,5,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,11,4,0,0,0,0,0,0,0,0,0,0,10, -7,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,7,8,7,9,6,0,0,0,0,0,0,0,0,8,6,0,0,0,0,0,5,12,0, -10,5,12,6,0,0,0,7,0,0,0,0,0,0,0,5,0,0,0,5,9,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7, -11,7,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,6,0,7,0,0,0,0,8,0,8,5,0,6,0,0,0,6,0,0,0, -0,0,0,0,6,0,6,0,6,9,0,0,5,17,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,7,0,0, -0,0,0,7,0,0,0,0,16,5,0,0,0,0,0,0,0,4,0,0,0,5,11,5,0,7,0,0,0,4,8,7,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,7,0,0,0,0,12,0,0,0, -0,0,12,0,0,0,0,0,0,0,0,4,10,4,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,6,0,0,0,0,0,0,0,4,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,20,5,0,0, -10,0,0,0,0,0,0,0,0,0,0,6,0,0,0,6,12,0,0,0,0,0,0,6,0,0,0,0,0,0,9,4,10,7,0,4,0,0, -0,0,0,0,10,6,0,0,0,0,8,4,0,7,8,6,0,6,8,0,10,0,0,0,0,0,13,5,0,6,0,0,0,0,0,0,22,4, -0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,6,0,0,0,6,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,6,10, -5,8,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,10,4,0,0,10,7,0,0,0,0,0,5,0, -5,8,0,0,0,0,6,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,10,7,0,0,0,4,0,0,0,0,0,6,0,0, -0,0,0,0,0,0,8,7,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,7,0,0,0,6,0,0,0,0,0,0,0,0,0, -4,0,0,0,4,10,0,0,6,13,7,8,0,0,0,0,0,0,7,0,0,12,7,0,0,0,0,0,0,10,5,0,0,0,0,0,6,0, -0,0,0,0,0,0,0,0,0,13,7,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,6,0,0,0,0,0,0,0,0,8,6,0,6, -0,0,0,0,0,0,0,0,12,0,8,4,0,0,0,0,0,4,0,4,0,0,0,0,0,0,0,5,0,0,0,0,12,5,0,0,0,7,0, -0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,6,10,0,0,0,20,0,0,5,0,0,10, -7,11,7,0,0,0,0,0,0,0,0,0,0,17,0,9,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,10,7,0,4,0,6,0,0,24,0,0,5,0,0,0,0,8,0,0, -0,0,0,0,0,10,5,0,4,0,6,0,0,8,0,0,0,0,0,0,4,0,6,0,0,0,0,0,0,9,5,0,0,0,0,0,0,0,0, -0,0,0,6,0,0,0,0,9,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,4,0,7, -0,0,13,0,0,0,0,0,0,0,11,6,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0, -17,7,0,0,11,6,0,0,0,0,12,6,0,0,0,6,0,6,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,5,0,0,0,6,0,0,0,0,0,0,0,0,0,0,10,0,0,4,8,6,0,0,0, -0,0,0,9,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,9,5,0,7,18,0,0,0,0,0,0,0,0,0,0,0,0,0,8,6,0,0,0,0,0,0,0,0,8,0,0,0, -0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0, -0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,4,0,6,0,0,9,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0, -0,0,0,8,7,10,0,8,5,0,0,0,0,0,0,0,0,9,0,0,0,10,0,0,0,0,6,0,7,0,4,0,0,0,0,0,0,0,0, -8,0,0,0,0,0,8,4,0,0,0,0,0,5,0,0,10,0,12,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -4,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,6,11,0,0, -7,0,0,0,0,0,6,10,5,0,0,0,0,0,0,0,0,0,5,0,0,9,5,12,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,6,0,0,0,0,13,6,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0, -0,0,0,8,4,0,6,12,0,0,0,0,0,0,0,0,0,0,0,0,6,0,6,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,11,4,0,0,0,6,14,0,11,0,9,6,0,0,0,0,0,0,22,0,12,0,8,6,0,0,0,0,0,0,0,6,0, -0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0, -10,7,0,0,0,0,0,0,0,0,9,0,0,0,0,4,0,0,0,0,0,0,0,0,0,5,11,0,0,0,0,0,0,0,8,6,0,0,9, -7,0,0,12,4,0,0,0,0,0,0,12,6,0,6,0,7,0,0,8,5,0,0,0,0}; -/* GENERATED CODE END */ +#if (BROTLI_STATIC_INIT != BROTLI_STATIC_INIT_NONE) +BROTLI_BOOL BROTLI_COLD BrotliEncoderInitDictionaryHash( + const BrotliDictionary* dict, uint16_t* words, uint8_t* lengths) { + size_t global_idx = 0; + size_t len; + size_t i; + static const uint8_t frozen_idx[1688] = {0, 0, 8, 164, 32, 56, 31, 191, 36, 4, +128, 81, 68, 132, 145, 129, 0, 0, 0, 28, 0, 8, 1, 1, 64, 3, 1, 0, 0, 0, 0, 0, 4, +64, 1, 2, 128, 0, 132, 49, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 1, 0, 36, 152, +0, 0, 0, 0, 128, 8, 0, 0, 128, 0, 0, 8, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, +0, 0, 0, 1, 0, 64, 133, 0, 32, 0, 0, 128, 1, 0, 0, 0, 0, 4, 4, 4, 32, 16, 130, +0, 128, 8, 0, 0, 0, 0, 0, 64, 0, 64, 0, 160, 0, 148, 53, 0, 0, 0, 0, 0, 128, 0, +130, 0, 0, 0, 8, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 32, 1, 32, 129, 0, 12, 0, +1, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 16, 32, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, +0, 0, 2, 0, 0, 0, 0, 0, 32, 0, 0, 0, 2, 66, 128, 0, 0, 16, 0, 0, 0, 0, 64, 1, 6, +128, 8, 0, 192, 24, 32, 0, 0, 8, 4, 128, 128, 2, 160, 0, 160, 0, 64, 0, 0, 2, 0, +0, 0, 0, 0, 0, 0, 0, 0, 32, 1, 0, 0, 64, 0, 0, 0, 0, 0, 0, 32, 0, 66, 0, 2, 0, +4, 0, 8, 0, 2, 0, 0, 33, 8, 0, 0, 0, 8, 0, 128, 162, 4, 128, 0, 2, 33, 0, 160, +0, 8, 0, 64, 0, 160, 0, 129, 4, 0, 0, 32, 0, 0, 32, 0, 2, 0, 0, 0, 0, 0, 0, 128, +0, 0, 0, 0, 0, 64, 10, 0, 0, 0, 0, 32, 64, 0, 0, 0, 0, 0, 16, 0, 16, 16, 0, 0, +80, 2, 0, 0, 0, 0, 8, 0, 0, 16, 0, 8, 0, 0, 0, 8, 64, 128, 0, 0, 0, 8, 208, 0, +0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 32, 0, 8, 0, 128, 0, 0, 0, 1, 0, 0, 0, +16, 8, 1, 136, 0, 0, 36, 0, 64, 9, 0, 1, 32, 8, 0, 64, 64, 131, 16, 224, 32, 4, +0, 4, 5, 160, 0, 131, 0, 4, 96, 0, 0, 184, 192, 0, 177, 205, 96, 0, 0, 0, 0, 2, +0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 128, 0, 0, 8, 0, 0, 0, 0, 1, 4, 0, 1, +0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 4, 0, 0, 64, 69, 0, 0, 8, 2, 66, 32, 64, 0, 0, 0, +0, 0, 1, 0, 128, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 16, 0, 0, 4, 128, 64, +0, 0, 0, 0, 0, 0, 0, 0, 224, 0, 8, 0, 0, 130, 16, 64, 128, 2, 64, 0, 0, 0, 128, +2, 192, 64, 0, 65, 0, 0, 0, 16, 0, 0, 0, 32, 4, 2, 2, 76, 0, 0, 0, 4, 72, 52, +131, 44, 76, 0, 0, 0, 0, 64, 1, 16, 148, 4, 0, 16, 10, 64, 0, 2, 0, 1, 0, 128, +64, 68, 0, 0, 0, 0, 0, 64, 144, 0, 8, 0, 2, 0, 0, 0, 0, 0, 0, 3, 64, 0, 0, 0, 0, +1, 128, 0, 0, 32, 66, 0, 0, 0, 40, 0, 18, 0, 0, 0, 0, 0, 33, 0, 0, 32, 0, 0, 32, +0, 128, 4, 64, 145, 140, 0, 0, 0, 128, 0, 2, 0, 0, 20, 0, 80, 38, 0, 0, 32, 0, +32, 64, 4, 4, 0, 4, 0, 0, 0, 129, 4, 0, 0, 144, 17, 32, 130, 16, 132, 24, 134, +0, 0, 64, 2, 5, 50, 8, 194, 33, 1, 68, 117, 1, 8, 32, 161, 54, 0, 130, 34, 0, 0, +0, 64, 128, 0, 0, 2, 0, 0, 0, 0, 32, 1, 0, 0, 0, 3, 14, 0, 0, 0, 0, 0, 16, 4, 0, +0, 0, 0, 0, 0, 0, 0, 96, 1, 24, 18, 0, 1, 128, 24, 0, 64, 0, 4, 0, 16, 128, 0, +64, 0, 0, 0, 64, 0, 8, 0, 0, 0, 0, 0, 66, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 16, 0, 64, 2, 0, 0, 0, 0, 6, 0, 8, 8, 2, 0, 64, 0, 0, 0, 0, 128, 2, +2, 12, 64, 0, 64, 0, 8, 0, 128, 32, 0, 0, 10, 0, 0, 32, 0, 128, 32, 33, 8, 136, +0, 96, 64, 0, 0, 0, 0, 0, 64, 4, 16, 4, 8, 0, 0, 0, 16, 0, 2, 0, 0, 1, 128, 0, +64, 16, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 2, 0, 16, 0, 4, 0, 8, 0, 0, 0, 0, 0, +20, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 136, 0, 0, 0, 0, 0, 8, 0, +0, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, +0, 0, 4, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 2, 128, 0, 0, 0, 8, 2, 0, 0, 128, 0, 16, 2, 0, 0, 4, 0, 32, 0, 0, 1, +4, 64, 64, 0, 4, 0, 1, 0, 16, 0, 32, 68, 4, 4, 65, 10, 0, 20, 37, 18, 1, 148, 0, +32, 128, 3, 8, 0, 64, 0, 0, 0, 0, 0, 0, 4, 0, 16, 1, 128, 0, 0, 0, 128, 16, 0, +0, 0, 0, 1, 128, 0, 0, 128, 64, 128, 64, 0, 130, 0, 164, 8, 0, 0, 1, 64, 128, 0, +18, 0, 2, 150, 0, 8, 0, 0, 64, 0, 81, 0, 0, 16, 128, 2, 8, 36, 32, 129, 4, 144, +13, 0, 0, 3, 8, 1, 0, 2, 0, 0, 64, 0, 5, 0, 1, 34, 1, 32, 2, 16, 128, 128, 128, +0, 0, 0, 2, 0, 4, 18, 8, 12, 34, 32, 192, 6, 64, 224, 33, 0, 0, 137, 72, 64, 0, +24, 8, 128, 128, 0, 16, 0, 32, 128, 128, 132, 8, 0, 0, 16, 0, 64, 0, 0, 4, 0, 0, +16, 0, 4, 128, 64, 0, 0, 1, 0, 4, 64, 32, 144, 130, 2, 128, 0, 192, 0, 64, 82, +64, 1, 32, 128, 128, 2, 0, 84, 0, 32, 0, 44, 24, 72, 80, 32, 16, 0, 0, 44, 16, +96, 64, 1, 72, 131, 0, 0, 0, 16, 0, 0, 165, 0, 129, 2, 49, 48, 64, 64, 12, 64, +176, 64, 84, 8, 128, 20, 64, 213, 136, 104, 1, 41, 15, 83, 170, 0, 0, 41, 1, 64, +64, 0, 193, 64, 64, 8, 0, 128, 0, 0, 64, 8, 64, 8, 1, 16, 0, 8, 0, 0, 2, 1, 128, +28, 84, 141, 97, 0, 0, 68, 0, 0, 129, 8, 0, 16, 8, 32, 0, 64, 0, 0, 0, 24, 0, 0, +0, 192, 0, 8, 128, 0, 0, 0, 0, 0, 64, 0, 1, 0, 0, 0, 0, 40, 1, 128, 64, 0, 4, 2, +32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 32, 8, 0, 32, 0, 0, 0, 16, 17, 0, +2, 4, 0, 0, 33, 128, 2, 0, 0, 0, 0, 129, 0, 2, 0, 0, 0, 36, 0, 32, 2, 0, 0, 0, +0, 0, 0, 32, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 32, 64, 0, 0, 0, 0, 0, 0, +32, 0, 0, 32, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 16, 0, 0, 0, 0, 0, 0, 0, +1, 0, 136, 0, 0, 24, 192, 128, 3, 0, 17, 18, 2, 0, 66, 0, 4, 24, 0, 9, 208, 167, +0, 144, 20, 64, 0, 130, 64, 0, 2, 16, 136, 8, 74, 32, 0, 168, 0, 65, 32, 8, 12, +1, 3, 1, 64, 180, 3, 0, 64, 0, 8, 0, 0, 32, 65, 0, 4, 16, 4, 16, 68, 32, 64, 36, +32, 24, 33, 1, 128, 0, 0, 8, 0, 32, 64, 81, 0, 1, 10, 19, 8, 0, 0, 4, 5, 144, 0, +0, 8, 128, 0, 0, 4, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 0, 0, 80, 1, 0, 0, +33, 0, 32, 66, 4, 2, 0, 1, 43, 2, 0, 0, 4, 32, 16, 0, 64, 0, 3, 32, 0, 2, 64, +64, 116, 0, 65, 52, 64, 0, 17, 64, 192, 96, 8, 10, 8, 2, 4, 0, 17, 64, 0, 4, 0, +0, 4, 128, 0, 0, 9, 0, 0, 130, 2, 0, 192, 0, 48, 128, 64, 0, 96, 0, 64, 0, 1, +16, 32, 0, 1, 32, 6, 128, 2, 32, 0, 12, 0, 0, 48, 32, 8, 0, 0, 128, 0, 18, 0, +0, 28, 24, 41, 16, 5, 32, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 1, 0, 0, 0, 16, 0, 0, 0, 0, 64, 0, 0, 0, 0, 8, 0, 0, 0, 0, 16, 128, +0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0}; + + memset(lengths, 0, BROTLI_ENC_NUM_HASH_BUCKETS); + + for (len = BROTLI_MAX_DICTIONARY_WORD_LENGTH; + len >= BROTLI_MIN_DICTIONARY_WORD_LENGTH; --len) { + size_t length_lt_8 = len < 8 ? 1 : 0; + size_t n = 1u << dict->size_bits_by_length[len]; + const uint8_t* dict_words = dict->data + dict->offsets_by_length[len]; + for (i = 0; i < n; ++i) { + size_t j = n - 1 - i; + const uint8_t* word = dict_words + len * j; + const uint32_t key = Hash14(word); + size_t idx = (key << 1) + length_lt_8; + if ((lengths[idx] & 0x80) == 0) { + BROTLI_BOOL is_final = TO_BROTLI_BOOL(frozen_idx[global_idx / 8] & + (1u << (global_idx % 8))); + words[idx] = (uint16_t)j; + lengths[idx] = (uint8_t)(len + (is_final ? 0x80 : 0)); + } + global_idx++; + } + } + for (i = 0; i < BROTLI_ENC_NUM_HASH_BUCKETS; ++i) { + lengths[i] &= 0x7F; + } + + return BROTLI_TRUE; +} + +BROTLI_MODEL("small") +uint16_t kStaticDictionaryHashWords[BROTLI_ENC_NUM_HASH_BUCKETS]; +BROTLI_MODEL("small") +uint8_t kStaticDictionaryHashLengths[BROTLI_ENC_NUM_HASH_BUCKETS]; + +#else /* BROTLI_STATIC_INIT */ + +/* Embed kStaticDictionaryHashWords and kStaticDictionaryHashLengths. */ +#include "dictionary_hash_inc.h" + +#endif /* BROTLI_STATIC_INIT */ #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ diff --git a/deps/brotli/c/enc/dictionary_hash.h b/deps/brotli/c/enc/dictionary_hash.h index e553ea5d4efb20..dfddc017dfe8cb 100644 --- a/deps/brotli/c/enc/dictionary_hash.h +++ b/deps/brotli/c/enc/dictionary_hash.h @@ -9,14 +9,34 @@ #ifndef BROTLI_ENC_DICTIONARY_HASH_H_ #define BROTLI_ENC_DICTIONARY_HASH_H_ -#include +#include "../common/platform.h" +#include "../common/static_init.h" + +#if (BROTLI_STATIC_INIT != BROTLI_STATIC_INIT_NONE) +#include "../common/dictionary.h" +#endif #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif -extern const uint16_t kStaticDictionaryHashWords[32768]; -extern const uint8_t kStaticDictionaryHashLengths[32768]; +/* Bucket is (Hash14 * 2 + length_lt_8); in other words we reserve 2 buckets + for each hash - one for shorter words and one for longer words. */ +#define BROTLI_ENC_NUM_HASH_BUCKETS 32768 + +#if (BROTLI_STATIC_INIT != BROTLI_STATIC_INIT_NONE) +BROTLI_BOOL BROTLI_INTERNAL BrotliEncoderInitDictionaryHash( + const BrotliDictionary* dictionary, uint16_t* words, uint8_t* lengths); +BROTLI_INTERNAL extern BROTLI_MODEL("small") uint16_t + kStaticDictionaryHashWords[BROTLI_ENC_NUM_HASH_BUCKETS]; +BROTLI_INTERNAL extern BROTLI_MODEL("small") uint8_t + kStaticDictionaryHashLengths[BROTLI_ENC_NUM_HASH_BUCKETS]; +#else +BROTLI_INTERNAL extern const BROTLI_MODEL("small") uint16_t + kStaticDictionaryHashWords[BROTLI_ENC_NUM_HASH_BUCKETS]; +BROTLI_INTERNAL extern const BROTLI_MODEL("small") uint8_t + kStaticDictionaryHashLengths[BROTLI_ENC_NUM_HASH_BUCKETS]; +#endif #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ diff --git a/deps/brotli/c/enc/dictionary_hash_inc.h b/deps/brotli/c/enc/dictionary_hash_inc.h new file mode 100644 index 00000000000000..89e04f0f4a8d95 --- /dev/null +++ b/deps/brotli/c/enc/dictionary_hash_inc.h @@ -0,0 +1,1829 @@ +const BROTLI_MODEL("small") +uint16_t kStaticDictionaryHashWords[BROTLI_ENC_NUM_HASH_BUCKETS] = { +1002,0,0,0,0,0,0,0,0,683,0,0,0,0,0,0,0,1265,0,0,0,0,0,1431,0,0,0,0,0,0,40,0,0,0, +0,155,8,741,0,624,0,0,0,0,0,0,0,0,0,0,0,0,66,503,0,0,0,451,0,0,0,0,0,0,0,835,70, +0,0,539,0,0,0,0,0,0,0,0,0,113,0,0,0,0,718,0,0,0,0,0,0,520,0,1070,0,0,0,0,0,1515, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,610,0,0,750,0,0,0,307,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,964,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,0,0,0, +645,75,0,649,52,282,0,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1621,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,211,225,0,0,687,718,0,0,110,0,58,0,0,0,0,0,0,345,0,0,301,0,0, +0,203,0,0,1154,674,1949,0,0,0,0,0,0,0,0,0,259,0,0,0,0,0,0,0,1275,0,0,0,1231,254, +0,0,0,0,0,0,0,277,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,0,0,800,0,0,0,29, +116,100,490,0,0,0,0,0,1641,0,543,0,0,0,0,41,181,0,657,0,0,202,25,0,0,0,0,0,0,0, +0,0,0,423,0,0,0,113,0,0,0,927,963,0,976,0,206,0,0,0,0,0,0,0,0,0,2002,0,0,0,0,0, +0,0,0,0,0,0,696,0,1170,0,0,0,0,226,13,0,769,678,551,0,0,0,0,0,0,57,0,0,0,10,188, +0,0,0,624,0,0,0,0,0,0,0,0,0,1941,130,0,0,0,0,378,269,0,0,528,0,1146,0,0,0,1105, +0,1616,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,656,0,1940,0,0,0,0,0,173,0,0,0,0,0,0,0,0,0, +0,0,457,342,810,0,0,0,0,620,0,0,0,0,0,0,0,967,95,447,406,0,0,0,477,0,1268,944, +1941,0,0,0,629,0,0,0,0,0,375,0,0,0,1636,0,0,0,0,774,0,1,1034,0,0,0,0,0,824,0,0, +0,0,0,118,0,0,560,296,0,0,0,0,0,0,0,0,1009,894,0,0,0,0,0,0,0,0,0,0,0,0,0,1474, +366,0,0,0,0,0,0,0,0,0,79,1723,0,0,200,0,0,0,0,0,0,0,0,1759,372,0,16,0,943,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,258,0,0,900,1839,707,30,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,2004,0,0,10,115,0,50,0,0,0,0,0,0,0,0,0,0,520,1,0,738,98,482,0,0,0,0, +0,0,0,0,0,0,701,2,0,0,0,0,0,0,0,0,557,0,0,0,0,0,0,0,0,0,347,0,0,0,0,572,0,0,0,0, +0,0,0,0,0,832,0,0,797,809,0,0,0,0,0,0,0,0,0,0,0,528,0,0,0,861,0,0,294,0,0,0,109, +0,0,0,0,0,0,0,0,1187,290,266,0,0,0,0,49,50,748,0,0,466,399,0,0,0,0,0,0,0,378,0, +519,0,0,0,0,0,0,0,0,0,0,0,0,667,351,902,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,180, +0,0,869,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,523,36,0,0,587,510,809,29,260,0,0, +0,0,0,0,0,0,570,0,565,0,1464,0,0,0,0,0,0,10,0,0,787,399,380,200,0,0,0,0,516,0, +844,887,0,0,0,0,0,0,0,44,0,0,0,305,1655,0,0,0,0,0,0,0,0,0,0,0,0,0,0,786,10,0,0, +0,0,0,0,0,0,0,2031,0,0,0,0,0,684,0,0,0,0,0,1480,0,0,0,27,0,0,0,395,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,813,511,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,0,0,0,206, +496,0,0,0,0,0,909,0,891,0,0,0,0,0,0,0,0,0,687,0,0,0,1342,0,0,0,0,0,0,0,0,0,0, +160,41,0,0,0,0,0,0,0,0,0,0,0,1718,778,0,0,0,0,0,0,0,0,0,0,1610,0,0,0,0,0,115,0, +0,0,0,314,294,0,0,0,983,178,193,0,0,0,0,0,0,0,0,0,174,0,0,0,0,0,0,0,0,0,0,848, +1796,0,0,0,0,0,0,221,0,687,1660,0,0,0,0,262,0,0,179,0,0,0,0,0,66,0,773,0,352,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35,0,152,0,0,1197,0,0,0,0,0,0,0,0,0,0,0,0,560,0,0, +564,0,0,0,797,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,556,0,819,0,0,0,0,0,0,0,0,719,544, +637,5,0,0,0,0,0,0,0,0,0,0,0,101,0,1441,0,0,0,893,0,0,0,0,0,0,0,0,0,238,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,1296,0,0,969,1729,314,60,0,0,0,0,0,1144,0,1147,0,0,0,0,0, +0,0,0,0,0,437,1853,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,828,0,176,0,0,0,0,0,0,434,39,0, +0,0,0,0,159,0,0,0,902,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,270,0,0,0,0,801,556,0,0, +0,0,0,0,0,416,19,197,369,0,0,0,0,0,0,0,0,0,28,34,0,757,0,0,898,1553,0,721,0,0,0, +0,1012,0,0,0,0,1102,0,898,183,0,0,0,0,0,0,0,136,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,277,0,0,0,435,0,0,0,0,0,1311,0,0,0,0, +0,0,211,437,0,0,0,28,0,0,750,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2012,0,702, +0,808,0,0,0,0,739,166,0,0,0,0,0,0,719,170,500,0,0,0,0,0,0,0,0,1500,327,0,0,450, +0,0,0,1318,0,0,0,1602,0,0,331,754,0,0,0,0,0,1368,0,0,557,0,0,0,799,850,0,0,0,0, +0,0,0,0,908,0,0,0,0,0,19,62,459,0,0,0,0,0,0,0,0,0,0,0,0,1802,0,0,0,0,0,0,0,0,0, +1397,0,0,0,0,120,238,0,0,0,0,0,0,0,0,0,0,0,1324,0,0,0,0,0,0,0,0,602,201,0,0,164, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,615,0,0,0,0,0,0,0,0,0,0,0,0,0,1243,0,0,0,0,968,0,0, +0,0,0,0,882,0,0,0,907,329,100,0,0,0,0,0,0,0,0,0,0,0,176,26,9,0,0,265,256,0,0,0, +0,0,0,0,0,0,643,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,610,0,0,0,0,973,2001,0, +0,0,0,0,0,522,0,0,0,0,0,0,0,0,0,0,0,553,0,0,0,0,0,0,1582,0,1578,0,0,0,0,0,0,0,0, +0,0,0,795,0,0,0,432,0,0,0,0,0,0,84,126,0,0,0,0,790,0,377,64,0,1529,0,0,0,0,530, +1857,539,1104,0,0,0,0,0,0,0,0,0,0,0,0,977,0,0,0,34,0,0,0,0,0,0,0,0,0,0,0,24,26, +0,0,918,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,183,379,0,0,0,0,0,0,0,792, +0,0,0,0,0,0,0,0,0,1920,0,0,0,0,0,0,0,0,0,771,0,0,0,1979,0,901,254,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,0,0,0,0,0,440,37,0, +508,0,0,0,513,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,533,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,752,920,0,1048,0,153,0, +0,391,0,0,1952,0,0,0,0,0,0,0,0,0,0,126,0,0,0,0,640,0,483,69,1616,0,0,0,0,0,734, +0,0,0,0,0,0,480,0,495,0,472,0,0,0,0,0,0,0,0,874,229,0,0,0,0,948,0,0,0,0,0,0,0,0, +1009,748,0,555,0,0,0,0,0,0,193,0,653,0,0,0,0,0,0,0,0,0,0,984,0,0,0,172,0,0,0,0, +0,0,0,0,83,1568,0,0,384,0,0,0,0,0,0,0,164,880,0,0,0,0,0,0,0,0,0,0,0,367,121,0,0, +828,0,0,0,0,0,0,0,1541,0,0,0,0,0,0,0,343,0,0,0,0,0,0,0,0,561,57,0,0,0,0,0,0,0, +926,0,0,0,0,827,0,194,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0, +0,0,0,896,1249,0,0,0,0,0,1614,0,0,0,860,0,0,0,0,0,0,0,0,964,102,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,899,0,569,0,0,0,0,795,2045,0,0,0, +0,0,0,104,52,0,0,0,0,0,604,0,0,0,0,779,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0, +494,0,677,0,0,0,0,0,0,0,508,0,0,0,0,0,0,0,0,0,1014,0,957,0,0,630,310,0,0,0,570, +0,0,449,0,64,537,0,0,0,0,0,0,0,244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,702,1650,49,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,338,0,0,0,0,1279,0,0,0,0,0,0,0,896,0,0, +178,0,0,0,0,0,0,0,0,0,0,0,0,0,808,695,0,0,0,0,539,1117,0,0,0,0,0,0,0,0,257,0, +1003,0,0,0,1,448,0,516,0,0,960,0,125,4,0,1268,30,748,0,0,852,0,0,0,6,0,0,848, +236,1385,862,1811,0,0,0,0,698,803,0,0,0,0,0,0,0,610,992,0,0,878,0,1847,0,0,0,0, +0,0,0,383,0,1404,0,0,0,0,986,0,347,0,0,0,0,0,0,0,0,0,0,0,592,572,0,1411,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,606,0,0,0,0,0,0, +0,0,0,0,0,0,0,1829,0,0,0,0,0,0,0,0,0,0,0,0,700,748,0,0,0,0,0,0,365,0,0,127,0,0, +83,198,0,0,0,0,0,0,864,55,0,0,0,0,726,1752,0,0,0,0,0,0,0,0,0,0,0,0,0,1066,0,764, +0,0,0,0,683,0,550,309,0,0,874,1212,0,0,0,1364,0,986,381,723,0,0,0,1573,0,0,0,0, +0,1025,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1559,0,0,0,0,493,133,0,0,0,0,148, +119,0,0,0,0,0,0,537,14,541,0,635,126,0,0,0,495,0,0,0,0,861,998,1009,0,0,0,0,0,0, +0,359,368,0,0,0,0,304,1577,0,0,0,0,0,1107,0,0,0,0,0,929,0,0,0,1142,0,0,0,0,289, +175,0,432,0,219,0,0,0,0,0,785,0,0,595,0,0,0,0,0,0,0,0,0,0,0,0,0,80,0,0,0,0,0,0, +931,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1323,0,0,0,0,290,0,559,1751,127,0,0,0, +934,1167,0,963,0,260,0,0,0,573,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +580,1689,0,0,0,0,0,0,0,0,0,1164,0,0,982,1922,0,63,0,0,0,0,0,793,0,0,0,0,0,0,0,0, +0,0,0,0,0,67,790,0,0,0,0,0,0,0,0,0,0,391,443,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,271,0,0,0,0,0,0,0,0,0,0,0,1140,0,0,0,0,340,300,0,897,0,0,0,0,0,0, +0,0,0,0,890,0,0,0,0,818,321,53,0,0,0,0,0,0,0,0,0,468,0,243,0,870,0,0,0,1765,121, +0,0,0,180,518,0,822,419,634,0,0,0,0,0,0,0,0,0,898,0,0,0,0,454,36,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,806,0,0,0,0,0,0,0,0,0,0,0,0,1326,0,104,0,0,0,0,0,0,0, +0,0,260,0,0,0,0,0,0,0,0,0,0,0,0,542,45,0,0,263,1516,42,0,0,0,0,0,468,0,1005,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,288,87,0,0,0,0,0,0,0,0,502,988,133,0,0,0,0,0,0, +141,0,0,872,1842,0,0,0,0,0,0,0,0,261,619,0,0,0,0,189,246,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,678,0,0,0,0,0,0,0,0,0,0,0,0,285,35,0,517,0,0,0,0,0,0,0,0,0,0, +540,214,667,0,74,0,0,125,0,0,0,0,0,761,131,0,0,0,0,0,0,0,0,0,0,0,0,0,333,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1338,94,0,0,0,0,0,0,0,0,0,0,0,0,449,0,646,103, +86,641,2028,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,869,87,277,117,39,0,0,0,0,0,0,0,0,938, +297,0,0,0,0,558,464,0,0,0,0,0,0,0,0,0,0,731,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1608,0, +0,0,0,0,0,0,1429,0,0,733,1010,0,0,338,1656,0,0,0,1038,979,2010,0,0,0,0,0,0,0, +1005,0,0,121,0,0,0,219,20,0,0,0,0,0,0,872,1440,0,0,0,683,0,1070,0,0,522,0,0,0,0, +439,669,0,0,0,0,0,0,0,0,1245,0,0,0,0,0,1218,0,0,547,233,0,0,0,0,0,0,0,0,0,482,0, +0,0,0,0,0,0,886,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,795,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,371,0,0,0,0,0,0,0,0,0,0,0,0,0,622,0,625,0,0,0,339,29,0,0,338,0,0,0, +0,130,0,0,0,0,0,0,0,0,0,307,0,0,0,0,0,0,0,0,0,0,2044,0,0,0,0,0,0,0,0,308,770,0, +0,0,0,0,1266,0,0,0,0,0,0,0,0,0,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,690,739,0,0, +0,0,0,0,0,990,0,0,0,1831,0,0,0,0,0,0,0,0,0,0,0,0,0,613,0,0,0,0,0,0,0,0,0,0,0,0, +0,763,0,878,0,0,0,977,0,100,0,0,0,0,0,0,0,0,0,463,0,0,0,0,623,318,0,0,296,463, +137,0,0,454,0,0,0,1527,58,0,0,0,0,0,0,0,18,48,0,0,0,0,0,729,0,0,0,442,0,0,0,0, +40,449,0,853,0,0,0,0,0,0,227,0,0,0,0,0,0,1491,0,0,0,0,0,0,0,0,0,0,161,55,0,450, +0,1174,62,0,207,0,0,0,0,0,0,0,0,869,0,0,0,0,80,213,0,0,0,0,0,0,0,0,0,0,354,820, +0,0,747,0,0,0,954,0,0,1073,0,556,0,0,0,692,0,191,0,804,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,831,162,0,0,35,0,0,0,0,0,0,0,0,1235,0,0,0,0,0,1234,0,0, +0,0,0,0,0,0,0,0,96,0,0,0,0,0,0,0,149,0,0,0,902,204,0,0,833,0,287,366,0,0,0,0,0, +0,992,2020,0,0,0,0,0,0,0,0,0,0,0,356,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,784,0,0,567, +630,0,0,0,539,0,0,27,0,0,0,0,0,0,0,0,0,0,755,0,0,0,0,0,0,0,0,0,0,0,0,814,0,0,0, +0,0,0,0,0,0,0,0,0,0,987,0,0,255,761,194,0,1086,0,0,0,0,0,0,1016,0,0,1396,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,562,271,913,0,0,0,0,0,0,0,0,320,153,45,475,0,0, +0,0,0,0,0,713,0,327,0,0,0,0,0,0,604,552,3,359,0,0,0,0,853,80,0,0,0,0,0,0,0,2016, +6,887,0,0,0,0,975,0,961,0,0,0,0,0,916,1891,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,100,101,390,708,0,0,0,587,983,512,0,0,0,0,0,0,0,0,0,0,0,645,0,0,0,851,0,0,0, +0,0,498,140,217,0,0,0,1448,0,0,0,0,0,0,0,0,0,905,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +643,105,0,792,0,0,0,0,0,0,0,0,0,0,0,0,56,0,0,0,0,0,0,0,0,0,0,535,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1748,0,0,0,0,0,754,0,0,0,0,0,0,0,0,0,0,0,0,91,0,0,1565,0,91,792, +939,3,370,0,0,0,0,95,0,0,0,0,551,7,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1150,0, +0,0,0,0,0,0,0,0,0,0,0,0,671,0,0,0,0,0,888,368,149,0,0,105,1134,0,983,0,0,458,31, +0,643,0,0,0,312,0,740,0,0,0,1642,0,0,0,0,0,0,0,236,0,0,0,0,0,0,0,59,68,0,0,0,0, +0,867,795,0,0,0,0,970,1977,0,0,0,0,0,0,0,1148,0,775,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,970,0,0,0,0,0,0,0,0,0,665,71,0,0,0,0,827,0,0,0,0,0,0,0,0,0, +0,479,0,0,0,0,0,0,0,0,99,607,0,0,0,0,0,0,0,1960,0,0,0,793,0,0,871,41,0,0,241,94, +0,0,0,0,209,0,0,1497,0,0,0,0,0,0,0,0,0,98,0,0,0,463,0,0,0,0,291,0,0,0,0,0,0,0,0, +0,0,984,0,0,0,0,0,205,0,0,0,0,0,0,205,42,0,801,0,0,0,0,0,635,0,0,533,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,371,0,1282,0,0,0,825,0,0,0,0,0,0,0,0,0,357,879,467,0,317,0,0, +0,0,0,0,0,924,0,0,0,0,849,1795,0,0,0,0,895,1799,43,0,0,0,0,0,0,0,0,0,0,1820,0,0, +0,0,0,0,0,525,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,0,493,0,174,417,0,0, +0,0,0,583,733,0,0,0,0,0,0,481,215,0,0,0,0,477,0,0,0,0,0,0,0,0,308,0,0,0,0,0,0,0, +0,297,126,0,0,361,1551,0,0,0,0,0,0,871,1807,0,0,0,0,0,1307,0,685,0,0,0,0,0,0,0, +797,0,858,0,565,0,0,0,0,0,0,0,0,0,0,0,0,434,252,826,0,0,0,0,0,0,791,0,0,0,0,509, +231,178,601,0,0,0,0,0,0,0,0,43,1591,0,0,0,0,0,1683,0,0,0,0,45,0,0,0,0,0,0,0,0,0, +0,1120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,556,494,0,398,0,0,0,1030,0,0,0,0,0,0, +168,0,0,0,0,0,0,0,0,0,0,973,0,642,0,0,0,0,0,0,0,0,0,1615,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,378,594,0,1093,0,679,112,0,0,0,0,1492,540,1374,714, +1486,0,0,0,0,825,1511,0,0,0,0,0,0,0,0,0,0,0,0,0,952,0,0,736,143,0,700,0,1540,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1557,0,0,0,860,990,0,0,0,807,0,0,0,0,0,131, +515,0,646,0,0,0,0,117,728,508,121,0,0,0,0,0,0,357,0,0,0,0,0,0,237,0,0,0,0,0,0,0, +0,0,1784,0,0,0,0,0,0,0,0,0,0,0,713,348,1536,0,738,0,0,0,0,0,0,0,434,0,0,0,0,0,0, +366,1877,39,0,0,0,0,0,0,580,0,0,0,0,0,0,0,0,0,0,0,0,0,0,873,0,0,0,0,171,0,625, +550,107,343,943,0,0,0,0,0,0,0,768,0,0,0,0,0,0,0,799,0,0,0,894,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1673,0,0,0,0,0,0,0,0,0,0,0,1052,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +272,0,441,0,0,3,9,0,0,0,1182,0,1346,0,0,0,0,0,0,0,0,682,0,0,1004,24,0,0,968,0,0, +0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,185,0,0,0,578, +474,0,0,0,0,0,0,0,0,0,0,0,0,0,0,113,530,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,556,0,0,0,0,0,0,16,1317,0,0,97,0,0,0,703,0,0,0,0,0,0,0,0,892,0,0,0,1571,0,0, +426,186,0,1101,0,0,0,0,0,0,0,0,937,585,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,644,291, +0,0,0,0,749,0,162,0,0,381,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,762,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,628,21,0,0,0,0,0,0,0,0,919,0,0,0,0,0,0,0,0,0, +633,0,0,0,0,332,0,0,0,0,0,0,0,0,0,1489,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,832,398,0,645,0,0,0,13,0,0,0,0,0,0,0,0,0,0,20,0,800,0,0,0,0,0,0,0,0,0, +0,0,0,0,1993,0,0,0,0,769,0,0,0,665,0,0,0,0,0,0,0,0,0,0,1426,0,0,0,0,60,0,0,0, +641,1874,0,644,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1757,0,0,0,0,0,937,0,1652,0,654,0, +0,0,0,0,0,0,527,0,0,0,0,0,0,0,0,0,0,0,0,0,226,0,0,0,0,0,1486,0,0,0,0,0,0,0,0,0, +0,0,325,0,0,0,0,0,0,0,1345,0,0,91,0,404,0,0,0,0,0,0,0,0,0,0,0,0,973,0,0,0,0,0,0, +0,1176,0,549,0,0,0,0,0,0,0,0,0,0,976,0,0,0,0,0,21,0,0,0,0,0,51,0,0,0,0,314,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,198,6,0,1093,0,0,0,0,0,0,0,0,0, +0,0,0,0,1776,0,0,0,0,0,1528,0,419,0,0,0,0,0,0,0,0,76,138,0,0,0,0,638,29,0,0,0,0, +0,0,0,1418,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1710,0,0,0,0,0, +0,0,0,0,0,0,0,532,23,0,0,0,0,0,0,0,862,0,0,946,592,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,70,0,0,0,0,0,0,0,0,0,812,0,0,0,76,0,0,988,0,442,0,0,0,896,0,0,0,0,0,0, +483,0,0,0,0,1709,0,0,0,0,0,0,119,0,0,0,117,0,309,0,0,0,0,0,596,976,0,0,0,0,0,0, +0,0,0,0,0,768,0,0,0,0,0,0,0,0,0,518,0,0,0,0,0,0,0,0,0,0,0,0,0,0,863,0,0,0,24, +145,1020,0,0,1984,0,0,0,0,0,0,0,658,0,0,0,0,0,0,0,0,0,0,106,1827,0,1010,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,582,87,0,0,0,0,0,0,0,267,0,0,0,703,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,496,0,0,0,0,1121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249,561,0,0,0,0,0, +0,0,760,0,0,154,0,0,0,255,0,419,323,0,0,0,0,0,368,0,0,0,0,0,0,0,0,0,0,522,0,0,0, +0,0,0,0,551,562,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,92,0,0,0,0, +0,0,0,284,525,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,958,0,0,594,0,0,0,0,0,0,6,479,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,61,0,0,0,0,0,0,0,820,1641,0,1556,0,0,0,0,0,0,0,302,0,0, +0,0,0,148,0,0,676,0,0,0,0,0,0,1674,0,0,0,0,0,0,178,0,0,0,0,0,0,0,94,389,0,0,0,0, +91,8,0,0,0,0,0,0,0,0,0,0,112,0,0,0,0,0,0,0,0,0,0,747,0,0,0,0,0,0,0,1746,0,0,0,0, +0,24,0,1352,158,1530,0,0,718,130,280,1401,0,0,0,0,0,1946,8,0,0,0,0,1607,0,0,0,0, +0,0,882,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,417,0,0,0,1597,633,433,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,234,0,0,0,0,0,0,0,0,680,1950,0,0,0,0,249,5,0,0,0, +0,0,0,0,0,0,1216,0,1773,0,0,0,0,0,0,0,0,0,0,0,0,0,0,509,180,0,0,0,0,0,0,0,1002, +0,0,0,0,0,0,0,0,0,0,0,0,0,931,0,0,0,0,0,0,0,0,747,943,0,1837,0,0,0,0,0,0,0,641, +0,0,0,0,280,0,0,0,5,0,0,0,0,0,72,545,0,0,0,0,0,0,0,0,0,742,0,0,254,151,872,0,0, +0,0,0,0,0,0,0,0,0,0,921,0,0,517,833,0,1680,0,0,436,251,584,0,0,0,0,0,0,0,0,0,0, +0,24,500,0,0,0,0,0,0,0,0,195,1775,514,389,0,0,0,0,0,0,0,743,0,0,0,0,0,0,292,0,0, +0,227,1283,774,1805,0,0,0,0,0,0,0,0,0,0,119,81,0,0,0,0,0,0,0,0,0,0,0,0,0,0,913, +1910,0,0,0,1826,490,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1162,700,30, +0,0,0,721,839,0,0,0,617,0,0,0,0,0,0,0,0,0,169,428,0,0,0,0,0,1648,637,1205,0,0,0, +1596,0,0,4,266,0,0,0,0,0,0,0,0,0,0,0,862,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0, +0,279,157,391,604,0,0,713,945,877,973,0,0,0,0,0,0,0,0,0,0,0,0,0,0,859,567,628, +1846,0,0,0,0,0,0,0,0,0,762,0,0,191,0,0,0,0,298,0,0,767,909,0,0,0,0,0,0,0,795,0, +0,301,0,0,1970,0,0,0,0,0,0,0,0,0,1236,0,0,0,0,0,0,644,369,15,0,160,71,0,0,0,0,0, +1447,0,0,0,0,0,0,0,0,735,1255,76,0,0,0,0,0,0,0,0,0,0,474,0,0,0,0,0,0,0,0,0,0, +841,0,0,0,0,0,0,0,0,0,0,836,0,0,0,0,0,1622,0,0,735,0,0,0,0,1601,804,1390,394,0, +0,0,0,0,0,96,0,289,0,0,35,688,0,0,0,667,0,513,0,0,0,0,0,0,0,2034,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,704,0,1524,0,1078,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,306, +0,0,0,0,0,0,0,431,0,1196,0,0,54,0,15,1448,0,1418,0,0,0,0,0,0,0,0,0,907,0,0,0,0, +0,0,194,1767,0,0,0,0,0,840,0,900,0,0,0,0,0,0,0,0,0,0,0,1436,0,0,0,0,642,1560,0, +0,0,0,0,0,94,386,0,0,0,0,0,0,0,0,0,0,830,416,0,0,20,731,0,0,0,0,0,0,0,0,697,0,0, +662,0,0,0,0,0,0,0,0,0,861,0,0,0,0,0,0,0,871,671,864,0,928,7,0,332,0,0,0,0,1055, +0,0,0,0,0,0,986,0,0,0,0,0,44,76,0,0,0,0,0,0,0,0,0,0,300,0,0,0,0,0,0,0,175,518, +831,1108,0,0,0,836,0,1852,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,843,1804,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,246,0,0,0,610,202,0,0,36,0,0,0,240,654,13,0,0,0,0,0,0,0, +0,391,0,403,0,0,0,0,0,0,0,0,0,0,75,0,366,815,0,0,631,0,0,0,0,0,0,0,0,345,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,952,0,0,0,0,0,0,0,0,0,0,0,673,35,662,0,287,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,5,34,0,0,0,0,0,0,0,0,151,0,427,0,0,382,0,0,0,329,0,0,279,0,0,0, +0,0,0,0,0,0,0,906,0,0,366,843,0,1443,0,1372,992,0,36,123,0,649,0,0,0,0,0,767,0, +1018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,995,0,0,0,0,0,0,0,72,368,0,0,1345,0,0,0, +589,0,0,0,0,0,0,0,0,0,1988,0,0,220,541,0,0,0,686,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,32,196,0,0,0,0,0,0,0,0,0,0,0,0,0,381,0,0,0,0,0,0,0,0,0,1452,0, +0,0,616,0,0,0,0,0,0,0,0,0,1229,0,0,0,0,0,0,0,0,0,0,667,120,0,0,0,0,0,0,0,1146,0, +0,0,0,0,0,0,0,0,0,0,352,0,0,0,0,0,293,0,0,0,0,0,0,0,0,0,0,0,0,0,935,0,1050,0, +147,88,0,0,923,0,0,0,0,0,934,0,0,0,0,0,0,0,0,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,341,222,0,0,0,0,0,0,0,0,0,0,293,0,0,0,0,0,0,0,0,0,0,0,0, +637,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1159,0,0,0,847,0,0,0,0,0,0,683,0,867,944,0,0, +0,0,0,1809,0,0,0,0,0,0,0,0,0,0,395,170,0,0,0,0,0,0,0,0,0,0,618,535,0,1625,0,0,0, +0,0,0,0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,778,0,0,0,0,0,46,0,2032,0,0,37, +1458,0,938,363,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,314,0,0,0,0,0,0,889,0,0,0,0,0,0,0, +0,0,0,0,462,0,0,0,0,525,0,0,23,0,0,0,0,0,0,0,0,0,0,0,676,0,0,0,0,0,0,0,0,0,0,0, +0,498,725,0,0,0,0,7,0,0,0,0,773,0,0,0,164,0,0,0,0,0,0,0,0,936,583,659,1462,0, +220,0,0,0,0,803,0,0,544,119,0,0,0,0,0,0,0,0,0,0,0,181,176,0,1192,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,1878,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,0,0,0,0,0,0, +944,0,0,0,0,0,0,0,273,0,0,0,0,0,855,0,0,0,0,5,127,0,0,0,0,0,0,0,0,752,230,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,162,0,654,48,156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,197, +0,0,0,0,0,0,0,963,0,0,0,0,0,0,0,0,0,0,858,0,0,0,0,0,0,0,0,0,0,676,1978,0,0,102, +972,0,0,0,0,0,0,0,361,0,461,0,0,0,472,0,0,0,0,0,0,0,0,0,0,0,0,0,0,747,905,0,0,0, +155,0,0,0,0,0,0,0,0,0,0,319,163,0,0,0,0,0,0,0,0,0,848,0,0,36,631,0,0,0,0,0,1769, +0,0,0,0,0,144,0,0,0,0,0,0,0,0,0,0,369,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,247,0,0, +996,0,0,189,0,0,0,0,0,0,0,0,0,0,280,0,0,0,0,0,0,0,0,0,0,0,526,746,0,0,345,0,0,0, +1017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,651,428,0,0,0,1162,230,327,546,792,0,0,0, +1203,0,0,0,0,0,0,0,0,0,672,189,0,0,0,0,0,0,99,0,0,0,298,0,0,0,0,0,0,555,397,0,0, +0,0,0,1157,0,0,0,0,0,0,0,0,0,0,398,1523,0,366,0,0,787,0,0,0,282,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,157,0,941,0,0,0,0,0,1336,0,0,116,0,0,0,0,0,0,787,0,0,0,0,0,0,0,0,0, +0,170,160,0,1815,0,0,0,0,0,866,0,0,0,0,0,0,0,0,0,689,0,0,0,0,820,0,498,108,0,0, +0,1119,0,0,0,244,609,1005,0,581,0,0,0,0,0,895,0,0,0,1898,0,0,0,0,0,926,0,0,0,0, +0,0,0,0,0,0,0,0,0,538,496,294,301,0,0,0,18,0,0,757,0,0,0,0,0,1263,0,820,0,722,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2028,0,0,0,0,124,1875,0,0,0,881,0,0,0,1348, +0,0,0,0,0,0,0,911,0,954,0,0,0,0,414,0,0,0,0,517,0,0,0,0,0,816,0,0,0,0,0,0,0,0, +713,0,0,0,0,0,0,0,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,593,150,0,0,0,0, +0,553,0,0,0,0,0,0,0,0,0,0,108,0,0,0,0,420,0,0,0,0,0,0,0,0,0,0,0,1777,0,0,55,493, +0,0,81,0,321,980,0,0,0,0,0,0,0,0,0,0,0,0,0,0,362,112,0,74,0,0,0,0,0,0,0,625,0,0, +0,0,0,0,377,16,0,0,61,281,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,1031,0,0,0,0,0,0,51,0, +0,0,0,0,0,0,211,309,15,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,789,173,0,439,9,648, +0,0,294,0,0,0,0,0,0,0,374,8,0,1099,0,0,0,0,0,0,0,575,0,0,0,518,0,0,0,702,0,0,0, +0,0,0,87,0,0,0,438,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,464,122,0,0,0,1802,0,0,0,0, +0,0,499,0,0,0,87,476,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,840,283,0,0,0,0,1620,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,609,1160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,600, +323,372,0,0,0,0,471,722,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0, +477,1304,0,1774,0,0,88,0,438,12,0,0,0,0,0,0,0,0,671,997,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,639,22,0,0,782,681,0,0,0,0,0,0,0,0,0,0,1013,664,0,942,0,1349,0,0,0,0,0,0,0, +0,0,0,0,0,356,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,215,289,0,1975, +109,450,0,0,0,0,0,0,0,0,0,0,705,0,0,664,0,0,0,0,0,0,0,1238,0,0,318,0,0,0,0,0,0, +0,0,0,0,0,0,0,960,1872,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,0,0,0,0,0,0,0,0,0,239, +777,0,26,0,0,0,0,0,0,0,0,0,0,0,0,375,414,0,17,0,0,0,1350,0,955,0,0,0,0,0,0,0,0, +887,960,0,0,0,0,0,0,0,0,0,0,708,710,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,919,0,0,0, +0,502,280,7,45,0,0,0,0,777,0,0,0,0,410,0,1110,0,0,0,0,0,0,414,341,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,787,0,0,0,436,0,0,0,0,0,0,0,1707,613,377,96,0,0,0,0,451, +0,0,0,0,0,0,0,0,0,0,0,0,0,680,0,483,916,0,0,0,0,0,0,937,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,739,0,0,0,0,0,0,0,0,82,0,0,663,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,128,0,0,0,0,0,0,0,0,1087,0,0,0,0,0,0,0,503,0,0,0,0,0,0,9,113,104,324,0,460,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,935,702,434,485,1014,949,423,0,900, +0,0,0,0,0,0,0,2018,574,0,0,0,0,0,0,0,0,0,0,0,0,1206,0,0,0,0,0,0,0,0,38,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1022,0,0,0,0,143,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2029,0,0,0,0,0,0,0,0,0,0,0,0,523,0,0,0,0,0,0,625,0,0,425,37,0,0,0,1943,0,0,0, +0,0,765,0,0,0,0,0,0,0,0,0,0,551,0,0,0,0,0,0,0,0,0,0,0,0,168,0,0,1010,0,0,1994,0, +0,0,91,0,0,0,0,532,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1884,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,240,15,0,0,0,1227,0,1534,0,0,0,0,0,0,0,0,0,0,0,0,0,0,392,0, +0,0,0,0,0,0,0,0,0,0,0,655,562,395,0,0,0,501,1019,0,0,0,0,509,267,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1099,0,0,0,0,0,0,948,0,0,0,0,0,0,0, +462,114,0,0,258,404,0,1717,0,0,0,0,82,1061,0,724,0,0,0,0,0,1133,0,0,0,0,0,0, +1021,841,0,1021,0,0,0,0,0,0,0,0,0,0,488,373,37,0,0,0,0,564,0,0,0,0,0,513,0,0,0, +825,0,0,899,0,0,778,0,0,12,1417,0,1116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,114,545,0,5, +0,0,0,0,0,0,0,192,0,0,763,0,0,0,0,0,0,0,755,759,0,0,0,0,0,0,0,0,0,370,0,1237,0, +0,0,0,0,0,298,87,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,0,0, +0,0,0,0,814,991,0,757,57,0,0,0,0,0,0,0,0,0,540,0,0,0,0,608,0,0,0,0,0,0,0,0,1014, +0,0,0,902,0,0,0,0,553,1668,0,0,0,0,0,0,0,0,0,559,60,0,0,0,0,0,511,0,0,675,0,0, +156,0,0,0,0,0,0,709,0,698,0,0,0,1745,0,0,0,0,0,0,0,0,0,714,0,0,0,0,0,0,0,0,206, +8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,776,0,0,0,0,0,0,0,0,0,1272,0,0, +0,0,0,1059,0,0,0,0,0,0,406,0,0,0,0,0,0,0,0,0,0,947,0,0,0,0,0,0,168,0,0,0,0,0,0, +870,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,554,0,0,0,0,784,908,0,0,0,0,0,0, +0,396,358,0,0,0,0,0,0,0,0,2,228,0,0,0,0,0,0,0,0,0,0,0,845,14,0,716,1820,594,0, +81,1428,0,161,0,782,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,998,0, +0,0,0,0,0,0,0,0,0,0,0,1043,0,1496,0,0,0,0,0,0,0,0,781,0,0,0,0,0,0,0,817,1114,0, +1814,958,0,0,0,0,812,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,236,643,0,0,0,0,0,0,0,0,0,1172,0,0,0,0,0,0,0,0,0,1338,0,0,0, +0,0,0,0,0,0,0,0,54,0,0,0,256,0,0,351,0,955,1885,0,469,0,0,0,1270,0,744,0,313,0, +0,0,0,0,0,0,0,402,969,0,0,0,0,0,0,50,0,0,0,0,572,0,0,0,0,847,0,0,0,0,0,0,0,248, +43,0,369,0,0,0,0,0,0,0,0,0,0,0,0,0,766,0,363,0,0,0,0,0,0,0,0,0,0,0,678,0,0,409, +258,82,249,0,0,0,0,0,0,0,0,0,0,0,0,32,393,0,788,0,0,0,1281,509,1968,0,0,0,0,39, +291,0,0,0,589,0,0,54,1059,0,0,0,0,0,0,824,0,0,0,0,0,0,0,0,0,0,1005,0,1598,0,0,0, +0,0,919,0,0,0,0,0,0,0,0,52,132,0,0,0,0,0,328,0,0,0,0,173,0,0,0,0,0,65,1411,0,0, +0,0,0,0,0,0,0,0,442,0,842,0,0,0,0,0,0,0,0,0,534,0,0,0,0,0,0,0,0,0,0,0,0,0,845, +210,0,0,0,0,0,0,0,0,892,0,0,223,0,0,0,0,529,0,0,0,807,0,137,218,0,1444,0,0,0,0, +0,332,661,0,0,0,0,0,0,0,76,1517,0,0,0,0,0,0,0,0,0,0,0,418,0,0,0,0,0,0,0,0,481, +379,0,0,0,0,0,149,18,0,0,0,0,0,0,0,0,742,304,142,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,799,925,195,51,0,0,0,0,688,0,0,0,0,697,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1169,751,0,0,0,452,929,0,221,0,1437,0,0,0,0,955,1251,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,0,132,0,0,0,0,0,865,0,0,0,0,0,0,0,767, +672,42,0,0,0,1050,0,0,0,0,0,0,0,0,368,44,0,0,0,0,0,0,0,570,29,0,0,0,0,0,0,227,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,522,0,0,0,0,0,0,0,1529,0,0,0,0,0,0,739,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1667,0,0,0,0,0,0,132,511,0,138,208,1020,0,0,23,565,0,344,0,0,0, +0,0,922,0,0,0,0,0,0,0,240,0,0,415,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,402,0,0,754,31,716,0,982,731,0,0,0,0,0,0,0,888,0,0,0,803,847,0,0,823, +0,0,0,0,0,0,785,0,0,2,0,0,0,0,0,0,0,532,0,0,681,0,0,314,0,384,684,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,649,447,0,1818,1007,0,321,0,66,360,0,0,0,385,0,0,0,0,0,0, +0,900,73,254,0,0,0,0,683,1959,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,86,0,0,725,0,0,0,0,0,196,0,0,0,0,0,831,0,0,0,0,723,0,0,0,0,0,994,627,0,0, +0,0,0,0,0,0,0,0,764,66,0,0,0,0,205,36,0,0,0,0,0,0,0,950,0,0,0,887,111,0,0,831, +388,165,0,0,0,0,0,155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,780,755,0,0,0,0,898,146,0,0,0, +0,0,0,0,45,7,0,0,0,0,0,0,0,0,607,0,0,0,0,0,0,65,0,0,0,0,0,0,0,0,0,88,0,0,0,0,0, +621,600,0,367,0,0,0,0,0,0,0,561,0,559,0,585,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +287,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,672,157,0,0,0,0,714,0,0,0, +0,0,456,0,925,0,0,0,0,0,0,0,0,19,0,0,0,0,1473,0,0,0,0,0,0,0,0,0,0,113,0,0,0,0,0, +0,0,0,0,0,0,0,0,69,463,0,0,82,193,2,471,0,0,0,0,633,0,0,0,0,0,0,1148,129,1392, +542,803,0,0,0,0,0,0,0,0,0,0,0,0,438,0,0,0,0,0,0,875,0,0,0,0,0,237,0,0,0,0,0,0,0, +65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,563,0,0,0,9,444,0,0,43,1260,0,0,0,0,0,0, +971,0,0,699,0,0,0,0,0,1116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,829,242,0, +0,593,0,0,0,0,0,0,0,0,201,36,224,0,0,0,0,0,0,1430,0,1806,0,523,0,0,212,1889,0,0, +0,827,0,0,0,0,0,2043,136,242,0,0,0,0,0,0,284,148,10,0,0,0,0,0,0,1249,0,0,0,807, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,94,0,0,0,494,0,0,0,0,0,0,0,0,1510,0,0,0,0,0, +0,0,0,0,0,505,1306,0,0,764,268,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1703,0,0,0,0,159,964,583,0,0,0, +0,0,0,515,0,0,854,0,0,0,0,0,0,0,0,0,0,0,0,1123,0,0,0,0,0,0,0,136,0,0,0,0,0,1782, +0,0,44,1287,0,0,0,0,0,732,0,0,0,0,313,679,0,0,316,0,0,0,0,595,0,0,0,0,0,0,753, +147,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,137,0,0,0,0,414,0,1762,0,0,0,0,0,0,0,0, +0,0,0,599,0,0,0,0,0,0,0,0,0,1749,0,0,0,1627,0,488,0,0,0,0,0,83,0,0,0,0,676,0,0, +1639,0,0,0,0,0,0,0,0,0,278,0,0,0,0,0,0,97,0,14,1085,0,0,0,0,0,0,781,388,0,849, +59,229,0,0,0,0,0,1115,0,0,0,0,108,0,0,0,0,700,0,0,0,0,0,0,0,0,0,1414,0,0,0,0,0, +0,0,0,0,0,0,0,0,660,737,1035,0,0,0,0,0,0,521,690,0,0,0,0,0,0,0,0,0,0,0,0,272,0, +0,0,0,0,0,0,0,0,0,1744,0,0,0,0,0,0,128,733,0,0,277,0,0,0,0,0,0,0,0,0,4,0,0,0,0, +0,0,0,0,0,0,0,0,0,936,1981,40,0,0,0,0,0,0,0,0,775,0,0,0,0,0,0,0,0,0,306,0,0,0,0, +0,0,0,979,0,0,0,0,0,611,0,0,0,0,0,178,0,0,0,1969,0,0,0,0,0,0,0,664,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,390,0,0,0,1510,0,0,0,0,0,0,0,0,0,0,0,493,0,0,37,0,0,0,0,724,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,1537,0,0,168,473,0,0,0,105,0,0,0,0, +627,438,0,0,0,0,0,0,0,0,0,0,11,1256,0,0,0,1626,0,779,0,0,0,0,25,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,308,0,0,0,0,0,741,0,671,0,0,0,0,649,150,0,0,99,521,0,0,3,339,0,0,0, +543,0,0,0,0,0,0,0,0,0,1358,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,234,155, +0,0,0,0,0,0,0,1628,0,766,0,0,0,0,0,0,0,0,0,0,0,0,0,829,0,0,0,1445,0,0,0,486,0,0, +0,0,2,1635,0,0,0,0,558,0,0,0,0,0,0,0,0,0,0,1461,0,0,0,0,0,599,0,0,0,0,0,0,0,0,0, +1376,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,93,0,0,0,0,0,0,447,0,0,66,1432,0,0,0,0, +0,0,307,0,413,609,0,0,0,930,0,0,0,0,21,939,0,0,0,0,0,962,4,651,0,0,0,0,15,579,0, +0,0,0,0,597,0,0,0,0,0,981,0,0,0,545,0,0,0,0,0,0,0,1558,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,800,17,0,0,17,0,907,0,0,0,110,0,0,0,53,458,0,1983,0,0,0,0,0,0,0,0,0,0,443,0, +0,0,0,0,0,0,0,0,0,0,924,1844,0,1232,0,0,0,0,70,519,0,993,0,0,0,0,0,0,14,530,0, +907,0,0,0,0,0,733,0,0,0,0,0,0,0,0,55,0,188,531,56,0,0,1693,0,0,0,0,0,0,0,0,441, +0,192,928,0,0,0,0,0,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1525,0,259,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,512,185,0,464,1603,0,0,0,0,0,0,0,0,0,0,0,1113, +284,720,0,0,722,0,0,0,0,0,13,0,0,0,0,0,0,0,4,289,43,0,0,0,0,0,0,1694,0,0,0,0, +193,0,0,0,0,409,0,0,0,0,0,0,0,0,0,0,0,0,308,0,0,1863,0,0,0,0,0,0,0,0,0,790,0,0, +745,1002,0,0,0,0,0,0,0,0,0,289,68,477,13,0,0,0,0,0,0,0,0,0,0,609,0,0,0,0,0,0,0, +0,0,0,0,367,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,528,0,0,0,0,0,0,0,0,0,694,58, +548,0,0,0,0,0,0,687,0,0,0,0,1749,0,0,0,0,0,0,0,0,1004,661,0,0,0,0,0,0,445,0,0,0, +74,0,0,0,0,213,0,0,0,0,0,0,0,0,0,0,0,0,0,834,0,0,189,1672,0,0,0,0,0,0,0,1548, +192,0,0,0,0,0,0,0,0,0,0,0,0,0,32,751,0,78,0,0,0,0,0,0,544,1602,105,473,0,0,0,0, +0,0,156,1949,0,1779,0,0,0,0,0,0,0,0,0,0,0,763,0,0,0,0,0,0,0,0,29,0,0,0,0,0,0,0, +0,0,0,883,0,0,0,0,0,0,0,488,0,617,0,0,50,0,694,1518,785,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,546,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,1016,0,0,0,577,0,0,0,0,0,0, +184,935,114,720,0,0,100,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,95,14,0,969,0,0,0,0,0,0,0, +727,0,1021,0,0,0,0,0,1190,0,0,0,0,0,0,0,0,0,0,0,0,0,153,0,0,0,0,0,0,0,0,0,798,0, +587,0,0,695,42,0,1929,141,957,0,465,7,908,0,0,450,148,0,0,0,1166,0,0,0,0,0,0,0, +0,0,0,0,0,253,0,1003,0,0,0,0,0,0,0,0,0,0,0,46,0,0,879,0,806,0,1868,0,0,0,0,0, +1846,0,0,0,730,0,0,0,0,0,0,0,965,0,0,0,0,506,0,0,0,10,0,0,0,22,0,0,0,0,0,0,0,0, +0,0,0,0,0,960,296,0,0,0,0,0,0,0,0,0,0,0,587,0,0,0,0,20,0,0,0,32,982,0,0,0,0,0,0, +0,0,0,0,941,0,0,0,0,435,0,0,0,0,0,0,71,419,0,0,0,0,0,0,688,740,94,345,0,0,679, +582,0,0,0,0,0,0,0,945,0,0,0,0,0,0,0,0,0,0,0,0,539,0,684,1993,0,0,0,659,0,583,0, +803,0,704,0,0,0,0,0,198,181,347,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,481,405,203,0,0,99,826,0,0,0,0,0,0,0,492,0,408,0,0,0,0,0,0,0,0,0,0,4,0,0, +0,0,665,349,137,0,0,0,0,612,1270,0,0,0,0,0,371,0,0,0,826,0,0,0,0,21,1535,858, +374,0,0,0,0,0,0,311,0,0,0,991,1968,0,0,0,0,494,1647,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,769,0,0,0,0,0,642,0,0,157,123,0,0,0,1435,0,0,0,0,0,0,0,0,0,0,79,0,0,0, +0,0,0,1425,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,106,393,486,1690,0,0,0,0, +0,0,0,0,0,0,0,0,756,184,0,0,0,1382,0,0,0,175,0,1493,0,1007,0,0,0,0,0,0,0,0,0,0, +0,219,0,0,0,0,515,99,0,851,0,0,0,0,0,1278,0,0,0,0,0,0,0,1000,982,0,762,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,910,1819,0,0,0,0,0,0,906,0,0,0,0,0,0,0,0,0,0,1730,0,0, +0,0,0,0,0,0,0,0,0,1185,0,0,0,0,0,0,0,0,40,0,0,0,147,0,0,0,0,0,0,0,0,0,0,0,0,0, +650,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,30,0,553,0,0,20,597,0,1614,0,0,0,0,0,327, +49,0,0,0,0,0,0,0,78,0,0,786,134,0,0,0,12,496,0,0,0,0,0,0,0,0,0,0,42,204,0,614,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,147,247,0,0,0,0,942,0,0,2023,0,0,0,0, +0,0,67,285,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1309,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,532,0,0,0,0,0,0,0, +1692,0,0,0,0,55,1704,0,0,0,0,988,0,0,0,223,0,0,0,0,0,0,0,57,1123,0,0,0,0,0,1764, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2015,0,0,0,1599,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,129,0,0,0,0,0,0,0,0,0,0,0,534,0,0,0,0,0,0,0,0,0,0,0, +0,0,504,621,1248,321,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1397,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,441,75,0,0,0,0,0,0,0,0,0,0,841,0,0,0,0,0,693,0,650,314,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,913,0,0,0,0,0,0,0,0,0,0,0,0,0,0,880,0,475,0, +0,1016,179,602,111,329,0,0,0,1864,0,0,0,0,846,1888,0,0,780,0,0,0,82,0,0,0,0,821, +0,0,0,0,0,0,0,0,0,0,0,956,112,0,0,0,261,455,0,0,0,0,0,0,337,385,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,184,1865,0,0,721,16,0,486,0,0,0,265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,621,0,0,0,0,0,0,0,0,234,0,0,815,0,0,743, +1987,205,197,0,0,0,0,0,0,0,0,0,314,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219,452,589,0, +176,333,0,0,0,0,0,0,0,1110,47,0,0,0,0,0,0,0,0,0,0,0,864,0,0,300,0,1237,0,0,0,0, +0,0,0,0,0,0,0,1685,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,135,395,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,631,0,0,0,0,0,0,835,0,0,0,606,459,0,979,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,612,0,0,0,0,0,0,0,0,158,372,0,854,0,0,0,0,0, +0,0,1492,0,0,0,833,0,0,0,0,0,0,0,1739,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +195,0,0,0,0,0,0,0,0,730,1997,0,0,0,0,0,0,0,0,61,0,0,0,0,0,0,0,266,751,0,0,0,0,0, +0,0,821,0,0,0,715,0,0,0,868,0,959,0,0,0,0,0,0,0,0,0,0,0,1053,0,0,0,950,0,1081,0, +1595,0,0,0,0,59,0,0,0,0,0,0,0,0,0,0,47,684,0,0,0,0,0,0,1606,0,777,0,1020,0,0,0, +1094,0,0,0,0,0,0,0,350,0,0,0,0,0,0,242,1812,0,0,0,967,0,0,0,473,286,0,0,0,0,0,0, +798,629,222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,513,337,306,0,0,0,0,0,0,0,0,0, +146,0,0,1646,0,0,0,0,0,465,0,0,0,525,0,0,0,0,0,0,299,165,0,0,0,0,0,0,0,1064,0,0, +0,0,0,596,0,0,0,0,0,0,0,0,0,0,0,0,0,0,238,1741,0,1233,451,1824,0,0,0,0,733,495, +0,0,0,0,0,1204,0,0,0,559,341,0,224,21,0,0,0,0,0,0,0,0,97,1446,0,0,0,0,0,0,0,729, +0,0,565,727,0,1948,0,0,0,519,0,0,0,0,0,0,0,0,0,1193,0,0,0,0,0,0,790,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,323,2,201,0,0,59,0,0,34,0,896,961,0,1285,0,0,46,0,479,0,0, +0,0,549,0,663,0,0,0,0,0,783,65,682,0,0,0,0,0,11,0,0,0,0,0,522,0,0,0,52,0,0,0,0, +0,383,0,0,0,0,0,0,0,0,127,0,0,0,0,0,397,194,0,0,635,0,0,0,0,0,0,0,0,0,0,975,0,0, +0,0,0,0,0,0,0,0,116,0,51,0,0,858,0,1075,535,448,0,0,0,0,0,610,0,0,0,0,0,0,0,0,0, +0,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,267,673,319,94,92,0,551,0,0,218, +1406,69,256,0,0,952,1980,0,833,0,0,0,0,0,0,0,0,0,0,0,0,39,0,0,0,0,0,0,0,81,0,0, +0,352,634,0,0,0,0,0,618,0,0,0,0,0,0,73,339,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,759, +0,0,0,0,0,0,0,0,0,0,0,0,0,1075,0,0,0,0,0,0,482,649,0,0,0,0,0,0,0,0,386,336,0,0, +0,1035,0,0,0,0,0,0,0,0,0,0,0,924,0,73,0,0,0,0,0,1971,0,0,0,0,0,0,0,0,0,1344,0, +501,0,0,0,0,0,0,0,0,46,799,0,0,0,0,0,0,0,276,0,0,0,0,0,0,0,770,0,0,0,0,0,0,0,0, +0,0,0,0,0,158,0,0,0,0,0,1432,0,0,0,0,0,0,0,0,0,0,25,0,0,2001,0,0,0,0,0,0,0,0,0, +0,0,0,0,478,0,0,0,0,0,0,91,1461,211,602,0,0,0,0,0,0,0,0,0,1068,0,0,124,567,0,0, +0,1006,0,0,0,0,0,0,0,0,0,735,812,0,0,323,0,0,0,304,0,0,0,0,0,0,0,0,0,148,0,0,0, +0,0,0,0,0,0,523,0,0,144,730,0,0,981,0,0,111,0,0,132,0,0,0,0,0,0,890,0,0,0,0,0, +444,0,1787,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,2041,932,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,937,0,995,0,0,255,0,0,138,863,965,0,0,631,0,0,0,0,1394,16,652,0,0,0,0,0,0, +0,0,0,0,0,0,0,897,0,321,0,0,0,0,0,922,0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,844,0,0,0,0,0,0,1659,0,1100,0,0,0,1173,0,1930,268,251,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,390,711,0,0,0,0,0,0,0,0,0,0,0,0,0,744,0,0,0,0,0,0,0,0,0,624,0,0,0, +1998,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1125,0,0,0,594,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,268,0,0,0,0,0,0,0,563,0,0,0,0,0,0,0,0,2,39,0,0,0,1332,0,0,0,0,0, +0,0,508,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66,796,0,0,0,0,527,0,0,0,0,98,0,0,576,0, +0,0,0,0,122,0,276,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,645,0,0,0,0, +0,0,0,0,0,0,0,290,0,0,762,1292,0,0,0,1315,0,1955,0,0,0,0,0,0,0,0,0,0,210,131,0, +0,0,0,797,0,38,0,11,488,0,936,0,441,0,0,0,0,0,595,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +991,0,0,0,0,0,0,0,0,0,0,0,653,0,523,0,0,0,903,0,0,0,0,0,0,0,0,0,0,0,0,80,0,0,0, +0,0,0,0,0,0,432,0,0,314,0,0,0,0,232,1368,534,0,0,0,0,0,27,0,0,0,12,0,0,0,0,0,0, +0,0,0,264,736,0,1657,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1117,0,127,0,0,0,1208,0,1294, +0,0,0,0,364,0,0,0,0,0,125,1334,0,0,0,0,0,0,0,0,0,0,0,0,0,0,792,0,0,0,0,0,0,0, +849,699,0,0,0,0,0,968,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1446, +124,397,0,0,0,0,0,0,0,0,0,0,0,641,0,0,0,0,0,0,0,0,0,0,0,0,127,346,0,0,517,75,0, +0,0,0,0,0,0,0,83,0,0,0,0,0,0,1031,0,0,0,0,0,0,0,1470,0,954,0,0,345,304,410,0,0, +0,0,734,0,0,0,0,0,1822,0,0,0,1798,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,161, +1865,69,0,0,0,0,0,0,922,0,0,0,0,0,0,0,0,0,0,0,541,0,627,0,0,0,0,0,0,0,0,0,166,0, +0,0,0,0,0,0,0,0,849,0,0,0,0,0,0,0,717,0,0,0,0,0,0,0,0,0,0,0,0,0,0,600,0,0,0,0,0, +0,654,0,0,188,273,0,0,0,543,0,410,87,0,0,941,0,0,186,250,0,1785,0,0,0,0,0,1339, +462,961,0,780,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,529,0,0,0,0,0,0,474,1276,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,24,948,0,0,0,0,657,753,0,0,0,0,941,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,706,985,837,0,1861,0,0,0,0,0,0,0,0,0,0,0,0,0,0,292,933,0,0,0,0,0, +0,0,0,0,767,0,0,0,0,0,0,0,641,0,0,0,1233,114,0,883,0,274,2008,0,1794,285,0,0, +571,0,0,0,0,0,0,0,0,0,0,823,960,16,617,0,431,0,0,0,0,0,0,0,0,0,0,567,0,401,0,2, +781,424,33,0,2006,0,0,274,0,0,1882,0,794,0,0,0,1848,0,0,0,0,0,0,448,47,0,0,0, +1199,0,0,0,0,0,0,0,0,417,0,0,0,0,0,0,0,0,0,0,295,0,0,0,0,0,0,0,1019,0,0,0,0,0,0, +0,0,0,0,0,0,0,620,0,0,0,0,464,0,0,0,0,208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,442,0,930,0,0,0,0,0,516,68,0,0,0,0,0,1128,104,0,0,0,0,0,0,0,0,787,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,491,0,0,0,0,0,0,711,0,0,9,0,101,441,0,0,0,0,0,0,0,0, +0,0,160,396,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,679,326,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,1128,0,0,0,0,0,737,0,1796,0,0,0,0,0,0,0,0,0,0,0,0,338,574,0,0, +0,0,0,1096,491,405,0,0,0,0,0,1081,0,0,0,0,0,0,0,0,0,0,0,0,0,1676,0,1207,0,0,0,0, +0,0,969,354,0,0,0,0,598,0,297,0,0,0,0,0,0,0,0,1772,751,0,37,0,0,1828,0,0,0,0,0, +0,0,0,0,257,191,582,0,0,0,0,0,0,790,0,0,0,0,0,47,0,0,0,0,0,0,0,449,306,1011,0,0, +0,0,0,299,0,0,0,0,0,0,837,0,0,0,0,0,0,10,329,0,0,0,0,0,1320,0,0,0,0,0,0,158,657, +0,1191,0,0,0,0,0,0,7,0,974,1939,0,1665,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,288, +66,0,0,0,0,494,175,0,1643,0,0,0,0,0,0,0,0,570,750,719,0,0,0,0,0,0,0,0,0,0,0,0,0, +13,0,0,1247,0,0,221,356,0,0,0,0,0,0,0,0,0,0,694,1809,0,0,0,0,0,0,0,411,0,44,31, +0,0,0,0,669,0,673,0,0,0,0,0,0,0,0,0,1303,704,299,0,0,0,275,0,0,216,1761,0,0,0,0, +0,0,0,0,0,0,0,1319,0,0,428,0,0,0,0,0,0,0,0,0,0,514,0,0,0,0,0,0,49,55,102,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,364,0,0,0,0,379,0,921,971,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1258,0,0,0,1058,0,0,0,0,0,656,0,0,0,0,0,144,0,0,0,0,0,0,0,0,0,0, +0,1373,10,605,0,0,0,0,0,0,0,838,0,1012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,154,365,0,0, +0,0,0,0,0,0,0,340,0,0,0,0,0,810,0,0,0,0,0,0,495,0,0,0,0,0,0,0,0,0,261,0,535,248, +0,358,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,567,445,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,697,0,0,0,1336,0,0,0,0,0,0,0,0,917,174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,972,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,351,0,0,0,0,0,0,0,0,0,0, +0,0,0,286,0,0,56,438,0,0,0,0,0,1950,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,738,0,0,0,0,0, +0,0,0,0,0,969,2047,0,0,0,0,0,0,0,818,0,0,0,0,0,0,0,866,0,0,0,0,0,0,0,1467,0,0,0, +0,0,0,0,0,0,0,0,0,0,972,0,355,0,0,0,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,267,189,104,0,0,0,0,1613,0,0,0,0,0,0,0,116,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,886,0,86,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,45,0,0,863,0,0,0,0,0, +0,0,1953,450,1773,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,381,0,0,0,0,0,0,0, +0,0,0,0,0,1142,0,1189,0,0,0,663,0,0,0,0,0,0,0,846,0,0,528,0,393,378,0,0,0,0,0,0, +325,899,680,1880,0,1770,0,0,0,0,0,648,0,0,0,0,0,0,185,167,0,2046,0,0,0,0,0,0, +249,1645,0,152,0,0,0,1733,0,0,0,0,0,1006,0,0,0,0,0,420,0,0,0,832,0,0,0,0,0,351, +0,0,0,0,6,40,0,0,60,0,0,0,0,1354,745,724,0,0,0,0,0,0,0,0,772,1951,275,108,639,0, +0,0,0,0,0,0,0,0,500,1758,0,0,0,0,0,0,0,0,0,0,0,1886,711,205,0,0,965,865,0,0,0, +534,0,0,0,0,691,0,0,0,237,443,0,878,0,0,0,0,0,1410,0,0,0,0,0,0,0,0,0,0,0,0,0, +995,0,0,0,0,0,0,0,0,0,0,0,0,0,578,0,0,0,0,881,0,0,0,0,0,0,0,0,822,0,923,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,924,0,0,0,665,0,0,0,0,0,1901,0,0,0,0,0,950,498,93, +0,0,0,1451,0,0,0,0,0,747,828,788,400,184,0,198,0,0,0,0,0,0,0,0,0,0,0,994,0,0,0, +0,0,0,0,0,615,320,0,0,0,978,843,905,0,0,0,0,0,0,0,0,850,974,0,0,0,0,6,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,509,0,0,0,0,0,273,0,0,0,0,0,0,0,0,0,0,0,0,0, +201,0,0,0,1041,0,0,0,1040,0,0,0,0,0,0,0,0,0,693,234,774,0,336,0,1399,22,0,805, +802,777,167,789,0,0,1705,0,0,0,0,0,0,0,0,0,0,0,10,13,11,0,0,204,264,0,0,56,0,0, +1917,0,470,0,0,0,0,0,0,0,0,0,0,0,1198,0,0,0,0,0,0,0,0,0,0,1015,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,715,0,0,1002,0,0,0,298,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,867,0,0,724,0,0,0,0,0,0,0,0,0,0,0,0,768,0,0,0,0,0,1066,0,0,0,0,67,0,174,948, +0,0,0,0,0,0,0,0,0,0,0,0,0,764,0,0,0,0,75,137,0,756,0,0,0,0,0,0,1008,842,643,0,0, +0,67,0,0,0,0,0,0,0,0,0,0,0,135,821,0,0,0,0,0,0,0,0,736,0,389,355,0,0,786,0,0,0, +0,0,0,2044,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1030,0,0,0,1083,0,0,0,0,0, +1226,0,0,0,0,356,319,8,389,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,474,0,0,0,427, +0,413,0,730,0,0,0,0,0,373,0,0,0,0,0,0,0,0,0,799,0,0,0,1793,0,0,0,322,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,290,2,0,0,0,0,0,0,0,0,0,0,672, +699,1860,0,0,0,737,0,0,0,1612,0,0,0,0,0,0,0,0,0,0,0,145,124,884,0,0,0,0,0,387,0, +0,0,0,0,0,0,0,0,0,0,679,0,550,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1305,0,0,0,0,0,0,0, +576,0,0,0,0,0,0,0,686,0,607,0,0,37,0,0,0,0,0,0,0,0,0,101,1726,0,0,0,0,0,958,0,0, +0,903,0,0,0,0,147,0,0,0,0,0,0,0,0,0,0,0,367,0,0,0,0,690,0,705,273,0,0,887,0,0,0, +0,0,0,0,0,0,0,0,90,0,0,0,0,0,0,0,908,0,0,0,0,0,0,0,1261,0,0,497,1235,0,429,0,0, +0,0,904,0,12,125,0,0,0,841,0,0,0,0,0,860,946,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,768,0,770,160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,271,0,0,0,0,0,0,0,719,0,699,581,0,0,0,0,0,0,0,0,0,0,862,304,0,631,0,0,0,0,880, +1513,0,0,0,0,0,981,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,434,0,0,0,0,0,550,0,0,476,930, +824,553,0,0,452,0,151,0,0,0,0,0,0,772,0,292,135,0,0,0,0,0,0,0,504,0,0,1089,0,0, +0,0,0,0,0,0,0,0,0,783,0,0,0,0,0,0,206,393,0,0,0,0,0,0,0,0,232,912,0,0,0,0,0,977, +0,0,716,98,0,0,0,0,0,733,0,0,0,0,0,0,0,0,19,0,0,0,0,668,0,360,0,0,0,0,0,0,656,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,726,0,0,0,0,0,0,0,0,0,0,0,0,72,0,0,1269,0,0,463,0, +0,0,0,0,0,1454,0,1287,245,0,989,0,0,0,0,0,0,0,0,0,107,164,0,0,0,0,0,0,0,1061,0, +0,0,0,2,484,0,0,0,0,0,0,0,1127,0,0,0,0,0,0,0,460,0,0,0,0,0,932,0,0,0,0,0,0,0, +588,625,0,0,0,0,76,92,0,0,0,0,0,0,0,0,0,0,0,0,0,104,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +763,0,622,0,0,0,253,0,546,0,0,110,0,256,916,0,0,35,212,0,0,746,0,0,0,150,0,0, +1466,0,0,0,1299,0,0,0,0,0,0,0,0,0,1518,0,0,0,0,0,0,0,0,0,0,0,0,0,1229,0,0,0,816, +0,0,0,0,0,0,159,0,0,0,0,0,734,869,126,1716,0,0,0,0,0,0,202,232,0,0,0,0,212,0,0, +0,0,0,111,1003,0,0,0,0,0,0,0,0,0,0,0,1712,0,0,216,0,0,0,0,516,0,0,0,0,0,650,0,0, +0,0,57,99,0,0,0,0,300,574,0,0,0,0,1023,0,0,302,0,1871,0,728,252,0,0,461,0,0,0, +323,0,0,0,0,0,0,775,461,0,0,0,0,0,0,172,0,0,464,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,73,727,0,1023,0,0,0,0,0,0,0,0,0,0,577,0,0,0,0,0,0,0,0,1037,0,0,0,0,0,0, +0,0,280,677,0,0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,159,0,446,1730,0,0,0,0,0,0,0,0,0, +395,0,0,0,0,145,0,0,0,0,0,0,0,20,0,0,426,608,0,0,0,0,0,977,0,250,0,0,0,0,0,100, +0,0,0,0,1982,0,0,0,0,0,476,0,0,0,0,0,0,594,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,447,0,0,0,0,526,0,0,14,1124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,188,0,0,0,0,0,0,0,0,362,301,0,0,0,1743,0,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,872,0,831,0,0,208,202,0,0,0,0,0,0,0,1954,0, +0,0,0,516,872,0,0,313,224,0,0,24,0,11,546,0,0,0,1937,242,241,46,0,0,0,830,1273, +0,0,0,0,0,0,0,825,327,1006,0,0,0,0,0,1580,516,366,0,0,0,0,0,1736,0,0,0,0,0,0,0, +0,0,0,0,1935,0,826,0,0,0,0,139,331,0,0,0,0,0,0,0,0,0,0,0,288,0,916,0,0,0,0,0, +1888,0,0,0,0,0,0,0,1471,0,1570,0,394,0,0,0,0,0,0,0,1931,0,1719,0,658,228,0,0,0, +0,0,374,0,0,0,0,735,0,0,0,0,0,0,323,498,0,1063,0,0,0,0,155,0,0,0,0,0,0,0,0,906, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,616, +902,0,0,0,0,0,692,0,0,0,0,0,0,823,0,0,0,305,0,0,0,0,0,0,0,681,0,0,0,0,0,214, +1004,0,0,0,0,0,0,0,23,0,0,1703,0,0,0,0,0,0,0,0,0,1443,0,0,19,714,0,0,0,0,64,737, +0,0,345,1758,0,0,579,47,0,0,539,139,0,0,0,0,388,0,0,0,0,253,0,0,0,0,0,0,252,0, +745,0,0,0,0,0,0,0,0,0,0,0,504,107,0,871,0,0,0,229,0,0,0,0,0,903,0,0,71,0,0,549, +6,47,0,0,0,0,0,0,0,0,0,980,865,705,0,0,0,161,0,0,0,0,143,1331,0,0,0,1388,33,724, +0,0,0,19,0,0,0,395,0,0,0,0,0,846,210,0,0,0,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,695,937,497,0,0,0,0,0,718,0,0,0,0,0,0,0,1581,0, +0,0,0,0,0,161,49,0,0,0,0,0,0,0,0,0,597,0,0,0,1094,0,0,0,811,908,0,0,0,0,0,0,0,0, +0,0,1471,0,0,0,0,0,0,0,0,0,0,42,1935,0,0,0,2014,66,2007,0,0,586,0,0,0,0,0,0,0,0, +0,28,1077,0,0,0,1221,0,0,62,0,0,0,0,0,0,0,0,0,0,1766,0,0,0,0,0,0,0,0,0,0,0,0,25, +0,499,1388,0,0,97,10,0,0,0,0,0,481,0,0,0,0,0,0,0,0,0,0,37,134,155,486,0,1442,0, +0,0,0,0,591,0,0,0,0,0,0,310,1173,0,0,0,0,409,1156,0,0,0,482,0,0,263,926,0,0,0,0, +0,0,0,0,0,0,0,0,0,804,0,0,0,0,0,0,0,0,0,0,0,0,0,1265,0,415,0,348,0,0,0,1012,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,165,1803,0,0,0,0,0,0,0,408, +0,0,0,0,0,0,257,1321,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1138,0,0,0,249,0, +0,0,576,0,0,0,0,231,0,0,0,288,0,0,0,0,0,0,0,0,0,433,1487,569,1678,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,87,0,0,0,0,0,779,538,0,0,0,413,0,0,0, +0,0,0,0,0,0,0,495,0,0,0,0,0,191,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,530,567, +0,0,0,0,0,1484,0,0,0,0,0,0,815,609,0,0,0,0,0,484,0,0,0,0,0,0,0,0,0,0,900,0,0,0, +0,1335,0,1724,0,0,0,0,0,0,0,0,0,0,0,640,0,0,0,0,0,0,0,0,0,0,0,1831,0,0,0,0,0,0, +0,0,0,0,0,0,0,474,0,0,0,0,0,0,0,0,0,1103,0,1504,655,1034,0,0,0,0,0,305,0,0,0,0, +0,0,0,0,0,1236,0,0,429,217,0,0,0,0,739,278,0,0,0,0,0,0,0,708,0,0,0,0,0,1840,233, +0,0,0,0,0,0,0,0,2017,0,0,0,0,0,1488,0,0,0,1590,0,0,0,0,0,1800,28,0,0,0,0,0,0,0, +0,0,45,0,36,0,22,1442,378,0,0,0,0,0,0,1507,0,0,0,0,0,0,0,0,0,0,39,0,0,1054,725, +1955,0,2036,0,0,0,0,0,0,0,0,0,0,896,1871,0,0,0,0,0,0,0,0,0,0,805,0,0,0,0,2046,0, +0,0,0,17,712,0,617,55,320,271,0,0,0,0,0,0,0,0,0,445,0,184,103,0,0,0,0,0,0,0,0, +659,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,676,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +337,0,0,0,506,0,0,0,0,0,843,77,0,458,0,0,0,0,0,1420,382,109,142,330,0,0,0,0,0,0, +0,0,0,0,0,0,87,0,0,0,492,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1239,0,0,0,0,0,0, +211,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1049,0,321,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1985,0,0,122,0,0,234,0,0,0,1098,0,0,0,0,0,0,549,253,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,522,131,0,0,149,0,0,0,0,0,0,0,0,0,0,0,0,0,0,507,0,0,0,0,811,630,0,0,0,343, +0,0,0,0,0,448,591,455,0,1381,0,0,0,0,0,0,0,575,0,0,0,0,0,1175,0,0,0,0,0,0,0,0,0, +653,0,0,0,1761,0,1198,0,0,0,0,297,1127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,678,0,0, +164,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35,0,45,0,0,0,0,0,121,0,0,0,0,0,0, +0,0,125,0,0,0,1622,0,0,0,0,0,721,145,0,0,0,970,792,0,0,0,715,0,0,0,0,0,1999,0,0, +74,531,0,0,65,0,0,0,105,220,0,0,0,0,0,0,0,960,0,0,0,0,0,0,428,19,0,0,401,96,0,0, +0,0,0,1595,116,0,1021,0,0,0,0,0,750,1961,0,0,148,0,0,0,0,0,0,0,0,0,0,0,0,0,75,0, +0,1383,0,0,0,0,0,0,0,0,0,0,0,0,0,0,779,0,0,0,0,0,0,0,0,598,0,424,0,0,0,0,0,0,0, +1222,0,0,0,876,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133,0,0,0,0,187,0,8,0,0,0,0,0, +0,0,429,0,685,0,0,0,0,0,0,0,0,0,0,0,132,472,0,0,0,0,0,0,0,0,0,938,0,0,874,0,0,0, +0,0,774,0,0,0,0,0,92,0,0,0,0,0,0,830,701,0,0,0,0,0,426,350,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,603,59,0,0,0,0,0,0,0,0,0,0,293,0,0,0,0,0,0,0,0,0,0,0,0,0,0,441,163,4,0, +0,0,0,0,0,0,0,0,806,0,0,0,0,0,0,233,0,0,0,0,1994,0,1739,0,0,393,0,47,1038,0,0,0, +309,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,363,0,0,0,175,0,0,0,0,0,0,0,666, +0,0,1675,0,1600,0,0,0,808,0,0,0,0,0,0,0,0,0,0,0,280,54,0,0,0,0,0,0,0,0,421,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249,0,0,103,254,0,262,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,805,0,0,0,0,0,0,0,0,0,1630,0,0,0,0,0,0,0,0,0,0,0,0,0,671,972,989,0,0, +0,0,0,0,0,889,0,0,0,1382,0,0,0,0,0,0,0,775,0,0,0,0,0,0,0,0,0,0,388,202,0,0,0,0, +16,560,0,0,0,841,0,0,566,0,0,0,938,0,0,0,0,0,0,0,0,0,0,912,0,0,0,1361,0,0,0,0,0, +0,618,236,0,1854,0,0,318,190,0,1376,0,0,0,0,0,0,0,349,0,0,0,0,951,1972,0,0,0,0, +0,0,344,0,0,0,0,0,0,0,0,850,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,910,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,0,163,85,0,487,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,145,0,83,0,0,1013,0,0,0,1922,0,0,169,557,66,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1193,82,0,352,454,57,0,0,1333,396,107,0,370,0,0,0,0,0,0,0,0,0,204,0,0,0, +0,0,1706,0,0,0,0,0,0,0,0,0,0,0,0,394,1204,0,0,0,0,0,1007,0,0,0,1696,0,1519,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,981,0,0,0,0,1072,0,0,0,712,0,1629,0,0,0,0,0,0,0,728,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1271,0,0,0,1608,16,0,0,0,0,485,0,0,0,0,0,0, +153,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1991,0,0,0,0,0,0,0,0,52,0,21,0, +0,0,0,0,0,0,0,0,819,0,0,0,0,0,917,0,0,0,0,784,0,0,0,0,135,0,0,0,0,0,454,0,0,0,0, +0,0,0,0,0,852,1719,0,0,0,0,0,852,0,0,0,0,0,952,0,0,0,0,568,0,0,0,0,0,448,0,0,0, +67,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1826,657,0,729,666,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +669,0,0,0,0,0,0,0,402,0,0,152,0,0,0,0,912,0,0,0,0,0,0,51,320,0,445,0,0,0,0,308, +0,0,0,0,0,386,0,0,239,0,0,130,83,0,143,0,348,0,0,0,0,0,0,0,958,0,0,0,0,0,210,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,430,0,0,0,0,0,0,0,0,0,0,0,0,7,213,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,801,0,0,0,0,0,0,0,0,0,936,0,108,0,0, +0,0,0,0,0,0,0,885,587,219,398,364,0,1165,0,0,342,241,303,0,0,0,0,0,0,0,0,0,0, +1454,0,0,0,0,0,0,0,0,0,0,254,562,0,786,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1294,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,493,216,0,0,0,0,219,341,0,0,0,0,0, +0,0,0,0,0,130,1734,154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,701,604,0,0,879,0,195, +666,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1669,0,0,0,1791,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1228,0,0,0,0,0,623,0,0,0,0,0,0,0,798,0,0,0,0,0,0,0,0,0,0,0,0,84, +122,0,0,0,837,0,0,0,0,0,0,1013,0,0,577,0,0,0,460,932,0,0,0,0,0,0,0,0,0,0,0,31, +131,0,0,0,605,0,0,0,1246,0,0,0,0,68,278,165,307,781,0,0,0,0,0,0,33,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,1113,0,0,720,1953,203,0,0,0,0,0,0,0,425,326,0,0,0,0,0, +0,0,0,0,0,241,1316,0,0,0,0,0,416,0,0,0,1300,0,847,0,0,662,358,0,0,0,0,839,1823, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,654,1522,0,0,0,0,0,0,163,0,0,0,0,0,314,978,0,0,0, +601,0,0,0,0,0,946,434,0,0,0,402,411,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,1467, +410,0,0,0,0,0,0,0,0,0,0,0,0,0,0,483,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,677,0,0,0,0,0,0,0,0,0,0,0,0,70,0,0,0,0,1405,0,0,0,0,0,0,108,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,777,0,0,0,0,0,747,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,505,0,326,0,0,164,628,654,0,0,0, +37,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,668,152,0,0,0,0,0,0,0,0,0,0,0,581, +0,0,0,0,44,126,89,0,0,0,0,0,0,0,0,1531,0,0,0,0,0,0,0,0,203,1167,0,0,0,0,0,0,0,0, +531,1232,0,0,0,0,0,943,0,670,231,880,0,1617,0,0,0,1957,0,0,0,0,0,0,0,975,0,0,0, +0,0,0,0,0,0,0,0,242,0,0,0,0,0,0,0,0,0,421,0,0,14,834,0,0,0,0,0,0,0,0,0,0,0,0, +465,0,0,0,0,0,834,688,413,855,0,0,0,590,0,0,0,0,0,0,0,0,114,0,0,0,0,0,0,0,0,0,0, +0,45,169,0,0,0,0,0,0,0,0,0,0,0,198,0,0,565,585,0,0,0,0,0,0,0,0,0,0,0,0,0,691,0, +0,0,593,0,0,0,0,0,0,0,0,0,913,116,0,0,0,0,1360,0,0,0,802,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,673,308,0,709,1006,1895,0,228,0,0,0,1840,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,608,0,0,0,0,0,0,0,0,0,1573,0,2039,136,540,0,0,0,0,0,0,0, +897,0,0,938,1878,0,0,0,0,0,0,0,0,0,1469,0,999,0,299,0,0,0,0,0,0,0,578,0,0,0,0,0, +456,0,0,0,1679,163,693,0,0,0,0,0,0,48,755,0,0,0,0,0,0,0,0,0,0,0,0,338,0,0,0,0, +1091,0,0,0,0,695,0,0,1464,0,0,0,0,0,975,0,0,335,0,0,1979,0,0,0,0,269,1566,630, +396,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1815,634,0,0,0,966,0,0,0,0,0,0,0,9, +412,0,958,0,0,579,382,0,212,0,0,0,0,965,681,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,655, +0,0,0,0,67,0,0,0,0,0,0,751,0,0,0,0,423,231,0,0,1016,300,0,0,0,0,100,237,0,0,0, +1370,0,0,0,1208,0,0,0,0,0,1219,129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199,0,0,427,0,0, +0,0,949,665,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,712,0,0,0,0,0,1186,0,0,0,0,0,0,0,0,0,0,295,312,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +151,0,0,0,0,588,4,0,0,0,0,0,414,104,0,0,757,263,0,561,0,0,0,320,0,0,0,0,0,0,0,0, +0,0,0,225,0,0,0,0,37,817,0,974,0,0,0,0,0,0,0,0,0,0,0,0,0,2026,131,235,16,0,590, +1157,0,0,0,0,0,0,0,0,221,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,390,0,0,0,0, +0,0,0,1144,0,0,0,464,0,0,0,0,0,0,0,0,0,0,0,0,204,407,303,1218,0,0,0,0,5,325,0,0, +0,0,12,800,0,1783,0,0,0,0,0,0,0,0,0,0,504,621,0,0,0,0,0,0,0,0,0,920,0,376,0,0,0, +0,0,218,580,0,768,454,0,0,0,0,0,0,0,0,0,0,0,0,676,0,0,0,0,0,0,164,0,0,0,0,0,0,0, +0,50,0,0,0,0,0,0,0,0,0,0,0,0,0,120,285,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,226,343, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,0,0,1812,0,0,8,0,0,0,21,1125,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,1327,0,0,0,0,575,1598,0,0,0,0,0,0,0,0,0,895,0,0,0,959,0,0, +0,0,0,1759,173,0,0,0,0,266,261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1427,0,0,300,1033,0,0,0,0,0,0,0,0,0,0,0,584,0,0,0,0,52,734, +0,0,217,239,0,1129,0,0,0,0,0,0,0,0,732,20,0,0,0,0,0,0,0,0,0,0,0,418,0,0,0,613,0, +0,0,0,0,0,0,0,0,632,0,0,85,984,0,0,0,0,909,694,7,1109,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,167,0,0,0,0,280,62,0,0,33,0,0,359,186,980,0,0,0,0,0,0,0,0,0,0,0,585,0,0,0, +211,0,0,336,145,0,1130,0,873,0,0,840,263,0,0,0,0,0,0,0,0,0,916,0,0,0,0,0,0,0,0, +0,0,155,0,0,0,461,97,0,0,0,0,0,1356,0,0,0,0,0,0,0,593,0,0,0,0,0,1392,0,0,0,0, +126,0,0,0,0,1179,0,0,0,0,0,162,0,0,0,0,0,765,0,187,0,1286,0,0,0,0,0,0,0,0,0,635, +0,0,23,215,0,0,0,1306,0,0,97,716,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,657,0, +0,0,0,0,0,0,0,299,0,0,0,0,0,0,134,0,0,0,0,0,0,0,0,0,0,0,658,1082,0,0,0,0,0,2002, +0,0,0,0,0,0,833,248,0,0,0,0,0,1654,0,0,531,0,0,0,0,0,0,634,0,0,0,0,0,0,0,0,0, +853,573,249,0,0,0,0,0,0,0,0,527,0,0,0,0,1419,0,0,0,0,0,0,20,49,0,0,0,992,0,0,0, +728,0,0,0,0,0,0,0,0,0,0,0,0,497,1579,0,0,0,0,62,268,0,0,0,0,0,0,0,1201,0,0,0,0, +0,0,0,0,0,0,0,0,495,193,0,0,0,0,106,0,0,859,0,0,23,0,0,0,0,0,0,0,813,925,0,0, +223,613,953,0,0,0,0,0,0,0,0,666,0,0,0,0,0,0,0,0,0,670,0,0,40,216,0,0,0,0,0,0, +259,0,0,0,440,1114,0,0,0,0,0,0,0,0,74,475,0,0,188,139,0,797,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,1572,0,0,0,0,39,0,0,0,0,0,0,0,0,0,0,0,0,1594,0,0,0,0,0,0,0,290,0,232, +0,0,887,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,521,14,0,0,0,0,0,741,0,0,0,992,0, +0,0,0,0,0,0,0,111,0,0,425,0,0,0,0,0,789,0,0,0,1593,0,1768,0,0,233,0,0,0,0,943,0, +0,0,0,0,0,0,955,225,245,0,0,0,0,0,0,241,0,0,0,0,1943,0,0,0,1284,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,709,0,0,0,0,0,0,554,0,0,0,0,0,0,0,0,1564,0,0,0, +443,0,0,0,0,0,0,280,0,0,0,0,0,0,0,0,729,0,0,0,348,0,0,0,0,0,0,0,758,848,298,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,829,1422,189,121,0,0,632,812,0,0,556,0,0,0,0,0,436,172, +530,844,232,984,0,0,0,0,0,0,0,0,0,0,147,0,0,0,0,0,0,0,0,537,0,0,0,0,0,859,0,0, +842,0,0,0,0,0,0,0,0,0,0,1291,0,0,0,0,0,0,0,0,0,0,0,1482,612,392,0,0,0,262,31,0, +0,0,0,0,0,0,0,0,0,753,549,0,0,0,0,0,0,696,0,0,0,0,0,0,0,834,0,0,0,0,0,771,0,0,0, +0,0,0,0,0,0,0,0,0,0,921,0,0,0,674,0,0,0,0,0,0,0,0,0,0,308,444,0,0,0,0,0,0,805, +180,0,0,278,271,0,0,214,505,0,1215,0,0,0,0,0,0,387,271,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,1645,42,92,0,459,0,0,330,1557,0,0,0,0,0,0,0,0,113,18,0,0,0, +1742,0,0,0,965,0,0,0,0,0,0,0,0,0,0,0,0,0,182,0,0,65,0,0,0,0,0,0,0,0,0,0,0,0,973, +0,0,0,0,0,328,0,0,588,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1786, +0,0,962,1985,0,0,0,308,508,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,588,0,0,0,0,0,0,614,793,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,290,0,0,0,0,0,0,0,0,0,0,1136,0,0,0,0,0,0,0,0,0,0,796,719,0,0, +326,210,0,0,0,701,758,472,0,0,0,1947,278,1079,0,0,0,0,0,0,497,41,0,0,634,46,961, +0,810,524,0,0,33,0,0,0,0,0,0,0,0,0,0,0,0,532,0,997,0,0,0,0,0,0,0,0,0,0,0,1301,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1298,0,671,0,0,0,306,0,0,0,0,0,0,0,0,0,0, +693,1823,0,0,0,759,0,0,0,0,0,1932,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,182,0,0,0,1964, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,521,0,0,0,0,0,0,424,857,0,0,0,0,671,328,0, +529,0,0,0,0,0,716,0,1509,80,67,0,0,0,0,59,141,0,0,0,0,0,0,783,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1498,0,0,0,0,343,430,803,1183,677, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1357,53,0,0,0,0,590,0,0,0,0,0,0,0,0,0,0, +0,0,0,329,0,0,0,0,0,0,0,469,0,0,0,0,0,0,0,0,0,0,460,0,0,1743,0,0,963,340,0,0,0, +0,0,1603,0,0,250,0,0,0,0,0,646,218,0,1794,0,0,0,571,0,455,0,0,0,1012,0,0,0,0,0, +0,0,0,0,0,0,0,597,161,0,349,0,524,0,0,0,0,0,0,0,0,0,0,0,0,322,432,0,0,0,0,0,0, +325,223,0,0,0,0,0,566,0,0,0,1394,481,436,0,48,457,610,756,618,0,0,0,755,0,1217, +0,0,0,0,0,197,0,0,0,0,0,0,0,0,0,0,0,0,0,0,544,492,107,414,0,0,0,0,0,0,0,0,0,0,0, +1007,0,0,0,0,5,0,0,1580,0,0,0,0,0,0,0,0,0,0,0,0,0,673,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1843,0,0,0,0,0,0,0,0,0,165,0,0,0,0,0,0,809,885,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,498,0,0,0,306,9,0,0,0,0,0,0,0,437,721,146,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0, +0,0,0,1377,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,0,959,0,0,0,1928,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1435,0,481,0,0,0,0,0,0,142,84,0,0,0,0,0, +1015,0,0,0,315,0,0,0,0,0,0,759,0,0,0,0,0,0,0,0,712,0,0,0,1722,0,0,0,0,0,0,0,0,0, +0,0,0,222,0,985,1414,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1273, +538,706,0,0,0,0,0,0,0,0,115,0,0,0,0,0,0,0,0,0,0,1781,0,0,0,0,0,431,97,665,42, +237,0,0,0,264,0,0,213,0,0,0,0,0,0,0,455,0,0,0,906,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +624,0,574,0,0,0,0,0,0,0,0,0,0,0,0,354,0,0,0,1558,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68, +235,723,1813,0,0,0,957,0,830,0,0,0,0,0,0,0,0,0,0,0,0,23,0,0,496,0,0,0,0,0,0,0, +547,239,88,0,0,0,0,0,0,0,0,0,1310,0,0,0,0,0,0,0,0,80,1076,0,0,118,0,0,0,479,274, +0,0,0,0,0,0,0,0,0,0,0,497,0,0,669,261,0,0,0,0,13,0,0,0,0,0,0,791,250,642,0,0,0, +1429,939,949,0,0,0,0,0,0,0,0,0,0,0,0,0,818,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,982,330,0,0,0,0,545,0,0,0,0,0,0,947,0,1188,0,0,0,0,0,904,0,0,0,0,0,1372,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,693,377,0,0,0,0,0,0,0,0,0,0,0,0,0,0,695,0,0, +713,386,0,0,0,0,128,1575,0,0,0,0,0,0,424,893,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,904,0,0,0,0,0,552,322,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,1808,49,0,0,0,0, +1832,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,421,0,0,442,415,0,0,289, +0,0,0,0,0,206,110,0,0,0,0,0,205,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +19,1539,0,0,0,0,0,1340,0,1194,0,0,0,0,0,0,0,0,549,0,0,0,0,0,0,0,0,1720,0,0,0,0, +0,0,0,0,0,319,0,0,0,0,112,1180,0,0,0,0,0,0,0,0,0,0,0,967,0,0,0,0,0,0,0,0,0,1940, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,735,0,0,0,0,0,0,0,0,0,897,132,0,0,0,0,0,0,0, +0,0,0,38,838,0,0,0,379,218,8,660,1017,0,0,0,0,0,0,111,387,647,877,0,0,53,790,0, +0,0,0,0,0,0,0,458,0,0,0,0,0,0,954,0,0,0,394,0,1367,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,882,0,0,0,0,0,0,0,1409,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,124,342,199,0,0,0,0, +0,0,0,0,0,0,724,628,0,0,0,0,804,266,0,0,0,0,0,208,0,79,0,0,0,0,0,0,0,0,741,0,0, +0,0,0,0,0,0,0,0,606,0,1494,821,1553,0,0,135,405,0,0,178,100,0,0,0,0,0,0,0,0,0,0, +0,0,0,481,0,0,0,1378,0,0,0,0,0,0,0,0,0,0,0,0,0,791,33,1227,857,0,467,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,447,0,0,0,0,0,0,86,128,0,0,0,0,0,0,587,0,0,0,692,1018,0, +195,0,0,0,0,0,0,0,1546,0,0,0,0,0,0,0,0,0,0,0,684,0,0,345,0,0,0,0,0,0,365,0,1683, +0,0,472,0,433,0,0,0,0,0,0,0,28,0,0,0,997,0,705,3,0,0,0,0,0,0,0,0,0,229,0,0,0,0, +102,0,0,0,0,866,1022,0,0,0,0,0,0,0,0,0,55,0,115,0,0,0,0,933,0,0,0,0,0,0,0,702,0, +0,0,0,0,0,0,1728,26,484,0,0,0,185,618,417,0,803,0,0,0,0,0,0,0,0,0,0,0,1262,0,0, +0,0,0,0,0,0,0,0,0,0,0,633,0,0,0,0,0,0,0,0,0,0,0,0,0,479,262,0,0,0,0,0,0,830,0,0, +0,0,26,70,0,0,0,0,0,0,0,0,217,0,640,51,0,0,360,1586,0,0,0,0,0,652,0,0,0,0,0,766, +0,0,0,0,298,737,0,0,0,0,0,0,0,0,0,0,655,222,906,0,0,1013,991,2009,0,0,0,0,503,0, +0,0,216,154,0,0,0,716,0,844,0,0,0,0,621,252,0,0,0,0,748,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,103,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,576,0,0,0,648,0,0,0,331,0,0,0, +0,0,0,0,0,0,0,0,0,632,0,0,0,518,107,0,0,0,0,0,0,0,0,851,0,0,0,0,504,0,0,0,0,0,0, +0,0,0,0,0,0,7,883,0,0,0,0,0,0,0,922,0,0,0,0,0,0,0,0,91,993,0,0,0,0,0,0,200,131, +10,0,0,0,0,0,0,0,0,0,0,0,0,0,365,1433,0,0,0,0,28,103,0,0,798,1013,0,0,0,0,0,0,0, +0,39,1925,0,853,0,0,271,519,0,0,0,0,338,0,0,300,470,419,0,0,0,0,0,0,836,0,0,0,0, +0,0,1937,0,0,0,0,0,393,0,0,357,0,0,0,0,0,703,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,387,0,0,0,0,0,0,75,708,453,1351,0,303,0,0,772,0,0,0,0,0,0,0,0,749,0,0, +0,0,0,0,0,0,0,0,0,0,0,1065,0,0,717,226,0,0,0,0,0,890,431,626,0,0,0,0,706,0,0,0, +51,698,0,0,0,0,0,0,0,0,0,0,0,828,0,0,17,0,0,0,0,1929,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,871,498,0,101,1793,0,0,0,0,0,0,435,0, +0,0,0,0,966,0,129,1644,0,0,0,0,0,0,0,0,0,0,0,0,0,997,502,0,0,0,0,0,0,0,0,0,0,0, +0,823,0,1927,0,0,0,0,98,1756,0,0,0,0,0,0,0,0,0,0,0,0,8,0,160,1046,0,492,0,0,0,0, +0,0,129,45,0,0,0,0,0,0,353,558,0,0,0,0,0,785,0,0,0,1145,189,0,0,0,26,353,0,0,0, +0,0,2024,0,0,0,606,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,855,0,0,0,0,0,0,0,0,0,0,0, +0,0,2011,0,0,5,4,0,0,461,764,0,0,0,1449,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1445,0,0, +0,1168,0,0,0,233,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,216,0,0,0,286,0,0,0, +3,0,0,0,723,536,0,0,0,0,0,285,0,0,0,560,0,0,0,0,0,690,0,0,0,0,0,1246,0,0,63,0, +33,0,0,0,0,0,520,1862,0,0,0,0,0,0,0,0,0,0,0,0,630,0,0,0,0,554,0,0,0,0,0,1001,0, +0,0,0,0,446,0,0,0,0,0,0,0,1313,0,0,837,636,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,278, +0,0,0,0,0,0,0,0,868,0,0,0,0,1010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1231,0,304,0,506,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,0,93,1408,794, +843,704,0,285,114,485,898,145,0,19,2035,0,0,0,1933,0,0,0,0,0,0,0,1728,0,0,0,0,0, +0,0,0,746,0,0,0,0,0,0,0,995,1964,0,0,0,0,0,0,0,0,0,0,0,1550,0,874,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,1018,0,0,0,814,126,0,0,1264,0,0,814,955,0,0,0,0,0,0, +0,981,0,0,0,0,0,0,0,0,915,56,0,0,100,0,0,0,0,0,0,0,0,0,638,0,0,0,0,738,0,0,0,0, +0,0,0,0,0,758,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1112,0,0,214,0,0,0,133,0,196, +168,0,0,0,0,0,1152,0,1245,0,0,538,169,871,1816,0,0,413,133,0,0,0,978,0,0,43,93, +371,0,0,0,0,0,0,526,25,0,754,335,0,0,0,0,182,0,0,0,0,0,0,0,0,0,0,0,39,601,0,0,0, +0,0,0,0,181,370,0,0,1652,358,0,0,0,0,0,0,0,0,0,176,286,0,788,0,0,0,0,0,1223,780, +254,1003,896,0,0,0,1447,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,744,0,0,0,0,0,126,0, +41,788,0,0,0,629,0,0,0,0,0,0,0,0,0,0,0,293,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,420,37,1900,0,0,0,0,542,1570,957,0,0,0,0,0,0, +0,373,31,0,0,0,0,125,325,0,0,0,0,0,0,323,0,0,1547,0,0,0,0,0,0,0,0,0,0,0,0,0, +1216,0,0,0,0,0,0,198,1905,629,15,0,0,0,0,0,0,20,75,543,1353,0,0,0,533,0,0,6,0,0, +0,0,0,0,538,0,0,0,0,0,0,0,0,0,0,0,338,0,0,0,0,11,0,0,0,284,659,0,989,0,0,0,0,0, +0,0,0,0,848,0,0,507,0,0,0,0,0,0,0,0,188,991,884,0,0,0,0,60,959,0,0,0,0,0,1653,0, +0,922,337,0,638,0,0,500,0,0,0,0,0,0,0,0,0,0,0,166,0,0,0,0,0,0,0,0,0,0,0,0,418,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,760,0,0,0,0,0,0,1277,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,770,0,0,0,0,0,0,0,243,89,0,0,0,0,0,0,0,0,0,1396,0, +560,0,0,3,1658,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,586,0,0,1271,0,0,0,505,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,637,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1947, +41,445,0,0,0,0,0,0,0,0,57,189,0,0,371,0,0,0,0,552,0,883,0,923,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,875,0,0,0,1788,49,0,0,0,0,0, +0,0,0,0,0,0,661,0,0,1945,0,0,0,0,0,794,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,1135,0,0,0,745,0,0,0,0,0,0,0,84,0,0,0,0,0,0,0,410,0,976,0,0,0,0,0,703,0,0, +0,0,0,0,187,322,0,0,0,227,0,0,0,0,560,0,31,1395,0,0,0,0,0,466,0,0,0,0,643,167,0, +0,0,1428,0,412,0,0,0,0,0,0,0,0,0,1118,562,0,0,0,0,0,256,0,0,0,0,0,0,1771,0,0,0, +0,0,1190,132,0,66,0,0,0,0,0,0,0,0,0,0,317,0,0,0,63,0,0,0,0,0,0,0,1475,0,0,0,0,0, +0,0,288,0,0,0,0,608,0,0,0,0,0,0,0,0,1225,0,1189,0,0,0,0,0,0,0,1468,0,0,0,0,0, +689,120,0,0,0,0,0,0,0,1,0,329,0,0,0,0,226,0,0,0,0,0,1855,0,0,461,0,0,0,0,1346,0, +0,0,0,0,85,0,0,299,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1171,0,0, +0,980,0,0,0,0,0,0,0,0,637,279,0,0,0,0,0,293,0,0,0,0,528,17,0,0,0,0,5,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,0,0,0,0,0,0,0,601,0,0,0,0,0,0,779,0, +196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1322,737,752,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,412,192,80,0,0,8,1470,0,0,0,0,0,0,0,0,0,873,0,0,0,0,0,835,0,0,0,0,256, +38,986,0,0,0,0,0,0,0,0,0,91,257,278,911,0,0,0,0,0,0,0,0,749,151,0,0,0,0,0,0,0,0, +0,0,0,0,989,0,0,990,0,0,90,194,0,0,0,0,0,425,0,0,0,0,0,774,0,0,0,0,0,0,0,0,0,0, +646,827,752,0,0,0,662,0,22,21,0,0,0,0,0,0,95,239,0,0,0,431,0,0,0,0,0,874,0,0, +265,65,0,0,0,1350,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1887,0,0,0,0,0,0,0,809, +0,696,0,1074,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,630,0,0,802,0,0,0,56,776,0, +970,0,0,797,0,0,0,0,0,400,0,0,1951,0,0,41,0,11,118,0,0,0,0,0,0,0,0,251,615,0,0, +0,1044,0,0,0,0,0,0,0,0,0,0,0,225,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,370,0,0,0,0, +104,48,209,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,930,0,0,0,0, +0,0,0,0,0,0,0,1286,0,759,0,120,385,0,0,0,429,0,0,0,0,0,0,0,0,820,0,0,0,0,0,0, +199,0,10,151,0,0,0,761,365,0,0,0,0,0,0,0,0,0,46,1086,0,0,0,0,11,1624,58,344,0,0, +1008,1868,0,0,0,888,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,711,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,440,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,914,1913,0,958,0,885,0,0,0,0,0,0,0,0,0,0,0, +0,0,847,276,0,302,65,0,0,0,510,0,1514,0,0,0,0,0,0,152,291,0,0,0,0,0,0,0,0,0,0,0, +0,282,589,0,0,0,0,0,0,0,0,0,0,0,0,0,130,0,0,463,42,0,0,0,0,0,372,0,0,0,0,0,0,0, +0,0,680,0,0,0,0,0,0,0,0,977,1997,0,0,0,810,0,0,0,0,0,0,0,0,0,1390,0,0,0,644,0,0, +867,982,0,0,0,0,0,0,0,540,0,123,0,0,0,1978,0,0,0,0,789,623,0,1723,0,1220,0,0,0, +0,0,0,0,480,0,0,0,0,0,0,0,0,0,0,0,888,0,0,0,0,0,0,0,0,0,0,0,0,299,1995,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,788,179,0,0,0,0,0,0,431,156,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1373,39,80,196,0,0,507,0,0,0,646,0,0,0,0, +0,1214,0,0,0,0,926,0,0,0,1,114,0,0,0,0,0,446,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,490,0,0,0,491,0,1584,0,0,507,250,0,0,0,158, +10,362,1,0,0,0,0,0,0,0,0,0,408,228,860,480,0,779,0,0,0,557,0,0,142,197,0,0,0,0, +0,0,0,0,0,0,0,1490,11,378,316,1057,0,0,18,579,299,1546,0,177,0,0,0,0,0,0,0,0,0, +411,0,0,0,0,727,439,0,0,0,0,0,1528,0,0,0,0,0,0,58,0,482,0,0,0,505,1952,0,0,0,0, +0,0,0,0,0,0,0,242,0,0,0,0,0,0,0,953,0,0,0,0,802,0,0,0,0,0,0,0,0,0,0,290,0,0,791, +52,0,0,0,0,0,0,0,0,0,0,0,112,0,0,0,0,0,1028,0,0,138,0,0,0,0,1811,0,0,0,0,0,0, +934,1821,0,0,0,0,371,38,0,0,0,1296,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,723,0,0,0,0,0, +0,0,0,0,0,0,0,0,1330,0,0,0,0,0,0,0,1255,296,109,0,0,0,0,0,660,0,0,0,0,270,591,0, +0,0,0,0,0,0,1090,81,0,0,0,0,391,0,0,0,0,249,322,0,0,0,0,0,0,0,1412,0,0,0,0,0,0, +0,0,0,0,526,632,0,0,0,0,0,0,235,144,0,0,0,0,0,940,0,0,0,52,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,309,196,0,0,0,0,0,1912,0,1290,0,686,0,0,625,0,0,0,0,0,0,0,0,0,0,0,412,0, +0,0,0,43,0,0,0,0,11,967,758,0,0,0,0,0,0,0,0,0,0,0,0,0,0,220,0,0,0,0,0,0,0,0,0,0, +873,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,890,0,0,2,0,0,0,0,0,0,0,0,1774, +393,263,0,0,0,0,0,0,818,456,0,0,251,178,393,97,0,0,0,0,0,674,168,0,0,0,0,0,0,0, +159,1639,0,0,0,0,0,0,0,0,59,934,0,191,0,0,0,0,346,165,0,877,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,128,0,0,0,0,0,0,1297,0,0,0,0,0,0,164,0,0,0,15,132,241,1073,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,324,53,0,0,910,0,0,0,0,0,0,0,0,734,705, +217,73,0,0,0,0,0,0,0,0,636,389,0,1409,0,0,0,0,0,893,0,0,0,0,21,0,0,0,0,0,0,0,0, +0,0,0,0,0,721,0,0,0,959,0,0,0,0,1433,0,0,0,0,0,0,0,0,0,0,0,0,174,189,0,0,0,0,0, +0,0,0,0,0,22,2,0,0,815,354,0,0,0,0,425,0,411,60,13,1611,0,0,0,0,0,0,0,0,0,0,0,0, +0,1478,596,0,0,398,0,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,1159,0,0,0,0,0, +592,223,0,0,0,0,0,0,0,245,64,0,0,0,0,278,0,604,0,0,1502,265,0,0,0,0,0,0,0,310, +1763,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,129,0,0,0,0,0,0,0,0,0,1356,0,0,0,0,0,0,0, +0,505,0,0,0,0,0,0,0,1000,0,0,966,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,839,0,0,0,0,0,0, +0,0,0,0,0,0,0,637,0,0,0,0,0,0,0,0,0,0,0,0,0,0,590,0,0,0,0,280,0,0,0,1386,0,0,0, +281,0,1064,0,0,0,0,0,917,0,0,15,555,0,0,1014,1883,0,0,0,965,0,0,117,33,0,0,0, +801,0,0,0,0,0,877,0,824,0,0,0,0,0,0,0,0,0,0,0,365,0,0,0,0,0,0,774,7,0,430,0,0, +231,360,0,0,0,0,0,0,0,0,822,740,0,0,929,1485,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,852,0,0,0,0,17,0,0,0,0,0,0,1001,0,0,0,0,35,831,0,0,384,457,0,0,0,1351,0,27, +0,0,984,0,264,552,0,401,0,0,0,710,0,1211,0,0,11,205,0,0,0,0,0,0,0,0,0,0,0,0,5, +579,0,717,0,0,1011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,805,0,0,0,0,0,0,0,0,0,0,0,489,0, +0,0,1024,0,0,0,0,0,0,0,0,0,892,0,0,0,0,0,0,0,0,0,0,0,0,473,0,0,0,659,864,0,0,0, +0,0,0,152,819,0,51,0,0,0,0,0,0,0,0,0,0,130,0,0,0,0,0,229,0,0,0,0,674,0,0,0,0,0, +0,0,0,0,770,52,79,0,0,0,1666,0,409,0,0,0,0,0,0,0,195,0,688,0,0,0,0,0,0,0,0,0,0, +0,889,174,160,0,0,0,0,0,0,0,0,0,0,0,0,0,872,0,918,569,268,0,0,0,1224,0,1361,0,0, +0,0,0,0,0,0,0,374,0,0,0,0,0,731,0,0,0,0,190,0,0,0,0,0,0,0,202,506,444,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,835,0,17,1526,0,0,0,0,0,477,0,0, +994,1374,76,0,0,0,0,0,0,0,355,287,0,1389,0,0,0,0,0,0,455,384,0,0,0,264,0,0,0,0, +0,0,0,0,0,0,0,0,1001,0,0,0,0,0,0,0,0,0,0,0,0,28,0,0,0,851,175,359,0,0,0,0,0,0,0, +0,287,740,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,857,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +819,1402,0,0,0,0,0,0,174,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1649, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,655,573,0,0,0,0,0,0,0,0,128,351,0,0,0,0,0,0, +0,0,0,0,0,918,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,687,0,0,0,0,0,0,0,0,0,1525, +0,0,0,1009,0,0,0,0,0,0,0,340,0,0,0,0,0,0,0,0,0,0,861,0,176,0,0,0,0,0,0,0,0,0,96, +985,0,615,0,0,0,0,0,0,0,1919,0,0,0,0,0,1131,0,0,0,0,0,0,0,247,0,0,0,0,27,23,0,0, +0,0,0,0,0,0,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1015,0,0,0,0,0,1088,0,0, +0,0,0,1585,0,0,0,0,227,0,0,0,478,360,0,0,0,95,0,0,0,0,0,0,699,0,0,0,26,0,0,0,0, +1119,0,0,0,739,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,741,67,0,0,0,0,0,0,464,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,0,96,0,0,0,26,342,0,0,0,0,0,0,203,0,0,449,0, +0,0,0,0,0,0,0,0,0,256,311,0,0,0,0,0,0,758,0,0,0,0,0,0,0,0,827,0,0,0,0,581,64,0, +1047,0,0,0,0,0,288,0,0,0,0,0,1375,0,0,0,0,0,0,0,0,0,0,0,1309,0,0,0,0,0,0,0,0, +376,12,0,0,0,0,0,154,0,1520,0,1753,95,502,0,0,0,0,0,0,0,269,291,1197,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,1341,0,1017,0,0,0,0,0,0,0, +0,857,1810,533,0,0,1453,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,836,211,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,19,0,156,0,0,0,0,1009,0,0,0,0,0,0,0,0,0,0,0,0,0,820,0,0, +0,0,0,0,0,0,0,228,0,0,0,1131,0,1276,0,0,0,0,0,0,0,0,0,0,0,0,849,1792,0,0,389, +291,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,525,0,0, +0,453,0,0,0,0,666,0,0,0,422,0,355,0,0,0,0,165,0,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,865,0,0,0,0,0,0,0,1625,0,0,0,234,0,1383,0,0,0,0,0,0,0,0,306,0,0,0,802,1921, +0,0,0,0,0,0,180,0,0,0,0,1312,814,0,0,0,0,0,0,0,0,0,0,707,0,0,0,1493,11,61,733,0, +0,0,341,0,0,0,98,0,0,0,0,0,0,0,0,0,0,0,1014,0,0,0,0,0,0,0,142,102,0,0,30,0,0, +823,0,1045,0,0,0,1930,0,1512,0,0,0,0,0,0,0,87,0,1243,245,0,0,0,0,0,0,0,48,68,0, +0,0,0,0,0,0,0,126,77,625,938,0,0,351,0,0,0,174,1668,0,707,0,0,0,0,0,0,0,0,0,0,0, +403,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,282,0,0,0,0,0,0,8,44,0,0,363,115,0,0,0,0,0,0, +0,0,0,0,0,0,545,761,0,0,835,1254,0,0,0,0,930,1936,0,0,0,0,0,0,0,0,653,0,0,0,0,0, +344,0,0,1483,673,185,0,0,460,93,753,478,0,0,0,0,0,1020,0,0,0,0,0,0,0,103,0,0,0, +499,0,0,0,0,0,0,207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,0,968,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,3,0,0,0,0,399,0,0,0,0,224,563,0,0,0,0,0,704,0,0,0,0,0,0,0,0,0,0,0, +1559,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,861,0,0,0,0,946,333,746,0,0,0,0,0, +0,0,910,0,0,0,0,0,0,0,0,0,0,0,0,0,652,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1393,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1514,0,0,0,0,201,0,510,717,0,0,528,0,0,0,0, +20,0,0,0,1251,0,0,0,1163,0,0,0,307,0,0,0,0,0,1091,0,0,0,0,0,0,0,0,0,0,0,429,0,0, +0,881,0,0,0,0,0,621,0,0,0,0,0,0,0,736,0,348,0,868,0,0,0,0,433,0,0,0,771,1495,0, +0,0,0,215,0,0,0,0,0,124,0,0,0,0,0,0,0,0,0,0,0,55,0,0,0,0,0,0,0,112,62,0,856,270, +0,572,0,0,0,0,939,0,0,0,0,0,0,0,352,0,0,0,0,0,0,0,0,0,647,0,0,0,0,10,0,0,0,0,0, +0,0,220,0,0,0,0,0,0,0,0,0,0,0,0,0,464,0,0,109,0,0,0,1746,0,0,0,515,0,0,0,566,0, +0,0,0,0,0,67,40,0,0,722,992,0,0,923,0,0,0,0,0,0,1145,0,0,0,0,0,0,0,0,0,0,0,568, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,0,0,0,0,645,0,0,328,0,0,0,0,0,0,0,0,0,0,0,0, +1363,0,0,0,0,0,1280,0,0,0,0,0,0,0,0,0,0,7,28,360,162,0,0,0,0,0,0,0,0,0,0,0,764, +0,0,833,862,0,856,0,0,0,0,0,0,736,92,0,0,948,1944,0,1479,63,590,0,0,0,1521,0,0, +0,709,0,0,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,483,0,0,0,0,1213, +0,0,0,0,29,1022,0,1712,0,466,0,0,0,0,0,0,0,0,0,0,0,0,0,731,0,0,0,0,0,0,171,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,241,0,0,0,0,0,0,0,0,0,0,0,964,2005,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1100,0,0,0,954,0,0,0,0,0,0,0,0,0,1958,0,0,34,549,994,0,0,449, +137,850,0,0,670,146,0,0,0,0,518,159,0,0,0,0,0,0,0,0,151,0,0,1027,0,0,0,0,0,0,0, +0,0,0,983,0,0,0,0,993,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,141,501,0,0,0, +0,0,0,0,0,0,452,0,0,0,0,0,0,0,0,0,0,233,149,0,0,0,0,0,0,0,0,582,0,0,0,801,0,0,0, +0,0,0,70,0,0,369,0,36,0,0,0,0,0,0,0,204,721,430,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1817,16,1078,1021,0,0, +406,0,0,0,0,0,69,0,0,0,0,0,1830,0,0,0,824,0,0,0,0,0,0,0,0,0,826,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,816,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,717,1845,0,423,0,0, +0,0,0,0,0,0,510,0,0,1048,0,0,0,618,0,0,0,520,0,0,0,0,990,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,321,0,0,0,0,0,0,0,1135,0,0,921,0,0,0,24,397,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,856,0,0,0,139,282,981,0,288,0,0,0,1890,651,56,0,0,0,0,0,0,0, +0,261,0,0,0,0,0,0,0,0,0,0,0,617,1403,0,1205,0,0,563,0,0,0,0,0,0,0,0,333,0,0,0,0, +0,369,0,0,0,0,0,0,0,0,0,622,0,0,0,1407,0,0,0,0,0,0,0,0,0,0,0,0,624,160,0,363,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,619,0,174,292,0,0,656,616,0,0,0,685,0,0,0,0,0,0,0,0,0,0,0,0,0,647,0,0,0,631,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1267,0,0,0,1797,0,0,0,1684,0,0,469,0,531, +1230,73,0,0,0,0,0,0,0,0,0,268,0,0,0,0,0,102,558,109,65,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,595,0,0,0,0,0,374,1832,0,0,0,0,0,0,16,0,405,6,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,881,0,1495,0,0,0,0,0,0,0,0,0,142,0,0,0,0,0,0,0,0,0,0,21,466,23, +257,0,0,0,0,0,0,77,404,0,0,0,0,0,0,712,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,860, +1848,0,0,652,629,0,0,0,0,13,377,0,1842,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1501,0, +0,0,1906,0,0,0,0,0,0,0,0,0,0,0,0,0,491,234,171,0,0,0,0,631,1186,0,0,0,0,0,0,0,0, +0,0,0,0,931,0,170,0,0,0,0,0,0,0,0,0,0,1587,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +765,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,424,0,0,714,0,0,0,0,685,0,0,0,0,0, +0,285,0,0,0,0,0,0,429,0,0,0,0,0,0,0,0,0,0,71,18,0,0,0,0,0,0,0,0,0,0,116,828,0,0, +0,0,0,0,289,0,0,0,0,0,0,0,0,675,0,0,0,1424,0,0,0,0,0,647,0,0,0,1334,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,36,209,0,0,0,0,0,0,0,342,0,0,0,928,0,0,0,0,0,1838,118,856,654, +318,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,915,895,454,0,0,513,1425,0,0, +0,0,0,0,791,0,153,0,0,0,0,0,0,796,909,445,345,0,0,0,0,0,0,0,0,578,0,0,0,1387,0, +0,0,555,0,0,0,0,0,0,766,0,0,0,0,0,0,0,0,0,0,541,0,0,0,0,0,0,0,0,0,0,0,0,0,880,0, +0,0,0,0,1506,0,0,983,0,768,0,0,0,0,584,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,737, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,226,30,426,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,462,0,0,0,385,0,398,0,0,0,0,0,0, +0,0,0,347,0,0,0,0,125,1259,644,136,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,469,0,0,0,0,0, +1367,0,0,0,0,0,0,0,0,0,0,0,719,0,0,0,0,0,0,0,0,0,0,0,0,0,1423,0,0,0,0,0,0,0,0,0, +749,0,0,0,0,546,645,0,0,0,0,0,0,277,0,0,1275,0,0,0,0,0,0,0,453,536,555,0,0,987, +1107,0,0,90,0,0,0,0,0,0,0,0,860,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +257,0,1768,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1071,0,0,0,0,0,0,0,0,0,0,0,0,0,83, +0,835,0,0,0,0,0,0,0,2006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,696,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,95,1718,0,0,0,0,0,0,0,26,0,550,0,0,0,0,0,901,0,0,0,0,0, +0,822,0,0,122,0,0,0,807,0,0,0,0,0,262,0,620,601,34,0,0,170,0,0,0,0,537,0,0,0,0, +0,0,0,0,0,332,0,0,208,1909,182,261,0,0,0,1721,0,0,0,0,0,933,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,1609,0,895,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,812,0,0,942,1916,0,0,0,0, +0,0,0,778,0,0,0,137,0,1314,0,0,0,0,0,0,0,1661,0,0,0,0,0,0,0,1591,0,0,0,0,0,0, +820,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,185,89,0,1160,230,6,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,63,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1740,0,0,177, +170,0,1961,0,0,0,0,0,0,0,0,0,0,0,0,91,0,17,44,0,0,0,0,0,0,0,0,0,270,0,296,0,0,0, +0,0,0,0,1523,0,0,0,0,0,0,0,0,0,0,757,7,0,0,0,0,0,0,0,0,0,0,530,588,0,0,0,0,0,0, +0,0,0,786,0,0,0,0,0,580,627,88,447,57,0,0,0,0,0,0,0,0,845,735,0,0,0,0,0,31,15,0, +460,521,12,424,0,0,0,1302,0,0,0,0,0,0,0,595,0,0,0,13,548,97,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,1472,452,1767,0,0,0,0,0,0,0,0,0,0,115,0,0,0,0,0,0,1543,0,1111,0,0,0,0, +1,0,359,488,0,267,0,0,0,1983,0,0,0,0,0,0,0,1155,0,1575,0,1438,31,0,0,377,101,0, +0,0,0,0,0,0,0,0,0,0,0,0,476,0,0,0,0,0,0,0,0,2023,0,0,0,0,0,1836,0,0,0,0,35,843, +0,0,0,0,0,0,0,554,0,0,0,536,625,207,0,1371,0,0,0,424,785,336,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,896,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,750,0,0,0,0,238,0,0, +0,0,0,383,0,0,0,0,0,0,0,0,603,725,11,0,0,0,0,0,0,0,0,0,476,0,0,0,0,0,1552,0,0,0, +0,0,0,0,680,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,435,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1431,0,0,13,112,0,0,356,0,0,0,0,0,0,0,0,0,0,1963,0,0,0,1244,18,0,0,0,0,0,0,867, +0,0,0,0,0,0,50,708,73,592,0,502,0,0,0,0,0,0,161,347,0,0,0,0,470,33,0,246,571,10, +0,465,614,0,237,0,0,0,0,0,24,18,0,506,0,0,0,0,0,0,33,309,0,0,0,0,0,0,0,0,0,0, +140,0,0,0,0,1056,0,0,0,1704,0,0,0,0,0,0,0,1036,0,0,0,0,0,0,0,0,0,1315,432,86, +264,524,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,107,0,0,0,0,0,123,927,0,0,957,1149,0,0, +0,0,0,778,0,502,196,0,0,0,0,1312,0,0,0,0,0,0,0,855,0,0,0,0,0,0,0,0,0,0,45,1400, +0,0,0,1003,0,0,0,0,0,1097,0,0,0,0,0,0,0,0,545,612,0,0,0,0,0,0,0,0,0,0,0,0,54,0, +0,0,0,172,0,0,0,1029,0,0,0,0,0,0,0,0,0,568,0,0,0,732,617,0,0,974,94,989,733,0,0, +0,0,0,0,1789,0,0,665,2015,0,0,0,0,0,0,806,287,0,0,0,0,0,1539,0,0,0,0,0,0,0,0,0, +0,182,1563,0,0,0,0,0,0,0,0,0,484,0,0,0,0,0,1623,0,0,0,0,0,0,0,0,878,1833,0,1569, +0,0,0,0,0,0,0,0,93,0,715,994,0,0,0,0,0,63,0,591,0,0,0,0,0,0,0,749,0,0,0,0,547, +366,0,0,0,1747,0,0,0,0,0,0,0,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1463,0,772, +893,0,0,0,48,0,0,941,0,0,690,1785,106,440,0,0,0,0,0,0,0,0,0,0,32,0,332,216,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,852,0, +0,416,564,0,918,0,1764,0,0,3,0,0,274,0,0,0,0,501,0,0,0,0,0,0,0,851,743,0,49,0, +879,0,0,47,0,0,0,0,0,0,865,0,1202,0,0,0,0,0,0,47,272,0,0,0,0,0,0,0,0,0,0,0,1455, +0,0,0,0,891,1911,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,761,0,0,0,0,0,0,0,0,0,407,0, +183,0,0,490,0,0,0,0,0,0,0,35,731,0,0,0,0,0,0,0,819,0,0,0,0,0,0,0,0,0,0,0,0,0, +575,0,0,0,0,45,818,0,0,77,222,0,0,0,0,849,1880,0,0,0,633,0,1308,0,0,0,0,0,0,0,0, +0,0,86,0,0,0,0,0,0,0,0,0,0,0,0,0,0,817,0,0,0,0,0,0,0,0,0,882,0,0,0,914,0,0,0,0, +0,0,0,0,0,0,865,0,0,426,399,58,0,0,0,0,0,0,538,102,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,876,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,566,0,63,12,0,0,0, +0,0,0,0,0,0,0,0,0,0,3,114,0,0,0,0,0,0,0,0,576,0,0,0,0,0,0,0,0,933,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,692,0,0,0,0,0,0,0,0,0,0,0,0,752,0,0,0,0, +0,0,0,0,375,0,1011,0,0,96,0,0,0,0,0,0,0,0,0,148,0,0,0,0,0,0,0,0,0,0,0,337,56, +666,0,246,394,0,0,0,0,0,0,0,0,437,0,0,0,506,0,0,0,0,1003,0,1163,0,328,0,0,0,0,0, +0,0,0,1000,0,0,0,0,0,744,101,0,0,0,0,0,726,0,0,176,0,146,9,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,839,0,0,0,0,0,0,223,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,246,1931,29,0,0,1771,0,0,0,0,0,846,6,157,0,0,0,0,0,0,0,0,0,875,0,0,477, +773,177,639,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1747,0,0,0,0,158,873,0,659,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,391,0,0,0,0,0,0,0,0,0,0,0,0,668,883,0,78,628,0,0,0, +0,0,0,0,0,0,0,0,0,1460,0,962,0,0,0,0,0,460,0,0,0,0,0,0,0,0,0,0,0,0,0,0,34,199,0, +0,0,388,474,0,271,0,333,608,0,0,0,0,0,0,49,0,988,0,707,617,0,0,0,0,0,0,0,756,0, +0,0,0,0,1583,0,0,0,0,0,0,0,0,0,0,285,0,0,0,0,0,0,0,0,0,0,0,0,0,0,344,0,0,0,0,0, +0,0,0,515,1709,0,0,0,0,0,0,0,0,404,0,0,0,0,500,0,0,0,0,0,0,0,0,0,68,216,0,0,0,0, +0,0,0,488,353,0,0,177,236,0,0,458,490,0,0,0,0,0,0,756,1504,0,757,0,1735,0,0,108, +598,0,0,0,0}; +const BROTLI_MODEL("small") +uint8_t kStaticDictionaryHashLengths[BROTLI_ENC_NUM_HASH_BUCKETS] = { +8,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,0,0,12,0,0,0,0,4,22,5,0, +4,0,0,0,0,0,0,0,0,0,0,0,0,14,6,0,0,0,5,0,0,0,0,0,0,0,7,13,0,0,4,0,0,0,0,0,0,0,0, +0,6,0,0,0,0,8,0,0,0,0,0,0,7,0,7,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,4,0,0,0,4, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,10,4,0,5,13,7,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,6,0,0,8,7,0,0,9,0,8,0,0,0,0,0,0,6,0, +0,9,0,0,0,11,0,0,6,8,7,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,7,0,0,0,6,8,0,0,0,0,0, +0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,9,0,0,0,8,4,13,7,0,0,0,0,0, +7,0,5,0,0,0,0,8,5,0,5,0,0,8,7,0,0,0,0,0,0,0,0,0,0,9,0,0,0,8,0,0,0,10,4,0,5,0,4, +0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,6,0,6,0,0,0,0,8,7,0,4,9,4,0,0,0,0,0,0, +9,0,0,0,8,5,0,0,0,6,0,0,0,0,0,0,0,0,0,7,18,0,0,0,0,4,9,0,0,4,0,6,0,0,0,6,0,6,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,6,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,5,8,7,0,0,0, +0,9,0,0,0,0,0,0,0,8,6,10,6,0,0,0,4,0,6,8,6,0,0,0,4,0,0,0,0,0,5,0,0,0,6,0,0,0,0, +10,0,12,7,0,0,0,0,0,4,0,0,0,0,0,5,0,0,8,7,0,0,0,0,0,0,0,0,9,5,0,0,0,0,0,0,0,0,0, +0,0,0,0,6,11,0,0,0,0,0,0,0,0,0,8,7,0,0,10,0,0,0,0,0,0,0,0,6,10,0,17,0,8,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,8,6,9,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +7,0,0,11,4,0,5,0,0,0,0,0,0,0,0,0,0,10,5,0,6,8,5,0,0,0,0,0,0,0,0,0,0,11,5,0,0,0, +0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,9,0,0,0,0,5,0,0,0,0,0,0,0,0,0,6,0,0,8,7,0,0,0,0,0, +0,0,0,0,0,0,5,0,0,0,6,0,0,10,0,0,0,20,0,0,0,0,0,0,0,0,6,9,5,0,0,0,0,10,4,8,0,0, +4,13,0,0,0,0,0,0,0,9,0,9,0,0,0,0,0,0,0,0,0,0,0,0,4,8,6,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,12,0,0,4,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,12,5,0,0,10,4,10,7,13, +0,0,0,0,0,0,0,0,6,0,6,0,6,0,0,0,0,0,0,19,0,0,4,12,6,9,0,0,0,0,4,0,4,11,0,0,0,0, +0,0,0,12,0,0,0,8,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,4,0,0,0,0,0,0,0,0,0,6,0,0,0,0, +0,5,0,0,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,8,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,9,6,0,0,0,0,0,4,0,4,0,0,0,0,0,0,0,0,0,4,0,0,0, +6,0,0,0,0,0,0,0,0,0,0,13,6,0,0,0,0,0,0,0,0,0,0,0,6,8,0,0,0,0,0,0,0,0,0,0,6,0,0, +0,0,0,5,0,0,0,0,14,4,0,0,0,4,12,5,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,8,6,0, +0,0,0,0,0,12,0,9,6,0,0,0,0,13,0,0,5,0,0,0,0,0,4,0,6,0,7,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,13,0,9,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,5,0,0,0,6,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,6,0,6,0,0,0,0,0,0,0,0,8,7,8,4,0,0,0,0,0,0,0,0,0,0,0,7,0,7,0,0,0,4,0, +0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,8,6,8,4,0,0,0,0,0,6,0,7,0, +0,0,0,0,0,0,0,0,0,10,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,7,0,0,0,0,0,0,9,5,0,0, +0,0,0,7,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,9,4,0,0,0,0,0,0,0,4, +12,5,11,0,0,0,0,0,0,0,0,0,8,7,0,5,0,0,8,7,0,5,0,0,0,0,8,0,0,0,0,7,0,4,10,0,0,0, +0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +13,5,0,0,0,4,0,0,0,0,0,6,0,0,0,0,0,0,14,5,0,0,0,7,0,0,10,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,6,0,4,0,5,0,0,0,0,8,5,0,0,0,0,0,0,9,5,9,0,0,0,0,0,0,0,0,6,9,0, +0,4,0,0,0,7,0,0,0,6,0,0,10,4,0,0,0,0,0,6,0,0,10,0,0,0,8,5,0,0,0,0,0,0,0,0,10,0, +0,0,0,0,18,4,12,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,6,0,0,0,0,8,7,0,0,0, +0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,8,4,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, +0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,8,0,0,0,0,0,0,6,0,0,0,4,10,5,0,0,0,0,0,0,0,0,0,0, +0,4,8,7,0,0,8,6,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,6,0, +0,0,0,8,6,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,6,0,7,0,0,0,0,0,0, +0,0,0,0,0,6,0,0,0,7,0,0,0,0,0,0,8,7,0,0,0,0,8,0,12,6,0,6,0,0,0,0,9,7,11,7,0,0,0, +0,0,0,0,0,0,0,0,0,11,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,8,7,0,0,10,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,6,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0, +0,0,0,6,0,0,0,7,0,4,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,14,0,0,0,0,0,8,4,0,4,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,20,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,12,5,0,7,0,5,0,0,10,0,0,7,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,6,0,4,9,7,0,0,0, +0,0,7,0,0,0,0,0,0,10,0,9,0,9,0,0,0,0,0,0,0,0,4,9,0,0,0,0,6,0,0,0,0,0,0,0,0,11,4, +0,6,0,0,0,0,0,0,8,0,8,0,0,0,0,0,0,0,0,0,0,4,0,0,0,5,0,0,0,0,0,0,0,0,13,6,0,0,11, +0,0,0,0,0,0,0,9,7,0,0,0,0,0,0,0,0,0,0,0,6,18,0,0,4,0,0,0,0,0,0,0,6,0,0,0,0,0,0, +0,5,0,0,0,0,0,0,0,0,9,7,0,0,0,0,0,0,0,6,0,0,0,0,9,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,11,7,0,0,0,0,0,6,0,0,0,7,0,0,0,0,0,0,0,0,11, +4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,4,0,0,0,0,8, +6,0,0,0,0,0,0,9,6,0,0,0,0,0,4,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,0,0,0, +0,6,0,6,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,6,0,6,0,0,10,6,0,0,0,7,0,0,8,0,8,7,0, +0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,6,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,9,0,0,0,0,6,0,0,0,0,0,0,0,5,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,9,6,0, +0,0,0,8,7,0,0,0,0,0,0,0,0,12,0,12,0,0,0,11,6,0,5,0,0,12,0,12,5,0,7,11,6,0,0,11, +0,0,0,12,0,0,4,12,7,8,6,0,0,0,0,8,5,0,0,0,0,0,0,0,4,11,0,0,6,0,7,0,0,0,0,0,0,0, +5,0,6,0,0,0,0,8,0,10,0,0,0,0,0,0,0,0,0,0,0,9,7,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0, +0,0,0,0,0,0,0,0,0,11,7,0,0,0,0,0,0,10,0,0,5,0,0,12,6,0,0,0,0,0,0,10,6,0,0,0,0,8, +6,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,5,0,0,0,0,11,0,10,6,0,0,8,6,0,0,0,6,0,7,10,6,0, +0,0,7,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,10,7,0,0,0,0, +10,6,0,0,0,0,0,0,8,5,11,0,8,4,0,0,0,4,0,0,0,0,9,4,8,0,0,0,0,0,0,0,11,6,0,0,0,0, +10,7,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0,7,0,0,0,0,9,6,0,5,0,7,0,0,0,0,0,7,0,0,11,0,0, +0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6, +0,0,0,0,13,0,8,6,13,0,0,0,11,7,0,7,0,6,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,9,6,0,0,0,0,0,0,0,0,0,6,0,0,9,6,0,6,0,0,0,0,0,5,0,0,0,0,0,0,0,0, +0,0,0,0,0,5,9,0,0,0,0,0,0,0,0,0,0,4,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,9,7,0,7,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0, +5,11,5,0,0,0,0,0,0,0,0,0,4,0,7,0,6,0,0,0,6,20,0,0,0,10,7,0,5,14,4,0,0,0,0,0,0,0, +0,0,6,0,0,0,0,8,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0, +0,0,6,0,4,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,9,7,0,0,11,6,15,0,0,0,0,0, +10,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,7,0,0,0,0,0,0,0,0,9,7,13,0,0,0,0,0, +0,7,0,0,8,6,0,0,0,0,0,0,0,0,9,4,0,0,0,0,8,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,5,0,0,0,0,0,0,0,0,0,0,0,0,8,5,0,4,0,0,0,0,0,0,0,0,0,0,12,6,8,0,12,0,0,7,0,0,0, +0,0,5,10,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7, +14,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,8,7,10,7,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,6,18,6, +14,7,0,0,0,0,0,0,0,0,11,6,0,0,0,0,8,7,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,6,0,0,0,0,0,0,0,6,0,0,11,7,0,0,10,7,0,0,0,6,8,6,0,0,0,0,0,0,0,6,0,0, +19,0,0,0,9,5,0,0,0,0,0,0,11,7,0,0,0,7,0,6,0,0,11,0,0,0,0,4,8,0,0,0,0,0,0,0,0,6, +0,0,0,0,0,6,0,0,8,4,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,7, +0,7,0,0,0,7,15,0,0,5,0,0,0,0,10,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,7,0,0, +0,0,0,0,0,0,9,6,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +11,7,0,0,0,0,0,0,0,6,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0, +0,0,5,0,4,0,0,0,4,0,4,0,0,0,0,0,0,0,0,0,6,0,0,0,0,11,6,0,0,8,5,14,0,0,4,0,0,0,7, +17,0,0,0,0,0,0,0,13,5,0,0,0,0,0,5,0,0,0,5,0,0,0,0,16,6,0,4,0,0,0,0,0,0,12,0,0,0, +0,0,0,6,0,0,0,0,0,0,0,0,0,0,12,5,0,5,0,6,10,0,12,0,0,0,0,0,0,0,0,7,0,0,0,0,8,4, +0,0,0,0,0,0,0,0,0,0,8,7,0,0,8,0,0,0,8,0,0,6,0,7,0,0,0,5,0,6,0,4,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,6,0,0,22,0,0,0,0,0,0,0,0,7,0,0,0,0,0,6,0,0,0, +0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,18,0,0,0,9,4,0,0,8,0,9,7,0,0,0,0,0,0,8,6,0,0,0,0, +0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,9,7,0,0,0,6,0,0,14,0,0,0,0, +0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,7,10,4, +0,6,0,0,0,0,0,0,8,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,9,6,0,0,0,0,0,0, +0,0,11,6,12,7,0,0,0,0,0,0,0,6,0,5,0,0,0,0,0,0,9,6,11,6,0,0,0,0,9,5,0,0,0,0,0,0, +0,6,8,5,0,0,0,0,8,0,10,0,0,0,0,0,9,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9, +5,10,7,0,0,0,5,8,7,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,6,0,0,0,0,0,4,8,7,0,0,0,6,0,0, +0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,7,0,6,0,0,0,0,0,0,0,0,0,0,0,0,22, +0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,5,0,0,0,0,0,0,0, +0,0,0,0,0,17,0,0,6,0,6,12,4,19,6,0,0,0,0,16,0,0,0,0,7,15,7,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,4,10,4,0,0,8,7,0,7,0,0,9, +4,0,6,0,0,0,4,0,5,0,0,0,7,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,7,10,0,0,0,0,0,11,7,0,0, +0,0,12,6,0,0,0,0,0,0,0,6,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8, +0,0,0,0,0,0,0,0,0,10,4,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,8,7,0,0, +0,0,0,0,0,6,0,0,0,4,0,0,11,4,0,0,12,7,0,0,0,0,9,0,0,6,0,0,0,0,0,0,0,0,0,5,0,0,0, +4,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,6,0,0,0,0,0,0,9,4,0,6,0,0,0,0,0,4, +0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,6,0,0,0,5,0,0,0,0,0,0,0,0,0,7,9,6,0,7,0, +0,0,0,0,0,0,6,0,0,0,0,8,6,0,0,0,0,10,6,11,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,5, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,5,0,4,8,0,0,0,0,0,9,7,0,0,0,0,0,0, +13,5,0,0,0,0,8,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,8,5,0,0,11,7,0,0,0,0,0,0,8,6,0, +0,0,0,0,7,0,4,0,0,0,0,0,0,0,5,0,6,0,5,0,0,0,0,0,0,0,0,0,0,0,0,10,4,9,0,0,0,0,0, +0,4,0,0,0,0,10,5,10,7,0,0,0,0,0,0,0,0,16,7,0,0,0,0,0,7,0,0,0,0,11,0,0,0,0,0,0,0, +0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,5,0,4,0,0,0,7,0,0,0,0,0,0,13,0,0, +0,0,0,0,0,0,0,0,7,0,4,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,13,7,0,7,0,4,16,0,0,0,0,6,8,7,9,7,0,0,0,0,8,6,0,0,0,0,0,0,0,0,0,0,0,0, +0,6,0,0,8,5,0,4,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,5,11,7,0,0,11, +0,0,0,0,0,9,5,0,4,0,0,0,0,9,7,8,6,0,0,0,0,0,0,10,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0, +0,7,0,0,0,0,0,0,0,0,0,0,0,4,10,6,0,7,0,0,0,0,0,0,0,5,0,0,0,0,0,0,10,7,10,0,0,0, +0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,7,0,6,8,7,12,4,0,0,0,0,0,0,0,5,14, +0,0,0,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0, +6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,4,0,0,20,4,0,0,0,7,0,6,0,0,0,0,0,0,0,0,8,0, +0,6,15,0,0,6,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,12,0,0,0,9,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,5,0,0,0,0,0,0,8,6,0,0,18,0,0,0,10,0,0,0,0,0,0,0,0,6,0,0,0,6,0,0,9,6,0, +6,0,0,0,0,0,0,0,0,9,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,7,0,0,0,0,9,0,9,0,0,4, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,9,5,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,10,0,0,0,0,7,0,0,0,0,0,0,0,0,0,7,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,8,0,8,0,0,0,16,0,0,0,0,0,0,0, +0,0,0,6,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,8,0,0,0,11,0,0,0,0,0,0,0,0,0,0, +6,0,0,0,0,11,0,0,0,9,7,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,7,0,7,0,6, +0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,6, +0,0,0,0,0,0,0,6,0,0,18,0,8,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,7,0,4,0,0,0, +0,0,0,0,0,0,0,8,0,0,0,0,0,16,0,0,0,0,0,16,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,18,0,0,0,0,0,0,0,0,0,9,7,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,6,0,4,0, +0,0,0,0,0,0,0,9,4,0,0,0,0,12,5,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,12,5,0,0,0,0,0,0,0,5,0,0,10,6,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,9,0,0,0,11,0,0,6,0,6,0,0, +0,7,0,0,0,0,0,0,8,0,0,0,0,6,0,0,0,0,0,0,19,0,0,0,12,0,9,0,0,0,0,0,10,7,0,0,0,0, +0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,16,7,12, +0,0,6,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,12,6,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,10,5,0,0,0,0,0,0,0,4,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,7,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,4,0,0,0,0,0,0,0,4,0,0,9,0,0,0,8,0,12,4,0,0,0,0, +0,4,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,8,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,12,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,5,0, +0,0,0,0,0,13,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,8,6,0,6,0,0,0,0,0,0, +0,4,0,0,0,0,0,6,0,0,9,0,0,0,0,0,0,6,0,0,0,0,0,0,11,0,0,0,0,0,0,0,10,6,0,0,0,0,8, +6,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,7,0,0,0,0,0,7,0,6, +10,7,0,0,10,5,11,6,0,0,0,0,0,7,16,0,0,0,0,6,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,5,0,0,0,7,9,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,6,0,0,0, +0,0,0,0,0,8,7,0,0,0,0,11,6,0,0,0,0,0,0,0,0,0,6,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +8,7,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,12,7,0,7,0,0,0, +0,0,0,0,6,0,0,0,0,9,0,0,0,23,0,0,0,0,0,10,5,0,0,0,0,0,0,0,0,0,4,0,0,11,7,10,0,0, +0,0,0,0,0,0,0,0,0,0,6,0,0,8,7,0,7,0,0,8,7,8,0,0,0,0,0,0,0,0,0,0,0,14,5,0,0,0,0, +0,0,0,0,18,6,8,7,0,0,0,0,0,0,0,4,0,0,0,0,0,0,11,0,0,0,9,7,12,6,0,0,0,0,0,0,0,0, +0,0,12,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,6,0,0,0,7,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,6,8,7,0,0,0,6,10,0,0,0,9,0,0,0,0,0,0,0,0,0,8,6,0,0,0,0,0,6, +10,7,0,0,0,7,0,0,8,4,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,19,0,0,0,0,0,0, +0,0,0,8,7,8,6,0,0,11,7,10,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,4,8,7,0,0,0,0,0,0,0,0, +0,5,0,0,13,0,0,0,0,5,0,0,9,7,0,0,0,0,0,0,0,4,0,0,11,0,0,7,0,0,0,0,0,0,0,0,0,6,0, +0,0,0,0,0,12,7,19,0,8,6,0,0,0,0,0,6,0,0,0,0,0,0,0,0,10,6,8,0,0,0,0,0,0,0,0,0,0, +6,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,7,0,0,12,0,0,0,0,6,9,6, +14,0,0,0,0,0,0,6,0,5,0,0,8,7,0,0,0,6,0,4,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,4,0,6,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,5,0, +7,0,0,10,0,9,7,0,6,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,12,6,0,0,0,0,0,5,0,6,0,0,0,0, +0,0,0,0,0,0,0,6,0,0,0,0,9,7,0,0,0,0,0,0,11,6,0,0,0,0,0,0,0,0,0,0,11,7,0,0,13,7, +0,0,0,0,0,0,0,0,12,0,0,4,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,6,11,5,0,5,13,0,8,0, +0,0,0,6,0,0,0,0,0,0,11,0,0,0,0,0,8,7,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,11,5, +9,6,0,0,0,4,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,6,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,10,0,0,0,8,5,0,0,9,0,0,0,8,7,9,0,0,0,0,0,0,0,0,7,0,6,0,0,0,0,0,0,0,0,0, +0,11,0,13,6,0,0,9,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0, +0,0,0,0,0,5,21,6,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,5,0,0,0,0,0,0,0,0,10,0,8,0, +0,6,0,0,0,4,0,0,9,0,0,0,0,0,0,0,0,0,0,4,0,0,8,6,0,6,0,7,10,0,8,4,0,4,0,0,0,0,0, +5,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,6,12,0,0,7,0,0,0,5,0,0, +0,0,0,0,0,0,0,6,0,0,8,6,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +15,7,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,6,0,0,24,7,0,0,0,0,0,0,0,0,0, +7,0,0,0,0,0,0,0,0,0,0,9,6,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,6,0, +0,0,0,0,0,0,0,0,0,0,0,0,6,0,6,0,4,12,0,0,7,0,0,0,0,0,5,0,0,0,0,0,0,0,0,15,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,7,0,0,0,0,0,0,0,0,0,0,8,0,0,0, +0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,6,0,0,0,0,0,0,9,0,9,6, +0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,8,6,0,0,0,0,0,0,0,0,0,0,8,4,0,7,0,0,0,0,0,0,0,0, +22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,4,0,7,0,0,21,7,0,7,9,6,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,8,0,0,6, +0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,8,7,0,0,0,0,23,0,0,0,0,7,0,0,0, +4,0,0,0,0,0,0,0,0,9,4,11,7,0,5,0,0,0,0,11,0,0,4,20,0,0,0,0,0,0,0,0,0,0,0,11,5,0, +7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +21,0,0,0,0,0,0,7,0,0,0,0,0,0,0,5,0,0,0,0,0,6,0,0,0,0,11,6,0,0,0,0,0,0,0,0,9,6,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,5,0,4,9,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0, +0,0,0,10,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,8,7,0,0,11,7,0,0,0,0,0,0,0,4, +0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,6,0,0,0,5,0,0,0,0,0,0,0,0,0,0,8,7,0, +0,0,0,0,0,0,0,0,6,0,0,21,6,0,0,0,0,0,6,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,14,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,9,6,0,0,8,0,0,7,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0, +0,0,0,8,7,0,0,11,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,5,0,0,0,7,13,7,10,4,0, +0,0,6,0,0,0,0,0,0,0,0,0,5,10,0,0,0,0,0,0,5,0,0,0,7,0,0,0,0,0,0,8,4,0,0,0,0,0,6, +0,0,0,0,0,0,0,0,0,0,12,7,0,6,0,0,10,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,6,0, +0,0,0,0,7,0,0,8,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,10,5,0,6,0,0,0,0,0,4,0,0,0,0, +0,0,0,0,0,4,0,0,0,0,9,0,11,4,0,0,0,6,0,0,0,5,12,7,0,5,0,0,0,0,0,4,0,0,0,7,0,0,0, +0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,4,13,6,10,0,0,0,17,0,0,4,0,0,0,0,0,6,0,4,0,5,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,11,7,0,0,0,7,0,0,0,6,0,0,0,0,0,0, +0,6,0,4,0,0,0,0,8,0,0,0,0,5,0,0,0,0,0,4,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,9,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,5,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,12,0,0, +0,0,7,0,0,0,0,0,0,0,0,0,0,0,7,0,0,16,4,0,0,11,0,8,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +8,7,0,4,0,0,0,0,0,0,0,4,0,0,0,0,0,0,8,6,0,0,8,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10, +7,0,0,0,0,0,0,9,0,0,0,0,0,0,0,12,5,10,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,5,0, +5,18,7,0,0,14,0,0,0,0,0,0,0,9,4,0,7,0,0,0,0,0,0,0,5,0,0,0,6,0,0,0,6,0,0,0,0,0,0, +8,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,5,0,0,0,7,0,0,0,0,0,0,11,0,0,0, +10,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,14,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +11,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,14,6,0,0,0,0,11,4,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,10,7,0,6,0,0,9,0,9,5,0,0,0,0,0, +0,0,0,10,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,6,0,0,8,5,0,0,0,0,0,0,0,0,0,0,11,4,0,6, +0,6,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,12,4,0,6,8,6,0,0,0,0,0,0,0,0,0,0,8,0,0,5,0,0,0,0,0,0,0,7,0,0,13,0,0,0,0,0,0,0, +0,0,0,0,0,0,9,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,12,7,0,6,0,0,0, +0,0,0,0,0,0,0,0,0,13,4,0,7,0,0,0,7,0,7,0,0,0,0,0,0,0,0,10,4,0,0,0,0,0,0,0,0,0,0, +9,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,10,6,21,5,0,0,0,0,8,0,0,0,0,4,0, +7,0,0,0,0,0,0,11,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,4,0,0,0,0,0,0, +0,7,9,6,11,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,7,10,0,0,0,0,0,0,6,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,19,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,7,0,0,0,0,0,0,9,4,10,4,0,7,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,9,7,9,7,10,4,0,7,0,0,0,0,0,0,0,6,12,0, +0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0, +0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,8,0, +0,0,0,0,0,5,0,0,8,7,0,0,0,7,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0, +0,0,0,0,4,0,0,8,0,0,6,0,0,0,7,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,6,0,0,0,6,0,6,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,7,9,7,0,0,0,4,8,0,0,0,0,6,11,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,10,0,0,0,0,0,0,0,13,4,0,0, +12,6,0,6,0,0,0,0,8,7,0,7,0,0,0,0,0,6,0,0,0,0,0,0,12,6,0,4,0,0,0,0,0,0,0,0,0,0,9, +7,22,0,0,0,0,4,0,0,0,0,0,6,0,0,0,4,0,0,9,0,0,6,0,0,24,7,0,7,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,10,6,0,5,0,0,0,0,0,0,0,7,0,0,8,0,0,0,0,0,0,0,10,5,0,0,0,0,0,0,0,0,0,7,0, +7,0,0,0,0,0,0,13,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0, +0,0,0,0,0,7,12,0,9,4,0,0,0,0,0,0,0,0,0,4,0,0,0,0,8,0,0,0,0,0,0,0,0,4,0,0,0,7,0, +0,0,0,8,7,0,0,0,0,0,0,0,0,0,4,18,0,0,0,0,0,10,0,0,5,0,0,11,0,0,0,0,0,0,5,0,6,0, +0,0,6,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,8,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,6,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0, +4,0,0,0,0,0,0,10,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0, +0,0,0,5,8,0,0,0,0,0,0,0,8,6,0,0,0,0,0,0,0,0,20,7,0,0,0,0,0,0,0,0,0,0,0,4,9,0,12, +6,8,0,14,7,0,5,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,10,0,0, +0,0,0,0,0,0,0,0,0,0,6,0,6,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,9,6,0,7,12,0,0,0,0,4, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,7, +0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,4,0,0,9,0, +12,6,0,5,0,0,0,6,0,4,0,6,0,0,0,0,0,0,0,0,10,7,0,0,0,0,0,0,8,0,0,0,0,4,0,0,0,0, +10,0,0,0,0,0,0,0,8,6,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0, +6,0,0,12,6,20,5,0,0,0,0,0,0,0,0,0,0,0,0,9,5,0,5,0,0,0,6,13,7,0,0,0,0,15,6,0,0,0, +6,0,0,13,7,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,5,0,7,0,0,0,0,0,4,0,0,0,0,0,0,0,0, +10,6,0,0,0,0,0,6,0,0,0,0,9,0,0,0,0,0,19,6,0,0,0,0,0,0,0,0,0,0,13,0,11,0,0,0,0,0, +0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,10,6,0,0,0,0,0,0,0,0,10,0,0,6,0,0,0,0,8,0,0, +0,9,0,15,4,0,6,0,0,0,0,0,6,12,0,0,0,0,0,0,0,14,7,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, +0,0,0,0,0,8,7,0,0,0,0,0,6,10,0,0,0,0,0,0,0,0,7,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,7,10,5,0,0,0,0,8,0,0,0,0,4,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,6,12,0,0,0,10,7,0,5,0,6,0,0,0,0,8,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,6,0,4,0,0,0,0,0,7,0,0,0,0,0,0,0,4,9,6,0,0,0,7,0,0,0,0,0,0,0,0,8,6,0,0, +0,0,0,0,0,4,12,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,7,0, +0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,12,6,0,6,9,4,0,0,8,4,0,6, +0,0,0,0,0,4,0,0,0,0,0,0,0,6,0,0,9,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,8,0,0,6,13,4,0,5,8,0,0,0,0,0,0,0,8,0,0,0,10,5,0,0,9,0,0,0,0,0,0,6,0,0, +24,0,0,0,0,0,0,0,8,0,0,7,0,0,12,0,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,7,0, +6,8,0,10,0,9,7,0,0,0,5,0,0,0,0,0,0,0,4,8,5,0,0,0,0,8,7,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,0,0,4,0,0,0,0,0,6,0,0,0,0,0,5,0,0,0,0,8,0,0, +0,0,0,8,6,0,0,0,0,0,0,0,0,0,0,8,6,0,0,0,0,10,4,0,0,0,0,0,0,0,6,0,0,0,4,20,0,0,7, +10,6,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,7,0,0,0,0,9,6,0,0,0,0,0,0,0,4, +12,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,9,4,0,5,0,0, +0,0,0,0,0,6,0,6,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,6,9,0,0,0,0,7,0,0,0,0,0,6,0,5,0,0,0,0,0,0,0,0,9,0,0,0, +0,6,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,17,7,0,0,13,6,14,6,0,0,0,0, +8,0,0,0,0,0,0,7,12,7,8,7,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,4,0,0,0,0,0,4,0, +0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,12,4,0,0,10,7,0,0,0, +0,0,0,10,0,0,6,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,12,0,0,6, +0,0,0,0,0,0,0,0,8,7,12,0,0,0,0,0,0,6,0,6,0,4,0,0,18,6,0,0,0,6,0,0,0,0,0,6,10,6, +0,0,0,0,0,0,8,7,14,0,0,0,0,0,0,6,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19, +0,0,0,8,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,8,7,0,0,10,5,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0, +0,0,9,4,8,0,0,0,0,0,0,4,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,4,0,0,0,0, +0,6,0,0,9,7,0,0,0,0,0,5,0,0,0,0,8,7,0,0,14,0,0,0,0,6,0,0,0,0,0,0,9,6,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,5,0,7,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0, +0,0,0,6,0,0,0,6,0,4,0,0,0,0,0,4,0,0,0,0,12,0,0,7,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0, +0,12,0,16,6,0,0,0,0,0,0,11,7,0,4,8,7,0,0,0,0,0,6,0,0,0,0,16,0,0,0,0,6,0,0,0,0,0, +0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,4,10,7,0,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0, +0,0,10,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,13,4,0,0,10,0,0,0,0,0,0,0,0,0,19,0,0,0, +0,0,0,0,0,0,0,0,0,0,8,6,22,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0, +5,0,0,0,0,0,5,0,0,0,0,0,5,0,0,0,6,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +4,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,7,0,0,18,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,14,7,0,0,11,5,0,0,0,5,0,0,0,0,12,5,0,0,0,0,0,0,0,0,0,0,24,6,0,0, +0,7,0,4,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,7,0,4,0,0,0,0,8,7,0,0, +9,6,0,0,14,5,0,0,0,6,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,12,6,0,0,0,0,0,0,0,6,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,7,0,0,0,5,0,0, +0,0,12,7,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,6,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,6,0,0,13,7,0,0,0,0,0,0,14,0,11,4,0, +0,0,4,0,0,0,0,14,5,0,0,0,0,0,5,11,5,0,0,0,0,22,5,0,0,0,0,0,7,0,0,0,0,0,4,0,0,0, +4,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,6,0,0,17,0,10,0,0,0,8,0,0,0,19, +5,18,7,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,10,6,0,6,0,0,0,0,10,4,0,4,0, +0,0,0,0,0,14,7,0,5,0,0,0,0,0,6,0,0,0,0,0,0,0,0,8,0,9,6,12,0,0,6,0,0,0,0,0,0,0,0, +12,0,10,6,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,4,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,5,13,0,9,7,0,0,0,0,0,0,0,0,0,0,0,7,9,7,0,0,8,0,0,0,0,0, +22,0,0,0,0,0,0,0,23,6,14,0,0,0,0,0,0,7,0,0,0,0,11,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0, +0,0,10,0,0,6,0,0,0,0,0,0,0,0,0,6,0,0,8,5,0,0,0,0,0,0,0,0,0,7,11,6,21,0,0,0,0,0, +0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0, +0,0,0,0,0,0,0,4,9,7,0,0,0,0,0,0,12,0,0,0,0,7,0,0,0,0,0,0,0,0,10,4,0,0,0,0,0,0,9, +0,0,0,20,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,11,7,0,0,0,0,0,0,0,6,15,0,0, +0,0,0,0,0,0,0,0,0,0,0,12,4,0,5,0,0,0,0,0,0,11,7,17,6,0,0,0,0,0,0,15,6,0,7,0,0,0, +0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,6,0,5, +0,0,11,0,11,7,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0, +17,0,0,0,0,6,0,0,0,5,0,0,0,0,0,0,8,7,9,6,0,0,14,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0, +8,7,0,4,0,0,0,0,0,0,0,6,0,5,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0, +0,0,0,5,0,4,0,0,8,7,0,6,12,5,0,7,18,7,0,0,8,5,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0, +10,0,11,0,0,0,0,0,0,0,0,0,0,0,9,0,0,4,0,6,0,7,0,0,0,0,0,6,0,0,0,6,0,0,0,0,0,0,0, +7,0,0,0,0,8,0,0,0,15,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,6,0,0,0,0,0,0,0,0,0, +0,0,6,0,0,0,0,23,0,0,0,10,7,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,5,0,0,0,0,0,0,8,6,0,0, +0,0,0,0,12,7,9,7,0,0,10,6,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,9,0,8,7,0,0,0, +6,0,6,0,4,0,5,0,0,0,0,0,5,8,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,7,10,5,0,0,11,6,0,0,0,0,0,0,0,6,0,6,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,4,9,7,0, +0,0,0,11,7,0,0,0,0,0,5,0,0,0,7,0,0,0,0,23,6,11,4,0,0,0,0,0,0,9,0,0,0,10,6,0,0,0, +0,9,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,6,0,0,10,6,0,0,0,7,0,0, +0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13, +6,11,7,0,0,0,0,0,0,0,0,0,0,0,0,10,5,0,0,0,6,0,0,0,5,0,6,0,6,0,0,0,0,0,0,0,0,0,0, +0,6,0,0,0,0,8,7,0,5,0,0,0,0,0,6,0,0,0,0,0,0,0,4,10,0,8,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,10,6,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,6,0,0, +0,0,0,0,0,0,10,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,11,6,0,4,0,0,14,5,0,7,0,0,0,0,0,6,16,0,0,0,0,0,0,0,10,0,0,7,15,0,0,0,11,7,0,0, +0,0,0,0,0,0,0,0,8,7,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,5,0,0,0, +0,8,0,0,6,0,0,0,0,0,0,9,5,0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,6,0, +0,0,0,0,0,0,7,0,0,0,0,15,7,0,0,0,0,8,0,0,0,14,0,0,0,0,0,0,0,16,7,0,0,0,0,0,7,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,12,6,11,7, +9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13, +7,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,12,0,10,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,8,0,0,5,8,7,10,6,0,0,0,7,0,0,0,0,12,6, +0,0,9,0,0,0,12,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,4,10,0,0,0,10,5,0,0,0,0,0,0,9,6, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,6,0,0,9,5,0,4,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,9,0,0,5,0,0,8,7,8, +6,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,6,10,0,9,4,0,0,0,0,0,0,0,6, +11,0,0,0,0,0,0,0,0,0,0,0,8,0,0,6,0,6,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,8,7,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0, +0,0,0,10,0,0,0,8,7,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0, +0,0,8,4,0,5,0,0,0,0,0,0,0,7,0,0,0,6,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,8,7,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,8,5,0,0,0, +0,0,0,0,7,0,0,0,6,0,0,0,6,0,6,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,5,0,6,0,7,0,0,0,0, +20,0,0,0,0,0,0,0,0,0,0,7,9,0,0,0,0,0,0,6,0,6,0,7,0,0,0,7,0,0,0,0,0,0,0,4,0,0,0, +0,0,0,14,7,0,0,0,5,0,0,22,4,10,0,0,0,0,0,0,4,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,11,5,13,0,0,0,0,0,0,0,0,0,8,0,0,7,0,0,0,0,0,4,0,0,0,4,0,0,0,0,0,0,10,7,0, +0,0,0,0,0,0,6,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,7,0,7,14,6,0,0,0,0,9,5, +0,0,0,0,0,6,0,0,0,5,10,0,8,6,0,0,0,0,0,0,0,0,9,7,0,0,0,0,0,0,0,6,0,0,8,4,0,6,0, +0,0,5,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,7, +14,0,0,5,0,0,18,0,8,4,0,6,0,0,20,0,13,0,0,0,0,7,0,4,0,0,0,0,0,4,8,4,0,0,0,0,0,6, +0,0,0,0,0,4,0,0,0,4,0,0,0,0,0,4,0,0,0,0,0,0,0,0,14,0,0,0,0,0,9,7,0,0,9,0,0,0,0, +0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,20,0,14,0,0,4,0,6,8,5,0,0,0,0,0,7,0,0,0,0,0,0, +0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,10,4,12,7,0,6,0,0,9,7,10,5, +0,0,8,6,0,4,0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,18,0,0,0,14,7,0,0,0,0,0,4, +0,0,0,0,0,0,17,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,4,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0, +0,0,0,0,0,8,6,0,0,0,0,0,0,0,0,8,5,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,5,0,7,0,0,0,0,0, +7,0,0,0,0,0,0,0,0,0,7,0,6,0,0,0,0,0,0,0,0,8,5,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,5,0, +0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,23,0,0,7,0,0,0,0,0,0, +0,0,0,0,0,0,0,4,0,0,0,0,0,0,12,7,8,4,0,0,0,0,0,0,0,0,0,6,0,0,9,5,0,0,0,7,0,0,0, +0,0,0,0,0,0,4,10,0,0,7,0,0,0,5,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,5,0,0,18,7, +0,0,8,0,0,5,0,0,10,0,0,0,0,0,0,6,0,0,0,0,0,5,0,7,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0, +6,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,6,0,0,10,0,0,5,10,4,0,0,12,0,0,0,0, +6,22,4,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,5,0,0,0,0,0,7,0,5,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,6,0,7,0,0,0,6,0,6,8,5,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,8,5,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,5,0,0,0,7,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0, +0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,16,6,0,0,0,6,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,12,7,0,0,0,0,9,0,0,0,0,6,0,0,11,0,0,0,0,0,13,0,9,6,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,4,0,0,10,7,0,0,0,7,0,6,0, +0,0,0,0,0,0,0,0,0,8,7,0,0,0,0,11,0,15,0,22,7,0,4,0,6,0,0,0,0,0,7,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,4,0,7,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0, +18,0,0,0,0,0,0,0,0,0,14,0,0,4,0,0,0,0,8,7,9,0,0,0,0,0,9,0,0,0,14,0,0,0,0,0,0,0, +0,0,11,7,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,7,0,0,0,6,0,6,0,0,0,0,8,0,0,0,0, +0,11,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,9,4,0,0,0,0,0,4,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,8,7,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0, +0,0,0,0,0,0,8,6,0,0,9,5,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,6,0,0,0,0,0,0,0,6,0,5,0, +0,10,6,9,0,0,0,0,6,0,0,0,0,0,6,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0, +11,7,12,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,4,0,5,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0, +0,0,0,0,6,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,5,0,0,10,6, +0,0,0,4,0,7,13,0,0,4,0,0,11,4,0,6,0,0,0,0,0,6,8,7,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,5,0,0,0,0,0,0,8,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,5,0,0,0,0,12,6,0,0,0,0, +11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,11,5,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8, +7,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,4,0,0,0,6,17,0,9,0,10,6,0,6,12,0,0,4,0,0,0, +0,0,0,0,0,0,0,8,5,12,7,0,4,0,0,0,0,0,0,0,0,0,0,11,0,9,0,10,6,11,5,0,7,0,0,8,0,0, +7,0,4,0,0,0,7,0,0,0,0,0,0,8,6,0,0,0,6,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,6,0, +0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,11,0,0,0,0,6,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,0,8,6,0,0,0,0,0,6,12,0,0,0,0,0, +0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,6,0,0,16,0,11,5,0,0,0,0,0, +0,0,0,0,0,10,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,9,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,6,0,7,0,0,0,0,0,0,0,0,0,0,0,0,8,4,0,0,0,0,0,6,10, +7,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,6,0,0,0,0,0,0,9,5,0,0,0,0,8,0,9,0,0, +0,0,0,0,0,0,7,10,0,13,0,0,6,0,0,0,0,0,0,0,0,0,6,9,4,0,0,0,0,0,0,10,0,0,0,0,0,10, +0,0,0,0,0,0,0,10,6,11,0,0,0,0,0,9,0,0,0,0,0,0,4,0,0,0,0,0,0,10,5,0,0,0,0,0,6,0, +0,0,0,0,0,18,4,0,7,0,0,0,0,0,0,24,0,8,6,0,7,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0, +0,8,5,0,0,0,0,10,7,0,6,0,0,0,0,0,0,0,0,8,5,10,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0, +6,0,0,8,7,0,0,0,0,0,0,0,0,0,0,12,6,0,0,0,0,0,0,0,4,0,5,15,0,0,0,0,7,0,7,0,0,0,0, +0,0,0,0,0,6,10,5,0,0,0,6,0,0,8,7,0,0,0,0,0,0,0,0,0,0,0,7,0,0,12,0,0,0,0,0,0,0,0, +0,0,5,0,0,0,0,0,0,14,4,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,11,0,10,4,9,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,6,0,0,0,0,0,4,0,0,0,0,0,7,0,0,0, +0,0,0,0,0,0,0,0,7,13,7,0,0,0,0,0,0,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,7,0,0, +0,0,0,0,0,0,0,5,0,0,0,0,0,6,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,8,0,10,6,0,4,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,6,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,6,0, +0,0,0,0,0,0,0,10,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,9,7,0,0,0,0,0,6, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,10,6,0,0,0,0,0,0,0,6,0,0,0, +0,0,0,0,5,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,6,0,0,0,5,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,6,11,0,0,0,0,6,0,0,0,0,0,0,0,6, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0, +6,0,0,0,0,0,0,0,6,10,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0, +0,0,0,0,0,0,0,6,0,6,0,0,0,5,0,0,0,0,0,0,0,5,0,0,10,0,11,5,0,0,0,0,0,0,14,7,9,7, +0,6,0,0,0,0,0,4,0,0,0,0,0,0,11,7,0,6,0,0,0,0,0,0,9,7,0,4,0,0,0,7,0,0,0,0,0,5,0, +0,0,0,0,5,0,0,0,7,0,0,0,0,0,5,0,0,0,0,17,5,0,0,8,0,0,0,0,6,9,4,0,0,0,0,0,0,0,0, +8,7,11,7,9,0,0,0,0,0,0,0,0,0,8,7,0,0,0,0,0,0,0,0,0,0,0,6,9,5,0,0,8,6,0,0,0,5,0, +0,0,0,9,0,0,0,9,6,0,7,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0, +0,0,0,0,4,0,0,0,0,10,0,0,0,0,0,0,0,0,4,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,4,0,0,0,5,0,0,0,0,0,7,0,0,0,0,0,7,13,5,0,0,0,7,0,0,0,0,0,7,9,6,11,7,0,7,0,0,0, +0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,8,5,0,0,0,5,9,4,0,0,0,0,0,0,0,0,8,4,0,0,0,0, +24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0, +0,0,0,0,6,0,0,0,7,0,0,0,6,0,0,0,0,0,0,0,0,0,5,11,6,0,4,0,7,20,0,8,5,9,5,9,0,0,6, +0,0,0,0,0,0,0,0,0,0,0,7,23,5,0,0,8,4,0,0,10,0,0,6,0,5,0,0,0,0,0,0,0,0,0,0,0,7,0, +0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,9,0,0,0, +10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0, +6,0,0,0,0,14,0,18,4,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,9,6,0,4,0,0,0,0,0,0,8,4, +11,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,8,4,0,0,0,0,0,0,0,0,12,0,10,7,0,0,10,0,0,0,0, +0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,6,0,0,0,0,0,6,0,0,0,0,8, +6,10,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,4,0,6,0,4,0,0,0,0,0,5,0,0, +0,0,0,0,0,0,0,7,0,0,0,7,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,17,7,11,0,0,0,0,0,0,0,0,0,0,4,12,6,0,0,0,5,0,0,0,6,0,0,0,0,0,0,0,0,0,0, +0,5,12,7,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,6,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +7,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,6,0,6,0,0,20,0,0,0,0,0,0,0,0,0,8,7,0,0,0,0,0,4, +0,0,0,5,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,6,0,4,13,0,0,7,0,0,0,0,0,0, +0,0,0,0,0,6,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,6,0,0,12,6,0,7,0,0,0,0,10,0,23,6,0,0, +0,4,0,0,0,0,0,6,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +10,0,9,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,11,0,9,7,0,0, +0,0,0,0,0,0,0,0,9,7,0,4,0,0,0,0,8,7,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, +0,0,0,0,0,6,0,0,10,7,10,5,0,0,8,0,8,0,0,0,0,0,0,4,0,5,10,0,0,0,0,0,0,0,9,0,0,6, +0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,11,7,0,0,0,0,0,0,0,0,9,4,0,0,0,0,0,6,0,0,8, +7,0,0,0,0,0,5,0,0,0,0,0,0,0,0,10,0,0,0,0,5,0,4,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,24,7,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,6,0,0,9,0,0,0,0,0,0,7,0,6,13,0,8, +0,0,0,0,0,0,0,0,0,9,7,0,0,0,0,0,0,0,6,0,0,0,0,8,5,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0, +4,0,0,0,0,0,4,0,0,0,0,0,0,0,6,8,0,0,0,0,6,8,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,4,0,4,0,0,0,5,0,7,0,0,10,0,10,7,0,0,12,5,0,0,9,0,0,0,10,0, +0,6,0,0,0,6,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,5,0,0,0,0,0,0, +12,0,0,0,0,0,8,5,13,6,0,0,0,0,0,0,9,4,0,0,0,0,8,0,0,0,0,0,8,7,0,0,0,0,0,0,0,0,0, +0,0,6,0,0,14,0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,17,6,0,0,0,0,12,6,0,0,0,0,8,0,0,7,0, +7,0,4,9,0,0,6,0,0,0,6,0,0,0,0,0,0,8,7,0,0,0,0,0,0,11,0,0,4,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,18,7,0,4,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,6,0,0,0,0,0, +0,0,0,12,5,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,8,0,11,7,0,0,0,0,0,0,0,0,0,4,0,0,0,0, +11,0,0,0,0,0,0,0,21,0,0,6,10,0,0,0,0,0,9,0,10,0,0,0,0,0,11,0,0,0,0,6,0,0,0,0,0, +5,0,0,0,0,0,0,10,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,4,0,0,23,7,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,9,7,0,0,0,7, +0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,6,0,0, +11,6,0,0,0,0,0,0,0,6,0,0,0,0,10,7,0,0,9,4,0,0,11,0,8,5,0,0,0,7,8,5,22,0,0,0,9,6, +0,0,0,0,0,0,0,6,10,4,0,0,0,0,0,7,9,4,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,6,0,4,0, +0,0,0,11,6,0,0,0,0,0,0,0,0,0,0,0,7,0,6,0,0,0,0,0,7,0,0,0,0,0,0,0,6,0,6,0,4,0,0, +0,0,0,0,0,7,0,7,0,4,13,0,0,0,0,0,8,0,0,0,0,7,0,0,0,0,0,0,11,6,0,7,0,0,0,0,9,0,0, +0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,4,8,0,0,0,0,0,8,0,0,0,0,0,0,6,0,0,0,4,0,0,0,0,0,0,0,6,0,0,0,0,13,5,8,0,0, +0,0,0,0,0,14,0,0,6,0,0,0,0,0,0,0,0,0,7,0,0,17,6,0,0,0,0,13,4,0,0,9,6,0,0,10,5,0, +0,10,5,0,0,0,0,13,0,0,0,0,6,0,0,0,0,0,0,10,0,12,0,0,0,0,0,0,0,0,0,0,0,8,4,0,4,0, +0,0,4,0,0,0,0,0,4,0,0,12,0,0,5,9,4,0,0,0,0,0,0,0,0,0,5,8,5,0,0,0,7,0,0,0,0,8,7, +0,0,0,6,12,5,0,0,0,5,0,0,0,5,0,0,0,0,0,4,12,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,8,7,0,0,0,0,0,6,0,0,0,0,0,0,0,6,0,0,0,0,0, +0,9,6,0,0,0,0,0,0,0,0,0,4,0,0,0,6,0,0,0,4,11,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0, +0,0,0,0,12,7,0,0,0,7,10,7,0,0,11,0,0,0,0,0,0,0,0,0,11,7,0,0,0,6,0,0,11,0,0,0,0, +0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,22,0,10,7,0,0,8,5,0,0,0,0,0,5,0,0,0,0,0,0, +0,0,0,0,9,6,8,7,0,6,0,0,0,0,0,5,0,0,0,0,0,0,8,7,0,0,0,0,9,7,0,0,0,6,0,0,8,7,0,0, +0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,4,0,5,0,0,0,4,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,6,0,0,0,0,0,0,0,4,0,0,0,0,0,0,9, +6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,4,0,0,0,5,0,0,0,0,14,0,0,0, +9,0,0,0,0,0,0,0,0,0,9,7,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,12,0,0,0,0,0,12,7,0,0,0,5,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,10,7,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,8,7,0,0,0,0,0,6,0,0,0,0,0,0,9,6,0,0,0,0,0,6,0,0,0,0,0, +0,0,0,0,0,9,0,0,0,0,7,0,6,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0, +0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,6,0,7,12,6,0,0,0,0,0,5,0,0,0,0,0,0,0,0, +0,7,0,0,8,6,0,0,0,0,10,7,0,0,0,0,0,0,0,6,0,0,0,0,0,6,12,0,0,0,0,0,0,0,0,6,0,0,0, +0,0,6,0,0,0,6,0,0,0,0,0,6,16,0,0,0,0,0,0,0,0,0,9,0,17,0,14,7,8,0,0,0,0,0,0,6,0, +0,0,0,0,0,0,0,0,0,11,0,0,6,8,7,0,6,0,0,0,0,0,0,0,0,0,0,12,6,0,0,0,0,0,0,0,0,0,0, +9,0,0,0,0,7,0,0,0,0,11,5,0,4,9,6,8,0,0,0,0,0,0,0,0,0,10,0,11,7,0,0,0,0,0,0,0,0, +9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11, +0,0,0,12,0,0,0,0,0,10,5,0,4,0,0,0,0,0,7,10,6,11,6,0,0,0,0,0,0,0,0,0,0,0,0,17,0, +0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,6,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,8,0,0,4,0,0,0,6,0,0,0, +0,0,0,8,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,6,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,4,0,0,0,0,9,6,0,0,0,4,0,0,0,0,0,4,10,7,0,7,0,0,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0, +0,0,0,0,0,0,6,0,0,0,6,0,6,0,0,0,0,10,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,18,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,13,0,0,0,0,0,10,0,0,0,0,0,0,0,0,4, +0,0,0,6,0,0,0,0,0,4,8,0,0,0,11,7,0,0,0,4,0,0,0,0,0,7,0,0,8,5,0,0,16,0,0,0,13,6, +0,0,0,0,0,0,0,6,0,0,0,0,20,0,11,6,0,0,8,7,0,0,0,0,0,6,17,0,8,0,0,0,0,0,8,7,0,0, +9,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0, +0,0,4,0,7,0,0,0,0,0,0,0,6,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,8, +0,8,0,0,0,0,0,0,0,11,0,8,0,0,0,0,0,0,0,0,0,0,0,8,6,0,0,0,0,0,0,0,0,0,6,0,0,9,0, +0,0,0,0,8,0,0,0,0,0,18,0,0,0,0,0,0,4,9,0,0,0,0,0,8,5,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,9,6,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,8,7,0,0,0,0,0,0,0,0, +0,4,0,0,0,0,0,0,14,0,0,0,0,7,0,6,0,0,8,0,20,7,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,8,0,0,0,14,0,0,0,0,0,0,0,8,0,0,7,0,6,0,0,0,7,0,0,0,0,0,0,0,0, +0,0,0,4,12,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,10,6,0, +5,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0, +0,0,0,5,8,4,0,0,0,0,0,0,0,4,0,0,0,7,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,12,7,0, +0,0,0,13,6,0,0,0,7,0,0,8,0,0,0,8,0,0,0,0,0,0,0,0,0,0,5,0,0,0,7,0,0,0,0,0,0,11,5, +0,6,0,0,8,5,0,7,0,0,0,0,0,0,0,7,0,0,0,0,8,6,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,4,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +14,0,10,7,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,19,0,0,4,0,0,0,7, +0,0,11,5,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,16,0,10,5,18,0,0,7,9,6,0,5,0,0,0,0,0, +0,0,0,0,5,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,8,7,0,0,0,0,0,5,0,0,0,7,0,6,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,6,0,0,0,4,0,6,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,6,0,0,0,7,23,0,0,0,0,5,0,0,0,0,0,0,8,5,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,14,0,20,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0, +11,0,0,0,0,7,0,0,0,0,15,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,9,6,0,0,0,0,0,7,0,0,0,0, +0,4,0,0,0,0,10,0,0,0,0,0,9,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,10,0,11,6,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,5,0,0,11,0,0,0,0,7,0,0,0,0,0,0,8,7,0, +4,0,0,0,0,11,0,0,0,0,0,11,0,0,5,0,0,8,7,0,4,0,7,0,0,0,0,0,0,0,6,0,0,0,0,0,4,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,10,5,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,6,0,5,0,0,0,0,0,0,0, +0,0,4,11,5,10,7,0,7,0,0,9,6,9,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,9,4,0,4, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,8,6,0,0,0,0,11,7,0,0,0,0,0,0,0,0,0,0,11,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,8,5,0,0,8,0,9,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,6,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,4,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0, +10,7,0,0,0,6,0,0,0,0,0,0,8,0,0,6,0,0,0,6,10,0,0,0,0,0,0,0,0,0,0,0,8,5,0,0,0,6,0, +0,0,6,0,0,0,0,9,5,8,5,8,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0, +0,8,7,10,0,0,0,0,0,0,0,9,6,0,0,0,0,0,0,0,0,0,0,11,7,0,0,0,0,0,5,0,0,0,6,0,7,0,0, +10,5,0,0,0,0,8,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,6,0,0,0,0,0,0,11,0,0,0,0,0,13,4, +0,0,0,4,0,0,0,0,0,5,8,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,14,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,7,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,4,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,5,0,0,15,6,10,0,0,0,8,6,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,9,6,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,14,6,10,0,0,0,0,0,0,0,0,6,0, +0,0,0,0,0,0,0,12,6,0,0,0,0,0,0,0,0,9,7,0,0,0,0,0,6,0,5,11,4,0,6,0,0,0,7,0,0,0,0, +0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,5,0,0,8,5,0,0,0,0,0,0,0,0,0,0, +0,0,10,0,0,0,0,0,9,6,9,4,0,0,0,4,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,8,5,0, +0,0,0,0,0,0,0,0,0,0,4,0,0,11,5,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,5,0,0,0,0,0,0, +0,0,0,7,12,0,0,0,0,6,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,6,0, +4,9,6,0,4,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,6,0, +7,8,6,0,0,0,0,0,0,0,4,0,0,9,6,0,0,0,0,0,0,0,0,0,6,0,5,0,4,0,0,0,0,0,0,0,5,0,0,0, +0,0,5,0,0,0,7,12,7,0,0,0,0,0,0,18,4,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,6,0,0,0, +0,12,0,0,7,0,0,0,0,0,7,0,0,13,0,0,6,0,0,0,0,8,7,9,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,7,10,5,0,0,8,0,0,0,0,0,0,0,8,6,0,7,0,0,8,4,0,4,0,0,0,0,10,4,0,0,14,0, +0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,17,0,0,0,0,0,0,6,0,0,0,0,8,6,0,0,10,5,0,0,0,0,8, +6,0,0,0,6,0,0,0,7,0,0,0,0,0,6,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,12,0,0,0,0,6, +8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0, +0,0,0,6,0,0,0,0,0,0,0,0,0,0,12,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,4,24,0,0, +0,0,0,12,6,0,0,10,6,0,5,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,17,7,0,5,0,0,0, +0,0,0,0,0,0,0,0,0,0,6,11,5,9,0,8,7,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,10,7,0,0,0,0,0,0,0,7,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,11,5,8,7,0,0,0, +0,8,5,0,0,0,0,10,7,0,7,0,0,0,0,0,0,0,0,0,0,13,6,0,0,0,0,0,0,0,0,0,6,0,4,0,0,0,0, +0,6,12,0,8,7,0,0,0,0,0,0,0,0,0,0,16,0,10,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,22,0,0,0, +0,0,0,0,0,0,0,0,0,0,13,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,6,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,22,0,0,6,0,0,21,0,0,0,22,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +6,0,0,0,0,9,6,0,0,0,0,0,0,0,0,0,6,0,0,0,5,0,0,0,0,0,7,8,0,0,0,0,6,14,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,8,6,0,0,0,0,0,0, +0,0,0,0,0,6,0,0,0,0,8,5,0,0,11,7,0,6,0,0,0,0,0,0,0,0,8,7,0,0,0,0,0,0,0,0,0,0,0, +6,0,0,0,5,0,0,0,0,0,0,0,0,0,4,0,0,8,7,0,0,0,0,8,5,11,7,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,4,0,0,0,0,8,5,0,0,10,0,0,4,13,7,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,5,0,0,13,6, +0,6,0,7,0,0,8,4,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,15,0,0,0,10,7,0,0,0,0,0, +7,0,0,0,0,0,0,0,4,0,0,0,0,0,6,0,0,0,0,19,0,0,0,0,6,0,0,0,0,0,4,0,0,0,0,0,6,0,5, +0,7,0,0,0,0,0,0,0,0,0,6,0,0,11,4,0,0,0,6,0,0,13,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,8,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,12,6,0,0,0,0, +0,7,0,0,0,0,0,0,11,7,0,0,0,0,0,6,0,0,10,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,5,11,6, +0,0,0,0,0,0,0,0,10,0,0,0,0,6,0,0,0,0,0,0,8,7,0,0,0,5,0,0,0,5,0,0,0,0,0,0,0,0,0, +0,0,0,8,7,0,0,0,0,9,6,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,10,7,0,0,0,0,10,0, +0,6,0,0,13,0,0,0,0,0,0,0,9,6,0,0,8,6,8,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,4,0, +0,9,7,0,0,0,0,0,0,11,0,0,0,10,7,0,0,0,0,0,0,0,0,9,6,0,0,12,4,0,4,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,6,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,6,0,5,0,0, +9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,4,0,0,0,0,0,6,0,0,0,6,0,0,0,0,0,0,0,0, +16,0,0,4,0,0,0,0,0,7,0,0,0,6,0,6,0,0,11,0,0,0,0,5,0,0,0,0,0,0,0,4,8,5,0,0,0,0,0, +0,14,0,0,0,0,6,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0, +0,0,8,0,0,0,0,0,0,0,0,6,0,0,0,4,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0, +0,0,0,0,6,9,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,6,14,7,0,0,9,7,0,0,11,0,0,0,0,0,10, +4,11,5,13,6,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,5,0,0,0,0,0,4,0,0,9,0,0,0,0, +0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,6,12,5,0,0,0,6,14,0,0,0,0,0,0,0,0,0,0,4,9,4, +0,0,0,0,0,5,0,0,0,0,0,0,0,4,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0,0, +0,0,0,0,0,0,0,0,8,6,0,0,0,0,0,0,11,6,0,0,13,7,0,0,13,6,0,7,0,0,0,0,0,0,8,6,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,10,6,0,4,0,0,12,6,0,0,0,0,0,0,0,0,10,6, +0,0,0,6,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,6,0, +0,0,0,0,7,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,8,6,0, +0,0,7,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0, +0,0,0,5,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0, +0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,8,7,0,0,8,5,0,0,0,4,9,5,0,0,0,7,10,6,0,0, +0,0,0,0,9,7,0,0,8,5,8,0,8,4,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,0,0,0,0,0,0, +0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,6,0,0,0,4,0,0,0,0,0,0,0,0,0, +0,11,7,0,0,0,7,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,5,0,0,0,7,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,9,7,0,0,0,0,8,5,0,4,0,0,0,0,0,6,0,6,14, +6,0,0,0,0,9,6,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,6,0,0,0,0,14,7,9,7,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,16, +0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,14,0, +0,6,0,0,8,6,0,0,0,0,0,6,0,0,12,0,0,0,0,0,8,5,0,7,11,0,0,5,0,4,0,0,0,6,0,0,0,0,0, +0,0,0,0,0,0,0,9,6,0,4,0,6,0,0,0,0,0,0,0,0,0,0,0,0,11,6,0,0,0,0,0,0,10,5,0,0,0,0, +0,4,0,0,0,7,11,6,0,4,8,5,9,5,0,0,0,5,0,7,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,8,5,14,7,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,16,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,4, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,9,6,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,9,0,0,0,12,5,0,0,0,0,0,0,0,4,10,5,0,0,0,0,0,0,0,0,0,0,0,6,0, +0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,4,0,0,0,6,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,6,0,0,0,0,0,0,10,4,0,0,0,0,0,5,0,0,0,4, +0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,6,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,8,0,10,7,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,10,7,0,0,0,0,0,0,0,0,15,0,0,0, +0,0,0,0,0,0,0,7,0,0,0,0,0,7,10,7,9,7,0,0,0,7,0,0,8,0,0,0,0,0,0,0,9,0,0,0,8,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,8,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,7,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,15,7,12,6,0,0,0,7,0,5,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,5,0,0,0,0, +0,0,0,6,9,5,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,9,7,0,0,14,0,0,0,11,7,0,0,0,0,0, +0,0,0,0,0,0,4,0,0,11,7,0,0,0,0,8,0,0,0,0,0,0,6,8,7,0,0,0,7,10,4,0,0,0,0,0,0,0,0, +0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,7,0,0,0,0,10,0,0,0,0,0,0, +6,0,6,0,0,0,0,0,4,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,11,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,7,0,0,10,7,0,0,0,0,9,7,0,0,0,0,0,0,13,7,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,9,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,6,12,0, +0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,9,6,0,0,11,0,0, +0,0,0,14,4,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,7,0,0, +0,0,0,6,0,7,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,5,0,0,0,0,20, +7,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,8,0,0,0,0,0,0,0,0,0,11,5,0,0,0,0,0,0,0,0,0,0,10,4,0,0,0,5,8,5,10,4,0,0,0,0,0, +0,13,6,9,7,0,0,10,7,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,6,0,0,0,7,0,6,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,7,10,7,0,0, +0,0,0,0,0,0,0,0,12,4,0,0,0,0,8,7,0,0,0,0,0,7,0,6,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0, +0,0,0,0,6,0,6,9,6,0,0,12,5,0,0,8,6,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,6,0,0,0,0, +0,0,0,0,0,0,0,0,0,5,8,7,9,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,11, +4,0,0,0,0,0,0,8,0,0,0,10,7,0,4,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,6,0,0,8,0, +0,0,0,0,0,5,0,6,0,0,10,0,14,0,0,0,0,0,0,0,23,0,0,0,12,0,10,5,0,0,0,0,0,0,0,0,0, +5,0,0,0,0,8,0,0,0,0,6,8,0,0,0,0,0,0,0,0,0,22,0,8,0,0,0,0,6,0,0,0,0,0,0,0,5,0,0, +0,0,0,0,0,6,18,4,0,0,0,7,10,6,0,6,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0, +0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,7,10,0,0,0,0,0,0,6,0,0,0,0,11,5,0,0,0,0,0,0,0,0, +15,0,8,6,0,0,13,7,0,0,0,0,0,7,0,0,0,0,0,7,0,0,0,0,8,7,0,0,0,0,0,0,0,0,0,0,9,5,9, +0,0,6,8,6,0,0,0,0,10,0,0,0,18,5,0,0,0,5,0,7,0,0,0,0,8,6,0,0,0,0,9,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,14,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,6,0,0,0,5,0, +0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,8,5,0,0,0,0,0,0,0,0,9,0,0,0,0,4,0,0,0,0,0,0,0,0, +0,0,0,0,20,5,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,9,5,0,0,0,0,0,0,8,4,24,0,0,0,0,0,0, +0,0,0,0,0,0,0,9,7,0,0,0,0,10,5,0,0,8,5,0,0,0,0,0,0,0,0,12,7,0,6,0,0,10,6,0,0,0, +0,14,0,0,4,9,5,0,0,0,0,0,0,9,0,0,0,0,0,0,6,0,0,0,0,0,4,0,0,8,0,0,0,0,0,11,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,8,5,11,7,0,4,0,0,10,0,0,0,0, +0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,11,6,0,0,0,0,0,5,14,6,0,0,0,0,10,0,0, +0,13,4,0,0,0,0,0,0,0,0,0,0,0,6,0,0,10,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,7,12,0,10,6,0,0,0,0,0,0,10,0,0,0,0,0,10,0,9, +7,0,0,0,0,0,0,0,0,0,0,0,0,0,7,8,0,0,0,0,0,0,0,0,0,0,0,0,4,0,7,0,0,0,0,9,7,0,0,0, +0,0,0,0,0,0,0,0,0,24,0,11,7,0,7,0,0,0,0,0,0,8,6,0,0,0,0,0,0,8,7,0,0,0,0,0,5,0,0, +0,6,9,0,0,0,23,5,0,0,0,0,0,6,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,7,0,0,0, +0,0,0,0,0,0,0,0,0,0,6,0,0,18,4,0,0,11,7,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6, +0,0,0,6,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,9,0,0,0,11,0,0,0,23,0,0, +0,10,4,0,0,0,0,0,7,0,0,0,7,0,0,0,0,0,4,0,0,0,0,0,7,0,0,19,0,11,0,0,0,0,0,12,7,0, +0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,5,0,0,0,0,0,5,0,0,0,0,0,5,0,0,0,0,0,0,0,6,0,0, +9,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,4,0,0,0,0,10,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,4,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,22,0,8,7,10,4,11,0,13,5,8,7,9,0,8,7,0,0,0,7,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0, +0,8,0,0,0,0,0,0,0,8,6,0,0,0,0,0,0,0,0,0,0,0,6,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,4,0,0,0,4,11,0,0,6,0,0,8,5,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,8,5,0,0, +20,0,0,0,0,0,0,0,0,0,11,0,0,0,0,5,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,7,0,0,14,0,0,0,9,0,13,7,0,0,0,0,0,6,0,7,0,0,8,6,10,6,0,0,8,6,0,0,0,6,0, +0,12,6,9,0,0,0,0,0,0,5,9,0,12,4,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,8,5,0,0,0,0,0, +0,0,4,8,0,0,6,8,0,0,0,0,0,0,0,0,0,13,6,0,7,0,0,0,0,0,6,8,7,8,6,0,0,0,7,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,18,0,11,4,0,0,0,5,0,0,0,0,0,0,0,0,0,0, +0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,14, +6,0,0,0,0,12,7,8,0,0,0,0,0,0,0,8,7,0,0,0,0,10,4,0,0,0,0,0,0,10,0,0,6,0,0,0,0,0, +0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,15,6,9,7,0,0,0,0,0,0,15,6,11,7,0,0,0,7,0,0,21,0,0, +0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,17,6,0,0,10,5,0,5,0,0,0,0,0,0,0,0,0,7, +0,0,10,0,0,0,0,0,0,0,0,4,11,5,0,0,0,0,16,7,0,0,0,0,0,6,0,0,8,7,0,4,0,0,10,0,0,0, +0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,8,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0, +0,0,0,10,4,0,0,0,0,0,0,0,0,0,6,0,5,0,0,9,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0, +0,7,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,6,10,7,0,0,0,0,0,0,0,0,8,4,0,0,10,0,0,0,0,4,0,6,0,6,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,7,17,0,0,0,0,0, +0,0,0,0,0,0,10,0,0,7,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +6,0,0,0,5,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,5,0,4,0,0,0,0,0,6,0,0,0,0,0,0,10,5,0,0, +0,5,0,0,0,0,9,0,19,7,0,0,0,0,0,7,0,0,0,0,10,6,0,0,0,6,0,5,0,0,0,0,0,0,0,0,0,6,8, +0,0,0,0,0,11,0,0,0,0,0,0,6,0,0,0,0,0,7,9,0,15,0,0,0,0,0,0,0,0,0,0,4,0,0,0,5,0,0, +0,0,0,0,0,6,0,0,0,0,0,0,0,4,0,0,0,0,9,0,0,0,0,0,0,0,0,6,0,7,0,0,0,0,0,0,0,6,0,0, +0,0,0,6,10,0,0,0,0,0,0,0,23,0,14,0,0,0,0,7,0,0,0,0,0,7,0,0,9,0,0,0,0,7,0,0,0,0, +0,6,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,4,0,0,0, +0,0,0,0,0,9,5,0,0,0,0,0,4,0,0,0,0,9,5,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,10,0,0,0,0,0,0,5,0,4,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,6,11,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,14,7,0,0,12,7,0,0,0, +0,0,0,0,0,0,4,0,0,0,0,0,6,0,0,0,0,8,6,10,0,0,0,0,0,0,0,0,0,10,7,8,5,0,0,0,0,0,0, +0,0,8,4,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,5,0,0,9,5,0,0,0,0,0,5,0,0,0,0,0,4,0,0,0, +0,0,0,0,0,0,0,12,4,11,0,0,0,9,0,11,7,0,0,0,0,0,0,10,6,0,0,0,6,0,0,0,0,15,5,0,0, +11,6,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,4,0,4,0,6,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,8,0,0,0,19,7,0,4,0,0,9,0,0,0,0,0,10,0, +0,6,0,0,13,0,12,6,0,0,0,0,0,0,0,0,10,7,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,13,7,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,6,0,6,0,4,9,0,0,0,10,0,0,0,0,0,0,0, +0,5,0,0,0,0,0,0,10,0,23,6,0,0,0,6,8,0,0,0,0,0,0,0,0,0,17,7,0,0,0,0,11,6,22,5,0, +0,9,6,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,9,6,0,5,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,4,11,0,9,4,0,0, +0,7,0,7,0,0,0,0,0,0,12,4,0,0,0,0,0,0,0,0,0,0,0,0,11,4,0,0,0,0,0,0,0,0,0,0,0,0,0, +4,0,0,11,5,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,8,6,0,0,0,4,0,0,0,0, +0,0,0,0,0,7,0,0,0,4,0,0,10,4,0,0,0,0,0,0,0,7,0,7,0,0,0,6,0,0,0,0,8,6,0,6,0,6,0, +0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,8,7,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,6,0,0,0,0,0,0,9,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,6,22,6,12,0,0,6,0,0,0,6,0,0,0,0,0,7,0,0,0,0,11,0,0,0, +9,7,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,6,0,0,0,6,0,6,0,0,8,7,0,0,0,4,9,7,19,0,0,0,0,0,0,0,0,0,9,6,10,6,0,6,0,0,0, +4,0,0,8,7,0,0,0,0,0,0,0,0,0,0,0,6,16,7,10,6,0,0,23,6,11,7,0,4,0,0,0,0,0,0,0,0,0, +5,0,0,0,0,10,7,0,0,0,0,0,7,0,0,0,0,0,0,15,0,10,0,0,0,14,6,0,0,0,0,0,0,0,0,0,0,0, +5,0,0,0,0,0,0,0,5,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,5,0,0,11,5,0,0,0,0,0,0,0,0,0,0, +0,4,0,0,0,0,0,6,0,0,10,0,0,0,0,7,0,0,0,0,0,0,10,6,0,0,0,0,8,4,0,0,0,7,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,7,12,5,0,0,0,0, +0,6,0,0,0,0,9,6,0,0,0,0,0,0,0,6,9,0,0,0,0,6,0,0,0,0,8,7,0,0,0,0,0,0,0,6,0,0,0,0, +0,0,0,0,0,0,10,5,0,0,0,0,0,0,8,6,0,0,0,0,0,6,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,8,5,0,0,0,0,0,7,0,7,0,4,0,0,10,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,5,0,0,0,0,13, +7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,8,7,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,7,0,0,13,0,0,0,0,0,0,0,0,7,10,5,0,0,0,0,0,0,9,7,0,0,8,6,9, +5,0,0,0,0,0,6,12,0,0,0,0,0,0,0,18,6,0,0,0,0,0,0,0,0,19,7,0,4,0,0,0,0,9,5,0,5,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,7,0,0,0,0,0,0,14,0,0,0,23,7,8,7,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,6,22,0,0,7,0,0,0,0,0,0,0,0,9,7,8,4,0, +0,0,0,0,0,0,0,8,5,0,6,0,0,0,0,0,6,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0, +8,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,12,5,0,0,0,0,0,0,0,0,0,0,8,6,0,0,11,7,0,0,0, +0,12,0,8,6,19,7,0,0,0,0,0,0,0,0,0,0,0,0,0,6,11,0,0,6,0,7,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,11,7,0,0,0,0,0,4,10,0,0,0,0,0,0,0,8,7,0,0,0,0,14,0,8,0,0,6,10,0,0, +0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,6,0,0,0,0, +0,0,0,0,13,0,0,0,0,0,0,0,11,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0, +0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,5,0,0,0,6,0,0,0,5,0,7,0,0,0, +0,0,6,0,0,21,7,0,0,9,6,0,0,0,6,0,0,13,7,0,0,0,5,0,0,0,0,0,4,0,6,0,0,0,0,0,0,0,0, +0,0,0,4,0,0,0,0,0,0,11,5,0,6,0,0,10,5,0,0,0,0,0,0,0,0,9,6,0,0,8,7,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,9,0,0,0,0,0,0,6,0,0,0,0,15,4,0,0,12,7,0,0,0,6, +0,7,0,0,8,0,9,5,0,4,0,0,0,6,0,6,0,0,23,4,0,0,0,0,0,0,0,0,0,0,0,0,10,7,0,4,0,0,8, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,6,0,0,0,0,0,0,0,0,0, +7,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,12,6,0,0,0,0,0,0,10,7,0,7,0,0,0,0,0,0,0,0,0,0, +9,0,0,0,0,0,8,0,0,0,0,4,0,0,0,0,0,0,0,0,0,4,11,5,0,0,0,6,0,6,0,0,0,0,0,0,0,6,0, +4,0,0,0,0,0,0,0,0,0,0,0,5,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,6,8,7,0,0,0,6,0,6,0, +0,0,0,0,0,0,0,0,5,0,0,0,0,0,5,0,0,0,0,11,0,0,0,0,0,0,0,10,5,9,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,23,7,0,0,0,0,0,7,0,0,10,6,18,0,0,0, +0,0,0,0,8,7,0,6,0,0,0,0,0,0,8,5,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0, +0,0,0,0,0,6,0,0,0,4,12,7,0,0,0,0,0,0,0,0,10,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,6,0,0,0,0,0,0,13,5,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,4,0,0,0,0,0,0,0,0, +11,7,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0, +0,0,0,0,6,0,0,0,4,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,10,0,11,0,0,0,0,0,0,0,0,0, +17,5,0,4,0,0,0,0,0,0,0,7,0,0,0,0,0,6,0,0,0,0,0,0,0,4,0,0,0,0,8,7,0,0,0,0,0,0,0, +0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0,0, +10,0,0,0,8,6,0,0,0,7,0,0,0,0,0,0,8,0,0,0,14,0,0,0,0,7,0,0,0,4,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,9,4,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0, +10,0,0,0,16,5,0,0,0,0,0,0,8,0,0,4,0,0,0,0,0,0,0,0,0,0,9,6,0,0,0,0,0,0,10,0,0,0, +0,0,0,0,0,5,0,0,0,0,12,5,0,7,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,7,0, +0,0,0,0,0,0,0,12,6,0,0,0,0,0,7,0,6,0,6,12,6,0,0,0,0,0,0,0,4,8,7,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,6,0,6,0,0,0,0,0,0,0,0,10,6,8,0,0, +6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +16,0,8,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,23,5,0,0,0,7,0,6,0, +0,0,0,0,0,0,0,0,0,0,0,10,6,0,0,9,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,14,0,0,0,0,7,0,0,0,4,17,5,0,0,0,0,11,0,9,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,6,0,0,0,5,0,7,0,0,0,0,0,0,0,0,8,0,0,0, +12,6,0,0,0,0,0,0,13,0,0,0,0,7,9,0,0,0,0,0,0,0,0,0,0,5,0,0,0,7,10,7,12,0,0,0,9,0, +0,0,14,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,15,6,0,0,23,0,0,7,0,6,0,0,0,7,0,6, +0,0,0,0,0,0,0,6,0,6,9,0,0,0,0,0,0,0,8,7,0,0,0,0,0,0,0,0,8,7,9,4,0,0,10,0,0,0,10, +6,0,7,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,23,0,0,6,0,0,0,0,0,0,9,4, +0,0,10,7,0,0,0,0,0,0,0,0,0,0,0,0,9,7,0,0,9,6,0,0,0,0,8,6,0,0,0,0,0,0,0,0,12,0,0, +0,0,0,8,0,0,6,11,6,0,0,8,7,8,5,0,0,0,0,0,5,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,0,0,0, +10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0, +7,0,0,0,0,9,6,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,8,0,0,0,0,6,12,5,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,10,0,10, +7,0,0,8,0,0,0,0,4,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,5,0, +0,0,4,0,0,0,0,0,4,0,0,0,0,0,0,0,6,0,6,0,5,0,0,0,0,8,0,0,0,10,7,0,0,0,0,10,0,0,0, +0,0,13,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,19,7,0,4,12,0,8,0,0,0,0,6,0,0,0,0, +0,0,0,6,0,0,0,0,0,0,0,0,0,4,0,0,0,0,18,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0, +0,14,0,0,4,0,0,0,6,0,0,0,6,0,0,0,7,0,0,0,0,0,0,10,4,0,0,9,7,0,0,11,0,0,0,0,0,0, +7,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,4,0,0,12,0,0,0, +0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,22,5,9,7,0,0,0,0,0,0,0,0,0, +0,0,6,0,0,9,6,0,5,0,0,0,0,0,0,10,5,0,0,8,6,0,6,10,5,0,0,0,6,0,0,0,6,0,0,20,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,6,0,0,0,0,17,4,0,7,0,6, +0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10, +0,0,0,0,0,0,0,0,0,0,0,8,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,7,0,0,0,0,0,0,0, +0,0,7,0,0,8,6,12,0,0,7,18,7,0,0,8,4,0,0,0,0,9,6,0,0,0,0,0,0,0,0,13,0,0,6,0,0,0, +0,0,0,0,0,0,0,10,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,7,0,0, +0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,8,5,0,0,0,0,0,0,0,0,12,0,0,0,8,0,0,0,0,0,0, +4,0,0,10,0,16,0,0,0,0,0,0,0,12,7,10,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,16,6,10,0,0,5,0,0,0,0,0,6,0,0,0,0, +0,7,0,0,0,7,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,5,8,7,0,7,0,0,0,0,0,0,0,0,8,0,0,6,0,0,0,6,0,0,0,4,0,0,0,0, +8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,7,0,0,8,0,0,0, +9,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,7,13,5,0,5,0,0,0,7,8,4,0,0,0,0,0,0,0, +0,12,0,0,0,0,0,0,0,0,0,0,0,8,6,0,6,0,0,11,0,0,0,0,0,0,0,0,6,0,0,0,0,0,4,0,0,0,0, +0,0,0,0,0,6,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,10,7,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,11,6,0,0,10,6,0,0, +0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6, +0,0,0,6,0,0,0,7,0,0,9,0,8,7,11,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,9,6,10,5,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,10,7,0,0,0,0,0,0,11,0,9,6,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,5,0,6,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,15,5,12,5, +0,0,0,0,0,0,12,7,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,6,0,0,12,6,0, +0,0,0,24,4,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,7,0,0,0,0,0,0,0,0,0,0, +0,0,0,4,10,4,0,0,0,0,10,7,0,0,0,0,0,0,0,0,0,0,0,0,9,0,11,0,0,0,0,0,0,0,0,0,0,6, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5, +0,0,8,0,0,0,0,7,0,0,0,0,0,0,10,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,10,7,0,0,0,0,0, +0,0,0,0,0,14,7,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,4,0,0,0,6,0,0,0,0,0,6,0,0,0,6,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,11,6,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,0,0,7,20,7,11,4,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,7,9,6,0,0,12,7,0,0,0,0,0,0,10,0,12,0, +0,0,0,0,0,4,9,6,13,0,0,0,0,0,0,0,0,6,0,0,0,6,0,0,0,5,0,0,0,0,0,0,8,0,0,0,0,0,0, +0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,6,0,0,11,0,9,0,0,0,0,4,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,8,5,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0, +0,4,0,5,0,0,0,0,0,0,0,0,0,4,0,0,0,0,9,7,8,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0, +0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,6, +0,0,0,0,8,7,0,0,0,0,0,0,12,0,0,6,0,0,0,0,0,0,0,6,8,4,0,0,10,7,0,0,10,0,0,0,0,0, +0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,7,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,4,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,7,0,0,0,0,0,0,0,5, +0,4,0,0,0,0,0,6,0,0,0,0,0,0,8,0,0,6,0,0,0,6,0,0,0,0,0,7,0,5,8,4,0,0,9,0,0,0,0,4, +0,0,0,0,0,0,0,0,0,5,0,0,15,6,8,6,0,0,0,6,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,6,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,9,6,0,0,0,0,0,0,0,7,0,0,0,4,0, +6,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,6,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,9,5,0,6,12,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,6,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,8,7,0,6,0,0,0,0,0,0,0,0,0,0,0,0,11,0,12,7,0,0,0,0, +0,0,0,0,0,5,0,5,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,11,4,0,0,0,0,0,0,0,0,0,0,10, +7,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,7,8,7,9,6,0,0,0,0,0,0,0,0,8,6,0,0,0,0,0,5,12,0, +10,5,12,6,0,0,0,7,0,0,0,0,0,0,0,5,0,0,0,5,9,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7, +11,7,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,6,0,7,0,0,0,0,8,0,8,5,0,6,0,0,0,6,0,0,0, +0,0,0,0,6,0,6,0,6,9,0,0,5,17,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,7,0,0, +0,0,0,7,0,0,0,0,16,5,0,0,0,0,0,0,0,4,0,0,0,5,11,5,0,7,0,0,0,4,8,7,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,7,0,0,0,0,12,0,0,0, +0,0,12,0,0,0,0,0,0,0,0,4,10,4,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,6,0,0,0,0,0,0,0,4,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,20,5,0,0, +10,0,0,0,0,0,0,0,0,0,0,6,0,0,0,6,12,0,0,0,0,0,0,6,0,0,0,0,0,0,9,4,10,7,0,4,0,0, +0,0,0,0,10,6,0,0,0,0,8,4,0,7,8,6,0,6,8,0,10,0,0,0,0,0,13,5,0,6,0,0,0,0,0,0,22,4, +0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,6,0,0,0,6,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,6,10, +5,8,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,10,4,0,0,10,7,0,0,0,0,0,5,0, +5,8,0,0,0,0,6,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,10,7,0,0,0,4,0,0,0,0,0,6,0,0, +0,0,0,0,0,0,8,7,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,7,0,0,0,6,0,0,0,0,0,0,0,0,0, +4,0,0,0,4,10,0,0,6,13,7,8,0,0,0,0,0,0,7,0,0,12,7,0,0,0,0,0,0,10,5,0,0,0,0,0,6,0, +0,0,0,0,0,0,0,0,0,13,7,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,6,0,0,0,0,0,0,0,0,8,6,0,6, +0,0,0,0,0,0,0,0,12,0,8,4,0,0,0,0,0,4,0,4,0,0,0,0,0,0,0,5,0,0,0,0,12,5,0,0,0,7,0, +0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,6,10,0,0,0,20,0,0,5,0,0,10, +7,11,7,0,0,0,0,0,0,0,0,0,0,17,0,9,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,10,7,0,4,0,6,0,0,24,0,0,5,0,0,0,0,8,0,0, +0,0,0,0,0,10,5,0,4,0,6,0,0,8,0,0,0,0,0,0,4,0,6,0,0,0,0,0,0,9,5,0,0,0,0,0,0,0,0, +0,0,0,6,0,0,0,0,9,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,4,0,7, +0,0,13,0,0,0,0,0,0,0,11,6,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0, +17,7,0,0,11,6,0,0,0,0,12,6,0,0,0,6,0,6,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,5,0,0,0,6,0,0,0,0,0,0,0,0,0,0,10,0,0,4,8,6,0,0,0, +0,0,0,9,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,9,5,0,7,18,0,0,0,0,0,0,0,0,0,0,0,0,0,8,6,0,0,0,0,0,0,0,0,8,0,0,0, +0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0, +0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,4,0,6,0,0,9,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0, +0,0,0,8,7,10,0,8,5,0,0,0,0,0,0,0,0,9,0,0,0,10,0,0,0,0,6,0,7,0,4,0,0,0,0,0,0,0,0, +8,0,0,0,0,0,8,4,0,0,0,0,0,5,0,0,10,0,12,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +4,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,6,11,0,0, +7,0,0,0,0,0,6,10,5,0,0,0,0,0,0,0,0,0,5,0,0,9,5,12,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,6,0,0,0,0,13,6,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0, +0,0,0,8,4,0,6,12,0,0,0,0,0,0,0,0,0,0,0,0,6,0,6,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,11,4,0,0,0,6,14,0,11,0,9,6,0,0,0,0,0,0,22,0,12,0,8,6,0,0,0,0,0,0,0,6,0, +0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0, +10,7,0,0,0,0,0,0,0,0,9,0,0,0,0,4,0,0,0,0,0,0,0,0,0,5,11,0,0,0,0,0,0,0,8,6,0,0,9, +7,0,0,12,4,0,0,0,0,0,0,12,6,0,6,0,7,0,0,8,5,0,0,0,0}; diff --git a/deps/brotli/c/enc/encode.c b/deps/brotli/c/enc/encode.c index 95ff2eaf500bc9..ba21aa2ecff424 100644 --- a/deps/brotli/c/enc/encode.c +++ b/deps/brotli/c/enc/encode.c @@ -7,34 +7,32 @@ /* Implementation of Brotli compressor. */ #include -#include -#include - -#include /* free, malloc */ -#include /* memcpy, memset */ #include "../common/constants.h" #include "../common/context.h" #include "../common/platform.h" +#include #include "../common/version.h" -#include "backward_references.h" #include "backward_references_hq.h" +#include "backward_references.h" #include "bit_cost.h" #include "brotli_bit_stream.h" -#include "compress_fragment.h" +#include "command.h" +#include "compound_dictionary.h" #include "compress_fragment_two_pass.h" +#include "compress_fragment.h" #include "dictionary_hash.h" #include "encoder_dict.h" -#include "entropy_encode.h" #include "fast_log.h" #include "hash.h" #include "histogram.h" #include "memory.h" #include "metablock.h" -#include "prefix.h" -#include "state.h" +#include "params.h" #include "quality.h" #include "ringbuffer.h" +#include "state.h" +#include "static_init.h" #include "utf8_util.h" #include "write_bits.h" @@ -202,7 +200,7 @@ static void EncodeWindowBits(int lgwin, BROTLI_BOOL large_window, /* TODO(eustas): move to compress_fragment.c? */ /* Initializes the command and distance prefix codes for the first block. */ static void InitCommandPrefixCodes(BrotliOnePassArena* s) { - static const uint8_t kDefaultCommandDepths[128] = { + static const BROTLI_MODEL("small") uint8_t kDefaultCommandDepths[128] = { 0, 4, 4, 5, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 0, 0, 0, 4, 4, 4, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 10, 10, 10, 10, 10, 10, 0, 4, 4, 5, 5, 5, 6, 6, @@ -212,7 +210,7 @@ static void InitCommandPrefixCodes(BrotliOnePassArena* s) { 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 7, 7, 7, 8, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, }; - static const uint16_t kDefaultCommandBits[128] = { + static const BROTLI_MODEL("small") uint16_t kDefaultCommandBits[128] = { 0, 0, 8, 9, 3, 35, 7, 71, 39, 103, 23, 47, 175, 111, 239, 31, 0, 0, 0, 4, 12, 2, 10, 6, @@ -226,7 +224,7 @@ static void InitCommandPrefixCodes(BrotliOnePassArena* s) { 2, 10, 6, 21, 13, 29, 3, 19, 11, 15, 47, 31, 95, 63, 127, 255, 767, 2815, 1791, 3839, 511, 2559, 1535, 3583, 1023, 3071, 2047, 4095, }; - static const uint8_t kDefaultCommandCode[] = { + static const BROTLI_MODEL("small") uint8_t kDefaultCommandCode[] = { 0xff, 0x77, 0xd5, 0xbf, 0xe7, 0xde, 0xea, 0x9e, 0x51, 0x5d, 0xde, 0xc6, 0x70, 0x57, 0xbc, 0x58, 0x58, 0x58, 0xd8, 0xd8, 0x58, 0xd5, 0xcb, 0x8c, 0xea, 0xe0, 0xc3, 0x87, 0x1f, 0x83, 0xc1, 0x60, 0x1c, 0x67, 0xb2, 0xaa, @@ -243,24 +241,39 @@ static void InitCommandPrefixCodes(BrotliOnePassArena* s) { s->cmd_code_numbits = kDefaultCommandCodeNumBits; } +/* TODO(eustas): avoid FP calculations. */ +static double EstimateEntropy(const uint32_t* population, size_t size) { + size_t total = 0; + double result = 0; + for (size_t i = 0; i < size; ++i) { + uint32_t p = population[i]; + total += p; + result += (double)p * FastLog2(p); + } + result = (double)total * FastLog2(total) - result; + return result; +} + /* Decide about the context map based on the ability of the prediction ability of the previous byte UTF8-prefix on the next byte. The prediction ability is calculated as Shannon entropy. Here we need - Shannon entropy instead of 'BitsEntropy' since the prefix will be + Shannon entropy instead of 'BrotliBitsEntropy' since the prefix will be encoded with the remaining 6 bits of the following byte, and - BitsEntropy will assume that symbol to be stored alone using Huffman + BrotliBitsEntropy will assume that symbol to be stored alone using Huffman coding. */ static void ChooseContextMap(int quality, uint32_t* bigram_histo, size_t* num_literal_contexts, const uint32_t** literal_context_map) { - static const uint32_t kStaticContextMapContinuation[64] = { + static const BROTLI_MODEL("small") + uint32_t kStaticContextMapContinuation[64] = { 1, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; - static const uint32_t kStaticContextMapSimpleUTF8[64] = { + static const BROTLI_MODEL("small") + uint32_t kStaticContextMapSimpleUTF8[64] = { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -271,18 +284,17 @@ static void ChooseContextMap(int quality, uint32_t two_prefix_histo[6] = { 0 }; size_t total; size_t i; - size_t dummy; double entropy[4]; for (i = 0; i < 9; ++i) { monogram_histo[i % 3] += bigram_histo[i]; two_prefix_histo[i % 6] += bigram_histo[i]; } - entropy[1] = ShannonEntropy(monogram_histo, 3, &dummy); - entropy[2] = (ShannonEntropy(two_prefix_histo, 3, &dummy) + - ShannonEntropy(two_prefix_histo + 3, 3, &dummy)); + entropy[1] = EstimateEntropy(monogram_histo, 3); + entropy[2] = (EstimateEntropy(two_prefix_histo, 3) + + EstimateEntropy(two_prefix_histo + 3, 3)); entropy[3] = 0; for (i = 0; i < 3; ++i) { - entropy[3] += ShannonEntropy(bigram_histo + 3 * i, 3, &dummy); + entropy[3] += EstimateEntropy(bigram_histo + 3 * i, 3); } total = monogram_histo[0] + monogram_histo[1] + monogram_histo[2]; @@ -317,7 +329,8 @@ static BROTLI_BOOL ShouldUseComplexStaticContextMap(const uint8_t* input, size_t start_pos, size_t length, size_t mask, int quality, size_t size_hint, size_t* num_literal_contexts, const uint32_t** literal_context_map, uint32_t* arena) { - static const uint32_t kStaticContextMapComplexUTF8[64] = { + static const BROTLI_MODEL("small") + uint32_t kStaticContextMapComplexUTF8[64] = { 11, 11, 12, 12, /* 0 special */ 0, 0, 0, 0, /* 4 lf */ 1, 1, 9, 9, /* 8 space */ @@ -348,10 +361,9 @@ static BROTLI_BOOL ShouldUseComplexStaticContextMap(const uint8_t* input, uint32_t* BROTLI_RESTRICT const context_histo = arena + 32; uint32_t total = 0; double entropy[3]; - size_t dummy; size_t i; ContextLut utf8_lut = BROTLI_CONTEXT_LUT(CONTEXT_UTF8); - memset(arena, 0, sizeof(arena[0]) * 32 * 14); + memset(arena, 0, sizeof(arena[0]) * 32 * (BROTLI_MAX_STATIC_CONTEXTS + 1)); for (; start_pos + 64 <= end_pos; start_pos += 4096) { const size_t stride_end_pos = start_pos + 64; uint8_t prev2 = input[start_pos & mask]; @@ -370,10 +382,10 @@ static BROTLI_BOOL ShouldUseComplexStaticContextMap(const uint8_t* input, prev1 = literal; } } - entropy[1] = ShannonEntropy(combined_histo, 32, &dummy); + entropy[1] = EstimateEntropy(combined_histo, 32); entropy[2] = 0; - for (i = 0; i < 13; ++i) { - entropy[2] += ShannonEntropy(context_histo + (i << 5), 32, &dummy); + for (i = 0; i < BROTLI_MAX_STATIC_CONTEXTS; ++i) { + entropy[2] += EstimateEntropy(context_histo + (i << 5), 32); } entropy[0] = 1.0 / (double)total; entropy[1] *= entropy[0]; @@ -388,7 +400,7 @@ static BROTLI_BOOL ShouldUseComplexStaticContextMap(const uint8_t* input, if (entropy[2] > 3.0 || entropy[1] - entropy[2] < 0.2) { return BROTLI_FALSE; } else { - *num_literal_contexts = 13; + *num_literal_contexts = BROTLI_MAX_STATIC_CONTEXTS; *literal_context_map = kStaticContextMapComplexUTF8; return BROTLI_TRUE; } @@ -437,9 +449,10 @@ static BROTLI_BOOL ShouldCompress( if ((double)num_literals > 0.99 * (double)bytes) { uint32_t literal_histo[256] = { 0 }; static const uint32_t kSampleRate = 13; + static const double kInvSampleRate = 1.0 / 13.0; static const double kMinEntropy = 7.92; const double bit_cost_threshold = - (double)bytes * kMinEntropy / kSampleRate; + (double)bytes * kMinEntropy * kInvSampleRate; size_t t = (bytes + kSampleRate - 1) / kSampleRate; uint32_t pos = (uint32_t)last_flush_pos; size_t i; @@ -447,7 +460,7 @@ static BROTLI_BOOL ShouldCompress( ++literal_histo[data[pos & mask]]; pos += kSampleRate; } - if (BitsEntropy(literal_histo, 256) > bit_cost_threshold) { + if (BrotliBitsEntropy(literal_histo, 256) > bit_cost_threshold) { return BROTLI_FALSE; } } @@ -532,7 +545,8 @@ static void WriteMetaBlockInternal(MemoryManager* m, const uint32_t* literal_context_map = NULL; if (!params->disable_literal_context_modeling) { /* TODO(eustas): pull to higher level and reuse. */ - uint32_t* arena = BROTLI_ALLOC(m, uint32_t, 14 * 32); + uint32_t* arena = + BROTLI_ALLOC(m, uint32_t, 32 * (BROTLI_MAX_STATIC_CONTEXTS + 1)); if (BROTLI_IS_OOM(m) || BROTLI_IS_NULL(arena)) return; DecideOverLiteralContextModeling( data, wrapped_last_flush_pos, bytes, mask, params->quality, @@ -686,7 +700,23 @@ static void BrotliEncoderCleanupParams(MemoryManager* m, BrotliCleanupSharedEncoderDictionary(m, ¶ms->dictionary); } +#ifdef BROTLI_REPORTING +/* When BROTLI_REPORTING is defined extra reporting module have to be linked. */ +void BrotliEncoderOnStart(const BrotliEncoderState* s); +void BrotliEncoderOnFinish(const BrotliEncoderState* s); +#define BROTLI_ENCODER_ON_START(s) BrotliEncoderOnStart(s); +#define BROTLI_ENCODER_ON_FINISH(s) BrotliEncoderOnFinish(s); +#else +#if !defined(BROTLI_ENCODER_ON_START) +#define BROTLI_ENCODER_ON_START(s) (void)(s); +#endif +#if !defined(BROTLI_ENCODER_ON_FINISH) +#define BROTLI_ENCODER_ON_FINISH(s) (void)(s); +#endif +#endif + static void BrotliEncoderInitState(BrotliEncoderState* s) { + BROTLI_ENCODER_ON_START(s); BrotliEncoderInitParams(&s->params); s->input_pos_ = 0; s->num_commands_ = 0; @@ -730,6 +760,10 @@ static void BrotliEncoderInitState(BrotliEncoderState* s) { BrotliEncoderState* BrotliEncoderCreateInstance( brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque) { + BROTLI_BOOL healthy = BrotliEncoderEnsureStaticInit(); + if (!healthy) { + return 0; + } BrotliEncoderState* state = (BrotliEncoderState*)BrotliBootstrapAlloc( sizeof(BrotliEncoderState), alloc_func, free_func, opaque); if (state == NULL) { @@ -742,16 +776,6 @@ BrotliEncoderState* BrotliEncoderCreateInstance( return state; } -#ifdef BROTLI_REPORTING -/* When BROTLI_REPORTING is defined extra reporting module have to be linked. */ -void BrotliEncoderOnFinish(const BrotliEncoderState* s); -#define BROTLI_ENCODER_ON_FINISH(s) BrotliEncoderOnFinish(s); -#else -#if !defined(BROTLI_ENCODER_ON_FINISH) -#define BROTLI_ENCODER_ON_FINISH(s) (void)(s); -#endif -#endif - static void BrotliEncoderCleanupState(BrotliEncoderState* s) { MemoryManager* m = &s->memory_manager_; @@ -817,7 +841,7 @@ static void CopyInputToRingBuffer(BrotliEncoderState* s, reading new bytes from the input. However, at the last few indexes of the ring buffer, there are not enough bytes to build full-length substrings from. Since the hash table always contains full-length - substrings, we erase with dummy zeros here to make sure that those + substrings, we overwrite with zeros here to make sure that those substrings will contain zeros at the end instead of uninitialized data. @@ -1750,7 +1774,7 @@ BrotliEncoderPreparedDictionary* BrotliEncoderPrepareDictionary( return (BrotliEncoderPreparedDictionary*)managed_dictionary; } -void BrotliEncoderDestroyPreparedDictionary( +void BROTLI_COLD BrotliEncoderDestroyPreparedDictionary( BrotliEncoderPreparedDictionary* dictionary) { ManagedDictionary* dict = (ManagedDictionary*)dictionary; if (!dictionary) return; @@ -1776,7 +1800,8 @@ void BrotliEncoderDestroyPreparedDictionary( BrotliDestroyManagedDictionary(dict); } -BROTLI_BOOL BrotliEncoderAttachPreparedDictionary(BrotliEncoderState* state, +BROTLI_BOOL BROTLI_COLD BrotliEncoderAttachPreparedDictionary( + BrotliEncoderState* state, const BrotliEncoderPreparedDictionary* dictionary) { /* First field of dictionary structs */ const BrotliEncoderPreparedDictionary* dict = dictionary; @@ -1833,8 +1858,8 @@ BROTLI_BOOL BrotliEncoderAttachPreparedDictionary(BrotliEncoderState* state, return BROTLI_TRUE; } -size_t BrotliEncoderEstimatePeakMemoryUsage(int quality, int lgwin, - size_t input_size) { +size_t BROTLI_COLD BrotliEncoderEstimatePeakMemoryUsage(int quality, int lgwin, + size_t input_size) { BrotliEncoderParams params; size_t memory_manager_slots = BROTLI_ENCODER_MEMORY_MANAGER_SLOTS; size_t memory_manager_size = memory_manager_slots * sizeof(void*); @@ -1849,7 +1874,7 @@ size_t BrotliEncoderEstimatePeakMemoryUsage(int quality, int lgwin, if (params.quality == FAST_ONE_PASS_COMPRESSION_QUALITY || params.quality == FAST_TWO_PASS_COMPRESSION_QUALITY) { size_t state_size = sizeof(BrotliEncoderState); - size_t block_size = BROTLI_MIN(size_t, input_size, (1ul << params.lgwin)); + size_t block_size = BROTLI_MIN(size_t, input_size, ((size_t)1ul << params.lgwin)); size_t hash_table_size = HashTableSize(MaxHashTableSize(params.quality), block_size); size_t hash_size = @@ -1866,7 +1891,7 @@ size_t BrotliEncoderEstimatePeakMemoryUsage(int quality, int lgwin, size_t short_ringbuffer_size = (size_t)1 << params.lgblock; int ringbuffer_bits = ComputeRbBits(¶ms); size_t ringbuffer_size = input_size < short_ringbuffer_size ? - input_size : (1u << ringbuffer_bits) + short_ringbuffer_size; + input_size : ((size_t)1u << ringbuffer_bits) + short_ringbuffer_size; size_t hash_size[4] = {0}; size_t metablock_size = BROTLI_MIN(size_t, input_size, MaxMetablockSize(¶ms)); @@ -1901,7 +1926,7 @@ size_t BrotliEncoderEstimatePeakMemoryUsage(int quality, int lgwin, histogram_size); } } -size_t BrotliEncoderGetPreparedDictionarySize( +size_t BROTLI_COLD BrotliEncoderGetPreparedDictionarySize( const BrotliEncoderPreparedDictionary* prepared_dictionary) { /* First field of dictionary structs */ const BrotliEncoderPreparedDictionary* prepared = prepared_dictionary; @@ -1984,8 +2009,8 @@ size_t BrotliEncoderGetPreparedDictionarySize( } #if defined(BROTLI_TEST) -size_t MakeUncompressedStreamForTest(const uint8_t*, size_t, uint8_t*); -size_t MakeUncompressedStreamForTest( +size_t BrotliMakeUncompressedStreamForTest(const uint8_t*, size_t, uint8_t*); +size_t BrotliMakeUncompressedStreamForTest( const uint8_t* input, size_t input_size, uint8_t* output) { return MakeUncompressedStream(input, input_size, output); } diff --git a/deps/brotli/c/enc/encoder_dict.c b/deps/brotli/c/enc/encoder_dict.c index 6602c55a24e453..f75ee59845b770 100644 --- a/deps/brotli/c/enc/encoder_dict.c +++ b/deps/brotli/c/enc/encoder_dict.c @@ -6,17 +6,19 @@ #include "encoder_dict.h" -#include /* malloc, free */ - #include "../common/dictionary.h" #include "../common/platform.h" +#include #include "../common/shared_dictionary_internal.h" #include "../common/transform.h" +#include #include "compound_dictionary.h" #include "dictionary_hash.h" +#include "hash_base.h" +#include "hash.h" #include "memory.h" #include "quality.h" -#include "hash.h" +#include "static_dict_lut.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { @@ -118,8 +120,8 @@ static uint32_t BrotliTrieAlloc(MemoryManager* m, size_t num, BrotliTrie* trie, keep_index = (uint32_t)(*keep - trie->pool); } if (trie->pool_size == 0) { - /* Have a dummy node in the front. We do not want the result to be 0, it - must be at least 1, 0 represents "null pointer" */ + /* Have a placeholder node in the front. We do not want the result to be 0, + it must be at least 1, 0 represents "null pointer" */ trie->pool_size = 1; } BROTLI_ENSURE_CAPACITY(m, BrotliTrieNode, trie->pool, trie->pool_capacity, @@ -629,8 +631,8 @@ void BrotliDestroyManagedDictionary(ManagedDictionary* dictionary) { /* Escalate internal functions visibility; for testing purposes only. */ #if defined(BROTLI_TEST) -void InitEncoderDictionaryForTest(BrotliEncoderDictionary*); -void InitEncoderDictionaryForTest(BrotliEncoderDictionary* d) { +void BrotliInitEncoderDictionaryForTest(BrotliEncoderDictionary*); +void BrotliInitEncoderDictionaryForTest(BrotliEncoderDictionary* d) { InitEncoderDictionary(d); } #endif diff --git a/deps/brotli/c/enc/encoder_dict.h b/deps/brotli/c/enc/encoder_dict.h index 27dcbcd2f33360..76f037977edaa3 100644 --- a/deps/brotli/c/enc/encoder_dict.h +++ b/deps/brotli/c/enc/encoder_dict.h @@ -7,10 +7,8 @@ #ifndef BROTLI_ENC_ENCODER_DICT_H_ #define BROTLI_ENC_ENCODER_DICT_H_ -#include -#include - #include "../common/dictionary.h" +#include #include "../common/platform.h" #include "compound_dictionary.h" #include "memory.h" @@ -30,7 +28,7 @@ Dictionary hierarchy for Encoder: ---BrotliEncoderDictionary [up to 64x] = for each context, precomputed static dictionary with words + transforms -Dictionary hiearchy from common: similar, but without precomputed hashes +Dictionary hierarchy from common: similar, but without precomputed hashes -BrotliSharedDictionary --BrotliDictionary [up to 64x] --BrotliTransforms [up to 64x] diff --git a/deps/brotli/c/enc/entropy_encode.c b/deps/brotli/c/enc/entropy_encode.c index 9aed43b6eb31f4..1b4eab97f419c8 100644 --- a/deps/brotli/c/enc/entropy_encode.c +++ b/deps/brotli/c/enc/entropy_encode.c @@ -8,10 +8,6 @@ #include "entropy_encode.h" -#include /* memset */ - -#include - #include "../common/constants.h" #include "../common/platform.h" @@ -19,7 +15,7 @@ extern "C" { #endif -const size_t kBrotliShellGaps[] = {132, 57, 23, 10, 4, 1}; +const BROTLI_MODEL("small") size_t kBrotliShellGaps[] = {132, 57, 23, 10, 4, 1}; BROTLI_BOOL BrotliSetDepth( int p0, HuffmanTree* pool, uint8_t* depth, int max_depth) { @@ -456,7 +452,8 @@ void BrotliWriteHuffmanTree(const uint8_t* depth, } static uint16_t BrotliReverseBits(size_t num_bits, uint16_t bits) { - static const size_t kLut[16] = { /* Pre-reversed 4-bit values. */ + static const size_t BROTLI_MODEL("small") kLut[16] = + { /* Pre-reversed 4-bit values. */ 0x00, 0x08, 0x04, 0x0C, 0x02, 0x0A, 0x06, 0x0E, 0x01, 0x09, 0x05, 0x0D, 0x03, 0x0B, 0x07, 0x0F }; diff --git a/deps/brotli/c/enc/entropy_encode.h b/deps/brotli/c/enc/entropy_encode.h index e1c779cc6f4dc8..0470c16e04ba46 100644 --- a/deps/brotli/c/enc/entropy_encode.h +++ b/deps/brotli/c/enc/entropy_encode.h @@ -9,8 +9,6 @@ #ifndef BROTLI_ENC_ENTROPY_ENCODE_H_ #define BROTLI_ENC_ENTROPY_ENCODE_H_ -#include - #include "../common/platform.h" #if defined(__cplusplus) || defined(c_plusplus) @@ -67,7 +65,7 @@ BROTLI_INTERNAL void BrotliOptimizeHuffmanCountsForRle( of a Huffman tree. The generated Huffman tree is to be compressed once more using a Huffman tree */ BROTLI_INTERNAL void BrotliWriteHuffmanTree(const uint8_t* depth, - size_t num, + size_t length, size_t* tree_size, uint8_t* tree, uint8_t* extra_bits_data); @@ -77,7 +75,7 @@ BROTLI_INTERNAL void BrotliConvertBitDepthsToSymbols(const uint8_t* depth, size_t len, uint16_t* bits); -BROTLI_INTERNAL extern const size_t kBrotliShellGaps[6]; +BROTLI_INTERNAL extern BROTLI_MODEL("small") const size_t kBrotliShellGaps[6]; /* Input size optimized Shell sort. */ typedef BROTLI_BOOL (*HuffmanTreeComparator)( const HuffmanTree*, const HuffmanTree*); diff --git a/deps/brotli/c/enc/entropy_encode_static.h b/deps/brotli/c/enc/entropy_encode_static.h index ecff1fe9eeba18..5056eaa137c69d 100644 --- a/deps/brotli/c/enc/entropy_encode_static.h +++ b/deps/brotli/c/enc/entropy_encode_static.h @@ -9,8 +9,6 @@ #ifndef BROTLI_ENC_ENTROPY_ENCODE_STATIC_H_ #define BROTLI_ENC_ENTROPY_ENCODE_STATIC_H_ -#include - #include "../common/constants.h" #include "../common/platform.h" #include "write_bits.h" @@ -19,11 +17,12 @@ extern "C" { #endif -static const uint8_t kCodeLengthDepth[18] = { +static const BROTLI_MODEL("small") uint8_t kCodeLengthDepth[18] = { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 0, 4, 4, }; -static const uint8_t kStaticCommandCodeDepth[BROTLI_NUM_COMMAND_SYMBOLS] = { +static const BROTLI_MODEL("small") +uint8_t kStaticCommandCodeDepth[BROTLI_NUM_COMMAND_SYMBOLS] = { 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, @@ -70,7 +69,8 @@ static const uint8_t kStaticCommandCodeDepth[BROTLI_NUM_COMMAND_SYMBOLS] = { 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, }; -static const uint8_t kStaticDistanceCodeDepth[64] = { +static const BROTLI_MODEL("small") +uint8_t kStaticDistanceCodeDepth[64] = { 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, @@ -78,7 +78,8 @@ static const uint8_t kStaticDistanceCodeDepth[64] = { }; /* GENERATED CODE START */ -static const uint32_t kCodeLengthBits[18] = { +static const BROTLI_MODEL("small") +uint32_t kCodeLengthBits[18] = { 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 15, 31, 0, 11, 7, }; @@ -88,7 +89,8 @@ static BROTLI_INLINE void StoreStaticCodeLengthCode( 40, BROTLI_MAKE_UINT64_T(0x0000FFu, 0x55555554u), storage_ix, storage); } -static const uint64_t kZeroRepsBits[BROTLI_NUM_COMMAND_SYMBOLS] = { +static const BROTLI_MODEL("small") +uint64_t kZeroRepsBits[BROTLI_NUM_COMMAND_SYMBOLS] = { 0x00000000, 0x00000000, 0x00000000, 0x00000007, 0x00000017, 0x00000027, 0x00000037, 0x00000047, 0x00000057, 0x00000067, 0x00000077, 0x00000770, 0x00000b87, 0x00001387, 0x00001b87, 0x00002387, 0x00002b87, 0x00003387, @@ -209,7 +211,8 @@ static const uint64_t kZeroRepsBits[BROTLI_NUM_COMMAND_SYMBOLS] = { 0x06f9cb87, 0x08f9cb87, }; -static const uint32_t kZeroRepsDepth[BROTLI_NUM_COMMAND_SYMBOLS] = { +static const BROTLI_MODEL("small") +uint32_t kZeroRepsDepth[BROTLI_NUM_COMMAND_SYMBOLS] = { 0, 4, 8, 7, 7, 7, 7, 7, 7, 7, 7, 11, 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, @@ -256,7 +259,8 @@ static const uint32_t kZeroRepsDepth[BROTLI_NUM_COMMAND_SYMBOLS] = { 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, }; -static const uint64_t kNonZeroRepsBits[BROTLI_NUM_COMMAND_SYMBOLS] = { +static const BROTLI_MODEL("small") +uint64_t kNonZeroRepsBits[BROTLI_NUM_COMMAND_SYMBOLS] = { 0x0000000b, 0x0000001b, 0x0000002b, 0x0000003b, 0x000002cb, 0x000006cb, 0x00000acb, 0x00000ecb, 0x000002db, 0x000006db, 0x00000adb, 0x00000edb, 0x000002eb, 0x000006eb, 0x00000aeb, 0x00000eeb, 0x000002fb, 0x000006fb, @@ -377,7 +381,8 @@ static const uint64_t kNonZeroRepsBits[BROTLI_NUM_COMMAND_SYMBOLS] = { 0x2baeb6db, 0x3baeb6db, }; -static const uint32_t kNonZeroRepsDepth[BROTLI_NUM_COMMAND_SYMBOLS] = { +static const BROTLI_MODEL("small") +uint32_t kNonZeroRepsDepth[BROTLI_NUM_COMMAND_SYMBOLS] = { 6, 6, 6, 6, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 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, @@ -424,7 +429,8 @@ static const uint32_t kNonZeroRepsDepth[BROTLI_NUM_COMMAND_SYMBOLS] = { 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, }; -static const uint16_t kStaticCommandCodeBits[BROTLI_NUM_COMMAND_SYMBOLS] = { +static const BROTLI_MODEL("small") +uint16_t kStaticCommandCodeBits[BROTLI_NUM_COMMAND_SYMBOLS] = { 0, 256, 128, 384, 64, 320, 192, 448, 32, 288, 160, 416, 96, 352, 224, 480, 16, 272, 144, 400, 80, 336, 208, 464, @@ -522,7 +528,7 @@ static BROTLI_INLINE void StoreStaticCommandHuffmanTree( BrotliWriteBits(3, 0x00000000U, storage_ix, storage); } -static const uint16_t kStaticDistanceCodeBits[64] = { +static const BROTLI_MODEL("small") uint16_t kStaticDistanceCodeBits[64] = { 0, 32, 16, 48, 8, 40, 24, 56, 4, 36, 20, 52, 12, 44, 28, 60, 2, 34, 18, 50, 10, 42, 26, 58, 6, 38, 22, 54, 14, 46, 30, 62, 1, 33, 17, 49, 9, 41, 25, 57, 5, 37, 21, 53, 13, 45, 29, 61, diff --git a/deps/brotli/c/enc/fast_log.c b/deps/brotli/c/enc/fast_log.c index 2fa0efcf862ae8..7b7ac029502eaf 100644 --- a/deps/brotli/c/enc/fast_log.c +++ b/deps/brotli/c/enc/fast_log.c @@ -11,7 +11,7 @@ extern "C" { #endif /* ", ".join(["%.16ff" % x for x in [0.0]+[log2(x) for x in range(1, 256)]]) */ -const double kBrotliLog2Table[BROTLI_LOG2_TABLE_SIZE] = { +const BROTLI_MODEL("small") double kBrotliLog2Table[BROTLI_LOG2_TABLE_SIZE] = { 0.0000000000000000f, 0.0000000000000000f, 1.0000000000000000f, 1.5849625007211563f, 2.0000000000000000f, 2.3219280948873622f, 2.5849625007211561f, 2.8073549220576042f, 3.0000000000000000f, diff --git a/deps/brotli/c/enc/fast_log.h b/deps/brotli/c/enc/fast_log.h index f82f4cffc840f9..a245443fff4fce 100644 --- a/deps/brotli/c/enc/fast_log.h +++ b/deps/brotli/c/enc/fast_log.h @@ -11,8 +11,6 @@ #include -#include - #include "../common/platform.h" #if defined(__cplusplus) || defined(c_plusplus) @@ -33,7 +31,8 @@ static BROTLI_INLINE uint32_t Log2FloorNonZero(size_t n) { /* A lookup table for small values of log2(int) to be used in entropy computation. */ -BROTLI_INTERNAL extern const double kBrotliLog2Table[BROTLI_LOG2_TABLE_SIZE]; +BROTLI_INTERNAL extern const BROTLI_MODEL("small") +double kBrotliLog2Table[BROTLI_LOG2_TABLE_SIZE]; /* Visual Studio 2012 and Android API levels < 18 do not have the log2() * function defined, so we use log() and a multiplication instead. */ diff --git a/deps/brotli/c/enc/find_match_length.h b/deps/brotli/c/enc/find_match_length.h index f3de0bdb6b068c..096be933106efe 100644 --- a/deps/brotli/c/enc/find_match_length.h +++ b/deps/brotli/c/enc/find_match_length.h @@ -9,8 +9,6 @@ #ifndef BROTLI_ENC_FIND_MATCH_LENGTH_H_ #define BROTLI_ENC_FIND_MATCH_LENGTH_H_ -#include - #include "../common/platform.h" #if defined(__cplusplus) || defined(c_plusplus) diff --git a/deps/brotli/c/enc/hash.h b/deps/brotli/c/enc/hash.h index 5677d82920b0a6..d86fa189575b16 100644 --- a/deps/brotli/c/enc/hash.h +++ b/deps/brotli/c/enc/hash.h @@ -10,11 +10,6 @@ #ifndef BROTLI_ENC_HASH_H_ #define BROTLI_ENC_HASH_H_ -#include /* exit */ -#include /* memcmp, memset */ - -#include - #include "../common/constants.h" #include "../common/dictionary.h" #include "../common/platform.h" @@ -22,7 +17,10 @@ #include "encoder_dict.h" #include "fast_log.h" #include "find_match_length.h" +#include "hash_base.h" +#include "matching_tag_mask.h" #include "memory.h" +#include "params.h" #include "quality.h" #include "static_dict.h" @@ -38,7 +36,7 @@ typedef struct { void* extra[4]; /** - * False before the fisrt invocation of HasherSetup (where "extra" memory) + * False before the first invocation of HasherSetup (where "extra" memory) * is allocated. */ BROTLI_BOOL is_setup_; @@ -71,23 +69,6 @@ typedef struct HasherSearchResult { int len_code_delta; /* == len_code - len */ } HasherSearchResult; -/* kHashMul32 multiplier has these properties: - * The multiplier must be odd. Otherwise we may lose the highest bit. - * No long streaks of ones or zeros. - * There is no effort to ensure that it is a prime, the oddity is enough - for this use. - * The number has been tuned heuristically against compression benchmarks. */ -static const uint32_t kHashMul32 = 0x1E35A7BD; -static const uint64_t kHashMul64 = - BROTLI_MAKE_UINT64_T(0x1FE35A7Bu, 0xD3579BD3u); - -static BROTLI_INLINE uint32_t Hash14(const uint8_t* data) { - uint32_t h = BROTLI_UNALIGNED_LOAD32LE(data) * kHashMul32; - /* The higher bits contain more mixture from the multiplication, - so we take our results from there. */ - return h >> (32 - 14); -} - static BROTLI_INLINE void PrepareDistanceCache( int* BROTLI_RESTRICT distance_cache, const int num_distances) { if (num_distances > 4) { @@ -297,6 +278,16 @@ static BROTLI_INLINE size_t BackwardMatchLengthCode(const BackwardMatch* self) { #include "hash_longest_match64_inc.h" /* NOLINT(build/include) */ #undef HASHER +#if defined(BROTLI_MAX_SIMD_QUALITY) +#define HASHER() H58 +#include "hash_longest_match_simd_inc.h" /* NOLINT(build/include) */ +#undef HASHER + +#define HASHER() H68 +#include "hash_longest_match64_simd_inc.h" /* NOLINT(build/include) */ +#undef HASHER +#endif + #define BUCKET_BITS 15 #define NUM_LAST_DISTANCES_TO_CHECK 4 @@ -388,7 +379,13 @@ static BROTLI_INLINE size_t BackwardMatchLengthCode(const BackwardMatch* self) { #undef CAT #undef EXPAND_CAT -#define FOR_SIMPLE_HASHERS(H) H(2) H(3) H(4) H(5) H(6) H(40) H(41) H(42) H(54) +#if defined(BROTLI_MAX_SIMD_QUALITY) +#define FOR_SIMPLE_HASHERS(H) \ + H(2) H(3) H(4) H(5) H(6) H(40) H(41) H(42) H(54) H(58) H(68) +#else +#define FOR_SIMPLE_HASHERS(H) \ + H(2) H(3) H(4) H(5) H(6) H(40) H(41) H(42) H(54) +#endif #define FOR_COMPOSITE_HASHERS(H) H(35) H(55) H(65) #define FOR_GENERIC_HASHERS(H) FOR_SIMPLE_HASHERS(H) FOR_COMPOSITE_HASHERS(H) #define FOR_ALL_HASHERS(H) FOR_GENERIC_HASHERS(H) H(10) @@ -523,8 +520,8 @@ static BROTLI_INLINE void FindCompoundDictionaryMatch( const uint64_t hash_mask = (~((uint64_t)0U)) >> (64 - hash_bits); const uint32_t* slot_offsets = (uint32_t*)(&self[1]); - const uint16_t* heads = (uint16_t*)(&slot_offsets[1u << slot_bits]); - const uint32_t* items = (uint32_t*)(&heads[1u << bucket_bits]); + const uint16_t* heads = (uint16_t*)(&slot_offsets[(size_t)1u << slot_bits]); + const uint32_t* items = (uint32_t*)(&heads[(size_t)1u << bucket_bits]); const uint8_t* source = NULL; const size_t cur_ix_masked = cur_ix & ring_buffer_mask; @@ -548,6 +545,8 @@ static BROTLI_INLINE void FindCompoundDictionaryMatch( source = (const uint8_t*)BROTLI_UNALIGNED_LOAD_PTR((const uint8_t**)tail); } + BROTLI_DCHECK(cur_ix_masked + max_length <= ring_buffer_mask); + for (i = 0; i < 4; ++i) { const size_t distance = (size_t)distance_cache[i]; size_t offset; @@ -574,6 +573,11 @@ static BROTLI_INLINE void FindCompoundDictionaryMatch( } } } + /* we require matches of len >4, so increase best_len to 3, so we can compare + * 4 bytes all the time. */ + if (best_len < 3) { + best_len = 3; + } while (item == 0) { size_t offset; size_t distance; @@ -586,9 +590,10 @@ static BROTLI_INLINE void FindCompoundDictionaryMatch( limit = source_size - offset; limit = (limit > max_length) ? max_length : limit; if (distance > max_distance) continue; - if (cur_ix_masked + best_len > ring_buffer_mask || - best_len >= limit || - data[cur_ix_masked + best_len] != source[offset + best_len]) { + if (cur_ix_masked + best_len > ring_buffer_mask || best_len >= limit || + /* compare 4 bytes ending at best_len + 1 */ + BrotliUnalignedRead32(&data[cur_ix_masked + best_len - 3]) != + BrotliUnalignedRead32(&source[offset + best_len - 3])) { continue; } { @@ -627,8 +632,8 @@ static BROTLI_INLINE size_t FindAllCompoundDictionaryMatches( const uint64_t hash_mask = (~((uint64_t)0U)) >> (64 - hash_bits); const uint32_t* slot_offsets = (uint32_t*)(&self[1]); - const uint16_t* heads = (uint16_t*)(&slot_offsets[1u << slot_bits]); - const uint32_t* items = (uint32_t*)(&heads[1u << bucket_bits]); + const uint16_t* heads = (uint16_t*)(&slot_offsets[(size_t)1u << slot_bits]); + const uint32_t* items = (uint32_t*)(&heads[(size_t)1u << bucket_bits]); const uint8_t* source = NULL; const size_t cur_ix_masked = cur_ix & ring_buffer_mask; @@ -651,6 +656,8 @@ static BROTLI_INLINE size_t FindAllCompoundDictionaryMatches( source = (const uint8_t*)BROTLI_UNALIGNED_LOAD_PTR((const uint8_t**)tail); } + BROTLI_DCHECK(cur_ix_masked + max_length <= ring_buffer_mask); + while (item == 0) { size_t offset; size_t distance; diff --git a/deps/brotli/c/enc/hash_base.h b/deps/brotli/c/enc/hash_base.h new file mode 100644 index 00000000000000..edf1ef020e49e1 --- /dev/null +++ b/deps/brotli/c/enc/hash_base.h @@ -0,0 +1,38 @@ +/* Copyright 2025 Google Inc. All Rights Reserved. + + Distributed under MIT license. + See file LICENSE for detail or copy at https://opensource.org/licenses/MIT +*/ + +/* Basic common hash functions / constants. */ + +#ifndef THIRD_PARTY_BROTLI_ENC_HASH_BASE_H_ +#define THIRD_PARTY_BROTLI_ENC_HASH_BASE_H_ + +#include "../common/platform.h" + +/* kHashMul32 multiplier has these properties: + * The multiplier must be odd. Otherwise we may lose the highest bit. + * No long streaks of ones or zeros. + * There is no effort to ensure that it is a prime, the oddity is enough + for this use. + * The number has been tuned heuristically against compression benchmarks. */ +static const uint32_t kHashMul32 = 0x1E35A7BD; +static const uint64_t kHashMul64 = + BROTLI_MAKE_UINT64_T(0x1FE35A7Bu, 0xD3579BD3u); + +static BROTLI_INLINE uint32_t Hash14(const uint8_t* data) { + uint32_t h = BROTLI_UNALIGNED_LOAD32LE(data) * kHashMul32; + /* The higher bits contain more mixture from the multiplication, + so we take our results from there. */ + return h >> (32 - 14); +} + +static BROTLI_INLINE uint32_t Hash15(const uint8_t* data) { + uint32_t h = BROTLI_UNALIGNED_LOAD32LE(data) * kHashMul32; + /* The higher bits contain more mixture from the multiplication, + so we take our results from there. */ + return h >> (32 - 15); +} + +#endif // THIRD_PARTY_BROTLI_ENC_HASH_BASE_H_ diff --git a/deps/brotli/c/enc/hash_forgetful_chain_inc.h b/deps/brotli/c/enc/hash_forgetful_chain_inc.h index 48e1cdcdf2eb48..c44276fa459620 100644 --- a/deps/brotli/c/enc/hash_forgetful_chain_inc.h +++ b/deps/brotli/c/enc/hash_forgetful_chain_inc.h @@ -212,6 +212,9 @@ static BROTLI_INLINE void FN(FindLongestMatch)( const uint8_t tiny_hash = (uint8_t)(key); out->len = 0; out->len_code_delta = 0; + + BROTLI_DCHECK(cur_ix_masked + max_length <= ring_buffer_mask); + /* Try last distance first. */ for (i = 0; i < NUM_LAST_DISTANCES_TO_CHECK; ++i) { const size_t backward = (size_t)distance_cache[i]; @@ -241,6 +244,11 @@ static BROTLI_INLINE void FN(FindLongestMatch)( } } } + /* we require matches of len >4, so increase best_len to 3, so we can compare + * 4 bytes all the time. */ + if (best_len < 3) { + best_len = 3; + } { const size_t bank = key & (NUM_BANKS - 1); size_t backward = 0; @@ -257,7 +265,9 @@ static BROTLI_INLINE void FN(FindLongestMatch)( delta = banks[bank].slots[last].delta; if (cur_ix_masked + best_len > ring_buffer_mask || prev_ix + best_len > ring_buffer_mask || - data[cur_ix_masked + best_len] != data[prev_ix + best_len]) { + /* compare 4 bytes ending at best_len + 1 */ + BrotliUnalignedRead32(&data[cur_ix_masked + best_len - 3]) != + BrotliUnalignedRead32(&data[prev_ix + best_len - 3])) { continue; } { diff --git a/deps/brotli/c/enc/hash_longest_match64_inc.h b/deps/brotli/c/enc/hash_longest_match64_inc.h index e48fc615544236..bdbb30aa5ed254 100644 --- a/deps/brotli/c/enc/hash_longest_match64_inc.h +++ b/deps/brotli/c/enc/hash_longest_match64_inc.h @@ -170,8 +170,16 @@ static BROTLI_INLINE void FN(FindLongestMatch)( score_t best_score = out->score; size_t best_len = out->len; size_t i; + /* Precalculate the hash key and prefetch the bucket. */ + const size_t key = FN(HashBytes)(&data[cur_ix_masked], self->hash_mul_); + uint32_t* BROTLI_RESTRICT bucket = &buckets[key << self->block_bits_]; + PREFETCH_L1(bucket); + if (self->block_bits_ > 4) PREFETCH_L1(bucket + 16); out->len = 0; out->len_code_delta = 0; + + BROTLI_DCHECK(cur_ix_masked + max_length <= ring_buffer_mask); + /* Try last distance first. */ for (i = 0; i < (size_t)self->num_last_distances_to_check_; ++i) { const size_t backward = (size_t)distance_cache[i]; @@ -184,8 +192,10 @@ static BROTLI_INLINE void FN(FindLongestMatch)( } prev_ix &= ring_buffer_mask; - if (cur_ix_masked + best_len > ring_buffer_mask || - prev_ix + best_len > ring_buffer_mask || + if (cur_ix_masked + best_len > ring_buffer_mask) { + break; + } + if (prev_ix + best_len > ring_buffer_mask || data[cur_ix_masked + best_len] != data[prev_ix + best_len]) { continue; } @@ -211,9 +221,12 @@ static BROTLI_INLINE void FN(FindLongestMatch)( } } } + /* we require matches of len >4, so increase best_len to 3, so we can compare + * 4 bytes all the time. */ + if (best_len < 3) { + best_len = 3; + } { - const size_t key = FN(HashBytes)(&data[cur_ix_masked], self->hash_mul_); - uint32_t* BROTLI_RESTRICT bucket = &buckets[key << self->block_bits_]; const size_t down = (num[key] > self->block_size_) ? (num[key] - self->block_size_) : 0u; @@ -228,9 +241,13 @@ static BROTLI_INLINE void FN(FindLongestMatch)( break; } prev_ix &= ring_buffer_mask; - if (cur_ix_masked + best_len > ring_buffer_mask || - prev_ix + best_len > ring_buffer_mask || - data[cur_ix_masked + best_len] != data[prev_ix + best_len]) { + if (cur_ix_masked + best_len > ring_buffer_mask) { + break; + } + if (prev_ix + best_len > ring_buffer_mask || + /* compare 4 bytes ending at best_len + 1 */ + BrotliUnalignedRead32(&data[cur_ix_masked + best_len - 3]) != + BrotliUnalignedRead32(&data[prev_ix + best_len - 3])) { continue; } current4 = BrotliUnalignedRead32(data + prev_ix); diff --git a/deps/brotli/c/enc/hash_longest_match64_simd_inc.h b/deps/brotli/c/enc/hash_longest_match64_simd_inc.h new file mode 100644 index 00000000000000..12bd8cffdff99b --- /dev/null +++ b/deps/brotli/c/enc/hash_longest_match64_simd_inc.h @@ -0,0 +1,304 @@ +/* NOLINT(build/header_guard) */ +/* Copyright 2010 Google Inc. All Rights Reserved. + + Distributed under MIT license. + See file LICENSE for detail or copy at https://opensource.org/licenses/MIT +*/ + +/* template parameters: FN */ + +/* A (forgetful) hash table to the data seen by the compressor, to + help create backward references to previous data. + + This is a hash map of fixed size (bucket_size_) to a ring buffer of + fixed size (block_size_). The ring buffer contains the last block_size_ + index positions of the given hash key in the compressed data. */ + +#define HashLongestMatch HASHER() + +#define TAG_HASH_BITS 8 +#define TAG_HASH_MASK ((1 << TAG_HASH_BITS) - 1) + +static BROTLI_INLINE size_t FN(HashTypeLength)(void) { return 8; } +static BROTLI_INLINE size_t FN(StoreLookahead)(void) { return 8; } + +/* HashBytes is the function that chooses the bucket to place the address in. */ +static BROTLI_INLINE size_t FN(HashBytes)(const uint8_t* BROTLI_RESTRICT data, + uint64_t hash_mul) { + const uint64_t h = BROTLI_UNALIGNED_LOAD64LE(data) * hash_mul; + /* The higher bits contain more mixture from the multiplication, + so we take our results from there. */ + return (size_t)(h >> (64 - 15 - TAG_HASH_BITS)); +} + +typedef struct HashLongestMatch { + /* Number of hash buckets. */ + size_t bucket_size_; + /* Only block_size_ newest backward references are kept, + and the older are forgotten. */ + size_t block_size_; + /* Hash multiplier tuned to match length. */ + uint64_t hash_mul_; + /* Mask for accessing entries in a block (in a ring-buffer manner). */ + uint32_t block_mask_; + + int block_bits_; + int num_last_distances_to_check_; + + /* Shortcuts. */ + HasherCommon* common_; + + /* --- Dynamic size members --- */ + + /* Number of entries in a particular bucket. */ + uint16_t* num_; /* uint16_t[bucket_size]; */ + + uint8_t* tags_; + + /* Buckets containing block_size_ of backward references. */ + uint32_t* buckets_; /* uint32_t[bucket_size * block_size]; */ +} HashLongestMatch; + +static void FN(Initialize)( + HasherCommon* common, HashLongestMatch* BROTLI_RESTRICT self, + const BrotliEncoderParams* params) { + self->common_ = common; + + BROTLI_UNUSED(params); + self->hash_mul_ = kHashMul64 << (64 - 5 * 8); + BROTLI_DCHECK(common->params.bucket_bits == 15); + self->bucket_size_ = (size_t)1 << common->params.bucket_bits; + self->block_bits_ = common->params.block_bits; + self->block_size_ = (size_t)1 << common->params.block_bits; + self->block_mask_ = (uint32_t)(self->block_size_ - 1); + self->num_last_distances_to_check_ = + common->params.num_last_distances_to_check; + self->num_ = (uint16_t*)common->extra[0]; + self->tags_ = (uint8_t*)common->extra[1]; + self->buckets_ = (uint32_t*)common->extra[2]; +} + +static void FN(Prepare)( + HashLongestMatch* BROTLI_RESTRICT self, BROTLI_BOOL one_shot, + size_t input_size, const uint8_t* BROTLI_RESTRICT data) { + uint16_t* BROTLI_RESTRICT num = self->num_; + /* Partial preparation is 100 times slower (per socket). */ + size_t partial_prepare_threshold = self->bucket_size_ >> 6; + if (one_shot && input_size <= partial_prepare_threshold) { + size_t i; + for (i = 0; i < input_size; ++i) { + const size_t hash = FN(HashBytes)(&data[i], self->hash_mul_); + const size_t key = hash >> TAG_HASH_BITS; + num[key] = 65535; + } + } else { + /* Set all the bytes of num to 255, which makes each uint16_t 65535. */ + memset(num, 255, self->bucket_size_ * sizeof(num[0])); + } +} + +static BROTLI_INLINE void FN(HashMemAllocInBytes)( + const BrotliEncoderParams* params, BROTLI_BOOL one_shot, + size_t input_size, size_t* alloc_size) { + size_t bucket_size = (size_t)1 << params->hasher.bucket_bits; + size_t block_size = (size_t)1 << params->hasher.block_bits; + BROTLI_UNUSED(one_shot); + BROTLI_UNUSED(input_size); + alloc_size[0] = sizeof(uint16_t) * bucket_size; + alloc_size[1] = sizeof(uint8_t) * bucket_size * block_size; + alloc_size[2] = sizeof(uint32_t) * bucket_size * block_size; +} + +/* Look at 4 bytes at &data[ix & mask]. + Compute a hash from these, and store the value of ix at that position. */ +static BROTLI_INLINE void FN(Store)( + HashLongestMatch* BROTLI_RESTRICT self, const uint8_t* BROTLI_RESTRICT data, + const size_t mask, const size_t ix) { + uint16_t* BROTLI_RESTRICT num = self->num_; + uint8_t* BROTLI_RESTRICT tags = self->tags_; + uint32_t* BROTLI_RESTRICT buckets = self->buckets_; + const size_t hash = FN(HashBytes)(&data[ix & mask], self->hash_mul_); + const size_t key = hash >> TAG_HASH_BITS; + const uint8_t tag = hash & TAG_HASH_MASK; + const size_t minor_ix = num[key] & self->block_mask_; + const size_t offset = minor_ix + (key << self->block_bits_); + --num[key]; + buckets[offset] = (uint32_t)ix; + tags[offset] = tag; +} + +static BROTLI_INLINE void FN(StoreRange)(HashLongestMatch* BROTLI_RESTRICT self, + const uint8_t* BROTLI_RESTRICT data, const size_t mask, + const size_t ix_start, const size_t ix_end) { + size_t i; + for (i = ix_start; i < ix_end; ++i) { + FN(Store)(self, data, mask, i); + } +} + +static BROTLI_INLINE void FN(StitchToPreviousBlock)( + HashLongestMatch* BROTLI_RESTRICT self, + size_t num_bytes, size_t position, const uint8_t* ringbuffer, + size_t ringbuffer_mask) { + if (num_bytes >= FN(HashTypeLength)() - 1 && position >= 3) { + /* Prepare the hashes for three last bytes of the last write. + These could not be calculated before, since they require knowledge + of both the previous and the current block. */ + FN(Store)(self, ringbuffer, ringbuffer_mask, position - 3); + FN(Store)(self, ringbuffer, ringbuffer_mask, position - 2); + FN(Store)(self, ringbuffer, ringbuffer_mask, position - 1); + } +} + +static BROTLI_INLINE void FN(PrepareDistanceCache)( + HashLongestMatch* BROTLI_RESTRICT self, + int* BROTLI_RESTRICT distance_cache) { + PrepareDistanceCache(distance_cache, self->num_last_distances_to_check_); +} + +/* Find a longest backward match of &data[cur_ix] up to the length of + max_length and stores the position cur_ix in the hash table. + + REQUIRES: FN(PrepareDistanceCache) must be invoked for current distance cache + values; if this method is invoked repeatedly with the same distance + cache values, it is enough to invoke FN(PrepareDistanceCache) once. + + Does not look for matches longer than max_length. + Does not look for matches further away than max_backward. + Writes the best match into |out|. + |out|->score is updated only if a better match is found. */ +static BROTLI_INLINE void FN(FindLongestMatch)( + HashLongestMatch* BROTLI_RESTRICT self, + const BrotliEncoderDictionary* dictionary, + const uint8_t* BROTLI_RESTRICT data, const size_t ring_buffer_mask, + const int* BROTLI_RESTRICT distance_cache, const size_t cur_ix, + const size_t max_length, const size_t max_backward, + const size_t dictionary_distance, const size_t max_distance, + HasherSearchResult* BROTLI_RESTRICT out) { + uint16_t* BROTLI_RESTRICT num = self->num_; + uint32_t* BROTLI_RESTRICT buckets = self->buckets_; + uint8_t* BROTLI_RESTRICT tags = self->tags_; + const size_t cur_ix_masked = cur_ix & ring_buffer_mask; + /* Don't accept a short copy from far away. */ + score_t min_score = out->score; + score_t best_score = out->score; + size_t best_len = out->len; + size_t i; + /* Precalculate the hash key and prefetch the bucket. */ + const size_t hash = FN(HashBytes)(&data[cur_ix_masked], self->hash_mul_); + const size_t key = hash >> TAG_HASH_BITS; + uint32_t* BROTLI_RESTRICT bucket = &buckets[key << self->block_bits_]; + uint8_t* BROTLI_RESTRICT tag_bucket = &tags[key << self->block_bits_]; + PREFETCH_L1(bucket); + PREFETCH_L1(tag_bucket); + if (self->block_bits_ > 4) PREFETCH_L1(bucket + 16); + out->len = 0; + out->len_code_delta = 0; + + BROTLI_DCHECK(cur_ix_masked + max_length <= ring_buffer_mask); + + /* Try last distance first. */ + for (i = 0; i < (size_t)self->num_last_distances_to_check_; ++i) { + const size_t backward = (size_t)distance_cache[i]; + size_t prev_ix = (size_t)(cur_ix - backward); + if (prev_ix >= cur_ix) { + continue; + } + if (BROTLI_PREDICT_FALSE(backward > max_backward)) { + continue; + } + prev_ix &= ring_buffer_mask; + + if (cur_ix_masked + best_len > ring_buffer_mask) { + break; + } + if (prev_ix + best_len > ring_buffer_mask || + data[cur_ix_masked + best_len] != data[prev_ix + best_len]) { + continue; + } + { + const size_t len = FindMatchLengthWithLimit(&data[prev_ix], + &data[cur_ix_masked], + max_length); + if (len >= 3 || (len == 2 && i < 2)) { + /* Comparing for >= 2 does not change the semantics, but just saves for + a few unnecessary binary logarithms in backward reference score, + since we are not interested in such short matches. */ + score_t score = BackwardReferenceScoreUsingLastDistance(len); + if (best_score < score) { + if (i != 0) score -= BackwardReferencePenaltyUsingLastDistance(i); + if (best_score < score) { + best_score = score; + best_len = len; + out->len = best_len; + out->distance = backward; + out->score = best_score; + } + } + } + } + } + /* we require matches of len >4, so increase best_len to 3, so we can compare + * 4 bytes all the time. */ + if (best_len < 3) { + best_len = 3; + } + { + const uint8_t tag = hash & TAG_HASH_MASK; + const uint32_t first4 = BrotliUnalignedRead32(data + cur_ix_masked); + const size_t max_length_m4 = max_length - 4; + const size_t head = (num[key] + 1) & self->block_mask_; + uint64_t matches = + GetMatchingTagMask(self->block_size_ / 16, tag, tag_bucket, head); + /* Mask off any matches from uninitialized tags. */ + uint16_t n = 65535 - num[key]; + uint64_t block_has_unused_slots = self->block_size_ > n; + uint64_t mask = (block_has_unused_slots << (n & (64 - 1))) - 1; + matches &= mask; + for (; matches > 0; matches &= (matches - 1)) { + const size_t rb_index = + (head + (size_t)BROTLI_TZCNT64(matches)) & self->block_mask_; + size_t prev_ix = bucket[rb_index]; + uint32_t current4; + const size_t backward = cur_ix - prev_ix; + if (BROTLI_PREDICT_FALSE(backward > max_backward)) { + break; + } + prev_ix &= ring_buffer_mask; + if (cur_ix_masked + best_len > ring_buffer_mask) { + break; + } + if (prev_ix + best_len > ring_buffer_mask || + /* compare 4 bytes ending at best_len + 1 */ + BrotliUnalignedRead32(&data[cur_ix_masked + best_len - 3]) != + BrotliUnalignedRead32(&data[prev_ix + best_len - 3])) { + continue; + } + current4 = BrotliUnalignedRead32(data + prev_ix); + if (first4 != current4) continue; + { + const size_t len = FindMatchLengthWithLimit(&data[prev_ix + 4], + &data[cur_ix_masked + 4], + max_length_m4) + 4; + const score_t score = BackwardReferenceScore(len, backward); + if (best_score < score) { + best_score = score; + best_len = len; + out->len = best_len; + out->distance = backward; + out->score = best_score; + } + } + } + bucket[num[key] & self->block_mask_] = (uint32_t)cur_ix; + tag_bucket[num[key] & self->block_mask_] = tag; + --num[key]; + } + if (min_score == out->score) { + SearchInStaticDictionary(dictionary, + self->common_, &data[cur_ix_masked], max_length, dictionary_distance, + max_distance, out, BROTLI_FALSE); + } +} + +#undef HashLongestMatch diff --git a/deps/brotli/c/enc/hash_longest_match_inc.h b/deps/brotli/c/enc/hash_longest_match_inc.h index 788e9ef993756f..58e88b3a609c42 100644 --- a/deps/brotli/c/enc/hash_longest_match_inc.h +++ b/deps/brotli/c/enc/hash_longest_match_inc.h @@ -104,11 +104,13 @@ static BROTLI_INLINE void FN(HashMemAllocInBytes)( static BROTLI_INLINE void FN(Store)( HashLongestMatch* BROTLI_RESTRICT self, const uint8_t* BROTLI_RESTRICT data, const size_t mask, const size_t ix) { + uint16_t* BROTLI_RESTRICT num = self->num_; + uint32_t* BROTLI_RESTRICT buckets = self->buckets_; const uint32_t key = FN(HashBytes)(&data[ix & mask], self->hash_shift_); - const size_t minor_ix = self->num_[key] & self->block_mask_; + const size_t minor_ix = num[key] & self->block_mask_; const size_t offset = minor_ix + (key << self->block_bits_); - self->buckets_[offset] = (uint32_t)ix; - ++self->num_[key]; + ++num[key]; + buckets[offset] = (uint32_t)ix; } static BROTLI_INLINE void FN(StoreRange)(HashLongestMatch* BROTLI_RESTRICT self, @@ -167,8 +169,17 @@ static BROTLI_INLINE void FN(FindLongestMatch)( score_t best_score = out->score; size_t best_len = out->len; size_t i; + /* Precalculate the hash key and prefetch the bucket. */ + const uint32_t key = + FN(HashBytes)(&data[cur_ix_masked], self->hash_shift_); + uint32_t* BROTLI_RESTRICT bucket = &buckets[key << self->block_bits_]; + PREFETCH_L1(bucket); + if (self->block_bits_ > 4) PREFETCH_L1(bucket + 16); out->len = 0; out->len_code_delta = 0; + + BROTLI_DCHECK(cur_ix_masked + max_length <= ring_buffer_mask); + /* Try last distance first. */ for (i = 0; i < (size_t)self->num_last_distances_to_check_; ++i) { const size_t backward = (size_t)distance_cache[i]; @@ -181,8 +192,10 @@ static BROTLI_INLINE void FN(FindLongestMatch)( } prev_ix &= ring_buffer_mask; - if (cur_ix_masked + best_len > ring_buffer_mask || - prev_ix + best_len > ring_buffer_mask || + if (cur_ix_masked + best_len > ring_buffer_mask) { + break; + } + if (prev_ix + best_len > ring_buffer_mask || data[cur_ix_masked + best_len] != data[prev_ix + best_len]) { continue; } @@ -208,10 +221,12 @@ static BROTLI_INLINE void FN(FindLongestMatch)( } } } + /* we require matches of len >4, so increase best_len to 3, so we can compare + * 4 bytes all the time. */ + if (best_len < 3) { + best_len = 3; + } { - const uint32_t key = - FN(HashBytes)(&data[cur_ix_masked], self->hash_shift_); - uint32_t* BROTLI_RESTRICT bucket = &buckets[key << self->block_bits_]; const size_t down = (num[key] > self->block_size_) ? (num[key] - self->block_size_) : 0u; for (i = num[key]; i > down;) { @@ -221,9 +236,13 @@ static BROTLI_INLINE void FN(FindLongestMatch)( break; } prev_ix &= ring_buffer_mask; - if (cur_ix_masked + best_len > ring_buffer_mask || - prev_ix + best_len > ring_buffer_mask || - data[cur_ix_masked + best_len] != data[prev_ix + best_len]) { + if (cur_ix_masked + best_len > ring_buffer_mask) { + break; + } + if (prev_ix + best_len > ring_buffer_mask || + /* compare 4 bytes ending at best_len + 1 */ + BrotliUnalignedRead32(&data[cur_ix_masked + best_len - 3]) != + BrotliUnalignedRead32(&data[prev_ix + best_len - 3])) { continue; } { diff --git a/deps/brotli/c/enc/hash_longest_match_quickly_inc.h b/deps/brotli/c/enc/hash_longest_match_quickly_inc.h index 54397ef8917074..57ed586fee4061 100644 --- a/deps/brotli/c/enc/hash_longest_match_quickly_inc.h +++ b/deps/brotli/c/enc/hash_longest_match_quickly_inc.h @@ -155,6 +155,7 @@ static BROTLI_INLINE void FN(FindLongestMatch)( uint32_t* BROTLI_RESTRICT buckets = self->buckets_; const size_t best_len_in = out->len; const size_t cur_ix_masked = cur_ix & ring_buffer_mask; + /* TODO: compare 4 bytes at once (and set the minimum best len to 4) */ int compare_char = data[cur_ix_masked + best_len_in]; size_t key = FN(HashBytes)(&data[cur_ix_masked]); size_t key_out; @@ -163,6 +164,9 @@ static BROTLI_INLINE void FN(FindLongestMatch)( size_t best_len = best_len_in; size_t cached_backward = (size_t)distance_cache[0]; size_t prev_ix = cur_ix - cached_backward; + + BROTLI_DCHECK(cur_ix_masked + max_length <= ring_buffer_mask); + out->len_code_delta = 0; if (prev_ix < cur_ix) { prev_ix &= (uint32_t)ring_buffer_mask; diff --git a/deps/brotli/c/enc/hash_longest_match_simd_inc.h b/deps/brotli/c/enc/hash_longest_match_simd_inc.h new file mode 100644 index 00000000000000..79b341ae51ebe3 --- /dev/null +++ b/deps/brotli/c/enc/hash_longest_match_simd_inc.h @@ -0,0 +1,278 @@ +/* NOLINT(build/header_guard) */ +/* Copyright 2010 Google Inc. All Rights Reserved. + Distributed under MIT license. + See file LICENSE for detail or copy at https://opensource.org/licenses/MIT +*/ +/* template parameters: FN */ +/* A (forgetful) hash table to the data seen by the compressor, to + help create backward references to previous data. + This is a hash map of fixed size (bucket_size_) to a ring buffer of + fixed size (block_size_). The ring buffer contains the last block_size_ + index positions of the given hash key in the compressed data. */ +#define HashLongestMatch HASHER() +#define TAG_HASH_BITS 8 +#define TAG_HASH_MASK ((1 << TAG_HASH_BITS) - 1) +static BROTLI_INLINE size_t FN(HashTypeLength)(void) { return 4; } +static BROTLI_INLINE size_t FN(StoreLookahead)(void) { return 4; } +/* HashBytes is the function that chooses the bucket to place the address in. */ +static uint32_t FN(HashBytes)( + const uint8_t* BROTLI_RESTRICT data, const int shift) { + uint32_t h = BROTLI_UNALIGNED_LOAD32LE(data) * kHashMul32; + /* The higher bits contain more mixture from the multiplication, + so we take our results from there. */ + return (uint32_t)(h >> shift); +} +typedef struct HashLongestMatch { + /* Number of hash buckets. */ + size_t bucket_size_; + /* Only block_size_ newest backward references are kept, + and the older are forgotten. */ + size_t block_size_; + /* Left-shift for computing hash bucket index from hash value. */ + int hash_shift_; + /* Mask for accessing entries in a block (in a ring-buffer manner). */ + uint32_t block_mask_; + int block_bits_; + int num_last_distances_to_check_; + /* Shortcuts. */ + HasherCommon* common_; + /* --- Dynamic size members --- */ + /* Number of entries in a particular bucket. */ + uint16_t* num_; /* uint16_t[bucket_size]; */ + uint8_t* tags_; + /* Buckets containing block_size_ of backward references. */ + uint32_t* buckets_; /* uint32_t[bucket_size * block_size]; */ +} HashLongestMatch; +static void FN(Initialize)( + HasherCommon* common, HashLongestMatch* BROTLI_RESTRICT self, + const BrotliEncoderParams* params) { + self->common_ = common; + BROTLI_UNUSED(params); + self->hash_shift_ = 32 - common->params.bucket_bits - TAG_HASH_BITS; + self->bucket_size_ = (size_t)1 << common->params.bucket_bits; + self->block_size_ = (size_t)1 << common->params.block_bits; + self->block_mask_ = (uint32_t)(self->block_size_ - 1); + self->num_ = (uint16_t*)common->extra[0]; + self->tags_ = (uint8_t*)common->extra[1]; + self->buckets_ = (uint32_t*)common->extra[2]; + self->block_bits_ = common->params.block_bits; + self->num_last_distances_to_check_ = + common->params.num_last_distances_to_check; +} +static void FN(Prepare)( + HashLongestMatch* BROTLI_RESTRICT self, BROTLI_BOOL one_shot, + size_t input_size, const uint8_t* BROTLI_RESTRICT data) { + uint16_t* BROTLI_RESTRICT num = self->num_; + /* Partial preparation is 100 times slower (per socket). */ + size_t partial_prepare_threshold = self->bucket_size_ >> 6; + if (one_shot && input_size <= partial_prepare_threshold) { + size_t i; + for (i = 0; i < input_size; ++i) { + const uint32_t hash = FN(HashBytes)(&data[i], self->hash_shift_); + const uint32_t key = hash >> TAG_HASH_BITS; + num[key] = 65535; + } + } else { + /* Set all the bytes of num to 255, which makes each uint16_t 65535. */ + memset(num, 255, self->bucket_size_ * sizeof(num[0])); + } +} +static BROTLI_INLINE void FN(HashMemAllocInBytes)( + const BrotliEncoderParams* params, BROTLI_BOOL one_shot, + size_t input_size, size_t* alloc_size) { + size_t bucket_size = (size_t)1 << params->hasher.bucket_bits; + size_t block_size = (size_t)1 << params->hasher.block_bits; + BROTLI_UNUSED(one_shot); + BROTLI_UNUSED(input_size); + alloc_size[0] = sizeof(uint16_t) * bucket_size; + alloc_size[1] = sizeof(uint8_t) * bucket_size * block_size; + alloc_size[2] = sizeof(uint32_t) * bucket_size * block_size; +} +/* Look at 4 bytes at &data[ix & mask]. + Compute a hash from these, and store the value of ix at that position. */ +static BROTLI_INLINE void FN(Store)( + HashLongestMatch* BROTLI_RESTRICT self, const uint8_t* BROTLI_RESTRICT data, + const size_t mask, const size_t ix) { + uint16_t* BROTLI_RESTRICT num = self->num_; + uint8_t* BROTLI_RESTRICT tags = self->tags_; + uint32_t* BROTLI_RESTRICT buckets = self->buckets_; + const size_t hash = FN(HashBytes)(&data[ix & mask], self->hash_shift_); + const size_t key = hash >> TAG_HASH_BITS; + const uint8_t tag = hash & TAG_HASH_MASK; + const size_t minor_ix = num[key] & self->block_mask_; + const size_t offset = minor_ix + (key << self->block_bits_); + --num[key]; + buckets[offset] = (uint32_t)ix; + tags[offset] = tag; +} +static BROTLI_INLINE void FN(StoreRange)(HashLongestMatch* BROTLI_RESTRICT self, + const uint8_t* BROTLI_RESTRICT data, const size_t mask, + const size_t ix_start, const size_t ix_end) { + size_t i; + for (i = ix_start; i < ix_end; ++i) { + FN(Store)(self, data, mask, i); + } +} +static BROTLI_INLINE void FN(StitchToPreviousBlock)( + HashLongestMatch* BROTLI_RESTRICT self, + size_t num_bytes, size_t position, const uint8_t* ringbuffer, + size_t ringbuffer_mask) { + if (num_bytes >= FN(HashTypeLength)() - 1 && position >= 3) { + /* Prepare the hashes for three last bytes of the last write. + These could not be calculated before, since they require knowledge + of both the previous and the current block. */ + FN(Store)(self, ringbuffer, ringbuffer_mask, position - 3); + FN(Store)(self, ringbuffer, ringbuffer_mask, position - 2); + FN(Store)(self, ringbuffer, ringbuffer_mask, position - 1); + } +} +static BROTLI_INLINE void FN(PrepareDistanceCache)( + HashLongestMatch* BROTLI_RESTRICT self, + int* BROTLI_RESTRICT distance_cache) { + PrepareDistanceCache(distance_cache, self->num_last_distances_to_check_); +} + +/* Find a longest backward match of &data[cur_ix] up to the length of + max_length and stores the position cur_ix in the hash table. + REQUIRES: FN(PrepareDistanceCache) must be invoked for current distance cache + values; if this method is invoked repeatedly with the same distance + cache values, it is enough to invoke FN(PrepareDistanceCache) once. + Does not look for matches longer than max_length. + Does not look for matches further away than max_backward. + Writes the best match into |out|. + |out|->score is updated only if a better match is found. */ +static BROTLI_INLINE void FN(FindLongestMatch)( + HashLongestMatch* BROTLI_RESTRICT self, + const BrotliEncoderDictionary* dictionary, + const uint8_t* BROTLI_RESTRICT data, const size_t ring_buffer_mask, + const int* BROTLI_RESTRICT distance_cache, const size_t cur_ix, + const size_t max_length, const size_t max_backward, + const size_t dictionary_distance, const size_t max_distance, + HasherSearchResult* BROTLI_RESTRICT out) { + uint16_t* BROTLI_RESTRICT num = self->num_; + uint32_t* BROTLI_RESTRICT buckets = self->buckets_; + uint8_t* BROTLI_RESTRICT tags = self->tags_; + const size_t cur_ix_masked = cur_ix & ring_buffer_mask; + /* Don't accept a short copy from far away. */ + score_t min_score = out->score; + score_t best_score = out->score; + size_t best_len = out->len; + size_t i; + /* Precalculate the hash key and prefetch the bucket. */ + const uint32_t hash = + FN(HashBytes)(&data[cur_ix_masked], self->hash_shift_); + const uint32_t key = hash >> TAG_HASH_BITS; + uint32_t* BROTLI_RESTRICT bucket = &buckets[key << self->block_bits_]; + uint8_t* BROTLI_RESTRICT tag_bucket = &tags[key << self->block_bits_]; + PREFETCH_L1(bucket); + PREFETCH_L1(tag_bucket); + if (self->block_bits_ > 4) PREFETCH_L1(bucket + 16); + out->len = 0; + out->len_code_delta = 0; + + BROTLI_DCHECK(cur_ix_masked + max_length <= ring_buffer_mask); + + /* Try last distance first. */ + for (i = 0; i < (size_t)self->num_last_distances_to_check_; ++i) { + const size_t backward = (size_t)distance_cache[i]; + size_t prev_ix = (size_t)(cur_ix - backward); + if (prev_ix >= cur_ix) { + continue; + } + if (BROTLI_PREDICT_FALSE(backward > max_backward)) { + continue; + } + prev_ix &= ring_buffer_mask; + + if (cur_ix_masked + best_len > ring_buffer_mask) { + break; + } + if (prev_ix + best_len > ring_buffer_mask || + data[cur_ix_masked + best_len] != data[prev_ix + best_len]) { + continue; + } + { + const size_t len = FindMatchLengthWithLimit(&data[prev_ix], + &data[cur_ix_masked], + max_length); + if (len >= 3 || (len == 2 && i < 2)) { + /* Comparing for >= 2 does not change the semantics, but just saves for + a few unnecessary binary logarithms in backward reference score, + since we are not interested in such short matches. */ + score_t score = BackwardReferenceScoreUsingLastDistance(len); + if (best_score < score) { + if (i != 0) score -= BackwardReferencePenaltyUsingLastDistance(i); + if (best_score < score) { + best_score = score; + best_len = len; + out->len = best_len; + out->distance = backward; + out->score = best_score; + } + } + } + } + } + /* we require matches of len >4, so increase best_len to 3, so we can compare + * 4 bytes all the time. */ + if (best_len < 3) { + best_len = 3; + } + { + const uint8_t tag = hash & TAG_HASH_MASK; + const size_t head = (num[key] + 1) & self->block_mask_; + uint64_t matches = + GetMatchingTagMask(self->block_size_ / 16, tag, tag_bucket, head); + /* Mask off any matches from uninitialized tags. */ + uint16_t n = 65535 - num[key]; + uint64_t block_has_unused_slots = self->block_size_ > n; + uint64_t mask = (block_has_unused_slots << (n & (64 - 1))) - 1; + matches &= mask; + for (; matches > 0; matches &= (matches - 1)) { + const size_t rb_index = + (head + (size_t)BROTLI_TZCNT64(matches)) & self->block_mask_; + size_t prev_ix = bucket[rb_index]; + const size_t backward = cur_ix - prev_ix; + if (BROTLI_PREDICT_FALSE(backward > max_backward)) { + break; + } + prev_ix &= ring_buffer_mask; + if (cur_ix_masked + best_len > ring_buffer_mask) { + break; + } + if (prev_ix + best_len > ring_buffer_mask || + /* compare 4 bytes ending at best_len + 1 */ + BrotliUnalignedRead32(&data[cur_ix_masked + best_len - 3]) != + BrotliUnalignedRead32(&data[prev_ix + best_len - 3])) { + continue; + } + { + const size_t len = FindMatchLengthWithLimit(&data[prev_ix], + &data[cur_ix_masked], + max_length); + if (len >= 4) { + /* Comparing for >= 3 does not change the semantics, but just saves + for a few unnecessary binary logarithms in backward reference + score, since we are not interested in such short matches. */ + score_t score = BackwardReferenceScore(len, backward); + if (best_score < score) { + best_score = score; + best_len = len; + out->len = best_len; + out->distance = backward; + out->score = best_score; + } + } + } + } + bucket[num[key] & self->block_mask_] = (uint32_t)cur_ix; + tag_bucket[num[key] & self->block_mask_] = tag; + --num[key]; + } + if (min_score == out->score) { + SearchInStaticDictionary(dictionary, + self->common_, &data[cur_ix_masked], max_length, dictionary_distance, + max_distance, out, BROTLI_FALSE); + } +} +#undef HashLongestMatch diff --git a/deps/brotli/c/enc/histogram.c b/deps/brotli/c/enc/histogram.c index 4dbb87f9070ecf..43e4b38e38e244 100644 --- a/deps/brotli/c/enc/histogram.c +++ b/deps/brotli/c/enc/histogram.c @@ -9,6 +9,7 @@ #include "histogram.h" #include "../common/context.h" +#include "../common/platform.h" #include "block_splitter.h" #include "command.h" diff --git a/deps/brotli/c/enc/histogram.h b/deps/brotli/c/enc/histogram.h index d1abd973c18e46..a2accc3313f2a7 100644 --- a/deps/brotli/c/enc/histogram.h +++ b/deps/brotli/c/enc/histogram.h @@ -9,10 +9,6 @@ #ifndef BROTLI_ENC_HISTOGRAM_H_ #define BROTLI_ENC_HISTOGRAM_H_ -#include /* memset */ - -#include - #include "../common/constants.h" #include "../common/context.h" #include "../common/platform.h" diff --git a/deps/brotli/c/enc/literal_cost.c b/deps/brotli/c/enc/literal_cost.c index 2ac847f3c98f6c..c4e207d09b6900 100644 --- a/deps/brotli/c/enc/literal_cost.c +++ b/deps/brotli/c/enc/literal_cost.c @@ -9,10 +9,6 @@ #include "literal_cost.h" -#include /* memset */ - -#include - #include "../common/platform.h" #include "fast_log.h" #include "utf8_util.h" @@ -106,6 +102,8 @@ static void EstimateBitCostsForLiteralsUTF8(size_t pos, size_t len, size_t mask, size_t utf8_pos = UTF8Position(last_c, c, max_utf8); size_t masked_pos = (pos + i) & mask; size_t histo = histogram[256 * utf8_pos + data[masked_pos]]; + static const size_t prologue_length = 2000; + static const double multiplier = 0.35 / 2000; double lit_cost; if (histo == 0) { histo = 1; @@ -120,8 +118,8 @@ static void EstimateBitCostsForLiteralsUTF8(size_t pos, size_t len, size_t mask, Perhaps because the entropy source is changing its properties rapidly in the beginning of the file, perhaps because the beginning of the data is a statistical "anomaly". */ - if (i < 2000) { - lit_cost += 0.7 - ((double)(2000 - i) / 2000.0 * 0.35); + if (i < prologue_length) { + lit_cost += 0.35 + multiplier * (double)i; } cost[i] = (float)lit_cost; } diff --git a/deps/brotli/c/enc/literal_cost.h b/deps/brotli/c/enc/literal_cost.h index 284a8e5af73155..eb3f3383684aea 100644 --- a/deps/brotli/c/enc/literal_cost.h +++ b/deps/brotli/c/enc/literal_cost.h @@ -10,8 +10,6 @@ #ifndef BROTLI_ENC_LITERAL_COST_H_ #define BROTLI_ENC_LITERAL_COST_H_ -#include - #include "../common/platform.h" #if defined(__cplusplus) || defined(c_plusplus) diff --git a/deps/brotli/c/enc/matching_tag_mask.h b/deps/brotli/c/enc/matching_tag_mask.h new file mode 100644 index 00000000000000..8a1be1d71080cc --- /dev/null +++ b/deps/brotli/c/enc/matching_tag_mask.h @@ -0,0 +1,69 @@ +#ifndef THIRD_PARTY_BROTLI_ENC_MATCHING_TAG_MASK_H_ +#define THIRD_PARTY_BROTLI_ENC_MATCHING_TAG_MASK_H_ + +#include "../common/platform.h" + +#if defined(__SSE2__) || defined(_M_AMD64) || \ + (defined(_M_IX86) && defined(_M_IX86_FP) && (_M_IX86_FP >= 2)) +#define SUPPORTS_SSE_2 +#endif + +#if defined(SUPPORTS_SSE_2) +#include +#endif + + +static BROTLI_INLINE uint64_t GetMatchingTagMask( + size_t chunk_count, const uint8_t tag, + const uint8_t* BROTLI_RESTRICT tag_bucket, const size_t head) { + uint64_t matches = 0; +#if defined(SUPPORTS_SSE_2) + const __m128i comparison_mask = _mm_set1_epi8((char)tag); + size_t i; + for (i = 0; i < chunk_count && i < 4; i++) { + const __m128i chunk = + _mm_loadu_si128((const __m128i*)(const void*)(tag_bucket + 16 * i)); + const __m128i equal_mask = _mm_cmpeq_epi8(chunk, comparison_mask); + matches |= (uint64_t)_mm_movemask_epi8(equal_mask) << 16 * i; + } +#else + const int chunk_size = sizeof(size_t); + const size_t shift_amount = ((chunk_size * 8) - chunk_size); + const size_t xFF = ~((size_t)0); + const size_t x01 = xFF / 0xFF; + const size_t x80 = x01 << 7; + const size_t splat_char = tag * x01; + int i = ((int)chunk_count * 16) - chunk_size; + BROTLI_DCHECK((sizeof(size_t) == 4) || (sizeof(size_t) == 8)); +#if BROTLI_LITTLE_ENDIAN + const size_t extractMagic = (xFF / 0x7F) >> chunk_size; + do { + size_t chunk = BrotliUnalignedReadSizeT(&tag_bucket[i]); + chunk ^= splat_char; + chunk = (((chunk | x80) - x01) | chunk) & x80; + matches <<= chunk_size; + matches |= (chunk * extractMagic) >> shift_amount; + i -= chunk_size; + } while (i >= 0); +#else + const size_t msb = xFF ^ (xFF >> 1); + const size_t extractMagic = (msb / 0x1FF) | msb; + do { + size_t chunk = BrotliUnalignedReadSizeT(&tag_bucket[i]); + chunk ^= splat_char; + chunk = (((chunk | x80) - x01) | chunk) & x80; + matches <<= chunk_size; + matches |= ((chunk >> 7) * extractMagic) >> shift_amount; + i -= chunk_size; + } while (i >= 0); +#endif + matches = ~matches; +#endif + if (chunk_count == 1) return BrotliRotateRight16((uint16_t)matches, head); + if (chunk_count == 2) return BrotliRotateRight32((uint32_t)matches, head); + return BrotliRotateRight64(matches, head); +} + +#undef SUPPORTS_SSE_2 + +#endif // THIRD_PARTY_BROTLI_ENC_MATCHING_TAG_MASK_H_ diff --git a/deps/brotli/c/enc/memory.c b/deps/brotli/c/enc/memory.c index bb5e364198e3fc..67f81ffde951b7 100644 --- a/deps/brotli/c/enc/memory.c +++ b/deps/brotli/c/enc/memory.c @@ -9,11 +9,6 @@ #include "memory.h" -#include /* exit, free, malloc */ -#include /* memcpy */ - -#include - #include "../common/platform.h" #if defined(__cplusplus) || defined(c_plusplus) diff --git a/deps/brotli/c/enc/memory.h b/deps/brotli/c/enc/memory.h index a4417df4cb2c07..d8374815bbaa5d 100644 --- a/deps/brotli/c/enc/memory.h +++ b/deps/brotli/c/enc/memory.h @@ -9,10 +9,6 @@ #ifndef BROTLI_ENC_MEMORY_H_ #define BROTLI_ENC_MEMORY_H_ -#include /* memcpy */ - -#include - #include "../common/platform.h" #if defined(__cplusplus) || defined(c_plusplus) diff --git a/deps/brotli/c/enc/metablock.c b/deps/brotli/c/enc/metablock.c index 0c5c078d05ea04..dfe8120c83e8d4 100644 --- a/deps/brotli/c/enc/metablock.c +++ b/deps/brotli/c/enc/metablock.c @@ -9,18 +9,18 @@ #include "metablock.h" -#include - #include "../common/constants.h" #include "../common/context.h" #include "../common/platform.h" #include "bit_cost.h" #include "block_splitter.h" #include "cluster.h" +#include "command.h" #include "entropy_encode.h" #include "histogram.h" #include "memory.h" -#include "quality.h" +#include "params.h" +#include "prefix.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { @@ -298,8 +298,6 @@ void BrotliBuildMetaBlock(MemoryManager* m, #include "metablock_inc.h" /* NOLINT(build/include) */ #undef FN -#define BROTLI_MAX_STATIC_CONTEXTS 13 - /* Greedy block splitter for one block category (literal, command or distance). Gathers histograms for all context buckets. */ typedef struct ContextBlockSplitter { @@ -400,7 +398,7 @@ static void ContextBlockSplitterFinishBlock( for (i = 0; i < num_contexts; ++i) { last_entropy[i] = - BitsEntropy(histograms[i].data_, self->alphabet_size_); + BrotliBitsEntropy(histograms[i].data_, self->alphabet_size_); last_entropy[num_contexts + i] = last_entropy[i]; } ++self->num_blocks_; @@ -426,15 +424,15 @@ static void ContextBlockSplitterFinishBlock( for (i = 0; i < num_contexts; ++i) { size_t curr_histo_ix = self->curr_histogram_ix_ + i; size_t j; - entropy[i] = BitsEntropy(histograms[curr_histo_ix].data_, - self->alphabet_size_); + entropy[i] = BrotliBitsEntropy(histograms[curr_histo_ix].data_, + self->alphabet_size_); for (j = 0; j < 2; ++j) { size_t jx = j * num_contexts + i; size_t last_histogram_ix = self->last_histogram_ix_[j] + i; combined_histo[jx] = histograms[curr_histo_ix]; HistogramAddHistogramLiteral(&combined_histo[jx], &histograms[last_histogram_ix]); - combined_entropy[jx] = BitsEntropy( + combined_entropy[jx] = BrotliBitsEntropy( &combined_histo[jx].data_[0], self->alphabet_size_); diff[j] += combined_entropy[jx] - entropy[i] - last_entropy[jx]; } diff --git a/deps/brotli/c/enc/metablock.h b/deps/brotli/c/enc/metablock.h index db38f8fd217a90..e7d10526d22fbf 100644 --- a/deps/brotli/c/enc/metablock.h +++ b/deps/brotli/c/enc/metablock.h @@ -10,20 +10,20 @@ #ifndef BROTLI_ENC_METABLOCK_H_ #define BROTLI_ENC_METABLOCK_H_ -#include - #include "../common/context.h" #include "../common/platform.h" #include "block_splitter.h" #include "command.h" #include "histogram.h" #include "memory.h" -#include "quality.h" +#include "params.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif +#define BROTLI_MAX_STATIC_CONTEXTS 13 + typedef struct MetaBlockSplit { BlockSplit literal_split; BlockSplit command_split; diff --git a/deps/brotli/c/enc/metablock_inc.h b/deps/brotli/c/enc/metablock_inc.h index f9393869ab1a66..e7a7bc82193baf 100644 --- a/deps/brotli/c/enc/metablock_inc.h +++ b/deps/brotli/c/enc/metablock_inc.h @@ -96,7 +96,7 @@ static void FN(BlockSplitterFinishBlock)( split->lengths[0] = (uint32_t)self->block_size_; split->types[0] = 0; last_entropy[0] = - BitsEntropy(histograms[0].data_, self->alphabet_size_); + BrotliBitsEntropy(histograms[0].data_, self->alphabet_size_); last_entropy[1] = last_entropy[0]; ++self->num_blocks_; ++split->num_types; @@ -105,8 +105,8 @@ static void FN(BlockSplitterFinishBlock)( FN(HistogramClear)(&histograms[self->curr_histogram_ix_]); self->block_size_ = 0; } else if (self->block_size_ > 0) { - double entropy = BitsEntropy(histograms[self->curr_histogram_ix_].data_, - self->alphabet_size_); + double entropy = BrotliBitsEntropy( + histograms[self->curr_histogram_ix_].data_, self->alphabet_size_); double combined_entropy[2]; double diff[2]; size_t j; @@ -115,7 +115,7 @@ static void FN(BlockSplitterFinishBlock)( self->combined_histo[j] = histograms[self->curr_histogram_ix_]; FN(HistogramAddHistogram)(&self->combined_histo[j], &histograms[last_histogram_ix]); - combined_entropy[j] = BitsEntropy( + combined_entropy[j] = BrotliBitsEntropy( &self->combined_histo[j].data_[0], self->alphabet_size_); diff[j] = combined_entropy[j] - entropy - last_entropy[j]; } diff --git a/deps/brotli/c/enc/params.h b/deps/brotli/c/enc/params.h index 78b2ab60828efd..fd1de0096cc495 100644 --- a/deps/brotli/c/enc/params.h +++ b/deps/brotli/c/enc/params.h @@ -10,7 +10,6 @@ #define BROTLI_ENC_PARAMS_H_ #include - #include "encoder_dict.h" typedef struct BrotliHasherParams { diff --git a/deps/brotli/c/enc/prefix.h b/deps/brotli/c/enc/prefix.h index 0f006f1614f7e5..24c0afc17135a3 100644 --- a/deps/brotli/c/enc/prefix.h +++ b/deps/brotli/c/enc/prefix.h @@ -10,8 +10,6 @@ #ifndef BROTLI_ENC_PREFIX_H_ #define BROTLI_ENC_PREFIX_H_ -#include - #include "../common/constants.h" #include "../common/platform.h" #include "fast_log.h" diff --git a/deps/brotli/c/enc/quality.h b/deps/brotli/c/enc/quality.h index ffdfd72fb4a170..45d67bf4000b53 100644 --- a/deps/brotli/c/enc/quality.h +++ b/deps/brotli/c/enc/quality.h @@ -10,9 +10,8 @@ #ifndef BROTLI_ENC_QUALITY_H_ #define BROTLI_ENC_QUALITY_H_ -#include - #include "../common/platform.h" +#include #include "params.h" #define FAST_ONE_PASS_COMPRESSION_QUALITY 0 @@ -128,16 +127,16 @@ static BROTLI_INLINE size_t LiteralSpreeLengthForSparseSearch( - q04: h04 (longest_match_quickly), b17, l5 - q04: h54 (longest_match_quickly), b20, l7 | for large files - - q05: h05 (longest_match ), b14, l4 - - q05: h06 (longest_match64 ), b15, l5 | for large files + - q05: h58 (longest_match_simd ), b14, l4 + - q05: h68 (longest_match64_simd ), b15, l5 | for large files - q05: h40 (forgetful_chain ), b15, l4 | for small window - - q06: h05 (longest_match ), b14, l4 - - q06: h06 (longest_match64 ), b15, l5 | for large files + - q06: h58 (longest_match_simd ), b14, l4 + - q06: h68 (longest_match64_simd ), b15, l5 | for large files - q06: h40 (forgetful_chain ), b15, l4 | for small window - - q07: h05 (longest_match ), b15, l4 - - q07: h06 (longest_match64 ), b15, l5 | for large files + - q07: h58 (longest_match_simd ), b15, l4 + - q07: h68 (longest_match64_simd ), b15, l5 | for large files - q07: h41 (forgetful_chain ), b15, l4 | for small window - q08: h05 (longest_match ), b15, l4 @@ -165,7 +164,11 @@ static BROTLI_INLINE void ChooseHasher(const BrotliEncoderParams* params, } else if (params->lgwin <= 16) { hparams->type = params->quality < 7 ? 40 : params->quality < 9 ? 41 : 42; } else if (params->size_hint >= (1 << 20) && params->lgwin >= 19) { +#if defined(BROTLI_MAX_SIMD_QUALITY) + hparams->type = params->quality <= BROTLI_MAX_SIMD_QUALITY ? 68 : 6; +#else hparams->type = 6; +#endif hparams->block_bits = params->quality - 1; hparams->bucket_bits = 15; hparams->num_last_distances_to_check = @@ -173,7 +176,11 @@ static BROTLI_INLINE void ChooseHasher(const BrotliEncoderParams* params, } else { /* TODO(eustas): often previous setting (H6) is faster and denser; consider adding an option to use it. */ +#if defined(BROTLI_MAX_SIMD_QUALITY) + hparams->type = params->quality <= BROTLI_MAX_SIMD_QUALITY ? 58 : 5; +#else hparams->type = 5; +#endif hparams->block_bits = params->quality - 1; hparams->bucket_bits = params->quality < 7 ? 14 : 15; hparams->num_last_distances_to_check = @@ -186,14 +193,14 @@ static BROTLI_INLINE void ChooseHasher(const BrotliEncoderParams* params, hasher already works well with large window. So the changes are: H3 --> H35: for quality 3. H54 --> H55: for quality 4 with size hint > 1MB - H6 --> H65: for qualities 5, 6, 7, 8, 9. */ + H6/H68 --> H65: for qualities 5, 6, 7, 8, 9. */ if (hparams->type == 3) { hparams->type = 35; } if (hparams->type == 54) { hparams->type = 55; } - if (hparams->type == 6) { + if (hparams->type == 6 || hparams->type == 68) { hparams->type = 65; } } diff --git a/deps/brotli/c/enc/ringbuffer.h b/deps/brotli/c/enc/ringbuffer.h index 27245b7f3906e4..5bb75ed7c25266 100644 --- a/deps/brotli/c/enc/ringbuffer.h +++ b/deps/brotli/c/enc/ringbuffer.h @@ -9,12 +9,9 @@ #ifndef BROTLI_ENC_RINGBUFFER_H_ #define BROTLI_ENC_RINGBUFFER_H_ -#include /* memcpy */ - -#include - #include "../common/platform.h" #include "memory.h" +#include "params.h" #include "quality.h" #if defined(__cplusplus) || defined(c_plusplus) diff --git a/deps/brotli/c/enc/state.h b/deps/brotli/c/enc/state.h index cb82987701ffbe..325f9f3dd627ab 100644 --- a/deps/brotli/c/enc/state.h +++ b/deps/brotli/c/enc/state.h @@ -9,8 +9,8 @@ #ifndef BROTLI_ENC_STATE_H_ #define BROTLI_ENC_STATE_H_ -#include - +#include "../common/constants.h" +#include "../common/platform.h" #include "command.h" #include "compress_fragment.h" #include "compress_fragment_two_pass.h" diff --git a/deps/brotli/c/enc/static_dict.c b/deps/brotli/c/enc/static_dict.c index 291d2833546921..85467460072a8d 100644 --- a/deps/brotli/c/enc/static_dict.c +++ b/deps/brotli/c/enc/static_dict.c @@ -11,18 +11,12 @@ #include "../common/transform.h" #include "encoder_dict.h" #include "find_match_length.h" +#include "hash_base.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif -static BROTLI_INLINE uint32_t Hash(const uint8_t* data) { - uint32_t h = BROTLI_UNALIGNED_LOAD32LE(data) * kDictHashMul32; - /* The higher bits contain more mixture from the multiplication, - so we take our results from there. */ - return h >> (32 - kDictNumBits); -} - static BROTLI_INLINE void AddMatch(size_t distance, size_t len, size_t len_code, uint32_t* matches) { uint32_t match = (uint32_t)((distance << 5) + len_code); @@ -96,7 +90,7 @@ static BROTLI_BOOL BrotliFindAllStaticDictionaryMatchesFor( } #endif /* BROTLI_EXPERIMENTAL */ { - size_t offset = dictionary->buckets[Hash(data)]; + size_t offset = dictionary->buckets[Hash15(data)]; BROTLI_BOOL end = !offset; while (!end) { DictWord w = dictionary->dict_words[offset++]; @@ -341,7 +335,7 @@ static BROTLI_BOOL BrotliFindAllStaticDictionaryMatchesFor( /* Transforms with prefixes " " and "." */ if (max_length >= 5 && (data[0] == ' ' || data[0] == '.')) { BROTLI_BOOL is_space = TO_BROTLI_BOOL(data[0] == ' '); - size_t offset = dictionary->buckets[Hash(&data[1])]; + size_t offset = dictionary->buckets[Hash15(&data[1])]; BROTLI_BOOL end = !offset; while (!end) { DictWord w = dictionary->dict_words[offset++]; @@ -436,7 +430,7 @@ static BROTLI_BOOL BrotliFindAllStaticDictionaryMatchesFor( if ((data[1] == ' ' && (data[0] == 'e' || data[0] == 's' || data[0] == ',')) || (data[0] == 0xC2 && data[1] == 0xA0)) { - size_t offset = dictionary->buckets[Hash(&data[2])]; + size_t offset = dictionary->buckets[Hash15(&data[2])]; BROTLI_BOOL end = !offset; while (!end) { DictWord w = dictionary->dict_words[offset++]; @@ -465,7 +459,7 @@ static BROTLI_BOOL BrotliFindAllStaticDictionaryMatchesFor( data[3] == 'e' && data[4] == ' ') || (data[0] == '.' && data[1] == 'c' && data[2] == 'o' && data[3] == 'm' && data[4] == '/')) { - size_t offset = dictionary->buckets[Hash(&data[5])]; + size_t offset = dictionary->buckets[Hash15(&data[5])]; BROTLI_BOOL end = !offset; while (!end) { DictWord w = dictionary->dict_words[offset++]; diff --git a/deps/brotli/c/enc/static_dict.h b/deps/brotli/c/enc/static_dict.h index ab832207d108df..bc69b1591b4818 100644 --- a/deps/brotli/c/enc/static_dict.h +++ b/deps/brotli/c/enc/static_dict.h @@ -9,10 +9,8 @@ #ifndef BROTLI_ENC_STATIC_DICT_H_ #define BROTLI_ENC_STATIC_DICT_H_ -#include - -#include "../common/dictionary.h" #include "../common/platform.h" + #include "encoder_dict.h" #if defined(__cplusplus) || defined(c_plusplus) diff --git a/deps/brotli/c/enc/static_dict_lut.c b/deps/brotli/c/enc/static_dict_lut.c new file mode 100644 index 00000000000000..109366f603f6a3 --- /dev/null +++ b/deps/brotli/c/enc/static_dict_lut.c @@ -0,0 +1,224 @@ +/* Copyright 2025 Google Inc. All Rights Reserved. + + Distributed under MIT license. + See file LICENSE for detail or copy at https://opensource.org/licenses/MIT +*/ + +/* Lookup table for static dictionary and transforms. */ + +#include "static_dict_lut.h" + +#include "../common/platform.h" /* IWYU pragma: keep */ +#include "../common/static_init.h" + +#if (BROTLI_STATIC_INIT != BROTLI_STATIC_INIT_NONE) +#include "../common/dictionary.h" +#include "../common/transform.h" +#include "hash_base.h" +#endif + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#if (BROTLI_STATIC_INIT != BROTLI_STATIC_INIT_NONE) + +/* TODO(eustas): deal with largest bucket(s). Not it contains 163 items. */ +static BROTLI_BOOL BROTLI_COLD DoBrotliEncoderInitStaticDictionaryLut( + const BrotliDictionary* dict, uint16_t* buckets, DictWord* words, + void* arena) { + DictWord* slots = (DictWord*)arena; + uint16_t* heads = (uint16_t*)(slots + BROTLI_ENC_STATIC_DICT_LUT_NUM_ITEMS); + uint16_t* counts = heads + BROTLI_ENC_STATIC_DICT_LUT_NUM_BUCKETS; + uint16_t* prev = counts + BROTLI_ENC_STATIC_DICT_LUT_NUM_BUCKETS; + size_t next_slot = 0; + uint8_t transformed_word[24]; + uint8_t transformed_other_word[24]; + size_t l; + size_t pos; + size_t i; + + memset(counts, 0, BROTLI_ENC_STATIC_DICT_LUT_NUM_BUCKETS * sizeof(uint16_t)); + memset(heads, 0, BROTLI_ENC_STATIC_DICT_LUT_NUM_BUCKETS * sizeof(uint16_t)); + memset(prev, 0, BROTLI_ENC_STATIC_DICT_LUT_NUM_ITEMS * sizeof(uint16_t)); + + for (l = 4; l <= 24; ++l) { + size_t n = 1u << dict->size_bits_by_length[l]; + const uint8_t* dict_words = dict->data + dict->offsets_by_length[l]; + for (i = 0; i < n; ++i) { + const uint8_t* dict_word = dict_words + l * i; + uint32_t key = Hash15(dict_word); + slots[next_slot].len = (uint8_t)l; + slots[next_slot].transform = BROTLI_TRANSFORM_IDENTITY; + slots[next_slot].idx = (uint16_t)i; + prev[next_slot] = heads[key]; + heads[key] = (uint16_t)next_slot; + counts[key]++; + ++next_slot; + } + for (i = 0; i < n; ++i) { + uint32_t key; + uint32_t prefix; + BROTLI_BOOL found; + size_t curr; + const uint8_t* dict_word = dict_words + l * i; + if (dict_word[0] < 'a' || dict_word[0] > 'z') continue; + memcpy(transformed_word, dict_word, l); + transformed_word[0] = transformed_word[0] - 32; + key = Hash15(transformed_word); + prefix = BROTLI_UNALIGNED_LOAD32LE(transformed_word) & ~0x20202020u; + found = BROTLI_FALSE; + curr = heads[key]; + while (curr != 0) { + const uint8_t* other_word; + uint32_t other_prefix; + if (slots[curr].len != l) break; + other_word = dict_words + l * slots[curr].idx; + other_prefix = BROTLI_UNALIGNED_LOAD32LE(other_word) & ~0x20202020u; + if (prefix == other_prefix) { + if (memcmp(transformed_word, other_word, l) == 0) { + found = BROTLI_TRUE; + break; + } + } + curr = prev[curr]; + } + if (found) continue; + slots[next_slot].len = (uint8_t)l; + slots[next_slot].transform = BROTLI_TRANSFORM_UPPERCASE_FIRST; + slots[next_slot].idx = (uint16_t)i; + prev[next_slot] = heads[key]; + heads[key] = (uint16_t)next_slot; + counts[key]++; + ++next_slot; + } + for (i = 0; i < n; ++i) { + const uint8_t* dict_word = dict_words + l * i; + BROTLI_BOOL is_ascii = BROTLI_TRUE; + BROTLI_BOOL has_lower = BROTLI_FALSE; + size_t k; + uint32_t prefix; + uint32_t key; + size_t curr; + BROTLI_BOOL found; + for (k = 0; k < l; ++k) { + if (dict_word[k] >= 128) is_ascii = BROTLI_FALSE; + if (k > 0 && dict_word[k] >= 'a' && dict_word[k] <= 'z') + has_lower = BROTLI_TRUE; + } + if (!is_ascii || !has_lower) continue; + memcpy(transformed_word, dict_word, l); + prefix = BROTLI_UNALIGNED_LOAD32LE(transformed_word) & ~0x20202020u; + for (k = 0; k < l; ++k) { + if (transformed_word[k] >= 'a' && transformed_word[k] <= 'z') { + transformed_word[k] = transformed_word[k] - 32; + } + } + key = Hash15(transformed_word); + found = BROTLI_FALSE; + curr = heads[key]; + while (curr != 0) { + const uint8_t* other_word; + uint32_t other_prefix; + if (slots[curr].len != l) break; + other_word = dict_words + l * slots[curr].idx; + other_prefix = BROTLI_UNALIGNED_LOAD32LE(other_word) & ~0x20202020u; + if (prefix == other_prefix) { + if (slots[curr].transform == BROTLI_TRANSFORM_IDENTITY) { + if (memcmp(transformed_word, other_word, l) == 0) { + found = BROTLI_TRUE; + break; + } + } else if (slots[curr].transform == + BROTLI_TRANSFORM_UPPERCASE_FIRST) { + if ((transformed_word[0] == (other_word[0] - 32)) && + memcmp(transformed_word + 1, other_word + 1, l - 1) == 0) { + found = BROTLI_TRUE; + break; + } + } else { + for (k = 0; k < l; ++k) { + if (other_word[k] >= 'a' && other_word[k] <= 'z') { + transformed_other_word[k] = other_word[k] - 32; + } else { + transformed_other_word[k] = other_word[k]; + } + } + if (memcmp(transformed_word, transformed_other_word, l) == 0) { + found = BROTLI_TRUE; + break; + } + } + } + curr = prev[curr]; + } + if (found) { + continue; + } + slots[next_slot].len = (uint8_t)l; + slots[next_slot].transform = BROTLI_TRANSFORM_UPPERCASE_ALL; + slots[next_slot].idx = (uint16_t)i; + prev[next_slot] = heads[key]; + heads[key] = (uint16_t)next_slot; + counts[key]++; + ++next_slot; + } + } + + if (next_slot != 31704) return BROTLI_FALSE; + pos = 0; + /* Unused; makes offsets start from 1. */ + words[pos].len = 0; + words[pos].transform = 0; + words[pos].idx = 0; + pos++; + for (i = 0; i < BROTLI_ENC_STATIC_DICT_LUT_NUM_BUCKETS; ++i) { + size_t num_words = counts[i]; + size_t curr; + if (num_words == 0) { + buckets[i] = 0; + continue; + } + buckets[i] = (uint16_t)pos; + curr = heads[i]; + pos += num_words; + for (size_t k = 0; k < num_words; ++k) { + words[pos - 1 - k] = slots[curr]; + curr = prev[curr]; + } + words[pos - 1].len |= 0x80; + } + return BROTLI_TRUE; +} + +BROTLI_BOOL BrotliEncoderInitStaticDictionaryLut( + const BrotliDictionary* dict, uint16_t* buckets, DictWord* words) { + size_t arena_size = + BROTLI_ENC_STATIC_DICT_LUT_NUM_ITEMS * + (sizeof(uint16_t) + sizeof(DictWord)) + + BROTLI_ENC_STATIC_DICT_LUT_NUM_BUCKETS * 2 * sizeof(uint16_t); + void* arena = malloc(arena_size); + BROTLI_BOOL ok; + if (arena == NULL) { + return BROTLI_FALSE; + } + ok = DoBrotliEncoderInitStaticDictionaryLut(dict, buckets, words, arena); + free(arena); + return ok; +} + +BROTLI_MODEL("small") +uint16_t kStaticDictionaryBuckets[BROTLI_ENC_STATIC_DICT_LUT_NUM_BUCKETS]; +BROTLI_MODEL("small") +DictWord kStaticDictionaryWords[BROTLI_ENC_STATIC_DICT_LUT_NUM_ITEMS]; + +#else /* BROTLI_STATIC_INIT */ + +/* Embed kStaticDictionaryBuckets and kStaticDictionaryWords. */ +#include "static_dict_lut_inc.h" + +#endif /* BROTLI_STATIC_INIT */ + +#if defined(__cplusplus) || defined(c_plusplus) +} /* extern "C" */ +#endif diff --git a/deps/brotli/c/enc/static_dict_lut.h b/deps/brotli/c/enc/static_dict_lut.h index a465ffde7431ad..078f55424e6489 100644 --- a/deps/brotli/c/enc/static_dict_lut.h +++ b/deps/brotli/c/enc/static_dict_lut.h @@ -9,7 +9,9 @@ #ifndef BROTLI_ENC_STATIC_DICT_LUT_H_ #define BROTLI_ENC_STATIC_DICT_LUT_H_ -#include +#include "../common/dictionary.h" +#include "../common/platform.h" +#include "../common/static_init.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { @@ -22,5842 +24,23 @@ typedef struct DictWord { uint16_t idx; } DictWord; -/* GENERATED CODE START */ -static const int kDictNumBits = 15; -static const uint32_t kDictHashMul32 = 0x1E35A7BD; - -static const uint16_t kStaticDictionaryBuckets[32768] = { -1,0,0,0,0,0,0,0,0,3,6,0,0,0,0,0,20,0,0,0,21,0,22,0,0,0,0,0,0,0,0,23,0,0,25,0,29, -0,53,0,0,0,0,0,0,55,0,0,0,0,0,0,61,76,0,0,0,94,0,0,0,0,0,0,96,0,97,0,98,0,0,0,0, -0,0,0,99,101,106,108,0,0,0,0,0,110,0,111,112,0,113,118,124,0,0,0,0,0,125,128,0,0 -,0,0,129,0,0,131,0,0,0,0,0,0,132,0,0,135,0,0,0,137,0,0,0,0,0,138,139,0,0,0,0,0,0 -,0,142,143,144,0,0,0,0,0,145,0,0,0,146,149,151,152,0,0,153,0,0,0,0,0,0,0,0,0,0,0 -,0,0,0,0,154,0,0,0,0,0,0,155,0,0,0,0,160,182,0,0,0,0,0,0,183,0,0,0,188,189,0,0, -192,0,0,0,0,0,0,194,0,0,0,0,0,0,0,0,197,202,209,0,0,210,0,224,0,0,0,225,0,0,0,0, -0,0,0,0,0,0,231,0,0,0,232,0,240,0,0,242,0,0,0,0,0,0,0,0,0,0,0,244,0,0,0,246,0,0, -249,251,253,0,0,0,0,0,258,0,0,261,263,0,0,0,267,0,0,268,0,269,0,0,0,0,0,0,0,0,0, -271,0,0,0,0,0,0,272,0,273,0,277,0,278,286,0,0,0,0,287,0,289,290,291,0,0,0,295,0, -0,296,297,0,0,0,0,0,0,0,0,0,0,298,0,0,0,299,0,0,305,0,324,0,0,0,0,0,327,0,328, -329,0,0,0,0,336,0,0,340,0,341,342,343,0,0,346,0,348,0,0,0,0,0,0,349,351,0,0,355, -0,363,0,364,0,368,369,0,370,0,0,0,0,0,0,0,372,0,0,0,0,0,0,0,0,0,0,0,373,0,375,0, -0,0,0,376,377,0,0,394,395,396,0,0,398,0,0,0,0,400,0,0,408,0,0,0,0,420,0,0,0,0,0, -0,421,0,0,422,423,0,0,429,435,436,442,0,0,443,0,444,445,453,456,0,457,0,0,0,0,0, -458,0,0,0,459,0,0,0,460,0,462,463,465,0,0,0,0,0,0,466,469,0,0,0,0,0,0,470,0,0,0, -474,0,476,0,0,0,0,483,0,485,0,0,0,486,0,0,488,491,492,0,0,497,499,500,0,501,0,0, -0,505,0,0,506,0,0,0,507,0,0,0,509,0,0,0,0,511,512,519,0,0,0,0,0,0,529,530,0,0,0, -534,0,0,0,0,543,0,0,0,0,0,0,0,0,0,553,0,0,0,0,557,560,0,0,0,0,0,0,561,0,564,0,0, -0,0,0,0,565,566,0,575,0,619,0,620,0,0,623,624,0,0,0,625,0,0,626,627,0,0,628,0,0, -0,0,630,0,631,0,0,0,0,0,0,0,0,0,641,0,0,0,0,643,656,668,0,0,0,673,0,0,0,674,0,0, -0,0,0,0,0,0,682,0,687,0,690,0,693,699,700,0,0,0,0,0,0,704,705,0,0,0,0,707,710,0, -711,0,0,0,0,726,0,0,729,0,0,0,730,731,0,0,0,0,0,752,0,0,0,762,0,763,0,0,767,0,0, -0,770,774,0,0,775,0,0,0,0,0,0,0,0,0,0,776,0,0,0,777,783,0,0,0,785,788,0,0,0,0, -790,0,0,0,793,0,0,0,0,794,0,0,804,819,821,0,827,0,0,0,834,0,0,835,0,0,0,841,0, -844,0,850,851,859,0,860,0,0,0,0,0,0,0,874,0,876,0,877,890,0,0,0,0,0,0,0,0,893, -894,898,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,899,0,0,0,900,904,906,0,0,0,907,0,908,909, -0,910,0,0,0,0,911,0,0,0,0,0,916,0,0,0,922,925,0,930,0,934,0,0,0,0,0,943,0,0,944, -0,953,954,0,0,0,0,0,0,955,0,962,963,0,0,976,0,0,977,978,979,980,0,981,0,0,0,0, -984,0,0,985,0,0,987,989,991,0,0,0,0,0,0,0,0,0,992,0,0,0,993,0,0,0,0,0,0,996,0,0, -0,1000,0,0,0,0,0,1002,0,0,0,0,1005,1007,0,0,0,1009,0,0,0,1010,0,0,0,0,0,0,1011,0 -,1012,0,0,0,0,1014,1016,0,0,0,1020,0,1021,0,0,0,0,1022,0,0,0,1024,0,0,0,0,0,0, -1025,0,0,1026,1027,0,0,0,0,0,1031,0,1033,0,0,0,0,1034,0,0,0,1037,1040,0,0,0,1042 -,1043,0,0,1053,0,1054,0,0,1057,0,0,0,1058,0,0,1060,0,0,0,0,0,0,0,1061,0,0,1062,0 -,0,0,0,1063,0,0,0,0,1064,0,0,0,0,0,1065,0,0,0,0,1066,1067,0,0,0,1069,1070,1072,0 -,0,0,0,0,0,1073,0,1075,0,0,0,0,0,0,1080,1084,0,0,0,0,1088,0,0,0,0,0,0,1094,0, -1095,0,1107,0,0,0,1112,1114,0,1119,0,1122,0,0,1126,0,1129,0,1130,0,0,0,0,0,1132, -0,0,0,0,0,0,1144,0,0,1145,1146,0,1148,1149,0,0,1150,1151,0,0,0,0,1152,0,1153,0,0 -,0,0,0,1154,0,1163,0,0,0,1164,0,0,0,0,0,1165,0,1167,0,1170,0,0,0,0,0,1171,1172,0 -,0,0,0,0,0,0,0,1173,1175,1177,0,1186,0,0,0,0,0,0,0,0,0,0,1195,0,0,1221,0,0,1224, -0,0,1227,0,0,0,0,0,1228,1229,0,0,1230,0,0,0,0,0,0,0,0,0,1231,0,0,0,1233,0,0,1243 -,1244,1246,1248,0,0,0,0,1254,1255,1258,1259,0,0,0,1260,0,0,1261,0,0,0,1262,1264, -0,0,1265,0,0,0,0,0,0,0,0,0,0,0,0,1266,0,1267,0,0,0,0,1273,1274,1276,1289,0,0, -1291,1292,1293,0,0,1294,1295,1296,0,0,0,0,1302,0,1304,0,0,0,0,0,0,0,0,0,1311, -1312,0,1314,0,1316,1320,1321,0,0,0,0,0,0,0,1322,1323,1324,0,1335,0,1336,0,0,0,0, -1341,1342,0,1346,0,1357,0,0,0,1358,1360,0,0,0,0,0,0,1361,0,0,0,1362,1365,0,1366, -0,0,0,0,0,0,0,1379,0,0,0,0,0,0,0,0,0,0,0,0,1386,0,1388,0,0,0,0,0,0,0,0,0,0,0,0,0 -,0,1395,0,0,0,0,1403,0,1405,0,0,1407,0,0,0,0,0,1408,1409,0,1410,0,0,0,1412,1413, -1416,0,0,1429,1451,0,0,1454,0,0,0,0,0,0,0,1455,0,0,0,0,0,0,0,1456,0,0,0,0,1459, -1460,1461,1475,0,0,0,0,0,0,1477,0,1480,0,1481,0,0,1486,0,0,1495,0,0,0,1496,0,0, -1498,1499,1501,1520,1521,0,0,0,1526,0,0,0,0,1528,1529,0,1533,1536,0,0,0,1537, -1538,1549,0,1550,1558,1559,1572,0,1573,0,0,0,0,0,0,0,0,0,1575,0,0,0,0,0,1579,0, -1599,0,1603,0,1604,0,1605,0,0,0,0,0,1608,1610,0,0,0,0,1611,0,1615,0,1616,1618,0, -1619,0,0,1622,0,0,0,0,1634,0,0,0,1635,0,0,0,1641,0,0,0,0,0,0,0,0,0,1643,0,0,0, -1650,0,0,1652,0,0,0,0,0,1653,0,0,0,1654,0,0,0,0,1655,0,1662,0,0,1663,1664,0,0, -1668,0,0,1669,1670,0,1672,1673,0,0,0,0,0,1674,0,0,0,1675,1676,1680,0,1682,0,0, -1687,0,0,0,0,0,1704,0,0,1705,0,0,1721,0,0,0,0,1734,1735,0,0,0,0,1737,0,0,0,0, -1739,0,0,1740,0,0,0,0,0,0,0,0,0,0,1741,1743,0,0,0,0,1745,0,0,0,1749,0,0,0,1751,0 -,0,0,0,0,0,1760,0,0,0,0,1765,0,0,0,0,0,1784,0,1785,1787,0,0,0,0,1788,1789,0,0,0, -0,1790,1791,1793,0,1798,1799,0,0,0,0,1801,0,1803,1805,0,0,0,1806,1811,0,1812, -1814,0,1821,0,0,0,0,0,1822,1833,0,0,0,0,0,0,1848,0,0,0,0,0,0,1857,0,0,0,1859,0,0 -,0,0,1861,0,0,0,0,0,0,0,1866,0,1921,1925,0,0,0,1929,1930,0,0,0,0,0,0,0,0,0,1931, -0,0,0,0,1932,0,0,0,1934,0,0,0,0,0,0,0,0,1946,0,0,1948,0,0,0,0,1950,0,1957,0,1958 -,0,0,0,0,0,1965,1967,0,0,0,0,1968,0,1969,0,1971,1972,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -,0,1973,0,0,0,0,1975,0,0,0,0,1976,1979,0,1982,0,0,0,0,1984,1988,0,0,0,0,1990, -2004,2008,0,0,0,2012,2013,0,0,0,0,0,0,0,0,0,0,2015,0,2016,2017,0,0,0,0,2021,0,0, -2025,0,0,0,0,0,2029,2036,2040,0,2042,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2043,0,0,0,0,0, -2045,0,0,0,0,0,0,0,2046,2047,0,2048,2049,0,2059,0,0,2063,0,2064,2065,0,0,2066,0, -0,0,0,0,0,2069,0,0,0,0,2070,0,2071,0,2072,0,0,0,0,2080,2082,2083,0,0,0,0,0,2085, -0,2086,2088,2089,2105,0,0,0,0,2107,0,0,2116,2117,0,2120,0,0,2122,0,0,0,0,0,2123, -0,0,2125,2127,2128,0,0,0,2130,0,0,0,2137,2139,2140,2141,0,0,0,0,0,0,0,0,0,2144, -2145,0,0,2146,2149,0,0,0,0,2150,0,0,2151,2158,0,2159,0,2160,0,0,0,0,0,0,2161, -2162,0,0,2194,2202,0,0,0,0,0,0,2205,2217,0,2220,0,2221,0,2222,2224,0,0,0,0,2237, -0,0,0,0,0,2238,0,2239,2241,0,0,2242,0,0,0,0,0,2243,0,0,0,0,0,0,2252,0,0,2253,0,0 -,0,2257,2258,0,0,0,2260,0,0,0,0,0,0,0,2262,0,2264,0,0,0,0,0,2269,2270,0,0,0,0,0, -0,0,0,0,2271,0,2273,0,0,0,0,2277,0,0,0,0,2278,0,0,0,0,2279,0,2280,0,2283,0,0,0,0 -,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2287,0,0,0,0,0,0,0,2289,2290,0,0,0,0,2291,0,2292,0, -0,0,2293,2295,2296,0,0,0,0,0,0,0,2298,0,0,0,0,0,2303,0,2305,0,0,2306,0,2307,0,0, -0,0,0,0,0,0,0,0,0,0,2313,2314,2315,2316,0,0,2318,0,2319,0,2322,0,0,2323,0,2324,0 -,2326,0,0,0,0,0,0,0,2335,0,2336,2338,2339,0,2340,0,0,0,2355,0,2375,0,2382,2386,0 -,2387,0,0,2394,0,0,0,0,2395,0,2397,0,0,0,0,0,2398,0,0,0,0,0,0,0,2399,2402,2404, -2408,2411,0,0,0,2413,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2415,0,0,2416,2417,2419,0,2420, -0,0,0,0,0,2425,0,0,0,2426,0,0,0,0,0,0,0,0,0,0,0,0,2427,2428,0,2429,0,0,2430,2434 -,0,2436,0,0,0,0,0,0,2441,2442,0,2445,0,0,2446,2457,0,2459,0,0,2462,0,2464,0,2477 -,0,2478,2486,0,0,0,2491,0,0,2493,0,0,2494,0,2495,0,2513,2523,0,0,0,0,2524,0,0,0, -0,0,0,2528,2529,2530,0,0,2531,0,2533,0,0,2534,2535,0,2536,2537,0,2538,0,2539, -2540,0,0,0,2545,2546,0,0,0,0,0,0,0,2548,0,0,2549,0,2550,2555,0,0,0,0,0,2557,0, -2560,0,0,0,0,0,0,0,0,0,0,0,2561,0,2576,0,0,0,0,0,0,0,0,0,2577,2578,0,0,0,2579,0, -0,0,0,0,0,0,2580,0,0,0,0,2581,0,0,0,0,2583,0,2584,0,2588,2590,0,0,0,2591,0,0,0,0 -,2593,2594,0,2595,0,2601,2602,0,0,2603,0,2605,0,0,0,2606,2607,2611,0,2615,0,0,0, -2617,0,0,0,0,0,0,0,0,0,0,0,0,0,2619,0,0,2620,0,0,0,2621,0,2623,0,2625,0,0,2628, -2629,0,0,2635,2636,2637,0,0,2639,0,0,0,2642,0,0,0,0,2643,0,2644,0,2649,0,0,0,0,0 -,0,2655,2656,0,0,2657,0,0,0,0,0,2658,0,0,0,0,0,2659,0,0,0,0,2664,2685,0,2687,0, -2688,0,0,2689,0,0,2694,0,2695,0,0,2698,0,2701,2706,0,0,0,2707,0,2709,2710,2711,0 -,0,0,2720,2730,2735,0,0,0,0,2738,2740,0,0,0,0,2747,0,0,0,0,0,0,2748,0,0,2749,0,0 -,0,0,0,2750,0,0,2752,2754,0,0,0,0,0,2758,0,0,0,0,2762,0,0,0,0,2763,0,0,0,0,0,0,0 -,2764,2767,0,0,0,0,2768,0,0,2770,0,0,0,0,0,0,0,2771,0,0,0,0,0,0,0,0,0,2772,0,0,0 -,0,0,2773,2776,0,0,2783,0,0,2784,0,2789,0,2790,0,0,0,2792,0,0,0,0,0,0,0,0,0,0, -2793,2795,0,0,0,0,0,0,2796,0,0,0,0,0,0,2797,2799,0,0,0,0,2803,0,0,0,0,2806,0, -2807,2808,2817,2819,0,0,0,0,0,2821,0,0,0,0,2822,2823,0,0,0,0,0,0,0,2824,0,0,2828 -,0,2834,0,0,0,0,0,0,2836,0,2838,0,0,2839,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2841, -0,0,0,2842,0,0,0,0,0,2843,2844,0,0,0,0,2846,0,0,2847,0,2849,0,2853,0,0,0,0,0, -2857,0,0,0,0,2858,0,2859,0,0,2860,0,2862,2868,0,0,0,0,2875,0,2876,0,0,2877,2878, -2884,2889,2890,0,0,2891,0,0,2892,0,0,0,2906,2912,0,2913,0,0,0,0,0,0,0,0,2916,0, -2934,0,0,0,0,0,2935,0,0,0,0,2939,0,2940,0,0,0,0,0,0,0,2941,0,0,0,2946,0,2949,0,0 -,2950,2954,2955,0,0,0,2959,2961,0,0,2962,0,2963,0,0,0,0,0,0,2964,2965,2966,2967, -0,0,0,0,0,0,0,2969,0,0,0,0,0,2970,2975,0,2982,2983,2984,0,0,0,0,0,2989,0,0,2990, -0,0,0,0,0,0,0,2991,0,0,0,0,0,0,0,0,2998,0,3000,3001,0,0,3002,0,0,0,3003,0,0,3012 -,0,0,3022,0,0,3024,0,0,3025,3027,0,0,0,3030,0,0,0,0,3034,3035,0,0,3036,0,3039,0, -3049,0,0,3050,0,0,0,0,0,0,3051,0,3053,0,0,0,0,3057,0,3058,0,0,0,0,0,0,0,0,3063,0 -,0,3073,3074,3078,3079,0,3080,3086,0,0,0,0,0,0,0,0,3087,0,3092,0,3095,0,3099,0,0 -,0,3100,0,3101,3102,0,3122,0,0,0,3124,0,3125,0,0,0,0,0,0,3132,3134,0,0,3136,0,0, -0,0,0,0,0,3147,0,0,3149,0,0,0,0,0,3150,3151,3152,0,0,0,0,3158,0,0,3160,0,0,3161, -0,0,3162,0,3163,3166,3168,0,0,3169,3170,0,0,3171,0,0,0,0,0,0,0,3182,0,3184,0,0, -3188,0,0,3194,0,0,0,0,0,0,3204,0,0,0,0,3209,0,0,0,0,0,0,0,0,0,0,0,3216,3217,0,0, -0,0,0,0,0,3219,0,0,3220,3222,0,3223,0,0,0,0,3224,0,3225,3226,0,3228,3233,0,3239, -3241,3242,0,0,3251,3252,3253,3255,0,0,0,0,0,0,0,0,3260,0,0,3261,0,0,0,3267,0,0,0 -,0,0,0,0,0,3271,0,0,0,3278,0,3282,0,0,0,3284,0,0,0,3285,3286,0,0,0,0,0,0,0,3287, -3292,0,0,0,0,3294,3296,0,0,3299,3300,3301,0,3302,0,0,0,0,0,3304,3306,0,0,0,0,0,0 -,3308,0,0,0,0,0,0,0,0,0,3311,0,0,0,0,0,0,0,0,3312,3314,3315,0,3318,0,0,0,0,0,0,0 -,0,3319,0,0,0,0,0,3321,0,0,0,0,0,0,0,0,0,3322,0,0,3324,3325,0,0,3326,0,0,3328, -3329,3331,0,0,3335,0,0,3337,0,3338,0,0,0,0,3343,3347,0,0,0,3348,0,0,3351,0,0,0,0 -,0,0,3354,0,0,0,0,0,0,0,0,0,0,3355,0,0,3365,3366,3367,0,0,0,0,0,0,3368,3369,0, -3370,0,0,3373,0,0,3376,0,0,3377,0,3379,3387,0,0,0,0,0,3390,0,0,0,0,0,0,0,3402,0, -3403,3436,3437,3439,0,0,3441,0,0,0,3442,0,0,3449,0,0,0,3450,0,0,0,0,0,0,0,3451,0 -,0,3452,0,3453,3456,0,3457,0,0,3458,0,3459,0,0,0,0,0,0,0,0,0,3460,0,0,3469,3470, -0,0,3475,0,0,0,3480,3487,3489,0,3490,0,0,3491,3499,0,3500,0,0,3501,0,0,0,3502,0, -3514,0,0,0,3516,3517,0,0,0,3518,0,0,0,0,3520,3521,3522,0,0,3526,3530,0,0,0,0, -3531,0,0,0,0,3536,0,0,0,0,0,0,0,3539,3541,0,0,3542,3544,0,3547,3548,0,0,3550,0, -3553,0,0,0,0,0,0,0,3554,0,3555,0,3558,0,3559,0,0,0,0,0,0,0,0,3563,0,3581,0,0,0, -3599,0,0,0,3600,0,3601,0,3602,3603,0,0,3606,3608,0,3610,3611,0,0,0,0,0,0,0,0,0, -3612,3616,3619,0,0,0,0,0,0,0,0,0,0,0,0,0,3624,3628,0,3629,3634,3635,0,0,0,0,0,0, -3636,0,3637,0,0,3638,3651,0,0,0,0,0,0,3652,3653,0,0,0,0,3656,3657,0,0,0,0,0,3658 -,0,0,0,0,3659,0,3661,3663,3664,0,3665,0,3692,0,0,0,3694,3696,0,0,0,0,0,0,0,0,0,0 -,0,0,3698,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3700,0,0,3701,0,0,0,3708,3709,0,0,0,3711 -,3712,0,0,0,0,0,3723,0,3724,3725,0,0,3726,0,0,0,0,0,0,3728,3729,0,3734,3735,3737 -,0,0,0,3743,0,3745,0,0,3746,0,0,3747,3748,0,3757,0,3759,3766,3767,0,3768,0,0,0,0 -,3769,0,0,3771,0,3774,0,0,0,0,0,0,3775,0,0,0,0,0,0,3776,0,3777,3786,0,3788,3789, -0,0,0,0,0,0,0,0,0,3791,0,3811,0,0,0,0,0,3814,3815,3816,3820,0,0,0,0,0,0,0,3821,0 -,0,3825,0,0,0,0,3835,0,0,3848,3849,0,0,0,0,3850,3851,3853,0,0,0,0,3859,0,3860, -3862,0,0,0,0,0,3863,0,0,0,0,0,0,0,0,3873,0,3874,0,3875,3886,0,3887,0,0,0,0,3892, -3913,0,3914,0,0,0,3925,3931,0,0,0,0,3934,3941,3942,0,0,0,0,3943,0,0,0,3944,0,0,0 -,0,0,3945,0,3947,0,0,0,3956,3957,0,0,0,0,0,0,0,0,0,3958,0,3959,3965,0,0,0,0,3966 -,0,0,0,3967,0,0,0,3968,3974,0,0,0,0,0,3975,3977,3978,0,0,0,0,3980,0,3985,0,0,0,0 -,0,0,0,0,3986,4011,0,0,4017,0,0,0,0,0,0,0,0,0,0,0,4018,0,0,0,0,4019,0,4023,0,0,0 -,4027,4028,0,0,0,0,0,0,0,0,4031,4034,0,0,4035,4037,4039,4040,0,0,0,0,0,4059,0, -4060,4061,0,4062,4063,4066,0,0,4072,0,0,0,0,0,0,0,0,0,0,0,0,0,4088,0,0,0,0,0, -4091,0,0,0,0,4094,4095,0,0,4096,0,0,0,0,0,4098,4099,0,0,0,4101,0,4104,0,0,0,4105 -,4108,0,4113,0,0,4115,4116,0,4126,0,0,4127,0,0,0,0,0,0,0,4128,4132,4133,0,4134,0 -,0,0,4137,0,0,4141,0,0,0,0,4144,4146,4147,0,0,0,0,4148,0,0,4311,0,0,0,4314,4329, -0,4331,4332,0,4333,0,4334,0,0,0,4335,0,4336,0,0,0,4337,0,0,0,4342,4345,4346,4350 -,0,4351,4352,0,4354,4355,0,0,4364,0,0,0,0,4369,0,0,0,4373,0,4374,0,0,0,0,4377,0, -0,0,0,4378,0,0,0,4380,0,0,0,4381,4382,0,0,0,0,0,0,0,4384,0,0,0,0,4385,0,0,0,4386 -,0,0,0,4391,4398,0,0,0,0,4407,4409,0,0,0,0,4410,0,0,4411,0,4414,4415,4418,0,4427 -,4428,4430,0,4431,0,4448,0,0,0,0,0,4449,0,0,0,4451,4452,0,4453,4454,0,4456,0,0,0 -,0,0,0,0,4459,0,4463,0,0,0,0,0,4466,0,4467,0,4469,0,0,0,0,0,0,0,0,0,0,0,0,0,4470 -,4471,0,4473,0,0,4475,0,0,0,0,4477,4478,0,0,0,4479,4481,0,4482,0,4484,0,0,0,0,0, -0,0,4486,0,0,4488,0,0,4497,0,4508,0,0,4510,4511,0,4520,4523,0,4524,0,4525,0,4527 -,0,0,4528,0,0,0,0,4530,0,4531,0,0,4532,0,0,0,4533,0,0,0,0,0,4535,0,0,0,4536,0,0, -0,0,0,4541,4543,4544,4545,4547,0,4548,0,0,0,0,4550,4551,0,4553,0,0,0,0,4562,0,0, -4571,0,0,0,4574,0,0,0,4575,0,4576,0,4577,0,0,0,4581,0,0,0,0,0,4582,0,0,4586,0,0, -0,4588,0,0,4597,0,4598,0,0,0,0,4616,4617,0,4618,0,0,0,0,4619,0,4620,0,0,4621,0, -4624,0,0,0,0,0,4625,0,0,0,0,4657,0,4659,0,4667,0,0,0,4668,4670,0,4672,0,0,0,0,0, -4673,4676,0,0,0,0,4687,0,0,0,0,4697,0,0,0,0,4699,0,4701,0,0,0,0,4702,0,0,4706,0, -0,4713,0,0,0,4714,4715,4716,0,0,0,0,0,0,0,0,0,0,0,0,4717,0,0,4720,0,4721,4729, -4735,0,0,0,4737,0,0,0,4739,0,0,0,4740,0,0,0,4741,0,0,0,0,0,4742,0,4745,4746,4747 -,0,0,0,0,0,0,0,0,4748,0,0,0,4749,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4751, -4786,0,4787,0,4788,4796,0,0,4797,4798,0,4799,4806,4807,0,0,0,0,4809,4810,0,0,0,0 -,0,0,4811,0,0,0,0,0,4812,0,4813,0,0,4815,0,4821,4822,0,0,0,0,4823,0,0,0,0,0,0,0, -0,0,0,4824,0,0,0,0,4826,0,0,0,4828,0,4829,0,0,0,4843,0,0,4847,0,4853,4855,4858,0 -,0,0,0,0,4859,0,4864,0,0,4879,0,0,0,0,4880,0,0,0,0,4881,0,4882,0,0,0,0,0,0,0,0,0 -,4883,0,0,0,0,4884,0,0,0,0,0,4886,4887,4888,4894,4896,0,4902,0,0,4905,0,0,4915,0 -,0,0,0,0,0,0,4916,4917,4919,4921,0,0,0,0,0,4926,0,0,0,0,4927,0,0,0,0,0,0,0,0, -4929,0,4930,4931,0,4938,0,4952,0,4953,4957,4960,4964,0,0,0,0,0,0,0,5019,5020, -5022,0,0,0,0,0,5023,0,0,0,5024,0,0,0,5025,0,0,0,0,5028,0,0,0,0,5029,5030,5031,0, -5033,0,0,0,0,0,0,0,0,0,5034,5035,0,5036,0,0,5037,0,0,0,0,5038,0,0,5039,0,0,0, -5041,5042,0,0,0,0,5044,5049,5054,0,5055,0,5057,0,0,0,5060,0,0,0,0,0,5063,0,5064, -5065,0,5067,0,0,0,5068,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5076,0,0,0,0,0,0, -0,5077,0,0,5078,5080,0,0,5083,0,0,0,0,0,0,0,0,5085,0,0,0,0,0,0,5098,5099,5101, -5105,5107,0,5108,0,5109,0,0,0,0,0,0,0,5110,0,0,0,0,0,5117,5118,0,5121,0,5122,0,0 -,5130,0,0,0,5137,0,0,0,5148,0,0,0,0,0,0,0,5151,5154,0,0,0,5155,0,0,5156,5159, -5161,0,0,0,0,5162,0,0,0,0,5163,5164,0,5166,0,0,0,0,0,0,0,0,0,0,5167,0,0,0,5172,0 -,0,0,0,0,0,5178,5179,0,0,5190,0,0,5191,5192,5194,0,0,5198,5201,0,0,0,0,0,5203,0, -5206,5209,0,0,0,0,0,0,5213,0,5214,5216,0,0,0,0,0,5217,0,0,0,0,0,0,0,0,5218,5219, -0,5231,0,0,5244,5249,0,5254,0,5255,0,0,5257,0,0,0,0,0,5258,0,5260,5270,0,5277,0, -0,0,0,0,0,5280,5281,5282,5283,0,0,0,0,0,5284,0,5285,0,0,0,0,0,5287,5288,0,0,0,0, -0,0,0,0,0,0,5289,5291,0,0,5294,0,0,5295,0,0,0,0,0,0,0,5304,0,0,5306,5307,5308,0, -5309,0,0,5310,0,0,0,0,5311,5312,0,5313,0,0,0,0,0,5316,0,0,0,5317,0,0,0,0,0,0,0,0 -,0,5325,0,0,0,0,0,0,5326,0,5327,5329,0,5332,0,0,0,0,5338,0,0,0,0,0,0,0,0,5340,0, -0,5341,0,0,0,5342,0,5343,5344,0,0,5345,0,0,0,0,0,0,5347,5348,0,0,0,0,0,0,0,0,0, -5349,0,5350,0,5354,0,0,0,0,5358,0,0,5359,0,0,5361,0,0,5365,0,5367,0,5373,0,0,0, -5379,0,0,0,5380,0,0,0,5382,0,5384,0,0,0,0,0,0,5385,0,0,0,0,5387,0,0,0,0,0,0,5388 -,5390,5393,0,0,0,0,0,0,0,0,0,0,0,5396,0,0,0,0,5397,5402,0,0,0,0,0,5403,0,0,0, -5404,5405,0,0,0,0,0,0,0,0,0,0,0,0,5406,0,0,0,0,5410,0,0,5411,0,5415,0,0,0,0,5416 -,5434,0,0,0,0,0,0,0,0,0,0,0,5438,0,5440,0,0,0,0,0,0,5441,5442,0,0,0,5443,5444, -5447,0,0,5448,5449,5451,0,0,0,5456,5457,0,0,0,5459,0,0,0,5461,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,5464,0,5466,0,0,5467,0,5470,0,0,5473,0,0,5474,0,0,5476,0,0,0,0,0,0,0,0 -,0,0,0,5477,0,0,0,0,0,0,0,5484,0,0,5485,5486,0,0,0,0,0,5488,0,0,0,0,0,0,0,5489,0 -,0,0,0,0,5507,0,0,0,5510,0,5511,0,0,5512,0,0,0,5513,0,5515,0,0,5516,5517,0,5518, -0,0,5522,0,0,0,0,0,5534,5535,0,0,5536,0,5538,0,0,5543,0,5544,0,0,5545,0,5547,0, -5557,0,0,5558,0,5560,5567,0,0,0,0,5568,0,0,0,5571,5573,0,5574,0,5575,0,0,0,0, -5577,0,0,5598,0,0,0,0,0,0,0,0,0,5600,5609,0,0,0,0,5610,0,0,5612,0,5624,0,5625,0, -0,0,5629,0,5641,0,5642,5643,0,0,0,0,0,0,5651,0,0,0,5652,5653,0,5661,5662,5678,0, -5679,0,0,0,0,5685,5686,0,0,0,0,0,5690,5692,0,5703,0,0,0,0,0,5706,0,0,0,0,5707,0, -0,0,0,0,0,5708,0,0,5709,0,5710,0,0,0,5712,0,5733,0,5734,5735,0,0,5744,5751,0,0,0 -,0,0,0,0,0,0,0,0,0,5752,0,5754,0,0,0,0,0,0,5757,5758,0,5760,5761,0,0,0,0,5763, -5764,5765,0,5766,0,5767,5768,0,5770,0,0,0,0,5776,5780,0,0,0,0,5782,0,0,0,0,5784, -0,0,5788,0,0,0,0,0,0,0,0,0,0,0,5797,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5799,0,0,5801, -0,0,0,5811,0,0,0,0,0,0,5816,0,0,5827,0,0,0,0,0,0,0,0,5830,5831,0,0,5832,0,0,5833 -,0,5835,5844,5845,0,5846,0,0,0,0,0,5850,0,0,0,0,0,5852,0,5855,5857,0,0,5859,0, -5861,0,0,5863,0,5865,0,0,0,5873,5875,0,0,0,5877,0,5879,0,0,0,5888,0,0,5889,5891, -0,5894,0,0,0,0,0,0,5895,0,5897,0,0,0,0,0,0,5907,0,5911,0,0,5912,0,5913,5922,5924 -,0,5927,5928,0,0,0,0,5929,5930,0,5933,0,0,0,0,5949,0,0,5951,0,0,0,0,0,0,0,0,5953 -,0,0,5954,0,5959,5960,5961,0,5964,0,0,0,5976,5978,5987,5990,0,0,0,0,0,5991,0, -5992,0,0,0,5994,5995,0,0,5996,0,0,6001,6003,0,0,0,0,6007,0,0,0,0,0,6008,0,0,6009 -,0,6010,0,0,0,6011,6015,0,6017,0,6019,0,6023,0,0,0,0,0,0,0,6025,0,0,0,0,0,0,0,0, -0,0,6026,0,6030,0,0,6032,0,0,0,6033,6038,6040,0,0,0,6041,6045,0,0,6046,0,0,6053, -0,0,6054,0,6055,0,0,0,0,0,0,6057,0,6063,0,0,0,6064,0,6066,6071,6072,0,0,0,0,0,0, -6075,6076,0,0,6077,0,0,0,0,0,0,0,0,0,6078,6079,0,0,0,0,0,0,0,0,6080,0,6083,0,0,0 -,0,0,6084,0,0,6088,0,6089,0,0,6093,6105,0,0,6107,0,6110,0,0,0,6111,6125,6126,0,0 -,0,6129,0,0,0,0,6130,0,0,0,6131,6134,0,0,0,0,0,0,6142,0,0,0,0,0,6144,0,0,6146, -6151,6153,0,6156,0,6163,0,6180,6181,0,0,0,0,0,6182,0,0,0,0,6184,6195,0,0,6206,0, -6208,0,0,6212,6213,6214,0,6215,0,0,0,6228,0,0,0,6234,0,0,0,0,0,0,6235,6240,0, -6242,6243,6244,0,6250,6255,0,0,0,0,0,6257,0,0,0,6258,6278,0,6284,0,0,0,6285,0,0, -0,0,0,0,0,0,6286,0,0,0,6320,0,0,6322,6332,0,0,0,0,0,0,0,0,6334,0,0,0,0,0,0,0, -6335,0,0,6337,0,6338,0,6339,6340,0,0,6356,6357,6369,0,0,0,6370,6371,6372,0,6373, -0,0,0,0,0,6376,0,0,0,0,0,6382,6383,6384,0,0,0,0,6386,0,6389,6397,6400,6411,0, -6414,0,0,0,0,0,0,0,6415,6416,0,0,0,0,0,0,6417,0,0,0,0,6418,0,0,0,0,0,0,0,6420,0, -6421,6423,6425,0,6429,6430,0,6433,6438,0,0,0,0,0,0,0,0,0,0,6439,6440,0,0,6441,0, -0,6444,0,0,0,0,6446,0,0,0,0,6447,6448,0,0,6450,0,0,0,6454,0,0,6455,0,6461,0,0,0, -0,0,0,6462,0,0,6463,0,6464,0,6465,6467,0,0,0,6468,0,6479,6480,0,0,0,0,0,0,0,6481 -,0,0,6485,6487,0,0,0,0,0,0,6493,0,0,0,0,0,0,0,0,6494,6495,6496,0,0,0,0,0,6498,0, -0,0,6507,6508,0,0,0,0,0,0,0,0,0,0,6511,6512,0,0,0,0,6513,0,0,0,6514,0,0,0,0,0, -6516,0,0,6517,6518,0,0,0,6519,6520,6521,0,6523,0,0,0,0,6524,6528,0,6530,0,0,6532 -,0,6578,0,0,0,6583,0,6584,0,0,0,6587,0,0,0,6590,0,6591,0,0,0,0,0,6592,0,0,0,0, -6593,6594,0,0,0,0,0,6599,6600,0,0,6601,6602,6604,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -6608,0,0,0,0,0,0,0,0,6610,6611,0,6615,0,6616,6618,6620,0,6637,0,0,0,0,6639,0,0,0 -,0,6641,0,6642,0,0,0,6647,0,6660,6663,0,6664,0,6666,6669,0,6675,6676,6677,0,0,0, -0,0,0,0,0,0,6678,0,0,0,6679,0,6680,0,0,0,0,0,0,0,6693,0,0,0,0,0,0,0,0,0,6704, -6705,6706,0,0,6711,6713,0,0,0,0,0,6716,0,0,0,6717,0,6719,6724,0,0,0,0,0,0,0,0, -6725,6726,0,0,0,0,0,6728,6729,6735,0,6737,6742,0,0,6743,6750,0,6751,0,0,6752, -6753,0,0,0,0,0,0,6754,0,0,0,0,0,6756,0,0,0,0,0,0,6763,0,0,6764,6765,0,0,0,6770,0 -,0,0,6776,6780,0,6781,0,0,0,6783,0,6784,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -6785,0,0,0,6792,0,0,0,6793,0,0,6802,0,0,0,0,0,6803,0,0,0,6804,0,0,0,6812,0,0, -6823,0,6824,6839,0,0,0,0,6852,0,0,6854,0,6856,6857,0,0,0,0,0,0,0,0,0,6867,0,6868 -,6870,6872,0,0,0,6873,6874,0,0,0,0,0,6875,0,0,6877,0,0,0,0,0,0,0,6878,0,0,0,6879 -,0,6880,0,0,0,0,0,0,0,0,0,0,6887,0,6888,6891,6893,0,6895,0,0,0,0,0,0,0,0,6899,0, -0,0,0,6901,0,0,0,0,6910,0,6911,0,0,6912,0,0,6913,6914,0,0,0,6915,0,0,0,6916,6919 -,0,0,0,0,0,0,6924,0,6925,0,0,0,6926,6927,6928,0,6929,0,6930,0,0,6931,6935,0,6936 -,0,0,0,0,6939,6940,6941,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6942,6948,6949,0,0,0,0,0,0 -,0,6952,6954,6963,6965,6966,0,0,6967,6968,0,0,0,0,0,0,0,0,0,6969,0,0,6970,6979,0 -,0,6980,0,0,6983,0,0,0,0,0,6984,0,0,0,0,0,0,0,6988,6990,6992,0,0,0,0,0,0,0,6995, -0,0,0,7012,0,0,0,0,0,0,0,0,0,7019,0,0,0,0,0,0,0,0,7021,0,0,7022,7023,7028,0,7030 -,7033,0,0,0,0,0,0,7038,0,0,0,0,0,0,0,0,0,0,7039,0,0,0,0,0,7046,0,7047,0,0,0,0,0, -0,0,0,0,0,0,7048,7052,0,0,0,0,0,7054,0,7060,0,0,0,0,7061,0,7065,0,0,0,0,7067, -7069,0,7070,7071,7072,0,0,7078,0,7080,7081,0,7083,0,0,0,7084,7087,7088,0,0,7090, -0,7093,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7107,0,0,7108,0,0,0,0,0,0,0,0,7110,0,7114,0 -,0,0,0,0,0,0,7115,0,7116,0,0,0,0,0,7117,0,0,7118,0,0,7124,0,7125,0,0,7126,0,0,0, -0,7128,0,0,0,0,0,7129,0,7130,0,7132,7133,0,0,7134,0,0,7139,0,7148,7150,0,0,0,0, -7152,0,0,0,7153,7156,7157,0,0,0,0,0,7158,0,0,0,0,0,0,0,0,0,0,7163,7165,7169,0, -7171,0,0,0,0,0,0,0,0,0,7172,0,7173,7181,0,0,0,0,0,7182,7185,0,0,0,0,7187,0,7201, -7204,0,0,0,0,0,7206,7207,0,0,0,0,7211,7216,0,7218,0,0,0,0,7226,7228,7230,7232, -7233,7235,7237,0,0,0,0,7238,7241,0,7242,0,0,7247,0,0,0,7266,0,0,0,0,0,0,0,7289,0 -,0,7290,7291,0,0,7292,0,7297,0,0,0,0,0,0,0,0,0,0,7300,0,7301,0,0,0,0,0,0,0,0,0,0 -,0,0,7302,0,0,0,0,7305,0,0,0,0,7307,0,7308,0,7310,0,7335,0,0,0,0,0,0,0,7337,0, -7343,7347,0,0,0,0,0,7348,0,7349,7350,7352,7354,0,0,0,0,7357,0,7358,7366,0,7367, -7368,0,0,7373,0,0,0,7374,0,0,0,0,0,0,0,7376,0,0,0,7377,0,0,0,0,0,7378,0,7379, -7380,0,0,0,0,0,7383,0,0,7386,0,0,0,0,7398,0,0,0,7399,7400,0,7401,0,0,0,0,0,0,0, -7402,0,0,0,0,0,7405,0,0,0,0,0,7406,0,0,0,0,0,0,0,0,7421,7427,7429,0,0,0,7435,0,0 -,7436,0,0,0,7437,0,0,0,0,0,0,7438,7443,0,7446,0,7448,0,0,0,0,0,0,0,0,0,0,7456,0, -0,0,0,0,7457,0,0,7461,0,0,0,0,0,7462,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7463,7466,7472, -0,7476,0,0,7490,0,7491,0,0,7493,0,0,0,7498,7499,0,0,7508,0,0,0,0,0,7512,0,0,0, -7513,7514,7516,0,0,0,0,7518,0,0,7519,7521,7522,0,0,0,7526,0,0,7529,0,0,7531,0, -7536,0,7538,0,7539,0,0,7541,7542,7546,0,0,0,0,0,7547,0,7548,0,0,0,0,0,7550,0,0, -7552,7553,0,0,0,0,0,0,0,0,0,0,7554,7563,0,7573,0,0,0,0,0,0,7574,7576,0,7578,7581 -,7583,0,0,0,7584,0,7587,0,0,0,0,0,7589,0,0,0,7594,0,0,7595,0,0,7600,7602,7610,0, -0,0,0,0,7612,0,7613,7614,0,0,7615,0,0,7616,0,7620,0,7621,7622,0,7623,0,0,0,0, -7626,0,0,0,0,7627,7629,7631,0,0,7633,0,0,0,0,0,7639,0,7640,7642,0,0,7643,0,0,0,0 -,7644,0,0,0,0,0,0,0,7645,0,0,0,0,0,7661,7662,7663,7665,0,7666,0,7667,0,7684,7688 -,7690,0,7691,0,0,0,0,0,0,7692,0,0,7700,0,7707,0,7708,0,7709,0,7721,0,0,0,7722,0, -7724,0,0,0,0,0,0,7729,7731,0,7732,0,7733,7735,0,0,0,0,0,0,0,7739,0,0,7741,7745,0 -,7748,0,0,0,7751,0,0,0,7752,0,0,0,0,0,0,0,7753,0,0,7756,0,7757,0,7759,0,7760,0,0 -,0,0,7761,7768,0,0,7769,0,0,7770,0,0,7771,0,0,7772,0,0,7773,0,0,0,0,0,7778,7783, -0,0,0,0,0,7784,7785,0,7790,0,0,0,0,7792,0,7798,0,0,0,0,0,7799,0,7810,0,0,7813,0, -7814,0,7816,0,7818,7824,7825,7826,0,7828,7830,0,0,0,7840,0,7842,0,7843,0,0,0,0, -7844,0,0,0,0,0,0,0,7846,0,0,0,0,0,7856,7857,7858,7862,0,7865,0,0,7866,0,0,7913,0 -,0,0,0,7914,0,0,7915,7917,7918,7919,0,7920,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7921, -7922,0,7924,0,0,7925,0,0,7927,0,7930,7935,0,0,7937,0,0,0,0,0,0,7939,0,7940,0,0,0 -,0,0,7941,0,0,0,0,7945,0,0,0,0,7949,0,0,0,0,0,0,0,0,7950,0,7953,0,0,0,0,0,0,0, -7968,0,0,0,0,7969,7972,7992,0,7993,0,0,0,0,0,0,0,0,0,0,0,7994,0,0,0,0,8007,8008, -0,0,0,0,0,0,0,0,0,0,0,0,8010,0,0,0,8012,0,0,0,0,0,0,0,0,8018,0,8028,8029,0,0, -8030,0,0,8032,8033,0,0,8034,8036,0,0,0,0,0,0,0,0,0,0,8037,0,0,0,8043,8052,8059, -8060,0,0,8061,0,0,0,8062,0,8063,0,8064,0,8066,8068,0,0,0,8080,8081,0,8089,0,0,0, -0,0,8092,0,0,0,0,0,0,8093,8110,0,0,0,0,0,0,0,8111,0,0,0,0,0,8112,8115,0,8117,0,0 -,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8120,8121,8122,8128,8129,8130,8131,0,0,8139,0,0, -8144,0,0,0,0,8145,8146,8153,0,0,0,0,0,0,0,0,8154,0,8157,8160,8162,0,8164,8165,0, -0,0,0,8166,8167,0,0,8179,0,0,0,8185,0,0,0,8186,0,0,8187,0,0,0,8188,0,0,0,0,0, -8204,0,0,0,0,8210,0,0,0,0,0,8213,0,8214,0,0,8215,0,0,0,0,0,0,8218,0,0,0,0,0,0,0, -0,0,8219,0,8221,0,0,8222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8225,0,0,0,8233,0,0, -8242,0,0,0,0,0,0,0,0,0,0,0,8247,0,8248,8252,0,8256,8257,0,0,8261,0,8264,8265,0,0 -,0,0,8267,0,0,0,8269,0,0,0,0,0,0,0,0,0,8270,0,0,0,8278,0,8279,8283,0,0,8285,8286 -,8289,8292,0,0,0,0,8293,8295,8299,8300,8301,0,0,0,0,0,0,8304,8307,0,0,0,0,0,0,0, -8321,0,0,0,8322,8323,8325,8326,8327,0,0,8332,8338,0,0,8340,0,0,0,0,0,8350,0,0, -8351,0,8354,8355,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8360,8372,0,0,0,0,0,0,0,0,8377,0,0, -0,0,8380,0,0,0,8383,0,8384,0,0,0,0,8386,8392,0,0,8394,0,0,0,0,0,0,0,8396,8397,0, -8398,0,8399,0,0,0,0,0,8400,0,8401,8410,8411,0,8412,8413,8422,0,0,0,0,8423,0,0,0, -0,8424,0,0,8425,0,0,0,0,0,0,0,8441,8442,0,0,0,0,0,0,8443,0,0,8444,0,8447,0,0,0,0 -,8451,0,8458,0,8462,0,0,8468,0,8469,0,0,0,8470,0,8473,8479,8480,0,0,0,0,8481, -8483,0,0,0,0,0,0,0,0,0,8484,0,0,8490,0,0,0,0,0,0,8491,8493,8494,0,8528,0,0,0,0,0 -,0,0,8530,0,0,0,0,0,0,0,0,8534,8538,8540,0,0,8541,0,0,8545,0,8557,0,0,8569,8570, -0,0,8571,8574,8575,8579,0,8583,0,0,0,0,8591,0,0,0,0,0,0,0,0,8606,0,8607,0,0,0,0, -0,0,0,0,0,8608,0,0,8609,0,0,0,8610,0,0,0,8611,0,0,8613,8617,8621,0,0,8622,0,8623 -,0,8624,8625,0,0,0,0,0,0,0,0,0,8637,8638,8639,8650,0,0,0,0,8652,8654,8655,0,0,0, -0,0,0,0,0,0,0,8656,0,0,0,0,0,8657,0,0,0,0,0,0,0,0,0,8658,0,0,8659,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,8660,0,0,0,0,0,0,8661,8663,8664,0,0,0,0,8665,0,8669,0, -0,0,0,0,0,0,8671,8674,0,8684,0,8686,0,0,0,8689,0,0,0,8690,0,8706,0,0,0,0,0,0,0,0 -,0,0,0,8710,0,8711,8713,8714,8724,8727,8728,8733,8736,0,8737,8739,0,0,0,0,8742, -8743,8745,8754,0,0,0,0,8756,0,0,0,0,0,0,8757,8760,0,0,0,0,0,8762,8763,8764,0, -8766,8769,8770,8773,0,8774,0,8779,0,0,0,0,8780,0,0,8781,0,0,8783,0,0,0,0,0,0,0,0 -,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8784,0,0,0,0,0,0,0,0,8785,0,0,0,0,8786,0,0,0,0,8788 -,8790,0,0,0,8803,0,8813,8814,0,0,0,0,0,8815,8816,0,0,0,0,8818,0,0,0,0,8822,8828, -8829,0,8831,0,0,0,0,8833,0,0,0,8834,0,0,0,8835,0,8836,0,0,0,8837,0,0,0,0,0,0, -8838,8839,0,0,0,0,0,0,0,0,0,0,0,8840,0,0,0,8841,0,8842,0,0,0,8846,0,0,0,0,0,0,0, -8847,0,8848,0,0,8864,0,0,8866,0,0,8870,8872,0,0,8873,8874,0,0,0,0,0,0,8875,0, -8876,0,0,0,0,8896,8900,0,0,0,0,8901,0,0,0,0,0,8904,0,8907,0,0,0,0,8911,8912,8913 -,0,0,0,8914,0,8915,0,0,0,0,0,0,0,0,0,0,0,0,8916,0,0,0,8929,0,0,0,0,0,0,0,0,0,0, -8930,0,8932,0,8943,0,0,0,8945,8947,0,0,0,0,8949,0,8950,0,8954,8957,0,0,8970,0,0, -0,0,8971,0,8996,0,0,0,0,8997,9000,0,0,0,0,9001,9002,0,9004,9009,9024,0,0,0,0,0,0 -,0,0,0,0,0,0,9027,9082,0,0,9083,9089,0,0,0,0,0,0,9090,0,0,0,9092,0,0,9093,0,9095 -,0,0,9096,9097,9101,9102,0,0,0,0,0,0,0,0,9112,0,0,0,0,0,0,9114,0,0,9120,0,9121, -9122,0,0,0,9123,9124,0,0,9125,0,0,9126,0,9127,0,0,9129,9131,0,0,0,9132,0,0,9136, -0,9144,0,0,9148,0,0,0,0,0,0,9149,0,9152,9163,0,0,9165,0,0,0,0,0,0,0,0,0,0,0,0,0, -9166,0,9169,0,0,0,0,0,0,0,9170,0,0,0,0,9172,0,9174,9175,9176,0,9177,0,0,0,0,0,0, -0,0,9186,0,9187,0,0,0,9188,9189,0,0,9190,0,0,0,0,9191,0,0,0,9193,0,0,0,0,9197, -9198,0,0,0,9208,9211,0,0,0,0,9216,9217,0,9220,0,0,0,0,9221,9222,9223,0,9224,9225 -,0,0,9227,0,9228,9229,0,0,9230,0,9232,0,9233,0,0,0,0,0,9234,9235,0,0,9237,0,0,0, -0,0,0,0,0,9238,9240,0,0,9241,0,0,0,0,9244,0,0,0,0,9247,0,0,0,0,0,0,0,0,0,0,9248, -0,0,0,9249,0,0,0,0,0,9250,0,0,0,0,9251,0,0,9252,9255,0,0,0,9256,0,0,0,0,0,0,0, -9257,0,0,9258,0,0,0,0,0,0,9259,0,0,0,0,0,9262,9263,0,0,9265,9266,0,0,0,0,0,0,0,0 -,9268,9271,0,0,0,0,0,0,0,0,0,9273,0,0,0,9276,9277,9279,0,0,0,0,0,0,0,9280,0,0, -9293,0,0,0,0,0,9297,9301,0,0,0,0,0,0,0,0,0,0,0,9308,9309,9313,9321,9322,0,9326, -9327,0,0,9477,0,9479,0,0,0,0,9482,0,0,0,9483,0,9484,0,0,0,0,0,0,0,0,0,9485,0,0, -9486,0,0,0,9489,0,0,0,0,9490,9491,0,0,0,0,9493,0,9495,9496,0,0,0,0,0,0,0,0,9500, -0,9502,0,0,0,0,0,9504,9507,0,9509,0,9511,0,0,9513,0,0,0,0,0,0,0,0,9515,0,0,0,0,0 -,0,9516,9517,0,0,0,0,9532,0,0,9533,0,0,9538,0,9539,9540,0,0,0,0,9541,0,0,0,9542, -0,0,0,0,0,0,0,0,9544,9545,0,9546,0,0,0,0,0,0,9547,9548,0,0,0,9550,0,9557,0,9558, -0,9561,0,9563,9570,0,9572,9574,9575,0,0,0,9577,9592,0,0,9596,0,0,0,9598,0,9600,0 -,9601,0,0,0,0,0,0,9608,0,9638,9639,0,0,0,0,0,0,0,9641,0,0,9643,9644,9645,9646,0, -0,0,9648,0,0,0,0,0,0,0,9650,9654,0,0,0,0,0,0,0,0,9655,0,0,0,0,0,9656,0,9657,0,0, -0,0,9658,0,0,9659,0,0,9664,0,0,9665,0,9667,9669,0,0,0,0,0,0,0,0,0,0,0,0,9671,0, -9673,9681,0,0,0,0,9682,9683,9684,0,0,0,0,9686,9698,0,0,9700,9701,9702,0,9703, -9717,0,0,0,0,9718,0,9726,0,0,0,0,9727,0,0,0,9728,0,9742,0,9744,0,0,0,9750,0,9754 -,9755,0,0,0,0,0,9756,0,9757,9768,0,9769,0,0,0,9770,9771,0,9773,0,9774,0,9775,0,0 -,0,9776,9777,9784,0,0,0,9786,0,9789,0,0,0,0,9793,9794,0,0,0,9808,0,0,0,0,0,9811, -0,0,0,0,0,0,0,0,0,0,0,0,9812,0,9820,0,9823,0,9828,0,0,0,0,9830,0,0,9833,9836,0,0 -,0,9840,0,0,0,9841,0,0,9842,0,9845,0,0,0,9847,9848,0,0,9855,0,0,0,0,0,0,9856, -9863,9865,0,0,0,0,0,0,0,0,9866,9867,9868,9873,9875,0,0,0,0,0,0,9880,0,9886,0,0,0 -,9887,0,0,9891,0,0,0,0,0,0,0,9906,9907,9908,0,0,0,9909,0,0,0,0,0,0,9910,0,0,0,0, -9913,0,0,0,0,9914,0,0,0,0,0,9922,0,0,0,0,9923,9925,0,0,0,0,0,0,9930,0,0,0,9931,0 -,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9932,0,9939,0,0,9940,9962,9966,0,9969,9970,0,0,9974 -,0,9979,9981,9982,0,0,0,9985,0,0,0,0,0,0,9987,0,0,0,0,0,0,0,9988,9993,0,0,9994,0 -,0,0,9997,0,10004,0,0,0,0,0,10007,10019,10020,10022,0,0,0,10031,0,0,0,0,0,10032, -0,0,10034,0,10036,0,0,0,0,10038,0,10039,10040,10041,10042,0,0,0,0,0,10043,0,0,0, -0,0,10045,10054,0,0,0,0,10055,0,0,10057,10058,0,0,0,0,0,0,10059,0,0,0,0,0,0,0, -10060,0,0,0,0,0,0,0,10063,0,10066,0,0,0,10070,0,10072,0,0,10076,10077,0,0,10084, -0,10087,10090,10091,0,0,0,10094,10097,0,0,0,0,0,0,10098,0,0,0,0,0,0,10103,0, -10104,0,10108,0,0,0,0,0,0,0,0,10120,0,0,0,10122,0,0,10125,0,0,0,0,10127,10128,0, -0,10134,0,10135,10136,0,10137,0,0,10147,0,10149,10150,0,0,10156,0,10158,10159, -10160,10168,0,0,10171,0,10173,0,0,0,10176,0,0,0,0,10177,0,0,0,0,10178,0,0,0,0, -10194,0,10202,0,0,10203,10204,0,10205,10206,0,10207,0,0,0,0,10209,0,0,0,0,0,0,0, -10213,0,0,0,0,0,0,10217,0,10229,0,10230,10231,0,0,10232,0,0,10237,10238,10244,0, -0,0,0,0,10250,0,10252,0,0,0,0,0,0,10255,0,0,10257,0,0,0,0,0,0,10258,0,10259,0,0, -0,0,0,0,0,0,10260,0,0,0,0,0,0,0,10284,10288,10289,0,0,0,10290,0,10296,0,0,0,0,0, -10297,0,0,0,0,0,0,10298,0,0,0,0,10299,10303,0,0,0,0,0,10306,0,0,0,10307,0,10308, -0,0,0,0,10311,0,0,0,0,0,0,0,10315,10317,0,0,0,10318,10319,0,10321,0,10326,0, -10328,0,0,0,0,10329,0,0,10331,0,10332,0,0,0,0,0,0,10334,0,0,10335,10338,0,0,0,0, -0,10339,10349,0,0,0,0,0,0,10351,0,10353,0,0,0,0,0,0,10362,0,10368,0,10369,0,0,0, -10372,10373,0,0,0,0,0,10374,0,0,0,10375,0,10376,0,0,10386,10388,10390,0,0,0,0,0, -0,0,10391,0,0,10392,10394,0,0,10396,0,10397,0,10403,0,0,0,0,0,0,0,0,10404,0, -10405,10410,0,0,10411,0,10412,0,0,0,0,0,0,0,10421,10422,10423,0,0,0,0,0,0,0,0,0, -10425,0,0,10427,0,0,10430,0,0,0,0,0,10432,0,10433,10434,0,0,0,0,10436,10437,0, -10438,0,10439,0,10444,10446,0,0,0,0,0,10448,0,0,0,0,0,10449,0,0,0,0,0,0,0,10451, -0,10453,0,0,0,10454,10457,0,0,10459,0,10469,0,0,0,0,0,10472,10481,0,0,0,0,0, -10482,10483,0,10492,0,0,0,0,0,0,0,0,0,0,10499,0,0,0,10502,0,0,10510,0,10521, -10524,0,0,10525,10526,10528,0,0,0,0,0,0,0,0,10530,0,0,0,0,10533,0,10534,0,0,0,0, -0,0,0,0,0,0,10535,10536,0,0,10544,0,10553,10556,0,10557,10559,0,0,0,0,0,10562, -10563,10564,0,10565,0,0,0,10566,0,10567,0,0,0,0,10575,0,0,10576,0,10578,0,0,0,0, -0,0,0,0,0,0,10585,10586,10587,10589,0,10590,0,0,10594,0,0,0,0,0,10598,0,0,10601, -0,0,0,10602,0,10603,0,10604,0,10605,0,0,10607,0,10626,0,10627,0,0,0,0,0,10629, -10630,10631,0,0,0,10646,0,0,0,10647,0,10650,0,10651,0,0,0,10652,10653,10655,0, -10658,0,0,10659,0,10667,0,0,0,0,10669,0,0,0,0,0,0,0,0,0,10670,0,0,0,10671,0,0,0, -0,10672,10673,0,10674,0,0,0,10676,0,0,0,0,0,0,10678,0,10682,0,0,10692,0,10697,0, -0,0,0,10698,0,0,0,10700,0,0,0,0,0,10703,0,10704,0,0,0,0,0,0,0,10705,0,10715, -10718,10720,0,0,10722,0,0,0,0,0,0,0,0,10723,0,0,0,0,10726,0,0,0,0,0,10727,10730, -10743,0,0,0,0,0,0,10744,0,0,10745,0,0,0,0,0,0,10748,0,0,0,0,10750,0,0,10752, -10753,0,0,0,10756,0,0,0,0,0,0,10758,0,0,0,10759,0,10769,0,0,10772,0,0,0,0,0,0, -10773,0,0,0,10777,0,0,10779,0,0,0,0,0,0,0,0,10780,10784,0,0,0,10789,0,0,0,10791, -0,0,0,0,0,0,0,0,0,10795,0,0,10796,0,10808,0,10809,0,0,0,10810,0,0,0,10812,0,0, -10814,0,0,0,0,0,0,0,0,0,10815,0,0,0,0,10816,10817,0,0,0,0,10819,0,10820,0,0,0,0, -10821,10822,10823,0,10826,10849,0,0,0,0,10850,0,0,10852,0,10853,0,0,10856,0,0, -10857,10858,10859,10860,0,0,0,0,0,0,10863,0,10866,10867,10872,10890,0,0,10891, -10892,0,0,0,0,0,10893,0,0,0,10896,10899,0,0,10900,10902,0,0,0,0,0,10903,0,0,0,0, -0,0,0,0,0,0,0,0,10905,0,10906,0,0,0,0,10908,10911,0,10912,0,0,10916,0,0,0,0,0, -10917,0,10918,0,0,0,10923,0,0,0,0,0,10924,0,0,10928,10929,0,0,10930,0,0,0,10932, -0,0,0,0,10939,0,0,10945,0,0,0,10947,0,0,10948,0,0,0,0,0,0,0,0,0,0,0,0,10958,0, -10960,10962,0,0,10964,0,0,0,10966,0,0,0,0,0,0,0,0,0,0,10967,0,0,0,10968,0,0,0, -10973,0,0,0,0,0,10975,0,0,0,10976,10978,0,0,10982,10984,10987,0,0,10988,0,10989, -0,0,10991,0,0,0,0,10992,0,0,0,10993,0,10995,0,0,0,10996,10997,0,0,0,10998,0, -10999,0,11001,0,0,0,0,0,0,11010,11012,0,11013,11016,11017,0,0,11019,11020,11021, -0,0,0,0,0,0,0,0,0,0,0,0,11022,0,0,11023,11029,0,0,0,0,11031,0,0,0,11034,0,0,0,0, -11055,0,0,0,0,0,11056,11060,0,0,0,0,0,0,11061,0,0,11064,11065,0,11066,0,11069,0, -11085,0,0,0,0,0,11086,0,0,0,11088,0,0,0,11094,0,0,0,11095,11096,0,0,0,0,0,0, -11097,11098,0,0,0,0,0,0,11099,0,0,11102,11108,0,0,0,11109,0,11114,11119,0,11131, -0,0,0,11142,0,0,11143,0,11146,0,11147,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11148,0, -11149,11152,11153,11154,0,11156,0,11157,0,0,0,11158,0,0,11159,11160,0,0,0,0,0,0, -0,0,0,0,0,0,11163,0,0,11164,11166,0,0,0,11172,11174,0,0,0,11176,0,0,0,0,0,11182, -11183,0,0,0,11184,11187,0,0,11188,11189,0,0,0,0,0,0,11194,0,0,0,0,0,0,0,11200, -11202,0,0,0,0,0,0,11203,0,11204,0,0,0,0,0,11205,0,0,0,11206,0,11207,0,0,11209,0, -11211,0,11214,0,0,11231,0,0,0,11293,11295,0,0,11296,11297,11302,0,0,0,11307,0,0, -0,0,11309,11310,0,11311,0,0,0,11313,0,11314,0,0,0,0,11334,0,11338,0,0,0,11339,0, -0,0,0,0,11340,0,11341,11342,0,11344,0,11345,0,0,0,11348,11349,0,0,11350,0,0,0, -11355,0,0,0,0,0,0,11356,0,11357,11370,0,0,11371,0,11374,11376,0,0,0,11377,0,0, -11378,11383,0,11386,11399,0,11400,11406,0,0,0,11408,0,0,11409,11412,0,0,0,0, -11417,0,0,0,11418,0,11421,0,11426,11429,0,0,0,0,0,11430,0,11437,0,11438,0,0,0,0, -0,11440,11453,0,0,0,0,0,0,11454,0,0,0,0,11455,0,0,11456,11460,11461,11463,0, -11469,0,11473,0,0,0,0,11474,0,0,0,11475,0,11476,11477,11480,0,0,0,0,11481,0,0, -11484,0,0,11487,0,0,0,0,0,0,0,0,0,0,11497,0,0,11502,0,11509,0,0,11510,11511, -11513,0,0,0,0,0,0,0,0,0,0,11515,0,0,0,0,11516,0,11520,11521,0,0,0,0,0,0,0,0,0,0, -0,11529,11530,11531,11534,0,0,11543,0,0,0,0,0,11547,0,11548,0,0,0,0,0,11552, -11556,0,11557,0,0,11559,0,11560,0,0,0,0,0,0,11561,0,0,11563,11564,0,11565,0,0,0, -0,11567,0,0,0,11569,0,11574,0,11575,0,0,0,11577,0,11578,0,0,0,11580,11581,0,0,0, -11582,11584,0,0,0,0,0,0,0,11587,0,11588,11591,0,11595,0,0,0,0,0,0,0,0,11596,0, -11597,0,0,0,0,11598,11601,0,0,0,11602,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11603, -11604,0,11606,0,0,11608,0,0,0,0,11610,0,0,11611,0,0,0,0,11613,0,11622,0,0,0, -11623,0,0,0,0,11625,0,0,11626,11627,11628,11630,0,0,0,0,0,0,11639,0,0,11646,0, -11648,11649,0,11650,0,0,0,0,0,0,0,0,0,11651,0,0,11652,11653,11656,0,0,11677, -11679,0,0,0,0,11680,0,0,11681,0,11685,0,0,0,0,0,0,0,0,11688,0,0,0,11716,0,11719, -0,0,0,0,0,11721,0,0,11724,11743,0,0,0,0,0,0,0,0,11745,11748,11750,0,0,0,0,0, -11751,0,0,0,11752,11754,0,11755,0,0,0,0,0,0,0,11759,0,0,0,0,0,0,11760,0,0,0, -11761,0,0,0,0,0,0,11766,11767,0,11772,11773,0,11774,0,0,11775,0,11777,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,11778,11780,0,0,0,0,0,0,0,11783,0,11784,0,0,0,11785, -0,0,0,11786,0,0,0,0,11788,0,0,11789,11791,11792,0,0,0,0,11795,11834,11835,11836, -0,0,11837,0,0,0,11838,0,0,11846,11851,0,11852,0,11869,0,0,0,11871,0,0,0,11872, -11874,0,0,0,0,0,0,11875,0,11876,11877,0,0,0,0,0,0,0,0,0,0,11883,0,0,0,0,0,0,0, -11884,0,11885,0,11886,0,0,11887,0,11894,11895,11897,11909,11910,0,11912,11918,0, -0,11920,0,11922,11924,11927,11928,0,0,0,0,11929,0,11934,0,0,0,0,0,11941,11943, -11944,0,11945,0,0,0,0,11948,11949,0,0,0,0,11953,0,11954,0,11955,0,11956,0,0,0,0, -0,11957,0,0,11959,0,0,0,0,0,0,0,0,11961,0,0,0,0,0,11978,0,0,0,11979,11980,11986, -11987,0,11992,0,0,0,0,0,11993,0,0,0,11994,0,11999,12004,12005,12006,0,0,0,0,0, -12011,0,0,12012,12014,0,0,12015,0,0,12019,12028,0,0,12029,0,0,12032,12033,0,0,0, -0,12034,0,12041,12043,0,0,12044,0,0,0,0,0,0,0,12046,0,0,0,0,0,0,0,12054,12055,0, -12056,0,0,0,12060,12064,0,0,0,0,0,12065,12067,12068,0,0,0,0,0,0,0,0,12074,0,0,0, -12075,12076,0,0,0,12079,0,12081,12086,12087,0,0,12088,0,0,0,0,12089,0,12092,0,0, -0,0,12097,0,0,0,0,0,0,0,0,12098,0,0,0,0,0,0,0,0,0,0,0,0,0,12102,12103,12104, -12111,0,0,12114,12116,0,0,0,12118,0,0,0,12119,12120,12128,0,0,0,0,12130,0,0,0,0, -0,0,12131,0,0,0,12132,12134,0,0,0,0,12137,0,12139,0,12141,0,0,12142,0,0,0,12144, -0,0,0,0,0,12145,0,12148,0,12153,0,0,0,0,12154,12171,12173,0,0,0,12175,0,0,0,0, -12178,0,0,0,0,0,0,0,12183,0,0,0,0,0,0,0,0,12184,0,0,0,12186,0,0,0,0,0,12187, -12188,0,0,12189,0,12196,0,12197,0,0,12198,0,12201,0,0,0,0,12203,0,12209,0,0,0,0, -12210,12211,12212,12213,0,12217,12218,0,0,0,0,0,0,0,0,0,12222,0,0,0,0,0,0,0, -12223,0,0,12229,0,0,0,0,12233,0,0,0,0,12234,0,0,12236,12242,0,0,0,12243,0,0,0, -12244,12253,0,12254,12256,0,12257,0,0,12275,0,0,0,0,0,12277,0,0,0,0,0,12278,0, -12289,0,0,12290,0,12292,12293,0,0,12294,0,12295,0,0,12296,0,12297,0,12298,0,0,0, -0,12301,0,0,0,0,0,0,0,0,0,0,0,0,0,12309,0,12338,12340,0,0,0,0,12341,0,0,0,0,0,0, -0,0,12342,12343,0,12344,0,0,0,0,0,0,0,0,0,12345,0,0,0,0,0,0,0,0,12346,0,0,0,0, -12348,0,0,0,0,0,0,0,0,0,0,0,0,12350,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12351,0,12355, -12356,12357,0,0,12367,12370,12371,0,0,0,0,0,12372,12376,0,0,0,0,0,0,0,0,12379,0, -12382,0,12383,0,0,12384,0,0,0,0,12393,0,0,12394,0,0,0,0,12398,12403,0,0,12404,0, -0,0,0,0,0,0,0,0,0,0,0,0,12410,0,0,0,12411,0,0,0,12412,0,0,0,0,12420,0,12421,0,0, -0,0,0,12423,0,12425,12429,0,0,0,12431,12432,0,0,0,0,0,0,0,0,0,0,0,0,12434,0,0,0, -0,0,12435,12436,0,0,0,0,0,0,0,0,12437,0,0,0,0,0,12438,0,0,0,0,0,0,0,0,12445,0,0, -0,12450,12451,0,0,0,0,0,0,0,0,12452,12475,0,0,12493,12494,0,0,0,12495,0,0,0,0, -12496,12502,12509,0,0,0,0,12510,0,12512,12513,0,0,0,0,12514,0,0,0,12515,0,12520, -0,0,0,12524,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12527,0,0,0,12528,0,0,0,12529,0,0,0, -0,0,12530,0,12535,0,0,12536,0,12538,0,0,0,0,0,0,0,0,0,0,0,0,12540,0,12548,0,0,0, -0,0,12550,0,0,0,12551,12552,0,0,0,12554,0,0,0,0,0,0,0,0,12555,0,0,12562,0,12565, -0,12566,0,0,0,0,0,0,0,0,0,0,0,0,12569,0,0,0,12571,12574,0,0,0,0,0,0,0,12577,0,0, -0,0,0,0,0,12578,12579,12603,0,12608,0,0,12611,0,12612,0,12615,0,12625,0,0,0,0, -12627,12646,0,12648,0,0,12657,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12670,0,0,12671,0, -12673,12677,0,0,0,0,0,0,0,0,0,0,0,12679,0,12681,0,12682,12693,0,12694,0,12697,0, -12701,0,0,0,12703,12704,0,0,0,0,12707,12737,0,0,12739,0,0,12740,0,0,12742,12743, -0,0,0,0,0,0,0,0,0,12745,0,12746,12747,0,12748,0,0,12759,12767,0,0,0,0,12773,0, -12774,12778,0,0,0,0,0,0,0,12779,0,0,0,0,0,12780,12793,0,12824,0,12825,0,12836,0, -0,0,0,12839,0,12842,0,0,0,0,0,0,0,0,0,0,0,0,12843,12845,0,12846,0,0,0,0,12847,0, -0,12850,12852,12853,0,0,0,12854,0,0,0,12855,0,12856,0,12858,0,0,12859,0,12862,0, -12863,0,0,12866,0,12869,12872,12873,0,0,0,0,0,0,0,0,0,12875,0,12877,0,0,12878,0, -0,0,0,0,0,0,0,0,12884,12885,12888,0,12889,0,0,0,0,12893,0,0,0,12895,12896,12898, -0,0,0,0,0,0,0,12902,0,12909,12910,0,12926,0,12928,0,0,0,12929,0,12930,0,0,0,0, -12931,0,12932,12933,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12934,0,12942,0,0,0,0,12944, -0,0,0,0,0,0,0,0,12946,0,0,12948,0,0,12949,0,0,0,0,12950,0,0,0,0,12951,0,12952,0, -12953,0,0,0,12954,12958,12959,0,0,0,0,0,12960,12964,0,0,0,0,0,12966,0,0,0,0,0,0, -0,0,12970,0,12971,0,0,0,0,0,0,12972,0,0,12982,0,0,0,12984,12985,0,12986,12996, -12997,13001,13002,0,0,0,0,13004,0,0,13005,0,0,13007,13009,0,13017,0,0,0,13020,0, -13021,0,0,0,0,0,0,0,0,0,0,13022,0,0,0,0,0,0,0,0,13024,13027,0,0,0,0,0,13028,0,0, -13029,0,0,0,0,0,0,0,13032,0,13037,0,0,0,0,0,0,13040,0,0,13041,0,0,0,13043,13044, -13046,0,0,0,0,13047,0,0,0,0,0,0,0,13049,13054,0,13056,0,0,13060,13061,0,0,0,0,0, -13067,0,0,13068,0,13071,0,0,0,0,0,13077,13078,0,0,0,0,0,13079,13080,13081,0, -13082,0,0,0,13085,0,0,0,0,0,0,0,13086,0,13087,13088,0,0,0,0,0,13094,0,13099,0, -13100,0,0,0,13101,0,13125,13126,13128,13129,0,0,13130,0,13131,0,0,0,0,0,0,13134, -0,0,0,0,0,0,0,0,0,0,0,13150,0,13168,0,0,0,0,0,0,0,0,0,13169,0,0,13170,0,0,0,0, -13174,0,0,0,13176,0,0,0,0,0,13177,0,13178,13183,13187,0,0,0,13189,0,0,13190,0,0, -13191,0,0,13206,0,0,0,13207,0,0,0,0,0,0,0,0,0,0,13212,0,0,13219,13232,0,0,0, -13241,0,13249,13253,0,0,0,0,0,13255,13259,0,13260,13261,0,13262,0,13272,0,0,0,0, -13276,0,0,0,0,13277,13299,0,0,13301,13302,0,0,13303,0,0,13305,0,13310,0,0,0, -13311,0,0,0,0,13325,0,13328,0,0,0,13329,0,0,0,0,0,0,13330,0,0,13331,0,13335,0,0, -13342,0,0,0,0,0,13343,0,13354,0,13362,0,13366,13367,13369,0,0,13371,13372,0, -13373,13374,0,13376,0,13380,13381,13386,0,13387,13388,0,13389,13391,13395,0,0,0, -0,0,13401,13409,0,13410,0,0,0,0,13420,0,0,0,0,0,13422,0,0,0,0,13423,0,0,0,0, -13425,0,0,0,0,0,13427,0,0,0,13428,0,0,13430,13438,0,13439,0,13445,0,13448,13449, -0,0,0,0,0,0,13451,0,13457,0,0,0,0,13458,13459,0,13460,0,0,0,0,13464,13465,13466, -13470,0,13471,13472,13474,13475,0,13476,0,0,13478,13479,0,13481,0,0,0,0,13487,0, -13490,0,13493,0,0,13494,0,0,13495,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13496,13497,0, -13500,0,0,13516,13522,0,0,13525,13528,0,0,0,13530,13535,0,13537,13539,0,13540,0, -13543,0,13544,0,0,0,0,0,0,13545,0,0,0,0,0,0,13547,0,0,0,13549,13555,0,0,0,13556, -13557,0,0,0,0,0,0,0,13558,0,13563,0,0,0,0,13564,0,0,0,0,0,0,0,0,13566,0,0,0,0,0, -0,13569,0,0,13571,0,0,0,0,13573,0,0,0,0,0,0,13578,0,0,0,0,0,0,0,0,0,0,13581,0, -13586,0,13595,0,13600,0,0,0,0,0,0,0,0,13601,13603,0,13604,13605,13606,13607,0,0, -13617,13618,0,0,0,0,0,0,0,13623,0,13625,13627,0,0,0,0,0,0,0,0,13629,0,0,0,13634, -0,0,0,13638,0,0,0,0,0,0,0,0,13654,0,0,0,0,0,0,0,0,0,0,13656,0,13659,0,0,13660,0, -0,13662,0,0,0,13663,0,13664,0,0,0,0,0,13668,0,13669,13671,0,0,13672,0,0,0,0,0,0, -13675,13685,0,13686,0,0,0,13687,0,0,0,13692,13694,13697,0,0,0,13702,0,0,0,0,0, -13705,0,0,0,0,13707,0,0,0,13714,0,0,0,0,0,0,0,0,0,13715,0,13716,13717,0,0,13719, -13724,13730,13731,0,0,0,0,0,0,0,0,13732,0,0,0,0,0,0,0,13734,0,13736,0,0,13737, -13738,13747,0,13751,0,0,13752,0,0,0,13753,0,13757,0,0,13762,13763,0,13764,13765, -0,13766,0,0,13767,0,0,0,13768,0,0,0,0,0,0,0,13769,0,0,13772,0,13775,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,13776,13778,13787,0,0,0,13797,0,13798,0,13801,0,13804, -13806,0,0,0,0,13816,13817,0,0,0,0,0,0,0,0,0,0,0,0,0,13834,0,13836,0,0,13838,0,0, -13839,0,13840,0,0,0,0,13842,0,0,0,0,0,0,13843,0,0,0,0,0,0,0,0,0,13845,0,0,0,0,0, -13858,0,0,13860,0,0,13861,0,0,13862,13863,0,13868,0,13869,13870,0,0,0,0,0,0,0,0, -0,0,13872,0,0,0,0,13873,13878,0,0,0,0,0,0,0,0,0,0,13886,0,13888,13889,13890,0,0, -13891,13894,0,13897,13899,13900,13904,0,0,13906,0,0,0,13909,0,0,0,13910,0,0,0, -13911,0,0,0,0,0,13912,13917,0,0,0,0,13918,0,13919,0,0,13920,0,0,0,13921,0,0, -13922,0,0,0,0,0,0,0,13924,0,13927,0,0,0,0,0,13932,0,13933,0,13934,0,0,13935,0, -13944,0,0,0,13954,0,0,13955,0,0,0,0,13956,0,13957,0,13967,13969,0,0,0,0,0,0,0,0, -0,0,0,0,13970,13990,0,13991,13994,0,13995,0,0,0,0,13996,0,0,13999,0,0,0,14018,0, -14019,0,14021,0,0,0,0,0,0,14041,0,0,0,0,0,0,0,0,14043,0,0,0,0,14046,0,0,0,14048, -14049,0,0,0,0,0,0,0,0,0,0,14051,0,0,14052,14056,0,14063,0,14064,14066,0,0,14067, -0,0,0,0,0,0,0,0,0,14068,0,0,0,14072,0,14074,14075,0,14076,14079,14085,14086, -14087,14093,0,0,0,0,14095,0,0,0,0,0,0,14096,14097,0,0,0,0,0,0,0,14098,0,14102,0, -0,0,0,0,14103,0,0,0,14104,0,0,14105,0,0,0,14107,14108,0,0,14109,0,0,0,0,0,0,0,0, -14117,0,0,0,0,14118,0,0,0,0,14119,0,0,14120,0,0,14121,0,14122,14127,0,14128, -14136,0,0,14138,0,14140,0,0,0,14141,14142,0,0,0,0,14146,0,0,14149,0,14151,0,0,0, -14152,0,0,14153,0,0,0,0,0,0,0,0,0,14154,0,14156,14157,0,0,14159,0,14161,0,0,0,0, -14162,0,0,0,0,0,0,14163,0,0,14173,0,0,0,0,0,0,14174,0,0,14176,0,0,14178,0,0, -14179,14181,0,0,14182,14185,14187,0,14190,0,0,14197,0,0,0,0,0,0,0,0,0,0,0,0, -14198,0,0,0,0,0,0,14199,14200,0,0,0,14204,0,0,14208,0,0,0,0,0,0,0,0,0,0,0,14231, -0,0,0,0,0,0,0,0,0,14234,0,0,14235,0,0,0,14240,14241,0,0,0,14246,0,0,0,14247,0, -14250,0,0,14251,0,0,14254,0,0,14256,0,0,0,14260,0,14261,0,0,0,0,14262,14267, -14269,0,0,14277,0,0,14278,0,14279,14282,0,0,0,14283,0,0,0,14284,14285,0,0,0,0, -14286,0,0,0,14288,0,0,0,14289,0,14290,0,14293,14301,14302,14304,14305,0,14307,0, -14308,14309,0,0,0,0,0,0,0,0,0,0,0,14311,14312,0,0,14317,0,0,0,0,0,0,0,14318,0,0, -0,0,14320,0,0,0,0,14321,14322,0,0,0,0,0,14326,14329,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -14330,14331,0,0,0,0,14332,0,0,0,14333,0,0,14337,14340,0,14341,0,0,14342,0,14345, -14346,0,0,14347,0,14362,0,0,0,0,0,14364,14365,14371,0,14373,0,0,14374,0,14379,0, -14400,0,0,0,0,0,14401,0,0,14405,0,14406,0,14408,14409,0,0,0,14417,0,0,14424,0,0, -0,0,0,0,0,0,0,14430,0,0,0,14431,0,0,14435,0,14440,0,0,0,0,0,0,14442,0,0,14443,0, -0,0,0,0,14446,0,0,0,0,0,0,0,14454,0,14457,0,14460,0,0,14466,0,0,0,0,0,14467,0,0, -0,0,0,0,14469,0,14477,0,0,0,0,0,0,14478,14482,0,0,0,14483,0,0,0,14485,14486,0,0, -0,14487,14488,14489,14492,14493,14494,14495,14496,14497,0,14499,0,14501,0,0,0,0, -0,0,0,0,0,0,14502,0,14507,14512,14513,14514,0,0,0,0,0,0,0,0,0,0,0,14515,14526, -14530,0,14537,0,14544,0,14547,0,0,14548,14550,14551,0,0,14552,0,0,0,14553,0, -14554,0,0,0,0,14556,14564,0,0,14565,14566,0,0,0,0,0,0,14568,0,0,14569,0,0,0, -14571,14576,0,0,14577,14578,14579,0,0,14580,0,0,0,0,14582,0,0,0,0,0,0,0,0,0,0,0, -0,14583,0,0,0,0,0,14587,0,14588,0,0,14600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,14601,0,0,14604,14605,14611,0,14613,0,0,0,0,14615,0,0,0,0,0,0,14627,0,14628,0, -0,0,0,14631,0,14633,14634,0,0,0,0,14635,0,0,0,0,0,0,0,0,14636,0,0,14639,14642,0, -0,0,0,14644,0,0,0,0,14645,14646,0,14653,0,0,14654,0,14658,0,14661,0,0,0,14665,0, -0,0,14668,0,0,0,0,0,0,0,0,0,14669,0,0,14670,0,0,0,14680,0,0,14681,0,0,0,0,0, -14682,14683,0,0,0,0,14686,0,0,0,0,14687,14697,0,0,0,0,14699,14705,14711,0,0,0,0, -0,0,0,0,0,0,14712,0,0,0,14713,0,0,0,0,14719,0,14720,14721,14726,0,0,0,14728, -14729,0,0,0,0,14731,0,0,0,0,0,0,0,14733,14736,14737,0,0,14740,14742,0,0,0,14744, -14753,0,0,0,0,14755,14758,14760,0,0,0,0,0,14761,14762,14765,14771,0,14772,0, -14773,14774,0,0,14775,0,0,14776,0,0,0,0,14777,0,14779,0,0,14782,0,0,14785,14786, -14788,0,0,0,0,0,14795,0,0,0,0,0,0,14798,0,14803,14804,14806,0,0,0,14809,0,0,0,0, -0,0,14810,0,0,0,0,14811,0,14812,0,0,0,0,0,14815,0,0,0,0,0,0,0,0,14816,0,14818,0, -0,0,0,0,0,14819,0,14820,0,14823,0,0,0,14824,0,0,14826,14827,0,0,0,0,0,0,0,0,0,0, -0,0,14830,0,0,0,0,0,14833,0,14845,0,0,0,0,0,14846,0,0,14847,14871,0,14873,0, -14876,0,14877,14878,14880,0,0,0,0,0,14881,0,14882,14894,0,0,0,0,14895,0,14907,0, -14908,0,0,0,0,0,0,0,14911,0,0,0,0,14920,0,0,14931,0,14932,14934,14935,0,0,14936, -0,14945,0,0,0,0,0,0,0,14947,0,0,14948,14949,14951,0,0,14952,0,0,0,14964,14973,0, -0,14990,0,0,0,0,14995,0,0,14998,15001,0,0,15002,15020,0,0,0,0,0,0,15021,0,15022, -0,0,0,0,15023,0,0,15025,15029,15033,0,0,0,15034,0,0,0,15035,0,0,0,0,0,15043, -15044,0,0,0,15045,15046,15048,15050,0,15065,0,0,0,0,15066,0,0,15075,15082,15084, -0,0,15085,15086,0,0,0,0,0,0,0,0,15088,0,0,0,15089,0,0,0,0,15094,0,15096,0,15097, -0,15100,0,0,15102,0,0,0,0,0,0,0,0,15105,0,0,15106,0,15109,15113,0,0,0,15115,0, -15118,0,0,0,0,0,0,15119,0,0,15120,0,0,0,0,0,15123,15129,0,0,0,15130,0,15131,0,0, -15134,0,15135,0,0,0,15137,15138,0,0,0,0,0,0,15139,0,0,0,0,0,15140,0,0,15154, -15162,0,15169,15170,0,15175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15177,0,15178,15179,0, -0,0,0,0,15183,0,0,0,0,0,0,0,0,0,0,0,0,15185,15187,0,15194,15195,15196,0,0,0,0,0, -0,0,15204,0,0,0,0,15206,0,0,0,0,0,15207,0,0,0,0,0,0,0,0,0,15213,0,15214,0,0,0,0, -0,0,0,15232,0,0,0,0,15234,0,15238,15240,0,15248,0,0,0,0,15250,15251,0,0,0,0,0,0, -0,15252,0,0,0,15255,15262,15266,0,0,0,15267,0,0,0,15277,15279,0,0,0,15280,15281, -15282,0,0,0,0,0,15285,0,0,0,0,15289,0,0,15291,0,0,0,0,0,0,0,15296,15297,0,0, -15304,0,0,0,0,15306,0,0,0,0,0,0,15307,15308,0,15309,0,0,15311,0,0,15312,15313,0, -0,0,0,0,0,0,0,0,0,0,0,15314,15317,0,0,0,15318,15319,0,0,0,0,15320,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,15321,0,0,0,0,0,15324,0,15325,15326,0,15330,0,0,0,0,15334,0, -15335,0,15341,0,0,15342,0,0,15343,15344,0,0,0,0,15345,0,0,0,0,15347,0,0,15348, -15349,15350,0,15356,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15357,0,15358,0,0,0,0,0,0,0, -15359,15360,15364,0,15380,0,0,0,0,0,15392,0,0,15393,0,15395,0,0,0,0,0,0,0,0, -15396,0,0,15397,15398,0,0,0,0,0,0,0,0,0,15399,0,15400,0,0,0,15402,0,15405,15410, -0,0,0,0,15411,0,0,0,15412,0,15416,0,0,0,0,0,0,0,15428,0,15435,0,0,15438,0,0,0,0, -15439,0,0,0,15440,0,0,0,15441,15449,15451,0,0,0,0,0,0,0,15452,0,0,15455,0,0,0, -15456,0,0,15458,0,15460,15461,0,0,0,0,0,15462,15464,0,15465,0,0,15466,0,0,15467, -0,0,0,0,0,15468,0,0,0,0,15481,0,0,15484,0,15485,15486,0,0,0,15487,0,0,0,0,0, -15488,0,15492,15498,0,0,0,15499,0,0,0,15500,0,15501,0,0,15512,0,15522,0,0,0, -15524,0,15525,15526,0,0,15527,0,0,15545,15546,0,15548,15552,0,15553,0,0,0,15554, -0,15555,0,15557,15565,15573,15577,15578,0,15582,0,15583,0,0,0,0,0,0,0,0,0,0,0,0, -0,15586,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15588,0,0,0,0,0,15589,0,0,0,0,0,0,0,15593, -15594,0,0,0,0,15595,0,0,0,0,0,0,15596,0,0,0,15597,0,0,0,0,15600,0,0,15601,0,0,0, -0,15602,15603,0,0,0,0,0,0,15604,0,15609,0,0,15612,0,0,15613,0,0,15615,15617, -15618,0,0,15620,0,15636,15637,0,0,15649,0,0,0,0,0,0,0,15650,0,0,15651,0,0,0, -15656,0,15658,0,0,0,15664,0,0,15665,0,0,15668,0,0,0,0,0,15669,0,0,15674,0,0, -15675,0,0,0,0,15676,0,0,0,0,0,0,0,0,0,0,0,15677,0,0,0,0,15678,0,0,0,0,0,15679,0, -0,15681,0,15686,0,0,0,0,15687,0,15688,0,0,15690,0,0,0,15697,0,15699,15700,0,0,0, -0,0,0,0,0,0,15701,0,15702,15703,0,15704,0,15705,0,15707,0,15709,0,15712,15716,0, -15717,0,15718,15720,0,0,0,0,0,15724,0,0,0,15725,0,15726,0,0,0,15740,0,15745, -15746,0,0,15747,0,15748,0,0,0,0,0,15749,0,0,0,15752,0,15753,0,0,0,0,0,0,15759,0, -0,0,15765,0,0,0,0,0,0,0,0,0,15767,0,0,0,15771,0,0,15784,0,0,0,0,15785,15790, -15791,0,0,15792,0,0,0,15807,0,15811,0,0,0,0,0,0,0,0,0,0,0,0,15818,0,0,0,15819,0, -0,0,0,15821,0,0,0,0,0,15822,15824,0,0,15827,0,0,15829,15831,0,15832,0,0,15833,0, -15835,15838,15839,15843,0,0,0,0,0,0,0,0,0,0,0,15844,0,0,0,0,15845,15851,15856,0, -0,0,0,0,0,0,15858,15860,0,15861,0,0,0,15864,0,0,0,0,15865,0,0,0,0,0,0,15866,0, -15872,0,0,15876,0,0,0,0,15877,15878,15883,15885,0,0,15888,0,0,0,0,0,15889,15890, -0,0,0,0,0,0,0,0,15892,0,0,0,0,0,0,0,15893,0,0,15894,0,0,0,15895,0,15896,15897,0, -15898,15901,15902,0,15911,15915,0,15916,0,15924,15935,0,15937,0,0,0,0,0,15950,0, -0,0,0,0,0,0,15958,0,0,0,15961,0,0,15966,0,15967,0,0,15977,0,0,15978,0,0,15981, -15982,15983,0,0,0,0,0,0,0,15986,0,0,0,15990,0,15991,15995,15998,0,15999,0,16000, -0,0,0,0,16008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16009,16011,0,16013,0,0,0,0, -0,0,0,0,16014,0,0,16015,16023,16024,16025,0,0,16026,0,16030,0,16032,0,16033,0,0, -0,0,0,0,16035,16036,16037,0,0,0,0,0,16039,0,0,0,0,16041,0,0,0,0,0,16043,16044,0, -0,16047,0,0,0,16048,0,0,16049,16050,16052,0,0,0,0,0,16055,0,0,0,0,0,0,0,0,16056, -0,0,0,0,0,0,0,16058,16060,16061,0,0,16063,0,0,16064,0,0,0,16067,16068,0,0,16069, -16078,0,0,0,16079,0,0,0,16080,0,16081,0,0,0,16088,0,0,0,0,0,0,0,0,0,0,0,16089, -16093,0,16097,0,16103,0,16104,16105,0,0,16256,0,0,16259,0,0,0,0,0,0,0,16260, -16261,0,0,16262,0,0,16263,0,16268,0,0,0,0,0,0,0,16269,0,0,16270,16273,0,16274,0, -0,0,0,16275,16276,16277,16280,0,0,0,16281,16284,0,0,0,16286,0,16289,0,0,0,0,0,0, -0,0,0,16290,0,0,0,0,16291,0,0,0,0,0,0,0,16292,0,0,0,0,0,0,0,0,16293,16295,16297, -0,16302,0,16304,0,16305,0,16306,0,0,0,0,0,0,0,0,0,0,0,0,16307,16308,16312,0,0,0, -0,0,0,16313,16315,0,16318,0,0,0,16321,0,0,0,0,0,0,0,16326,16333,16336,0,0,0,0, -16337,16340,0,0,0,0,0,16345,0,0,16346,0,0,0,0,0,0,0,0,0,16347,0,0,16348,0,0,0,0, -16349,0,0,0,16350,0,16357,0,0,0,0,16359,16360,0,0,0,0,16362,16363,16364,16365,0, -0,16366,0,0,0,0,16367,16368,0,16369,16374,0,0,0,0,0,0,0,16376,0,0,0,0,16378, -16379,0,16380,0,0,0,16381,16383,0,0,0,0,0,16390,0,0,0,16399,0,16402,16404,16406, -16407,0,0,0,16409,16411,0,0,0,0,16412,0,16413,16415,16423,0,0,0,0,0,16424,0,0,0, -16428,16434,16435,16449,0,16450,16451,0,0,0,16453,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -16454,0,0,16456,16458,0,0,16459,0,0,16460,0,0,0,0,16462,0,16463,0,0,16466,0,0,0, -0,0,16479,0,0,16480,0,16481,16484,0,0,0,0,0,0,0,0,0,0,16485,0,0,0,0,0,0,16489,0, -0,0,0,0,16491,0,0,16498,0,0,16503,0,16505,0,0,0,0,0,0,0,0,16506,0,0,0,16508, -16509,0,0,0,0,0,0,0,0,16511,16513,0,0,0,16516,0,16517,0,16519,0,16529,0,0,16531, -0,0,0,0,0,0,16534,0,0,16541,16542,0,0,0,0,0,0,0,0,0,16543,16547,16548,0,0,0, -16551,0,16552,0,0,0,16553,0,0,16558,0,0,16562,16565,0,0,0,16570,0,0,0,16573, -16585,0,0,0,16586,16587,16595,0,16596,0,16598,0,0,0,16600,0,0,0,0,0,0,0,0,0,0,0, -0,0,16601,0,0,0,0,16603,0,0,0,0,0,0,0,16604,16612,0,0,0,0,16613,0,16618,0,0,0, -16640,0,0,16641,0,0,0,0,0,0,16645,0,0,0,0,16646,0,0,0,0,0,0,16651,0,0,0,0,16653, -16654,0,0,0,16655,0,0,16656,16667,0,0,0,0,16671,0,16672,0,0,0,16673,0,0,0,0,0, -16676,0,16686,0,0,0,0,16689,0,16690,0,16692,0,16693,0,16694,0,16696,0,0,0,16705, -0,0,0,0,0,0,16707,0,0,0,16709,0,0,0,0,16711,0,16712,16713,0,0,0,16715,0,0,0,0, -16716,0,0,0,0,0,0,0,0,0,16718,16724,0,0,16726,16727,0,0,0,0,0,0,0,16728,0,16729, -0,0,16730,0,0,0,0,0,16731,0,0,0,16732,0,0,0,0,16734,16738,0,0,0,0,0,0,0,0,16743, -0,0,16745,0,0,0,0,0,16749,0,16752,0,0,0,0,16756,0,0,16758,0,16759,0,0,0,0,0, -16760,0,0,0,0,0,0,0,16762,0,16769,0,16770,0,16772,0,0,0,16777,16780,0,0,0,0,0,0, -16781,0,0,16782,0,16784,0,0,16785,16787,16792,0,0,16794,0,0,0,16798,0,0,16809,0, -0,16814,16816,16817,0,16819,0,0,0,0,0,0,0,0,0,0,16820,0,0,16836,16839,0,0,16841, -16851,16857,0,0,16858,16859,0,0,16860,0,0,0,0,0,0,0,0,16862,0,16863,0,0,0,0,0,0, -0,16864,0,0,0,0,0,0,0,16876,0,16881,16882,0,16885,16886,0,16887,0,0,0,16889, -16891,0,0,0,0,0,16894,16895,0,0,0,0,0,0,0,0,0,0,0,16897,0,16898,0,0,0,0,0,16913, -0,0,16924,16925,16926,0,0,16927,0,0,0,16937,16938,0,0,0,16940,16941,0,0,0,16942, -16945,0,16946,16949,16950,0,0,0,16952,16955,0,0,0,16965,0,16969,0,0,16975,0,0, -16976,0,0,0,0,16978,0,0,16981,0,16983,16989,0,0,0,0,16990,0,0,16991,0,0,0,16993, -0,16994,16996,17000,0,0,0,0,0,17002,17004,0,17006,0,0,17007,0,0,0,0,17008,17013, -17014,0,0,0,0,0,0,0,0,0,17021,0,17031,0,0,0,0,0,17033,17036,0,17038,0,0,17039,0, -17045,0,0,17046,17047,0,0,0,0,17048,0,17049,17050,0,17051,17053,0,17054,0,17055, -0,0,0,0,0,17063,0,0,17064,0,0,0,0,0,0,0,17065,0,0,17068,0,0,0,0,0,17072,0,0,0,0, -0,0,17073,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17074,0,17080,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,17081,17083,17084,0,0,0,17085,0,0,0,0,17092,0,0,0,0,0,0,0, -0,0,17093,0,17095,17102,0,0,0,0,0,0,17103,0,0,17105,0,17107,0,0,0,0,17114,0,0,0, -0,0,17115,17125,17127,0,0,17128,0,0,0,17129,17130,0,17131,0,0,0,0,0,17132,17135, -17145,0,0,0,0,0,0,0,0,17146,0,17147,0,17148,0,0,0,0,0,0,17149,17150,0,17151, -17153,0,17155,0,0,0,0,17163,17171,0,17174,0,0,0,0,17179,0,0,17182,17185,0,0,0,0, -0,17186,0,0,17188,0,0,0,0,0,0,0,17189,17191,0,17194,0,0,0,0,0,0,0,0,0,17195, -17196,17203,17204,0,0,17205,17217,0,0,0,0,0,17218,0,0,0,0,17219,0,17220,0,17221, -0,0,17230,0,0,0,0,0,17236,0,17238,17239,0,0,0,17241,17244,0,0,17245,0,17248,0,0, -17251,0,17252,0,0,17264,0,17266,0,0,0,17268,0,0,0,0,17271,17272,0,17273,0,17295, -0,17302,0,17305,0,0,0,17306,0,0,0,0,0,0,0,17308,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -17309,0,17310,17313,0,0,0,0,17314,17315,0,17317,0,0,0,0,17318,0,0,0,0,0,0,0, -17320,0,0,0,0,0,0,17334,0,17344,17348,0,0,0,17350,17351,0,0,17353,0,0,17354,0,0, -0,0,0,0,0,0,0,17355,0,0,0,0,0,0,17356,17357,0,0,17359,0,0,0,17371,0,17372,0,0,0, -17393,0,0,0,0,17394,0,0,0,0,0,17395,0,0,17399,0,0,0,17401,17417,0,17418,0,17419, -0,0,0,0,0,17422,17423,0,0,0,0,0,17424,0,0,0,0,0,17428,17429,17433,0,0,0,17437,0, -0,17441,0,0,17442,0,0,17453,0,0,0,0,0,0,0,0,17454,17456,17462,0,0,17466,0,0, -17468,0,0,17469,0,0,0,0,17470,0,17475,0,0,0,0,0,17479,0,0,0,17483,17484,0,17485, -0,17486,0,17491,17492,0,0,17493,0,17494,17495,0,0,0,17496,0,0,0,17497,0,0,0, -17502,0,0,0,0,0,17503,0,17505,0,17507,0,0,0,17512,17513,17514,0,0,17515,0,0,0, -17519,0,0,0,17522,0,0,17523,0,0,0,0,0,0,0,0,0,17527,0,0,0,17528,0,0,0,17534,0,0, -0,0,17536,0,0,0,17539,0,17540,17543,17549,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17556, -0,0,17558,0,17559,0,0,17560,0,0,0,17563,0,0,0,0,0,0,17564,0,0,17565,17566,0, -17567,0,0,0,0,0,0,17569,17570,0,17575,0,0,0,0,0,0,0,0,0,0,0,17581,0,0,0,17582, -17583,0,17586,0,0,17587,0,0,0,0,0,0,0,17588,0,0,0,0,17596,17597,0,0,17598,17600, -0,0,0,0,0,0,17601,0,0,0,17604,0,0,17605,0,0,17607,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,17612,0,0,17618,0,17621,17622,0,0,0,0,17623,0,0,17624,0,0,17630,0,0, -17631,17633,17634,0,0,0,0,0,0,0,17635,0,0,17636,0,0,17637,0,17638,0,17640,0,0,0, -0,0,0,0,0,0,0,17641,0,0,0,0,0,0,0,0,0,0,17643,0,0,0,0,17645,0,0,0,0,0,0,0,0, -17646,17662,0,0,0,0,0,0,0,0,0,17663,17664,0,17665,17666,0,0,0,17669,17671,17673, -0,17679,0,0,0,0,0,0,0,17684,0,0,0,17686,0,17714,0,0,17720,17722,17726,0,0,17728, -0,0,17729,0,0,0,17732,0,17733,0,17734,0,0,0,17735,0,0,0,0,17737,0,0,0,0,17739,0, -0,0,17741,17742,0,0,0,0,17743,17744,17745,0,0,0,17749,0,17750,17751,17752,17754, -17761,17762,0,17763,0,17766,0,17772,0,0,0,0,0,17775,0,0,0,0,0,0,0,17776,0,0, -17777,0,0,17778,17779,0,17782,17783,0,0,0,0,0,0,0,0,0,0,17784,0,0,0,0,0,0,0, -17821,0,0,0,17822,0,0,0,17823,17825,0,0,0,0,0,17826,17831,17832,17833,0,0,17845, -0,0,0,17846,0,0,0,17848,17850,17854,0,17855,0,0,17859,0,0,0,0,0,0,17860,17861,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17870,17871,0,0,0,0,0,0,17872,0,0,0,17879,0, -0,0,17881,17883,0,17884,0,17885,0,0,17886,0,0,17887,17891,17953,0,0,0,0,17954,0, -0,17955,0,17968,0,0,17972,0,0,0,0,0,17974,0,0,0,0,17976,17978,0,0,17983,0,0,0,0, -18003,0,0,0,0,0,18007,0,0,0,0,0,18009,0,0,0,0,0,0,0,18010,0,0,0,0,0,0,18012,0,0, -18014,0,0,0,18015,0,0,0,18016,0,18017,0,0,0,18030,0,0,0,0,0,0,0,18031,0,0,18036, -18037,18038,0,0,18049,18056,0,18057,18058,0,18059,0,0,0,0,0,0,0,0,18062,0,0,0,0, -18064,0,0,0,0,0,0,0,0,18067,0,0,0,18068,0,0,18075,0,0,18078,18093,18094,0,0,0,0, -0,0,0,0,18097,0,0,0,0,0,18098,18100,0,0,0,18108,0,18111,0,0,18112,0,18113,0,0, -18115,18116,0,18118,0,0,0,0,18121,0,0,0,0,18123,0,0,0,0,0,0,0,0,0,18124,0,0,0,0, -18125,18126,0,18127,0,0,18128,18135,0,0,0,0,0,0,0,0,0,18150,0,0,0,0,0,18151, -18152,0,0,18156,18164,0,18166,18171,0,0,0,0,0,0,0,0,0,18172,18183,0,18184,0,0,0, -0,18185,0,18187,0,0,0,0,0,18188,0,0,0,0,0,0,0,0,18189,0,0,18190,0,0,18191,18192, -0,0,18194,18195,18196,0,0,0,18197,0,18203,0,18204,0,0,0,0,18205,0,0,0,18207, -18208,0,0,18214,0,0,0,18215,18216,0,0,0,18220,0,0,18222,0,0,0,0,0,18223,0,18225, -18231,0,18234,0,18235,0,0,0,0,18240,0,0,18241,18242,0,0,0,0,0,18243,18251,0, -18253,0,18254,0,0,0,18266,0,0,0,0,0,0,18269,18270,18271,18273,18281,0,0,0,0,0,0, -0,0,0,0,0,0,18282,0,18283,0,18284,0,0,0,0,0,0,18285,0,18287,18289,0,0,18290,0,0, -0,0,18308,0,0,0,18310,0,0,0,0,0,0,0,0,0,0,0,0,18311,0,18312,18313,0,18315,0,0, -18316,18320,0,18331,0,18332,0,18336,0,0,0,0,18337,0,18340,0,0,0,0,0,0,0,0,0, -18341,0,18344,18345,0,18346,0,0,0,0,0,18348,0,18351,0,0,18356,0,0,0,0,0,0,18357, -0,0,0,0,0,18367,0,0,0,18368,0,18369,0,18370,18371,0,0,0,18437,18444,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,18445,18450,0,0,0,0,18451,0,18452,0,0,0,18453,0,0,0,0,0,18455,0, -0,0,18456,0,18457,0,18460,0,0,18461,0,0,0,0,0,0,0,0,18466,0,0,18467,0,0,0,0, -18473,0,0,0,18476,0,18477,0,0,0,18478,18479,18480,0,0,0,18485,0,0,0,18486,0,0,0, -0,0,0,18488,18490,0,0,0,0,0,0,18491,0,0,0,0,0,18495,0,0,18496,0,0,0,0,0,0,18505, -0,18521,0,18522,18523,0,0,0,18525,18526,0,0,0,0,0,18527,0,0,0,0,18532,18533,0, -18534,0,0,0,0,0,0,18535,18537,0,18538,0,0,0,0,0,0,18540,18541,18542,18543,0, -18546,0,0,0,0,18553,18556,0,0,18558,0,0,18569,18571,0,0,0,18572,0,18574,0,0,0,0, -18586,0,0,0,0,0,18588,0,0,18589,0,0,0,0,0,0,18590,0,18592,0,0,0,0,18594,0,0,0, -18596,0,0,18597,18598,0,0,18601,0,0,0,0,18602,0,0,0,18603,18604,0,18605,0,0,0,0, -18608,0,0,18611,0,0,0,0,0,0,0,0,0,18612,0,18616,0,0,18617,18619,0,0,0,18628,0,0, -0,18629,0,0,18630,0,0,0,0,0,0,0,18631,0,18632,0,0,18635,18637,0,0,0,0,0,0,18641, -18643,18648,0,18652,0,0,18653,0,18655,18656,0,0,0,18657,0,0,18666,18674,0,0,0,0, -18677,18684,18685,0,0,18686,0,0,18690,0,0,0,0,0,0,0,18695,18696,0,0,0,0,0,0,0,0, -0,0,18697,0,0,18700,0,0,0,0,0,0,18702,0,18708,0,0,18709,0,18710,0,0,18711,0, -18714,0,0,18718,0,0,0,0,0,0,18719,0,0,18722,0,18726,0,0,0,0,0,0,0,0,0,0,0,0,0, -18731,0,0,0,0,0,18739,18741,0,0,18742,0,18743,18744,18746,18748,0,18752,18753,0, -0,18754,18763,0,18765,0,0,0,18766,0,0,0,18769,0,0,0,0,0,18773,18778,18779,18781, -0,0,18784,18787,0,18788,0,18793,0,0,0,0,0,0,18795,0,0,18800,0,0,0,0,0,18801, -18804,0,0,0,0,0,0,0,18806,0,0,0,18811,18815,18816,0,0,0,0,18825,0,0,18827,18829, -0,0,18830,0,0,0,0,18831,0,0,18832,0,0,0,0,18833,0,18840,0,18841,0,18842,0,0,0,0, -18843,0,18844,0,0,0,0,0,0,18845,18846,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -18848,0,0,0,18853,18860,0,0,18862,18866,0,0,18867,18869,0,0,18874,18881,18891,0, -0,0,0,0,0,0,0,0,0,18892,0,0,0,0,0,0,0,0,18895,0,18896,0,0,0,18900,0,0,0,18901,0, -18902,18915,18916,0,0,0,0,0,0,0,0,18919,0,0,0,0,0,18920,0,0,0,18921,18929,0,0,0, -0,18930,0,0,0,0,0,0,18932,0,0,0,0,18934,18942,0,0,0,18951,18957,0,0,0,0,18958,0, -0,0,0,18959,18960,0,0,18961,0,0,18962,0,0,0,0,18963,18964,0,0,0,18965,0,18967,0, -0,0,0,0,0,0,0,0,18968,0,18969,0,18970,18973,18976,0,0,0,0,0,0,18977,0,0,0,18981, -0,0,0,18990,0,18998,0,0,0,0,0,18999,19003,0,0,19005,0,0,0,19006,0,0,0,0,0,0, -19008,19011,0,0,19018,0,0,19019,0,19024,0,19031,19032,0,19039,0,19041,19050,0,0, -0,19051,19055,19056,0,19059,19063,19064,0,0,19088,0,0,0,19093,19094,0,0,0,0, -19095,0,19096,0,0,0,19097,0,0,19098,0,19099,19100,0,0,19103,0,0,0,0,0,0,0,19111, -0,0,0,0,0,0,19112,0,0,0,19116,19117,0,19121,19122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,19123,19124,0,0,0,0,0,0,0,19125,19126,0,19128,0,0,0,0,0,0,0,0,0,0, -19129,19130,19131,19132,0,0,19146,0,0,19147,19156,19158,0,0,0,0,0,0,0,0,19182, -19185,0,0,19187,0,0,0,19193,0,0,0,0,0,19194,0,19197,0,0,0,0,19198,0,0,0,0,0,0,0, -0,0,0,19202,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19203,0,19205,19210, -0,0,0,19213,0,19218,0,0,0,19223,19229,0,0,19230,0,0,19231,19232,19233,19239,0,0, -0,0,0,19240,0,19248,19249,0,0,0,0,19254,0,19256,19258,19259,0,0,19261,0,19266,0, -0,0,19272,0,19278,19281,19282,0,0,0,0,0,0,0,0,0,0,0,0,19283,0,0,19284,0,0,19285, -19287,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19288,19291,0,19292,0,0,0,0,19297,0,19298,0,0, -0,0,19302,19303,0,0,0,0,19304,19305,0,0,0,0,19314,0,0,19315,0,0,19321,0,0,0,0,0, -0,0,19322,0,19333,0,19334,19335,0,19336,19337,0,0,0,0,0,0,0,0,0,0,0,19346,0,0, -19353,0,19354,19362,0,19366,19367,0,0,19369,0,19375,0,19377,19380,19388,0,0,0,0, -0,19389,19390,0,0,0,0,19392,0,0,0,0,0,19402,0,0,0,0,0,0,0,0,19412,0,0,19413, -19422,0,19424,0,0,0,19425,0,0,0,19428,0,0,0,0,19431,0,0,0,0,0,19432,0,0,0,0,0, -19448,19459,0,0,19461,0,19462,19463,0,19467,19474,19482,0,0,0,0,19494,0,0,0,0, -19501,0,0,0,0,0,0,0,0,0,0,19502,19504,0,0,0,0,0,0,0,19505,0,0,0,0,19506,19507,0, -0,0,19508,0,0,19511,0,0,19514,0,19515,0,19516,0,19518,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,19530,0,19537,19538,0,19543,19546,0,19547,19551,0,0,0,0,0,0,19552, -19553,0,0,0,0,0,0,0,0,0,0,0,0,19555,0,0,19556,0,0,0,0,0,0,0,0,0,0,0,0,19560, -19561,0,0,19562,0,0,0,0,0,0,19565,19567,0,19568,0,0,0,19569,19570,0,19578,0,0,0, -0,19580,0,0,0,0,19581,19584,0,0,0,0,0,0,0,19585,19586,0,0,0,19587,19588,0,19589, -0,0,0,0,0,0,19592,19593,19599,0,19600,0,0,19604,0,0,19605,0,19606,19608,19610,0, -19613,19614,0,0,0,0,0,0,19616,19617,0,0,19618,0,0,19619,0,0,0,19620,19621,19631, -0,0,19632,19634,19636,0,19643,0,0,19644,19658,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,19659,0,0,0,0,0,0,0,0,0,0,0,19675,19677,0,0,0,0,19679,0,19683,0,19684,0,0, -0,0,0,0,19687,0,0,0,0,0,0,0,0,19688,19689,19692,0,0,0,0,0,0,0,19695,19697,0,0,0, -0,0,19698,19699,0,0,19700,0,19702,0,0,19703,0,0,0,0,0,0,19704,19708,0,19710,0, -19713,0,0,0,19715,0,0,0,0,19718,0,0,0,0,0,0,0,19720,0,19722,0,0,19725,0,0,0,0,0, -0,0,0,0,0,0,0,0,19730,0,0,0,0,0,19731,0,19734,19735,19739,0,0,19740,0,19741,0,0, -0,19746,0,0,19747,0,19771,0,0,0,0,0,0,0,0,19772,19775,0,0,0,0,0,0,19778,0,0,0,0, -0,19779,0,0,19780,19790,0,19791,0,0,19792,0,0,0,19793,0,0,19796,19797,0,0,0, -19799,0,0,0,19801,0,0,0,0,19803,0,19804,0,19805,0,0,19807,0,0,0,19808,0,0,0,0,0, -0,19809,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19816,0,19821,0,19822,19830,19831,0,0, -0,19833,0,0,0,0,0,0,0,0,0,0,19838,0,0,0,0,19839,0,0,19843,0,0,0,0,19845,0,0,0,0, -19847,0,0,19848,0,19849,0,0,0,0,0,0,0,19851,0,0,0,19854,0,0,0,0,0,0,0,0,0,19864, -0,19865,0,19866,0,0,0,0,0,0,0,19868,0,0,19870,0,0,19871,0,0,19872,19873,19875,0, -19880,19882,19884,0,0,19885,19886,19888,0,0,0,0,0,0,0,0,0,0,0,0,19890,19892, -19893,0,0,19894,0,0,0,19895,0,19896,19902,0,0,19903,0,0,19905,0,0,0,19906,0, -19908,0,19909,19911,0,0,0,19913,19920,0,19938,19939,19940,0,0,0,0,0,0,0,19942,0, -19943,0,19945,0,0,0,19951,19952,19954,19960,0,19965,0,19971,0,0,0,0,0,19975,0, -19976,0,19990,0,0,19991,0,19993,0,19995,0,0,0,19998,19999,20001,0,20003,20005,0, -20011,20012,0,0,0,0,0,0,20014,0,20020,0,0,0,0,20021,0,0,0,0,0,20023,20024,0,0,0, -0,0,20025,0,0,20027,0,0,20029,0,0,20032,0,0,0,0,20044,20045,0,20048,20049,0,0, -20050,0,20052,0,0,20054,20057,0,0,0,0,0,0,0,0,0,20059,0,0,20061,0,20062,0,20064, -0,0,20066,0,0,20067,0,0,0,0,20069,0,0,0,0,0,0,20070,20071,0,0,0,0,0,0,0,0,0,0,0, -20072,0,0,20073,20074,0,0,0,0,0,20075,0,20078,0,0,0,0,20080,0,20081,0,0,0,0,0,0, -20095,0,20098,0,0,0,0,0,0,0,20107,0,0,0,0,0,0,0,0,20112,0,0,0,20113,20114,0,0,0, -20115,20123,20124,0,0,0,20131,20133,20134,0,0,0,0,20136,0,0,20137,20138,20150,0, -20152,0,0,0,20153,0,0,20154,0,0,0,20158,0,20163,0,0,20164,0,0,0,0,0,0,0,20166,0, -20168,0,20170,0,20175,0,0,20178,0,0,0,0,20223,0,0,0,0,20224,0,20226,0,0,20230,0, -20231,0,0,0,0,20232,0,0,20233,20234,0,20244,0,20247,0,0,0,0,0,0,20249,0,0,0, -20250,0,0,0,0,20251,0,20253,0,20254,0,0,0,0,20256,0,0,20264,0,0,0,0,20266,0,0,0, -20278,0,0,20279,20282,0,0,0,0,0,20283,0,20284,0,20285,0,20287,20290,0,0,0,0, -20292,0,0,0,0,20293,20297,0,0,0,0,0,0,20299,0,20300,20303,0,0,0,0,0,0,20307,0,0, -20308,0,20309,0,20310,0,0,0,0,0,0,20312,0,0,0,20314,0,0,0,0,20315,20316,0,20322, -0,0,0,0,0,0,20339,0,0,0,20342,0,0,0,0,20352,0,0,0,0,0,0,0,0,0,0,20362,0,0,20365, -0,20375,20377,0,0,0,0,0,0,0,0,0,0,0,20378,20379,0,20380,0,0,20381,0,20382,0, -20383,0,20388,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20390,20392,20393,0,0,20395,0,0,0,0,0, -20396,0,0,0,0,0,0,0,0,20398,20415,0,0,0,20417,0,0,20420,0,0,20426,20428,0,20431, -0,0,20432,0,20433,20434,20435,0,0,0,0,20440,0,0,0,0,0,20442,0,20443,0,20446,0,0, -0,0,20448,0,20451,0,0,0,0,0,0,0,0,0,20452,20453,0,0,20454,0,0,0,0,0,0,20457,0, -20458,0,0,0,20465,0,0,0,0,0,20469,0,0,0,20473,0,20476,0,0,0,0,0,0,0,0,20477,0,0, -20485,0,0,20486,0,0,20487,0,20496,0,20497,0,0,20498,0,0,0,0,0,0,0,0,0,0,20499, -20500,0,20501,0,0,0,0,0,20520,20527,0,20529,0,0,0,0,20539,0,0,20540,0,0,0,20543, -0,0,0,20546,0,0,0,0,0,20548,0,0,20563,0,0,20564,0,20566,0,0,0,0,0,20589,0,0,0,0, -20590,0,0,20593,20594,0,0,0,0,20595,0,20597,20598,0,0,0,20618,20620,0,0,0,0, -20621,0,0,0,0,20627,0,0,0,0,0,20628,0,0,0,20629,0,20630,0,0,20639,0,0,0,0,0, -20707,0,0,20709,0,0,0,20713,20714,0,0,0,0,0,20724,20725,0,0,0,0,20726,20728, -20729,0,20733,0,20734,0,20735,20736,0,20737,0,0,20744,0,20745,0,20748,0,0,20749, -0,0,0,0,0,0,0,0,20750,0,0,0,0,20754,0,0,0,20761,0,0,20763,0,0,0,0,0,0,0,20766,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,20767,0,0,0,0,20768,0,20769,20777,0,0,0,0,0,0,20785,0, -0,0,20786,20795,20801,0,20802,0,20807,0,0,20808,0,0,20810,0,0,20811,0,20812,0,0, -0,0,0,20813,0,0,20818,20820,20821,0,0,0,20822,0,20823,0,0,0,20826,0,0,0,0,0,0,0, -20829,20830,20831,0,20832,20836,0,0,20839,0,0,20840,20842,0,20843,0,20844,0, -20854,0,0,0,20855,0,0,0,0,20856,0,0,0,20869,0,0,20871,0,0,0,0,0,0,0,20873,0,0,0, -0,0,20876,0,0,0,0,0,20880,0,0,20882,0,0,0,0,20883,20884,0,0,20890,0,0,0,0,0,0,0, -0,0,20891,0,0,0,0,0,20905,0,20906,20910,0,0,20912,20915,0,0,0,0,0,20916,0,20917, -0,20919,20920,20922,0,20927,0,20928,20929,20930,0,0,20935,0,0,20939,0,0,20941,0, -0,0,20943,0,0,0,20946,20947,0,0,0,0,0,20950,0,20954,0,0,20955,20964,0,0,20967,0, -0,0,0,0,20973,20975,0,0,0,20984,0,20987,20988,0,0,0,0,0,20989,0,0,0,20995,0, -20998,0,20999,0,0,0,0,21000,21001,0,0,0,0,21008,0,21010,0,21016,0,0,0,21017, -21018,0,0,0,0,0,21021,21026,21027,21028,0,0,21029,0,0,0,0,0,21030,0,0,0,0,0,0,0, -0,0,0,0,0,0,21031,21032,0,0,0,0,0,21037,0,0,21038,0,0,0,0,0,0,0,0,0,21039,0, -21041,0,21046,21047,0,0,0,21049,21053,0,0,21057,21064,21065,0,0,21066,21067,0,0, -0,21069,0,0,0,21071,21072,0,0,21073,0,21074,0,0,21078,0,0,0,0,21079,0,0,21080, -21081,0,0,21086,21087,0,21089,0,0,0,0,0,0,0,21091,0,21093,0,21094,0,0,0,0,0,0,0, -0,21095,0,0,0,0,0,21096,0,21098,0,0,0,0,0,0,0,21099,0,0,21100,21101,21102,0,0,0, -0,0,21103,0,21104,0,0,0,0,0,21105,21108,21109,0,0,21112,21113,0,0,0,0,0,0,21115, -21122,21123,0,0,0,0,0,21125,0,0,0,0,0,0,0,0,21129,21131,0,0,21134,0,0,0,21137, -21142,0,21143,0,0,21144,0,21145,21146,0,21152,21154,21155,21156,0,0,0,21160,0,0, -0,0,0,0,21161,0,21164,0,21166,0,0,0,0,21170,0,0,0,0,21171,0,0,21172,0,21174,0, -21175,0,0,0,0,0,21176,21179,21188,0,0,0,21189,0,0,21190,0,0,0,21192,0,0,21193,0, -0,0,21198,0,21212,0,0,21213,0,0,0,0,0,0,21215,21216,0,0,21223,21225,0,21226,0,0, -0,0,21227,21228,0,0,21229,0,0,0,0,21230,21236,0,0,0,0,0,0,0,0,0,0,0,0,0,21237,0, -0,21238,21239,0,0,0,0,21256,0,0,0,0,0,21257,0,0,0,0,0,0,0,21259,0,0,0,21263,0, -21272,0,21274,0,21282,0,0,0,0,0,0,0,0,21283,0,0,0,0,0,0,0,0,21294,0,0,21297,0,0, -0,0,21298,0,0,0,21299,0,21300,21302,0,21316,0,21318,21322,21323,0,21324,0,21326, -0,0,0,21327,21328,0,0,0,21352,0,0,21354,21361,0,0,0,0,0,0,0,0,0,0,0,0,0,21362,0, -0,0,21363,0,0,0,0,0,0,0,0,0,21366,0,0,21367,21372,21374,0,0,0,21375,21377,0, -21378,0,0,0,21380,0,0,0,0,0,0,0,0,0,0,21381,0,0,0,0,0,0,21382,0,21383,0,0,21384, -0,0,21385,0,0,0,0,21389,21390,0,0,0,0,0,0,0,0,0,0,0,0,0,21397,21398,0,0,0,0,0,0, -0,0,0,0,21399,0,21400,0,0,0,0,21402,0,0,0,21403,21404,0,21405,21406,0,0,0,21407, -0,0,0,0,0,0,0,0,0,0,0,0,21408,0,0,0,0,21409,0,21421,0,21422,0,0,0,21425,21428,0, -0,0,0,21429,0,0,0,0,0,21433,0,0,0,0,0,0,0,0,0,0,21434,0,21443,0,21444,21449,0, -21452,0,21453,21454,0,0,0,21457,0,0,21458,0,0,0,21460,21461,0,0,21464,0,0,0, -21473,21478,0,0,21479,0,0,21481,21483,0,0,0,0,0,0,0,0,21484,0,0,21485,21486,0,0, -21488,0,0,0,0,0,0,21523,0,0,21525,0,0,0,0,0,0,0,21526,0,0,0,0,0,0,21529,21530,0, -0,21531,0,0,21533,0,0,21539,21564,0,21567,0,0,0,0,0,0,0,0,21575,0,0,0,0,21577,0, -0,0,0,0,21591,0,0,21604,0,0,0,0,0,0,0,0,0,21605,0,21606,0,0,21617,21618,21619, -21620,0,0,0,0,0,0,0,0,0,0,0,0,0,21623,0,0,0,0,21631,0,21635,0,0,0,0,21639,21646, -21653,21662,0,0,21663,21664,0,21666,0,0,21667,0,21670,21672,21673,0,21674,21683, -0,0,0,0,0,21684,0,21694,0,0,0,0,21695,21700,0,21703,0,21704,0,0,21709,0,0,0, -21710,0,0,0,0,0,0,0,0,21711,0,0,0,21712,0,21717,0,21730,0,0,0,21731,21733,0,0,0, -0,21737,21741,21742,0,21747,0,0,0,21749,0,0,0,0,0,0,0,0,0,0,0,0,0,21750,0,0,0,0, -0,21752,0,0,0,0,21753,0,0,0,0,0,0,21755,21756,0,21757,0,0,0,0,0,0,21760,0,0, -21763,0,0,0,0,0,0,0,0,0,21764,0,0,21766,0,0,21767,0,0,0,0,0,0,0,0,0,21773,0, -21774,0,0,21775,0,0,0,0,21776,0,0,21777,0,0,0,0,0,0,0,0,0,21780,21787,21788, -21791,0,0,0,21797,0,0,0,0,0,21805,0,0,0,0,21806,0,21807,21809,0,21810,21811,0, -21817,21819,21820,0,21823,0,21824,0,0,21825,0,0,21826,21832,0,0,0,0,0,21833, -21848,21849,0,0,21867,21870,21871,21873,0,0,0,21874,0,0,0,0,0,0,0,0,0,21875,0, -21878,0,0,0,21879,0,21881,21886,0,0,0,0,21887,0,0,21888,21894,21895,21897,0, -21901,0,21904,0,0,21906,0,0,0,21909,21910,21911,0,0,21912,0,0,21913,21914,21915, -0,21919,0,0,0,0,0,0,0,21921,0,0,21922,21933,21939,0,0,0,0,0,0,0,0,0,0,0,21944,0, -0,0,0,0,21945,0,21947,0,0,0,0,0,0,0,0,0,0,21949,0,0,0,21950,0,0,0,0,0,0,0,0,0,0, -0,0,0,21951,0,21952,0,0,0,0,0,0,0,0,0,21954,21957,0,0,0,0,21958,0,21959,0,0,0,0, -0,0,21962,21963,0,0,0,0,0,0,0,0,21964,21965,0,0,21969,21970,0,0,0,21974,0,0, -21980,21981,0,21982,0,0,0,0,0,21985,0,21988,0,21992,0,21999,0,0,0,0,0,0,22001,0, -22002,0,0,0,0,0,0,22003,0,0,0,0,0,22004,0,0,0,22008,0,22009,22015,0,0,22016,0,0, -0,22017,22019,0,0,0,0,0,0,0,0,0,22020,0,0,0,0,0,0,0,0,0,0,22021,22037,0,22039,0, -0,0,22040,0,0,0,22048,22049,0,0,22053,22055,22056,22059,0,0,22060,22061,0,0, -22064,0,0,0,0,22066,0,0,0,0,0,0,0,22073,0,0,0,22074,22075,0,0,0,0,0,0,0,22076,0, -0,0,0,22077,22084,22099,0,0,0,0,0,0,0,22104,0,0,22107,0,22108,0,22109,0,22110,0, -0,0,0,0,0,0,22111,22119,0,22120,22122,0,0,0,0,22125,0,0,0,22128,22129,0,0,0,0,0, -0,22141,0,0,0,22142,0,0,22144,22146,0,22148,22149,22151,22154,0,0,0,22162,0,0,0, -0,22164,22177,0,0,0,0,22179,0,22182,22183,0,0,22184,22188,0,0,0,0,0,0,0,0,22190, -0,22194,22201,0,0,22208,0,22209,0,22212,0,0,22215,0,22223,22231,0,0,22232,0, -22234,0,0,22235,22236,0,22237,0,22240,0,0,0,0,0,22241,0,0,0,22242,22246,22247,0, -0,0,22259,22268,0,22269,0,0,0,0,0,0,0,22270,0,0,0,0,22271,0,22272,0,22277,0,0,0, -0,0,22278,22280,22283,22286,0,0,22287,22289,0,0,22290,0,22293,0,0,0,0,0,0,0,0,0, -0,22295,0,22301,22302,0,0,0,22305,0,22308,0,0,0,0,0,0,0,0,0,0,22315,0,0,0,22317, -0,22334,0,0,0,22335,0,0,0,0,0,22336,0,22338,22344,0,22347,22349,0,22350,0,0,0,0, -0,0,0,22357,0,0,0,0,0,22358,0,0,0,0,0,0,0,0,0,0,22359,22360,0,0,0,0,0,0,0,0, -22361,22366,0,0,22369,0,22370,22373,0,0,0,0,0,22375,0,22377,0,0,0,0,0,22378,0,0, -0,0,22381,0,0,0,0,22382,0,22383,0,0,0,0,0,0,0,0,0,22391,0,0,22392,22395,22396, -22402,0,0,0,0,0,0,0,0,0,0,0,0,0,22405,0,0,22406,0,0,22408,0,0,22409,22410,0,0,0, -0,0,0,22424,0,0,0,0,22426,0,0,0,22427,0,22428,0,22432,0,22435,22442,22443,0,0,0, -0,22444,0,0,0,0,0,22446,0,22454,0,22455,0,0,0,22465,0,22470,0,22471,0,0,0,0, -22472,22473,0,22487,0,0,0,22488,0,0,0,0,22489,0,0,22499,0,0,0,0,0,0,22514,0,0, -22515,0,0,0,0,0,0,0,22516,0,0,0,22517,22520,0,0,0,22534,0,0,22535,0,0,22536,0, -22540,22553,0,22555,0,0,0,0,22561,0,0,22562,0,0,0,0,0,0,0,0,0,0,0,22566,0,0,0,0, -22567,22568,0,0,22575,0,22579,0,22582,22583,22585,0,0,0,0,0,22586,0,0,22587,0,0, -22590,0,0,0,0,0,22591,0,22592,0,0,0,0,0,22593,0,22602,0,0,22604,0,0,22609,0,0, -22618,0,0,0,0,0,0,22619,0,22624,22625,0,0,22638,0,0,0,0,0,22639,0,0,22640,0,0,0, -0,0,0,0,22644,0,22645,22647,0,0,0,0,22652,22653,0,0,0,22654,0,22655,0,0,0,22656, -0,0,0,0,0,0,0,0,0,0,22673,22675,22676,0,0,22678,22679,0,22691,0,0,0,0,0,0,0, -22693,0,0,22696,0,22699,22707,22708,0,0,0,0,0,0,0,0,22718,0,22719,0,0,0,0,22723, -0,0,0,22724,22725,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22726,22728,0,0,0,0,0,0,0,0,22729, -0,0,22731,0,0,0,0,22732,22735,22736,0,0,0,0,22739,0,22749,0,0,22751,0,0,0,0,0,0, -0,0,0,0,0,22758,0,0,0,0,0,22760,0,0,0,0,0,22764,22765,22766,0,22768,0,0,0,0,0, -22769,22770,0,0,0,0,0,0,22771,0,0,22772,22775,0,22776,22777,22780,0,0,22782, -22784,0,22787,0,22789,22796,0,0,0,0,0,22798,0,0,0,0,0,0,22802,0,22803,22804,0,0, -0,0,0,0,0,0,0,0,22805,0,0,22810,22811,22814,22816,0,22825,22826,0,22831,22833,0, -0,0,0,0,0,0,0,0,22834,0,22836,22838,0,22839,0,0,0,0,0,22840,0,22847,0,0,0,0,0, -22856,22857,0,22858,22859,0,0,22862,0,0,22864,0,0,0,0,22865,0,0,0,0,0,0,0,0,0,0, -0,22866,0,22867,22868,0,0,0,0,22869,0,22871,0,22872,0,22873,22881,22882,22884, -22885,0,0,0,0,0,0,0,22886,22887,0,22894,0,22895,0,0,0,22900,0,22901,0,0,0,0, -22904,0,0,0,0,22905,22907,0,0,0,22915,22917,0,0,22918,0,0,0,22920,0,0,0,22929, -22930,0,0,0,22941,22942,0,0,0,22943,0,0,0,22944,0,0,0,0,0,0,0,22946,0,22947,0,0, -22954,0,22956,0,0,22962,0,0,0,0,0,0,0,22963,0,0,22964,0,0,0,0,0,0,0,22965,0, -22968,0,0,0,22969,0,0,0,0,0,22970,0,22971,0,0,0,0,0,22978,0,0,22979,0,22987,0,0, -22989,0,0,0,0,0,0,22990,0,23005,0,0,0,0,0,0,0,23006,23007,23008,0,0,23023,23024, -23029,0,0,0,0,23030,0,0,0,0,0,23032,0,0,0,0,0,23035,0,0,0,0,23038,0,0,0,23048,0, -23049,23052,23053,23060,23061,0,23063,0,0,0,0,23067,23068,0,0,0,23069,23073,0,0, -0,23127,0,23128,0,0,0,0,0,23129,0,23138,23141,0,23149,0,0,23150,0,0,0,23152,0,0, -0,0,0,0,0,0,23154,0,0,0,0,23157,23159,23160,0,0,0,0,0,0,0,0,0,0,0,0,23180,0,0,0, -0,23181,0,0,23188,0,23189,0,0,0,0,0,0,0,0,0,0,0,0,23195,0,0,23196,23199,0,0,0,0, -0,0,0,0,0,23202,0,23204,0,23207,0,23209,23210,0,0,0,0,0,0,23227,23229,0,0,23230, -23234,23238,0,0,0,23245,23246,23248,0,0,0,0,23249,23254,0,0,0,23265,0,0,0,0,0,0, -0,23268,0,23276,0,0,0,0,23277,0,23297,0,23298,0,0,0,0,23299,0,23302,0,0,23303, -23312,0,0,23314,0,23320,0,0,0,0,23324,0,23325,0,23328,0,23334,0,0,0,23337,0,0,0, -0,23343,23344,23346,0,23348,0,0,0,0,0,0,0,0,23353,0,0,0,0,23355,0,23356,23358,0, -0,0,23359,23360,0,23361,0,23367,0,23369,0,0,23373,0,23378,23379,0,23382,23383,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,23387,0,0,0,0,0,0,23388,23390,0,0,23393,23398,0,0,0, -23399,0,0,0,23400,0,0,0,0,23401,0,0,0,23415,0,0,0,0,0,0,0,0,23416,0,23422,0, -23443,23444,0,0,0,0,23448,0,23454,0,0,0,0,0,0,23456,0,0,23458,23464,0,0,0,0,0,0, -23465,0,0,0,23470,23471,0,0,23472,0,0,0,23473,23496,0,0,0,0,0,0,0,0,23497,0, -23499,0,0,23502,0,0,23503,0,0,23513,0,0,23515,0,0,0,23517,0,0,0,0,23518,23519, -23521,23524,0,23525,23528,23539,0,0,0,0,0,23541,0,0,23544,0,0,23556,0,0,23557,0, -0,0,0,0,0,0,0,0,0,0,0,0,23559,0,23560,0,0,23561,0,0,23566,0,0,0,0,0,23568,23569, -23570,0,0,0,0,23571,0,23574,0,0,0,0,0,0,0,0,0,0,0,23575,0,23579,0,0,23581,0,0,0, -0,0,0,23587,0,0,0,0,0,0,0,23596,23598,0,0,0,0,23602,23606,0,0,23607,0,23608,0,0, -0,23614,23616,0,0,0,0,0,23618,0,0,23619,0,0,0,0,23621,23626,0,23627,0,0,0,0,0,0, -0,23629,0,23630,0,0,0,0,23634,0,23636,0,0,0,0,0,0,23638,0,0,0,0,23640,23667,0, -23669,0,0,0,23681,0,0,0,0,0,0,0,23682,0,23683,0,0,0,0,0,23684,0,0,0,23685,23689, -0,23693,23694,23700,0,23702,0,23709,0,0,0,0,0,0,0,23712,0,0,0,0,0,23714,0,0, -23715,0,0,0,0,23718,0,0,23720,0,0,0,0,23722,0,0,0,23726,23729,0,23741,23746,0, -23748,0,0,0,0,23749,0,0,0,0,0,23750,0,0,0,0,23751,0,23753,0,0,0,0,23757,23765,0, -0,0,23770,0,0,0,0,0,0,0,23771,0,23772,23781,0,0,23796,0,0,0,0,23798,0,23799,0,0, -0,23802,0,0,23806,0,23807,0,0,23808,0,23809,0,23819,0,0,0,23821,0,23827,0,0,0, -23829,0,0,0,0,0,0,0,23830,0,0,0,0,0,0,23832,23833,23834,23835,0,0,0,0,23837, -23838,0,0,0,0,0,23846,0,0,0,0,0,0,23847,0,0,0,0,0,23879,23881,0,0,23882,23883, -23895,0,23899,0,0,0,0,23901,0,0,0,0,0,0,23902,0,0,0,0,0,23903,23905,0,23906,0, -23907,23918,23919,23920,0,23922,0,23924,0,23927,0,23934,0,23937,23941,0,23942, -23946,0,0,0,0,0,23955,23956,23958,0,0,0,0,0,0,23959,0,23962,23965,0,23966,0,0,0, -0,23967,23968,0,0,23973,0,0,23974,0,0,0,0,23975,0,23976,0,0,0,0,0,0,0,0,0,0,0,0, -0,23977,0,0,0,0,0,0,0,0,23980,0,0,23984,0,23985,0,0,23987,0,0,23988,23990,23991, -0,0,0,0,0,0,23992,0,0,0,0,0,0,0,0,23994,0,0,0,23998,0,0,0,0,0,0,0,0,0,23999,0,0, -24003,0,24004,0,24006,0,0,0,24007,0,0,24008,0,0,0,0,0,0,0,24009,0,0,24010,0,0, -24011,0,0,24013,24014,0,0,24015,24016,24027,0,24028,24029,0,24030,0,0,0,0,0, -24033,24034,0,24035,0,0,24036,0,0,24044,0,24048,24049,24063,24067,0,24068,24070, -0,0,24071,24078,24087,0,24090,0,0,0,24095,0,24098,24101,24104,24106,0,24107,0,0, -0,24108,0,0,0,0,24110,24111,0,24113,0,0,24115,24120,0,0,0,0,0,0,24124,0,24125,0, -24126,0,24127,0,0,0,0,0,24135,0,0,24136,0,24137,24142,0,0,0,24146,0,0,24147, -24149,24154,0,24163,0,0,0,24165,24166,24167,0,0,0,0,0,0,0,0,0,0,24169,24170, -24175,0,0,0,24178,0,0,24179,0,0,24181,0,24184,24197,0,24201,24204,0,0,0,0,0,0, -24206,24212,24220,0,0,0,24224,0,0,0,0,0,0,0,0,24226,0,24234,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,24235,0,24236,0,0,0,0,0,24239,24240,24241,0,0,24248,0,0,24249,0, -24251,0,0,0,0,0,0,24253,0,24268,0,0,0,24269,0,24271,24272,0,0,0,0,24273,0,0, -24274,0,0,24279,0,0,0,0,0,0,0,24280,0,24293,24294,0,0,0,0,0,0,24296,0,0,24323,0, -0,0,24329,24330,24331,24339,0,24351,0,0,24369,24370,0,0,0,24371,0,0,0,0,24372, -24373,24374,0,0,0,0,0,24378,0,0,0,0,24379,0,24381,0,24383,24389,0,24390,0,0, -24394,24395,24400,0,0,0,24401,24402,0,24406,0,0,0,24411,0,0,0,24415,0,24416,0,0, -0,0,0,24417,0,24419,0,24422,0,24423,24428,0,24435,0,0,0,24439,0,0,0,24440,24442, -24446,0,0,0,24447,24448,24449,24452,0,0,0,0,24453,24457,0,0,24458,24459,24460,0, -24465,0,0,0,0,0,0,0,24470,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24471,0,24473, -24474,24475,24476,0,24478,0,0,0,0,24480,0,0,0,0,0,0,0,0,0,0,24481,0,0,0,0,0,0,0, -0,0,0,24482,24485,0,0,0,0,24486,0,0,0,24488,0,0,0,24494,0,0,0,0,24497,0,0,24498, -0,0,0,24499,24506,0,0,0,24507,0,0,24511,0,0,24513,24514,0,0,0,0,0,24517,0,24518, -0,24520,0,24521,24524,24525,0,0,0,0,0,24527,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24528,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24537,24539,0,24540,0,0,0,24548,0,0,0,0,0,24549, -24550,0,0,0,24553,24554,0,24555,0,24556,0,24558,0,0,0,0,0,24560,0,0,0,24561,0,0, -0,0,0,24562,0,0,0,0,0,0,0,0,0,0,0,0,0,24567,0,0,0,0,0,24569,0,0,0,24574,0,24575, -0,0,0,0,0,0,0,0,0,0,0,24577,24581,0,24584,0,0,0,0,0,24585,0,0,0,0,0,24586,0,0, -24587,0,24588,0,0,0,0,0,0,0,0,0,0,24590,24591,0,0,0,0,24592,0,0,0,0,0,0,0,24594, -0,0,0,0,0,0,0,24596,24597,0,0,0,0,24602,24603,0,0,0,0,24604,0,0,24605,0,24610,0, -0,24611,0,0,0,0,24612,24615,24616,24624,0,0,0,24627,0,24638,24639,0,0,0,0,24640, -0,0,0,24655,24656,24657,0,0,0,0,0,0,0,0,24662,0,24663,24664,0,0,0,0,0,24665,0,0, -0,0,24667,0,0,0,0,0,0,24668,24669,0,24670,24674,0,0,0,24675,0,24678,0,0,24679,0, -0,0,24681,0,24683,0,0,0,0,24684,0,24685,0,0,24686,0,0,24688,24689,0,0,0,0,24690, -24691,0,0,0,0,0,0,0,24697,0,24698,0,0,0,0,0,0,0,0,24709,0,0,0,0,0,24710,0,24712, -0,0,0,0,0,0,24713,24714,0,24715,0,24716,24718,0,24719,0,0,0,0,24720,0,0,24725,0, -0,24738,0,24749,24750,0,0,0,24752,0,0,0,24753,0,0,0,24758,0,0,0,0,0,24762,0, -24763,0,0,0,0,0,0,0,24764,0,0,0,0,0,24765,24767,24768,0,24772,0,0,0,0,24773,0,0, -0,0,24777,0,0,0,0,0,24785,0,24786,24788,0,0,0,24789,0,0,0,0,24794,24798,0,24799, -24800,0,0,0,24803,0,24804,24806,0,24807,0,0,0,24810,0,0,0,0,0,0,24827,24828,0, -24835,0,0,0,0,0,0,24836,0,0,0,0,0,24839,0,24843,24844,0,0,0,0,0,0,0,0,0,0,24847, -0,0,24848,0,0,0,0,0,0,24849,0,24850,24851,0,0,0,24852,0,24853,0,0,0,0,0,0,0,0,0, -24854,0,24855,0,0,24868,0,0,0,24883,0,0,0,24884,0,24895,24897,0,0,0,0,0,24899,0, -0,0,0,0,24900,0,24913,0,0,0,0,0,0,24914,0,0,24917,24930,24931,0,0,0,24932,0,0, -24939,0,0,24942,0,0,0,0,0,0,0,0,0,24945,24950,0,24951,0,0,24953,0,0,0,24954,0, -24959,0,0,0,24961,0,0,24962,0,24964,24968,24970,24972,0,0,0,0,0,24976,0,0,0, -24977,0,24982,0,0,24983,0,0,24984,0,0,0,24993,0,0,0,24994,0,0,25001,0,0,0,25003, -0,0,25018,0,0,25023,0,0,0,25034,0,0,25035,25036,0,25037,0,0,0,0,0,0,0,25039,0,0, -0,0,0,25040,0,0,0,0,0,0,0,25042,0,0,25043,25045,0,0,0,0,0,0,25049,0,0,25051,0, -25052,25053,0,0,25054,0,0,0,25055,0,0,0,0,25057,25059,0,0,25060,25064,0,25065, -25069,25070,0,0,0,0,25072,0,25073,0,25090,0,0,25092,25093,25101,0,0,0,0,0,0, -25105,25108,0,0,25113,0,0,25115,25116,0,0,0,0,0,0,25117,0,0,0,25120,25121,0,0,0, -0,0,0,0,25125,0,0,0,25126,0,25130,25134,0,25139,0,25143,0,0,0,25151,0,25161,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25163,0,0,0,0,0,0,0,25174,0,25175,0,25207,0,0, -0,25209,0,0,0,0,25213,0,25219,0,25223,0,25225,0,0,0,25227,0,0,0,25228,0,0,0, -25229,0,0,0,0,0,0,0,25231,25233,0,0,0,0,25237,25239,0,0,0,25243,0,0,0,25252,0, -25257,25258,0,0,0,0,25260,25265,0,25268,0,0,25273,25324,0,25325,0,25326,0,0,0,0, -0,0,0,0,25327,0,0,0,0,0,25328,0,0,0,0,0,0,25332,0,0,0,25333,0,0,0,25336,25337, -25338,0,0,25343,0,25350,0,0,0,0,0,0,0,25352,0,25354,0,25375,0,25379,0,0,0,0, -25384,0,0,0,0,0,0,0,0,0,25386,0,25388,0,25390,0,0,25399,0,0,25401,0,0,0,25402,0, -0,0,25407,0,0,0,0,0,0,0,0,0,0,0,25413,25415,0,0,25417,0,0,0,0,0,0,0,25419,0,0,0, -25421,0,0,0,25424,0,0,0,0,25433,0,0,0,0,0,0,0,0,0,25435,0,0,0,0,0,0,25436,0,0,0, -25437,0,0,25440,0,0,0,0,0,0,25442,0,0,25443,0,25446,0,0,25449,0,0,0,25450,0,0,0, -0,25452,0,25453,25454,25455,0,0,0,25456,0,25457,0,0,0,25459,0,25461,0,25468,0,0, -0,0,0,0,0,0,25469,0,0,0,0,0,25471,0,0,0,0,0,25474,0,0,0,0,0,0,0,0,25475,0,0,0,0, -25477,0,0,0,0,25483,0,0,0,0,0,25484,0,0,0,0,0,0,0,0,0,0,0,0,25485,0,25497,0,0, -25498,0,25504,0,25510,0,25512,0,0,25513,25514,0,0,0,0,0,0,25517,25518,25519,0, -25520,0,0,0,0,0,0,0,25521,0,25522,25527,25534,0,25536,0,25537,0,0,25548,25550,0, -0,25551,0,25552,0,0,0,0,0,25554,0,25555,0,25556,25557,25568,0,0,0,25570,25571,0, -0,0,0,0,0,25574,0,0,0,0,25579,0,0,0,25581,0,0,0,25582,0,0,0,0,0,0,0,0,0,25588,0, -0,0,0,25589,0,0,0,0,25590,0,25591,25592,25593,0,25594,0,0,0,25596,0,25597,25615, -0,0,0,0,0,25618,0,0,0,0,25619,25623,0,0,25629,0,0,25631,0,0,0,25635,25636,0,0, -25649,0,0,0,0,25654,0,0,0,25661,25663,0,0,25671,0,0,25678,25698,0,25699,25702, -25703,0,0,0,0,0,0,0,0,25704,0,0,0,0,0,25706,0,0,25710,0,25711,0,25712,0,25715, -25716,25717,0,0,25718,25728,25732,0,0,0,25734,0,0,0,0,0,0,0,0,0,25737,0,0,25739, -0,0,0,25740,0,25741,25745,0,25746,0,25748,25772,25778,0,0,0,0,0,25780,0,0,0,0, -25781,0,25782,25784,25785,0,0,0,25789,0,0,0,0,0,0,25797,25801,0,0,0,25808,25809, -0,0,25811,25814,25815,0,0,25817,0,0,0,0,0,0,0,0,25820,0,0,0,0,25832,25833,0,0,0, -25846,0,0,0,25847,25848,0,0,0,0,0,0,0,0,0,25849,25850,0,0,25851,0,0,25852,0, -25862,0,0,0,25863,25865,0,0,0,0,0,0,0,25867,25868,0,25869,25874,0,25875,0,25876, -25877,0,0,0,0,25878,25902,0,0,0,0,0,0,0,25903,25904,25905,0,0,0,25908,25909,0,0, -0,0,25910,0,0,0,0,0,0,0,25912,0,25913,0,0,0,0,0,0,0,0,25914,0,0,25916,0,0,0,0,0, -25917,25927,0,0,0,0,25928,0,0,25930,0,0,0,25933,0,0,25938,25942,0,0,0,0,0,0,0, -25945,0,25950,0,25956,0,0,25961,25962,0,0,25963,0,25964,25965,25966,0,0,0,0,0, -25967,0,0,0,0,25968,0,0,0,25969,25971,0,0,0,0,0,25973,25975,0,0,0,0,0,0,0,25978, -0,25981,0,0,0,25982,0,0,0,25984,0,0,0,0,0,0,0,25993,0,0,0,0,0,0,0,0,0,0,0,0,0, -26002,0,0,0,26005,0,0,0,26006,26007,0,0,26014,26015,26016,0,0,0,0,0,0,26017, -26018,26020,0,26022,26023,0,0,0,26024,26028,0,26029,26033,26034,26044,0,0,0,0,0, -26046,0,0,26047,0,0,26049,0,26050,0,26051,0,0,0,0,0,26053,0,0,0,0,26054,26059,0, -0,0,0,0,0,26060,0,26066,0,0,0,0,0,0,0,0,0,0,0,0,26067,0,26069,0,0,26071,0,0,0, -26073,0,26074,26077,0,0,0,0,26078,0,0,0,26079,0,26090,0,0,26094,0,0,0,0,0,0,0,0, -26095,0,0,0,0,0,0,0,0,0,0,0,26096,26101,0,26107,26122,0,26124,0,0,26125,0,0,0,0, -0,0,26136,26141,26155,0,0,0,0,0,0,0,0,0,26164,26166,0,0,0,26167,0,26170,26171,0, -0,26172,0,0,26174,0,0,0,0,0,0,0,0,0,0,0,0,0,26175,0,0,0,26176,26177,0,26321, -26322,0,26323,0,0,26324,0,0,0,0,0,0,0,26325,0,26331,0,0,0,0,0,0,26335,0,0,0, -26350,0,0,0,26379,0,0,26382,26383,26385,0,0,26392,26406,0,0,0,0,26411,0,0,0,0,0, -26412,0,0,26420,0,0,26423,0,26424,26426,26432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -26435,0,26436,0,0,0,0,0,26441,0,26444,0,0,0,26446,0,0,0,0,26447,0,0,0,0,26449,0, -26450,26452,0,26453,26454,0,0,0,26455,0,0,0,26456,0,0,26458,0,0,26460,0,26463,0, -0,0,0,0,0,0,0,26464,26470,0,0,0,0,0,0,0,0,0,26473,0,0,26474,0,0,0,0,0,0,0,26475, -0,0,0,0,0,0,0,26477,0,26485,0,0,26486,0,26487,0,0,26488,26493,26494,0,0,26495,0, -26497,26504,26506,0,0,0,0,0,26507,0,0,0,0,0,26509,0,0,26510,0,0,0,0,0,0,0,0,0,0, -0,0,0,26512,0,26513,26515,0,0,0,26518,0,0,0,26519,0,26524,26526,0,0,0,26527,0, -26532,0,26533,26537,26558,0,0,0,26559,0,0,0,26571,0,0,26573,0,26588,0,26593,0,0, -0,0,0,0,26603,0,26604,0,0,0,0,0,0,0,0,0,0,26606,0,0,0,0,0,0,0,26607,26609,26611, -26614,0,0,0,26616,26620,0,26621,0,0,0,0,0,26627,0,26629,0,0,26630,0,0,26632, -26643,0,0,0,26644,0,0,0,0,0,0,0,0,0,26646,26647,0,0,0,26650,0,0,26656,0,0,0,0, -26663,26670,26671,0,0,0,26685,26686,26687,0,26689,0,0,0,0,26744,0,26745,0,26747, -26748,0,26749,26750,26751,0,0,0,0,26752,26755,0,0,0,26756,26769,0,0,0,26774,0,0, -0,0,0,26775,0,26777,26778,0,26786,0,0,0,26787,0,0,0,0,0,0,0,0,0,0,0,0,0,26788,0, -0,26789,0,0,0,0,0,26791,0,26792,26793,0,0,0,26794,0,26797,26798,0,0,0,26800,0,0, -26803,0,26804,0,0,0,0,0,0,0,0,0,26805,0,0,26808,0,0,26809,0,0,0,0,0,0,0,26812,0, -26825,0,0,0,0,0,0,0,26826,0,0,26827,26829,26834,0,0,0,0,26835,0,0,26849,0,26851, -0,0,0,0,0,0,0,0,0,26852,0,26853,26857,0,26858,0,26859,0,0,0,0,0,0,0,26876,0, -26878,26882,26883,0,0,0,0,26890,26894,0,0,0,0,26895,26896,0,0,0,0,0,26900,0,0,0, -0,0,0,0,26911,26913,26914,26915,26916,26919,0,0,0,26921,26922,0,0,26925,0,0,0, -26928,0,0,26929,26930,0,0,0,26931,0,26932,0,0,0,0,0,26933,0,0,0,0,0,0,26937,0,0, -26943,0,0,26944,0,0,0,26946,0,0,0,0,0,0,0,26956,0,26958,0,0,26963,0,0,0,0,0,0,0, -26965,0,26969,26970,26972,0,0,0,0,0,26973,0,26974,0,26978,0,26980,0,0,0,0,0,0, -26982,0,26986,26987,0,26990,0,0,0,0,27003,27006,0,0,27007,27010,27012,27013,0,0, -0,0,0,0,0,0,27014,27015,27018,0,27019,0,0,0,0,0,27025,0,0,0,27026,0,0,0,0,27029, -27030,27031,27034,0,0,27036,27037,0,0,0,27038,27042,0,0,0,27044,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,27045,0,0,0,0,0,0,0,27046,0,0,0,0,0,0,0,27047,27049,0,27050,0,0,0, -27051,27052,0,27055,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27056,27058,27059,0, -27061,0,27064,0,0,0,0,0,27069,0,0,27070,0,0,0,0,0,0,0,27072,0,0,0,0,0,0,0,0, -27076,0,0,0,0,0,27078,0,27079,0,0,0,27081,0,0,0,0,0,0,27082,0,27083,27086,0,0,0, -0,27087,0,0,0,0,0,27088,27090,0,27094,0,0,27095,0,27099,27102,0,0,0,27103,0,0,0, -0,27105,0,0,0,27106,0,0,0,0,0,0,27107,0,0,0,0,27108,27117,0,0,0,0,27118,0,0, -27124,0,27126,0,0,27130,27131,0,0,0,0,0,0,27147,0,0,0,0,27148,27149,0,0,0,0, -27150,27151,0,27152,0,27159,0,0,0,27164,0,0,0,0,0,0,0,27175,0,27189,0,0,27191,0, -27193,0,27195,0,27198,0,0,0,0,0,27200,0,0,0,0,27202,0,0,0,0,27203,0,0,27204,0,0, -27206,0,27207,0,0,0,0,27209,0,0,0,27213,0,0,27216,27219,27220,27222,27223,0, -27224,0,27225,27226,0,0,27233,0,0,0,0,27235,0,27237,0,27238,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,27239,0,27242,27243,0,27250,0,0,0,27251,0,27253,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,27254,27255,27258,0,0,0,27259,0,0,0,0,0,0,27267,0,27276,27278, -0,0,0,0,0,0,0,0,0,27296,27297,27301,0,0,0,0,0,0,27302,0,0,0,0,0,0,27312,27313,0, -0,0,0,0,27318,0,27320,0,27329,0,27330,27331,0,27332,0,0,0,0,27340,0,0,0,27348,0, -0,0,0,0,0,27350,0,27351,0,0,0,0,27355,0,0,27358,27359,27361,0,0,0,27365,0,27367, -0,27376,27378,0,0,27379,0,0,0,0,0,0,27396,0,27397,27404,0,0,0,0,0,27408,0,0,0,0, -27453,0,0,0,27456,0,0,0,27458,0,0,0,0,0,0,0,27459,0,0,0,27460,0,0,27461,0,27465, -27467,0,0,27469,0,27470,0,27471,0,27477,27482,0,0,0,0,0,0,27484,0,0,0,0,0,0, -27485,0,0,0,0,0,27493,0,27494,27502,0,0,0,0,0,0,0,0,0,0,0,0,27511,27532,0,0,0, -27533,27545,0,0,0,27546,0,0,0,0,0,0,0,0,0,0,27547,0,0,27549,27550,0,27551,0,0,0, -0,0,0,0,27555,0,0,27571,0,27573,27574,27575,27577,0,27578,0,0,27579,27585,0,0,0, -0,0,27586,0,0,27588,27589,0,0,0,0,27596,0,0,27600,0,0,0,0,0,0,0,0,0,0,0,27608,0, -0,0,0,0,0,0,0,0,0,0,27610,0,0,0,27618,0,0,27620,0,0,0,27631,0,0,27632,27634,0, -27636,27638,0,0,0,27643,0,27644,27649,0,0,0,0,0,0,0,0,0,0,0,0,0,27651,27660,0, -27661,0,0,0,0,0,0,0,27662,0,0,27664,0,27665,0,0,0,27669,0,27671,0,0,0,27673, -27674,0,0,0,27682,0,0,0,27711,0,27712,27713,27719,27720,0,0,27728,0,27729,0,0,0, -0,0,0,0,0,0,27731,0,0,27732,0,27733,0,27738,0,0,0,27742,0,0,0,27743,27744,0,0,0, -0,0,0,27745,27746,0,0,0,27747,27748,27751,27752,0,0,0,27768,27770,0,0,0,27774, -27775,0,27776,27777,0,0,27781,0,27784,0,27786,0,0,27791,0,27792,27793,27804,0, -27812,27813,0,0,0,0,0,0,0,0,27814,0,27825,0,27827,0,0,0,0,27828,27861,27862,0,0, -0,27864,0,0,0,27865,27884,0,27889,0,0,0,0,0,27890,0,27891,0,0,0,27892,0,0,0,0,0, -27897,27898,0,0,27899,0,0,0,27901,27905,0,0,27920,0,0,27921,0,27922,0,0,0,27931, -27934,0,0,0,0,0,0,0,0,0,0,27941,0,27942,0,27945,0,27947,27954,0,0,0,0,27960, -27963,0,0,0,0,0,0,0,0,27964,27965,0,0,0,27967,0,27969,27975,0,27976,27977,0, -27981,0,27983,28051,28052,0,0,0,0,0,28056,0,0,0,0,0,0,28058,28059,0,0,28061,0,0, -0,0,0,0,0,28063,0,0,0,0,0,0,28066,0,0,0,0,0,0,28069,28070,28072,0,28073,0,0, -28074,0,0,0,0,28075,0,0,0,0,0,0,0,28078,0,0,0,0,28085,0,0,0,0,28086,0,0,0,0,0,0, -28088,0,0,0,0,0,0,0,0,28090,0,28097,28114,28115,0,0,0,0,0,0,0,28116,0,0,0,0,0, -28118,0,28129,0,28131,0,0,28135,0,0,0,28140,28141,0,0,0,28146,0,0,0,0,28152,0,0, -0,0,28155,28157,28161,0,0,0,0,28166,0,28167,0,0,0,0,0,0,0,0,0,0,0,28172,0,0,0,0, -0,0,28173,0,0,28175,0,0,0,0,0,0,0,0,0,28178,28188,0,28190,0,0,0,0,0,28191,0, -28193,28206,0,0,28207,28209,0,28211,0,28213,0,0,0,28215,28216,28217,0,28222,0, -28223,28225,0,0,0,28226,0,28227,28229,28232,0,0,0,0,0,0,0,0,0,28235,0,28241,0,0, -28242,0,0,0,0,28243,0,0,0,28245,0,0,0,28248,28250,0,28251,28252,0,0,0,0,0,0, -28253,0,0,28254,28255,0,0,28256,0,0,28258,0,0,0,0,0,28259,0,0,28260,0,0,28261,0, -0,0,0,28262,28263,0,0,28264,0,0,0,28266,0,28268,28269,0,28270,28272,28274,0, -28277,28278,0,0,0,28279,0,28280,28281,28283,0,28292,0,28294,0,28297,0,0,0,0, -28299,0,0,0,0,0,28300,0,0,0,0,0,0,0,28301,0,0,0,0,0,0,0,0,0,0,0,0,0,28302,28303, -0,0,0,0,28304,0,0,28305,0,28312,0,28313,28314,0,0,0,0,0,0,28315,0,0,0,28320, -28321,0,0,28328,0,0,0,28329,28338,0,28339,0,0,28344,0,0,0,0,0,0,0,0,28347,0,0,0, -0,0,0,0,0,28348,0,0,0,0,0,28411,0,28412,28413,0,28416,0,0,0,28420,0,0,0,0,0, -28421,0,0,0,0,28423,0,0,0,28424,0,0,28428,0,0,0,0,0,28429,0,0,0,28431,28434,0, -28458,0,0,0,0,0,0,0,0,0,0,0,28464,0,0,0,0,28465,0,28467,0,0,0,0,0,0,28471,0,0,0, -0,28474,0,28480,0,28481,0,0,28485,0,0,0,0,28486,28488,0,0,28489,0,0,0,0,28492,0, -0,0,28495,0,28497,0,28499,0,0,0,0,28500,0,0,28502,28503,0,0,0,28508,0,0,0,28510, -0,0,28512,28513,28514,28521,0,28526,0,28527,28528,0,0,0,0,28529,0,0,28532,0,0, -28537,28538,0,0,0,28539,0,28548,0,28553,28554,0,0,0,0,0,0,0,0,0,0,0,0,28560, -28563,0,0,28564,0,0,0,0,28565,0,0,0,0,0,0,0,28566,28568,0,0,0,0,0,0,28569,0,0,0, -28570,0,28572,28573,0,0,0,0,28575,0,0,0,0,28576,28581,28588,0,0,28589,0,0,0, -28590,28595,0,28598,0,0,28601,0,0,28605,0,0,0,0,28614,28615,28619,0,0,0,0,0,0, -28620,0,28626,0,0,28628,0,28631,0,28632,0,0,0,0,0,0,28635,0,0,0,28637,28638,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28639,0,28643,0,0,28652,0,0,0,28662,0, -28670,28671,0,0,0,0,0,0,0,0,0,28672,28673,28675,28676,0,0,0,0,0,0,0,28691,0,0,0, -28695,0,0,0,28696,0,28697,28698,0,28705,0,28707,28708,28710,0,0,0,0,0,0,0,28711, -28728,0,0,0,28736,0,0,0,28737,0,0,0,0,0,0,0,0,0,28738,0,28739,0,28741,0,0,28742, -0,0,0,0,0,0,0,0,0,0,0,28745,0,0,0,0,0,0,28749,28750,28752,28754,28756,0,28757,0, -0,0,0,28759,28760,0,0,0,0,0,0,28762,0,0,0,28764,0,0,0,0,0,0,28766,0,28767,28768, -0,0,0,0,28769,28770,0,0,0,0,0,0,0,0,0,0,0,0,0,28771,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,28772,0,28773,0,28782,0,0,0,0,0,0,28784,0,28785,0,28786,0,0,0,28787,0,0,0, -28797,0,0,0,0,0,0,28799,0,0,28801,0,0,0,0,28802,0,28805,0,0,28806,0,0,28807,0,0, -0,0,0,0,0,28808,0,0,0,0,0,28810,28812,0,0,28816,28819,0,0,28821,0,28826,0,0,0, -28842,28852,0,0,28853,0,28854,28855,0,0,0,28857,0,0,0,28858,0,28867,28868,28869, -0,0,0,28874,28880,28882,28890,28892,0,0,0,0,0,0,0,28895,0,0,0,28898,28899,0,0,0, -28900,0,0,28904,0,28906,0,0,0,0,28907,0,0,0,0,0,0,28908,0,0,0,28910,0,28914,0,0, -0,0,0,0,0,28915,28916,28919,0,0,28920,0,28921,0,0,0,0,0,0,0,0,28924,0,0,0,0, -28926,28929,0,0,0,28930,0,28936,0,28939,0,0,0,0,28942,0,0,0,0,0,0,28956,0,0,0, -28966,0,0,0,0,28967,0,0,0,0,0,0,0,0,0,28968,0,28971,0,28975,28976,0,28982,28983, -0,0,28984,28989,28996,28997,28998,0,0,0,0,0,0,28999,0,0,0,0,0,29000,0,29001,0,0, -0,29009,0,0,29011,0,0,29021,0,0,0,0,29024,0,29025,0,0,0,0,0,29026,0,0,0,29036,0, -0,0,29037,0,0,0,0,29038,0,29045,0,29047,0,0,0,0,0,0,0,0,0,29051,0,0,0,29054, -29056,29062,0,29070,29082,0,0,0,29083,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29084,0,0, -0,0,29085,29088,0,0,0,0,0,0,0,29090,29097,0,0,0,29103,0,0,0,0,0,0,0,0,29105,0,0, -0,0,0,29107,0,29109,0,0,0,29115,0,0,29120,0,0,29138,29140,0,0,0,0,0,0,0,0,0, -29152,0,29160,29174,0,29176,0,0,29180,0,29181,0,0,0,0,0,0,0,0,29228,0,0,29229,0, -0,29230,0,0,0,0,0,0,0,0,0,0,29234,0,0,0,29241,0,29245,0,29248,0,29250,29256, -29280,0,29282,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29285,0,0,29286,29291,29292,0,0,0,0, -29294,0,29295,0,0,0,0,0,29296,29297,29298,29300,0,29302,0,0,29304,29307,0,29312, -0,0,0,29322,0,0,29323,0,0,29324,29326,29328,0,29335,0,0,0,0,0,0,0,29338,29339,0, -0,0,0,0,29341,29343,0,0,0,0,29344,0,0,0,0,0,29345,0,0,0,0,29346,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,29347,29348,29349,0,0,29354,0,0,29355,0,0,0,0,0,0,0,0,29357,0,0, -0,0,29364,0,29365,0,0,0,0,0,0,0,29366,0,0,29368,0,0,0,0,0,0,0,0,29378,0,29381,0, -0,0,0,0,0,0,0,29386,0,0,0,0,0,0,29389,0,0,0,29390,0,0,29391,29397,0,29398,29412, -29414,29418,29419,0,0,0,0,0,0,0,29420,0,0,0,0,0,0,0,29423,0,0,0,29435,0,0,0, -29437,0,0,29439,0,29441,0,0,0,0,29443,0,29446,29450,29452,0,0,0,0,0,29456,0,0,0, -0,0,29461,0,0,0,29464,0,0,0,0,0,0,0,0,29468,0,29473,0,0,0,29486,0,0,0,29490,0,0, -0,29491,29492,0,0,29497,0,0,0,29498,0,29499,0,29502,29505,0,29509,0,0,0,29510,0, -0,0,29512,0,0,0,29516,0,0,0,0,0,0,0,0,29518,0,29519,0,0,0,0,0,29520,29521,29529, -0,0,0,0,0,0,0,0,29530,0,0,29531,29538,0,29540,0,0,0,29542,0,29543,29544,29547,0, -0,29548,0,0,0,29549,0,0,0,29550,0,0,29552,0,0,0,0,29558,29561,0,29562,29564,0,0, -29565,0,0,29566,0,0,0,0,0,0,0,0,0,0,29578,29584,29586,29591,0,0,0,0,29593,29594, -0,0,29597,0,0,29613,0,29614,0,29615,0,0,0,0,29616,29617,0,0,29625,0,0,0,29632,0, -0,0,0,0,0,0,29633,0,0,0,0,0,29634,29635,29637,0,29638,0,29641,29643,0,0,0,0,0,0, -29644,0,29645,0,29649,0,0,0,29650,0,29653,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29656, -29659,0,0,29660,0,0,0,29661,0,0,0,0,0,29664,0,0,0,29671,29673,0,0,0,0,0,0,0, -29675,0,29677,29679,0,0,29684,0,0,0,0,0,29685,0,0,0,29687,0,0,0,29688,0,29689, -29690,29700,0,29701,0,0,0,29702,0,29706,0,0,0,0,0,0,0,29720,0,29721,0,29727,0, -29733,29734,0,29750,29761,0,29763,0,0,0,0,0,29764,0,0,29765,0,0,0,29771,0,0,0,0, -0,0,0,0,0,0,0,0,29772,0,0,0,29773,29774,29775,0,0,0,0,0,0,0,0,0,0,0,29822,0,0,0, -29824,0,29825,0,0,0,0,0,29827,0,0,0,0,0,0,0,0,29829,0,29832,29834,0,0,29835,0,0, -29837,29838,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29843,0,0,0,0,29844,29845,0,0,0, -0,0,0,0,0,0,29849,0,0,29869,29872,29890,29905,0,0,0,0,0,29907,29921,0,29922,0,0, -29923,29926,29944,29946,0,0,0,0,0,0,0,29947,29948,0,0,0,29951,0,0,0,0,0,29953,0, -0,29956,0,29957,0,0,29962,0,0,0,0,29971,0,0,0,29972,0,0,0,0,0,29978,0,29979, -29992,30007,30008,30010,0,0,0,30013,0,0,0,0,30014,30016,0,0,0,0,0,0,0,0,0,0,0, -30017,0,0,0,0,0,30023,30031,0,0,30033,0,0,0,0,0,0,0,0,0,0,30034,0,30038,0,30039, -0,30040,0,0,0,0,0,0,30067,30068,0,0,0,30069,0,30072,0,0,0,30073,0,0,0,0,30075,0, -0,0,0,0,0,30079,0,0,30080,0,0,0,0,0,30082,0,0,0,0,0,0,0,0,0,0,0,30084,30090,0,0, -30091,0,0,0,0,30098,30118,0,30119,0,30121,30130,0,0,0,0,0,0,0,0,0,0,0,0,0,30131, -30132,30133,0,0,0,0,0,0,30135,0,0,0,0,0,0,0,0,0,0,0,30136,0,0,30137,30138,0,0,0, -30139,30146,0,0,0,0,0,30147,0,0,30148,30151,0,0,0,30168,0,30172,30173,0,0,0,0,0, -0,0,0,30180,30181,0,30192,0,0,0,0,0,0,0,30194,30196,0,0,30199,0,0,30202,0,0,0,0, -30203,0,0,0,0,0,0,0,0,0,0,30213,0,0,0,30216,0,0,30217,0,0,0,30218,0,0,0,0,30219, -0,30220,0,30222,30227,0,0,0,0,0,30231,0,0,30233,30235,0,0,0,0,30238,0,30240, -30243,30245,0,30250,30252,0,0,0,30269,0,0,30271,30272,0,0,0,30278,30280,0,0, -30282,0,30284,0,30294,0,0,0,0,30295,30296,0,0,0,0,0,30298,30299,30302,30304, -30306,0,0,0,0,0,0,30316,30317,0,0,0,30318,0,0,0,30319,0,30320,30322,30326,0,0,0, -0,0,30327,0,30332,30348,30349,0,0,30356,0,0,0,0,0,0,0,0,30357,0,30358,0,30359, -30360,0,0,30365,30366,30378,0,0,0,0,30379,0,0,30381,0,30385,0,30388,30397,0,0,0, -30401,0,0,0,0,30403,0,0,0,0,0,30404,0,0,30405,0,30406,30408,0,30409,0,30410,0,0, -0,30417,0,0,30418,30419,0,30420,0,30424,0,0,0,30427,30430,30432,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,30433,0,0,0,0,0,0,0,30436,0,30437,30438,0,30441,30442,0,0, -0,30445,0,0,0,0,30452,30456,30457,0,0,0,30458,0,30464,0,0,0,0,0,0,30467,0,30469, -0,0,0,0,0,30477,0,0,30484,0,0,0,0,0,30485,0,0,0,0,0,30486,30487,30497,30498,0,0, -0,0,0,0,0,0,0,0,30505,0,30508,0,0,0,30509,30510,0,30514,30516,0,0,0,0,0,0,0,0,0, -0,0,30523,0,30524,0,30525,0,0,0,0,30537,0,0,30538,0,0,0,0,0,30553,0,0,30555, -30556,30558,30559,30560,0,0,30561,0,30562,0,0,0,0,0,0,0,0,30563,30570,30571,0, -30586,30587,0,0,30590,0,0,30594,0,0,0,0,30611,30612,30623,30634,0,0,30636,30640, -30655,30656,0,30657,0,0,30658,30669,0,30670,0,30676,30678,0,0,0,0,0,0,0,30679,0, -0,0,0,0,0,0,0,0,0,0,30695,0,0,30698,0,0,0,0,30700,0,0,0,0,30701,0,30702,30703,0, -0,0,0,30707,0,0,0,30709,0,0,30710,30719,30729,0,0,0,0,0,0,0,0,0,30731,0,0,30733, -0,0,0,30734,0,0,0,0,0,30736,30737,0,0,0,30740,0,0,0,30743,0,30746,0,30747,30748, -0,0,30751,30752,30753,0,0,0,30754,0,0,30760,0,0,0,0,0,0,0,30763,0,30764,0,0, -30766,0,30769,30770,30771,30774,30777,0,0,30779,30780,30781,0,0,0,0,30790,0,0,0, -30792,0,0,0,0,30810,0,0,0,0,0,0,0,30812,30819,0,0,30823,30824,0,30825,0,30827,0, -0,0,0,0,0,30828,0,0,30830,0,0,0,30834,0,30835,0,30837,30838,0,30845,0,0,0,0,0, -30846,30847,0,0,30849,0,30851,0,0,0,0,0,30852,30858,0,0,30859,0,30865,0,0,30866, -0,0,30868,0,0,30869,0,0,0,30881,30883,0,0,0,0,0,30889,0,30891,0,0,0,0,30894,0, -30895,0,30897,0,30898,0,0,0,30904,30906,0,30909,0,0,0,0,0,0,30910,0,0,0,30915, -30933,30942,0,0,0,0,30943,0,0,30945,0,0,0,0,0,0,30946,0,0,30947,0,0,30955,30956, -0,0,30960,0,0,30961,30962,30966,0,0,30969,30974,0,0,0,30976,0,0,30977,0,30978, -30982,0,0,0,0,0,0,0,30994,30995,30998,0,31000,0,0,31001,0,0,31003,31005,0,0, -31006,31011,0,0,31014,0,31016,0,0,0,0,31018,0,0,31020,31023,31024,31025,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,31027,31028,31029,0,0,0,0,0,0,31032,0,0,0,0,0,0,0,0,0,0,0, -31036,31037,31038,0,0,0,31041,31043,31045,0,31047,0,0,0,31048,0,31049,0,0,0, -31053,31054,31055,0,0,31063,0,0,0,0,0,31066,0,31068,31071,0,0,0,31072,31073,0,0, -0,0,31075,0,0,31076,0,0,0,31077,31079,0,31080,0,0,0,0,0,0,0,0,0,0,31087,0,31142, -0,31144,0,0,31145,31146,31147,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31149,0,31151,31152,0, -0,0,0,0,0,0,31162,31171,31174,31175,0,0,0,31176,0,0,0,0,0,0,0,31179,0,0,0,31186, -0,0,0,31192,31195,0,0,31196,0,0,0,0,0,0,0,0,31198,0,0,0,0,0,31199,0,0,0,31205,0, -0,0,0,31211,31215,0,0,0,0,31231,0,31232,0,0,0,0,0,0,0,0,0,0,31233,31236,31253,0, -31254,0,0,0,0,0,0,31255,0,0,31257,0,0,0,0,0,0,0,0,0,31258,31259,0,0,31260,0, -31261,0,0,0,0,0,31262,31263,0,0,31264,0,31266,0,31267,0,0,0,0,0,31281,0,31282,0, -31284,0,0,31285,31287,31288,0,0,31290,0,0,0,31292,31295,0,31299,0,31300,0,0,0,0, -0,31302,0,0,0,0,31303,0,0,0,0,0,0,31304,0,0,0,0,0,31305,31308,31309,31315,0, -31317,0,0,0,0,0,31323,0,31324,0,0,0,0,0,31325,31327,0,0,31331,0,0,0,0,0,31333,0, -0,0,0,0,31336,0,0,31337,0,0,0,0,0,0,31338,0,0,0,0,0,0,0,0,0,0,0,0,31339,0,0,0,0, -0,0,0,31342,0,0,0,0,31345,0,0,0,0,0,0,0,0,31347,0,0,0,0,0,0,31348,0,0,31350, -31351,0,31352,0,0,31354,0,0,0,0,31355,0,0,31356,0,0,0,0,0,0,0,0,0,0,31363,0, -31372,0,0,31373,0,0,0,0,0,0,0,0,0,31376,0,31388,0,31389,0,31392,0,31401,0,31405, -31407,31408,0,31409,0,0,0,0,0,0,31413,31415,0,0,0,31416,31418,0,0,0,0,0,0,31422, -31423,0,0,31424,0,31425,31432,0,0,0,0,0,0,0,0,0,31433,0,0,0,0,0,0,0,0,31434,0,0, -0,0,0,0,31435,0,0,0,0,31438,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31442,0,31444,0, -31448,0,0,31451,0,0,0,0,31452,0,31461,31465,0,0,31466,0,0,31467,0,0,31468,0,0,0, -31469,31473,0,31476,0,0,0,0,31489,31490,0,0,0,0,0,0,0,31492,31493,31494,0,0,0,0, -31501,31504,31505,0,0,0,0,0,0,0,0,0,31509,0,0,0,0,31510,0,0,31511,0,0,31513,0,0, -0,0,0,0,0,0,0,31514,0,31522,31536,31539,31540,0,31541,0,0,0,0,0,0,31546,31553, -31559,0,0,0,31560,31561,31562,0,0,31564,31567,0,31569,0,0,0,31570,0,0,0,0,31571, -0,0,0,0,0,0,31572,31574,31580,31581,0,0,31582,31584,31585,31586,31595,0,31596,0, -0,0,0,31597,0,31599,0,31600,31601,0,0,31603,31604,0,0,31608,31610,0,0,0,31611,0, -31615,0,0,0,0,31616,0,0,0,0,0,0,31617,0,0,0,0,0,31618,0,0,0,0,0,0,31621,0,0,0,0, -0,0,0,0,0,31622,31625,0,0,0,0,31627,0,31641,0,0,31642,0,0,31643,0,0,0,0,0,0,0,0, -0,31644,0,31646,0,0,0,0,31648,0,0,0,31652,0,0,0,31657,0,0,31676,0,0,0,0,0,0,0, -31689,31691,31692,0,31694,0,0,0,31696,0,31702,0,31703,0}; - -static const DictWord kStaticDictionaryWords[31705] = { -{0,0,0},{8,0,1002},{136,0,1015},{4,0,683},{4,10,325},{138,10,125},{7,11,572},{9, -11,592},{11,11,680},{11,11,842},{11,11,924},{12,11,356},{12,11,550},{13,11,317}, -{13,11,370},{13,11,469},{13,11,471},{14,11,397},{18,11,69},{146,11,145},{134,0, -1265},{136,11,534},{134,0,1431},{11,0,138},{140,0,40},{4,0,155},{7,0,1689},{4,10 -,718},{135,10,1216},{4,0,245},{5,0,151},{5,0,741},{6,0,1147},{7,0,498},{7,0,870} -,{7,0,1542},{12,0,213},{14,0,36},{14,0,391},{17,0,111},{18,0,6},{18,0,46},{18,0, -151},{19,0,36},{20,0,32},{20,0,56},{20,0,69},{20,0,102},{21,0,4},{22,0,8},{22,0, -10},{22,0,14},{150,0,31},{4,0,624},{135,0,1752},{5,10,124},{5,10,144},{6,10,548} -,{7,10,15},{7,10,153},{137,10,629},{6,0,503},{9,0,586},{13,0,468},{14,0,66},{16, -0,58},{7,10,1531},{8,10,416},{9,10,275},{10,10,100},{11,10,658},{11,10,979},{12, -10,86},{14,10,207},{15,10,20},{143,10,25},{5,0,603},{7,0,1212},{9,0,565},{14,0, -301},{5,10,915},{6,10,1783},{7,10,211},{7,10,1353},{9,10,83},{10,10,376},{10,10, -431},{11,10,543},{12,10,664},{13,10,280},{13,10,428},{14,10,128},{17,10,52},{145 -,10,81},{4,0,492},{133,0,451},{135,0,835},{141,0,70},{132,0,539},{7,11,748},{139 -,11,700},{7,11,1517},{11,11,597},{14,11,76},{14,11,335},{148,11,33},{6,0,113},{ -135,0,436},{4,10,338},{133,10,400},{136,0,718},{133,11,127},{133,11,418},{6,0, -1505},{7,0,520},{6,11,198},{11,10,892},{140,11,83},{4,10,221},{5,10,659},{5,10, -989},{7,10,697},{7,10,1211},{138,10,284},{135,0,1070},{5,11,276},{6,11,55},{135, -11,1369},{134,0,1515},{6,11,1752},{136,11,726},{138,10,507},{15,0,78},{4,10,188} -,{135,10,805},{5,10,884},{139,10,991},{133,11,764},{134,10,1653},{6,11,309},{7, -11,331},{138,11,550},{135,11,1861},{132,11,348},{135,11,986},{135,11,1573},{12,0 -,610},{13,0,431},{144,0,59},{9,11,799},{140,10,166},{134,0,1530},{132,0,750},{ -132,0,307},{133,0,964},{6,11,194},{7,11,133},{10,11,493},{10,11,570},{139,11,664 -},{5,11,24},{5,11,569},{6,11,3},{6,11,119},{6,11,143},{6,11,440},{7,11,295},{7, -11,599},{7,11,1686},{7,11,1854},{8,11,424},{9,11,43},{9,11,584},{9,11,760},{10, -11,148},{10,11,328},{11,11,159},{11,11,253},{11,11,506},{12,11,487},{12,11,531}, -{144,11,33},{136,10,760},{5,11,14},{5,11,892},{6,11,283},{7,11,234},{136,11,537} -,{135,11,1251},{4,11,126},{8,11,635},{147,11,34},{4,11,316},{135,11,1561},{6,0, -999},{6,0,1310},{137,11,861},{4,11,64},{5,11,352},{5,11,720},{6,11,368},{139,11, -359},{4,0,75},{5,0,180},{6,0,500},{7,0,58},{7,0,710},{10,0,645},{136,10,770},{ -133,0,649},{6,0,276},{7,0,282},{7,0,879},{7,0,924},{8,0,459},{9,0,599},{9,0,754} -,{11,0,574},{12,0,128},{12,0,494},{13,0,52},{13,0,301},{15,0,30},{143,0,132},{ -132,0,200},{4,10,89},{5,10,489},{6,10,315},{7,10,553},{7,10,1745},{138,10,243},{ -135,11,1050},{7,0,1621},{6,10,1658},{9,10,3},{10,10,154},{11,10,641},{13,10,85}, -{13,10,201},{141,10,346},{6,11,175},{137,11,289},{5,11,432},{133,11,913},{6,0, -225},{137,0,211},{7,0,718},{8,0,687},{139,0,374},{4,10,166},{133,10,505},{9,0, -110},{134,10,1670},{8,0,58},{9,0,724},{11,0,809},{13,0,113},{145,0,72},{6,0,345} -,{7,0,1247},{144,11,82},{5,11,931},{134,11,1698},{8,0,767},{8,0,803},{9,0,301},{ -137,0,903},{139,0,203},{134,0,1154},{7,0,1949},{136,0,674},{134,0,259},{135,0, -1275},{5,11,774},{6,11,1637},{6,11,1686},{134,11,1751},{134,0,1231},{7,10,445},{ -8,10,307},{8,10,704},{10,10,41},{10,10,439},{11,10,237},{11,10,622},{140,10,201} -,{136,0,254},{6,11,260},{135,11,1484},{139,0,277},{135,10,1977},{4,10,189},{5,10 -,713},{6,11,573},{136,10,57},{138,10,371},{132,10,552},{134,11,344},{133,0,248}, -{9,0,800},{10,0,693},{11,0,482},{11,0,734},{11,0,789},{134,11,240},{4,0,116},{5, -0,95},{5,0,445},{7,0,1688},{8,0,29},{9,0,272},{11,0,509},{11,0,915},{4,11,292},{ -4,11,736},{5,11,871},{6,11,171},{6,11,1689},{7,11,1324},{7,11,1944},{9,11,415},{ -9,11,580},{14,11,230},{146,11,68},{7,0,490},{13,0,100},{143,0,75},{135,0,1641},{ -133,0,543},{7,11,209},{8,11,661},{10,11,42},{11,11,58},{12,11,58},{12,11,118},{ -141,11,32},{5,0,181},{8,0,41},{6,11,63},{135,11,920},{133,0,657},{133,11,793},{ -138,0,709},{7,0,25},{8,0,202},{138,0,536},{5,11,665},{135,10,1788},{145,10,49},{ -9,0,423},{140,0,89},{5,11,67},{6,11,62},{6,11,374},{135,11,1391},{8,0,113},{9,0, -877},{10,0,554},{11,0,83},{12,0,136},{19,0,109},{9,11,790},{140,11,47},{138,10, -661},{4,0,963},{10,0,927},{14,0,442},{135,10,1945},{133,0,976},{132,0,206},{4,11 -,391},{135,11,1169},{134,0,2002},{6,0,696},{134,0,1008},{134,0,1170},{132,11,271 -},{7,0,13},{8,0,226},{10,0,537},{11,0,570},{11,0,605},{11,0,799},{11,0,804},{12, -0,85},{12,0,516},{12,0,623},{13,0,112},{13,0,361},{14,0,77},{14,0,78},{17,0,28}, -{19,0,110},{140,11,314},{132,0,769},{134,0,1544},{4,0,551},{137,0,678},{5,10,84} -,{134,10,163},{9,0,57},{9,0,459},{10,0,425},{11,0,119},{12,0,184},{12,0,371},{13 -,0,358},{145,0,51},{5,0,188},{5,0,814},{8,0,10},{9,0,421},{9,0,729},{10,0,609},{ -11,0,689},{4,11,253},{5,10,410},{5,11,544},{7,11,300},{137,11,340},{134,0,624},{ -138,11,321},{135,0,1941},{18,0,130},{5,10,322},{8,10,186},{9,10,262},{10,10,187} -,{142,10,208},{5,11,53},{5,11,541},{6,11,94},{6,11,499},{7,11,230},{139,11,321}, -{133,10,227},{4,0,378},{4,11,920},{5,11,25},{5,11,790},{6,11,457},{135,11,853},{ -137,0,269},{132,0,528},{134,0,1146},{7,10,1395},{8,10,486},{9,10,236},{9,10,878} -,{10,10,218},{11,10,95},{19,10,17},{147,10,31},{7,10,2043},{8,10,672},{141,10, -448},{134,0,1105},{134,0,1616},{134,11,1765},{140,11,163},{5,10,412},{133,11,822 -},{132,11,634},{6,0,656},{134,11,1730},{134,0,1940},{5,0,104},{6,0,173},{135,0, -1631},{136,10,562},{6,11,36},{7,11,658},{8,11,454},{147,11,86},{5,0,457},{134,10 -,1771},{7,0,810},{8,0,138},{8,0,342},{9,0,84},{10,0,193},{11,0,883},{140,0,359}, -{9,0,620},{135,10,1190},{137,10,132},{7,11,975},{137,11,789},{6,0,95},{6,0,1934} -,{136,0,967},{141,11,335},{6,0,406},{10,0,409},{10,0,447},{11,0,44},{140,0,100}, -{4,10,317},{135,10,1279},{132,0,477},{134,0,1268},{6,0,1941},{8,0,944},{5,10,63} -,{133,10,509},{132,0,629},{132,11,104},{4,0,246},{133,0,375},{6,0,1636},{132,10, -288},{135,11,1614},{9,0,49},{10,0,774},{8,10,89},{8,10,620},{11,10,628},{12,10, -322},{143,10,124},{4,0,282},{7,0,1034},{11,0,398},{11,0,634},{12,0,1},{12,0,79}, -{12,0,544},{14,0,237},{17,0,10},{146,0,20},{132,0,824},{7,11,45},{9,11,542},{9, -11,566},{138,11,728},{5,0,118},{5,0,499},{6,0,476},{6,0,665},{6,0,1176},{6,0, -1196},{7,0,600},{7,0,888},{135,0,1096},{7,0,296},{7,0,596},{8,0,560},{8,0,586},{ -9,0,612},{11,0,304},{12,0,46},{13,0,89},{14,0,112},{145,0,122},{5,0,894},{6,0, -1772},{9,0,1009},{138,10,120},{5,11,533},{7,11,755},{138,11,780},{151,10,1},{6,0 -,1474},{7,11,87},{142,11,288},{139,0,366},{137,10,461},{7,11,988},{7,11,1939},{9 -,11,64},{9,11,502},{12,11,7},{12,11,34},{13,11,12},{13,11,234},{147,11,77},{7,0, -1599},{7,0,1723},{8,0,79},{8,0,106},{8,0,190},{8,0,302},{8,0,383},{8,0,713},{9,0 -,119},{9,0,233},{9,0,419},{9,0,471},{10,0,181},{10,0,406},{11,0,57},{11,0,85},{ -11,0,120},{11,0,177},{11,0,296},{11,0,382},{11,0,454},{11,0,758},{11,0,999},{12, -0,27},{12,0,98},{12,0,131},{12,0,245},{12,0,312},{12,0,446},{12,0,454},{13,0,25} -,{13,0,98},{13,0,426},{13,0,508},{14,0,70},{14,0,163},{14,0,272},{14,0,277},{14, -0,370},{15,0,95},{15,0,138},{15,0,167},{17,0,38},{148,0,96},{135,10,1346},{10,0, -200},{19,0,2},{151,0,22},{135,11,141},{134,10,85},{134,0,1759},{138,0,372},{145, -0,16},{8,0,943},{132,11,619},{139,11,88},{5,11,246},{8,11,189},{9,11,355},{9,11, -512},{10,11,124},{10,11,453},{11,11,143},{11,11,416},{11,11,859},{141,11,341},{5 -,0,258},{134,0,719},{6,0,1798},{6,0,1839},{8,0,900},{10,0,874},{10,0,886},{12,0, -698},{12,0,732},{12,0,770},{16,0,106},{18,0,163},{18,0,170},{18,0,171},{152,0,20 -},{9,0,707},{11,0,326},{11,0,339},{12,0,423},{12,0,502},{20,0,62},{9,11,707},{11 -,11,326},{11,11,339},{12,11,423},{12,11,502},{148,11,62},{5,0,30},{7,0,495},{8,0 -,134},{9,0,788},{140,0,438},{133,11,678},{5,10,279},{6,10,235},{7,10,468},{8,10, -446},{9,10,637},{10,10,717},{11,10,738},{140,10,514},{5,11,35},{6,11,287},{7,11, -862},{7,11,1886},{138,11,179},{7,0,1948},{7,0,2004},{132,11,517},{5,10,17},{6,10 -,371},{137,10,528},{4,0,115},{5,0,669},{6,0,407},{8,0,311},{11,0,10},{141,0,5},{ -137,0,381},{5,0,50},{6,0,439},{7,0,780},{135,0,1040},{136,11,667},{11,11,403},{ -146,11,83},{5,0,1},{6,0,81},{138,0,520},{134,0,738},{5,0,482},{8,0,98},{9,0,172} -,{10,0,360},{10,0,700},{10,0,822},{11,0,302},{11,0,778},{12,0,50},{12,0,127},{12 -,0,396},{13,0,62},{13,0,328},{14,0,122},{147,0,72},{9,11,157},{10,11,131},{140, -11,72},{135,11,714},{135,11,539},{5,0,2},{6,0,512},{7,0,797},{7,0,1494},{8,0,253 -},{8,0,589},{9,0,77},{10,0,1},{10,0,129},{10,0,225},{11,0,118},{11,0,226},{11,0, -251},{11,0,430},{11,0,701},{11,0,974},{11,0,982},{12,0,64},{12,0,260},{12,0,488} -,{140,0,690},{5,11,394},{7,11,367},{7,11,487},{7,11,857},{7,11,1713},{8,11,246}, -{9,11,537},{10,11,165},{12,11,219},{140,11,561},{136,0,557},{5,10,779},{5,10,807 -},{6,10,1655},{134,10,1676},{4,10,196},{5,10,558},{133,10,949},{11,11,827},{12, -11,56},{14,11,34},{143,11,148},{137,0,347},{133,0,572},{134,0,832},{4,0,12},{7,0 -,504},{7,0,522},{7,0,809},{8,0,797},{141,0,88},{4,10,752},{133,11,449},{7,11,86} -,{8,11,103},{145,11,69},{7,11,2028},{138,11,641},{5,0,528},{6,11,1},{142,11,2},{ -134,0,861},{10,0,294},{4,10,227},{5,10,159},{5,10,409},{7,10,80},{10,10,479},{12 -,10,418},{14,10,50},{14,10,249},{142,10,295},{7,10,1470},{8,10,66},{8,10,137},{8 -,10,761},{9,10,638},{11,10,80},{11,10,212},{11,10,368},{11,10,418},{12,10,8},{13 -,10,15},{16,10,61},{17,10,59},{19,10,28},{148,10,84},{20,0,109},{135,11,1148},{6 -,11,277},{7,11,1274},{7,11,1386},{7,11,1392},{12,11,129},{146,11,87},{6,11,187}, -{7,11,39},{7,11,1203},{8,11,380},{8,11,542},{14,11,117},{149,11,28},{134,0,1187} -,{5,0,266},{9,0,290},{9,0,364},{10,0,293},{11,0,606},{142,0,45},{6,11,297},{7,11 -,793},{139,11,938},{4,0,50},{6,0,594},{9,0,121},{10,0,49},{10,0,412},{139,0,834} -,{136,0,748},{7,11,464},{8,11,438},{11,11,105},{11,11,363},{12,11,231},{14,11, -386},{15,11,102},{148,11,75},{132,0,466},{13,0,399},{14,0,337},{6,10,38},{7,10, -1220},{8,10,185},{8,10,256},{9,10,22},{9,10,331},{10,10,738},{11,10,205},{11,10, -540},{11,10,746},{13,10,465},{142,10,194},{9,0,378},{141,0,162},{137,0,519},{4, -10,159},{6,10,115},{7,10,252},{7,10,257},{7,10,1928},{8,10,69},{9,10,384},{10,10 -,91},{10,10,615},{12,10,375},{14,10,235},{18,10,117},{147,10,123},{5,11,604},{5, -10,911},{136,10,278},{132,0,667},{8,0,351},{9,0,322},{4,10,151},{135,10,1567},{ -134,0,902},{133,10,990},{12,0,180},{5,10,194},{7,10,1662},{137,10,90},{4,0,869}, -{134,0,1996},{134,0,813},{133,10,425},{137,11,761},{132,0,260},{133,10,971},{5, -11,20},{6,11,298},{7,11,659},{7,11,1366},{137,11,219},{4,0,39},{5,0,36},{7,0, -1843},{8,0,407},{11,0,144},{140,0,523},{4,0,510},{10,0,587},{139,10,752},{7,0,29 -},{7,0,66},{7,0,1980},{10,0,487},{138,0,809},{13,0,260},{14,0,82},{18,0,63},{137 -,10,662},{5,10,72},{6,10,264},{7,10,21},{7,10,46},{7,10,2013},{8,10,215},{8,10, -513},{10,10,266},{139,10,22},{134,0,570},{6,0,565},{7,0,1667},{4,11,439},{10,10, -95},{11,10,603},{12,11,242},{13,10,443},{14,10,160},{143,10,4},{134,0,1464},{134 -,10,431},{9,0,372},{15,0,2},{19,0,10},{19,0,18},{5,10,874},{6,10,1677},{143,10,0 -},{132,0,787},{6,0,380},{12,0,399},{21,0,19},{7,10,939},{7,10,1172},{7,10,1671}, -{9,10,540},{10,10,696},{11,10,265},{11,10,732},{11,10,928},{11,10,937},{141,10, -438},{137,0,200},{132,11,233},{132,0,516},{134,11,577},{132,0,844},{11,0,887},{ -14,0,365},{142,0,375},{132,11,482},{8,0,821},{140,0,44},{7,0,1655},{136,0,305},{ -5,10,682},{135,10,1887},{135,11,346},{132,10,696},{4,0,10},{7,0,917},{139,0,786} -,{5,11,795},{6,11,1741},{8,11,417},{137,11,782},{4,0,1016},{134,0,2031},{5,0,684 -},{4,10,726},{133,10,630},{6,0,1021},{134,0,1480},{8,10,802},{136,10,838},{134,0 -,27},{134,0,395},{135,11,622},{7,11,625},{135,11,1750},{4,11,203},{135,11,1936}, -{6,10,118},{7,10,215},{7,10,1521},{140,10,11},{132,0,813},{136,0,511},{7,10,615} -,{138,10,251},{135,10,1044},{145,0,56},{133,10,225},{6,0,342},{6,0,496},{8,0,275 -},{137,0,206},{4,0,909},{133,0,940},{132,0,891},{7,11,311},{9,11,308},{140,11, -255},{4,10,370},{5,10,756},{135,10,1326},{4,0,687},{134,0,1596},{134,0,1342},{6, -10,1662},{7,10,48},{8,10,771},{10,10,116},{13,10,104},{14,10,105},{14,10,184},{ -15,10,168},{19,10,92},{148,10,68},{138,10,209},{4,11,400},{5,11,267},{135,11,232 -},{151,11,12},{6,0,41},{141,0,160},{141,11,314},{134,0,1718},{136,0,778},{142,11 -,261},{134,0,1610},{133,0,115},{132,0,294},{14,0,314},{132,10,120},{132,0,983},{ -5,0,193},{140,0,178},{138,10,429},{5,10,820},{135,10,931},{6,0,994},{6,0,1051},{ -6,0,1439},{7,0,174},{133,11,732},{4,11,100},{7,11,679},{8,11,313},{138,10,199},{ -6,10,151},{6,10,1675},{7,10,383},{151,10,10},{6,0,1796},{8,0,848},{8,0,867},{8,0 -,907},{10,0,855},{140,0,703},{140,0,221},{4,0,122},{5,0,796},{5,0,952},{6,0,1660 -},{6,0,1671},{8,0,567},{9,0,687},{9,0,742},{10,0,686},{11,0,682},{11,0,909},{140 -,0,281},{5,11,362},{5,11,443},{6,11,318},{7,11,1019},{139,11,623},{5,11,463},{ -136,11,296},{11,0,583},{13,0,262},{6,10,1624},{12,10,422},{142,10,360},{5,0,179} -,{7,0,1095},{135,0,1213},{4,10,43},{4,11,454},{5,10,344},{133,10,357},{4,0,66},{ -7,0,722},{135,0,904},{134,0,773},{7,0,352},{133,10,888},{5,11,48},{5,11,404},{6, -11,557},{7,11,458},{8,11,597},{10,11,455},{10,11,606},{11,11,49},{11,11,548},{12 -,11,476},{13,11,18},{141,11,450},{134,11,418},{132,10,711},{5,11,442},{135,11, -1984},{141,0,35},{137,0,152},{134,0,1197},{135,11,1093},{137,11,203},{137,10,440 -},{10,0,592},{10,0,753},{12,0,317},{12,0,355},{12,0,465},{12,0,469},{12,0,560},{ -12,0,578},{141,0,243},{133,0,564},{134,0,797},{5,10,958},{133,10,987},{5,11,55}, -{7,11,376},{140,11,161},{133,11,450},{134,0,556},{134,0,819},{11,10,276},{142,10 -,293},{7,0,544},{138,0,61},{8,0,719},{4,10,65},{5,10,479},{5,10,1004},{7,10,1913 -},{8,10,317},{9,10,302},{10,10,612},{141,10,22},{4,0,5},{5,0,498},{8,0,637},{9,0 -,521},{4,11,213},{4,10,261},{7,11,223},{7,10,510},{136,11,80},{5,0,927},{7,0,101 -},{4,10,291},{7,11,381},{7,11,806},{7,11,820},{8,11,354},{8,11,437},{8,11,787},{ -9,10,515},{9,11,657},{10,11,58},{10,11,339},{10,11,749},{11,11,914},{12,10,152}, -{12,11,162},{12,10,443},{13,11,75},{13,10,392},{14,11,106},{14,11,198},{14,11, -320},{14,10,357},{14,11,413},{146,11,43},{6,0,1153},{7,0,1441},{136,11,747},{4,0 -,893},{5,0,780},{133,0,893},{138,11,654},{133,11,692},{133,0,238},{134,11,191},{ -4,10,130},{135,10,843},{6,0,1296},{5,10,42},{5,10,879},{7,10,245},{7,10,324},{7, -10,1532},{11,10,463},{11,10,472},{13,10,363},{144,10,52},{134,0,1729},{6,0,1999} -,{136,0,969},{4,10,134},{133,10,372},{4,0,60},{7,0,941},{7,0,1800},{8,0,314},{9, -0,700},{139,0,487},{134,0,1144},{6,11,162},{7,11,1960},{136,11,831},{132,11,706} -,{135,0,1147},{138,11,426},{138,11,89},{7,0,1853},{138,0,437},{136,0,419},{135, -10,1634},{133,0,828},{5,0,806},{7,0,176},{7,0,178},{7,0,1240},{7,0,1976},{132,10 -,644},{135,11,1877},{5,11,420},{135,11,1449},{4,0,51},{5,0,39},{6,0,4},{7,0,591} -,{7,0,849},{7,0,951},{7,0,1613},{7,0,1760},{7,0,1988},{9,0,434},{10,0,754},{11,0 -,25},{139,0,37},{10,11,57},{138,11,277},{135,10,540},{132,11,204},{135,0,159},{ -139,11,231},{133,0,902},{7,0,928},{7,11,366},{9,11,287},{12,11,199},{12,11,556}, -{140,11,577},{6,10,623},{136,10,789},{4,10,908},{5,10,359},{5,10,508},{6,10,1723 -},{7,10,343},{7,10,1996},{135,10,2026},{134,0,270},{4,10,341},{135,10,480},{5,11 -,356},{135,11,224},{11,11,588},{11,11,864},{11,11,968},{143,11,160},{132,0,556}, -{137,0,801},{132,0,416},{142,0,372},{5,0,152},{5,0,197},{7,0,340},{7,0,867},{10, -0,548},{10,0,581},{11,0,6},{12,0,3},{12,0,19},{14,0,110},{142,0,289},{139,0,369} -,{7,11,630},{9,11,567},{11,11,150},{11,11,444},{141,11,119},{134,11,539},{7,10, -1995},{8,10,299},{11,10,890},{140,10,674},{7,0,34},{7,0,190},{8,0,28},{8,0,141}, -{8,0,444},{8,0,811},{9,0,468},{11,0,334},{12,0,24},{12,0,386},{140,0,576},{133,0 -,757},{7,0,1553},{136,0,898},{133,0,721},{136,0,1012},{4,0,789},{5,0,647},{135,0 -,1102},{132,0,898},{10,0,183},{4,10,238},{5,10,503},{6,10,179},{7,10,2003},{8,10 -,381},{8,10,473},{9,10,149},{10,10,788},{15,10,45},{15,10,86},{20,10,110},{150, -10,57},{9,0,136},{19,0,107},{4,10,121},{5,10,156},{5,10,349},{10,10,605},{142,10 -,342},{4,11,235},{135,11,255},{4,11,194},{5,11,584},{6,11,384},{7,11,583},{10,11 -,761},{11,11,760},{139,11,851},{6,10,80},{6,10,1694},{7,10,173},{7,10,1974},{9, -10,547},{10,10,730},{14,10,18},{150,10,39},{4,10,923},{134,10,1711},{5,0,277},{ -141,0,247},{132,0,435},{133,11,562},{134,0,1311},{5,11,191},{137,11,271},{132,10 -,595},{7,11,1537},{14,11,96},{143,11,73},{5,0,437},{7,0,502},{7,0,519},{7,0,1122 -},{7,0,1751},{14,0,211},{6,10,459},{7,10,1753},{7,10,1805},{8,10,658},{9,10,1},{ -11,10,959},{141,10,446},{6,0,814},{4,11,470},{5,11,473},{6,11,153},{7,11,1503},{ -7,11,1923},{10,11,701},{11,11,132},{11,11,168},{11,11,227},{11,11,320},{11,11, -436},{11,11,525},{11,11,855},{12,11,41},{12,11,286},{13,11,103},{13,11,284},{14, -11,255},{14,11,262},{15,11,117},{143,11,127},{5,0,265},{6,0,212},{135,0,28},{138 -,0,750},{133,11,327},{6,11,552},{7,11,1754},{137,11,604},{134,0,2012},{132,0,702 -},{5,11,80},{6,11,405},{7,11,403},{7,11,1502},{7,11,1626},{8,11,456},{9,11,487}, -{9,11,853},{9,11,889},{10,11,309},{11,11,721},{11,11,994},{12,11,430},{141,11, -165},{5,0,808},{135,0,2045},{5,0,166},{8,0,739},{140,0,511},{134,10,490},{4,11, -453},{5,11,887},{6,11,535},{8,11,6},{136,11,543},{4,0,119},{5,0,170},{5,0,447},{ -7,0,1708},{7,0,1889},{9,0,357},{9,0,719},{12,0,486},{140,0,596},{137,0,500},{7, -10,250},{136,10,507},{132,10,158},{6,0,809},{134,0,1500},{9,0,327},{11,0,350},{ -11,0,831},{13,0,352},{4,10,140},{7,10,362},{8,10,209},{9,10,10},{9,10,503},{9,10 -,614},{10,10,689},{11,10,327},{11,10,725},{12,10,252},{12,10,583},{13,10,192},{ -14,10,269},{14,10,356},{148,10,50},{135,11,741},{4,0,450},{7,0,1158},{19,10,1},{ -19,10,26},{150,10,9},{6,0,597},{135,0,1318},{134,0,1602},{6,10,228},{7,10,1341}, -{9,10,408},{138,10,343},{7,0,1375},{7,0,1466},{138,0,331},{132,0,754},{132,10, -557},{5,11,101},{6,11,88},{6,11,543},{7,11,1677},{9,11,100},{10,11,677},{14,11, -169},{14,11,302},{14,11,313},{15,11,48},{143,11,84},{134,0,1368},{4,11,310},{9, -11,795},{10,11,733},{11,11,451},{12,11,249},{14,11,115},{14,11,286},{143,11,100} -,{132,10,548},{10,0,557},{7,10,197},{8,10,142},{8,10,325},{9,10,150},{9,10,596}, -{10,10,353},{11,10,74},{11,10,315},{12,10,662},{12,10,681},{14,10,423},{143,10, -141},{133,11,587},{5,0,850},{136,0,799},{10,0,908},{12,0,701},{12,0,757},{142,0, -466},{4,0,62},{5,0,275},{18,0,19},{6,10,399},{6,10,579},{7,10,692},{7,10,846},{7 -,10,1015},{7,10,1799},{8,10,403},{9,10,394},{10,10,133},{12,10,4},{12,10,297},{ -12,10,452},{16,10,81},{18,10,25},{21,10,14},{22,10,12},{151,10,18},{12,0,459},{7 -,10,1546},{11,10,299},{142,10,407},{132,10,177},{132,11,498},{7,11,217},{8,11, -140},{138,11,610},{5,10,411},{135,10,653},{134,0,1802},{7,10,439},{10,10,727},{ -11,10,260},{139,10,684},{133,11,905},{11,11,580},{142,11,201},{134,0,1397},{5,10 -,208},{7,10,753},{135,10,1528},{7,0,238},{7,0,2033},{8,0,120},{8,0,188},{8,0,659 -},{9,0,598},{10,0,466},{12,0,342},{12,0,588},{13,0,503},{14,0,246},{143,0,92},{ -135,11,1041},{4,11,456},{7,11,105},{7,11,358},{7,11,1637},{8,11,643},{139,11,483 -},{6,0,1318},{134,0,1324},{4,0,201},{7,0,1744},{8,0,602},{11,0,247},{11,0,826},{ -17,0,65},{133,10,242},{8,0,164},{146,0,62},{133,10,953},{139,10,802},{133,0,615} -,{7,11,1566},{8,11,269},{9,11,212},{9,11,718},{14,11,15},{14,11,132},{142,11,227 -},{133,10,290},{132,10,380},{5,10,52},{7,10,277},{9,10,368},{139,10,791},{135,0, -1243},{133,11,539},{11,11,919},{141,11,409},{136,0,968},{133,11,470},{134,0,882} -,{132,0,907},{5,0,100},{10,0,329},{12,0,416},{149,0,29},{10,10,138},{139,10,476} -,{5,10,725},{5,10,727},{6,11,91},{7,11,435},{135,10,1811},{4,11,16},{5,11,316},{ -5,11,842},{6,11,370},{6,11,1778},{8,11,166},{11,11,812},{12,11,206},{12,11,351}, -{14,11,418},{16,11,15},{16,11,34},{18,11,3},{19,11,3},{19,11,7},{20,11,4},{149, -11,21},{132,0,176},{5,0,636},{5,0,998},{7,0,9},{7,0,1508},{8,0,26},{9,0,317},{9, -0,358},{10,0,210},{10,0,292},{10,0,533},{11,0,555},{12,0,526},{12,0,607},{13,0, -263},{13,0,459},{142,0,271},{6,0,256},{8,0,265},{4,10,38},{7,10,307},{7,10,999}, -{7,10,1481},{7,10,1732},{7,10,1738},{9,10,414},{11,10,316},{12,10,52},{13,10,420 -},{147,10,100},{135,10,1296},{4,11,611},{133,11,606},{4,0,643},{142,11,21},{133, -11,715},{133,10,723},{6,0,610},{135,11,597},{10,0,127},{141,0,27},{6,0,1995},{6, -0,2001},{8,0,119},{136,0,973},{4,11,149},{138,11,368},{12,0,522},{4,11,154},{5, -10,109},{6,10,1784},{7,11,1134},{7,10,1895},{8,11,105},{12,10,296},{140,10,302}, -{4,11,31},{6,11,429},{7,11,962},{9,11,458},{139,11,691},{10,0,553},{11,0,876},{ -13,0,193},{13,0,423},{14,0,166},{19,0,84},{4,11,312},{5,10,216},{7,10,1879},{9, -10,141},{9,10,270},{9,10,679},{10,10,159},{11,10,197},{12,10,538},{12,10,559},{ -14,10,144},{14,10,167},{143,10,67},{134,0,1582},{7,0,1578},{135,11,1578},{137,10 -,81},{132,11,236},{134,10,391},{134,0,795},{7,10,322},{136,10,249},{5,11,836},{5 -,11,857},{6,11,1680},{7,11,59},{147,11,53},{135,0,432},{10,11,68},{139,11,494},{ -4,11,81},{139,11,867},{7,0,126},{136,0,84},{142,11,280},{5,11,282},{8,11,650},{9 -,11,295},{9,11,907},{138,11,443},{136,0,790},{5,10,632},{138,10,526},{6,0,64},{ -12,0,377},{13,0,309},{14,0,141},{14,0,429},{14,11,141},{142,11,429},{134,0,1529} -,{6,0,321},{7,0,1857},{9,0,530},{19,0,99},{7,10,948},{7,10,1042},{8,10,235},{8, -10,461},{9,10,453},{10,10,354},{145,10,77},{7,0,1104},{11,0,269},{11,0,539},{11, -0,627},{11,0,706},{11,0,975},{12,0,248},{12,0,434},{12,0,600},{12,0,622},{13,0, -297},{13,0,485},{14,0,69},{14,0,409},{143,0,108},{4,10,362},{7,10,52},{7,10,303} -,{10,11,70},{12,11,26},{14,11,17},{14,11,178},{15,11,34},{149,11,12},{11,0,977}, -{141,0,507},{9,0,34},{139,0,484},{5,10,196},{6,10,486},{7,10,212},{8,10,309},{ -136,10,346},{6,0,1700},{7,0,26},{7,0,293},{7,0,382},{7,0,1026},{7,0,1087},{7,0, -2027},{8,0,24},{8,0,114},{8,0,252},{8,0,727},{8,0,729},{9,0,30},{9,0,199},{9,0, -231},{9,0,251},{9,0,334},{9,0,361},{9,0,712},{10,0,55},{10,0,60},{10,0,232},{10, -0,332},{10,0,384},{10,0,396},{10,0,504},{10,0,542},{10,0,652},{11,0,20},{11,0,48 -},{11,0,207},{11,0,291},{11,0,298},{11,0,342},{11,0,365},{11,0,394},{11,0,620},{ -11,0,705},{11,0,1017},{12,0,123},{12,0,340},{12,0,406},{12,0,643},{13,0,61},{13, -0,269},{13,0,311},{13,0,319},{13,0,486},{14,0,234},{15,0,62},{15,0,85},{16,0,71} -,{18,0,119},{20,0,105},{135,10,1912},{4,11,71},{5,11,376},{7,11,119},{138,11,665 -},{10,0,918},{10,0,926},{4,10,686},{136,11,55},{138,10,625},{136,10,706},{132,11 -,479},{4,10,30},{133,10,43},{6,0,379},{7,0,270},{8,0,176},{8,0,183},{9,0,432},{9 -,0,661},{12,0,247},{12,0,617},{18,0,125},{7,11,607},{8,11,99},{152,11,4},{5,0, -792},{133,0,900},{4,11,612},{133,11,561},{4,11,41},{4,10,220},{5,11,74},{7,10, -1535},{7,11,1627},{11,11,871},{140,11,619},{135,0,1920},{7,11,94},{11,11,329},{ -11,11,965},{12,11,241},{14,11,354},{15,11,22},{148,11,63},{9,11,209},{137,11,300 -},{134,0,771},{135,0,1979},{4,0,901},{133,0,776},{142,0,254},{133,11,98},{9,11, -16},{141,11,386},{133,11,984},{4,11,182},{6,11,205},{135,11,220},{7,10,1725},{7, -10,1774},{138,10,393},{5,10,263},{134,10,414},{4,11,42},{9,11,205},{9,11,786},{ -138,11,659},{14,0,140},{148,0,41},{8,0,440},{10,0,359},{6,10,178},{6,11,289},{6, -10,1750},{7,11,1670},{9,10,690},{10,10,155},{10,10,373},{11,10,698},{12,11,57},{ -13,10,155},{20,10,93},{151,11,4},{4,0,37},{5,0,334},{7,0,1253},{151,11,25},{4,0, -508},{4,11,635},{5,10,97},{137,10,393},{139,11,533},{4,0,640},{133,0,513},{134, -10,1639},{132,11,371},{4,11,272},{7,11,836},{7,11,1651},{145,11,89},{5,11,825},{ -6,11,444},{6,11,1640},{136,11,308},{4,10,191},{7,10,934},{8,10,647},{145,10,97}, -{12,0,246},{15,0,162},{19,0,64},{20,0,8},{20,0,95},{22,0,24},{152,0,17},{4,0,533 -},{5,10,165},{9,10,346},{138,10,655},{5,11,737},{139,10,885},{133,10,877},{8,10, -128},{139,10,179},{137,11,307},{140,0,752},{133,0,920},{135,0,1048},{5,0,153},{6 -,0,580},{6,10,1663},{7,10,132},{7,10,1154},{7,10,1415},{7,10,1507},{12,10,493},{ -15,10,105},{151,10,15},{5,10,459},{7,10,1073},{8,10,241},{136,10,334},{138,0,391 -},{135,0,1952},{133,11,525},{8,11,641},{11,11,388},{140,11,580},{142,0,126},{134 -,0,640},{132,0,483},{7,0,1616},{9,0,69},{6,10,324},{6,10,520},{7,10,338},{7,10, -1729},{8,10,228},{139,10,750},{5,11,493},{134,11,528},{135,0,734},{4,11,174},{ -135,11,911},{138,0,480},{9,0,495},{146,0,104},{135,10,705},{9,0,472},{4,10,73},{ -6,10,612},{7,10,927},{7,10,1330},{7,10,1822},{8,10,217},{9,10,765},{9,10,766},{ -10,10,408},{11,10,51},{11,10,793},{12,10,266},{15,10,158},{20,10,89},{150,10,32} -,{7,11,548},{137,11,58},{4,11,32},{5,11,215},{6,11,269},{7,11,1782},{7,11,1892}, -{10,11,16},{11,11,822},{11,11,954},{141,11,481},{132,0,874},{9,0,229},{5,10,389} -,{136,10,636},{7,11,1749},{136,11,477},{134,0,948},{5,11,308},{135,11,1088},{4,0 -,748},{139,0,1009},{136,10,21},{6,0,555},{135,0,485},{5,11,126},{8,11,297},{9,11 -,366},{9,11,445},{12,11,53},{12,11,374},{141,11,492},{7,11,1551},{139,11,361},{ -136,0,193},{136,0,472},{8,0,653},{13,0,93},{147,0,14},{132,0,984},{132,11,175},{ -5,0,172},{6,0,1971},{132,11,685},{149,11,8},{133,11,797},{13,0,83},{5,10,189},{7 -,10,442},{7,10,443},{8,10,281},{12,10,174},{141,10,261},{134,0,1568},{133,11,565 -},{139,0,384},{133,0,260},{7,0,758},{7,0,880},{7,0,1359},{9,0,164},{9,0,167},{10 -,0,156},{10,0,588},{12,0,101},{14,0,48},{15,0,70},{6,10,2},{7,10,1262},{7,10, -1737},{8,10,22},{8,10,270},{8,10,612},{9,10,312},{9,10,436},{10,10,311},{10,10, -623},{11,10,72},{11,10,330},{11,10,455},{12,10,321},{12,10,504},{12,10,530},{12, -10,543},{13,10,17},{13,10,156},{13,10,334},{17,10,60},{148,10,64},{4,11,252},{7, -11,1068},{10,11,434},{11,11,228},{11,11,426},{13,11,231},{18,11,106},{148,11,87} -,{7,10,354},{10,10,410},{139,10,815},{6,0,367},{7,10,670},{7,10,1327},{8,10,411} -,{8,10,435},{9,10,653},{9,10,740},{10,10,385},{11,10,222},{11,10,324},{11,10,829 -},{140,10,611},{7,0,1174},{6,10,166},{135,10,374},{146,0,121},{132,0,828},{5,11, -231},{138,11,509},{7,11,601},{9,11,277},{9,11,674},{10,11,178},{10,11,257},{10, -11,418},{11,11,531},{11,11,544},{11,11,585},{12,11,113},{12,11,475},{13,11,99},{ -142,11,428},{134,0,1541},{135,11,1779},{5,0,343},{134,10,398},{135,10,50},{135, -11,1683},{4,0,440},{7,0,57},{8,0,167},{8,0,375},{9,0,82},{9,0,561},{9,0,744},{10 -,0,620},{137,11,744},{134,0,926},{6,10,517},{7,10,1159},{10,10,621},{139,10,192} -,{137,0,827},{8,0,194},{136,0,756},{10,10,223},{139,10,645},{7,10,64},{136,10, -245},{4,11,399},{5,11,119},{5,11,494},{7,11,751},{137,11,556},{132,0,808},{135,0 -,22},{7,10,1763},{140,10,310},{5,0,639},{7,0,1249},{11,0,896},{134,11,584},{134, -0,1614},{135,0,860},{135,11,1121},{5,10,129},{6,10,61},{135,10,947},{4,0,102},{7 -,0,815},{7,0,1699},{139,0,964},{13,10,505},{141,10,506},{139,10,1000},{132,11, -679},{132,0,899},{132,0,569},{5,11,694},{137,11,714},{136,0,795},{6,0,2045},{139 -,11,7},{6,0,52},{9,0,104},{9,0,559},{12,0,308},{147,0,87},{4,0,301},{132,0,604}, -{133,10,637},{136,0,779},{5,11,143},{5,11,769},{6,11,1760},{7,11,682},{7,11,1992 -},{136,11,736},{137,10,590},{147,0,32},{137,11,527},{5,10,280},{135,10,1226},{ -134,0,494},{6,0,677},{6,0,682},{134,0,1044},{133,10,281},{135,10,1064},{7,0,508} -,{133,11,860},{6,11,422},{7,11,0},{7,11,1544},{9,11,577},{11,11,990},{12,11,141} -,{12,11,453},{13,11,47},{141,11,266},{134,0,1014},{5,11,515},{137,11,131},{134,0 -,957},{132,11,646},{6,0,310},{7,0,1849},{8,0,72},{8,0,272},{8,0,431},{9,0,12},{9 -,0,376},{10,0,563},{10,0,630},{10,0,796},{10,0,810},{11,0,367},{11,0,599},{11,0, -686},{140,0,672},{7,0,570},{4,11,396},{7,10,120},{7,11,728},{8,10,489},{9,11,117 -},{9,10,319},{10,10,820},{11,10,1004},{12,10,379},{12,10,679},{13,10,117},{13,11 -,202},{13,10,412},{14,10,25},{15,10,52},{15,10,161},{16,10,47},{20,11,51},{149, -10,2},{6,11,121},{6,11,124},{6,11,357},{7,11,1138},{7,11,1295},{8,11,162},{139, -11,655},{8,0,449},{4,10,937},{5,10,801},{136,11,449},{139,11,958},{6,0,181},{7,0 -,537},{8,0,64},{9,0,127},{10,0,496},{12,0,510},{141,0,384},{138,11,253},{4,0,244 -},{135,0,233},{133,11,237},{132,10,365},{6,0,1650},{10,0,702},{139,0,245},{5,10, -7},{139,10,774},{13,0,463},{20,0,49},{13,11,463},{148,11,49},{4,10,734},{5,10, -662},{134,10,430},{4,10,746},{135,10,1090},{5,10,360},{136,10,237},{137,0,338},{ -143,11,10},{7,11,571},{138,11,366},{134,0,1279},{9,11,513},{10,11,22},{10,11,39} -,{12,11,122},{140,11,187},{133,0,896},{146,0,178},{134,0,695},{137,0,808},{134, -11,587},{7,11,107},{7,11,838},{8,11,550},{138,11,401},{7,0,1117},{136,0,539},{4, -10,277},{5,10,608},{6,10,493},{7,10,457},{140,10,384},{133,11,768},{12,0,257},{7 -,10,27},{135,10,316},{140,0,1003},{4,0,207},{5,0,586},{5,0,676},{6,0,448},{8,0, -244},{11,0,1},{13,0,3},{16,0,54},{17,0,4},{18,0,13},{133,10,552},{4,10,401},{137 -,10,264},{5,0,516},{7,0,1883},{135,11,1883},{12,0,960},{132,11,894},{5,0,4},{5,0 -,810},{6,0,13},{6,0,538},{6,0,1690},{6,0,1726},{7,0,499},{7,0,1819},{8,0,148},{8 -,0,696},{8,0,791},{12,0,125},{143,0,9},{135,0,1268},{11,0,30},{14,0,315},{9,10, -543},{10,10,524},{12,10,524},{16,10,18},{20,10,26},{148,10,65},{6,0,748},{4,10, -205},{5,10,623},{7,10,104},{136,10,519},{11,0,542},{139,0,852},{140,0,6},{132,0, -848},{7,0,1385},{11,0,582},{11,0,650},{11,0,901},{11,0,949},{12,0,232},{12,0,236 -},{13,0,413},{13,0,501},{18,0,116},{7,10,579},{9,10,41},{9,10,244},{9,10,669},{ -10,10,5},{11,10,861},{11,10,951},{139,10,980},{4,0,945},{6,0,1811},{6,0,1845},{6 -,0,1853},{6,0,1858},{8,0,862},{12,0,782},{12,0,788},{18,0,160},{148,0,117},{132, -10,717},{4,0,925},{5,0,803},{8,0,698},{138,0,828},{134,0,1416},{132,0,610},{139, -0,992},{6,0,878},{134,0,1477},{135,0,1847},{138,11,531},{137,11,539},{134,11,272 -},{133,0,383},{134,0,1404},{132,10,489},{4,11,9},{5,11,128},{7,11,368},{11,11, -480},{148,11,3},{136,0,986},{9,0,660},{138,0,347},{135,10,892},{136,11,682},{7,0 -,572},{9,0,592},{11,0,680},{12,0,356},{140,0,550},{7,0,1411},{138,11,527},{4,11, -2},{7,11,545},{135,11,894},{137,10,473},{11,0,64},{7,11,481},{7,10,819},{9,10,26 -},{9,10,392},{9,11,792},{10,10,152},{10,10,226},{12,10,276},{12,10,426},{12,10, -589},{13,10,460},{15,10,97},{19,10,48},{148,10,104},{135,10,51},{136,11,445},{ -136,11,646},{135,0,606},{132,10,674},{6,0,1829},{134,0,1830},{132,10,770},{5,10, -79},{7,10,1027},{7,10,1477},{139,10,52},{5,11,530},{142,11,113},{134,10,1666},{7 -,0,748},{139,0,700},{134,10,195},{133,10,789},{9,0,87},{10,0,365},{4,10,251},{4, -10,688},{7,10,513},{135,10,1284},{136,11,111},{133,0,127},{6,0,198},{140,0,83},{ -133,11,556},{133,10,889},{4,10,160},{5,10,330},{7,10,1434},{136,10,174},{5,0,276 -},{6,0,55},{7,0,1369},{138,0,864},{8,11,16},{140,11,568},{6,0,1752},{136,0,726}, -{135,0,1066},{133,0,764},{6,11,186},{137,11,426},{11,0,683},{139,11,683},{6,0, -309},{7,0,331},{138,0,550},{133,10,374},{6,0,1212},{6,0,1852},{7,0,1062},{8,0, -874},{8,0,882},{138,0,936},{132,11,585},{134,0,1364},{7,0,986},{133,10,731},{6,0 -,723},{6,0,1408},{138,0,381},{135,0,1573},{134,0,1025},{4,10,626},{5,10,642},{6, -10,425},{10,10,202},{139,10,141},{4,11,93},{5,11,252},{6,11,229},{7,11,291},{9, -11,550},{139,11,644},{137,11,749},{137,11,162},{132,11,381},{135,0,1559},{6,0, -194},{7,0,133},{10,0,493},{10,0,570},{139,0,664},{5,0,24},{5,0,569},{6,0,3},{6,0 -,119},{6,0,143},{6,0,440},{7,0,295},{7,0,599},{7,0,1686},{7,0,1854},{8,0,424},{9 -,0,43},{9,0,584},{9,0,760},{10,0,148},{10,0,328},{11,0,159},{11,0,253},{11,0,506 -},{12,0,487},{140,0,531},{6,0,661},{134,0,1517},{136,10,835},{151,10,17},{5,0,14 -},{5,0,892},{6,0,283},{7,0,234},{136,0,537},{139,0,541},{4,0,126},{8,0,635},{147 -,0,34},{4,0,316},{4,0,495},{135,0,1561},{4,11,187},{5,11,184},{5,11,690},{7,11, -1869},{138,11,756},{139,11,783},{4,0,998},{137,0,861},{136,0,1009},{139,11,292}, -{5,11,21},{6,11,77},{6,11,157},{7,11,974},{7,11,1301},{7,11,1339},{7,11,1490},{7 -,11,1873},{137,11,628},{7,11,1283},{9,11,227},{9,11,499},{10,11,341},{11,11,325} -,{11,11,408},{14,11,180},{15,11,144},{18,11,47},{147,11,49},{4,0,64},{5,0,352},{ -5,0,720},{6,0,368},{139,0,359},{5,10,384},{8,10,455},{140,10,48},{5,10,264},{134 -,10,184},{7,0,1577},{10,0,304},{10,0,549},{12,0,365},{13,0,220},{13,0,240},{142, -0,33},{134,0,1107},{134,0,929},{135,0,1142},{6,0,175},{137,0,289},{5,0,432},{133 -,0,913},{6,0,279},{7,0,219},{5,10,633},{135,10,1323},{7,0,785},{7,10,359},{8,10, -243},{140,10,175},{139,0,595},{132,10,105},{8,11,398},{9,11,681},{139,11,632},{ -140,0,80},{5,0,931},{134,0,1698},{142,11,241},{134,11,20},{134,0,1323},{11,0,526 -},{11,0,939},{141,0,290},{5,0,774},{6,0,780},{6,0,1637},{6,0,1686},{6,0,1751},{8 -,0,559},{141,0,109},{141,0,127},{7,0,1167},{11,0,934},{13,0,391},{17,0,76},{135, -11,709},{135,0,963},{6,0,260},{135,0,1484},{134,0,573},{4,10,758},{139,11,941},{ -135,10,1649},{145,11,36},{4,0,292},{137,0,580},{4,0,736},{5,0,871},{6,0,1689},{ -135,0,1944},{7,11,945},{11,11,713},{139,11,744},{134,0,1164},{135,11,937},{6,0, -1922},{9,0,982},{15,0,173},{15,0,178},{15,0,200},{18,0,189},{18,0,207},{21,0,47} -,{135,11,1652},{7,0,1695},{139,10,128},{6,0,63},{135,0,920},{133,0,793},{143,11, -134},{133,10,918},{5,0,67},{6,0,62},{6,0,374},{135,0,1391},{9,0,790},{12,0,47},{ -4,11,579},{5,11,226},{5,11,323},{135,11,960},{10,11,784},{141,11,191},{4,0,391}, -{135,0,1169},{137,0,443},{13,11,232},{146,11,35},{132,10,340},{132,0,271},{137, -11,313},{5,11,973},{137,11,659},{134,0,1140},{6,11,135},{135,11,1176},{4,0,253}, -{5,0,544},{7,0,300},{137,0,340},{7,0,897},{5,10,985},{7,10,509},{145,10,96},{138 -,11,735},{135,10,1919},{138,0,890},{5,0,818},{134,0,1122},{5,0,53},{5,0,541},{6, -0,94},{6,0,499},{7,0,230},{139,0,321},{4,0,920},{5,0,25},{5,0,790},{6,0,457},{7, -0,853},{8,0,788},{142,11,31},{132,10,247},{135,11,314},{132,0,468},{7,0,243},{6, -10,337},{7,10,494},{8,10,27},{8,10,599},{138,10,153},{4,10,184},{5,10,390},{7,10 -,618},{7,10,1456},{139,10,710},{134,0,870},{134,0,1238},{134,0,1765},{10,0,853}, -{10,0,943},{14,0,437},{14,0,439},{14,0,443},{14,0,446},{14,0,452},{14,0,469},{14 -,0,471},{14,0,473},{16,0,93},{16,0,102},{16,0,110},{148,0,121},{4,0,605},{7,0, -518},{7,0,1282},{7,0,1918},{10,0,180},{139,0,218},{133,0,822},{4,0,634},{11,0, -916},{142,0,419},{6,11,281},{7,11,6},{8,11,282},{8,11,480},{8,11,499},{9,11,198} -,{10,11,143},{10,11,169},{10,11,211},{10,11,417},{10,11,574},{11,11,147},{11,11, -395},{12,11,75},{12,11,407},{12,11,608},{13,11,500},{142,11,251},{134,0,898},{6, -0,36},{7,0,658},{8,0,454},{150,11,48},{133,11,674},{135,11,1776},{4,11,419},{10, -10,227},{11,10,497},{11,10,709},{140,10,415},{6,10,360},{7,10,1664},{136,10,478} -,{137,0,806},{12,11,508},{14,11,102},{14,11,226},{144,11,57},{135,11,1123},{4,11 -,138},{7,11,1012},{7,11,1280},{137,11,76},{5,11,29},{140,11,638},{136,10,699},{ -134,0,1326},{132,0,104},{135,11,735},{132,10,739},{134,0,1331},{7,0,260},{135,11 -,260},{135,11,1063},{7,0,45},{9,0,542},{9,0,566},{10,0,728},{137,10,869},{4,10, -67},{5,10,422},{7,10,1037},{7,10,1289},{7,10,1555},{9,10,741},{145,10,108},{139, -0,263},{134,0,1516},{14,0,146},{15,0,42},{16,0,23},{17,0,86},{146,0,17},{138,0, -468},{136,0,1005},{4,11,17},{5,11,23},{7,11,995},{11,11,383},{11,11,437},{12,11, -460},{140,11,532},{7,0,87},{142,0,288},{138,10,96},{135,11,626},{144,10,26},{7,0 -,988},{7,0,1939},{9,0,64},{9,0,502},{12,0,22},{12,0,34},{13,0,12},{13,0,234},{ -147,0,77},{13,0,133},{8,10,203},{11,10,823},{11,10,846},{12,10,482},{13,10,277}, -{13,10,302},{13,10,464},{14,10,205},{142,10,221},{4,10,449},{133,10,718},{135,0, -141},{6,0,1842},{136,0,872},{8,11,70},{12,11,171},{141,11,272},{4,10,355},{6,10, -311},{9,10,256},{138,10,404},{132,0,619},{137,0,261},{10,11,233},{10,10,758},{ -139,11,76},{5,0,246},{8,0,189},{9,0,355},{9,0,512},{10,0,124},{10,0,453},{11,0, -143},{11,0,416},{11,0,859},{141,0,341},{134,11,442},{133,10,827},{5,10,64},{140, -10,581},{4,10,442},{7,10,1047},{7,10,1352},{135,10,1643},{134,11,1709},{5,0,678} -,{6,0,305},{7,0,775},{7,0,1065},{133,10,977},{11,11,69},{12,11,105},{12,11,117}, -{13,11,213},{14,11,13},{14,11,62},{14,11,177},{14,11,421},{15,11,19},{146,11,141 -},{137,11,309},{5,0,35},{7,0,862},{7,0,1886},{138,0,179},{136,0,285},{132,0,517} -,{7,11,976},{9,11,146},{10,11,206},{10,11,596},{13,11,218},{142,11,153},{132,10, -254},{6,0,214},{12,0,540},{4,10,275},{7,10,1219},{140,10,376},{8,0,667},{11,0, -403},{146,0,83},{12,0,74},{10,11,648},{11,11,671},{143,11,46},{135,0,125},{134, -10,1753},{133,0,761},{6,0,912},{4,11,518},{6,10,369},{6,10,502},{7,10,1036},{7, -11,1136},{8,10,348},{9,10,452},{10,10,26},{11,10,224},{11,10,387},{11,10,772},{ -12,10,95},{12,10,629},{13,10,195},{13,10,207},{13,10,241},{14,10,260},{14,10,270 -},{143,10,140},{10,0,131},{140,0,72},{132,10,269},{5,10,480},{7,10,532},{7,10, -1197},{7,10,1358},{8,10,291},{11,10,349},{142,10,396},{8,11,689},{137,11,863},{8 -,0,333},{138,0,182},{4,11,18},{7,11,145},{7,11,444},{7,11,1278},{8,11,49},{8,11, -400},{9,11,71},{9,11,250},{10,11,459},{12,11,160},{144,11,24},{14,11,35},{142,11 -,191},{135,11,1864},{135,0,1338},{148,10,15},{14,0,94},{15,0,65},{16,0,4},{16,0, -77},{16,0,80},{145,0,5},{12,11,82},{143,11,36},{133,11,1010},{133,0,449},{133,0, -646},{7,0,86},{8,0,103},{135,10,657},{7,0,2028},{138,0,641},{136,10,533},{134,0, -1},{139,11,970},{5,11,87},{7,11,313},{7,11,1103},{10,11,112},{10,11,582},{11,11, -389},{11,11,813},{12,11,385},{13,11,286},{14,11,124},{146,11,108},{6,0,869},{132 -,11,267},{6,0,277},{7,0,1274},{7,0,1386},{146,0,87},{6,0,187},{7,0,39},{7,0,1203 -},{8,0,380},{14,0,117},{149,0,28},{4,10,211},{4,10,332},{5,10,335},{6,10,238},{7 -,10,269},{7,10,811},{7,10,1797},{8,10,836},{9,10,507},{141,10,242},{4,0,785},{5, -0,368},{6,0,297},{7,0,793},{139,0,938},{7,0,464},{8,0,558},{11,0,105},{12,0,231} -,{14,0,386},{15,0,102},{148,0,75},{133,10,1009},{8,0,877},{140,0,731},{139,11, -289},{10,11,249},{139,11,209},{132,11,561},{134,0,1608},{132,11,760},{134,0,1429 -},{9,11,154},{140,11,485},{5,10,228},{6,10,203},{7,10,156},{8,10,347},{137,10, -265},{7,0,1010},{11,0,733},{11,0,759},{13,0,34},{14,0,427},{146,0,45},{7,10,1131 -},{135,10,1468},{136,11,255},{7,0,1656},{9,0,369},{10,0,338},{10,0,490},{11,0, -154},{11,0,545},{11,0,775},{13,0,77},{141,0,274},{133,11,621},{134,0,1038},{4,11 -,368},{135,11,641},{6,0,2010},{8,0,979},{8,0,985},{10,0,951},{138,0,1011},{134,0 -,1005},{19,0,121},{5,10,291},{5,10,318},{7,10,765},{9,10,389},{140,10,548},{5,0, -20},{6,0,298},{7,0,659},{137,0,219},{7,0,1440},{11,0,854},{11,0,872},{11,0,921}, -{12,0,551},{13,0,472},{142,0,367},{5,0,490},{6,0,615},{6,0,620},{135,0,683},{6,0 -,1070},{134,0,1597},{139,0,522},{132,0,439},{136,0,669},{6,0,766},{6,0,1143},{6, -0,1245},{10,10,525},{139,10,82},{9,11,92},{147,11,91},{6,0,668},{134,0,1218},{6, -11,525},{9,11,876},{140,11,284},{132,0,233},{136,0,547},{132,10,422},{5,10,355}, -{145,10,0},{6,11,300},{135,11,1515},{4,0,482},{137,10,905},{4,0,886},{7,0,346},{ -133,11,594},{133,10,865},{5,10,914},{134,10,1625},{135,0,334},{5,0,795},{6,0, -1741},{133,10,234},{135,10,1383},{6,11,1641},{136,11,820},{135,0,371},{7,11,1313 -},{138,11,660},{135,10,1312},{135,0,622},{7,0,625},{135,0,1750},{135,0,339},{4,0 -,203},{135,0,1936},{15,0,29},{16,0,38},{15,11,29},{144,11,38},{5,0,338},{135,0, -1256},{135,10,1493},{10,0,130},{6,10,421},{7,10,61},{7,10,1540},{138,10,501},{6, -11,389},{7,11,149},{9,11,142},{138,11,94},{137,10,341},{11,0,678},{12,0,307},{ -142,10,98},{6,11,8},{7,11,1881},{136,11,91},{135,0,2044},{6,0,770},{6,0,802},{6, -0,812},{7,0,311},{9,0,308},{12,0,255},{6,10,102},{7,10,72},{15,10,142},{147,10, -67},{151,10,30},{135,10,823},{135,0,1266},{135,11,1746},{135,10,1870},{4,0,400}, -{5,0,267},{135,0,232},{7,11,24},{11,11,542},{139,11,852},{135,11,1739},{4,11,503 -},{135,11,1661},{5,11,130},{7,11,1314},{9,11,610},{10,11,718},{11,11,601},{11,11 -,819},{11,11,946},{140,11,536},{10,11,149},{11,11,280},{142,11,336},{7,0,739},{ -11,0,690},{7,11,1946},{8,10,48},{8,10,88},{8,10,582},{8,10,681},{9,10,373},{9,10 -,864},{11,10,157},{11,10,843},{148,10,27},{134,0,990},{4,10,88},{5,10,137},{5,10 -,174},{5,10,777},{6,10,1664},{6,10,1725},{7,10,77},{7,10,426},{7,10,1317},{7,10, -1355},{8,10,126},{8,10,563},{9,10,523},{9,10,750},{10,10,310},{10,10,836},{11,10 -,42},{11,10,318},{11,10,731},{12,10,68},{12,10,92},{12,10,507},{12,10,692},{13, -10,81},{13,10,238},{13,10,374},{14,10,436},{18,10,138},{19,10,78},{19,10,111},{ -20,10,55},{20,10,77},{148,10,92},{141,10,418},{7,0,1831},{132,10,938},{6,0,776}, -{134,0,915},{138,10,351},{5,11,348},{6,11,522},{6,10,1668},{7,10,1499},{8,10,117 -},{9,10,314},{138,10,174},{135,10,707},{132,0,613},{133,10,403},{132,11,392},{5, -11,433},{9,11,633},{139,11,629},{133,0,763},{132,0,878},{132,0,977},{132,0,100}, -{6,0,463},{4,10,44},{5,10,311},{7,10,639},{7,10,762},{7,10,1827},{9,10,8},{9,10, -462},{148,10,83},{134,11,234},{4,10,346},{7,10,115},{9,10,180},{9,10,456},{138, -10,363},{5,0,362},{5,0,443},{6,0,318},{7,0,1019},{139,0,623},{5,0,463},{8,0,296} -,{7,11,140},{7,11,1950},{8,11,680},{11,11,817},{147,11,88},{7,11,1222},{138,11, -386},{142,0,137},{132,0,454},{7,0,1914},{6,11,5},{7,10,1051},{9,10,545},{11,11, -249},{12,11,313},{16,11,66},{145,11,26},{135,0,1527},{145,0,58},{148,11,59},{5,0 -,48},{5,0,404},{6,0,557},{7,0,458},{8,0,597},{10,0,455},{10,0,606},{11,0,49},{11 -,0,548},{12,0,476},{13,0,18},{141,0,450},{5,11,963},{134,11,1773},{133,0,729},{ -138,11,586},{5,0,442},{135,0,1984},{134,0,449},{144,0,40},{4,0,853},{7,11,180},{ -8,11,509},{136,11,792},{6,10,185},{7,10,1899},{9,10,875},{139,10,673},{134,11, -524},{12,0,227},{4,10,327},{5,10,478},{7,10,1332},{136,10,753},{6,0,1491},{5,10, -1020},{133,10,1022},{4,10,103},{133,10,401},{132,11,931},{4,10,499},{135,10,1421 -},{5,0,55},{7,0,376},{140,0,161},{133,0,450},{6,0,1174},{134,0,1562},{10,0,62},{ -13,0,400},{135,11,1837},{140,0,207},{135,0,869},{4,11,773},{5,11,618},{137,11, -756},{132,10,96},{4,0,213},{7,0,223},{8,0,80},{135,10,968},{4,11,90},{5,11,337}, -{5,11,545},{7,11,754},{9,11,186},{10,11,72},{10,11,782},{11,11,513},{11,11,577}, -{11,11,610},{11,11,889},{11,11,961},{12,11,354},{12,11,362},{12,11,461},{12,11, -595},{13,11,79},{143,11,121},{7,0,381},{7,0,806},{7,0,820},{8,0,354},{8,0,437},{ -8,0,787},{9,0,657},{10,0,58},{10,0,339},{10,0,749},{11,0,914},{12,0,162},{13,0, -75},{14,0,106},{14,0,198},{14,0,320},{14,0,413},{146,0,43},{136,0,747},{136,0, -954},{134,0,1073},{135,0,556},{7,11,151},{9,11,329},{139,11,254},{5,0,692},{134, -0,1395},{6,10,563},{137,10,224},{134,0,191},{132,0,804},{9,11,187},{10,11,36},{ -17,11,44},{146,11,64},{7,11,165},{7,11,919},{136,11,517},{4,11,506},{5,11,295},{ -7,11,1680},{15,11,14},{144,11,5},{4,0,706},{6,0,162},{7,0,1960},{136,0,831},{135 -,11,1376},{7,11,987},{9,11,688},{10,11,522},{11,11,788},{140,11,566},{150,0,35}, -{138,0,426},{135,0,1235},{135,11,1741},{7,11,389},{7,11,700},{7,11,940},{8,11, -514},{9,11,116},{9,11,535},{10,11,118},{11,11,107},{11,11,148},{11,11,922},{12, -11,254},{12,11,421},{142,11,238},{134,0,1234},{132,11,743},{4,10,910},{5,10,832} -,{135,11,1335},{141,0,96},{135,11,185},{146,0,149},{4,0,204},{137,0,902},{4,11, -784},{133,11,745},{136,0,833},{136,0,949},{7,0,366},{9,0,287},{12,0,199},{12,0, -556},{12,0,577},{5,11,81},{7,11,146},{7,11,1342},{7,11,1446},{8,11,53},{8,11,561 -},{8,11,694},{8,11,754},{9,11,97},{9,11,115},{9,11,894},{10,11,462},{10,11,813}, -{11,11,230},{11,11,657},{11,11,699},{11,11,748},{12,11,119},{12,11,200},{12,11, -283},{14,11,273},{145,11,15},{5,11,408},{137,11,747},{9,11,498},{140,11,181},{6, -0,2020},{136,0,992},{5,0,356},{135,0,224},{134,0,784},{7,0,630},{9,0,567},{11,0, -150},{11,0,444},{13,0,119},{8,10,528},{137,10,348},{134,0,539},{4,10,20},{133,10 -,616},{142,0,27},{7,11,30},{8,11,86},{8,11,315},{8,11,700},{9,11,576},{9,11,858} -,{11,11,310},{11,11,888},{11,11,904},{12,11,361},{141,11,248},{138,11,839},{134, -0,755},{134,0,1063},{7,10,1091},{135,10,1765},{134,11,428},{7,11,524},{8,11,169} -,{8,11,234},{9,11,480},{138,11,646},{139,0,814},{7,11,1462},{139,11,659},{4,10, -26},{5,10,429},{6,10,245},{7,10,704},{7,10,1379},{135,10,1474},{7,11,1205},{138, -11,637},{139,11,803},{132,10,621},{136,0,987},{4,11,266},{8,11,4},{9,11,39},{10, -11,166},{11,11,918},{12,11,635},{20,11,10},{22,11,27},{150,11,43},{4,0,235},{135 -,0,255},{4,0,194},{5,0,584},{6,0,384},{7,0,583},{10,0,761},{11,0,760},{139,0,851 -},{133,10,542},{134,0,1086},{133,10,868},{8,0,1016},{136,0,1018},{7,0,1396},{7, -11,1396},{136,10,433},{135,10,1495},{138,10,215},{141,10,124},{7,11,157},{8,11, -279},{9,11,759},{16,11,31},{16,11,39},{16,11,75},{18,11,24},{20,11,42},{152,11,1 -},{5,0,562},{134,11,604},{134,0,913},{5,0,191},{137,0,271},{4,0,470},{6,0,153},{ -7,0,1503},{7,0,1923},{10,0,701},{11,0,132},{11,0,227},{11,0,320},{11,0,436},{11, -0,525},{11,0,855},{11,0,873},{12,0,41},{12,0,286},{13,0,103},{13,0,284},{14,0, -255},{14,0,262},{15,0,117},{143,0,127},{7,0,475},{12,0,45},{147,10,112},{132,11, -567},{137,11,859},{6,0,713},{6,0,969},{6,0,1290},{134,0,1551},{133,0,327},{6,0, -552},{6,0,1292},{7,0,1754},{137,0,604},{4,0,223},{6,0,359},{11,0,3},{13,0,108},{ -14,0,89},{16,0,22},{5,11,762},{7,11,1880},{9,11,680},{139,11,798},{5,0,80},{6,0, -405},{7,0,403},{7,0,1502},{8,0,456},{9,0,487},{9,0,853},{9,0,889},{10,0,309},{11 -,0,721},{11,0,994},{12,0,430},{141,0,165},{133,11,298},{132,10,647},{134,0,2016} -,{18,10,10},{146,11,10},{4,0,453},{5,0,887},{6,0,535},{8,0,6},{8,0,543},{136,0, -826},{136,0,975},{10,0,961},{138,0,962},{138,10,220},{6,0,1891},{6,0,1893},{9,0, -916},{9,0,965},{9,0,972},{12,0,801},{12,0,859},{12,0,883},{15,0,226},{149,0,51}, -{132,10,109},{135,11,267},{7,11,92},{7,11,182},{8,11,453},{9,11,204},{11,11,950} -,{12,11,94},{12,11,644},{16,11,20},{16,11,70},{16,11,90},{147,11,55},{134,10, -1746},{6,11,71},{7,11,845},{7,11,1308},{8,11,160},{137,11,318},{5,0,101},{6,0,88 -},{7,0,263},{7,0,628},{7,0,1677},{8,0,349},{9,0,100},{10,0,677},{14,0,169},{14,0 -,302},{14,0,313},{15,0,48},{15,0,84},{7,11,237},{8,11,664},{9,11,42},{9,11,266}, -{9,11,380},{9,11,645},{10,11,177},{138,11,276},{138,11,69},{4,0,310},{7,0,708},{ -7,0,996},{9,0,795},{10,0,390},{10,0,733},{11,0,451},{12,0,249},{14,0,115},{14,0, -286},{143,0,100},{5,0,587},{4,10,40},{10,10,67},{11,10,117},{11,10,768},{139,10, -935},{6,0,1942},{7,0,512},{136,0,983},{7,10,992},{8,10,301},{9,10,722},{12,10,63 -},{13,10,29},{14,10,161},{143,10,18},{136,11,76},{139,10,923},{134,0,645},{134,0 -,851},{4,0,498},{132,11,293},{7,0,217},{8,0,140},{10,0,610},{14,11,352},{17,11, -53},{18,11,146},{18,11,152},{19,11,11},{150,11,54},{134,0,1448},{138,11,841},{ -133,0,905},{4,11,605},{7,11,518},{7,11,1282},{7,11,1918},{10,11,180},{139,11,218 -},{139,11,917},{135,10,825},{140,10,328},{4,0,456},{7,0,105},{7,0,358},{7,0,1637 -},{8,0,643},{139,0,483},{134,0,792},{6,11,96},{135,11,1426},{137,11,691},{4,11, -651},{133,11,289},{7,11,688},{8,11,35},{9,11,511},{10,11,767},{147,11,118},{150, -0,56},{5,0,243},{5,0,535},{6,10,204},{10,10,320},{10,10,583},{13,10,502},{14,10, -72},{14,10,274},{14,10,312},{14,10,344},{15,10,159},{16,10,62},{16,10,69},{17,10 -,30},{18,10,42},{18,10,53},{18,10,84},{18,10,140},{19,10,68},{19,10,85},{20,10,5 -},{20,10,45},{20,10,101},{22,10,7},{150,10,20},{4,10,558},{6,10,390},{7,10,162}, -{7,10,689},{9,10,360},{138,10,653},{146,11,23},{135,0,1748},{5,10,856},{6,10, -1672},{6,10,1757},{134,10,1781},{5,0,539},{5,0,754},{6,0,876},{132,11,704},{135, -11,1078},{5,10,92},{10,10,736},{140,10,102},{17,0,91},{5,10,590},{137,10,213},{ -134,0,1565},{6,0,91},{135,0,435},{4,0,939},{140,0,792},{134,0,1399},{4,0,16},{5, -0,316},{5,0,842},{6,0,370},{6,0,1778},{8,0,166},{11,0,812},{12,0,206},{12,0,351} -,{14,0,418},{16,0,15},{16,0,34},{18,0,3},{19,0,3},{19,0,7},{20,0,4},{21,0,21},{4 -,11,720},{133,11,306},{144,0,95},{133,11,431},{132,11,234},{135,0,551},{4,0,999} -,{6,0,1966},{134,0,2042},{7,0,619},{10,0,547},{11,0,122},{12,0,601},{15,0,7},{ -148,0,20},{5,11,464},{6,11,236},{7,11,276},{7,11,696},{7,11,914},{7,11,1108},{7, -11,1448},{9,11,15},{9,11,564},{10,11,14},{12,11,565},{13,11,449},{14,11,53},{15, -11,13},{16,11,64},{145,11,41},{6,0,884},{6,0,1019},{134,0,1150},{6,11,1767},{12, -11,194},{145,11,107},{136,10,503},{133,11,840},{7,0,671},{134,10,466},{132,0,888 -},{4,0,149},{138,0,368},{4,0,154},{7,0,1134},{136,0,105},{135,0,983},{9,11,642}, -{11,11,236},{142,11,193},{4,0,31},{6,0,429},{7,0,962},{9,0,458},{139,0,691},{6,0 -,643},{134,0,1102},{132,0,312},{4,11,68},{5,11,634},{6,11,386},{7,11,794},{8,11, -273},{9,11,563},{10,11,105},{10,11,171},{11,11,94},{139,11,354},{133,0,740},{135 -,0,1642},{4,11,95},{7,11,416},{8,11,211},{139,11,830},{132,0,236},{138,10,241},{ -7,11,731},{13,11,20},{143,11,11},{5,0,836},{5,0,857},{6,0,1680},{135,0,59},{10,0 -,68},{11,0,494},{152,11,6},{4,0,81},{139,0,867},{135,0,795},{133,11,689},{4,0, -1001},{5,0,282},{6,0,1932},{6,0,1977},{6,0,1987},{6,0,1992},{8,0,650},{8,0,919}, -{8,0,920},{8,0,923},{8,0,926},{8,0,927},{8,0,931},{8,0,939},{8,0,947},{8,0,956}, -{8,0,997},{9,0,907},{10,0,950},{10,0,953},{10,0,954},{10,0,956},{10,0,958},{10,0 -,959},{10,0,964},{10,0,970},{10,0,972},{10,0,973},{10,0,975},{10,0,976},{10,0, -980},{10,0,981},{10,0,984},{10,0,988},{10,0,990},{10,0,995},{10,0,999},{10,0, -1002},{10,0,1003},{10,0,1005},{10,0,1006},{10,0,1008},{10,0,1009},{10,0,1012},{ -10,0,1014},{10,0,1015},{10,0,1019},{10,0,1020},{10,0,1022},{12,0,959},{12,0,961} -,{12,0,962},{12,0,963},{12,0,964},{12,0,965},{12,0,967},{12,0,968},{12,0,969},{ -12,0,970},{12,0,971},{12,0,972},{12,0,973},{12,0,974},{12,0,975},{12,0,976},{12, -0,977},{12,0,979},{12,0,981},{12,0,982},{12,0,983},{12,0,984},{12,0,985},{12,0, -986},{12,0,987},{12,0,989},{12,0,990},{12,0,992},{12,0,993},{12,0,995},{12,0,998 -},{12,0,999},{12,0,1000},{12,0,1001},{12,0,1002},{12,0,1004},{12,0,1005},{12,0, -1006},{12,0,1007},{12,0,1008},{12,0,1009},{12,0,1010},{12,0,1011},{12,0,1012},{ -12,0,1014},{12,0,1015},{12,0,1016},{12,0,1017},{12,0,1018},{12,0,1019},{12,0, -1022},{12,0,1023},{14,0,475},{14,0,477},{14,0,478},{14,0,479},{14,0,480},{14,0, -482},{14,0,483},{14,0,484},{14,0,485},{14,0,486},{14,0,487},{14,0,488},{14,0,489 -},{14,0,490},{14,0,491},{14,0,492},{14,0,493},{14,0,494},{14,0,495},{14,0,496},{ -14,0,497},{14,0,498},{14,0,499},{14,0,500},{14,0,501},{14,0,502},{14,0,503},{14, -0,504},{14,0,506},{14,0,507},{14,0,508},{14,0,509},{14,0,510},{14,0,511},{16,0, -113},{16,0,114},{16,0,115},{16,0,117},{16,0,118},{16,0,119},{16,0,121},{16,0,122 -},{16,0,123},{16,0,124},{16,0,125},{16,0,126},{16,0,127},{18,0,242},{18,0,243},{ -18,0,244},{18,0,245},{18,0,248},{18,0,249},{18,0,250},{18,0,251},{18,0,252},{18, -0,253},{18,0,254},{18,0,255},{20,0,125},{20,0,126},{148,0,127},{7,11,1717},{7,11 -,1769},{138,11,546},{7,11,1127},{7,11,1572},{10,11,297},{10,11,422},{11,11,764}, -{11,11,810},{12,11,264},{13,11,102},{13,11,300},{13,11,484},{14,11,147},{14,11, -229},{17,11,71},{18,11,118},{147,11,120},{6,0,1148},{134,0,1586},{132,0,775},{ -135,10,954},{133,11,864},{133,11,928},{138,11,189},{135,10,1958},{6,10,549},{8, -10,34},{8,10,283},{9,10,165},{138,10,475},{5,10,652},{5,10,701},{135,10,449},{ -135,11,695},{4,10,655},{7,10,850},{17,10,75},{146,10,137},{140,11,682},{133,11, -523},{8,0,970},{136,10,670},{136,11,555},{7,11,76},{8,11,44},{9,11,884},{10,11, -580},{11,11,399},{11,11,894},{15,11,122},{18,11,144},{147,11,61},{6,10,159},{6, -10,364},{7,10,516},{7,10,1439},{137,10,518},{4,0,71},{5,0,376},{7,0,119},{138,0, -665},{141,10,151},{11,0,827},{14,0,34},{143,0,148},{133,11,518},{4,0,479},{135, -11,1787},{135,11,1852},{135,10,993},{7,0,607},{136,0,99},{134,0,1960},{132,0,793 -},{4,0,41},{5,0,74},{7,0,1627},{11,0,871},{140,0,619},{7,0,94},{11,0,329},{11,0, -965},{12,0,241},{14,0,354},{15,0,22},{148,0,63},{7,10,501},{9,10,111},{10,10,141 -},{11,10,332},{13,10,43},{13,10,429},{14,10,130},{14,10,415},{145,10,102},{9,0, -209},{137,0,300},{134,0,1497},{138,11,255},{4,11,934},{5,11,138},{136,11,610},{ -133,0,98},{6,0,1316},{10,11,804},{138,11,832},{8,11,96},{9,11,36},{10,11,607},{ -11,11,423},{11,11,442},{12,11,309},{14,11,199},{15,11,90},{145,11,110},{132,0, -463},{5,10,149},{136,10,233},{133,10,935},{4,11,652},{8,11,320},{9,11,13},{9,11, -398},{9,11,727},{10,11,75},{10,11,184},{10,11,230},{10,11,564},{10,11,569},{11, -11,973},{12,11,70},{12,11,189},{13,11,57},{13,11,257},{22,11,6},{150,11,16},{142 -,0,291},{12,10,582},{146,10,131},{136,10,801},{133,0,984},{145,11,116},{4,11,692 -},{133,11,321},{4,0,182},{6,0,205},{135,0,220},{4,0,42},{9,0,205},{9,0,786},{138 -,0,659},{6,0,801},{11,11,130},{140,11,609},{132,0,635},{5,11,345},{135,11,1016}, -{139,0,533},{132,0,371},{4,0,272},{135,0,836},{6,0,1282},{135,11,1100},{5,0,825} -,{134,0,1640},{135,11,1325},{133,11,673},{4,11,287},{133,11,1018},{135,0,357},{6 -,0,467},{137,0,879},{7,0,317},{135,0,569},{6,0,924},{134,0,1588},{5,11,34},{5,10 -,406},{10,11,724},{12,11,444},{13,11,354},{18,11,32},{23,11,24},{23,11,31},{152, -11,5},{6,0,1795},{6,0,1835},{6,0,1836},{6,0,1856},{8,0,844},{8,0,849},{8,0,854}, -{8,0,870},{8,0,887},{10,0,852},{138,0,942},{6,10,69},{135,10,117},{137,0,307},{4 -,0,944},{6,0,1799},{6,0,1825},{10,0,848},{10,0,875},{10,0,895},{10,0,899},{10,0, -902},{140,0,773},{11,0,43},{13,0,72},{141,0,142},{135,10,1830},{134,11,382},{4, -10,432},{135,10,824},{132,11,329},{7,0,1820},{139,11,124},{133,10,826},{133,0, -525},{132,11,906},{7,11,1940},{136,11,366},{138,11,10},{4,11,123},{4,11,649},{5, -11,605},{7,11,1509},{136,11,36},{6,0,110},{135,0,1681},{133,0,493},{133,11,767}, -{4,0,174},{135,0,911},{138,11,786},{8,0,417},{137,0,782},{133,10,1000},{7,0,733} -,{137,0,583},{4,10,297},{6,10,529},{7,10,152},{7,10,713},{7,10,1845},{8,10,710}, -{8,10,717},{12,10,639},{140,10,685},{4,0,32},{5,0,215},{6,0,269},{7,0,1782},{7,0 -,1892},{10,0,16},{11,0,822},{11,0,954},{141,0,481},{4,11,273},{5,11,658},{133,11 -,995},{136,0,477},{134,11,72},{135,11,1345},{5,0,308},{7,0,1088},{4,10,520},{135 -,10,575},{133,11,589},{5,0,126},{8,0,297},{9,0,366},{140,0,374},{7,0,1551},{139, -0,361},{5,11,117},{6,11,514},{6,11,541},{7,11,1164},{7,11,1436},{8,11,220},{8,11 -,648},{10,11,688},{139,11,560},{133,11,686},{4,0,946},{6,0,1807},{8,0,871},{10,0 -,854},{10,0,870},{10,0,888},{10,0,897},{10,0,920},{12,0,722},{12,0,761},{12,0, -763},{12,0,764},{14,0,454},{14,0,465},{16,0,107},{18,0,167},{18,0,168},{146,0, -172},{132,0,175},{135,0,1307},{132,0,685},{135,11,1834},{133,0,797},{6,0,745},{6 -,0,858},{134,0,963},{133,0,565},{5,10,397},{6,10,154},{7,11,196},{7,10,676},{8, -10,443},{8,10,609},{9,10,24},{9,10,325},{10,10,35},{10,11,765},{11,11,347},{11, -10,535},{11,11,552},{11,11,576},{11,10,672},{11,11,790},{11,10,1018},{12,11,263} -,{12,10,637},{13,11,246},{13,11,270},{13,11,395},{14,11,74},{14,11,176},{14,11, -190},{14,11,398},{14,11,412},{15,11,32},{15,11,63},{16,10,30},{16,11,88},{147,11 -,105},{13,11,84},{141,11,122},{4,0,252},{7,0,1068},{10,0,434},{11,0,228},{11,0, -426},{13,0,231},{18,0,106},{148,0,87},{137,0,826},{4,11,589},{139,11,282},{5,11, -381},{135,11,1792},{132,0,791},{5,0,231},{10,0,509},{133,10,981},{7,0,601},{9,0, -277},{9,0,674},{10,0,178},{10,0,418},{10,0,571},{11,0,531},{12,0,113},{12,0,475} -,{13,0,99},{142,0,428},{4,10,56},{7,11,616},{7,10,1791},{8,10,607},{8,10,651},{ -10,11,413},{11,10,465},{11,10,835},{12,10,337},{141,10,480},{7,0,1591},{144,0,43 -},{9,10,158},{138,10,411},{135,0,1683},{8,0,289},{11,0,45},{12,0,278},{140,0,537 -},{6,11,120},{7,11,1188},{7,11,1710},{8,11,286},{9,11,667},{11,11,592},{139,11, -730},{136,10,617},{135,0,1120},{135,11,1146},{139,10,563},{4,11,352},{4,10,369}, -{135,11,687},{143,11,38},{4,0,399},{5,0,119},{5,0,494},{7,0,751},{9,0,556},{14, -11,179},{15,11,151},{150,11,11},{4,11,192},{5,11,49},{6,11,200},{6,11,293},{6,11 -,1696},{135,11,488},{4,0,398},{133,0,660},{7,0,1030},{134,10,622},{135,11,595},{ -141,0,168},{132,11,147},{7,0,973},{10,10,624},{142,10,279},{132,10,363},{132,0, -642},{133,11,934},{134,0,1615},{7,11,505},{135,11,523},{7,0,594},{7,0,851},{7,0, -1858},{9,0,411},{9,0,574},{9,0,666},{9,0,737},{10,0,346},{10,0,712},{11,0,246},{ -11,0,432},{11,0,517},{11,0,647},{11,0,679},{11,0,727},{12,0,304},{12,0,305},{12, -0,323},{12,0,483},{12,0,572},{12,0,593},{12,0,602},{13,0,95},{13,0,101},{13,0, -171},{13,0,315},{13,0,378},{13,0,425},{13,0,475},{14,0,63},{14,0,380},{14,0,384} -,{15,0,133},{18,0,112},{148,0,72},{135,0,1093},{132,0,679},{8,0,913},{10,0,903}, -{10,0,915},{12,0,648},{12,0,649},{14,0,455},{16,0,112},{138,11,438},{137,0,203}, -{134,10,292},{134,0,1492},{7,0,1374},{8,0,540},{5,10,177},{6,10,616},{7,10,827}, -{9,10,525},{138,10,656},{135,0,1486},{9,0,714},{138,10,31},{136,0,825},{134,0, -1511},{132,11,637},{134,0,952},{4,10,161},{133,10,631},{5,0,143},{5,0,769},{6,0, -1760},{7,0,682},{7,0,1992},{136,0,736},{132,0,700},{134,0,1540},{132,11,777},{9, -11,867},{138,11,837},{7,0,1557},{135,10,1684},{133,0,860},{6,0,422},{7,0,0},{7,0 -,1544},{9,0,605},{11,0,990},{12,0,235},{12,0,453},{13,0,47},{13,0,266},{9,10,469 -},{9,10,709},{12,10,512},{14,10,65},{145,10,12},{11,0,807},{10,10,229},{11,10,73 -},{139,10,376},{6,11,170},{7,11,1080},{8,11,395},{8,11,487},{11,11,125},{141,11, -147},{5,0,515},{137,0,131},{7,0,1605},{11,0,962},{146,0,139},{132,0,646},{4,0, -396},{7,0,728},{9,0,117},{13,0,202},{148,0,51},{6,0,121},{6,0,124},{6,0,357},{7, -0,1138},{7,0,1295},{8,0,162},{8,0,508},{11,0,655},{4,11,535},{6,10,558},{7,10, -651},{8,11,618},{9,10,0},{10,10,34},{139,10,1008},{135,11,1245},{138,0,357},{150 -,11,23},{133,0,237},{135,0,1784},{7,10,1832},{138,10,374},{132,0,713},{132,11,46 -},{6,0,1536},{10,0,348},{5,11,811},{6,11,1679},{6,11,1714},{135,11,2032},{11,11, -182},{142,11,195},{6,0,523},{7,0,738},{7,10,771},{7,10,1731},{9,10,405},{138,10, -421},{7,11,1458},{9,11,407},{139,11,15},{6,11,34},{7,11,69},{7,11,640},{7,11, -1089},{8,11,708},{8,11,721},{9,11,363},{9,11,643},{10,11,628},{148,11,98},{133,0 -,434},{135,0,1877},{7,0,571},{138,0,366},{5,10,881},{133,10,885},{9,0,513},{10,0 -,25},{10,0,39},{12,0,122},{140,0,187},{132,0,580},{5,10,142},{134,10,546},{132, -11,462},{137,0,873},{5,10,466},{11,10,571},{12,10,198},{13,10,283},{14,10,186},{ -15,10,21},{143,10,103},{7,0,171},{4,10,185},{5,10,257},{5,10,839},{5,10,936},{9, -10,399},{10,10,258},{10,10,395},{10,10,734},{11,10,1014},{12,10,23},{13,10,350}, -{14,10,150},{147,10,6},{134,0,625},{7,0,107},{7,0,838},{8,0,550},{138,0,401},{5, -11,73},{6,11,23},{134,11,338},{4,0,943},{6,0,1850},{12,0,713},{142,0,434},{11,0, -588},{11,0,864},{11,0,936},{11,0,968},{12,0,73},{12,0,343},{12,0,394},{13,0,275} -,{14,0,257},{15,0,160},{7,10,404},{7,10,1377},{7,10,1430},{7,10,2017},{8,10,149} -,{8,10,239},{8,10,512},{8,10,793},{8,10,818},{9,10,474},{9,10,595},{10,10,122},{ -10,10,565},{10,10,649},{10,10,783},{11,10,239},{11,10,295},{11,10,447},{11,10, -528},{11,10,639},{11,10,800},{12,10,25},{12,10,157},{12,10,316},{12,10,390},{12, -10,391},{12,10,395},{12,10,478},{12,10,503},{12,10,592},{12,10,680},{13,10,50},{ -13,10,53},{13,10,132},{13,10,198},{13,10,322},{13,10,415},{13,10,511},{14,10,71} -,{14,10,395},{15,10,71},{15,10,136},{17,10,123},{18,10,93},{147,10,58},{133,0, -768},{11,0,103},{142,0,0},{136,10,712},{132,0,799},{132,0,894},{7,11,725},{8,11, -498},{139,11,268},{135,11,1798},{135,11,773},{141,11,360},{4,10,377},{152,10,13} -,{135,0,1673},{132,11,583},{134,0,1052},{133,11,220},{140,11,69},{132,11,544},{4 -,10,180},{135,10,1906},{134,0,272},{4,0,441},{134,0,1421},{4,0,9},{5,0,128},{7,0 -,368},{11,0,480},{148,0,3},{5,11,176},{6,11,437},{6,11,564},{11,11,181},{141,11, -183},{132,10,491},{7,0,1182},{141,11,67},{6,0,1346},{4,10,171},{138,10,234},{4, -10,586},{7,10,1186},{138,10,631},{136,0,682},{134,0,1004},{15,0,24},{143,11,24}, -{134,0,968},{4,0,2},{6,0,742},{6,0,793},{7,0,545},{7,0,894},{9,10,931},{10,10, -334},{148,10,71},{136,11,600},{133,10,765},{9,0,769},{140,0,185},{4,11,790},{5, -11,273},{134,11,394},{7,0,474},{137,0,578},{4,11,135},{6,11,127},{7,11,1185},{7, -11,1511},{8,11,613},{11,11,5},{12,11,133},{12,11,495},{12,11,586},{14,11,385},{ -15,11,118},{17,11,20},{146,11,98},{133,10,424},{5,0,530},{142,0,113},{6,11,230}, -{7,11,961},{7,11,1085},{136,11,462},{7,11,1954},{137,11,636},{136,10,714},{149, -11,6},{135,10,685},{9,10,420},{10,10,269},{10,10,285},{10,10,576},{11,10,397},{ -13,10,175},{145,10,90},{132,10,429},{5,0,556},{5,11,162},{136,11,68},{132,11,654 -},{4,11,156},{7,11,998},{7,11,1045},{7,11,1860},{9,11,48},{9,11,692},{11,11,419} -,{139,11,602},{6,0,1317},{8,0,16},{9,0,825},{12,0,568},{7,11,1276},{8,11,474},{ -137,11,652},{18,0,97},{7,10,18},{7,10,699},{7,10,1966},{8,10,752},{9,10,273},{9, -10,412},{9,10,703},{10,10,71},{10,10,427},{138,10,508},{10,0,703},{7,11,1454},{ -138,11,703},{4,10,53},{5,10,186},{135,10,752},{134,0,892},{134,0,1571},{8,10,575 -},{10,10,289},{139,10,319},{6,0,186},{137,0,426},{134,0,1101},{132,10,675},{132, -0,585},{6,0,1870},{137,0,937},{152,11,10},{9,11,197},{10,11,300},{12,11,473},{13 -,11,90},{141,11,405},{4,0,93},{5,0,252},{6,0,229},{7,0,291},{9,0,550},{139,0,644 -},{137,0,749},{9,0,162},{6,10,209},{8,10,468},{9,10,210},{11,10,36},{12,10,28},{ -12,10,630},{13,10,21},{13,10,349},{14,10,7},{145,10,13},{132,0,381},{132,11,606} -,{4,10,342},{135,10,1179},{7,11,1587},{7,11,1707},{10,11,528},{139,11,504},{12, -11,39},{13,11,265},{141,11,439},{4,10,928},{133,10,910},{7,10,1838},{7,11,1978}, -{136,11,676},{6,0,762},{6,0,796},{134,0,956},{4,10,318},{4,10,496},{7,10,856},{ -139,10,654},{137,11,242},{4,11,361},{133,11,315},{132,11,461},{132,11,472},{132, -0,857},{5,0,21},{6,0,77},{6,0,157},{7,0,974},{7,0,1301},{7,0,1339},{7,0,1490},{7 -,0,1873},{9,0,628},{7,10,915},{8,10,247},{147,10,0},{4,10,202},{5,10,382},{6,10, -454},{7,10,936},{7,10,1803},{8,10,758},{9,10,375},{9,10,895},{10,10,743},{10,10, -792},{11,10,978},{11,10,1012},{142,10,109},{7,11,617},{10,11,498},{11,11,501},{ -12,11,16},{140,11,150},{7,10,1150},{7,10,1425},{7,10,1453},{10,11,747},{140,10, -513},{133,11,155},{11,0,919},{141,0,409},{138,10,791},{10,0,633},{139,11,729},{7 -,11,163},{8,11,319},{9,11,402},{10,11,24},{10,11,681},{11,11,200},{11,11,567},{ -12,11,253},{12,11,410},{142,11,219},{5,11,475},{7,11,1780},{9,11,230},{11,11,297 -},{11,11,558},{14,11,322},{147,11,76},{7,0,332},{6,10,445},{137,10,909},{135,11, -1956},{136,11,274},{134,10,578},{135,0,1489},{135,11,1848},{5,11,944},{134,11, -1769},{132,11,144},{136,10,766},{4,0,832},{135,10,541},{8,0,398},{9,0,681},{139, -0,632},{136,0,645},{9,0,791},{10,0,93},{16,0,13},{17,0,23},{18,0,135},{19,0,12}, -{20,0,1},{20,0,12},{148,0,14},{6,11,247},{137,11,555},{134,0,20},{132,0,800},{ -135,0,1841},{139,10,983},{137,10,768},{132,10,584},{141,11,51},{6,0,1993},{4,11, -620},{138,11,280},{136,0,769},{11,0,290},{11,0,665},{7,11,1810},{11,11,866},{12, -11,103},{13,11,495},{17,11,67},{147,11,74},{134,0,1426},{139,0,60},{4,10,326},{ -135,10,1770},{7,0,1874},{9,0,641},{132,10,226},{6,0,644},{5,10,426},{8,10,30},{9 -,10,2},{11,10,549},{147,10,122},{5,11,428},{138,11,442},{135,11,1871},{135,0, -1757},{147,10,117},{135,0,937},{135,0,1652},{6,0,654},{134,0,1476},{133,11,99},{ -135,0,527},{132,10,345},{4,10,385},{4,11,397},{7,10,265},{135,10,587},{4,0,579}, -{5,0,226},{5,0,323},{135,0,960},{134,0,1486},{8,11,502},{144,11,9},{4,10,347},{5 -,10,423},{5,10,996},{135,10,1329},{7,11,727},{146,11,73},{4,11,485},{7,11,353},{ -7,10,1259},{7,11,1523},{9,10,125},{139,10,65},{6,0,325},{5,10,136},{6,11,366},{7 -,11,1384},{7,11,1601},{136,10,644},{138,11,160},{6,0,1345},{137,11,282},{18,0,91 -},{147,0,70},{136,0,404},{4,11,157},{133,11,471},{133,0,973},{6,0,135},{135,0, -1176},{8,11,116},{11,11,551},{142,11,159},{4,0,549},{4,10,433},{133,10,719},{136 -,0,976},{5,11,160},{7,11,363},{7,11,589},{10,11,170},{141,11,55},{144,0,21},{144 -,0,51},{135,0,314},{135,10,1363},{4,11,108},{7,11,405},{10,11,491},{139,11,498}, -{146,0,4},{4,10,555},{8,10,536},{10,10,288},{139,10,1005},{135,11,1005},{6,0,281 -},{7,0,6},{8,0,282},{8,0,480},{8,0,499},{9,0,198},{10,0,143},{10,0,169},{10,0, -211},{10,0,417},{10,0,574},{11,0,147},{11,0,395},{12,0,75},{12,0,407},{12,0,608} -,{13,0,500},{142,0,251},{6,0,1093},{6,0,1405},{9,10,370},{138,10,90},{4,11,926}, -{133,11,983},{135,0,1776},{134,0,1528},{132,0,419},{132,11,538},{6,11,294},{7,11 -,1267},{136,11,624},{135,11,1772},{138,11,301},{4,10,257},{135,10,2031},{4,0,138 -},{7,0,1012},{7,0,1280},{9,0,76},{135,10,1768},{132,11,757},{5,0,29},{140,0,638} -,{7,11,655},{135,11,1844},{7,0,1418},{6,11,257},{135,11,1522},{8,11,469},{138,11 -,47},{142,11,278},{6,10,83},{6,10,1733},{135,10,1389},{11,11,204},{11,11,243},{ -140,11,293},{135,11,1875},{6,0,1710},{135,0,2038},{137,11,299},{4,0,17},{5,0,23} -,{7,0,995},{11,0,383},{11,0,437},{12,0,460},{140,0,532},{133,0,862},{137,10,696} -,{6,0,592},{138,0,946},{138,11,599},{7,10,1718},{9,10,95},{9,10,274},{10,10,279} -,{10,10,317},{10,10,420},{11,10,303},{11,10,808},{12,10,134},{12,10,367},{13,10, -149},{13,10,347},{14,10,349},{14,10,406},{18,10,22},{18,10,89},{18,10,122},{147, -10,47},{8,0,70},{12,0,171},{141,0,272},{133,10,26},{132,10,550},{137,0,812},{10, -0,233},{139,0,76},{134,0,988},{134,0,442},{136,10,822},{7,0,896},{4,10,902},{5, -10,809},{134,10,122},{5,11,150},{7,11,106},{8,11,603},{9,11,593},{9,11,634},{10, -11,44},{10,11,173},{11,11,462},{11,11,515},{13,11,216},{13,11,288},{142,11,400}, -{136,0,483},{135,10,262},{6,0,1709},{133,10,620},{4,10,34},{5,10,574},{7,10,279} -,{7,10,1624},{136,10,601},{137,10,170},{147,0,119},{12,11,108},{141,11,291},{11, -0,69},{12,0,105},{12,0,117},{13,0,213},{14,0,13},{14,0,62},{14,0,177},{14,0,421} -,{15,0,19},{146,0,141},{137,0,309},{11,11,278},{142,11,73},{7,0,608},{7,0,976},{ -9,0,146},{10,0,206},{10,0,596},{13,0,218},{142,0,153},{133,10,332},{6,10,261},{8 -,10,182},{139,10,943},{4,11,493},{144,11,55},{134,10,1721},{132,0,768},{4,10,933 -},{133,10,880},{7,11,555},{7,11,1316},{7,11,1412},{7,11,1839},{9,11,192},{9,11, -589},{11,11,241},{11,11,676},{11,11,811},{11,11,891},{12,11,140},{12,11,346},{12 -,11,479},{13,11,30},{13,11,49},{13,11,381},{14,11,188},{15,11,150},{16,11,76},{ -18,11,30},{148,11,52},{4,0,518},{135,0,1136},{6,11,568},{7,11,112},{7,11,1804},{ -8,11,362},{8,11,410},{8,11,830},{9,11,514},{11,11,649},{142,11,157},{135,11,673} -,{8,0,689},{137,0,863},{4,0,18},{7,0,145},{7,0,444},{7,0,1278},{8,0,49},{8,0,400 -},{9,0,71},{9,0,250},{10,0,459},{12,0,160},{16,0,24},{132,11,625},{140,0,1020},{ -4,0,997},{6,0,1946},{6,0,1984},{134,0,1998},{6,11,16},{6,11,158},{7,11,43},{7,11 -,129},{7,11,181},{8,11,276},{8,11,377},{10,11,523},{11,11,816},{12,11,455},{13, -11,303},{142,11,135},{133,10,812},{134,0,658},{4,11,1},{7,11,1143},{7,11,1463},{ -8,11,61},{9,11,207},{9,11,390},{9,11,467},{139,11,836},{150,11,26},{140,0,106},{ -6,0,1827},{10,0,931},{18,0,166},{20,0,114},{4,10,137},{7,10,1178},{7,11,1319},{ -135,10,1520},{133,0,1010},{4,11,723},{5,11,895},{7,11,1031},{8,11,199},{8,11,340 -},{9,11,153},{9,11,215},{10,11,21},{10,11,59},{10,11,80},{10,11,224},{11,11,229} -,{11,11,652},{12,11,192},{13,11,146},{142,11,91},{132,11,295},{6,11,619},{7,11, -898},{7,11,1092},{8,11,485},{18,11,28},{147,11,116},{137,11,51},{6,10,1661},{7, -10,1975},{7,10,2009},{135,10,2011},{5,11,309},{140,11,211},{5,0,87},{7,0,313},{7 -,0,1103},{10,0,208},{10,0,582},{11,0,389},{11,0,813},{12,0,385},{13,0,286},{14,0 -,124},{146,0,108},{5,11,125},{8,11,77},{138,11,15},{132,0,267},{133,0,703},{137, -11,155},{133,11,439},{11,11,164},{140,11,76},{9,0,496},{5,10,89},{7,10,1915},{9, -10,185},{9,10,235},{10,10,64},{10,10,270},{10,10,403},{10,10,469},{10,10,529},{ -10,10,590},{11,10,140},{11,10,860},{13,10,1},{13,10,422},{14,10,341},{14,10,364} -,{17,10,93},{18,10,113},{19,10,97},{147,10,113},{133,10,695},{135,0,1121},{5,10, -6},{6,10,183},{7,10,680},{7,10,978},{7,10,1013},{7,10,1055},{12,10,230},{13,10, -172},{146,10,29},{4,11,8},{7,11,1152},{7,11,1153},{7,11,1715},{9,11,374},{10,11, -478},{139,11,648},{135,11,1099},{6,10,29},{139,10,63},{4,0,561},{10,0,249},{139, -0,209},{132,0,760},{7,11,799},{138,11,511},{136,11,87},{9,0,154},{140,0,485},{ -136,0,255},{132,0,323},{140,0,419},{132,10,311},{134,10,1740},{4,0,368},{135,0, -641},{7,10,170},{8,10,90},{8,10,177},{8,10,415},{11,10,714},{142,10,281},{4,11, -69},{5,11,122},{9,11,656},{138,11,464},{5,11,849},{134,11,1633},{8,0,522},{142,0 -,328},{11,10,91},{13,10,129},{15,10,101},{145,10,125},{7,0,562},{8,0,551},{4,10, -494},{6,10,74},{7,10,44},{11,11,499},{12,10,17},{15,10,5},{148,10,11},{4,10,276} -,{133,10,296},{9,0,92},{147,0,91},{4,10,7},{5,10,90},{5,10,158},{6,10,542},{7,10 -,221},{7,10,1574},{9,10,490},{10,10,540},{11,10,443},{139,10,757},{6,0,525},{6,0 -,1976},{8,0,806},{9,0,876},{140,0,284},{5,11,859},{7,10,588},{7,11,1160},{8,11, -107},{9,10,175},{9,11,291},{9,11,439},{10,10,530},{10,11,663},{11,11,609},{140, -11,197},{7,11,168},{13,11,196},{141,11,237},{139,0,958},{133,0,594},{135,10,580} -,{7,10,88},{136,10,627},{6,0,479},{6,0,562},{7,0,1060},{13,0,6},{5,10,872},{6,10 -,57},{7,10,471},{9,10,447},{137,10,454},{136,11,413},{145,11,19},{4,11,117},{6, -11,372},{7,11,1905},{142,11,323},{4,11,722},{139,11,471},{17,0,61},{5,10,31},{ -134,10,614},{8,10,330},{140,10,477},{7,10,1200},{138,10,460},{6,10,424},{135,10, -1866},{6,0,1641},{136,0,820},{6,0,1556},{134,0,1618},{9,11,5},{12,11,216},{12,11 -,294},{12,11,298},{12,11,400},{12,11,518},{13,11,229},{143,11,139},{15,11,155},{ -144,11,79},{4,0,302},{135,0,1766},{5,10,13},{134,10,142},{6,0,148},{7,0,1313},{7 -,10,116},{8,10,322},{8,10,755},{9,10,548},{10,10,714},{11,10,884},{141,10,324},{ -137,0,676},{9,11,88},{139,11,270},{5,11,12},{7,11,375},{137,11,438},{134,0,1674} -,{7,10,1472},{135,10,1554},{11,0,178},{7,10,1071},{7,10,1541},{7,10,1767},{7,10, -1806},{11,10,162},{11,10,242},{12,10,605},{15,10,26},{144,10,44},{6,0,389},{7,0, -149},{9,0,142},{138,0,94},{140,11,71},{145,10,115},{6,0,8},{7,0,1881},{8,0,91},{ -11,11,966},{12,11,287},{13,11,342},{13,11,402},{15,11,110},{143,11,163},{4,11, -258},{136,11,639},{6,11,22},{7,11,903},{138,11,577},{133,11,681},{135,10,1111},{ -135,11,1286},{9,0,112},{8,10,1},{138,10,326},{5,10,488},{6,10,527},{7,10,489},{7 -,10,1636},{8,10,121},{8,10,144},{8,10,359},{9,10,193},{9,10,241},{9,10,336},{9, -10,882},{11,10,266},{11,10,372},{11,10,944},{12,10,401},{140,10,641},{4,11,664}, -{133,11,804},{6,0,747},{134,0,1015},{135,0,1746},{9,10,31},{10,10,244},{10,10, -699},{12,10,149},{141,10,497},{133,10,377},{135,0,24},{6,0,1352},{5,11,32},{145, -10,101},{7,0,1530},{10,0,158},{13,0,13},{13,0,137},{13,0,258},{14,0,111},{14,0, -225},{14,0,253},{14,0,304},{14,0,339},{14,0,417},{146,0,33},{4,0,503},{135,0, -1661},{5,0,130},{6,0,845},{7,0,1314},{9,0,610},{10,0,718},{11,0,601},{11,0,819}, -{11,0,946},{140,0,536},{10,0,149},{11,0,280},{142,0,336},{134,0,1401},{135,0, -1946},{8,0,663},{144,0,8},{134,0,1607},{135,10,2023},{4,11,289},{7,11,629},{7,11 -,1698},{7,11,1711},{140,11,215},{6,11,450},{136,11,109},{10,0,882},{10,0,883},{ -10,0,914},{138,0,928},{133,10,843},{136,11,705},{132,10,554},{133,10,536},{5,0, -417},{9,10,79},{11,10,625},{145,10,7},{7,11,1238},{142,11,37},{4,0,392},{135,0, -1597},{5,0,433},{9,0,633},{11,0,629},{132,10,424},{7,10,336},{136,10,785},{134, -11,355},{6,0,234},{7,0,769},{9,0,18},{138,0,358},{4,10,896},{134,10,1777},{138, -11,323},{7,0,140},{7,0,1950},{8,0,680},{11,0,817},{147,0,88},{7,0,1222},{138,0, -386},{139,11,908},{11,0,249},{12,0,313},{16,0,66},{145,0,26},{134,0,5},{7,10,750 -},{9,10,223},{11,10,27},{11,10,466},{12,10,624},{14,10,265},{146,10,61},{134,11, -26},{134,0,1216},{5,0,963},{134,0,1773},{4,11,414},{5,11,467},{9,11,654},{10,11, -451},{12,11,59},{141,11,375},{135,11,17},{4,10,603},{133,10,661},{4,10,11},{6,10 -,128},{7,10,231},{7,10,1533},{138,10,725},{135,11,955},{7,0,180},{8,0,509},{136, -0,792},{132,10,476},{132,0,1002},{133,11,538},{135,10,1807},{132,0,931},{7,0,943 -},{11,0,614},{140,0,747},{135,0,1837},{9,10,20},{10,10,324},{10,10,807},{139,10, -488},{134,0,641},{6,11,280},{10,11,502},{11,11,344},{140,11,38},{5,11,45},{7,11, -1161},{11,11,448},{11,11,880},{13,11,139},{13,11,407},{15,11,16},{17,11,95},{18, -11,66},{18,11,88},{18,11,123},{149,11,7},{9,0,280},{138,0,134},{22,0,22},{23,0,5 -},{151,0,29},{136,11,777},{4,0,90},{5,0,545},{7,0,754},{9,0,186},{10,0,72},{10,0 -,782},{11,0,577},{11,0,610},{11,0,960},{12,0,354},{12,0,362},{12,0,595},{4,11, -410},{135,11,521},{135,11,1778},{5,10,112},{6,10,103},{134,10,150},{138,10,356}, -{132,0,742},{7,0,151},{9,0,329},{139,0,254},{8,0,853},{8,0,881},{8,0,911},{8,0, -912},{10,0,872},{12,0,741},{12,0,742},{152,0,18},{4,11,573},{136,11,655},{6,0, -921},{134,0,934},{9,0,187},{10,0,36},{11,0,1016},{17,0,44},{146,0,64},{7,0,833}, -{136,0,517},{4,0,506},{5,0,295},{135,0,1680},{4,10,708},{8,10,15},{9,10,50},{9, -10,386},{11,10,18},{11,10,529},{140,10,228},{7,0,251},{7,0,1701},{8,0,436},{4,10 -,563},{7,10,592},{7,10,637},{7,10,770},{8,10,463},{9,10,60},{9,10,335},{9,10,904 -},{10,10,73},{11,10,434},{12,10,585},{13,10,331},{18,10,110},{148,10,60},{132,10 -,502},{136,0,584},{6,10,347},{138,10,161},{7,0,987},{9,0,688},{10,0,522},{11,0, -788},{12,0,137},{12,0,566},{14,0,9},{14,0,24},{14,0,64},{7,11,899},{142,11,325}, -{4,0,214},{5,0,500},{5,10,102},{6,10,284},{7,10,1079},{7,10,1423},{7,10,1702},{8 -,10,470},{9,10,554},{9,10,723},{139,10,333},{7,10,246},{135,10,840},{6,10,10},{8 -,10,571},{9,10,739},{143,10,91},{133,10,626},{146,0,195},{134,0,1775},{7,0,389}, -{7,0,700},{7,0,940},{8,0,514},{9,0,116},{9,0,535},{10,0,118},{11,0,107},{11,0, -148},{11,0,922},{12,0,254},{12,0,421},{142,0,238},{5,10,18},{6,10,526},{13,10,24 -},{13,10,110},{19,10,5},{147,10,44},{132,0,743},{11,0,292},{4,10,309},{5,10,462} -,{7,10,970},{135,10,1097},{22,10,30},{150,10,33},{139,11,338},{135,11,1598},{7,0 -,1283},{9,0,227},{11,0,325},{11,0,408},{14,0,180},{146,0,47},{4,0,953},{6,0,1805 -},{6,0,1814},{6,0,1862},{140,0,774},{6,11,611},{135,11,1733},{135,11,1464},{5,0, -81},{7,0,146},{7,0,1342},{8,0,53},{8,0,561},{8,0,694},{8,0,754},{9,0,115},{9,0, -179},{9,0,894},{10,0,462},{10,0,813},{11,0,230},{11,0,657},{11,0,699},{11,0,748} -,{12,0,119},{12,0,200},{12,0,283},{142,0,273},{5,0,408},{6,0,789},{6,0,877},{6,0 -,1253},{6,0,1413},{137,0,747},{134,10,1704},{135,11,663},{6,0,1910},{6,0,1915},{ -6,0,1923},{9,0,913},{9,0,928},{9,0,950},{9,0,954},{9,0,978},{9,0,993},{12,0,812} -,{12,0,819},{12,0,831},{12,0,833},{12,0,838},{12,0,909},{12,0,928},{12,0,931},{ -12,0,950},{15,0,186},{15,0,187},{15,0,195},{15,0,196},{15,0,209},{15,0,215},{15, -0,236},{15,0,241},{15,0,249},{15,0,253},{18,0,180},{18,0,221},{18,0,224},{18,0, -227},{18,0,229},{149,0,60},{7,0,1826},{135,0,1938},{11,0,490},{18,0,143},{5,10, -86},{7,10,743},{9,10,85},{10,10,281},{10,10,432},{12,10,251},{13,10,118},{142,10 -,378},{5,10,524},{133,10,744},{141,11,442},{10,10,107},{140,10,436},{135,11,503} -,{134,0,1162},{132,10,927},{7,0,30},{8,0,86},{8,0,315},{8,0,700},{9,0,576},{9,0, -858},{10,0,414},{11,0,310},{11,0,888},{11,0,904},{12,0,361},{13,0,248},{13,0,371 -},{14,0,142},{12,10,670},{146,10,94},{134,0,721},{4,11,113},{5,11,163},{5,11,735 -},{7,11,1009},{7,10,1149},{9,11,9},{9,10,156},{9,11,771},{12,11,90},{13,11,138}, -{13,11,410},{143,11,128},{138,0,839},{133,10,778},{137,0,617},{133,10,502},{8,10 -,196},{10,10,283},{139,10,406},{6,0,428},{7,0,524},{8,0,169},{8,0,234},{9,0,480} -,{138,0,646},{133,10,855},{134,0,1648},{7,0,1205},{138,0,637},{7,0,1596},{4,11, -935},{133,11,823},{5,11,269},{7,11,434},{7,11,891},{8,11,339},{9,11,702},{11,11, -594},{11,11,718},{145,11,100},{7,11,878},{9,11,485},{141,11,264},{4,0,266},{8,0, -4},{9,0,39},{10,0,166},{11,0,918},{12,0,635},{20,0,10},{22,0,27},{22,0,43},{22,0 -,52},{134,11,1713},{7,10,1400},{9,10,446},{138,10,45},{135,11,900},{132,0,862},{ -134,0,1554},{135,11,1033},{19,0,16},{147,11,16},{135,11,1208},{7,0,157},{136,0, -279},{6,0,604},{136,0,391},{13,10,455},{15,10,99},{15,10,129},{144,10,68},{135, -10,172},{7,0,945},{11,0,713},{139,0,744},{4,0,973},{10,0,877},{10,0,937},{10,0, -938},{140,0,711},{139,0,1022},{132,10,568},{142,11,143},{4,0,567},{9,0,859},{132 -,10,732},{7,0,1846},{136,0,628},{136,10,733},{133,0,762},{4,10,428},{135,10,1789 -},{10,0,784},{13,0,191},{7,10,2015},{140,10,665},{133,0,298},{7,0,633},{7,0,905} -,{7,0,909},{7,0,1538},{9,0,767},{140,0,636},{138,10,806},{132,0,795},{139,0,301} -,{135,0,1970},{5,11,625},{135,11,1617},{135,11,275},{7,11,37},{8,11,425},{8,11, -693},{9,11,720},{10,11,380},{10,11,638},{11,11,273},{11,11,307},{11,11,473},{12, -11,61},{143,11,43},{135,11,198},{134,0,1236},{7,0,369},{12,0,644},{12,0,645},{ -144,0,90},{19,0,15},{149,0,27},{6,0,71},{7,0,845},{8,0,160},{9,0,318},{6,10,1623 -},{134,10,1681},{134,0,1447},{134,0,1255},{138,0,735},{8,0,76},{132,11,168},{6, -10,1748},{8,10,715},{9,10,802},{10,10,46},{10,10,819},{13,10,308},{14,10,351},{ -14,10,363},{146,10,67},{135,11,91},{6,0,474},{4,10,63},{133,10,347},{133,10,749} -,{138,0,841},{133,10,366},{6,0,836},{132,11,225},{135,0,1622},{135,10,89},{140,0 -,735},{134,0,1601},{138,11,145},{6,0,1390},{137,0,804},{142,0,394},{6,11,15},{7, -11,70},{10,11,240},{147,11,93},{6,0,96},{135,0,1426},{4,0,651},{133,0,289},{7,11 -,956},{7,10,977},{7,11,1157},{7,11,1506},{7,11,1606},{7,11,1615},{7,11,1619},{7, -11,1736},{7,11,1775},{8,11,590},{9,11,324},{9,11,736},{9,11,774},{9,11,776},{9, -11,784},{10,11,567},{10,11,708},{11,11,518},{11,11,613},{11,11,695},{11,11,716}, -{11,11,739},{11,11,770},{11,11,771},{11,11,848},{11,11,857},{11,11,931},{11,11, -947},{12,11,326},{12,11,387},{12,11,484},{12,11,528},{12,11,552},{12,11,613},{13 -,11,189},{13,11,256},{13,11,340},{13,11,432},{13,11,436},{13,11,440},{13,11,454} -,{14,11,174},{14,11,220},{14,11,284},{14,11,390},{145,11,121},{7,0,688},{8,0,35} -,{9,0,511},{10,0,767},{147,0,118},{134,0,667},{4,0,513},{5,10,824},{133,10,941}, -{7,10,440},{8,10,230},{139,10,106},{134,0,2034},{135,11,1399},{143,11,66},{135, -11,1529},{4,11,145},{6,11,176},{7,11,395},{9,11,562},{144,11,28},{132,11,501},{ -132,0,704},{134,0,1524},{7,0,1078},{134,11,464},{6,11,509},{10,11,82},{20,11,91} -,{151,11,13},{4,0,720},{133,0,306},{133,0,431},{7,0,1196},{4,10,914},{5,10,800}, -{133,10,852},{135,11,1189},{10,0,54},{141,10,115},{7,10,564},{142,10,168},{5,0, -464},{6,0,236},{7,0,696},{7,0,914},{7,0,1108},{7,0,1448},{9,0,15},{9,0,564},{10, -0,14},{12,0,565},{13,0,449},{14,0,53},{15,0,13},{16,0,64},{17,0,41},{4,10,918},{ -133,10,876},{6,0,1418},{134,10,1764},{4,10,92},{133,10,274},{134,0,907},{4,11, -114},{8,10,501},{9,11,492},{13,11,462},{142,11,215},{4,11,77},{5,11,361},{6,11, -139},{6,11,401},{6,11,404},{7,11,413},{7,11,715},{7,11,1716},{11,11,279},{12,11, -179},{12,11,258},{13,11,244},{142,11,358},{6,0,1767},{12,0,194},{145,0,107},{134 -,11,1717},{5,10,743},{142,11,329},{4,10,49},{7,10,280},{135,10,1633},{5,0,840},{ -7,11,1061},{8,11,82},{11,11,250},{12,11,420},{141,11,184},{135,11,724},{134,0, -900},{136,10,47},{134,0,1436},{144,11,0},{6,0,675},{7,0,1008},{7,0,1560},{9,0, -642},{11,0,236},{14,0,193},{5,10,272},{5,10,908},{5,10,942},{8,10,197},{9,10,47} -,{11,10,538},{139,10,742},{4,0,68},{5,0,628},{5,0,634},{6,0,386},{7,0,794},{8,0, -273},{9,0,563},{10,0,105},{10,0,171},{11,0,94},{139,0,354},{135,10,1911},{137,10 -,891},{4,0,95},{6,0,1297},{6,0,1604},{7,0,416},{139,0,830},{6,11,513},{135,11, -1052},{7,0,731},{13,0,20},{143,0,11},{137,11,899},{10,0,850},{140,0,697},{4,0, -662},{7,11,1417},{12,11,382},{17,11,48},{152,11,12},{133,0,736},{132,0,861},{4, -10,407},{132,10,560},{141,10,490},{6,11,545},{7,11,565},{7,11,1669},{10,11,114}, -{11,11,642},{140,11,618},{6,0,871},{134,0,1000},{5,0,864},{10,0,648},{11,0,671}, -{15,0,46},{133,11,5},{133,0,928},{11,0,90},{13,0,7},{4,10,475},{11,10,35},{13,10 -,71},{13,10,177},{142,10,422},{136,0,332},{135,11,192},{134,0,1055},{136,11,763} -,{11,0,986},{140,0,682},{7,0,76},{8,0,44},{9,0,884},{10,0,580},{11,0,399},{11,0, -894},{143,0,122},{135,11,1237},{135,10,636},{11,0,300},{6,10,222},{7,10,1620},{8 -,10,409},{137,10,693},{4,11,87},{5,11,250},{10,11,601},{13,11,298},{13,11,353},{ -141,11,376},{5,0,518},{10,0,340},{11,0,175},{149,0,16},{140,0,771},{6,0,1108},{ -137,0,831},{132,0,836},{135,0,1852},{4,0,957},{6,0,1804},{8,0,842},{8,0,843},{8, -0,851},{8,0,855},{140,0,767},{135,11,814},{4,11,57},{7,11,1195},{7,11,1438},{7, -11,1548},{7,11,1835},{7,11,1904},{9,11,757},{10,11,604},{139,11,519},{133,10,882 -},{138,0,246},{4,0,934},{5,0,202},{8,0,610},{7,11,1897},{12,11,290},{13,11,80},{ -13,11,437},{145,11,74},{8,0,96},{9,0,36},{10,0,607},{10,0,804},{10,0,832},{11,0, -423},{11,0,442},{12,0,309},{14,0,199},{15,0,90},{145,0,110},{132,10,426},{7,0, -654},{8,0,240},{6,10,58},{7,10,745},{7,10,1969},{8,10,675},{9,10,479},{9,10,731} -,{10,10,330},{10,10,593},{10,10,817},{11,10,32},{11,10,133},{11,10,221},{145,10, -68},{9,0,13},{9,0,398},{9,0,727},{10,0,75},{10,0,184},{10,0,230},{10,0,564},{10, -0,569},{11,0,973},{12,0,70},{12,0,189},{13,0,57},{141,0,257},{4,11,209},{135,11, -902},{7,0,391},{137,10,538},{134,0,403},{6,11,303},{7,11,335},{7,11,1437},{7,11, -1668},{8,11,553},{8,11,652},{8,11,656},{9,11,558},{11,11,743},{149,11,18},{132, -11,559},{11,0,75},{142,0,267},{6,0,815},{141,11,2},{141,0,366},{137,0,631},{133, -11,1017},{5,0,345},{135,0,1016},{133,11,709},{134,11,1745},{133,10,566},{7,0,952 -},{6,10,48},{9,10,139},{10,10,399},{11,10,469},{12,10,634},{141,10,223},{133,0, -673},{9,0,850},{7,11,8},{136,11,206},{6,0,662},{149,0,35},{4,0,287},{133,0,1018} -,{6,10,114},{7,10,1224},{7,10,1556},{136,10,3},{8,10,576},{137,10,267},{4,0,884} -,{5,0,34},{10,0,724},{12,0,444},{13,0,354},{18,0,32},{23,0,24},{23,0,31},{152,0, -5},{133,10,933},{132,11,776},{138,0,151},{136,0,427},{134,0,382},{132,0,329},{9, -0,846},{10,0,827},{138,11,33},{9,0,279},{10,0,407},{14,0,84},{22,0,18},{135,11, -1297},{136,11,406},{132,0,906},{136,0,366},{134,0,843},{134,0,1443},{135,0,1372} -,{138,0,992},{4,0,123},{5,0,605},{7,0,1509},{136,0,36},{132,0,649},{8,11,175},{ -10,11,168},{138,11,573},{133,0,767},{134,0,1018},{135,11,1305},{12,10,30},{13,10 -,148},{14,10,87},{14,10,182},{16,10,42},{148,10,70},{134,11,607},{4,0,273},{5,0, -658},{133,0,995},{6,0,72},{139,11,174},{10,0,483},{12,0,368},{7,10,56},{7,10, -1989},{8,10,337},{8,10,738},{9,10,600},{13,10,447},{142,10,92},{5,11,784},{138, -10,666},{135,0,1345},{139,11,882},{134,0,1293},{133,0,589},{134,0,1988},{5,0,117 -},{6,0,514},{6,0,541},{7,0,1164},{7,0,1436},{8,0,220},{8,0,648},{10,0,688},{139, -0,560},{136,0,379},{5,0,686},{7,10,866},{135,10,1163},{132,10,328},{9,11,14},{9, -11,441},{10,11,306},{139,11,9},{4,10,101},{135,10,1171},{5,10,833},{136,10,744}, -{5,11,161},{7,11,839},{135,11,887},{7,0,196},{10,0,765},{11,0,347},{11,0,552},{ -11,0,790},{12,0,263},{13,0,246},{13,0,270},{13,0,395},{14,0,176},{14,0,190},{14, -0,398},{14,0,412},{15,0,32},{15,0,63},{16,0,88},{147,0,105},{6,10,9},{6,10,397}, -{7,10,53},{7,10,1742},{10,10,632},{11,10,828},{140,10,146},{5,0,381},{135,0,1792 -},{134,0,1452},{135,11,429},{8,0,367},{10,0,760},{14,0,79},{20,0,17},{152,0,0},{ -7,0,616},{138,0,413},{11,10,417},{12,10,223},{140,10,265},{7,11,1611},{13,11,14} -,{15,11,44},{19,11,13},{148,11,76},{135,0,1229},{6,0,120},{7,0,1188},{7,0,1710}, -{8,0,286},{9,0,667},{11,0,592},{139,0,730},{135,11,1814},{135,0,1146},{4,10,186} -,{5,10,157},{8,10,168},{138,10,6},{4,0,352},{135,0,687},{4,0,192},{5,0,49},{6,0, -200},{6,0,293},{6,0,1696},{135,0,1151},{133,10,875},{5,10,773},{5,10,991},{6,10, -1635},{134,10,1788},{7,10,111},{136,10,581},{6,0,935},{134,0,1151},{134,0,1050}, -{132,0,650},{132,0,147},{11,0,194},{12,0,62},{12,0,88},{11,11,194},{12,11,62},{ -140,11,88},{6,0,339},{135,0,923},{134,10,1747},{7,11,643},{136,11,236},{133,0, -934},{7,10,1364},{7,10,1907},{141,10,158},{132,10,659},{4,10,404},{135,10,675},{ -7,11,581},{9,11,644},{137,11,699},{13,0,211},{14,0,133},{14,0,204},{15,0,64},{15 -,0,69},{15,0,114},{16,0,10},{19,0,23},{19,0,35},{19,0,39},{19,0,51},{19,0,71},{ -19,0,75},{152,0,15},{133,10,391},{5,11,54},{135,11,1513},{7,0,222},{8,0,341},{5, -10,540},{134,10,1697},{134,10,78},{132,11,744},{136,0,293},{137,11,701},{7,11, -930},{10,11,402},{10,11,476},{13,11,452},{18,11,55},{147,11,104},{132,0,637},{ -133,10,460},{8,11,50},{137,11,624},{132,11,572},{134,0,1159},{4,10,199},{139,10, -34},{134,0,847},{134,10,388},{6,11,43},{7,11,38},{8,11,248},{9,11,504},{138,11, -513},{9,0,683},{4,10,511},{6,10,608},{9,10,333},{10,10,602},{11,10,441},{11,10, -723},{11,10,976},{140,10,357},{9,0,867},{138,0,837},{6,0,944},{135,11,326},{135, -0,1809},{5,10,938},{7,11,783},{136,10,707},{133,11,766},{133,11,363},{6,0,170},{ -7,0,1080},{8,0,395},{8,0,487},{141,0,147},{6,11,258},{140,11,409},{4,0,535},{8,0 -,618},{5,11,249},{148,11,82},{6,0,1379},{149,11,15},{135,0,1625},{150,0,23},{5, -11,393},{6,11,378},{7,11,1981},{9,11,32},{9,11,591},{10,11,685},{10,11,741},{142 -,11,382},{133,11,788},{7,11,1968},{10,11,19},{139,11,911},{7,11,1401},{135,11, -1476},{4,11,61},{5,11,58},{5,11,171},{5,11,635},{5,11,683},{5,11,700},{6,11,291} -,{6,11,566},{7,11,1650},{11,11,523},{12,11,273},{12,11,303},{15,11,39},{143,11, -111},{6,10,469},{7,10,1709},{138,10,515},{4,0,778},{134,11,589},{132,0,46},{5,0, -811},{6,0,1679},{6,0,1714},{135,0,2032},{7,0,1458},{9,0,407},{11,0,15},{12,0,651 -},{149,0,37},{7,0,938},{132,10,500},{6,0,34},{7,0,69},{7,0,1089},{7,0,1281},{8,0 -,708},{8,0,721},{9,0,363},{148,0,98},{10,11,231},{147,11,124},{7,11,726},{152,11 -,9},{5,10,68},{134,10,383},{136,11,583},{4,11,917},{133,11,1005},{11,10,216},{ -139,10,340},{135,11,1675},{8,0,441},{10,0,314},{143,0,3},{132,11,919},{4,10,337} -,{6,10,353},{7,10,1934},{8,10,488},{137,10,429},{7,0,889},{7,10,1795},{8,10,259} -,{9,10,135},{9,10,177},{9,10,860},{10,10,825},{11,10,115},{11,10,370},{11,10,405 -},{11,10,604},{12,10,10},{12,10,667},{12,10,669},{13,10,76},{14,10,310},{15,10, -76},{15,10,147},{148,10,23},{4,10,15},{4,11,255},{5,10,22},{5,11,302},{6,11,132} -,{6,10,244},{7,10,40},{7,11,128},{7,10,200},{7,11,283},{7,10,906},{7,10,1199},{7 -,11,1299},{9,10,616},{10,11,52},{10,11,514},{10,10,716},{11,10,635},{11,10,801}, -{11,11,925},{12,10,458},{13,11,92},{142,11,309},{132,0,462},{137,11,173},{135,10 -,1735},{8,0,525},{5,10,598},{7,10,791},{8,10,108},{137,10,123},{5,0,73},{6,0,23} -,{134,0,338},{132,0,676},{132,10,683},{7,0,725},{8,0,498},{139,0,268},{12,0,21}, -{151,0,7},{135,0,773},{4,10,155},{135,10,1689},{4,0,164},{5,0,730},{5,10,151},{5 -,10,741},{6,11,210},{7,10,498},{7,10,870},{7,10,1542},{12,10,213},{14,10,36},{14 -,10,391},{17,10,111},{18,10,6},{18,10,46},{18,10,151},{19,10,36},{20,10,32},{20, -10,56},{20,10,69},{20,10,102},{21,10,4},{22,10,8},{22,10,10},{22,10,14},{150,10, -31},{4,10,624},{135,10,1752},{4,0,583},{9,0,936},{15,0,214},{18,0,199},{24,0,26} -,{134,11,588},{7,0,1462},{11,0,659},{4,11,284},{134,11,223},{133,0,220},{139,0, -803},{132,0,544},{4,10,492},{133,10,451},{16,0,98},{148,0,119},{4,11,218},{7,11, -526},{143,11,137},{135,10,835},{4,11,270},{5,11,192},{6,11,332},{7,11,1322},{13, -11,9},{13,10,70},{14,11,104},{142,11,311},{132,10,539},{140,11,661},{5,0,176},{6 -,0,437},{6,0,564},{11,0,181},{141,0,183},{135,0,1192},{6,10,113},{135,10,436},{ -136,10,718},{135,10,520},{135,0,1878},{140,11,196},{7,11,379},{8,11,481},{137,11 -,377},{5,11,1003},{6,11,149},{137,11,746},{8,11,262},{9,11,627},{10,11,18},{11, -11,214},{11,11,404},{11,11,457},{11,11,780},{11,11,849},{11,11,913},{13,11,330}, -{13,11,401},{142,11,200},{149,0,26},{136,11,304},{132,11,142},{135,0,944},{4,0, -790},{5,0,273},{134,0,394},{134,0,855},{4,0,135},{6,0,127},{7,0,1185},{7,0,1511} -,{8,0,613},{11,0,5},{12,0,336},{12,0,495},{12,0,586},{12,0,660},{12,0,668},{14,0 -,385},{15,0,118},{17,0,20},{146,0,98},{6,0,230},{9,0,752},{18,0,109},{12,10,610} -,{13,10,431},{144,10,59},{7,0,1954},{135,11,925},{4,11,471},{5,11,51},{6,11,602} -,{8,11,484},{10,11,195},{140,11,159},{132,10,307},{136,11,688},{132,11,697},{7, -11,812},{7,11,1261},{7,11,1360},{9,11,632},{140,11,352},{5,0,162},{8,0,68},{133, -10,964},{4,0,654},{136,11,212},{4,0,156},{7,0,998},{7,0,1045},{7,0,1860},{9,0,48 -},{9,0,692},{11,0,419},{139,0,602},{133,11,221},{4,11,373},{5,11,283},{6,11,480} -,{135,11,609},{142,11,216},{132,0,240},{6,11,192},{9,11,793},{145,11,55},{4,10, -75},{5,10,180},{6,10,500},{7,10,58},{7,10,710},{138,10,645},{4,11,132},{5,11,69} -,{5,10,649},{135,11,1242},{6,10,276},{7,10,282},{7,10,879},{7,10,924},{8,10,459} -,{9,10,599},{9,10,754},{11,10,574},{12,10,128},{12,10,494},{13,10,52},{13,10,301 -},{15,10,30},{143,10,132},{132,10,200},{4,11,111},{135,11,302},{9,0,197},{10,0, -300},{12,0,473},{13,0,90},{141,0,405},{132,11,767},{6,11,42},{7,11,1416},{7,11, -1590},{7,11,2005},{8,11,131},{8,11,466},{9,11,672},{13,11,252},{148,11,103},{8,0 -,958},{8,0,999},{10,0,963},{138,0,1001},{135,10,1621},{135,0,858},{4,0,606},{137 -,11,444},{6,11,44},{136,11,368},{139,11,172},{4,11,570},{133,11,120},{139,11,624 -},{7,0,1978},{8,0,676},{6,10,225},{137,10,211},{7,0,972},{11,0,102},{136,10,687} -,{6,11,227},{135,11,1589},{8,10,58},{9,10,724},{11,10,809},{13,10,113},{145,10, -72},{4,0,361},{133,0,315},{132,0,461},{6,10,345},{135,10,1247},{132,0,472},{8,10 -,767},{8,10,803},{9,10,301},{137,10,903},{135,11,1333},{135,11,477},{7,10,1949}, -{136,10,674},{6,0,905},{138,0,747},{133,0,155},{134,10,259},{7,0,163},{8,0,319}, -{9,0,402},{10,0,24},{10,0,681},{11,0,200},{12,0,253},{12,0,410},{142,0,219},{5,0 -,475},{7,0,1780},{9,0,230},{11,0,297},{11,0,558},{14,0,322},{19,0,76},{6,11,1667 -},{7,11,2036},{138,11,600},{136,10,254},{6,0,848},{135,0,1956},{6,11,511},{140, -11,132},{5,11,568},{6,11,138},{135,11,1293},{6,0,631},{137,0,838},{149,0,36},{4, -11,565},{8,11,23},{136,11,827},{5,0,944},{134,0,1769},{4,0,144},{6,0,842},{6,0, -1400},{4,11,922},{133,11,1023},{133,10,248},{9,10,800},{10,10,693},{11,10,482},{ -11,10,734},{139,10,789},{7,11,1002},{139,11,145},{4,10,116},{5,10,95},{5,10,445} -,{7,10,1688},{8,10,29},{9,10,272},{11,10,509},{139,10,915},{14,0,369},{146,0,72} -,{135,10,1641},{132,11,740},{133,10,543},{140,11,116},{6,0,247},{9,0,555},{5,10, -181},{136,10,41},{133,10,657},{136,0,996},{138,10,709},{7,0,189},{8,10,202},{138 -,10,536},{136,11,402},{4,11,716},{141,11,31},{10,0,280},{138,0,797},{9,10,423},{ -140,10,89},{8,10,113},{9,10,877},{10,10,554},{11,10,83},{12,10,136},{147,10,109} -,{133,10,976},{7,0,746},{132,10,206},{136,0,526},{139,0,345},{136,0,1017},{8,11, -152},{9,11,53},{9,11,268},{9,11,901},{10,11,518},{10,11,829},{11,11,188},{13,11, -74},{14,11,46},{15,11,17},{15,11,33},{17,11,40},{18,11,36},{19,11,20},{22,11,1}, -{152,11,2},{133,11,736},{136,11,532},{5,0,428},{138,0,651},{135,11,681},{135,0, -1162},{7,0,327},{13,0,230},{17,0,113},{8,10,226},{10,10,537},{11,10,570},{11,10, -605},{11,10,799},{11,10,804},{12,10,85},{12,10,516},{12,10,623},{12,11,677},{13, -10,361},{14,10,77},{14,10,78},{147,10,110},{4,0,792},{7,0,1717},{10,0,546},{132, -10,769},{4,11,684},{136,11,384},{132,10,551},{134,0,1203},{9,10,57},{9,10,459},{ -10,10,425},{11,10,119},{12,10,184},{12,10,371},{13,10,358},{145,10,51},{5,0,672} -,{5,10,814},{8,10,10},{9,10,421},{9,10,729},{10,10,609},{139,10,689},{138,0,189} -,{134,10,624},{7,11,110},{7,11,188},{8,11,290},{8,11,591},{9,11,382},{9,11,649}, -{11,11,71},{11,11,155},{11,11,313},{12,11,5},{13,11,325},{142,11,287},{133,0,99} -,{6,0,1053},{135,0,298},{7,11,360},{7,11,425},{9,11,66},{9,11,278},{138,11,644}, -{4,0,397},{136,0,555},{137,10,269},{132,10,528},{4,11,900},{133,11,861},{6,0, -1157},{5,11,254},{7,11,985},{136,11,73},{7,11,1959},{136,11,683},{12,0,398},{20, -0,39},{21,0,11},{150,0,41},{4,0,485},{7,0,353},{135,0,1523},{6,0,366},{7,0,1384} -,{135,0,1601},{138,0,787},{137,0,282},{5,10,104},{6,10,173},{135,10,1631},{139, -11,146},{4,0,157},{133,0,471},{134,0,941},{132,11,725},{7,0,1336},{8,10,138},{8, -10,342},{9,10,84},{10,10,193},{11,10,883},{140,10,359},{134,11,196},{136,0,116}, -{133,11,831},{134,0,787},{134,10,95},{6,10,406},{10,10,409},{10,10,447},{11,10, -44},{140,10,100},{5,0,160},{7,0,363},{7,0,589},{10,0,170},{141,0,55},{134,0,1815 -},{132,0,866},{6,0,889},{6,0,1067},{6,0,1183},{4,11,321},{134,11,569},{5,11,848} -,{134,11,66},{4,11,36},{6,10,1636},{7,11,1387},{10,11,205},{11,11,755},{141,11, -271},{132,0,689},{9,0,820},{4,10,282},{7,10,1034},{11,10,398},{11,10,634},{12,10 -,1},{12,10,79},{12,10,544},{14,10,237},{17,10,10},{146,10,20},{4,0,108},{7,0,804 -},{139,0,498},{132,11,887},{6,0,1119},{135,11,620},{6,11,165},{138,11,388},{5,0, -244},{5,10,499},{6,10,476},{7,10,600},{7,10,888},{135,10,1096},{140,0,609},{135, -0,1005},{4,0,412},{133,0,581},{4,11,719},{135,11,155},{7,10,296},{7,10,596},{8, -10,560},{8,10,586},{9,10,612},{11,10,304},{12,10,46},{13,10,89},{14,10,112},{145 -,10,122},{4,0,895},{133,0,772},{142,11,307},{135,0,1898},{4,0,926},{133,0,983},{ -4,11,353},{6,11,146},{6,11,1789},{7,11,288},{7,11,990},{7,11,1348},{9,11,665},{9 -,11,898},{11,11,893},{142,11,212},{132,0,538},{133,11,532},{6,0,294},{7,0,1267}, -{8,0,624},{141,0,496},{7,0,1325},{4,11,45},{135,11,1257},{138,0,301},{9,0,298},{ -12,0,291},{13,0,276},{14,0,6},{17,0,18},{21,0,32},{7,10,1599},{7,10,1723},{8,10, -79},{8,10,106},{8,10,190},{8,10,302},{8,10,383},{8,10,713},{9,10,119},{9,10,233} -,{9,10,419},{9,10,471},{10,10,181},{10,10,406},{11,10,57},{11,10,85},{11,10,120} -,{11,10,177},{11,10,296},{11,10,382},{11,10,454},{11,10,758},{11,10,999},{12,10, -27},{12,10,131},{12,10,245},{12,10,312},{12,10,446},{12,10,454},{13,10,98},{13, -10,426},{13,10,508},{14,10,163},{14,10,272},{14,10,277},{14,10,370},{15,10,95},{ -15,10,138},{15,10,167},{17,10,38},{148,10,96},{132,0,757},{134,0,1263},{4,0,820} -,{134,10,1759},{133,0,722},{136,11,816},{138,10,372},{145,10,16},{134,0,1039},{4 -,0,991},{134,0,2028},{133,10,258},{7,0,1875},{139,0,124},{6,11,559},{6,11,1691}, -{135,11,586},{5,0,324},{7,0,881},{8,10,134},{9,10,788},{140,10,438},{7,11,1823}, -{139,11,693},{6,0,1348},{134,0,1545},{134,0,911},{132,0,954},{8,0,329},{8,0,414} -,{7,10,1948},{135,10,2004},{5,0,517},{6,10,439},{7,10,780},{135,10,1040},{132,0, -816},{5,10,1},{6,10,81},{138,10,520},{9,0,713},{10,0,222},{5,10,482},{8,10,98},{ -10,10,700},{10,10,822},{11,10,302},{11,10,778},{12,10,50},{12,10,127},{12,10,396 -},{13,10,62},{13,10,328},{14,10,122},{147,10,72},{137,0,33},{5,10,2},{7,10,1494} -,{136,10,589},{6,10,512},{7,10,797},{8,10,253},{9,10,77},{10,10,1},{10,11,108},{ -10,10,129},{10,10,225},{11,11,116},{11,10,118},{11,10,226},{11,10,251},{11,10, -430},{11,10,701},{11,10,974},{11,10,982},{12,10,64},{12,10,260},{12,10,488},{140 -,10,690},{134,11,456},{133,11,925},{5,0,150},{7,0,106},{7,0,774},{8,0,603},{9,0, -593},{9,0,634},{10,0,44},{10,0,173},{11,0,462},{11,0,515},{13,0,216},{13,0,288}, -{142,0,400},{137,10,347},{5,0,748},{134,0,553},{12,0,108},{141,0,291},{7,0,420}, -{4,10,12},{7,10,522},{7,10,809},{8,10,797},{141,10,88},{6,11,193},{7,11,240},{7, -11,1682},{10,11,51},{10,11,640},{11,11,410},{13,11,82},{14,11,247},{14,11,331},{ -142,11,377},{133,10,528},{135,0,1777},{4,0,493},{144,0,55},{136,11,633},{139,0, -81},{6,0,980},{136,0,321},{148,10,109},{5,10,266},{9,10,290},{9,10,364},{10,10, -293},{11,10,606},{142,10,45},{6,0,568},{7,0,112},{7,0,1804},{8,0,362},{8,0,410}, -{8,0,830},{9,0,514},{11,0,649},{142,0,157},{4,0,74},{6,0,510},{6,10,594},{9,10, -121},{10,10,49},{10,10,412},{139,10,834},{134,0,838},{136,10,748},{132,10,466},{ -132,0,625},{135,11,1443},{4,11,237},{135,11,514},{9,10,378},{141,10,162},{6,0,16 -},{6,0,158},{7,0,43},{7,0,129},{7,0,181},{8,0,276},{8,0,377},{10,0,523},{11,0, -816},{12,0,455},{13,0,303},{142,0,135},{135,0,281},{4,0,1},{7,0,1143},{7,0,1463} -,{8,0,61},{9,0,207},{9,0,390},{9,0,467},{139,0,836},{6,11,392},{7,11,65},{135,11 -,2019},{132,10,667},{4,0,723},{5,0,895},{7,0,1031},{8,0,199},{8,0,340},{9,0,153} -,{9,0,215},{10,0,21},{10,0,59},{10,0,80},{10,0,224},{10,0,838},{11,0,229},{11,0, -652},{12,0,192},{13,0,146},{142,0,91},{132,0,295},{137,0,51},{9,11,222},{10,11, -43},{139,11,900},{5,0,309},{140,0,211},{5,0,125},{8,0,77},{138,0,15},{136,11,604 -},{138,0,789},{5,0,173},{4,10,39},{7,10,1843},{8,10,407},{11,10,144},{140,10,523 -},{138,11,265},{133,0,439},{132,10,510},{7,0,648},{7,0,874},{11,0,164},{12,0,76} -,{18,0,9},{7,10,1980},{10,10,487},{138,10,809},{12,0,111},{14,0,294},{19,0,45},{ -13,10,260},{146,10,63},{133,11,549},{134,10,570},{4,0,8},{7,0,1152},{7,0,1153},{ -7,0,1715},{9,0,374},{10,0,478},{139,0,648},{135,0,1099},{5,0,575},{6,0,354},{135 -,0,701},{7,11,36},{8,11,201},{136,11,605},{4,10,787},{136,11,156},{6,0,518},{149 -,11,13},{140,11,224},{134,0,702},{132,10,516},{5,11,724},{10,11,305},{11,11,151} -,{12,11,33},{12,11,121},{12,11,381},{17,11,3},{17,11,27},{17,11,78},{18,11,18},{ -19,11,54},{149,11,5},{8,0,87},{4,11,523},{5,11,638},{11,10,887},{14,10,365},{142 -,10,375},{138,0,438},{136,10,821},{135,11,1908},{6,11,242},{7,11,227},{7,11,1581 -},{8,11,104},{9,11,113},{9,11,220},{9,11,427},{10,11,74},{10,11,239},{11,11,579} -,{11,11,1023},{13,11,4},{13,11,204},{13,11,316},{18,11,95},{148,11,86},{4,0,69}, -{5,0,122},{5,0,849},{6,0,1633},{9,0,656},{138,0,464},{7,0,1802},{4,10,10},{139, -10,786},{135,11,861},{139,0,499},{7,0,476},{7,0,1592},{138,0,87},{133,10,684},{4 -,0,840},{134,10,27},{142,0,283},{6,0,1620},{7,11,1328},{136,11,494},{5,0,859},{7 -,0,1160},{8,0,107},{9,0,291},{9,0,439},{10,0,663},{11,0,609},{140,0,197},{7,11, -1306},{8,11,505},{9,11,482},{10,11,126},{11,11,225},{12,11,347},{12,11,449},{13, -11,19},{142,11,218},{5,11,268},{10,11,764},{12,11,120},{13,11,39},{145,11,127},{ -145,10,56},{7,11,1672},{10,11,472},{11,11,189},{143,11,51},{6,10,342},{6,10,496} -,{8,10,275},{137,10,206},{133,0,600},{4,0,117},{6,0,372},{7,0,1905},{142,0,323}, -{4,10,909},{5,10,940},{135,11,1471},{132,10,891},{4,0,722},{139,0,471},{4,11,384 -},{135,11,1022},{132,10,687},{9,0,5},{12,0,216},{12,0,294},{12,0,298},{12,0,400} -,{12,0,518},{13,0,229},{143,0,139},{135,11,1703},{7,11,1602},{10,11,698},{12,11, -212},{141,11,307},{6,10,41},{141,10,160},{135,11,1077},{9,11,159},{11,11,28},{ -140,11,603},{4,0,514},{7,0,1304},{138,0,477},{134,0,1774},{9,0,88},{139,0,270},{ -5,0,12},{7,0,375},{9,0,438},{134,10,1718},{132,11,515},{136,10,778},{8,11,632},{ -8,11,697},{137,11,854},{6,0,362},{6,0,997},{146,0,51},{7,0,816},{7,0,1241},{9,0, -283},{9,0,520},{10,0,213},{10,0,307},{10,0,463},{10,0,671},{10,0,746},{11,0,401} -,{11,0,794},{12,0,517},{18,0,107},{147,0,115},{133,10,115},{150,11,28},{4,11,136 -},{133,11,551},{142,10,314},{132,0,258},{6,0,22},{7,0,903},{7,0,1963},{8,0,639}, -{138,0,577},{5,0,681},{8,0,782},{13,0,130},{17,0,84},{5,10,193},{140,10,178},{9, -11,17},{138,11,291},{7,11,1287},{9,11,44},{10,11,552},{10,11,642},{11,11,839},{ -12,11,274},{12,11,275},{12,11,372},{13,11,91},{142,11,125},{135,10,174},{4,0,664 -},{5,0,804},{139,0,1013},{134,0,942},{6,0,1349},{6,0,1353},{6,0,1450},{7,11,1518 -},{139,11,694},{11,0,356},{4,10,122},{5,10,796},{5,10,952},{6,10,1660},{6,10, -1671},{8,10,567},{9,10,687},{9,10,742},{10,10,686},{11,10,682},{140,10,281},{5,0 -,32},{6,11,147},{7,11,886},{9,11,753},{138,11,268},{5,10,179},{7,10,1095},{135, -10,1213},{4,10,66},{7,10,722},{135,10,904},{135,10,352},{9,11,245},{138,11,137}, -{4,0,289},{7,0,629},{7,0,1698},{7,0,1711},{12,0,215},{133,11,414},{6,0,1975},{ -135,11,1762},{6,0,450},{136,0,109},{141,10,35},{134,11,599},{136,0,705},{133,0, -664},{134,11,1749},{11,11,402},{12,11,109},{12,11,431},{13,11,179},{13,11,206},{ -14,11,175},{14,11,217},{16,11,3},{148,11,53},{135,0,1238},{134,11,1627},{132,11, -488},{13,0,318},{10,10,592},{10,10,753},{12,10,317},{12,10,355},{12,10,465},{12, -10,469},{12,10,560},{140,10,578},{133,10,564},{132,11,83},{140,11,676},{6,0,1872 -},{6,0,1906},{6,0,1907},{9,0,934},{9,0,956},{9,0,960},{9,0,996},{12,0,794},{12,0 -,876},{12,0,880},{12,0,918},{15,0,230},{18,0,234},{18,0,238},{21,0,38},{149,0,62 -},{134,10,556},{134,11,278},{137,0,103},{7,10,544},{8,10,719},{138,10,61},{4,10, -5},{5,10,498},{8,10,637},{137,10,521},{7,0,777},{12,0,229},{12,0,239},{15,0,12}, -{12,11,229},{12,11,239},{143,11,12},{6,0,26},{7,11,388},{7,11,644},{139,11,781}, -{7,11,229},{8,11,59},{9,11,190},{9,11,257},{10,11,378},{140,11,191},{133,10,927} -,{135,10,1441},{4,10,893},{5,10,780},{133,10,893},{4,0,414},{5,0,467},{9,0,654}, -{10,0,451},{12,0,59},{141,0,375},{142,0,173},{135,0,17},{7,0,1350},{133,10,238}, -{135,0,955},{4,0,960},{10,0,887},{12,0,753},{18,0,161},{18,0,162},{152,0,19},{ -136,11,344},{6,10,1729},{137,11,288},{132,11,660},{4,0,217},{5,0,710},{7,0,760}, -{7,0,1926},{9,0,428},{9,0,708},{10,0,254},{10,0,296},{10,0,720},{11,0,109},{11,0 -,255},{12,0,165},{12,0,315},{13,0,107},{13,0,203},{14,0,54},{14,0,99},{14,0,114} -,{14,0,388},{16,0,85},{17,0,9},{17,0,33},{20,0,25},{20,0,28},{20,0,29},{21,0,9}, -{21,0,10},{21,0,34},{22,0,17},{4,10,60},{7,10,1800},{8,10,314},{9,10,700},{139, -10,487},{7,11,1035},{138,11,737},{7,11,690},{9,11,217},{9,11,587},{140,11,521},{ -6,0,919},{7,11,706},{7,11,1058},{138,11,538},{7,10,1853},{138,10,437},{136,10, -419},{6,0,280},{10,0,502},{11,0,344},{140,0,38},{5,0,45},{7,0,1161},{11,0,448},{ -11,0,880},{13,0,139},{13,0,407},{15,0,16},{17,0,95},{18,0,66},{18,0,88},{18,0, -123},{149,0,7},{11,11,92},{11,11,196},{11,11,409},{11,11,450},{11,11,666},{11,11 -,777},{12,11,262},{13,11,385},{13,11,393},{15,11,115},{16,11,45},{145,11,82},{ -136,0,777},{134,11,1744},{4,0,410},{7,0,521},{133,10,828},{134,0,673},{7,0,1110} -,{7,0,1778},{7,10,176},{135,10,178},{5,10,806},{7,11,268},{7,10,1976},{136,11, -569},{4,11,733},{9,11,194},{10,11,92},{11,11,198},{12,11,84},{12,11,87},{13,11, -128},{144,11,74},{5,0,341},{7,0,1129},{11,0,414},{4,10,51},{6,10,4},{7,10,591},{ -7,10,849},{7,10,951},{7,10,1613},{7,10,1760},{7,10,1988},{9,10,434},{10,10,754}, -{11,10,25},{139,10,37},{133,10,902},{135,10,928},{135,0,787},{132,0,436},{134,10 -,270},{7,0,1587},{135,0,1707},{6,0,377},{7,0,1025},{9,0,613},{145,0,104},{7,11, -982},{7,11,1361},{10,11,32},{143,11,56},{139,0,96},{132,0,451},{132,10,416},{142 -,10,372},{5,10,152},{5,10,197},{7,11,306},{7,10,340},{7,10,867},{10,10,548},{10, -10,581},{11,10,6},{12,10,3},{12,10,19},{14,10,110},{142,10,289},{134,0,680},{134 -,11,609},{7,0,483},{7,10,190},{8,10,28},{8,10,141},{8,10,444},{8,10,811},{9,10, -468},{11,10,334},{12,10,24},{12,10,386},{140,10,576},{10,0,916},{133,10,757},{5, -10,721},{135,10,1553},{133,11,178},{134,0,937},{132,10,898},{133,0,739},{147,0, -82},{135,0,663},{146,0,128},{5,10,277},{141,10,247},{134,0,1087},{132,10,435},{6 -,11,381},{7,11,645},{7,11,694},{136,11,546},{7,0,503},{135,0,1885},{6,0,1965},{8 -,0,925},{138,0,955},{4,0,113},{5,0,163},{5,0,735},{7,0,1009},{9,0,9},{9,0,771},{ -12,0,90},{13,0,138},{13,0,410},{143,0,128},{4,0,324},{138,0,104},{7,0,460},{5,10 -,265},{134,10,212},{133,11,105},{7,11,261},{7,11,1107},{7,11,1115},{7,11,1354},{ -7,11,1588},{7,11,1705},{7,11,1902},{9,11,465},{10,11,248},{10,11,349},{10,11,647 -},{11,11,527},{11,11,660},{11,11,669},{12,11,529},{141,11,305},{5,11,438},{9,11, -694},{12,11,627},{141,11,210},{152,11,11},{4,0,935},{133,0,823},{132,10,702},{5, -0,269},{7,0,434},{7,0,891},{8,0,339},{9,0,702},{11,0,594},{11,0,718},{17,0,100}, -{5,10,808},{135,10,2045},{7,0,1014},{9,0,485},{141,0,264},{134,0,1713},{7,0,1810 -},{11,0,866},{12,0,103},{13,0,495},{140,11,233},{4,0,423},{10,0,949},{138,0,1013 -},{135,0,900},{8,11,25},{138,11,826},{5,10,166},{8,10,739},{140,10,511},{134,0, -2018},{7,11,1270},{139,11,612},{4,10,119},{5,10,170},{5,10,447},{7,10,1708},{7, -10,1889},{9,10,357},{9,10,719},{12,10,486},{140,10,596},{12,0,574},{140,11,574}, -{132,11,308},{6,0,964},{6,0,1206},{134,0,1302},{4,10,450},{135,10,1158},{135,11, -150},{136,11,649},{14,0,213},{148,0,38},{9,11,45},{9,11,311},{141,11,42},{134,11 -,521},{7,10,1375},{7,10,1466},{138,10,331},{132,10,754},{5,11,339},{7,11,1442},{ -14,11,3},{15,11,41},{147,11,66},{136,11,378},{134,0,1022},{5,10,850},{136,10,799 -},{142,0,143},{135,0,2029},{134,11,1628},{8,0,523},{150,0,34},{5,0,625},{135,0, -1617},{7,0,275},{7,10,238},{7,10,2033},{8,10,120},{8,10,188},{8,10,659},{9,10, -598},{10,10,466},{12,10,342},{12,10,588},{13,10,503},{14,10,246},{143,10,92},{7, -0,37},{8,0,425},{8,0,693},{9,0,720},{10,0,380},{10,0,638},{11,0,273},{11,0,473}, -{12,0,61},{143,0,43},{135,11,829},{135,0,1943},{132,0,765},{5,11,486},{135,11, -1349},{7,11,1635},{8,11,17},{10,11,217},{138,11,295},{4,10,201},{7,10,1744},{8, -10,602},{11,10,247},{11,10,826},{145,10,65},{138,11,558},{11,0,551},{142,0,159}, -{8,10,164},{146,10,62},{139,11,176},{132,0,168},{136,0,1010},{134,0,1994},{135,0 -,91},{138,0,532},{135,10,1243},{135,0,1884},{132,10,907},{5,10,100},{10,10,329}, -{12,10,416},{149,10,29},{134,11,447},{132,10,176},{5,10,636},{5,10,998},{7,10,9} -,{7,10,1508},{8,10,26},{9,10,317},{9,10,358},{10,10,210},{10,10,292},{10,10,533} -,{11,10,555},{12,10,526},{12,10,607},{13,10,263},{13,10,459},{142,10,271},{4,11, -609},{135,11,756},{6,0,15},{7,0,70},{10,0,240},{147,0,93},{4,11,930},{133,11,947 -},{134,0,1227},{134,0,1534},{133,11,939},{133,11,962},{5,11,651},{8,11,170},{9, -11,61},{9,11,63},{10,11,23},{10,11,37},{10,11,834},{11,11,4},{11,11,187},{11,11, -281},{11,11,503},{11,11,677},{12,11,96},{12,11,130},{12,11,244},{14,11,5},{14,11 -,40},{14,11,162},{14,11,202},{146,11,133},{4,11,406},{5,11,579},{12,11,492},{150 -,11,15},{139,0,392},{6,10,610},{10,10,127},{141,10,27},{7,0,655},{7,0,1844},{136 -,10,119},{4,0,145},{6,0,176},{7,0,395},{137,0,562},{132,0,501},{140,11,145},{136 -,0,1019},{134,0,509},{139,0,267},{6,11,17},{7,11,16},{7,11,1001},{7,11,1982},{9, -11,886},{10,11,489},{10,11,800},{11,11,782},{12,11,320},{13,11,467},{14,11,145}, -{14,11,387},{143,11,119},{145,11,17},{6,0,1099},{133,11,458},{7,11,1983},{8,11,0 -},{8,11,171},{9,11,120},{9,11,732},{10,11,473},{11,11,656},{11,11,998},{18,11,0} -,{18,11,2},{147,11,21},{12,11,427},{146,11,38},{10,0,948},{138,0,968},{7,10,126} -,{136,10,84},{136,10,790},{4,0,114},{9,0,492},{13,0,462},{142,0,215},{6,10,64},{ -12,10,377},{141,10,309},{4,0,77},{5,0,361},{6,0,139},{6,0,401},{6,0,404},{7,0, -413},{7,0,715},{7,0,1716},{11,0,279},{12,0,179},{12,0,258},{13,0,244},{142,0,358 -},{134,0,1717},{7,0,772},{7,0,1061},{7,0,1647},{8,0,82},{11,0,250},{11,0,607},{ -12,0,311},{12,0,420},{13,0,184},{13,0,367},{7,10,1104},{11,10,269},{11,10,539},{ -11,10,627},{11,10,706},{11,10,975},{12,10,248},{12,10,434},{12,10,600},{12,10, -622},{13,10,297},{13,10,485},{14,10,69},{14,10,409},{143,10,108},{135,0,724},{4, -11,512},{4,11,519},{133,11,342},{134,0,1133},{145,11,29},{11,10,977},{141,10,507 -},{6,0,841},{6,0,1042},{6,0,1194},{10,0,993},{140,0,1021},{6,11,31},{7,11,491},{ -7,11,530},{8,11,592},{9,10,34},{11,11,53},{11,10,484},{11,11,779},{12,11,167},{ -12,11,411},{14,11,14},{14,11,136},{15,11,72},{16,11,17},{144,11,72},{4,0,1021},{ -6,0,2037},{133,11,907},{7,0,373},{8,0,335},{8,0,596},{9,0,488},{6,10,1700},{7,10 -,293},{7,10,382},{7,10,1026},{7,10,1087},{7,10,2027},{8,10,252},{8,10,727},{8,10 -,729},{9,10,30},{9,10,199},{9,10,231},{9,10,251},{9,10,334},{9,10,361},{9,10,712 -},{10,10,55},{10,10,60},{10,10,232},{10,10,332},{10,10,384},{10,10,396},{10,10, -504},{10,10,542},{10,10,652},{11,10,20},{11,10,48},{11,10,207},{11,10,291},{11, -10,298},{11,10,342},{11,10,365},{11,10,394},{11,10,620},{11,10,705},{11,10,1017} -,{12,10,123},{12,10,340},{12,10,406},{12,10,643},{13,10,61},{13,10,269},{13,10, -311},{13,10,319},{13,10,486},{14,10,234},{15,10,62},{15,10,85},{16,10,71},{18,10 -,119},{148,10,105},{150,0,37},{4,11,208},{5,11,106},{6,11,531},{8,11,408},{9,11, -188},{138,11,572},{132,0,564},{6,0,513},{135,0,1052},{132,0,825},{9,0,899},{140, -11,441},{134,0,778},{133,11,379},{7,0,1417},{12,0,382},{17,0,48},{152,0,12},{132 -,11,241},{7,0,1116},{6,10,379},{7,10,270},{8,10,176},{8,10,183},{9,10,432},{9,10 -,661},{12,10,247},{12,10,617},{146,10,125},{5,10,792},{133,10,900},{6,0,545},{7, -0,565},{7,0,1669},{10,0,114},{11,0,642},{140,0,618},{133,0,5},{138,11,7},{132,11 -,259},{135,0,192},{134,0,701},{136,0,763},{135,10,1979},{4,10,901},{133,10,776}, -{10,0,755},{147,0,29},{133,0,759},{4,11,173},{5,11,312},{5,11,512},{135,11,1285} -,{7,11,1603},{7,11,1691},{9,11,464},{11,11,195},{12,11,279},{12,11,448},{14,11, -11},{147,11,102},{7,0,370},{7,0,1007},{7,0,1177},{135,0,1565},{135,0,1237},{4,0, -87},{5,0,250},{141,0,298},{4,11,452},{5,11,583},{5,11,817},{6,11,433},{7,11,593} -,{7,11,720},{7,11,1378},{8,11,161},{9,11,284},{10,11,313},{139,11,886},{4,11,547 -},{135,11,1409},{136,11,722},{4,10,37},{5,10,334},{135,10,1253},{132,10,508},{12 -,0,107},{146,0,31},{8,11,420},{139,11,193},{135,0,814},{135,11,409},{140,0,991}, -{4,0,57},{7,0,1195},{7,0,1438},{7,0,1548},{7,0,1835},{7,0,1904},{9,0,757},{10,0, -604},{139,0,519},{132,0,540},{138,11,308},{132,10,533},{136,0,608},{144,11,65},{ -4,0,1014},{134,0,2029},{4,0,209},{7,0,902},{5,11,1002},{136,11,745},{134,0,2030} -,{6,0,303},{7,0,335},{7,0,1437},{7,0,1668},{8,0,553},{8,0,652},{8,0,656},{9,0, -558},{11,0,743},{149,0,18},{5,11,575},{6,11,354},{135,11,701},{4,11,239},{6,11, -477},{7,11,1607},{11,11,68},{139,11,617},{132,0,559},{8,0,527},{18,0,60},{147,0, -24},{133,10,920},{138,0,511},{133,0,1017},{133,0,675},{138,10,391},{11,0,156},{ -135,10,1952},{138,11,369},{132,11,367},{133,0,709},{6,0,698},{134,0,887},{142,10 -,126},{134,0,1745},{132,10,483},{13,11,299},{142,11,75},{133,0,714},{7,0,8},{136 -,0,206},{138,10,480},{4,11,694},{9,10,495},{146,10,104},{7,11,1248},{11,11,621}, -{139,11,702},{140,11,687},{132,0,776},{139,10,1009},{135,0,1272},{134,0,1059},{8 -,10,653},{13,10,93},{147,10,14},{135,11,213},{136,0,406},{133,10,172},{132,0,947 -},{8,0,175},{10,0,168},{138,0,573},{132,0,870},{6,0,1567},{151,11,28},{134,11, -472},{5,10,260},{136,11,132},{4,11,751},{11,11,390},{140,11,32},{4,11,409},{133, -11,78},{12,0,554},{6,11,473},{145,11,105},{133,0,784},{8,0,908},{136,11,306},{ -139,0,882},{6,0,358},{7,0,1393},{8,0,396},{10,0,263},{14,0,154},{16,0,48},{17,0, -8},{7,11,1759},{8,11,396},{10,11,263},{14,11,154},{16,11,48},{145,11,8},{13,11, -163},{13,11,180},{18,11,78},{148,11,35},{14,0,32},{18,0,85},{20,0,2},{152,0,16}, -{7,0,228},{10,0,770},{8,10,167},{8,10,375},{9,10,82},{9,10,561},{138,10,620},{ -132,0,845},{9,0,14},{9,0,441},{10,0,306},{139,0,9},{11,0,966},{12,0,287},{13,0, -342},{13,0,402},{15,0,110},{15,0,163},{8,10,194},{136,10,756},{134,0,1578},{4,0, -967},{6,0,1820},{6,0,1847},{140,0,716},{136,0,594},{7,0,1428},{7,0,1640},{7,0, -1867},{9,0,169},{9,0,182},{9,0,367},{9,0,478},{9,0,506},{9,0,551},{9,0,557},{9,0 -,648},{9,0,697},{9,0,705},{9,0,725},{9,0,787},{9,0,794},{10,0,198},{10,0,214},{ -10,0,267},{10,0,275},{10,0,456},{10,0,551},{10,0,561},{10,0,613},{10,0,627},{10, -0,668},{10,0,675},{10,0,691},{10,0,695},{10,0,707},{10,0,715},{11,0,183},{11,0, -201},{11,0,244},{11,0,262},{11,0,352},{11,0,439},{11,0,493},{11,0,572},{11,0,591 -},{11,0,608},{11,0,611},{11,0,646},{11,0,674},{11,0,711},{11,0,751},{11,0,761},{ -11,0,776},{11,0,785},{11,0,850},{11,0,853},{11,0,862},{11,0,865},{11,0,868},{11, -0,875},{11,0,898},{11,0,902},{11,0,903},{11,0,910},{11,0,932},{11,0,942},{11,0, -957},{11,0,967},{11,0,972},{12,0,148},{12,0,195},{12,0,220},{12,0,237},{12,0,318 -},{12,0,339},{12,0,393},{12,0,445},{12,0,450},{12,0,474},{12,0,505},{12,0,509},{ -12,0,533},{12,0,591},{12,0,594},{12,0,597},{12,0,621},{12,0,633},{12,0,642},{13, -0,59},{13,0,60},{13,0,145},{13,0,239},{13,0,250},{13,0,329},{13,0,344},{13,0,365 -},{13,0,372},{13,0,387},{13,0,403},{13,0,414},{13,0,456},{13,0,470},{13,0,478},{ -13,0,483},{13,0,489},{14,0,55},{14,0,57},{14,0,81},{14,0,90},{14,0,148},{14,0, -239},{14,0,266},{14,0,321},{14,0,326},{14,0,327},{14,0,330},{14,0,347},{14,0,355 -},{14,0,401},{14,0,404},{14,0,411},{14,0,414},{14,0,416},{14,0,420},{15,0,61},{ -15,0,74},{15,0,87},{15,0,88},{15,0,94},{15,0,96},{15,0,116},{15,0,149},{15,0,154 -},{16,0,50},{16,0,63},{16,0,73},{17,0,2},{17,0,66},{17,0,92},{17,0,103},{17,0, -112},{17,0,120},{18,0,50},{18,0,54},{18,0,82},{18,0,86},{18,0,90},{18,0,111},{18 -,0,115},{18,0,156},{19,0,40},{19,0,79},{20,0,78},{21,0,22},{135,11,883},{5,0,161 -},{135,0,839},{4,0,782},{13,11,293},{142,11,56},{133,11,617},{139,11,50},{135,10 -,22},{145,0,64},{5,10,639},{7,10,1249},{139,10,896},{138,0,998},{135,11,2042},{4 -,11,546},{142,11,233},{6,0,1043},{134,0,1574},{134,0,1496},{4,10,102},{7,10,815} -,{7,10,1699},{139,10,964},{12,0,781},{142,0,461},{4,11,313},{133,11,577},{6,0, -639},{6,0,1114},{137,0,817},{8,11,184},{141,11,433},{7,0,1814},{135,11,935},{10, -0,997},{140,0,958},{4,0,812},{137,11,625},{132,10,899},{136,10,795},{5,11,886},{ -6,11,46},{6,11,1790},{7,11,14},{7,11,732},{7,11,1654},{8,11,95},{8,11,327},{8,11 -,616},{10,11,598},{10,11,769},{11,11,134},{11,11,747},{12,11,378},{142,11,97},{ -136,0,139},{6,10,52},{9,10,104},{9,10,559},{12,10,308},{147,10,87},{133,11,1021} -,{132,10,604},{132,10,301},{136,10,779},{7,0,643},{136,0,236},{132,11,153},{134, -0,1172},{147,10,32},{133,11,798},{6,0,1338},{132,11,587},{6,11,598},{7,11,42},{8 -,11,695},{10,11,212},{11,11,158},{14,11,196},{145,11,85},{135,10,508},{5,11,957} -,{5,11,1008},{135,11,249},{4,11,129},{135,11,465},{5,0,54},{7,11,470},{7,11,1057 -},{7,11,1201},{9,11,755},{11,11,906},{140,11,527},{7,11,908},{146,11,7},{5,11, -148},{136,11,450},{144,11,1},{4,0,256},{135,0,1488},{9,0,351},{6,10,310},{7,10, -1849},{8,10,72},{8,10,272},{8,10,431},{9,10,12},{10,10,563},{10,10,630},{10,10, -796},{10,10,810},{11,10,367},{11,10,599},{11,10,686},{140,10,672},{6,0,1885},{6, -0,1898},{6,0,1899},{140,0,955},{4,0,714},{133,0,469},{6,0,1270},{134,0,1456},{ -132,0,744},{6,0,313},{7,10,537},{8,10,64},{9,10,127},{10,10,496},{12,10,510},{ -141,10,384},{4,11,217},{4,10,244},{5,11,710},{7,10,233},{7,11,1926},{9,11,428},{ -9,11,708},{10,11,254},{10,11,296},{10,11,720},{11,11,109},{11,11,255},{12,11,165 -},{12,11,315},{13,11,107},{13,11,203},{14,11,54},{14,11,99},{14,11,114},{14,11, -388},{16,11,85},{17,11,9},{17,11,33},{20,11,25},{20,11,28},{20,11,29},{21,11,9}, -{21,11,10},{21,11,34},{150,11,17},{138,0,402},{7,0,969},{146,0,55},{8,0,50},{137 -,0,624},{134,0,1355},{132,0,572},{134,10,1650},{10,10,702},{139,10,245},{10,0, -847},{142,0,445},{6,0,43},{7,0,38},{8,0,248},{138,0,513},{133,0,369},{137,10,338 -},{133,0,766},{133,0,363},{133,10,896},{8,11,392},{11,11,54},{13,11,173},{13,11, -294},{148,11,7},{134,0,678},{7,11,1230},{136,11,531},{6,0,258},{140,0,409},{5,0, -249},{148,0,82},{7,10,1117},{136,10,539},{5,0,393},{6,0,378},{7,0,1981},{9,0,32} -,{9,0,591},{10,0,685},{10,0,741},{142,0,382},{133,0,788},{134,0,1281},{134,0, -1295},{7,0,1968},{141,0,509},{4,0,61},{5,0,58},{5,0,171},{5,0,683},{6,0,291},{6, -0,566},{7,0,1650},{11,0,523},{12,0,273},{12,0,303},{15,0,39},{143,0,111},{6,0, -706},{134,0,1283},{134,0,589},{135,11,1433},{133,11,435},{7,0,1059},{13,0,54},{5 -,10,4},{5,10,810},{6,10,13},{6,10,538},{6,10,1690},{6,10,1726},{7,10,1819},{8,10 -,148},{8,10,696},{8,10,791},{12,10,125},{143,10,9},{135,10,1268},{5,11,85},{6,11 -,419},{7,11,134},{7,11,305},{7,11,361},{7,11,1337},{8,11,71},{140,11,519},{137,0 -,824},{140,11,688},{5,11,691},{7,11,345},{7,10,1385},{9,11,94},{11,10,582},{11, -10,650},{11,10,901},{11,10,949},{12,11,169},{12,10,232},{12,10,236},{13,10,413}, -{13,10,501},{146,10,116},{4,0,917},{133,0,1005},{7,0,1598},{5,11,183},{6,11,582} -,{9,11,344},{10,11,679},{140,11,435},{4,10,925},{5,10,803},{8,10,698},{138,10, -828},{132,0,919},{135,11,511},{139,10,992},{4,0,255},{5,0,302},{6,0,132},{7,0, -128},{7,0,283},{7,0,1299},{10,0,52},{10,0,514},{11,0,925},{13,0,92},{142,0,309}, -{134,0,1369},{135,10,1847},{134,0,328},{7,11,1993},{136,11,684},{133,10,383},{ -137,0,173},{134,11,583},{134,0,1411},{19,0,65},{5,11,704},{8,11,357},{10,11,745} -,{14,11,426},{17,11,94},{147,11,57},{9,10,660},{138,10,347},{4,11,179},{5,11,198 -},{133,11,697},{7,11,347},{7,11,971},{8,11,181},{138,11,711},{141,0,442},{11,0, -842},{11,0,924},{13,0,317},{13,0,370},{13,0,469},{13,0,471},{14,0,397},{18,0,69} -,{18,0,145},{7,10,572},{9,10,592},{11,10,680},{12,10,356},{140,10,550},{14,11,19 -},{14,11,28},{144,11,29},{136,0,534},{4,11,243},{5,11,203},{7,11,19},{7,11,71},{ -7,11,113},{10,11,405},{11,11,357},{142,11,240},{6,0,210},{10,0,845},{138,0,862}, -{7,11,1351},{9,11,581},{10,11,639},{11,11,453},{140,11,584},{7,11,1450},{139,11, -99},{10,0,892},{12,0,719},{144,0,105},{4,0,284},{6,0,223},{134,11,492},{5,11,134 -},{6,11,408},{6,11,495},{135,11,1593},{136,0,529},{137,0,807},{4,0,218},{7,0,526 -},{143,0,137},{6,0,1444},{142,11,4},{132,11,665},{4,0,270},{5,0,192},{6,0,332},{ -7,0,1322},{4,11,248},{7,11,137},{137,11,349},{140,0,661},{7,0,1517},{11,0,597},{ -14,0,76},{14,0,335},{20,0,33},{7,10,748},{139,10,700},{5,11,371},{135,11,563},{ -146,11,57},{133,10,127},{133,0,418},{4,11,374},{7,11,547},{7,11,1700},{7,11,1833 -},{139,11,858},{6,10,198},{140,10,83},{7,11,1812},{13,11,259},{13,11,356},{14,11 -,242},{147,11,114},{7,0,379},{8,0,481},{9,0,377},{5,10,276},{6,10,55},{135,10, -1369},{138,11,286},{5,0,1003},{6,0,149},{6,10,1752},{136,10,726},{8,0,262},{9,0, -627},{10,0,18},{11,0,214},{11,0,404},{11,0,457},{11,0,780},{11,0,913},{13,0,401} -,{14,0,200},{6,11,1647},{7,11,1552},{7,11,2010},{9,11,494},{137,11,509},{135,0, -742},{136,0,304},{132,0,142},{133,10,764},{6,10,309},{7,10,331},{138,10,550},{ -135,10,1062},{6,11,123},{7,11,214},{7,10,986},{9,11,728},{10,11,157},{11,11,346} -,{11,11,662},{143,11,106},{135,10,1573},{7,0,925},{137,0,799},{4,0,471},{5,0,51} -,{6,0,602},{8,0,484},{138,0,195},{136,0,688},{132,0,697},{6,0,1169},{6,0,1241},{ -6,10,194},{7,10,133},{10,10,493},{10,10,570},{139,10,664},{140,0,751},{7,0,929}, -{10,0,452},{11,0,878},{16,0,33},{5,10,24},{5,10,569},{6,10,3},{6,10,119},{6,10, -143},{6,10,440},{7,10,599},{7,10,1686},{7,10,1854},{8,10,424},{9,10,43},{9,10, -584},{9,10,760},{10,10,328},{11,10,159},{11,10,253},{12,10,487},{140,10,531},{4, -11,707},{13,11,106},{18,11,49},{147,11,41},{5,0,221},{5,11,588},{134,11,393},{ -134,0,1437},{6,11,211},{7,11,1690},{11,11,486},{140,11,369},{5,10,14},{5,10,892} -,{6,10,283},{7,10,234},{136,10,537},{4,0,988},{136,0,955},{135,0,1251},{4,10,126 -},{8,10,635},{147,10,34},{4,10,316},{135,10,1561},{137,10,861},{4,10,64},{5,10, -352},{5,10,720},{6,10,368},{139,10,359},{134,0,192},{4,0,132},{5,0,69},{135,0, -1242},{7,10,1577},{10,10,304},{10,10,549},{12,10,365},{13,10,220},{13,10,240},{ -142,10,33},{4,0,111},{7,0,865},{134,11,219},{5,11,582},{6,11,1646},{7,11,99},{7, -11,1962},{7,11,1986},{8,11,515},{8,11,773},{9,11,23},{9,11,491},{12,11,620},{14, -11,52},{145,11,50},{132,0,767},{7,11,568},{148,11,21},{6,0,42},{7,0,1416},{7,0, -2005},{8,0,131},{8,0,466},{9,0,672},{13,0,252},{20,0,103},{133,11,851},{135,0, -1050},{6,10,175},{137,10,289},{5,10,432},{133,10,913},{6,0,44},{136,0,368},{135, -11,784},{132,0,570},{133,0,120},{139,10,595},{140,0,29},{6,0,227},{135,0,1589},{ -4,11,98},{7,11,1365},{9,11,422},{9,11,670},{10,11,775},{11,11,210},{13,11,26},{ -13,11,457},{141,11,476},{140,10,80},{5,10,931},{134,10,1698},{133,0,522},{134,0, -1120},{135,0,1529},{12,0,739},{14,0,448},{142,0,467},{11,10,526},{11,10,939},{ -141,10,290},{5,10,774},{6,10,1637},{6,10,1686},{134,10,1751},{6,0,1667},{135,0, -2036},{7,10,1167},{11,10,934},{13,10,391},{145,10,76},{137,11,147},{6,10,260},{7 -,10,1484},{11,11,821},{12,11,110},{12,11,153},{18,11,41},{150,11,19},{6,0,511},{ -12,0,132},{134,10,573},{5,0,568},{6,0,138},{135,0,1293},{132,0,1020},{8,0,258},{ -9,0,208},{137,0,359},{4,0,565},{8,0,23},{136,0,827},{134,0,344},{4,0,922},{5,0, -1023},{13,11,477},{14,11,120},{148,11,61},{134,0,240},{5,11,209},{6,11,30},{11, -11,56},{139,11,305},{6,0,171},{7,0,1002},{7,0,1324},{9,0,415},{14,0,230},{18,0, -68},{4,10,292},{4,10,736},{5,10,871},{6,10,1689},{7,10,1944},{137,10,580},{9,11, -635},{139,11,559},{4,11,150},{5,11,303},{134,11,327},{6,10,63},{135,10,920},{133 -,10,793},{8,11,192},{10,11,78},{10,11,555},{11,11,308},{13,11,359},{147,11,95},{ -135,11,786},{135,11,1712},{136,0,402},{6,0,754},{6,11,1638},{7,11,79},{7,11,496} -,{9,11,138},{10,11,336},{11,11,12},{12,11,412},{12,11,440},{142,11,305},{4,0,716 -},{141,0,31},{133,0,982},{8,0,691},{8,0,731},{5,10,67},{6,10,62},{6,10,374},{135 -,10,1391},{9,10,790},{140,10,47},{139,11,556},{151,11,1},{7,11,204},{7,11,415},{ -8,11,42},{10,11,85},{11,11,33},{11,11,564},{12,11,571},{149,11,1},{8,0,888},{7, -11,610},{135,11,1501},{4,10,391},{135,10,1169},{5,0,847},{9,0,840},{138,0,803},{ -137,0,823},{134,0,785},{8,0,152},{9,0,53},{9,0,268},{9,0,901},{10,0,518},{10,0, -829},{11,0,188},{13,0,74},{14,0,46},{15,0,17},{15,0,33},{17,0,40},{18,0,36},{19, -0,20},{22,0,1},{152,0,2},{4,11,3},{5,11,247},{5,11,644},{7,11,744},{7,11,1207},{ -7,11,1225},{7,11,1909},{146,11,147},{136,0,532},{135,0,681},{132,10,271},{140,0, -314},{140,0,677},{4,0,684},{136,0,384},{5,11,285},{9,11,67},{13,11,473},{143,11, -82},{4,10,253},{5,10,544},{7,10,300},{137,10,340},{7,0,110},{7,0,447},{8,0,290}, -{8,0,591},{9,0,382},{9,0,649},{11,0,71},{11,0,155},{11,0,313},{12,0,5},{13,0,325 -},{142,0,287},{134,0,1818},{136,0,1007},{138,0,321},{7,0,360},{7,0,425},{9,0,66} -,{9,0,278},{138,0,644},{133,10,818},{5,0,385},{5,10,541},{6,10,94},{6,10,499},{7 -,10,230},{139,10,321},{4,10,920},{5,10,25},{5,10,790},{6,10,457},{7,10,853},{136 -,10,788},{4,0,900},{133,0,861},{5,0,254},{7,0,985},{136,0,73},{7,0,1959},{136,0, -683},{134,10,1765},{133,10,822},{132,10,634},{4,11,29},{6,11,532},{7,11,1628},{7 -,11,1648},{9,11,303},{9,11,350},{10,11,433},{11,11,97},{11,11,557},{11,11,745},{ -12,11,289},{12,11,335},{12,11,348},{12,11,606},{13,11,116},{13,11,233},{13,11, -466},{14,11,181},{14,11,209},{14,11,232},{14,11,236},{14,11,300},{16,11,41},{148 -,11,97},{19,0,86},{6,10,36},{7,10,658},{136,10,454},{135,11,1692},{132,0,725},{5 -,11,501},{7,11,1704},{9,11,553},{11,11,520},{12,11,557},{141,11,249},{134,0,196} -,{133,0,831},{136,0,723},{7,0,1897},{13,0,80},{13,0,437},{145,0,74},{4,0,992},{6 -,0,627},{136,0,994},{135,11,1294},{132,10,104},{5,0,848},{6,0,66},{136,0,764},{4 -,0,36},{7,0,1387},{10,0,205},{139,0,755},{6,0,1046},{134,0,1485},{134,0,950},{ -132,0,887},{14,0,450},{148,0,111},{7,0,620},{7,0,831},{9,10,542},{9,10,566},{138 -,10,728},{6,0,165},{138,0,388},{139,10,263},{4,0,719},{135,0,155},{138,10,468},{ -6,11,453},{144,11,36},{134,11,129},{5,0,533},{7,0,755},{138,0,780},{134,0,1465}, -{4,0,353},{6,0,146},{6,0,1789},{7,0,427},{7,0,990},{7,0,1348},{9,0,665},{9,0,898 -},{11,0,893},{142,0,212},{7,10,87},{142,10,288},{4,0,45},{135,0,1257},{12,0,7},{ -7,10,988},{7,10,1939},{9,10,64},{9,10,502},{12,10,34},{13,10,12},{13,10,234},{ -147,10,77},{4,0,607},{5,11,60},{6,11,504},{7,11,614},{7,11,1155},{140,11,0},{135 -,10,141},{8,11,198},{11,11,29},{140,11,534},{140,0,65},{136,0,816},{132,10,619}, -{139,0,88},{5,10,246},{8,10,189},{9,10,355},{9,10,512},{10,10,124},{10,10,453},{ -11,10,143},{11,10,416},{11,10,859},{141,10,341},{4,11,379},{135,11,1397},{4,0, -600},{137,0,621},{133,0,367},{134,0,561},{6,0,559},{134,0,1691},{6,0,585},{134, -11,585},{135,11,1228},{4,11,118},{5,10,678},{6,11,274},{6,11,361},{7,11,75},{141 -,11,441},{135,11,1818},{137,11,841},{5,0,573},{6,0,287},{7,10,862},{7,10,1886},{ -138,10,179},{132,10,517},{140,11,693},{5,11,314},{6,11,221},{7,11,419},{10,11, -650},{11,11,396},{12,11,156},{13,11,369},{14,11,333},{145,11,47},{140,10,540},{ -136,10,667},{11,10,403},{146,10,83},{6,0,672},{133,10,761},{9,0,157},{10,10,131} -,{140,10,72},{7,0,714},{134,11,460},{134,0,456},{133,0,925},{5,11,682},{135,11, -1887},{136,11,510},{136,11,475},{133,11,1016},{9,0,19},{7,11,602},{8,11,179},{10 -,11,781},{140,11,126},{6,11,329},{138,11,111},{6,0,822},{134,0,1473},{144,11,86} -,{11,0,113},{139,11,113},{5,11,821},{134,11,1687},{133,10,449},{7,0,463},{17,0, -69},{136,10,103},{7,10,2028},{138,10,641},{6,0,193},{7,0,240},{7,0,1682},{10,0, -51},{10,0,640},{11,0,410},{13,0,82},{14,0,247},{14,0,331},{142,0,377},{6,0,471}, -{11,0,411},{142,0,2},{5,11,71},{7,11,1407},{9,11,388},{9,11,704},{10,11,261},{10 -,11,619},{11,11,547},{11,11,619},{143,11,157},{136,0,633},{135,0,1148},{6,0,554} -,{7,0,1392},{12,0,129},{7,10,1274},{7,10,1386},{7,11,2008},{9,11,337},{10,11,517 -},{146,10,87},{7,0,803},{8,0,542},{6,10,187},{7,10,1203},{8,10,380},{14,10,117}, -{149,10,28},{6,10,297},{7,10,793},{139,10,938},{8,0,438},{11,0,363},{7,10,464},{ -11,10,105},{12,10,231},{14,10,386},{15,10,102},{148,10,75},{5,11,16},{6,11,86},{ -6,11,603},{7,11,292},{7,11,561},{8,11,257},{8,11,382},{9,11,721},{9,11,778},{11, -11,581},{140,11,466},{6,0,717},{4,11,486},{133,11,491},{132,0,875},{132,11,72},{ -6,11,265},{135,11,847},{4,0,237},{135,0,514},{6,0,392},{7,0,65},{135,0,2019},{ -140,11,261},{135,11,922},{137,11,404},{12,0,563},{14,0,101},{18,0,129},{7,10, -1010},{11,10,733},{11,10,759},{13,10,34},{146,10,45},{7,10,1656},{9,10,369},{10, -10,338},{10,10,490},{11,10,154},{11,10,545},{11,10,775},{13,10,77},{141,10,274}, -{4,0,444},{10,0,146},{140,0,9},{139,11,163},{7,0,1260},{135,0,1790},{9,0,222},{ -10,0,43},{139,0,900},{137,11,234},{138,0,971},{137,0,761},{134,0,699},{136,11, -434},{6,0,1116},{7,0,1366},{5,10,20},{6,11,197},{6,10,298},{7,10,659},{8,11,205} -,{137,10,219},{132,11,490},{11,11,820},{150,11,51},{7,10,1440},{11,10,854},{11, -10,872},{11,10,921},{12,10,551},{13,10,472},{142,10,367},{140,11,13},{132,0,829} -,{12,0,242},{132,10,439},{136,10,669},{6,0,593},{6,11,452},{7,11,312},{138,11, -219},{4,11,333},{9,11,176},{12,11,353},{141,11,187},{7,0,36},{8,0,201},{136,0, -605},{140,0,224},{132,10,233},{134,0,1430},{134,0,1806},{4,0,523},{133,0,638},{6 -,0,1889},{9,0,958},{9,0,971},{9,0,976},{12,0,796},{12,0,799},{12,0,808},{12,0, -835},{12,0,836},{12,0,914},{12,0,946},{15,0,216},{15,0,232},{18,0,183},{18,0,187 -},{18,0,194},{18,0,212},{18,0,232},{149,0,49},{132,10,482},{6,0,827},{134,0,1434 -},{135,10,346},{134,0,2043},{6,0,242},{7,0,227},{7,0,1581},{8,0,104},{9,0,113},{ -9,0,220},{9,0,427},{10,0,136},{10,0,239},{11,0,579},{11,0,1023},{13,0,4},{13,0, -204},{13,0,316},{148,0,86},{134,11,1685},{7,0,148},{8,0,284},{141,0,63},{142,0, -10},{135,11,584},{134,0,1249},{7,0,861},{135,10,334},{5,10,795},{6,10,1741},{137 -,11,70},{132,0,807},{7,11,135},{8,11,7},{8,11,62},{9,11,243},{10,11,658},{10,11, -697},{11,11,456},{139,11,756},{9,11,395},{138,11,79},{137,11,108},{147,0,94},{ -136,0,494},{135,11,631},{135,10,622},{7,0,1510},{135,10,1750},{4,10,203},{135,10 -,1936},{7,11,406},{7,11,459},{8,11,606},{139,11,726},{7,0,1306},{8,0,505},{9,0, -482},{10,0,126},{11,0,225},{12,0,347},{12,0,449},{13,0,19},{14,0,218},{142,0,435 -},{5,0,268},{10,0,764},{12,0,120},{13,0,39},{145,0,127},{142,11,68},{11,10,678}, -{140,10,307},{12,11,268},{12,11,640},{142,11,119},{135,10,2044},{133,11,612},{4, -11,372},{7,11,482},{8,11,158},{9,11,602},{9,11,615},{10,11,245},{10,11,678},{10, -11,744},{11,11,248},{139,11,806},{7,10,311},{9,10,308},{140,10,255},{4,0,384},{ -135,0,1022},{5,11,854},{135,11,1991},{135,10,1266},{4,10,400},{5,10,267},{135,10 -,232},{135,0,1703},{9,0,159},{11,0,661},{140,0,603},{4,0,964},{14,0,438},{14,0, -444},{14,0,456},{22,0,60},{22,0,63},{9,11,106},{9,11,163},{9,11,296},{10,11,167} -,{10,11,172},{10,11,777},{139,11,16},{136,0,583},{132,0,515},{8,0,632},{8,0,697} -,{137,0,854},{5,11,195},{135,11,1685},{6,0,1123},{134,0,1365},{134,11,328},{7,11 -,1997},{8,11,730},{139,11,1006},{4,0,136},{133,0,551},{134,0,1782},{7,0,1287},{9 -,0,44},{10,0,552},{10,0,642},{11,0,839},{12,0,274},{12,0,275},{12,0,372},{13,0, -91},{142,0,125},{5,11,751},{11,11,797},{140,11,203},{133,0,732},{7,0,679},{8,0, -313},{4,10,100},{135,11,821},{10,0,361},{142,0,316},{134,0,595},{6,0,147},{7,0, -886},{9,0,753},{138,0,268},{5,10,362},{5,10,443},{6,10,318},{7,10,1019},{139,10, -623},{5,10,463},{136,10,296},{4,10,454},{5,11,950},{5,11,994},{134,11,351},{138, -0,137},{5,10,48},{5,10,404},{6,10,557},{7,10,458},{8,10,597},{10,10,455},{10,10, -606},{11,10,49},{11,10,548},{12,10,476},{13,10,18},{141,10,450},{133,0,414},{135 -,0,1762},{5,11,421},{135,11,47},{5,10,442},{135,10,1984},{134,0,599},{134,0,1749 -},{134,0,1627},{4,0,488},{132,11,350},{137,11,751},{132,0,83},{140,0,676},{133, -11,967},{7,0,1639},{5,10,55},{140,10,161},{4,11,473},{7,11,623},{8,11,808},{9,11 -,871},{9,11,893},{11,11,38},{11,11,431},{12,11,112},{12,11,217},{12,11,243},{12, -11,562},{12,11,683},{13,11,141},{13,11,197},{13,11,227},{13,11,406},{13,11,487}, -{14,11,156},{14,11,203},{14,11,224},{14,11,256},{18,11,58},{150,11,0},{133,10, -450},{7,11,736},{139,11,264},{134,0,278},{4,11,222},{7,11,286},{136,11,629},{135 -,10,869},{140,0,97},{144,0,14},{134,0,1085},{4,10,213},{7,10,223},{136,10,80},{7 -,0,388},{7,0,644},{139,0,781},{132,0,849},{7,0,229},{8,0,59},{9,0,190},{10,0,378 -},{140,0,191},{7,10,381},{7,10,806},{7,10,820},{8,10,354},{8,10,437},{8,10,787}, -{9,10,657},{10,10,58},{10,10,339},{10,10,749},{11,10,914},{12,10,162},{13,10,75} -,{14,10,106},{14,10,198},{14,10,320},{14,10,413},{146,10,43},{141,11,306},{136, -10,747},{134,0,1115},{16,0,94},{16,0,108},{136,11,146},{6,0,700},{6,0,817},{134, -0,1002},{133,10,692},{4,11,465},{135,11,1663},{134,10,191},{6,0,1414},{135,11, -913},{132,0,660},{7,0,1035},{138,0,737},{6,10,162},{7,10,1960},{136,10,831},{132 -,10,706},{7,0,690},{9,0,217},{9,0,587},{140,0,521},{138,10,426},{135,10,1235},{6 -,11,82},{7,11,138},{7,11,517},{9,11,673},{139,11,238},{138,0,272},{5,11,495},{7, -11,834},{9,11,733},{139,11,378},{134,0,1744},{132,0,1011},{7,11,828},{142,11,116 -},{4,0,733},{9,0,194},{10,0,92},{11,0,198},{12,0,84},{13,0,128},{133,11,559},{10 -,0,57},{10,0,277},{6,11,21},{6,11,1737},{7,11,1444},{136,11,224},{4,10,204},{137 -,10,902},{136,10,833},{11,0,348},{12,0,99},{18,0,1},{18,0,11},{19,0,4},{7,10,366 -},{9,10,287},{12,10,199},{12,10,556},{140,10,577},{6,0,1981},{136,0,936},{21,0, -33},{150,0,40},{5,11,519},{138,11,204},{5,10,356},{135,10,224},{134,0,775},{135, -0,306},{7,10,630},{9,10,567},{11,10,150},{11,10,444},{141,10,119},{5,0,979},{134 -,10,539},{133,0,611},{4,11,402},{135,11,1679},{5,0,178},{7,11,2},{8,11,323},{136 -,11,479},{5,11,59},{135,11,672},{4,0,1010},{6,0,1969},{138,11,237},{133,11,412}, -{146,11,34},{7,11,1740},{146,11,48},{134,0,664},{139,10,814},{4,11,85},{135,11, -549},{133,11,94},{133,11,457},{132,0,390},{134,0,1510},{4,10,235},{135,10,255},{ -4,10,194},{5,10,584},{6,11,11},{6,10,384},{7,11,187},{7,10,583},{10,10,761},{11, -10,760},{139,10,851},{4,11,522},{139,11,802},{135,0,493},{10,11,776},{13,11,345} -,{142,11,425},{146,0,37},{4,11,52},{135,11,661},{134,0,724},{134,0,829},{133,11, -520},{133,10,562},{4,11,281},{5,11,38},{7,11,194},{7,11,668},{7,11,1893},{137,11 -,397},{5,10,191},{137,10,271},{7,0,1537},{14,0,96},{143,0,73},{5,0,473},{11,0, -168},{4,10,470},{6,10,153},{7,10,1503},{7,10,1923},{10,10,701},{11,10,132},{11, -10,227},{11,10,320},{11,10,436},{11,10,525},{11,10,855},{12,10,41},{12,10,286},{ -13,10,103},{13,10,284},{14,10,255},{14,10,262},{15,10,117},{143,10,127},{133,0, -105},{5,0,438},{9,0,694},{12,0,627},{141,0,210},{133,10,327},{6,10,552},{7,10, -1754},{137,10,604},{134,0,1256},{152,0,11},{5,11,448},{11,11,98},{139,11,524},{7 -,0,1626},{5,10,80},{6,10,405},{7,10,403},{7,10,1502},{8,10,456},{9,10,487},{9,10 -,853},{9,10,889},{10,10,309},{11,10,721},{11,10,994},{12,10,430},{13,10,165},{14 -,11,16},{146,11,44},{132,0,779},{8,0,25},{138,0,826},{4,10,453},{5,10,887},{6,10 -,535},{8,10,6},{8,10,543},{136,10,826},{137,11,461},{140,11,632},{132,0,308},{ -135,0,741},{132,0,671},{7,0,150},{8,0,649},{136,0,1020},{9,0,99},{6,11,336},{8, -11,552},{9,11,285},{10,11,99},{139,11,568},{134,0,521},{5,0,339},{14,0,3},{15,0, -41},{15,0,166},{147,0,66},{6,11,423},{7,11,665},{7,11,1210},{9,11,218},{141,11, -222},{6,0,543},{5,10,101},{5,11,256},{6,10,88},{7,10,1677},{9,10,100},{10,10,677 -},{14,10,169},{14,10,302},{14,10,313},{15,10,48},{143,10,84},{4,10,310},{7,10, -708},{7,10,996},{9,10,795},{10,10,390},{10,10,733},{11,10,451},{12,10,249},{14, -10,115},{14,10,286},{143,10,100},{133,10,587},{13,11,417},{14,11,129},{143,11,15 -},{134,0,1358},{136,11,554},{132,10,498},{7,10,217},{8,10,140},{138,10,610},{135 -,11,989},{135,11,634},{6,0,155},{140,0,234},{135,11,462},{132,11,618},{134,0, -1628},{132,0,766},{4,11,339},{5,10,905},{135,11,259},{135,0,829},{4,11,759},{141 -,11,169},{7,0,1445},{4,10,456},{7,10,358},{7,10,1637},{8,10,643},{139,10,483},{5 -,0,486},{135,0,1349},{5,11,688},{135,11,712},{7,0,1635},{8,0,17},{10,0,217},{10, -0,295},{12,0,2},{140,11,2},{138,0,558},{150,10,56},{4,11,278},{5,11,465},{135,11 -,1367},{136,11,482},{133,10,535},{6,0,1362},{6,0,1461},{10,11,274},{10,11,625},{ -139,11,530},{5,0,599},{5,11,336},{6,11,341},{6,11,478},{6,11,1763},{136,11,386}, -{7,10,1748},{137,11,151},{134,0,1376},{133,10,539},{135,11,73},{135,11,1971},{ -139,11,283},{9,0,93},{139,0,474},{6,10,91},{135,10,435},{6,0,447},{5,11,396},{ -134,11,501},{4,10,16},{5,10,316},{5,10,842},{6,10,370},{6,10,1778},{8,10,166},{ -11,10,812},{12,10,206},{12,10,351},{14,10,418},{16,10,15},{16,10,34},{18,10,3},{ -19,10,3},{19,10,7},{20,10,4},{149,10,21},{7,0,577},{7,0,1432},{9,0,475},{9,0,505 -},{9,0,526},{9,0,609},{9,0,689},{9,0,726},{9,0,735},{9,0,738},{10,0,556},{10,0, -674},{10,0,684},{11,0,89},{11,0,202},{11,0,272},{11,0,380},{11,0,415},{11,0,505} -,{11,0,537},{11,0,550},{11,0,562},{11,0,640},{11,0,667},{11,0,688},{11,0,847},{ -11,0,927},{11,0,930},{11,0,940},{12,0,144},{12,0,325},{12,0,329},{12,0,389},{12, -0,403},{12,0,451},{12,0,515},{12,0,604},{12,0,616},{12,0,626},{13,0,66},{13,0, -131},{13,0,167},{13,0,236},{13,0,368},{13,0,411},{13,0,434},{13,0,453},{13,0,461 -},{13,0,474},{14,0,59},{14,0,60},{14,0,139},{14,0,152},{14,0,276},{14,0,353},{14 -,0,402},{15,0,28},{15,0,81},{15,0,123},{15,0,152},{18,0,136},{148,0,88},{4,11, -929},{133,11,799},{136,11,46},{142,0,307},{4,0,609},{7,0,756},{9,0,544},{11,0, -413},{144,0,25},{10,0,687},{7,10,619},{10,10,547},{11,10,122},{140,10,601},{4,0, -930},{133,0,947},{133,0,939},{142,0,21},{4,11,892},{133,11,770},{133,0,962},{5,0 -,651},{8,0,170},{9,0,61},{9,0,63},{10,0,23},{10,0,37},{10,0,834},{11,0,4},{11,0, -187},{11,0,281},{11,0,503},{11,0,677},{12,0,96},{12,0,130},{12,0,244},{14,0,5},{ -14,0,40},{14,0,162},{14,0,202},{146,0,133},{4,0,406},{5,0,579},{12,0,492},{150,0 -,15},{135,11,158},{135,0,597},{132,0,981},{132,10,888},{4,10,149},{138,10,368},{ -132,0,545},{4,10,154},{7,10,1134},{136,10,105},{135,11,2001},{134,0,1558},{4,10, -31},{6,10,429},{7,10,962},{9,10,458},{139,10,691},{132,10,312},{135,10,1642},{6, -0,17},{6,0,1304},{7,0,16},{7,0,1001},{9,0,886},{10,0,489},{10,0,800},{11,0,782}, -{12,0,320},{13,0,467},{14,0,145},{14,0,387},{143,0,119},{135,0,1982},{17,0,17},{ -7,11,1461},{140,11,91},{4,10,236},{132,11,602},{138,0,907},{136,0,110},{7,0,272} -,{19,0,53},{5,10,836},{5,10,857},{134,10,1680},{5,0,458},{7,11,1218},{136,11,303 -},{7,0,1983},{8,0,0},{8,0,171},{9,0,120},{9,0,732},{10,0,473},{11,0,656},{11,0, -998},{18,0,0},{18,0,2},{19,0,21},{10,10,68},{139,10,494},{137,11,662},{4,11,13}, -{5,11,567},{7,11,1498},{9,11,124},{11,11,521},{140,11,405},{4,10,81},{139,10,867 -},{135,11,1006},{7,11,800},{7,11,1783},{138,11,12},{9,0,295},{10,0,443},{5,10, -282},{8,10,650},{137,10,907},{132,11,735},{4,11,170},{4,10,775},{135,11,323},{6, -0,1844},{10,0,924},{11,11,844},{12,11,104},{140,11,625},{5,11,304},{7,11,1403},{ -140,11,498},{134,0,1232},{4,0,519},{10,0,70},{12,0,26},{14,0,17},{14,0,178},{15, -0,34},{149,0,12},{132,0,993},{4,11,148},{133,11,742},{6,0,31},{7,0,491},{7,0,530 -},{8,0,592},{11,0,53},{11,0,779},{12,0,167},{12,0,411},{14,0,14},{14,0,136},{15, -0,72},{16,0,17},{144,0,72},{133,0,907},{134,0,733},{133,11,111},{4,10,71},{5,10, -376},{7,10,119},{138,10,665},{136,0,55},{8,0,430},{136,11,430},{4,0,208},{5,0, -106},{6,0,531},{8,0,408},{9,0,188},{138,0,572},{12,0,56},{11,10,827},{14,10,34}, -{143,10,148},{134,0,1693},{133,11,444},{132,10,479},{140,0,441},{9,0,449},{10,0, -192},{138,0,740},{134,0,928},{4,0,241},{7,10,607},{136,10,99},{8,11,123},{15,11, -6},{144,11,7},{6,11,285},{8,11,654},{11,11,749},{12,11,190},{12,11,327},{13,11, -120},{13,11,121},{13,11,327},{15,11,47},{146,11,40},{4,10,41},{5,10,74},{7,10, -1627},{11,10,871},{140,10,619},{7,0,1525},{11,10,329},{11,10,965},{12,10,241},{ -14,10,354},{15,10,22},{148,10,63},{132,0,259},{135,11,183},{9,10,209},{137,10, -300},{5,11,937},{135,11,100},{133,10,98},{4,0,173},{5,0,312},{5,0,512},{135,0, -1285},{141,0,185},{7,0,1603},{7,0,1691},{9,0,464},{11,0,195},{12,0,279},{12,0, -448},{14,0,11},{147,0,102},{135,0,1113},{133,10,984},{4,0,452},{5,0,583},{135,0, -720},{4,0,547},{5,0,817},{6,0,433},{7,0,593},{7,0,1378},{8,0,161},{9,0,284},{10, -0,313},{139,0,886},{8,0,722},{4,10,182},{6,10,205},{135,10,220},{150,0,13},{4,10 -,42},{9,10,205},{9,10,786},{138,10,659},{6,0,289},{7,0,1670},{12,0,57},{151,0,4} -,{132,10,635},{14,0,43},{146,0,21},{139,10,533},{135,0,1694},{8,0,420},{139,0, -193},{135,0,409},{132,10,371},{4,10,272},{135,10,836},{5,10,825},{134,10,1640},{ -5,11,251},{5,11,956},{8,11,268},{9,11,214},{146,11,142},{138,0,308},{6,0,1863},{ -141,11,37},{137,10,879},{7,10,317},{135,10,569},{132,11,294},{134,0,790},{5,0, -1002},{136,0,745},{5,11,346},{5,11,711},{136,11,390},{135,0,289},{5,0,504},{11,0 -,68},{137,10,307},{4,0,239},{6,0,477},{7,0,1607},{139,0,617},{149,0,13},{133,0, -609},{133,11,624},{5,11,783},{7,11,1998},{135,11,2047},{133,10,525},{132,0,367}, -{132,11,594},{6,0,528},{133,10,493},{4,10,174},{135,10,911},{8,10,417},{137,10, -782},{132,0,694},{7,0,548},{137,0,58},{4,10,32},{5,10,215},{6,10,269},{7,10,1782 -},{7,10,1892},{10,10,16},{11,10,822},{11,10,954},{141,10,481},{140,0,687},{7,0, -1749},{136,10,477},{132,11,569},{133,10,308},{135,10,1088},{4,0,661},{138,0,1004 -},{5,11,37},{6,11,39},{6,11,451},{7,11,218},{7,11,667},{7,11,1166},{7,11,1687},{ -8,11,662},{144,11,2},{9,0,445},{12,0,53},{13,0,492},{5,10,126},{8,10,297},{9,10, -366},{140,10,374},{7,10,1551},{139,10,361},{148,0,74},{134,11,508},{135,0,213},{ -132,10,175},{132,10,685},{6,0,760},{6,0,834},{134,0,1248},{7,11,453},{7,11,635}, -{7,11,796},{8,11,331},{9,11,328},{9,11,330},{9,11,865},{10,11,119},{10,11,235},{ -11,11,111},{11,11,129},{11,11,240},{12,11,31},{12,11,66},{12,11,222},{12,11,269} -,{12,11,599},{12,11,689},{13,11,186},{13,11,364},{142,11,345},{7,0,1672},{139,0, -189},{133,10,797},{133,10,565},{6,0,1548},{6,11,98},{7,11,585},{135,11,702},{9,0 -,968},{15,0,192},{149,0,56},{4,10,252},{6,11,37},{7,11,299},{7,10,1068},{7,11, -1666},{8,11,195},{8,11,316},{9,11,178},{9,11,276},{9,11,339},{9,11,536},{10,11, -102},{10,11,362},{10,10,434},{10,11,785},{11,11,55},{11,11,149},{11,10,228},{11, -10,426},{11,11,773},{13,10,231},{13,11,416},{13,11,419},{14,11,38},{14,11,41},{ -14,11,210},{18,10,106},{148,10,87},{4,0,751},{11,0,390},{140,0,32},{4,0,409},{ -133,0,78},{11,11,458},{12,11,15},{140,11,432},{7,0,1602},{10,0,257},{10,0,698},{ -11,0,544},{11,0,585},{12,0,212},{13,0,307},{5,10,231},{7,10,601},{9,10,277},{9, -10,674},{10,10,178},{10,10,418},{10,10,509},{11,10,531},{12,10,113},{12,10,475}, -{13,10,99},{142,10,428},{6,0,473},{145,0,105},{6,0,1949},{15,0,156},{133,11,645} -,{7,10,1591},{144,10,43},{135,0,1779},{135,10,1683},{4,11,290},{135,11,1356},{ -134,0,763},{6,11,70},{7,11,1292},{10,11,762},{139,11,288},{142,0,29},{140,11,428 -},{7,0,883},{7,11,131},{7,11,422},{8,11,210},{140,11,573},{134,0,488},{4,10,399} -,{5,10,119},{5,10,494},{7,10,751},{137,10,556},{133,0,617},{132,11,936},{139,0, -50},{7,0,1518},{139,0,694},{137,0,785},{4,0,546},{135,0,2042},{7,11,716},{13,11, -97},{141,11,251},{132,11,653},{145,0,22},{134,0,1016},{4,0,313},{133,0,577},{136 -,11,657},{8,0,184},{141,0,433},{135,0,935},{6,0,720},{9,0,114},{146,11,80},{12,0 -,186},{12,0,292},{14,0,100},{18,0,70},{7,10,594},{7,10,851},{7,10,1858},{9,10, -411},{9,10,574},{9,10,666},{9,10,737},{10,10,346},{10,10,712},{11,10,246},{11,10 -,432},{11,10,517},{11,10,647},{11,10,679},{11,10,727},{12,10,304},{12,10,305},{ -12,10,323},{12,10,483},{12,10,572},{12,10,593},{12,10,602},{13,10,95},{13,10,101 -},{13,10,171},{13,10,315},{13,10,378},{13,10,425},{13,10,475},{14,10,63},{14,10, -380},{14,10,384},{15,10,133},{18,10,112},{148,10,72},{135,10,1093},{135,11,1836} -,{132,10,679},{137,10,203},{11,0,402},{12,0,109},{12,0,431},{13,0,179},{13,0,206 -},{14,0,217},{16,0,3},{148,0,53},{7,11,1368},{8,11,232},{8,11,361},{10,11,682},{ -138,11,742},{137,10,714},{5,0,886},{6,0,46},{6,0,1790},{7,0,14},{7,0,732},{7,0, -1654},{8,0,95},{8,0,327},{8,0,616},{9,0,892},{10,0,598},{10,0,769},{11,0,134},{ -11,0,747},{12,0,378},{14,0,97},{137,11,534},{4,0,969},{136,10,825},{137,11,27},{ -6,0,727},{142,11,12},{133,0,1021},{134,0,1190},{134,11,1657},{5,10,143},{5,10, -769},{6,10,1760},{7,10,682},{7,10,1992},{136,10,736},{132,0,153},{135,11,127},{ -133,0,798},{132,0,587},{6,0,598},{7,0,42},{8,0,695},{10,0,212},{11,0,158},{14,0, -196},{145,0,85},{133,10,860},{6,0,1929},{134,0,1933},{5,0,957},{5,0,1008},{9,0, -577},{12,0,141},{6,10,422},{7,10,0},{7,10,1544},{8,11,364},{11,10,990},{12,10, -453},{13,10,47},{141,10,266},{134,0,1319},{4,0,129},{135,0,465},{7,0,470},{7,0, -1057},{7,0,1201},{9,0,755},{11,0,906},{140,0,527},{7,0,908},{146,0,7},{5,0,148}, -{136,0,450},{5,10,515},{137,10,131},{7,10,1605},{11,10,962},{146,10,139},{132,10 -,646},{134,0,1166},{4,10,396},{7,10,728},{9,10,117},{13,10,202},{148,10,51},{6, -10,121},{6,10,124},{6,10,357},{7,10,1138},{7,10,1295},{8,10,162},{139,10,655},{ -14,0,374},{142,11,374},{138,0,253},{139,0,1003},{5,11,909},{9,11,849},{138,11, -805},{133,10,237},{7,11,525},{7,11,1579},{8,11,497},{136,11,573},{137,0,46},{132 -,0,879},{134,0,806},{135,0,1868},{6,0,1837},{134,0,1846},{6,0,730},{134,0,881},{ -7,0,965},{7,0,1460},{7,0,1604},{7,11,193},{7,11,397},{7,11,1105},{8,11,124},{8, -11,619},{9,11,305},{10,11,264},{11,11,40},{12,11,349},{13,11,134},{13,11,295},{ -14,11,155},{15,11,120},{146,11,105},{136,0,506},{143,0,10},{4,11,262},{7,11,342} -,{7,10,571},{7,10,1877},{10,10,366},{141,11,23},{133,11,641},{10,0,22},{9,10,513 -},{10,10,39},{12,10,122},{140,10,187},{135,11,1431},{150,11,49},{4,11,99},{6,11, -250},{6,11,346},{8,11,127},{138,11,81},{6,0,2014},{8,0,928},{10,0,960},{10,0,979 -},{140,0,996},{134,0,296},{132,11,915},{5,11,75},{9,11,517},{10,11,470},{12,11, -155},{141,11,224},{137,10,873},{4,0,854},{140,11,18},{134,0,587},{7,10,107},{7, -10,838},{8,10,550},{138,10,401},{11,0,636},{15,0,145},{17,0,34},{19,0,50},{23,0, -20},{11,10,588},{11,10,864},{11,10,968},{143,10,160},{135,11,216},{7,0,982},{10, -0,32},{143,0,56},{133,10,768},{133,11,954},{6,11,304},{7,11,1114},{8,11,418},{10 -,11,345},{11,11,341},{11,11,675},{141,11,40},{9,11,410},{139,11,425},{136,0,941} -,{5,0,435},{132,10,894},{5,0,85},{6,0,419},{7,0,134},{7,0,305},{7,0,361},{7,0, -1337},{8,0,71},{140,0,519},{140,0,688},{135,0,740},{5,0,691},{7,0,345},{9,0,94}, -{140,0,169},{5,0,183},{6,0,582},{10,0,679},{140,0,435},{134,11,14},{6,0,945},{ -135,0,511},{134,11,1708},{5,11,113},{6,11,243},{7,11,1865},{11,11,161},{16,11,37 -},{145,11,99},{132,11,274},{137,0,539},{7,0,1993},{8,0,684},{134,10,272},{6,0, -659},{134,0,982},{4,10,9},{5,10,128},{7,10,368},{11,10,480},{148,10,3},{134,0, -583},{132,0,803},{133,0,704},{4,0,179},{5,0,198},{133,0,697},{7,0,347},{7,0,971} -,{8,0,181},{10,0,711},{135,11,166},{136,10,682},{4,10,2},{7,10,545},{7,10,894},{ -136,11,521},{135,0,481},{132,0,243},{5,0,203},{7,0,19},{7,0,71},{7,0,113},{10,0, -405},{11,0,357},{142,0,240},{5,11,725},{5,11,727},{135,11,1811},{6,0,826},{137, -11,304},{7,0,1450},{139,0,99},{133,11,654},{134,0,492},{5,0,134},{6,0,408},{6,0, -495},{7,0,1593},{6,11,273},{10,11,188},{13,11,377},{146,11,77},{9,10,769},{140, -10,185},{135,11,410},{142,0,4},{4,0,665},{134,11,1785},{4,0,248},{7,0,137},{137, -0,349},{5,10,530},{142,10,113},{7,0,1270},{139,0,612},{132,11,780},{5,0,371},{ -135,0,563},{135,0,826},{6,0,1535},{23,0,21},{151,0,23},{4,0,374},{7,0,547},{7,0, -1700},{7,0,1833},{139,0,858},{133,10,556},{7,11,612},{8,11,545},{8,11,568},{8,11 -,642},{9,11,717},{10,11,541},{10,11,763},{11,11,449},{12,11,489},{13,11,153},{13 -,11,296},{14,11,138},{14,11,392},{15,11,50},{16,11,6},{16,11,12},{148,11,9},{9,0 -,311},{141,0,42},{8,10,16},{140,10,568},{6,0,1968},{6,0,2027},{138,0,991},{6,0, -1647},{7,0,1552},{7,0,2010},{9,0,494},{137,0,509},{133,11,948},{6,10,186},{137, -10,426},{134,0,769},{134,0,642},{132,10,585},{6,0,123},{7,0,214},{9,0,728},{10,0 -,157},{11,0,346},{11,0,662},{143,0,106},{142,11,381},{135,0,1435},{4,11,532},{5, -11,706},{135,11,662},{5,11,837},{134,11,1651},{4,10,93},{5,10,252},{6,10,229},{7 -,10,291},{9,10,550},{139,10,644},{148,0,79},{137,10,749},{134,0,1425},{137,10, -162},{4,11,362},{7,11,52},{7,11,303},{140,11,166},{132,10,381},{4,11,330},{7,11, -933},{7,11,2012},{136,11,292},{135,11,767},{4,0,707},{5,0,588},{6,0,393},{13,0, -106},{18,0,49},{147,0,41},{6,0,211},{7,0,1690},{11,0,486},{140,0,369},{137,11, -883},{4,11,703},{135,11,207},{4,0,187},{5,0,184},{5,0,690},{7,0,1869},{10,0,756} -,{139,0,783},{132,11,571},{134,0,1382},{5,0,175},{6,10,77},{6,10,157},{7,10,974} -,{7,10,1301},{7,10,1339},{7,10,1490},{7,10,1873},{137,10,628},{134,0,1493},{5,11 -,873},{133,11,960},{134,0,1007},{12,11,93},{12,11,501},{13,11,362},{14,11,151},{ -15,11,40},{15,11,59},{16,11,46},{17,11,25},{18,11,14},{18,11,134},{19,11,25},{19 -,11,69},{20,11,16},{20,11,19},{20,11,66},{21,11,23},{21,11,25},{150,11,42},{11, -10,919},{141,10,409},{134,0,219},{5,0,582},{6,0,1646},{7,0,99},{7,0,1962},{7,0, -1986},{8,0,515},{8,0,773},{9,0,23},{9,0,491},{12,0,620},{142,0,93},{133,0,851},{ -5,11,33},{134,11,470},{135,11,1291},{134,0,1278},{135,11,1882},{135,10,1489},{ -132,0,1000},{138,0,982},{8,0,762},{8,0,812},{137,0,910},{6,11,47},{7,11,90},{7, -11,664},{7,11,830},{7,11,1380},{7,11,2025},{8,11,448},{136,11,828},{4,0,98},{4,0 -,940},{6,0,1819},{6,0,1834},{6,0,1841},{7,0,1365},{8,0,859},{8,0,897},{8,0,918}, -{9,0,422},{9,0,670},{10,0,775},{10,0,894},{10,0,909},{10,0,910},{10,0,935},{11,0 -,210},{12,0,750},{12,0,755},{13,0,26},{13,0,457},{13,0,476},{16,0,100},{16,0,109 -},{18,0,173},{18,0,175},{8,10,398},{9,10,681},{139,10,632},{9,11,417},{137,11, -493},{136,10,645},{138,0,906},{134,0,1730},{134,10,20},{133,11,1019},{134,0,1185 -},{10,0,40},{136,10,769},{9,0,147},{134,11,208},{140,0,650},{5,0,209},{6,0,30},{ -11,0,56},{139,0,305},{132,0,553},{138,11,344},{6,11,68},{7,11,398},{7,11,448},{7 -,11,1629},{7,11,1813},{8,11,387},{8,11,442},{9,11,710},{10,11,282},{138,11,722}, -{5,0,597},{14,0,20},{142,11,20},{135,0,1614},{135,10,1757},{4,0,150},{5,0,303},{ -6,0,327},{135,10,937},{16,0,49},{7,10,1652},{144,11,49},{8,0,192},{10,0,78},{141 -,0,359},{135,0,786},{143,0,134},{6,0,1638},{7,0,79},{7,0,496},{9,0,138},{10,0, -336},{11,0,12},{12,0,412},{12,0,440},{142,0,305},{136,11,491},{4,10,579},{5,10, -226},{5,10,323},{135,10,960},{7,0,204},{7,0,415},{8,0,42},{10,0,85},{139,0,564}, -{132,0,614},{4,11,403},{5,11,441},{7,11,450},{11,11,101},{12,11,193},{141,11,430 -},{135,11,1927},{135,11,1330},{4,0,3},{5,0,247},{5,0,644},{7,0,744},{7,0,1207},{ -7,0,1225},{7,0,1909},{146,0,147},{136,0,942},{4,0,1019},{134,0,2023},{5,11,679}, -{133,10,973},{5,0,285},{9,0,67},{13,0,473},{143,0,82},{7,11,328},{137,11,326},{ -151,0,8},{6,10,135},{135,10,1176},{135,11,1128},{134,0,1309},{135,11,1796},{135, -10,314},{4,11,574},{7,11,350},{7,11,1024},{8,11,338},{9,11,677},{10,11,808},{139 -,11,508},{7,11,818},{17,11,14},{17,11,45},{18,11,75},{148,11,18},{146,10,4},{135 -,11,1081},{4,0,29},{6,0,532},{7,0,1628},{7,0,1648},{9,0,350},{10,0,433},{11,0,97 -},{11,0,557},{11,0,745},{12,0,289},{12,0,335},{12,0,348},{12,0,606},{13,0,116},{ -13,0,233},{13,0,466},{14,0,181},{14,0,209},{14,0,232},{14,0,236},{14,0,300},{16, -0,41},{148,0,97},{7,0,318},{6,10,281},{8,10,282},{8,10,480},{8,10,499},{9,10,198 -},{10,10,143},{10,10,169},{10,10,211},{10,10,417},{10,10,574},{11,10,147},{11,10 -,395},{12,10,75},{12,10,407},{12,10,608},{13,10,500},{142,10,251},{135,11,1676}, -{135,11,2037},{135,0,1692},{5,0,501},{7,0,1704},{9,0,553},{11,0,520},{12,0,557}, -{141,0,249},{6,0,1527},{14,0,324},{15,0,55},{15,0,80},{14,11,324},{15,11,55},{ -143,11,80},{135,10,1776},{8,0,988},{137,11,297},{132,10,419},{142,0,223},{139,11 -,234},{7,0,1123},{12,0,508},{14,0,102},{14,0,226},{144,0,57},{4,10,138},{7,10, -1012},{7,10,1280},{137,10,76},{7,0,1764},{5,10,29},{140,10,638},{134,0,2015},{ -134,0,1599},{138,11,56},{6,11,306},{7,11,1140},{7,11,1340},{8,11,133},{138,11, -449},{139,11,1011},{6,10,1710},{135,10,2038},{7,11,1763},{140,11,310},{6,0,129}, -{4,10,17},{5,10,23},{7,10,995},{11,10,383},{11,10,437},{12,10,460},{140,10,532}, -{5,11,329},{136,11,260},{133,10,862},{132,0,534},{6,0,811},{135,0,626},{132,11, -657},{4,0,25},{5,0,60},{6,0,504},{7,0,614},{7,0,1155},{12,0,0},{152,11,7},{7,0, -1248},{11,0,621},{139,0,702},{137,0,321},{8,10,70},{12,10,171},{141,10,272},{10, -10,233},{139,10,76},{4,0,379},{7,0,1397},{134,10,442},{5,11,66},{7,11,1896},{136 -,11,288},{134,11,1643},{134,10,1709},{4,11,21},{5,11,91},{5,11,570},{5,11,648},{ -5,11,750},{5,11,781},{6,11,54},{6,11,112},{6,11,402},{6,11,1732},{7,11,315},{7, -11,749},{7,11,1347},{7,11,1900},{9,11,78},{9,11,508},{10,11,611},{11,11,510},{11 -,11,728},{13,11,36},{14,11,39},{16,11,83},{17,11,124},{148,11,30},{4,0,118},{6,0 -,274},{6,0,361},{7,0,75},{141,0,441},{10,11,322},{10,11,719},{139,11,407},{147, -10,119},{12,11,549},{14,11,67},{147,11,60},{11,10,69},{12,10,105},{12,10,117},{ -13,10,213},{14,10,13},{14,10,62},{14,10,177},{14,10,421},{15,10,19},{146,10,141} -,{9,0,841},{137,10,309},{7,10,608},{7,10,976},{8,11,125},{8,11,369},{8,11,524},{ -9,10,146},{10,10,206},{10,11,486},{10,10,596},{11,11,13},{11,11,381},{11,11,736} -,{11,11,766},{11,11,845},{13,11,114},{13,10,218},{13,11,292},{14,11,47},{142,10, -153},{12,0,693},{135,11,759},{5,0,314},{6,0,221},{7,0,419},{10,0,650},{11,0,396} -,{12,0,156},{13,0,369},{14,0,333},{145,0,47},{6,11,1684},{6,11,1731},{7,11,356}, -{7,11,1932},{8,11,54},{8,11,221},{9,11,225},{9,11,356},{10,11,77},{10,11,446},{ -10,11,731},{12,11,404},{141,11,491},{132,11,375},{4,10,518},{135,10,1136},{4,0, -913},{4,11,411},{11,11,643},{140,11,115},{4,11,80},{133,11,44},{8,10,689},{137, -10,863},{138,0,880},{4,10,18},{7,10,145},{7,10,444},{7,10,1278},{8,10,49},{8,10, -400},{9,10,71},{9,10,250},{10,10,459},{12,10,160},{144,10,24},{136,0,475},{5,0, -1016},{5,11,299},{135,11,1083},{7,0,602},{8,0,179},{10,0,781},{140,0,126},{6,0, -329},{138,0,111},{135,0,1864},{4,11,219},{7,11,1761},{137,11,86},{6,0,1888},{6,0 -,1892},{6,0,1901},{6,0,1904},{9,0,953},{9,0,985},{9,0,991},{9,0,1001},{12,0,818} -,{12,0,846},{12,0,847},{12,0,861},{12,0,862},{12,0,873},{12,0,875},{12,0,877},{ -12,0,879},{12,0,881},{12,0,884},{12,0,903},{12,0,915},{12,0,926},{12,0,939},{15, -0,182},{15,0,219},{15,0,255},{18,0,191},{18,0,209},{18,0,211},{149,0,41},{5,11, -328},{135,11,918},{137,0,780},{12,0,82},{143,0,36},{133,10,1010},{5,0,821},{134, -0,1687},{133,11,514},{132,0,956},{134,0,1180},{10,0,112},{5,10,87},{7,10,313},{7 -,10,1103},{10,10,582},{11,10,389},{11,10,813},{12,10,385},{13,10,286},{14,10,124 -},{146,10,108},{5,0,71},{7,0,1407},{9,0,704},{10,0,261},{10,0,619},{11,0,547},{ -11,0,619},{143,0,157},{4,0,531},{5,0,455},{5,11,301},{6,11,571},{14,11,49},{146, -11,102},{132,10,267},{6,0,385},{7,0,2008},{9,0,337},{138,0,517},{133,11,726},{ -133,11,364},{4,11,76},{7,11,1550},{9,11,306},{9,11,430},{9,11,663},{10,11,683},{ -11,11,427},{11,11,753},{12,11,334},{12,11,442},{14,11,258},{14,11,366},{143,11, -131},{6,0,1865},{6,0,1879},{6,0,1881},{6,0,1894},{6,0,1908},{9,0,915},{9,0,926}, -{9,0,940},{9,0,943},{9,0,966},{9,0,980},{9,0,989},{9,0,1005},{9,0,1010},{12,0, -813},{12,0,817},{12,0,840},{12,0,843},{12,0,855},{12,0,864},{12,0,871},{12,0,872 -},{12,0,899},{12,0,905},{12,0,924},{15,0,171},{15,0,181},{15,0,224},{15,0,235},{ -15,0,251},{146,0,184},{137,11,52},{5,0,16},{6,0,86},{6,0,603},{7,0,292},{7,0,561 -},{8,0,257},{8,0,382},{9,0,721},{9,0,778},{11,0,581},{140,0,466},{4,0,486},{5,0, -491},{135,10,1121},{4,0,72},{6,0,265},{135,0,1300},{135,11,1183},{10,10,249},{ -139,10,209},{132,10,561},{137,11,519},{4,11,656},{4,10,760},{135,11,779},{9,10, -154},{140,10,485},{135,11,1793},{135,11,144},{136,10,255},{133,0,621},{4,10,368} -,{135,10,641},{135,11,1373},{7,11,554},{7,11,605},{141,11,10},{137,0,234},{5,0, -815},{6,0,1688},{134,0,1755},{5,11,838},{5,11,841},{134,11,1649},{7,0,1987},{7,0 -,2040},{136,0,743},{133,11,1012},{6,0,197},{136,0,205},{6,0,314},{134,11,314},{ -144,11,53},{6,11,251},{7,11,365},{7,11,1357},{7,11,1497},{8,11,154},{141,11,281} -,{133,11,340},{6,0,452},{7,0,312},{138,0,219},{138,0,589},{4,0,333},{9,0,176},{ -12,0,353},{141,0,187},{9,10,92},{147,10,91},{134,0,1110},{11,0,47},{139,11,495}, -{6,10,525},{8,10,806},{9,10,876},{140,10,284},{8,11,261},{9,11,144},{9,11,466},{ -10,11,370},{12,11,470},{13,11,144},{142,11,348},{137,11,897},{8,0,863},{8,0,864} -,{8,0,868},{8,0,884},{10,0,866},{10,0,868},{10,0,873},{10,0,911},{10,0,912},{10, -0,944},{12,0,727},{6,11,248},{9,11,546},{10,11,535},{11,11,681},{141,11,135},{6, -0,300},{135,0,1515},{134,0,1237},{139,10,958},{133,10,594},{140,11,250},{134,0, -1685},{134,11,567},{7,0,135},{8,0,7},{8,0,62},{9,0,243},{10,0,658},{10,0,697},{ -11,0,456},{139,0,756},{9,0,395},{138,0,79},{6,10,1641},{136,10,820},{4,10,302},{ -135,10,1766},{134,11,174},{135,10,1313},{135,0,631},{134,10,1674},{134,11,395},{ -138,0,835},{7,0,406},{7,0,459},{8,0,606},{139,0,726},{134,11,617},{134,0,979},{6 -,10,389},{7,10,149},{9,10,142},{138,10,94},{5,11,878},{133,11,972},{6,10,8},{7, -10,1881},{8,10,91},{136,11,511},{133,0,612},{132,11,351},{4,0,372},{7,0,482},{8, -0,158},{9,0,602},{9,0,615},{10,0,245},{10,0,678},{10,0,744},{11,0,248},{139,0, -806},{5,0,854},{135,0,1991},{132,11,286},{135,11,344},{7,11,438},{7,11,627},{7, -11,1516},{8,11,40},{9,11,56},{9,11,294},{10,11,30},{10,11,259},{11,11,969},{146, -11,148},{135,0,1492},{5,11,259},{7,11,414},{7,11,854},{142,11,107},{135,10,1746} -,{6,0,833},{134,0,998},{135,10,24},{6,0,750},{135,0,1739},{4,10,503},{135,10, -1661},{5,10,130},{7,10,1314},{9,10,610},{10,10,718},{11,10,601},{11,10,819},{11, -10,946},{140,10,536},{10,10,149},{11,10,280},{142,10,336},{132,11,738},{135,10, -1946},{5,0,195},{135,0,1685},{7,0,1997},{8,0,730},{139,0,1006},{151,11,17},{133, -11,866},{14,0,463},{14,0,470},{150,0,61},{5,0,751},{8,0,266},{11,0,578},{4,10, -392},{135,10,1597},{5,10,433},{9,10,633},{139,10,629},{135,0,821},{6,0,715},{134 -,0,1325},{133,11,116},{6,0,868},{132,11,457},{134,0,959},{6,10,234},{138,11,199} -,{7,0,1053},{7,10,1950},{8,10,680},{11,10,817},{147,10,88},{7,10,1222},{138,10, -386},{5,0,950},{5,0,994},{6,0,351},{134,0,1124},{134,0,1081},{7,0,1595},{6,10,5} -,{11,10,249},{12,10,313},{16,10,66},{145,10,26},{148,0,59},{5,11,527},{6,11,189} -,{135,11,859},{5,10,963},{6,10,1773},{11,11,104},{11,11,554},{15,11,60},{143,11, -125},{135,0,47},{137,0,684},{134,11,116},{134,0,1606},{134,0,777},{7,0,1020},{8, -10,509},{136,10,792},{135,0,1094},{132,0,350},{133,11,487},{4,11,86},{5,11,667}, -{5,11,753},{6,11,316},{6,11,455},{135,11,946},{7,0,1812},{13,0,259},{13,0,356},{ -14,0,242},{147,0,114},{132,10,931},{133,0,967},{4,0,473},{7,0,623},{8,0,808},{9, -0,871},{9,0,893},{11,0,38},{11,0,431},{12,0,112},{12,0,217},{12,0,243},{12,0,562 -},{12,0,663},{12,0,683},{13,0,141},{13,0,197},{13,0,227},{13,0,406},{13,0,487},{ -14,0,156},{14,0,203},{14,0,224},{14,0,256},{18,0,58},{150,0,0},{138,0,286},{7,10 -,943},{139,10,614},{135,10,1837},{150,11,45},{132,0,798},{4,0,222},{7,0,286},{ -136,0,629},{4,11,79},{7,11,1773},{10,11,450},{11,11,589},{13,11,332},{13,11,493} -,{14,11,183},{14,11,334},{14,11,362},{14,11,368},{14,11,376},{14,11,379},{19,11, -90},{19,11,103},{19,11,127},{148,11,90},{5,0,337},{11,0,513},{11,0,889},{11,0, -961},{12,0,461},{13,0,79},{15,0,121},{4,10,90},{5,10,545},{7,10,754},{9,10,186}, -{10,10,72},{10,10,782},{11,10,577},{11,10,610},{12,10,354},{12,10,362},{140,10, -595},{141,0,306},{136,0,146},{7,0,1646},{9,10,329},{11,10,254},{141,11,124},{4,0 -,465},{135,0,1663},{132,0,525},{133,11,663},{10,0,299},{18,0,74},{9,10,187},{11, -10,1016},{145,10,44},{7,0,165},{7,0,919},{4,10,506},{136,10,517},{5,10,295},{135 -,10,1680},{133,11,846},{134,0,1064},{5,11,378},{7,11,1402},{7,11,1414},{8,11,465 -},{9,11,286},{10,11,185},{10,11,562},{10,11,635},{11,11,31},{11,11,393},{12,11, -456},{13,11,312},{18,11,65},{18,11,96},{147,11,89},{132,0,596},{7,10,987},{9,10, -688},{10,10,522},{11,10,788},{140,10,566},{6,0,82},{7,0,138},{7,0,517},{7,0,1741 -},{11,0,238},{4,11,648},{134,10,1775},{7,0,1233},{7,10,700},{7,10,940},{8,10,514 -},{9,10,116},{9,10,535},{10,10,118},{11,10,107},{11,10,148},{11,10,922},{12,10, -254},{12,10,421},{142,10,238},{4,0,962},{6,0,1824},{8,0,894},{12,0,708},{12,0, -725},{14,0,451},{20,0,94},{22,0,59},{150,0,62},{5,11,945},{6,11,1656},{6,11,1787 -},{7,11,167},{8,11,824},{9,11,391},{10,11,375},{139,11,185},{5,0,495},{7,0,834}, -{9,0,733},{139,0,378},{4,10,743},{135,11,1273},{6,0,1204},{7,11,1645},{8,11,352} -,{137,11,249},{139,10,292},{133,0,559},{132,11,152},{9,0,499},{10,0,341},{15,0, -144},{19,0,49},{7,10,1283},{9,10,227},{11,10,325},{11,10,408},{14,10,180},{146, -10,47},{6,0,21},{6,0,1737},{7,0,1444},{136,0,224},{133,11,1006},{7,0,1446},{9,0, -97},{17,0,15},{5,10,81},{7,10,146},{7,10,1342},{8,10,53},{8,10,561},{8,10,694},{ -8,10,754},{9,10,115},{9,10,894},{10,10,462},{10,10,813},{11,10,230},{11,10,657}, -{11,10,699},{11,10,748},{12,10,119},{12,10,200},{12,10,283},{142,10,273},{5,10, -408},{137,10,747},{135,11,431},{135,11,832},{6,0,729},{134,0,953},{4,0,727},{8,0 -,565},{5,11,351},{7,11,264},{136,11,565},{134,0,1948},{5,0,519},{5,11,40},{7,11, -598},{7,11,1638},{8,11,78},{9,11,166},{9,11,640},{9,11,685},{9,11,773},{11,11, -215},{13,11,65},{14,11,172},{14,11,317},{145,11,6},{8,11,60},{9,11,343},{139,11, -769},{137,11,455},{134,0,1193},{140,0,790},{7,11,1951},{8,11,765},{8,11,772},{ -140,11,671},{7,11,108},{8,11,219},{8,11,388},{9,11,639},{9,11,775},{11,11,275},{ -140,11,464},{132,11,468},{7,10,30},{8,10,86},{8,10,315},{8,10,700},{9,10,576},{9 -,10,858},{11,10,310},{11,10,888},{11,10,904},{12,10,361},{141,10,248},{5,11,15}, -{6,11,56},{7,11,1758},{8,11,500},{9,11,730},{11,11,331},{13,11,150},{142,11,282} -,{4,0,402},{7,0,2},{8,0,323},{136,0,479},{138,10,839},{11,0,580},{142,0,201},{5, -0,59},{135,0,672},{137,10,617},{146,0,34},{134,11,1886},{4,0,961},{136,0,896},{6 -,0,1285},{5,11,205},{6,11,438},{137,11,711},{134,10,428},{7,10,524},{8,10,169},{ -8,10,234},{9,10,480},{138,10,646},{148,0,46},{141,0,479},{133,11,534},{6,0,2019} -,{134,10,1648},{4,0,85},{7,0,549},{7,10,1205},{138,10,637},{4,0,663},{5,0,94},{7 -,11,235},{7,11,1475},{15,11,68},{146,11,120},{6,11,443},{9,11,237},{9,11,571},{9 -,11,695},{10,11,139},{11,11,715},{12,11,417},{141,11,421},{132,0,783},{4,0,682}, -{8,0,65},{9,10,39},{10,10,166},{11,10,918},{12,10,635},{20,10,10},{22,10,27},{22 -,10,43},{150,10,52},{6,0,11},{135,0,187},{132,0,522},{4,0,52},{135,0,661},{4,0, -383},{133,0,520},{135,11,546},{11,0,343},{142,0,127},{4,11,578},{7,10,157},{7,11 -,624},{7,11,916},{8,10,279},{10,11,256},{11,11,87},{139,11,703},{134,10,604},{4, -0,281},{5,0,38},{7,0,194},{7,0,668},{7,0,1893},{137,0,397},{7,10,945},{11,10,713 -},{139,10,744},{139,10,1022},{9,0,635},{139,0,559},{5,11,923},{7,11,490},{12,11, -553},{13,11,100},{14,11,118},{143,11,75},{132,0,975},{132,10,567},{137,10,859},{ -7,10,1846},{7,11,1846},{8,10,628},{136,11,628},{148,0,116},{138,11,750},{14,0,51 -},{14,11,51},{15,11,7},{148,11,20},{132,0,858},{134,0,1075},{4,11,924},{133,10, -762},{136,0,535},{133,0,448},{10,10,784},{141,10,191},{133,10,298},{7,0,610},{ -135,0,1501},{7,10,633},{7,10,905},{7,10,909},{7,10,1538},{9,10,767},{140,10,636} -,{4,11,265},{7,11,807},{135,11,950},{5,11,93},{12,11,267},{144,11,26},{136,0,191 -},{139,10,301},{135,10,1970},{135,0,267},{4,0,319},{5,0,699},{138,0,673},{6,0, -336},{7,0,92},{7,0,182},{8,0,453},{8,0,552},{9,0,204},{9,0,285},{10,0,99},{11,0, -568},{11,0,950},{12,0,94},{16,0,20},{16,0,70},{19,0,55},{12,10,644},{144,10,90}, -{6,0,551},{7,0,1308},{7,10,845},{7,11,994},{8,10,160},{137,10,318},{19,11,1},{19 -,11,26},{150,11,9},{7,0,1406},{9,0,218},{141,0,222},{5,0,256},{138,0,69},{5,11, -233},{5,11,320},{6,11,140},{7,11,330},{136,11,295},{6,0,1980},{136,0,952},{4,0, -833},{137,11,678},{133,11,978},{4,11,905},{6,11,1701},{137,11,843},{138,10,735}, -{136,10,76},{17,0,39},{148,0,36},{18,0,81},{146,11,81},{14,0,352},{17,0,53},{18, -0,146},{18,0,152},{19,0,11},{150,0,54},{135,0,634},{138,10,841},{132,0,618},{4,0 -,339},{7,0,259},{17,0,73},{4,11,275},{140,11,376},{132,11,509},{7,11,273},{139, -11,377},{4,0,759},{13,0,169},{137,10,804},{6,10,96},{135,10,1426},{4,10,651},{ -133,10,289},{7,0,1075},{8,10,35},{9,10,511},{10,10,767},{147,10,118},{6,0,649},{ -6,0,670},{136,0,482},{5,0,336},{6,0,341},{6,0,478},{6,0,1763},{136,0,386},{5,11, -802},{7,11,2021},{8,11,805},{14,11,94},{15,11,65},{16,11,4},{16,11,77},{16,11,80 -},{145,11,5},{6,0,1035},{5,11,167},{5,11,899},{6,11,410},{137,11,777},{134,11, -1705},{5,0,924},{133,0,969},{132,10,704},{135,0,73},{135,11,10},{135,10,1078},{5 -,11,11},{6,11,117},{6,11,485},{7,11,1133},{9,11,582},{9,11,594},{11,11,21},{11, -11,818},{12,11,535},{141,11,86},{135,0,1971},{4,11,264},{7,11,1067},{8,11,204},{ -8,11,385},{139,11,953},{6,0,1458},{135,0,1344},{5,0,396},{134,0,501},{4,10,720}, -{133,10,306},{4,0,929},{5,0,799},{8,0,46},{8,0,740},{133,10,431},{7,11,646},{7, -11,1730},{11,11,446},{141,11,178},{7,0,276},{5,10,464},{6,10,236},{7,10,696},{7, -10,914},{7,10,1108},{7,10,1448},{9,10,15},{9,10,564},{10,10,14},{12,10,565},{13, -10,449},{14,10,53},{15,10,13},{16,10,64},{145,10,41},{4,0,892},{133,0,770},{6,10 -,1767},{12,10,194},{145,10,107},{135,0,158},{5,10,840},{138,11,608},{134,0,1432} -,{138,11,250},{8,11,794},{9,11,400},{10,11,298},{142,11,228},{151,0,25},{7,11, -1131},{135,11,1468},{135,0,2001},{9,10,642},{11,10,236},{142,10,193},{4,10,68},{ -5,10,634},{6,10,386},{7,10,794},{8,10,273},{9,10,563},{10,10,105},{10,10,171},{ -11,10,94},{139,10,354},{136,11,724},{132,0,478},{11,11,512},{13,11,205},{19,11, -30},{22,11,36},{151,11,19},{7,0,1461},{140,0,91},{6,11,190},{7,11,768},{135,11, -1170},{4,0,602},{8,0,211},{4,10,95},{7,10,416},{139,10,830},{7,10,731},{13,10,20 -},{143,10,11},{6,0,1068},{135,0,1872},{4,0,13},{5,0,567},{7,0,1498},{9,0,124},{ -11,0,521},{12,0,405},{135,11,1023},{135,0,1006},{132,0,735},{138,0,812},{4,0,170 -},{135,0,323},{6,11,137},{9,11,75},{9,11,253},{10,11,194},{138,11,444},{5,0,304} -,{7,0,1403},{5,10,864},{10,10,648},{11,10,671},{143,10,46},{135,11,1180},{133,10 -,928},{4,0,148},{133,0,742},{11,10,986},{140,10,682},{133,0,523},{135,11,1743},{ -7,0,730},{18,0,144},{19,0,61},{8,10,44},{9,10,884},{10,10,580},{11,10,399},{11, -10,894},{143,10,122},{5,11,760},{7,11,542},{8,11,135},{136,11,496},{136,0,981},{ -133,0,111},{10,0,132},{11,0,191},{11,0,358},{139,0,460},{7,11,319},{7,11,355},{7 -,11,763},{10,11,389},{145,11,43},{134,0,890},{134,0,1420},{136,11,557},{133,10, -518},{133,0,444},{135,0,1787},{135,10,1852},{8,0,123},{15,0,6},{144,0,7},{6,0, -2041},{10,11,38},{139,11,784},{136,0,932},{5,0,937},{135,0,100},{6,0,995},{4,11, -58},{5,11,286},{6,11,319},{7,11,402},{7,11,1254},{7,11,1903},{8,11,356},{140,11, -408},{4,11,389},{9,11,181},{9,11,255},{10,11,8},{10,11,29},{10,11,816},{11,11, -311},{11,11,561},{12,11,67},{141,11,181},{138,0,255},{5,0,138},{4,10,934},{136, -10,610},{4,0,965},{10,0,863},{138,0,898},{10,10,804},{138,10,832},{12,0,631},{8, -10,96},{9,10,36},{10,10,607},{11,10,423},{11,10,442},{12,10,309},{14,10,199},{15 -,10,90},{145,10,110},{134,0,1394},{4,0,652},{8,0,320},{22,0,6},{22,0,16},{9,10, -13},{9,10,398},{9,10,727},{10,10,75},{10,10,184},{10,10,230},{10,10,564},{10,10, -569},{11,10,973},{12,10,70},{12,10,189},{13,10,57},{141,10,257},{6,0,897},{134,0 -,1333},{4,0,692},{133,0,321},{133,11,373},{135,0,922},{5,0,619},{133,0,698},{137 -,10,631},{5,10,345},{135,10,1016},{9,0,957},{9,0,1018},{12,0,828},{12,0,844},{12 -,0,897},{12,0,901},{12,0,943},{15,0,180},{18,0,197},{18,0,200},{18,0,213},{18,0, -214},{146,0,226},{5,0,917},{134,0,1659},{135,0,1100},{134,0,1173},{134,0,1930},{ -5,0,251},{5,0,956},{8,0,268},{9,0,214},{146,0,142},{133,10,673},{137,10,850},{4, -10,287},{133,10,1018},{132,11,672},{5,0,346},{5,0,711},{8,0,390},{11,11,752},{ -139,11,885},{5,10,34},{10,10,724},{12,10,444},{13,10,354},{18,10,32},{23,10,24}, -{23,10,31},{152,10,5},{4,11,710},{134,11,606},{134,0,744},{134,10,382},{133,11, -145},{4,10,329},{7,11,884},{140,11,124},{4,11,467},{5,11,405},{134,11,544},{9,10 -,846},{138,10,827},{133,0,624},{9,11,372},{15,11,2},{19,11,10},{147,11,18},{4,11 -,387},{135,11,1288},{5,0,783},{7,0,1998},{135,0,2047},{132,10,906},{136,10,366}, -{135,11,550},{4,10,123},{4,10,649},{5,10,605},{7,10,1509},{136,10,36},{134,0, -1125},{132,0,594},{133,10,767},{135,11,1227},{136,11,467},{4,11,576},{135,11, -1263},{4,0,268},{7,0,1534},{135,11,1534},{4,10,273},{5,10,658},{5,11,919},{5,10, -995},{134,11,1673},{133,0,563},{134,10,72},{135,10,1345},{4,11,82},{5,11,333},{5 -,11,904},{6,11,207},{7,11,325},{7,11,1726},{8,11,101},{10,11,778},{139,11,220},{ -5,0,37},{6,0,39},{6,0,451},{7,0,218},{7,0,667},{7,0,1166},{7,0,1687},{8,0,662},{ -16,0,2},{133,10,589},{134,0,1332},{133,11,903},{134,0,508},{5,10,117},{6,10,514} -,{6,10,541},{7,10,1164},{7,10,1436},{8,10,220},{8,10,648},{10,10,688},{11,10,560 -},{140,11,147},{6,11,555},{135,11,485},{133,10,686},{7,0,453},{7,0,635},{7,0,796 -},{8,0,331},{9,0,330},{9,0,865},{10,0,119},{10,0,235},{11,0,111},{11,0,129},{11, -0,240},{12,0,31},{12,0,66},{12,0,222},{12,0,269},{12,0,599},{12,0,684},{12,0,689 -},{12,0,691},{142,0,345},{135,0,1834},{4,11,705},{7,11,615},{138,11,251},{136,11 -,345},{137,0,527},{6,0,98},{7,0,702},{135,0,991},{11,0,576},{14,0,74},{7,10,196} -,{10,10,765},{11,10,347},{11,10,552},{11,10,790},{12,10,263},{13,10,246},{13,10, -270},{13,10,395},{14,10,176},{14,10,190},{14,10,398},{14,10,412},{15,10,32},{15, -10,63},{16,10,88},{147,10,105},{134,11,90},{13,0,84},{141,0,122},{6,0,37},{7,0, -299},{7,0,1666},{8,0,195},{8,0,316},{9,0,178},{9,0,276},{9,0,339},{9,0,536},{10, -0,102},{10,0,362},{10,0,785},{11,0,55},{11,0,149},{11,0,773},{13,0,416},{13,0, -419},{14,0,38},{14,0,41},{142,0,210},{5,10,381},{135,10,1792},{7,11,813},{12,11, -497},{141,11,56},{7,10,616},{138,10,413},{133,0,645},{6,11,125},{135,11,1277},{ -132,0,290},{6,0,70},{7,0,1292},{10,0,762},{139,0,288},{6,10,120},{7,10,1188},{7, -10,1710},{8,10,286},{9,10,667},{11,10,592},{139,10,730},{135,11,1784},{7,0,1315} -,{135,11,1315},{134,0,1955},{135,10,1146},{7,0,131},{7,0,422},{8,0,210},{140,0, -573},{4,10,352},{135,10,687},{139,0,797},{143,0,38},{14,0,179},{15,0,151},{150,0 -,11},{7,0,488},{4,10,192},{5,10,49},{6,10,200},{6,10,293},{134,10,1696},{132,0, -936},{135,11,703},{6,11,160},{7,11,1106},{9,11,770},{10,11,618},{11,11,112},{140 -,11,413},{5,0,453},{134,0,441},{135,0,595},{132,10,650},{132,10,147},{6,0,991},{ -6,0,1182},{12,11,271},{145,11,109},{133,10,934},{140,11,221},{132,0,653},{7,0, -505},{135,0,523},{134,0,903},{135,11,479},{7,11,304},{9,11,646},{9,11,862},{10, -11,262},{11,11,696},{12,11,208},{15,11,79},{147,11,108},{146,0,80},{135,11,981}, -{142,0,432},{132,0,314},{137,11,152},{7,0,1368},{8,0,232},{8,0,361},{10,0,682},{ -138,0,742},{135,11,1586},{9,0,534},{4,11,434},{11,11,663},{12,11,210},{13,11,166 -},{13,11,310},{14,11,373},{147,11,43},{7,11,1091},{135,11,1765},{6,11,550},{135, -11,652},{137,0,27},{142,0,12},{4,10,637},{5,11,553},{7,11,766},{138,11,824},{7, -11,737},{8,11,298},{136,11,452},{7,0,736},{139,0,264},{134,0,1657},{133,11,292}, -{138,11,135},{6,0,844},{134,0,1117},{135,0,127},{9,10,867},{138,10,837},{6,0, -1184},{134,0,1208},{134,0,1294},{136,0,364},{6,0,1415},{7,0,1334},{11,0,125},{6, -10,170},{7,11,393},{8,10,395},{8,10,487},{10,11,603},{11,11,206},{141,10,147},{ -137,11,748},{4,11,912},{137,11,232},{4,10,535},{136,10,618},{137,0,792},{7,11, -1973},{136,11,716},{135,11,98},{5,0,909},{9,0,849},{138,0,805},{4,0,630},{132,0, -699},{5,11,733},{14,11,103},{150,10,23},{12,11,158},{18,11,8},{19,11,62},{20,11, -6},{22,11,4},{23,11,2},{151,11,9},{132,0,968},{132,10,778},{132,10,46},{5,10,811 -},{6,10,1679},{6,10,1714},{135,10,2032},{6,0,1446},{7,10,1458},{9,10,407},{139, -10,15},{7,0,206},{7,0,397},{7,0,621},{7,0,640},{8,0,124},{8,0,619},{9,0,305},{9, -0,643},{10,0,264},{10,0,628},{11,0,40},{12,0,349},{13,0,134},{13,0,295},{14,0, -155},{15,0,120},{18,0,105},{6,10,34},{7,10,1089},{8,10,708},{8,10,721},{9,10,363 -},{148,10,98},{4,0,262},{5,0,641},{135,0,342},{137,11,72},{4,0,99},{6,0,250},{6, -0,346},{8,0,127},{138,0,81},{132,0,915},{5,0,75},{9,0,517},{10,0,470},{12,0,155} -,{141,0,224},{132,10,462},{11,11,600},{11,11,670},{141,11,245},{142,0,83},{5,10, -73},{6,10,23},{134,10,338},{6,0,1031},{139,11,923},{7,11,164},{7,11,1571},{9,11, -107},{140,11,225},{134,0,1470},{133,0,954},{6,0,304},{8,0,418},{10,0,345},{11,0, -341},{139,0,675},{9,0,410},{139,0,425},{4,11,27},{5,11,484},{5,11,510},{6,11,434 -},{7,11,1000},{7,11,1098},{8,11,2},{136,11,200},{134,0,734},{140,11,257},{7,10, -725},{8,10,498},{139,10,268},{134,0,1822},{135,0,1798},{135,10,773},{132,11,460} -,{4,11,932},{133,11,891},{134,0,14},{132,10,583},{7,10,1462},{8,11,625},{139,10, -659},{5,0,113},{6,0,243},{6,0,1708},{7,0,1865},{11,0,161},{16,0,37},{17,0,99},{ -133,10,220},{134,11,76},{5,11,461},{135,11,1925},{140,0,69},{8,11,92},{137,11, -221},{139,10,803},{132,10,544},{4,0,274},{134,0,922},{132,0,541},{5,0,627},{6,10 -,437},{6,10,564},{11,10,181},{141,10,183},{135,10,1192},{7,0,166},{132,11,763},{ -133,11,253},{134,0,849},{9,11,73},{10,11,110},{14,11,185},{145,11,119},{5,11,212 -},{12,11,35},{141,11,382},{133,0,717},{137,0,304},{136,0,600},{133,0,654},{6,0, -273},{10,0,188},{13,0,377},{146,0,77},{4,10,790},{5,10,273},{134,10,394},{132,0, -543},{135,0,410},{11,0,98},{11,0,524},{141,0,87},{132,0,941},{135,11,1175},{4,0, -250},{7,0,1612},{11,0,186},{12,0,133},{6,10,127},{7,10,1511},{8,10,613},{12,10, -495},{12,10,586},{12,10,660},{12,10,668},{14,10,385},{15,10,118},{17,10,20},{146 -,10,98},{6,0,1785},{133,11,816},{134,0,1339},{7,0,961},{7,0,1085},{7,0,1727},{8, -0,462},{6,10,230},{135,11,1727},{9,0,636},{135,10,1954},{132,0,780},{5,11,869},{ -5,11,968},{6,11,1626},{8,11,734},{136,11,784},{4,11,542},{6,11,1716},{6,11,1727} -,{7,11,1082},{7,11,1545},{8,11,56},{8,11,118},{8,11,412},{8,11,564},{9,11,888},{ -9,11,908},{10,11,50},{10,11,423},{11,11,685},{11,11,697},{11,11,933},{12,11,299} -,{13,11,126},{13,11,136},{13,11,170},{141,11,190},{134,11,226},{4,11,232},{9,11, -202},{10,11,474},{140,11,433},{137,11,500},{5,0,529},{136,10,68},{132,10,654},{4 -,10,156},{7,10,998},{7,10,1045},{7,10,1860},{9,10,48},{9,10,692},{11,10,419},{ -139,10,602},{7,0,1276},{8,0,474},{9,0,652},{6,11,108},{7,11,1003},{7,11,1181},{ -136,11,343},{7,11,1264},{7,11,1678},{11,11,945},{12,11,341},{12,11,471},{140,11, -569},{134,11,1712},{5,0,948},{12,0,468},{19,0,96},{148,0,24},{4,11,133},{7,11, -711},{7,11,1298},{7,11,1585},{135,11,1929},{6,0,753},{140,0,657},{139,0,941},{6, -11,99},{7,11,1808},{145,11,57},{6,11,574},{7,11,428},{7,11,1250},{10,11,669},{11 -,11,485},{11,11,840},{12,11,300},{142,11,250},{4,0,532},{5,0,706},{135,0,662},{5 -,0,837},{6,0,1651},{139,0,985},{7,0,1861},{9,10,197},{10,10,300},{12,10,473},{13 -,10,90},{141,10,405},{137,11,252},{6,11,323},{135,11,1564},{4,0,330},{4,0,863},{ -7,0,933},{7,0,2012},{8,0,292},{7,11,461},{8,11,775},{138,11,435},{132,10,606},{4 -,11,655},{7,11,850},{17,11,75},{146,11,137},{135,0,767},{7,10,1978},{136,10,676} -,{132,0,641},{135,11,1559},{134,0,1233},{137,0,242},{17,0,114},{4,10,361},{133, -10,315},{137,0,883},{132,10,461},{138,0,274},{134,0,2008},{134,0,1794},{4,0,703} -,{135,0,207},{12,0,285},{132,10,472},{132,0,571},{5,0,873},{5,0,960},{8,0,823},{ -9,0,881},{136,11,577},{7,0,617},{10,0,498},{11,0,501},{12,0,16},{140,0,150},{138 -,10,747},{132,0,431},{133,10,155},{11,0,283},{11,0,567},{7,10,163},{8,10,319},{9 -,10,402},{10,10,24},{10,10,681},{11,10,200},{12,10,253},{12,10,410},{142,10,219} -,{4,11,413},{5,11,677},{8,11,432},{140,11,280},{9,0,401},{5,10,475},{7,10,1780}, -{11,10,297},{11,10,558},{14,10,322},{147,10,76},{6,0,781},{9,0,134},{10,0,2},{10 -,0,27},{10,0,333},{11,0,722},{143,0,1},{5,0,33},{6,0,470},{139,0,424},{135,0, -2006},{12,0,783},{135,10,1956},{136,0,274},{135,0,1882},{132,0,794},{135,0,1848} -,{5,10,944},{134,10,1769},{6,0,47},{7,0,90},{7,0,664},{7,0,830},{7,0,1380},{7,0, -2025},{8,0,448},{136,0,828},{132,10,144},{134,0,1199},{4,11,395},{139,11,762},{ -135,11,1504},{9,0,417},{137,0,493},{9,11,174},{10,11,164},{11,11,440},{11,11,841 -},{143,11,98},{134,11,426},{139,11,1002},{134,0,295},{134,0,816},{6,10,247},{137 -,10,555},{133,0,1019},{4,0,620},{5,11,476},{10,10,280},{138,10,797},{139,0,464}, -{5,11,76},{6,11,458},{6,11,497},{7,11,764},{7,11,868},{9,11,658},{10,11,594},{11 -,11,173},{11,11,566},{12,11,20},{12,11,338},{141,11,200},{134,0,208},{4,11,526}, -{7,11,1029},{135,11,1054},{132,11,636},{6,11,233},{7,11,660},{7,11,1124},{17,11, -31},{19,11,22},{151,11,14},{10,0,442},{133,10,428},{10,0,930},{140,0,778},{6,0, -68},{7,0,448},{7,0,1629},{7,0,1769},{7,0,1813},{8,0,442},{8,0,516},{9,0,710},{10 -,0,282},{10,0,722},{7,10,1717},{138,10,546},{134,0,1128},{11,0,844},{12,0,104},{ -140,0,625},{4,11,432},{135,11,824},{138,10,189},{133,0,787},{133,10,99},{4,11, -279},{7,11,301},{137,11,362},{8,0,491},{4,10,397},{136,10,555},{4,11,178},{133, -11,399},{134,0,711},{144,0,9},{4,0,403},{5,0,441},{7,0,450},{10,0,840},{11,0,101 -},{12,0,193},{141,0,430},{135,11,1246},{12,10,398},{20,10,39},{21,10,11},{150,10 -,41},{4,10,485},{7,10,353},{135,10,1523},{6,10,366},{7,10,1384},{7,10,1601},{135 -,11,1912},{7,0,396},{10,0,160},{135,11,396},{137,10,282},{134,11,1692},{4,10,157 -},{5,10,471},{6,11,202},{10,11,448},{11,11,208},{12,11,360},{17,11,117},{17,11, -118},{18,11,27},{148,11,67},{133,0,679},{137,0,326},{136,10,116},{7,11,872},{10, -11,516},{139,11,167},{132,11,224},{5,11,546},{7,11,35},{8,11,11},{8,11,12},{9,11 -,315},{9,11,533},{10,11,802},{11,11,166},{12,11,525},{142,11,243},{7,0,1128},{ -135,11,1920},{5,11,241},{8,11,242},{9,11,451},{10,11,667},{11,11,598},{140,11, -429},{6,0,737},{5,10,160},{7,10,363},{7,10,589},{10,10,170},{141,10,55},{135,0, -1796},{142,11,254},{4,0,574},{7,0,350},{7,0,1024},{8,0,338},{9,0,677},{138,0,808 -},{134,0,1096},{137,11,516},{7,0,405},{10,0,491},{4,10,108},{4,11,366},{139,10, -498},{11,11,337},{142,11,303},{134,11,1736},{7,0,1081},{140,11,364},{7,10,1005}, -{140,10,609},{7,0,1676},{4,10,895},{133,10,772},{135,0,2037},{6,0,1207},{11,11, -916},{142,11,419},{14,11,140},{148,11,41},{6,11,331},{136,11,623},{9,0,944},{9,0 -,969},{9,0,1022},{12,0,913},{12,0,936},{15,0,177},{15,0,193},{4,10,926},{133,10, -983},{5,0,354},{135,11,506},{8,0,598},{9,0,664},{138,0,441},{4,11,640},{133,11, -513},{137,0,297},{132,10,538},{6,10,294},{7,10,1267},{136,10,624},{7,0,1772},{7, -11,1888},{8,11,289},{11,11,45},{12,11,278},{140,11,537},{135,10,1325},{138,0,751 -},{141,0,37},{134,0,1828},{132,10,757},{132,11,394},{6,0,257},{135,0,1522},{4,0, -582},{9,0,191},{135,11,1931},{7,11,574},{7,11,1719},{137,11,145},{132,11,658},{ -10,0,790},{132,11,369},{9,11,781},{10,11,144},{11,11,385},{13,11,161},{13,11,228 -},{13,11,268},{148,11,107},{8,0,469},{10,0,47},{136,11,374},{6,0,306},{7,0,1140} -,{7,0,1340},{8,0,133},{138,0,449},{139,0,1011},{7,10,1875},{139,10,124},{4,11, -344},{6,11,498},{139,11,323},{137,0,299},{132,0,837},{133,11,906},{5,0,329},{8,0 -,260},{138,0,10},{134,0,1320},{4,0,657},{146,0,158},{135,0,1191},{152,0,7},{6,0, -1939},{8,0,974},{138,0,996},{135,0,1665},{11,11,126},{139,11,287},{143,0,8},{14, -11,149},{14,11,399},{143,11,57},{5,0,66},{7,0,1896},{136,0,288},{7,0,175},{10,0, -494},{5,10,150},{8,10,603},{9,10,593},{9,10,634},{10,10,173},{11,10,462},{11,10, -515},{13,10,216},{13,10,288},{142,10,400},{134,0,1643},{136,11,21},{4,0,21},{5,0 -,91},{5,0,648},{5,0,750},{5,0,781},{6,0,54},{6,0,112},{6,0,402},{6,0,1732},{7,0, -315},{7,0,749},{7,0,1427},{7,0,1900},{9,0,78},{9,0,508},{10,0,611},{10,0,811},{ -11,0,510},{11,0,728},{13,0,36},{14,0,39},{16,0,83},{17,0,124},{148,0,30},{4,0, -668},{136,0,570},{10,0,322},{10,0,719},{139,0,407},{135,11,1381},{136,11,193},{ -12,10,108},{141,10,291},{132,11,616},{136,11,692},{8,0,125},{8,0,369},{8,0,524}, -{10,0,486},{11,0,13},{11,0,381},{11,0,736},{11,0,766},{11,0,845},{13,0,114},{13, -0,292},{142,0,47},{134,0,1247},{6,0,1684},{6,0,1731},{7,0,356},{8,0,54},{8,0,221 -},{9,0,225},{9,0,356},{10,0,77},{10,0,446},{10,0,731},{12,0,404},{141,0,491},{ -135,10,1777},{4,11,305},{4,10,493},{144,10,55},{4,0,951},{6,0,1809},{6,0,1849},{ -8,0,846},{8,0,866},{8,0,899},{10,0,896},{12,0,694},{142,0,468},{5,11,214},{7,11, -603},{8,11,611},{9,11,686},{10,11,88},{11,11,459},{11,11,496},{12,11,463},{12,11 -,590},{13,11,0},{142,11,214},{132,0,411},{4,0,80},{133,0,44},{140,11,74},{143,0, -31},{7,0,669},{6,10,568},{7,10,1804},{8,10,362},{8,10,410},{8,10,830},{9,10,514} -,{11,10,649},{142,10,157},{7,0,673},{134,11,1703},{132,10,625},{134,0,1303},{5,0 -,299},{135,0,1083},{138,0,704},{6,0,275},{7,0,408},{6,10,158},{7,10,129},{7,10, -181},{8,10,276},{8,10,377},{10,10,523},{11,10,816},{12,10,455},{13,10,303},{142, -10,135},{4,0,219},{7,0,367},{7,0,1713},{7,0,1761},{9,0,86},{9,0,537},{10,0,165}, -{12,0,219},{140,0,561},{8,0,216},{4,10,1},{4,11,737},{6,11,317},{7,10,1143},{7, -10,1463},{9,10,207},{9,10,390},{9,10,467},{10,11,98},{11,11,294},{11,10,836},{12 -,11,60},{12,11,437},{13,11,64},{13,11,380},{142,11,430},{6,11,1758},{8,11,520},{ -9,11,345},{9,11,403},{142,11,350},{5,11,47},{10,11,242},{138,11,579},{5,11,139}, -{7,11,1168},{138,11,539},{135,0,1319},{4,10,295},{4,10,723},{5,10,895},{7,10, -1031},{8,10,199},{8,10,340},{9,10,153},{9,10,215},{10,10,21},{10,10,59},{10,10, -80},{10,10,224},{10,10,838},{11,10,229},{11,10,652},{12,10,192},{13,10,146},{142 -,10,91},{140,0,428},{137,10,51},{133,0,514},{5,10,309},{140,10,211},{6,0,1010},{ -5,10,125},{8,10,77},{138,10,15},{4,0,55},{5,0,301},{6,0,571},{142,0,49},{146,0, -102},{136,11,370},{4,11,107},{7,11,613},{8,11,358},{8,11,439},{8,11,504},{9,11, -501},{10,11,383},{139,11,477},{132,11,229},{133,0,364},{133,10,439},{4,11,903},{ -135,11,1816},{11,0,379},{140,10,76},{4,0,76},{4,0,971},{7,0,1550},{9,0,306},{9,0 -,430},{9,0,663},{10,0,683},{10,0,921},{11,0,427},{11,0,753},{12,0,334},{12,0,442 -},{14,0,258},{14,0,366},{143,0,131},{137,0,52},{4,11,47},{6,11,373},{7,11,452},{ -7,11,543},{7,11,1714},{7,11,1856},{9,11,6},{11,11,257},{139,11,391},{4,10,8},{7, -10,1152},{7,10,1153},{7,10,1715},{9,10,374},{10,10,478},{139,10,648},{4,11,785}, -{133,11,368},{135,10,1099},{135,11,860},{5,11,980},{134,11,1754},{134,0,1258},{6 -,0,1058},{6,0,1359},{7,11,536},{7,11,1331},{136,11,143},{4,0,656},{135,0,779},{ -136,10,87},{5,11,19},{6,11,533},{146,11,126},{7,0,144},{138,10,438},{5,11,395},{ -5,11,951},{134,11,1776},{135,0,1373},{7,0,554},{7,0,605},{141,0,10},{4,10,69},{5 -,10,122},{9,10,656},{138,10,464},{5,10,849},{134,10,1633},{5,0,838},{5,0,841},{ -134,0,1649},{133,0,1012},{139,10,499},{7,10,476},{7,10,1592},{138,10,87},{6,0, -251},{7,0,365},{7,0,1357},{7,0,1497},{8,0,154},{141,0,281},{132,11,441},{132,11, -695},{7,11,497},{9,11,387},{147,11,81},{133,0,340},{14,10,283},{142,11,283},{134 -,0,810},{135,11,1894},{139,0,495},{5,11,284},{6,11,49},{6,11,350},{7,11,1},{7,11 -,377},{7,11,1693},{8,11,18},{8,11,678},{9,11,161},{9,11,585},{9,11,671},{9,11, -839},{11,11,912},{141,11,427},{5,10,859},{7,10,1160},{8,10,107},{9,10,291},{9,10 -,439},{10,10,663},{11,10,609},{140,10,197},{8,0,261},{9,0,144},{9,0,466},{10,0, -370},{12,0,470},{13,0,144},{142,0,348},{137,0,897},{6,0,248},{9,0,546},{10,0,535 -},{11,0,681},{141,0,135},{4,0,358},{135,0,1496},{134,0,567},{136,0,445},{4,10, -117},{6,10,372},{7,10,1905},{142,10,323},{4,10,722},{139,10,471},{6,0,697},{134, -0,996},{7,11,2007},{9,11,101},{9,11,450},{10,11,66},{10,11,842},{11,11,536},{140 -,11,587},{132,0,577},{134,0,1336},{9,10,5},{12,10,216},{12,10,294},{12,10,298},{ -12,10,400},{12,10,518},{13,10,229},{143,10,139},{6,0,174},{138,0,917},{134,10, -1774},{5,10,12},{7,10,375},{9,10,88},{9,10,438},{11,11,62},{139,10,270},{134,11, -1766},{6,11,0},{7,11,84},{7,10,816},{7,10,1241},{9,10,283},{9,10,520},{10,10,213 -},{10,10,307},{10,10,463},{10,10,671},{10,10,746},{11,10,401},{11,10,794},{11,11 -,895},{12,10,517},{17,11,11},{18,10,107},{147,10,115},{5,0,878},{133,0,972},{6, -11,1665},{7,11,256},{7,11,1388},{138,11,499},{4,10,258},{136,10,639},{4,11,22},{ -5,11,10},{6,10,22},{7,11,848},{7,10,903},{7,10,1963},{8,11,97},{138,10,577},{5, -10,681},{136,10,782},{133,11,481},{132,0,351},{4,10,664},{5,10,804},{139,10,1013 -},{6,11,134},{7,11,437},{7,11,959},{9,11,37},{14,11,285},{14,11,371},{144,11,60} -,{7,11,486},{8,11,155},{11,11,93},{140,11,164},{132,0,286},{7,0,438},{7,0,627},{ -7,0,1516},{8,0,40},{9,0,56},{9,0,294},{10,0,30},{11,0,969},{11,0,995},{146,0,148 -},{5,11,591},{135,11,337},{134,0,1950},{133,10,32},{138,11,500},{5,11,380},{5,11 -,650},{136,11,310},{4,11,364},{7,11,1156},{7,11,1187},{137,11,409},{4,0,738},{ -134,11,482},{4,11,781},{6,11,487},{7,11,926},{8,11,263},{139,11,500},{135,11,418 -},{6,0,2047},{10,0,969},{4,10,289},{7,10,629},{7,10,1698},{7,10,1711},{140,10, -215},{6,10,450},{136,10,109},{134,0,818},{136,10,705},{133,0,866},{4,11,94},{135 -,11,1265},{132,11,417},{134,0,1467},{135,10,1238},{4,0,972},{6,0,1851},{134,0, -1857},{134,0,355},{133,0,116},{132,0,457},{135,11,1411},{4,11,408},{4,11,741},{ -135,11,500},{134,10,26},{142,11,137},{5,0,527},{6,0,189},{7,0,859},{136,0,267},{ -11,0,104},{11,0,554},{15,0,60},{143,0,125},{134,0,1613},{4,10,414},{5,10,467},{9 -,10,654},{10,10,451},{12,10,59},{141,10,375},{135,10,17},{134,0,116},{135,11,541 -},{135,10,955},{6,11,73},{135,11,177},{133,11,576},{134,0,886},{133,0,487},{4,0, -86},{5,0,667},{5,0,753},{6,0,316},{6,0,455},{135,0,946},{142,11,231},{150,0,45}, -{134,0,863},{134,0,1953},{6,10,280},{10,10,502},{11,10,344},{140,10,38},{4,0,79} -,{7,0,1773},{10,0,450},{11,0,589},{13,0,332},{13,0,493},{14,0,183},{14,0,334},{ -14,0,362},{14,0,368},{14,0,376},{14,0,379},{19,0,90},{19,0,103},{19,0,127},{148, -0,90},{5,10,45},{7,10,1161},{11,10,448},{11,10,880},{13,10,139},{13,10,407},{15, -10,16},{17,10,95},{18,10,66},{18,10,88},{18,10,123},{149,10,7},{136,10,777},{4, -10,410},{135,10,521},{135,10,1778},{135,11,538},{142,0,381},{133,11,413},{134,0, -1142},{6,0,1189},{136,11,495},{5,0,663},{6,0,1962},{134,0,2003},{7,11,54},{8,11, -312},{10,11,191},{10,11,614},{140,11,567},{132,10,436},{133,0,846},{10,0,528},{ -11,0,504},{7,10,1587},{135,10,1707},{5,0,378},{8,0,465},{9,0,286},{10,0,185},{10 -,0,562},{10,0,635},{11,0,31},{11,0,393},{13,0,312},{18,0,65},{18,0,96},{147,0,89 -},{7,0,899},{14,0,325},{6,11,468},{7,11,567},{7,11,1478},{8,11,530},{142,11,290} -,{7,0,1880},{9,0,680},{139,0,798},{134,0,1770},{132,0,648},{150,11,35},{5,0,945} -,{6,0,1656},{6,0,1787},{7,0,167},{8,0,824},{9,0,391},{10,0,375},{139,0,185},{6, -11,484},{135,11,822},{134,0,2046},{7,0,1645},{8,0,352},{137,0,249},{132,0,152},{ -6,0,611},{135,0,1733},{6,11,1724},{135,11,2022},{133,0,1006},{141,11,96},{5,0, -420},{135,0,1449},{146,11,149},{135,0,832},{135,10,663},{133,0,351},{5,0,40},{7, -0,598},{7,0,1638},{8,0,78},{9,0,166},{9,0,640},{9,0,685},{9,0,773},{11,0,215},{ -13,0,65},{14,0,172},{14,0,317},{145,0,6},{8,0,60},{9,0,343},{139,0,769},{134,0, -1354},{132,0,724},{137,0,745},{132,11,474},{7,0,1951},{8,0,765},{8,0,772},{140,0 -,671},{7,0,108},{8,0,219},{8,0,388},{9,0,775},{11,0,275},{140,0,464},{137,0,639} -,{135,10,503},{133,11,366},{5,0,15},{6,0,56},{7,0,1758},{8,0,500},{9,0,730},{11, -0,331},{13,0,150},{14,0,282},{5,11,305},{9,11,560},{141,11,208},{4,10,113},{5,10 -,163},{5,10,735},{7,10,1009},{9,10,9},{9,10,771},{12,10,90},{13,10,138},{13,10, -410},{143,10,128},{4,10,324},{138,10,104},{135,11,466},{142,11,27},{134,0,1886}, -{5,0,205},{6,0,438},{9,0,711},{4,11,480},{6,11,167},{6,11,302},{6,11,1642},{7,11 -,130},{7,11,656},{7,11,837},{7,11,1547},{7,11,1657},{8,11,429},{9,11,228},{10,11 -,643},{13,11,289},{13,11,343},{147,11,101},{134,0,865},{6,0,2025},{136,0,965},{7 -,11,278},{10,11,739},{11,11,708},{141,11,348},{133,0,534},{135,11,1922},{137,0, -691},{4,10,935},{133,10,823},{6,0,443},{9,0,237},{9,0,571},{9,0,695},{10,0,139}, -{11,0,715},{12,0,417},{141,0,421},{5,10,269},{7,10,434},{7,10,891},{8,10,339},{9 -,10,702},{11,10,594},{11,10,718},{145,10,100},{6,0,1555},{7,0,878},{9,10,485},{ -141,10,264},{134,10,1713},{7,10,1810},{11,10,866},{12,10,103},{141,10,495},{135, -10,900},{6,0,1410},{9,11,316},{139,11,256},{4,0,995},{135,0,1033},{132,0,578},{ -10,0,881},{12,0,740},{12,0,743},{140,0,759},{132,0,822},{133,0,923},{142,10,143} -,{135,11,1696},{6,11,363},{7,11,1955},{136,11,725},{132,0,924},{133,0,665},{135, -10,2029},{135,0,1901},{4,0,265},{6,0,1092},{6,0,1417},{7,0,807},{135,0,950},{5,0 -,93},{12,0,267},{141,0,498},{135,0,1451},{5,11,813},{135,11,2046},{5,10,625},{ -135,10,1617},{135,0,747},{6,0,788},{137,0,828},{7,0,184},{11,0,307},{11,0,400},{ -15,0,130},{5,11,712},{7,11,1855},{8,10,425},{8,10,693},{9,10,720},{10,10,380},{ -10,10,638},{11,11,17},{11,10,473},{12,10,61},{13,11,321},{144,11,67},{135,0,198} -,{6,11,320},{7,11,781},{7,11,1921},{9,11,55},{10,11,186},{10,11,273},{10,11,664} -,{10,11,801},{11,11,996},{11,11,997},{13,11,157},{142,11,170},{136,11,271},{135, -0,994},{7,11,103},{7,11,863},{11,11,184},{14,11,299},{145,11,62},{11,10,551},{ -142,10,159},{5,0,233},{5,0,320},{6,0,140},{8,0,295},{8,0,615},{136,11,615},{133, -0,978},{4,0,905},{6,0,1701},{137,0,843},{132,10,168},{4,0,974},{8,0,850},{12,0, -709},{12,0,768},{140,0,786},{135,10,91},{152,0,6},{138,10,532},{135,10,1884},{ -132,0,509},{6,0,1307},{135,0,273},{5,11,77},{7,11,1455},{10,11,843},{19,11,73},{ -150,11,5},{132,11,458},{135,11,1420},{6,11,109},{138,11,382},{6,0,201},{6,11,330 -},{7,10,70},{7,11,1084},{10,10,240},{11,11,142},{147,10,93},{7,0,1041},{140,11, -328},{133,11,354},{134,0,1040},{133,0,693},{134,0,774},{139,0,234},{132,0,336},{ -7,0,1399},{139,10,392},{20,0,22},{148,11,22},{5,0,802},{7,0,2021},{136,0,805},{5 -,0,167},{5,0,899},{6,0,410},{137,0,777},{137,0,789},{134,0,1705},{7,10,655},{135 -,10,1844},{4,10,145},{6,10,176},{7,10,395},{137,10,562},{132,10,501},{135,0,10}, -{5,0,11},{6,0,117},{6,0,485},{7,0,1133},{9,0,582},{9,0,594},{10,0,82},{11,0,21}, -{11,0,818},{12,0,535},{13,0,86},{20,0,91},{23,0,13},{134,10,509},{4,0,264},{7,0, -1067},{8,0,204},{8,0,385},{139,0,953},{139,11,737},{138,0,56},{134,0,1917},{133, -0,470},{10,11,657},{14,11,297},{142,11,361},{135,11,412},{7,0,1198},{7,11,1198}, -{8,11,556},{14,11,123},{14,11,192},{143,11,27},{7,11,1985},{14,11,146},{15,11,42 -},{16,11,23},{17,11,86},{146,11,17},{11,0,1015},{136,11,122},{4,10,114},{9,10, -492},{13,10,462},{142,10,215},{4,10,77},{5,10,361},{6,10,139},{6,10,401},{6,10, -404},{7,10,413},{7,10,715},{7,10,1716},{11,10,279},{12,10,179},{12,10,258},{13, -10,244},{142,10,358},{134,10,1717},{7,10,1061},{8,10,82},{11,10,250},{12,10,420} -,{141,10,184},{133,0,715},{135,10,724},{9,0,919},{9,0,922},{9,0,927},{9,0,933},{ -9,0,962},{9,0,1000},{9,0,1002},{9,0,1021},{12,0,890},{12,0,907},{12,0,930},{15,0 -,207},{15,0,228},{15,0,238},{149,0,61},{8,0,794},{9,0,400},{10,0,298},{142,0,228 -},{5,11,430},{5,11,932},{6,11,131},{7,11,417},{9,11,522},{11,11,314},{141,11,390 -},{132,0,867},{8,0,724},{132,11,507},{137,11,261},{4,11,343},{133,11,511},{6,0, -190},{7,0,768},{135,0,1170},{6,10,513},{135,10,1052},{7,11,455},{138,11,591},{ -134,0,1066},{137,10,899},{14,0,67},{147,0,60},{4,0,948},{18,0,174},{146,0,176},{ -135,0,1023},{7,10,1417},{12,10,382},{17,10,48},{152,10,12},{134,11,575},{132,0, -764},{6,10,545},{7,10,565},{7,10,1669},{10,10,114},{11,10,642},{140,10,618},{6,0 -,137},{9,0,75},{9,0,253},{10,0,194},{138,0,444},{4,0,756},{133,10,5},{8,0,1008}, -{135,10,192},{132,0,842},{11,0,643},{12,0,115},{136,10,763},{139,0,67},{133,10, -759},{4,0,821},{5,0,760},{7,0,542},{8,0,135},{8,0,496},{135,11,580},{7,10,370},{ -7,10,1007},{7,10,1177},{135,10,1565},{135,10,1237},{140,0,736},{7,0,319},{7,0, -355},{7,0,763},{10,0,389},{145,0,43},{8,11,333},{138,11,182},{4,10,87},{5,10,250 -},{141,10,298},{138,0,786},{134,0,2044},{8,11,330},{140,11,477},{135,11,1338},{ -132,11,125},{134,0,1030},{134,0,1083},{132,11,721},{135,10,814},{7,11,776},{8,11 -,145},{147,11,56},{134,0,1226},{4,10,57},{7,10,1195},{7,10,1438},{7,10,1548},{7, -10,1835},{7,10,1904},{9,10,757},{10,10,604},{139,10,519},{7,11,792},{8,11,147},{ -10,11,821},{139,11,1021},{137,11,797},{4,0,58},{5,0,286},{6,0,319},{7,0,402},{7, -0,1254},{7,0,1903},{8,0,356},{140,0,408},{4,0,389},{4,0,815},{9,0,181},{9,0,255} -,{10,0,8},{10,0,29},{10,0,816},{11,0,311},{11,0,561},{12,0,67},{141,0,181},{7,11 -,1472},{135,11,1554},{7,11,1071},{7,11,1541},{7,11,1767},{7,11,1806},{7,11,1999} -,{9,11,248},{10,11,400},{11,11,162},{11,11,178},{11,11,242},{12,11,605},{15,11, -26},{144,11,44},{5,11,168},{5,11,930},{8,11,74},{9,11,623},{12,11,500},{12,11, -579},{13,11,41},{143,11,93},{6,11,220},{7,11,1101},{141,11,105},{5,0,474},{7,0, -507},{4,10,209},{7,11,507},{135,10,902},{132,0,427},{6,0,413},{7,10,335},{7,10, -1437},{7,10,1668},{8,10,553},{8,10,652},{8,10,656},{9,10,558},{11,10,743},{149, -10,18},{132,0,730},{6,11,19},{7,11,1413},{139,11,428},{133,0,373},{132,10,559},{ -7,11,96},{8,11,401},{137,11,896},{7,0,799},{7,0,1972},{5,10,1017},{138,10,511},{ -135,0,1793},{7,11,1961},{7,11,1965},{8,11,702},{136,11,750},{8,11,150},{8,11,737 -},{140,11,366},{132,0,322},{133,10,709},{8,11,800},{9,11,148},{9,11,872},{9,11, -890},{11,11,309},{11,11,1001},{13,11,267},{141,11,323},{134,10,1745},{7,0,290},{ -136,10,206},{7,0,1651},{145,0,89},{139,0,2},{132,0,672},{6,0,1860},{8,0,905},{10 -,0,844},{10,0,846},{10,0,858},{12,0,699},{12,0,746},{140,0,772},{135,11,424},{ -133,11,547},{133,0,737},{5,11,490},{6,11,615},{6,11,620},{135,11,683},{6,0,746}, -{134,0,1612},{132,10,776},{9,11,385},{149,11,17},{133,0,145},{135,10,1272},{7,0, -884},{140,0,124},{4,0,387},{135,0,1288},{5,11,133},{136,10,406},{136,11,187},{6, -0,679},{8,11,8},{138,11,0},{135,0,550},{135,11,798},{136,11,685},{7,11,1086},{ -145,11,46},{8,10,175},{10,10,168},{138,10,573},{135,0,1305},{4,0,576},{135,0, -1263},{6,0,686},{134,0,1563},{134,0,607},{5,0,919},{134,0,1673},{148,0,37},{8,11 -,774},{10,11,670},{140,11,51},{133,10,784},{139,10,882},{4,0,82},{5,0,333},{5,0, -904},{6,0,207},{7,0,325},{7,0,1726},{8,0,101},{10,0,778},{139,0,220},{135,11,371 -},{132,0,958},{133,0,903},{4,11,127},{5,11,350},{6,11,356},{8,11,426},{9,11,572} -,{10,11,247},{139,11,312},{140,0,147},{6,11,59},{7,11,885},{9,11,603},{141,11, -397},{10,0,367},{9,10,14},{9,10,441},{139,10,9},{11,10,966},{12,10,287},{13,10, -342},{13,10,402},{15,10,110},{143,10,163},{134,0,690},{132,0,705},{9,0,651},{11, -0,971},{13,0,273},{7,10,1428},{7,10,1640},{7,10,1867},{9,10,169},{9,10,182},{9, -10,367},{9,10,478},{9,10,506},{9,10,551},{9,10,557},{9,10,648},{9,10,697},{9,10, -705},{9,10,725},{9,10,787},{9,10,794},{10,10,198},{10,10,214},{10,10,267},{10,10 -,275},{10,10,456},{10,10,551},{10,10,561},{10,10,613},{10,10,627},{10,10,668},{ -10,10,675},{10,10,691},{10,10,695},{10,10,707},{10,10,715},{11,10,183},{11,10, -201},{11,10,262},{11,10,352},{11,10,439},{11,10,493},{11,10,572},{11,10,591},{11 -,10,608},{11,10,611},{11,10,646},{11,10,674},{11,10,711},{11,10,751},{11,10,761} -,{11,10,776},{11,10,785},{11,10,850},{11,10,853},{11,10,862},{11,10,865},{11,10, -868},{11,10,875},{11,10,898},{11,10,902},{11,10,903},{11,10,910},{11,10,932},{11 -,10,942},{11,10,957},{11,10,967},{11,10,972},{12,10,148},{12,10,195},{12,10,220} -,{12,10,237},{12,10,318},{12,10,339},{12,10,393},{12,10,445},{12,10,450},{12,10, -474},{12,10,505},{12,10,509},{12,10,533},{12,10,591},{12,10,594},{12,10,597},{12 -,10,621},{12,10,633},{12,10,642},{13,10,59},{13,10,60},{13,10,145},{13,10,239},{ -13,10,250},{13,10,329},{13,10,344},{13,10,365},{13,10,372},{13,10,387},{13,10, -403},{13,10,414},{13,10,456},{13,10,470},{13,10,478},{13,10,483},{13,10,489},{14 -,10,55},{14,10,57},{14,10,81},{14,10,90},{14,10,148},{14,10,239},{14,10,266},{14 -,10,321},{14,10,326},{14,10,327},{14,10,330},{14,10,347},{14,10,355},{14,10,401} -,{14,10,404},{14,10,411},{14,10,414},{14,10,416},{14,10,420},{15,10,61},{15,10, -74},{15,10,87},{15,10,88},{15,10,94},{15,10,96},{15,10,116},{15,10,149},{15,10, -154},{16,10,50},{16,10,63},{16,10,73},{17,10,2},{17,10,66},{17,10,92},{17,10,103 -},{17,10,112},{17,10,120},{18,10,50},{18,10,54},{18,10,82},{18,10,86},{18,10,90} -,{18,10,111},{18,10,115},{18,10,156},{19,10,40},{19,10,79},{20,10,78},{149,10,22 -},{7,0,887},{5,10,161},{135,10,839},{142,11,98},{134,0,90},{138,11,356},{135,11, -441},{6,11,111},{7,11,4},{8,11,163},{8,11,776},{138,11,566},{134,0,908},{134,0, -1261},{7,0,813},{12,0,497},{141,0,56},{134,0,1235},{135,0,429},{135,11,1994},{ -138,0,904},{6,0,125},{7,0,1277},{137,0,772},{151,0,12},{4,0,841},{5,0,386},{133, -11,386},{5,11,297},{135,11,1038},{6,0,860},{6,0,1069},{135,11,309},{136,0,946},{ -135,10,1814},{141,11,418},{136,11,363},{10,0,768},{139,0,787},{22,11,30},{150,11 -,33},{6,0,160},{7,0,1106},{9,0,770},{11,0,112},{140,0,413},{11,11,216},{139,11, -340},{136,10,139},{135,11,1390},{135,11,808},{132,11,280},{12,0,271},{17,0,109}, -{7,10,643},{136,10,236},{140,11,54},{4,11,421},{133,11,548},{11,0,719},{12,0,36} -,{141,0,337},{7,0,581},{9,0,644},{137,0,699},{11,11,511},{13,11,394},{14,11,298} -,{14,11,318},{146,11,103},{7,0,304},{9,0,646},{9,0,862},{11,0,696},{12,0,208},{ -15,0,79},{147,0,108},{4,0,631},{7,0,1126},{135,0,1536},{135,11,1527},{8,0,880},{ -10,0,869},{138,0,913},{7,0,1513},{5,10,54},{6,11,254},{9,11,109},{138,11,103},{ -135,0,981},{133,11,729},{132,10,744},{132,0,434},{134,0,550},{7,0,930},{10,0,476 -},{13,0,452},{19,0,104},{6,11,1630},{10,10,402},{146,10,55},{5,0,553},{138,0,824 -},{136,0,452},{8,0,151},{137,10,624},{132,10,572},{132,0,772},{133,11,671},{133, -0,292},{138,0,135},{132,11,889},{140,11,207},{9,0,504},{6,10,43},{7,10,38},{8,10 -,248},{138,10,513},{6,0,1089},{135,11,1910},{4,11,627},{133,11,775},{135,0,783}, -{133,10,766},{133,10,363},{7,0,387},{135,11,387},{7,0,393},{10,0,603},{11,0,206} -,{7,11,202},{11,11,362},{11,11,948},{140,11,388},{6,11,507},{7,11,451},{8,11,389 -},{12,11,490},{13,11,16},{13,11,215},{13,11,351},{18,11,132},{147,11,125},{4,0, -912},{9,0,232},{135,11,841},{6,10,258},{140,10,409},{5,10,249},{148,10,82},{136, -11,566},{6,0,977},{135,11,1214},{7,0,1973},{136,0,716},{135,0,98},{133,0,733},{5 -,11,912},{134,11,1695},{5,10,393},{6,10,378},{7,10,1981},{9,10,32},{9,10,591},{ -10,10,685},{10,10,741},{142,10,382},{133,10,788},{10,0,19},{11,0,911},{7,10,1968 -},{141,10,509},{5,0,668},{5,11,236},{6,11,572},{8,11,492},{11,11,618},{144,11,56 -},{135,11,1789},{4,0,360},{5,0,635},{5,0,700},{5,10,58},{5,10,171},{5,10,683},{6 -,10,291},{6,10,566},{7,10,1650},{11,10,523},{12,10,273},{12,10,303},{15,10,39},{ -143,10,111},{133,0,901},{134,10,589},{5,11,190},{136,11,318},{140,0,656},{7,0, -726},{152,0,9},{4,10,917},{133,10,1005},{135,10,1598},{134,11,491},{4,10,919},{ -133,11,434},{137,0,72},{6,0,1269},{6,0,1566},{134,0,1621},{9,0,463},{10,0,595},{ -4,10,255},{5,10,302},{6,10,132},{7,10,128},{7,10,283},{7,10,1299},{10,10,52},{10 -,10,514},{11,10,925},{13,10,92},{142,10,309},{135,0,1454},{134,0,1287},{11,0,600 -},{13,0,245},{137,10,173},{136,0,989},{7,0,164},{7,0,1571},{9,0,107},{140,0,225} -,{6,0,1061},{141,10,442},{4,0,27},{5,0,484},{5,0,510},{6,0,434},{7,0,1000},{7,0, -1098},{136,0,2},{7,11,85},{7,11,247},{8,11,585},{10,11,163},{138,11,316},{11,11, -103},{142,11,0},{134,0,1127},{4,0,460},{134,0,852},{134,10,210},{4,0,932},{133,0 -,891},{6,0,588},{147,11,83},{8,0,625},{4,10,284},{134,10,223},{134,0,76},{8,0,92 -},{137,0,221},{4,11,124},{10,11,457},{11,11,121},{11,11,169},{11,11,422},{11,11, -870},{12,11,214},{13,11,389},{14,11,187},{143,11,77},{9,11,618},{138,11,482},{4, -10,218},{7,10,526},{143,10,137},{13,0,9},{14,0,104},{14,0,311},{4,10,270},{5,10, -192},{6,10,332},{135,10,1322},{140,10,661},{135,11,1193},{6,11,107},{7,11,638},{ -7,11,1632},{137,11,396},{132,0,763},{4,0,622},{5,11,370},{134,11,1756},{133,0, -253},{135,0,546},{9,0,73},{10,0,110},{14,0,185},{17,0,119},{133,11,204},{7,0,624 -},{7,0,916},{10,0,256},{139,0,87},{7,10,379},{8,10,481},{137,10,377},{5,0,212},{ -12,0,35},{13,0,382},{5,11,970},{134,11,1706},{9,0,746},{5,10,1003},{134,10,149}, -{10,0,150},{11,0,849},{13,0,330},{8,10,262},{9,10,627},{11,10,214},{11,10,404},{ -11,10,457},{11,10,780},{11,10,913},{13,10,401},{142,10,200},{134,0,1466},{135,11 -,3},{6,0,1299},{4,11,35},{5,11,121},{5,11,483},{5,11,685},{6,11,489},{7,11,1204} -,{136,11,394},{135,10,742},{4,10,142},{136,10,304},{4,11,921},{133,11,1007},{134 -,0,1518},{6,0,1229},{135,0,1175},{133,0,816},{12,0,159},{4,10,471},{4,11,712},{5 -,10,51},{6,10,602},{7,10,925},{8,10,484},{138,10,195},{134,11,1629},{5,0,869},{5 -,0,968},{6,0,1626},{8,0,734},{136,0,784},{4,0,542},{6,0,1716},{6,0,1727},{7,0, -1082},{7,0,1545},{8,0,56},{8,0,118},{8,0,412},{8,0,564},{9,0,888},{9,0,908},{10, -0,50},{10,0,423},{11,0,685},{11,0,697},{11,0,933},{12,0,299},{13,0,126},{13,0, -136},{13,0,170},{13,0,190},{136,10,688},{132,10,697},{4,0,232},{9,0,202},{10,0, -474},{140,0,433},{136,0,212},{6,0,108},{7,0,1003},{7,0,1181},{8,0,111},{136,0, -343},{5,10,221},{135,11,1255},{133,11,485},{134,0,1712},{142,0,216},{5,0,643},{6 -,0,516},{4,11,285},{5,11,317},{6,11,301},{7,11,7},{8,11,153},{10,11,766},{11,11, -468},{12,11,467},{141,11,143},{4,0,133},{7,0,711},{7,0,1298},{135,0,1585},{134,0 -,650},{135,11,512},{6,0,99},{7,0,1808},{145,0,57},{6,0,246},{6,0,574},{7,0,428}, -{9,0,793},{10,0,669},{11,0,485},{11,0,840},{12,0,300},{14,0,250},{145,0,55},{4, -10,132},{5,10,69},{135,10,1242},{136,0,1023},{7,0,302},{132,10,111},{135,0,1871} -,{132,0,728},{9,0,252},{132,10,767},{6,0,461},{7,0,1590},{7,10,1416},{7,10,2005} -,{8,10,131},{8,10,466},{9,10,672},{13,10,252},{148,10,103},{6,0,323},{135,0,1564 -},{7,0,461},{136,0,775},{6,10,44},{136,10,368},{139,0,172},{132,0,464},{4,10,570 -},{133,10,120},{137,11,269},{6,10,227},{135,10,1589},{6,11,1719},{6,11,1735},{7, -11,2016},{7,11,2020},{8,11,837},{137,11,852},{7,0,727},{146,0,73},{132,0,1023},{ -135,11,852},{135,10,1529},{136,0,577},{138,11,568},{134,0,1037},{8,11,67},{138, -11,419},{4,0,413},{5,0,677},{8,0,432},{140,0,280},{10,0,600},{6,10,1667},{7,11, -967},{7,10,2036},{141,11,11},{6,10,511},{140,10,132},{6,0,799},{5,10,568},{6,10, -138},{135,10,1293},{8,0,159},{4,10,565},{136,10,827},{7,0,646},{7,0,1730},{11,0, -446},{141,0,178},{4,10,922},{133,10,1023},{135,11,11},{132,0,395},{11,0,145},{ -135,10,1002},{9,0,174},{10,0,164},{11,0,440},{11,0,514},{11,0,841},{15,0,98},{ -149,0,20},{134,0,426},{10,0,608},{139,0,1002},{7,11,320},{8,11,51},{12,11,481},{ -12,11,570},{148,11,106},{9,0,977},{9,0,983},{132,11,445},{138,0,250},{139,0,100} -,{6,0,1982},{136,10,402},{133,11,239},{4,10,716},{141,10,31},{5,0,476},{7,11,83} -,{7,11,1990},{8,11,130},{139,11,720},{8,10,691},{136,10,731},{5,11,123},{6,11, -530},{7,11,348},{135,11,1419},{5,0,76},{6,0,458},{6,0,497},{7,0,868},{9,0,658},{ -10,0,594},{11,0,173},{11,0,566},{12,0,20},{12,0,338},{141,0,200},{9,11,139},{10, -11,399},{11,11,469},{12,11,634},{141,11,223},{9,10,840},{138,10,803},{133,10,847 -},{11,11,223},{140,11,168},{132,11,210},{8,0,447},{9,10,53},{9,10,268},{9,10,901 -},{10,10,518},{10,10,829},{11,10,188},{13,10,74},{14,10,46},{15,10,17},{15,10,33 -},{17,10,40},{18,10,36},{19,10,20},{22,10,1},{152,10,2},{4,0,526},{7,0,1029},{ -135,0,1054},{19,11,59},{150,11,2},{4,0,636},{6,0,1875},{6,0,1920},{9,0,999},{12, -0,807},{12,0,825},{15,0,179},{15,0,190},{18,0,182},{136,10,532},{6,0,1699},{7,0, -660},{7,0,1124},{17,0,31},{19,0,22},{151,0,14},{135,10,681},{132,11,430},{140,10 -,677},{4,10,684},{136,10,384},{132,11,756},{133,11,213},{7,0,188},{7,10,110},{8, -10,290},{8,10,591},{9,10,382},{9,10,649},{11,10,71},{11,10,155},{11,10,313},{12, -10,5},{13,10,325},{142,10,287},{7,10,360},{7,10,425},{9,10,66},{9,10,278},{138, -10,644},{142,11,164},{4,0,279},{7,0,301},{137,0,362},{134,11,586},{135,0,1743},{ -4,0,178},{133,0,399},{4,10,900},{133,10,861},{5,10,254},{7,10,985},{136,10,73},{ -133,11,108},{7,10,1959},{136,10,683},{133,11,219},{4,11,193},{5,11,916},{7,11, -364},{10,11,398},{10,11,726},{11,11,317},{11,11,626},{12,11,142},{12,11,288},{12 -,11,678},{13,11,313},{15,11,113},{18,11,114},{21,11,30},{150,11,53},{6,11,241},{ -7,11,907},{8,11,832},{9,11,342},{10,11,729},{11,11,284},{11,11,445},{11,11,651}, -{11,11,863},{13,11,398},{146,11,99},{132,0,872},{134,0,831},{134,0,1692},{6,0, -202},{6,0,1006},{9,0,832},{10,0,636},{11,0,208},{12,0,360},{17,0,118},{18,0,27}, -{20,0,67},{137,11,734},{132,10,725},{7,11,993},{138,11,666},{134,0,1954},{134,10 -,196},{7,0,872},{10,0,516},{139,0,167},{133,10,831},{4,11,562},{9,11,254},{139, -11,879},{137,0,313},{4,0,224},{132,11,786},{11,0,24},{12,0,170},{136,10,723},{5, -0,546},{7,0,35},{8,0,11},{8,0,12},{9,0,315},{9,0,533},{10,0,802},{11,0,166},{12, -0,525},{142,0,243},{7,0,1937},{13,10,80},{13,10,437},{145,10,74},{5,0,241},{8,0, -242},{9,0,451},{10,0,667},{11,0,598},{140,0,429},{150,0,46},{6,0,1273},{137,0, -830},{5,10,848},{6,10,66},{136,10,764},{6,0,825},{134,0,993},{4,0,1006},{10,0, -327},{13,0,271},{4,10,36},{7,10,1387},{139,10,755},{134,0,1023},{135,0,1580},{4, -0,366},{137,0,516},{132,10,887},{6,0,1736},{135,0,1891},{6,11,216},{7,11,901},{7 -,11,1343},{136,11,493},{6,10,165},{138,10,388},{7,11,341},{139,11,219},{4,10,719 -},{135,10,155},{134,0,1935},{132,0,826},{6,0,331},{6,0,1605},{8,0,623},{11,0,139 -},{139,0,171},{135,11,1734},{10,11,115},{11,11,420},{12,11,154},{13,11,404},{14, -11,346},{15,11,54},{143,11,112},{7,0,288},{4,10,353},{6,10,146},{6,10,1789},{7, -10,990},{7,10,1348},{9,10,665},{9,10,898},{11,10,893},{142,10,212},{6,0,916},{ -134,0,1592},{7,0,1888},{4,10,45},{135,10,1257},{5,11,1011},{136,11,701},{139,11, -596},{4,11,54},{5,11,666},{7,11,1039},{7,11,1130},{9,11,195},{138,11,302},{134,0 -,1471},{134,0,1570},{132,0,394},{140,10,65},{136,10,816},{135,0,1931},{7,0,574}, -{135,0,1719},{134,11,467},{132,0,658},{9,0,781},{10,0,144},{11,0,385},{13,0,161} -,{13,0,228},{13,0,268},{20,0,107},{134,11,1669},{136,0,374},{135,0,735},{4,0,344 -},{6,0,498},{139,0,323},{7,0,586},{7,0,1063},{6,10,559},{134,10,1691},{137,0,155 -},{133,0,906},{7,11,122},{9,11,259},{10,11,84},{11,11,470},{12,11,541},{141,11, -379},{134,0,1139},{10,0,108},{139,0,116},{134,10,456},{133,10,925},{5,11,82},{5, -11,131},{7,11,1755},{8,11,31},{9,11,168},{9,11,764},{139,11,869},{134,11,605},{5 -,11,278},{137,11,68},{4,11,163},{5,11,201},{5,11,307},{5,11,310},{6,11,335},{7, -11,284},{136,11,165},{135,11,1660},{6,11,33},{135,11,1244},{4,0,616},{136,11,483 -},{8,0,857},{8,0,902},{8,0,910},{10,0,879},{12,0,726},{4,11,199},{139,11,34},{ -136,0,692},{6,10,193},{7,10,240},{7,10,1682},{10,10,51},{10,10,640},{11,10,410}, -{13,10,82},{14,10,247},{14,10,331},{142,10,377},{6,0,823},{134,0,983},{139,10, -411},{132,0,305},{136,10,633},{138,11,203},{134,0,681},{6,11,326},{7,11,677},{ -137,11,425},{5,0,214},{7,0,603},{8,0,611},{9,0,686},{10,0,88},{11,0,459},{11,0, -496},{12,0,463},{12,0,590},{141,0,0},{136,0,1004},{142,0,23},{134,0,1703},{147, -11,8},{145,11,56},{135,0,1443},{4,10,237},{135,10,514},{6,0,714},{145,0,19},{5, -11,358},{7,11,473},{7,11,1184},{10,11,662},{13,11,212},{13,11,304},{13,11,333},{ -145,11,98},{4,0,737},{10,0,98},{11,0,294},{12,0,60},{12,0,437},{13,0,64},{13,0, -380},{142,0,430},{6,10,392},{7,10,65},{135,10,2019},{6,0,1758},{8,0,520},{9,0, -345},{9,0,403},{142,0,350},{5,0,47},{10,0,242},{138,0,579},{5,0,139},{7,0,1168}, -{138,0,539},{134,0,1459},{13,0,388},{141,11,388},{134,0,253},{7,10,1260},{135,10 -,1790},{10,0,252},{9,10,222},{139,10,900},{140,0,745},{133,11,946},{4,0,107},{7, -0,613},{8,0,439},{8,0,504},{9,0,501},{10,0,383},{139,0,477},{135,11,1485},{132,0 -,871},{7,11,411},{7,11,590},{8,11,631},{9,11,323},{10,11,355},{11,11,491},{12,11 -,143},{12,11,402},{13,11,73},{14,11,408},{15,11,107},{146,11,71},{132,0,229},{ -132,0,903},{140,0,71},{133,0,549},{4,0,47},{6,0,373},{7,0,452},{7,0,543},{7,0, -1828},{7,0,1856},{9,0,6},{11,0,257},{139,0,391},{7,11,1467},{8,11,328},{10,11, -544},{11,11,955},{13,11,320},{145,11,83},{5,0,980},{134,0,1754},{136,0,865},{5,0 -,705},{137,0,606},{7,0,161},{8,10,201},{136,10,605},{143,11,35},{5,11,835},{6,11 -,483},{140,10,224},{7,0,536},{7,0,1331},{136,0,143},{134,0,1388},{5,0,724},{10,0 -,305},{11,0,151},{12,0,33},{12,0,121},{12,0,381},{17,0,3},{17,0,27},{17,0,78},{ -18,0,18},{19,0,54},{149,0,5},{4,10,523},{133,10,638},{5,0,19},{134,0,533},{5,0, -395},{5,0,951},{134,0,1776},{135,0,1908},{132,0,846},{10,0,74},{11,0,663},{12,0, -210},{13,0,166},{13,0,310},{14,0,373},{18,0,95},{19,0,43},{6,10,242},{7,10,227}, -{7,10,1581},{8,10,104},{9,10,113},{9,10,220},{9,10,427},{10,10,239},{11,10,579}, -{11,10,1023},{13,10,4},{13,10,204},{13,10,316},{148,10,86},{9,11,716},{11,11,108 -},{13,11,123},{14,11,252},{19,11,38},{21,11,3},{151,11,11},{8,0,372},{9,0,122},{ -138,0,175},{132,11,677},{7,11,1374},{136,11,540},{135,10,861},{132,0,695},{7,0, -497},{9,0,387},{147,0,81},{136,0,937},{134,0,718},{7,0,1328},{136,10,494},{132, -11,331},{6,0,1581},{133,11,747},{5,0,284},{6,0,49},{6,0,350},{7,0,1},{7,0,377},{ -7,0,1693},{8,0,18},{8,0,678},{9,0,161},{9,0,585},{9,0,671},{9,0,839},{11,0,912}, -{141,0,427},{7,10,1306},{8,10,505},{9,10,482},{10,10,126},{11,10,225},{12,10,347 -},{12,10,449},{13,10,19},{14,10,218},{142,10,435},{10,10,764},{12,10,120},{13,10 -,39},{145,10,127},{4,0,597},{133,10,268},{134,0,1094},{4,0,1008},{134,0,1973},{ -132,0,811},{139,0,908},{135,0,1471},{133,11,326},{4,10,384},{135,10,1022},{7,0, -1935},{8,0,324},{12,0,42},{4,11,691},{7,11,1935},{8,11,324},{9,11,35},{10,11,680 -},{11,11,364},{12,11,42},{13,11,357},{146,11,16},{135,0,2014},{7,0,2007},{9,0, -101},{9,0,450},{10,0,66},{10,0,842},{11,0,536},{12,0,587},{6,11,32},{7,11,385},{ -7,11,757},{7,11,1916},{8,11,37},{8,11,94},{8,11,711},{9,11,541},{10,11,162},{10, -11,795},{11,11,989},{11,11,1010},{12,11,14},{142,11,308},{139,0,586},{135,10, -1703},{7,0,1077},{11,0,28},{9,10,159},{140,10,603},{6,0,1221},{136,10,583},{6,11 -,152},{6,11,349},{6,11,1682},{7,11,1252},{8,11,112},{9,11,435},{9,11,668},{10,11 -,290},{10,11,319},{10,11,815},{11,11,180},{11,11,837},{12,11,240},{13,11,152},{ -13,11,219},{142,11,158},{139,0,62},{132,10,515},{8,10,632},{8,10,697},{137,10, -854},{134,0,1766},{132,11,581},{6,11,126},{7,11,573},{8,11,397},{142,11,44},{150 -,0,28},{11,0,670},{22,0,25},{4,10,136},{133,10,551},{6,0,1665},{7,0,256},{7,0, -1388},{138,0,499},{4,0,22},{5,0,10},{7,0,1576},{136,0,97},{134,10,1782},{5,0,481 -},{7,10,1287},{9,10,44},{10,10,552},{10,10,642},{11,10,839},{12,10,274},{12,10, -275},{12,10,372},{13,10,91},{142,10,125},{133,11,926},{7,11,1232},{137,11,531},{ -6,0,134},{7,0,437},{7,0,1824},{9,0,37},{14,0,285},{142,0,371},{7,0,486},{8,0,155 -},{11,0,93},{140,0,164},{6,0,1391},{134,0,1442},{133,11,670},{133,0,591},{6,10, -147},{7,10,886},{7,11,1957},{9,10,753},{138,10,268},{5,0,380},{5,0,650},{7,0, -1173},{136,0,310},{4,0,364},{7,0,1156},{7,0,1187},{137,0,409},{135,11,1621},{134 -,0,482},{133,11,506},{4,0,781},{6,0,487},{7,0,926},{8,0,263},{139,0,500},{138,10 -,137},{135,11,242},{139,11,96},{133,10,414},{135,10,1762},{134,0,804},{5,11,834} -,{7,11,1202},{8,11,14},{9,11,481},{137,11,880},{134,10,599},{4,0,94},{135,0,1265 -},{4,0,415},{132,0,417},{5,0,348},{6,0,522},{6,10,1749},{7,11,1526},{138,11,465} -,{134,10,1627},{132,0,1012},{132,10,488},{4,11,357},{6,11,172},{7,11,143},{137, -11,413},{4,10,83},{4,11,590},{146,11,76},{140,10,676},{7,11,287},{8,11,355},{9, -11,293},{137,11,743},{134,10,278},{6,0,1803},{18,0,165},{24,0,21},{5,11,169},{7, -11,333},{136,11,45},{12,10,97},{140,11,97},{4,0,408},{4,0,741},{135,0,500},{132, -11,198},{7,10,388},{7,10,644},{139,10,781},{4,11,24},{5,11,140},{5,11,185},{7,11 -,1500},{11,11,565},{139,11,838},{6,0,1321},{9,0,257},{7,10,229},{8,10,59},{9,10, -190},{10,10,378},{140,10,191},{4,11,334},{133,11,593},{135,11,1885},{134,0,1138} -,{4,0,249},{6,0,73},{135,0,177},{133,0,576},{142,0,231},{137,0,288},{132,10,660} -,{7,10,1035},{138,10,737},{135,0,1487},{6,0,989},{9,0,433},{7,10,690},{9,10,587} -,{140,10,521},{7,0,1264},{7,0,1678},{11,0,945},{12,0,341},{12,0,471},{140,0,569} -,{132,11,709},{133,11,897},{5,11,224},{13,11,174},{146,11,52},{135,11,1840},{134 -,10,1744},{12,0,87},{16,0,74},{4,10,733},{9,10,194},{10,10,92},{11,10,198},{12, -10,84},{141,10,128},{140,0,779},{135,0,538},{4,11,608},{133,11,497},{133,0,413}, -{7,11,1375},{7,11,1466},{138,11,331},{136,0,495},{6,11,540},{136,11,136},{7,0,54 -},{8,0,312},{10,0,191},{10,0,614},{140,0,567},{6,0,468},{7,0,567},{7,0,1478},{8, -0,530},{14,0,290},{133,11,999},{4,11,299},{7,10,306},{135,11,1004},{142,11,296}, -{134,0,1484},{133,10,979},{6,0,609},{9,0,815},{12,11,137},{14,11,9},{14,11,24},{ -142,11,64},{133,11,456},{6,0,484},{135,0,822},{133,10,178},{136,11,180},{132,11, -755},{137,0,900},{135,0,1335},{6,0,1724},{135,0,2022},{135,11,1139},{5,0,640},{ -132,10,390},{6,0,1831},{138,11,633},{135,11,566},{4,11,890},{5,11,805},{5,11,819 -},{5,11,961},{6,11,396},{6,11,1631},{6,11,1678},{7,11,1967},{7,11,2041},{9,11, -630},{11,11,8},{11,11,1019},{12,11,176},{13,11,225},{14,11,292},{149,11,24},{132 -,0,474},{134,0,1103},{135,0,1504},{134,0,1576},{6,0,961},{6,0,1034},{140,0,655}, -{11,11,514},{149,11,20},{5,0,305},{135,11,1815},{7,11,1505},{10,11,190},{10,11, -634},{11,11,792},{12,11,358},{140,11,447},{5,11,0},{6,11,536},{7,11,604},{13,11, -445},{145,11,126},{7,0,1236},{133,10,105},{4,0,480},{6,0,217},{6,0,302},{6,0, -1642},{7,0,130},{7,0,837},{7,0,1321},{7,0,1547},{7,0,1657},{8,0,429},{9,0,228},{ -13,0,289},{13,0,343},{19,0,101},{6,11,232},{6,11,412},{7,11,1074},{8,11,9},{8,11 -,157},{8,11,786},{9,11,196},{9,11,352},{9,11,457},{10,11,337},{11,11,232},{11,11 -,877},{12,11,480},{140,11,546},{5,10,438},{7,11,958},{9,10,694},{12,10,627},{13, -11,38},{141,10,210},{4,11,382},{136,11,579},{7,0,278},{10,0,739},{11,0,708},{141 -,0,348},{4,11,212},{135,11,1206},{135,11,1898},{6,0,708},{6,0,1344},{152,10,11}, -{137,11,768},{134,0,1840},{140,0,233},{8,10,25},{138,10,826},{6,0,2017},{133,11, -655},{6,0,1488},{139,11,290},{132,10,308},{134,0,1590},{134,0,1800},{134,0,1259} -,{16,0,28},{6,11,231},{7,11,95},{136,11,423},{133,11,300},{135,10,150},{136,10, -649},{7,11,1874},{137,11,641},{6,11,237},{7,11,611},{8,11,100},{9,11,416},{11,11 -,335},{12,11,173},{146,11,101},{137,0,45},{134,10,521},{17,0,36},{14,11,26},{146 -,11,150},{7,0,1442},{14,0,22},{5,10,339},{15,10,41},{15,10,166},{147,10,66},{8,0 -,378},{6,11,581},{135,11,1119},{134,0,1507},{147,11,117},{139,0,39},{134,0,1054} -,{6,0,363},{7,0,1955},{136,0,725},{134,0,2036},{133,11,199},{6,0,1871},{9,0,935} -,{9,0,961},{9,0,1004},{9,0,1016},{12,0,805},{12,0,852},{12,0,853},{12,0,869},{12 -,0,882},{12,0,896},{12,0,906},{12,0,917},{12,0,940},{15,0,170},{15,0,176},{15,0, -188},{15,0,201},{15,0,205},{15,0,212},{15,0,234},{15,0,244},{18,0,181},{18,0,193 -},{18,0,196},{18,0,201},{18,0,202},{18,0,210},{18,0,217},{18,0,235},{18,0,236},{ -18,0,237},{21,0,54},{21,0,55},{21,0,58},{21,0,59},{152,0,22},{134,10,1628},{137, -0,805},{5,0,813},{135,0,2046},{142,11,42},{5,0,712},{6,0,1240},{11,0,17},{13,0, -321},{144,0,67},{132,0,617},{135,10,829},{6,0,320},{7,0,781},{7,0,1921},{9,0,55} -,{10,0,186},{10,0,273},{10,0,664},{10,0,801},{11,0,996},{11,0,997},{13,0,157},{ -142,0,170},{136,0,271},{5,10,486},{135,10,1349},{18,11,91},{147,11,70},{10,0,445 -},{7,10,1635},{8,10,17},{138,10,295},{136,11,404},{7,0,103},{7,0,863},{11,0,184} -,{145,0,62},{138,10,558},{137,0,659},{6,11,312},{6,11,1715},{10,11,584},{11,11, -546},{11,11,692},{12,11,259},{12,11,295},{13,11,46},{141,11,154},{134,0,676},{ -132,11,588},{4,11,231},{5,11,61},{6,11,104},{7,11,729},{7,11,964},{7,11,1658},{ -140,11,414},{6,11,263},{138,11,757},{11,0,337},{142,0,303},{135,11,1363},{132,11 -,320},{140,0,506},{134,10,447},{5,0,77},{7,0,1455},{10,0,843},{147,0,73},{7,10, -577},{7,10,1432},{9,10,475},{9,10,505},{9,10,526},{9,10,609},{9,10,689},{9,10, -726},{9,10,735},{9,10,738},{10,10,556},{10,10,674},{10,10,684},{11,10,89},{11,10 -,202},{11,10,272},{11,10,380},{11,10,415},{11,10,505},{11,10,537},{11,10,550},{ -11,10,562},{11,10,640},{11,10,667},{11,10,688},{11,10,847},{11,10,927},{11,10, -930},{11,10,940},{12,10,144},{12,10,325},{12,10,329},{12,10,389},{12,10,403},{12 -,10,451},{12,10,515},{12,10,604},{12,10,616},{12,10,626},{13,10,66},{13,10,131}, -{13,10,167},{13,10,236},{13,10,368},{13,10,411},{13,10,434},{13,10,453},{13,10, -461},{13,10,474},{14,10,59},{14,10,60},{14,10,139},{14,10,152},{14,10,276},{14, -10,353},{14,10,402},{15,10,28},{15,10,81},{15,10,123},{15,10,152},{18,10,136},{ -148,10,88},{132,0,458},{135,0,1420},{6,0,109},{10,0,382},{4,11,405},{4,10,609},{ -7,10,756},{7,11,817},{9,10,544},{11,10,413},{14,11,58},{14,10,307},{16,10,25},{ -17,11,37},{146,11,124},{6,0,330},{7,0,1084},{11,0,142},{133,11,974},{4,10,930},{ -133,10,947},{5,10,939},{142,11,394},{16,0,91},{145,0,87},{5,11,235},{5,10,962},{ -7,11,1239},{11,11,131},{140,11,370},{11,0,492},{5,10,651},{8,10,170},{9,10,61},{ -9,10,63},{10,10,23},{10,10,37},{10,10,834},{11,10,4},{11,10,281},{11,10,503},{11 -,10,677},{12,10,96},{12,10,130},{12,10,244},{14,10,5},{14,10,40},{14,10,162},{14 -,10,202},{146,10,133},{4,10,406},{5,10,579},{12,10,492},{150,10,15},{9,11,137},{ -138,11,221},{134,0,1239},{11,0,211},{140,0,145},{7,11,390},{138,11,140},{135,11, -1418},{135,11,1144},{134,0,1049},{7,0,321},{6,10,17},{7,10,1001},{7,10,1982},{9, -10,886},{10,10,489},{10,10,800},{11,10,782},{12,10,320},{13,10,467},{14,10,145}, -{14,10,387},{143,10,119},{145,10,17},{5,11,407},{11,11,489},{19,11,37},{20,11,73 -},{150,11,38},{133,10,458},{135,0,1985},{7,10,1983},{8,10,0},{8,10,171},{9,10, -120},{9,10,732},{10,10,473},{11,10,656},{11,10,998},{18,10,0},{18,10,2},{147,10, -21},{5,11,325},{7,11,1483},{8,11,5},{8,11,227},{9,11,105},{10,11,585},{140,11, -614},{136,0,122},{132,0,234},{135,11,1196},{6,0,976},{6,0,1098},{134,0,1441},{7, -0,253},{136,0,549},{6,11,621},{13,11,504},{144,11,19},{132,10,519},{5,0,430},{5, -0,932},{6,0,131},{7,0,417},{9,0,522},{11,0,314},{141,0,390},{14,0,149},{14,0,399 -},{143,0,57},{5,10,907},{6,10,31},{6,11,218},{7,10,491},{7,10,530},{8,10,592},{ -11,10,53},{11,10,779},{12,10,167},{12,10,411},{14,10,14},{14,10,136},{15,10,72}, -{16,10,17},{144,10,72},{140,11,330},{7,11,454},{7,11,782},{136,11,768},{132,0, -507},{10,11,676},{140,11,462},{6,0,630},{9,0,811},{4,10,208},{5,10,106},{6,10, -531},{8,10,408},{9,10,188},{138,10,572},{4,0,343},{5,0,511},{134,10,1693},{134, -11,164},{132,0,448},{7,0,455},{138,0,591},{135,0,1381},{12,10,441},{150,11,50},{ -9,10,449},{10,10,192},{138,10,740},{6,0,575},{132,10,241},{134,0,1175},{134,0, -653},{134,0,1761},{134,0,1198},{132,10,259},{6,11,343},{7,11,195},{9,11,226},{10 -,11,197},{10,11,575},{11,11,502},{139,11,899},{7,0,1127},{7,0,1572},{10,0,297},{ -10,0,422},{11,0,764},{11,0,810},{12,0,264},{13,0,102},{13,0,300},{13,0,484},{14, -0,147},{14,0,229},{17,0,71},{18,0,118},{147,0,120},{135,11,666},{132,0,678},{4, -10,173},{5,10,312},{5,10,512},{135,10,1285},{7,10,1603},{7,10,1691},{9,10,464},{ -11,10,195},{12,10,279},{12,10,448},{14,10,11},{147,10,102},{16,0,99},{146,0,164} -,{7,11,1125},{9,11,143},{11,11,61},{14,11,405},{150,11,21},{137,11,260},{4,10, -452},{5,10,583},{5,10,817},{6,10,433},{7,10,593},{7,10,720},{7,10,1378},{8,10, -161},{9,10,284},{10,10,313},{139,10,886},{132,10,547},{136,10,722},{14,0,35},{ -142,0,191},{141,0,45},{138,0,121},{132,0,125},{134,0,1622},{133,11,959},{8,10, -420},{139,10,193},{132,0,721},{135,10,409},{136,0,145},{7,0,792},{8,0,147},{10,0 -,821},{11,0,970},{11,0,1021},{136,11,173},{134,11,266},{132,0,715},{7,0,1999},{ -138,10,308},{133,0,531},{5,0,168},{5,0,930},{8,0,74},{9,0,623},{12,0,500},{140,0 -,579},{144,0,65},{138,11,246},{6,0,220},{7,0,1101},{13,0,105},{142,11,314},{5,10 -,1002},{136,10,745},{134,0,960},{20,0,0},{148,11,0},{4,0,1005},{4,10,239},{6,10, -477},{7,10,1607},{11,10,68},{139,10,617},{6,0,19},{7,0,1413},{139,0,428},{149,10 -,13},{7,0,96},{8,0,401},{8,0,703},{9,0,896},{136,11,300},{134,0,1595},{145,0,116 -},{136,0,1021},{7,0,1961},{7,0,1965},{7,0,2030},{8,0,150},{8,0,702},{8,0,737},{8 -,0,750},{140,0,366},{11,11,75},{142,11,267},{132,10,367},{8,0,800},{9,0,148},{9, -0,872},{9,0,890},{11,0,309},{11,0,1001},{13,0,267},{13,0,323},{5,11,427},{5,11, -734},{7,11,478},{136,11,52},{7,11,239},{11,11,217},{142,11,165},{132,11,323},{ -140,11,419},{13,0,299},{142,0,75},{6,11,87},{6,11,1734},{7,11,20},{7,11,1056},{8 -,11,732},{9,11,406},{9,11,911},{138,11,694},{134,0,1383},{132,10,694},{133,11, -613},{137,0,779},{4,0,598},{140,10,687},{6,0,970},{135,0,424},{133,0,547},{7,11, -32},{7,11,984},{8,11,85},{8,11,709},{9,11,579},{9,11,847},{9,11,856},{10,11,799} -,{11,11,258},{11,11,1007},{12,11,331},{12,11,615},{13,11,188},{13,11,435},{14,11 -,8},{15,11,165},{16,11,27},{148,11,40},{6,0,1222},{134,0,1385},{132,0,876},{138, -11,151},{135,10,213},{4,11,167},{135,11,82},{133,0,133},{6,11,24},{7,11,74},{7, -11,678},{137,11,258},{5,11,62},{6,11,534},{7,11,684},{7,11,1043},{7,11,1072},{8, -11,280},{8,11,541},{8,11,686},{10,11,519},{11,11,252},{140,11,282},{136,0,187},{ -8,0,8},{10,0,0},{10,0,818},{139,0,988},{132,11,359},{11,0,429},{15,0,51},{135,10 -,1672},{136,0,685},{5,11,211},{7,11,88},{136,11,627},{134,0,472},{136,0,132},{6, -11,145},{141,11,336},{4,10,751},{11,10,390},{140,10,32},{6,0,938},{6,0,1060},{4, -11,263},{4,10,409},{133,10,78},{137,0,874},{8,0,774},{10,0,670},{12,0,51},{4,11, -916},{6,10,473},{7,10,1602},{10,10,698},{12,10,212},{13,10,307},{145,10,105},{ -146,0,92},{143,10,156},{132,0,830},{137,0,701},{4,11,599},{6,11,1634},{7,11,5},{ -7,11,55},{7,11,67},{7,11,97},{7,11,691},{7,11,979},{7,11,1697},{8,11,207},{8,11, -214},{8,11,231},{8,11,294},{8,11,336},{8,11,428},{8,11,451},{8,11,460},{8,11,471 -},{8,11,622},{8,11,626},{8,11,679},{8,11,759},{8,11,829},{9,11,11},{9,11,246},{9 -,11,484},{9,11,573},{9,11,706},{9,11,762},{9,11,798},{9,11,855},{9,11,870},{9,11 -,912},{10,11,303},{10,11,335},{10,11,424},{10,11,461},{10,11,543},{10,11,759},{ -10,11,814},{11,11,59},{11,11,199},{11,11,235},{11,11,475},{11,11,590},{11,11,929 -},{11,11,963},{12,11,114},{12,11,182},{12,11,226},{12,11,332},{12,11,439},{12,11 -,575},{12,11,598},{13,11,8},{13,11,125},{13,11,194},{13,11,287},{14,11,197},{14, -11,383},{15,11,53},{17,11,63},{19,11,46},{19,11,98},{19,11,106},{148,11,85},{4,0 -,127},{5,0,350},{6,0,356},{8,0,426},{9,0,572},{10,0,247},{139,0,312},{134,0,1215 -},{6,0,59},{9,0,603},{13,0,397},{7,11,1853},{138,11,437},{134,0,1762},{147,11, -126},{135,10,883},{13,0,293},{142,0,56},{133,10,617},{139,10,50},{5,11,187},{7, -10,1518},{139,10,694},{135,0,441},{6,0,111},{7,0,4},{8,0,163},{8,0,776},{138,0, -566},{132,0,806},{4,11,215},{9,11,38},{10,11,3},{11,11,23},{11,11,127},{139,11, -796},{14,0,233},{4,10,546},{135,10,2042},{135,0,1994},{134,0,1739},{135,11,1530} -,{136,0,393},{5,0,297},{7,0,1038},{14,0,359},{19,0,52},{148,0,47},{135,0,309},{4 -,10,313},{133,10,577},{8,10,184},{141,10,433},{135,10,935},{12,10,186},{12,10, -292},{14,10,100},{146,10,70},{136,0,363},{14,0,175},{11,10,402},{12,10,109},{12, -10,431},{13,10,179},{13,10,206},{14,10,217},{16,10,3},{148,10,53},{5,10,886},{6, -10,46},{6,10,1790},{7,10,14},{7,10,732},{7,10,1654},{8,10,95},{8,10,327},{8,10, -616},{9,10,892},{10,10,598},{10,10,769},{11,10,134},{11,10,747},{12,10,378},{142 -,10,97},{136,0,666},{135,0,1675},{6,0,655},{134,0,1600},{135,0,808},{133,10,1021 -},{4,11,28},{5,11,440},{7,11,248},{11,11,833},{140,11,344},{134,11,1654},{132,0, -280},{140,0,54},{4,0,421},{133,0,548},{132,10,153},{6,11,339},{135,11,923},{133, -11,853},{133,10,798},{132,10,587},{6,11,249},{7,11,1234},{139,11,573},{6,10,598} -,{7,10,42},{8,10,695},{10,10,212},{11,10,158},{14,10,196},{145,10,85},{7,0,249}, -{5,10,957},{133,10,1008},{4,10,129},{135,10,465},{6,0,254},{7,0,842},{7,0,1659}, -{9,0,109},{10,0,103},{7,10,908},{7,10,1201},{9,10,755},{11,10,906},{12,10,527},{ -146,10,7},{5,0,262},{136,10,450},{144,0,1},{10,11,201},{142,11,319},{7,11,49},{7 -,11,392},{8,11,20},{8,11,172},{8,11,690},{9,11,383},{9,11,845},{10,11,48},{11,11 -,293},{11,11,832},{11,11,920},{141,11,221},{5,11,858},{133,11,992},{134,0,805},{ -139,10,1003},{6,0,1630},{134,11,307},{7,11,1512},{135,11,1794},{6,11,268},{137, -11,62},{135,10,1868},{133,0,671},{4,0,989},{8,0,972},{136,0,998},{132,11,423},{ -132,0,889},{135,0,1382},{135,0,1910},{7,10,965},{7,10,1460},{135,10,1604},{4,0, -627},{5,0,775},{138,11,106},{134,11,348},{7,0,202},{11,0,362},{11,0,948},{140,0, -388},{138,11,771},{6,11,613},{136,11,223},{6,0,560},{7,0,451},{8,0,389},{12,0, -490},{13,0,16},{13,0,215},{13,0,351},{18,0,132},{147,0,125},{135,0,841},{136,0, -566},{136,0,938},{132,11,670},{5,0,912},{6,0,1695},{140,11,55},{9,11,40},{139,11 -,136},{7,0,1361},{7,10,982},{10,10,32},{143,10,56},{11,11,259},{140,11,270},{5,0 -,236},{6,0,572},{8,0,492},{11,0,618},{144,0,56},{8,11,572},{9,11,310},{9,11,682} -,{137,11,698},{134,0,1854},{5,0,190},{136,0,318},{133,10,435},{135,0,1376},{4,11 -,296},{6,11,352},{7,11,401},{7,11,1410},{7,11,1594},{7,11,1674},{8,11,63},{8,11, -660},{137,11,74},{7,0,349},{5,10,85},{6,10,419},{7,10,305},{7,10,361},{7,10,1337 -},{8,10,71},{140,10,519},{4,11,139},{4,11,388},{140,11,188},{6,0,1972},{6,0,2013 -},{8,0,951},{10,0,947},{10,0,974},{10,0,1018},{142,0,476},{140,10,688},{135,10, -740},{5,10,691},{7,10,345},{9,10,94},{140,10,169},{9,0,344},{5,10,183},{6,10,582 -},{10,10,679},{140,10,435},{135,10,511},{132,0,850},{8,11,441},{10,11,314},{143, -11,3},{7,10,1993},{136,10,684},{4,11,747},{6,11,290},{6,10,583},{7,11,649},{7,11 -,1479},{135,11,1583},{133,11,232},{133,10,704},{134,0,910},{4,10,179},{5,10,198} -,{133,10,697},{7,10,347},{7,10,971},{8,10,181},{138,10,711},{136,11,525},{14,0, -19},{14,0,28},{144,0,29},{7,0,85},{7,0,247},{8,0,585},{138,0,163},{4,0,487},{7, -11,472},{7,11,1801},{10,11,748},{141,11,458},{4,10,243},{5,10,203},{7,10,19},{7, -10,71},{7,10,113},{10,10,405},{11,10,357},{142,10,240},{7,10,1450},{139,10,99},{ -132,11,425},{138,0,145},{147,0,83},{6,10,492},{137,11,247},{4,0,1013},{134,0, -2033},{5,10,134},{6,10,408},{6,10,495},{135,10,1593},{135,0,1922},{134,11,1768}, -{4,0,124},{10,0,457},{11,0,121},{11,0,169},{11,0,870},{11,0,874},{12,0,214},{14, -0,187},{143,0,77},{5,0,557},{135,0,1457},{139,0,66},{5,11,943},{6,11,1779},{142, -10,4},{4,10,248},{4,10,665},{7,10,137},{137,10,349},{7,0,1193},{5,11,245},{6,11, -576},{7,11,582},{136,11,225},{144,0,82},{7,10,1270},{139,10,612},{5,0,454},{10,0 -,352},{138,11,352},{18,0,57},{5,10,371},{135,10,563},{135,0,1333},{6,0,107},{7,0 -,638},{7,0,1632},{9,0,396},{134,11,610},{5,0,370},{134,0,1756},{4,10,374},{7,10, -547},{7,10,1700},{7,10,1833},{139,10,858},{133,0,204},{6,0,1305},{9,10,311},{141 -,10,42},{5,0,970},{134,0,1706},{6,10,1647},{7,10,1552},{7,10,2010},{9,10,494},{ -137,10,509},{13,11,455},{15,11,99},{15,11,129},{144,11,68},{135,0,3},{4,0,35},{5 -,0,121},{5,0,483},{5,0,685},{6,0,489},{6,0,782},{6,0,1032},{7,0,1204},{136,0,394 -},{4,0,921},{133,0,1007},{8,11,360},{138,11,63},{135,0,1696},{134,0,1519},{132, -11,443},{135,11,944},{6,10,123},{7,10,214},{9,10,728},{10,10,157},{11,10,346},{ -11,10,662},{143,10,106},{137,0,981},{135,10,1435},{134,0,1072},{132,0,712},{134, -0,1629},{134,0,728},{4,11,298},{137,11,483},{6,0,1177},{6,0,1271},{5,11,164},{7, -11,121},{142,11,189},{7,0,1608},{4,10,707},{5,10,588},{6,10,393},{13,10,106},{18 -,10,49},{147,10,41},{23,0,16},{151,11,16},{6,10,211},{7,10,1690},{11,10,486},{ -140,10,369},{133,0,485},{19,11,15},{149,11,27},{4,11,172},{9,11,611},{10,11,436} -,{12,11,673},{141,11,255},{5,11,844},{10,11,484},{11,11,754},{12,11,457},{14,11, -171},{14,11,389},{146,11,153},{4,0,285},{5,0,27},{5,0,317},{6,0,301},{7,0,7},{8, -0,153},{10,0,766},{11,0,468},{12,0,467},{141,0,143},{134,0,1462},{9,11,263},{10, -11,147},{138,11,492},{133,11,537},{6,0,1945},{6,0,1986},{6,0,1991},{134,0,2038}, -{134,10,219},{137,11,842},{14,0,52},{17,0,50},{5,10,582},{6,10,1646},{7,10,99},{ -7,10,1962},{7,10,1986},{8,10,515},{8,10,773},{9,10,23},{9,10,491},{12,10,620},{ -142,10,93},{138,11,97},{20,0,21},{20,0,44},{133,10,851},{136,0,819},{139,0,917}, -{5,11,230},{5,11,392},{6,11,420},{8,10,762},{8,10,812},{9,11,568},{9,10,910},{ -140,11,612},{135,0,784},{15,0,135},{143,11,135},{10,0,454},{140,0,324},{4,11,0}, -{5,11,41},{7,11,1459},{7,11,1469},{7,11,1618},{7,11,1859},{9,11,549},{139,11,905 -},{4,10,98},{7,10,1365},{9,10,422},{9,10,670},{10,10,775},{11,10,210},{13,10,26} -,{13,10,457},{141,10,476},{6,0,1719},{6,0,1735},{7,0,2016},{7,0,2020},{8,0,837}, -{137,0,852},{133,11,696},{135,0,852},{132,0,952},{134,10,1730},{132,11,771},{138 -,0,568},{137,0,448},{139,0,146},{8,0,67},{138,0,419},{133,11,921},{137,10,147},{ -134,0,1826},{10,0,657},{14,0,297},{142,0,361},{6,0,666},{6,0,767},{134,0,1542},{ -139,0,729},{6,11,180},{7,11,1137},{8,11,751},{139,11,805},{4,11,183},{7,11,271}, -{11,11,824},{11,11,952},{13,11,278},{13,11,339},{13,11,482},{14,11,424},{148,11, -99},{4,0,669},{5,11,477},{5,11,596},{6,11,505},{7,11,1221},{11,11,907},{12,11, -209},{141,11,214},{135,11,1215},{5,0,402},{6,10,30},{11,10,56},{139,10,305},{7, -11,564},{142,11,168},{139,0,152},{7,0,912},{135,10,1614},{4,10,150},{5,10,303},{ -134,10,327},{7,0,320},{8,0,51},{9,0,868},{10,0,833},{12,0,481},{12,0,570},{148,0 -,106},{132,0,445},{7,11,274},{11,11,263},{11,11,479},{11,11,507},{140,11,277},{ -10,0,555},{11,0,308},{19,0,95},{6,11,1645},{8,10,192},{10,10,78},{141,10,359},{ -135,10,786},{6,11,92},{6,11,188},{7,11,1269},{7,11,1524},{7,11,1876},{10,11,228} -,{139,11,1020},{4,11,459},{133,11,966},{11,0,386},{6,10,1638},{7,10,79},{7,10, -496},{9,10,138},{10,10,336},{12,10,412},{12,10,440},{142,10,305},{133,0,239},{7, -0,83},{7,0,1990},{8,0,130},{139,0,720},{138,11,709},{4,0,143},{5,0,550},{133,0, -752},{5,0,123},{6,0,530},{7,0,348},{135,0,1419},{135,0,2024},{6,11,18},{7,11,179 -},{7,11,721},{7,11,932},{8,11,548},{8,11,757},{9,11,54},{9,11,65},{9,11,532},{9, -11,844},{10,11,113},{10,11,117},{10,11,236},{10,11,315},{10,11,430},{10,11,798}, -{11,11,153},{11,11,351},{11,11,375},{12,11,78},{12,11,151},{12,11,392},{14,11, -248},{143,11,23},{7,10,204},{7,10,415},{8,10,42},{10,10,85},{139,10,564},{134,0, -958},{133,11,965},{132,0,210},{135,11,1429},{138,11,480},{134,11,182},{139,11, -345},{10,11,65},{10,11,488},{138,11,497},{4,10,3},{5,10,247},{5,10,644},{7,10, -744},{7,10,1207},{7,10,1225},{7,10,1909},{146,10,147},{132,0,430},{5,10,285},{9, -10,67},{13,10,473},{143,10,82},{144,11,16},{7,11,1162},{9,11,588},{10,11,260},{ -151,10,8},{133,0,213},{138,0,7},{135,0,801},{134,11,1786},{135,11,308},{6,0,936} -,{134,0,1289},{133,0,108},{132,0,885},{133,0,219},{139,0,587},{4,0,193},{5,0,916 -},{6,0,1041},{7,0,364},{10,0,398},{10,0,726},{11,0,317},{11,0,626},{12,0,142},{ -12,0,288},{12,0,678},{13,0,313},{15,0,113},{146,0,114},{135,0,1165},{6,0,241},{9 -,0,342},{10,0,729},{11,0,284},{11,0,445},{11,0,651},{11,0,863},{13,0,398},{146,0 -,99},{7,0,907},{136,0,832},{9,0,303},{4,10,29},{6,10,532},{7,10,1628},{7,10,1648 -},{9,10,350},{10,10,433},{11,10,97},{11,10,557},{11,10,745},{12,10,289},{12,10, -335},{12,10,348},{12,10,606},{13,10,116},{13,10,233},{13,10,466},{14,10,181},{14 -,10,209},{14,10,232},{14,10,236},{14,10,300},{16,10,41},{148,10,97},{7,11,423},{ -7,10,1692},{136,11,588},{6,0,931},{134,0,1454},{5,10,501},{7,10,1704},{9,10,553} -,{11,10,520},{12,10,557},{141,10,249},{136,11,287},{4,0,562},{9,0,254},{139,0, -879},{132,0,786},{14,11,32},{18,11,85},{20,11,2},{152,11,16},{135,0,1294},{7,11, -723},{135,11,1135},{6,0,216},{7,0,901},{7,0,1343},{8,0,493},{134,11,403},{7,11, -719},{8,11,809},{136,11,834},{5,11,210},{6,11,213},{7,11,60},{10,11,364},{139,11 -,135},{7,0,341},{11,0,219},{5,11,607},{8,11,326},{136,11,490},{4,11,701},{5,11, -472},{5,11,639},{7,11,1249},{9,11,758},{139,11,896},{135,11,380},{135,11,1947},{ -139,0,130},{135,0,1734},{10,0,115},{11,0,420},{12,0,154},{13,0,404},{14,0,346},{ -143,0,54},{134,10,129},{4,11,386},{7,11,41},{8,11,405},{9,11,497},{11,11,110},{ -11,11,360},{15,11,37},{144,11,84},{141,11,282},{5,11,46},{7,11,1452},{7,11,1480} -,{8,11,634},{140,11,472},{4,11,524},{136,11,810},{10,11,238},{141,11,33},{133,0, -604},{5,0,1011},{136,0,701},{8,0,856},{8,0,858},{8,0,879},{12,0,702},{142,0,447} -,{4,0,54},{5,0,666},{7,0,1039},{7,0,1130},{9,0,195},{138,0,302},{4,10,25},{5,10, -60},{6,10,504},{7,10,614},{7,10,1155},{140,10,0},{7,10,1248},{11,10,621},{139,10 -,702},{133,11,997},{137,10,321},{134,0,1669},{134,0,1791},{4,10,379},{135,10, -1397},{138,11,372},{5,11,782},{5,11,829},{134,11,1738},{135,0,1228},{4,10,118},{ -6,10,274},{6,10,361},{7,10,75},{141,10,441},{132,0,623},{9,11,279},{10,11,407},{ -14,11,84},{150,11,18},{137,10,841},{135,0,798},{140,10,693},{5,10,314},{6,10,221 -},{7,10,419},{10,10,650},{11,10,396},{12,10,156},{13,10,369},{14,10,333},{145,10 -,47},{135,11,1372},{7,0,122},{9,0,259},{10,0,84},{11,0,470},{12,0,541},{141,0, -379},{134,0,837},{8,0,1013},{4,11,78},{5,11,96},{5,11,182},{7,11,1724},{7,11, -1825},{10,11,394},{10,11,471},{11,11,532},{14,11,340},{145,11,88},{134,0,577},{ -135,11,1964},{132,10,913},{134,0,460},{8,0,891},{10,0,901},{10,0,919},{10,0,932} -,{12,0,715},{12,0,728},{12,0,777},{14,0,457},{144,0,103},{5,0,82},{5,0,131},{7,0 -,1755},{8,0,31},{9,0,168},{9,0,764},{139,0,869},{136,10,475},{6,0,605},{5,10, -1016},{9,11,601},{9,11,619},{10,11,505},{10,11,732},{11,11,355},{140,11,139},{7, -10,602},{8,10,179},{10,10,781},{140,10,126},{134,0,1246},{6,10,329},{138,10,111} -,{6,11,215},{7,11,1028},{7,11,1473},{7,11,1721},{9,11,424},{138,11,779},{5,0,278 -},{137,0,68},{6,0,932},{6,0,1084},{144,0,86},{4,0,163},{5,0,201},{5,0,307},{5,0, -310},{6,0,335},{7,0,284},{7,0,1660},{136,0,165},{136,0,781},{134,0,707},{6,0,33} -,{135,0,1244},{5,10,821},{6,11,67},{6,10,1687},{7,11,258},{7,11,1630},{9,11,354} -,{9,11,675},{10,11,830},{14,11,80},{145,11,80},{6,11,141},{7,11,225},{9,11,59},{ -9,11,607},{10,11,312},{11,11,687},{12,11,555},{13,11,373},{13,11,494},{148,11,58 -},{134,0,1113},{9,0,388},{5,10,71},{7,10,1407},{9,10,704},{10,10,261},{10,10,619 -},{11,10,547},{11,10,619},{143,10,157},{7,0,1953},{136,0,720},{138,0,203},{7,10, -2008},{9,10,337},{138,10,517},{6,0,326},{7,0,677},{137,0,425},{139,11,81},{7,0, -1316},{7,0,1412},{7,0,1839},{9,0,589},{11,0,241},{11,0,676},{11,0,811},{11,0,891 -},{12,0,140},{12,0,346},{12,0,479},{13,0,140},{13,0,381},{14,0,188},{18,0,30},{ -148,0,108},{5,0,416},{6,10,86},{6,10,603},{7,10,292},{7,10,561},{8,10,257},{8,10 -,382},{9,10,721},{9,10,778},{11,10,581},{140,10,466},{4,10,486},{133,10,491},{ -134,0,1300},{132,10,72},{7,0,847},{6,10,265},{7,11,430},{139,11,46},{5,11,602},{ -6,11,106},{7,11,1786},{7,11,1821},{7,11,2018},{9,11,418},{137,11,763},{5,0,358}, -{7,0,535},{7,0,1184},{10,0,662},{13,0,212},{13,0,304},{13,0,333},{145,0,98},{5, -11,65},{6,11,416},{7,11,1720},{7,11,1924},{8,11,677},{10,11,109},{11,11,14},{11, -11,70},{11,11,569},{11,11,735},{15,11,153},{148,11,80},{6,0,1823},{8,0,839},{8,0 -,852},{8,0,903},{10,0,940},{12,0,707},{140,0,775},{135,11,1229},{6,0,1522},{140, -0,654},{136,11,595},{139,0,163},{141,0,314},{132,0,978},{4,0,601},{6,0,2035},{ -137,10,234},{5,10,815},{6,10,1688},{134,10,1755},{133,0,946},{136,0,434},{6,10, -197},{136,10,205},{7,0,411},{7,0,590},{8,0,631},{9,0,323},{10,0,355},{11,0,491}, -{12,0,143},{12,0,402},{13,0,73},{14,0,408},{15,0,107},{146,0,71},{7,0,1467},{8,0 -,328},{10,0,544},{11,0,955},{12,0,13},{13,0,320},{145,0,83},{142,0,410},{11,0, -511},{13,0,394},{14,0,298},{14,0,318},{146,0,103},{6,10,452},{7,10,312},{138,10, -219},{138,10,589},{4,10,333},{9,10,176},{12,10,353},{141,10,187},{135,11,329},{ -132,11,469},{5,0,835},{134,0,483},{134,11,1743},{5,11,929},{6,11,340},{8,11,376} -,{136,11,807},{134,10,1685},{132,0,677},{5,11,218},{7,11,1610},{138,11,83},{5,11 -,571},{135,11,1842},{132,11,455},{137,0,70},{135,0,1405},{7,10,135},{8,10,7},{8, -10,62},{9,10,243},{10,10,658},{10,10,697},{11,10,456},{139,10,756},{9,10,395},{ -138,10,79},{137,0,108},{6,11,161},{7,11,372},{137,11,597},{132,11,349},{132,0, -777},{132,0,331},{135,10,631},{133,0,747},{6,11,432},{6,11,608},{139,11,322},{ -138,10,835},{5,11,468},{7,11,1809},{10,11,325},{11,11,856},{12,11,345},{143,11, -104},{133,11,223},{7,10,406},{7,10,459},{8,10,606},{139,10,726},{132,11,566},{ -142,0,68},{4,11,59},{135,11,1394},{6,11,436},{139,11,481},{4,11,48},{5,11,271},{ -135,11,953},{139,11,170},{5,11,610},{136,11,457},{133,11,755},{135,11,1217},{133 -,10,612},{132,11,197},{132,0,505},{4,10,372},{7,10,482},{8,10,158},{9,10,602},{9 -,10,615},{10,10,245},{10,10,678},{10,10,744},{11,10,248},{139,10,806},{133,0,326 -},{5,10,854},{135,10,1991},{4,0,691},{146,0,16},{6,0,628},{9,0,35},{10,0,680},{ -10,0,793},{11,0,364},{13,0,357},{143,0,164},{138,0,654},{6,0,32},{7,0,385},{7,0, -757},{7,0,1916},{8,0,37},{8,0,94},{8,0,711},{9,0,541},{10,0,162},{10,0,795},{11, -0,989},{11,0,1010},{12,0,14},{142,0,308},{133,11,217},{6,0,152},{6,0,349},{6,0, -1682},{7,0,1252},{8,0,112},{9,0,435},{9,0,668},{10,0,290},{10,0,319},{10,0,815}, -{11,0,180},{11,0,837},{12,0,240},{13,0,152},{13,0,219},{142,0,158},{4,0,581},{ -134,0,726},{5,10,195},{135,10,1685},{6,0,126},{7,0,573},{8,0,397},{142,0,44},{ -138,0,89},{7,10,1997},{8,10,730},{139,10,1006},{134,0,1531},{134,0,1167},{5,0, -926},{12,0,203},{133,10,751},{4,11,165},{7,11,1398},{135,11,1829},{7,0,1232},{ -137,0,531},{135,10,821},{134,0,943},{133,0,670},{4,0,880},{139,0,231},{134,0, -1617},{135,0,1957},{5,11,9},{7,11,297},{7,11,966},{140,11,306},{6,0,975},{134,0, -985},{5,10,950},{5,10,994},{134,10,351},{12,11,21},{151,11,7},{5,11,146},{6,11, -411},{138,11,721},{7,0,242},{135,0,1942},{6,11,177},{135,11,467},{5,0,421},{7,10 -,47},{137,10,684},{5,0,834},{7,0,1202},{8,0,14},{9,0,481},{137,0,880},{138,0,465 -},{6,0,688},{9,0,834},{132,10,350},{132,0,855},{4,0,357},{6,0,172},{7,0,143},{ -137,0,413},{133,11,200},{132,0,590},{7,10,1812},{13,10,259},{13,10,356},{14,10, -242},{147,10,114},{133,10,967},{11,0,114},{4,10,473},{7,10,623},{8,10,808},{9,10 -,871},{9,10,893},{11,10,431},{12,10,112},{12,10,217},{12,10,243},{12,10,562},{12 -,10,663},{12,10,683},{13,10,141},{13,10,197},{13,10,227},{13,10,406},{13,10,487} -,{14,10,156},{14,10,203},{14,10,224},{14,10,256},{18,10,58},{150,10,0},{138,10, -286},{4,10,222},{7,10,286},{136,10,629},{5,0,169},{7,0,333},{136,0,45},{134,11, -481},{132,0,198},{4,0,24},{5,0,140},{5,0,185},{7,0,1500},{11,0,565},{11,0,838},{ -4,11,84},{7,11,1482},{10,11,76},{138,11,142},{133,0,585},{141,10,306},{133,11, -1015},{4,11,315},{5,11,507},{135,11,1370},{136,10,146},{6,0,691},{134,0,1503},{4 -,0,334},{133,0,593},{4,10,465},{135,10,1663},{142,11,173},{135,0,913},{12,0,116} -,{134,11,1722},{134,0,1360},{132,0,802},{8,11,222},{8,11,476},{9,11,238},{11,11, -516},{11,11,575},{15,11,109},{146,11,100},{6,0,308},{9,0,673},{7,10,138},{7,10, -517},{139,10,238},{132,0,709},{6,0,1876},{6,0,1895},{9,0,994},{9,0,1006},{12,0, -829},{12,0,888},{12,0,891},{146,0,185},{148,10,94},{4,0,228},{133,0,897},{7,0, -1840},{5,10,495},{7,10,834},{9,10,733},{139,10,378},{133,10,559},{6,10,21},{6,10 -,1737},{7,10,1444},{136,10,224},{4,0,608},{133,0,497},{6,11,40},{135,11,1781},{ -134,0,1573},{135,0,2039},{6,0,540},{136,0,136},{4,0,897},{5,0,786},{133,10,519}, -{6,0,1878},{6,0,1884},{9,0,938},{9,0,948},{9,0,955},{9,0,973},{9,0,1012},{12,0, -895},{12,0,927},{143,0,254},{134,0,1469},{133,0,999},{4,0,299},{135,0,1004},{4,0 -,745},{133,0,578},{136,11,574},{133,0,456},{134,0,1457},{7,0,1679},{132,10,402}, -{7,0,693},{8,0,180},{12,0,163},{8,10,323},{136,10,479},{11,10,580},{142,10,201}, -{5,10,59},{135,10,672},{132,11,354},{146,10,34},{4,0,755},{135,11,1558},{7,0, -1740},{146,0,48},{4,10,85},{135,10,549},{139,0,338},{133,10,94},{134,0,1091},{ -135,11,469},{12,0,695},{12,0,704},{20,0,113},{5,11,830},{14,11,338},{148,11,81}, -{135,0,1464},{6,10,11},{135,10,187},{135,0,975},{13,0,335},{132,10,522},{134,0, -1979},{5,11,496},{135,11,203},{4,10,52},{135,10,661},{7,0,1566},{8,0,269},{9,0, -212},{9,0,718},{14,0,15},{14,0,132},{142,0,227},{4,0,890},{5,0,805},{5,0,819},{5 -,0,961},{6,0,396},{6,0,1631},{6,0,1678},{7,0,1967},{7,0,2041},{9,0,630},{11,0,8} -,{11,0,1019},{12,0,176},{13,0,225},{14,0,292},{21,0,24},{4,10,383},{133,10,520}, -{134,11,547},{135,11,1748},{5,11,88},{137,11,239},{146,11,128},{7,11,650},{135, -11,1310},{4,10,281},{5,10,38},{7,10,194},{7,10,668},{7,10,1893},{137,10,397},{ -135,0,1815},{9,10,635},{139,10,559},{7,0,1505},{10,0,190},{10,0,634},{11,0,792}, -{12,0,358},{140,0,447},{5,0,0},{6,0,536},{7,0,604},{13,0,445},{145,0,126},{7,11, -1076},{9,11,80},{11,11,78},{11,11,421},{11,11,534},{140,11,545},{8,0,966},{10,0, -1023},{14,11,369},{146,11,72},{135,11,1641},{6,0,232},{6,0,412},{7,0,1074},{8,0, -9},{8,0,157},{8,0,786},{9,0,196},{9,0,352},{9,0,457},{10,0,337},{11,0,232},{11,0 -,877},{12,0,480},{140,0,546},{135,0,958},{4,0,382},{136,0,579},{4,0,212},{135,0, -1206},{4,11,497},{5,11,657},{135,11,1584},{132,0,681},{8,0,971},{138,0,965},{5, -10,448},{136,10,535},{14,0,16},{146,0,44},{11,0,584},{11,0,616},{14,0,275},{11, -11,584},{11,11,616},{142,11,275},{136,11,13},{7,10,610},{135,10,1501},{7,11,642} -,{8,11,250},{11,11,123},{11,11,137},{13,11,48},{142,11,95},{133,0,655},{17,0,67} -,{147,0,74},{134,0,751},{134,0,1967},{6,0,231},{136,0,423},{5,0,300},{138,0,1016 -},{4,10,319},{5,10,699},{138,10,673},{6,0,237},{7,0,611},{8,0,100},{9,0,416},{11 -,0,335},{12,0,173},{18,0,101},{6,10,336},{8,10,552},{9,10,285},{10,10,99},{139, -10,568},{134,0,1370},{7,10,1406},{9,10,218},{141,10,222},{133,10,256},{135,0, -1208},{14,11,213},{148,11,38},{6,0,1219},{135,11,1642},{13,0,417},{14,0,129},{ -143,0,15},{10,11,545},{140,11,301},{17,10,39},{148,10,36},{133,0,199},{4,11,904} -,{133,11,794},{12,0,427},{146,0,38},{134,0,949},{8,0,665},{135,10,634},{132,10, -618},{135,10,259},{132,10,339},{133,11,761},{141,10,169},{132,10,759},{5,0,688}, -{7,0,539},{135,0,712},{7,11,386},{138,11,713},{134,0,1186},{6,11,7},{6,11,35},{7 -,11,147},{7,11,1069},{7,11,1568},{7,11,1575},{7,11,1917},{8,11,43},{8,11,208},{9 -,11,128},{9,11,866},{10,11,20},{11,11,981},{147,11,33},{7,11,893},{8,10,482},{ -141,11,424},{6,0,312},{6,0,1715},{10,0,584},{11,0,546},{11,0,692},{12,0,259},{12 -,0,295},{13,0,46},{141,0,154},{5,10,336},{6,10,341},{6,10,478},{6,10,1763},{136, -10,386},{137,0,151},{132,0,588},{152,0,4},{6,11,322},{9,11,552},{11,11,274},{13, -11,209},{13,11,499},{14,11,85},{15,11,126},{145,11,70},{135,10,73},{4,0,231},{5, -0,61},{6,0,104},{7,0,729},{7,0,964},{7,0,1658},{140,0,414},{6,0,263},{138,0,757} -,{135,10,1971},{4,0,612},{133,0,561},{132,0,320},{135,10,1344},{8,11,83},{8,11, -817},{9,11,28},{9,11,29},{9,11,885},{10,11,387},{11,11,633},{11,11,740},{13,11, -235},{13,11,254},{15,11,143},{143,11,146},{5,10,396},{134,10,501},{140,11,49},{ -132,0,225},{4,10,929},{5,10,799},{8,10,46},{136,10,740},{4,0,405},{7,0,817},{14, -0,58},{17,0,37},{146,0,124},{133,0,974},{4,11,412},{133,11,581},{4,10,892},{133, -10,770},{4,0,996},{134,0,2026},{4,0,527},{5,0,235},{7,0,1239},{11,0,131},{140,0, -370},{9,0,16},{13,0,386},{135,11,421},{7,0,956},{7,0,1157},{7,0,1506},{7,0,1606} -,{7,0,1615},{7,0,1619},{7,0,1736},{7,0,1775},{8,0,590},{9,0,324},{9,0,736},{9,0, -774},{9,0,776},{9,0,784},{10,0,567},{10,0,708},{11,0,518},{11,0,613},{11,0,695}, -{11,0,716},{11,0,739},{11,0,770},{11,0,771},{11,0,848},{11,0,857},{11,0,931},{11 -,0,947},{12,0,326},{12,0,387},{12,0,484},{12,0,528},{12,0,552},{12,0,613},{13,0, -189},{13,0,256},{13,0,340},{13,0,432},{13,0,436},{13,0,440},{13,0,454},{14,0,174 -},{14,0,220},{14,0,284},{14,0,390},{145,0,121},{135,10,158},{9,0,137},{138,0,221 -},{4,11,110},{10,11,415},{10,11,597},{142,11,206},{141,11,496},{135,11,205},{151 -,10,25},{135,11,778},{7,11,1656},{7,10,2001},{9,11,369},{10,11,338},{10,11,490}, -{11,11,154},{11,11,545},{11,11,775},{13,11,77},{141,11,274},{4,11,444},{10,11, -146},{140,11,9},{7,0,390},{138,0,140},{135,0,1144},{134,0,464},{7,10,1461},{140, -10,91},{132,10,602},{4,11,283},{135,11,1194},{5,0,407},{11,0,204},{11,0,243},{11 -,0,489},{12,0,293},{19,0,37},{20,0,73},{150,0,38},{7,0,1218},{136,0,303},{5,0, -325},{8,0,5},{8,0,227},{9,0,105},{10,0,585},{12,0,614},{4,10,13},{5,10,567},{7, -10,1498},{9,10,124},{11,10,521},{140,10,405},{135,10,1006},{7,0,800},{10,0,12},{ -134,11,1720},{135,0,1783},{132,10,735},{138,10,812},{4,10,170},{135,10,323},{6,0 -,621},{13,0,504},{144,0,89},{5,10,304},{135,10,1403},{137,11,216},{6,0,920},{6,0 -,1104},{9,11,183},{139,11,286},{4,0,376},{133,10,742},{134,0,218},{8,0,641},{11, -0,388},{140,0,580},{7,0,454},{7,0,782},{8,0,768},{140,0,686},{137,11,33},{133,10 -,111},{144,0,0},{10,0,676},{140,0,462},{6,0,164},{136,11,735},{133,10,444},{150, -0,50},{7,11,1862},{12,11,491},{12,11,520},{13,11,383},{14,11,244},{146,11,12},{5 -,11,132},{9,11,486},{9,11,715},{10,11,458},{11,11,373},{11,11,668},{11,11,795},{ -11,11,897},{12,11,272},{12,11,424},{12,11,539},{12,11,558},{14,11,245},{14,11, -263},{14,11,264},{14,11,393},{142,11,403},{8,10,123},{15,10,6},{144,10,7},{6,0, -285},{8,0,654},{11,0,749},{12,0,190},{12,0,327},{13,0,120},{13,0,121},{13,0,327} -,{15,0,47},{146,0,40},{5,11,8},{6,11,89},{6,11,400},{7,11,1569},{7,11,1623},{7, -11,1850},{8,11,218},{8,11,422},{9,11,570},{138,11,626},{6,11,387},{7,11,882},{ -141,11,111},{6,0,343},{7,0,195},{9,0,226},{10,0,197},{10,0,575},{11,0,502},{11,0 -,899},{6,11,224},{7,11,877},{137,11,647},{5,10,937},{135,10,100},{135,11,790},{ -150,0,29},{147,0,8},{134,0,1812},{149,0,8},{135,11,394},{7,0,1125},{9,0,143},{11 -,0,61},{14,0,405},{150,0,21},{10,11,755},{147,11,29},{9,11,378},{141,11,162},{ -135,10,922},{5,10,619},{133,10,698},{134,0,1327},{6,0,1598},{137,0,575},{9,11, -569},{12,11,12},{12,11,81},{12,11,319},{13,11,69},{14,11,259},{16,11,87},{17,11, -1},{17,11,21},{17,11,24},{18,11,15},{18,11,56},{18,11,59},{18,11,127},{18,11,154 -},{19,11,19},{148,11,31},{6,0,895},{135,11,1231},{5,0,959},{7,11,124},{136,11,38 -},{5,11,261},{7,11,78},{7,11,199},{8,11,815},{9,11,126},{138,11,342},{5,10,917}, -{134,10,1659},{7,0,1759},{5,11,595},{135,11,1863},{136,0,173},{134,0,266},{142,0 -,261},{132,11,628},{5,10,251},{5,10,956},{8,10,268},{9,10,214},{146,10,142},{7, -11,266},{136,11,804},{135,11,208},{6,11,79},{7,11,1021},{135,11,1519},{11,11,704 -},{141,11,396},{5,10,346},{5,10,711},{136,10,390},{136,11,741},{134,11,376},{134 -,0,1427},{6,0,1033},{6,0,1217},{136,0,300},{133,10,624},{6,11,100},{7,11,244},{7 -,11,632},{7,11,1609},{8,11,178},{8,11,638},{141,11,58},{6,0,584},{5,10,783},{7, -10,1998},{135,10,2047},{5,0,427},{5,0,734},{7,0,478},{136,0,52},{7,0,239},{11,0, -217},{142,0,165},{134,0,1129},{6,0,168},{6,0,1734},{7,0,20},{7,0,1056},{8,0,732} -,{9,0,406},{9,0,911},{138,0,694},{132,10,594},{133,11,791},{7,11,686},{8,11,33}, -{8,11,238},{10,11,616},{11,11,467},{11,11,881},{13,11,217},{13,11,253},{142,11, -268},{137,11,476},{134,0,418},{133,0,613},{132,0,632},{132,11,447},{7,0,32},{7,0 -,984},{8,0,85},{8,0,709},{9,0,579},{9,0,847},{9,0,856},{10,0,799},{11,0,258},{11 -,0,1007},{12,0,331},{12,0,615},{13,0,188},{13,0,435},{14,0,8},{15,0,165},{16,0, -27},{20,0,40},{144,11,35},{4,11,128},{5,11,415},{6,11,462},{7,11,294},{7,11,578} -,{10,11,710},{139,11,86},{5,0,694},{136,0,909},{7,0,1109},{11,0,7},{5,10,37},{6, -10,39},{6,10,451},{7,10,218},{7,10,1166},{7,10,1687},{8,10,662},{144,10,2},{136, -11,587},{6,11,427},{7,11,1018},{138,11,692},{4,11,195},{6,10,508},{135,11,802},{ -4,0,167},{135,0,82},{5,0,62},{6,0,24},{6,0,534},{7,0,74},{7,0,678},{7,0,684},{7, -0,1043},{7,0,1072},{8,0,280},{8,0,541},{8,0,686},{9,0,258},{10,0,519},{11,0,252} -,{140,0,282},{138,0,33},{4,0,359},{133,11,738},{7,0,980},{9,0,328},{13,0,186},{ -13,0,364},{7,10,635},{7,10,796},{8,10,331},{9,10,330},{9,10,865},{10,10,119},{10 -,10,235},{11,10,111},{11,10,129},{11,10,240},{12,10,31},{12,10,66},{12,10,222},{ -12,10,269},{12,10,599},{12,10,684},{12,10,689},{12,10,691},{142,10,345},{137,10, -527},{6,0,596},{7,0,585},{135,10,702},{134,11,1683},{133,0,211},{6,0,145},{141,0 -,336},{134,0,1130},{7,0,873},{6,10,37},{7,10,1666},{8,10,195},{8,10,316},{9,10, -178},{9,10,276},{9,10,339},{9,10,536},{10,10,102},{10,10,362},{10,10,785},{11,10 -,55},{11,10,149},{11,10,773},{13,10,416},{13,10,419},{14,10,38},{14,10,41},{142, -10,210},{8,0,840},{136,0,841},{132,0,263},{5,11,3},{8,11,578},{9,11,118},{10,11, -705},{12,11,383},{141,11,279},{132,0,916},{133,11,229},{133,10,645},{15,0,155},{ -16,0,79},{8,11,102},{10,11,578},{10,11,672},{12,11,496},{13,11,408},{14,11,121}, -{145,11,106},{4,0,599},{5,0,592},{6,0,1634},{7,0,5},{7,0,55},{7,0,67},{7,0,97},{ -7,0,691},{7,0,979},{7,0,1600},{7,0,1697},{8,0,207},{8,0,214},{8,0,231},{8,0,294} -,{8,0,336},{8,0,428},{8,0,471},{8,0,622},{8,0,626},{8,0,679},{8,0,759},{8,0,829} -,{9,0,11},{9,0,246},{9,0,484},{9,0,573},{9,0,706},{9,0,762},{9,0,798},{9,0,855}, -{9,0,870},{9,0,912},{10,0,303},{10,0,335},{10,0,424},{10,0,461},{10,0,543},{10,0 -,759},{10,0,814},{11,0,59},{11,0,199},{11,0,235},{11,0,590},{11,0,631},{11,0,929 -},{11,0,963},{11,0,987},{12,0,114},{12,0,182},{12,0,226},{12,0,332},{12,0,439},{ -12,0,575},{12,0,598},{12,0,675},{13,0,8},{13,0,125},{13,0,194},{13,0,287},{14,0, -197},{14,0,383},{15,0,53},{17,0,63},{19,0,46},{19,0,98},{19,0,106},{148,0,85},{7 -,0,1356},{132,10,290},{6,10,70},{7,10,1292},{10,10,762},{139,10,288},{150,11,55} -,{4,0,593},{8,11,115},{8,11,350},{9,11,489},{10,11,128},{11,11,306},{12,11,373}, -{14,11,30},{17,11,79},{147,11,80},{135,11,1235},{134,0,1392},{4,11,230},{133,11, -702},{147,0,126},{7,10,131},{7,10,422},{8,10,210},{140,10,573},{134,0,1179},{139 -,11,435},{139,10,797},{134,11,1728},{4,0,162},{18,11,26},{19,11,42},{20,11,43},{ -21,11,0},{23,11,27},{152,11,14},{132,10,936},{6,0,765},{5,10,453},{134,10,441},{ -133,0,187},{135,0,1286},{6,0,635},{6,0,904},{6,0,1210},{134,0,1489},{4,0,215},{8 -,0,890},{9,0,38},{10,0,923},{11,0,23},{11,0,127},{139,0,796},{6,0,1165},{134,0, -1306},{7,0,716},{13,0,97},{141,0,251},{132,10,653},{136,0,657},{146,10,80},{5,11 -,622},{7,11,1032},{11,11,26},{11,11,213},{11,11,707},{12,11,380},{13,11,226},{ -141,11,355},{6,0,299},{5,11,70},{6,11,334},{9,11,171},{11,11,637},{12,11,202},{ -14,11,222},{145,11,42},{142,0,134},{4,11,23},{5,11,313},{5,11,1014},{6,11,50},{6 -,11,51},{7,11,142},{7,11,384},{9,11,783},{139,11,741},{4,11,141},{7,11,559},{8, -11,640},{9,11,460},{12,11,183},{141,11,488},{136,11,614},{7,10,1368},{8,10,232}, -{8,10,361},{10,10,682},{138,10,742},{137,10,534},{6,0,1082},{140,0,658},{137,10, -27},{135,0,2002},{142,10,12},{4,0,28},{5,0,440},{7,0,248},{11,0,833},{140,0,344} -,{7,10,736},{139,10,264},{134,10,1657},{134,0,1654},{138,0,531},{5,11,222},{9,11 -,140},{138,11,534},{6,0,634},{6,0,798},{134,0,840},{138,11,503},{135,10,127},{ -133,0,853},{5,11,154},{7,11,1491},{10,11,379},{138,11,485},{6,0,249},{7,0,1234}, -{139,0,573},{133,11,716},{7,11,1570},{140,11,542},{136,10,364},{138,0,527},{4,11 -,91},{5,11,388},{5,11,845},{6,11,206},{6,11,252},{6,11,365},{7,11,136},{7,11,531 -},{8,11,264},{136,11,621},{134,0,1419},{135,11,1441},{7,0,49},{7,0,392},{8,0,20} -,{8,0,172},{8,0,690},{9,0,383},{9,0,845},{10,0,48},{11,0,293},{11,0,832},{11,0, -920},{11,0,984},{141,0,221},{5,0,858},{133,0,992},{5,0,728},{137,10,792},{5,10, -909},{9,10,849},{138,10,805},{7,0,525},{7,0,1579},{8,0,497},{136,0,573},{6,0,268 -},{137,0,62},{135,11,576},{134,0,1201},{5,11,771},{5,11,863},{5,11,898},{6,11, -1632},{6,11,1644},{134,11,1780},{133,11,331},{7,0,193},{7,0,1105},{10,0,495},{7, -10,397},{8,10,124},{8,10,619},{9,10,305},{11,10,40},{12,10,349},{13,10,134},{13, -10,295},{14,10,155},{15,10,120},{146,10,105},{138,0,106},{6,0,859},{5,11,107},{7 -,11,201},{136,11,518},{6,11,446},{135,11,1817},{13,0,23},{4,10,262},{135,10,342} -,{133,10,641},{137,11,851},{6,0,925},{137,0,813},{132,11,504},{6,0,613},{136,0, -223},{4,10,99},{6,10,250},{6,10,346},{8,10,127},{138,10,81},{136,0,953},{132,10, -915},{139,11,892},{5,10,75},{9,10,517},{10,10,470},{12,10,155},{141,10,224},{4,0 -,666},{7,0,1017},{7,11,996},{138,11,390},{5,11,883},{133,11,975},{14,10,83},{142 -,11,83},{4,0,670},{5,11,922},{134,11,1707},{135,0,216},{9,0,40},{11,0,136},{135, -11,787},{5,10,954},{5,11,993},{7,11,515},{137,11,91},{139,0,259},{7,0,1114},{9,0 -,310},{9,0,682},{10,0,440},{13,0,40},{6,10,304},{8,10,418},{11,10,341},{139,10, -675},{14,0,296},{9,10,410},{139,10,425},{10,11,377},{12,11,363},{13,11,68},{13, -11,94},{14,11,108},{142,11,306},{7,0,1401},{135,0,1476},{4,0,296},{6,0,475},{7,0 -,401},{7,0,1410},{7,0,1594},{7,0,1674},{8,0,63},{8,0,660},{137,0,74},{4,0,139},{ -4,0,388},{140,0,188},{132,0,797},{132,11,766},{5,11,103},{7,11,921},{8,11,580},{ -8,11,593},{8,11,630},{138,11,28},{4,11,911},{5,11,867},{133,11,1013},{134,10,14} -,{134,0,1572},{134,10,1708},{21,0,39},{5,10,113},{6,10,243},{7,10,1865},{11,10, -161},{16,10,37},{145,10,99},{7,11,1563},{141,11,182},{5,11,135},{6,11,519},{7,11 -,1722},{10,11,271},{11,11,261},{145,11,54},{132,10,274},{134,0,1594},{4,11,300}, -{5,11,436},{135,11,484},{4,0,747},{6,0,290},{7,0,649},{7,0,1479},{135,0,1583},{ -133,11,535},{147,11,82},{133,0,232},{137,0,887},{135,10,166},{136,0,521},{4,0,14 -},{7,0,472},{7,0,1801},{10,0,748},{141,0,458},{134,0,741},{134,0,992},{16,0,111} -,{137,10,304},{4,0,425},{5,11,387},{7,11,557},{12,11,547},{142,11,86},{135,11, -1747},{5,10,654},{135,11,1489},{7,0,789},{4,11,6},{5,11,708},{136,11,75},{6,10, -273},{10,10,188},{13,10,377},{146,10,77},{6,0,1593},{4,11,303},{7,11,619},{10,11 -,547},{10,11,687},{11,11,122},{140,11,601},{134,0,1768},{135,10,410},{138,11,772 -},{11,0,233},{139,10,524},{5,0,943},{134,0,1779},{134,10,1785},{136,11,529},{132 -,0,955},{5,0,245},{6,0,576},{7,0,582},{136,0,225},{132,10,780},{142,0,241},{134, -0,1943},{4,11,106},{7,11,310},{7,11,1785},{10,11,690},{139,11,717},{134,0,1284}, -{5,11,890},{133,11,988},{6,11,626},{142,11,431},{10,11,706},{145,11,32},{137,11, -332},{132,11,698},{135,0,709},{5,10,948},{138,11,17},{136,0,554},{134,0,1564},{ -139,10,941},{132,0,443},{134,0,909},{134,11,84},{142,0,280},{4,10,532},{5,10,706 -},{135,10,662},{132,0,729},{5,10,837},{6,10,1651},{139,10,985},{135,10,1861},{4, -0,348},{152,11,3},{5,11,986},{6,11,130},{7,11,1582},{8,11,458},{10,11,101},{10, -11,318},{138,11,823},{134,0,758},{4,0,298},{137,0,848},{4,10,330},{7,10,933},{7, -10,2012},{136,10,292},{7,11,1644},{137,11,129},{6,0,1422},{9,0,829},{135,10,767} -,{5,0,164},{7,0,121},{142,0,189},{7,0,812},{7,0,1261},{7,0,1360},{9,0,632},{140, -0,352},{135,11,1788},{139,0,556},{135,11,997},{145,10,114},{4,0,172},{9,0,611},{ -10,0,436},{12,0,673},{13,0,255},{137,10,883},{11,0,530},{138,10,274},{133,0,844} -,{134,0,984},{13,0,232},{18,0,35},{4,10,703},{135,10,207},{132,10,571},{9,0,263} -,{10,0,147},{138,0,492},{7,11,1756},{137,11,98},{5,10,873},{5,10,960},{8,10,823} -,{137,10,881},{133,0,537},{132,0,859},{7,11,1046},{139,11,160},{137,0,842},{139, -10,283},{5,10,33},{6,10,470},{139,10,424},{6,11,45},{7,11,433},{8,11,129},{9,11, -21},{10,11,392},{11,11,79},{12,11,499},{13,11,199},{141,11,451},{135,0,1291},{ -135,10,1882},{7,11,558},{136,11,353},{134,0,1482},{5,0,230},{5,0,392},{6,0,420}, -{9,0,568},{140,0,612},{6,0,262},{7,10,90},{7,10,664},{7,10,830},{7,10,1380},{7, -10,2025},{8,11,81},{8,10,448},{8,10,828},{9,11,189},{9,11,201},{11,11,478},{11, -11,712},{141,11,338},{142,0,31},{5,11,353},{151,11,26},{132,0,753},{4,0,0},{5,0, -41},{7,0,1459},{7,0,1469},{7,0,1859},{9,0,549},{139,0,905},{9,10,417},{137,10, -493},{135,11,1113},{133,0,696},{141,11,448},{134,10,295},{132,0,834},{4,0,771},{ -5,10,1019},{6,11,25},{7,11,855},{7,11,1258},{144,11,32},{134,0,1076},{133,0,921} -,{133,0,674},{4,11,4},{7,11,1118},{7,11,1320},{7,11,1706},{8,11,277},{9,11,622}, -{10,11,9},{11,11,724},{12,11,350},{12,11,397},{13,11,28},{13,11,159},{15,11,89}, -{18,11,5},{19,11,9},{20,11,34},{150,11,47},{134,10,208},{6,0,444},{136,0,308},{6 -,0,180},{7,0,1137},{8,0,751},{139,0,805},{4,0,183},{7,0,271},{11,0,824},{11,0, -952},{13,0,278},{13,0,339},{13,0,482},{14,0,424},{148,0,99},{7,11,317},{135,11, -569},{4,0,19},{5,0,477},{5,0,596},{6,0,505},{7,0,1221},{11,0,907},{12,0,209},{ -141,0,214},{135,0,1215},{6,0,271},{7,0,398},{8,0,387},{10,0,344},{7,10,448},{7, -10,1629},{7,10,1813},{8,10,442},{9,10,710},{10,10,282},{138,10,722},{11,10,844}, -{12,10,104},{140,10,625},{134,11,255},{133,10,787},{134,0,1645},{11,11,956},{151 -,11,3},{6,0,92},{6,0,188},{7,0,209},{7,0,1269},{7,0,1524},{7,0,1876},{8,0,661},{ -10,0,42},{10,0,228},{11,0,58},{11,0,1020},{12,0,58},{12,0,118},{141,0,32},{4,0, -459},{133,0,966},{4,11,536},{7,11,1141},{10,11,723},{139,11,371},{140,0,330},{ -134,0,1557},{7,11,285},{135,11,876},{136,10,491},{135,11,560},{6,0,18},{7,0,179} -,{7,0,932},{8,0,548},{8,0,757},{9,0,54},{9,0,65},{9,0,532},{9,0,844},{10,0,113}, -{10,0,117},{10,0,315},{10,0,560},{10,0,622},{10,0,798},{11,0,153},{11,0,351},{11 -,0,375},{12,0,78},{12,0,151},{12,0,392},{12,0,666},{14,0,248},{143,0,23},{6,0, -1742},{132,11,690},{4,10,403},{5,10,441},{7,10,450},{10,10,840},{11,10,101},{12, -10,193},{141,10,430},{133,0,965},{134,0,182},{10,0,65},{10,0,488},{138,0,497},{ -135,11,1346},{6,0,973},{6,0,1158},{10,11,200},{19,11,2},{151,11,22},{4,11,190},{ -133,11,554},{133,10,679},{7,0,328},{137,10,326},{133,11,1001},{9,0,588},{138,0, -260},{133,11,446},{135,10,1128},{135,10,1796},{147,11,119},{134,0,1786},{6,0, -1328},{6,0,1985},{8,0,962},{138,0,1017},{135,0,308},{11,0,508},{4,10,574},{7,10, -350},{7,10,1024},{8,10,338},{9,10,677},{138,10,808},{138,11,752},{135,10,1081},{ -137,11,96},{7,10,1676},{135,10,2037},{136,0,588},{132,11,304},{133,0,614},{140,0 -,793},{136,0,287},{137,10,297},{141,10,37},{6,11,53},{6,11,199},{7,11,1408},{8, -11,32},{8,11,93},{9,11,437},{10,11,397},{10,11,629},{11,11,593},{11,11,763},{13, -11,326},{145,11,35},{134,11,105},{9,11,320},{10,11,506},{138,11,794},{5,11,114}, -{5,11,255},{141,11,285},{140,0,290},{7,11,2035},{8,11,19},{9,11,89},{138,11,831} -,{134,0,1136},{7,0,719},{8,0,796},{8,0,809},{8,0,834},{6,10,306},{7,10,1140},{7, -10,1340},{8,10,133},{138,10,449},{139,10,1011},{5,0,210},{6,0,213},{7,0,60},{10, -0,364},{139,0,135},{5,0,607},{8,0,326},{136,0,490},{138,11,176},{132,0,701},{5,0 -,472},{7,0,380},{137,0,758},{135,0,1947},{6,0,1079},{138,0,278},{138,11,391},{5, -10,329},{8,10,260},{139,11,156},{4,0,386},{7,0,41},{8,0,405},{8,0,728},{9,0,497} -,{11,0,110},{11,0,360},{15,0,37},{144,0,84},{5,0,46},{7,0,1452},{7,0,1480},{8,0, -634},{140,0,472},{136,0,961},{4,0,524},{136,0,810},{10,0,238},{141,0,33},{132,10 -,657},{152,10,7},{133,0,532},{5,0,997},{135,10,1665},{7,11,594},{7,11,851},{7,11 -,1858},{9,11,411},{9,11,574},{9,11,666},{9,11,737},{10,11,346},{10,11,712},{11, -11,246},{11,11,432},{11,11,517},{11,11,647},{11,11,679},{11,11,727},{12,11,304}, -{12,11,305},{12,11,323},{12,11,483},{12,11,572},{12,11,593},{12,11,602},{13,11, -95},{13,11,101},{13,11,171},{13,11,315},{13,11,378},{13,11,425},{13,11,475},{14, -11,63},{14,11,380},{14,11,384},{15,11,133},{18,11,112},{148,11,72},{5,11,955},{ -136,11,814},{134,0,1301},{5,10,66},{7,10,1896},{136,10,288},{133,11,56},{134,10, -1643},{6,0,1298},{148,11,100},{5,0,782},{5,0,829},{6,0,671},{6,0,1156},{6,0,1738 -},{137,11,621},{4,0,306},{5,0,570},{7,0,1347},{5,10,91},{5,10,648},{5,10,750},{5 -,10,781},{6,10,54},{6,10,112},{6,10,402},{6,10,1732},{7,10,315},{7,10,749},{7,10 -,1900},{9,10,78},{9,10,508},{10,10,611},{10,10,811},{11,10,510},{11,10,728},{13, -10,36},{14,10,39},{16,10,83},{17,10,124},{148,10,30},{8,10,570},{9,11,477},{141, -11,78},{4,11,639},{10,11,4},{10,10,322},{10,10,719},{11,10,407},{11,11,638},{12, -11,177},{148,11,57},{7,0,1823},{139,0,693},{7,0,759},{5,11,758},{8,10,125},{8,10 -,369},{8,10,524},{10,10,486},{11,10,13},{11,10,381},{11,10,736},{11,10,766},{11, -10,845},{13,10,114},{13,10,292},{142,10,47},{7,0,1932},{6,10,1684},{6,10,1731},{ -7,10,356},{8,10,54},{8,10,221},{9,10,225},{9,10,356},{10,10,77},{10,10,446},{10, -10,731},{12,10,404},{141,10,491},{135,11,552},{135,11,1112},{4,0,78},{5,0,96},{5 -,0,182},{6,0,1257},{7,0,1724},{7,0,1825},{10,0,394},{10,0,471},{11,0,532},{14,0, -340},{145,0,88},{139,11,328},{135,0,1964},{132,10,411},{4,10,80},{5,10,44},{137, -11,133},{5,11,110},{6,11,169},{6,11,1702},{7,11,400},{8,11,538},{9,11,184},{9,11 -,524},{140,11,218},{4,0,521},{5,10,299},{7,10,1083},{140,11,554},{6,11,133},{9, -11,353},{12,11,628},{146,11,79},{6,0,215},{7,0,584},{7,0,1028},{7,0,1473},{7,0, -1721},{9,0,424},{138,0,779},{7,0,857},{7,0,1209},{7,10,1713},{9,10,537},{10,10, -165},{12,10,219},{140,10,561},{4,10,219},{6,11,93},{7,11,1422},{7,10,1761},{7,11 -,1851},{8,11,673},{9,10,86},{9,11,529},{140,11,43},{137,11,371},{136,0,671},{5,0 -,328},{135,0,918},{132,0,529},{9,11,25},{10,11,467},{138,11,559},{4,11,335},{135 -,11,942},{134,0,716},{134,0,1509},{6,0,67},{7,0,258},{7,0,1630},{9,0,354},{9,0, -675},{10,0,830},{14,0,80},{17,0,80},{140,10,428},{134,0,1112},{6,0,141},{7,0,225 -},{9,0,59},{9,0,607},{10,0,312},{11,0,687},{12,0,555},{13,0,373},{13,0,494},{148 -,0,58},{133,10,514},{8,11,39},{10,11,773},{11,11,84},{12,11,205},{142,11,1},{8,0 -,783},{5,11,601},{133,11,870},{136,11,594},{4,10,55},{5,10,301},{6,10,571},{14, -10,49},{146,10,102},{132,11,181},{134,11,1652},{133,10,364},{4,11,97},{5,11,147} -,{6,11,286},{7,11,1362},{141,11,176},{4,10,76},{7,10,1550},{9,10,306},{9,10,430} -,{9,10,663},{10,10,683},{11,10,427},{11,10,753},{12,10,334},{12,10,442},{14,10, -258},{14,10,366},{143,10,131},{137,10,52},{6,0,955},{134,0,1498},{6,11,375},{7, -11,169},{7,11,254},{136,11,780},{7,0,430},{11,0,46},{14,0,343},{142,11,343},{135 -,0,1183},{5,0,602},{7,0,2018},{9,0,418},{9,0,803},{135,11,1447},{8,0,677},{135, -11,1044},{139,11,285},{4,10,656},{135,10,779},{135,10,144},{5,11,629},{135,11, -1549},{135,10,1373},{138,11,209},{7,10,554},{7,10,605},{141,10,10},{5,10,838},{5 -,10,841},{134,10,1649},{133,10,1012},{6,0,1357},{134,0,1380},{144,0,53},{6,0,590 -},{7,10,365},{7,10,1357},{7,10,1497},{8,10,154},{141,10,281},{133,10,340},{132, -11,420},{135,0,329},{147,11,32},{4,0,469},{10,11,429},{139,10,495},{8,10,261},{9 -,10,144},{9,10,466},{10,10,370},{12,10,470},{13,10,144},{142,10,348},{142,0,460} -,{4,11,325},{9,10,897},{138,11,125},{6,0,1743},{6,10,248},{9,10,546},{10,10,535} -,{11,10,681},{141,10,135},{4,0,990},{5,0,929},{6,0,340},{8,0,376},{8,0,807},{8,0 -,963},{8,0,980},{138,0,1007},{134,0,1603},{140,0,250},{4,11,714},{133,11,469},{ -134,10,567},{136,10,445},{5,0,218},{7,0,1610},{8,0,646},{10,0,83},{11,11,138},{ -140,11,40},{7,0,1512},{135,0,1794},{135,11,1216},{11,0,0},{16,0,78},{132,11,718} -,{133,0,571},{132,0,455},{134,0,1012},{5,11,124},{5,11,144},{6,11,548},{7,11,15} -,{7,11,153},{137,11,629},{142,11,10},{6,11,75},{7,11,1531},{8,11,416},{9,11,240} -,{9,11,275},{10,11,100},{11,11,658},{11,11,979},{12,11,86},{13,11,468},{14,11,66 -},{14,11,207},{15,11,20},{15,11,25},{144,11,58},{132,10,577},{5,11,141},{5,11, -915},{6,11,1783},{7,11,211},{7,11,698},{7,11,1353},{9,11,83},{9,11,281},{10,11, -376},{10,11,431},{11,11,543},{12,11,664},{13,11,280},{13,11,428},{14,11,61},{14, -11,128},{17,11,52},{145,11,81},{6,0,161},{7,0,372},{137,0,597},{132,0,349},{10, -11,702},{139,11,245},{134,0,524},{134,10,174},{6,0,432},{9,0,751},{139,0,322},{ -147,11,94},{4,11,338},{133,11,400},{5,0,468},{10,0,325},{11,0,856},{12,0,345},{ -143,0,104},{133,0,223},{132,0,566},{4,11,221},{5,11,659},{5,11,989},{7,11,697},{ -7,11,1211},{138,11,284},{135,11,1070},{4,0,59},{135,0,1394},{6,0,436},{11,0,481} -,{5,10,878},{133,10,972},{4,0,48},{5,0,271},{135,0,953},{5,0,610},{136,0,457},{4 -,0,773},{5,0,618},{137,0,756},{133,0,755},{135,0,1217},{138,11,507},{132,10,351} -,{132,0,197},{143,11,78},{4,11,188},{7,11,805},{11,11,276},{142,11,293},{5,11, -884},{139,11,991},{132,10,286},{10,0,259},{10,0,428},{7,10,438},{7,10,627},{7,10 -,1516},{8,10,40},{9,10,56},{9,10,294},{11,10,969},{11,10,995},{146,10,148},{4,0, -356},{5,0,217},{5,0,492},{5,0,656},{8,0,544},{136,11,544},{5,0,259},{6,0,1230},{ -7,0,414},{7,0,854},{142,0,107},{132,0,1007},{15,0,14},{144,0,5},{6,0,1580},{132, -10,738},{132,11,596},{132,0,673},{133,10,866},{6,0,1843},{135,11,1847},{4,0,165} -,{7,0,1398},{135,0,1829},{135,11,1634},{147,11,65},{6,0,885},{6,0,1009},{137,0, -809},{133,10,116},{132,10,457},{136,11,770},{9,0,498},{12,0,181},{10,11,361},{ -142,11,316},{134,11,595},{5,0,9},{7,0,297},{7,0,966},{140,0,306},{4,11,89},{5,11 -,489},{6,11,315},{7,11,553},{7,11,1745},{138,11,243},{134,0,1487},{132,0,437},{5 -,0,146},{6,0,411},{138,0,721},{5,10,527},{6,10,189},{135,10,859},{11,10,104},{11 -,10,554},{15,10,60},{143,10,125},{6,11,1658},{9,11,3},{10,11,154},{11,11,641},{ -13,11,85},{13,11,201},{141,11,346},{6,0,177},{135,0,467},{134,0,1377},{134,10, -116},{136,11,645},{4,11,166},{5,11,505},{6,11,1670},{137,11,110},{133,10,487},{4 -,10,86},{5,10,667},{5,10,753},{6,10,316},{6,10,455},{135,10,946},{133,0,200},{ -132,0,959},{6,0,1928},{134,0,1957},{139,11,203},{150,10,45},{4,10,79},{7,10,1773 -},{10,10,450},{11,10,589},{13,10,332},{13,10,493},{14,10,183},{14,10,334},{14,10 -,362},{14,10,368},{14,10,376},{14,10,379},{19,10,90},{19,10,103},{19,10,127},{ -148,10,90},{6,0,1435},{135,11,1275},{134,0,481},{7,11,445},{8,11,307},{8,11,704} -,{10,11,41},{10,11,439},{11,11,237},{11,11,622},{140,11,201},{135,11,869},{4,0, -84},{7,0,1482},{10,0,76},{138,0,142},{11,11,277},{144,11,14},{135,11,1977},{4,11 -,189},{5,11,713},{136,11,57},{133,0,1015},{138,11,371},{4,0,315},{5,0,507},{135, -0,1370},{4,11,552},{142,10,381},{9,0,759},{16,0,31},{16,0,39},{16,0,75},{18,0,24 -},{20,0,42},{152,0,1},{134,0,712},{134,0,1722},{133,10,663},{133,10,846},{8,0, -222},{8,0,476},{9,0,238},{11,0,516},{11,0,575},{15,0,109},{146,0,100},{7,0,1402} -,{7,0,1414},{12,0,456},{5,10,378},{8,10,465},{9,10,286},{10,10,185},{10,10,562}, -{10,10,635},{11,10,31},{11,10,393},{13,10,312},{18,10,65},{18,10,96},{147,10,89} -,{4,0,986},{6,0,1958},{6,0,2032},{8,0,934},{138,0,985},{7,10,1880},{9,10,680},{ -139,10,798},{134,10,1770},{145,11,49},{132,11,614},{132,10,648},{5,10,945},{6,10 -,1656},{6,10,1787},{7,10,167},{8,10,824},{9,10,391},{10,10,375},{139,10,185},{ -138,11,661},{7,0,1273},{135,11,1945},{7,0,706},{7,0,1058},{138,0,538},{7,10,1645 -},{8,10,352},{137,10,249},{132,10,152},{11,0,92},{11,0,196},{11,0,409},{11,0,450 -},{11,0,666},{11,0,777},{12,0,262},{13,0,385},{13,0,393},{15,0,115},{16,0,45},{ -145,0,82},{133,10,1006},{6,0,40},{135,0,1781},{9,11,614},{139,11,327},{5,10,420} -,{135,10,1449},{135,0,431},{10,0,97},{135,10,832},{6,0,423},{7,0,665},{135,0, -1210},{7,0,237},{8,0,664},{9,0,42},{9,0,266},{9,0,380},{9,0,645},{10,0,177},{138 -,0,276},{7,0,264},{133,10,351},{8,0,213},{5,10,40},{7,10,598},{7,10,1638},{9,10, -166},{9,10,640},{9,10,685},{9,10,773},{11,10,215},{13,10,65},{14,10,172},{14,10, -317},{145,10,6},{5,11,84},{134,11,163},{8,10,60},{9,10,343},{139,10,769},{137,0, -455},{133,11,410},{8,0,906},{12,0,700},{12,0,706},{140,0,729},{21,11,33},{150,11 -,40},{7,10,1951},{8,10,765},{8,10,772},{140,10,671},{7,10,108},{8,10,219},{8,10, -388},{9,10,639},{9,10,775},{11,10,275},{140,10,464},{5,11,322},{7,11,1941},{8,11 -,186},{9,11,262},{10,11,187},{14,11,208},{146,11,130},{139,0,624},{8,0,574},{5, -11,227},{140,11,29},{7,11,1546},{11,11,299},{142,11,407},{5,10,15},{6,10,56},{7, -10,1758},{8,10,500},{9,10,730},{11,10,331},{13,10,150},{142,10,282},{7,11,1395}, -{8,11,486},{9,11,236},{9,11,878},{10,11,218},{11,11,95},{19,11,17},{147,11,31},{ -135,11,2043},{4,0,354},{146,11,4},{140,11,80},{135,0,1558},{134,10,1886},{5,10, -205},{6,10,438},{137,10,711},{133,11,522},{133,10,534},{7,0,235},{7,0,1475},{15, -0,68},{146,0,120},{137,10,691},{4,0,942},{6,0,1813},{8,0,917},{10,0,884},{12,0, -696},{12,0,717},{12,0,723},{12,0,738},{12,0,749},{12,0,780},{16,0,97},{146,0,169 -},{6,10,443},{8,11,562},{9,10,237},{9,10,571},{9,10,695},{10,10,139},{11,10,715} -,{12,10,417},{141,10,421},{135,0,957},{133,0,830},{134,11,1771},{146,0,23},{5,0, -496},{6,0,694},{7,0,203},{7,11,1190},{137,11,620},{137,11,132},{6,0,547},{134,0, -1549},{8,11,258},{9,11,208},{137,11,359},{4,0,864},{5,0,88},{137,0,239},{135,11, -493},{4,11,317},{135,11,1279},{132,11,477},{4,10,578},{5,11,63},{133,11,509},{7, -0,650},{135,0,1310},{7,0,1076},{9,0,80},{11,0,78},{11,0,421},{11,0,534},{140,0, -545},{132,11,288},{12,0,553},{14,0,118},{133,10,923},{7,0,274},{11,0,479},{139,0 -,507},{8,11,89},{8,11,620},{9,11,49},{10,11,774},{11,11,628},{12,11,322},{143,11 -,124},{4,0,497},{135,0,1584},{7,0,261},{7,0,1115},{7,0,1354},{7,0,1404},{7,0, -1588},{7,0,1705},{7,0,1902},{9,0,465},{10,0,248},{10,0,349},{10,0,647},{11,0,527 -},{11,0,660},{11,0,669},{12,0,529},{13,0,305},{132,10,924},{133,10,665},{136,0, -13},{6,0,791},{138,11,120},{7,0,642},{8,0,250},{11,0,123},{11,0,137},{13,0,48},{ -142,0,95},{4,10,265},{7,10,807},{135,10,950},{5,10,93},{140,10,267},{135,0,1429} -,{4,0,949},{10,0,885},{10,0,891},{10,0,900},{10,0,939},{12,0,760},{142,0,449},{ -139,11,366},{132,0,818},{134,11,85},{135,10,994},{7,0,330},{5,10,233},{5,10,320} -,{6,10,140},{136,10,295},{4,0,1004},{8,0,982},{136,0,993},{133,10,978},{4,10,905 -},{6,10,1701},{137,10,843},{10,0,545},{140,0,301},{6,0,947},{134,0,1062},{134,0, -1188},{4,0,904},{5,0,794},{152,10,6},{134,0,1372},{135,11,608},{5,11,279},{6,11, -235},{7,11,468},{8,11,446},{9,11,637},{10,11,717},{11,11,738},{140,11,514},{132, -10,509},{5,11,17},{6,11,371},{137,11,528},{132,0,693},{4,11,115},{5,11,669},{6, -11,407},{8,11,311},{11,11,10},{141,11,5},{11,0,377},{7,10,273},{137,11,381},{135 -,0,695},{7,0,386},{138,0,713},{135,10,1041},{134,0,1291},{6,0,7},{6,0,35},{7,0, -147},{7,0,1069},{7,0,1568},{7,0,1575},{7,0,1917},{8,0,43},{8,0,208},{9,0,128},{9 -,0,866},{10,0,20},{11,0,981},{147,0,33},{7,0,893},{141,0,424},{139,10,234},{150, -11,56},{5,11,779},{5,11,807},{6,11,1655},{134,11,1676},{5,10,802},{7,10,2021},{ -136,10,805},{4,11,196},{5,10,167},{5,11,558},{5,10,899},{5,11,949},{6,10,410},{ -137,10,777},{137,10,789},{134,10,1705},{8,0,904},{140,0,787},{6,0,322},{9,0,552} -,{11,0,274},{13,0,209},{13,0,499},{14,0,85},{15,0,126},{145,0,70},{135,10,10},{5 -,10,11},{6,10,117},{6,10,485},{7,10,1133},{9,10,582},{9,10,594},{11,10,21},{11, -10,818},{12,10,535},{141,10,86},{4,10,264},{7,10,1067},{8,10,204},{8,10,385},{ -139,10,953},{132,11,752},{138,10,56},{133,10,470},{6,0,1808},{8,0,83},{8,0,742}, -{8,0,817},{9,0,28},{9,0,29},{9,0,885},{10,0,387},{11,0,633},{11,0,740},{13,0,235 -},{13,0,254},{15,0,143},{143,0,146},{140,0,49},{134,0,1832},{4,11,227},{5,11,159 -},{5,11,409},{7,11,80},{10,11,294},{10,11,479},{12,11,418},{14,11,50},{14,11,249 -},{142,11,295},{7,11,1470},{8,11,66},{8,11,137},{8,11,761},{9,11,638},{11,11,80} -,{11,11,212},{11,11,368},{11,11,418},{12,11,8},{13,11,15},{16,11,61},{17,11,59}, -{19,11,28},{148,11,84},{139,10,1015},{138,11,468},{135,0,421},{6,0,415},{7,0, -1049},{137,0,442},{6,11,38},{7,11,1220},{8,11,185},{8,11,256},{9,11,22},{9,11, -331},{10,11,738},{11,11,205},{11,11,540},{11,11,746},{13,11,399},{13,11,465},{14 -,11,88},{142,11,194},{139,0,289},{133,10,715},{4,0,110},{10,0,415},{10,0,597},{ -142,0,206},{4,11,159},{6,11,115},{7,11,252},{7,11,257},{7,11,1928},{8,11,69},{9, -11,384},{10,11,91},{10,11,615},{12,11,375},{14,11,235},{18,11,117},{147,11,123}, -{5,11,911},{136,11,278},{7,0,205},{7,0,2000},{8,10,794},{9,10,400},{10,10,298},{ -142,10,228},{135,11,1774},{4,11,151},{7,11,1567},{8,11,351},{137,11,322},{136,10 -,724},{133,11,990},{7,0,1539},{11,0,512},{13,0,205},{19,0,30},{22,0,36},{23,0,19 -},{135,11,1539},{5,11,194},{7,11,1662},{9,11,90},{140,11,180},{6,10,190},{7,10, -768},{135,10,1170},{134,0,1340},{4,0,283},{135,0,1194},{133,11,425},{133,11,971} -,{12,0,549},{14,10,67},{147,10,60},{135,10,1023},{134,0,1720},{138,11,587},{5,11 -,72},{6,11,264},{7,11,21},{7,11,46},{7,11,2013},{8,11,215},{8,11,513},{10,11,266 -},{139,11,22},{5,0,319},{135,0,534},{6,10,137},{9,10,75},{9,10,253},{10,10,194}, -{138,10,444},{7,0,1180},{20,0,112},{6,11,239},{7,11,118},{10,11,95},{11,11,603}, -{13,11,443},{14,11,160},{143,11,4},{134,11,431},{5,11,874},{6,11,1677},{11,10, -643},{12,10,115},{143,11,0},{134,0,967},{6,11,65},{7,11,939},{7,11,1172},{7,11, -1671},{9,11,540},{10,11,696},{11,11,265},{11,11,732},{11,11,928},{11,11,937},{12 -,11,399},{13,11,438},{149,11,19},{137,11,200},{135,0,1940},{5,10,760},{7,10,542} -,{8,10,135},{136,10,496},{140,11,44},{7,11,1655},{136,11,305},{7,10,319},{7,10, -355},{7,10,763},{10,10,389},{145,10,43},{136,0,735},{138,10,786},{137,11,19},{ -132,11,696},{5,0,132},{9,0,486},{9,0,715},{10,0,458},{11,0,373},{11,0,668},{11,0 -,795},{11,0,897},{12,0,272},{12,0,424},{12,0,539},{12,0,558},{14,0,245},{14,0, -263},{14,0,264},{14,0,393},{142,0,403},{10,0,38},{139,0,784},{132,0,838},{4,11, -302},{135,11,1766},{133,0,379},{5,0,8},{6,0,89},{6,0,400},{7,0,1569},{7,0,1623}, -{7,0,1850},{8,0,218},{8,0,422},{9,0,570},{10,0,626},{4,11,726},{133,11,630},{4,0 -,1017},{138,0,660},{6,0,387},{7,0,882},{141,0,111},{6,0,224},{7,0,877},{137,0, -647},{4,10,58},{5,10,286},{6,10,319},{7,10,402},{7,10,1254},{7,10,1903},{8,10, -356},{140,10,408},{135,0,790},{9,0,510},{10,0,53},{4,10,389},{9,10,181},{10,10, -29},{10,10,816},{11,10,311},{11,10,561},{12,10,67},{141,10,181},{142,0,458},{6, -11,118},{7,11,215},{7,11,1521},{140,11,11},{134,0,954},{135,0,394},{134,0,1367}, -{5,11,225},{133,10,373},{132,0,882},{7,0,1409},{135,10,1972},{135,10,1793},{4,11 -,370},{5,11,756},{135,11,1326},{150,11,13},{7,11,354},{10,11,410},{139,11,815},{ -6,11,1662},{7,11,48},{8,11,771},{10,11,116},{13,11,104},{14,11,105},{14,11,184}, -{15,11,168},{19,11,92},{148,11,68},{7,0,124},{136,0,38},{5,0,261},{7,0,78},{7,0, -199},{8,0,815},{9,0,126},{10,0,342},{140,0,647},{4,0,628},{140,0,724},{7,0,266}, -{8,0,804},{7,10,1651},{145,10,89},{135,0,208},{134,0,1178},{6,0,79},{135,0,1519} -,{132,10,672},{133,10,737},{136,0,741},{132,11,120},{4,0,710},{6,0,376},{134,0, -606},{134,0,1347},{134,0,1494},{6,0,850},{6,0,1553},{137,0,821},{5,10,145},{134, -11,593},{7,0,1311},{140,0,135},{4,0,467},{5,0,405},{134,0,544},{5,11,820},{135, -11,931},{6,0,100},{7,0,244},{7,0,632},{7,0,1609},{8,0,178},{8,0,638},{141,0,58}, -{4,10,387},{135,10,1288},{6,11,151},{6,11,1675},{7,11,383},{151,11,10},{132,0, -481},{135,10,550},{134,0,1378},{6,11,1624},{11,11,11},{12,11,422},{13,11,262},{ -142,11,360},{133,0,791},{4,11,43},{5,11,344},{133,11,357},{7,0,1227},{140,0,978} -,{7,0,686},{8,0,33},{8,0,238},{10,0,616},{11,0,467},{11,0,881},{13,0,217},{13,0, -253},{142,0,268},{137,0,857},{8,0,467},{8,0,1006},{7,11,148},{8,11,284},{141,11, -63},{4,10,576},{135,10,1263},{133,11,888},{5,10,919},{134,10,1673},{20,10,37},{ -148,11,37},{132,0,447},{132,11,711},{4,0,128},{5,0,415},{6,0,462},{7,0,294},{7,0 -,578},{10,0,710},{139,0,86},{4,10,82},{5,10,333},{5,10,904},{6,10,207},{7,10,325 -},{7,10,1726},{8,10,101},{10,10,778},{139,10,220},{136,0,587},{137,11,440},{133, -10,903},{6,0,427},{7,0,1018},{138,0,692},{4,0,195},{135,0,802},{140,10,147},{134 -,0,1546},{134,0,684},{132,10,705},{136,0,345},{11,11,678},{140,11,307},{133,0, -365},{134,0,1683},{4,11,65},{5,11,479},{5,11,1004},{7,11,1913},{8,11,317},{9,11, -302},{10,11,612},{141,11,22},{138,0,472},{4,11,261},{135,11,510},{134,10,90},{ -142,0,433},{151,0,28},{4,11,291},{7,11,101},{9,11,515},{12,11,152},{12,11,443},{ -13,11,392},{142,11,357},{140,0,997},{5,0,3},{8,0,578},{9,0,118},{10,0,705},{141, -0,279},{135,11,1266},{7,10,813},{12,10,497},{141,10,56},{133,0,229},{6,10,125},{ -135,10,1277},{8,0,102},{10,0,578},{10,0,672},{12,0,496},{13,0,408},{14,0,121},{ -17,0,106},{151,10,12},{6,0,866},{134,0,1080},{136,0,1022},{4,11,130},{135,11,843 -},{5,11,42},{5,11,879},{7,11,245},{7,11,324},{7,11,1532},{11,11,463},{11,11,472} -,{13,11,363},{144,11,52},{150,0,55},{8,0,115},{8,0,350},{9,0,489},{10,0,128},{11 -,0,306},{12,0,373},{14,0,30},{17,0,79},{19,0,80},{4,11,134},{133,11,372},{134,0, -657},{134,0,933},{135,11,1147},{4,0,230},{133,0,702},{134,0,1728},{4,0,484},{18, -0,26},{19,0,42},{20,0,43},{21,0,0},{23,0,27},{152,0,14},{7,0,185},{135,0,703},{6 -,0,417},{10,0,618},{7,10,1106},{9,10,770},{11,10,112},{140,10,413},{134,0,803},{ -132,11,644},{134,0,1262},{7,11,540},{12,10,271},{145,10,109},{135,11,123},{132,0 -,633},{134,11,623},{4,11,908},{5,11,359},{5,11,508},{6,11,1723},{7,11,343},{7,11 -,1996},{135,11,2026},{135,0,479},{10,0,262},{7,10,304},{9,10,646},{9,10,862},{11 -,10,696},{12,10,208},{15,10,79},{147,10,108},{4,11,341},{135,11,480},{134,0,830} -,{5,0,70},{5,0,622},{6,0,334},{7,0,1032},{9,0,171},{11,0,26},{11,0,213},{11,0, -637},{11,0,707},{12,0,202},{12,0,380},{13,0,226},{13,0,355},{14,0,222},{145,0,42 -},{135,10,981},{143,0,217},{137,11,114},{4,0,23},{4,0,141},{5,0,313},{5,0,1014}, -{6,0,50},{6,0,51},{7,0,142},{7,0,384},{7,0,559},{8,0,640},{9,0,460},{9,0,783},{ -11,0,741},{12,0,183},{141,0,488},{141,0,360},{7,0,1586},{7,11,1995},{8,11,299},{ -11,11,890},{140,11,674},{132,10,434},{7,0,652},{134,10,550},{7,0,766},{5,10,553} -,{138,10,824},{7,0,737},{8,0,298},{136,10,452},{4,11,238},{5,11,503},{6,11,179}, -{7,11,2003},{8,11,381},{8,11,473},{9,11,149},{10,11,183},{15,11,45},{143,11,86}, -{133,10,292},{5,0,222},{9,0,655},{138,0,534},{138,10,135},{4,11,121},{5,11,156}, -{5,11,349},{9,11,136},{10,11,605},{14,11,342},{147,11,107},{137,0,906},{6,0,1013 -},{134,0,1250},{6,0,1956},{6,0,2009},{8,0,991},{144,0,120},{135,11,1192},{138,0, -503},{5,0,154},{7,0,1491},{10,0,379},{138,0,485},{6,0,1867},{6,0,1914},{6,0,1925 -},{9,0,917},{9,0,925},{9,0,932},{9,0,951},{9,0,1007},{9,0,1013},{12,0,806},{12,0 -,810},{12,0,814},{12,0,816},{12,0,824},{12,0,832},{12,0,837},{12,0,863},{12,0, -868},{12,0,870},{12,0,889},{12,0,892},{12,0,900},{12,0,902},{12,0,908},{12,0,933 -},{12,0,942},{12,0,949},{12,0,954},{15,0,175},{15,0,203},{15,0,213},{15,0,218},{ -15,0,225},{15,0,231},{15,0,239},{15,0,248},{15,0,252},{18,0,190},{18,0,204},{18, -0,215},{18,0,216},{18,0,222},{18,0,225},{18,0,230},{18,0,239},{18,0,241},{21,0, -42},{21,0,43},{21,0,44},{21,0,45},{21,0,46},{21,0,53},{24,0,27},{152,0,31},{133, -0,716},{135,0,844},{4,0,91},{5,0,388},{5,0,845},{6,0,206},{6,0,252},{6,0,365},{7 -,0,136},{7,0,531},{136,0,621},{7,10,393},{10,10,603},{139,10,206},{6,11,80},{6, -11,1694},{7,11,173},{7,11,1974},{9,11,547},{10,11,730},{14,11,18},{150,11,39},{ -137,0,748},{4,11,923},{134,11,1711},{4,10,912},{137,10,232},{7,10,98},{7,10,1973 -},{136,10,716},{14,0,103},{133,10,733},{132,11,595},{12,0,158},{18,0,8},{19,0,62 -},{20,0,6},{22,0,4},{23,0,2},{23,0,9},{5,11,240},{6,11,459},{7,11,12},{7,11,114} -,{7,11,502},{7,11,1751},{7,11,1753},{7,11,1805},{8,11,658},{9,11,1},{11,11,959}, -{13,11,446},{142,11,211},{135,0,576},{5,0,771},{5,0,863},{5,0,898},{6,0,648},{6, -0,1632},{6,0,1644},{134,0,1780},{133,0,331},{7,11,633},{7,11,905},{7,11,909},{7, -11,1538},{9,11,767},{140,11,636},{140,0,632},{5,0,107},{7,0,201},{136,0,518},{6, -0,446},{7,0,1817},{134,11,490},{9,0,851},{141,0,510},{7,11,250},{8,11,506},{136, -11,507},{4,0,504},{137,10,72},{132,11,158},{4,11,140},{7,11,362},{8,11,209},{9, -11,10},{9,11,160},{9,11,503},{10,11,689},{11,11,350},{11,11,553},{11,11,725},{12 -,11,252},{12,11,583},{13,11,192},{13,11,352},{14,11,269},{14,11,356},{148,11,50} -,{6,11,597},{135,11,1318},{135,10,1454},{5,0,883},{5,0,975},{8,0,392},{148,0,7}, -{6,11,228},{7,11,1341},{9,11,408},{138,11,343},{11,11,348},{11,10,600},{12,11,99 -},{13,10,245},{18,11,1},{18,11,11},{147,11,4},{134,11,296},{5,0,922},{134,0,1707 -},{132,11,557},{4,11,548},{7,10,164},{7,10,1571},{9,10,107},{140,10,225},{7,11, -197},{8,11,142},{8,11,325},{9,11,150},{9,11,596},{10,11,350},{10,11,353},{11,11, -74},{11,11,315},{14,11,423},{143,11,141},{5,0,993},{7,0,515},{137,0,91},{4,0,131 -},{8,0,200},{5,10,484},{5,10,510},{6,10,434},{7,10,1000},{7,10,1098},{136,10,2}, -{152,0,10},{4,11,62},{5,11,83},{6,11,399},{6,11,579},{7,11,692},{7,11,846},{7,11 -,1015},{7,11,1799},{8,11,403},{9,11,394},{10,11,133},{12,11,4},{12,11,297},{12, -11,452},{16,11,81},{18,11,19},{18,11,25},{21,11,14},{22,11,12},{151,11,18},{140, -11,459},{132,11,177},{7,0,1433},{9,0,365},{137,11,365},{132,10,460},{5,0,103},{6 -,0,2004},{7,0,921},{8,0,580},{8,0,593},{8,0,630},{10,0,28},{5,11,411},{135,11, -653},{4,10,932},{133,10,891},{4,0,911},{5,0,867},{5,0,1013},{7,0,2034},{8,0,798} -,{136,0,813},{7,11,439},{10,11,727},{11,11,260},{139,11,684},{136,10,625},{5,11, -208},{7,11,753},{135,11,1528},{5,0,461},{7,0,1925},{12,0,39},{13,0,265},{13,0, -439},{134,10,76},{6,0,853},{8,10,92},{137,10,221},{5,0,135},{6,0,519},{7,0,1722} -,{10,0,271},{11,0,261},{145,0,54},{139,11,814},{14,0,338},{148,0,81},{4,0,300},{ -133,0,436},{5,0,419},{5,0,687},{7,0,864},{9,0,470},{135,11,864},{9,0,836},{133, -11,242},{134,0,1937},{4,10,763},{133,11,953},{132,10,622},{132,0,393},{133,10, -253},{8,0,357},{10,0,745},{14,0,426},{17,0,94},{19,0,57},{135,10,546},{5,11,615} -,{146,11,37},{9,10,73},{10,10,110},{14,10,185},{145,10,119},{11,0,703},{7,10,624 -},{7,10,916},{10,10,256},{139,10,87},{133,11,290},{5,10,212},{12,10,35},{141,10, -382},{132,11,380},{5,11,52},{7,11,277},{9,11,368},{139,11,791},{133,0,387},{10, -11,138},{139,11,476},{4,0,6},{5,0,708},{136,0,75},{7,0,1351},{9,0,581},{10,0,639 -},{11,0,453},{140,0,584},{132,0,303},{138,0,772},{135,10,1175},{4,0,749},{5,10, -816},{6,11,256},{7,11,307},{7,11,999},{7,11,1481},{7,11,1732},{7,11,1738},{8,11, -265},{9,11,414},{11,11,316},{12,11,52},{13,11,420},{147,11,100},{135,11,1296},{6 -,0,1065},{5,10,869},{5,10,968},{6,10,1626},{8,10,734},{136,10,784},{4,10,542},{6 -,10,1716},{6,10,1727},{7,10,1082},{7,10,1545},{8,10,56},{8,10,118},{8,10,412},{8 -,10,564},{9,10,888},{9,10,908},{10,10,50},{10,10,423},{11,10,685},{11,10,697},{ -11,10,933},{12,10,299},{13,10,126},{13,10,136},{13,10,170},{141,10,190},{134,0, -226},{4,0,106},{7,0,310},{11,0,717},{133,11,723},{5,0,890},{5,0,988},{4,10,232}, -{9,10,202},{10,10,474},{140,10,433},{6,0,626},{142,0,431},{10,0,706},{150,0,44}, -{13,0,51},{6,10,108},{7,10,1003},{7,10,1181},{8,10,111},{136,10,343},{132,0,698} -,{5,11,109},{6,11,1784},{7,11,1895},{12,11,296},{140,11,302},{134,0,828},{134,10 -,1712},{138,0,17},{7,0,1929},{4,10,133},{5,11,216},{7,10,711},{7,10,1298},{7,10, -1585},{7,11,1879},{9,11,141},{9,11,270},{9,11,679},{10,11,159},{10,11,553},{11, -11,197},{11,11,438},{12,11,538},{12,11,559},{13,11,193},{13,11,423},{14,11,144}, -{14,11,166},{14,11,167},{15,11,67},{147,11,84},{141,11,127},{7,11,1872},{137,11, -81},{6,10,99},{7,10,1808},{145,10,57},{134,11,391},{5,0,689},{6,0,84},{7,0,1250} -,{6,10,574},{7,10,428},{10,10,669},{11,10,485},{11,10,840},{12,10,300},{142,10, -250},{7,11,322},{136,11,249},{7,11,432},{135,11,1649},{135,10,1871},{137,10,252} -,{6,11,155},{140,11,234},{7,0,871},{19,0,27},{147,11,27},{140,0,498},{5,0,986},{ -6,0,130},{138,0,823},{6,0,1793},{7,0,1582},{8,0,458},{10,0,101},{10,0,318},{10,0 -,945},{12,0,734},{16,0,104},{18,0,177},{6,10,323},{135,10,1564},{5,11,632},{138, -11,526},{10,0,435},{7,10,461},{136,10,775},{6,11,144},{7,11,948},{7,11,1042},{7, -11,1857},{8,11,235},{8,11,461},{9,11,453},{9,11,530},{10,11,354},{17,11,77},{19, -11,99},{148,11,79},{138,0,966},{7,0,1644},{137,0,129},{135,0,997},{136,0,502},{5 -,11,196},{6,11,486},{7,11,212},{8,11,309},{136,11,346},{7,10,727},{146,10,73},{ -132,0,823},{132,11,686},{135,0,1927},{4,0,762},{7,0,1756},{137,0,98},{136,10,577 -},{24,0,8},{4,11,30},{5,11,43},{152,11,8},{7,0,1046},{139,0,160},{7,0,492},{4,10 -,413},{5,10,677},{7,11,492},{8,10,432},{140,10,280},{6,0,45},{7,0,433},{8,0,129} -,{9,0,21},{10,0,392},{11,0,79},{12,0,499},{13,0,199},{141,0,451},{7,0,558},{136, -0,353},{4,11,220},{7,11,1535},{9,11,93},{139,11,474},{7,10,646},{7,10,1730},{11, -10,446},{141,10,178},{133,0,785},{134,0,1145},{8,0,81},{9,0,189},{9,0,201},{11,0 -,478},{11,0,712},{141,0,338},{5,0,353},{151,0,26},{11,0,762},{132,10,395},{134,0 -,2024},{4,0,611},{133,0,606},{9,10,174},{10,10,164},{11,10,440},{11,10,841},{143 -,10,98},{134,10,426},{10,10,608},{139,10,1002},{138,10,250},{6,0,25},{7,0,855},{ -7,0,1258},{144,0,32},{7,11,1725},{138,11,393},{5,11,263},{134,11,414},{6,0,2011} -,{133,10,476},{4,0,4},{7,0,1118},{7,0,1320},{7,0,1706},{8,0,277},{9,0,622},{10,0 -,9},{11,0,724},{12,0,350},{12,0,397},{13,0,28},{13,0,159},{15,0,89},{18,0,5},{19 -,0,9},{20,0,34},{22,0,47},{6,11,178},{6,11,1750},{8,11,251},{9,11,690},{10,11, -155},{10,11,196},{10,11,373},{11,11,698},{13,11,155},{148,11,93},{5,11,97},{137, -11,393},{7,0,764},{11,0,461},{12,0,172},{5,10,76},{6,10,458},{6,10,497},{7,10, -868},{9,10,658},{10,10,594},{11,10,566},{12,10,338},{141,10,200},{134,0,1449},{ -138,11,40},{134,11,1639},{134,0,1445},{6,0,1168},{4,10,526},{7,10,1029},{135,10, -1054},{4,11,191},{7,11,934},{8,11,647},{145,11,97},{132,10,636},{6,0,233},{7,10, -660},{7,10,1124},{17,10,31},{19,10,22},{151,10,14},{6,10,1699},{136,11,110},{12, -11,246},{15,11,162},{19,11,64},{20,11,8},{20,11,95},{22,11,24},{152,11,17},{5,11 -,165},{9,11,346},{138,11,655},{5,11,319},{135,11,534},{134,0,255},{9,0,216},{8, -11,128},{139,11,179},{9,0,183},{139,0,286},{11,0,956},{151,0,3},{4,0,536},{7,0, -1141},{10,0,723},{139,0,371},{4,10,279},{7,10,301},{137,10,362},{7,0,285},{5,11, -57},{6,11,101},{6,11,1663},{7,11,132},{7,11,1048},{7,11,1154},{7,11,1415},{7,11, -1507},{12,11,493},{15,11,105},{151,11,15},{5,11,459},{7,11,1073},{7,10,1743},{8, -11,241},{136,11,334},{4,10,178},{133,10,399},{135,0,560},{132,0,690},{135,0,1246 -},{18,0,157},{147,0,63},{10,0,599},{11,0,33},{12,0,571},{149,0,1},{6,11,324},{6, -11,520},{7,11,338},{7,11,1616},{7,11,1729},{8,11,228},{9,11,69},{139,11,750},{7, -0,1862},{12,0,491},{12,0,520},{13,0,383},{142,0,244},{135,11,734},{134,10,1692}, -{10,0,448},{11,0,630},{17,0,117},{6,10,202},{7,11,705},{12,10,360},{17,10,118},{ -18,10,27},{148,10,67},{4,11,73},{6,11,612},{7,11,927},{7,11,1822},{8,11,217},{9, -11,472},{9,11,765},{9,11,766},{10,11,408},{11,11,51},{11,11,793},{12,11,266},{15 -,11,158},{20,11,89},{150,11,32},{4,0,190},{133,0,554},{133,0,1001},{5,11,389},{8 -,11,636},{137,11,229},{5,0,446},{7,10,872},{10,10,516},{139,10,167},{137,10,313} -,{132,10,224},{134,0,1313},{5,10,546},{7,10,35},{8,10,11},{8,10,12},{9,10,315},{ -9,10,533},{10,10,802},{11,10,166},{12,10,525},{142,10,243},{6,0,636},{137,0,837} -,{5,10,241},{8,10,242},{9,10,451},{10,10,667},{11,10,598},{140,10,429},{22,10,46 -},{150,11,46},{136,11,472},{11,0,278},{142,0,73},{141,11,185},{132,0,868},{134,0 -,972},{4,10,366},{137,10,516},{138,0,1010},{5,11,189},{6,10,1736},{7,11,442},{7, -11,443},{8,11,281},{12,11,174},{13,11,83},{141,11,261},{139,11,384},{6,11,2},{7, -11,191},{7,11,446},{7,11,758},{7,11,1262},{7,11,1737},{8,11,22},{8,11,270},{8,11 -,612},{9,11,4},{9,11,167},{9,11,312},{9,11,436},{10,11,156},{10,11,216},{10,11, -311},{10,11,623},{11,11,72},{11,11,330},{11,11,455},{12,11,101},{12,11,321},{12, -11,504},{12,11,530},{12,11,543},{13,11,17},{13,11,156},{13,11,334},{14,11,48},{ -15,11,70},{17,11,60},{148,11,64},{6,10,331},{136,10,623},{135,0,1231},{132,0,304 -},{6,11,60},{7,11,670},{7,11,1327},{8,11,411},{8,11,435},{9,11,653},{9,11,740},{ -10,11,385},{11,11,222},{11,11,324},{11,11,829},{140,11,611},{7,0,506},{6,11,166} -,{7,11,374},{135,11,1174},{14,11,43},{146,11,21},{135,11,1694},{135,10,1888},{5, -11,206},{134,11,398},{135,11,50},{150,0,26},{6,0,53},{6,0,199},{7,0,1408},{8,0, -32},{8,0,93},{10,0,397},{10,0,629},{11,0,593},{11,0,763},{13,0,326},{145,0,35},{ -134,0,105},{132,10,394},{4,0,843},{138,0,794},{11,0,704},{141,0,396},{5,0,114},{ -5,0,255},{141,0,285},{6,0,619},{7,0,898},{7,0,1092},{8,0,485},{18,0,28},{19,0, -116},{135,10,1931},{9,0,145},{7,10,574},{135,10,1719},{7,0,2035},{8,0,19},{9,0, -89},{138,0,831},{132,10,658},{6,11,517},{7,11,1159},{10,11,621},{139,11,192},{7, -0,1933},{7,11,1933},{9,10,781},{10,10,144},{11,10,385},{13,10,161},{13,10,228},{ -13,10,268},{148,10,107},{136,10,374},{10,11,223},{139,11,645},{135,0,1728},{7,11 -,64},{7,11,289},{136,11,245},{4,10,344},{6,10,498},{139,10,323},{136,0,746},{135 -,10,1063},{137,10,155},{4,0,987},{6,0,1964},{6,0,1974},{6,0,1990},{136,0,995},{ -133,11,609},{133,10,906},{134,0,1550},{134,0,874},{5,11,129},{6,11,61},{135,11, -947},{4,0,1018},{6,0,1938},{6,0,2021},{134,0,2039},{132,0,814},{11,0,126},{139,0 -,287},{134,0,1264},{5,0,955},{136,0,814},{141,11,506},{132,11,314},{6,0,981},{ -139,11,1000},{5,0,56},{8,0,892},{8,0,915},{140,0,776},{148,0,100},{10,0,4},{10,0 -,13},{11,0,638},{148,0,57},{148,11,74},{5,0,738},{132,10,616},{133,11,637},{136, -10,692},{133,0,758},{132,10,305},{137,11,590},{5,11,280},{135,11,1226},{134,11, -494},{135,0,1112},{133,11,281},{13,0,44},{14,0,214},{5,10,214},{7,10,603},{8,10, -611},{9,10,686},{10,10,88},{11,10,459},{11,10,496},{12,10,463},{140,10,590},{139 -,0,328},{135,11,1064},{137,0,133},{7,0,168},{13,0,196},{141,0,237},{134,10,1703} -,{134,0,1152},{135,0,1245},{5,0,110},{6,0,169},{6,0,1702},{7,0,400},{8,0,538},{9 -,0,184},{9,0,524},{140,0,218},{6,0,1816},{10,0,871},{12,0,769},{140,0,785},{132, -11,630},{7,11,33},{7,11,120},{8,11,489},{9,11,319},{10,11,820},{11,11,1004},{12, -11,379},{13,11,117},{13,11,412},{14,11,25},{15,11,52},{15,11,161},{16,11,47},{ -149,11,2},{6,0,133},{8,0,413},{9,0,353},{139,0,993},{145,10,19},{4,11,937},{133, -11,801},{134,0,978},{6,0,93},{6,0,1508},{7,0,1422},{7,0,1851},{8,0,673},{9,0,529 -},{140,0,43},{6,0,317},{10,0,512},{4,10,737},{11,10,294},{12,10,60},{12,10,437}, -{13,10,64},{13,10,380},{142,10,430},{9,0,371},{7,11,1591},{144,11,43},{6,10,1758 -},{8,10,520},{9,10,345},{9,10,403},{142,10,350},{5,0,526},{10,10,242},{138,10, -579},{9,0,25},{10,0,467},{138,0,559},{5,10,139},{7,10,1168},{138,10,539},{4,0, -335},{135,0,942},{140,0,754},{132,11,365},{11,0,182},{142,0,195},{142,11,29},{5, -11,7},{139,11,774},{4,11,746},{135,11,1090},{8,0,39},{10,0,773},{11,0,84},{12,0, -205},{142,0,1},{5,0,601},{5,0,870},{5,11,360},{136,11,237},{132,0,181},{136,0, -370},{134,0,1652},{8,0,358},{4,10,107},{7,10,613},{8,10,439},{8,10,504},{9,10, -501},{10,10,383},{139,10,477},{132,10,229},{137,11,785},{4,0,97},{5,0,147},{6,0, -286},{7,0,1362},{141,0,176},{6,0,537},{7,0,788},{7,0,1816},{132,10,903},{140,10, -71},{6,0,743},{134,0,1223},{6,0,375},{7,0,169},{7,0,254},{8,0,780},{135,11,1493} -,{7,0,1714},{4,10,47},{6,10,373},{7,10,452},{7,10,543},{7,10,1856},{9,10,6},{11, -10,257},{139,10,391},{6,0,896},{136,0,1003},{135,0,1447},{137,11,341},{5,10,980} -,{134,10,1754},{145,11,22},{4,11,277},{5,11,608},{6,11,493},{7,11,457},{140,11, -384},{7,10,536},{7,10,1331},{136,10,143},{140,0,744},{7,11,27},{135,11,316},{18, -0,126},{5,10,19},{134,10,533},{4,0,788},{11,0,41},{5,11,552},{5,11,586},{5,11, -676},{6,11,448},{8,11,244},{11,11,1},{11,11,41},{13,11,3},{16,11,54},{17,11,4},{ -146,11,13},{4,0,985},{6,0,1801},{4,11,401},{137,11,264},{5,10,395},{5,10,951},{ -134,10,1776},{5,0,629},{135,0,1549},{11,10,663},{12,10,210},{13,10,166},{13,10, -310},{14,10,373},{147,10,43},{9,11,543},{10,11,524},{11,11,30},{12,11,524},{14, -11,315},{16,11,18},{20,11,26},{148,11,65},{4,11,205},{5,11,623},{7,11,104},{136, -11,519},{5,0,293},{134,0,601},{7,11,579},{9,11,41},{9,11,244},{9,11,669},{10,11, -5},{11,11,861},{11,11,951},{139,11,980},{132,11,717},{132,10,695},{7,10,497},{9, -10,387},{147,10,81},{132,0,420},{142,0,37},{6,0,1134},{6,0,1900},{12,0,830},{12, -0,878},{12,0,894},{15,0,221},{143,0,245},{132,11,489},{7,0,1570},{140,0,542},{8, -0,933},{136,0,957},{6,0,1371},{7,0,31},{8,0,373},{5,10,284},{6,10,49},{6,10,350} -,{7,10,377},{7,10,1693},{8,10,678},{9,10,161},{9,10,585},{9,10,671},{9,10,839},{ -11,10,912},{141,10,427},{135,11,892},{4,0,325},{138,0,125},{139,11,47},{132,10, -597},{138,0,323},{6,0,1547},{7,11,1605},{9,11,473},{11,11,962},{146,11,139},{139 -,10,908},{7,11,819},{9,11,26},{9,11,392},{10,11,152},{10,11,226},{11,11,19},{12, -11,276},{12,11,426},{12,11,589},{13,11,460},{15,11,97},{19,11,48},{148,11,104},{ -135,11,51},{4,0,718},{135,0,1216},{6,0,1896},{6,0,1905},{6,0,1912},{9,0,947},{9, -0,974},{12,0,809},{12,0,850},{12,0,858},{12,0,874},{12,0,887},{12,0,904},{12,0, -929},{12,0,948},{12,0,952},{15,0,198},{15,0,206},{15,0,220},{15,0,227},{15,0,247 -},{18,0,188},{21,0,48},{21,0,50},{24,0,25},{24,0,29},{7,11,761},{7,11,1051},{137 -,11,545},{5,0,124},{5,0,144},{6,0,548},{7,0,15},{7,0,153},{137,0,629},{135,11, -606},{135,10,2014},{7,10,2007},{9,11,46},{9,10,101},{9,10,450},{10,10,66},{10,10 -,842},{11,10,536},{140,10,587},{6,0,75},{7,0,1531},{8,0,416},{9,0,240},{9,0,275} -,{10,0,100},{11,0,658},{11,0,979},{12,0,86},{14,0,207},{15,0,20},{143,0,25},{5,0 -,141},{5,0,915},{6,0,1783},{7,0,211},{7,0,698},{7,0,1353},{9,0,83},{9,0,281},{10 -,0,376},{10,0,431},{11,0,543},{12,0,664},{13,0,280},{13,0,428},{14,0,61},{14,0, -128},{17,0,52},{145,0,81},{132,11,674},{135,0,533},{149,0,6},{132,11,770},{133,0 -,538},{5,11,79},{7,11,1027},{7,11,1477},{139,11,52},{139,10,62},{4,0,338},{133,0 -,400},{5,11,789},{134,11,195},{4,11,251},{4,11,688},{7,11,513},{7,11,1284},{9,11 -,87},{138,11,365},{134,10,1766},{6,0,0},{7,0,84},{11,0,895},{145,0,11},{139,0, -892},{4,0,221},{5,0,659},{7,0,697},{7,0,1211},{138,0,284},{133,0,989},{133,11, -889},{4,11,160},{5,11,330},{7,11,1434},{136,11,174},{6,10,1665},{7,10,256},{7,10 -,1388},{10,10,499},{139,10,670},{7,0,848},{4,10,22},{5,10,10},{136,10,97},{138,0 -,507},{133,10,481},{4,0,188},{135,0,805},{5,0,884},{6,0,732},{139,0,991},{135,11 -,968},{11,11,636},{15,11,145},{17,11,34},{19,11,50},{151,11,20},{7,0,959},{16,0, -60},{6,10,134},{7,10,437},{9,10,37},{14,10,285},{142,10,371},{7,10,486},{8,10, -155},{11,10,93},{140,10,164},{134,0,1653},{7,0,337},{133,10,591},{6,0,1989},{8,0 -,922},{8,0,978},{133,11,374},{132,0,638},{138,0,500},{133,11,731},{5,10,380},{5, -10,650},{136,10,310},{138,11,381},{4,10,364},{7,10,1156},{7,10,1187},{137,10,409 -},{137,11,224},{140,0,166},{134,10,482},{4,11,626},{5,11,642},{6,11,425},{10,11, -202},{139,11,141},{4,10,781},{6,10,487},{7,10,926},{8,10,263},{139,10,500},{135, -0,418},{4,10,94},{135,10,1265},{136,0,760},{132,10,417},{136,11,835},{5,10,348}, -{134,10,522},{6,0,1277},{134,0,1538},{139,11,541},{135,11,1597},{5,11,384},{8,11 -,455},{140,11,48},{136,0,770},{5,11,264},{134,11,184},{4,0,89},{5,0,489},{6,0, -315},{7,0,553},{7,0,1745},{138,0,243},{4,10,408},{4,10,741},{135,10,500},{134,0, -1396},{133,0,560},{6,0,1658},{9,0,3},{10,0,154},{11,0,641},{13,0,85},{13,0,201}, -{141,0,346},{135,11,1595},{5,11,633},{6,11,28},{7,11,219},{135,11,1323},{9,11, -769},{140,11,185},{135,11,785},{7,11,359},{8,11,243},{140,11,175},{138,0,586},{7 -,0,1271},{134,10,73},{132,11,105},{4,0,166},{5,0,505},{134,0,1670},{133,10,576}, -{4,11,324},{138,11,104},{142,10,231},{6,0,637},{7,10,1264},{7,10,1678},{11,10, -945},{12,10,341},{12,10,471},{12,10,569},{23,11,21},{151,11,23},{8,11,559},{141, -11,109},{134,0,1947},{7,0,445},{8,0,307},{8,0,704},{10,0,41},{10,0,439},{11,0, -237},{11,0,622},{140,0,201},{135,11,963},{135,0,1977},{4,0,189},{5,0,713},{136,0 -,57},{138,0,371},{135,10,538},{132,0,552},{6,0,883},{133,10,413},{6,0,923},{132, -11,758},{138,11,215},{136,10,495},{7,10,54},{8,10,312},{10,10,191},{10,10,614},{ -140,10,567},{7,11,351},{139,11,128},{7,0,875},{6,10,468},{7,10,1478},{8,10,530}, -{142,10,290},{135,0,1788},{17,0,49},{133,11,918},{12,11,398},{20,11,39},{21,11, -11},{150,11,41},{10,0,661},{6,10,484},{135,10,822},{135,0,1945},{134,0,794},{137 -,10,900},{135,10,1335},{6,10,1724},{135,10,2022},{132,11,340},{134,0,1135},{4,0, -784},{133,0,745},{5,0,84},{134,0,163},{133,0,410},{4,0,976},{5,11,985},{7,11,509 -},{7,11,529},{145,11,96},{132,10,474},{134,0,703},{135,11,1919},{5,0,322},{8,0, -186},{9,0,262},{10,0,187},{142,0,208},{135,10,1504},{133,0,227},{9,0,560},{13,0, -208},{133,10,305},{132,11,247},{7,0,1395},{8,0,486},{9,0,236},{9,0,878},{10,0, -218},{11,0,95},{19,0,17},{147,0,31},{7,0,2043},{8,0,672},{141,0,448},{4,11,184}, -{5,11,390},{6,11,337},{7,11,23},{7,11,494},{7,11,618},{7,11,1456},{8,11,27},{8, -11,599},{10,11,153},{139,11,710},{135,0,466},{135,10,1236},{6,0,167},{7,0,186},{ -7,0,656},{10,0,643},{4,10,480},{6,10,302},{6,10,1642},{7,10,837},{7,10,1547},{7, -10,1657},{8,10,429},{9,10,228},{13,10,289},{13,10,343},{147,10,101},{134,0,1428} -,{134,0,1440},{5,0,412},{7,10,278},{10,10,739},{11,10,708},{141,10,348},{134,0, -1118},{136,0,562},{148,11,46},{9,0,316},{139,0,256},{134,0,1771},{135,0,1190},{ -137,0,132},{10,11,227},{11,11,497},{11,11,709},{140,11,415},{143,0,66},{6,11,360 -},{7,11,1664},{136,11,478},{144,10,28},{4,0,317},{135,0,1279},{5,0,63},{133,0, -509},{136,11,699},{145,10,36},{134,0,1475},{11,11,343},{142,11,127},{132,11,739} -,{132,0,288},{135,11,1757},{8,0,89},{8,0,620},{9,0,608},{11,0,628},{12,0,322},{ -143,0,124},{134,0,1225},{7,0,1189},{4,11,67},{5,11,422},{6,10,363},{7,11,1037},{ -7,11,1289},{7,11,1555},{7,10,1955},{8,10,725},{9,11,741},{145,11,108},{134,0, -1468},{6,0,689},{134,0,1451},{138,0,120},{151,0,1},{137,10,805},{142,0,329},{5, -10,813},{135,10,2046},{135,0,226},{138,11,96},{7,0,1855},{5,10,712},{11,10,17},{ -13,10,321},{144,10,67},{9,0,461},{6,10,320},{7,10,781},{7,10,1921},{9,10,55},{10 -,10,186},{10,10,273},{10,10,664},{10,10,801},{11,10,996},{11,10,997},{13,10,157} -,{142,10,170},{8,11,203},{8,10,271},{11,11,823},{11,11,846},{12,11,482},{13,11, -133},{13,11,277},{13,11,302},{13,11,464},{14,11,205},{142,11,221},{135,0,1346},{ -4,11,449},{133,11,718},{134,0,85},{14,0,299},{7,10,103},{7,10,863},{11,10,184},{ -145,10,62},{4,11,355},{6,11,311},{9,11,256},{138,11,404},{137,10,659},{138,11, -758},{133,11,827},{5,11,64},{140,11,581},{134,0,1171},{4,11,442},{7,11,1047},{7, -11,1352},{135,11,1643},{132,0,980},{5,11,977},{6,11,288},{7,11,528},{135,11,1065 -},{5,0,279},{6,0,235},{7,0,468},{8,0,446},{9,0,637},{10,0,717},{11,0,738},{140,0 -,514},{132,0,293},{11,10,337},{142,10,303},{136,11,285},{5,0,17},{6,0,371},{9,0, -528},{12,0,364},{132,11,254},{5,10,77},{7,10,1455},{10,10,843},{147,10,73},{150, -0,5},{132,10,458},{6,11,12},{7,11,1219},{145,11,73},{135,10,1420},{6,10,109},{ -138,10,382},{135,11,125},{6,10,330},{7,10,1084},{139,10,142},{6,11,369},{6,11, -502},{7,11,1036},{8,11,348},{9,11,452},{10,11,26},{11,11,224},{11,11,387},{11,11 -,772},{12,11,95},{12,11,629},{13,11,195},{13,11,207},{13,11,241},{14,11,260},{14 -,11,270},{143,11,140},{132,11,269},{5,11,480},{7,11,532},{7,11,1197},{7,11,1358} -,{8,11,291},{11,11,349},{142,11,396},{150,0,48},{10,0,601},{13,0,353},{141,0,376 -},{5,0,779},{5,0,807},{6,0,1655},{134,0,1676},{142,11,223},{4,0,196},{5,0,558},{ -133,0,949},{148,11,15},{135,11,1764},{134,0,1322},{132,0,752},{139,0,737},{135, -11,657},{136,11,533},{135,0,412},{4,0,227},{5,0,159},{5,0,409},{7,0,80},{8,0,556 -},{10,0,479},{12,0,418},{14,0,50},{14,0,123},{14,0,192},{14,0,249},{14,0,295},{ -143,0,27},{7,0,1470},{8,0,66},{8,0,137},{8,0,761},{9,0,638},{11,0,80},{11,0,212} -,{11,0,368},{11,0,418},{12,0,8},{13,0,15},{16,0,61},{17,0,59},{19,0,28},{148,0, -84},{135,10,1985},{4,11,211},{4,11,332},{5,11,335},{6,11,238},{7,11,269},{7,11, -811},{7,11,1797},{8,10,122},{8,11,836},{9,11,507},{141,11,242},{6,0,683},{134,0, -1252},{4,0,873},{132,10,234},{134,0,835},{6,0,38},{7,0,1220},{8,0,185},{8,0,256} -,{9,0,22},{9,0,331},{10,0,738},{11,0,205},{11,0,540},{11,0,746},{13,0,465},{14,0 -,88},{142,0,194},{138,0,986},{5,11,1009},{12,11,582},{146,11,131},{4,0,159},{6,0 -,115},{7,0,252},{7,0,257},{7,0,1928},{8,0,69},{9,0,384},{10,0,91},{10,0,615},{12 -,0,375},{14,0,235},{18,0,117},{147,0,123},{133,0,911},{136,0,278},{5,10,430},{5, -10,932},{6,10,131},{7,10,417},{9,10,522},{11,10,314},{141,10,390},{14,10,149},{ -14,10,399},{143,10,57},{4,0,151},{7,0,1567},{136,0,749},{5,11,228},{6,11,203},{7 -,11,156},{8,11,347},{137,11,265},{132,10,507},{10,0,989},{140,0,956},{133,0,990} -,{5,0,194},{6,0,927},{7,0,1662},{9,0,90},{140,0,564},{4,10,343},{133,10,511},{ -133,0,425},{7,10,455},{138,10,591},{4,0,774},{7,11,476},{7,11,1592},{138,11,87}, -{5,0,971},{135,10,1381},{5,11,318},{147,11,121},{5,11,291},{7,11,765},{9,11,389} -,{140,11,548},{134,10,575},{4,0,827},{12,0,646},{12,0,705},{12,0,712},{140,0,714 -},{139,0,752},{137,0,662},{5,0,72},{6,0,264},{7,0,21},{7,0,46},{7,0,2013},{8,0, -215},{8,0,513},{10,0,266},{139,0,22},{139,11,522},{6,0,239},{7,0,118},{10,0,95}, -{11,0,603},{13,0,443},{14,0,160},{143,0,4},{6,0,431},{134,0,669},{7,10,1127},{7, -10,1572},{10,10,297},{10,10,422},{11,10,764},{11,10,810},{12,10,264},{13,10,102} -,{13,10,300},{13,10,484},{14,10,147},{14,10,229},{17,10,71},{18,10,118},{147,10, -120},{5,0,874},{6,0,1677},{15,0,0},{10,11,525},{139,11,82},{6,0,65},{7,0,939},{7 -,0,1172},{7,0,1671},{9,0,540},{10,0,696},{11,0,265},{11,0,732},{11,0,928},{11,0, -937},{141,0,438},{134,0,1350},{136,11,547},{132,11,422},{5,11,355},{145,11,0},{ -137,11,905},{5,0,682},{135,0,1887},{132,0,809},{4,0,696},{133,11,865},{6,0,1074} -,{6,0,1472},{14,10,35},{142,10,191},{5,11,914},{134,11,1625},{133,11,234},{135, -11,1383},{137,11,780},{132,10,125},{4,0,726},{133,0,630},{8,0,802},{136,0,838},{ -132,10,721},{6,0,1337},{7,0,776},{19,0,56},{136,10,145},{132,0,970},{7,10,792},{ -8,10,147},{10,10,821},{139,10,1021},{139,10,970},{8,0,940},{137,0,797},{135,11, -1312},{9,0,248},{10,0,400},{7,11,816},{7,11,1241},{7,10,1999},{9,11,283},{9,11, -520},{10,11,213},{10,11,307},{10,11,463},{10,11,671},{10,11,746},{11,11,401},{11 -,11,794},{12,11,517},{18,11,107},{147,11,115},{6,0,1951},{134,0,2040},{135,11, -339},{13,0,41},{15,0,93},{5,10,168},{5,10,930},{8,10,74},{9,10,623},{12,10,500}, -{140,10,579},{6,0,118},{7,0,215},{7,0,1521},{140,0,11},{6,10,220},{7,10,1101},{ -141,10,105},{6,11,421},{7,11,61},{7,11,1540},{10,11,11},{138,11,501},{7,0,615},{ -138,0,251},{140,11,631},{135,0,1044},{6,10,19},{7,10,1413},{139,10,428},{133,0, -225},{7,10,96},{8,10,401},{8,10,703},{137,10,896},{145,10,116},{6,11,102},{7,11, -72},{15,11,142},{147,11,67},{7,10,1961},{7,10,1965},{8,10,702},{136,10,750},{7, -10,2030},{8,10,150},{8,10,737},{12,10,366},{151,11,30},{4,0,370},{5,0,756},{7,0, -1326},{135,11,823},{8,10,800},{9,10,148},{9,10,872},{9,10,890},{11,10,309},{11, -10,1001},{13,10,267},{141,10,323},{6,0,1662},{7,0,48},{8,0,771},{10,0,116},{13,0 -,104},{14,0,105},{14,0,184},{15,0,168},{19,0,92},{148,0,68},{10,0,209},{135,11, -1870},{7,11,68},{8,11,48},{8,11,88},{8,11,582},{8,11,681},{9,11,373},{9,11,864}, -{11,11,157},{11,11,336},{11,11,843},{148,11,27},{134,0,930},{4,11,88},{5,11,137} -,{5,11,174},{5,11,777},{6,11,1664},{6,11,1725},{7,11,77},{7,11,426},{7,11,1317}, -{7,11,1355},{8,11,126},{8,11,563},{9,11,523},{9,11,750},{10,11,310},{10,11,836}, -{11,11,42},{11,11,318},{11,11,731},{12,11,68},{12,11,92},{12,11,507},{12,11,692} -,{13,11,81},{13,11,238},{13,11,374},{18,11,138},{19,11,78},{19,11,111},{20,11,55 -},{20,11,77},{148,11,92},{4,11,938},{135,11,1831},{5,10,547},{7,10,424},{8,11, -617},{138,11,351},{6,0,1286},{6,11,1668},{7,11,1499},{8,11,117},{9,11,314},{138, -11,174},{6,0,759},{6,0,894},{7,11,707},{139,11,563},{4,0,120},{135,0,1894},{9,0, -385},{149,0,17},{138,0,429},{133,11,403},{5,0,820},{135,0,931},{10,0,199},{133, -10,133},{6,0,151},{6,0,1675},{7,0,383},{151,0,10},{6,0,761},{136,10,187},{8,0, -365},{10,10,0},{10,10,818},{139,10,988},{4,11,44},{5,11,311},{6,11,156},{7,11, -639},{7,11,762},{7,11,1827},{9,11,8},{9,11,462},{148,11,83},{4,11,346},{7,11,115 -},{9,11,180},{9,11,456},{138,11,363},{136,10,685},{7,0,1086},{145,0,46},{6,0, -1624},{11,0,11},{12,0,422},{13,0,444},{142,0,360},{6,0,1020},{6,0,1260},{134,0, -1589},{4,0,43},{5,0,344},{5,0,357},{14,0,472},{150,0,58},{6,0,1864},{6,0,1866},{ -6,0,1868},{6,0,1869},{6,0,1874},{6,0,1877},{6,0,1903},{6,0,1911},{9,0,920},{9,0, -921},{9,0,924},{9,0,946},{9,0,959},{9,0,963},{9,0,970},{9,0,997},{9,0,1008},{9,0 -,1017},{12,0,795},{12,0,797},{12,0,798},{12,0,800},{12,0,803},{12,0,811},{12,0, -820},{12,0,821},{12,0,839},{12,0,841},{12,0,848},{12,0,911},{12,0,921},{12,0,922 -},{12,0,925},{12,0,937},{12,0,944},{12,0,945},{12,0,953},{15,0,184},{15,0,191},{ -15,0,199},{15,0,237},{15,0,240},{15,0,243},{15,0,246},{18,0,203},{21,0,40},{21,0 -,52},{21,0,57},{24,0,23},{24,0,28},{152,0,30},{134,0,725},{145,11,58},{133,0,888 -},{137,10,874},{4,0,711},{8,10,774},{10,10,670},{140,10,51},{144,11,40},{6,11, -185},{7,11,1899},{139,11,673},{137,10,701},{137,0,440},{4,11,327},{5,11,478},{7, -11,1332},{8,11,753},{140,11,227},{4,10,127},{5,10,350},{6,10,356},{8,10,426},{9, -10,572},{10,10,247},{139,10,312},{5,11,1020},{133,11,1022},{4,11,103},{133,11, -401},{6,0,1913},{6,0,1926},{6,0,1959},{9,0,914},{9,0,939},{9,0,952},{9,0,979},{9 -,0,990},{9,0,998},{9,0,1003},{9,0,1023},{12,0,827},{12,0,834},{12,0,845},{12,0, -912},{12,0,935},{12,0,951},{15,0,172},{15,0,174},{18,0,198},{149,0,63},{5,0,958} -,{5,0,987},{4,11,499},{135,11,1421},{7,0,885},{6,10,59},{6,10,1762},{9,10,603},{ -141,10,397},{10,11,62},{141,11,164},{4,0,847},{135,0,326},{11,0,276},{142,0,293} -,{4,0,65},{5,0,479},{5,0,1004},{7,0,1913},{8,0,317},{9,0,302},{10,0,612},{13,0, -22},{132,11,96},{4,0,261},{135,0,510},{135,0,1514},{6,10,111},{7,10,4},{8,10,163 -},{8,10,776},{138,10,566},{4,0,291},{9,0,515},{12,0,152},{12,0,443},{13,0,392},{ -142,0,357},{7,11,399},{135,11,1492},{4,0,589},{139,0,282},{6,11,563},{135,10, -1994},{5,10,297},{135,10,1038},{4,0,130},{7,0,843},{135,0,1562},{5,0,42},{5,0, -879},{7,0,245},{7,0,324},{7,0,1532},{11,0,463},{11,0,472},{13,0,363},{144,0,52}, -{4,0,134},{133,0,372},{133,0,680},{136,10,363},{6,0,1997},{8,0,935},{136,0,977}, -{4,0,810},{135,0,1634},{135,10,1675},{7,0,1390},{4,11,910},{133,11,832},{7,10, -808},{8,11,266},{139,11,578},{132,0,644},{4,0,982},{138,0,867},{132,10,280},{135 -,0,540},{140,10,54},{135,0,123},{134,0,1978},{4,10,421},{133,10,548},{6,0,623},{ -136,0,789},{4,0,908},{5,0,359},{5,0,508},{6,0,1723},{7,0,343},{7,0,1996},{135,0, -2026},{134,0,1220},{4,0,341},{135,0,480},{6,10,254},{9,10,109},{138,10,103},{134 -,0,888},{8,11,528},{137,11,348},{7,0,1995},{8,0,299},{11,0,890},{12,0,674},{4,11 -,20},{133,11,616},{135,11,1094},{134,10,1630},{4,0,238},{5,0,503},{6,0,179},{7,0 -,2003},{8,0,381},{8,0,473},{9,0,149},{10,0,788},{15,0,45},{15,0,86},{20,0,110},{ -150,0,57},{133,10,671},{4,11,26},{5,11,429},{6,11,245},{7,11,704},{7,11,1379},{ -135,11,1474},{4,0,121},{5,0,156},{5,0,349},{9,0,431},{10,0,605},{142,0,342},{7, -11,943},{139,11,614},{132,10,889},{132,11,621},{7,10,1382},{7,11,1382},{135,10, -1910},{132,10,627},{133,10,775},{133,11,542},{133,11,868},{136,11,433},{6,0,1373 -},{7,0,1011},{11,10,362},{11,10,948},{140,10,388},{6,0,80},{7,0,173},{9,0,547},{ -10,0,730},{14,0,18},{22,0,39},{135,11,1495},{6,0,1694},{135,0,1974},{140,0,196}, -{4,0,923},{6,0,507},{6,0,1711},{7,10,451},{8,10,389},{12,10,490},{13,10,16},{13, -10,215},{13,10,351},{18,10,132},{147,10,125},{6,0,646},{134,0,1047},{135,10,841} -,{136,10,566},{6,0,1611},{135,0,1214},{139,0,926},{132,11,525},{132,0,595},{5,0, -240},{6,0,459},{7,0,12},{7,0,114},{7,0,949},{7,0,1753},{7,0,1805},{8,0,658},{9,0 -,1},{11,0,959},{141,0,446},{5,10,912},{134,10,1695},{132,0,446},{7,11,62},{12,11 -,45},{147,11,112},{5,10,236},{6,10,572},{8,10,492},{11,10,618},{144,10,56},{5,10 -,190},{136,10,318},{135,10,1376},{4,11,223},{6,11,359},{11,11,3},{13,11,108},{14 -,11,89},{144,11,22},{132,11,647},{134,0,490},{134,0,491},{134,0,1584},{135,11, -685},{138,11,220},{7,0,250},{136,0,507},{132,0,158},{4,0,140},{7,0,362},{8,0,209 -},{9,0,10},{9,0,160},{9,0,503},{9,0,614},{10,0,689},{11,0,327},{11,0,553},{11,0, -725},{11,0,767},{12,0,252},{12,0,583},{13,0,192},{14,0,269},{14,0,356},{148,0,50 -},{19,0,1},{19,0,26},{150,0,9},{132,11,109},{6,0,228},{7,0,1341},{9,0,408},{138, -0,343},{4,0,373},{5,0,283},{6,0,480},{7,0,609},{10,0,860},{138,0,878},{6,0,779}, -{134,0,1209},{4,0,557},{7,11,263},{7,11,628},{136,11,349},{132,0,548},{7,0,197}, -{8,0,142},{8,0,325},{9,0,150},{9,0,596},{10,0,350},{10,0,353},{11,0,74},{11,0, -315},{12,0,662},{12,0,681},{14,0,423},{143,0,141},{4,11,40},{10,11,67},{11,11, -117},{11,11,768},{139,11,935},{7,11,992},{8,11,301},{9,11,722},{12,11,63},{13,11 -,29},{14,11,161},{143,11,18},{6,0,1490},{138,11,532},{5,0,580},{7,0,378},{7,0, -674},{7,0,1424},{15,0,83},{16,0,11},{15,11,83},{144,11,11},{6,0,1057},{6,0,1335} -,{10,0,316},{7,10,85},{7,10,247},{8,10,585},{138,10,163},{4,0,169},{5,0,83},{6,0 -,399},{6,0,579},{6,0,1513},{7,0,692},{7,0,846},{7,0,1015},{7,0,1799},{8,0,403},{ -9,0,394},{10,0,133},{12,0,4},{12,0,297},{12,0,452},{16,0,81},{18,0,25},{21,0,14} -,{22,0,12},{151,0,18},{134,0,1106},{7,0,1546},{11,0,299},{142,0,407},{134,0,1192 -},{132,0,177},{5,0,411},{135,0,653},{7,0,439},{10,0,727},{11,0,260},{139,0,684}, -{138,10,145},{147,10,83},{5,0,208},{7,0,753},{135,0,1528},{137,11,617},{135,10, -1922},{135,11,825},{11,0,422},{13,0,389},{4,10,124},{10,10,457},{11,10,121},{11, -10,169},{11,10,870},{12,10,214},{14,10,187},{143,10,77},{11,0,615},{15,0,58},{11 -,11,615},{143,11,58},{9,0,618},{138,0,482},{6,0,1952},{6,0,1970},{142,0,505},{7, -10,1193},{135,11,1838},{133,0,242},{135,10,1333},{6,10,107},{7,10,638},{7,10, -1632},{137,10,396},{133,0,953},{5,10,370},{134,10,1756},{5,11,28},{6,11,204},{10 -,11,320},{10,11,583},{13,11,502},{14,11,72},{14,11,274},{14,11,312},{14,11,344}, -{15,11,159},{16,11,62},{16,11,69},{17,11,30},{18,11,42},{18,11,53},{18,11,84},{ -18,11,140},{19,11,68},{19,11,85},{20,11,5},{20,11,45},{20,11,101},{22,11,7},{150 -,11,20},{4,11,558},{6,11,390},{7,11,162},{7,11,689},{9,11,360},{138,11,653},{11, -0,802},{141,0,67},{133,10,204},{133,0,290},{5,10,970},{134,10,1706},{132,0,380}, -{5,0,52},{7,0,277},{9,0,368},{139,0,791},{5,11,856},{6,11,1672},{6,11,1757},{6, -11,1781},{7,11,1150},{7,11,1425},{7,11,1453},{140,11,513},{5,11,92},{7,10,3},{10 -,11,736},{140,11,102},{4,0,112},{5,0,653},{5,10,483},{5,10,685},{6,10,489},{7,10 -,1204},{136,10,394},{132,10,921},{6,0,1028},{133,10,1007},{5,11,590},{9,11,213}, -{145,11,91},{135,10,1696},{10,0,138},{139,0,476},{5,0,725},{5,0,727},{135,0,1811 -},{4,0,979},{6,0,1821},{6,0,1838},{8,0,876},{8,0,883},{8,0,889},{8,0,893},{8,0, -895},{10,0,934},{12,0,720},{14,0,459},{148,0,123},{135,11,551},{4,0,38},{6,0,435 -},{7,0,307},{7,0,999},{7,0,1481},{7,0,1732},{7,0,1738},{8,0,371},{9,0,414},{11,0 -,316},{12,0,52},{13,0,420},{147,0,100},{135,0,1296},{132,10,712},{134,10,1629},{ -133,0,723},{134,0,651},{136,11,191},{9,11,791},{10,11,93},{11,11,301},{16,11,13} -,{17,11,23},{18,11,135},{19,11,12},{20,11,1},{20,11,12},{148,11,14},{136,11,503} -,{6,11,466},{135,11,671},{6,0,1200},{134,0,1330},{135,0,1255},{134,0,986},{5,0, -109},{6,0,1784},{7,0,1895},{12,0,296},{140,0,302},{135,11,983},{133,10,485},{134 -,0,660},{134,0,800},{5,0,216},{5,0,294},{6,0,591},{7,0,1879},{9,0,141},{9,0,270} -,{9,0,679},{10,0,159},{11,0,197},{11,0,438},{12,0,538},{12,0,559},{14,0,144},{14 -,0,167},{15,0,67},{4,10,285},{5,10,317},{6,10,301},{7,10,7},{8,10,153},{10,10, -766},{11,10,468},{12,10,467},{141,10,143},{136,0,945},{134,0,1090},{137,0,81},{ -12,11,468},{19,11,96},{148,11,24},{134,0,391},{138,11,241},{7,0,322},{136,0,249} -,{134,0,1412},{135,11,795},{5,0,632},{138,0,526},{136,10,819},{6,0,144},{7,0,948 -},{7,0,1042},{8,0,235},{8,0,461},{9,0,453},{9,0,796},{10,0,354},{17,0,77},{135, -11,954},{139,10,917},{6,0,940},{134,0,1228},{4,0,362},{7,0,52},{135,0,303},{6,11 -,549},{8,11,34},{8,11,283},{9,11,165},{138,11,475},{7,11,370},{7,11,1007},{7,11, -1177},{135,11,1565},{5,11,652},{5,11,701},{135,11,449},{5,0,196},{6,0,486},{7,0, -212},{8,0,309},{136,0,346},{6,10,1719},{6,10,1735},{7,10,2016},{7,10,2020},{8,10 -,837},{137,10,852},{6,11,159},{6,11,364},{7,11,516},{7,11,1439},{137,11,518},{ -135,0,1912},{135,0,1290},{132,0,686},{141,11,151},{138,0,625},{136,0,706},{138, -10,568},{139,0,412},{4,0,30},{133,0,43},{8,10,67},{138,10,419},{7,0,967},{141,0, -11},{12,0,758},{14,0,441},{142,0,462},{10,10,657},{14,10,297},{142,10,361},{139, -10,729},{4,0,220},{135,0,1535},{7,11,501},{9,11,111},{10,11,141},{11,11,332},{13 -,11,43},{13,11,429},{14,11,130},{14,11,415},{145,11,102},{4,0,950},{6,0,1859},{7 -,0,11},{8,0,873},{12,0,710},{12,0,718},{12,0,748},{12,0,765},{148,0,124},{5,11, -149},{5,11,935},{136,11,233},{142,11,291},{134,0,1579},{7,0,890},{8,10,51},{9,10 -,868},{10,10,833},{12,10,481},{12,10,570},{148,10,106},{141,0,2},{132,10,445},{ -136,11,801},{135,0,1774},{7,0,1725},{138,0,393},{5,0,263},{134,0,414},{132,11, -322},{133,10,239},{7,0,456},{7,10,1990},{8,10,130},{139,10,720},{137,0,818},{5, -10,123},{6,10,530},{7,10,348},{135,10,1419},{135,10,2024},{6,0,178},{6,0,1750},{ -8,0,251},{9,0,690},{10,0,155},{10,0,196},{10,0,373},{11,0,698},{13,0,155},{148,0 -,93},{5,0,97},{137,0,393},{134,0,674},{11,0,223},{140,0,168},{132,10,210},{139, -11,464},{6,0,1639},{146,0,159},{139,11,2},{7,0,934},{8,0,647},{17,0,97},{19,0,59 -},{150,0,2},{132,0,191},{5,0,165},{9,0,346},{10,0,655},{11,0,885},{4,10,430},{ -135,11,357},{133,0,877},{5,10,213},{133,11,406},{8,0,128},{139,0,179},{6,11,69}, -{135,11,117},{135,0,1297},{11,11,43},{13,11,72},{141,11,142},{135,11,1830},{142, -0,164},{5,0,57},{6,0,101},{6,0,586},{6,0,1663},{7,0,132},{7,0,1154},{7,0,1415},{ -7,0,1507},{12,0,493},{15,0,105},{151,0,15},{5,0,459},{7,0,1073},{8,0,241},{136,0 -,334},{133,11,826},{133,10,108},{5,10,219},{10,11,132},{11,11,191},{11,11,358},{ -139,11,460},{6,0,324},{6,0,520},{7,0,338},{7,0,1729},{8,0,228},{139,0,750},{21,0 -,30},{22,0,53},{4,10,193},{5,10,916},{7,10,364},{10,10,398},{10,10,726},{11,10, -317},{11,10,626},{12,10,142},{12,10,288},{12,10,678},{13,10,313},{15,10,113},{ -146,10,114},{6,11,110},{135,11,1681},{135,0,910},{6,10,241},{7,10,907},{8,10,832 -},{9,10,342},{10,10,729},{11,10,284},{11,10,445},{11,10,651},{11,10,863},{13,10, -398},{146,10,99},{7,0,705},{9,0,734},{5,11,1000},{7,11,733},{137,11,583},{4,0,73 -},{6,0,612},{7,0,927},{7,0,1822},{8,0,217},{9,0,765},{9,0,766},{10,0,408},{11,0, -51},{11,0,793},{12,0,266},{15,0,158},{20,0,89},{150,0,32},{7,0,1330},{4,11,297}, -{6,11,529},{7,11,152},{7,11,713},{7,11,1845},{8,11,710},{8,11,717},{140,11,639}, -{5,0,389},{136,0,636},{134,0,1409},{4,10,562},{9,10,254},{139,10,879},{134,0,893 -},{132,10,786},{4,11,520},{135,11,575},{136,0,21},{140,0,721},{136,0,959},{7,11, -1428},{7,11,1640},{9,11,169},{9,11,182},{9,11,367},{9,11,478},{9,11,506},{9,11, -551},{9,11,648},{9,11,651},{9,11,697},{9,11,705},{9,11,725},{9,11,787},{9,11,794 -},{10,11,198},{10,11,214},{10,11,267},{10,11,275},{10,11,456},{10,11,551},{10,11 -,561},{10,11,613},{10,11,627},{10,11,668},{10,11,675},{10,11,691},{10,11,695},{ -10,11,707},{10,11,715},{11,11,183},{11,11,201},{11,11,244},{11,11,262},{11,11, -352},{11,11,439},{11,11,493},{11,11,572},{11,11,591},{11,11,608},{11,11,611},{11 -,11,646},{11,11,674},{11,11,711},{11,11,751},{11,11,761},{11,11,776},{11,11,785} -,{11,11,850},{11,11,853},{11,11,862},{11,11,865},{11,11,868},{11,11,898},{11,11, -902},{11,11,903},{11,11,910},{11,11,932},{11,11,942},{11,11,957},{11,11,967},{11 -,11,972},{12,11,148},{12,11,195},{12,11,220},{12,11,237},{12,11,318},{12,11,339} -,{12,11,393},{12,11,445},{12,11,450},{12,11,474},{12,11,509},{12,11,533},{12,11, -591},{12,11,594},{12,11,597},{12,11,621},{12,11,633},{12,11,642},{13,11,59},{13, -11,60},{13,11,145},{13,11,239},{13,11,250},{13,11,273},{13,11,329},{13,11,344},{ -13,11,365},{13,11,372},{13,11,387},{13,11,403},{13,11,414},{13,11,456},{13,11, -478},{13,11,483},{13,11,489},{14,11,55},{14,11,57},{14,11,81},{14,11,90},{14,11, -148},{14,11,239},{14,11,266},{14,11,321},{14,11,326},{14,11,327},{14,11,330},{14 -,11,347},{14,11,355},{14,11,401},{14,11,411},{14,11,414},{14,11,416},{14,11,420} -,{15,11,61},{15,11,74},{15,11,87},{15,11,88},{15,11,94},{15,11,96},{15,11,116},{ -15,11,149},{15,11,154},{16,11,50},{16,11,63},{16,11,73},{17,11,2},{17,11,66},{17 -,11,92},{17,11,103},{17,11,112},{18,11,50},{18,11,54},{18,11,82},{18,11,86},{18, -11,90},{18,11,111},{18,11,115},{18,11,156},{19,11,40},{19,11,79},{20,11,78},{149 -,11,22},{137,11,170},{134,0,1433},{135,11,1307},{139,11,411},{5,0,189},{7,0,442} -,{7,0,443},{8,0,281},{12,0,174},{141,0,261},{6,10,216},{7,10,901},{7,10,1343},{ -136,10,493},{5,11,397},{6,11,154},{7,10,341},{7,11,676},{8,11,443},{8,11,609},{9 -,11,24},{9,11,325},{10,11,35},{11,10,219},{11,11,535},{11,11,672},{11,11,1018},{ -12,11,637},{144,11,30},{6,0,2},{7,0,191},{7,0,446},{7,0,1262},{7,0,1737},{8,0,22 -},{8,0,270},{8,0,612},{9,0,4},{9,0,312},{9,0,436},{9,0,626},{10,0,216},{10,0,311 -},{10,0,521},{10,0,623},{11,0,72},{11,0,330},{11,0,455},{12,0,321},{12,0,504},{ -12,0,530},{12,0,543},{13,0,17},{13,0,156},{13,0,334},{14,0,131},{17,0,60},{148,0 -,64},{7,0,354},{10,0,410},{139,0,815},{139,10,130},{7,10,1734},{137,11,631},{12, -0,425},{15,0,112},{10,10,115},{11,10,420},{13,10,404},{14,10,346},{143,10,54},{6 -,0,60},{6,0,166},{7,0,374},{7,0,670},{7,0,1327},{8,0,411},{8,0,435},{9,0,653},{9 -,0,740},{10,0,385},{11,0,222},{11,0,324},{11,0,829},{140,0,611},{7,0,1611},{13,0 -,14},{15,0,44},{19,0,13},{148,0,76},{133,11,981},{4,11,56},{7,11,1791},{8,11,607 -},{8,11,651},{11,11,465},{11,11,835},{12,11,337},{141,11,480},{6,0,1478},{5,10, -1011},{136,10,701},{139,0,596},{5,0,206},{134,0,398},{4,10,54},{5,10,666},{7,10, -1039},{7,10,1130},{9,10,195},{138,10,302},{7,0,50},{9,11,158},{138,11,411},{135, -11,1120},{6,0,517},{7,0,1159},{10,0,621},{11,0,192},{134,10,1669},{4,0,592},{6,0 -,600},{135,0,1653},{10,0,223},{139,0,645},{136,11,139},{7,0,64},{136,0,245},{142 -,0,278},{6,11,622},{135,11,1030},{136,0,604},{134,0,1502},{138,0,265},{141,11, -168},{7,0,1763},{140,0,310},{7,10,798},{139,11,719},{7,11,160},{10,11,624},{142, -11,279},{132,11,363},{7,10,122},{9,10,259},{10,10,84},{11,10,470},{12,10,541},{ -141,10,379},{5,0,129},{6,0,61},{135,0,947},{134,0,1356},{135,11,1191},{13,0,505} -,{141,0,506},{11,0,1000},{5,10,82},{5,10,131},{7,10,1755},{8,10,31},{9,10,168},{ -9,10,764},{139,10,869},{134,0,966},{134,10,605},{134,11,292},{5,11,177},{6,11, -616},{7,11,827},{9,11,525},{138,11,656},{135,11,1486},{138,11,31},{5,10,278},{ -137,10,68},{4,10,163},{5,10,201},{5,10,307},{5,10,310},{6,10,335},{7,10,284},{ -136,10,165},{6,0,839},{135,10,1660},{136,10,781},{6,10,33},{135,10,1244},{133,0, -637},{4,11,161},{133,11,631},{137,0,590},{7,10,1953},{136,10,720},{5,0,280},{7,0 -,1226},{138,10,203},{134,0,1386},{5,0,281},{6,0,1026},{6,10,326},{7,10,677},{137 -,10,425},{7,11,1557},{135,11,1684},{135,0,1064},{9,11,469},{9,11,709},{12,11,512 -},{14,11,65},{145,11,12},{134,0,917},{10,11,229},{11,11,73},{11,11,376},{139,11, -433},{7,0,555},{9,0,192},{13,0,30},{13,0,49},{15,0,150},{16,0,76},{20,0,52},{7, -10,1316},{7,10,1412},{7,10,1839},{9,10,589},{11,10,241},{11,10,676},{11,10,811}, -{11,10,891},{12,10,140},{12,10,346},{12,10,479},{13,10,381},{14,10,188},{146,10, -30},{149,0,15},{6,0,1882},{6,0,1883},{6,0,1897},{9,0,945},{9,0,1014},{9,0,1020}, -{12,0,823},{12,0,842},{12,0,866},{12,0,934},{15,0,242},{146,0,208},{6,0,965},{ -134,0,1499},{7,0,33},{7,0,120},{8,0,489},{9,0,319},{10,0,820},{11,0,1004},{12,0, -379},{12,0,679},{13,0,117},{13,0,412},{14,0,25},{15,0,52},{15,0,161},{16,0,47},{ -149,0,2},{6,11,558},{7,11,651},{8,11,421},{9,11,0},{138,11,34},{4,0,937},{5,0, -801},{7,0,473},{5,10,358},{7,10,1184},{10,10,662},{13,10,212},{13,10,304},{13,10 -,333},{145,10,98},{132,0,877},{6,0,693},{134,0,824},{132,0,365},{7,11,1832},{138 -,11,374},{5,0,7},{139,0,774},{4,0,734},{5,0,662},{134,0,430},{4,0,746},{135,0, -1090},{5,0,360},{8,0,237},{10,0,231},{147,0,124},{138,11,348},{6,11,6},{7,11,81} -,{7,11,771},{7,11,1731},{9,11,405},{138,11,421},{6,0,740},{137,0,822},{133,10, -946},{7,0,1485},{136,0,929},{7,10,411},{8,10,631},{9,10,323},{10,10,355},{11,10, -491},{12,10,143},{12,10,402},{13,10,73},{14,10,408},{15,10,107},{146,10,71},{135 -,10,590},{5,11,881},{133,11,885},{150,11,25},{4,0,852},{5,11,142},{134,11,546},{ -7,10,1467},{8,10,328},{10,10,544},{11,10,955},{13,10,320},{145,10,83},{9,0,17},{ -10,0,291},{11,10,511},{13,10,394},{14,10,298},{14,10,318},{146,10,103},{5,11,466 -},{11,11,571},{12,11,198},{13,11,283},{14,11,186},{15,11,21},{143,11,103},{134,0 -,1001},{4,11,185},{5,11,257},{5,11,839},{5,11,936},{7,11,171},{9,11,399},{10,11, -258},{10,11,395},{10,11,734},{11,11,1014},{12,11,23},{13,11,350},{14,11,150},{ -147,11,6},{143,0,35},{132,0,831},{5,10,835},{134,10,483},{4,0,277},{5,0,608},{6, -0,493},{7,0,457},{12,0,384},{7,11,404},{7,11,1377},{7,11,1430},{7,11,2017},{8,11 -,149},{8,11,239},{8,11,512},{8,11,793},{8,11,818},{9,11,474},{9,11,595},{10,11, -122},{10,11,565},{10,11,649},{10,11,783},{11,11,239},{11,11,295},{11,11,447},{11 -,11,528},{11,11,639},{11,11,800},{11,11,936},{12,11,25},{12,11,73},{12,11,77},{ -12,11,157},{12,11,316},{12,11,390},{12,11,391},{12,11,394},{12,11,395},{12,11, -478},{12,11,503},{12,11,592},{12,11,680},{13,11,50},{13,11,53},{13,11,132},{13, -11,198},{13,11,275},{13,11,322},{13,11,415},{14,11,71},{14,11,257},{14,11,395},{ -15,11,71},{15,11,136},{17,11,123},{18,11,93},{147,11,58},{134,0,1351},{7,0,27},{ -135,0,316},{136,11,712},{136,0,984},{133,0,552},{137,0,264},{132,0,401},{6,0,710 -},{6,0,1111},{134,0,1343},{134,0,1211},{9,0,543},{10,0,524},{11,0,108},{11,0,653 -},{12,0,524},{13,0,123},{14,0,252},{16,0,18},{19,0,38},{20,0,26},{20,0,65},{21,0 -,3},{151,0,11},{4,0,205},{5,0,623},{7,0,104},{8,0,519},{137,0,716},{132,10,677}, -{4,11,377},{152,11,13},{135,11,1673},{7,0,579},{9,0,41},{9,0,244},{9,0,669},{10, -0,5},{11,0,861},{11,0,951},{139,0,980},{132,0,717},{136,0,1011},{132,0,805},{4, -11,180},{135,11,1906},{132,10,777},{132,10,331},{132,0,489},{6,0,1024},{4,11,491 -},{133,10,747},{135,11,1182},{4,11,171},{138,11,234},{4,11,586},{7,11,1186},{138 -,11,631},{135,0,892},{135,11,336},{9,11,931},{10,11,334},{148,11,71},{137,0,473} -,{6,0,864},{12,0,659},{139,11,926},{7,0,819},{9,0,26},{9,0,392},{10,0,152},{10,0 -,226},{11,0,19},{12,0,276},{12,0,426},{12,0,589},{13,0,460},{15,0,97},{19,0,48}, -{148,0,104},{135,0,51},{133,10,326},{4,10,691},{146,10,16},{9,0,130},{11,0,765}, -{10,10,680},{10,10,793},{141,10,357},{133,11,765},{8,0,229},{6,10,32},{7,10,385} -,{7,10,757},{7,10,1916},{8,10,94},{8,10,711},{9,10,541},{10,10,162},{10,10,795}, -{11,10,989},{11,10,1010},{12,10,14},{142,10,308},{7,11,474},{137,11,578},{132,0, -674},{132,0,770},{5,0,79},{7,0,1027},{7,0,1477},{139,0,52},{133,11,424},{134,0, -1666},{6,0,409},{6,10,349},{6,10,1682},{7,10,1252},{8,10,112},{8,11,714},{9,10, -435},{9,10,668},{10,10,290},{10,10,319},{10,10,815},{11,10,180},{11,10,837},{12, -10,240},{13,10,152},{13,10,219},{142,10,158},{5,0,789},{134,0,195},{4,0,251},{4, -0,688},{7,0,513},{135,0,1284},{132,10,581},{9,11,420},{10,11,269},{10,11,285},{ -10,11,576},{11,11,397},{13,11,175},{145,11,90},{6,10,126},{7,10,573},{8,10,397}, -{142,10,44},{132,11,429},{133,0,889},{4,0,160},{5,0,330},{7,0,1434},{136,0,174}, -{7,11,18},{7,11,699},{7,11,1966},{8,11,752},{9,11,273},{9,11,412},{9,11,703},{10 -,11,71},{10,11,427},{10,11,508},{146,11,97},{6,0,872},{134,0,899},{133,10,926},{ -134,0,1126},{134,0,918},{4,11,53},{5,11,186},{135,11,752},{7,0,268},{136,0,569}, -{134,0,1224},{6,0,1361},{7,10,1232},{137,10,531},{8,11,575},{10,11,289},{139,11, -319},{133,10,670},{132,11,675},{133,0,374},{135,10,1957},{133,0,731},{11,0,190}, -{15,0,49},{11,11,190},{143,11,49},{4,0,626},{5,0,506},{5,0,642},{6,0,425},{10,0, -202},{139,0,141},{137,0,444},{7,10,242},{135,10,1942},{6,11,209},{8,11,468},{9, -11,210},{11,11,36},{12,11,28},{12,11,630},{13,11,21},{13,11,349},{14,11,7},{145, -11,13},{4,11,342},{135,11,1179},{5,10,834},{7,10,1202},{8,10,14},{9,10,481},{137 -,10,880},{4,11,928},{133,11,910},{4,11,318},{4,11,496},{7,11,856},{139,11,654},{ -136,0,835},{7,0,1526},{138,10,465},{151,0,17},{135,0,477},{4,10,357},{6,10,172}, -{7,10,143},{137,10,413},{6,0,1374},{138,0,994},{18,0,76},{132,10,590},{7,0,287}, -{8,0,355},{9,0,293},{137,0,743},{134,0,1389},{7,11,915},{8,11,247},{147,11,0},{4 -,11,202},{5,11,382},{6,11,454},{7,11,936},{7,11,1803},{8,11,758},{9,11,375},{9, -11,895},{10,11,743},{10,11,792},{11,11,978},{11,11,1012},{142,11,109},{5,0,384}, -{8,0,455},{140,0,48},{132,11,390},{5,10,169},{7,10,333},{136,10,45},{5,0,264},{ -134,0,184},{138,11,791},{133,11,717},{132,10,198},{6,11,445},{7,11,332},{137,11, -909},{136,0,1001},{4,10,24},{5,10,140},{5,10,185},{7,10,1500},{11,10,565},{139, -10,838},{134,11,578},{5,0,633},{6,0,28},{135,0,1323},{132,0,851},{136,11,267},{7 -,0,359},{8,0,243},{140,0,175},{4,10,334},{133,10,593},{141,11,87},{136,11,766},{ -10,0,287},{12,0,138},{10,11,287},{140,11,138},{4,0,105},{132,0,740},{140,10,116} -,{134,0,857},{135,11,1841},{6,0,1402},{137,0,819},{132,11,584},{132,10,709},{133 -,10,897},{5,0,224},{13,0,174},{146,0,52},{135,10,1840},{4,10,608},{133,10,497},{ -139,11,60},{4,0,758},{135,0,1649},{4,11,226},{4,11,326},{135,11,1770},{5,11,426} -,{8,11,30},{9,11,2},{11,11,549},{147,11,122},{135,10,2039},{6,10,540},{136,10, -136},{4,0,573},{8,0,655},{4,10,897},{133,10,786},{7,0,351},{139,0,128},{133,10, -999},{4,10,299},{135,10,1004},{133,0,918},{132,11,345},{4,11,385},{7,11,265},{ -135,11,587},{133,10,456},{136,10,180},{6,0,687},{134,0,1537},{4,11,347},{5,11, -423},{5,11,996},{135,11,1329},{132,10,755},{7,11,1259},{9,11,125},{11,11,65},{ -140,11,285},{5,11,136},{6,11,136},{136,11,644},{134,0,1525},{4,0,1009},{135,0, -1139},{139,10,338},{132,0,340},{135,10,1464},{8,0,847},{10,0,861},{10,0,876},{10 -,0,889},{10,0,922},{10,0,929},{10,0,933},{12,0,784},{140,0,791},{139,0,176},{9, -11,134},{10,11,2},{10,11,27},{10,11,333},{11,11,722},{143,11,1},{4,11,433},{133, -11,719},{5,0,985},{7,0,509},{7,0,529},{145,0,96},{132,0,615},{4,10,890},{5,10, -805},{5,10,819},{5,10,961},{6,10,396},{6,10,1631},{6,10,1678},{7,10,1967},{7,10, -2041},{9,10,630},{11,10,8},{11,10,1019},{12,10,176},{13,10,225},{14,10,292},{149 -,10,24},{135,0,1919},{134,0,1131},{144,11,21},{144,11,51},{135,10,1815},{4,0,247 -},{7,10,1505},{10,10,190},{10,10,634},{11,10,792},{12,10,358},{140,10,447},{5,10 -,0},{6,10,536},{7,10,604},{13,10,445},{145,10,126},{4,0,184},{5,0,390},{6,0,337} -,{7,0,23},{7,0,494},{7,0,618},{7,0,1456},{8,0,27},{8,0,599},{10,0,153},{139,0, -710},{6,10,232},{6,10,412},{7,10,1074},{8,10,9},{8,10,157},{8,10,786},{9,10,196} -,{9,10,352},{9,10,457},{10,10,337},{11,10,232},{11,10,877},{12,10,480},{140,10, -546},{13,0,38},{135,10,958},{4,10,382},{136,10,579},{4,10,212},{135,10,1206},{4, -11,555},{8,11,536},{138,11,288},{11,11,139},{139,11,171},{9,11,370},{138,11,90}, -{132,0,1015},{134,0,1088},{5,10,655},{135,11,977},{134,0,1585},{17,10,67},{147, -10,74},{10,0,227},{11,0,497},{11,0,709},{140,0,415},{6,0,360},{7,0,1664},{136,0, -478},{7,0,95},{6,10,231},{136,10,423},{140,11,65},{4,11,257},{135,11,2031},{135, -11,1768},{133,10,300},{139,11,211},{136,0,699},{6,10,237},{7,10,611},{8,10,100}, -{9,10,416},{11,10,335},{12,10,173},{146,10,101},{14,0,26},{146,0,150},{6,0,581}, -{135,0,1119},{135,10,1208},{132,0,739},{6,11,83},{6,11,1733},{135,11,1389},{137, -0,869},{4,0,67},{5,0,422},{7,0,1037},{7,0,1289},{7,0,1555},{9,0,741},{145,0,108} -,{133,10,199},{12,10,427},{146,10,38},{136,0,464},{142,0,42},{10,0,96},{8,11,501 -},{137,11,696},{134,11,592},{4,0,512},{4,0,966},{5,0,342},{6,0,1855},{8,0,869},{ -8,0,875},{8,0,901},{144,0,26},{8,0,203},{11,0,823},{11,0,846},{12,0,482},{13,0, -277},{13,0,302},{13,0,464},{14,0,205},{142,0,221},{4,0,449},{133,0,718},{7,11, -1718},{9,11,95},{9,11,274},{10,11,279},{10,11,317},{10,11,420},{11,11,303},{11, -11,808},{12,11,134},{12,11,367},{13,11,149},{13,11,347},{14,11,349},{14,11,406}, -{18,11,22},{18,11,89},{18,11,122},{147,11,47},{133,11,26},{4,0,355},{6,0,311},{9 -,0,256},{138,0,404},{132,11,550},{10,0,758},{6,10,312},{6,10,1715},{10,10,584},{ -11,10,546},{11,10,692},{12,10,259},{12,10,295},{13,10,46},{141,10,154},{136,11, -822},{5,0,827},{4,11,902},{5,11,809},{6,11,122},{135,11,896},{5,0,64},{140,0,581 -},{4,0,442},{6,0,739},{7,0,1047},{7,0,1352},{7,0,1643},{7,11,1911},{9,11,449},{ -10,11,192},{138,11,740},{135,11,262},{132,10,588},{133,11,620},{5,0,977},{6,0, -288},{7,0,528},{4,11,34},{5,11,574},{7,11,279},{7,11,1624},{136,11,601},{6,0, -1375},{4,10,231},{5,10,61},{6,10,104},{7,10,729},{7,10,964},{7,10,1658},{140,10, -414},{6,10,263},{138,10,757},{132,10,320},{4,0,254},{7,0,1309},{5,11,332},{135, -11,1309},{6,11,261},{8,11,182},{139,11,943},{132,10,225},{6,0,12},{135,0,1219},{ -4,0,275},{12,0,376},{6,11,1721},{141,11,490},{4,11,933},{133,11,880},{6,0,951},{ -6,0,1109},{6,0,1181},{7,0,154},{4,10,405},{7,10,817},{14,10,58},{17,10,37},{146, -10,124},{6,0,1520},{133,10,974},{134,0,1753},{6,0,369},{6,0,502},{7,0,1036},{8,0 -,348},{9,0,452},{10,0,26},{11,0,224},{11,0,387},{11,0,772},{12,0,95},{12,0,629}, -{13,0,195},{13,0,207},{13,0,241},{14,0,260},{14,0,270},{143,0,140},{132,0,269},{ -5,0,480},{7,0,532},{7,0,1197},{7,0,1358},{8,0,291},{11,0,349},{142,0,396},{5,10, -235},{7,10,1239},{11,10,131},{140,10,370},{7,10,956},{7,10,1157},{7,10,1506},{7, -10,1606},{7,10,1615},{7,10,1619},{7,10,1736},{7,10,1775},{8,10,590},{9,10,324},{ -9,10,736},{9,10,774},{9,10,776},{9,10,784},{10,10,567},{10,10,708},{11,10,518},{ -11,10,613},{11,10,695},{11,10,716},{11,10,739},{11,10,770},{11,10,771},{11,10, -848},{11,10,857},{11,10,931},{11,10,947},{12,10,326},{12,10,387},{12,10,484},{12 -,10,528},{12,10,552},{12,10,613},{13,10,189},{13,10,256},{13,10,340},{13,10,432} -,{13,10,436},{13,10,440},{13,10,454},{14,10,174},{14,10,220},{14,10,284},{14,10, -390},{145,10,121},{8,11,598},{9,11,664},{138,11,441},{9,10,137},{138,10,221},{ -133,11,812},{148,0,15},{134,0,1341},{6,0,1017},{4,11,137},{7,11,1178},{135,11, -1520},{7,10,390},{138,10,140},{7,11,1260},{135,11,1790},{137,11,191},{135,10, -1144},{6,0,1810},{7,0,657},{8,0,886},{10,0,857},{14,0,440},{144,0,96},{8,0,533}, -{6,11,1661},{7,11,1975},{7,11,2009},{135,11,2011},{6,0,1453},{134,10,464},{132, -11,715},{5,10,407},{11,10,204},{11,10,243},{11,10,489},{12,10,293},{19,10,37},{ -20,10,73},{150,10,38},{133,11,703},{4,0,211},{7,0,1483},{5,10,325},{8,10,5},{8, -10,227},{9,10,105},{10,10,585},{140,10,614},{4,0,332},{5,0,335},{6,0,238},{7,0, -269},{7,0,811},{7,0,1797},{8,0,836},{9,0,507},{141,0,242},{5,11,89},{7,11,1915}, -{9,11,185},{9,11,235},{9,11,496},{10,11,64},{10,11,270},{10,11,403},{10,11,469}, -{10,11,529},{10,11,590},{11,11,140},{11,11,860},{13,11,1},{13,11,422},{14,11,341 -},{14,11,364},{17,11,93},{18,11,113},{19,11,97},{147,11,113},{133,11,695},{16,0, -19},{5,11,6},{6,11,183},{6,10,621},{7,11,680},{7,11,978},{7,11,1013},{7,11,1055} -,{12,11,230},{13,11,172},{13,10,504},{146,11,29},{136,0,156},{133,0,1009},{6,11, -29},{139,11,63},{134,0,820},{134,10,218},{7,10,454},{7,10,782},{8,10,768},{140, -10,686},{5,0,228},{6,0,203},{7,0,156},{8,0,347},{9,0,265},{18,0,39},{20,0,54},{ -21,0,31},{22,0,3},{23,0,0},{15,11,8},{18,11,39},{20,11,54},{21,11,31},{22,11,3}, -{151,11,0},{7,0,1131},{135,0,1468},{144,10,0},{134,0,1276},{10,10,676},{140,10, -462},{132,11,311},{134,11,1740},{7,11,170},{8,11,90},{8,11,177},{8,11,415},{11, -11,714},{142,11,281},{134,10,164},{6,0,1792},{138,0,849},{150,10,50},{5,0,291},{ -5,0,318},{7,0,765},{9,0,389},{12,0,548},{8,11,522},{142,11,328},{11,11,91},{13, -11,129},{15,11,101},{145,11,125},{4,11,494},{6,11,74},{7,11,44},{7,11,407},{8,11 -,551},{12,11,17},{15,11,5},{148,11,11},{4,11,276},{133,11,296},{6,10,343},{7,10, -195},{7,11,1777},{9,10,226},{10,10,197},{10,10,575},{11,10,502},{139,10,899},{10 -,0,525},{139,0,82},{14,0,453},{4,11,7},{5,11,90},{5,11,158},{6,11,542},{7,11,221 -},{7,11,1574},{9,11,490},{10,11,540},{11,11,443},{139,11,757},{135,0,666},{22,10 -,29},{150,11,29},{4,0,422},{147,10,8},{5,0,355},{145,0,0},{6,0,1873},{9,0,918},{ -7,11,588},{9,11,175},{138,11,530},{143,11,31},{11,0,165},{7,10,1125},{9,10,143}, -{14,10,405},{150,10,21},{9,0,260},{137,0,905},{5,11,872},{6,11,57},{6,11,479},{6 -,11,562},{7,11,471},{7,11,1060},{9,11,447},{9,11,454},{141,11,6},{138,11,704},{ -133,0,865},{5,0,914},{134,0,1625},{133,0,234},{7,0,1383},{5,11,31},{6,11,614},{ -145,11,61},{7,11,1200},{138,11,460},{6,11,424},{135,11,1866},{136,0,306},{5,10, -959},{12,11,30},{13,11,148},{14,11,87},{14,11,182},{16,11,42},{18,11,92},{148,11 -,70},{6,0,1919},{6,0,1921},{9,0,923},{9,0,930},{9,0,941},{9,0,949},{9,0,987},{9, -0,988},{9,0,992},{12,0,802},{12,0,815},{12,0,856},{12,0,885},{12,0,893},{12,0, -898},{12,0,919},{12,0,920},{12,0,941},{12,0,947},{15,0,183},{15,0,185},{15,0,189 -},{15,0,197},{15,0,202},{15,0,233},{18,0,218},{18,0,219},{18,0,233},{143,11,156} -,{135,10,1759},{136,10,173},{13,0,163},{13,0,180},{18,0,78},{20,0,35},{5,11,13}, -{134,11,142},{134,10,266},{6,11,97},{7,11,116},{8,11,322},{8,11,755},{9,11,548}, -{10,11,714},{11,11,884},{141,11,324},{135,0,1312},{9,0,814},{137,11,676},{133,0, -707},{135,0,1493},{6,0,421},{7,0,61},{7,0,1540},{10,0,11},{138,0,501},{12,0,733} -,{12,0,766},{7,11,866},{135,11,1163},{137,0,341},{142,0,98},{145,11,115},{135,11 -,1111},{136,10,300},{136,0,1014},{8,11,1},{9,11,112},{138,11,326},{132,11,730},{ -5,11,488},{6,11,527},{7,11,489},{7,11,1636},{8,11,121},{8,11,144},{8,11,359},{9, -11,193},{9,11,241},{9,11,336},{9,11,882},{11,11,266},{11,11,372},{11,11,944},{12 -,11,401},{140,11,641},{6,0,971},{134,0,1121},{6,0,102},{7,0,72},{15,0,142},{147, -0,67},{151,0,30},{135,0,823},{134,0,1045},{5,10,427},{5,10,734},{7,10,478},{136, -10,52},{7,0,1930},{11,10,217},{142,10,165},{6,0,1512},{135,0,1870},{9,11,31},{10 -,11,244},{10,11,699},{12,11,149},{141,11,497},{133,11,377},{145,11,101},{10,11, -158},{13,11,13},{13,11,137},{13,11,258},{14,11,111},{14,11,225},{14,11,253},{14, -11,304},{14,11,339},{14,11,417},{146,11,33},{6,0,87},{6,10,1734},{7,10,20},{7,10 -,1056},{8,10,732},{9,10,406},{9,10,911},{138,10,694},{134,0,1243},{137,0,245},{7 -,0,68},{8,0,48},{8,0,88},{8,0,582},{8,0,681},{9,0,373},{9,0,864},{11,0,157},{11, -0,336},{11,0,843},{148,0,27},{8,11,663},{144,11,8},{133,10,613},{4,0,88},{5,0, -137},{5,0,174},{5,0,777},{6,0,1664},{6,0,1725},{7,0,77},{7,0,426},{7,0,1317},{7, -0,1355},{8,0,126},{8,0,563},{9,0,523},{9,0,750},{10,0,310},{10,0,836},{11,0,42}, -{11,0,318},{11,0,731},{12,0,68},{12,0,92},{12,0,507},{12,0,692},{13,0,81},{13,0, -238},{13,0,374},{14,0,436},{18,0,138},{19,0,78},{19,0,111},{20,0,55},{20,0,77},{ -148,0,92},{141,0,418},{4,0,938},{137,0,625},{138,0,351},{5,11,843},{7,10,32},{7, -10,984},{8,10,85},{8,10,709},{9,10,579},{9,10,847},{9,10,856},{10,10,799},{11,10 -,258},{11,10,1007},{12,10,331},{12,10,615},{13,10,188},{13,10,435},{14,10,8},{15 -,10,165},{16,10,27},{148,10,40},{6,0,1668},{7,0,1499},{8,0,117},{9,0,314},{138,0 -,174},{135,0,707},{132,11,554},{133,11,536},{5,0,403},{5,11,207},{9,11,79},{11, -11,625},{145,11,7},{132,11,424},{136,11,785},{4,10,167},{135,10,82},{9,0,7},{23, -0,6},{9,11,7},{151,11,6},{6,0,282},{5,10,62},{6,10,534},{7,10,74},{7,10,678},{7, -10,684},{7,10,1043},{7,10,1072},{8,10,280},{8,10,541},{8,10,686},{9,10,258},{10, -10,519},{11,10,252},{140,10,282},{138,10,33},{132,10,359},{4,0,44},{5,0,311},{6, -0,156},{7,0,639},{7,0,762},{7,0,1827},{9,0,8},{9,0,462},{148,0,83},{7,11,769},{9 -,11,18},{138,11,358},{4,0,346},{7,0,115},{9,0,180},{9,0,456},{10,0,363},{4,11, -896},{134,11,1777},{133,10,211},{7,0,761},{7,0,1051},{137,0,545},{6,10,145},{141 -,10,336},{7,11,750},{9,11,223},{11,11,27},{11,11,466},{12,11,624},{14,11,265},{ -146,11,61},{6,0,752},{6,0,768},{6,0,1195},{6,0,1254},{6,0,1619},{137,0,835},{6,0 -,1936},{8,0,930},{136,0,960},{132,10,263},{132,11,249},{12,0,653},{132,10,916},{ -4,11,603},{133,11,661},{8,0,344},{4,11,11},{6,11,128},{7,11,231},{7,11,1533},{ -138,11,725},{134,0,1483},{134,0,875},{6,0,185},{7,0,1899},{9,0,875},{139,0,673}, -{15,10,155},{144,10,79},{7,0,93},{7,0,210},{7,0,1223},{8,0,451},{8,0,460},{11,0, -353},{11,0,475},{4,10,599},{6,10,1634},{7,10,67},{7,10,691},{7,10,979},{7,10, -1697},{8,10,207},{8,10,214},{8,10,231},{8,10,294},{8,10,336},{8,10,428},{8,10, -471},{8,10,622},{8,10,626},{8,10,679},{8,10,759},{8,10,829},{9,10,11},{9,10,246} -,{9,10,484},{9,10,573},{9,10,706},{9,10,762},{9,10,798},{9,10,855},{9,10,870},{9 -,10,912},{10,10,303},{10,10,335},{10,10,424},{10,10,461},{10,10,543},{10,10,759} -,{10,10,814},{11,10,59},{11,10,235},{11,10,590},{11,10,929},{11,10,963},{11,10, -987},{12,10,114},{12,10,182},{12,10,226},{12,10,332},{12,10,439},{12,10,575},{12 -,10,598},{12,10,675},{13,10,8},{13,10,125},{13,10,194},{13,10,287},{14,10,197},{ -14,10,383},{15,10,53},{17,10,63},{19,10,46},{19,10,98},{19,10,106},{148,10,85},{ -132,11,476},{4,0,327},{5,0,478},{7,0,1332},{136,0,753},{5,0,1020},{133,0,1022},{ -135,11,1807},{4,0,103},{133,0,401},{4,0,499},{135,0,1421},{10,0,207},{13,0,164}, -{147,10,126},{9,11,20},{10,11,324},{139,11,488},{132,0,96},{9,11,280},{138,11, -134},{135,0,968},{133,10,187},{135,10,1286},{5,11,112},{6,11,103},{134,11,150},{ -8,0,914},{10,0,3},{4,10,215},{9,10,38},{11,10,23},{11,10,127},{139,10,796},{135, -0,399},{6,0,563},{137,0,224},{6,0,704},{134,0,1214},{4,11,708},{8,11,15},{9,11, -50},{9,11,386},{11,11,18},{11,11,529},{140,11,228},{4,11,563},{7,11,109},{7,11, -592},{7,11,637},{7,11,770},{7,11,1701},{8,11,436},{8,11,463},{9,11,60},{9,11,335 -},{9,11,904},{10,11,73},{11,11,434},{12,11,585},{13,11,331},{18,11,110},{148,11, -60},{134,0,1559},{132,11,502},{6,11,347},{138,11,161},{4,11,33},{5,11,102},{5,11 -,500},{6,11,284},{7,11,1079},{7,11,1423},{7,11,1702},{8,11,470},{9,11,554},{9,11 -,723},{139,11,333},{7,11,246},{135,11,840},{6,11,10},{8,11,571},{9,11,739},{143, -11,91},{8,0,861},{10,0,905},{12,0,730},{12,0,789},{133,11,626},{134,0,946},{5,0, -746},{12,0,333},{14,0,332},{12,11,333},{142,11,332},{5,11,18},{6,11,526},{13,11, -24},{13,11,110},{19,11,5},{147,11,44},{4,0,910},{5,0,832},{135,10,2002},{10,11, -768},{139,11,787},{4,11,309},{5,11,462},{7,11,970},{135,11,1097},{4,10,28},{5,10 -,440},{7,10,248},{11,10,833},{140,10,344},{134,10,1654},{6,0,632},{6,0,652},{6,0 -,1272},{6,0,1384},{134,0,1560},{134,11,1704},{6,0,1393},{133,10,853},{6,10,249}, -{7,10,1234},{139,10,573},{5,11,86},{7,11,743},{9,11,85},{10,11,281},{10,11,432}, -{11,11,490},{12,11,251},{13,11,118},{14,11,378},{146,11,143},{5,11,524},{133,11, -744},{134,0,1514},{10,0,201},{142,0,319},{7,0,717},{10,0,510},{7,10,392},{8,10, -20},{8,10,172},{8,10,690},{9,10,383},{9,10,845},{11,10,293},{11,10,832},{11,10, -920},{11,10,984},{141,10,221},{134,0,1381},{5,10,858},{133,10,992},{8,0,528},{ -137,0,348},{10,11,107},{140,11,436},{4,0,20},{133,0,616},{134,0,1251},{132,11, -927},{10,11,123},{12,11,670},{13,11,371},{14,11,142},{146,11,94},{134,0,1163},{7 -,11,1149},{137,11,156},{134,0,307},{133,11,778},{7,0,1091},{135,0,1765},{5,11, -502},{6,10,268},{137,10,62},{8,11,196},{10,11,283},{139,11,406},{4,0,26},{5,0, -429},{6,0,245},{7,0,704},{7,0,1379},{135,0,1474},{133,11,855},{132,0,881},{4,0, -621},{135,11,1596},{7,11,1400},{9,11,446},{138,11,45},{6,0,736},{138,10,106},{ -133,0,542},{134,0,348},{133,0,868},{136,0,433},{135,0,1495},{138,0,771},{6,10, -613},{136,10,223},{138,0,215},{141,0,124},{136,11,391},{135,11,172},{132,10,670} -,{140,0,55},{9,10,40},{139,10,136},{7,0,62},{147,0,112},{132,0,856},{132,11,568} -,{12,0,270},{139,10,259},{8,0,572},{137,0,698},{4,11,732},{9,10,310},{137,10,682 -},{142,10,296},{134,0,939},{136,11,733},{135,11,1435},{7,10,1401},{135,10,1476}, -{6,0,352},{4,10,296},{7,10,401},{7,10,1410},{7,10,1594},{7,10,1674},{8,10,63},{8 -,10,660},{137,10,74},{4,11,428},{133,11,668},{4,10,139},{4,10,388},{140,10,188}, -{7,11,2015},{140,11,665},{132,0,647},{146,0,10},{138,0,220},{142,0,464},{132,0, -109},{134,0,1746},{6,0,515},{4,10,747},{6,11,1623},{6,11,1681},{7,10,649},{7,10, -1479},{135,10,1583},{133,10,232},{135,0,566},{137,10,887},{4,0,40},{10,0,67},{11 -,0,117},{11,0,768},{139,0,935},{132,0,801},{7,0,992},{8,0,301},{9,0,722},{12,0, -63},{13,0,29},{14,0,161},{143,0,18},{139,0,923},{6,11,1748},{8,11,715},{9,11,802 -},{10,11,46},{10,11,819},{13,11,308},{14,11,351},{14,11,363},{146,11,67},{137,11 -,745},{7,0,1145},{4,10,14},{7,10,1801},{10,10,748},{141,10,458},{4,11,63},{5,11, -347},{134,11,474},{135,0,568},{4,10,425},{7,11,577},{7,11,1432},{9,11,475},{9,11 -,505},{9,11,526},{9,11,609},{9,11,689},{9,11,726},{9,11,735},{9,11,738},{10,11, -556},{10,11,674},{10,11,684},{11,11,89},{11,11,202},{11,11,272},{11,11,380},{11, -11,415},{11,11,505},{11,11,537},{11,11,550},{11,11,562},{11,11,640},{11,11,667}, -{11,11,688},{11,11,847},{11,11,927},{11,11,930},{11,11,940},{12,11,144},{12,11, -325},{12,11,329},{12,11,389},{12,11,403},{12,11,451},{12,11,515},{12,11,604},{12 -,11,616},{12,11,626},{13,11,66},{13,11,131},{13,11,167},{13,11,236},{13,11,368}, -{13,11,411},{13,11,434},{13,11,453},{13,11,461},{13,11,474},{14,11,59},{14,11,60 -},{14,11,139},{14,11,152},{14,11,276},{14,11,353},{14,11,402},{15,11,28},{15,11, -81},{15,11,123},{15,11,152},{18,11,136},{148,11,88},{137,0,247},{135,11,1622},{9 -,11,544},{11,11,413},{144,11,25},{4,0,645},{7,0,825},{6,10,1768},{135,11,89},{ -140,0,328},{5,10,943},{134,10,1779},{134,0,1363},{5,10,245},{6,10,576},{7,10,582 -},{136,10,225},{134,0,1280},{5,11,824},{133,11,941},{7,11,440},{8,11,230},{139, -11,106},{5,0,28},{6,0,204},{10,0,320},{10,0,583},{13,0,502},{14,0,72},{14,0,274} -,{14,0,312},{14,0,344},{15,0,159},{16,0,62},{16,0,69},{17,0,30},{18,0,42},{18,0, -53},{18,0,84},{18,0,140},{19,0,68},{19,0,85},{20,0,5},{20,0,45},{20,0,101},{22,0 -,7},{150,0,20},{4,0,558},{6,0,390},{7,0,162},{7,0,689},{9,0,360},{138,0,653},{ -134,0,764},{6,0,862},{137,0,833},{5,0,856},{6,0,1672},{6,0,1757},{134,0,1781},{5 -,0,92},{10,0,736},{140,0,102},{6,0,1927},{6,0,1944},{8,0,924},{8,0,948},{10,0, -967},{138,0,978},{134,0,1479},{5,0,590},{8,0,360},{9,0,213},{138,0,63},{134,0, -1521},{6,0,709},{134,0,891},{132,10,443},{13,0,477},{14,0,120},{148,0,61},{4,11, -914},{5,11,800},{133,11,852},{10,11,54},{141,11,115},{4,11,918},{133,11,876},{ -139,11,152},{4,11,92},{133,11,274},{135,11,1901},{9,11,800},{10,11,693},{11,11, -482},{11,11,734},{139,11,789},{9,0,483},{132,10,298},{6,0,1213},{141,11,498},{ -135,11,1451},{133,11,743},{4,0,1022},{10,0,1000},{12,0,957},{12,0,980},{12,0, -1013},{14,0,481},{144,0,116},{8,0,503},{17,0,29},{4,11,49},{7,11,280},{135,11, -1633},{135,0,1712},{134,0,466},{136,11,47},{5,10,164},{7,10,121},{142,10,189},{7 -,10,812},{7,10,1261},{7,10,1360},{9,10,632},{140,10,352},{139,10,556},{132,0,731 -},{5,11,272},{5,11,908},{5,11,942},{7,11,1008},{7,11,1560},{8,11,197},{9,11,47}, -{11,11,538},{139,11,742},{4,10,172},{9,10,611},{10,10,436},{12,10,673},{141,10, -255},{133,10,844},{10,0,484},{11,0,754},{12,0,457},{14,0,171},{14,0,389},{146,0, -153},{9,10,263},{10,10,147},{138,10,492},{137,11,891},{138,0,241},{133,10,537},{ -6,0,2005},{136,0,964},{137,10,842},{151,11,8},{4,11,407},{132,11,560},{135,11, -1884},{6,0,1100},{134,0,1242},{135,0,954},{5,10,230},{5,10,392},{6,10,420},{9,10 -,568},{140,10,612},{4,11,475},{11,11,35},{11,11,90},{13,11,7},{13,11,71},{13,11, -177},{142,11,422},{136,11,332},{135,0,1958},{6,0,549},{8,0,34},{8,0,283},{9,0, -165},{138,0,475},{10,0,952},{12,0,966},{140,0,994},{5,0,652},{5,0,701},{135,0, -449},{4,0,655},{7,0,850},{17,0,75},{146,0,137},{4,0,146},{7,0,1618},{8,0,670},{5 -,10,41},{7,10,1459},{7,10,1469},{7,10,1859},{9,10,549},{139,10,905},{133,10,696} -,{6,0,159},{6,0,364},{7,0,516},{137,0,518},{135,0,1439},{6,11,222},{7,11,636},{7 -,11,1620},{8,11,409},{9,11,693},{139,11,77},{13,0,151},{141,11,45},{6,0,1027},{4 -,11,336},{132,10,771},{139,11,392},{10,11,121},{11,11,175},{149,11,16},{8,0,950} -,{138,0,983},{133,10,921},{135,0,993},{6,10,180},{7,10,1137},{8,10,751},{139,10, -805},{7,0,501},{9,0,111},{10,0,141},{11,0,332},{13,0,43},{13,0,429},{14,0,130},{ -14,0,415},{145,0,102},{4,10,183},{5,11,882},{7,10,271},{11,10,824},{11,10,952},{ -13,10,278},{13,10,339},{13,10,482},{14,10,424},{148,10,99},{4,10,19},{5,10,477}, -{5,10,596},{6,10,505},{7,10,1221},{11,10,907},{12,10,209},{141,10,214},{135,10, -1215},{133,0,452},{132,11,426},{5,0,149},{136,0,233},{133,0,935},{6,11,58},{7,11 -,654},{7,11,745},{7,11,1969},{8,11,240},{8,11,675},{9,11,479},{9,11,731},{10,11, -330},{10,11,593},{10,11,817},{11,11,32},{11,11,133},{11,11,221},{145,11,68},{12, -0,582},{18,0,131},{7,11,102},{137,11,538},{136,0,801},{134,10,1645},{132,0,70},{ -6,10,92},{6,10,188},{7,10,1269},{7,10,1524},{7,10,1876},{10,10,228},{139,10,1020 -},{4,10,459},{133,10,966},{138,0,369},{16,0,36},{140,10,330},{141,11,366},{7,0, -721},{10,0,236},{12,0,204},{6,10,18},{7,10,932},{8,10,757},{9,10,54},{9,10,65},{ -9,10,844},{10,10,113},{10,10,315},{10,10,798},{11,10,153},{12,10,151},{12,10,392 -},{12,10,666},{142,10,248},{7,0,241},{10,0,430},{8,10,548},{9,10,532},{10,10,117 -},{11,10,351},{11,10,375},{143,10,23},{134,10,1742},{133,10,965},{133,11,566},{6 -,11,48},{135,11,63},{134,10,182},{10,10,65},{10,10,488},{138,10,497},{6,11,114}, -{7,11,1224},{7,11,1556},{136,11,3},{134,0,1817},{8,11,576},{137,11,267},{6,0, -1078},{144,0,16},{9,10,588},{138,10,260},{138,0,1021},{5,0,406},{134,0,2022},{ -133,11,933},{6,0,69},{135,0,117},{7,0,1830},{136,11,427},{4,0,432},{135,0,824},{ -134,10,1786},{133,0,826},{139,11,67},{133,11,759},{135,10,308},{137,0,816},{133, -0,1000},{4,0,297},{6,0,529},{7,0,152},{7,0,713},{7,0,1845},{8,0,710},{8,0,717},{ -12,0,639},{140,0,685},{7,0,423},{136,10,588},{136,10,287},{136,0,510},{134,0, -1048},{6,0,618},{7,11,56},{7,11,1989},{8,11,337},{8,11,738},{9,11,600},{10,11, -483},{12,11,37},{13,11,447},{142,11,92},{4,0,520},{135,0,575},{8,0,990},{138,0, -977},{135,11,774},{9,11,347},{11,11,24},{140,11,170},{136,11,379},{140,10,290},{ -132,11,328},{4,0,321},{134,0,569},{4,11,101},{135,11,1171},{7,0,723},{7,0,1135}, -{5,11,833},{136,11,744},{7,10,719},{8,10,809},{136,10,834},{8,0,921},{136,10,796 -},{5,10,210},{6,10,213},{7,10,60},{10,10,364},{139,10,135},{5,0,397},{6,0,154},{ -7,0,676},{8,0,443},{8,0,609},{9,0,24},{9,0,325},{10,0,35},{11,0,535},{11,0,672}, -{11,0,1018},{12,0,637},{16,0,30},{5,10,607},{8,10,326},{136,10,490},{4,10,701},{ -5,10,472},{6,11,9},{6,11,397},{7,11,53},{7,11,1742},{9,10,758},{10,11,632},{11, -11,828},{140,11,146},{135,10,380},{135,10,1947},{148,11,109},{10,10,278},{138,11 -,278},{134,0,856},{7,0,139},{4,10,386},{8,10,405},{8,10,728},{9,10,497},{11,10, -110},{11,10,360},{15,10,37},{144,10,84},{141,0,282},{133,0,981},{5,0,288},{7,10, -1452},{7,10,1480},{8,10,634},{140,10,472},{7,0,1890},{8,11,367},{10,11,760},{14, -11,79},{20,11,17},{152,11,0},{4,10,524},{136,10,810},{4,0,56},{7,0,1791},{8,0, -607},{8,0,651},{11,0,465},{11,0,835},{12,0,337},{141,0,480},{10,10,238},{141,10, -33},{11,11,417},{12,11,223},{140,11,265},{9,0,158},{10,0,411},{140,0,261},{133, -10,532},{133,10,997},{12,11,186},{12,11,292},{14,11,100},{146,11,70},{6,0,1403}, -{136,0,617},{134,0,1205},{139,0,563},{4,0,242},{134,0,333},{4,11,186},{5,11,157} -,{8,11,168},{138,11,6},{132,0,369},{133,11,875},{5,10,782},{5,10,829},{134,10, -1738},{134,0,622},{135,11,1272},{6,0,1407},{7,11,111},{136,11,581},{7,10,1823},{ -139,10,693},{7,0,160},{10,0,624},{142,0,279},{132,0,363},{10,11,589},{12,11,111} -,{13,11,260},{14,11,82},{18,11,63},{147,11,45},{7,11,1364},{7,11,1907},{141,11, -158},{4,11,404},{4,11,659},{135,11,675},{13,11,211},{14,11,133},{14,11,204},{15, -11,64},{15,11,69},{15,11,114},{16,11,10},{19,11,23},{19,11,35},{19,11,39},{19,11 -,51},{19,11,71},{19,11,75},{152,11,15},{4,10,78},{5,10,96},{5,10,182},{7,10,1724 -},{7,10,1825},{10,10,394},{10,10,471},{11,10,532},{14,10,340},{145,10,88},{135, -10,1964},{133,11,391},{11,11,887},{14,11,365},{142,11,375},{5,11,540},{6,11,1697 -},{7,11,222},{136,11,341},{134,11,78},{9,0,601},{9,0,619},{10,0,505},{10,0,732}, -{11,0,355},{140,0,139},{134,0,292},{139,0,174},{5,0,177},{6,0,616},{7,0,827},{9, -0,525},{138,0,656},{10,0,31},{6,10,215},{7,10,1028},{7,10,1473},{7,10,1721},{9, -10,424},{138,10,779},{135,10,584},{136,11,293},{134,0,685},{135,11,1868},{133,11 -,460},{7,0,647},{6,10,67},{7,10,1630},{9,10,354},{9,10,675},{10,10,830},{14,10, -80},{145,10,80},{4,0,161},{133,0,631},{6,10,141},{7,10,225},{9,10,59},{9,10,607} -,{10,10,312},{11,10,687},{12,10,555},{13,10,373},{13,10,494},{148,10,58},{7,11, -965},{7,11,1460},{135,11,1604},{136,10,783},{134,11,388},{6,0,722},{6,0,1267},{4 -,11,511},{9,11,333},{9,11,379},{10,11,602},{11,11,441},{11,11,723},{11,11,976},{ -140,11,357},{134,0,1797},{135,0,1684},{9,0,469},{9,0,709},{12,0,512},{14,0,65},{ -17,0,12},{5,11,938},{136,11,707},{7,0,1230},{136,0,531},{10,0,229},{11,0,73},{11 -,0,376},{139,0,433},{12,0,268},{12,0,640},{142,0,119},{7,10,430},{139,10,46},{6, -0,558},{7,0,651},{8,0,421},{9,0,0},{10,0,34},{139,0,1008},{6,0,106},{7,0,1786},{ -7,0,1821},{9,0,102},{9,0,763},{5,10,602},{7,10,2018},{137,10,418},{5,0,65},{6,0, -416},{7,0,1720},{7,0,1924},{10,0,109},{11,0,14},{11,0,70},{11,0,569},{11,0,735}, -{15,0,153},{20,0,80},{136,10,677},{135,11,1625},{137,11,772},{136,0,595},{6,11, -469},{7,11,1709},{138,11,515},{7,0,1832},{138,0,374},{9,0,106},{9,0,163},{9,0, -296},{10,0,167},{10,0,172},{10,0,777},{139,0,16},{6,0,6},{7,0,81},{7,0,771},{7,0 -,1731},{9,0,405},{138,0,421},{4,11,500},{135,11,938},{5,11,68},{134,11,383},{5,0 -,881},{133,0,885},{6,0,854},{6,0,1132},{6,0,1495},{6,0,1526},{6,0,1533},{134,0, -1577},{4,11,337},{6,11,353},{7,11,1934},{8,11,488},{137,11,429},{7,11,236},{7,11 -,1795},{8,11,259},{9,11,135},{9,11,177},{10,11,825},{11,11,115},{11,11,370},{11, -11,405},{11,11,604},{12,11,10},{12,11,667},{12,11,669},{13,11,76},{14,11,310},{ -15,11,76},{15,11,147},{148,11,23},{5,0,142},{134,0,546},{4,11,15},{5,11,22},{6, -11,244},{7,11,40},{7,11,200},{7,11,906},{7,11,1199},{9,11,616},{10,11,716},{11, -11,635},{11,11,801},{140,11,458},{5,0,466},{11,0,571},{12,0,198},{13,0,283},{14, -0,186},{15,0,21},{15,0,103},{135,10,329},{4,0,185},{5,0,257},{5,0,839},{5,0,936} -,{9,0,399},{10,0,258},{10,0,395},{10,0,734},{11,0,1014},{12,0,23},{13,0,350},{14 -,0,150},{19,0,6},{135,11,1735},{12,11,36},{141,11,337},{5,11,598},{7,11,791},{8, -11,108},{137,11,123},{132,10,469},{7,0,404},{7,0,1377},{7,0,1430},{7,0,2017},{8, -0,149},{8,0,239},{8,0,512},{8,0,793},{8,0,818},{9,0,474},{9,0,595},{10,0,122},{ -10,0,565},{10,0,649},{10,0,783},{11,0,239},{11,0,295},{11,0,447},{11,0,528},{11, -0,639},{11,0,800},{12,0,25},{12,0,77},{12,0,157},{12,0,256},{12,0,316},{12,0,390 -},{12,0,391},{12,0,395},{12,0,478},{12,0,503},{12,0,592},{12,0,680},{13,0,50},{ -13,0,53},{13,0,132},{13,0,198},{13,0,322},{13,0,415},{13,0,511},{14,0,71},{14,0, -395},{15,0,71},{15,0,136},{17,0,123},{18,0,93},{147,0,58},{136,0,712},{134,10, -1743},{5,10,929},{6,10,340},{8,10,376},{136,10,807},{6,0,1848},{8,0,860},{10,0, -856},{10,0,859},{10,0,925},{10,0,941},{140,0,762},{6,0,629},{6,0,906},{9,0,810}, -{140,0,652},{5,10,218},{7,10,1610},{138,10,83},{7,10,1512},{135,10,1794},{4,0, -377},{24,0,13},{4,11,155},{7,11,1689},{11,10,0},{144,10,78},{4,11,164},{5,11,151 -},{5,11,730},{5,11,741},{7,11,498},{7,11,870},{7,11,1542},{12,11,213},{14,11,36} -,{14,11,391},{17,11,111},{18,11,6},{18,11,46},{18,11,151},{19,11,36},{20,11,32}, -{20,11,56},{20,11,69},{20,11,102},{21,11,4},{22,11,8},{22,11,10},{22,11,14},{150 -,11,31},{7,0,1842},{133,10,571},{4,10,455},{4,11,624},{135,11,1752},{134,0,1501} -,{4,11,492},{5,11,451},{6,10,161},{7,10,372},{137,10,597},{132,10,349},{4,0,180} -,{135,0,1906},{135,11,835},{141,11,70},{132,0,491},{137,10,751},{6,10,432},{139, -10,322},{4,0,171},{138,0,234},{6,11,113},{135,11,436},{4,0,586},{7,0,1186},{138, -0,631},{5,10,468},{10,10,325},{11,10,856},{12,10,345},{143,10,104},{5,10,223},{ -10,11,592},{10,11,753},{12,11,317},{12,11,355},{12,11,465},{12,11,469},{12,11, -560},{12,11,578},{141,11,243},{132,10,566},{135,11,520},{4,10,59},{135,10,1394}, -{6,10,436},{139,10,481},{9,0,931},{10,0,334},{20,0,71},{4,10,48},{5,10,271},{7, -10,953},{135,11,1878},{11,0,170},{5,10,610},{136,10,457},{133,10,755},{6,0,1587} -,{135,10,1217},{4,10,197},{149,11,26},{133,11,585},{137,11,521},{133,0,765},{133 -,10,217},{139,11,586},{133,0,424},{9,11,752},{12,11,610},{13,11,431},{16,11,59}, -{146,11,109},{136,0,714},{7,0,685},{132,11,307},{9,0,420},{10,0,269},{10,0,285}, -{10,0,576},{11,0,397},{13,0,175},{145,0,90},{132,0,429},{133,11,964},{9,11,463}, -{138,11,595},{7,0,18},{7,0,699},{7,0,1966},{8,0,752},{9,0,273},{9,0,412},{9,0, -703},{10,0,71},{10,0,427},{138,0,508},{4,10,165},{7,10,1398},{135,10,1829},{4,0, -53},{5,0,186},{7,0,752},{7,0,828},{142,0,116},{8,0,575},{10,0,289},{139,0,319},{ -132,0,675},{134,0,1424},{4,11,75},{5,11,180},{6,11,500},{7,11,58},{7,11,710},{ -138,11,645},{133,11,649},{6,11,276},{7,11,282},{7,11,879},{7,11,924},{8,11,459}, -{9,11,599},{9,11,754},{11,11,574},{12,11,128},{12,11,494},{13,11,52},{13,11,301} -,{15,11,30},{143,11,132},{6,0,647},{134,0,1095},{5,10,9},{7,10,297},{7,10,966},{ -140,10,306},{132,11,200},{134,0,1334},{5,10,146},{6,10,411},{138,10,721},{6,0, -209},{6,0,1141},{6,0,1288},{8,0,468},{9,0,210},{11,0,36},{12,0,28},{12,0,630},{ -13,0,21},{13,0,349},{14,0,7},{145,0,13},{6,10,177},{135,10,467},{4,0,342},{135,0 -,1179},{10,11,454},{140,11,324},{4,0,928},{133,0,910},{7,0,1838},{6,11,225},{137 -,11,211},{16,0,101},{20,0,115},{20,0,118},{148,0,122},{4,0,496},{135,0,856},{4,0 -,318},{11,0,654},{7,11,718},{139,11,102},{8,11,58},{9,11,724},{11,11,809},{13,11 -,113},{145,11,72},{5,10,200},{6,11,345},{135,11,1247},{8,11,767},{8,11,803},{9, -11,301},{137,11,903},{7,0,915},{8,0,247},{19,0,0},{7,11,1949},{136,11,674},{4,0, -202},{5,0,382},{6,0,454},{7,0,936},{7,0,1803},{8,0,758},{9,0,375},{9,0,895},{10, -0,743},{10,0,792},{11,0,978},{11,0,1012},{142,0,109},{7,0,1150},{7,0,1425},{7,0, -1453},{140,0,513},{134,11,259},{138,0,791},{11,0,821},{12,0,110},{12,0,153},{18, -0,41},{150,0,19},{134,10,481},{132,0,796},{6,0,445},{9,0,909},{136,11,254},{10,0 -,776},{13,0,345},{142,0,425},{4,10,84},{7,10,1482},{10,10,76},{138,10,142},{135, -11,742},{6,0,578},{133,10,1015},{6,0,1387},{4,10,315},{5,10,507},{135,10,1370},{ -4,0,438},{133,0,555},{136,0,766},{133,11,248},{134,10,1722},{4,11,116},{5,11,95} -,{5,11,445},{7,11,1688},{8,11,29},{9,11,272},{11,11,509},{139,11,915},{135,0,541 -},{133,11,543},{8,10,222},{8,10,476},{9,10,238},{11,10,516},{11,10,575},{15,10, -109},{146,10,100},{6,0,880},{134,0,1191},{5,11,181},{136,11,41},{134,0,1506},{ -132,11,681},{7,11,25},{8,11,202},{138,11,536},{139,0,983},{137,0,768},{132,0,584 -},{9,11,423},{140,11,89},{8,11,113},{9,11,877},{10,11,554},{11,11,83},{12,11,136 -},{147,11,109},{7,10,706},{7,10,1058},{138,10,538},{133,11,976},{4,11,206},{135, -11,746},{136,11,526},{140,0,737},{11,10,92},{11,10,196},{11,10,409},{11,10,450}, -{11,10,666},{11,10,777},{12,10,262},{13,10,385},{13,10,393},{15,10,115},{16,10, -45},{145,10,82},{4,0,226},{4,0,326},{7,0,1770},{4,11,319},{5,11,699},{138,11,673 -},{6,10,40},{135,10,1781},{5,0,426},{8,0,30},{9,0,2},{11,0,549},{147,0,122},{6,0 -,1161},{134,0,1329},{138,10,97},{6,10,423},{7,10,665},{135,10,1210},{7,11,13},{8 -,11,226},{10,11,537},{11,11,570},{11,11,605},{11,11,799},{11,11,804},{12,11,85}, -{12,11,516},{12,11,623},{13,11,112},{13,11,361},{14,11,77},{14,11,78},{17,11,28} -,{147,11,110},{132,11,769},{132,11,551},{132,11,728},{147,0,117},{9,11,57},{9,11 -,459},{10,11,425},{11,11,119},{12,11,184},{12,11,371},{13,11,358},{145,11,51},{5 -,11,188},{5,11,814},{8,11,10},{9,11,421},{9,11,729},{10,11,609},{139,11,689},{ -134,11,624},{135,11,298},{135,0,462},{4,0,345},{139,10,624},{136,10,574},{4,0, -385},{7,0,265},{135,0,587},{6,0,808},{132,11,528},{133,0,398},{132,10,354},{4,0, -347},{5,0,423},{5,0,996},{135,0,1329},{135,10,1558},{7,0,1259},{9,0,125},{139,0, -65},{5,0,136},{6,0,136},{136,0,644},{5,11,104},{6,11,173},{135,11,1631},{135,0, -469},{133,10,830},{4,0,278},{5,0,465},{135,0,1367},{7,11,810},{8,11,138},{8,11, -342},{9,11,84},{10,11,193},{11,11,883},{140,11,359},{5,10,496},{135,10,203},{4,0 -,433},{133,0,719},{6,11,95},{134,10,547},{5,10,88},{137,10,239},{6,11,406},{10, -11,409},{10,11,447},{11,11,44},{140,11,100},{134,0,1423},{7,10,650},{135,10,1310 -},{134,0,749},{135,11,1243},{135,0,1363},{6,0,381},{7,0,645},{7,0,694},{8,0,546} -,{7,10,1076},{9,10,80},{11,10,78},{11,10,421},{11,10,534},{140,10,545},{134,11, -1636},{135,11,1344},{12,0,277},{7,10,274},{11,10,479},{139,10,507},{6,0,705},{6, -0,783},{6,0,1275},{6,0,1481},{4,11,282},{7,11,1034},{11,11,398},{11,11,634},{12, -11,1},{12,11,79},{12,11,544},{14,11,237},{17,11,10},{146,11,20},{134,0,453},{4,0 -,555},{8,0,536},{10,0,288},{11,0,1005},{4,10,497},{135,10,1584},{5,11,118},{5,11 -,499},{6,11,476},{7,11,600},{7,11,888},{135,11,1096},{138,0,987},{7,0,1107},{7, -10,261},{7,10,1115},{7,10,1354},{7,10,1588},{7,10,1705},{7,10,1902},{9,10,465},{ -10,10,248},{10,10,349},{10,10,647},{11,10,527},{11,10,660},{11,10,669},{12,10, -529},{141,10,305},{7,11,296},{7,11,596},{8,11,560},{8,11,586},{9,11,612},{11,11, -100},{11,11,304},{12,11,46},{13,11,89},{14,11,112},{145,11,122},{9,0,370},{138,0 -,90},{136,10,13},{132,0,860},{7,10,642},{8,10,250},{11,10,123},{11,10,137},{13, -10,48},{142,10,95},{135,10,1429},{137,11,321},{132,0,257},{135,0,2031},{7,0,1768 -},{7,11,1599},{7,11,1723},{8,11,79},{8,11,106},{8,11,190},{8,11,302},{8,11,383}, -{9,11,119},{9,11,233},{9,11,298},{9,11,419},{9,11,471},{10,11,181},{10,11,406},{ -11,11,57},{11,11,85},{11,11,120},{11,11,177},{11,11,296},{11,11,382},{11,11,454} -,{11,11,758},{11,11,999},{12,11,27},{12,11,98},{12,11,131},{12,11,245},{12,11, -312},{12,11,446},{12,11,454},{13,11,25},{13,11,98},{13,11,426},{13,11,508},{14, -11,6},{14,11,163},{14,11,272},{14,11,277},{14,11,370},{15,11,95},{15,11,138},{15 -,11,167},{17,11,18},{17,11,38},{20,11,96},{149,11,32},{5,11,722},{134,11,1759},{ -145,11,16},{6,0,1071},{134,0,1561},{10,10,545},{140,10,301},{6,0,83},{6,0,1733}, -{135,0,1389},{4,0,835},{135,0,1818},{133,11,258},{4,10,904},{133,10,794},{134,0, -2006},{5,11,30},{7,11,495},{8,11,134},{9,11,788},{140,11,438},{135,11,2004},{137 -,0,696},{5,11,50},{6,11,439},{7,11,780},{135,11,1040},{7,11,772},{7,11,1104},{7, -11,1647},{11,11,269},{11,11,539},{11,11,607},{11,11,627},{11,11,706},{11,11,975} -,{12,11,248},{12,11,311},{12,11,434},{12,11,600},{12,11,622},{13,11,297},{13,11, -367},{13,11,485},{14,11,69},{14,11,409},{143,11,108},{5,11,1},{6,11,81},{138,11, -520},{7,0,1718},{9,0,95},{9,0,274},{10,0,279},{10,0,317},{10,0,420},{11,0,303},{ -11,0,808},{12,0,134},{12,0,367},{13,0,149},{13,0,347},{14,0,349},{14,0,406},{18, -0,22},{18,0,89},{18,0,122},{147,0,47},{5,11,482},{8,11,98},{9,11,172},{10,11,222 -},{10,11,700},{10,11,822},{11,11,302},{11,11,778},{12,11,50},{12,11,127},{12,11, -396},{13,11,62},{13,11,328},{14,11,122},{147,11,72},{7,10,386},{138,10,713},{6, -10,7},{6,10,35},{7,10,147},{7,10,1069},{7,10,1568},{7,10,1575},{7,10,1917},{8,10 -,43},{8,10,208},{9,10,128},{9,10,866},{10,10,20},{11,10,981},{147,10,33},{133,0, -26},{132,0,550},{5,11,2},{7,11,1494},{136,11,589},{6,11,512},{7,11,797},{8,11, -253},{9,11,77},{10,11,1},{10,11,129},{10,11,225},{11,11,118},{11,11,226},{11,11, -251},{11,11,430},{11,11,701},{11,11,974},{11,11,982},{12,11,64},{12,11,260},{12, -11,488},{140,11,690},{7,10,893},{141,10,424},{134,0,901},{136,0,822},{4,0,902},{ -5,0,809},{134,0,122},{6,0,807},{134,0,1366},{7,0,262},{5,11,748},{134,11,553},{ -133,0,620},{4,0,34},{5,0,574},{7,0,279},{7,0,1624},{136,0,601},{9,0,170},{6,10, -322},{9,10,552},{11,10,274},{13,10,209},{13,10,499},{14,10,85},{15,10,126},{145, -10,70},{132,0,537},{4,11,12},{7,11,420},{7,11,522},{7,11,809},{8,11,797},{141,11 -,88},{133,0,332},{8,10,83},{8,10,742},{8,10,817},{9,10,28},{9,10,29},{9,10,885}, -{10,10,387},{11,10,633},{11,10,740},{13,10,235},{13,10,254},{15,10,143},{143,10, -146},{6,0,1909},{9,0,964},{12,0,822},{12,0,854},{12,0,865},{12,0,910},{12,0,938} -,{15,0,169},{15,0,208},{15,0,211},{18,0,205},{18,0,206},{18,0,220},{18,0,223},{ -152,0,24},{140,10,49},{5,11,528},{135,11,1580},{6,0,261},{8,0,182},{139,0,943},{ -134,0,1721},{4,0,933},{133,0,880},{136,11,321},{5,11,266},{9,11,290},{9,11,364}, -{10,11,293},{11,11,606},{142,11,45},{6,0,1609},{4,11,50},{6,11,510},{6,11,594},{ -9,11,121},{10,11,49},{10,11,412},{139,11,834},{7,0,895},{136,11,748},{132,11,466 -},{4,10,110},{10,10,415},{10,10,597},{142,10,206},{133,0,812},{135,11,281},{6,0, -1890},{6,0,1902},{6,0,1916},{9,0,929},{9,0,942},{9,0,975},{9,0,984},{9,0,986},{9 -,0,1011},{9,0,1019},{12,0,804},{12,0,851},{12,0,867},{12,0,916},{12,0,923},{15,0 -,194},{15,0,204},{15,0,210},{15,0,222},{15,0,223},{15,0,229},{15,0,250},{18,0, -179},{18,0,186},{18,0,192},{7,10,205},{135,10,2000},{132,11,667},{135,0,778},{4, -0,137},{7,0,1178},{135,0,1520},{134,0,1314},{4,11,242},{134,11,333},{6,0,1661},{ -7,0,1975},{7,0,2009},{135,0,2011},{134,0,1591},{4,10,283},{135,10,1194},{11,0, -820},{150,0,51},{4,11,39},{5,11,36},{7,11,1843},{8,11,407},{11,11,144},{140,11, -523},{134,10,1720},{4,11,510},{7,11,29},{7,11,66},{7,11,1980},{10,11,487},{10,11 -,809},{146,11,9},{5,0,89},{7,0,1915},{9,0,185},{9,0,235},{10,0,64},{10,0,270},{ -10,0,403},{10,0,469},{10,0,529},{10,0,590},{11,0,140},{11,0,860},{13,0,1},{13,0, -422},{14,0,341},{14,0,364},{17,0,93},{18,0,113},{19,0,97},{147,0,113},{133,0,695 -},{6,0,987},{134,0,1160},{5,0,6},{6,0,183},{7,0,680},{7,0,978},{7,0,1013},{7,0, -1055},{12,0,230},{13,0,172},{146,0,29},{134,11,570},{132,11,787},{134,11,518},{6 -,0,29},{139,0,63},{132,11,516},{136,11,821},{132,0,311},{134,0,1740},{7,0,170},{ -8,0,90},{8,0,177},{8,0,415},{11,0,714},{14,0,281},{136,10,735},{134,0,1961},{135 -,11,1405},{4,11,10},{7,11,917},{139,11,786},{5,10,132},{9,10,486},{9,10,715},{10 -,10,458},{11,10,373},{11,10,668},{11,10,795},{11,10,897},{12,10,272},{12,10,424} -,{12,10,539},{12,10,558},{14,10,245},{14,10,263},{14,10,264},{14,10,393},{142,10 -,403},{11,0,91},{13,0,129},{15,0,101},{145,0,125},{135,0,1132},{4,0,494},{6,0,74 -},{7,0,44},{7,0,407},{12,0,17},{15,0,5},{148,0,11},{133,10,379},{5,0,270},{5,11, -684},{6,10,89},{6,10,400},{7,10,1569},{7,10,1623},{7,10,1850},{8,10,218},{8,10, -422},{9,10,570},{138,10,626},{4,0,276},{133,0,296},{6,0,1523},{134,11,27},{6,10, -387},{7,10,882},{141,10,111},{6,10,224},{7,10,877},{137,10,647},{135,10,790},{4, -0,7},{5,0,90},{5,0,158},{6,0,542},{7,0,221},{7,0,1574},{9,0,490},{10,0,540},{11, -0,443},{139,0,757},{7,0,588},{9,0,175},{138,0,530},{135,10,394},{142,11,23},{134 -,0,786},{135,0,580},{7,0,88},{136,0,627},{5,0,872},{6,0,57},{7,0,471},{9,0,447}, -{137,0,454},{6,11,342},{6,11,496},{8,11,275},{137,11,206},{4,11,909},{133,11,940 -},{6,0,735},{132,11,891},{8,0,845},{8,0,916},{135,10,1409},{5,0,31},{134,0,614}, -{11,0,458},{12,0,15},{140,0,432},{8,0,330},{140,0,477},{4,0,530},{5,0,521},{7,0, -1200},{10,0,460},{132,11,687},{6,0,424},{135,0,1866},{9,0,569},{12,0,12},{12,0, -81},{12,0,319},{13,0,69},{14,0,259},{16,0,87},{17,0,1},{17,0,21},{17,0,24},{18,0 -,15},{18,0,56},{18,0,59},{18,0,127},{18,0,154},{19,0,19},{148,0,31},{7,0,1302},{ -136,10,38},{134,11,253},{5,10,261},{7,10,78},{7,10,199},{8,10,815},{9,10,126},{ -138,10,342},{5,0,595},{135,0,1863},{6,11,41},{141,11,160},{5,0,13},{134,0,142},{ -6,0,97},{7,0,116},{8,0,322},{8,0,755},{9,0,548},{10,0,714},{11,0,884},{13,0,324} -,{7,11,1304},{138,11,477},{132,10,628},{134,11,1718},{7,10,266},{136,10,804},{ -135,10,208},{7,0,1021},{6,10,79},{135,10,1519},{7,0,1472},{135,0,1554},{6,11,362 -},{146,11,51},{7,0,1071},{7,0,1541},{7,0,1767},{7,0,1806},{11,0,162},{11,0,242}, -{11,0,452},{12,0,605},{15,0,26},{144,0,44},{136,10,741},{133,11,115},{145,0,115} -,{134,10,376},{6,0,1406},{134,0,1543},{5,11,193},{12,11,178},{13,11,130},{145,11 -,84},{135,0,1111},{8,0,1},{9,0,650},{10,0,326},{5,11,705},{137,11,606},{5,0,488} -,{6,0,527},{7,0,489},{7,0,1636},{8,0,121},{8,0,144},{8,0,359},{9,0,193},{9,0,241 -},{9,0,336},{9,0,882},{11,0,266},{11,0,372},{11,0,944},{12,0,401},{140,0,641},{ -135,11,174},{6,0,267},{7,10,244},{7,10,632},{7,10,1609},{8,10,178},{8,10,638},{ -141,10,58},{134,0,1983},{134,0,1155},{134,0,1575},{134,0,1438},{9,0,31},{10,0, -244},{10,0,699},{12,0,149},{141,0,497},{133,0,377},{4,11,122},{5,11,796},{5,11, -952},{6,11,1660},{6,11,1671},{8,11,567},{9,11,687},{9,11,742},{10,11,686},{11,11 -,356},{11,11,682},{140,11,281},{145,0,101},{11,11,0},{144,11,78},{5,11,179},{5, -10,791},{7,11,1095},{135,11,1213},{8,11,372},{9,11,122},{138,11,175},{7,10,686}, -{8,10,33},{8,10,238},{10,10,616},{11,10,467},{11,10,881},{13,10,217},{13,10,253} -,{142,10,268},{9,0,476},{4,11,66},{7,11,722},{135,11,904},{7,11,352},{137,11,684 -},{135,0,2023},{135,0,1836},{132,10,447},{5,0,843},{144,0,35},{137,11,779},{141, -11,35},{4,10,128},{5,10,415},{6,10,462},{7,10,294},{7,10,578},{10,10,710},{139, -10,86},{132,0,554},{133,0,536},{136,10,587},{5,0,207},{9,0,79},{11,0,625},{145,0 -,7},{7,0,1371},{6,10,427},{138,10,692},{4,0,424},{4,10,195},{135,10,802},{8,0, -785},{133,11,564},{135,0,336},{4,0,896},{6,0,1777},{134,11,556},{137,11,103},{ -134,10,1683},{7,11,544},{8,11,719},{138,11,61},{138,10,472},{4,11,5},{5,11,498}, -{136,11,637},{7,0,750},{9,0,223},{11,0,27},{11,0,466},{12,0,624},{14,0,265},{146 -,0,61},{12,0,238},{18,0,155},{12,11,238},{146,11,155},{151,10,28},{133,11,927},{ -12,0,383},{5,10,3},{8,10,578},{9,10,118},{10,10,705},{141,10,279},{4,11,893},{5, -11,780},{133,11,893},{4,0,603},{133,0,661},{4,0,11},{6,0,128},{7,0,231},{7,0, -1533},{10,0,725},{5,10,229},{5,11,238},{135,11,1350},{8,10,102},{10,10,578},{10, -10,672},{12,10,496},{13,10,408},{14,10,121},{145,10,106},{132,0,476},{134,0,1552 -},{134,11,1729},{8,10,115},{8,10,350},{9,10,489},{10,10,128},{11,10,306},{12,10, -373},{14,10,30},{17,10,79},{19,10,80},{150,10,55},{135,0,1807},{4,0,680},{4,11, -60},{7,11,760},{7,11,1800},{8,11,314},{9,11,700},{139,11,487},{4,10,230},{5,10, -702},{148,11,94},{132,11,228},{139,0,435},{9,0,20},{10,0,324},{10,0,807},{139,0, -488},{6,10,1728},{136,11,419},{4,10,484},{18,10,26},{19,10,42},{20,10,43},{21,10 -,0},{23,10,27},{152,10,14},{135,0,1431},{133,11,828},{5,0,112},{6,0,103},{6,0, -150},{7,0,1303},{9,0,292},{10,0,481},{20,0,13},{7,11,176},{7,11,178},{7,11,1110} -,{10,11,481},{148,11,13},{138,0,356},{4,11,51},{5,11,39},{6,11,4},{7,11,591},{7, -11,849},{7,11,951},{7,11,1129},{7,11,1613},{7,11,1760},{7,11,1988},{9,11,434},{ -10,11,754},{11,11,25},{11,11,37},{139,11,414},{6,0,1963},{134,0,2000},{132,10, -633},{6,0,1244},{133,11,902},{135,11,928},{140,0,18},{138,0,204},{135,11,1173},{ -134,0,867},{4,0,708},{8,0,15},{9,0,50},{9,0,386},{11,0,18},{11,0,529},{140,0,228 -},{134,11,270},{4,0,563},{7,0,109},{7,0,592},{7,0,637},{7,0,770},{8,0,463},{9,0, -60},{9,0,335},{9,0,904},{10,0,73},{11,0,434},{12,0,585},{13,0,331},{18,0,110},{ -148,0,60},{132,0,502},{14,11,359},{19,11,52},{148,11,47},{6,11,377},{7,11,1025}, -{9,11,613},{145,11,104},{6,0,347},{10,0,161},{5,10,70},{5,10,622},{6,10,334},{7, -10,1032},{9,10,171},{11,10,26},{11,10,213},{11,10,637},{11,10,707},{12,10,202},{ -12,10,380},{13,10,226},{13,10,355},{14,10,222},{145,10,42},{132,11,416},{4,0,33} -,{5,0,102},{6,0,284},{7,0,1079},{7,0,1423},{7,0,1702},{8,0,470},{9,0,554},{9,0, -723},{11,0,333},{142,11,372},{5,11,152},{5,11,197},{7,11,340},{7,11,867},{10,11, -548},{10,11,581},{11,11,6},{12,11,3},{12,11,19},{14,11,110},{142,11,289},{7,0, -246},{135,0,840},{6,0,10},{8,0,571},{9,0,739},{143,0,91},{6,0,465},{7,0,1465},{4 -,10,23},{4,10,141},{5,10,313},{5,10,1014},{6,10,50},{7,10,142},{7,10,559},{8,10, -640},{9,10,460},{9,10,783},{11,10,741},{12,10,183},{141,10,488},{133,0,626},{136 -,0,614},{138,0,237},{7,11,34},{7,11,190},{8,11,28},{8,11,141},{8,11,444},{8,11, -811},{9,11,468},{11,11,334},{12,11,24},{12,11,386},{140,11,576},{133,11,757},{5, -0,18},{6,0,526},{13,0,24},{13,0,110},{19,0,5},{147,0,44},{6,0,506},{134,11,506}, -{135,11,1553},{4,0,309},{5,0,462},{7,0,970},{7,0,1097},{22,0,30},{22,0,33},{7,11 -,1385},{11,11,582},{11,11,650},{11,11,901},{11,11,949},{12,11,232},{12,11,236},{ -13,11,413},{13,11,501},{146,11,116},{9,0,140},{5,10,222},{138,10,534},{6,0,1056} -,{137,10,906},{134,0,1704},{138,10,503},{134,0,1036},{5,10,154},{7,10,1491},{10, -10,379},{138,10,485},{4,11,383},{133,10,716},{134,0,1315},{5,0,86},{7,0,743},{9, -0,85},{10,0,281},{10,0,432},{11,0,825},{12,0,251},{13,0,118},{142,0,378},{8,0, -264},{4,10,91},{5,10,388},{5,10,845},{6,10,206},{6,10,252},{6,10,365},{7,10,136} -,{7,10,531},{136,10,621},{5,0,524},{133,0,744},{5,11,277},{141,11,247},{132,11, -435},{10,0,107},{140,0,436},{132,0,927},{10,0,123},{12,0,670},{146,0,94},{7,0, -1149},{9,0,156},{138,0,957},{5,11,265},{6,11,212},{135,11,28},{133,0,778},{133,0 -,502},{8,0,196},{10,0,283},{139,0,406},{135,10,576},{136,11,535},{134,0,1312},{5 -,10,771},{5,10,863},{5,10,898},{6,10,1632},{6,10,1644},{134,10,1780},{5,0,855},{ -5,10,331},{135,11,1487},{132,11,702},{5,11,808},{135,11,2045},{7,0,1400},{9,0, -446},{138,0,45},{140,10,632},{132,0,1003},{5,11,166},{8,11,739},{140,11,511},{5, -10,107},{7,10,201},{136,10,518},{6,10,446},{135,10,1817},{134,0,1532},{134,0, -1097},{4,11,119},{5,11,170},{5,11,447},{7,11,1708},{7,11,1889},{9,11,357},{9,11, -719},{12,11,486},{140,11,596},{9,10,851},{141,10,510},{7,0,612},{8,0,545},{8,0, -568},{8,0,642},{9,0,717},{10,0,541},{10,0,763},{11,0,449},{12,0,489},{13,0,153}, -{13,0,296},{14,0,138},{14,0,392},{15,0,50},{16,0,6},{16,0,12},{20,0,9},{132,10, -504},{4,11,450},{135,11,1158},{11,0,54},{13,0,173},{13,0,294},{5,10,883},{5,10, -975},{8,10,392},{148,10,7},{13,0,455},{15,0,99},{15,0,129},{144,0,68},{135,0,172 -},{132,11,754},{5,10,922},{134,10,1707},{134,0,1029},{17,11,39},{148,11,36},{4,0 -,568},{5,10,993},{7,10,515},{137,10,91},{132,0,732},{10,0,617},{138,11,617},{134 -,0,974},{7,0,989},{10,0,377},{12,0,363},{13,0,68},{13,0,94},{14,0,108},{142,0, -306},{136,0,733},{132,0,428},{7,0,1789},{135,11,1062},{7,0,2015},{140,0,665},{ -135,10,1433},{5,0,287},{7,10,921},{8,10,580},{8,10,593},{8,10,630},{138,10,28},{ -138,0,806},{4,10,911},{5,10,867},{5,10,1013},{7,10,2034},{8,10,798},{136,10,813} -,{134,0,1539},{8,11,523},{150,11,34},{135,11,740},{7,11,238},{7,11,2033},{8,11, -120},{8,11,188},{8,11,659},{9,11,598},{10,11,466},{12,11,342},{12,11,588},{13,11 -,503},{14,11,246},{143,11,92},{7,0,1563},{141,0,182},{5,10,135},{6,10,519},{7,10 -,1722},{10,10,271},{11,10,261},{145,10,54},{14,10,338},{148,10,81},{7,0,484},{4, -10,300},{133,10,436},{145,11,114},{6,0,1623},{134,0,1681},{133,11,640},{4,11,201 -},{7,11,1744},{8,11,602},{11,11,247},{11,11,826},{145,11,65},{8,11,164},{146,11, -62},{6,0,1833},{6,0,1861},{136,0,878},{134,0,1569},{8,10,357},{10,10,745},{14,10 -,426},{17,10,94},{147,10,57},{12,0,93},{12,0,501},{13,0,362},{14,0,151},{15,0,40 -},{15,0,59},{16,0,46},{17,0,25},{18,0,14},{18,0,134},{19,0,25},{19,0,69},{20,0, -16},{20,0,19},{20,0,66},{21,0,23},{21,0,25},{150,0,42},{6,0,1748},{8,0,715},{9,0 -,802},{10,0,46},{10,0,819},{13,0,308},{14,0,351},{14,0,363},{146,0,67},{132,0, -994},{4,0,63},{133,0,347},{132,0,591},{133,0,749},{7,11,1577},{10,11,304},{10,11 -,549},{11,11,424},{12,11,365},{13,11,220},{13,11,240},{142,11,33},{133,0,366},{7 -,0,557},{12,0,547},{14,0,86},{133,10,387},{135,0,1747},{132,11,907},{5,11,100},{ -10,11,329},{12,11,416},{149,11,29},{4,10,6},{5,10,708},{136,10,75},{7,10,1351},{ -9,10,581},{10,10,639},{11,10,453},{140,10,584},{7,0,89},{132,10,303},{138,10,772 -},{132,11,176},{5,11,636},{5,11,998},{8,11,26},{137,11,358},{7,11,9},{7,11,1508} -,{9,11,317},{10,11,210},{10,11,292},{10,11,533},{11,11,555},{12,11,526},{12,11, -607},{13,11,263},{13,11,459},{142,11,271},{134,0,1463},{6,0,772},{6,0,1137},{139 -,11,595},{7,0,977},{139,11,66},{138,0,893},{20,0,48},{148,11,48},{5,0,824},{133, -0,941},{134,11,295},{7,0,1543},{7,0,1785},{10,0,690},{4,10,106},{139,10,717},{7, -0,440},{8,0,230},{139,0,106},{5,10,890},{133,10,988},{6,10,626},{142,10,431},{10 -,11,127},{141,11,27},{17,0,32},{10,10,706},{150,10,44},{132,0,216},{137,0,332},{ -4,10,698},{136,11,119},{139,11,267},{138,10,17},{11,11,526},{11,11,939},{141,11, -290},{7,11,1167},{11,11,934},{13,11,391},{145,11,76},{139,11,39},{134,10,84},{4, -0,914},{5,0,800},{133,0,852},{10,0,416},{141,0,115},{7,0,564},{142,0,168},{4,0, -918},{133,0,876},{134,0,1764},{152,0,3},{4,0,92},{5,0,274},{7,11,126},{136,11,84 -},{140,10,498},{136,11,790},{8,0,501},{5,10,986},{6,10,130},{7,10,1582},{8,10, -458},{10,10,101},{10,10,318},{138,10,823},{6,11,64},{12,11,377},{141,11,309},{5, -0,743},{138,0,851},{4,0,49},{7,0,280},{135,0,1633},{134,0,879},{136,0,47},{7,10, -1644},{137,10,129},{132,0,865},{134,0,1202},{9,11,34},{139,11,484},{135,10,997}, -{5,0,272},{5,0,908},{5,0,942},{8,0,197},{9,0,47},{11,0,538},{139,0,742},{6,11, -1700},{7,11,26},{7,11,293},{7,11,382},{7,11,1026},{7,11,1087},{7,11,2027},{8,11, -24},{8,11,114},{8,11,252},{8,11,727},{8,11,729},{9,11,30},{9,11,199},{9,11,231}, -{9,11,251},{9,11,334},{9,11,361},{9,11,488},{9,11,712},{10,11,55},{10,11,60},{10 -,11,232},{10,11,332},{10,11,384},{10,11,396},{10,11,504},{10,11,542},{10,11,652} -,{11,11,20},{11,11,48},{11,11,207},{11,11,291},{11,11,298},{11,11,342},{11,11, -365},{11,11,394},{11,11,620},{11,11,705},{11,11,1017},{12,11,123},{12,11,340},{ -12,11,406},{12,11,643},{13,11,61},{13,11,269},{13,11,311},{13,11,319},{13,11,486 -},{14,11,234},{15,11,62},{15,11,85},{16,11,71},{18,11,119},{148,11,105},{6,0, -1455},{150,11,37},{135,10,1927},{135,0,1911},{137,0,891},{7,10,1756},{137,10,98} -,{7,10,1046},{139,10,160},{132,0,761},{6,11,379},{7,11,270},{7,11,1116},{8,11, -176},{8,11,183},{9,11,432},{9,11,661},{12,11,247},{12,11,617},{146,11,125},{6,10 -,45},{7,10,433},{8,10,129},{9,10,21},{10,10,392},{11,10,79},{12,10,499},{13,10, -199},{141,10,451},{4,0,407},{5,11,792},{133,11,900},{132,0,560},{135,0,183},{13, -0,490},{7,10,558},{136,10,353},{4,0,475},{6,0,731},{11,0,35},{13,0,71},{13,0,177 -},{14,0,422},{133,10,785},{8,10,81},{9,10,189},{9,10,201},{11,10,478},{11,10,712 -},{141,10,338},{4,0,418},{4,0,819},{133,10,353},{151,10,26},{4,11,901},{133,11, -776},{132,0,575},{7,0,818},{16,0,92},{17,0,14},{17,0,45},{18,0,75},{148,0,18},{6 -,0,222},{7,0,636},{7,0,1620},{8,0,409},{9,0,693},{139,0,77},{6,10,25},{7,10,855} -,{7,10,1258},{144,10,32},{6,0,1880},{6,0,1887},{6,0,1918},{6,0,1924},{9,0,967},{ -9,0,995},{9,0,1015},{12,0,826},{12,0,849},{12,0,857},{12,0,860},{12,0,886},{12,0 -,932},{18,0,228},{18,0,231},{146,0,240},{134,0,633},{134,0,1308},{4,11,37},{5,11 -,334},{135,11,1253},{10,0,86},{4,10,4},{7,10,1118},{7,10,1320},{7,10,1706},{8,10 -,277},{9,10,622},{11,10,724},{12,10,350},{12,10,397},{13,10,28},{13,10,159},{15, -10,89},{18,10,5},{19,10,9},{20,10,34},{150,10,47},{132,11,508},{137,11,448},{12, -11,107},{146,11,31},{132,0,817},{134,0,663},{133,0,882},{134,0,914},{132,11,540} -,{132,11,533},{136,11,608},{8,0,885},{138,0,865},{132,0,426},{6,0,58},{7,0,745}, -{7,0,1969},{8,0,399},{8,0,675},{9,0,479},{9,0,731},{10,0,330},{10,0,593},{10,0, -817},{11,0,32},{11,0,133},{11,0,221},{145,0,68},{134,10,255},{7,0,102},{137,0, -538},{137,10,216},{7,11,253},{136,11,549},{135,11,912},{9,10,183},{139,10,286},{ -11,10,956},{151,10,3},{8,11,527},{18,11,60},{147,11,24},{4,10,536},{7,10,1141},{ -10,10,723},{139,10,371},{133,11,920},{7,0,876},{135,10,285},{135,10,560},{132,10 -,690},{142,11,126},{11,10,33},{12,10,571},{149,10,1},{133,0,566},{9,0,139},{10,0 -,399},{11,0,469},{12,0,634},{13,0,223},{132,11,483},{6,0,48},{135,0,63},{18,0,12 -},{7,10,1862},{12,10,491},{12,10,520},{13,10,383},{142,10,244},{135,11,1665},{ -132,11,448},{9,11,495},{146,11,104},{6,0,114},{7,0,1224},{7,0,1556},{136,0,3},{4 -,10,190},{133,10,554},{8,0,576},{9,0,267},{133,10,1001},{133,10,446},{133,0,933} -,{139,11,1009},{8,11,653},{13,11,93},{147,11,14},{6,0,692},{6,0,821},{134,0,1077 -},{5,11,172},{135,11,801},{138,0,752},{4,0,375},{134,0,638},{134,0,1011},{140,11 -,540},{9,0,96},{133,11,260},{139,11,587},{135,10,1231},{12,0,30},{13,0,148},{14, -0,87},{14,0,182},{16,0,42},{20,0,70},{132,10,304},{6,0,1398},{7,0,56},{7,0,1989} -,{8,0,337},{8,0,738},{9,0,600},{12,0,37},{13,0,447},{142,0,92},{138,0,666},{5,0, -394},{7,0,487},{136,0,246},{9,0,437},{6,10,53},{6,10,199},{7,10,1408},{8,10,32}, -{8,10,93},{10,10,397},{10,10,629},{11,10,593},{11,10,763},{13,10,326},{145,10,35 -},{134,10,105},{9,0,320},{10,0,506},{138,10,794},{7,11,57},{8,11,167},{8,11,375} -,{9,11,82},{9,11,561},{10,11,620},{10,11,770},{11,10,704},{141,10,396},{6,0,1003 -},{5,10,114},{5,10,255},{141,10,285},{7,0,866},{135,0,1163},{133,11,531},{132,0, -328},{7,10,2035},{8,10,19},{9,10,89},{138,10,831},{8,11,194},{136,11,756},{136,0 -,1000},{5,11,453},{134,11,441},{4,0,101},{5,0,833},{7,0,1171},{136,0,744},{133,0 -,726},{136,10,746},{138,0,176},{6,0,9},{6,0,397},{7,0,53},{7,0,1742},{10,0,632}, -{11,0,828},{140,0,146},{135,11,22},{145,11,64},{132,0,839},{11,0,417},{12,0,223} -,{140,0,265},{4,11,102},{7,11,815},{7,11,1699},{139,11,964},{5,10,955},{136,10, -814},{6,0,1931},{6,0,2007},{18,0,246},{146,0,247},{8,0,198},{11,0,29},{140,0,534 -},{135,0,1771},{6,0,846},{7,11,1010},{11,11,733},{11,11,759},{12,11,563},{13,11, -34},{14,11,101},{18,11,45},{146,11,129},{4,0,186},{5,0,157},{8,0,168},{138,0,6}, -{132,11,899},{133,10,56},{148,10,100},{133,0,875},{5,0,773},{5,0,991},{6,0,1635} -,{134,0,1788},{6,0,1274},{9,0,477},{141,0,78},{4,0,639},{7,0,111},{8,0,581},{12, -0,177},{6,11,52},{9,11,104},{9,11,559},{10,10,4},{10,10,13},{11,10,638},{12,11, -308},{19,11,87},{148,10,57},{132,11,604},{4,11,301},{133,10,738},{133,10,758},{ -134,0,1747},{7,11,1440},{11,11,854},{11,11,872},{11,11,921},{12,11,551},{13,11, -472},{142,11,367},{7,0,1364},{7,0,1907},{141,0,158},{134,0,873},{4,0,404},{4,0, -659},{7,0,552},{135,0,675},{135,10,1112},{139,10,328},{7,11,508},{137,10,133},{ -133,0,391},{5,10,110},{6,10,169},{6,10,1702},{7,10,400},{8,10,538},{9,10,184},{9 -,10,524},{140,10,218},{6,11,310},{7,11,1849},{8,11,72},{8,11,272},{8,11,431},{9, -11,12},{9,11,351},{10,11,563},{10,11,630},{10,11,810},{11,11,367},{11,11,599},{ -11,11,686},{140,11,672},{5,0,540},{6,0,1697},{136,0,668},{132,0,883},{134,0,78}, -{12,0,628},{18,0,79},{6,10,133},{9,10,353},{139,10,993},{6,11,181},{7,11,537},{8 -,11,64},{9,11,127},{10,11,496},{12,11,510},{141,11,384},{6,10,93},{7,10,1422},{7 -,10,1851},{8,10,673},{9,10,529},{140,10,43},{137,10,371},{134,0,1460},{134,0,962 -},{4,11,244},{135,11,233},{9,10,25},{10,10,467},{138,10,559},{4,10,335},{135,10, -942},{133,0,460},{135,11,334},{134,11,1650},{4,0,199},{139,0,34},{5,10,601},{8, -10,39},{10,10,773},{11,10,84},{12,10,205},{142,10,1},{133,10,870},{134,0,388},{ -14,0,474},{148,0,120},{133,11,369},{139,0,271},{4,0,511},{9,0,333},{9,0,379},{10 -,0,602},{11,0,441},{11,0,723},{11,0,976},{12,0,357},{132,10,181},{134,0,608},{ -134,10,1652},{22,0,49},{137,11,338},{140,0,988},{134,0,617},{5,0,938},{136,0,707 -},{132,10,97},{5,10,147},{6,10,286},{7,10,1362},{141,10,176},{6,0,756},{134,0, -1149},{133,11,896},{6,10,375},{7,10,169},{7,10,254},{136,10,780},{134,0,1583},{ -135,10,1447},{139,0,285},{7,11,1117},{8,11,393},{136,11,539},{135,0,344},{6,0, -469},{7,0,1709},{138,0,515},{5,10,629},{135,10,1549},{5,11,4},{5,11,810},{6,11, -13},{6,11,538},{6,11,1690},{6,11,1726},{7,11,499},{7,11,1819},{8,11,148},{8,11, -696},{8,11,791},{12,11,125},{13,11,54},{143,11,9},{135,11,1268},{137,0,404},{132 -,0,500},{5,0,68},{134,0,383},{11,0,216},{139,0,340},{4,11,925},{5,11,803},{8,11, -698},{138,11,828},{4,0,337},{6,0,353},{7,0,1934},{8,0,488},{137,0,429},{7,0,236} -,{7,0,1795},{8,0,259},{9,0,135},{9,0,177},{9,0,860},{10,0,825},{11,0,115},{11,0, -370},{11,0,405},{11,0,604},{12,0,10},{12,0,667},{12,0,669},{13,0,76},{14,0,310}, -{15,0,76},{15,0,147},{148,0,23},{4,0,15},{4,0,490},{5,0,22},{6,0,244},{7,0,40},{ -7,0,200},{7,0,906},{7,0,1199},{9,0,616},{10,0,716},{11,0,635},{11,0,801},{140,0, -458},{12,0,756},{132,10,420},{134,0,1504},{6,0,757},{133,11,383},{6,0,1266},{135 -,0,1735},{5,0,598},{7,0,791},{8,0,108},{9,0,123},{7,10,1570},{140,10,542},{142, -11,410},{9,11,660},{138,11,347} -}; -/* GENERATED CODE END */ +/* Buckets are Hash15 results. */ +#define BROTLI_ENC_STATIC_DICT_LUT_NUM_BUCKETS 32768 +#define BROTLI_ENC_STATIC_DICT_LUT_NUM_ITEMS 31705 + +#if (BROTLI_STATIC_INIT != BROTLI_STATIC_INIT_NONE) +BROTLI_INTERNAL BROTLI_BOOL BrotliEncoderInitStaticDictionaryLut( + const BrotliDictionary* dictionary, uint16_t* buckets, DictWord* words); +BROTLI_INTERNAL extern BROTLI_MODEL("small") uint16_t + kStaticDictionaryBuckets[BROTLI_ENC_STATIC_DICT_LUT_NUM_BUCKETS]; +BROTLI_INTERNAL extern BROTLI_MODEL("small") DictWord + kStaticDictionaryWords[BROTLI_ENC_STATIC_DICT_LUT_NUM_ITEMS]; +#else +BROTLI_INTERNAL extern const BROTLI_MODEL("small") uint16_t + kStaticDictionaryBuckets[BROTLI_ENC_STATIC_DICT_LUT_NUM_BUCKETS]; +BROTLI_INTERNAL extern const BROTLI_MODEL("small") DictWord + kStaticDictionaryWords[BROTLI_ENC_STATIC_DICT_LUT_NUM_ITEMS]; +#endif #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ diff --git a/deps/brotli/c/enc/static_dict_lut_inc.h b/deps/brotli/c/enc/static_dict_lut_inc.h new file mode 100644 index 00000000000000..fea97f8d7654bc --- /dev/null +++ b/deps/brotli/c/enc/static_dict_lut_inc.h @@ -0,0 +1,5830 @@ +const BROTLI_MODEL("small") +uint16_t kStaticDictionaryBuckets[BROTLI_ENC_STATIC_DICT_LUT_NUM_BUCKETS] = { +1,0,0,0,0,0,0,0,0,3,6,0,0,0,0,0,20,0,0,0,21,0,22,0,0,0,0,0,0,0,0,23,0,0,25,0,29, +0,53,0,0,0,0,0,0,55,0,0,0,0,0,0,61,76,0,0,0,94,0,0,0,0,0,0,96,0,97,0,98,0,0,0,0, +0,0,0,99,101,106,108,0,0,0,0,0,110,0,111,112,0,113,118,124,0,0,0,0,0,125,128,0,0 +,0,0,129,0,0,131,0,0,0,0,0,0,132,0,0,135,0,0,0,137,0,0,0,0,0,138,139,0,0,0,0,0,0 +,0,142,143,144,0,0,0,0,0,145,0,0,0,146,149,151,152,0,0,153,0,0,0,0,0,0,0,0,0,0,0 +,0,0,0,0,154,0,0,0,0,0,0,155,0,0,0,0,160,182,0,0,0,0,0,0,183,0,0,0,188,189,0,0, +192,0,0,0,0,0,0,194,0,0,0,0,0,0,0,0,197,202,209,0,0,210,0,224,0,0,0,225,0,0,0,0, +0,0,0,0,0,0,231,0,0,0,232,0,240,0,0,242,0,0,0,0,0,0,0,0,0,0,0,244,0,0,0,246,0,0, +249,251,253,0,0,0,0,0,258,0,0,261,263,0,0,0,267,0,0,268,0,269,0,0,0,0,0,0,0,0,0, +271,0,0,0,0,0,0,272,0,273,0,277,0,278,286,0,0,0,0,287,0,289,290,291,0,0,0,295,0, +0,296,297,0,0,0,0,0,0,0,0,0,0,298,0,0,0,299,0,0,305,0,324,0,0,0,0,0,327,0,328, +329,0,0,0,0,336,0,0,340,0,341,342,343,0,0,346,0,348,0,0,0,0,0,0,349,351,0,0,355, +0,363,0,364,0,368,369,0,370,0,0,0,0,0,0,0,372,0,0,0,0,0,0,0,0,0,0,0,373,0,375,0, +0,0,0,376,377,0,0,394,395,396,0,0,398,0,0,0,0,400,0,0,408,0,0,0,0,420,0,0,0,0,0, +0,421,0,0,422,423,0,0,429,435,436,442,0,0,443,0,444,445,453,456,0,457,0,0,0,0,0, +458,0,0,0,459,0,0,0,460,0,462,463,465,0,0,0,0,0,0,466,469,0,0,0,0,0,0,470,0,0,0, +474,0,476,0,0,0,0,483,0,485,0,0,0,486,0,0,488,491,492,0,0,497,499,500,0,501,0,0, +0,505,0,0,506,0,0,0,507,0,0,0,509,0,0,0,0,511,512,519,0,0,0,0,0,0,529,530,0,0,0, +534,0,0,0,0,543,0,0,0,0,0,0,0,0,0,553,0,0,0,0,557,560,0,0,0,0,0,0,561,0,564,0,0, +0,0,0,0,565,566,0,575,0,619,0,620,0,0,623,624,0,0,0,625,0,0,626,627,0,0,628,0,0, +0,0,630,0,631,0,0,0,0,0,0,0,0,0,641,0,0,0,0,643,656,668,0,0,0,673,0,0,0,674,0,0, +0,0,0,0,0,0,682,0,687,0,690,0,693,699,700,0,0,0,0,0,0,704,705,0,0,0,0,707,710,0, +711,0,0,0,0,726,0,0,729,0,0,0,730,731,0,0,0,0,0,752,0,0,0,762,0,763,0,0,767,0,0, +0,770,774,0,0,775,0,0,0,0,0,0,0,0,0,0,776,0,0,0,777,783,0,0,0,785,788,0,0,0,0, +790,0,0,0,793,0,0,0,0,794,0,0,804,819,821,0,827,0,0,0,834,0,0,835,0,0,0,841,0, +844,0,850,851,859,0,860,0,0,0,0,0,0,0,874,0,876,0,877,890,0,0,0,0,0,0,0,0,893, +894,898,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,899,0,0,0,900,904,906,0,0,0,907,0,908,909, +0,910,0,0,0,0,911,0,0,0,0,0,916,0,0,0,922,925,0,930,0,934,0,0,0,0,0,943,0,0,944, +0,953,954,0,0,0,0,0,0,955,0,962,963,0,0,976,0,0,977,978,979,980,0,981,0,0,0,0, +984,0,0,985,0,0,987,989,991,0,0,0,0,0,0,0,0,0,992,0,0,0,993,0,0,0,0,0,0,996,0,0, +0,1000,0,0,0,0,0,1002,0,0,0,0,1005,1007,0,0,0,1009,0,0,0,1010,0,0,0,0,0,0,1011,0 +,1012,0,0,0,0,1014,1016,0,0,0,1020,0,1021,0,0,0,0,1022,0,0,0,1024,0,0,0,0,0,0, +1025,0,0,1026,1027,0,0,0,0,0,1031,0,1033,0,0,0,0,1034,0,0,0,1037,1040,0,0,0,1042 +,1043,0,0,1053,0,1054,0,0,1057,0,0,0,1058,0,0,1060,0,0,0,0,0,0,0,1061,0,0,1062,0 +,0,0,0,1063,0,0,0,0,1064,0,0,0,0,0,1065,0,0,0,0,1066,1067,0,0,0,1069,1070,1072,0 +,0,0,0,0,0,1073,0,1075,0,0,0,0,0,0,1080,1084,0,0,0,0,1088,0,0,0,0,0,0,1094,0, +1095,0,1107,0,0,0,1112,1114,0,1119,0,1122,0,0,1126,0,1129,0,1130,0,0,0,0,0,1132, +0,0,0,0,0,0,1144,0,0,1145,1146,0,1148,1149,0,0,1150,1151,0,0,0,0,1152,0,1153,0,0 +,0,0,0,1154,0,1163,0,0,0,1164,0,0,0,0,0,1165,0,1167,0,1170,0,0,0,0,0,1171,1172,0 +,0,0,0,0,0,0,0,1173,1175,1177,0,1186,0,0,0,0,0,0,0,0,0,0,1195,0,0,1221,0,0,1224, +0,0,1227,0,0,0,0,0,1228,1229,0,0,1230,0,0,0,0,0,0,0,0,0,1231,0,0,0,1233,0,0,1243 +,1244,1246,1248,0,0,0,0,1254,1255,1258,1259,0,0,0,1260,0,0,1261,0,0,0,1262,1264, +0,0,1265,0,0,0,0,0,0,0,0,0,0,0,0,1266,0,1267,0,0,0,0,1273,1274,1276,1289,0,0, +1291,1292,1293,0,0,1294,1295,1296,0,0,0,0,1302,0,1304,0,0,0,0,0,0,0,0,0,1311, +1312,0,1314,0,1316,1320,1321,0,0,0,0,0,0,0,1322,1323,1324,0,1335,0,1336,0,0,0,0, +1341,1342,0,1346,0,1357,0,0,0,1358,1360,0,0,0,0,0,0,1361,0,0,0,1362,1365,0,1366, +0,0,0,0,0,0,0,1379,0,0,0,0,0,0,0,0,0,0,0,0,1386,0,1388,0,0,0,0,0,0,0,0,0,0,0,0,0 +,0,1395,0,0,0,0,1403,0,1405,0,0,1407,0,0,0,0,0,1408,1409,0,1410,0,0,0,1412,1413, +1416,0,0,1429,1451,0,0,1454,0,0,0,0,0,0,0,1455,0,0,0,0,0,0,0,1456,0,0,0,0,1459, +1460,1461,1475,0,0,0,0,0,0,1477,0,1480,0,1481,0,0,1486,0,0,1495,0,0,0,1496,0,0, +1498,1499,1501,1520,1521,0,0,0,1526,0,0,0,0,1528,1529,0,1533,1536,0,0,0,1537, +1538,1549,0,1550,1558,1559,1572,0,1573,0,0,0,0,0,0,0,0,0,1575,0,0,0,0,0,1579,0, +1599,0,1603,0,1604,0,1605,0,0,0,0,0,1608,1610,0,0,0,0,1611,0,1615,0,1616,1618,0, +1619,0,0,1622,0,0,0,0,1634,0,0,0,1635,0,0,0,1641,0,0,0,0,0,0,0,0,0,1643,0,0,0, +1650,0,0,1652,0,0,0,0,0,1653,0,0,0,1654,0,0,0,0,1655,0,1662,0,0,1663,1664,0,0, +1668,0,0,1669,1670,0,1672,1673,0,0,0,0,0,1674,0,0,0,1675,1676,1680,0,1682,0,0, +1687,0,0,0,0,0,1704,0,0,1705,0,0,1721,0,0,0,0,1734,1735,0,0,0,0,1737,0,0,0,0, +1739,0,0,1740,0,0,0,0,0,0,0,0,0,0,1741,1743,0,0,0,0,1745,0,0,0,1749,0,0,0,1751,0 +,0,0,0,0,0,1760,0,0,0,0,1765,0,0,0,0,0,1784,0,1785,1787,0,0,0,0,1788,1789,0,0,0, +0,1790,1791,1793,0,1798,1799,0,0,0,0,1801,0,1803,1805,0,0,0,1806,1811,0,1812, +1814,0,1821,0,0,0,0,0,1822,1833,0,0,0,0,0,0,1848,0,0,0,0,0,0,1857,0,0,0,1859,0,0 +,0,0,1861,0,0,0,0,0,0,0,1866,0,1921,1925,0,0,0,1929,1930,0,0,0,0,0,0,0,0,0,1931, +0,0,0,0,1932,0,0,0,1934,0,0,0,0,0,0,0,0,1946,0,0,1948,0,0,0,0,1950,0,1957,0,1958 +,0,0,0,0,0,1965,1967,0,0,0,0,1968,0,1969,0,1971,1972,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +,0,1973,0,0,0,0,1975,0,0,0,0,1976,1979,0,1982,0,0,0,0,1984,1988,0,0,0,0,1990, +2004,2008,0,0,0,2012,2013,0,0,0,0,0,0,0,0,0,0,2015,0,2016,2017,0,0,0,0,2021,0,0, +2025,0,0,0,0,0,2029,2036,2040,0,2042,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2043,0,0,0,0,0, +2045,0,0,0,0,0,0,0,2046,2047,0,2048,2049,0,2059,0,0,2063,0,2064,2065,0,0,2066,0, +0,0,0,0,0,2069,0,0,0,0,2070,0,2071,0,2072,0,0,0,0,2080,2082,2083,0,0,0,0,0,2085, +0,2086,2088,2089,2105,0,0,0,0,2107,0,0,2116,2117,0,2120,0,0,2122,0,0,0,0,0,2123, +0,0,2125,2127,2128,0,0,0,2130,0,0,0,2137,2139,2140,2141,0,0,0,0,0,0,0,0,0,2144, +2145,0,0,2146,2149,0,0,0,0,2150,0,0,2151,2158,0,2159,0,2160,0,0,0,0,0,0,2161, +2162,0,0,2194,2202,0,0,0,0,0,0,2205,2217,0,2220,0,2221,0,2222,2224,0,0,0,0,2237, +0,0,0,0,0,2238,0,2239,2241,0,0,2242,0,0,0,0,0,2243,0,0,0,0,0,0,2252,0,0,2253,0,0 +,0,2257,2258,0,0,0,2260,0,0,0,0,0,0,0,2262,0,2264,0,0,0,0,0,2269,2270,0,0,0,0,0, +0,0,0,0,2271,0,2273,0,0,0,0,2277,0,0,0,0,2278,0,0,0,0,2279,0,2280,0,2283,0,0,0,0 +,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2287,0,0,0,0,0,0,0,2289,2290,0,0,0,0,2291,0,2292,0, +0,0,2293,2295,2296,0,0,0,0,0,0,0,2298,0,0,0,0,0,2303,0,2305,0,0,2306,0,2307,0,0, +0,0,0,0,0,0,0,0,0,0,2313,2314,2315,2316,0,0,2318,0,2319,0,2322,0,0,2323,0,2324,0 +,2326,0,0,0,0,0,0,0,2335,0,2336,2338,2339,0,2340,0,0,0,2355,0,2375,0,2382,2386,0 +,2387,0,0,2394,0,0,0,0,2395,0,2397,0,0,0,0,0,2398,0,0,0,0,0,0,0,2399,2402,2404, +2408,2411,0,0,0,2413,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2415,0,0,2416,2417,2419,0,2420, +0,0,0,0,0,2425,0,0,0,2426,0,0,0,0,0,0,0,0,0,0,0,0,2427,2428,0,2429,0,0,2430,2434 +,0,2436,0,0,0,0,0,0,2441,2442,0,2445,0,0,2446,2457,0,2459,0,0,2462,0,2464,0,2477 +,0,2478,2486,0,0,0,2491,0,0,2493,0,0,2494,0,2495,0,2513,2523,0,0,0,0,2524,0,0,0, +0,0,0,2528,2529,2530,0,0,2531,0,2533,0,0,2534,2535,0,2536,2537,0,2538,0,2539, +2540,0,0,0,2545,2546,0,0,0,0,0,0,0,2548,0,0,2549,0,2550,2555,0,0,0,0,0,2557,0, +2560,0,0,0,0,0,0,0,0,0,0,0,2561,0,2576,0,0,0,0,0,0,0,0,0,2577,2578,0,0,0,2579,0, +0,0,0,0,0,0,2580,0,0,0,0,2581,0,0,0,0,2583,0,2584,0,2588,2590,0,0,0,2591,0,0,0,0 +,2593,2594,0,2595,0,2601,2602,0,0,2603,0,2605,0,0,0,2606,2607,2611,0,2615,0,0,0, +2617,0,0,0,0,0,0,0,0,0,0,0,0,0,2619,0,0,2620,0,0,0,2621,0,2623,0,2625,0,0,2628, +2629,0,0,2635,2636,2637,0,0,2639,0,0,0,2642,0,0,0,0,2643,0,2644,0,2649,0,0,0,0,0 +,0,2655,2656,0,0,2657,0,0,0,0,0,2658,0,0,0,0,0,2659,0,0,0,0,2664,2685,0,2687,0, +2688,0,0,2689,0,0,2694,0,2695,0,0,2698,0,2701,2706,0,0,0,2707,0,2709,2710,2711,0 +,0,0,2720,2730,2735,0,0,0,0,2738,2740,0,0,0,0,2747,0,0,0,0,0,0,2748,0,0,2749,0,0 +,0,0,0,2750,0,0,2752,2754,0,0,0,0,0,2758,0,0,0,0,2762,0,0,0,0,2763,0,0,0,0,0,0,0 +,2764,2767,0,0,0,0,2768,0,0,2770,0,0,0,0,0,0,0,2771,0,0,0,0,0,0,0,0,0,2772,0,0,0 +,0,0,2773,2776,0,0,2783,0,0,2784,0,2789,0,2790,0,0,0,2792,0,0,0,0,0,0,0,0,0,0, +2793,2795,0,0,0,0,0,0,2796,0,0,0,0,0,0,2797,2799,0,0,0,0,2803,0,0,0,0,2806,0, +2807,2808,2817,2819,0,0,0,0,0,2821,0,0,0,0,2822,2823,0,0,0,0,0,0,0,2824,0,0,2828 +,0,2834,0,0,0,0,0,0,2836,0,2838,0,0,2839,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2841, +0,0,0,2842,0,0,0,0,0,2843,2844,0,0,0,0,2846,0,0,2847,0,2849,0,2853,0,0,0,0,0, +2857,0,0,0,0,2858,0,2859,0,0,2860,0,2862,2868,0,0,0,0,2875,0,2876,0,0,2877,2878, +2884,2889,2890,0,0,2891,0,0,2892,0,0,0,2906,2912,0,2913,0,0,0,0,0,0,0,0,2916,0, +2934,0,0,0,0,0,2935,0,0,0,0,2939,0,2940,0,0,0,0,0,0,0,2941,0,0,0,2946,0,2949,0,0 +,2950,2954,2955,0,0,0,2959,2961,0,0,2962,0,2963,0,0,0,0,0,0,2964,2965,2966,2967, +0,0,0,0,0,0,0,2969,0,0,0,0,0,2970,2975,0,2982,2983,2984,0,0,0,0,0,2989,0,0,2990, +0,0,0,0,0,0,0,2991,0,0,0,0,0,0,0,0,2998,0,3000,3001,0,0,3002,0,0,0,3003,0,0,3012 +,0,0,3022,0,0,3024,0,0,3025,3027,0,0,0,3030,0,0,0,0,3034,3035,0,0,3036,0,3039,0, +3049,0,0,3050,0,0,0,0,0,0,3051,0,3053,0,0,0,0,3057,0,3058,0,0,0,0,0,0,0,0,3063,0 +,0,3073,3074,3078,3079,0,3080,3086,0,0,0,0,0,0,0,0,3087,0,3092,0,3095,0,3099,0,0 +,0,3100,0,3101,3102,0,3122,0,0,0,3124,0,3125,0,0,0,0,0,0,3132,3134,0,0,3136,0,0, +0,0,0,0,0,3147,0,0,3149,0,0,0,0,0,3150,3151,3152,0,0,0,0,3158,0,0,3160,0,0,3161, +0,0,3162,0,3163,3166,3168,0,0,3169,3170,0,0,3171,0,0,0,0,0,0,0,3182,0,3184,0,0, +3188,0,0,3194,0,0,0,0,0,0,3204,0,0,0,0,3209,0,0,0,0,0,0,0,0,0,0,0,3216,3217,0,0, +0,0,0,0,0,3219,0,0,3220,3222,0,3223,0,0,0,0,3224,0,3225,3226,0,3228,3233,0,3239, +3241,3242,0,0,3251,3252,3253,3255,0,0,0,0,0,0,0,0,3260,0,0,3261,0,0,0,3267,0,0,0 +,0,0,0,0,0,3271,0,0,0,3278,0,3282,0,0,0,3284,0,0,0,3285,3286,0,0,0,0,0,0,0,3287, +3292,0,0,0,0,3294,3296,0,0,3299,3300,3301,0,3302,0,0,0,0,0,3304,3306,0,0,0,0,0,0 +,3308,0,0,0,0,0,0,0,0,0,3311,0,0,0,0,0,0,0,0,3312,3314,3315,0,3318,0,0,0,0,0,0,0 +,0,3319,0,0,0,0,0,3321,0,0,0,0,0,0,0,0,0,3322,0,0,3324,3325,0,0,3326,0,0,3328, +3329,3331,0,0,3335,0,0,3337,0,3338,0,0,0,0,3343,3347,0,0,0,3348,0,0,3351,0,0,0,0 +,0,0,3354,0,0,0,0,0,0,0,0,0,0,3355,0,0,3365,3366,3367,0,0,0,0,0,0,3368,3369,0, +3370,0,0,3373,0,0,3376,0,0,3377,0,3379,3387,0,0,0,0,0,3390,0,0,0,0,0,0,0,3402,0, +3403,3436,3437,3439,0,0,3441,0,0,0,3442,0,0,3449,0,0,0,3450,0,0,0,0,0,0,0,3451,0 +,0,3452,0,3453,3456,0,3457,0,0,3458,0,3459,0,0,0,0,0,0,0,0,0,3460,0,0,3469,3470, +0,0,3475,0,0,0,3480,3487,3489,0,3490,0,0,3491,3499,0,3500,0,0,3501,0,0,0,3502,0, +3514,0,0,0,3516,3517,0,0,0,3518,0,0,0,0,3520,3521,3522,0,0,3526,3530,0,0,0,0, +3531,0,0,0,0,3536,0,0,0,0,0,0,0,3539,3541,0,0,3542,3544,0,3547,3548,0,0,3550,0, +3553,0,0,0,0,0,0,0,3554,0,3555,0,3558,0,3559,0,0,0,0,0,0,0,0,3563,0,3581,0,0,0, +3599,0,0,0,3600,0,3601,0,3602,3603,0,0,3606,3608,0,3610,3611,0,0,0,0,0,0,0,0,0, +3612,3616,3619,0,0,0,0,0,0,0,0,0,0,0,0,0,3624,3628,0,3629,3634,3635,0,0,0,0,0,0, +3636,0,3637,0,0,3638,3651,0,0,0,0,0,0,3652,3653,0,0,0,0,3656,3657,0,0,0,0,0,3658 +,0,0,0,0,3659,0,3661,3663,3664,0,3665,0,3692,0,0,0,3694,3696,0,0,0,0,0,0,0,0,0,0 +,0,0,3698,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3700,0,0,3701,0,0,0,3708,3709,0,0,0,3711 +,3712,0,0,0,0,0,3723,0,3724,3725,0,0,3726,0,0,0,0,0,0,3728,3729,0,3734,3735,3737 +,0,0,0,3743,0,3745,0,0,3746,0,0,3747,3748,0,3757,0,3759,3766,3767,0,3768,0,0,0,0 +,3769,0,0,3771,0,3774,0,0,0,0,0,0,3775,0,0,0,0,0,0,3776,0,3777,3786,0,3788,3789, +0,0,0,0,0,0,0,0,0,3791,0,3811,0,0,0,0,0,3814,3815,3816,3820,0,0,0,0,0,0,0,3821,0 +,0,3825,0,0,0,0,3835,0,0,3848,3849,0,0,0,0,3850,3851,3853,0,0,0,0,3859,0,3860, +3862,0,0,0,0,0,3863,0,0,0,0,0,0,0,0,3873,0,3874,0,3875,3886,0,3887,0,0,0,0,3892, +3913,0,3914,0,0,0,3925,3931,0,0,0,0,3934,3941,3942,0,0,0,0,3943,0,0,0,3944,0,0,0 +,0,0,3945,0,3947,0,0,0,3956,3957,0,0,0,0,0,0,0,0,0,3958,0,3959,3965,0,0,0,0,3966 +,0,0,0,3967,0,0,0,3968,3974,0,0,0,0,0,3975,3977,3978,0,0,0,0,3980,0,3985,0,0,0,0 +,0,0,0,0,3986,4011,0,0,4017,0,0,0,0,0,0,0,0,0,0,0,4018,0,0,0,0,4019,0,4023,0,0,0 +,4027,4028,0,0,0,0,0,0,0,0,4031,4034,0,0,4035,4037,4039,4040,0,0,0,0,0,4059,0, +4060,4061,0,4062,4063,4066,0,0,4072,0,0,0,0,0,0,0,0,0,0,0,0,0,4088,0,0,0,0,0, +4091,0,0,0,0,4094,4095,0,0,4096,0,0,0,0,0,4098,4099,0,0,0,4101,0,4104,0,0,0,4105 +,4108,0,4113,0,0,4115,4116,0,4126,0,0,4127,0,0,0,0,0,0,0,4128,4132,4133,0,4134,0 +,0,0,4137,0,0,4141,0,0,0,0,4144,4146,4147,0,0,0,0,4148,0,0,4311,0,0,0,4314,4329, +0,4331,4332,0,4333,0,4334,0,0,0,4335,0,4336,0,0,0,4337,0,0,0,4342,4345,4346,4350 +,0,4351,4352,0,4354,4355,0,0,4364,0,0,0,0,4369,0,0,0,4373,0,4374,0,0,0,0,4377,0, +0,0,0,4378,0,0,0,4380,0,0,0,4381,4382,0,0,0,0,0,0,0,4384,0,0,0,0,4385,0,0,0,4386 +,0,0,0,4391,4398,0,0,0,0,4407,4409,0,0,0,0,4410,0,0,4411,0,4414,4415,4418,0,4427 +,4428,4430,0,4431,0,4448,0,0,0,0,0,4449,0,0,0,4451,4452,0,4453,4454,0,4456,0,0,0 +,0,0,0,0,4459,0,4463,0,0,0,0,0,4466,0,4467,0,4469,0,0,0,0,0,0,0,0,0,0,0,0,0,4470 +,4471,0,4473,0,0,4475,0,0,0,0,4477,4478,0,0,0,4479,4481,0,4482,0,4484,0,0,0,0,0, +0,0,4486,0,0,4488,0,0,4497,0,4508,0,0,4510,4511,0,4520,4523,0,4524,0,4525,0,4527 +,0,0,4528,0,0,0,0,4530,0,4531,0,0,4532,0,0,0,4533,0,0,0,0,0,4535,0,0,0,4536,0,0, +0,0,0,4541,4543,4544,4545,4547,0,4548,0,0,0,0,4550,4551,0,4553,0,0,0,0,4562,0,0, +4571,0,0,0,4574,0,0,0,4575,0,4576,0,4577,0,0,0,4581,0,0,0,0,0,4582,0,0,4586,0,0, +0,4588,0,0,4597,0,4598,0,0,0,0,4616,4617,0,4618,0,0,0,0,4619,0,4620,0,0,4621,0, +4624,0,0,0,0,0,4625,0,0,0,0,4657,0,4659,0,4667,0,0,0,4668,4670,0,4672,0,0,0,0,0, +4673,4676,0,0,0,0,4687,0,0,0,0,4697,0,0,0,0,4699,0,4701,0,0,0,0,4702,0,0,4706,0, +0,4713,0,0,0,4714,4715,4716,0,0,0,0,0,0,0,0,0,0,0,0,4717,0,0,4720,0,4721,4729, +4735,0,0,0,4737,0,0,0,4739,0,0,0,4740,0,0,0,4741,0,0,0,0,0,4742,0,4745,4746,4747 +,0,0,0,0,0,0,0,0,4748,0,0,0,4749,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4751, +4786,0,4787,0,4788,4796,0,0,4797,4798,0,4799,4806,4807,0,0,0,0,4809,4810,0,0,0,0 +,0,0,4811,0,0,0,0,0,4812,0,4813,0,0,4815,0,4821,4822,0,0,0,0,4823,0,0,0,0,0,0,0, +0,0,0,4824,0,0,0,0,4826,0,0,0,4828,0,4829,0,0,0,4843,0,0,4847,0,4853,4855,4858,0 +,0,0,0,0,4859,0,4864,0,0,4879,0,0,0,0,4880,0,0,0,0,4881,0,4882,0,0,0,0,0,0,0,0,0 +,4883,0,0,0,0,4884,0,0,0,0,0,4886,4887,4888,4894,4896,0,4902,0,0,4905,0,0,4915,0 +,0,0,0,0,0,0,4916,4917,4919,4921,0,0,0,0,0,4926,0,0,0,0,4927,0,0,0,0,0,0,0,0, +4929,0,4930,4931,0,4938,0,4952,0,4953,4957,4960,4964,0,0,0,0,0,0,0,5019,5020, +5022,0,0,0,0,0,5023,0,0,0,5024,0,0,0,5025,0,0,0,0,5028,0,0,0,0,5029,5030,5031,0, +5033,0,0,0,0,0,0,0,0,0,5034,5035,0,5036,0,0,5037,0,0,0,0,5038,0,0,5039,0,0,0, +5041,5042,0,0,0,0,5044,5049,5054,0,5055,0,5057,0,0,0,5060,0,0,0,0,0,5063,0,5064, +5065,0,5067,0,0,0,5068,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5076,0,0,0,0,0,0, +0,5077,0,0,5078,5080,0,0,5083,0,0,0,0,0,0,0,0,5085,0,0,0,0,0,0,5098,5099,5101, +5105,5107,0,5108,0,5109,0,0,0,0,0,0,0,5110,0,0,0,0,0,5117,5118,0,5121,0,5122,0,0 +,5130,0,0,0,5137,0,0,0,5148,0,0,0,0,0,0,0,5151,5154,0,0,0,5155,0,0,5156,5159, +5161,0,0,0,0,5162,0,0,0,0,5163,5164,0,5166,0,0,0,0,0,0,0,0,0,0,5167,0,0,0,5172,0 +,0,0,0,0,0,5178,5179,0,0,5190,0,0,5191,5192,5194,0,0,5198,5201,0,0,0,0,0,5203,0, +5206,5209,0,0,0,0,0,0,5213,0,5214,5216,0,0,0,0,0,5217,0,0,0,0,0,0,0,0,5218,5219, +0,5231,0,0,5244,5249,0,5254,0,5255,0,0,5257,0,0,0,0,0,5258,0,5260,5270,0,5277,0, +0,0,0,0,0,5280,5281,5282,5283,0,0,0,0,0,5284,0,5285,0,0,0,0,0,5287,5288,0,0,0,0, +0,0,0,0,0,0,5289,5291,0,0,5294,0,0,5295,0,0,0,0,0,0,0,5304,0,0,5306,5307,5308,0, +5309,0,0,5310,0,0,0,0,5311,5312,0,5313,0,0,0,0,0,5316,0,0,0,5317,0,0,0,0,0,0,0,0 +,0,5325,0,0,0,0,0,0,5326,0,5327,5329,0,5332,0,0,0,0,5338,0,0,0,0,0,0,0,0,5340,0, +0,5341,0,0,0,5342,0,5343,5344,0,0,5345,0,0,0,0,0,0,5347,5348,0,0,0,0,0,0,0,0,0, +5349,0,5350,0,5354,0,0,0,0,5358,0,0,5359,0,0,5361,0,0,5365,0,5367,0,5373,0,0,0, +5379,0,0,0,5380,0,0,0,5382,0,5384,0,0,0,0,0,0,5385,0,0,0,0,5387,0,0,0,0,0,0,5388 +,5390,5393,0,0,0,0,0,0,0,0,0,0,0,5396,0,0,0,0,5397,5402,0,0,0,0,0,5403,0,0,0, +5404,5405,0,0,0,0,0,0,0,0,0,0,0,0,5406,0,0,0,0,5410,0,0,5411,0,5415,0,0,0,0,5416 +,5434,0,0,0,0,0,0,0,0,0,0,0,5438,0,5440,0,0,0,0,0,0,5441,5442,0,0,0,5443,5444, +5447,0,0,5448,5449,5451,0,0,0,5456,5457,0,0,0,5459,0,0,0,5461,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,5464,0,5466,0,0,5467,0,5470,0,0,5473,0,0,5474,0,0,5476,0,0,0,0,0,0,0,0 +,0,0,0,5477,0,0,0,0,0,0,0,5484,0,0,5485,5486,0,0,0,0,0,5488,0,0,0,0,0,0,0,5489,0 +,0,0,0,0,5507,0,0,0,5510,0,5511,0,0,5512,0,0,0,5513,0,5515,0,0,5516,5517,0,5518, +0,0,5522,0,0,0,0,0,5534,5535,0,0,5536,0,5538,0,0,5543,0,5544,0,0,5545,0,5547,0, +5557,0,0,5558,0,5560,5567,0,0,0,0,5568,0,0,0,5571,5573,0,5574,0,5575,0,0,0,0, +5577,0,0,5598,0,0,0,0,0,0,0,0,0,5600,5609,0,0,0,0,5610,0,0,5612,0,5624,0,5625,0, +0,0,5629,0,5641,0,5642,5643,0,0,0,0,0,0,5651,0,0,0,5652,5653,0,5661,5662,5678,0, +5679,0,0,0,0,5685,5686,0,0,0,0,0,5690,5692,0,5703,0,0,0,0,0,5706,0,0,0,0,5707,0, +0,0,0,0,0,5708,0,0,5709,0,5710,0,0,0,5712,0,5733,0,5734,5735,0,0,5744,5751,0,0,0 +,0,0,0,0,0,0,0,0,0,5752,0,5754,0,0,0,0,0,0,5757,5758,0,5760,5761,0,0,0,0,5763, +5764,5765,0,5766,0,5767,5768,0,5770,0,0,0,0,5776,5780,0,0,0,0,5782,0,0,0,0,5784, +0,0,5788,0,0,0,0,0,0,0,0,0,0,0,5797,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5799,0,0,5801, +0,0,0,5811,0,0,0,0,0,0,5816,0,0,5827,0,0,0,0,0,0,0,0,5830,5831,0,0,5832,0,0,5833 +,0,5835,5844,5845,0,5846,0,0,0,0,0,5850,0,0,0,0,0,5852,0,5855,5857,0,0,5859,0, +5861,0,0,5863,0,5865,0,0,0,5873,5875,0,0,0,5877,0,5879,0,0,0,5888,0,0,5889,5891, +0,5894,0,0,0,0,0,0,5895,0,5897,0,0,0,0,0,0,5907,0,5911,0,0,5912,0,5913,5922,5924 +,0,5927,5928,0,0,0,0,5929,5930,0,5933,0,0,0,0,5949,0,0,5951,0,0,0,0,0,0,0,0,5953 +,0,0,5954,0,5959,5960,5961,0,5964,0,0,0,5976,5978,5987,5990,0,0,0,0,0,5991,0, +5992,0,0,0,5994,5995,0,0,5996,0,0,6001,6003,0,0,0,0,6007,0,0,0,0,0,6008,0,0,6009 +,0,6010,0,0,0,6011,6015,0,6017,0,6019,0,6023,0,0,0,0,0,0,0,6025,0,0,0,0,0,0,0,0, +0,0,6026,0,6030,0,0,6032,0,0,0,6033,6038,6040,0,0,0,6041,6045,0,0,6046,0,0,6053, +0,0,6054,0,6055,0,0,0,0,0,0,6057,0,6063,0,0,0,6064,0,6066,6071,6072,0,0,0,0,0,0, +6075,6076,0,0,6077,0,0,0,0,0,0,0,0,0,6078,6079,0,0,0,0,0,0,0,0,6080,0,6083,0,0,0 +,0,0,6084,0,0,6088,0,6089,0,0,6093,6105,0,0,6107,0,6110,0,0,0,6111,6125,6126,0,0 +,0,6129,0,0,0,0,6130,0,0,0,6131,6134,0,0,0,0,0,0,6142,0,0,0,0,0,6144,0,0,6146, +6151,6153,0,6156,0,6163,0,6180,6181,0,0,0,0,0,6182,0,0,0,0,6184,6195,0,0,6206,0, +6208,0,0,6212,6213,6214,0,6215,0,0,0,6228,0,0,0,6234,0,0,0,0,0,0,6235,6240,0, +6242,6243,6244,0,6250,6255,0,0,0,0,0,6257,0,0,0,6258,6278,0,6284,0,0,0,6285,0,0, +0,0,0,0,0,0,6286,0,0,0,6320,0,0,6322,6332,0,0,0,0,0,0,0,0,6334,0,0,0,0,0,0,0, +6335,0,0,6337,0,6338,0,6339,6340,0,0,6356,6357,6369,0,0,0,6370,6371,6372,0,6373, +0,0,0,0,0,6376,0,0,0,0,0,6382,6383,6384,0,0,0,0,6386,0,6389,6397,6400,6411,0, +6414,0,0,0,0,0,0,0,6415,6416,0,0,0,0,0,0,6417,0,0,0,0,6418,0,0,0,0,0,0,0,6420,0, +6421,6423,6425,0,6429,6430,0,6433,6438,0,0,0,0,0,0,0,0,0,0,6439,6440,0,0,6441,0, +0,6444,0,0,0,0,6446,0,0,0,0,6447,6448,0,0,6450,0,0,0,6454,0,0,6455,0,6461,0,0,0, +0,0,0,6462,0,0,6463,0,6464,0,6465,6467,0,0,0,6468,0,6479,6480,0,0,0,0,0,0,0,6481 +,0,0,6485,6487,0,0,0,0,0,0,6493,0,0,0,0,0,0,0,0,6494,6495,6496,0,0,0,0,0,6498,0, +0,0,6507,6508,0,0,0,0,0,0,0,0,0,0,6511,6512,0,0,0,0,6513,0,0,0,6514,0,0,0,0,0, +6516,0,0,6517,6518,0,0,0,6519,6520,6521,0,6523,0,0,0,0,6524,6528,0,6530,0,0,6532 +,0,6578,0,0,0,6583,0,6584,0,0,0,6587,0,0,0,6590,0,6591,0,0,0,0,0,6592,0,0,0,0, +6593,6594,0,0,0,0,0,6599,6600,0,0,6601,6602,6604,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +6608,0,0,0,0,0,0,0,0,6610,6611,0,6615,0,6616,6618,6620,0,6637,0,0,0,0,6639,0,0,0 +,0,6641,0,6642,0,0,0,6647,0,6660,6663,0,6664,0,6666,6669,0,6675,6676,6677,0,0,0, +0,0,0,0,0,0,6678,0,0,0,6679,0,6680,0,0,0,0,0,0,0,6693,0,0,0,0,0,0,0,0,0,6704, +6705,6706,0,0,6711,6713,0,0,0,0,0,6716,0,0,0,6717,0,6719,6724,0,0,0,0,0,0,0,0, +6725,6726,0,0,0,0,0,6728,6729,6735,0,6737,6742,0,0,6743,6750,0,6751,0,0,6752, +6753,0,0,0,0,0,0,6754,0,0,0,0,0,6756,0,0,0,0,0,0,6763,0,0,6764,6765,0,0,0,6770,0 +,0,0,6776,6780,0,6781,0,0,0,6783,0,6784,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +6785,0,0,0,6792,0,0,0,6793,0,0,6802,0,0,0,0,0,6803,0,0,0,6804,0,0,0,6812,0,0, +6823,0,6824,6839,0,0,0,0,6852,0,0,6854,0,6856,6857,0,0,0,0,0,0,0,0,0,6867,0,6868 +,6870,6872,0,0,0,6873,6874,0,0,0,0,0,6875,0,0,6877,0,0,0,0,0,0,0,6878,0,0,0,6879 +,0,6880,0,0,0,0,0,0,0,0,0,0,6887,0,6888,6891,6893,0,6895,0,0,0,0,0,0,0,0,6899,0, +0,0,0,6901,0,0,0,0,6910,0,6911,0,0,6912,0,0,6913,6914,0,0,0,6915,0,0,0,6916,6919 +,0,0,0,0,0,0,6924,0,6925,0,0,0,6926,6927,6928,0,6929,0,6930,0,0,6931,6935,0,6936 +,0,0,0,0,6939,6940,6941,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6942,6948,6949,0,0,0,0,0,0 +,0,6952,6954,6963,6965,6966,0,0,6967,6968,0,0,0,0,0,0,0,0,0,6969,0,0,6970,6979,0 +,0,6980,0,0,6983,0,0,0,0,0,6984,0,0,0,0,0,0,0,6988,6990,6992,0,0,0,0,0,0,0,6995, +0,0,0,7012,0,0,0,0,0,0,0,0,0,7019,0,0,0,0,0,0,0,0,7021,0,0,7022,7023,7028,0,7030 +,7033,0,0,0,0,0,0,7038,0,0,0,0,0,0,0,0,0,0,7039,0,0,0,0,0,7046,0,7047,0,0,0,0,0, +0,0,0,0,0,0,7048,7052,0,0,0,0,0,7054,0,7060,0,0,0,0,7061,0,7065,0,0,0,0,7067, +7069,0,7070,7071,7072,0,0,7078,0,7080,7081,0,7083,0,0,0,7084,7087,7088,0,0,7090, +0,7093,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7107,0,0,7108,0,0,0,0,0,0,0,0,7110,0,7114,0 +,0,0,0,0,0,0,7115,0,7116,0,0,0,0,0,7117,0,0,7118,0,0,7124,0,7125,0,0,7126,0,0,0, +0,7128,0,0,0,0,0,7129,0,7130,0,7132,7133,0,0,7134,0,0,7139,0,7148,7150,0,0,0,0, +7152,0,0,0,7153,7156,7157,0,0,0,0,0,7158,0,0,0,0,0,0,0,0,0,0,7163,7165,7169,0, +7171,0,0,0,0,0,0,0,0,0,7172,0,7173,7181,0,0,0,0,0,7182,7185,0,0,0,0,7187,0,7201, +7204,0,0,0,0,0,7206,7207,0,0,0,0,7211,7216,0,7218,0,0,0,0,7226,7228,7230,7232, +7233,7235,7237,0,0,0,0,7238,7241,0,7242,0,0,7247,0,0,0,7266,0,0,0,0,0,0,0,7289,0 +,0,7290,7291,0,0,7292,0,7297,0,0,0,0,0,0,0,0,0,0,7300,0,7301,0,0,0,0,0,0,0,0,0,0 +,0,0,7302,0,0,0,0,7305,0,0,0,0,7307,0,7308,0,7310,0,7335,0,0,0,0,0,0,0,7337,0, +7343,7347,0,0,0,0,0,7348,0,7349,7350,7352,7354,0,0,0,0,7357,0,7358,7366,0,7367, +7368,0,0,7373,0,0,0,7374,0,0,0,0,0,0,0,7376,0,0,0,7377,0,0,0,0,0,7378,0,7379, +7380,0,0,0,0,0,7383,0,0,7386,0,0,0,0,7398,0,0,0,7399,7400,0,7401,0,0,0,0,0,0,0, +7402,0,0,0,0,0,7405,0,0,0,0,0,7406,0,0,0,0,0,0,0,0,7421,7427,7429,0,0,0,7435,0,0 +,7436,0,0,0,7437,0,0,0,0,0,0,7438,7443,0,7446,0,7448,0,0,0,0,0,0,0,0,0,0,7456,0, +0,0,0,0,7457,0,0,7461,0,0,0,0,0,7462,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7463,7466,7472, +0,7476,0,0,7490,0,7491,0,0,7493,0,0,0,7498,7499,0,0,7508,0,0,0,0,0,7512,0,0,0, +7513,7514,7516,0,0,0,0,7518,0,0,7519,7521,7522,0,0,0,7526,0,0,7529,0,0,7531,0, +7536,0,7538,0,7539,0,0,7541,7542,7546,0,0,0,0,0,7547,0,7548,0,0,0,0,0,7550,0,0, +7552,7553,0,0,0,0,0,0,0,0,0,0,7554,7563,0,7573,0,0,0,0,0,0,7574,7576,0,7578,7581 +,7583,0,0,0,7584,0,7587,0,0,0,0,0,7589,0,0,0,7594,0,0,7595,0,0,7600,7602,7610,0, +0,0,0,0,7612,0,7613,7614,0,0,7615,0,0,7616,0,7620,0,7621,7622,0,7623,0,0,0,0, +7626,0,0,0,0,7627,7629,7631,0,0,7633,0,0,0,0,0,7639,0,7640,7642,0,0,7643,0,0,0,0 +,7644,0,0,0,0,0,0,0,7645,0,0,0,0,0,7661,7662,7663,7665,0,7666,0,7667,0,7684,7688 +,7690,0,7691,0,0,0,0,0,0,7692,0,0,7700,0,7707,0,7708,0,7709,0,7721,0,0,0,7722,0, +7724,0,0,0,0,0,0,7729,7731,0,7732,0,7733,7735,0,0,0,0,0,0,0,7739,0,0,7741,7745,0 +,7748,0,0,0,7751,0,0,0,7752,0,0,0,0,0,0,0,7753,0,0,7756,0,7757,0,7759,0,7760,0,0 +,0,0,7761,7768,0,0,7769,0,0,7770,0,0,7771,0,0,7772,0,0,7773,0,0,0,0,0,7778,7783, +0,0,0,0,0,7784,7785,0,7790,0,0,0,0,7792,0,7798,0,0,0,0,0,7799,0,7810,0,0,7813,0, +7814,0,7816,0,7818,7824,7825,7826,0,7828,7830,0,0,0,7840,0,7842,0,7843,0,0,0,0, +7844,0,0,0,0,0,0,0,7846,0,0,0,0,0,7856,7857,7858,7862,0,7865,0,0,7866,0,0,7913,0 +,0,0,0,7914,0,0,7915,7917,7918,7919,0,7920,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7921, +7922,0,7924,0,0,7925,0,0,7927,0,7930,7935,0,0,7937,0,0,0,0,0,0,7939,0,7940,0,0,0 +,0,0,7941,0,0,0,0,7945,0,0,0,0,7949,0,0,0,0,0,0,0,0,7950,0,7953,0,0,0,0,0,0,0, +7968,0,0,0,0,7969,7972,7992,0,7993,0,0,0,0,0,0,0,0,0,0,0,7994,0,0,0,0,8007,8008, +0,0,0,0,0,0,0,0,0,0,0,0,8010,0,0,0,8012,0,0,0,0,0,0,0,0,8018,0,8028,8029,0,0, +8030,0,0,8032,8033,0,0,8034,8036,0,0,0,0,0,0,0,0,0,0,8037,0,0,0,8043,8052,8059, +8060,0,0,8061,0,0,0,8062,0,8063,0,8064,0,8066,8068,0,0,0,8080,8081,0,8089,0,0,0, +0,0,8092,0,0,0,0,0,0,8093,8110,0,0,0,0,0,0,0,8111,0,0,0,0,0,8112,8115,0,8117,0,0 +,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8120,8121,8122,8128,8129,8130,8131,0,0,8139,0,0, +8144,0,0,0,0,8145,8146,8153,0,0,0,0,0,0,0,0,8154,0,8157,8160,8162,0,8164,8165,0, +0,0,0,8166,8167,0,0,8179,0,0,0,8185,0,0,0,8186,0,0,8187,0,0,0,8188,0,0,0,0,0, +8204,0,0,0,0,8210,0,0,0,0,0,8213,0,8214,0,0,8215,0,0,0,0,0,0,8218,0,0,0,0,0,0,0, +0,0,8219,0,8221,0,0,8222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8225,0,0,0,8233,0,0, +8242,0,0,0,0,0,0,0,0,0,0,0,8247,0,8248,8252,0,8256,8257,0,0,8261,0,8264,8265,0,0 +,0,0,8267,0,0,0,8269,0,0,0,0,0,0,0,0,0,8270,0,0,0,8278,0,8279,8283,0,0,8285,8286 +,8289,8292,0,0,0,0,8293,8295,8299,8300,8301,0,0,0,0,0,0,8304,8307,0,0,0,0,0,0,0, +8321,0,0,0,8322,8323,8325,8326,8327,0,0,8332,8338,0,0,8340,0,0,0,0,0,8350,0,0, +8351,0,8354,8355,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8360,8372,0,0,0,0,0,0,0,0,8377,0,0, +0,0,8380,0,0,0,8383,0,8384,0,0,0,0,8386,8392,0,0,8394,0,0,0,0,0,0,0,8396,8397,0, +8398,0,8399,0,0,0,0,0,8400,0,8401,8410,8411,0,8412,8413,8422,0,0,0,0,8423,0,0,0, +0,8424,0,0,8425,0,0,0,0,0,0,0,8441,8442,0,0,0,0,0,0,8443,0,0,8444,0,8447,0,0,0,0 +,8451,0,8458,0,8462,0,0,8468,0,8469,0,0,0,8470,0,8473,8479,8480,0,0,0,0,8481, +8483,0,0,0,0,0,0,0,0,0,8484,0,0,8490,0,0,0,0,0,0,8491,8493,8494,0,8528,0,0,0,0,0 +,0,0,8530,0,0,0,0,0,0,0,0,8534,8538,8540,0,0,8541,0,0,8545,0,8557,0,0,8569,8570, +0,0,8571,8574,8575,8579,0,8583,0,0,0,0,8591,0,0,0,0,0,0,0,0,8606,0,8607,0,0,0,0, +0,0,0,0,0,8608,0,0,8609,0,0,0,8610,0,0,0,8611,0,0,8613,8617,8621,0,0,8622,0,8623 +,0,8624,8625,0,0,0,0,0,0,0,0,0,8637,8638,8639,8650,0,0,0,0,8652,8654,8655,0,0,0, +0,0,0,0,0,0,0,8656,0,0,0,0,0,8657,0,0,0,0,0,0,0,0,0,8658,0,0,8659,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,8660,0,0,0,0,0,0,8661,8663,8664,0,0,0,0,8665,0,8669,0, +0,0,0,0,0,0,8671,8674,0,8684,0,8686,0,0,0,8689,0,0,0,8690,0,8706,0,0,0,0,0,0,0,0 +,0,0,0,8710,0,8711,8713,8714,8724,8727,8728,8733,8736,0,8737,8739,0,0,0,0,8742, +8743,8745,8754,0,0,0,0,8756,0,0,0,0,0,0,8757,8760,0,0,0,0,0,8762,8763,8764,0, +8766,8769,8770,8773,0,8774,0,8779,0,0,0,0,8780,0,0,8781,0,0,8783,0,0,0,0,0,0,0,0 +,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8784,0,0,0,0,0,0,0,0,8785,0,0,0,0,8786,0,0,0,0,8788 +,8790,0,0,0,8803,0,8813,8814,0,0,0,0,0,8815,8816,0,0,0,0,8818,0,0,0,0,8822,8828, +8829,0,8831,0,0,0,0,8833,0,0,0,8834,0,0,0,8835,0,8836,0,0,0,8837,0,0,0,0,0,0, +8838,8839,0,0,0,0,0,0,0,0,0,0,0,8840,0,0,0,8841,0,8842,0,0,0,8846,0,0,0,0,0,0,0, +8847,0,8848,0,0,8864,0,0,8866,0,0,8870,8872,0,0,8873,8874,0,0,0,0,0,0,8875,0, +8876,0,0,0,0,8896,8900,0,0,0,0,8901,0,0,0,0,0,8904,0,8907,0,0,0,0,8911,8912,8913 +,0,0,0,8914,0,8915,0,0,0,0,0,0,0,0,0,0,0,0,8916,0,0,0,8929,0,0,0,0,0,0,0,0,0,0, +8930,0,8932,0,8943,0,0,0,8945,8947,0,0,0,0,8949,0,8950,0,8954,8957,0,0,8970,0,0, +0,0,8971,0,8996,0,0,0,0,8997,9000,0,0,0,0,9001,9002,0,9004,9009,9024,0,0,0,0,0,0 +,0,0,0,0,0,0,9027,9082,0,0,9083,9089,0,0,0,0,0,0,9090,0,0,0,9092,0,0,9093,0,9095 +,0,0,9096,9097,9101,9102,0,0,0,0,0,0,0,0,9112,0,0,0,0,0,0,9114,0,0,9120,0,9121, +9122,0,0,0,9123,9124,0,0,9125,0,0,9126,0,9127,0,0,9129,9131,0,0,0,9132,0,0,9136, +0,9144,0,0,9148,0,0,0,0,0,0,9149,0,9152,9163,0,0,9165,0,0,0,0,0,0,0,0,0,0,0,0,0, +9166,0,9169,0,0,0,0,0,0,0,9170,0,0,0,0,9172,0,9174,9175,9176,0,9177,0,0,0,0,0,0, +0,0,9186,0,9187,0,0,0,9188,9189,0,0,9190,0,0,0,0,9191,0,0,0,9193,0,0,0,0,9197, +9198,0,0,0,9208,9211,0,0,0,0,9216,9217,0,9220,0,0,0,0,9221,9222,9223,0,9224,9225 +,0,0,9227,0,9228,9229,0,0,9230,0,9232,0,9233,0,0,0,0,0,9234,9235,0,0,9237,0,0,0, +0,0,0,0,0,9238,9240,0,0,9241,0,0,0,0,9244,0,0,0,0,9247,0,0,0,0,0,0,0,0,0,0,9248, +0,0,0,9249,0,0,0,0,0,9250,0,0,0,0,9251,0,0,9252,9255,0,0,0,9256,0,0,0,0,0,0,0, +9257,0,0,9258,0,0,0,0,0,0,9259,0,0,0,0,0,9262,9263,0,0,9265,9266,0,0,0,0,0,0,0,0 +,9268,9271,0,0,0,0,0,0,0,0,0,9273,0,0,0,9276,9277,9279,0,0,0,0,0,0,0,9280,0,0, +9293,0,0,0,0,0,9297,9301,0,0,0,0,0,0,0,0,0,0,0,9308,9309,9313,9321,9322,0,9326, +9327,0,0,9477,0,9479,0,0,0,0,9482,0,0,0,9483,0,9484,0,0,0,0,0,0,0,0,0,9485,0,0, +9486,0,0,0,9489,0,0,0,0,9490,9491,0,0,0,0,9493,0,9495,9496,0,0,0,0,0,0,0,0,9500, +0,9502,0,0,0,0,0,9504,9507,0,9509,0,9511,0,0,9513,0,0,0,0,0,0,0,0,9515,0,0,0,0,0 +,0,9516,9517,0,0,0,0,9532,0,0,9533,0,0,9538,0,9539,9540,0,0,0,0,9541,0,0,0,9542, +0,0,0,0,0,0,0,0,9544,9545,0,9546,0,0,0,0,0,0,9547,9548,0,0,0,9550,0,9557,0,9558, +0,9561,0,9563,9570,0,9572,9574,9575,0,0,0,9577,9592,0,0,9596,0,0,0,9598,0,9600,0 +,9601,0,0,0,0,0,0,9608,0,9638,9639,0,0,0,0,0,0,0,9641,0,0,9643,9644,9645,9646,0, +0,0,9648,0,0,0,0,0,0,0,9650,9654,0,0,0,0,0,0,0,0,9655,0,0,0,0,0,9656,0,9657,0,0, +0,0,9658,0,0,9659,0,0,9664,0,0,9665,0,9667,9669,0,0,0,0,0,0,0,0,0,0,0,0,9671,0, +9673,9681,0,0,0,0,9682,9683,9684,0,0,0,0,9686,9698,0,0,9700,9701,9702,0,9703, +9717,0,0,0,0,9718,0,9726,0,0,0,0,9727,0,0,0,9728,0,9742,0,9744,0,0,0,9750,0,9754 +,9755,0,0,0,0,0,9756,0,9757,9768,0,9769,0,0,0,9770,9771,0,9773,0,9774,0,9775,0,0 +,0,9776,9777,9784,0,0,0,9786,0,9789,0,0,0,0,9793,9794,0,0,0,9808,0,0,0,0,0,9811, +0,0,0,0,0,0,0,0,0,0,0,0,9812,0,9820,0,9823,0,9828,0,0,0,0,9830,0,0,9833,9836,0,0 +,0,9840,0,0,0,9841,0,0,9842,0,9845,0,0,0,9847,9848,0,0,9855,0,0,0,0,0,0,9856, +9863,9865,0,0,0,0,0,0,0,0,9866,9867,9868,9873,9875,0,0,0,0,0,0,9880,0,9886,0,0,0 +,9887,0,0,9891,0,0,0,0,0,0,0,9906,9907,9908,0,0,0,9909,0,0,0,0,0,0,9910,0,0,0,0, +9913,0,0,0,0,9914,0,0,0,0,0,9922,0,0,0,0,9923,9925,0,0,0,0,0,0,9930,0,0,0,9931,0 +,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9932,0,9939,0,0,9940,9962,9966,0,9969,9970,0,0,9974 +,0,9979,9981,9982,0,0,0,9985,0,0,0,0,0,0,9987,0,0,0,0,0,0,0,9988,9993,0,0,9994,0 +,0,0,9997,0,10004,0,0,0,0,0,10007,10019,10020,10022,0,0,0,10031,0,0,0,0,0,10032, +0,0,10034,0,10036,0,0,0,0,10038,0,10039,10040,10041,10042,0,0,0,0,0,10043,0,0,0, +0,0,10045,10054,0,0,0,0,10055,0,0,10057,10058,0,0,0,0,0,0,10059,0,0,0,0,0,0,0, +10060,0,0,0,0,0,0,0,10063,0,10066,0,0,0,10070,0,10072,0,0,10076,10077,0,0,10084, +0,10087,10090,10091,0,0,0,10094,10097,0,0,0,0,0,0,10098,0,0,0,0,0,0,10103,0, +10104,0,10108,0,0,0,0,0,0,0,0,10120,0,0,0,10122,0,0,10125,0,0,0,0,10127,10128,0, +0,10134,0,10135,10136,0,10137,0,0,10147,0,10149,10150,0,0,10156,0,10158,10159, +10160,10168,0,0,10171,0,10173,0,0,0,10176,0,0,0,0,10177,0,0,0,0,10178,0,0,0,0, +10194,0,10202,0,0,10203,10204,0,10205,10206,0,10207,0,0,0,0,10209,0,0,0,0,0,0,0, +10213,0,0,0,0,0,0,10217,0,10229,0,10230,10231,0,0,10232,0,0,10237,10238,10244,0, +0,0,0,0,10250,0,10252,0,0,0,0,0,0,10255,0,0,10257,0,0,0,0,0,0,10258,0,10259,0,0, +0,0,0,0,0,0,10260,0,0,0,0,0,0,0,10284,10288,10289,0,0,0,10290,0,10296,0,0,0,0,0, +10297,0,0,0,0,0,0,10298,0,0,0,0,10299,10303,0,0,0,0,0,10306,0,0,0,10307,0,10308, +0,0,0,0,10311,0,0,0,0,0,0,0,10315,10317,0,0,0,10318,10319,0,10321,0,10326,0, +10328,0,0,0,0,10329,0,0,10331,0,10332,0,0,0,0,0,0,10334,0,0,10335,10338,0,0,0,0, +0,10339,10349,0,0,0,0,0,0,10351,0,10353,0,0,0,0,0,0,10362,0,10368,0,10369,0,0,0, +10372,10373,0,0,0,0,0,10374,0,0,0,10375,0,10376,0,0,10386,10388,10390,0,0,0,0,0, +0,0,10391,0,0,10392,10394,0,0,10396,0,10397,0,10403,0,0,0,0,0,0,0,0,10404,0, +10405,10410,0,0,10411,0,10412,0,0,0,0,0,0,0,10421,10422,10423,0,0,0,0,0,0,0,0,0, +10425,0,0,10427,0,0,10430,0,0,0,0,0,10432,0,10433,10434,0,0,0,0,10436,10437,0, +10438,0,10439,0,10444,10446,0,0,0,0,0,10448,0,0,0,0,0,10449,0,0,0,0,0,0,0,10451, +0,10453,0,0,0,10454,10457,0,0,10459,0,10469,0,0,0,0,0,10472,10481,0,0,0,0,0, +10482,10483,0,10492,0,0,0,0,0,0,0,0,0,0,10499,0,0,0,10502,0,0,10510,0,10521, +10524,0,0,10525,10526,10528,0,0,0,0,0,0,0,0,10530,0,0,0,0,10533,0,10534,0,0,0,0, +0,0,0,0,0,0,10535,10536,0,0,10544,0,10553,10556,0,10557,10559,0,0,0,0,0,10562, +10563,10564,0,10565,0,0,0,10566,0,10567,0,0,0,0,10575,0,0,10576,0,10578,0,0,0,0, +0,0,0,0,0,0,10585,10586,10587,10589,0,10590,0,0,10594,0,0,0,0,0,10598,0,0,10601, +0,0,0,10602,0,10603,0,10604,0,10605,0,0,10607,0,10626,0,10627,0,0,0,0,0,10629, +10630,10631,0,0,0,10646,0,0,0,10647,0,10650,0,10651,0,0,0,10652,10653,10655,0, +10658,0,0,10659,0,10667,0,0,0,0,10669,0,0,0,0,0,0,0,0,0,10670,0,0,0,10671,0,0,0, +0,10672,10673,0,10674,0,0,0,10676,0,0,0,0,0,0,10678,0,10682,0,0,10692,0,10697,0, +0,0,0,10698,0,0,0,10700,0,0,0,0,0,10703,0,10704,0,0,0,0,0,0,0,10705,0,10715, +10718,10720,0,0,10722,0,0,0,0,0,0,0,0,10723,0,0,0,0,10726,0,0,0,0,0,10727,10730, +10743,0,0,0,0,0,0,10744,0,0,10745,0,0,0,0,0,0,10748,0,0,0,0,10750,0,0,10752, +10753,0,0,0,10756,0,0,0,0,0,0,10758,0,0,0,10759,0,10769,0,0,10772,0,0,0,0,0,0, +10773,0,0,0,10777,0,0,10779,0,0,0,0,0,0,0,0,10780,10784,0,0,0,10789,0,0,0,10791, +0,0,0,0,0,0,0,0,0,10795,0,0,10796,0,10808,0,10809,0,0,0,10810,0,0,0,10812,0,0, +10814,0,0,0,0,0,0,0,0,0,10815,0,0,0,0,10816,10817,0,0,0,0,10819,0,10820,0,0,0,0, +10821,10822,10823,0,10826,10849,0,0,0,0,10850,0,0,10852,0,10853,0,0,10856,0,0, +10857,10858,10859,10860,0,0,0,0,0,0,10863,0,10866,10867,10872,10890,0,0,10891, +10892,0,0,0,0,0,10893,0,0,0,10896,10899,0,0,10900,10902,0,0,0,0,0,10903,0,0,0,0, +0,0,0,0,0,0,0,0,10905,0,10906,0,0,0,0,10908,10911,0,10912,0,0,10916,0,0,0,0,0, +10917,0,10918,0,0,0,10923,0,0,0,0,0,10924,0,0,10928,10929,0,0,10930,0,0,0,10932, +0,0,0,0,10939,0,0,10945,0,0,0,10947,0,0,10948,0,0,0,0,0,0,0,0,0,0,0,0,10958,0, +10960,10962,0,0,10964,0,0,0,10966,0,0,0,0,0,0,0,0,0,0,10967,0,0,0,10968,0,0,0, +10973,0,0,0,0,0,10975,0,0,0,10976,10978,0,0,10982,10984,10987,0,0,10988,0,10989, +0,0,10991,0,0,0,0,10992,0,0,0,10993,0,10995,0,0,0,10996,10997,0,0,0,10998,0, +10999,0,11001,0,0,0,0,0,0,11010,11012,0,11013,11016,11017,0,0,11019,11020,11021, +0,0,0,0,0,0,0,0,0,0,0,0,11022,0,0,11023,11029,0,0,0,0,11031,0,0,0,11034,0,0,0,0, +11055,0,0,0,0,0,11056,11060,0,0,0,0,0,0,11061,0,0,11064,11065,0,11066,0,11069,0, +11085,0,0,0,0,0,11086,0,0,0,11088,0,0,0,11094,0,0,0,11095,11096,0,0,0,0,0,0, +11097,11098,0,0,0,0,0,0,11099,0,0,11102,11108,0,0,0,11109,0,11114,11119,0,11131, +0,0,0,11142,0,0,11143,0,11146,0,11147,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11148,0, +11149,11152,11153,11154,0,11156,0,11157,0,0,0,11158,0,0,11159,11160,0,0,0,0,0,0, +0,0,0,0,0,0,11163,0,0,11164,11166,0,0,0,11172,11174,0,0,0,11176,0,0,0,0,0,11182, +11183,0,0,0,11184,11187,0,0,11188,11189,0,0,0,0,0,0,11194,0,0,0,0,0,0,0,11200, +11202,0,0,0,0,0,0,11203,0,11204,0,0,0,0,0,11205,0,0,0,11206,0,11207,0,0,11209,0, +11211,0,11214,0,0,11231,0,0,0,11293,11295,0,0,11296,11297,11302,0,0,0,11307,0,0, +0,0,11309,11310,0,11311,0,0,0,11313,0,11314,0,0,0,0,11334,0,11338,0,0,0,11339,0, +0,0,0,0,11340,0,11341,11342,0,11344,0,11345,0,0,0,11348,11349,0,0,11350,0,0,0, +11355,0,0,0,0,0,0,11356,0,11357,11370,0,0,11371,0,11374,11376,0,0,0,11377,0,0, +11378,11383,0,11386,11399,0,11400,11406,0,0,0,11408,0,0,11409,11412,0,0,0,0, +11417,0,0,0,11418,0,11421,0,11426,11429,0,0,0,0,0,11430,0,11437,0,11438,0,0,0,0, +0,11440,11453,0,0,0,0,0,0,11454,0,0,0,0,11455,0,0,11456,11460,11461,11463,0, +11469,0,11473,0,0,0,0,11474,0,0,0,11475,0,11476,11477,11480,0,0,0,0,11481,0,0, +11484,0,0,11487,0,0,0,0,0,0,0,0,0,0,11497,0,0,11502,0,11509,0,0,11510,11511, +11513,0,0,0,0,0,0,0,0,0,0,11515,0,0,0,0,11516,0,11520,11521,0,0,0,0,0,0,0,0,0,0, +0,11529,11530,11531,11534,0,0,11543,0,0,0,0,0,11547,0,11548,0,0,0,0,0,11552, +11556,0,11557,0,0,11559,0,11560,0,0,0,0,0,0,11561,0,0,11563,11564,0,11565,0,0,0, +0,11567,0,0,0,11569,0,11574,0,11575,0,0,0,11577,0,11578,0,0,0,11580,11581,0,0,0, +11582,11584,0,0,0,0,0,0,0,11587,0,11588,11591,0,11595,0,0,0,0,0,0,0,0,11596,0, +11597,0,0,0,0,11598,11601,0,0,0,11602,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11603, +11604,0,11606,0,0,11608,0,0,0,0,11610,0,0,11611,0,0,0,0,11613,0,11622,0,0,0, +11623,0,0,0,0,11625,0,0,11626,11627,11628,11630,0,0,0,0,0,0,11639,0,0,11646,0, +11648,11649,0,11650,0,0,0,0,0,0,0,0,0,11651,0,0,11652,11653,11656,0,0,11677, +11679,0,0,0,0,11680,0,0,11681,0,11685,0,0,0,0,0,0,0,0,11688,0,0,0,11716,0,11719, +0,0,0,0,0,11721,0,0,11724,11743,0,0,0,0,0,0,0,0,11745,11748,11750,0,0,0,0,0, +11751,0,0,0,11752,11754,0,11755,0,0,0,0,0,0,0,11759,0,0,0,0,0,0,11760,0,0,0, +11761,0,0,0,0,0,0,11766,11767,0,11772,11773,0,11774,0,0,11775,0,11777,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,11778,11780,0,0,0,0,0,0,0,11783,0,11784,0,0,0,11785, +0,0,0,11786,0,0,0,0,11788,0,0,11789,11791,11792,0,0,0,0,11795,11834,11835,11836, +0,0,11837,0,0,0,11838,0,0,11846,11851,0,11852,0,11869,0,0,0,11871,0,0,0,11872, +11874,0,0,0,0,0,0,11875,0,11876,11877,0,0,0,0,0,0,0,0,0,0,11883,0,0,0,0,0,0,0, +11884,0,11885,0,11886,0,0,11887,0,11894,11895,11897,11909,11910,0,11912,11918,0, +0,11920,0,11922,11924,11927,11928,0,0,0,0,11929,0,11934,0,0,0,0,0,11941,11943, +11944,0,11945,0,0,0,0,11948,11949,0,0,0,0,11953,0,11954,0,11955,0,11956,0,0,0,0, +0,11957,0,0,11959,0,0,0,0,0,0,0,0,11961,0,0,0,0,0,11978,0,0,0,11979,11980,11986, +11987,0,11992,0,0,0,0,0,11993,0,0,0,11994,0,11999,12004,12005,12006,0,0,0,0,0, +12011,0,0,12012,12014,0,0,12015,0,0,12019,12028,0,0,12029,0,0,12032,12033,0,0,0, +0,12034,0,12041,12043,0,0,12044,0,0,0,0,0,0,0,12046,0,0,0,0,0,0,0,12054,12055,0, +12056,0,0,0,12060,12064,0,0,0,0,0,12065,12067,12068,0,0,0,0,0,0,0,0,12074,0,0,0, +12075,12076,0,0,0,12079,0,12081,12086,12087,0,0,12088,0,0,0,0,12089,0,12092,0,0, +0,0,12097,0,0,0,0,0,0,0,0,12098,0,0,0,0,0,0,0,0,0,0,0,0,0,12102,12103,12104, +12111,0,0,12114,12116,0,0,0,12118,0,0,0,12119,12120,12128,0,0,0,0,12130,0,0,0,0, +0,0,12131,0,0,0,12132,12134,0,0,0,0,12137,0,12139,0,12141,0,0,12142,0,0,0,12144, +0,0,0,0,0,12145,0,12148,0,12153,0,0,0,0,12154,12171,12173,0,0,0,12175,0,0,0,0, +12178,0,0,0,0,0,0,0,12183,0,0,0,0,0,0,0,0,12184,0,0,0,12186,0,0,0,0,0,12187, +12188,0,0,12189,0,12196,0,12197,0,0,12198,0,12201,0,0,0,0,12203,0,12209,0,0,0,0, +12210,12211,12212,12213,0,12217,12218,0,0,0,0,0,0,0,0,0,12222,0,0,0,0,0,0,0, +12223,0,0,12229,0,0,0,0,12233,0,0,0,0,12234,0,0,12236,12242,0,0,0,12243,0,0,0, +12244,12253,0,12254,12256,0,12257,0,0,12275,0,0,0,0,0,12277,0,0,0,0,0,12278,0, +12289,0,0,12290,0,12292,12293,0,0,12294,0,12295,0,0,12296,0,12297,0,12298,0,0,0, +0,12301,0,0,0,0,0,0,0,0,0,0,0,0,0,12309,0,12338,12340,0,0,0,0,12341,0,0,0,0,0,0, +0,0,12342,12343,0,12344,0,0,0,0,0,0,0,0,0,12345,0,0,0,0,0,0,0,0,12346,0,0,0,0, +12348,0,0,0,0,0,0,0,0,0,0,0,0,12350,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12351,0,12355, +12356,12357,0,0,12367,12370,12371,0,0,0,0,0,12372,12376,0,0,0,0,0,0,0,0,12379,0, +12382,0,12383,0,0,12384,0,0,0,0,12393,0,0,12394,0,0,0,0,12398,12403,0,0,12404,0, +0,0,0,0,0,0,0,0,0,0,0,0,12410,0,0,0,12411,0,0,0,12412,0,0,0,0,12420,0,12421,0,0, +0,0,0,12423,0,12425,12429,0,0,0,12431,12432,0,0,0,0,0,0,0,0,0,0,0,0,12434,0,0,0, +0,0,12435,12436,0,0,0,0,0,0,0,0,12437,0,0,0,0,0,12438,0,0,0,0,0,0,0,0,12445,0,0, +0,12450,12451,0,0,0,0,0,0,0,0,12452,12475,0,0,12493,12494,0,0,0,12495,0,0,0,0, +12496,12502,12509,0,0,0,0,12510,0,12512,12513,0,0,0,0,12514,0,0,0,12515,0,12520, +0,0,0,12524,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12527,0,0,0,12528,0,0,0,12529,0,0,0, +0,0,12530,0,12535,0,0,12536,0,12538,0,0,0,0,0,0,0,0,0,0,0,0,12540,0,12548,0,0,0, +0,0,12550,0,0,0,12551,12552,0,0,0,12554,0,0,0,0,0,0,0,0,12555,0,0,12562,0,12565, +0,12566,0,0,0,0,0,0,0,0,0,0,0,0,12569,0,0,0,12571,12574,0,0,0,0,0,0,0,12577,0,0, +0,0,0,0,0,12578,12579,12603,0,12608,0,0,12611,0,12612,0,12615,0,12625,0,0,0,0, +12627,12646,0,12648,0,0,12657,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12670,0,0,12671,0, +12673,12677,0,0,0,0,0,0,0,0,0,0,0,12679,0,12681,0,12682,12693,0,12694,0,12697,0, +12701,0,0,0,12703,12704,0,0,0,0,12707,12737,0,0,12739,0,0,12740,0,0,12742,12743, +0,0,0,0,0,0,0,0,0,12745,0,12746,12747,0,12748,0,0,12759,12767,0,0,0,0,12773,0, +12774,12778,0,0,0,0,0,0,0,12779,0,0,0,0,0,12780,12793,0,12824,0,12825,0,12836,0, +0,0,0,12839,0,12842,0,0,0,0,0,0,0,0,0,0,0,0,12843,12845,0,12846,0,0,0,0,12847,0, +0,12850,12852,12853,0,0,0,12854,0,0,0,12855,0,12856,0,12858,0,0,12859,0,12862,0, +12863,0,0,12866,0,12869,12872,12873,0,0,0,0,0,0,0,0,0,12875,0,12877,0,0,12878,0, +0,0,0,0,0,0,0,0,12884,12885,12888,0,12889,0,0,0,0,12893,0,0,0,12895,12896,12898, +0,0,0,0,0,0,0,12902,0,12909,12910,0,12926,0,12928,0,0,0,12929,0,12930,0,0,0,0, +12931,0,12932,12933,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12934,0,12942,0,0,0,0,12944, +0,0,0,0,0,0,0,0,12946,0,0,12948,0,0,12949,0,0,0,0,12950,0,0,0,0,12951,0,12952,0, +12953,0,0,0,12954,12958,12959,0,0,0,0,0,12960,12964,0,0,0,0,0,12966,0,0,0,0,0,0, +0,0,12970,0,12971,0,0,0,0,0,0,12972,0,0,12982,0,0,0,12984,12985,0,12986,12996, +12997,13001,13002,0,0,0,0,13004,0,0,13005,0,0,13007,13009,0,13017,0,0,0,13020,0, +13021,0,0,0,0,0,0,0,0,0,0,13022,0,0,0,0,0,0,0,0,13024,13027,0,0,0,0,0,13028,0,0, +13029,0,0,0,0,0,0,0,13032,0,13037,0,0,0,0,0,0,13040,0,0,13041,0,0,0,13043,13044, +13046,0,0,0,0,13047,0,0,0,0,0,0,0,13049,13054,0,13056,0,0,13060,13061,0,0,0,0,0, +13067,0,0,13068,0,13071,0,0,0,0,0,13077,13078,0,0,0,0,0,13079,13080,13081,0, +13082,0,0,0,13085,0,0,0,0,0,0,0,13086,0,13087,13088,0,0,0,0,0,13094,0,13099,0, +13100,0,0,0,13101,0,13125,13126,13128,13129,0,0,13130,0,13131,0,0,0,0,0,0,13134, +0,0,0,0,0,0,0,0,0,0,0,13150,0,13168,0,0,0,0,0,0,0,0,0,13169,0,0,13170,0,0,0,0, +13174,0,0,0,13176,0,0,0,0,0,13177,0,13178,13183,13187,0,0,0,13189,0,0,13190,0,0, +13191,0,0,13206,0,0,0,13207,0,0,0,0,0,0,0,0,0,0,13212,0,0,13219,13232,0,0,0, +13241,0,13249,13253,0,0,0,0,0,13255,13259,0,13260,13261,0,13262,0,13272,0,0,0,0, +13276,0,0,0,0,13277,13299,0,0,13301,13302,0,0,13303,0,0,13305,0,13310,0,0,0, +13311,0,0,0,0,13325,0,13328,0,0,0,13329,0,0,0,0,0,0,13330,0,0,13331,0,13335,0,0, +13342,0,0,0,0,0,13343,0,13354,0,13362,0,13366,13367,13369,0,0,13371,13372,0, +13373,13374,0,13376,0,13380,13381,13386,0,13387,13388,0,13389,13391,13395,0,0,0, +0,0,13401,13409,0,13410,0,0,0,0,13420,0,0,0,0,0,13422,0,0,0,0,13423,0,0,0,0, +13425,0,0,0,0,0,13427,0,0,0,13428,0,0,13430,13438,0,13439,0,13445,0,13448,13449, +0,0,0,0,0,0,13451,0,13457,0,0,0,0,13458,13459,0,13460,0,0,0,0,13464,13465,13466, +13470,0,13471,13472,13474,13475,0,13476,0,0,13478,13479,0,13481,0,0,0,0,13487,0, +13490,0,13493,0,0,13494,0,0,13495,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13496,13497,0, +13500,0,0,13516,13522,0,0,13525,13528,0,0,0,13530,13535,0,13537,13539,0,13540,0, +13543,0,13544,0,0,0,0,0,0,13545,0,0,0,0,0,0,13547,0,0,0,13549,13555,0,0,0,13556, +13557,0,0,0,0,0,0,0,13558,0,13563,0,0,0,0,13564,0,0,0,0,0,0,0,0,13566,0,0,0,0,0, +0,13569,0,0,13571,0,0,0,0,13573,0,0,0,0,0,0,13578,0,0,0,0,0,0,0,0,0,0,13581,0, +13586,0,13595,0,13600,0,0,0,0,0,0,0,0,13601,13603,0,13604,13605,13606,13607,0,0, +13617,13618,0,0,0,0,0,0,0,13623,0,13625,13627,0,0,0,0,0,0,0,0,13629,0,0,0,13634, +0,0,0,13638,0,0,0,0,0,0,0,0,13654,0,0,0,0,0,0,0,0,0,0,13656,0,13659,0,0,13660,0, +0,13662,0,0,0,13663,0,13664,0,0,0,0,0,13668,0,13669,13671,0,0,13672,0,0,0,0,0,0, +13675,13685,0,13686,0,0,0,13687,0,0,0,13692,13694,13697,0,0,0,13702,0,0,0,0,0, +13705,0,0,0,0,13707,0,0,0,13714,0,0,0,0,0,0,0,0,0,13715,0,13716,13717,0,0,13719, +13724,13730,13731,0,0,0,0,0,0,0,0,13732,0,0,0,0,0,0,0,13734,0,13736,0,0,13737, +13738,13747,0,13751,0,0,13752,0,0,0,13753,0,13757,0,0,13762,13763,0,13764,13765, +0,13766,0,0,13767,0,0,0,13768,0,0,0,0,0,0,0,13769,0,0,13772,0,13775,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,13776,13778,13787,0,0,0,13797,0,13798,0,13801,0,13804, +13806,0,0,0,0,13816,13817,0,0,0,0,0,0,0,0,0,0,0,0,0,13834,0,13836,0,0,13838,0,0, +13839,0,13840,0,0,0,0,13842,0,0,0,0,0,0,13843,0,0,0,0,0,0,0,0,0,13845,0,0,0,0,0, +13858,0,0,13860,0,0,13861,0,0,13862,13863,0,13868,0,13869,13870,0,0,0,0,0,0,0,0, +0,0,13872,0,0,0,0,13873,13878,0,0,0,0,0,0,0,0,0,0,13886,0,13888,13889,13890,0,0, +13891,13894,0,13897,13899,13900,13904,0,0,13906,0,0,0,13909,0,0,0,13910,0,0,0, +13911,0,0,0,0,0,13912,13917,0,0,0,0,13918,0,13919,0,0,13920,0,0,0,13921,0,0, +13922,0,0,0,0,0,0,0,13924,0,13927,0,0,0,0,0,13932,0,13933,0,13934,0,0,13935,0, +13944,0,0,0,13954,0,0,13955,0,0,0,0,13956,0,13957,0,13967,13969,0,0,0,0,0,0,0,0, +0,0,0,0,13970,13990,0,13991,13994,0,13995,0,0,0,0,13996,0,0,13999,0,0,0,14018,0, +14019,0,14021,0,0,0,0,0,0,14041,0,0,0,0,0,0,0,0,14043,0,0,0,0,14046,0,0,0,14048, +14049,0,0,0,0,0,0,0,0,0,0,14051,0,0,14052,14056,0,14063,0,14064,14066,0,0,14067, +0,0,0,0,0,0,0,0,0,14068,0,0,0,14072,0,14074,14075,0,14076,14079,14085,14086, +14087,14093,0,0,0,0,14095,0,0,0,0,0,0,14096,14097,0,0,0,0,0,0,0,14098,0,14102,0, +0,0,0,0,14103,0,0,0,14104,0,0,14105,0,0,0,14107,14108,0,0,14109,0,0,0,0,0,0,0,0, +14117,0,0,0,0,14118,0,0,0,0,14119,0,0,14120,0,0,14121,0,14122,14127,0,14128, +14136,0,0,14138,0,14140,0,0,0,14141,14142,0,0,0,0,14146,0,0,14149,0,14151,0,0,0, +14152,0,0,14153,0,0,0,0,0,0,0,0,0,14154,0,14156,14157,0,0,14159,0,14161,0,0,0,0, +14162,0,0,0,0,0,0,14163,0,0,14173,0,0,0,0,0,0,14174,0,0,14176,0,0,14178,0,0, +14179,14181,0,0,14182,14185,14187,0,14190,0,0,14197,0,0,0,0,0,0,0,0,0,0,0,0, +14198,0,0,0,0,0,0,14199,14200,0,0,0,14204,0,0,14208,0,0,0,0,0,0,0,0,0,0,0,14231, +0,0,0,0,0,0,0,0,0,14234,0,0,14235,0,0,0,14240,14241,0,0,0,14246,0,0,0,14247,0, +14250,0,0,14251,0,0,14254,0,0,14256,0,0,0,14260,0,14261,0,0,0,0,14262,14267, +14269,0,0,14277,0,0,14278,0,14279,14282,0,0,0,14283,0,0,0,14284,14285,0,0,0,0, +14286,0,0,0,14288,0,0,0,14289,0,14290,0,14293,14301,14302,14304,14305,0,14307,0, +14308,14309,0,0,0,0,0,0,0,0,0,0,0,14311,14312,0,0,14317,0,0,0,0,0,0,0,14318,0,0, +0,0,14320,0,0,0,0,14321,14322,0,0,0,0,0,14326,14329,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +14330,14331,0,0,0,0,14332,0,0,0,14333,0,0,14337,14340,0,14341,0,0,14342,0,14345, +14346,0,0,14347,0,14362,0,0,0,0,0,14364,14365,14371,0,14373,0,0,14374,0,14379,0, +14400,0,0,0,0,0,14401,0,0,14405,0,14406,0,14408,14409,0,0,0,14417,0,0,14424,0,0, +0,0,0,0,0,0,0,14430,0,0,0,14431,0,0,14435,0,14440,0,0,0,0,0,0,14442,0,0,14443,0, +0,0,0,0,14446,0,0,0,0,0,0,0,14454,0,14457,0,14460,0,0,14466,0,0,0,0,0,14467,0,0, +0,0,0,0,14469,0,14477,0,0,0,0,0,0,14478,14482,0,0,0,14483,0,0,0,14485,14486,0,0, +0,14487,14488,14489,14492,14493,14494,14495,14496,14497,0,14499,0,14501,0,0,0,0, +0,0,0,0,0,0,14502,0,14507,14512,14513,14514,0,0,0,0,0,0,0,0,0,0,0,14515,14526, +14530,0,14537,0,14544,0,14547,0,0,14548,14550,14551,0,0,14552,0,0,0,14553,0, +14554,0,0,0,0,14556,14564,0,0,14565,14566,0,0,0,0,0,0,14568,0,0,14569,0,0,0, +14571,14576,0,0,14577,14578,14579,0,0,14580,0,0,0,0,14582,0,0,0,0,0,0,0,0,0,0,0, +0,14583,0,0,0,0,0,14587,0,14588,0,0,14600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,14601,0,0,14604,14605,14611,0,14613,0,0,0,0,14615,0,0,0,0,0,0,14627,0,14628,0, +0,0,0,14631,0,14633,14634,0,0,0,0,14635,0,0,0,0,0,0,0,0,14636,0,0,14639,14642,0, +0,0,0,14644,0,0,0,0,14645,14646,0,14653,0,0,14654,0,14658,0,14661,0,0,0,14665,0, +0,0,14668,0,0,0,0,0,0,0,0,0,14669,0,0,14670,0,0,0,14680,0,0,14681,0,0,0,0,0, +14682,14683,0,0,0,0,14686,0,0,0,0,14687,14697,0,0,0,0,14699,14705,14711,0,0,0,0, +0,0,0,0,0,0,14712,0,0,0,14713,0,0,0,0,14719,0,14720,14721,14726,0,0,0,14728, +14729,0,0,0,0,14731,0,0,0,0,0,0,0,14733,14736,14737,0,0,14740,14742,0,0,0,14744, +14753,0,0,0,0,14755,14758,14760,0,0,0,0,0,14761,14762,14765,14771,0,14772,0, +14773,14774,0,0,14775,0,0,14776,0,0,0,0,14777,0,14779,0,0,14782,0,0,14785,14786, +14788,0,0,0,0,0,14795,0,0,0,0,0,0,14798,0,14803,14804,14806,0,0,0,14809,0,0,0,0, +0,0,14810,0,0,0,0,14811,0,14812,0,0,0,0,0,14815,0,0,0,0,0,0,0,0,14816,0,14818,0, +0,0,0,0,0,14819,0,14820,0,14823,0,0,0,14824,0,0,14826,14827,0,0,0,0,0,0,0,0,0,0, +0,0,14830,0,0,0,0,0,14833,0,14845,0,0,0,0,0,14846,0,0,14847,14871,0,14873,0, +14876,0,14877,14878,14880,0,0,0,0,0,14881,0,14882,14894,0,0,0,0,14895,0,14907,0, +14908,0,0,0,0,0,0,0,14911,0,0,0,0,14920,0,0,14931,0,14932,14934,14935,0,0,14936, +0,14945,0,0,0,0,0,0,0,14947,0,0,14948,14949,14951,0,0,14952,0,0,0,14964,14973,0, +0,14990,0,0,0,0,14995,0,0,14998,15001,0,0,15002,15020,0,0,0,0,0,0,15021,0,15022, +0,0,0,0,15023,0,0,15025,15029,15033,0,0,0,15034,0,0,0,15035,0,0,0,0,0,15043, +15044,0,0,0,15045,15046,15048,15050,0,15065,0,0,0,0,15066,0,0,15075,15082,15084, +0,0,15085,15086,0,0,0,0,0,0,0,0,15088,0,0,0,15089,0,0,0,0,15094,0,15096,0,15097, +0,15100,0,0,15102,0,0,0,0,0,0,0,0,15105,0,0,15106,0,15109,15113,0,0,0,15115,0, +15118,0,0,0,0,0,0,15119,0,0,15120,0,0,0,0,0,15123,15129,0,0,0,15130,0,15131,0,0, +15134,0,15135,0,0,0,15137,15138,0,0,0,0,0,0,15139,0,0,0,0,0,15140,0,0,15154, +15162,0,15169,15170,0,15175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15177,0,15178,15179,0, +0,0,0,0,15183,0,0,0,0,0,0,0,0,0,0,0,0,15185,15187,0,15194,15195,15196,0,0,0,0,0, +0,0,15204,0,0,0,0,15206,0,0,0,0,0,15207,0,0,0,0,0,0,0,0,0,15213,0,15214,0,0,0,0, +0,0,0,15232,0,0,0,0,15234,0,15238,15240,0,15248,0,0,0,0,15250,15251,0,0,0,0,0,0, +0,15252,0,0,0,15255,15262,15266,0,0,0,15267,0,0,0,15277,15279,0,0,0,15280,15281, +15282,0,0,0,0,0,15285,0,0,0,0,15289,0,0,15291,0,0,0,0,0,0,0,15296,15297,0,0, +15304,0,0,0,0,15306,0,0,0,0,0,0,15307,15308,0,15309,0,0,15311,0,0,15312,15313,0, +0,0,0,0,0,0,0,0,0,0,0,15314,15317,0,0,0,15318,15319,0,0,0,0,15320,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,15321,0,0,0,0,0,15324,0,15325,15326,0,15330,0,0,0,0,15334,0, +15335,0,15341,0,0,15342,0,0,15343,15344,0,0,0,0,15345,0,0,0,0,15347,0,0,15348, +15349,15350,0,15356,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15357,0,15358,0,0,0,0,0,0,0, +15359,15360,15364,0,15380,0,0,0,0,0,15392,0,0,15393,0,15395,0,0,0,0,0,0,0,0, +15396,0,0,15397,15398,0,0,0,0,0,0,0,0,0,15399,0,15400,0,0,0,15402,0,15405,15410, +0,0,0,0,15411,0,0,0,15412,0,15416,0,0,0,0,0,0,0,15428,0,15435,0,0,15438,0,0,0,0, +15439,0,0,0,15440,0,0,0,15441,15449,15451,0,0,0,0,0,0,0,15452,0,0,15455,0,0,0, +15456,0,0,15458,0,15460,15461,0,0,0,0,0,15462,15464,0,15465,0,0,15466,0,0,15467, +0,0,0,0,0,15468,0,0,0,0,15481,0,0,15484,0,15485,15486,0,0,0,15487,0,0,0,0,0, +15488,0,15492,15498,0,0,0,15499,0,0,0,15500,0,15501,0,0,15512,0,15522,0,0,0, +15524,0,15525,15526,0,0,15527,0,0,15545,15546,0,15548,15552,0,15553,0,0,0,15554, +0,15555,0,15557,15565,15573,15577,15578,0,15582,0,15583,0,0,0,0,0,0,0,0,0,0,0,0, +0,15586,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15588,0,0,0,0,0,15589,0,0,0,0,0,0,0,15593, +15594,0,0,0,0,15595,0,0,0,0,0,0,15596,0,0,0,15597,0,0,0,0,15600,0,0,15601,0,0,0, +0,15602,15603,0,0,0,0,0,0,15604,0,15609,0,0,15612,0,0,15613,0,0,15615,15617, +15618,0,0,15620,0,15636,15637,0,0,15649,0,0,0,0,0,0,0,15650,0,0,15651,0,0,0, +15656,0,15658,0,0,0,15664,0,0,15665,0,0,15668,0,0,0,0,0,15669,0,0,15674,0,0, +15675,0,0,0,0,15676,0,0,0,0,0,0,0,0,0,0,0,15677,0,0,0,0,15678,0,0,0,0,0,15679,0, +0,15681,0,15686,0,0,0,0,15687,0,15688,0,0,15690,0,0,0,15697,0,15699,15700,0,0,0, +0,0,0,0,0,0,15701,0,15702,15703,0,15704,0,15705,0,15707,0,15709,0,15712,15716,0, +15717,0,15718,15720,0,0,0,0,0,15724,0,0,0,15725,0,15726,0,0,0,15740,0,15745, +15746,0,0,15747,0,15748,0,0,0,0,0,15749,0,0,0,15752,0,15753,0,0,0,0,0,0,15759,0, +0,0,15765,0,0,0,0,0,0,0,0,0,15767,0,0,0,15771,0,0,15784,0,0,0,0,15785,15790, +15791,0,0,15792,0,0,0,15807,0,15811,0,0,0,0,0,0,0,0,0,0,0,0,15818,0,0,0,15819,0, +0,0,0,15821,0,0,0,0,0,15822,15824,0,0,15827,0,0,15829,15831,0,15832,0,0,15833,0, +15835,15838,15839,15843,0,0,0,0,0,0,0,0,0,0,0,15844,0,0,0,0,15845,15851,15856,0, +0,0,0,0,0,0,15858,15860,0,15861,0,0,0,15864,0,0,0,0,15865,0,0,0,0,0,0,15866,0, +15872,0,0,15876,0,0,0,0,15877,15878,15883,15885,0,0,15888,0,0,0,0,0,15889,15890, +0,0,0,0,0,0,0,0,15892,0,0,0,0,0,0,0,15893,0,0,15894,0,0,0,15895,0,15896,15897,0, +15898,15901,15902,0,15911,15915,0,15916,0,15924,15935,0,15937,0,0,0,0,0,15950,0, +0,0,0,0,0,0,15958,0,0,0,15961,0,0,15966,0,15967,0,0,15977,0,0,15978,0,0,15981, +15982,15983,0,0,0,0,0,0,0,15986,0,0,0,15990,0,15991,15995,15998,0,15999,0,16000, +0,0,0,0,16008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16009,16011,0,16013,0,0,0,0, +0,0,0,0,16014,0,0,16015,16023,16024,16025,0,0,16026,0,16030,0,16032,0,16033,0,0, +0,0,0,0,16035,16036,16037,0,0,0,0,0,16039,0,0,0,0,16041,0,0,0,0,0,16043,16044,0, +0,16047,0,0,0,16048,0,0,16049,16050,16052,0,0,0,0,0,16055,0,0,0,0,0,0,0,0,16056, +0,0,0,0,0,0,0,16058,16060,16061,0,0,16063,0,0,16064,0,0,0,16067,16068,0,0,16069, +16078,0,0,0,16079,0,0,0,16080,0,16081,0,0,0,16088,0,0,0,0,0,0,0,0,0,0,0,16089, +16093,0,16097,0,16103,0,16104,16105,0,0,16256,0,0,16259,0,0,0,0,0,0,0,16260, +16261,0,0,16262,0,0,16263,0,16268,0,0,0,0,0,0,0,16269,0,0,16270,16273,0,16274,0, +0,0,0,16275,16276,16277,16280,0,0,0,16281,16284,0,0,0,16286,0,16289,0,0,0,0,0,0, +0,0,0,16290,0,0,0,0,16291,0,0,0,0,0,0,0,16292,0,0,0,0,0,0,0,0,16293,16295,16297, +0,16302,0,16304,0,16305,0,16306,0,0,0,0,0,0,0,0,0,0,0,0,16307,16308,16312,0,0,0, +0,0,0,16313,16315,0,16318,0,0,0,16321,0,0,0,0,0,0,0,16326,16333,16336,0,0,0,0, +16337,16340,0,0,0,0,0,16345,0,0,16346,0,0,0,0,0,0,0,0,0,16347,0,0,16348,0,0,0,0, +16349,0,0,0,16350,0,16357,0,0,0,0,16359,16360,0,0,0,0,16362,16363,16364,16365,0, +0,16366,0,0,0,0,16367,16368,0,16369,16374,0,0,0,0,0,0,0,16376,0,0,0,0,16378, +16379,0,16380,0,0,0,16381,16383,0,0,0,0,0,16390,0,0,0,16399,0,16402,16404,16406, +16407,0,0,0,16409,16411,0,0,0,0,16412,0,16413,16415,16423,0,0,0,0,0,16424,0,0,0, +16428,16434,16435,16449,0,16450,16451,0,0,0,16453,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +16454,0,0,16456,16458,0,0,16459,0,0,16460,0,0,0,0,16462,0,16463,0,0,16466,0,0,0, +0,0,16479,0,0,16480,0,16481,16484,0,0,0,0,0,0,0,0,0,0,16485,0,0,0,0,0,0,16489,0, +0,0,0,0,16491,0,0,16498,0,0,16503,0,16505,0,0,0,0,0,0,0,0,16506,0,0,0,16508, +16509,0,0,0,0,0,0,0,0,16511,16513,0,0,0,16516,0,16517,0,16519,0,16529,0,0,16531, +0,0,0,0,0,0,16534,0,0,16541,16542,0,0,0,0,0,0,0,0,0,16543,16547,16548,0,0,0, +16551,0,16552,0,0,0,16553,0,0,16558,0,0,16562,16565,0,0,0,16570,0,0,0,16573, +16585,0,0,0,16586,16587,16595,0,16596,0,16598,0,0,0,16600,0,0,0,0,0,0,0,0,0,0,0, +0,0,16601,0,0,0,0,16603,0,0,0,0,0,0,0,16604,16612,0,0,0,0,16613,0,16618,0,0,0, +16640,0,0,16641,0,0,0,0,0,0,16645,0,0,0,0,16646,0,0,0,0,0,0,16651,0,0,0,0,16653, +16654,0,0,0,16655,0,0,16656,16667,0,0,0,0,16671,0,16672,0,0,0,16673,0,0,0,0,0, +16676,0,16686,0,0,0,0,16689,0,16690,0,16692,0,16693,0,16694,0,16696,0,0,0,16705, +0,0,0,0,0,0,16707,0,0,0,16709,0,0,0,0,16711,0,16712,16713,0,0,0,16715,0,0,0,0, +16716,0,0,0,0,0,0,0,0,0,16718,16724,0,0,16726,16727,0,0,0,0,0,0,0,16728,0,16729, +0,0,16730,0,0,0,0,0,16731,0,0,0,16732,0,0,0,0,16734,16738,0,0,0,0,0,0,0,0,16743, +0,0,16745,0,0,0,0,0,16749,0,16752,0,0,0,0,16756,0,0,16758,0,16759,0,0,0,0,0, +16760,0,0,0,0,0,0,0,16762,0,16769,0,16770,0,16772,0,0,0,16777,16780,0,0,0,0,0,0, +16781,0,0,16782,0,16784,0,0,16785,16787,16792,0,0,16794,0,0,0,16798,0,0,16809,0, +0,16814,16816,16817,0,16819,0,0,0,0,0,0,0,0,0,0,16820,0,0,16836,16839,0,0,16841, +16851,16857,0,0,16858,16859,0,0,16860,0,0,0,0,0,0,0,0,16862,0,16863,0,0,0,0,0,0, +0,16864,0,0,0,0,0,0,0,16876,0,16881,16882,0,16885,16886,0,16887,0,0,0,16889, +16891,0,0,0,0,0,16894,16895,0,0,0,0,0,0,0,0,0,0,0,16897,0,16898,0,0,0,0,0,16913, +0,0,16924,16925,16926,0,0,16927,0,0,0,16937,16938,0,0,0,16940,16941,0,0,0,16942, +16945,0,16946,16949,16950,0,0,0,16952,16955,0,0,0,16965,0,16969,0,0,16975,0,0, +16976,0,0,0,0,16978,0,0,16981,0,16983,16989,0,0,0,0,16990,0,0,16991,0,0,0,16993, +0,16994,16996,17000,0,0,0,0,0,17002,17004,0,17006,0,0,17007,0,0,0,0,17008,17013, +17014,0,0,0,0,0,0,0,0,0,17021,0,17031,0,0,0,0,0,17033,17036,0,17038,0,0,17039,0, +17045,0,0,17046,17047,0,0,0,0,17048,0,17049,17050,0,17051,17053,0,17054,0,17055, +0,0,0,0,0,17063,0,0,17064,0,0,0,0,0,0,0,17065,0,0,17068,0,0,0,0,0,17072,0,0,0,0, +0,0,17073,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17074,0,17080,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,17081,17083,17084,0,0,0,17085,0,0,0,0,17092,0,0,0,0,0,0,0, +0,0,17093,0,17095,17102,0,0,0,0,0,0,17103,0,0,17105,0,17107,0,0,0,0,17114,0,0,0, +0,0,17115,17125,17127,0,0,17128,0,0,0,17129,17130,0,17131,0,0,0,0,0,17132,17135, +17145,0,0,0,0,0,0,0,0,17146,0,17147,0,17148,0,0,0,0,0,0,17149,17150,0,17151, +17153,0,17155,0,0,0,0,17163,17171,0,17174,0,0,0,0,17179,0,0,17182,17185,0,0,0,0, +0,17186,0,0,17188,0,0,0,0,0,0,0,17189,17191,0,17194,0,0,0,0,0,0,0,0,0,17195, +17196,17203,17204,0,0,17205,17217,0,0,0,0,0,17218,0,0,0,0,17219,0,17220,0,17221, +0,0,17230,0,0,0,0,0,17236,0,17238,17239,0,0,0,17241,17244,0,0,17245,0,17248,0,0, +17251,0,17252,0,0,17264,0,17266,0,0,0,17268,0,0,0,0,17271,17272,0,17273,0,17295, +0,17302,0,17305,0,0,0,17306,0,0,0,0,0,0,0,17308,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +17309,0,17310,17313,0,0,0,0,17314,17315,0,17317,0,0,0,0,17318,0,0,0,0,0,0,0, +17320,0,0,0,0,0,0,17334,0,17344,17348,0,0,0,17350,17351,0,0,17353,0,0,17354,0,0, +0,0,0,0,0,0,0,17355,0,0,0,0,0,0,17356,17357,0,0,17359,0,0,0,17371,0,17372,0,0,0, +17393,0,0,0,0,17394,0,0,0,0,0,17395,0,0,17399,0,0,0,17401,17417,0,17418,0,17419, +0,0,0,0,0,17422,17423,0,0,0,0,0,17424,0,0,0,0,0,17428,17429,17433,0,0,0,17437,0, +0,17441,0,0,17442,0,0,17453,0,0,0,0,0,0,0,0,17454,17456,17462,0,0,17466,0,0, +17468,0,0,17469,0,0,0,0,17470,0,17475,0,0,0,0,0,17479,0,0,0,17483,17484,0,17485, +0,17486,0,17491,17492,0,0,17493,0,17494,17495,0,0,0,17496,0,0,0,17497,0,0,0, +17502,0,0,0,0,0,17503,0,17505,0,17507,0,0,0,17512,17513,17514,0,0,17515,0,0,0, +17519,0,0,0,17522,0,0,17523,0,0,0,0,0,0,0,0,0,17527,0,0,0,17528,0,0,0,17534,0,0, +0,0,17536,0,0,0,17539,0,17540,17543,17549,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17556, +0,0,17558,0,17559,0,0,17560,0,0,0,17563,0,0,0,0,0,0,17564,0,0,17565,17566,0, +17567,0,0,0,0,0,0,17569,17570,0,17575,0,0,0,0,0,0,0,0,0,0,0,17581,0,0,0,17582, +17583,0,17586,0,0,17587,0,0,0,0,0,0,0,17588,0,0,0,0,17596,17597,0,0,17598,17600, +0,0,0,0,0,0,17601,0,0,0,17604,0,0,17605,0,0,17607,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,17612,0,0,17618,0,17621,17622,0,0,0,0,17623,0,0,17624,0,0,17630,0,0, +17631,17633,17634,0,0,0,0,0,0,0,17635,0,0,17636,0,0,17637,0,17638,0,17640,0,0,0, +0,0,0,0,0,0,0,17641,0,0,0,0,0,0,0,0,0,0,17643,0,0,0,0,17645,0,0,0,0,0,0,0,0, +17646,17662,0,0,0,0,0,0,0,0,0,17663,17664,0,17665,17666,0,0,0,17669,17671,17673, +0,17679,0,0,0,0,0,0,0,17684,0,0,0,17686,0,17714,0,0,17720,17722,17726,0,0,17728, +0,0,17729,0,0,0,17732,0,17733,0,17734,0,0,0,17735,0,0,0,0,17737,0,0,0,0,17739,0, +0,0,17741,17742,0,0,0,0,17743,17744,17745,0,0,0,17749,0,17750,17751,17752,17754, +17761,17762,0,17763,0,17766,0,17772,0,0,0,0,0,17775,0,0,0,0,0,0,0,17776,0,0, +17777,0,0,17778,17779,0,17782,17783,0,0,0,0,0,0,0,0,0,0,17784,0,0,0,0,0,0,0, +17821,0,0,0,17822,0,0,0,17823,17825,0,0,0,0,0,17826,17831,17832,17833,0,0,17845, +0,0,0,17846,0,0,0,17848,17850,17854,0,17855,0,0,17859,0,0,0,0,0,0,17860,17861,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17870,17871,0,0,0,0,0,0,17872,0,0,0,17879,0, +0,0,17881,17883,0,17884,0,17885,0,0,17886,0,0,17887,17891,17953,0,0,0,0,17954,0, +0,17955,0,17968,0,0,17972,0,0,0,0,0,17974,0,0,0,0,17976,17978,0,0,17983,0,0,0,0, +18003,0,0,0,0,0,18007,0,0,0,0,0,18009,0,0,0,0,0,0,0,18010,0,0,0,0,0,0,18012,0,0, +18014,0,0,0,18015,0,0,0,18016,0,18017,0,0,0,18030,0,0,0,0,0,0,0,18031,0,0,18036, +18037,18038,0,0,18049,18056,0,18057,18058,0,18059,0,0,0,0,0,0,0,0,18062,0,0,0,0, +18064,0,0,0,0,0,0,0,0,18067,0,0,0,18068,0,0,18075,0,0,18078,18093,18094,0,0,0,0, +0,0,0,0,18097,0,0,0,0,0,18098,18100,0,0,0,18108,0,18111,0,0,18112,0,18113,0,0, +18115,18116,0,18118,0,0,0,0,18121,0,0,0,0,18123,0,0,0,0,0,0,0,0,0,18124,0,0,0,0, +18125,18126,0,18127,0,0,18128,18135,0,0,0,0,0,0,0,0,0,18150,0,0,0,0,0,18151, +18152,0,0,18156,18164,0,18166,18171,0,0,0,0,0,0,0,0,0,18172,18183,0,18184,0,0,0, +0,18185,0,18187,0,0,0,0,0,18188,0,0,0,0,0,0,0,0,18189,0,0,18190,0,0,18191,18192, +0,0,18194,18195,18196,0,0,0,18197,0,18203,0,18204,0,0,0,0,18205,0,0,0,18207, +18208,0,0,18214,0,0,0,18215,18216,0,0,0,18220,0,0,18222,0,0,0,0,0,18223,0,18225, +18231,0,18234,0,18235,0,0,0,0,18240,0,0,18241,18242,0,0,0,0,0,18243,18251,0, +18253,0,18254,0,0,0,18266,0,0,0,0,0,0,18269,18270,18271,18273,18281,0,0,0,0,0,0, +0,0,0,0,0,0,18282,0,18283,0,18284,0,0,0,0,0,0,18285,0,18287,18289,0,0,18290,0,0, +0,0,18308,0,0,0,18310,0,0,0,0,0,0,0,0,0,0,0,0,18311,0,18312,18313,0,18315,0,0, +18316,18320,0,18331,0,18332,0,18336,0,0,0,0,18337,0,18340,0,0,0,0,0,0,0,0,0, +18341,0,18344,18345,0,18346,0,0,0,0,0,18348,0,18351,0,0,18356,0,0,0,0,0,0,18357, +0,0,0,0,0,18367,0,0,0,18368,0,18369,0,18370,18371,0,0,0,18437,18444,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,18445,18450,0,0,0,0,18451,0,18452,0,0,0,18453,0,0,0,0,0,18455,0, +0,0,18456,0,18457,0,18460,0,0,18461,0,0,0,0,0,0,0,0,18466,0,0,18467,0,0,0,0, +18473,0,0,0,18476,0,18477,0,0,0,18478,18479,18480,0,0,0,18485,0,0,0,18486,0,0,0, +0,0,0,18488,18490,0,0,0,0,0,0,18491,0,0,0,0,0,18495,0,0,18496,0,0,0,0,0,0,18505, +0,18521,0,18522,18523,0,0,0,18525,18526,0,0,0,0,0,18527,0,0,0,0,18532,18533,0, +18534,0,0,0,0,0,0,18535,18537,0,18538,0,0,0,0,0,0,18540,18541,18542,18543,0, +18546,0,0,0,0,18553,18556,0,0,18558,0,0,18569,18571,0,0,0,18572,0,18574,0,0,0,0, +18586,0,0,0,0,0,18588,0,0,18589,0,0,0,0,0,0,18590,0,18592,0,0,0,0,18594,0,0,0, +18596,0,0,18597,18598,0,0,18601,0,0,0,0,18602,0,0,0,18603,18604,0,18605,0,0,0,0, +18608,0,0,18611,0,0,0,0,0,0,0,0,0,18612,0,18616,0,0,18617,18619,0,0,0,18628,0,0, +0,18629,0,0,18630,0,0,0,0,0,0,0,18631,0,18632,0,0,18635,18637,0,0,0,0,0,0,18641, +18643,18648,0,18652,0,0,18653,0,18655,18656,0,0,0,18657,0,0,18666,18674,0,0,0,0, +18677,18684,18685,0,0,18686,0,0,18690,0,0,0,0,0,0,0,18695,18696,0,0,0,0,0,0,0,0, +0,0,18697,0,0,18700,0,0,0,0,0,0,18702,0,18708,0,0,18709,0,18710,0,0,18711,0, +18714,0,0,18718,0,0,0,0,0,0,18719,0,0,18722,0,18726,0,0,0,0,0,0,0,0,0,0,0,0,0, +18731,0,0,0,0,0,18739,18741,0,0,18742,0,18743,18744,18746,18748,0,18752,18753,0, +0,18754,18763,0,18765,0,0,0,18766,0,0,0,18769,0,0,0,0,0,18773,18778,18779,18781, +0,0,18784,18787,0,18788,0,18793,0,0,0,0,0,0,18795,0,0,18800,0,0,0,0,0,18801, +18804,0,0,0,0,0,0,0,18806,0,0,0,18811,18815,18816,0,0,0,0,18825,0,0,18827,18829, +0,0,18830,0,0,0,0,18831,0,0,18832,0,0,0,0,18833,0,18840,0,18841,0,18842,0,0,0,0, +18843,0,18844,0,0,0,0,0,0,18845,18846,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +18848,0,0,0,18853,18860,0,0,18862,18866,0,0,18867,18869,0,0,18874,18881,18891,0, +0,0,0,0,0,0,0,0,0,18892,0,0,0,0,0,0,0,0,18895,0,18896,0,0,0,18900,0,0,0,18901,0, +18902,18915,18916,0,0,0,0,0,0,0,0,18919,0,0,0,0,0,18920,0,0,0,18921,18929,0,0,0, +0,18930,0,0,0,0,0,0,18932,0,0,0,0,18934,18942,0,0,0,18951,18957,0,0,0,0,18958,0, +0,0,0,18959,18960,0,0,18961,0,0,18962,0,0,0,0,18963,18964,0,0,0,18965,0,18967,0, +0,0,0,0,0,0,0,0,18968,0,18969,0,18970,18973,18976,0,0,0,0,0,0,18977,0,0,0,18981, +0,0,0,18990,0,18998,0,0,0,0,0,18999,19003,0,0,19005,0,0,0,19006,0,0,0,0,0,0, +19008,19011,0,0,19018,0,0,19019,0,19024,0,19031,19032,0,19039,0,19041,19050,0,0, +0,19051,19055,19056,0,19059,19063,19064,0,0,19088,0,0,0,19093,19094,0,0,0,0, +19095,0,19096,0,0,0,19097,0,0,19098,0,19099,19100,0,0,19103,0,0,0,0,0,0,0,19111, +0,0,0,0,0,0,19112,0,0,0,19116,19117,0,19121,19122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,19123,19124,0,0,0,0,0,0,0,19125,19126,0,19128,0,0,0,0,0,0,0,0,0,0, +19129,19130,19131,19132,0,0,19146,0,0,19147,19156,19158,0,0,0,0,0,0,0,0,19182, +19185,0,0,19187,0,0,0,19193,0,0,0,0,0,19194,0,19197,0,0,0,0,19198,0,0,0,0,0,0,0, +0,0,0,19202,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19203,0,19205,19210, +0,0,0,19213,0,19218,0,0,0,19223,19229,0,0,19230,0,0,19231,19232,19233,19239,0,0, +0,0,0,19240,0,19248,19249,0,0,0,0,19254,0,19256,19258,19259,0,0,19261,0,19266,0, +0,0,19272,0,19278,19281,19282,0,0,0,0,0,0,0,0,0,0,0,0,19283,0,0,19284,0,0,19285, +19287,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19288,19291,0,19292,0,0,0,0,19297,0,19298,0,0, +0,0,19302,19303,0,0,0,0,19304,19305,0,0,0,0,19314,0,0,19315,0,0,19321,0,0,0,0,0, +0,0,19322,0,19333,0,19334,19335,0,19336,19337,0,0,0,0,0,0,0,0,0,0,0,19346,0,0, +19353,0,19354,19362,0,19366,19367,0,0,19369,0,19375,0,19377,19380,19388,0,0,0,0, +0,19389,19390,0,0,0,0,19392,0,0,0,0,0,19402,0,0,0,0,0,0,0,0,19412,0,0,19413, +19422,0,19424,0,0,0,19425,0,0,0,19428,0,0,0,0,19431,0,0,0,0,0,19432,0,0,0,0,0, +19448,19459,0,0,19461,0,19462,19463,0,19467,19474,19482,0,0,0,0,19494,0,0,0,0, +19501,0,0,0,0,0,0,0,0,0,0,19502,19504,0,0,0,0,0,0,0,19505,0,0,0,0,19506,19507,0, +0,0,19508,0,0,19511,0,0,19514,0,19515,0,19516,0,19518,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,19530,0,19537,19538,0,19543,19546,0,19547,19551,0,0,0,0,0,0,19552, +19553,0,0,0,0,0,0,0,0,0,0,0,0,19555,0,0,19556,0,0,0,0,0,0,0,0,0,0,0,0,19560, +19561,0,0,19562,0,0,0,0,0,0,19565,19567,0,19568,0,0,0,19569,19570,0,19578,0,0,0, +0,19580,0,0,0,0,19581,19584,0,0,0,0,0,0,0,19585,19586,0,0,0,19587,19588,0,19589, +0,0,0,0,0,0,19592,19593,19599,0,19600,0,0,19604,0,0,19605,0,19606,19608,19610,0, +19613,19614,0,0,0,0,0,0,19616,19617,0,0,19618,0,0,19619,0,0,0,19620,19621,19631, +0,0,19632,19634,19636,0,19643,0,0,19644,19658,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,19659,0,0,0,0,0,0,0,0,0,0,0,19675,19677,0,0,0,0,19679,0,19683,0,19684,0,0, +0,0,0,0,19687,0,0,0,0,0,0,0,0,19688,19689,19692,0,0,0,0,0,0,0,19695,19697,0,0,0, +0,0,19698,19699,0,0,19700,0,19702,0,0,19703,0,0,0,0,0,0,19704,19708,0,19710,0, +19713,0,0,0,19715,0,0,0,0,19718,0,0,0,0,0,0,0,19720,0,19722,0,0,19725,0,0,0,0,0, +0,0,0,0,0,0,0,0,19730,0,0,0,0,0,19731,0,19734,19735,19739,0,0,19740,0,19741,0,0, +0,19746,0,0,19747,0,19771,0,0,0,0,0,0,0,0,19772,19775,0,0,0,0,0,0,19778,0,0,0,0, +0,19779,0,0,19780,19790,0,19791,0,0,19792,0,0,0,19793,0,0,19796,19797,0,0,0, +19799,0,0,0,19801,0,0,0,0,19803,0,19804,0,19805,0,0,19807,0,0,0,19808,0,0,0,0,0, +0,19809,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19816,0,19821,0,19822,19830,19831,0,0, +0,19833,0,0,0,0,0,0,0,0,0,0,19838,0,0,0,0,19839,0,0,19843,0,0,0,0,19845,0,0,0,0, +19847,0,0,19848,0,19849,0,0,0,0,0,0,0,19851,0,0,0,19854,0,0,0,0,0,0,0,0,0,19864, +0,19865,0,19866,0,0,0,0,0,0,0,19868,0,0,19870,0,0,19871,0,0,19872,19873,19875,0, +19880,19882,19884,0,0,19885,19886,19888,0,0,0,0,0,0,0,0,0,0,0,0,19890,19892, +19893,0,0,19894,0,0,0,19895,0,19896,19902,0,0,19903,0,0,19905,0,0,0,19906,0, +19908,0,19909,19911,0,0,0,19913,19920,0,19938,19939,19940,0,0,0,0,0,0,0,19942,0, +19943,0,19945,0,0,0,19951,19952,19954,19960,0,19965,0,19971,0,0,0,0,0,19975,0, +19976,0,19990,0,0,19991,0,19993,0,19995,0,0,0,19998,19999,20001,0,20003,20005,0, +20011,20012,0,0,0,0,0,0,20014,0,20020,0,0,0,0,20021,0,0,0,0,0,20023,20024,0,0,0, +0,0,20025,0,0,20027,0,0,20029,0,0,20032,0,0,0,0,20044,20045,0,20048,20049,0,0, +20050,0,20052,0,0,20054,20057,0,0,0,0,0,0,0,0,0,20059,0,0,20061,0,20062,0,20064, +0,0,20066,0,0,20067,0,0,0,0,20069,0,0,0,0,0,0,20070,20071,0,0,0,0,0,0,0,0,0,0,0, +20072,0,0,20073,20074,0,0,0,0,0,20075,0,20078,0,0,0,0,20080,0,20081,0,0,0,0,0,0, +20095,0,20098,0,0,0,0,0,0,0,20107,0,0,0,0,0,0,0,0,20112,0,0,0,20113,20114,0,0,0, +20115,20123,20124,0,0,0,20131,20133,20134,0,0,0,0,20136,0,0,20137,20138,20150,0, +20152,0,0,0,20153,0,0,20154,0,0,0,20158,0,20163,0,0,20164,0,0,0,0,0,0,0,20166,0, +20168,0,20170,0,20175,0,0,20178,0,0,0,0,20223,0,0,0,0,20224,0,20226,0,0,20230,0, +20231,0,0,0,0,20232,0,0,20233,20234,0,20244,0,20247,0,0,0,0,0,0,20249,0,0,0, +20250,0,0,0,0,20251,0,20253,0,20254,0,0,0,0,20256,0,0,20264,0,0,0,0,20266,0,0,0, +20278,0,0,20279,20282,0,0,0,0,0,20283,0,20284,0,20285,0,20287,20290,0,0,0,0, +20292,0,0,0,0,20293,20297,0,0,0,0,0,0,20299,0,20300,20303,0,0,0,0,0,0,20307,0,0, +20308,0,20309,0,20310,0,0,0,0,0,0,20312,0,0,0,20314,0,0,0,0,20315,20316,0,20322, +0,0,0,0,0,0,20339,0,0,0,20342,0,0,0,0,20352,0,0,0,0,0,0,0,0,0,0,20362,0,0,20365, +0,20375,20377,0,0,0,0,0,0,0,0,0,0,0,20378,20379,0,20380,0,0,20381,0,20382,0, +20383,0,20388,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20390,20392,20393,0,0,20395,0,0,0,0,0, +20396,0,0,0,0,0,0,0,0,20398,20415,0,0,0,20417,0,0,20420,0,0,20426,20428,0,20431, +0,0,20432,0,20433,20434,20435,0,0,0,0,20440,0,0,0,0,0,20442,0,20443,0,20446,0,0, +0,0,20448,0,20451,0,0,0,0,0,0,0,0,0,20452,20453,0,0,20454,0,0,0,0,0,0,20457,0, +20458,0,0,0,20465,0,0,0,0,0,20469,0,0,0,20473,0,20476,0,0,0,0,0,0,0,0,20477,0,0, +20485,0,0,20486,0,0,20487,0,20496,0,20497,0,0,20498,0,0,0,0,0,0,0,0,0,0,20499, +20500,0,20501,0,0,0,0,0,20520,20527,0,20529,0,0,0,0,20539,0,0,20540,0,0,0,20543, +0,0,0,20546,0,0,0,0,0,20548,0,0,20563,0,0,20564,0,20566,0,0,0,0,0,20589,0,0,0,0, +20590,0,0,20593,20594,0,0,0,0,20595,0,20597,20598,0,0,0,20618,20620,0,0,0,0, +20621,0,0,0,0,20627,0,0,0,0,0,20628,0,0,0,20629,0,20630,0,0,20639,0,0,0,0,0, +20707,0,0,20709,0,0,0,20713,20714,0,0,0,0,0,20724,20725,0,0,0,0,20726,20728, +20729,0,20733,0,20734,0,20735,20736,0,20737,0,0,20744,0,20745,0,20748,0,0,20749, +0,0,0,0,0,0,0,0,20750,0,0,0,0,20754,0,0,0,20761,0,0,20763,0,0,0,0,0,0,0,20766,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,20767,0,0,0,0,20768,0,20769,20777,0,0,0,0,0,0,20785,0, +0,0,20786,20795,20801,0,20802,0,20807,0,0,20808,0,0,20810,0,0,20811,0,20812,0,0, +0,0,0,20813,0,0,20818,20820,20821,0,0,0,20822,0,20823,0,0,0,20826,0,0,0,0,0,0,0, +20829,20830,20831,0,20832,20836,0,0,20839,0,0,20840,20842,0,20843,0,20844,0, +20854,0,0,0,20855,0,0,0,0,20856,0,0,0,20869,0,0,20871,0,0,0,0,0,0,0,20873,0,0,0, +0,0,20876,0,0,0,0,0,20880,0,0,20882,0,0,0,0,20883,20884,0,0,20890,0,0,0,0,0,0,0, +0,0,20891,0,0,0,0,0,20905,0,20906,20910,0,0,20912,20915,0,0,0,0,0,20916,0,20917, +0,20919,20920,20922,0,20927,0,20928,20929,20930,0,0,20935,0,0,20939,0,0,20941,0, +0,0,20943,0,0,0,20946,20947,0,0,0,0,0,20950,0,20954,0,0,20955,20964,0,0,20967,0, +0,0,0,0,20973,20975,0,0,0,20984,0,20987,20988,0,0,0,0,0,20989,0,0,0,20995,0, +20998,0,20999,0,0,0,0,21000,21001,0,0,0,0,21008,0,21010,0,21016,0,0,0,21017, +21018,0,0,0,0,0,21021,21026,21027,21028,0,0,21029,0,0,0,0,0,21030,0,0,0,0,0,0,0, +0,0,0,0,0,0,21031,21032,0,0,0,0,0,21037,0,0,21038,0,0,0,0,0,0,0,0,0,21039,0, +21041,0,21046,21047,0,0,0,21049,21053,0,0,21057,21064,21065,0,0,21066,21067,0,0, +0,21069,0,0,0,21071,21072,0,0,21073,0,21074,0,0,21078,0,0,0,0,21079,0,0,21080, +21081,0,0,21086,21087,0,21089,0,0,0,0,0,0,0,21091,0,21093,0,21094,0,0,0,0,0,0,0, +0,21095,0,0,0,0,0,21096,0,21098,0,0,0,0,0,0,0,21099,0,0,21100,21101,21102,0,0,0, +0,0,21103,0,21104,0,0,0,0,0,21105,21108,21109,0,0,21112,21113,0,0,0,0,0,0,21115, +21122,21123,0,0,0,0,0,21125,0,0,0,0,0,0,0,0,21129,21131,0,0,21134,0,0,0,21137, +21142,0,21143,0,0,21144,0,21145,21146,0,21152,21154,21155,21156,0,0,0,21160,0,0, +0,0,0,0,21161,0,21164,0,21166,0,0,0,0,21170,0,0,0,0,21171,0,0,21172,0,21174,0, +21175,0,0,0,0,0,21176,21179,21188,0,0,0,21189,0,0,21190,0,0,0,21192,0,0,21193,0, +0,0,21198,0,21212,0,0,21213,0,0,0,0,0,0,21215,21216,0,0,21223,21225,0,21226,0,0, +0,0,21227,21228,0,0,21229,0,0,0,0,21230,21236,0,0,0,0,0,0,0,0,0,0,0,0,0,21237,0, +0,21238,21239,0,0,0,0,21256,0,0,0,0,0,21257,0,0,0,0,0,0,0,21259,0,0,0,21263,0, +21272,0,21274,0,21282,0,0,0,0,0,0,0,0,21283,0,0,0,0,0,0,0,0,21294,0,0,21297,0,0, +0,0,21298,0,0,0,21299,0,21300,21302,0,21316,0,21318,21322,21323,0,21324,0,21326, +0,0,0,21327,21328,0,0,0,21352,0,0,21354,21361,0,0,0,0,0,0,0,0,0,0,0,0,0,21362,0, +0,0,21363,0,0,0,0,0,0,0,0,0,21366,0,0,21367,21372,21374,0,0,0,21375,21377,0, +21378,0,0,0,21380,0,0,0,0,0,0,0,0,0,0,21381,0,0,0,0,0,0,21382,0,21383,0,0,21384, +0,0,21385,0,0,0,0,21389,21390,0,0,0,0,0,0,0,0,0,0,0,0,0,21397,21398,0,0,0,0,0,0, +0,0,0,0,21399,0,21400,0,0,0,0,21402,0,0,0,21403,21404,0,21405,21406,0,0,0,21407, +0,0,0,0,0,0,0,0,0,0,0,0,21408,0,0,0,0,21409,0,21421,0,21422,0,0,0,21425,21428,0, +0,0,0,21429,0,0,0,0,0,21433,0,0,0,0,0,0,0,0,0,0,21434,0,21443,0,21444,21449,0, +21452,0,21453,21454,0,0,0,21457,0,0,21458,0,0,0,21460,21461,0,0,21464,0,0,0, +21473,21478,0,0,21479,0,0,21481,21483,0,0,0,0,0,0,0,0,21484,0,0,21485,21486,0,0, +21488,0,0,0,0,0,0,21523,0,0,21525,0,0,0,0,0,0,0,21526,0,0,0,0,0,0,21529,21530,0, +0,21531,0,0,21533,0,0,21539,21564,0,21567,0,0,0,0,0,0,0,0,21575,0,0,0,0,21577,0, +0,0,0,0,21591,0,0,21604,0,0,0,0,0,0,0,0,0,21605,0,21606,0,0,21617,21618,21619, +21620,0,0,0,0,0,0,0,0,0,0,0,0,0,21623,0,0,0,0,21631,0,21635,0,0,0,0,21639,21646, +21653,21662,0,0,21663,21664,0,21666,0,0,21667,0,21670,21672,21673,0,21674,21683, +0,0,0,0,0,21684,0,21694,0,0,0,0,21695,21700,0,21703,0,21704,0,0,21709,0,0,0, +21710,0,0,0,0,0,0,0,0,21711,0,0,0,21712,0,21717,0,21730,0,0,0,21731,21733,0,0,0, +0,21737,21741,21742,0,21747,0,0,0,21749,0,0,0,0,0,0,0,0,0,0,0,0,0,21750,0,0,0,0, +0,21752,0,0,0,0,21753,0,0,0,0,0,0,21755,21756,0,21757,0,0,0,0,0,0,21760,0,0, +21763,0,0,0,0,0,0,0,0,0,21764,0,0,21766,0,0,21767,0,0,0,0,0,0,0,0,0,21773,0, +21774,0,0,21775,0,0,0,0,21776,0,0,21777,0,0,0,0,0,0,0,0,0,21780,21787,21788, +21791,0,0,0,21797,0,0,0,0,0,21805,0,0,0,0,21806,0,21807,21809,0,21810,21811,0, +21817,21819,21820,0,21823,0,21824,0,0,21825,0,0,21826,21832,0,0,0,0,0,21833, +21848,21849,0,0,21867,21870,21871,21873,0,0,0,21874,0,0,0,0,0,0,0,0,0,21875,0, +21878,0,0,0,21879,0,21881,21886,0,0,0,0,21887,0,0,21888,21894,21895,21897,0, +21901,0,21904,0,0,21906,0,0,0,21909,21910,21911,0,0,21912,0,0,21913,21914,21915, +0,21919,0,0,0,0,0,0,0,21921,0,0,21922,21933,21939,0,0,0,0,0,0,0,0,0,0,0,21944,0, +0,0,0,0,21945,0,21947,0,0,0,0,0,0,0,0,0,0,21949,0,0,0,21950,0,0,0,0,0,0,0,0,0,0, +0,0,0,21951,0,21952,0,0,0,0,0,0,0,0,0,21954,21957,0,0,0,0,21958,0,21959,0,0,0,0, +0,0,21962,21963,0,0,0,0,0,0,0,0,21964,21965,0,0,21969,21970,0,0,0,21974,0,0, +21980,21981,0,21982,0,0,0,0,0,21985,0,21988,0,21992,0,21999,0,0,0,0,0,0,22001,0, +22002,0,0,0,0,0,0,22003,0,0,0,0,0,22004,0,0,0,22008,0,22009,22015,0,0,22016,0,0, +0,22017,22019,0,0,0,0,0,0,0,0,0,22020,0,0,0,0,0,0,0,0,0,0,22021,22037,0,22039,0, +0,0,22040,0,0,0,22048,22049,0,0,22053,22055,22056,22059,0,0,22060,22061,0,0, +22064,0,0,0,0,22066,0,0,0,0,0,0,0,22073,0,0,0,22074,22075,0,0,0,0,0,0,0,22076,0, +0,0,0,22077,22084,22099,0,0,0,0,0,0,0,22104,0,0,22107,0,22108,0,22109,0,22110,0, +0,0,0,0,0,0,22111,22119,0,22120,22122,0,0,0,0,22125,0,0,0,22128,22129,0,0,0,0,0, +0,22141,0,0,0,22142,0,0,22144,22146,0,22148,22149,22151,22154,0,0,0,22162,0,0,0, +0,22164,22177,0,0,0,0,22179,0,22182,22183,0,0,22184,22188,0,0,0,0,0,0,0,0,22190, +0,22194,22201,0,0,22208,0,22209,0,22212,0,0,22215,0,22223,22231,0,0,22232,0, +22234,0,0,22235,22236,0,22237,0,22240,0,0,0,0,0,22241,0,0,0,22242,22246,22247,0, +0,0,22259,22268,0,22269,0,0,0,0,0,0,0,22270,0,0,0,0,22271,0,22272,0,22277,0,0,0, +0,0,22278,22280,22283,22286,0,0,22287,22289,0,0,22290,0,22293,0,0,0,0,0,0,0,0,0, +0,22295,0,22301,22302,0,0,0,22305,0,22308,0,0,0,0,0,0,0,0,0,0,22315,0,0,0,22317, +0,22334,0,0,0,22335,0,0,0,0,0,22336,0,22338,22344,0,22347,22349,0,22350,0,0,0,0, +0,0,0,22357,0,0,0,0,0,22358,0,0,0,0,0,0,0,0,0,0,22359,22360,0,0,0,0,0,0,0,0, +22361,22366,0,0,22369,0,22370,22373,0,0,0,0,0,22375,0,22377,0,0,0,0,0,22378,0,0, +0,0,22381,0,0,0,0,22382,0,22383,0,0,0,0,0,0,0,0,0,22391,0,0,22392,22395,22396, +22402,0,0,0,0,0,0,0,0,0,0,0,0,0,22405,0,0,22406,0,0,22408,0,0,22409,22410,0,0,0, +0,0,0,22424,0,0,0,0,22426,0,0,0,22427,0,22428,0,22432,0,22435,22442,22443,0,0,0, +0,22444,0,0,0,0,0,22446,0,22454,0,22455,0,0,0,22465,0,22470,0,22471,0,0,0,0, +22472,22473,0,22487,0,0,0,22488,0,0,0,0,22489,0,0,22499,0,0,0,0,0,0,22514,0,0, +22515,0,0,0,0,0,0,0,22516,0,0,0,22517,22520,0,0,0,22534,0,0,22535,0,0,22536,0, +22540,22553,0,22555,0,0,0,0,22561,0,0,22562,0,0,0,0,0,0,0,0,0,0,0,22566,0,0,0,0, +22567,22568,0,0,22575,0,22579,0,22582,22583,22585,0,0,0,0,0,22586,0,0,22587,0,0, +22590,0,0,0,0,0,22591,0,22592,0,0,0,0,0,22593,0,22602,0,0,22604,0,0,22609,0,0, +22618,0,0,0,0,0,0,22619,0,22624,22625,0,0,22638,0,0,0,0,0,22639,0,0,22640,0,0,0, +0,0,0,0,22644,0,22645,22647,0,0,0,0,22652,22653,0,0,0,22654,0,22655,0,0,0,22656, +0,0,0,0,0,0,0,0,0,0,22673,22675,22676,0,0,22678,22679,0,22691,0,0,0,0,0,0,0, +22693,0,0,22696,0,22699,22707,22708,0,0,0,0,0,0,0,0,22718,0,22719,0,0,0,0,22723, +0,0,0,22724,22725,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22726,22728,0,0,0,0,0,0,0,0,22729, +0,0,22731,0,0,0,0,22732,22735,22736,0,0,0,0,22739,0,22749,0,0,22751,0,0,0,0,0,0, +0,0,0,0,0,22758,0,0,0,0,0,22760,0,0,0,0,0,22764,22765,22766,0,22768,0,0,0,0,0, +22769,22770,0,0,0,0,0,0,22771,0,0,22772,22775,0,22776,22777,22780,0,0,22782, +22784,0,22787,0,22789,22796,0,0,0,0,0,22798,0,0,0,0,0,0,22802,0,22803,22804,0,0, +0,0,0,0,0,0,0,0,22805,0,0,22810,22811,22814,22816,0,22825,22826,0,22831,22833,0, +0,0,0,0,0,0,0,0,22834,0,22836,22838,0,22839,0,0,0,0,0,22840,0,22847,0,0,0,0,0, +22856,22857,0,22858,22859,0,0,22862,0,0,22864,0,0,0,0,22865,0,0,0,0,0,0,0,0,0,0, +0,22866,0,22867,22868,0,0,0,0,22869,0,22871,0,22872,0,22873,22881,22882,22884, +22885,0,0,0,0,0,0,0,22886,22887,0,22894,0,22895,0,0,0,22900,0,22901,0,0,0,0, +22904,0,0,0,0,22905,22907,0,0,0,22915,22917,0,0,22918,0,0,0,22920,0,0,0,22929, +22930,0,0,0,22941,22942,0,0,0,22943,0,0,0,22944,0,0,0,0,0,0,0,22946,0,22947,0,0, +22954,0,22956,0,0,22962,0,0,0,0,0,0,0,22963,0,0,22964,0,0,0,0,0,0,0,22965,0, +22968,0,0,0,22969,0,0,0,0,0,22970,0,22971,0,0,0,0,0,22978,0,0,22979,0,22987,0,0, +22989,0,0,0,0,0,0,22990,0,23005,0,0,0,0,0,0,0,23006,23007,23008,0,0,23023,23024, +23029,0,0,0,0,23030,0,0,0,0,0,23032,0,0,0,0,0,23035,0,0,0,0,23038,0,0,0,23048,0, +23049,23052,23053,23060,23061,0,23063,0,0,0,0,23067,23068,0,0,0,23069,23073,0,0, +0,23127,0,23128,0,0,0,0,0,23129,0,23138,23141,0,23149,0,0,23150,0,0,0,23152,0,0, +0,0,0,0,0,0,23154,0,0,0,0,23157,23159,23160,0,0,0,0,0,0,0,0,0,0,0,0,23180,0,0,0, +0,23181,0,0,23188,0,23189,0,0,0,0,0,0,0,0,0,0,0,0,23195,0,0,23196,23199,0,0,0,0, +0,0,0,0,0,23202,0,23204,0,23207,0,23209,23210,0,0,0,0,0,0,23227,23229,0,0,23230, +23234,23238,0,0,0,23245,23246,23248,0,0,0,0,23249,23254,0,0,0,23265,0,0,0,0,0,0, +0,23268,0,23276,0,0,0,0,23277,0,23297,0,23298,0,0,0,0,23299,0,23302,0,0,23303, +23312,0,0,23314,0,23320,0,0,0,0,23324,0,23325,0,23328,0,23334,0,0,0,23337,0,0,0, +0,23343,23344,23346,0,23348,0,0,0,0,0,0,0,0,23353,0,0,0,0,23355,0,23356,23358,0, +0,0,23359,23360,0,23361,0,23367,0,23369,0,0,23373,0,23378,23379,0,23382,23383,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,23387,0,0,0,0,0,0,23388,23390,0,0,23393,23398,0,0,0, +23399,0,0,0,23400,0,0,0,0,23401,0,0,0,23415,0,0,0,0,0,0,0,0,23416,0,23422,0, +23443,23444,0,0,0,0,23448,0,23454,0,0,0,0,0,0,23456,0,0,23458,23464,0,0,0,0,0,0, +23465,0,0,0,23470,23471,0,0,23472,0,0,0,23473,23496,0,0,0,0,0,0,0,0,23497,0, +23499,0,0,23502,0,0,23503,0,0,23513,0,0,23515,0,0,0,23517,0,0,0,0,23518,23519, +23521,23524,0,23525,23528,23539,0,0,0,0,0,23541,0,0,23544,0,0,23556,0,0,23557,0, +0,0,0,0,0,0,0,0,0,0,0,0,23559,0,23560,0,0,23561,0,0,23566,0,0,0,0,0,23568,23569, +23570,0,0,0,0,23571,0,23574,0,0,0,0,0,0,0,0,0,0,0,23575,0,23579,0,0,23581,0,0,0, +0,0,0,23587,0,0,0,0,0,0,0,23596,23598,0,0,0,0,23602,23606,0,0,23607,0,23608,0,0, +0,23614,23616,0,0,0,0,0,23618,0,0,23619,0,0,0,0,23621,23626,0,23627,0,0,0,0,0,0, +0,23629,0,23630,0,0,0,0,23634,0,23636,0,0,0,0,0,0,23638,0,0,0,0,23640,23667,0, +23669,0,0,0,23681,0,0,0,0,0,0,0,23682,0,23683,0,0,0,0,0,23684,0,0,0,23685,23689, +0,23693,23694,23700,0,23702,0,23709,0,0,0,0,0,0,0,23712,0,0,0,0,0,23714,0,0, +23715,0,0,0,0,23718,0,0,23720,0,0,0,0,23722,0,0,0,23726,23729,0,23741,23746,0, +23748,0,0,0,0,23749,0,0,0,0,0,23750,0,0,0,0,23751,0,23753,0,0,0,0,23757,23765,0, +0,0,23770,0,0,0,0,0,0,0,23771,0,23772,23781,0,0,23796,0,0,0,0,23798,0,23799,0,0, +0,23802,0,0,23806,0,23807,0,0,23808,0,23809,0,23819,0,0,0,23821,0,23827,0,0,0, +23829,0,0,0,0,0,0,0,23830,0,0,0,0,0,0,23832,23833,23834,23835,0,0,0,0,23837, +23838,0,0,0,0,0,23846,0,0,0,0,0,0,23847,0,0,0,0,0,23879,23881,0,0,23882,23883, +23895,0,23899,0,0,0,0,23901,0,0,0,0,0,0,23902,0,0,0,0,0,23903,23905,0,23906,0, +23907,23918,23919,23920,0,23922,0,23924,0,23927,0,23934,0,23937,23941,0,23942, +23946,0,0,0,0,0,23955,23956,23958,0,0,0,0,0,0,23959,0,23962,23965,0,23966,0,0,0, +0,23967,23968,0,0,23973,0,0,23974,0,0,0,0,23975,0,23976,0,0,0,0,0,0,0,0,0,0,0,0, +0,23977,0,0,0,0,0,0,0,0,23980,0,0,23984,0,23985,0,0,23987,0,0,23988,23990,23991, +0,0,0,0,0,0,23992,0,0,0,0,0,0,0,0,23994,0,0,0,23998,0,0,0,0,0,0,0,0,0,23999,0,0, +24003,0,24004,0,24006,0,0,0,24007,0,0,24008,0,0,0,0,0,0,0,24009,0,0,24010,0,0, +24011,0,0,24013,24014,0,0,24015,24016,24027,0,24028,24029,0,24030,0,0,0,0,0, +24033,24034,0,24035,0,0,24036,0,0,24044,0,24048,24049,24063,24067,0,24068,24070, +0,0,24071,24078,24087,0,24090,0,0,0,24095,0,24098,24101,24104,24106,0,24107,0,0, +0,24108,0,0,0,0,24110,24111,0,24113,0,0,24115,24120,0,0,0,0,0,0,24124,0,24125,0, +24126,0,24127,0,0,0,0,0,24135,0,0,24136,0,24137,24142,0,0,0,24146,0,0,24147, +24149,24154,0,24163,0,0,0,24165,24166,24167,0,0,0,0,0,0,0,0,0,0,24169,24170, +24175,0,0,0,24178,0,0,24179,0,0,24181,0,24184,24197,0,24201,24204,0,0,0,0,0,0, +24206,24212,24220,0,0,0,24224,0,0,0,0,0,0,0,0,24226,0,24234,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,24235,0,24236,0,0,0,0,0,24239,24240,24241,0,0,24248,0,0,24249,0, +24251,0,0,0,0,0,0,24253,0,24268,0,0,0,24269,0,24271,24272,0,0,0,0,24273,0,0, +24274,0,0,24279,0,0,0,0,0,0,0,24280,0,24293,24294,0,0,0,0,0,0,24296,0,0,24323,0, +0,0,24329,24330,24331,24339,0,24351,0,0,24369,24370,0,0,0,24371,0,0,0,0,24372, +24373,24374,0,0,0,0,0,24378,0,0,0,0,24379,0,24381,0,24383,24389,0,24390,0,0, +24394,24395,24400,0,0,0,24401,24402,0,24406,0,0,0,24411,0,0,0,24415,0,24416,0,0, +0,0,0,24417,0,24419,0,24422,0,24423,24428,0,24435,0,0,0,24439,0,0,0,24440,24442, +24446,0,0,0,24447,24448,24449,24452,0,0,0,0,24453,24457,0,0,24458,24459,24460,0, +24465,0,0,0,0,0,0,0,24470,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24471,0,24473, +24474,24475,24476,0,24478,0,0,0,0,24480,0,0,0,0,0,0,0,0,0,0,24481,0,0,0,0,0,0,0, +0,0,0,24482,24485,0,0,0,0,24486,0,0,0,24488,0,0,0,24494,0,0,0,0,24497,0,0,24498, +0,0,0,24499,24506,0,0,0,24507,0,0,24511,0,0,24513,24514,0,0,0,0,0,24517,0,24518, +0,24520,0,24521,24524,24525,0,0,0,0,0,24527,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24528,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24537,24539,0,24540,0,0,0,24548,0,0,0,0,0,24549, +24550,0,0,0,24553,24554,0,24555,0,24556,0,24558,0,0,0,0,0,24560,0,0,0,24561,0,0, +0,0,0,24562,0,0,0,0,0,0,0,0,0,0,0,0,0,24567,0,0,0,0,0,24569,0,0,0,24574,0,24575, +0,0,0,0,0,0,0,0,0,0,0,24577,24581,0,24584,0,0,0,0,0,24585,0,0,0,0,0,24586,0,0, +24587,0,24588,0,0,0,0,0,0,0,0,0,0,24590,24591,0,0,0,0,24592,0,0,0,0,0,0,0,24594, +0,0,0,0,0,0,0,24596,24597,0,0,0,0,24602,24603,0,0,0,0,24604,0,0,24605,0,24610,0, +0,24611,0,0,0,0,24612,24615,24616,24624,0,0,0,24627,0,24638,24639,0,0,0,0,24640, +0,0,0,24655,24656,24657,0,0,0,0,0,0,0,0,24662,0,24663,24664,0,0,0,0,0,24665,0,0, +0,0,24667,0,0,0,0,0,0,24668,24669,0,24670,24674,0,0,0,24675,0,24678,0,0,24679,0, +0,0,24681,0,24683,0,0,0,0,24684,0,24685,0,0,24686,0,0,24688,24689,0,0,0,0,24690, +24691,0,0,0,0,0,0,0,24697,0,24698,0,0,0,0,0,0,0,0,24709,0,0,0,0,0,24710,0,24712, +0,0,0,0,0,0,24713,24714,0,24715,0,24716,24718,0,24719,0,0,0,0,24720,0,0,24725,0, +0,24738,0,24749,24750,0,0,0,24752,0,0,0,24753,0,0,0,24758,0,0,0,0,0,24762,0, +24763,0,0,0,0,0,0,0,24764,0,0,0,0,0,24765,24767,24768,0,24772,0,0,0,0,24773,0,0, +0,0,24777,0,0,0,0,0,24785,0,24786,24788,0,0,0,24789,0,0,0,0,24794,24798,0,24799, +24800,0,0,0,24803,0,24804,24806,0,24807,0,0,0,24810,0,0,0,0,0,0,24827,24828,0, +24835,0,0,0,0,0,0,24836,0,0,0,0,0,24839,0,24843,24844,0,0,0,0,0,0,0,0,0,0,24847, +0,0,24848,0,0,0,0,0,0,24849,0,24850,24851,0,0,0,24852,0,24853,0,0,0,0,0,0,0,0,0, +24854,0,24855,0,0,24868,0,0,0,24883,0,0,0,24884,0,24895,24897,0,0,0,0,0,24899,0, +0,0,0,0,24900,0,24913,0,0,0,0,0,0,24914,0,0,24917,24930,24931,0,0,0,24932,0,0, +24939,0,0,24942,0,0,0,0,0,0,0,0,0,24945,24950,0,24951,0,0,24953,0,0,0,24954,0, +24959,0,0,0,24961,0,0,24962,0,24964,24968,24970,24972,0,0,0,0,0,24976,0,0,0, +24977,0,24982,0,0,24983,0,0,24984,0,0,0,24993,0,0,0,24994,0,0,25001,0,0,0,25003, +0,0,25018,0,0,25023,0,0,0,25034,0,0,25035,25036,0,25037,0,0,0,0,0,0,0,25039,0,0, +0,0,0,25040,0,0,0,0,0,0,0,25042,0,0,25043,25045,0,0,0,0,0,0,25049,0,0,25051,0, +25052,25053,0,0,25054,0,0,0,25055,0,0,0,0,25057,25059,0,0,25060,25064,0,25065, +25069,25070,0,0,0,0,25072,0,25073,0,25090,0,0,25092,25093,25101,0,0,0,0,0,0, +25105,25108,0,0,25113,0,0,25115,25116,0,0,0,0,0,0,25117,0,0,0,25120,25121,0,0,0, +0,0,0,0,25125,0,0,0,25126,0,25130,25134,0,25139,0,25143,0,0,0,25151,0,25161,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25163,0,0,0,0,0,0,0,25174,0,25175,0,25207,0,0, +0,25209,0,0,0,0,25213,0,25219,0,25223,0,25225,0,0,0,25227,0,0,0,25228,0,0,0, +25229,0,0,0,0,0,0,0,25231,25233,0,0,0,0,25237,25239,0,0,0,25243,0,0,0,25252,0, +25257,25258,0,0,0,0,25260,25265,0,25268,0,0,25273,25324,0,25325,0,25326,0,0,0,0, +0,0,0,0,25327,0,0,0,0,0,25328,0,0,0,0,0,0,25332,0,0,0,25333,0,0,0,25336,25337, +25338,0,0,25343,0,25350,0,0,0,0,0,0,0,25352,0,25354,0,25375,0,25379,0,0,0,0, +25384,0,0,0,0,0,0,0,0,0,25386,0,25388,0,25390,0,0,25399,0,0,25401,0,0,0,25402,0, +0,0,25407,0,0,0,0,0,0,0,0,0,0,0,25413,25415,0,0,25417,0,0,0,0,0,0,0,25419,0,0,0, +25421,0,0,0,25424,0,0,0,0,25433,0,0,0,0,0,0,0,0,0,25435,0,0,0,0,0,0,25436,0,0,0, +25437,0,0,25440,0,0,0,0,0,0,25442,0,0,25443,0,25446,0,0,25449,0,0,0,25450,0,0,0, +0,25452,0,25453,25454,25455,0,0,0,25456,0,25457,0,0,0,25459,0,25461,0,25468,0,0, +0,0,0,0,0,0,25469,0,0,0,0,0,25471,0,0,0,0,0,25474,0,0,0,0,0,0,0,0,25475,0,0,0,0, +25477,0,0,0,0,25483,0,0,0,0,0,25484,0,0,0,0,0,0,0,0,0,0,0,0,25485,0,25497,0,0, +25498,0,25504,0,25510,0,25512,0,0,25513,25514,0,0,0,0,0,0,25517,25518,25519,0, +25520,0,0,0,0,0,0,0,25521,0,25522,25527,25534,0,25536,0,25537,0,0,25548,25550,0, +0,25551,0,25552,0,0,0,0,0,25554,0,25555,0,25556,25557,25568,0,0,0,25570,25571,0, +0,0,0,0,0,25574,0,0,0,0,25579,0,0,0,25581,0,0,0,25582,0,0,0,0,0,0,0,0,0,25588,0, +0,0,0,25589,0,0,0,0,25590,0,25591,25592,25593,0,25594,0,0,0,25596,0,25597,25615, +0,0,0,0,0,25618,0,0,0,0,25619,25623,0,0,25629,0,0,25631,0,0,0,25635,25636,0,0, +25649,0,0,0,0,25654,0,0,0,25661,25663,0,0,25671,0,0,25678,25698,0,25699,25702, +25703,0,0,0,0,0,0,0,0,25704,0,0,0,0,0,25706,0,0,25710,0,25711,0,25712,0,25715, +25716,25717,0,0,25718,25728,25732,0,0,0,25734,0,0,0,0,0,0,0,0,0,25737,0,0,25739, +0,0,0,25740,0,25741,25745,0,25746,0,25748,25772,25778,0,0,0,0,0,25780,0,0,0,0, +25781,0,25782,25784,25785,0,0,0,25789,0,0,0,0,0,0,25797,25801,0,0,0,25808,25809, +0,0,25811,25814,25815,0,0,25817,0,0,0,0,0,0,0,0,25820,0,0,0,0,25832,25833,0,0,0, +25846,0,0,0,25847,25848,0,0,0,0,0,0,0,0,0,25849,25850,0,0,25851,0,0,25852,0, +25862,0,0,0,25863,25865,0,0,0,0,0,0,0,25867,25868,0,25869,25874,0,25875,0,25876, +25877,0,0,0,0,25878,25902,0,0,0,0,0,0,0,25903,25904,25905,0,0,0,25908,25909,0,0, +0,0,25910,0,0,0,0,0,0,0,25912,0,25913,0,0,0,0,0,0,0,0,25914,0,0,25916,0,0,0,0,0, +25917,25927,0,0,0,0,25928,0,0,25930,0,0,0,25933,0,0,25938,25942,0,0,0,0,0,0,0, +25945,0,25950,0,25956,0,0,25961,25962,0,0,25963,0,25964,25965,25966,0,0,0,0,0, +25967,0,0,0,0,25968,0,0,0,25969,25971,0,0,0,0,0,25973,25975,0,0,0,0,0,0,0,25978, +0,25981,0,0,0,25982,0,0,0,25984,0,0,0,0,0,0,0,25993,0,0,0,0,0,0,0,0,0,0,0,0,0, +26002,0,0,0,26005,0,0,0,26006,26007,0,0,26014,26015,26016,0,0,0,0,0,0,26017, +26018,26020,0,26022,26023,0,0,0,26024,26028,0,26029,26033,26034,26044,0,0,0,0,0, +26046,0,0,26047,0,0,26049,0,26050,0,26051,0,0,0,0,0,26053,0,0,0,0,26054,26059,0, +0,0,0,0,0,26060,0,26066,0,0,0,0,0,0,0,0,0,0,0,0,26067,0,26069,0,0,26071,0,0,0, +26073,0,26074,26077,0,0,0,0,26078,0,0,0,26079,0,26090,0,0,26094,0,0,0,0,0,0,0,0, +26095,0,0,0,0,0,0,0,0,0,0,0,26096,26101,0,26107,26122,0,26124,0,0,26125,0,0,0,0, +0,0,26136,26141,26155,0,0,0,0,0,0,0,0,0,26164,26166,0,0,0,26167,0,26170,26171,0, +0,26172,0,0,26174,0,0,0,0,0,0,0,0,0,0,0,0,0,26175,0,0,0,26176,26177,0,26321, +26322,0,26323,0,0,26324,0,0,0,0,0,0,0,26325,0,26331,0,0,0,0,0,0,26335,0,0,0, +26350,0,0,0,26379,0,0,26382,26383,26385,0,0,26392,26406,0,0,0,0,26411,0,0,0,0,0, +26412,0,0,26420,0,0,26423,0,26424,26426,26432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +26435,0,26436,0,0,0,0,0,26441,0,26444,0,0,0,26446,0,0,0,0,26447,0,0,0,0,26449,0, +26450,26452,0,26453,26454,0,0,0,26455,0,0,0,26456,0,0,26458,0,0,26460,0,26463,0, +0,0,0,0,0,0,0,26464,26470,0,0,0,0,0,0,0,0,0,26473,0,0,26474,0,0,0,0,0,0,0,26475, +0,0,0,0,0,0,0,26477,0,26485,0,0,26486,0,26487,0,0,26488,26493,26494,0,0,26495,0, +26497,26504,26506,0,0,0,0,0,26507,0,0,0,0,0,26509,0,0,26510,0,0,0,0,0,0,0,0,0,0, +0,0,0,26512,0,26513,26515,0,0,0,26518,0,0,0,26519,0,26524,26526,0,0,0,26527,0, +26532,0,26533,26537,26558,0,0,0,26559,0,0,0,26571,0,0,26573,0,26588,0,26593,0,0, +0,0,0,0,26603,0,26604,0,0,0,0,0,0,0,0,0,0,26606,0,0,0,0,0,0,0,26607,26609,26611, +26614,0,0,0,26616,26620,0,26621,0,0,0,0,0,26627,0,26629,0,0,26630,0,0,26632, +26643,0,0,0,26644,0,0,0,0,0,0,0,0,0,26646,26647,0,0,0,26650,0,0,26656,0,0,0,0, +26663,26670,26671,0,0,0,26685,26686,26687,0,26689,0,0,0,0,26744,0,26745,0,26747, +26748,0,26749,26750,26751,0,0,0,0,26752,26755,0,0,0,26756,26769,0,0,0,26774,0,0, +0,0,0,26775,0,26777,26778,0,26786,0,0,0,26787,0,0,0,0,0,0,0,0,0,0,0,0,0,26788,0, +0,26789,0,0,0,0,0,26791,0,26792,26793,0,0,0,26794,0,26797,26798,0,0,0,26800,0,0, +26803,0,26804,0,0,0,0,0,0,0,0,0,26805,0,0,26808,0,0,26809,0,0,0,0,0,0,0,26812,0, +26825,0,0,0,0,0,0,0,26826,0,0,26827,26829,26834,0,0,0,0,26835,0,0,26849,0,26851, +0,0,0,0,0,0,0,0,0,26852,0,26853,26857,0,26858,0,26859,0,0,0,0,0,0,0,26876,0, +26878,26882,26883,0,0,0,0,26890,26894,0,0,0,0,26895,26896,0,0,0,0,0,26900,0,0,0, +0,0,0,0,26911,26913,26914,26915,26916,26919,0,0,0,26921,26922,0,0,26925,0,0,0, +26928,0,0,26929,26930,0,0,0,26931,0,26932,0,0,0,0,0,26933,0,0,0,0,0,0,26937,0,0, +26943,0,0,26944,0,0,0,26946,0,0,0,0,0,0,0,26956,0,26958,0,0,26963,0,0,0,0,0,0,0, +26965,0,26969,26970,26972,0,0,0,0,0,26973,0,26974,0,26978,0,26980,0,0,0,0,0,0, +26982,0,26986,26987,0,26990,0,0,0,0,27003,27006,0,0,27007,27010,27012,27013,0,0, +0,0,0,0,0,0,27014,27015,27018,0,27019,0,0,0,0,0,27025,0,0,0,27026,0,0,0,0,27029, +27030,27031,27034,0,0,27036,27037,0,0,0,27038,27042,0,0,0,27044,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,27045,0,0,0,0,0,0,0,27046,0,0,0,0,0,0,0,27047,27049,0,27050,0,0,0, +27051,27052,0,27055,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27056,27058,27059,0, +27061,0,27064,0,0,0,0,0,27069,0,0,27070,0,0,0,0,0,0,0,27072,0,0,0,0,0,0,0,0, +27076,0,0,0,0,0,27078,0,27079,0,0,0,27081,0,0,0,0,0,0,27082,0,27083,27086,0,0,0, +0,27087,0,0,0,0,0,27088,27090,0,27094,0,0,27095,0,27099,27102,0,0,0,27103,0,0,0, +0,27105,0,0,0,27106,0,0,0,0,0,0,27107,0,0,0,0,27108,27117,0,0,0,0,27118,0,0, +27124,0,27126,0,0,27130,27131,0,0,0,0,0,0,27147,0,0,0,0,27148,27149,0,0,0,0, +27150,27151,0,27152,0,27159,0,0,0,27164,0,0,0,0,0,0,0,27175,0,27189,0,0,27191,0, +27193,0,27195,0,27198,0,0,0,0,0,27200,0,0,0,0,27202,0,0,0,0,27203,0,0,27204,0,0, +27206,0,27207,0,0,0,0,27209,0,0,0,27213,0,0,27216,27219,27220,27222,27223,0, +27224,0,27225,27226,0,0,27233,0,0,0,0,27235,0,27237,0,27238,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,27239,0,27242,27243,0,27250,0,0,0,27251,0,27253,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,27254,27255,27258,0,0,0,27259,0,0,0,0,0,0,27267,0,27276,27278, +0,0,0,0,0,0,0,0,0,27296,27297,27301,0,0,0,0,0,0,27302,0,0,0,0,0,0,27312,27313,0, +0,0,0,0,27318,0,27320,0,27329,0,27330,27331,0,27332,0,0,0,0,27340,0,0,0,27348,0, +0,0,0,0,0,27350,0,27351,0,0,0,0,27355,0,0,27358,27359,27361,0,0,0,27365,0,27367, +0,27376,27378,0,0,27379,0,0,0,0,0,0,27396,0,27397,27404,0,0,0,0,0,27408,0,0,0,0, +27453,0,0,0,27456,0,0,0,27458,0,0,0,0,0,0,0,27459,0,0,0,27460,0,0,27461,0,27465, +27467,0,0,27469,0,27470,0,27471,0,27477,27482,0,0,0,0,0,0,27484,0,0,0,0,0,0, +27485,0,0,0,0,0,27493,0,27494,27502,0,0,0,0,0,0,0,0,0,0,0,0,27511,27532,0,0,0, +27533,27545,0,0,0,27546,0,0,0,0,0,0,0,0,0,0,27547,0,0,27549,27550,0,27551,0,0,0, +0,0,0,0,27555,0,0,27571,0,27573,27574,27575,27577,0,27578,0,0,27579,27585,0,0,0, +0,0,27586,0,0,27588,27589,0,0,0,0,27596,0,0,27600,0,0,0,0,0,0,0,0,0,0,0,27608,0, +0,0,0,0,0,0,0,0,0,0,27610,0,0,0,27618,0,0,27620,0,0,0,27631,0,0,27632,27634,0, +27636,27638,0,0,0,27643,0,27644,27649,0,0,0,0,0,0,0,0,0,0,0,0,0,27651,27660,0, +27661,0,0,0,0,0,0,0,27662,0,0,27664,0,27665,0,0,0,27669,0,27671,0,0,0,27673, +27674,0,0,0,27682,0,0,0,27711,0,27712,27713,27719,27720,0,0,27728,0,27729,0,0,0, +0,0,0,0,0,0,27731,0,0,27732,0,27733,0,27738,0,0,0,27742,0,0,0,27743,27744,0,0,0, +0,0,0,27745,27746,0,0,0,27747,27748,27751,27752,0,0,0,27768,27770,0,0,0,27774, +27775,0,27776,27777,0,0,27781,0,27784,0,27786,0,0,27791,0,27792,27793,27804,0, +27812,27813,0,0,0,0,0,0,0,0,27814,0,27825,0,27827,0,0,0,0,27828,27861,27862,0,0, +0,27864,0,0,0,27865,27884,0,27889,0,0,0,0,0,27890,0,27891,0,0,0,27892,0,0,0,0,0, +27897,27898,0,0,27899,0,0,0,27901,27905,0,0,27920,0,0,27921,0,27922,0,0,0,27931, +27934,0,0,0,0,0,0,0,0,0,0,27941,0,27942,0,27945,0,27947,27954,0,0,0,0,27960, +27963,0,0,0,0,0,0,0,0,27964,27965,0,0,0,27967,0,27969,27975,0,27976,27977,0, +27981,0,27983,28051,28052,0,0,0,0,0,28056,0,0,0,0,0,0,28058,28059,0,0,28061,0,0, +0,0,0,0,0,28063,0,0,0,0,0,0,28066,0,0,0,0,0,0,28069,28070,28072,0,28073,0,0, +28074,0,0,0,0,28075,0,0,0,0,0,0,0,28078,0,0,0,0,28085,0,0,0,0,28086,0,0,0,0,0,0, +28088,0,0,0,0,0,0,0,0,28090,0,28097,28114,28115,0,0,0,0,0,0,0,28116,0,0,0,0,0, +28118,0,28129,0,28131,0,0,28135,0,0,0,28140,28141,0,0,0,28146,0,0,0,0,28152,0,0, +0,0,28155,28157,28161,0,0,0,0,28166,0,28167,0,0,0,0,0,0,0,0,0,0,0,28172,0,0,0,0, +0,0,28173,0,0,28175,0,0,0,0,0,0,0,0,0,28178,28188,0,28190,0,0,0,0,0,28191,0, +28193,28206,0,0,28207,28209,0,28211,0,28213,0,0,0,28215,28216,28217,0,28222,0, +28223,28225,0,0,0,28226,0,28227,28229,28232,0,0,0,0,0,0,0,0,0,28235,0,28241,0,0, +28242,0,0,0,0,28243,0,0,0,28245,0,0,0,28248,28250,0,28251,28252,0,0,0,0,0,0, +28253,0,0,28254,28255,0,0,28256,0,0,28258,0,0,0,0,0,28259,0,0,28260,0,0,28261,0, +0,0,0,28262,28263,0,0,28264,0,0,0,28266,0,28268,28269,0,28270,28272,28274,0, +28277,28278,0,0,0,28279,0,28280,28281,28283,0,28292,0,28294,0,28297,0,0,0,0, +28299,0,0,0,0,0,28300,0,0,0,0,0,0,0,28301,0,0,0,0,0,0,0,0,0,0,0,0,0,28302,28303, +0,0,0,0,28304,0,0,28305,0,28312,0,28313,28314,0,0,0,0,0,0,28315,0,0,0,28320, +28321,0,0,28328,0,0,0,28329,28338,0,28339,0,0,28344,0,0,0,0,0,0,0,0,28347,0,0,0, +0,0,0,0,0,28348,0,0,0,0,0,28411,0,28412,28413,0,28416,0,0,0,28420,0,0,0,0,0, +28421,0,0,0,0,28423,0,0,0,28424,0,0,28428,0,0,0,0,0,28429,0,0,0,28431,28434,0, +28458,0,0,0,0,0,0,0,0,0,0,0,28464,0,0,0,0,28465,0,28467,0,0,0,0,0,0,28471,0,0,0, +0,28474,0,28480,0,28481,0,0,28485,0,0,0,0,28486,28488,0,0,28489,0,0,0,0,28492,0, +0,0,28495,0,28497,0,28499,0,0,0,0,28500,0,0,28502,28503,0,0,0,28508,0,0,0,28510, +0,0,28512,28513,28514,28521,0,28526,0,28527,28528,0,0,0,0,28529,0,0,28532,0,0, +28537,28538,0,0,0,28539,0,28548,0,28553,28554,0,0,0,0,0,0,0,0,0,0,0,0,28560, +28563,0,0,28564,0,0,0,0,28565,0,0,0,0,0,0,0,28566,28568,0,0,0,0,0,0,28569,0,0,0, +28570,0,28572,28573,0,0,0,0,28575,0,0,0,0,28576,28581,28588,0,0,28589,0,0,0, +28590,28595,0,28598,0,0,28601,0,0,28605,0,0,0,0,28614,28615,28619,0,0,0,0,0,0, +28620,0,28626,0,0,28628,0,28631,0,28632,0,0,0,0,0,0,28635,0,0,0,28637,28638,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28639,0,28643,0,0,28652,0,0,0,28662,0, +28670,28671,0,0,0,0,0,0,0,0,0,28672,28673,28675,28676,0,0,0,0,0,0,0,28691,0,0,0, +28695,0,0,0,28696,0,28697,28698,0,28705,0,28707,28708,28710,0,0,0,0,0,0,0,28711, +28728,0,0,0,28736,0,0,0,28737,0,0,0,0,0,0,0,0,0,28738,0,28739,0,28741,0,0,28742, +0,0,0,0,0,0,0,0,0,0,0,28745,0,0,0,0,0,0,28749,28750,28752,28754,28756,0,28757,0, +0,0,0,28759,28760,0,0,0,0,0,0,28762,0,0,0,28764,0,0,0,0,0,0,28766,0,28767,28768, +0,0,0,0,28769,28770,0,0,0,0,0,0,0,0,0,0,0,0,0,28771,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,28772,0,28773,0,28782,0,0,0,0,0,0,28784,0,28785,0,28786,0,0,0,28787,0,0,0, +28797,0,0,0,0,0,0,28799,0,0,28801,0,0,0,0,28802,0,28805,0,0,28806,0,0,28807,0,0, +0,0,0,0,0,28808,0,0,0,0,0,28810,28812,0,0,28816,28819,0,0,28821,0,28826,0,0,0, +28842,28852,0,0,28853,0,28854,28855,0,0,0,28857,0,0,0,28858,0,28867,28868,28869, +0,0,0,28874,28880,28882,28890,28892,0,0,0,0,0,0,0,28895,0,0,0,28898,28899,0,0,0, +28900,0,0,28904,0,28906,0,0,0,0,28907,0,0,0,0,0,0,28908,0,0,0,28910,0,28914,0,0, +0,0,0,0,0,28915,28916,28919,0,0,28920,0,28921,0,0,0,0,0,0,0,0,28924,0,0,0,0, +28926,28929,0,0,0,28930,0,28936,0,28939,0,0,0,0,28942,0,0,0,0,0,0,28956,0,0,0, +28966,0,0,0,0,28967,0,0,0,0,0,0,0,0,0,28968,0,28971,0,28975,28976,0,28982,28983, +0,0,28984,28989,28996,28997,28998,0,0,0,0,0,0,28999,0,0,0,0,0,29000,0,29001,0,0, +0,29009,0,0,29011,0,0,29021,0,0,0,0,29024,0,29025,0,0,0,0,0,29026,0,0,0,29036,0, +0,0,29037,0,0,0,0,29038,0,29045,0,29047,0,0,0,0,0,0,0,0,0,29051,0,0,0,29054, +29056,29062,0,29070,29082,0,0,0,29083,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29084,0,0, +0,0,29085,29088,0,0,0,0,0,0,0,29090,29097,0,0,0,29103,0,0,0,0,0,0,0,0,29105,0,0, +0,0,0,29107,0,29109,0,0,0,29115,0,0,29120,0,0,29138,29140,0,0,0,0,0,0,0,0,0, +29152,0,29160,29174,0,29176,0,0,29180,0,29181,0,0,0,0,0,0,0,0,29228,0,0,29229,0, +0,29230,0,0,0,0,0,0,0,0,0,0,29234,0,0,0,29241,0,29245,0,29248,0,29250,29256, +29280,0,29282,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29285,0,0,29286,29291,29292,0,0,0,0, +29294,0,29295,0,0,0,0,0,29296,29297,29298,29300,0,29302,0,0,29304,29307,0,29312, +0,0,0,29322,0,0,29323,0,0,29324,29326,29328,0,29335,0,0,0,0,0,0,0,29338,29339,0, +0,0,0,0,29341,29343,0,0,0,0,29344,0,0,0,0,0,29345,0,0,0,0,29346,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,29347,29348,29349,0,0,29354,0,0,29355,0,0,0,0,0,0,0,0,29357,0,0, +0,0,29364,0,29365,0,0,0,0,0,0,0,29366,0,0,29368,0,0,0,0,0,0,0,0,29378,0,29381,0, +0,0,0,0,0,0,0,29386,0,0,0,0,0,0,29389,0,0,0,29390,0,0,29391,29397,0,29398,29412, +29414,29418,29419,0,0,0,0,0,0,0,29420,0,0,0,0,0,0,0,29423,0,0,0,29435,0,0,0, +29437,0,0,29439,0,29441,0,0,0,0,29443,0,29446,29450,29452,0,0,0,0,0,29456,0,0,0, +0,0,29461,0,0,0,29464,0,0,0,0,0,0,0,0,29468,0,29473,0,0,0,29486,0,0,0,29490,0,0, +0,29491,29492,0,0,29497,0,0,0,29498,0,29499,0,29502,29505,0,29509,0,0,0,29510,0, +0,0,29512,0,0,0,29516,0,0,0,0,0,0,0,0,29518,0,29519,0,0,0,0,0,29520,29521,29529, +0,0,0,0,0,0,0,0,29530,0,0,29531,29538,0,29540,0,0,0,29542,0,29543,29544,29547,0, +0,29548,0,0,0,29549,0,0,0,29550,0,0,29552,0,0,0,0,29558,29561,0,29562,29564,0,0, +29565,0,0,29566,0,0,0,0,0,0,0,0,0,0,29578,29584,29586,29591,0,0,0,0,29593,29594, +0,0,29597,0,0,29613,0,29614,0,29615,0,0,0,0,29616,29617,0,0,29625,0,0,0,29632,0, +0,0,0,0,0,0,29633,0,0,0,0,0,29634,29635,29637,0,29638,0,29641,29643,0,0,0,0,0,0, +29644,0,29645,0,29649,0,0,0,29650,0,29653,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29656, +29659,0,0,29660,0,0,0,29661,0,0,0,0,0,29664,0,0,0,29671,29673,0,0,0,0,0,0,0, +29675,0,29677,29679,0,0,29684,0,0,0,0,0,29685,0,0,0,29687,0,0,0,29688,0,29689, +29690,29700,0,29701,0,0,0,29702,0,29706,0,0,0,0,0,0,0,29720,0,29721,0,29727,0, +29733,29734,0,29750,29761,0,29763,0,0,0,0,0,29764,0,0,29765,0,0,0,29771,0,0,0,0, +0,0,0,0,0,0,0,0,29772,0,0,0,29773,29774,29775,0,0,0,0,0,0,0,0,0,0,0,29822,0,0,0, +29824,0,29825,0,0,0,0,0,29827,0,0,0,0,0,0,0,0,29829,0,29832,29834,0,0,29835,0,0, +29837,29838,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29843,0,0,0,0,29844,29845,0,0,0, +0,0,0,0,0,0,29849,0,0,29869,29872,29890,29905,0,0,0,0,0,29907,29921,0,29922,0,0, +29923,29926,29944,29946,0,0,0,0,0,0,0,29947,29948,0,0,0,29951,0,0,0,0,0,29953,0, +0,29956,0,29957,0,0,29962,0,0,0,0,29971,0,0,0,29972,0,0,0,0,0,29978,0,29979, +29992,30007,30008,30010,0,0,0,30013,0,0,0,0,30014,30016,0,0,0,0,0,0,0,0,0,0,0, +30017,0,0,0,0,0,30023,30031,0,0,30033,0,0,0,0,0,0,0,0,0,0,30034,0,30038,0,30039, +0,30040,0,0,0,0,0,0,30067,30068,0,0,0,30069,0,30072,0,0,0,30073,0,0,0,0,30075,0, +0,0,0,0,0,30079,0,0,30080,0,0,0,0,0,30082,0,0,0,0,0,0,0,0,0,0,0,30084,30090,0,0, +30091,0,0,0,0,30098,30118,0,30119,0,30121,30130,0,0,0,0,0,0,0,0,0,0,0,0,0,30131, +30132,30133,0,0,0,0,0,0,30135,0,0,0,0,0,0,0,0,0,0,0,30136,0,0,30137,30138,0,0,0, +30139,30146,0,0,0,0,0,30147,0,0,30148,30151,0,0,0,30168,0,30172,30173,0,0,0,0,0, +0,0,0,30180,30181,0,30192,0,0,0,0,0,0,0,30194,30196,0,0,30199,0,0,30202,0,0,0,0, +30203,0,0,0,0,0,0,0,0,0,0,30213,0,0,0,30216,0,0,30217,0,0,0,30218,0,0,0,0,30219, +0,30220,0,30222,30227,0,0,0,0,0,30231,0,0,30233,30235,0,0,0,0,30238,0,30240, +30243,30245,0,30250,30252,0,0,0,30269,0,0,30271,30272,0,0,0,30278,30280,0,0, +30282,0,30284,0,30294,0,0,0,0,30295,30296,0,0,0,0,0,30298,30299,30302,30304, +30306,0,0,0,0,0,0,30316,30317,0,0,0,30318,0,0,0,30319,0,30320,30322,30326,0,0,0, +0,0,30327,0,30332,30348,30349,0,0,30356,0,0,0,0,0,0,0,0,30357,0,30358,0,30359, +30360,0,0,30365,30366,30378,0,0,0,0,30379,0,0,30381,0,30385,0,30388,30397,0,0,0, +30401,0,0,0,0,30403,0,0,0,0,0,30404,0,0,30405,0,30406,30408,0,30409,0,30410,0,0, +0,30417,0,0,30418,30419,0,30420,0,30424,0,0,0,30427,30430,30432,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,30433,0,0,0,0,0,0,0,30436,0,30437,30438,0,30441,30442,0,0, +0,30445,0,0,0,0,30452,30456,30457,0,0,0,30458,0,30464,0,0,0,0,0,0,30467,0,30469, +0,0,0,0,0,30477,0,0,30484,0,0,0,0,0,30485,0,0,0,0,0,30486,30487,30497,30498,0,0, +0,0,0,0,0,0,0,0,30505,0,30508,0,0,0,30509,30510,0,30514,30516,0,0,0,0,0,0,0,0,0, +0,0,30523,0,30524,0,30525,0,0,0,0,30537,0,0,30538,0,0,0,0,0,30553,0,0,30555, +30556,30558,30559,30560,0,0,30561,0,30562,0,0,0,0,0,0,0,0,30563,30570,30571,0, +30586,30587,0,0,30590,0,0,30594,0,0,0,0,30611,30612,30623,30634,0,0,30636,30640, +30655,30656,0,30657,0,0,30658,30669,0,30670,0,30676,30678,0,0,0,0,0,0,0,30679,0, +0,0,0,0,0,0,0,0,0,0,30695,0,0,30698,0,0,0,0,30700,0,0,0,0,30701,0,30702,30703,0, +0,0,0,30707,0,0,0,30709,0,0,30710,30719,30729,0,0,0,0,0,0,0,0,0,30731,0,0,30733, +0,0,0,30734,0,0,0,0,0,30736,30737,0,0,0,30740,0,0,0,30743,0,30746,0,30747,30748, +0,0,30751,30752,30753,0,0,0,30754,0,0,30760,0,0,0,0,0,0,0,30763,0,30764,0,0, +30766,0,30769,30770,30771,30774,30777,0,0,30779,30780,30781,0,0,0,0,30790,0,0,0, +30792,0,0,0,0,30810,0,0,0,0,0,0,0,30812,30819,0,0,30823,30824,0,30825,0,30827,0, +0,0,0,0,0,30828,0,0,30830,0,0,0,30834,0,30835,0,30837,30838,0,30845,0,0,0,0,0, +30846,30847,0,0,30849,0,30851,0,0,0,0,0,30852,30858,0,0,30859,0,30865,0,0,30866, +0,0,30868,0,0,30869,0,0,0,30881,30883,0,0,0,0,0,30889,0,30891,0,0,0,0,30894,0, +30895,0,30897,0,30898,0,0,0,30904,30906,0,30909,0,0,0,0,0,0,30910,0,0,0,30915, +30933,30942,0,0,0,0,30943,0,0,30945,0,0,0,0,0,0,30946,0,0,30947,0,0,30955,30956, +0,0,30960,0,0,30961,30962,30966,0,0,30969,30974,0,0,0,30976,0,0,30977,0,30978, +30982,0,0,0,0,0,0,0,30994,30995,30998,0,31000,0,0,31001,0,0,31003,31005,0,0, +31006,31011,0,0,31014,0,31016,0,0,0,0,31018,0,0,31020,31023,31024,31025,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,31027,31028,31029,0,0,0,0,0,0,31032,0,0,0,0,0,0,0,0,0,0,0, +31036,31037,31038,0,0,0,31041,31043,31045,0,31047,0,0,0,31048,0,31049,0,0,0, +31053,31054,31055,0,0,31063,0,0,0,0,0,31066,0,31068,31071,0,0,0,31072,31073,0,0, +0,0,31075,0,0,31076,0,0,0,31077,31079,0,31080,0,0,0,0,0,0,0,0,0,0,31087,0,31142, +0,31144,0,0,31145,31146,31147,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31149,0,31151,31152,0, +0,0,0,0,0,0,31162,31171,31174,31175,0,0,0,31176,0,0,0,0,0,0,0,31179,0,0,0,31186, +0,0,0,31192,31195,0,0,31196,0,0,0,0,0,0,0,0,31198,0,0,0,0,0,31199,0,0,0,31205,0, +0,0,0,31211,31215,0,0,0,0,31231,0,31232,0,0,0,0,0,0,0,0,0,0,31233,31236,31253,0, +31254,0,0,0,0,0,0,31255,0,0,31257,0,0,0,0,0,0,0,0,0,31258,31259,0,0,31260,0, +31261,0,0,0,0,0,31262,31263,0,0,31264,0,31266,0,31267,0,0,0,0,0,31281,0,31282,0, +31284,0,0,31285,31287,31288,0,0,31290,0,0,0,31292,31295,0,31299,0,31300,0,0,0,0, +0,31302,0,0,0,0,31303,0,0,0,0,0,0,31304,0,0,0,0,0,31305,31308,31309,31315,0, +31317,0,0,0,0,0,31323,0,31324,0,0,0,0,0,31325,31327,0,0,31331,0,0,0,0,0,31333,0, +0,0,0,0,31336,0,0,31337,0,0,0,0,0,0,31338,0,0,0,0,0,0,0,0,0,0,0,0,31339,0,0,0,0, +0,0,0,31342,0,0,0,0,31345,0,0,0,0,0,0,0,0,31347,0,0,0,0,0,0,31348,0,0,31350, +31351,0,31352,0,0,31354,0,0,0,0,31355,0,0,31356,0,0,0,0,0,0,0,0,0,0,31363,0, +31372,0,0,31373,0,0,0,0,0,0,0,0,0,31376,0,31388,0,31389,0,31392,0,31401,0,31405, +31407,31408,0,31409,0,0,0,0,0,0,31413,31415,0,0,0,31416,31418,0,0,0,0,0,0,31422, +31423,0,0,31424,0,31425,31432,0,0,0,0,0,0,0,0,0,31433,0,0,0,0,0,0,0,0,31434,0,0, +0,0,0,0,31435,0,0,0,0,31438,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31442,0,31444,0, +31448,0,0,31451,0,0,0,0,31452,0,31461,31465,0,0,31466,0,0,31467,0,0,31468,0,0,0, +31469,31473,0,31476,0,0,0,0,31489,31490,0,0,0,0,0,0,0,31492,31493,31494,0,0,0,0, +31501,31504,31505,0,0,0,0,0,0,0,0,0,31509,0,0,0,0,31510,0,0,31511,0,0,31513,0,0, +0,0,0,0,0,0,0,31514,0,31522,31536,31539,31540,0,31541,0,0,0,0,0,0,31546,31553, +31559,0,0,0,31560,31561,31562,0,0,31564,31567,0,31569,0,0,0,31570,0,0,0,0,31571, +0,0,0,0,0,0,31572,31574,31580,31581,0,0,31582,31584,31585,31586,31595,0,31596,0, +0,0,0,31597,0,31599,0,31600,31601,0,0,31603,31604,0,0,31608,31610,0,0,0,31611,0, +31615,0,0,0,0,31616,0,0,0,0,0,0,31617,0,0,0,0,0,31618,0,0,0,0,0,0,31621,0,0,0,0, +0,0,0,0,0,31622,31625,0,0,0,0,31627,0,31641,0,0,31642,0,0,31643,0,0,0,0,0,0,0,0, +0,31644,0,31646,0,0,0,0,31648,0,0,0,31652,0,0,0,31657,0,0,31676,0,0,0,0,0,0,0, +31689,31691,31692,0,31694,0,0,0,31696,0,31702,0,31703,0}; + +const BROTLI_MODEL("small") +DictWord kStaticDictionaryWords[BROTLI_ENC_STATIC_DICT_LUT_NUM_ITEMS] = { +{0,0,0},{8,0,1002},{136,0,1015},{4,0,683},{4,10,325},{138,10,125},{7,11,572},{9, +11,592},{11,11,680},{11,11,842},{11,11,924},{12,11,356},{12,11,550},{13,11,317}, +{13,11,370},{13,11,469},{13,11,471},{14,11,397},{18,11,69},{146,11,145},{134,0, +1265},{136,11,534},{134,0,1431},{11,0,138},{140,0,40},{4,0,155},{4,10,718},{7,0, +1689},{135,10,1216},{4,0,245},{5,0,151},{5,0,741},{6,0,1147},{7,0,498},{7,0,870} +,{7,0,1542},{12,0,213},{14,0,36},{14,0,391},{17,0,111},{18,0,6},{18,0,46},{18,0, +151},{19,0,36},{20,0,32},{20,0,56},{20,0,69},{20,0,102},{21,0,4},{22,0,8},{22,0, +10},{22,0,14},{150,0,31},{4,0,624},{135,0,1752},{5,10,124},{5,10,144},{6,10,548} +,{7,10,15},{7,10,153},{137,10,629},{6,0,503},{7,10,1531},{8,10,416},{9,0,586},{9 +,10,275},{10,10,100},{11,10,658},{11,10,979},{12,10,86},{13,0,468},{14,0,66},{14 +,10,207},{15,10,20},{15,10,25},{144,0,58},{5,0,603},{5,10,915},{6,10,1783},{7,0, +1212},{7,10,211},{7,10,1353},{9,0,565},{9,10,83},{10,10,376},{10,10,431},{11,10, +543},{12,10,664},{13,10,280},{13,10,428},{14,0,301},{14,10,128},{17,10,52},{145, +10,81},{4,0,492},{133,0,451},{135,0,835},{141,0,70},{132,0,539},{7,11,748},{139, +11,700},{7,11,1517},{11,11,597},{14,11,76},{14,11,335},{148,11,33},{6,0,113},{ +135,0,436},{4,10,338},{133,10,400},{136,0,718},{133,11,127},{133,11,418},{6,0, +1505},{6,11,198},{7,0,520},{11,10,892},{140,11,83},{4,10,221},{5,10,659},{5,10, +989},{7,10,697},{7,10,1211},{138,10,284},{135,0,1070},{5,11,276},{6,11,55},{135, +11,1369},{134,0,1515},{6,11,1752},{136,11,726},{138,10,507},{4,10,188},{7,10,805 +},{143,0,78},{5,10,884},{139,10,991},{133,11,764},{134,10,1653},{6,11,309},{7,11 +,331},{138,11,550},{135,11,1861},{132,11,348},{135,11,986},{135,11,1573},{12,0, +610},{13,0,431},{144,0,59},{9,11,799},{140,10,166},{134,0,1530},{132,0,750},{132 +,0,307},{133,0,964},{6,11,194},{7,11,133},{10,11,493},{10,11,570},{139,11,664},{ +5,11,24},{5,11,569},{6,11,3},{6,11,119},{6,11,143},{6,11,440},{7,11,295},{7,11, +599},{7,11,1686},{7,11,1854},{8,11,424},{9,11,43},{9,11,584},{9,11,760},{10,11, +148},{10,11,328},{11,11,159},{11,11,253},{11,11,506},{12,11,487},{12,11,531},{ +144,11,33},{136,10,760},{5,11,14},{5,11,892},{6,11,283},{7,11,234},{136,11,537}, +{135,11,1251},{4,11,126},{8,11,635},{147,11,34},{4,11,316},{135,11,1561},{6,0, +999},{6,0,1310},{137,11,861},{4,11,64},{5,11,352},{5,11,720},{6,11,368},{139,11, +359},{4,0,75},{5,0,180},{6,0,500},{7,0,58},{7,0,710},{8,10,770},{138,0,645},{133 +,0,649},{6,0,276},{7,0,282},{7,0,879},{7,0,924},{8,0,459},{9,0,599},{9,0,754},{ +11,0,574},{12,0,128},{12,0,494},{13,0,52},{13,0,301},{15,0,30},{143,0,132},{132, +0,200},{4,10,89},{5,10,489},{6,10,315},{7,10,553},{7,10,1745},{138,10,243},{135, +11,1050},{6,10,1658},{7,0,1621},{9,10,3},{10,10,154},{11,10,641},{13,10,85},{13, +10,201},{141,10,346},{6,11,175},{137,11,289},{5,11,432},{133,11,913},{6,0,225},{ +137,0,211},{7,0,718},{8,0,687},{139,0,374},{4,10,166},{133,10,505},{6,10,1670},{ +137,0,110},{8,0,58},{9,0,724},{11,0,809},{13,0,113},{145,0,72},{6,0,345},{7,0, +1247},{144,11,82},{5,11,931},{134,11,1698},{8,0,767},{8,0,803},{9,0,301},{137,0, +903},{139,0,203},{134,0,1154},{7,0,1949},{136,0,674},{134,0,259},{135,0,1275},{5 +,11,774},{6,11,1637},{6,11,1686},{134,11,1751},{134,0,1231},{7,10,445},{8,10,307 +},{8,10,704},{10,10,41},{10,10,439},{11,10,237},{11,10,622},{140,10,201},{136,0, +254},{6,11,260},{135,11,1484},{139,0,277},{135,10,1977},{4,10,189},{5,10,713},{6 +,11,573},{136,10,57},{138,10,371},{132,10,552},{134,11,344},{133,0,248},{6,11, +240},{9,0,800},{10,0,693},{11,0,482},{11,0,734},{139,0,789},{4,0,116},{4,11,292} +,{4,11,736},{5,0,95},{5,0,445},{5,11,871},{6,11,171},{6,11,1689},{7,0,1688},{7, +11,1324},{7,11,1944},{8,0,29},{9,0,272},{9,11,415},{9,11,580},{11,0,509},{11,0, +915},{14,11,230},{146,11,68},{7,0,490},{13,0,100},{143,0,75},{135,0,1641},{133,0 +,543},{7,11,209},{8,11,661},{10,11,42},{11,11,58},{12,11,58},{12,11,118},{141,11 +,32},{5,0,181},{6,11,63},{7,11,920},{136,0,41},{133,0,657},{133,11,793},{138,0, +709},{7,0,25},{8,0,202},{138,0,536},{5,11,665},{135,10,1788},{145,10,49},{9,0, +423},{140,0,89},{5,11,67},{6,11,62},{6,11,374},{135,11,1391},{8,0,113},{9,0,877} +,{9,11,790},{10,0,554},{11,0,83},{12,0,136},{12,11,47},{147,0,109},{138,10,661}, +{4,0,963},{7,10,1945},{10,0,927},{142,0,442},{133,0,976},{132,0,206},{4,11,391}, +{135,11,1169},{134,0,2002},{6,0,696},{134,0,1008},{134,0,1170},{132,11,271},{7,0 +,13},{8,0,226},{10,0,537},{11,0,570},{11,0,605},{11,0,799},{11,0,804},{12,0,85}, +{12,0,516},{12,0,623},{12,11,314},{13,0,112},{13,0,361},{14,0,77},{14,0,78},{17, +0,28},{147,0,110},{132,0,769},{134,0,1544},{4,0,551},{137,0,678},{5,10,84},{134, +10,163},{9,0,57},{9,0,459},{10,0,425},{11,0,119},{12,0,184},{12,0,371},{13,0,358 +},{145,0,51},{4,11,253},{5,0,188},{5,0,814},{5,10,410},{5,11,544},{7,11,300},{8, +0,10},{9,0,421},{9,0,729},{9,11,340},{10,0,609},{139,0,689},{134,0,624},{138,11, +321},{135,0,1941},{5,10,322},{8,10,186},{9,10,262},{10,10,187},{14,10,208},{146, +0,130},{5,11,53},{5,11,541},{6,11,94},{6,11,499},{7,11,230},{139,11,321},{133,10 +,227},{4,0,378},{4,11,920},{5,11,25},{5,11,790},{6,11,457},{135,11,853},{137,0, +269},{132,0,528},{134,0,1146},{7,10,1395},{8,10,486},{9,10,236},{9,10,878},{10, +10,218},{11,10,95},{19,10,17},{147,10,31},{7,10,2043},{8,10,672},{141,10,448},{ +134,0,1105},{134,0,1616},{134,11,1765},{140,11,163},{5,10,412},{133,11,822},{132 +,11,634},{6,0,656},{134,11,1730},{134,0,1940},{5,0,104},{6,0,173},{135,0,1631},{ +136,10,562},{6,11,36},{7,11,658},{8,11,454},{147,11,86},{5,0,457},{134,10,1771}, +{7,0,810},{8,0,138},{8,0,342},{9,0,84},{10,0,193},{11,0,883},{140,0,359},{7,10, +1190},{137,0,620},{137,10,132},{7,11,975},{137,11,789},{6,0,95},{6,0,1934},{136, +0,967},{141,11,335},{6,0,406},{10,0,409},{10,0,447},{11,0,44},{140,0,100},{4,10, +317},{135,10,1279},{132,0,477},{134,0,1268},{5,10,63},{5,10,509},{6,0,1941},{136 +,0,944},{132,0,629},{132,11,104},{4,0,246},{133,0,375},{4,10,288},{134,0,1636},{ +135,11,1614},{8,10,89},{8,10,620},{9,0,49},{10,0,774},{11,10,628},{12,10,322},{ +143,10,124},{4,0,282},{7,0,1034},{11,0,398},{11,0,634},{12,0,1},{12,0,79},{12,0, +544},{14,0,237},{17,0,10},{146,0,20},{132,0,824},{7,11,45},{9,11,542},{9,11,566} +,{138,11,728},{5,0,118},{5,0,499},{6,0,476},{6,0,665},{6,0,1176},{6,0,1196},{7,0 +,600},{7,0,888},{135,0,1096},{7,0,296},{7,0,596},{8,0,560},{8,0,586},{9,0,612},{ +11,0,304},{12,0,46},{13,0,89},{14,0,112},{145,0,122},{5,0,894},{6,0,1772},{9,0, +1009},{138,10,120},{5,11,533},{7,11,755},{138,11,780},{151,10,1},{6,0,1474},{7, +11,87},{142,11,288},{139,0,366},{137,10,461},{7,11,988},{7,11,1939},{9,11,64},{9 +,11,502},{12,11,7},{12,11,34},{13,11,12},{13,11,234},{147,11,77},{7,0,1599},{7,0 +,1723},{8,0,79},{8,0,106},{8,0,190},{8,0,302},{8,0,383},{8,0,713},{9,0,119},{9,0 +,233},{9,0,419},{9,0,471},{10,0,181},{10,0,406},{11,0,57},{11,0,85},{11,0,120},{ +11,0,177},{11,0,296},{11,0,382},{11,0,454},{11,0,758},{11,0,999},{12,0,27},{12,0 +,98},{12,0,131},{12,0,245},{12,0,312},{12,0,446},{12,0,454},{13,0,25},{13,0,98}, +{13,0,426},{13,0,508},{14,0,70},{14,0,163},{14,0,272},{14,0,277},{14,0,370},{15, +0,95},{15,0,138},{15,0,167},{17,0,38},{148,0,96},{135,10,1346},{10,0,200},{19,0, +2},{151,0,22},{135,11,141},{134,10,85},{134,0,1759},{138,0,372},{145,0,16},{4,11 +,619},{136,0,943},{139,11,88},{5,11,246},{8,11,189},{9,11,355},{9,11,512},{10,11 +,124},{10,11,453},{11,11,143},{11,11,416},{11,11,859},{141,11,341},{5,0,258},{ +134,0,719},{6,0,1798},{6,0,1839},{8,0,900},{10,0,874},{10,0,886},{12,0,698},{12, +0,732},{12,0,770},{16,0,106},{18,0,163},{18,0,170},{18,0,171},{152,0,20},{9,0, +707},{9,11,707},{11,0,326},{11,0,339},{11,11,326},{11,11,339},{12,0,423},{12,0, +502},{12,11,423},{12,11,502},{20,0,62},{148,11,62},{5,0,30},{7,0,495},{8,0,134}, +{9,0,788},{140,0,438},{133,11,678},{5,10,279},{6,10,235},{7,10,468},{8,10,446},{ +9,10,637},{10,10,717},{11,10,738},{140,10,514},{5,11,35},{6,11,287},{7,11,862},{ +7,11,1886},{138,11,179},{4,11,517},{7,0,1948},{135,0,2004},{5,10,17},{6,10,371}, +{137,10,528},{4,0,115},{5,0,669},{6,0,407},{8,0,311},{11,0,10},{141,0,5},{137,0, +381},{5,0,50},{6,0,439},{7,0,780},{135,0,1040},{136,11,667},{11,11,403},{146,11, +83},{5,0,1},{6,0,81},{138,0,520},{134,0,738},{5,0,482},{8,0,98},{9,0,172},{10,0, +360},{10,0,700},{10,0,822},{11,0,302},{11,0,778},{12,0,50},{12,0,127},{12,0,396} +,{13,0,62},{13,0,328},{14,0,122},{147,0,72},{9,11,157},{10,11,131},{140,11,72},{ +135,11,714},{135,11,539},{5,0,2},{6,0,512},{7,0,797},{7,0,1494},{8,0,253},{8,0, +589},{9,0,77},{10,0,1},{10,0,129},{10,0,225},{11,0,118},{11,0,226},{11,0,251},{ +11,0,430},{11,0,701},{11,0,974},{11,0,982},{12,0,64},{12,0,260},{12,0,488},{140, +0,690},{5,11,394},{7,11,367},{7,11,487},{7,11,857},{7,11,1713},{8,11,246},{9,11, +537},{10,11,165},{12,11,219},{140,11,561},{136,0,557},{5,10,779},{5,10,807},{6, +10,1655},{134,10,1676},{4,10,196},{5,10,558},{133,10,949},{11,11,827},{12,11,56} +,{14,11,34},{143,11,148},{137,0,347},{133,0,572},{134,0,832},{4,0,12},{7,0,504}, +{7,0,522},{7,0,809},{8,0,797},{141,0,88},{4,10,752},{133,11,449},{7,11,86},{8,11 +,103},{145,11,69},{7,11,2028},{138,11,641},{5,0,528},{6,11,1},{142,11,2},{134,0, +861},{4,10,227},{5,10,159},{5,10,409},{7,10,80},{10,0,294},{10,10,479},{12,10, +418},{14,10,50},{14,10,249},{142,10,295},{7,10,1470},{8,10,66},{8,10,137},{8,10, +761},{9,10,638},{11,10,80},{11,10,212},{11,10,368},{11,10,418},{12,10,8},{13,10, +15},{16,10,61},{17,10,59},{19,10,28},{148,10,84},{7,11,1148},{148,0,109},{6,11, +277},{7,11,1274},{7,11,1386},{7,11,1392},{12,11,129},{146,11,87},{6,11,187},{7, +11,39},{7,11,1203},{8,11,380},{8,11,542},{14,11,117},{149,11,28},{134,0,1187},{5 +,0,266},{9,0,290},{9,0,364},{10,0,293},{11,0,606},{142,0,45},{6,11,297},{7,11, +793},{139,11,938},{4,0,50},{6,0,594},{9,0,121},{10,0,49},{10,0,412},{139,0,834}, +{136,0,748},{7,11,464},{8,11,438},{11,11,105},{11,11,363},{12,11,231},{14,11,386 +},{15,11,102},{148,11,75},{132,0,466},{6,10,38},{7,10,1220},{8,10,185},{8,10,256 +},{9,10,22},{9,10,331},{10,10,738},{11,10,205},{11,10,540},{11,10,746},{13,0,399 +},{13,10,465},{14,0,337},{142,10,194},{9,0,378},{141,0,162},{137,0,519},{4,10, +159},{6,10,115},{7,10,252},{7,10,257},{7,10,1928},{8,10,69},{9,10,384},{10,10,91 +},{10,10,615},{12,10,375},{14,10,235},{18,10,117},{147,10,123},{5,10,911},{5,11, +604},{136,10,278},{132,0,667},{4,10,151},{7,10,1567},{8,0,351},{137,0,322},{134, +0,902},{133,10,990},{5,10,194},{7,10,1662},{9,10,90},{140,0,180},{4,0,869},{134, +0,1996},{134,0,813},{133,10,425},{137,11,761},{132,0,260},{133,10,971},{5,11,20} +,{6,11,298},{7,11,659},{7,11,1366},{137,11,219},{4,0,39},{5,0,36},{7,0,1843},{8, +0,407},{11,0,144},{140,0,523},{4,0,510},{10,0,587},{139,10,752},{7,0,29},{7,0,66 +},{7,0,1980},{10,0,487},{138,0,809},{9,10,662},{13,0,260},{14,0,82},{146,0,63},{ +5,10,72},{6,10,264},{7,10,21},{7,10,46},{7,10,2013},{8,10,215},{8,10,513},{10,10 +,266},{139,10,22},{134,0,570},{4,11,439},{6,0,565},{7,0,1667},{10,10,95},{11,10, +603},{12,11,242},{13,10,443},{14,10,160},{143,10,4},{134,0,1464},{134,10,431},{5 +,10,874},{6,10,1677},{9,0,372},{15,0,2},{15,10,0},{19,0,10},{147,0,18},{132,0, +787},{6,0,380},{7,10,939},{7,10,1172},{7,10,1671},{9,10,540},{10,10,696},{11,10, +265},{11,10,732},{11,10,928},{11,10,937},{12,0,399},{13,10,438},{149,0,19},{137, +0,200},{132,11,233},{132,0,516},{134,11,577},{132,0,844},{11,0,887},{14,0,365},{ +142,0,375},{132,11,482},{8,0,821},{140,0,44},{7,0,1655},{136,0,305},{5,10,682},{ +135,10,1887},{135,11,346},{132,10,696},{4,0,10},{7,0,917},{139,0,786},{5,11,795} +,{6,11,1741},{8,11,417},{137,11,782},{4,0,1016},{134,0,2031},{4,10,726},{5,0,684 +},{133,10,630},{6,0,1021},{134,0,1480},{8,10,802},{136,10,838},{134,0,27},{134,0 +,395},{135,11,622},{7,11,625},{135,11,1750},{4,11,203},{135,11,1936},{6,10,118}, +{7,10,215},{7,10,1521},{140,10,11},{132,0,813},{136,0,511},{7,10,615},{138,10, +251},{135,10,1044},{145,0,56},{133,10,225},{6,0,342},{6,0,496},{8,0,275},{137,0, +206},{4,0,909},{133,0,940},{132,0,891},{7,11,311},{9,11,308},{140,11,255},{4,10, +370},{5,10,756},{135,10,1326},{4,0,687},{134,0,1596},{134,0,1342},{6,10,1662},{7 +,10,48},{8,10,771},{10,10,116},{13,10,104},{14,10,105},{14,10,184},{15,10,168},{ +19,10,92},{148,10,68},{138,10,209},{4,11,400},{5,11,267},{135,11,232},{151,11,12 +},{6,0,41},{141,0,160},{141,11,314},{134,0,1718},{136,0,778},{142,11,261},{134,0 +,1610},{133,0,115},{132,0,294},{4,10,120},{142,0,314},{132,0,983},{5,0,193},{140 +,0,178},{138,10,429},{5,10,820},{135,10,931},{5,11,732},{6,0,994},{6,0,1051},{6, +0,1439},{135,0,174},{4,11,100},{7,11,679},{8,11,313},{138,10,199},{6,10,151},{6, +10,1675},{7,10,383},{151,10,10},{6,0,1796},{8,0,848},{8,0,867},{8,0,907},{10,0, +855},{140,0,703},{140,0,221},{4,0,122},{5,0,796},{5,0,952},{6,0,1660},{6,0,1671} +,{8,0,567},{9,0,687},{9,0,742},{10,0,686},{11,0,682},{11,0,909},{140,0,281},{5, +11,362},{5,11,443},{6,11,318},{7,11,1019},{139,11,623},{5,11,463},{136,11,296},{ +6,10,1624},{11,0,583},{12,10,422},{13,0,262},{142,10,360},{5,0,179},{7,0,1095},{ +135,0,1213},{4,10,43},{4,11,454},{5,10,344},{133,10,357},{4,0,66},{7,0,722},{135 +,0,904},{134,0,773},{5,10,888},{135,0,352},{5,11,48},{5,11,404},{6,11,557},{7,11 +,458},{8,11,597},{10,11,455},{10,11,606},{11,11,49},{11,11,548},{12,11,476},{13, +11,18},{141,11,450},{134,11,418},{132,10,711},{5,11,442},{135,11,1984},{141,0,35 +},{137,0,152},{134,0,1197},{135,11,1093},{137,11,203},{137,10,440},{10,0,592},{ +10,0,753},{12,0,317},{12,0,355},{12,0,465},{12,0,469},{12,0,560},{12,0,578},{141 +,0,243},{133,0,564},{134,0,797},{5,10,958},{133,10,987},{5,11,55},{7,11,376},{ +140,11,161},{133,11,450},{134,0,556},{134,0,819},{11,10,276},{142,10,293},{7,0, +544},{138,0,61},{4,10,65},{5,10,479},{5,10,1004},{7,10,1913},{8,0,719},{8,10,317 +},{9,10,302},{10,10,612},{141,10,22},{4,0,5},{4,10,261},{4,11,213},{5,0,498},{7, +10,510},{7,11,223},{8,0,637},{8,11,80},{137,0,521},{4,10,291},{5,0,927},{7,0,101 +},{7,11,381},{7,11,806},{7,11,820},{8,11,354},{8,11,437},{8,11,787},{9,10,515},{ +9,11,657},{10,11,58},{10,11,339},{10,11,749},{11,11,914},{12,10,152},{12,10,443} +,{12,11,162},{13,10,392},{13,11,75},{14,10,357},{14,11,106},{14,11,198},{14,11, +320},{14,11,413},{146,11,43},{6,0,1153},{7,0,1441},{136,11,747},{4,0,893},{5,0, +780},{133,0,893},{138,11,654},{133,11,692},{133,0,238},{134,11,191},{4,10,130},{ +135,10,843},{5,10,42},{5,10,879},{6,0,1296},{7,10,245},{7,10,324},{7,10,1532},{ +11,10,463},{11,10,472},{13,10,363},{144,10,52},{134,0,1729},{6,0,1999},{136,0, +969},{4,10,134},{133,10,372},{4,0,60},{7,0,941},{7,0,1800},{8,0,314},{9,0,700},{ +139,0,487},{134,0,1144},{6,11,162},{7,11,1960},{136,11,831},{132,11,706},{135,0, +1147},{138,11,426},{138,11,89},{7,0,1853},{138,0,437},{136,0,419},{135,10,1634}, +{133,0,828},{4,10,644},{5,0,806},{7,0,176},{7,0,178},{7,0,1240},{135,0,1976},{ +135,11,1877},{5,11,420},{135,11,1449},{4,0,51},{5,0,39},{6,0,4},{7,0,591},{7,0, +849},{7,0,951},{7,0,1613},{7,0,1760},{7,0,1988},{9,0,434},{10,0,754},{11,0,25},{ +139,0,37},{10,11,57},{138,11,277},{135,10,540},{132,11,204},{135,0,159},{139,11, +231},{133,0,902},{7,0,928},{7,11,366},{9,11,287},{12,11,199},{12,11,556},{140,11 +,577},{6,10,623},{136,10,789},{4,10,908},{5,10,359},{5,10,508},{6,10,1723},{7,10 +,343},{7,10,1996},{135,10,2026},{134,0,270},{4,10,341},{135,10,480},{5,11,356},{ +135,11,224},{11,11,588},{11,11,864},{11,11,968},{143,11,160},{132,0,556},{137,0, +801},{132,0,416},{142,0,372},{5,0,152},{5,0,197},{7,0,340},{7,0,867},{10,0,548}, +{10,0,581},{11,0,6},{12,0,3},{12,0,19},{14,0,110},{142,0,289},{139,0,369},{7,11, +630},{9,11,567},{11,11,150},{11,11,444},{141,11,119},{134,11,539},{7,10,1995},{8 +,10,299},{11,10,890},{140,10,674},{7,0,34},{7,0,190},{8,0,28},{8,0,141},{8,0,444 +},{8,0,811},{9,0,468},{11,0,334},{12,0,24},{12,0,386},{140,0,576},{133,0,757},{7 +,0,1553},{136,0,898},{133,0,721},{136,0,1012},{4,0,789},{5,0,647},{135,0,1102},{ +132,0,898},{4,10,238},{5,10,503},{6,10,179},{7,10,2003},{8,10,381},{8,10,473},{9 +,10,149},{10,0,183},{10,10,788},{15,10,45},{15,10,86},{20,10,110},{150,10,57},{4 +,10,121},{5,10,156},{5,10,349},{9,0,136},{10,10,605},{14,10,342},{147,0,107},{4, +11,235},{135,11,255},{4,11,194},{5,11,584},{6,11,384},{7,11,583},{10,11,761},{11 +,11,760},{139,11,851},{6,10,80},{6,10,1694},{7,10,173},{7,10,1974},{9,10,547},{ +10,10,730},{14,10,18},{150,10,39},{4,10,923},{134,10,1711},{5,0,277},{141,0,247} +,{132,0,435},{133,11,562},{134,0,1311},{5,11,191},{137,11,271},{132,10,595},{7, +11,1537},{14,11,96},{143,11,73},{5,0,437},{6,10,459},{7,0,502},{7,0,519},{7,0, +1122},{7,0,1751},{7,10,1753},{7,10,1805},{8,10,658},{9,10,1},{11,10,959},{13,10, +446},{142,0,211},{4,11,470},{5,11,473},{6,0,814},{6,11,153},{7,11,1503},{7,11, +1923},{10,11,701},{11,11,132},{11,11,168},{11,11,227},{11,11,320},{11,11,436},{ +11,11,525},{11,11,855},{12,11,41},{12,11,286},{13,11,103},{13,11,284},{14,11,255 +},{14,11,262},{15,11,117},{143,11,127},{5,0,265},{6,0,212},{135,0,28},{138,0,750 +},{133,11,327},{6,11,552},{7,11,1754},{137,11,604},{134,0,2012},{132,0,702},{5, +11,80},{6,11,405},{7,11,403},{7,11,1502},{7,11,1626},{8,11,456},{9,11,487},{9,11 +,853},{9,11,889},{10,11,309},{11,11,721},{11,11,994},{12,11,430},{141,11,165},{5 +,0,808},{135,0,2045},{5,0,166},{8,0,739},{140,0,511},{134,10,490},{4,11,453},{5, +11,887},{6,11,535},{8,11,6},{136,11,543},{4,0,119},{5,0,170},{5,0,447},{7,0,1708 +},{7,0,1889},{9,0,357},{9,0,719},{12,0,486},{140,0,596},{137,0,500},{7,10,250},{ +136,10,507},{132,10,158},{6,0,809},{134,0,1500},{4,10,140},{7,10,362},{8,10,209} +,{9,0,327},{9,10,10},{9,10,503},{9,10,614},{10,10,689},{11,0,350},{11,0,831},{11 +,10,327},{11,10,725},{12,10,252},{12,10,583},{13,0,352},{13,10,192},{14,10,269}, +{14,10,356},{148,10,50},{135,11,741},{4,0,450},{7,0,1158},{19,10,1},{19,10,26},{ +150,10,9},{6,0,597},{135,0,1318},{134,0,1602},{6,10,228},{7,10,1341},{9,10,408}, +{138,10,343},{7,0,1375},{7,0,1466},{138,0,331},{132,0,754},{132,10,557},{5,11, +101},{6,11,88},{6,11,543},{7,11,1677},{9,11,100},{10,11,677},{14,11,169},{14,11, +302},{14,11,313},{15,11,48},{143,11,84},{134,0,1368},{4,11,310},{9,11,795},{10, +11,733},{11,11,451},{12,11,249},{14,11,115},{14,11,286},{143,11,100},{132,10,548 +},{7,10,197},{8,10,142},{8,10,325},{9,10,150},{9,10,596},{10,0,557},{10,10,353}, +{11,10,74},{11,10,315},{12,10,662},{12,10,681},{14,10,423},{143,10,141},{133,11, +587},{5,0,850},{136,0,799},{10,0,908},{12,0,701},{12,0,757},{142,0,466},{4,0,62} +,{5,0,275},{6,10,399},{6,10,579},{7,10,692},{7,10,846},{7,10,1015},{7,10,1799},{ +8,10,403},{9,10,394},{10,10,133},{12,10,4},{12,10,297},{12,10,452},{16,10,81},{ +18,0,19},{18,10,25},{21,10,14},{22,10,12},{151,10,18},{7,10,1546},{11,10,299},{ +12,0,459},{142,10,407},{132,10,177},{132,11,498},{7,11,217},{8,11,140},{138,11, +610},{5,10,411},{135,10,653},{134,0,1802},{7,10,439},{10,10,727},{11,10,260},{ +139,10,684},{133,11,905},{11,11,580},{142,11,201},{134,0,1397},{5,10,208},{7,10, +753},{135,10,1528},{7,0,238},{7,0,2033},{8,0,120},{8,0,188},{8,0,659},{9,0,598}, +{10,0,466},{12,0,342},{12,0,588},{13,0,503},{14,0,246},{143,0,92},{135,11,1041}, +{4,11,456},{7,11,105},{7,11,358},{7,11,1637},{8,11,643},{139,11,483},{6,0,1318}, +{134,0,1324},{4,0,201},{5,10,242},{7,0,1744},{8,0,602},{11,0,247},{11,0,826},{ +145,0,65},{8,0,164},{146,0,62},{133,10,953},{139,10,802},{133,0,615},{7,11,1566} +,{8,11,269},{9,11,212},{9,11,718},{14,11,15},{14,11,132},{142,11,227},{133,10, +290},{132,10,380},{5,10,52},{7,10,277},{9,10,368},{139,10,791},{135,0,1243},{133 +,11,539},{11,11,919},{141,11,409},{136,0,968},{133,11,470},{134,0,882},{132,0, +907},{5,0,100},{10,0,329},{12,0,416},{149,0,29},{10,10,138},{139,10,476},{5,10, +725},{5,10,727},{6,11,91},{7,10,1811},{135,11,435},{4,11,16},{5,11,316},{5,11, +842},{6,11,370},{6,11,1778},{8,11,166},{11,11,812},{12,11,206},{12,11,351},{14, +11,418},{16,11,15},{16,11,34},{18,11,3},{19,11,3},{19,11,7},{20,11,4},{149,11,21 +},{132,0,176},{5,0,636},{5,0,998},{7,0,9},{7,0,1508},{8,0,26},{9,0,317},{9,0,358 +},{10,0,210},{10,0,292},{10,0,533},{11,0,555},{12,0,526},{12,0,607},{13,0,263},{ +13,0,459},{142,0,271},{4,10,38},{6,0,256},{7,10,307},{7,10,999},{7,10,1481},{7, +10,1732},{7,10,1738},{8,0,265},{9,10,414},{11,10,316},{12,10,52},{13,10,420},{ +147,10,100},{135,10,1296},{4,11,611},{133,11,606},{4,0,643},{142,11,21},{133,11, +715},{133,10,723},{6,0,610},{135,11,597},{10,0,127},{141,0,27},{6,0,1995},{6,0, +2001},{8,0,119},{136,0,973},{4,11,149},{138,11,368},{4,11,154},{5,10,109},{6,10, +1784},{7,10,1895},{7,11,1134},{8,11,105},{12,0,522},{12,10,296},{140,10,302},{4, +11,31},{6,11,429},{7,11,962},{9,11,458},{139,11,691},{4,11,312},{5,10,216},{7,10 +,1879},{9,10,141},{9,10,270},{9,10,679},{10,0,553},{10,10,159},{11,0,876},{11,10 +,197},{12,10,538},{12,10,559},{13,0,193},{13,0,423},{14,0,166},{14,10,144},{14, +10,167},{15,10,67},{147,0,84},{134,0,1582},{7,0,1578},{135,11,1578},{137,10,81}, +{132,11,236},{134,10,391},{134,0,795},{7,10,322},{136,10,249},{5,11,836},{5,11, +857},{6,11,1680},{7,11,59},{147,11,53},{135,0,432},{10,11,68},{139,11,494},{4,11 +,81},{139,11,867},{7,0,126},{136,0,84},{142,11,280},{5,11,282},{8,11,650},{9,11, +295},{9,11,907},{138,11,443},{136,0,790},{5,10,632},{138,10,526},{6,0,64},{12,0, +377},{13,0,309},{14,0,141},{14,0,429},{14,11,141},{142,11,429},{134,0,1529},{6,0 +,321},{7,0,1857},{7,10,948},{7,10,1042},{8,10,235},{8,10,461},{9,0,530},{9,10, +453},{10,10,354},{17,10,77},{147,0,99},{7,0,1104},{11,0,269},{11,0,539},{11,0, +627},{11,0,706},{11,0,975},{12,0,248},{12,0,434},{12,0,600},{12,0,622},{13,0,297 +},{13,0,485},{14,0,69},{14,0,409},{143,0,108},{4,10,362},{7,10,52},{7,10,303},{ +10,11,70},{12,11,26},{14,11,17},{14,11,178},{15,11,34},{149,11,12},{11,0,977},{ +141,0,507},{9,0,34},{139,0,484},{5,10,196},{6,10,486},{7,10,212},{8,10,309},{136 +,10,346},{6,0,1700},{7,0,26},{7,0,293},{7,0,382},{7,0,1026},{7,0,1087},{7,0,2027 +},{7,10,1912},{8,0,24},{8,0,114},{8,0,252},{8,0,727},{8,0,729},{9,0,30},{9,0,199 +},{9,0,231},{9,0,251},{9,0,334},{9,0,361},{9,0,712},{10,0,55},{10,0,60},{10,0, +232},{10,0,332},{10,0,384},{10,0,396},{10,0,504},{10,0,542},{10,0,652},{11,0,20} +,{11,0,48},{11,0,207},{11,0,291},{11,0,298},{11,0,342},{11,0,365},{11,0,394},{11 +,0,620},{11,0,705},{11,0,1017},{12,0,123},{12,0,340},{12,0,406},{12,0,643},{13,0 +,61},{13,0,269},{13,0,311},{13,0,319},{13,0,486},{14,0,234},{15,0,62},{15,0,85}, +{16,0,71},{18,0,119},{148,0,105},{4,11,71},{5,11,376},{7,11,119},{138,11,665},{4 +,10,686},{8,11,55},{10,0,918},{138,0,926},{138,10,625},{136,10,706},{132,11,479} +,{4,10,30},{133,10,43},{6,0,379},{7,0,270},{7,11,607},{8,0,176},{8,0,183},{8,11, +99},{9,0,432},{9,0,661},{12,0,247},{12,0,617},{18,0,125},{152,11,4},{5,0,792},{ +133,0,900},{4,11,612},{133,11,561},{4,10,220},{4,11,41},{5,11,74},{7,10,1535},{7 +,11,1627},{11,11,871},{140,11,619},{135,0,1920},{7,11,94},{11,11,329},{11,11,965 +},{12,11,241},{14,11,354},{15,11,22},{148,11,63},{9,11,209},{137,11,300},{134,0, +771},{135,0,1979},{4,0,901},{133,0,776},{142,0,254},{133,11,98},{9,11,16},{141, +11,386},{133,11,984},{4,11,182},{6,11,205},{135,11,220},{7,10,1725},{7,10,1774}, +{138,10,393},{5,10,263},{134,10,414},{4,11,42},{9,11,205},{9,11,786},{138,11,659 +},{14,0,140},{148,0,41},{6,10,178},{6,10,1750},{6,11,289},{7,11,1670},{8,0,440}, +{9,10,690},{10,0,359},{10,10,155},{10,10,373},{11,10,698},{12,11,57},{13,10,155} +,{20,10,93},{151,11,4},{4,0,37},{5,0,334},{7,0,1253},{151,11,25},{4,0,508},{4,11 +,635},{5,10,97},{137,10,393},{139,11,533},{4,0,640},{133,0,513},{134,10,1639},{ +132,11,371},{4,11,272},{7,11,836},{7,11,1651},{145,11,89},{5,11,825},{6,11,444}, +{6,11,1640},{136,11,308},{4,10,191},{7,10,934},{8,10,647},{145,10,97},{12,0,246} +,{15,0,162},{19,0,64},{20,0,8},{20,0,95},{22,0,24},{152,0,17},{4,0,533},{5,10, +165},{9,10,346},{138,10,655},{5,11,737},{139,10,885},{133,10,877},{8,10,128},{ +139,10,179},{137,11,307},{140,0,752},{133,0,920},{135,0,1048},{5,0,153},{6,0,580 +},{6,10,1663},{7,10,132},{7,10,1154},{7,10,1415},{7,10,1507},{12,10,493},{15,10, +105},{151,10,15},{5,10,459},{7,10,1073},{8,10,241},{136,10,334},{138,0,391},{135 +,0,1952},{133,11,525},{8,11,641},{11,11,388},{140,11,580},{142,0,126},{134,0,640 +},{132,0,483},{6,10,324},{6,10,520},{7,0,1616},{7,10,338},{7,10,1729},{8,10,228} +,{9,0,69},{139,10,750},{5,11,493},{134,11,528},{135,0,734},{4,11,174},{135,11, +911},{138,0,480},{9,0,495},{146,0,104},{135,10,705},{4,10,73},{6,10,612},{7,10, +927},{7,10,1330},{7,10,1822},{8,10,217},{9,0,472},{9,10,765},{9,10,766},{10,10, +408},{11,10,51},{11,10,793},{12,10,266},{15,10,158},{20,10,89},{150,10,32},{7,11 +,548},{137,11,58},{4,11,32},{5,11,215},{6,11,269},{7,11,1782},{7,11,1892},{10,11 +,16},{11,11,822},{11,11,954},{141,11,481},{132,0,874},{5,10,389},{8,10,636},{137 +,0,229},{7,11,1749},{136,11,477},{134,0,948},{5,11,308},{135,11,1088},{4,0,748}, +{139,0,1009},{136,10,21},{6,0,555},{135,0,485},{5,11,126},{8,11,297},{9,11,366}, +{9,11,445},{12,11,53},{12,11,374},{141,11,492},{7,11,1551},{139,11,361},{136,0, +193},{136,0,472},{8,0,653},{13,0,93},{147,0,14},{132,0,984},{132,11,175},{4,11, +685},{5,0,172},{134,0,1971},{149,11,8},{133,11,797},{5,10,189},{7,10,442},{7,10, +443},{8,10,281},{12,10,174},{13,0,83},{141,10,261},{134,0,1568},{133,11,565},{ +139,0,384},{133,0,260},{6,10,2},{7,0,758},{7,0,880},{7,0,1359},{7,10,1262},{7,10 +,1737},{8,10,22},{8,10,270},{8,10,612},{9,0,164},{9,0,167},{9,10,312},{9,10,436} +,{10,0,156},{10,0,588},{10,10,311},{10,10,623},{11,10,72},{11,10,330},{11,10,455 +},{12,0,101},{12,10,321},{12,10,504},{12,10,530},{12,10,543},{13,10,17},{13,10, +156},{13,10,334},{14,0,48},{15,0,70},{17,10,60},{148,10,64},{4,11,252},{7,11, +1068},{10,11,434},{11,11,228},{11,11,426},{13,11,231},{18,11,106},{148,11,87},{7 +,10,354},{10,10,410},{139,10,815},{6,0,367},{7,10,670},{7,10,1327},{8,10,411},{8 +,10,435},{9,10,653},{9,10,740},{10,10,385},{11,10,222},{11,10,324},{11,10,829},{ +140,10,611},{6,10,166},{7,0,1174},{135,10,374},{146,0,121},{132,0,828},{5,11,231 +},{138,11,509},{7,11,601},{9,11,277},{9,11,674},{10,11,178},{10,11,257},{10,11, +418},{11,11,531},{11,11,544},{11,11,585},{12,11,113},{12,11,475},{13,11,99},{142 +,11,428},{134,0,1541},{135,11,1779},{5,0,343},{134,10,398},{135,10,50},{135,11, +1683},{4,0,440},{7,0,57},{8,0,167},{8,0,375},{9,0,82},{9,0,561},{9,0,744},{9,11, +744},{138,0,620},{134,0,926},{6,10,517},{7,10,1159},{10,10,621},{139,10,192},{ +137,0,827},{8,0,194},{136,0,756},{10,10,223},{139,10,645},{7,10,64},{136,10,245} +,{4,11,399},{5,11,119},{5,11,494},{7,11,751},{137,11,556},{132,0,808},{135,0,22} +,{7,10,1763},{140,10,310},{5,0,639},{6,11,584},{7,0,1249},{139,0,896},{134,0, +1614},{135,0,860},{135,11,1121},{5,10,129},{6,10,61},{135,10,947},{4,0,102},{7,0 +,815},{7,0,1699},{139,0,964},{13,10,505},{141,10,506},{139,10,1000},{132,11,679} +,{132,0,899},{132,0,569},{5,11,694},{137,11,714},{136,0,795},{6,0,2045},{139,11, +7},{6,0,52},{9,0,104},{9,0,559},{12,0,308},{147,0,87},{4,0,301},{132,0,604},{133 +,10,637},{136,0,779},{5,11,143},{5,11,769},{6,11,1760},{7,11,682},{7,11,1992},{ +136,11,736},{137,10,590},{147,0,32},{137,11,527},{5,10,280},{135,10,1226},{134,0 +,494},{6,0,677},{6,0,682},{134,0,1044},{133,10,281},{135,10,1064},{5,11,860},{ +135,0,508},{6,11,422},{7,11,0},{7,11,1544},{9,11,577},{11,11,990},{12,11,141},{ +12,11,453},{13,11,47},{141,11,266},{134,0,1014},{5,11,515},{137,11,131},{134,0, +957},{132,11,646},{6,0,310},{7,0,1849},{8,0,72},{8,0,272},{8,0,431},{9,0,12},{9, +0,376},{10,0,563},{10,0,630},{10,0,796},{10,0,810},{11,0,367},{11,0,599},{11,0, +686},{140,0,672},{4,11,396},{7,0,570},{7,10,120},{7,11,728},{8,10,489},{9,10,319 +},{9,11,117},{10,10,820},{11,10,1004},{12,10,379},{12,10,679},{13,10,117},{13,10 +,412},{13,11,202},{14,10,25},{15,10,52},{15,10,161},{16,10,47},{20,11,51},{149, +10,2},{6,11,121},{6,11,124},{6,11,357},{7,11,1138},{7,11,1295},{8,11,162},{139, +11,655},{4,10,937},{5,10,801},{8,0,449},{136,11,449},{139,11,958},{6,0,181},{7,0 +,537},{8,0,64},{9,0,127},{10,0,496},{12,0,510},{141,0,384},{138,11,253},{4,0,244 +},{135,0,233},{133,11,237},{132,10,365},{6,0,1650},{10,0,702},{139,0,245},{5,10, +7},{139,10,774},{13,0,463},{13,11,463},{20,0,49},{148,11,49},{4,10,734},{5,10, +662},{134,10,430},{4,10,746},{135,10,1090},{5,10,360},{136,10,237},{137,0,338},{ +143,11,10},{7,11,571},{138,11,366},{134,0,1279},{9,11,513},{10,11,22},{10,11,39} +,{12,11,122},{140,11,187},{133,0,896},{146,0,178},{134,0,695},{137,0,808},{134, +11,587},{7,11,107},{7,11,838},{8,11,550},{138,11,401},{7,0,1117},{136,0,539},{4, +10,277},{5,10,608},{6,10,493},{7,10,457},{140,10,384},{133,11,768},{7,10,27},{7, +10,316},{140,0,257},{140,0,1003},{4,0,207},{5,0,586},{5,0,676},{5,10,552},{6,0, +448},{8,0,244},{11,0,1},{13,0,3},{16,0,54},{17,0,4},{146,0,13},{4,10,401},{137, +10,264},{5,0,516},{7,0,1883},{135,11,1883},{4,11,894},{140,0,960},{5,0,4},{5,0, +810},{6,0,13},{6,0,538},{6,0,1690},{6,0,1726},{7,0,499},{7,0,1819},{8,0,148},{8, +0,696},{8,0,791},{12,0,125},{143,0,9},{135,0,1268},{9,10,543},{10,10,524},{11,0, +30},{12,10,524},{14,0,315},{16,10,18},{20,10,26},{148,10,65},{4,10,205},{5,10, +623},{6,0,748},{7,10,104},{136,10,519},{11,0,542},{139,0,852},{140,0,6},{132,0, +848},{7,0,1385},{7,10,579},{9,10,41},{9,10,244},{9,10,669},{10,10,5},{11,0,582}, +{11,0,650},{11,0,901},{11,0,949},{11,10,861},{11,10,951},{11,10,980},{12,0,232}, +{12,0,236},{13,0,413},{13,0,501},{146,0,116},{4,0,945},{6,0,1811},{6,0,1845},{6, +0,1853},{6,0,1858},{8,0,862},{12,0,782},{12,0,788},{18,0,160},{148,0,117},{132, +10,717},{4,0,925},{5,0,803},{8,0,698},{138,0,828},{134,0,1416},{132,0,610},{139, +0,992},{6,0,878},{134,0,1477},{135,0,1847},{138,11,531},{137,11,539},{134,11,272 +},{133,0,383},{134,0,1404},{132,10,489},{4,11,9},{5,11,128},{7,11,368},{11,11, +480},{148,11,3},{136,0,986},{9,0,660},{138,0,347},{135,10,892},{136,11,682},{7,0 +,572},{9,0,592},{11,0,680},{12,0,356},{140,0,550},{7,0,1411},{138,11,527},{4,11, +2},{7,11,545},{135,11,894},{137,10,473},{7,10,819},{7,11,481},{9,10,26},{9,10, +392},{9,11,792},{10,10,152},{10,10,226},{11,0,64},{12,10,276},{12,10,426},{12,10 +,589},{13,10,460},{15,10,97},{19,10,48},{148,10,104},{135,10,51},{136,11,445},{ +136,11,646},{135,0,606},{132,10,674},{6,0,1829},{134,0,1830},{132,10,770},{5,10, +79},{7,10,1027},{7,10,1477},{139,10,52},{5,11,530},{142,11,113},{134,10,1666},{7 +,0,748},{139,0,700},{134,10,195},{133,10,789},{4,10,251},{4,10,688},{7,10,513},{ +7,10,1284},{9,0,87},{138,0,365},{136,11,111},{133,0,127},{6,0,198},{140,0,83},{ +133,11,556},{133,10,889},{4,10,160},{5,10,330},{7,10,1434},{136,10,174},{5,0,276 +},{6,0,55},{7,0,1369},{138,0,864},{8,11,16},{140,11,568},{6,0,1752},{136,0,726}, +{135,0,1066},{133,0,764},{6,11,186},{137,11,426},{11,0,683},{139,11,683},{6,0, +309},{7,0,331},{138,0,550},{133,10,374},{6,0,1212},{6,0,1852},{7,0,1062},{8,0, +874},{8,0,882},{138,0,936},{132,11,585},{134,0,1364},{5,10,731},{135,0,986},{6,0 +,723},{6,0,1408},{138,0,381},{135,0,1573},{134,0,1025},{4,10,626},{5,10,642},{6, +10,425},{10,10,202},{139,10,141},{4,11,93},{5,11,252},{6,11,229},{7,11,291},{9, +11,550},{139,11,644},{137,11,749},{137,11,162},{132,11,381},{135,0,1559},{6,0, +194},{7,0,133},{10,0,493},{10,0,570},{139,0,664},{5,0,24},{5,0,569},{6,0,3},{6,0 +,119},{6,0,143},{6,0,440},{7,0,295},{7,0,599},{7,0,1686},{7,0,1854},{8,0,424},{9 +,0,43},{9,0,584},{9,0,760},{10,0,148},{10,0,328},{11,0,159},{11,0,253},{11,0,506 +},{12,0,487},{140,0,531},{6,0,661},{134,0,1517},{136,10,835},{151,10,17},{5,0,14 +},{5,0,892},{6,0,283},{7,0,234},{136,0,537},{139,0,541},{4,0,126},{8,0,635},{147 +,0,34},{4,0,316},{4,0,495},{135,0,1561},{4,11,187},{5,11,184},{5,11,690},{7,11, +1869},{138,11,756},{139,11,783},{4,0,998},{137,0,861},{136,0,1009},{139,11,292}, +{5,11,21},{6,11,77},{6,11,157},{7,11,974},{7,11,1301},{7,11,1339},{7,11,1490},{7 +,11,1873},{137,11,628},{7,11,1283},{9,11,227},{9,11,499},{10,11,341},{11,11,325} +,{11,11,408},{14,11,180},{15,11,144},{18,11,47},{147,11,49},{4,0,64},{5,0,352},{ +5,0,720},{6,0,368},{139,0,359},{5,10,384},{8,10,455},{140,10,48},{5,10,264},{134 +,10,184},{7,0,1577},{10,0,304},{10,0,549},{12,0,365},{13,0,220},{13,0,240},{142, +0,33},{134,0,1107},{134,0,929},{135,0,1142},{6,0,175},{137,0,289},{5,0,432},{133 +,0,913},{5,10,633},{6,0,279},{7,0,219},{135,10,1323},{7,0,785},{7,10,359},{8,10, +243},{140,10,175},{139,0,595},{132,10,105},{8,11,398},{9,11,681},{139,11,632},{ +140,0,80},{5,0,931},{134,0,1698},{142,11,241},{134,11,20},{134,0,1323},{11,0,526 +},{11,0,939},{141,0,290},{5,0,774},{6,0,780},{6,0,1637},{6,0,1686},{6,0,1751},{8 +,0,559},{141,0,109},{141,0,127},{7,0,1167},{7,11,709},{11,0,934},{13,0,391},{145 +,0,76},{135,0,963},{6,0,260},{135,0,1484},{134,0,573},{4,10,758},{139,11,941},{ +135,10,1649},{145,11,36},{4,0,292},{137,0,580},{4,0,736},{5,0,871},{6,0,1689},{ +135,0,1944},{7,11,945},{11,11,713},{139,11,744},{134,0,1164},{135,11,937},{6,0, +1922},{7,11,1652},{9,0,982},{15,0,173},{15,0,178},{15,0,200},{18,0,189},{18,0, +207},{149,0,47},{7,0,1695},{139,10,128},{6,0,63},{135,0,920},{133,0,793},{143,11 +,134},{133,10,918},{5,0,67},{6,0,62},{6,0,374},{135,0,1391},{4,11,579},{5,11,226 +},{5,11,323},{7,11,960},{9,0,790},{140,0,47},{10,11,784},{141,11,191},{4,0,391}, +{135,0,1169},{137,0,443},{13,11,232},{146,11,35},{132,10,340},{132,0,271},{137, +11,313},{5,11,973},{137,11,659},{134,0,1140},{6,11,135},{135,11,1176},{4,0,253}, +{5,0,544},{7,0,300},{137,0,340},{5,10,985},{7,0,897},{7,10,509},{145,10,96},{138 +,11,735},{135,10,1919},{138,0,890},{5,0,818},{134,0,1122},{5,0,53},{5,0,541},{6, +0,94},{6,0,499},{7,0,230},{139,0,321},{4,0,920},{5,0,25},{5,0,790},{6,0,457},{7, +0,853},{8,0,788},{142,11,31},{132,10,247},{135,11,314},{132,0,468},{6,10,337},{7 +,0,243},{7,10,494},{8,10,27},{8,10,599},{138,10,153},{4,10,184},{5,10,390},{7,10 +,618},{7,10,1456},{139,10,710},{134,0,870},{134,0,1238},{134,0,1765},{10,0,853}, +{10,0,943},{14,0,437},{14,0,439},{14,0,443},{14,0,446},{14,0,452},{14,0,469},{14 +,0,471},{14,0,473},{16,0,93},{16,0,102},{16,0,110},{148,0,121},{4,0,605},{7,0, +518},{7,0,1282},{7,0,1918},{10,0,180},{139,0,218},{133,0,822},{4,0,634},{11,0, +916},{142,0,419},{6,11,281},{7,11,6},{8,11,282},{8,11,480},{8,11,499},{9,11,198} +,{10,11,143},{10,11,169},{10,11,211},{10,11,417},{10,11,574},{11,11,147},{11,11, +395},{12,11,75},{12,11,407},{12,11,608},{13,11,500},{142,11,251},{134,0,898},{6, +0,36},{7,0,658},{8,0,454},{150,11,48},{133,11,674},{135,11,1776},{4,11,419},{10, +10,227},{11,10,497},{11,10,709},{140,10,415},{6,10,360},{7,10,1664},{136,10,478} +,{137,0,806},{12,11,508},{14,11,102},{14,11,226},{144,11,57},{135,11,1123},{4,11 +,138},{7,11,1012},{7,11,1280},{137,11,76},{5,11,29},{140,11,638},{136,10,699},{ +134,0,1326},{132,0,104},{135,11,735},{132,10,739},{134,0,1331},{7,0,260},{135,11 +,260},{135,11,1063},{7,0,45},{9,0,542},{9,0,566},{9,10,869},{138,0,728},{4,10,67 +},{5,10,422},{7,10,1037},{7,10,1289},{7,10,1555},{9,10,741},{145,10,108},{139,0, +263},{134,0,1516},{14,0,146},{15,0,42},{16,0,23},{17,0,86},{146,0,17},{138,0,468 +},{136,0,1005},{4,11,17},{5,11,23},{7,11,995},{11,11,383},{11,11,437},{12,11,460 +},{140,11,532},{7,0,87},{142,0,288},{138,10,96},{135,11,626},{144,10,26},{7,0, +988},{7,0,1939},{9,0,64},{9,0,502},{12,0,22},{12,0,34},{13,0,12},{13,0,234},{147 +,0,77},{8,10,203},{11,10,823},{11,10,846},{12,10,482},{13,0,133},{13,10,277},{13 +,10,302},{13,10,464},{14,10,205},{142,10,221},{4,10,449},{133,10,718},{135,0,141 +},{6,0,1842},{136,0,872},{8,11,70},{12,11,171},{141,11,272},{4,10,355},{6,10,311 +},{9,10,256},{138,10,404},{132,0,619},{137,0,261},{10,10,758},{10,11,233},{139, +11,76},{5,0,246},{8,0,189},{9,0,355},{9,0,512},{10,0,124},{10,0,453},{11,0,143}, +{11,0,416},{11,0,859},{141,0,341},{134,11,442},{133,10,827},{5,10,64},{140,10, +581},{4,10,442},{7,10,1047},{7,10,1352},{135,10,1643},{134,11,1709},{5,0,678},{5 +,10,977},{6,0,305},{7,0,775},{135,0,1065},{11,11,69},{12,11,105},{12,11,117},{13 +,11,213},{14,11,13},{14,11,62},{14,11,177},{14,11,421},{15,11,19},{146,11,141},{ +137,11,309},{5,0,35},{7,0,862},{7,0,1886},{138,0,179},{136,0,285},{132,0,517},{7 +,11,976},{9,11,146},{10,11,206},{10,11,596},{13,11,218},{142,11,153},{132,10,254 +},{4,10,275},{6,0,214},{7,10,1219},{12,0,540},{140,10,376},{8,0,667},{11,0,403}, +{146,0,83},{10,11,648},{11,11,671},{12,0,74},{143,11,46},{135,0,125},{134,10, +1753},{133,0,761},{4,11,518},{6,0,912},{6,10,369},{6,10,502},{7,10,1036},{7,11, +1136},{8,10,348},{9,10,452},{10,10,26},{11,10,224},{11,10,387},{11,10,772},{12, +10,95},{12,10,629},{13,10,195},{13,10,207},{13,10,241},{14,10,260},{14,10,270},{ +143,10,140},{10,0,131},{140,0,72},{132,10,269},{5,10,480},{7,10,532},{7,10,1197} +,{7,10,1358},{8,10,291},{11,10,349},{142,10,396},{8,11,689},{137,11,863},{8,0, +333},{138,0,182},{4,11,18},{7,11,145},{7,11,444},{7,11,1278},{8,11,49},{8,11,400 +},{9,11,71},{9,11,250},{10,11,459},{12,11,160},{144,11,24},{14,11,35},{142,11, +191},{135,11,1864},{135,0,1338},{148,10,15},{14,0,94},{15,0,65},{16,0,4},{16,0, +77},{16,0,80},{145,0,5},{12,11,82},{143,11,36},{133,11,1010},{133,0,449},{133,0, +646},{7,0,86},{7,10,657},{136,0,103},{7,0,2028},{138,0,641},{136,10,533},{134,0, +1},{139,11,970},{5,11,87},{7,11,313},{7,11,1103},{10,11,112},{10,11,582},{11,11, +389},{11,11,813},{12,11,385},{13,11,286},{14,11,124},{146,11,108},{4,11,267},{ +134,0,869},{6,0,277},{7,0,1274},{7,0,1386},{146,0,87},{6,0,187},{7,0,39},{7,0, +1203},{8,0,380},{14,0,117},{149,0,28},{4,10,211},{4,10,332},{5,10,335},{6,10,238 +},{7,10,269},{7,10,811},{7,10,1797},{8,10,836},{9,10,507},{141,10,242},{4,0,785} +,{5,0,368},{6,0,297},{7,0,793},{139,0,938},{7,0,464},{8,0,558},{11,0,105},{12,0, +231},{14,0,386},{15,0,102},{148,0,75},{133,10,1009},{8,0,877},{140,0,731},{139, +11,289},{10,11,249},{139,11,209},{132,11,561},{134,0,1608},{132,11,760},{134,0, +1429},{9,11,154},{140,11,485},{5,10,228},{6,10,203},{7,10,156},{8,10,347},{137, +10,265},{7,0,1010},{11,0,733},{11,0,759},{13,0,34},{14,0,427},{146,0,45},{7,10, +1131},{135,10,1468},{136,11,255},{7,0,1656},{9,0,369},{10,0,338},{10,0,490},{11, +0,154},{11,0,545},{11,0,775},{13,0,77},{141,0,274},{133,11,621},{134,0,1038},{4, +11,368},{135,11,641},{6,0,2010},{8,0,979},{8,0,985},{10,0,951},{138,0,1011},{134 +,0,1005},{5,10,291},{5,10,318},{7,10,765},{9,10,389},{12,10,548},{147,0,121},{5, +0,20},{6,0,298},{7,0,659},{137,0,219},{7,0,1440},{11,0,854},{11,0,872},{11,0,921 +},{12,0,551},{13,0,472},{142,0,367},{5,0,490},{6,0,615},{6,0,620},{135,0,683},{6 +,0,1070},{134,0,1597},{139,0,522},{132,0,439},{136,0,669},{6,0,766},{6,0,1143},{ +6,0,1245},{10,10,525},{139,10,82},{9,11,92},{147,11,91},{6,0,668},{134,0,1218},{ +6,11,525},{9,11,876},{140,11,284},{132,0,233},{136,0,547},{132,10,422},{5,10,355 +},{145,10,0},{6,11,300},{135,11,1515},{4,0,482},{137,10,905},{4,0,886},{5,11,594 +},{135,0,346},{133,10,865},{5,10,914},{134,10,1625},{135,0,334},{5,0,795},{5,10, +234},{134,0,1741},{135,10,1383},{6,11,1641},{136,11,820},{135,0,371},{7,11,1313} +,{138,11,660},{135,10,1312},{135,0,622},{7,0,625},{135,0,1750},{135,0,339},{4,0, +203},{135,0,1936},{15,0,29},{15,11,29},{16,0,38},{144,11,38},{5,0,338},{135,0, +1256},{135,10,1493},{6,10,421},{7,10,61},{7,10,1540},{10,0,130},{138,10,501},{6, +11,389},{7,11,149},{9,11,142},{138,11,94},{137,10,341},{11,0,678},{12,0,307},{ +142,10,98},{6,11,8},{7,11,1881},{136,11,91},{135,0,2044},{6,0,770},{6,0,802},{6, +0,812},{6,10,102},{7,0,311},{7,10,72},{9,0,308},{12,0,255},{15,10,142},{147,10, +67},{151,10,30},{135,10,823},{135,0,1266},{135,11,1746},{135,10,1870},{4,0,400}, +{5,0,267},{135,0,232},{7,11,24},{11,11,542},{139,11,852},{135,11,1739},{4,11,503 +},{135,11,1661},{5,11,130},{7,11,1314},{9,11,610},{10,11,718},{11,11,601},{11,11 +,819},{11,11,946},{140,11,536},{10,11,149},{11,11,280},{142,11,336},{7,0,739},{7 +,11,1946},{8,10,48},{8,10,88},{8,10,582},{8,10,681},{9,10,373},{9,10,864},{11,0, +690},{11,10,157},{11,10,843},{148,10,27},{134,0,990},{4,10,88},{5,10,137},{5,10, +174},{5,10,777},{6,10,1664},{6,10,1725},{7,10,77},{7,10,426},{7,10,1317},{7,10, +1355},{8,10,126},{8,10,563},{9,10,523},{9,10,750},{10,10,310},{10,10,836},{11,10 +,42},{11,10,318},{11,10,731},{12,10,68},{12,10,92},{12,10,507},{12,10,692},{13, +10,81},{13,10,238},{13,10,374},{14,10,436},{18,10,138},{19,10,78},{19,10,111},{ +20,10,55},{20,10,77},{148,10,92},{141,10,418},{4,10,938},{135,0,1831},{6,0,776}, +{134,0,915},{138,10,351},{5,11,348},{6,10,1668},{6,11,522},{7,10,1499},{8,10,117 +},{9,10,314},{138,10,174},{135,10,707},{132,0,613},{133,10,403},{132,11,392},{5, +11,433},{9,11,633},{139,11,629},{133,0,763},{132,0,878},{132,0,977},{132,0,100}, +{4,10,44},{5,10,311},{6,0,463},{7,10,639},{7,10,762},{7,10,1827},{9,10,8},{9,10, +462},{148,10,83},{134,11,234},{4,10,346},{7,10,115},{9,10,180},{9,10,456},{138, +10,363},{5,0,362},{5,0,443},{6,0,318},{7,0,1019},{139,0,623},{5,0,463},{7,11,140 +},{7,11,1950},{8,0,296},{8,11,680},{11,11,817},{147,11,88},{7,11,1222},{138,11, +386},{142,0,137},{132,0,454},{6,11,5},{7,0,1914},{7,10,1051},{9,10,545},{11,11, +249},{12,11,313},{16,11,66},{145,11,26},{135,0,1527},{145,0,58},{148,11,59},{5,0 +,48},{5,0,404},{6,0,557},{7,0,458},{8,0,597},{10,0,455},{10,0,606},{11,0,49},{11 +,0,548},{12,0,476},{13,0,18},{141,0,450},{5,11,963},{134,11,1773},{133,0,729},{ +138,11,586},{5,0,442},{135,0,1984},{134,0,449},{144,0,40},{4,0,853},{7,11,180},{ +8,11,509},{136,11,792},{6,10,185},{7,10,1899},{9,10,875},{139,10,673},{134,11, +524},{4,10,327},{5,10,478},{7,10,1332},{8,10,753},{140,0,227},{5,10,1020},{5,10, +1022},{134,0,1491},{4,10,103},{133,10,401},{132,11,931},{4,10,499},{135,10,1421} +,{5,0,55},{7,0,376},{140,0,161},{133,0,450},{6,0,1174},{134,0,1562},{7,11,1837}, +{10,0,62},{141,0,400},{140,0,207},{135,0,869},{4,11,773},{5,11,618},{137,11,756} +,{132,10,96},{4,0,213},{7,0,223},{7,10,968},{136,0,80},{4,11,90},{5,11,337},{5, +11,545},{7,11,754},{9,11,186},{10,11,72},{10,11,782},{11,11,513},{11,11,577},{11 +,11,610},{11,11,889},{11,11,961},{12,11,354},{12,11,362},{12,11,461},{12,11,595} +,{13,11,79},{143,11,121},{7,0,381},{7,0,806},{7,0,820},{8,0,354},{8,0,437},{8,0, +787},{9,0,657},{10,0,58},{10,0,339},{10,0,749},{11,0,914},{12,0,162},{13,0,75},{ +14,0,106},{14,0,198},{14,0,320},{14,0,413},{146,0,43},{136,0,747},{136,0,954},{ +134,0,1073},{135,0,556},{7,11,151},{9,11,329},{139,11,254},{5,0,692},{134,0,1395 +},{6,10,563},{137,10,224},{134,0,191},{132,0,804},{9,11,187},{10,11,36},{17,11, +44},{146,11,64},{7,11,165},{7,11,919},{136,11,517},{4,11,506},{5,11,295},{7,11, +1680},{15,11,14},{144,11,5},{4,0,706},{6,0,162},{7,0,1960},{136,0,831},{135,11, +1376},{7,11,987},{9,11,688},{10,11,522},{11,11,788},{140,11,566},{150,0,35},{138 +,0,426},{135,0,1235},{135,11,1741},{7,11,389},{7,11,700},{7,11,940},{8,11,514},{ +9,11,116},{9,11,535},{10,11,118},{11,11,107},{11,11,148},{11,11,922},{12,11,254} +,{12,11,421},{142,11,238},{134,0,1234},{132,11,743},{4,10,910},{5,10,832},{135, +11,1335},{141,0,96},{135,11,185},{146,0,149},{4,0,204},{137,0,902},{4,11,784},{ +133,11,745},{136,0,833},{136,0,949},{5,11,81},{7,0,366},{7,11,146},{7,11,1342},{ +7,11,1446},{8,11,53},{8,11,561},{8,11,694},{8,11,754},{9,0,287},{9,11,97},{9,11, +115},{9,11,894},{10,11,462},{10,11,813},{11,11,230},{11,11,657},{11,11,699},{11, +11,748},{12,0,199},{12,0,556},{12,0,577},{12,11,119},{12,11,200},{12,11,283},{14 +,11,273},{145,11,15},{5,11,408},{137,11,747},{9,11,498},{140,11,181},{6,0,2020}, +{136,0,992},{5,0,356},{135,0,224},{134,0,784},{7,0,630},{8,10,528},{9,0,567},{9, +10,348},{11,0,150},{11,0,444},{141,0,119},{134,0,539},{4,10,20},{133,10,616},{ +142,0,27},{7,11,30},{8,11,86},{8,11,315},{8,11,700},{9,11,576},{9,11,858},{11,11 +,310},{11,11,888},{11,11,904},{12,11,361},{141,11,248},{138,11,839},{134,0,755}, +{134,0,1063},{7,10,1091},{135,10,1765},{134,11,428},{7,11,524},{8,11,169},{8,11, +234},{9,11,480},{138,11,646},{139,0,814},{7,11,1462},{139,11,659},{4,10,26},{5, +10,429},{6,10,245},{7,10,704},{7,10,1379},{135,10,1474},{7,11,1205},{138,11,637} +,{139,11,803},{132,10,621},{136,0,987},{4,11,266},{8,11,4},{9,11,39},{10,11,166} +,{11,11,918},{12,11,635},{20,11,10},{22,11,27},{150,11,43},{4,0,235},{135,0,255} +,{4,0,194},{5,0,584},{6,0,384},{7,0,583},{10,0,761},{11,0,760},{139,0,851},{133, +10,542},{134,0,1086},{133,10,868},{8,0,1016},{136,0,1018},{7,0,1396},{7,11,1396} +,{136,10,433},{135,10,1495},{138,10,215},{141,10,124},{7,11,157},{8,11,279},{9, +11,759},{16,11,31},{16,11,39},{16,11,75},{18,11,24},{20,11,42},{152,11,1},{5,0, +562},{134,11,604},{134,0,913},{5,0,191},{137,0,271},{4,0,470},{6,0,153},{7,0, +1503},{7,0,1923},{10,0,701},{11,0,132},{11,0,227},{11,0,320},{11,0,436},{11,0, +525},{11,0,855},{11,0,873},{12,0,41},{12,0,286},{13,0,103},{13,0,284},{14,0,255} +,{14,0,262},{15,0,117},{143,0,127},{7,0,475},{12,0,45},{147,10,112},{132,11,567} +,{137,11,859},{6,0,713},{6,0,969},{6,0,1290},{134,0,1551},{133,0,327},{6,0,552}, +{6,0,1292},{7,0,1754},{137,0,604},{4,0,223},{5,11,762},{6,0,359},{7,11,1880},{9, +11,680},{11,0,3},{11,11,798},{13,0,108},{14,0,89},{144,0,22},{5,0,80},{6,0,405}, +{7,0,403},{7,0,1502},{8,0,456},{9,0,487},{9,0,853},{9,0,889},{10,0,309},{11,0, +721},{11,0,994},{12,0,430},{141,0,165},{133,11,298},{132,10,647},{134,0,2016},{ +18,10,10},{146,11,10},{4,0,453},{5,0,887},{6,0,535},{8,0,6},{8,0,543},{136,0,826 +},{136,0,975},{10,0,961},{138,0,962},{138,10,220},{6,0,1891},{6,0,1893},{9,0,916 +},{9,0,965},{9,0,972},{12,0,801},{12,0,859},{12,0,883},{15,0,226},{149,0,51},{ +132,10,109},{135,11,267},{7,11,92},{7,11,182},{8,11,453},{9,11,204},{11,11,950}, +{12,11,94},{12,11,644},{16,11,20},{16,11,70},{16,11,90},{147,11,55},{134,10,1746 +},{6,11,71},{7,11,845},{7,11,1308},{8,11,160},{137,11,318},{5,0,101},{6,0,88},{7 +,0,263},{7,0,628},{7,0,1677},{7,11,237},{8,0,349},{8,11,664},{9,0,100},{9,11,42} +,{9,11,266},{9,11,380},{9,11,645},{10,0,677},{10,11,177},{10,11,276},{14,0,169}, +{14,0,302},{14,0,313},{15,0,48},{143,0,84},{138,11,69},{4,0,310},{7,0,708},{7,0, +996},{9,0,795},{10,0,390},{10,0,733},{11,0,451},{12,0,249},{14,0,115},{14,0,286} +,{143,0,100},{4,10,40},{5,0,587},{10,10,67},{11,10,117},{11,10,768},{139,10,935} +,{6,0,1942},{7,0,512},{136,0,983},{7,10,992},{8,10,301},{9,10,722},{12,10,63},{ +13,10,29},{14,10,161},{143,10,18},{136,11,76},{139,10,923},{134,0,645},{134,0, +851},{4,0,498},{132,11,293},{7,0,217},{8,0,140},{10,0,610},{14,11,352},{17,11,53 +},{18,11,146},{18,11,152},{19,11,11},{150,11,54},{134,0,1448},{138,11,841},{133, +0,905},{4,11,605},{7,11,518},{7,11,1282},{7,11,1918},{10,11,180},{139,11,218},{ +139,11,917},{135,10,825},{140,10,328},{4,0,456},{7,0,105},{7,0,358},{7,0,1637},{ +8,0,643},{139,0,483},{134,0,792},{6,11,96},{135,11,1426},{137,11,691},{4,11,651} +,{133,11,289},{7,11,688},{8,11,35},{9,11,511},{10,11,767},{147,11,118},{150,0,56 +},{5,0,243},{5,0,535},{6,10,204},{10,10,320},{10,10,583},{13,10,502},{14,10,72}, +{14,10,274},{14,10,312},{14,10,344},{15,10,159},{16,10,62},{16,10,69},{17,10,30} +,{18,10,42},{18,10,53},{18,10,84},{18,10,140},{19,10,68},{19,10,85},{20,10,5},{ +20,10,45},{20,10,101},{22,10,7},{150,10,20},{4,10,558},{6,10,390},{7,10,162},{7, +10,689},{9,10,360},{138,10,653},{146,11,23},{135,0,1748},{5,10,856},{6,10,1672}, +{6,10,1757},{134,10,1781},{4,11,704},{5,0,539},{5,0,754},{134,0,876},{135,11, +1078},{5,10,92},{10,10,736},{140,10,102},{5,10,590},{9,10,213},{145,0,91},{134,0 +,1565},{6,0,91},{135,0,435},{4,0,939},{140,0,792},{134,0,1399},{4,0,16},{4,11, +720},{5,0,316},{5,0,842},{5,11,306},{6,0,370},{6,0,1778},{8,0,166},{11,0,812},{ +12,0,206},{12,0,351},{14,0,418},{16,0,15},{16,0,34},{18,0,3},{19,0,3},{19,0,7},{ +20,0,4},{149,0,21},{144,0,95},{133,11,431},{132,11,234},{135,0,551},{4,0,999},{6 +,0,1966},{134,0,2042},{7,0,619},{10,0,547},{11,0,122},{12,0,601},{15,0,7},{148,0 +,20},{5,11,464},{6,11,236},{7,11,276},{7,11,696},{7,11,914},{7,11,1108},{7,11, +1448},{9,11,15},{9,11,564},{10,11,14},{12,11,565},{13,11,449},{14,11,53},{15,11, +13},{16,11,64},{145,11,41},{6,0,884},{6,0,1019},{134,0,1150},{6,11,1767},{12,11, +194},{145,11,107},{136,10,503},{133,11,840},{6,10,466},{135,0,671},{132,0,888},{ +4,0,149},{138,0,368},{4,0,154},{7,0,1134},{136,0,105},{135,0,983},{9,11,642},{11 +,11,236},{142,11,193},{4,0,31},{6,0,429},{7,0,962},{9,0,458},{139,0,691},{6,0, +643},{134,0,1102},{132,0,312},{4,11,68},{5,11,634},{6,11,386},{7,11,794},{8,11, +273},{9,11,563},{10,11,105},{10,11,171},{11,11,94},{139,11,354},{133,0,740},{135 +,0,1642},{4,11,95},{7,11,416},{8,11,211},{139,11,830},{132,0,236},{138,10,241},{ +7,11,731},{13,11,20},{143,11,11},{5,0,836},{5,0,857},{6,0,1680},{135,0,59},{10,0 +,68},{11,0,494},{152,11,6},{4,0,81},{139,0,867},{135,0,795},{133,11,689},{4,0, +1001},{5,0,282},{6,0,1932},{6,0,1977},{6,0,1987},{6,0,1992},{8,0,650},{8,0,919}, +{8,0,920},{8,0,923},{8,0,926},{8,0,927},{8,0,931},{8,0,939},{8,0,947},{8,0,956}, +{8,0,997},{9,0,907},{10,0,950},{10,0,953},{10,0,954},{10,0,956},{10,0,958},{10,0 +,959},{10,0,964},{10,0,970},{10,0,972},{10,0,973},{10,0,975},{10,0,976},{10,0, +980},{10,0,981},{10,0,984},{10,0,988},{10,0,990},{10,0,995},{10,0,999},{10,0, +1002},{10,0,1003},{10,0,1005},{10,0,1006},{10,0,1008},{10,0,1009},{10,0,1012},{ +10,0,1014},{10,0,1015},{10,0,1019},{10,0,1020},{10,0,1022},{12,0,959},{12,0,961} +,{12,0,962},{12,0,963},{12,0,964},{12,0,965},{12,0,967},{12,0,968},{12,0,969},{ +12,0,970},{12,0,971},{12,0,972},{12,0,973},{12,0,974},{12,0,975},{12,0,976},{12, +0,977},{12,0,979},{12,0,981},{12,0,982},{12,0,983},{12,0,984},{12,0,985},{12,0, +986},{12,0,987},{12,0,989},{12,0,990},{12,0,992},{12,0,993},{12,0,995},{12,0,998 +},{12,0,999},{12,0,1000},{12,0,1001},{12,0,1002},{12,0,1004},{12,0,1005},{12,0, +1006},{12,0,1007},{12,0,1008},{12,0,1009},{12,0,1010},{12,0,1011},{12,0,1012},{ +12,0,1014},{12,0,1015},{12,0,1016},{12,0,1017},{12,0,1018},{12,0,1019},{12,0, +1022},{12,0,1023},{14,0,475},{14,0,477},{14,0,478},{14,0,479},{14,0,480},{14,0, +482},{14,0,483},{14,0,484},{14,0,485},{14,0,486},{14,0,487},{14,0,488},{14,0,489 +},{14,0,490},{14,0,491},{14,0,492},{14,0,493},{14,0,494},{14,0,495},{14,0,496},{ +14,0,497},{14,0,498},{14,0,499},{14,0,500},{14,0,501},{14,0,502},{14,0,503},{14, +0,504},{14,0,506},{14,0,507},{14,0,508},{14,0,509},{14,0,510},{14,0,511},{16,0, +113},{16,0,114},{16,0,115},{16,0,117},{16,0,118},{16,0,119},{16,0,121},{16,0,122 +},{16,0,123},{16,0,124},{16,0,125},{16,0,126},{16,0,127},{18,0,242},{18,0,243},{ +18,0,244},{18,0,245},{18,0,248},{18,0,249},{18,0,250},{18,0,251},{18,0,252},{18, +0,253},{18,0,254},{18,0,255},{20,0,125},{20,0,126},{148,0,127},{7,11,1717},{7,11 +,1769},{138,11,546},{7,11,1127},{7,11,1572},{10,11,297},{10,11,422},{11,11,764}, +{11,11,810},{12,11,264},{13,11,102},{13,11,300},{13,11,484},{14,11,147},{14,11, +229},{17,11,71},{18,11,118},{147,11,120},{6,0,1148},{134,0,1586},{132,0,775},{ +135,10,954},{133,11,864},{133,11,928},{138,11,189},{135,10,1958},{6,10,549},{8, +10,34},{8,10,283},{9,10,165},{138,10,475},{5,10,652},{5,10,701},{135,10,449},{ +135,11,695},{4,10,655},{7,10,850},{17,10,75},{146,10,137},{140,11,682},{133,11, +523},{8,0,970},{136,10,670},{136,11,555},{7,11,76},{8,11,44},{9,11,884},{10,11, +580},{11,11,399},{11,11,894},{15,11,122},{18,11,144},{147,11,61},{6,10,159},{6, +10,364},{7,10,516},{7,10,1439},{137,10,518},{4,0,71},{5,0,376},{7,0,119},{138,0, +665},{141,10,151},{11,0,827},{14,0,34},{143,0,148},{133,11,518},{4,0,479},{135, +11,1787},{135,11,1852},{135,10,993},{7,0,607},{136,0,99},{134,0,1960},{132,0,793 +},{4,0,41},{5,0,74},{7,0,1627},{11,0,871},{140,0,619},{7,0,94},{11,0,329},{11,0, +965},{12,0,241},{14,0,354},{15,0,22},{148,0,63},{7,10,501},{9,10,111},{10,10,141 +},{11,10,332},{13,10,43},{13,10,429},{14,10,130},{14,10,415},{145,10,102},{9,0, +209},{137,0,300},{134,0,1497},{138,11,255},{4,11,934},{5,11,138},{136,11,610},{ +133,0,98},{6,0,1316},{10,11,804},{138,11,832},{8,11,96},{9,11,36},{10,11,607},{ +11,11,423},{11,11,442},{12,11,309},{14,11,199},{15,11,90},{145,11,110},{132,0, +463},{5,10,149},{136,10,233},{133,10,935},{4,11,652},{8,11,320},{9,11,13},{9,11, +398},{9,11,727},{10,11,75},{10,11,184},{10,11,230},{10,11,564},{10,11,569},{11, +11,973},{12,11,70},{12,11,189},{13,11,57},{13,11,257},{22,11,6},{150,11,16},{142 +,0,291},{12,10,582},{146,10,131},{136,10,801},{133,0,984},{145,11,116},{4,11,692 +},{133,11,321},{4,0,182},{6,0,205},{135,0,220},{4,0,42},{9,0,205},{9,0,786},{138 +,0,659},{6,0,801},{11,11,130},{140,11,609},{132,0,635},{5,11,345},{135,11,1016}, +{139,0,533},{132,0,371},{4,0,272},{135,0,836},{6,0,1282},{135,11,1100},{5,0,825} +,{134,0,1640},{135,11,1325},{133,11,673},{4,11,287},{133,11,1018},{135,0,357},{6 +,0,467},{137,0,879},{7,0,317},{135,0,569},{6,0,924},{134,0,1588},{5,10,406},{5, +11,34},{10,11,724},{12,11,444},{13,11,354},{18,11,32},{23,11,24},{23,11,31},{152 +,11,5},{6,0,1795},{6,0,1835},{6,0,1836},{6,0,1856},{8,0,844},{8,0,849},{8,0,854} +,{8,0,870},{8,0,887},{10,0,852},{138,0,942},{6,10,69},{135,10,117},{137,0,307},{ +4,0,944},{6,0,1799},{6,0,1825},{10,0,848},{10,0,875},{10,0,895},{10,0,899},{10,0 +,902},{140,0,773},{11,0,43},{13,0,72},{141,0,142},{135,10,1830},{134,11,382},{4, +10,432},{135,10,824},{132,11,329},{7,0,1820},{139,11,124},{133,10,826},{133,0, +525},{132,11,906},{7,11,1940},{136,11,366},{138,11,10},{4,11,123},{4,11,649},{5, +11,605},{7,11,1509},{136,11,36},{6,0,110},{135,0,1681},{133,0,493},{133,11,767}, +{4,0,174},{135,0,911},{138,11,786},{8,0,417},{137,0,782},{133,10,1000},{7,0,733} +,{137,0,583},{4,10,297},{6,10,529},{7,10,152},{7,10,713},{7,10,1845},{8,10,710}, +{8,10,717},{12,10,639},{140,10,685},{4,0,32},{5,0,215},{6,0,269},{7,0,1782},{7,0 +,1892},{10,0,16},{11,0,822},{11,0,954},{141,0,481},{4,11,273},{5,11,658},{133,11 +,995},{136,0,477},{134,11,72},{135,11,1345},{4,10,520},{5,0,308},{7,0,1088},{135 +,10,575},{133,11,589},{5,0,126},{8,0,297},{9,0,366},{140,0,374},{7,0,1551},{139, +0,361},{5,11,117},{6,11,514},{6,11,541},{7,11,1164},{7,11,1436},{8,11,220},{8,11 +,648},{10,11,688},{139,11,560},{133,11,686},{4,0,946},{6,0,1807},{8,0,871},{10,0 +,854},{10,0,870},{10,0,888},{10,0,897},{10,0,920},{12,0,722},{12,0,761},{12,0, +763},{12,0,764},{14,0,454},{14,0,465},{16,0,107},{18,0,167},{18,0,168},{146,0, +172},{132,0,175},{135,0,1307},{132,0,685},{135,11,1834},{133,0,797},{6,0,745},{6 +,0,858},{134,0,963},{133,0,565},{5,10,397},{6,10,154},{7,10,676},{7,11,196},{8, +10,443},{8,10,609},{9,10,24},{9,10,325},{10,10,35},{10,11,765},{11,10,535},{11, +10,672},{11,10,1018},{11,11,347},{11,11,552},{11,11,576},{11,11,790},{12,10,637} +,{12,11,263},{13,11,246},{13,11,270},{13,11,395},{14,11,74},{14,11,176},{14,11, +190},{14,11,398},{14,11,412},{15,11,32},{15,11,63},{16,10,30},{16,11,88},{147,11 +,105},{13,11,84},{141,11,122},{4,0,252},{7,0,1068},{10,0,434},{11,0,228},{11,0, +426},{13,0,231},{18,0,106},{148,0,87},{137,0,826},{4,11,589},{139,11,282},{5,11, +381},{135,11,1792},{132,0,791},{5,0,231},{5,10,981},{138,0,509},{7,0,601},{9,0, +277},{9,0,674},{10,0,178},{10,0,418},{10,0,571},{11,0,531},{12,0,113},{12,0,475} +,{13,0,99},{142,0,428},{4,10,56},{7,10,1791},{7,11,616},{8,10,607},{8,10,651},{ +10,11,413},{11,10,465},{11,10,835},{12,10,337},{141,10,480},{7,0,1591},{144,0,43 +},{9,10,158},{138,10,411},{135,0,1683},{8,0,289},{11,0,45},{12,0,278},{140,0,537 +},{6,11,120},{7,11,1188},{7,11,1710},{8,11,286},{9,11,667},{11,11,592},{139,11, +730},{136,10,617},{135,0,1120},{135,11,1146},{139,10,563},{4,10,369},{4,11,352}, +{135,11,687},{143,11,38},{4,0,399},{5,0,119},{5,0,494},{7,0,751},{9,0,556},{14, +11,179},{15,11,151},{150,11,11},{4,11,192},{5,11,49},{6,11,200},{6,11,293},{6,11 +,1696},{135,11,488},{4,0,398},{133,0,660},{6,10,622},{135,0,1030},{135,11,595},{ +141,0,168},{132,11,147},{7,0,973},{10,10,624},{142,10,279},{132,10,363},{132,0, +642},{133,11,934},{134,0,1615},{7,11,505},{135,11,523},{7,0,594},{7,0,851},{7,0, +1858},{9,0,411},{9,0,574},{9,0,666},{9,0,737},{10,0,346},{10,0,712},{11,0,246},{ +11,0,432},{11,0,517},{11,0,647},{11,0,679},{11,0,727},{12,0,304},{12,0,305},{12, +0,323},{12,0,483},{12,0,572},{12,0,593},{12,0,602},{13,0,95},{13,0,101},{13,0, +171},{13,0,315},{13,0,378},{13,0,425},{13,0,475},{14,0,63},{14,0,380},{14,0,384} +,{15,0,133},{18,0,112},{148,0,72},{135,0,1093},{132,0,679},{8,0,913},{10,0,903}, +{10,0,915},{10,11,438},{12,0,648},{12,0,649},{14,0,455},{144,0,112},{137,0,203}, +{134,10,292},{134,0,1492},{5,10,177},{6,10,616},{7,0,1374},{7,10,827},{8,0,540}, +{9,10,525},{138,10,656},{135,0,1486},{9,0,714},{138,10,31},{136,0,825},{134,0, +1511},{132,11,637},{134,0,952},{4,10,161},{133,10,631},{5,0,143},{5,0,769},{6,0, +1760},{7,0,682},{7,0,1992},{136,0,736},{132,0,700},{134,0,1540},{132,11,777},{9, +11,867},{138,11,837},{7,0,1557},{135,10,1684},{133,0,860},{6,0,422},{7,0,0},{7,0 +,1544},{9,0,605},{9,10,469},{9,10,709},{11,0,990},{12,0,235},{12,0,453},{12,10, +512},{13,0,47},{13,0,266},{14,10,65},{145,10,12},{10,10,229},{11,0,807},{11,10, +73},{139,10,376},{6,11,170},{7,11,1080},{8,11,395},{8,11,487},{11,11,125},{141, +11,147},{5,0,515},{137,0,131},{7,0,1605},{11,0,962},{146,0,139},{132,0,646},{4,0 +,396},{7,0,728},{9,0,117},{13,0,202},{148,0,51},{4,11,535},{6,0,121},{6,0,124},{ +6,0,357},{6,10,558},{7,0,1138},{7,0,1295},{7,10,651},{8,0,162},{8,0,508},{8,11, +618},{9,10,0},{10,10,34},{11,0,655},{139,10,1008},{135,11,1245},{138,0,357},{150 +,11,23},{133,0,237},{135,0,1784},{7,10,1832},{138,10,374},{132,0,713},{132,11,46 +},{5,11,811},{6,0,1536},{6,11,1679},{6,11,1714},{7,11,2032},{138,0,348},{11,11, +182},{142,11,195},{6,0,523},{7,0,738},{7,10,771},{7,10,1731},{9,10,405},{138,10, +421},{7,11,1458},{9,11,407},{139,11,15},{6,11,34},{7,11,69},{7,11,640},{7,11, +1089},{8,11,708},{8,11,721},{9,11,363},{9,11,643},{10,11,628},{148,11,98},{133,0 +,434},{135,0,1877},{7,0,571},{138,0,366},{5,10,881},{133,10,885},{9,0,513},{10,0 +,25},{10,0,39},{12,0,122},{140,0,187},{132,0,580},{5,10,142},{134,10,546},{132, +11,462},{137,0,873},{5,10,466},{11,10,571},{12,10,198},{13,10,283},{14,10,186},{ +15,10,21},{143,10,103},{4,10,185},{5,10,257},{5,10,839},{5,10,936},{7,0,171},{9, +10,399},{10,10,258},{10,10,395},{10,10,734},{11,10,1014},{12,10,23},{13,10,350}, +{14,10,150},{147,10,6},{134,0,625},{7,0,107},{7,0,838},{8,0,550},{138,0,401},{5, +11,73},{6,11,23},{134,11,338},{4,0,943},{6,0,1850},{12,0,713},{142,0,434},{7,10, +404},{7,10,1377},{7,10,1430},{7,10,2017},{8,10,149},{8,10,239},{8,10,512},{8,10, +793},{8,10,818},{9,10,474},{9,10,595},{10,10,122},{10,10,565},{10,10,649},{10,10 +,783},{11,0,588},{11,0,864},{11,0,936},{11,0,968},{11,10,239},{11,10,295},{11,10 +,447},{11,10,528},{11,10,639},{11,10,800},{12,0,73},{12,0,343},{12,0,394},{12,10 +,25},{12,10,157},{12,10,316},{12,10,390},{12,10,391},{12,10,395},{12,10,478},{12 +,10,503},{12,10,592},{12,10,680},{13,0,275},{13,10,50},{13,10,53},{13,10,132},{ +13,10,198},{13,10,322},{13,10,415},{13,10,511},{14,0,257},{14,10,71},{14,10,395} +,{15,0,160},{15,10,71},{15,10,136},{17,10,123},{18,10,93},{147,10,58},{133,0,768 +},{11,0,103},{142,0,0},{136,10,712},{132,0,799},{132,0,894},{7,11,725},{8,11,498 +},{139,11,268},{135,11,1798},{135,11,773},{141,11,360},{4,10,377},{152,10,13},{ +135,0,1673},{132,11,583},{134,0,1052},{133,11,220},{140,11,69},{132,11,544},{4, +10,180},{135,10,1906},{134,0,272},{4,0,441},{134,0,1421},{4,0,9},{5,0,128},{7,0, +368},{11,0,480},{148,0,3},{5,11,176},{6,11,437},{6,11,564},{11,11,181},{141,11, +183},{132,10,491},{7,0,1182},{141,11,67},{4,10,171},{6,0,1346},{138,10,234},{4, +10,586},{7,10,1186},{138,10,631},{136,0,682},{134,0,1004},{15,0,24},{143,11,24}, +{134,0,968},{4,0,2},{6,0,742},{6,0,793},{7,0,545},{7,0,894},{9,10,931},{10,10, +334},{148,10,71},{136,11,600},{133,10,765},{9,0,769},{140,0,185},{4,11,790},{5, +11,273},{134,11,394},{7,0,474},{137,0,578},{4,11,135},{6,11,127},{7,11,1185},{7, +11,1511},{8,11,613},{11,11,5},{12,11,133},{12,11,495},{12,11,586},{14,11,385},{ +15,11,118},{17,11,20},{146,11,98},{133,10,424},{5,0,530},{142,0,113},{6,11,230}, +{7,11,961},{7,11,1085},{136,11,462},{7,11,1954},{137,11,636},{136,10,714},{149, +11,6},{135,10,685},{9,10,420},{10,10,269},{10,10,285},{10,10,576},{11,10,397},{ +13,10,175},{145,10,90},{132,10,429},{5,0,556},{5,11,162},{136,11,68},{132,11,654 +},{4,11,156},{7,11,998},{7,11,1045},{7,11,1860},{9,11,48},{9,11,692},{11,11,419} +,{139,11,602},{6,0,1317},{7,11,1276},{8,0,16},{8,11,474},{9,0,825},{9,11,652},{ +140,0,568},{7,10,18},{7,10,699},{7,10,1966},{8,10,752},{9,10,273},{9,10,412},{9, +10,703},{10,10,71},{10,10,427},{10,10,508},{146,0,97},{7,11,1454},{10,0,703},{ +138,11,703},{4,10,53},{5,10,186},{135,10,752},{134,0,892},{134,0,1571},{8,10,575 +},{10,10,289},{139,10,319},{6,0,186},{137,0,426},{134,0,1101},{132,10,675},{132, +0,585},{6,0,1870},{137,0,937},{152,11,10},{9,11,197},{10,11,300},{12,11,473},{13 +,11,90},{141,11,405},{4,0,93},{5,0,252},{6,0,229},{7,0,291},{9,0,550},{139,0,644 +},{137,0,749},{6,10,209},{8,10,468},{9,0,162},{9,10,210},{11,10,36},{12,10,28},{ +12,10,630},{13,10,21},{13,10,349},{14,10,7},{145,10,13},{132,0,381},{132,11,606} +,{4,10,342},{135,10,1179},{7,11,1587},{7,11,1707},{10,11,528},{139,11,504},{12, +11,39},{13,11,265},{141,11,439},{4,10,928},{133,10,910},{7,10,1838},{7,11,1978}, +{136,11,676},{6,0,762},{6,0,796},{134,0,956},{4,10,318},{4,10,496},{7,10,856},{ +139,10,654},{137,11,242},{4,11,361},{133,11,315},{132,11,461},{132,11,472},{132, +0,857},{5,0,21},{6,0,77},{6,0,157},{7,0,974},{7,0,1301},{7,0,1339},{7,0,1490},{7 +,0,1873},{7,10,915},{8,10,247},{9,0,628},{147,10,0},{4,10,202},{5,10,382},{6,10, +454},{7,10,936},{7,10,1803},{8,10,758},{9,10,375},{9,10,895},{10,10,743},{10,10, +792},{11,10,978},{11,10,1012},{142,10,109},{7,11,617},{10,11,498},{11,11,501},{ +12,11,16},{140,11,150},{7,10,1150},{7,10,1425},{7,10,1453},{10,11,747},{140,10, +513},{133,11,155},{11,0,919},{141,0,409},{138,10,791},{10,0,633},{139,11,729},{7 +,11,163},{8,11,319},{9,11,402},{10,11,24},{10,11,681},{11,11,200},{11,11,567},{ +12,11,253},{12,11,410},{142,11,219},{5,11,475},{7,11,1780},{9,11,230},{11,11,297 +},{11,11,558},{14,11,322},{147,11,76},{6,10,445},{7,0,332},{137,10,909},{135,11, +1956},{136,11,274},{134,10,578},{135,0,1489},{135,11,1848},{5,11,944},{134,11, +1769},{132,11,144},{136,10,766},{4,0,832},{135,10,541},{8,0,398},{9,0,681},{139, +0,632},{136,0,645},{9,0,791},{10,0,93},{16,0,13},{17,0,23},{18,0,135},{19,0,12}, +{20,0,1},{20,0,12},{148,0,14},{6,11,247},{137,11,555},{134,0,20},{132,0,800},{ +135,0,1841},{139,10,983},{137,10,768},{132,10,584},{141,11,51},{4,11,620},{6,0, +1993},{138,11,280},{136,0,769},{7,11,1810},{11,0,290},{11,0,665},{11,11,866},{12 +,11,103},{13,11,495},{17,11,67},{147,11,74},{134,0,1426},{139,0,60},{4,10,326},{ +135,10,1770},{4,10,226},{7,0,1874},{137,0,641},{5,10,426},{6,0,644},{8,10,30},{9 +,10,2},{11,10,549},{147,10,122},{5,11,428},{138,11,442},{135,11,1871},{135,0, +1757},{147,10,117},{135,0,937},{135,0,1652},{6,0,654},{134,0,1476},{133,11,99},{ +135,0,527},{132,10,345},{4,10,385},{4,11,397},{7,10,265},{135,10,587},{4,0,579}, +{5,0,226},{5,0,323},{135,0,960},{134,0,1486},{8,11,502},{144,11,9},{4,10,347},{5 +,10,423},{5,10,996},{135,10,1329},{7,11,727},{146,11,73},{4,11,485},{7,10,1259}, +{7,11,353},{7,11,1523},{9,10,125},{139,10,65},{5,10,136},{6,0,325},{6,11,366},{7 +,11,1384},{7,11,1601},{136,10,644},{138,11,160},{6,0,1345},{137,11,282},{18,0,91 +},{147,0,70},{136,0,404},{4,11,157},{133,11,471},{133,0,973},{6,0,135},{135,0, +1176},{8,11,116},{11,11,551},{142,11,159},{4,0,549},{4,10,433},{133,10,719},{136 +,0,976},{5,11,160},{7,11,363},{7,11,589},{10,11,170},{141,11,55},{144,0,21},{144 +,0,51},{135,0,314},{135,10,1363},{4,11,108},{7,11,405},{10,11,491},{139,11,498}, +{146,0,4},{4,10,555},{8,10,536},{10,10,288},{139,10,1005},{135,11,1005},{6,0,281 +},{7,0,6},{8,0,282},{8,0,480},{8,0,499},{9,0,198},{10,0,143},{10,0,169},{10,0, +211},{10,0,417},{10,0,574},{11,0,147},{11,0,395},{12,0,75},{12,0,407},{12,0,608} +,{13,0,500},{142,0,251},{6,0,1093},{6,0,1405},{9,10,370},{138,10,90},{4,11,926}, +{133,11,983},{135,0,1776},{134,0,1528},{132,0,419},{132,11,538},{6,11,294},{7,11 +,1267},{136,11,624},{135,11,1772},{138,11,301},{4,10,257},{135,10,2031},{4,0,138 +},{7,0,1012},{7,0,1280},{7,10,1768},{137,0,76},{132,11,757},{5,0,29},{140,0,638} +,{7,11,655},{135,11,1844},{6,11,257},{7,0,1418},{135,11,1522},{8,11,469},{138,11 +,47},{142,11,278},{6,10,83},{6,10,1733},{135,10,1389},{11,11,204},{11,11,243},{ +140,11,293},{135,11,1875},{6,0,1710},{135,0,2038},{137,11,299},{4,0,17},{5,0,23} +,{7,0,995},{11,0,383},{11,0,437},{12,0,460},{140,0,532},{133,0,862},{137,10,696} +,{6,0,592},{138,0,946},{138,11,599},{7,10,1718},{9,10,95},{9,10,274},{10,10,279} +,{10,10,317},{10,10,420},{11,10,303},{11,10,808},{12,10,134},{12,10,367},{13,10, +149},{13,10,347},{14,10,349},{14,10,406},{18,10,22},{18,10,89},{18,10,122},{147, +10,47},{8,0,70},{12,0,171},{141,0,272},{133,10,26},{132,10,550},{137,0,812},{10, +0,233},{139,0,76},{134,0,988},{134,0,442},{136,10,822},{4,10,902},{5,10,809},{6, +10,122},{135,0,896},{5,11,150},{7,11,106},{8,11,603},{9,11,593},{9,11,634},{10, +11,44},{10,11,173},{11,11,462},{11,11,515},{13,11,216},{13,11,288},{142,11,400}, +{136,0,483},{135,10,262},{5,10,620},{134,0,1709},{4,10,34},{5,10,574},{7,10,279} +,{7,10,1624},{136,10,601},{137,10,170},{147,0,119},{12,11,108},{141,11,291},{11, +0,69},{12,0,105},{12,0,117},{13,0,213},{14,0,13},{14,0,62},{14,0,177},{14,0,421} +,{15,0,19},{146,0,141},{137,0,309},{11,11,278},{142,11,73},{7,0,608},{7,0,976},{ +9,0,146},{10,0,206},{10,0,596},{13,0,218},{142,0,153},{133,10,332},{6,10,261},{8 +,10,182},{139,10,943},{4,11,493},{144,11,55},{134,10,1721},{132,0,768},{4,10,933 +},{133,10,880},{7,11,555},{7,11,1316},{7,11,1412},{7,11,1839},{9,11,192},{9,11, +589},{11,11,241},{11,11,676},{11,11,811},{11,11,891},{12,11,140},{12,11,346},{12 +,11,479},{13,11,30},{13,11,49},{13,11,381},{14,11,188},{15,11,150},{16,11,76},{ +18,11,30},{148,11,52},{4,0,518},{135,0,1136},{6,11,568},{7,11,112},{7,11,1804},{ +8,11,362},{8,11,410},{8,11,830},{9,11,514},{11,11,649},{142,11,157},{135,11,673} +,{8,0,689},{137,0,863},{4,0,18},{4,11,625},{7,0,145},{7,0,444},{7,0,1278},{8,0, +49},{8,0,400},{9,0,71},{9,0,250},{10,0,459},{12,0,160},{144,0,24},{140,0,1020},{ +4,0,997},{6,0,1946},{6,0,1984},{134,0,1998},{6,11,16},{6,11,158},{7,11,43},{7,11 +,129},{7,11,181},{8,11,276},{8,11,377},{10,11,523},{11,11,816},{12,11,455},{13, +11,303},{142,11,135},{133,10,812},{134,0,658},{4,11,1},{7,11,1143},{7,11,1463},{ +8,11,61},{9,11,207},{9,11,390},{9,11,467},{139,11,836},{150,11,26},{140,0,106},{ +4,10,137},{6,0,1827},{7,10,1178},{7,10,1520},{7,11,1319},{10,0,931},{18,0,166},{ +148,0,114},{133,0,1010},{4,11,723},{5,11,895},{7,11,1031},{8,11,199},{8,11,340}, +{9,11,153},{9,11,215},{10,11,21},{10,11,59},{10,11,80},{10,11,224},{11,11,229},{ +11,11,652},{12,11,192},{13,11,146},{142,11,91},{132,11,295},{6,11,619},{7,11,898 +},{7,11,1092},{8,11,485},{18,11,28},{147,11,116},{137,11,51},{6,10,1661},{7,10, +1975},{7,10,2009},{135,10,2011},{5,11,309},{140,11,211},{5,0,87},{7,0,313},{7,0, +1103},{10,0,208},{10,0,582},{11,0,389},{11,0,813},{12,0,385},{13,0,286},{14,0, +124},{146,0,108},{5,11,125},{8,11,77},{138,11,15},{132,0,267},{133,0,703},{137, +11,155},{133,11,439},{11,11,164},{140,11,76},{5,10,89},{7,10,1915},{9,0,496},{9, +10,185},{9,10,235},{10,10,64},{10,10,270},{10,10,403},{10,10,469},{10,10,529},{ +10,10,590},{11,10,140},{11,10,860},{13,10,1},{13,10,422},{14,10,341},{14,10,364} +,{17,10,93},{18,10,113},{19,10,97},{147,10,113},{133,10,695},{135,0,1121},{5,10, +6},{6,10,183},{7,10,680},{7,10,978},{7,10,1013},{7,10,1055},{12,10,230},{13,10, +172},{146,10,29},{4,11,8},{7,11,1152},{7,11,1153},{7,11,1715},{9,11,374},{10,11, +478},{139,11,648},{135,11,1099},{6,10,29},{139,10,63},{4,0,561},{10,0,249},{139, +0,209},{132,0,760},{7,11,799},{138,11,511},{136,11,87},{9,0,154},{140,0,485},{ +136,0,255},{132,0,323},{140,0,419},{132,10,311},{134,10,1740},{4,0,368},{135,0, +641},{7,10,170},{8,10,90},{8,10,177},{8,10,415},{11,10,714},{142,10,281},{4,11, +69},{5,11,122},{9,11,656},{138,11,464},{5,11,849},{134,11,1633},{8,0,522},{142,0 +,328},{11,10,91},{13,10,129},{15,10,101},{145,10,125},{4,10,494},{6,10,74},{7,0, +562},{7,10,44},{8,0,551},{11,11,499},{12,10,17},{15,10,5},{148,10,11},{4,10,276} +,{133,10,296},{9,0,92},{147,0,91},{4,10,7},{5,10,90},{5,10,158},{6,10,542},{7,10 +,221},{7,10,1574},{9,10,490},{10,10,540},{11,10,443},{139,10,757},{6,0,525},{6,0 +,1976},{8,0,806},{9,0,876},{140,0,284},{5,11,859},{7,10,588},{7,11,1160},{8,11, +107},{9,10,175},{9,11,291},{9,11,439},{10,10,530},{10,11,663},{11,11,609},{140, +11,197},{7,11,168},{13,11,196},{141,11,237},{139,0,958},{133,0,594},{135,10,580} +,{7,10,88},{136,10,627},{5,10,872},{6,0,479},{6,0,562},{6,10,57},{7,0,1060},{7, +10,471},{9,10,447},{9,10,454},{141,0,6},{136,11,413},{145,11,19},{4,11,117},{6, +11,372},{7,11,1905},{142,11,323},{4,11,722},{139,11,471},{5,10,31},{6,10,614},{ +145,0,61},{8,10,330},{140,10,477},{7,10,1200},{138,10,460},{6,10,424},{135,10, +1866},{6,0,1641},{136,0,820},{6,0,1556},{134,0,1618},{9,11,5},{12,11,216},{12,11 +,294},{12,11,298},{12,11,400},{12,11,518},{13,11,229},{143,11,139},{15,11,155},{ +144,11,79},{4,0,302},{135,0,1766},{5,10,13},{134,10,142},{6,0,148},{7,0,1313},{7 +,10,116},{8,10,322},{8,10,755},{9,10,548},{10,10,714},{11,10,884},{141,10,324},{ +137,0,676},{9,11,88},{139,11,270},{5,11,12},{7,11,375},{137,11,438},{134,0,1674} +,{7,10,1472},{135,10,1554},{7,10,1071},{7,10,1541},{7,10,1767},{7,10,1806},{11,0 +,178},{11,10,162},{11,10,242},{12,10,605},{15,10,26},{144,10,44},{6,0,389},{7,0, +149},{9,0,142},{138,0,94},{140,11,71},{145,10,115},{6,0,8},{7,0,1881},{8,0,91},{ +11,11,966},{12,11,287},{13,11,342},{13,11,402},{15,11,110},{143,11,163},{4,11, +258},{136,11,639},{6,11,22},{7,11,903},{138,11,577},{133,11,681},{135,10,1111},{ +135,11,1286},{8,10,1},{9,0,112},{138,10,326},{5,10,488},{6,10,527},{7,10,489},{7 +,10,1636},{8,10,121},{8,10,144},{8,10,359},{9,10,193},{9,10,241},{9,10,336},{9, +10,882},{11,10,266},{11,10,372},{11,10,944},{12,10,401},{140,10,641},{4,11,664}, +{133,11,804},{6,0,747},{134,0,1015},{135,0,1746},{9,10,31},{10,10,244},{10,10, +699},{12,10,149},{141,10,497},{133,10,377},{135,0,24},{5,11,32},{6,0,1352},{145, +10,101},{7,0,1530},{10,0,158},{13,0,13},{13,0,137},{13,0,258},{14,0,111},{14,0, +225},{14,0,253},{14,0,304},{14,0,339},{14,0,417},{146,0,33},{4,0,503},{135,0, +1661},{5,0,130},{6,0,845},{7,0,1314},{9,0,610},{10,0,718},{11,0,601},{11,0,819}, +{11,0,946},{140,0,536},{10,0,149},{11,0,280},{142,0,336},{134,0,1401},{135,0, +1946},{8,0,663},{144,0,8},{134,0,1607},{135,10,2023},{4,11,289},{7,11,629},{7,11 +,1698},{7,11,1711},{140,11,215},{6,11,450},{136,11,109},{10,0,882},{10,0,883},{ +10,0,914},{138,0,928},{133,10,843},{136,11,705},{132,10,554},{133,10,536},{5,0, +417},{9,10,79},{11,10,625},{145,10,7},{7,11,1238},{142,11,37},{4,0,392},{135,0, +1597},{4,10,424},{5,0,433},{9,0,633},{139,0,629},{7,10,336},{136,10,785},{134,11 +,355},{6,0,234},{7,0,769},{9,0,18},{138,0,358},{4,10,896},{134,10,1777},{138,11, +323},{7,0,140},{7,0,1950},{8,0,680},{11,0,817},{147,0,88},{7,0,1222},{138,0,386} +,{139,11,908},{11,0,249},{12,0,313},{16,0,66},{145,0,26},{134,0,5},{7,10,750},{9 +,10,223},{11,10,27},{11,10,466},{12,10,624},{14,10,265},{146,10,61},{134,11,26}, +{134,0,1216},{5,0,963},{134,0,1773},{4,11,414},{5,11,467},{9,11,654},{10,11,451} +,{12,11,59},{141,11,375},{135,11,17},{4,10,603},{133,10,661},{4,10,11},{6,10,128 +},{7,10,231},{7,10,1533},{138,10,725},{135,11,955},{7,0,180},{8,0,509},{136,0, +792},{132,10,476},{132,0,1002},{133,11,538},{135,10,1807},{132,0,931},{7,0,943}, +{11,0,614},{140,0,747},{135,0,1837},{9,10,20},{10,10,324},{10,10,807},{139,10, +488},{134,0,641},{6,11,280},{10,11,502},{11,11,344},{140,11,38},{5,11,45},{7,11, +1161},{11,11,448},{11,11,880},{13,11,139},{13,11,407},{15,11,16},{17,11,95},{18, +11,66},{18,11,88},{18,11,123},{149,11,7},{9,0,280},{138,0,134},{22,0,22},{23,0,5 +},{151,0,29},{136,11,777},{4,0,90},{4,11,410},{5,0,545},{7,0,754},{7,11,521},{9, +0,186},{10,0,72},{10,0,782},{11,0,577},{11,0,610},{11,0,960},{12,0,354},{12,0, +362},{140,0,595},{135,11,1778},{5,10,112},{6,10,103},{134,10,150},{138,10,356},{ +132,0,742},{7,0,151},{9,0,329},{139,0,254},{8,0,853},{8,0,881},{8,0,911},{8,0, +912},{10,0,872},{12,0,741},{12,0,742},{152,0,18},{4,11,573},{136,11,655},{6,0, +921},{134,0,934},{9,0,187},{10,0,36},{11,0,1016},{17,0,44},{146,0,64},{7,0,833}, +{136,0,517},{4,0,506},{5,0,295},{135,0,1680},{4,10,708},{8,10,15},{9,10,50},{9, +10,386},{11,10,18},{11,10,529},{140,10,228},{4,10,563},{7,0,251},{7,0,1701},{7, +10,592},{7,10,637},{7,10,770},{8,0,436},{8,10,463},{9,10,60},{9,10,335},{9,10, +904},{10,10,73},{11,10,434},{12,10,585},{13,10,331},{18,10,110},{148,10,60},{132 +,10,502},{136,0,584},{6,10,347},{138,10,161},{7,0,987},{7,11,899},{9,0,688},{10, +0,522},{11,0,788},{12,0,137},{12,0,566},{14,0,9},{14,0,24},{14,0,64},{142,11,325 +},{4,0,214},{5,0,500},{5,10,102},{6,10,284},{7,10,1079},{7,10,1423},{7,10,1702}, +{8,10,470},{9,10,554},{9,10,723},{139,10,333},{7,10,246},{135,10,840},{6,10,10}, +{8,10,571},{9,10,739},{143,10,91},{133,10,626},{146,0,195},{134,0,1775},{7,0,389 +},{7,0,700},{7,0,940},{8,0,514},{9,0,116},{9,0,535},{10,0,118},{11,0,107},{11,0, +148},{11,0,922},{12,0,254},{12,0,421},{142,0,238},{5,10,18},{6,10,526},{13,10,24 +},{13,10,110},{19,10,5},{147,10,44},{132,0,743},{4,10,309},{5,10,462},{7,10,970} +,{7,10,1097},{139,0,292},{22,10,30},{150,10,33},{139,11,338},{135,11,1598},{7,0, +1283},{9,0,227},{11,0,325},{11,0,408},{14,0,180},{146,0,47},{4,0,953},{6,0,1805} +,{6,0,1814},{6,0,1862},{140,0,774},{6,11,611},{135,11,1733},{135,11,1464},{5,0, +81},{7,0,146},{7,0,1342},{8,0,53},{8,0,561},{8,0,694},{8,0,754},{9,0,115},{9,0, +179},{9,0,894},{10,0,462},{10,0,813},{11,0,230},{11,0,657},{11,0,699},{11,0,748} +,{12,0,119},{12,0,200},{12,0,283},{142,0,273},{5,0,408},{6,0,789},{6,0,877},{6,0 +,1253},{6,0,1413},{137,0,747},{134,10,1704},{135,11,663},{6,0,1910},{6,0,1915},{ +6,0,1923},{9,0,913},{9,0,928},{9,0,950},{9,0,954},{9,0,978},{9,0,993},{12,0,812} +,{12,0,819},{12,0,831},{12,0,833},{12,0,838},{12,0,909},{12,0,928},{12,0,931},{ +12,0,950},{15,0,186},{15,0,187},{15,0,195},{15,0,196},{15,0,209},{15,0,215},{15, +0,236},{15,0,241},{15,0,249},{15,0,253},{18,0,180},{18,0,221},{18,0,224},{18,0, +227},{18,0,229},{149,0,60},{7,0,1826},{135,0,1938},{5,10,86},{7,10,743},{9,10,85 +},{10,10,281},{10,10,432},{11,0,490},{12,10,251},{13,10,118},{14,10,378},{146,0, +143},{5,10,524},{133,10,744},{141,11,442},{10,10,107},{140,10,436},{135,11,503}, +{134,0,1162},{132,10,927},{7,0,30},{8,0,86},{8,0,315},{8,0,700},{9,0,576},{9,0, +858},{10,0,414},{11,0,310},{11,0,888},{11,0,904},{12,0,361},{12,10,670},{13,0, +248},{13,0,371},{14,0,142},{146,10,94},{134,0,721},{4,11,113},{5,11,163},{5,11, +735},{7,10,1149},{7,11,1009},{9,10,156},{9,11,9},{9,11,771},{12,11,90},{13,11, +138},{13,11,410},{143,11,128},{138,0,839},{133,10,778},{137,0,617},{133,10,502}, +{8,10,196},{10,10,283},{139,10,406},{6,0,428},{7,0,524},{8,0,169},{8,0,234},{9,0 +,480},{138,0,646},{133,10,855},{134,0,1648},{7,0,1205},{138,0,637},{4,11,935},{5 +,11,823},{135,0,1596},{5,11,269},{7,11,434},{7,11,891},{8,11,339},{9,11,702},{11 +,11,594},{11,11,718},{145,11,100},{7,11,878},{9,11,485},{141,11,264},{4,0,266},{ +6,11,1713},{8,0,4},{9,0,39},{10,0,166},{11,0,918},{12,0,635},{20,0,10},{22,0,27} +,{22,0,43},{150,0,52},{7,10,1400},{9,10,446},{138,10,45},{135,11,900},{132,0,862 +},{134,0,1554},{135,11,1033},{19,0,16},{147,11,16},{135,11,1208},{7,0,157},{136, +0,279},{6,0,604},{136,0,391},{13,10,455},{15,10,99},{15,10,129},{144,10,68},{135 +,10,172},{7,0,945},{11,0,713},{139,0,744},{4,0,973},{10,0,877},{10,0,937},{10,0, +938},{140,0,711},{139,0,1022},{132,10,568},{142,11,143},{4,0,567},{4,10,732},{ +137,0,859},{7,0,1846},{136,0,628},{136,10,733},{133,0,762},{4,10,428},{135,10, +1789},{7,10,2015},{10,0,784},{12,10,665},{141,0,191},{133,0,298},{7,0,633},{7,0, +905},{7,0,909},{7,0,1538},{9,0,767},{140,0,636},{138,10,806},{132,0,795},{139,0, +301},{135,0,1970},{5,11,625},{135,11,1617},{135,11,275},{7,11,37},{8,11,425},{8, +11,693},{9,11,720},{10,11,380},{10,11,638},{11,11,273},{11,11,307},{11,11,473},{ +12,11,61},{143,11,43},{135,11,198},{134,0,1236},{7,0,369},{12,0,644},{12,0,645}, +{144,0,90},{19,0,15},{149,0,27},{6,0,71},{6,10,1623},{6,10,1681},{7,0,845},{8,0, +160},{137,0,318},{134,0,1447},{134,0,1255},{138,0,735},{4,11,168},{136,0,76},{6, +10,1748},{8,10,715},{9,10,802},{10,10,46},{10,10,819},{13,10,308},{14,10,351},{ +14,10,363},{146,10,67},{135,11,91},{4,10,63},{5,10,347},{134,0,474},{133,10,749} +,{138,0,841},{133,10,366},{4,11,225},{134,0,836},{135,0,1622},{135,10,89},{140,0 +,735},{134,0,1601},{138,11,145},{6,0,1390},{137,0,804},{142,0,394},{6,11,15},{7, +11,70},{10,11,240},{147,11,93},{6,0,96},{135,0,1426},{4,0,651},{133,0,289},{7,10 +,977},{7,11,956},{7,11,1157},{7,11,1506},{7,11,1606},{7,11,1615},{7,11,1619},{7, +11,1736},{7,11,1775},{8,11,590},{9,11,324},{9,11,736},{9,11,774},{9,11,776},{9, +11,784},{10,11,567},{10,11,708},{11,11,518},{11,11,613},{11,11,695},{11,11,716}, +{11,11,739},{11,11,770},{11,11,771},{11,11,848},{11,11,857},{11,11,931},{11,11, +947},{12,11,326},{12,11,387},{12,11,484},{12,11,528},{12,11,552},{12,11,613},{13 +,11,189},{13,11,256},{13,11,340},{13,11,432},{13,11,436},{13,11,440},{13,11,454} +,{14,11,174},{14,11,220},{14,11,284},{14,11,390},{145,11,121},{7,0,688},{8,0,35} +,{9,0,511},{10,0,767},{147,0,118},{134,0,667},{4,0,513},{5,10,824},{133,10,941}, +{7,10,440},{8,10,230},{139,10,106},{134,0,2034},{135,11,1399},{143,11,66},{135, +11,1529},{4,11,145},{6,11,176},{7,11,395},{9,11,562},{144,11,28},{132,11,501},{ +132,0,704},{134,0,1524},{6,11,464},{135,0,1078},{6,11,509},{10,11,82},{20,11,91} +,{151,11,13},{4,0,720},{133,0,306},{133,0,431},{4,10,914},{5,10,800},{5,10,852}, +{135,0,1196},{135,11,1189},{10,0,54},{141,10,115},{7,10,564},{142,10,168},{4,10, +918},{5,0,464},{5,10,876},{6,0,236},{7,0,696},{7,0,914},{7,0,1108},{7,0,1448},{9 +,0,15},{9,0,564},{10,0,14},{12,0,565},{13,0,449},{14,0,53},{15,0,13},{16,0,64},{ +145,0,41},{6,0,1418},{134,10,1764},{4,10,92},{133,10,274},{134,0,907},{4,11,114} +,{8,10,501},{9,11,492},{13,11,462},{142,11,215},{4,11,77},{5,11,361},{6,11,139}, +{6,11,401},{6,11,404},{7,11,413},{7,11,715},{7,11,1716},{11,11,279},{12,11,179}, +{12,11,258},{13,11,244},{142,11,358},{6,0,1767},{12,0,194},{145,0,107},{134,11, +1717},{5,10,743},{142,11,329},{4,10,49},{7,10,280},{135,10,1633},{5,0,840},{7,11 +,1061},{8,11,82},{11,11,250},{12,11,420},{141,11,184},{135,11,724},{134,0,900},{ +136,10,47},{134,0,1436},{144,11,0},{5,10,272},{5,10,908},{5,10,942},{6,0,675},{7 +,0,1008},{7,0,1560},{8,10,197},{9,0,642},{9,10,47},{11,0,236},{11,10,538},{11,10 +,742},{142,0,193},{4,0,68},{5,0,628},{5,0,634},{6,0,386},{7,0,794},{8,0,273},{9, +0,563},{10,0,105},{10,0,171},{11,0,94},{139,0,354},{135,10,1911},{137,10,891},{4 +,0,95},{6,0,1297},{6,0,1604},{7,0,416},{139,0,830},{6,11,513},{135,11,1052},{7,0 +,731},{13,0,20},{143,0,11},{137,11,899},{10,0,850},{140,0,697},{4,0,662},{7,11, +1417},{12,11,382},{17,11,48},{152,11,12},{133,0,736},{132,0,861},{4,10,407},{132 +,10,560},{141,10,490},{6,11,545},{7,11,565},{7,11,1669},{10,11,114},{11,11,642}, +{140,11,618},{6,0,871},{134,0,1000},{5,0,864},{5,11,5},{10,0,648},{11,0,671},{ +143,0,46},{133,0,928},{4,10,475},{11,0,90},{11,10,35},{13,0,7},{13,10,71},{13,10 +,177},{142,10,422},{136,0,332},{135,11,192},{134,0,1055},{136,11,763},{11,0,986} +,{140,0,682},{7,0,76},{8,0,44},{9,0,884},{10,0,580},{11,0,399},{11,0,894},{143,0 +,122},{135,11,1237},{135,10,636},{6,10,222},{7,10,1620},{8,10,409},{9,10,693},{ +139,0,300},{4,11,87},{5,11,250},{10,11,601},{13,11,298},{13,11,353},{141,11,376} +,{5,0,518},{10,0,340},{11,0,175},{149,0,16},{140,0,771},{6,0,1108},{137,0,831},{ +132,0,836},{135,0,1852},{4,0,957},{6,0,1804},{8,0,842},{8,0,843},{8,0,851},{8,0, +855},{140,0,767},{135,11,814},{4,11,57},{7,11,1195},{7,11,1438},{7,11,1548},{7, +11,1835},{7,11,1904},{9,11,757},{10,11,604},{139,11,519},{133,10,882},{138,0,246 +},{4,0,934},{5,0,202},{7,11,1897},{8,0,610},{12,11,290},{13,11,80},{13,11,437},{ +145,11,74},{8,0,96},{9,0,36},{10,0,607},{10,0,804},{10,0,832},{11,0,423},{11,0, +442},{12,0,309},{14,0,199},{15,0,90},{145,0,110},{132,10,426},{6,10,58},{7,0,654 +},{7,10,745},{7,10,1969},{8,0,240},{8,10,675},{9,10,479},{9,10,731},{10,10,330}, +{10,10,593},{10,10,817},{11,10,32},{11,10,133},{11,10,221},{145,10,68},{9,0,13}, +{9,0,398},{9,0,727},{10,0,75},{10,0,184},{10,0,230},{10,0,564},{10,0,569},{11,0, +973},{12,0,70},{12,0,189},{13,0,57},{141,0,257},{4,11,209},{135,11,902},{7,0,391 +},{137,10,538},{134,0,403},{6,11,303},{7,11,335},{7,11,1437},{7,11,1668},{8,11, +553},{8,11,652},{8,11,656},{9,11,558},{11,11,743},{149,11,18},{132,11,559},{11,0 +,75},{142,0,267},{6,0,815},{141,11,2},{141,0,366},{137,0,631},{133,11,1017},{5,0 +,345},{135,0,1016},{133,11,709},{134,11,1745},{133,10,566},{6,10,48},{7,0,952},{ +9,10,139},{10,10,399},{11,10,469},{12,10,634},{141,10,223},{133,0,673},{7,11,8}, +{8,11,206},{137,0,850},{6,0,662},{149,0,35},{4,0,287},{133,0,1018},{6,10,114},{7 +,10,1224},{7,10,1556},{136,10,3},{8,10,576},{137,10,267},{4,0,884},{5,0,34},{10, +0,724},{12,0,444},{13,0,354},{18,0,32},{23,0,24},{23,0,31},{152,0,5},{133,10,933 +},{132,11,776},{138,0,151},{136,0,427},{134,0,382},{132,0,329},{9,0,846},{10,0, +827},{138,11,33},{7,11,1297},{9,0,279},{10,0,407},{14,0,84},{150,0,18},{136,11, +406},{132,0,906},{136,0,366},{134,0,843},{134,0,1443},{135,0,1372},{138,0,992},{ +4,0,123},{5,0,605},{7,0,1509},{136,0,36},{132,0,649},{8,11,175},{10,11,168},{138 +,11,573},{133,0,767},{134,0,1018},{135,11,1305},{12,10,30},{13,10,148},{14,10,87 +},{14,10,182},{16,10,42},{148,10,70},{134,11,607},{4,0,273},{5,0,658},{133,0,995 +},{6,0,72},{139,11,174},{7,10,56},{7,10,1989},{8,10,337},{8,10,738},{9,10,600},{ +10,0,483},{12,0,368},{13,10,447},{142,10,92},{5,11,784},{138,10,666},{135,0,1345 +},{139,11,882},{134,0,1293},{133,0,589},{134,0,1988},{5,0,117},{6,0,514},{6,0, +541},{7,0,1164},{7,0,1436},{8,0,220},{8,0,648},{10,0,688},{139,0,560},{136,0,379 +},{5,0,686},{7,10,866},{135,10,1163},{132,10,328},{9,11,14},{9,11,441},{10,11, +306},{139,11,9},{4,10,101},{135,10,1171},{5,10,833},{136,10,744},{5,11,161},{7, +11,839},{135,11,887},{7,0,196},{10,0,765},{11,0,347},{11,0,552},{11,0,790},{12,0 +,263},{13,0,246},{13,0,270},{13,0,395},{14,0,176},{14,0,190},{14,0,398},{14,0, +412},{15,0,32},{15,0,63},{16,0,88},{147,0,105},{6,10,9},{6,10,397},{7,10,53},{7, +10,1742},{10,10,632},{11,10,828},{140,10,146},{5,0,381},{135,0,1792},{134,0,1452 +},{135,11,429},{8,0,367},{10,0,760},{14,0,79},{20,0,17},{152,0,0},{7,0,616},{138 +,0,413},{11,10,417},{12,10,223},{140,10,265},{7,11,1611},{13,11,14},{15,11,44},{ +19,11,13},{148,11,76},{135,0,1229},{6,0,120},{7,0,1188},{7,0,1710},{8,0,286},{9, +0,667},{11,0,592},{139,0,730},{135,11,1814},{135,0,1146},{4,10,186},{5,10,157},{ +8,10,168},{138,10,6},{4,0,352},{135,0,687},{4,0,192},{5,0,49},{6,0,200},{6,0,293 +},{6,0,1696},{135,0,1151},{133,10,875},{5,10,773},{5,10,991},{6,10,1635},{134,10 +,1788},{7,10,111},{136,10,581},{6,0,935},{134,0,1151},{134,0,1050},{132,0,650},{ +132,0,147},{11,0,194},{11,11,194},{12,0,62},{12,0,88},{12,11,62},{140,11,88},{6, +0,339},{135,0,923},{134,10,1747},{7,11,643},{136,11,236},{133,0,934},{7,10,1364} +,{7,10,1907},{141,10,158},{132,10,659},{4,10,404},{135,10,675},{7,11,581},{9,11, +644},{137,11,699},{13,0,211},{14,0,133},{14,0,204},{15,0,64},{15,0,69},{15,0,114 +},{16,0,10},{19,0,23},{19,0,35},{19,0,39},{19,0,51},{19,0,71},{19,0,75},{152,0, +15},{133,10,391},{5,11,54},{135,11,1513},{5,10,540},{6,10,1697},{7,0,222},{136,0 +,341},{134,10,78},{132,11,744},{136,0,293},{137,11,701},{7,11,930},{10,11,402},{ +10,11,476},{13,11,452},{18,11,55},{147,11,104},{132,0,637},{133,10,460},{8,11,50 +},{137,11,624},{132,11,572},{134,0,1159},{4,10,199},{139,10,34},{134,0,847},{134 +,10,388},{6,11,43},{7,11,38},{8,11,248},{9,11,504},{138,11,513},{4,10,511},{6,10 +,608},{9,0,683},{9,10,333},{10,10,602},{11,10,441},{11,10,723},{11,10,976},{140, +10,357},{9,0,867},{138,0,837},{6,0,944},{135,11,326},{135,0,1809},{5,10,938},{7, +11,783},{136,10,707},{133,11,766},{133,11,363},{6,0,170},{7,0,1080},{8,0,395},{8 +,0,487},{141,0,147},{6,11,258},{140,11,409},{4,0,535},{5,11,249},{8,0,618},{148, +11,82},{6,0,1379},{149,11,15},{135,0,1625},{150,0,23},{5,11,393},{6,11,378},{7, +11,1981},{9,11,32},{9,11,591},{10,11,685},{10,11,741},{142,11,382},{133,11,788}, +{7,11,1968},{10,11,19},{139,11,911},{7,11,1401},{135,11,1476},{4,11,61},{5,11,58 +},{5,11,171},{5,11,635},{5,11,683},{5,11,700},{6,11,291},{6,11,566},{7,11,1650}, +{11,11,523},{12,11,273},{12,11,303},{15,11,39},{143,11,111},{6,10,469},{7,10, +1709},{138,10,515},{4,0,778},{134,11,589},{132,0,46},{5,0,811},{6,0,1679},{6,0, +1714},{135,0,2032},{7,0,1458},{9,0,407},{11,0,15},{12,0,651},{149,0,37},{4,10, +500},{135,0,938},{6,0,34},{7,0,69},{7,0,1089},{7,0,1281},{8,0,708},{8,0,721},{9, +0,363},{148,0,98},{10,11,231},{147,11,124},{7,11,726},{152,11,9},{5,10,68},{134, +10,383},{136,11,583},{4,11,917},{133,11,1005},{11,10,216},{139,10,340},{135,11, +1675},{8,0,441},{10,0,314},{143,0,3},{132,11,919},{4,10,337},{6,10,353},{7,10, +1934},{8,10,488},{137,10,429},{7,0,889},{7,10,1795},{8,10,259},{9,10,135},{9,10, +177},{9,10,860},{10,10,825},{11,10,115},{11,10,370},{11,10,405},{11,10,604},{12, +10,10},{12,10,667},{12,10,669},{13,10,76},{14,10,310},{15,10,76},{15,10,147},{ +148,10,23},{4,10,15},{4,11,255},{5,10,22},{5,11,302},{6,10,244},{6,11,132},{7,10 +,40},{7,10,200},{7,10,906},{7,10,1199},{7,11,128},{7,11,283},{7,11,1299},{9,10, +616},{10,10,716},{10,11,52},{10,11,514},{11,10,635},{11,10,801},{11,11,925},{12, +10,458},{13,11,92},{142,11,309},{132,0,462},{137,11,173},{135,10,1735},{5,10,598 +},{7,10,791},{8,0,525},{8,10,108},{137,10,123},{5,0,73},{6,0,23},{134,0,338},{ +132,0,676},{132,10,683},{7,0,725},{8,0,498},{139,0,268},{12,0,21},{151,0,7},{135 +,0,773},{4,10,155},{135,10,1689},{4,0,164},{5,0,730},{5,10,151},{5,10,741},{6,11 +,210},{7,10,498},{7,10,870},{7,10,1542},{12,10,213},{14,10,36},{14,10,391},{17, +10,111},{18,10,6},{18,10,46},{18,10,151},{19,10,36},{20,10,32},{20,10,56},{20,10 +,69},{20,10,102},{21,10,4},{22,10,8},{22,10,10},{22,10,14},{150,10,31},{4,10,624 +},{135,10,1752},{4,0,583},{6,11,588},{9,0,936},{15,0,214},{18,0,199},{152,0,26}, +{4,11,284},{6,11,223},{7,0,1462},{139,0,659},{133,0,220},{139,0,803},{132,0,544} +,{4,10,492},{133,10,451},{16,0,98},{148,0,119},{4,11,218},{7,11,526},{143,11,137 +},{135,10,835},{4,11,270},{5,11,192},{6,11,332},{7,11,1322},{13,10,70},{13,11,9} +,{14,11,104},{142,11,311},{132,10,539},{140,11,661},{5,0,176},{6,0,437},{6,0,564 +},{11,0,181},{141,0,183},{135,0,1192},{6,10,113},{135,10,436},{136,10,718},{135, +10,520},{135,0,1878},{140,11,196},{7,11,379},{8,11,481},{137,11,377},{5,11,1003} +,{6,11,149},{137,11,746},{8,11,262},{9,11,627},{10,11,18},{11,11,214},{11,11,404 +},{11,11,457},{11,11,780},{11,11,849},{11,11,913},{13,11,330},{13,11,401},{142, +11,200},{149,0,26},{136,11,304},{132,11,142},{135,0,944},{4,0,790},{5,0,273},{ +134,0,394},{134,0,855},{4,0,135},{6,0,127},{7,0,1185},{7,0,1511},{8,0,613},{11,0 +,5},{12,0,336},{12,0,495},{12,0,586},{12,0,660},{12,0,668},{14,0,385},{15,0,118} +,{17,0,20},{146,0,98},{6,0,230},{9,0,752},{12,10,610},{13,10,431},{16,10,59},{ +146,0,109},{7,0,1954},{135,11,925},{4,11,471},{5,11,51},{6,11,602},{8,11,484},{ +10,11,195},{140,11,159},{132,10,307},{136,11,688},{132,11,697},{7,11,812},{7,11, +1261},{7,11,1360},{9,11,632},{140,11,352},{5,0,162},{5,10,964},{136,0,68},{4,0, +654},{136,11,212},{4,0,156},{7,0,998},{7,0,1045},{7,0,1860},{9,0,48},{9,0,692},{ +11,0,419},{139,0,602},{133,11,221},{4,11,373},{5,11,283},{6,11,480},{135,11,609} +,{142,11,216},{132,0,240},{6,11,192},{9,11,793},{145,11,55},{4,10,75},{5,10,180} +,{6,10,500},{7,10,58},{7,10,710},{138,10,645},{4,11,132},{5,10,649},{5,11,69},{ +135,11,1242},{6,10,276},{7,10,282},{7,10,879},{7,10,924},{8,10,459},{9,10,599},{ +9,10,754},{11,10,574},{12,10,128},{12,10,494},{13,10,52},{13,10,301},{15,10,30}, +{143,10,132},{132,10,200},{4,11,111},{135,11,302},{9,0,197},{10,0,300},{12,0,473 +},{13,0,90},{141,0,405},{132,11,767},{6,11,42},{7,11,1416},{7,11,1590},{7,11, +2005},{8,11,131},{8,11,466},{9,11,672},{13,11,252},{148,11,103},{8,0,958},{8,0, +999},{10,0,963},{138,0,1001},{135,10,1621},{135,0,858},{4,0,606},{137,11,444},{6 +,11,44},{136,11,368},{139,11,172},{4,11,570},{133,11,120},{139,11,624},{6,10,225 +},{7,0,1978},{8,0,676},{137,10,211},{7,0,972},{8,10,687},{139,0,102},{6,11,227}, +{135,11,1589},{8,10,58},{9,10,724},{11,10,809},{13,10,113},{145,10,72},{4,0,361} +,{133,0,315},{132,0,461},{6,10,345},{135,10,1247},{132,0,472},{8,10,767},{8,10, +803},{9,10,301},{137,10,903},{135,11,1333},{135,11,477},{7,10,1949},{136,10,674} +,{6,0,905},{138,0,747},{133,0,155},{134,10,259},{7,0,163},{8,0,319},{9,0,402},{ +10,0,24},{10,0,681},{11,0,200},{12,0,253},{12,0,410},{142,0,219},{5,0,475},{6,11 +,1667},{7,0,1780},{7,11,2036},{9,0,230},{10,11,600},{11,0,297},{11,0,558},{14,0, +322},{147,0,76},{136,10,254},{6,0,848},{135,0,1956},{6,11,511},{140,11,132},{5, +11,568},{6,11,138},{135,11,1293},{6,0,631},{137,0,838},{149,0,36},{4,11,565},{8, +11,23},{136,11,827},{5,0,944},{134,0,1769},{4,0,144},{4,11,922},{5,11,1023},{6,0 +,842},{134,0,1400},{133,10,248},{9,10,800},{10,10,693},{11,10,482},{11,10,734},{ +139,10,789},{7,11,1002},{139,11,145},{4,10,116},{5,10,95},{5,10,445},{7,10,1688} +,{8,10,29},{9,10,272},{11,10,509},{139,10,915},{14,0,369},{146,0,72},{135,10, +1641},{132,11,740},{133,10,543},{140,11,116},{5,10,181},{6,0,247},{8,10,41},{137 +,0,555},{133,10,657},{136,0,996},{138,10,709},{7,0,189},{8,10,202},{138,10,536}, +{136,11,402},{4,11,716},{141,11,31},{10,0,280},{138,0,797},{9,10,423},{140,10,89 +},{8,10,113},{9,10,877},{10,10,554},{11,10,83},{12,10,136},{147,10,109},{133,10, +976},{4,10,206},{135,0,746},{136,0,526},{139,0,345},{136,0,1017},{8,11,152},{9, +11,53},{9,11,268},{9,11,901},{10,11,518},{10,11,829},{11,11,188},{13,11,74},{14, +11,46},{15,11,17},{15,11,33},{17,11,40},{18,11,36},{19,11,20},{22,11,1},{152,11, +2},{133,11,736},{136,11,532},{5,0,428},{138,0,651},{135,11,681},{135,0,1162},{7, +0,327},{8,10,226},{10,10,537},{11,10,570},{11,10,605},{11,10,799},{11,10,804},{ +12,10,85},{12,10,516},{12,10,623},{12,11,677},{13,0,230},{13,10,361},{14,10,77}, +{14,10,78},{17,0,113},{147,10,110},{4,0,792},{4,10,769},{7,0,1717},{138,0,546},{ +4,11,684},{136,11,384},{132,10,551},{134,0,1203},{9,10,57},{9,10,459},{10,10,425 +},{11,10,119},{12,10,184},{12,10,371},{13,10,358},{145,10,51},{5,0,672},{5,10, +814},{8,10,10},{9,10,421},{9,10,729},{10,10,609},{139,10,689},{138,0,189},{134, +10,624},{7,11,110},{7,11,188},{8,11,290},{8,11,591},{9,11,382},{9,11,649},{11,11 +,71},{11,11,155},{11,11,313},{12,11,5},{13,11,325},{142,11,287},{133,0,99},{6,0, +1053},{135,0,298},{7,11,360},{7,11,425},{9,11,66},{9,11,278},{138,11,644},{4,0, +397},{136,0,555},{137,10,269},{132,10,528},{4,11,900},{133,11,861},{5,11,254},{6 +,0,1157},{7,11,985},{136,11,73},{7,11,1959},{136,11,683},{12,0,398},{20,0,39},{ +21,0,11},{150,0,41},{4,0,485},{7,0,353},{135,0,1523},{6,0,366},{7,0,1384},{135,0 +,1601},{138,0,787},{137,0,282},{5,10,104},{6,10,173},{135,10,1631},{139,11,146}, +{4,0,157},{133,0,471},{134,0,941},{132,11,725},{7,0,1336},{8,10,138},{8,10,342}, +{9,10,84},{10,10,193},{11,10,883},{140,10,359},{134,11,196},{136,0,116},{133,11, +831},{134,0,787},{134,10,95},{6,10,406},{10,10,409},{10,10,447},{11,10,44},{140, +10,100},{5,0,160},{7,0,363},{7,0,589},{10,0,170},{141,0,55},{134,0,1815},{132,0, +866},{4,11,321},{6,0,889},{6,0,1067},{6,0,1183},{134,11,569},{5,11,848},{134,11, +66},{4,11,36},{6,10,1636},{7,11,1387},{10,11,205},{11,11,755},{141,11,271},{132, +0,689},{4,10,282},{7,10,1034},{9,0,820},{11,10,398},{11,10,634},{12,10,1},{12,10 +,79},{12,10,544},{14,10,237},{17,10,10},{146,10,20},{4,0,108},{7,0,804},{139,0, +498},{132,11,887},{6,0,1119},{135,11,620},{6,11,165},{138,11,388},{5,0,244},{5, +10,499},{6,10,476},{7,10,600},{7,10,888},{135,10,1096},{140,0,609},{135,0,1005}, +{4,0,412},{133,0,581},{4,11,719},{135,11,155},{7,10,296},{7,10,596},{8,10,560},{ +8,10,586},{9,10,612},{11,10,304},{12,10,46},{13,10,89},{14,10,112},{145,10,122}, +{4,0,895},{133,0,772},{142,11,307},{135,0,1898},{4,0,926},{133,0,983},{4,11,353} +,{6,11,146},{6,11,1789},{7,11,288},{7,11,990},{7,11,1348},{9,11,665},{9,11,898}, +{11,11,893},{142,11,212},{132,0,538},{133,11,532},{6,0,294},{7,0,1267},{8,0,624} +,{141,0,496},{4,11,45},{7,0,1325},{135,11,1257},{138,0,301},{7,10,1599},{7,10, +1723},{8,10,79},{8,10,106},{8,10,190},{8,10,302},{8,10,383},{8,10,713},{9,0,298} +,{9,10,119},{9,10,233},{9,10,419},{9,10,471},{10,10,181},{10,10,406},{11,10,57}, +{11,10,85},{11,10,120},{11,10,177},{11,10,296},{11,10,382},{11,10,454},{11,10, +758},{11,10,999},{12,0,291},{12,10,27},{12,10,131},{12,10,245},{12,10,312},{12, +10,446},{12,10,454},{13,0,276},{13,10,98},{13,10,426},{13,10,508},{14,0,6},{14, +10,163},{14,10,272},{14,10,277},{14,10,370},{15,10,95},{15,10,138},{15,10,167},{ +17,0,18},{17,10,38},{20,10,96},{149,0,32},{132,0,757},{134,0,1263},{4,0,820},{ +134,10,1759},{133,0,722},{136,11,816},{138,10,372},{145,10,16},{134,0,1039},{4,0 +,991},{134,0,2028},{133,10,258},{7,0,1875},{139,0,124},{6,11,559},{6,11,1691},{ +135,11,586},{5,0,324},{7,0,881},{8,10,134},{9,10,788},{140,10,438},{7,11,1823},{ +139,11,693},{6,0,1348},{134,0,1545},{134,0,911},{132,0,954},{7,10,1948},{7,10, +2004},{8,0,329},{136,0,414},{5,0,517},{6,10,439},{7,10,780},{135,10,1040},{132,0 +,816},{5,10,1},{6,10,81},{138,10,520},{5,10,482},{8,10,98},{9,0,713},{10,0,222}, +{10,10,700},{10,10,822},{11,10,302},{11,10,778},{12,10,50},{12,10,127},{12,10, +396},{13,10,62},{13,10,328},{14,10,122},{147,10,72},{137,0,33},{5,10,2},{7,10, +1494},{136,10,589},{6,10,512},{7,10,797},{8,10,253},{9,10,77},{10,10,1},{10,10, +129},{10,10,225},{10,11,108},{11,10,118},{11,10,226},{11,10,251},{11,10,430},{11 +,10,701},{11,10,974},{11,10,982},{11,11,116},{12,10,64},{12,10,260},{12,10,488}, +{140,10,690},{134,11,456},{133,11,925},{5,0,150},{7,0,106},{7,0,774},{8,0,603},{ +9,0,593},{9,0,634},{10,0,44},{10,0,173},{11,0,462},{11,0,515},{13,0,216},{13,0, +288},{142,0,400},{137,10,347},{5,0,748},{134,0,553},{12,0,108},{141,0,291},{4,10 +,12},{7,0,420},{7,10,522},{7,10,809},{8,10,797},{141,10,88},{6,11,193},{7,11,240 +},{7,11,1682},{10,11,51},{10,11,640},{11,11,410},{13,11,82},{14,11,247},{14,11, +331},{142,11,377},{133,10,528},{135,0,1777},{4,0,493},{144,0,55},{136,11,633},{ +139,0,81},{6,0,980},{136,0,321},{148,10,109},{5,10,266},{9,10,290},{9,10,364},{ +10,10,293},{11,10,606},{142,10,45},{6,0,568},{7,0,112},{7,0,1804},{8,0,362},{8,0 +,410},{8,0,830},{9,0,514},{11,0,649},{142,0,157},{4,0,74},{6,0,510},{6,10,594},{ +9,10,121},{10,10,49},{10,10,412},{139,10,834},{134,0,838},{136,10,748},{132,10, +466},{132,0,625},{135,11,1443},{4,11,237},{135,11,514},{9,10,378},{141,10,162},{ +6,0,16},{6,0,158},{7,0,43},{7,0,129},{7,0,181},{8,0,276},{8,0,377},{10,0,523},{ +11,0,816},{12,0,455},{13,0,303},{142,0,135},{135,0,281},{4,0,1},{7,0,1143},{7,0, +1463},{8,0,61},{9,0,207},{9,0,390},{9,0,467},{139,0,836},{6,11,392},{7,11,65},{ +135,11,2019},{132,10,667},{4,0,723},{5,0,895},{7,0,1031},{8,0,199},{8,0,340},{9, +0,153},{9,0,215},{10,0,21},{10,0,59},{10,0,80},{10,0,224},{10,0,838},{11,0,229}, +{11,0,652},{12,0,192},{13,0,146},{142,0,91},{132,0,295},{137,0,51},{9,11,222},{ +10,11,43},{139,11,900},{5,0,309},{140,0,211},{5,0,125},{8,0,77},{138,0,15},{136, +11,604},{138,0,789},{4,10,39},{5,0,173},{7,10,1843},{8,10,407},{11,10,144},{140, +10,523},{138,11,265},{133,0,439},{132,10,510},{7,0,648},{7,0,874},{7,10,1980},{ +10,10,487},{10,10,809},{11,0,164},{12,0,76},{146,0,9},{12,0,111},{13,10,260},{14 +,0,294},{18,10,63},{147,0,45},{133,11,549},{134,10,570},{4,0,8},{7,0,1152},{7,0, +1153},{7,0,1715},{9,0,374},{10,0,478},{139,0,648},{135,0,1099},{5,0,575},{6,0, +354},{135,0,701},{7,11,36},{8,11,201},{136,11,605},{4,10,787},{136,11,156},{6,0, +518},{149,11,13},{140,11,224},{134,0,702},{132,10,516},{5,11,724},{10,11,305},{ +11,11,151},{12,11,33},{12,11,121},{12,11,381},{17,11,3},{17,11,27},{17,11,78},{ +18,11,18},{19,11,54},{149,11,5},{4,11,523},{5,11,638},{8,0,87},{11,10,887},{14, +10,365},{142,10,375},{138,0,438},{136,10,821},{135,11,1908},{6,11,242},{7,11,227 +},{7,11,1581},{8,11,104},{9,11,113},{9,11,220},{9,11,427},{10,11,74},{10,11,239} +,{11,11,579},{11,11,1023},{13,11,4},{13,11,204},{13,11,316},{18,11,95},{148,11, +86},{4,0,69},{5,0,122},{5,0,849},{6,0,1633},{9,0,656},{138,0,464},{4,10,10},{7,0 +,1802},{139,10,786},{135,11,861},{139,0,499},{7,0,476},{7,0,1592},{138,0,87},{ +133,10,684},{4,0,840},{134,10,27},{142,0,283},{6,0,1620},{7,11,1328},{136,11,494 +},{5,0,859},{7,0,1160},{8,0,107},{9,0,291},{9,0,439},{10,0,663},{11,0,609},{140, +0,197},{7,11,1306},{8,11,505},{9,11,482},{10,11,126},{11,11,225},{12,11,347},{12 +,11,449},{13,11,19},{142,11,218},{5,11,268},{10,11,764},{12,11,120},{13,11,39},{ +145,11,127},{145,10,56},{7,11,1672},{10,11,472},{11,11,189},{143,11,51},{6,10, +342},{6,10,496},{8,10,275},{137,10,206},{133,0,600},{4,0,117},{6,0,372},{7,0, +1905},{142,0,323},{4,10,909},{5,10,940},{135,11,1471},{132,10,891},{4,0,722},{ +139,0,471},{4,11,384},{135,11,1022},{132,10,687},{9,0,5},{12,0,216},{12,0,294},{ +12,0,298},{12,0,400},{12,0,518},{13,0,229},{143,0,139},{135,11,1703},{7,11,1602} +,{10,11,698},{12,11,212},{141,11,307},{6,10,41},{141,10,160},{135,11,1077},{9,11 +,159},{11,11,28},{140,11,603},{4,0,514},{7,0,1304},{138,0,477},{134,0,1774},{9,0 +,88},{139,0,270},{5,0,12},{6,10,1718},{7,0,375},{137,0,438},{132,11,515},{136,10 +,778},{8,11,632},{8,11,697},{137,11,854},{6,0,362},{6,0,997},{146,0,51},{7,0,816 +},{7,0,1241},{9,0,283},{9,0,520},{10,0,213},{10,0,307},{10,0,463},{10,0,671},{10 +,0,746},{11,0,401},{11,0,794},{12,0,517},{18,0,107},{147,0,115},{133,10,115},{ +150,11,28},{4,11,136},{133,11,551},{142,10,314},{132,0,258},{6,0,22},{7,0,903},{ +7,0,1963},{8,0,639},{138,0,577},{5,0,681},{5,10,193},{8,0,782},{12,10,178},{13,0 +,130},{145,0,84},{9,11,17},{138,11,291},{7,11,1287},{9,11,44},{10,11,552},{10,11 +,642},{11,11,839},{12,11,274},{12,11,275},{12,11,372},{13,11,91},{142,11,125},{ +135,10,174},{4,0,664},{5,0,804},{139,0,1013},{134,0,942},{6,0,1349},{6,0,1353},{ +6,0,1450},{7,11,1518},{139,11,694},{4,10,122},{5,10,796},{5,10,952},{6,10,1660}, +{6,10,1671},{8,10,567},{9,10,687},{9,10,742},{10,10,686},{11,0,356},{11,10,682}, +{140,10,281},{5,0,32},{6,11,147},{7,11,886},{9,11,753},{138,11,268},{5,10,179},{ +7,10,1095},{135,10,1213},{4,10,66},{7,10,722},{135,10,904},{135,10,352},{9,11, +245},{138,11,137},{4,0,289},{5,11,414},{7,0,629},{7,0,1698},{7,0,1711},{140,0, +215},{6,0,1975},{135,11,1762},{6,0,450},{136,0,109},{141,10,35},{134,11,599},{ +136,0,705},{133,0,664},{134,11,1749},{11,11,402},{12,11,109},{12,11,431},{13,11, +179},{13,11,206},{14,11,175},{14,11,217},{16,11,3},{148,11,53},{135,0,1238},{134 +,11,1627},{132,11,488},{10,10,592},{10,10,753},{12,10,317},{12,10,355},{12,10, +465},{12,10,469},{12,10,560},{12,10,578},{141,0,318},{133,10,564},{132,11,83},{ +140,11,676},{6,0,1872},{6,0,1906},{6,0,1907},{9,0,934},{9,0,956},{9,0,960},{9,0, +996},{12,0,794},{12,0,876},{12,0,880},{12,0,918},{15,0,230},{18,0,234},{18,0,238 +},{21,0,38},{149,0,62},{134,10,556},{134,11,278},{137,0,103},{7,10,544},{8,10, +719},{138,10,61},{4,10,5},{5,10,498},{8,10,637},{137,10,521},{7,0,777},{12,0,229 +},{12,0,239},{12,11,229},{12,11,239},{15,0,12},{143,11,12},{6,0,26},{7,11,388},{ +7,11,644},{139,11,781},{7,11,229},{8,11,59},{9,11,190},{9,11,257},{10,11,378},{ +140,11,191},{133,10,927},{135,10,1441},{4,10,893},{5,10,780},{133,10,893},{4,0, +414},{5,0,467},{9,0,654},{10,0,451},{12,0,59},{141,0,375},{142,0,173},{135,0,17} +,{5,10,238},{135,0,1350},{135,0,955},{4,0,960},{10,0,887},{12,0,753},{18,0,161}, +{18,0,162},{152,0,19},{136,11,344},{6,10,1729},{137,11,288},{132,11,660},{4,0, +217},{4,10,60},{5,0,710},{7,0,760},{7,0,1926},{7,10,1800},{8,10,314},{9,0,428},{ +9,0,708},{9,10,700},{10,0,254},{10,0,296},{10,0,720},{11,0,109},{11,0,255},{11, +10,487},{12,0,165},{12,0,315},{13,0,107},{13,0,203},{14,0,54},{14,0,99},{14,0, +114},{14,0,388},{16,0,85},{17,0,9},{17,0,33},{20,0,25},{20,0,28},{20,0,29},{21,0 +,9},{21,0,10},{21,0,34},{150,0,17},{7,11,1035},{138,11,737},{7,11,690},{9,11,217 +},{9,11,587},{140,11,521},{6,0,919},{7,11,706},{7,11,1058},{138,11,538},{7,10, +1853},{138,10,437},{136,10,419},{6,0,280},{10,0,502},{11,0,344},{140,0,38},{5,0, +45},{7,0,1161},{11,0,448},{11,0,880},{13,0,139},{13,0,407},{15,0,16},{17,0,95},{ +18,0,66},{18,0,88},{18,0,123},{149,0,7},{11,11,92},{11,11,196},{11,11,409},{11, +11,450},{11,11,666},{11,11,777},{12,11,262},{13,11,385},{13,11,393},{15,11,115}, +{16,11,45},{145,11,82},{136,0,777},{134,11,1744},{4,0,410},{5,10,828},{135,0,521 +},{134,0,673},{7,0,1110},{7,0,1778},{7,10,176},{135,10,178},{5,10,806},{7,10, +1976},{7,11,268},{136,11,569},{4,11,733},{9,11,194},{10,11,92},{11,11,198},{12, +11,84},{12,11,87},{13,11,128},{144,11,74},{4,10,51},{5,0,341},{6,10,4},{7,0,1129 +},{7,10,591},{7,10,849},{7,10,951},{7,10,1613},{7,10,1760},{7,10,1988},{9,10,434 +},{10,10,754},{11,0,414},{11,10,25},{139,10,37},{133,10,902},{135,10,928},{135,0 +,787},{132,0,436},{134,10,270},{7,0,1587},{135,0,1707},{6,0,377},{7,0,1025},{9,0 +,613},{145,0,104},{7,11,982},{7,11,1361},{10,11,32},{143,11,56},{139,0,96},{132, +0,451},{132,10,416},{142,10,372},{5,10,152},{5,10,197},{7,10,340},{7,10,867},{7, +11,306},{10,10,548},{10,10,581},{11,10,6},{12,10,3},{12,10,19},{14,10,110},{142, +10,289},{134,0,680},{134,11,609},{7,0,483},{7,10,190},{8,10,28},{8,10,141},{8,10 +,444},{8,10,811},{9,10,468},{11,10,334},{12,10,24},{12,10,386},{140,10,576},{5, +10,757},{138,0,916},{5,10,721},{135,10,1553},{133,11,178},{134,0,937},{132,10, +898},{133,0,739},{147,0,82},{135,0,663},{146,0,128},{5,10,277},{141,10,247},{134 +,0,1087},{132,10,435},{6,11,381},{7,11,645},{7,11,694},{136,11,546},{7,0,503},{ +135,0,1885},{6,0,1965},{8,0,925},{138,0,955},{4,0,113},{5,0,163},{5,0,735},{7,0, +1009},{9,0,9},{9,0,771},{12,0,90},{13,0,138},{13,0,410},{143,0,128},{4,0,324},{ +138,0,104},{5,10,265},{6,10,212},{135,0,460},{133,11,105},{7,11,261},{7,11,1107} +,{7,11,1115},{7,11,1354},{7,11,1588},{7,11,1705},{7,11,1902},{9,11,465},{10,11, +248},{10,11,349},{10,11,647},{11,11,527},{11,11,660},{11,11,669},{12,11,529},{ +141,11,305},{5,11,438},{9,11,694},{12,11,627},{141,11,210},{152,11,11},{4,0,935} +,{133,0,823},{132,10,702},{5,0,269},{5,10,808},{7,0,434},{7,0,891},{7,10,2045},{ +8,0,339},{9,0,702},{11,0,594},{11,0,718},{145,0,100},{7,0,1014},{9,0,485},{141,0 +,264},{134,0,1713},{7,0,1810},{11,0,866},{12,0,103},{12,11,233},{141,0,495},{4,0 +,423},{10,0,949},{138,0,1013},{135,0,900},{8,11,25},{138,11,826},{5,10,166},{8, +10,739},{140,10,511},{134,0,2018},{7,11,1270},{139,11,612},{4,10,119},{5,10,170} +,{5,10,447},{7,10,1708},{7,10,1889},{9,10,357},{9,10,719},{12,10,486},{140,10, +596},{12,0,574},{140,11,574},{132,11,308},{6,0,964},{6,0,1206},{134,0,1302},{4, +10,450},{135,10,1158},{135,11,150},{136,11,649},{14,0,213},{148,0,38},{9,11,45}, +{9,11,311},{141,11,42},{134,11,521},{7,10,1375},{7,10,1466},{138,10,331},{132,10 +,754},{5,11,339},{7,11,1442},{14,11,3},{15,11,41},{147,11,66},{136,11,378},{134, +0,1022},{5,10,850},{136,10,799},{142,0,143},{135,0,2029},{134,11,1628},{8,0,523} +,{150,0,34},{5,0,625},{135,0,1617},{7,0,275},{7,10,238},{7,10,2033},{8,10,120},{ +8,10,188},{8,10,659},{9,10,598},{10,10,466},{12,10,342},{12,10,588},{13,10,503}, +{14,10,246},{143,10,92},{7,0,37},{8,0,425},{8,0,693},{9,0,720},{10,0,380},{10,0, +638},{11,0,273},{11,0,473},{12,0,61},{143,0,43},{135,11,829},{135,0,1943},{132,0 +,765},{5,11,486},{135,11,1349},{7,11,1635},{8,11,17},{10,11,217},{138,11,295},{4 +,10,201},{7,10,1744},{8,10,602},{11,10,247},{11,10,826},{145,10,65},{138,11,558} +,{11,0,551},{142,0,159},{8,10,164},{146,10,62},{139,11,176},{132,0,168},{136,0, +1010},{134,0,1994},{135,0,91},{138,0,532},{135,10,1243},{135,0,1884},{132,10,907 +},{5,10,100},{10,10,329},{12,10,416},{149,10,29},{134,11,447},{132,10,176},{5,10 +,636},{5,10,998},{7,10,9},{7,10,1508},{8,10,26},{9,10,317},{9,10,358},{10,10,210 +},{10,10,292},{10,10,533},{11,10,555},{12,10,526},{12,10,607},{13,10,263},{13,10 +,459},{142,10,271},{4,11,609},{135,11,756},{6,0,15},{7,0,70},{10,0,240},{147,0, +93},{4,11,930},{133,11,947},{134,0,1227},{134,0,1534},{133,11,939},{133,11,962}, +{5,11,651},{8,11,170},{9,11,61},{9,11,63},{10,11,23},{10,11,37},{10,11,834},{11, +11,4},{11,11,187},{11,11,281},{11,11,503},{11,11,677},{12,11,96},{12,11,130},{12 +,11,244},{14,11,5},{14,11,40},{14,11,162},{14,11,202},{146,11,133},{4,11,406},{5 +,11,579},{12,11,492},{150,11,15},{139,0,392},{6,10,610},{10,10,127},{141,10,27}, +{7,0,655},{7,0,1844},{136,10,119},{4,0,145},{6,0,176},{7,0,395},{137,0,562},{132 +,0,501},{140,11,145},{136,0,1019},{134,0,509},{139,0,267},{6,11,17},{7,11,16},{7 +,11,1001},{7,11,1982},{9,11,886},{10,11,489},{10,11,800},{11,11,782},{12,11,320} +,{13,11,467},{14,11,145},{14,11,387},{143,11,119},{145,11,17},{5,11,458},{134,0, +1099},{7,11,1983},{8,11,0},{8,11,171},{9,11,120},{9,11,732},{10,11,473},{11,11, +656},{11,11,998},{18,11,0},{18,11,2},{147,11,21},{12,11,427},{146,11,38},{10,0, +948},{138,0,968},{7,10,126},{136,10,84},{136,10,790},{4,0,114},{9,0,492},{13,0, +462},{142,0,215},{6,10,64},{12,10,377},{141,10,309},{4,0,77},{5,0,361},{6,0,139} +,{6,0,401},{6,0,404},{7,0,413},{7,0,715},{7,0,1716},{11,0,279},{12,0,179},{12,0, +258},{13,0,244},{142,0,358},{134,0,1717},{7,0,772},{7,0,1061},{7,0,1647},{7,10, +1104},{8,0,82},{11,0,250},{11,0,607},{11,10,269},{11,10,539},{11,10,627},{11,10, +706},{11,10,975},{12,0,311},{12,0,420},{12,10,248},{12,10,434},{12,10,600},{12, +10,622},{13,0,184},{13,0,367},{13,10,297},{13,10,485},{14,10,69},{14,10,409},{ +143,10,108},{135,0,724},{4,11,512},{4,11,519},{133,11,342},{134,0,1133},{145,11, +29},{11,10,977},{141,10,507},{6,0,841},{6,0,1042},{6,0,1194},{10,0,993},{140,0, +1021},{6,11,31},{7,11,491},{7,11,530},{8,11,592},{9,10,34},{11,10,484},{11,11,53 +},{11,11,779},{12,11,167},{12,11,411},{14,11,14},{14,11,136},{15,11,72},{16,11, +17},{144,11,72},{4,0,1021},{5,11,907},{134,0,2037},{6,10,1700},{7,0,373},{7,10, +293},{7,10,382},{7,10,1026},{7,10,1087},{7,10,2027},{8,0,335},{8,0,596},{8,10, +252},{8,10,727},{8,10,729},{9,0,488},{9,10,30},{9,10,199},{9,10,231},{9,10,251}, +{9,10,334},{9,10,361},{9,10,712},{10,10,55},{10,10,60},{10,10,232},{10,10,332},{ +10,10,384},{10,10,396},{10,10,504},{10,10,542},{10,10,652},{11,10,20},{11,10,48} +,{11,10,207},{11,10,291},{11,10,298},{11,10,342},{11,10,365},{11,10,394},{11,10, +620},{11,10,705},{11,10,1017},{12,10,123},{12,10,340},{12,10,406},{12,10,643},{ +13,10,61},{13,10,269},{13,10,311},{13,10,319},{13,10,486},{14,10,234},{15,10,62} +,{15,10,85},{16,10,71},{18,10,119},{148,10,105},{150,0,37},{4,11,208},{5,11,106} +,{6,11,531},{8,11,408},{9,11,188},{138,11,572},{132,0,564},{6,0,513},{135,0,1052 +},{132,0,825},{9,0,899},{140,11,441},{134,0,778},{133,11,379},{7,0,1417},{12,0, +382},{17,0,48},{152,0,12},{132,11,241},{6,10,379},{7,0,1116},{7,10,270},{8,10, +176},{8,10,183},{9,10,432},{9,10,661},{12,10,247},{12,10,617},{146,10,125},{5,10 +,792},{133,10,900},{6,0,545},{7,0,565},{7,0,1669},{10,0,114},{11,0,642},{140,0, +618},{133,0,5},{138,11,7},{132,11,259},{135,0,192},{134,0,701},{136,0,763},{135, +10,1979},{4,10,901},{133,10,776},{10,0,755},{147,0,29},{133,0,759},{4,11,173},{5 +,11,312},{5,11,512},{135,11,1285},{7,11,1603},{7,11,1691},{9,11,464},{11,11,195} +,{12,11,279},{12,11,448},{14,11,11},{147,11,102},{7,0,370},{7,0,1007},{7,0,1177} +,{135,0,1565},{135,0,1237},{4,0,87},{5,0,250},{141,0,298},{4,11,452},{5,11,583}, +{5,11,817},{6,11,433},{7,11,593},{7,11,720},{7,11,1378},{8,11,161},{9,11,284},{ +10,11,313},{139,11,886},{4,11,547},{135,11,1409},{136,11,722},{4,10,37},{5,10, +334},{135,10,1253},{132,10,508},{12,0,107},{146,0,31},{8,11,420},{139,11,193},{ +135,0,814},{135,11,409},{140,0,991},{4,0,57},{7,0,1195},{7,0,1438},{7,0,1548},{7 +,0,1835},{7,0,1904},{9,0,757},{10,0,604},{139,0,519},{132,0,540},{138,11,308},{ +132,10,533},{136,0,608},{144,11,65},{4,0,1014},{134,0,2029},{4,0,209},{5,11,1002 +},{7,0,902},{136,11,745},{134,0,2030},{6,0,303},{7,0,335},{7,0,1437},{7,0,1668}, +{8,0,553},{8,0,652},{8,0,656},{9,0,558},{11,0,743},{149,0,18},{5,11,575},{6,11, +354},{135,11,701},{4,11,239},{6,11,477},{7,11,1607},{11,11,68},{139,11,617},{132 +,0,559},{8,0,527},{18,0,60},{147,0,24},{133,10,920},{138,0,511},{133,0,1017},{ +133,0,675},{138,10,391},{7,10,1952},{139,0,156},{138,11,369},{132,11,367},{133,0 +,709},{6,0,698},{134,0,887},{142,10,126},{134,0,1745},{132,10,483},{13,11,299},{ +142,11,75},{133,0,714},{7,0,8},{136,0,206},{138,10,480},{4,11,694},{9,10,495},{ +146,10,104},{7,11,1248},{11,11,621},{139,11,702},{140,11,687},{132,0,776},{139, +10,1009},{135,0,1272},{134,0,1059},{8,10,653},{13,10,93},{147,10,14},{135,11,213 +},{136,0,406},{133,10,172},{132,0,947},{8,0,175},{10,0,168},{138,0,573},{132,0, +870},{6,0,1567},{151,11,28},{134,11,472},{5,10,260},{136,11,132},{4,11,751},{11, +11,390},{140,11,32},{4,11,409},{133,11,78},{6,11,473},{12,0,554},{145,11,105},{ +133,0,784},{8,0,908},{136,11,306},{139,0,882},{6,0,358},{7,0,1393},{7,11,1759},{ +8,0,396},{8,11,396},{10,0,263},{10,11,263},{14,0,154},{14,11,154},{16,0,48},{16, +11,48},{17,0,8},{145,11,8},{13,11,163},{13,11,180},{18,11,78},{148,11,35},{14,0, +32},{18,0,85},{20,0,2},{152,0,16},{7,0,228},{8,10,167},{8,10,375},{9,10,82},{9, +10,561},{10,0,770},{138,10,620},{132,0,845},{9,0,14},{9,0,441},{10,0,306},{139,0 +,9},{8,10,194},{8,10,756},{11,0,966},{12,0,287},{13,0,342},{13,0,402},{15,0,110} +,{143,0,163},{134,0,1578},{4,0,967},{6,0,1820},{6,0,1847},{140,0,716},{136,0,594 +},{7,0,1428},{7,0,1640},{7,0,1867},{7,11,883},{9,0,169},{9,0,182},{9,0,367},{9,0 +,478},{9,0,506},{9,0,551},{9,0,557},{9,0,648},{9,0,697},{9,0,705},{9,0,725},{9,0 +,787},{9,0,794},{10,0,198},{10,0,214},{10,0,267},{10,0,275},{10,0,456},{10,0,551 +},{10,0,561},{10,0,613},{10,0,627},{10,0,668},{10,0,675},{10,0,691},{10,0,695},{ +10,0,707},{10,0,715},{11,0,183},{11,0,201},{11,0,244},{11,0,262},{11,0,352},{11, +0,439},{11,0,493},{11,0,572},{11,0,591},{11,0,608},{11,0,611},{11,0,646},{11,0, +674},{11,0,711},{11,0,751},{11,0,761},{11,0,776},{11,0,785},{11,0,850},{11,0,853 +},{11,0,862},{11,0,865},{11,0,868},{11,0,875},{11,0,898},{11,0,902},{11,0,903},{ +11,0,910},{11,0,932},{11,0,942},{11,0,957},{11,0,967},{11,0,972},{12,0,148},{12, +0,195},{12,0,220},{12,0,237},{12,0,318},{12,0,339},{12,0,393},{12,0,445},{12,0, +450},{12,0,474},{12,0,505},{12,0,509},{12,0,533},{12,0,591},{12,0,594},{12,0,597 +},{12,0,621},{12,0,633},{12,0,642},{13,0,59},{13,0,60},{13,0,145},{13,0,239},{13 +,0,250},{13,0,329},{13,0,344},{13,0,365},{13,0,372},{13,0,387},{13,0,403},{13,0, +414},{13,0,456},{13,0,470},{13,0,478},{13,0,483},{13,0,489},{14,0,55},{14,0,57}, +{14,0,81},{14,0,90},{14,0,148},{14,0,239},{14,0,266},{14,0,321},{14,0,326},{14,0 +,327},{14,0,330},{14,0,347},{14,0,355},{14,0,401},{14,0,404},{14,0,411},{14,0, +414},{14,0,416},{14,0,420},{15,0,61},{15,0,74},{15,0,87},{15,0,88},{15,0,94},{15 +,0,96},{15,0,116},{15,0,149},{15,0,154},{16,0,50},{16,0,63},{16,0,73},{17,0,2},{ +17,0,66},{17,0,92},{17,0,103},{17,0,112},{17,0,120},{18,0,50},{18,0,54},{18,0,82 +},{18,0,86},{18,0,90},{18,0,111},{18,0,115},{18,0,156},{19,0,40},{19,0,79},{20,0 +,78},{149,0,22},{5,0,161},{135,0,839},{4,0,782},{13,11,293},{142,11,56},{133,11, +617},{139,11,50},{135,10,22},{145,0,64},{5,10,639},{7,10,1249},{139,10,896},{138 +,0,998},{135,11,2042},{4,11,546},{142,11,233},{6,0,1043},{134,0,1574},{134,0, +1496},{4,10,102},{7,10,815},{7,10,1699},{139,10,964},{12,0,781},{142,0,461},{4, +11,313},{133,11,577},{6,0,639},{6,0,1114},{137,0,817},{8,11,184},{141,11,433},{7 +,0,1814},{135,11,935},{10,0,997},{140,0,958},{4,0,812},{137,11,625},{132,10,899} +,{136,10,795},{5,11,886},{6,11,46},{6,11,1790},{7,11,14},{7,11,732},{7,11,1654}, +{8,11,95},{8,11,327},{8,11,616},{10,11,598},{10,11,769},{11,11,134},{11,11,747}, +{12,11,378},{142,11,97},{136,0,139},{6,10,52},{9,10,104},{9,10,559},{12,10,308}, +{147,10,87},{133,11,1021},{132,10,604},{132,10,301},{136,10,779},{7,0,643},{136, +0,236},{132,11,153},{134,0,1172},{147,10,32},{133,11,798},{4,11,587},{134,0,1338 +},{6,11,598},{7,11,42},{8,11,695},{10,11,212},{11,11,158},{14,11,196},{145,11,85 +},{135,10,508},{5,11,957},{5,11,1008},{135,11,249},{4,11,129},{135,11,465},{5,0, +54},{7,11,470},{7,11,1057},{7,11,1201},{9,11,755},{11,11,906},{140,11,527},{7,11 +,908},{146,11,7},{5,11,148},{136,11,450},{144,11,1},{4,0,256},{135,0,1488},{6,10 +,310},{7,10,1849},{8,10,72},{8,10,272},{8,10,431},{9,0,351},{9,10,12},{10,10,563 +},{10,10,630},{10,10,796},{10,10,810},{11,10,367},{11,10,599},{11,10,686},{140, +10,672},{6,0,1885},{6,0,1898},{6,0,1899},{140,0,955},{4,0,714},{133,0,469},{6,0, +1270},{134,0,1456},{132,0,744},{6,0,313},{7,10,537},{8,10,64},{9,10,127},{10,10, +496},{12,10,510},{141,10,384},{4,10,244},{4,11,217},{5,11,710},{7,10,233},{7,11, +1926},{9,11,428},{9,11,708},{10,11,254},{10,11,296},{10,11,720},{11,11,109},{11, +11,255},{12,11,165},{12,11,315},{13,11,107},{13,11,203},{14,11,54},{14,11,99},{ +14,11,114},{14,11,388},{16,11,85},{17,11,9},{17,11,33},{20,11,25},{20,11,28},{20 +,11,29},{21,11,9},{21,11,10},{21,11,34},{150,11,17},{138,0,402},{7,0,969},{146,0 +,55},{8,0,50},{137,0,624},{134,0,1355},{132,0,572},{134,10,1650},{10,10,702},{ +139,10,245},{10,0,847},{142,0,445},{6,0,43},{7,0,38},{8,0,248},{138,0,513},{133, +0,369},{137,10,338},{133,0,766},{133,0,363},{133,10,896},{8,11,392},{11,11,54},{ +13,11,173},{13,11,294},{148,11,7},{134,0,678},{7,11,1230},{136,11,531},{6,0,258} +,{140,0,409},{5,0,249},{148,0,82},{7,10,1117},{136,10,539},{5,0,393},{6,0,378},{ +7,0,1981},{9,0,32},{9,0,591},{10,0,685},{10,0,741},{142,0,382},{133,0,788},{134, +0,1281},{134,0,1295},{7,0,1968},{141,0,509},{4,0,61},{5,0,58},{5,0,171},{5,0,683 +},{6,0,291},{6,0,566},{7,0,1650},{11,0,523},{12,0,273},{12,0,303},{15,0,39},{143 +,0,111},{6,0,706},{134,0,1283},{134,0,589},{135,11,1433},{133,11,435},{5,10,4},{ +5,10,810},{6,10,13},{6,10,538},{6,10,1690},{6,10,1726},{7,0,1059},{7,10,1819},{8 +,10,148},{8,10,696},{8,10,791},{12,10,125},{13,0,54},{143,10,9},{135,10,1268},{5 +,11,85},{6,11,419},{7,11,134},{7,11,305},{7,11,361},{7,11,1337},{8,11,71},{140, +11,519},{137,0,824},{140,11,688},{5,11,691},{7,10,1385},{7,11,345},{9,11,94},{11 +,10,582},{11,10,650},{11,10,901},{11,10,949},{12,10,232},{12,10,236},{12,11,169} +,{13,10,413},{13,10,501},{146,10,116},{4,0,917},{133,0,1005},{5,11,183},{6,11, +582},{7,0,1598},{9,11,344},{10,11,679},{140,11,435},{4,10,925},{5,10,803},{8,10, +698},{138,10,828},{132,0,919},{135,11,511},{139,10,992},{4,0,255},{5,0,302},{6,0 +,132},{7,0,128},{7,0,283},{7,0,1299},{10,0,52},{10,0,514},{11,0,925},{13,0,92},{ +142,0,309},{134,0,1369},{135,10,1847},{134,0,328},{7,11,1993},{136,11,684},{133, +10,383},{137,0,173},{134,11,583},{134,0,1411},{5,11,704},{8,11,357},{10,11,745}, +{14,11,426},{17,11,94},{19,0,65},{147,11,57},{9,10,660},{138,10,347},{4,11,179}, +{5,11,198},{133,11,697},{7,11,347},{7,11,971},{8,11,181},{138,11,711},{141,0,442 +},{7,10,572},{9,10,592},{11,0,842},{11,0,924},{11,10,680},{12,10,356},{12,10,550 +},{13,0,317},{13,0,370},{13,0,469},{13,0,471},{14,0,397},{18,0,69},{146,0,145},{ +14,11,19},{14,11,28},{144,11,29},{136,0,534},{4,11,243},{5,11,203},{7,11,19},{7, +11,71},{7,11,113},{10,11,405},{11,11,357},{142,11,240},{6,0,210},{10,0,845},{138 +,0,862},{7,11,1351},{9,11,581},{10,11,639},{11,11,453},{140,11,584},{7,11,1450}, +{139,11,99},{10,0,892},{12,0,719},{144,0,105},{4,0,284},{6,0,223},{134,11,492},{ +5,11,134},{6,11,408},{6,11,495},{135,11,1593},{136,0,529},{137,0,807},{4,0,218}, +{7,0,526},{143,0,137},{6,0,1444},{142,11,4},{132,11,665},{4,0,270},{4,11,248},{5 +,0,192},{6,0,332},{7,0,1322},{7,11,137},{137,11,349},{140,0,661},{7,0,1517},{7, +10,748},{11,0,597},{11,10,700},{14,0,76},{14,0,335},{148,0,33},{5,11,371},{135, +11,563},{146,11,57},{133,10,127},{133,0,418},{4,11,374},{7,11,547},{7,11,1700},{ +7,11,1833},{139,11,858},{6,10,198},{140,10,83},{7,11,1812},{13,11,259},{13,11, +356},{14,11,242},{147,11,114},{5,10,276},{6,10,55},{7,0,379},{7,10,1369},{8,0, +481},{137,0,377},{138,11,286},{5,0,1003},{6,0,149},{6,10,1752},{136,10,726},{6, +11,1647},{7,11,1552},{7,11,2010},{8,0,262},{9,0,627},{9,11,494},{9,11,509},{10,0 +,18},{11,0,214},{11,0,404},{11,0,457},{11,0,780},{11,0,913},{13,0,401},{142,0, +200},{135,0,742},{136,0,304},{132,0,142},{133,10,764},{6,10,309},{7,10,331},{138 +,10,550},{135,10,1062},{6,11,123},{7,10,986},{7,11,214},{9,11,728},{10,11,157},{ +11,11,346},{11,11,662},{143,11,106},{135,10,1573},{7,0,925},{137,0,799},{4,0,471 +},{5,0,51},{6,0,602},{8,0,484},{138,0,195},{136,0,688},{132,0,697},{6,0,1169},{6 +,0,1241},{6,10,194},{7,10,133},{10,10,493},{10,10,570},{139,10,664},{140,0,751}, +{5,10,24},{5,10,569},{6,10,3},{6,10,119},{6,10,143},{6,10,440},{7,0,929},{7,10, +599},{7,10,1686},{7,10,1854},{8,10,424},{9,10,43},{9,10,584},{9,10,760},{10,0, +452},{10,10,328},{11,0,878},{11,10,159},{11,10,253},{12,10,487},{12,10,531},{144 +,0,33},{4,11,707},{13,11,106},{18,11,49},{147,11,41},{5,0,221},{5,11,588},{134, +11,393},{134,0,1437},{6,11,211},{7,11,1690},{11,11,486},{140,11,369},{5,10,14},{ +5,10,892},{6,10,283},{7,10,234},{136,10,537},{4,0,988},{136,0,955},{135,0,1251}, +{4,10,126},{8,10,635},{147,10,34},{4,10,316},{135,10,1561},{137,10,861},{4,10,64 +},{5,10,352},{5,10,720},{6,10,368},{139,10,359},{134,0,192},{4,0,132},{5,0,69},{ +135,0,1242},{7,10,1577},{10,10,304},{10,10,549},{12,10,365},{13,10,220},{13,10, +240},{142,10,33},{4,0,111},{6,11,219},{135,0,865},{5,11,582},{6,11,1646},{7,11, +99},{7,11,1962},{7,11,1986},{8,11,515},{8,11,773},{9,11,23},{9,11,491},{12,11, +620},{14,11,52},{145,11,50},{132,0,767},{7,11,568},{148,11,21},{5,11,851},{6,0, +42},{7,0,1416},{7,0,2005},{8,0,131},{8,0,466},{9,0,672},{13,0,252},{148,0,103},{ +135,0,1050},{6,10,175},{137,10,289},{5,10,432},{133,10,913},{6,0,44},{136,0,368} +,{135,11,784},{132,0,570},{133,0,120},{139,10,595},{140,0,29},{6,0,227},{135,0, +1589},{4,11,98},{7,11,1365},{9,11,422},{9,11,670},{10,11,775},{11,11,210},{13,11 +,26},{13,11,457},{141,11,476},{140,10,80},{5,10,931},{134,10,1698},{133,0,522},{ +134,0,1120},{135,0,1529},{12,0,739},{14,0,448},{142,0,467},{11,10,526},{11,10, +939},{141,10,290},{5,10,774},{6,10,1637},{6,10,1686},{134,10,1751},{6,0,1667},{ +135,0,2036},{7,10,1167},{11,10,934},{13,10,391},{145,10,76},{137,11,147},{6,10, +260},{7,10,1484},{11,11,821},{12,11,110},{12,11,153},{18,11,41},{150,11,19},{6,0 +,511},{6,10,573},{140,0,132},{5,0,568},{6,0,138},{135,0,1293},{132,0,1020},{8,0, +258},{9,0,208},{137,0,359},{4,0,565},{8,0,23},{136,0,827},{134,0,344},{4,0,922}, +{5,0,1023},{13,11,477},{14,11,120},{148,11,61},{134,0,240},{5,11,209},{6,11,30}, +{11,11,56},{139,11,305},{4,10,292},{4,10,736},{5,10,871},{6,0,171},{6,10,1689},{ +7,0,1002},{7,0,1324},{7,10,1944},{9,0,415},{9,10,580},{14,0,230},{146,0,68},{9, +11,635},{139,11,559},{4,11,150},{5,11,303},{134,11,327},{6,10,63},{135,10,920},{ +133,10,793},{8,11,192},{10,11,78},{10,11,555},{11,11,308},{13,11,359},{147,11,95 +},{135,11,786},{135,11,1712},{136,0,402},{6,0,754},{6,11,1638},{7,11,79},{7,11, +496},{9,11,138},{10,11,336},{11,11,12},{12,11,412},{12,11,440},{142,11,305},{4,0 +,716},{141,0,31},{133,0,982},{5,10,67},{6,10,62},{6,10,374},{7,10,1391},{8,0,691 +},{136,0,731},{9,10,790},{140,10,47},{139,11,556},{151,11,1},{7,11,204},{7,11, +415},{8,11,42},{10,11,85},{11,11,33},{11,11,564},{12,11,571},{149,11,1},{7,11, +610},{7,11,1501},{136,0,888},{4,10,391},{135,10,1169},{5,0,847},{9,0,840},{138,0 +,803},{137,0,823},{134,0,785},{8,0,152},{9,0,53},{9,0,268},{9,0,901},{10,0,518}, +{10,0,829},{11,0,188},{13,0,74},{14,0,46},{15,0,17},{15,0,33},{17,0,40},{18,0,36 +},{19,0,20},{22,0,1},{152,0,2},{4,11,3},{5,11,247},{5,11,644},{7,11,744},{7,11, +1207},{7,11,1225},{7,11,1909},{146,11,147},{136,0,532},{135,0,681},{132,10,271}, +{140,0,314},{140,0,677},{4,0,684},{136,0,384},{5,11,285},{9,11,67},{13,11,473},{ +143,11,82},{4,10,253},{5,10,544},{7,10,300},{137,10,340},{7,0,110},{7,0,447},{8, +0,290},{8,0,591},{9,0,382},{9,0,649},{11,0,71},{11,0,155},{11,0,313},{12,0,5},{ +13,0,325},{142,0,287},{134,0,1818},{136,0,1007},{138,0,321},{7,0,360},{7,0,425}, +{9,0,66},{9,0,278},{138,0,644},{133,10,818},{5,0,385},{5,10,541},{6,10,94},{6,10 +,499},{7,10,230},{139,10,321},{4,10,920},{5,10,25},{5,10,790},{6,10,457},{7,10, +853},{136,10,788},{4,0,900},{133,0,861},{5,0,254},{7,0,985},{136,0,73},{7,0,1959 +},{136,0,683},{134,10,1765},{133,10,822},{132,10,634},{4,11,29},{6,11,532},{7,11 +,1628},{7,11,1648},{9,11,303},{9,11,350},{10,11,433},{11,11,97},{11,11,557},{11, +11,745},{12,11,289},{12,11,335},{12,11,348},{12,11,606},{13,11,116},{13,11,233}, +{13,11,466},{14,11,181},{14,11,209},{14,11,232},{14,11,236},{14,11,300},{16,11, +41},{148,11,97},{6,10,36},{7,10,658},{8,10,454},{147,0,86},{135,11,1692},{132,0, +725},{5,11,501},{7,11,1704},{9,11,553},{11,11,520},{12,11,557},{141,11,249},{134 +,0,196},{133,0,831},{136,0,723},{7,0,1897},{13,0,80},{13,0,437},{145,0,74},{4,0, +992},{6,0,627},{136,0,994},{135,11,1294},{132,10,104},{5,0,848},{6,0,66},{136,0, +764},{4,0,36},{7,0,1387},{10,0,205},{139,0,755},{6,0,1046},{134,0,1485},{134,0, +950},{132,0,887},{14,0,450},{148,0,111},{7,0,620},{7,0,831},{9,10,542},{9,10,566 +},{138,10,728},{6,0,165},{138,0,388},{139,10,263},{4,0,719},{135,0,155},{138,10, +468},{6,11,453},{144,11,36},{134,11,129},{5,0,533},{7,0,755},{138,0,780},{134,0, +1465},{4,0,353},{6,0,146},{6,0,1789},{7,0,427},{7,0,990},{7,0,1348},{9,0,665},{9 +,0,898},{11,0,893},{142,0,212},{7,10,87},{142,10,288},{4,0,45},{135,0,1257},{7, +10,988},{7,10,1939},{9,10,64},{9,10,502},{12,0,7},{12,10,34},{13,10,12},{13,10, +234},{147,10,77},{4,0,607},{5,11,60},{6,11,504},{7,11,614},{7,11,1155},{140,11,0 +},{135,10,141},{8,11,198},{11,11,29},{140,11,534},{140,0,65},{136,0,816},{132,10 +,619},{139,0,88},{5,10,246},{8,10,189},{9,10,355},{9,10,512},{10,10,124},{10,10, +453},{11,10,143},{11,10,416},{11,10,859},{141,10,341},{4,11,379},{135,11,1397},{ +4,0,600},{137,0,621},{133,0,367},{134,0,561},{6,0,559},{134,0,1691},{6,0,585},{ +134,11,585},{135,11,1228},{4,11,118},{5,10,678},{6,11,274},{6,11,361},{7,11,75}, +{141,11,441},{135,11,1818},{137,11,841},{5,0,573},{6,0,287},{7,10,862},{7,10, +1886},{138,10,179},{132,10,517},{140,11,693},{5,11,314},{6,11,221},{7,11,419},{ +10,11,650},{11,11,396},{12,11,156},{13,11,369},{14,11,333},{145,11,47},{140,10, +540},{136,10,667},{11,10,403},{146,10,83},{5,10,761},{134,0,672},{9,0,157},{10, +10,131},{140,10,72},{6,11,460},{135,0,714},{134,0,456},{133,0,925},{5,11,682},{ +135,11,1887},{136,11,510},{136,11,475},{133,11,1016},{7,11,602},{8,11,179},{9,0, +19},{10,11,781},{140,11,126},{6,11,329},{138,11,111},{6,0,822},{134,0,1473},{144 +,11,86},{11,0,113},{139,11,113},{5,11,821},{134,11,1687},{133,10,449},{7,0,463}, +{8,10,103},{145,0,69},{7,10,2028},{138,10,641},{6,0,193},{7,0,240},{7,0,1682},{ +10,0,51},{10,0,640},{11,0,410},{13,0,82},{14,0,247},{14,0,331},{142,0,377},{6,0, +471},{11,0,411},{142,0,2},{5,11,71},{7,11,1407},{9,11,388},{9,11,704},{10,11,261 +},{10,11,619},{11,11,547},{11,11,619},{143,11,157},{136,0,633},{135,0,1148},{6,0 +,554},{7,0,1392},{7,10,1274},{7,10,1386},{7,11,2008},{9,11,337},{10,11,517},{12, +0,129},{146,10,87},{6,10,187},{7,0,803},{7,10,1203},{8,0,542},{8,10,380},{14,10, +117},{149,10,28},{6,10,297},{7,10,793},{139,10,938},{7,10,464},{8,0,438},{11,0, +363},{11,10,105},{12,10,231},{14,10,386},{15,10,102},{148,10,75},{5,11,16},{6,11 +,86},{6,11,603},{7,11,292},{7,11,561},{8,11,257},{8,11,382},{9,11,721},{9,11,778 +},{11,11,581},{140,11,466},{4,11,486},{5,11,491},{134,0,717},{132,0,875},{132,11 +,72},{6,11,265},{135,11,847},{4,0,237},{135,0,514},{6,0,392},{7,0,65},{135,0, +2019},{140,11,261},{135,11,922},{137,11,404},{7,10,1010},{11,10,733},{11,10,759} +,{12,0,563},{13,10,34},{14,0,101},{18,0,129},{146,10,45},{7,10,1656},{9,10,369}, +{10,10,338},{10,10,490},{11,10,154},{11,10,545},{11,10,775},{13,10,77},{141,10, +274},{4,0,444},{10,0,146},{140,0,9},{139,11,163},{7,0,1260},{135,0,1790},{9,0, +222},{10,0,43},{139,0,900},{137,11,234},{138,0,971},{137,0,761},{134,0,699},{136 +,11,434},{5,10,20},{6,0,1116},{6,10,298},{6,11,197},{7,0,1366},{7,10,659},{8,11, +205},{137,10,219},{132,11,490},{11,11,820},{150,11,51},{7,10,1440},{11,10,854},{ +11,10,872},{11,10,921},{12,10,551},{13,10,472},{142,10,367},{140,11,13},{132,0, +829},{4,10,439},{140,0,242},{136,10,669},{6,0,593},{6,11,452},{7,11,312},{138,11 +,219},{4,11,333},{9,11,176},{12,11,353},{141,11,187},{7,0,36},{8,0,201},{136,0, +605},{140,0,224},{132,10,233},{134,0,1430},{134,0,1806},{4,0,523},{133,0,638},{6 +,0,1889},{9,0,958},{9,0,971},{9,0,976},{12,0,796},{12,0,799},{12,0,808},{12,0, +835},{12,0,836},{12,0,914},{12,0,946},{15,0,216},{15,0,232},{18,0,183},{18,0,187 +},{18,0,194},{18,0,212},{18,0,232},{149,0,49},{132,10,482},{6,0,827},{134,0,1434 +},{135,10,346},{134,0,2043},{6,0,242},{7,0,227},{7,0,1581},{8,0,104},{9,0,113},{ +9,0,220},{9,0,427},{10,0,136},{10,0,239},{11,0,579},{11,0,1023},{13,0,4},{13,0, +204},{13,0,316},{148,0,86},{134,11,1685},{7,0,148},{8,0,284},{141,0,63},{142,0, +10},{135,11,584},{134,0,1249},{7,0,861},{135,10,334},{5,10,795},{6,10,1741},{137 +,11,70},{132,0,807},{7,11,135},{8,11,7},{8,11,62},{9,11,243},{10,11,658},{10,11, +697},{11,11,456},{139,11,756},{9,11,395},{138,11,79},{137,11,108},{147,0,94},{ +136,0,494},{135,11,631},{135,10,622},{7,0,1510},{135,10,1750},{4,10,203},{135,10 +,1936},{7,11,406},{7,11,459},{8,11,606},{139,11,726},{7,0,1306},{8,0,505},{9,0, +482},{10,0,126},{11,0,225},{12,0,347},{12,0,449},{13,0,19},{14,0,218},{142,0,435 +},{5,0,268},{10,0,764},{12,0,120},{13,0,39},{145,0,127},{142,11,68},{11,10,678}, +{140,10,307},{12,11,268},{12,11,640},{142,11,119},{135,10,2044},{133,11,612},{4, +11,372},{7,11,482},{8,11,158},{9,11,602},{9,11,615},{10,11,245},{10,11,678},{10, +11,744},{11,11,248},{139,11,806},{7,10,311},{9,10,308},{140,10,255},{4,0,384},{ +135,0,1022},{5,11,854},{135,11,1991},{135,10,1266},{4,10,400},{5,10,267},{135,10 +,232},{135,0,1703},{9,0,159},{11,0,661},{140,0,603},{4,0,964},{9,11,106},{9,11, +163},{9,11,296},{10,11,167},{10,11,172},{10,11,777},{11,11,16},{14,0,438},{14,0, +444},{14,0,456},{22,0,60},{150,0,63},{136,0,583},{132,0,515},{8,0,632},{8,0,697} +,{137,0,854},{5,11,195},{135,11,1685},{6,0,1123},{134,0,1365},{134,11,328},{7,11 +,1997},{8,11,730},{139,11,1006},{4,0,136},{133,0,551},{134,0,1782},{7,0,1287},{9 +,0,44},{10,0,552},{10,0,642},{11,0,839},{12,0,274},{12,0,275},{12,0,372},{13,0, +91},{142,0,125},{5,11,751},{11,11,797},{140,11,203},{133,0,732},{4,10,100},{7,0, +679},{7,11,821},{136,0,313},{10,0,361},{142,0,316},{134,0,595},{6,0,147},{7,0, +886},{9,0,753},{138,0,268},{5,10,362},{5,10,443},{6,10,318},{7,10,1019},{139,10, +623},{5,10,463},{136,10,296},{4,10,454},{5,11,950},{5,11,994},{134,11,351},{138, +0,137},{5,10,48},{5,10,404},{6,10,557},{7,10,458},{8,10,597},{10,10,455},{10,10, +606},{11,10,49},{11,10,548},{12,10,476},{13,10,18},{141,10,450},{133,0,414},{135 +,0,1762},{5,11,421},{135,11,47},{5,10,442},{135,10,1984},{134,0,599},{134,0,1749 +},{134,0,1627},{4,0,488},{132,11,350},{137,11,751},{132,0,83},{140,0,676},{133, +11,967},{5,10,55},{7,0,1639},{140,10,161},{4,11,473},{7,11,623},{8,11,808},{9,11 +,871},{9,11,893},{11,11,38},{11,11,431},{12,11,112},{12,11,217},{12,11,243},{12, +11,562},{12,11,683},{13,11,141},{13,11,197},{13,11,227},{13,11,406},{13,11,487}, +{14,11,156},{14,11,203},{14,11,224},{14,11,256},{18,11,58},{150,11,0},{133,10, +450},{7,11,736},{139,11,264},{134,0,278},{4,11,222},{7,11,286},{136,11,629},{135 +,10,869},{140,0,97},{144,0,14},{134,0,1085},{4,10,213},{7,10,223},{136,10,80},{7 +,0,388},{7,0,644},{139,0,781},{132,0,849},{7,0,229},{8,0,59},{9,0,190},{10,0,378 +},{140,0,191},{7,10,381},{7,10,806},{7,10,820},{8,10,354},{8,10,437},{8,10,787}, +{9,10,657},{10,10,58},{10,10,339},{10,10,749},{11,10,914},{12,10,162},{13,10,75} +,{14,10,106},{14,10,198},{14,10,320},{14,10,413},{146,10,43},{141,11,306},{136, +10,747},{134,0,1115},{8,11,146},{16,0,94},{144,0,108},{6,0,700},{6,0,817},{134,0 +,1002},{133,10,692},{4,11,465},{135,11,1663},{134,10,191},{6,0,1414},{135,11,913 +},{132,0,660},{7,0,1035},{138,0,737},{6,10,162},{7,10,1960},{136,10,831},{132,10 +,706},{7,0,690},{9,0,217},{9,0,587},{140,0,521},{138,10,426},{135,10,1235},{6,11 +,82},{7,11,138},{7,11,517},{9,11,673},{139,11,238},{138,0,272},{5,11,495},{7,11, +834},{9,11,733},{139,11,378},{134,0,1744},{132,0,1011},{7,11,828},{142,11,116},{ +4,0,733},{5,11,559},{9,0,194},{10,0,92},{11,0,198},{12,0,84},{141,0,128},{6,11, +21},{6,11,1737},{7,11,1444},{8,11,224},{10,0,57},{138,0,277},{4,10,204},{137,10, +902},{136,10,833},{7,10,366},{9,10,287},{11,0,348},{12,0,99},{12,10,199},{12,10, +556},{12,10,577},{18,0,1},{18,0,11},{147,0,4},{6,0,1981},{136,0,936},{21,0,33},{ +150,0,40},{5,11,519},{138,11,204},{5,10,356},{135,10,224},{134,0,775},{135,0,306 +},{7,10,630},{9,10,567},{11,10,150},{11,10,444},{141,10,119},{5,0,979},{134,10, +539},{133,0,611},{4,11,402},{135,11,1679},{5,0,178},{7,11,2},{8,11,323},{136,11, +479},{5,11,59},{135,11,672},{4,0,1010},{6,0,1969},{138,11,237},{133,11,412},{146 +,11,34},{7,11,1740},{146,11,48},{134,0,664},{139,10,814},{4,11,85},{135,11,549}, +{133,11,94},{133,11,457},{132,0,390},{134,0,1510},{4,10,235},{135,10,255},{4,10, +194},{5,10,584},{6,10,384},{6,11,11},{7,10,583},{7,11,187},{10,10,761},{11,10, +760},{139,10,851},{4,11,522},{139,11,802},{135,0,493},{10,11,776},{13,11,345},{ +142,11,425},{146,0,37},{4,11,52},{135,11,661},{134,0,724},{134,0,829},{133,11, +520},{133,10,562},{4,11,281},{5,11,38},{7,11,194},{7,11,668},{7,11,1893},{137,11 +,397},{5,10,191},{137,10,271},{7,0,1537},{14,0,96},{143,0,73},{4,10,470},{5,0, +473},{6,10,153},{7,10,1503},{7,10,1923},{10,10,701},{11,0,168},{11,10,132},{11, +10,227},{11,10,320},{11,10,436},{11,10,525},{11,10,855},{12,10,41},{12,10,286},{ +13,10,103},{13,10,284},{14,10,255},{14,10,262},{15,10,117},{143,10,127},{133,0, +105},{5,0,438},{9,0,694},{12,0,627},{141,0,210},{133,10,327},{6,10,552},{7,10, +1754},{137,10,604},{134,0,1256},{152,0,11},{5,11,448},{11,11,98},{139,11,524},{5 +,10,80},{6,10,405},{7,0,1626},{7,10,403},{7,10,1502},{8,10,456},{9,10,487},{9,10 +,853},{9,10,889},{10,10,309},{11,10,721},{11,10,994},{12,10,430},{13,10,165},{14 +,11,16},{146,11,44},{132,0,779},{8,0,25},{138,0,826},{4,10,453},{5,10,887},{6,10 +,535},{8,10,6},{8,10,543},{136,10,826},{137,11,461},{140,11,632},{132,0,308},{ +135,0,741},{132,0,671},{7,0,150},{8,0,649},{136,0,1020},{6,11,336},{8,11,552},{9 +,0,99},{9,11,285},{10,11,99},{139,11,568},{134,0,521},{5,0,339},{14,0,3},{15,0, +41},{15,0,166},{147,0,66},{6,11,423},{7,11,665},{7,11,1210},{9,11,218},{141,11, +222},{5,10,101},{5,11,256},{6,0,543},{6,10,88},{7,10,1677},{9,10,100},{10,10,677 +},{14,10,169},{14,10,302},{14,10,313},{15,10,48},{143,10,84},{4,10,310},{7,10, +708},{7,10,996},{9,10,795},{10,10,390},{10,10,733},{11,10,451},{12,10,249},{14, +10,115},{14,10,286},{143,10,100},{133,10,587},{13,11,417},{14,11,129},{143,11,15 +},{134,0,1358},{136,11,554},{132,10,498},{7,10,217},{8,10,140},{138,10,610},{135 +,11,989},{135,11,634},{6,0,155},{140,0,234},{135,11,462},{132,11,618},{134,0, +1628},{132,0,766},{4,11,339},{5,10,905},{135,11,259},{135,0,829},{4,11,759},{141 +,11,169},{4,10,456},{7,0,1445},{7,10,358},{7,10,1637},{8,10,643},{139,10,483},{5 +,0,486},{135,0,1349},{5,11,688},{135,11,712},{7,0,1635},{8,0,17},{10,0,217},{10, +0,295},{12,0,2},{140,11,2},{138,0,558},{150,10,56},{4,11,278},{5,11,465},{135,11 +,1367},{136,11,482},{133,10,535},{6,0,1362},{6,0,1461},{10,11,274},{10,11,625},{ +139,11,530},{5,0,599},{5,11,336},{6,11,341},{6,11,478},{6,11,1763},{136,11,386}, +{7,10,1748},{137,11,151},{134,0,1376},{133,10,539},{135,11,73},{135,11,1971},{ +139,11,283},{9,0,93},{139,0,474},{6,10,91},{135,10,435},{5,11,396},{6,0,447},{ +134,11,501},{4,10,16},{5,10,316},{5,10,842},{6,10,370},{6,10,1778},{8,10,166},{ +11,10,812},{12,10,206},{12,10,351},{14,10,418},{16,10,15},{16,10,34},{18,10,3},{ +19,10,3},{19,10,7},{20,10,4},{149,10,21},{7,0,577},{7,0,1432},{9,0,475},{9,0,505 +},{9,0,526},{9,0,609},{9,0,689},{9,0,726},{9,0,735},{9,0,738},{10,0,556},{10,0, +674},{10,0,684},{11,0,89},{11,0,202},{11,0,272},{11,0,380},{11,0,415},{11,0,505} +,{11,0,537},{11,0,550},{11,0,562},{11,0,640},{11,0,667},{11,0,688},{11,0,847},{ +11,0,927},{11,0,930},{11,0,940},{12,0,144},{12,0,325},{12,0,329},{12,0,389},{12, +0,403},{12,0,451},{12,0,515},{12,0,604},{12,0,616},{12,0,626},{13,0,66},{13,0, +131},{13,0,167},{13,0,236},{13,0,368},{13,0,411},{13,0,434},{13,0,453},{13,0,461 +},{13,0,474},{14,0,59},{14,0,60},{14,0,139},{14,0,152},{14,0,276},{14,0,353},{14 +,0,402},{15,0,28},{15,0,81},{15,0,123},{15,0,152},{18,0,136},{148,0,88},{4,11, +929},{133,11,799},{136,11,46},{142,0,307},{4,0,609},{7,0,756},{9,0,544},{11,0, +413},{144,0,25},{7,10,619},{10,0,687},{10,10,547},{11,10,122},{140,10,601},{4,0, +930},{133,0,947},{133,0,939},{142,0,21},{4,11,892},{133,11,770},{133,0,962},{5,0 +,651},{8,0,170},{9,0,61},{9,0,63},{10,0,23},{10,0,37},{10,0,834},{11,0,4},{11,0, +187},{11,0,281},{11,0,503},{11,0,677},{12,0,96},{12,0,130},{12,0,244},{14,0,5},{ +14,0,40},{14,0,162},{14,0,202},{146,0,133},{4,0,406},{5,0,579},{12,0,492},{150,0 +,15},{135,11,158},{135,0,597},{132,0,981},{132,10,888},{4,10,149},{138,10,368},{ +132,0,545},{4,10,154},{7,10,1134},{136,10,105},{135,11,2001},{134,0,1558},{4,10, +31},{6,10,429},{7,10,962},{9,10,458},{139,10,691},{132,10,312},{135,10,1642},{6, +0,17},{6,0,1304},{7,0,16},{7,0,1001},{9,0,886},{10,0,489},{10,0,800},{11,0,782}, +{12,0,320},{13,0,467},{14,0,145},{14,0,387},{143,0,119},{135,0,1982},{7,11,1461} +,{12,11,91},{145,0,17},{4,10,236},{132,11,602},{138,0,907},{136,0,110},{5,10,836 +},{5,10,857},{6,10,1680},{7,0,272},{147,0,53},{5,0,458},{7,11,1218},{136,11,303} +,{7,0,1983},{8,0,0},{8,0,171},{9,0,120},{9,0,732},{10,0,473},{10,10,68},{11,0, +656},{11,0,998},{11,10,494},{18,0,0},{18,0,2},{147,0,21},{137,11,662},{4,11,13}, +{5,11,567},{7,11,1498},{9,11,124},{11,11,521},{140,11,405},{4,10,81},{139,10,867 +},{135,11,1006},{7,11,800},{7,11,1783},{138,11,12},{5,10,282},{8,10,650},{9,0, +295},{9,10,907},{138,0,443},{132,11,735},{4,10,775},{4,11,170},{135,11,323},{6,0 +,1844},{10,0,924},{11,11,844},{12,11,104},{140,11,625},{5,11,304},{7,11,1403},{ +140,11,498},{134,0,1232},{4,0,519},{10,0,70},{12,0,26},{14,0,17},{14,0,178},{15, +0,34},{149,0,12},{132,0,993},{4,11,148},{133,11,742},{6,0,31},{7,0,491},{7,0,530 +},{8,0,592},{11,0,53},{11,0,779},{12,0,167},{12,0,411},{14,0,14},{14,0,136},{15, +0,72},{16,0,17},{144,0,72},{133,0,907},{134,0,733},{133,11,111},{4,10,71},{5,10, +376},{7,10,119},{138,10,665},{136,0,55},{8,0,430},{136,11,430},{4,0,208},{5,0, +106},{6,0,531},{8,0,408},{9,0,188},{138,0,572},{11,10,827},{12,0,56},{14,10,34}, +{143,10,148},{134,0,1693},{133,11,444},{132,10,479},{140,0,441},{9,0,449},{10,0, +192},{138,0,740},{134,0,928},{4,0,241},{7,10,607},{136,10,99},{8,11,123},{15,11, +6},{144,11,7},{6,11,285},{8,11,654},{11,11,749},{12,11,190},{12,11,327},{13,11, +120},{13,11,121},{13,11,327},{15,11,47},{146,11,40},{4,10,41},{5,10,74},{7,10, +1627},{11,10,871},{140,10,619},{7,0,1525},{11,10,329},{11,10,965},{12,10,241},{ +14,10,354},{15,10,22},{148,10,63},{132,0,259},{135,11,183},{9,10,209},{137,10, +300},{5,11,937},{135,11,100},{133,10,98},{4,0,173},{5,0,312},{5,0,512},{135,0, +1285},{141,0,185},{7,0,1603},{7,0,1691},{9,0,464},{11,0,195},{12,0,279},{12,0, +448},{14,0,11},{147,0,102},{135,0,1113},{133,10,984},{4,0,452},{5,0,583},{135,0, +720},{4,0,547},{5,0,817},{6,0,433},{7,0,593},{7,0,1378},{8,0,161},{9,0,284},{10, +0,313},{139,0,886},{4,10,182},{6,10,205},{7,10,220},{136,0,722},{150,0,13},{4,10 +,42},{9,10,205},{9,10,786},{138,10,659},{6,0,289},{7,0,1670},{12,0,57},{151,0,4} +,{132,10,635},{14,0,43},{146,0,21},{139,10,533},{135,0,1694},{8,0,420},{139,0, +193},{135,0,409},{132,10,371},{4,10,272},{135,10,836},{5,10,825},{134,10,1640},{ +5,11,251},{5,11,956},{8,11,268},{9,11,214},{146,11,142},{138,0,308},{6,0,1863},{ +141,11,37},{137,10,879},{7,10,317},{135,10,569},{132,11,294},{134,0,790},{5,0, +1002},{136,0,745},{5,11,346},{5,11,711},{136,11,390},{135,0,289},{5,0,504},{9,10 +,307},{139,0,68},{4,0,239},{6,0,477},{7,0,1607},{139,0,617},{149,0,13},{133,0, +609},{133,11,624},{5,11,783},{7,11,1998},{135,11,2047},{133,10,525},{132,0,367}, +{132,11,594},{5,10,493},{134,0,528},{4,10,174},{135,10,911},{8,10,417},{137,10, +782},{132,0,694},{7,0,548},{137,0,58},{4,10,32},{5,10,215},{6,10,269},{7,10,1782 +},{7,10,1892},{10,10,16},{11,10,822},{11,10,954},{141,10,481},{140,0,687},{7,0, +1749},{136,10,477},{132,11,569},{133,10,308},{135,10,1088},{4,0,661},{138,0,1004 +},{5,11,37},{6,11,39},{6,11,451},{7,11,218},{7,11,667},{7,11,1166},{7,11,1687},{ +8,11,662},{144,11,2},{5,10,126},{8,10,297},{9,0,445},{9,10,366},{12,0,53},{12,10 +,374},{141,0,492},{7,10,1551},{139,10,361},{148,0,74},{134,11,508},{135,0,213},{ +132,10,175},{132,10,685},{6,0,760},{6,0,834},{134,0,1248},{7,11,453},{7,11,635}, +{7,11,796},{8,11,331},{9,11,328},{9,11,330},{9,11,865},{10,11,119},{10,11,235},{ +11,11,111},{11,11,129},{11,11,240},{12,11,31},{12,11,66},{12,11,222},{12,11,269} +,{12,11,599},{12,11,689},{13,11,186},{13,11,364},{142,11,345},{7,0,1672},{139,0, +189},{133,10,797},{133,10,565},{6,0,1548},{6,11,98},{7,11,585},{135,11,702},{9,0 +,968},{15,0,192},{149,0,56},{4,10,252},{6,11,37},{7,10,1068},{7,11,299},{7,11, +1666},{8,11,195},{8,11,316},{9,11,178},{9,11,276},{9,11,339},{9,11,536},{10,10, +434},{10,11,102},{10,11,362},{10,11,785},{11,10,228},{11,10,426},{11,11,55},{11, +11,149},{11,11,773},{13,10,231},{13,11,416},{13,11,419},{14,11,38},{14,11,41},{ +14,11,210},{18,10,106},{148,10,87},{4,0,751},{11,0,390},{140,0,32},{4,0,409},{ +133,0,78},{11,11,458},{12,11,15},{140,11,432},{5,10,231},{7,0,1602},{7,10,601},{ +9,10,277},{9,10,674},{10,0,257},{10,0,698},{10,10,178},{10,10,418},{10,10,509},{ +11,0,544},{11,0,585},{11,10,531},{12,0,212},{12,10,113},{12,10,475},{13,0,307},{ +13,10,99},{142,10,428},{6,0,473},{145,0,105},{5,11,645},{6,0,1949},{143,0,156},{ +7,10,1591},{144,10,43},{135,0,1779},{135,10,1683},{4,11,290},{135,11,1356},{134, +0,763},{6,11,70},{7,11,1292},{10,11,762},{139,11,288},{142,0,29},{140,11,428},{7 +,0,883},{7,11,131},{7,11,422},{8,11,210},{140,11,573},{134,0,488},{4,10,399},{5, +10,119},{5,10,494},{7,10,751},{137,10,556},{133,0,617},{132,11,936},{139,0,50},{ +7,0,1518},{139,0,694},{137,0,785},{4,0,546},{135,0,2042},{7,11,716},{13,11,97},{ +141,11,251},{132,11,653},{145,0,22},{134,0,1016},{4,0,313},{133,0,577},{136,11, +657},{8,0,184},{141,0,433},{135,0,935},{6,0,720},{9,0,114},{146,11,80},{7,10,594 +},{7,10,851},{7,10,1858},{9,10,411},{9,10,574},{9,10,666},{9,10,737},{10,10,346} +,{10,10,712},{11,10,246},{11,10,432},{11,10,517},{11,10,647},{11,10,679},{11,10, +727},{12,0,186},{12,0,292},{12,10,304},{12,10,305},{12,10,323},{12,10,483},{12, +10,572},{12,10,593},{12,10,602},{13,10,95},{13,10,101},{13,10,171},{13,10,315},{ +13,10,378},{13,10,425},{13,10,475},{14,0,100},{14,10,63},{14,10,380},{14,10,384} +,{15,10,133},{18,0,70},{18,10,112},{148,10,72},{135,10,1093},{135,11,1836},{132, +10,679},{137,10,203},{11,0,402},{12,0,109},{12,0,431},{13,0,179},{13,0,206},{14, +0,217},{16,0,3},{148,0,53},{7,11,1368},{8,11,232},{8,11,361},{10,11,682},{138,11 +,742},{137,10,714},{5,0,886},{6,0,46},{6,0,1790},{7,0,14},{7,0,732},{7,0,1654},{ +8,0,95},{8,0,327},{8,0,616},{9,0,892},{9,11,534},{10,0,598},{10,0,769},{11,0,134 +},{11,0,747},{12,0,378},{142,0,97},{4,0,969},{136,10,825},{137,11,27},{6,0,727}, +{142,11,12},{133,0,1021},{134,0,1190},{134,11,1657},{5,10,143},{5,10,769},{6,10, +1760},{7,10,682},{7,10,1992},{136,10,736},{132,0,153},{135,11,127},{133,0,798},{ +132,0,587},{6,0,598},{7,0,42},{8,0,695},{10,0,212},{11,0,158},{14,0,196},{145,0, +85},{133,10,860},{6,0,1929},{134,0,1933},{5,0,957},{5,0,1008},{6,10,422},{7,10,0 +},{7,10,1544},{8,11,364},{9,0,577},{11,10,990},{12,0,141},{12,10,453},{13,10,47} +,{141,10,266},{134,0,1319},{4,0,129},{135,0,465},{7,0,470},{7,0,1057},{7,0,1201} +,{9,0,755},{11,0,906},{140,0,527},{7,0,908},{146,0,7},{5,0,148},{136,0,450},{5, +10,515},{137,10,131},{7,10,1605},{11,10,962},{146,10,139},{132,10,646},{134,0, +1166},{4,10,396},{7,10,728},{9,10,117},{13,10,202},{148,10,51},{6,10,121},{6,10, +124},{6,10,357},{7,10,1138},{7,10,1295},{8,10,162},{139,10,655},{14,0,374},{142, +11,374},{138,0,253},{139,0,1003},{5,11,909},{9,11,849},{138,11,805},{133,10,237} +,{7,11,525},{7,11,1579},{8,11,497},{136,11,573},{137,0,46},{132,0,879},{134,0, +806},{135,0,1868},{6,0,1837},{134,0,1846},{6,0,730},{134,0,881},{7,0,965},{7,0, +1460},{7,0,1604},{7,11,193},{7,11,397},{7,11,1105},{8,11,124},{8,11,619},{9,11, +305},{10,11,264},{11,11,40},{12,11,349},{13,11,134},{13,11,295},{14,11,155},{15, +11,120},{146,11,105},{136,0,506},{143,0,10},{4,11,262},{7,10,571},{7,10,1877},{7 +,11,342},{10,10,366},{141,11,23},{133,11,641},{9,10,513},{10,0,22},{10,10,39},{ +12,10,122},{140,10,187},{135,11,1431},{150,11,49},{4,11,99},{6,11,250},{6,11,346 +},{8,11,127},{138,11,81},{6,0,2014},{8,0,928},{10,0,960},{10,0,979},{140,0,996}, +{134,0,296},{132,11,915},{5,11,75},{9,11,517},{10,11,470},{12,11,155},{141,11, +224},{137,10,873},{4,0,854},{140,11,18},{134,0,587},{7,10,107},{7,10,838},{8,10, +550},{138,10,401},{11,0,636},{11,10,588},{11,10,864},{11,10,968},{15,0,145},{15, +10,160},{17,0,34},{19,0,50},{151,0,20},{135,11,216},{7,0,982},{10,0,32},{143,0, +56},{133,10,768},{133,11,954},{6,11,304},{7,11,1114},{8,11,418},{10,11,345},{11, +11,341},{11,11,675},{141,11,40},{9,11,410},{139,11,425},{136,0,941},{4,10,894},{ +133,0,435},{5,0,85},{6,0,419},{7,0,134},{7,0,305},{7,0,361},{7,0,1337},{8,0,71}, +{140,0,519},{140,0,688},{135,0,740},{5,0,691},{7,0,345},{9,0,94},{140,0,169},{5, +0,183},{6,0,582},{10,0,679},{140,0,435},{134,11,14},{6,0,945},{135,0,511},{134, +11,1708},{5,11,113},{6,11,243},{7,11,1865},{11,11,161},{16,11,37},{145,11,99},{ +132,11,274},{137,0,539},{6,10,272},{7,0,1993},{136,0,684},{6,0,659},{134,0,982}, +{4,10,9},{5,10,128},{7,10,368},{11,10,480},{148,10,3},{134,0,583},{132,0,803},{ +133,0,704},{4,0,179},{5,0,198},{133,0,697},{7,0,347},{7,0,971},{7,11,166},{8,0, +181},{138,0,711},{136,10,682},{4,10,2},{7,10,545},{7,10,894},{136,11,521},{135,0 +,481},{132,0,243},{5,0,203},{7,0,19},{7,0,71},{7,0,113},{10,0,405},{11,0,357},{ +142,0,240},{5,11,725},{5,11,727},{135,11,1811},{6,0,826},{137,11,304},{7,0,1450} +,{139,0,99},{133,11,654},{134,0,492},{5,0,134},{6,0,408},{6,0,495},{6,11,273},{7 +,0,1593},{10,11,188},{13,11,377},{146,11,77},{9,10,769},{140,10,185},{135,11,410 +},{142,0,4},{4,0,665},{134,11,1785},{4,0,248},{7,0,137},{137,0,349},{5,10,530},{ +142,10,113},{7,0,1270},{139,0,612},{132,11,780},{5,0,371},{135,0,563},{135,0,826 +},{6,0,1535},{23,0,21},{151,0,23},{4,0,374},{7,0,547},{7,0,1700},{7,0,1833},{139 +,0,858},{133,10,556},{7,11,612},{8,11,545},{8,11,568},{8,11,642},{9,11,717},{10, +11,541},{10,11,763},{11,11,449},{12,11,489},{13,11,153},{13,11,296},{14,11,138}, +{14,11,392},{15,11,50},{16,11,6},{16,11,12},{148,11,9},{9,0,311},{141,0,42},{8, +10,16},{140,10,568},{6,0,1968},{6,0,2027},{138,0,991},{6,0,1647},{7,0,1552},{7,0 +,2010},{9,0,494},{137,0,509},{133,11,948},{6,10,186},{137,10,426},{134,0,769},{ +134,0,642},{132,10,585},{6,0,123},{7,0,214},{9,0,728},{10,0,157},{11,0,346},{11, +0,662},{143,0,106},{142,11,381},{135,0,1435},{4,11,532},{5,11,706},{135,11,662}, +{5,11,837},{134,11,1651},{4,10,93},{5,10,252},{6,10,229},{7,10,291},{9,10,550},{ +139,10,644},{148,0,79},{137,10,749},{134,0,1425},{137,10,162},{4,11,362},{7,11, +52},{7,11,303},{140,11,166},{132,10,381},{4,11,330},{7,11,933},{7,11,2012},{136, +11,292},{135,11,767},{4,0,707},{5,0,588},{6,0,393},{13,0,106},{18,0,49},{147,0, +41},{6,0,211},{7,0,1690},{11,0,486},{140,0,369},{137,11,883},{4,11,703},{135,11, +207},{4,0,187},{5,0,184},{5,0,690},{7,0,1869},{10,0,756},{139,0,783},{132,11,571 +},{134,0,1382},{5,0,175},{6,10,77},{6,10,157},{7,10,974},{7,10,1301},{7,10,1339} +,{7,10,1490},{7,10,1873},{137,10,628},{134,0,1493},{5,11,873},{133,11,960},{134, +0,1007},{12,11,93},{12,11,501},{13,11,362},{14,11,151},{15,11,40},{15,11,59},{16 +,11,46},{17,11,25},{18,11,14},{18,11,134},{19,11,25},{19,11,69},{20,11,16},{20, +11,19},{20,11,66},{21,11,23},{21,11,25},{150,11,42},{11,10,919},{141,10,409},{ +134,0,219},{5,0,582},{6,0,1646},{7,0,99},{7,0,1962},{7,0,1986},{8,0,515},{8,0, +773},{9,0,23},{9,0,491},{12,0,620},{142,0,93},{133,0,851},{5,11,33},{134,11,470} +,{135,11,1291},{134,0,1278},{135,11,1882},{135,10,1489},{132,0,1000},{138,0,982} +,{8,0,762},{8,0,812},{137,0,910},{6,11,47},{7,11,90},{7,11,664},{7,11,830},{7,11 +,1380},{7,11,2025},{8,11,448},{136,11,828},{4,0,98},{4,0,940},{6,0,1819},{6,0, +1834},{6,0,1841},{7,0,1365},{8,0,859},{8,0,897},{8,0,918},{8,10,398},{9,0,422},{ +9,0,670},{9,10,681},{10,0,775},{10,0,894},{10,0,909},{10,0,910},{10,0,935},{11,0 +,210},{11,10,632},{12,0,750},{12,0,755},{13,0,26},{13,0,457},{13,0,476},{16,0, +100},{16,0,109},{18,0,173},{146,0,175},{9,11,417},{137,11,493},{136,10,645},{138 +,0,906},{134,0,1730},{134,10,20},{133,11,1019},{134,0,1185},{8,10,769},{138,0,40 +},{6,11,208},{137,0,147},{140,0,650},{5,0,209},{6,0,30},{11,0,56},{139,0,305},{ +132,0,553},{138,11,344},{6,11,68},{7,11,398},{7,11,448},{7,11,1629},{7,11,1813}, +{8,11,387},{8,11,442},{9,11,710},{10,11,282},{138,11,722},{5,0,597},{14,0,20},{ +142,11,20},{135,0,1614},{135,10,1757},{4,0,150},{5,0,303},{6,0,327},{135,10,937} +,{7,10,1652},{16,0,49},{144,11,49},{8,0,192},{10,0,78},{141,0,359},{135,0,786},{ +143,0,134},{6,0,1638},{7,0,79},{7,0,496},{9,0,138},{10,0,336},{11,0,12},{12,0, +412},{12,0,440},{142,0,305},{136,11,491},{4,10,579},{5,10,226},{5,10,323},{135, +10,960},{7,0,204},{7,0,415},{8,0,42},{10,0,85},{139,0,564},{132,0,614},{4,11,403 +},{5,11,441},{7,11,450},{11,11,101},{12,11,193},{141,11,430},{135,11,1927},{135, +11,1330},{4,0,3},{5,0,247},{5,0,644},{7,0,744},{7,0,1207},{7,0,1225},{7,0,1909}, +{146,0,147},{136,0,942},{4,0,1019},{134,0,2023},{5,10,973},{133,11,679},{5,0,285 +},{9,0,67},{13,0,473},{143,0,82},{7,11,328},{137,11,326},{151,0,8},{6,10,135},{ +135,10,1176},{135,11,1128},{134,0,1309},{135,11,1796},{135,10,314},{4,11,574},{7 +,11,350},{7,11,1024},{8,11,338},{9,11,677},{10,11,808},{139,11,508},{7,11,818},{ +17,11,14},{17,11,45},{18,11,75},{148,11,18},{146,10,4},{135,11,1081},{4,0,29},{6 +,0,532},{7,0,1628},{7,0,1648},{9,0,350},{10,0,433},{11,0,97},{11,0,557},{11,0, +745},{12,0,289},{12,0,335},{12,0,348},{12,0,606},{13,0,116},{13,0,233},{13,0,466 +},{14,0,181},{14,0,209},{14,0,232},{14,0,236},{14,0,300},{16,0,41},{148,0,97},{6 +,10,281},{7,0,318},{8,10,282},{8,10,480},{8,10,499},{9,10,198},{10,10,143},{10, +10,169},{10,10,211},{10,10,417},{10,10,574},{11,10,147},{11,10,395},{12,10,75},{ +12,10,407},{12,10,608},{13,10,500},{142,10,251},{135,11,1676},{135,11,2037},{135 +,0,1692},{5,0,501},{7,0,1704},{9,0,553},{11,0,520},{12,0,557},{141,0,249},{6,0, +1527},{14,0,324},{14,11,324},{15,0,55},{15,0,80},{15,11,55},{143,11,80},{135,10, +1776},{8,0,988},{137,11,297},{132,10,419},{142,0,223},{139,11,234},{7,0,1123},{ +12,0,508},{14,0,102},{14,0,226},{144,0,57},{4,10,138},{7,10,1012},{7,10,1280},{ +137,10,76},{5,10,29},{7,0,1764},{140,10,638},{134,0,2015},{134,0,1599},{138,11, +56},{6,11,306},{7,11,1140},{7,11,1340},{8,11,133},{138,11,449},{139,11,1011},{6, +10,1710},{135,10,2038},{7,11,1763},{140,11,310},{4,10,17},{5,10,23},{6,0,129},{7 +,10,995},{11,10,383},{11,10,437},{12,10,460},{140,10,532},{5,11,329},{136,11,260 +},{133,10,862},{132,0,534},{6,0,811},{135,0,626},{132,11,657},{4,0,25},{5,0,60}, +{6,0,504},{7,0,614},{7,0,1155},{12,0,0},{152,11,7},{7,0,1248},{11,0,621},{139,0, +702},{137,0,321},{8,10,70},{12,10,171},{141,10,272},{10,10,233},{139,10,76},{4,0 +,379},{6,10,442},{135,0,1397},{5,11,66},{7,11,1896},{136,11,288},{134,11,1643},{ +134,10,1709},{4,11,21},{5,11,91},{5,11,570},{5,11,648},{5,11,750},{5,11,781},{6, +11,54},{6,11,112},{6,11,402},{6,11,1732},{7,11,315},{7,11,749},{7,11,1347},{7,11 +,1900},{9,11,78},{9,11,508},{10,11,611},{11,11,510},{11,11,728},{13,11,36},{14, +11,39},{16,11,83},{17,11,124},{148,11,30},{4,0,118},{6,0,274},{6,0,361},{7,0,75} +,{141,0,441},{10,11,322},{10,11,719},{139,11,407},{147,10,119},{12,11,549},{14, +11,67},{147,11,60},{11,10,69},{12,10,105},{12,10,117},{13,10,213},{14,10,13},{14 +,10,62},{14,10,177},{14,10,421},{15,10,19},{146,10,141},{9,0,841},{137,10,309},{ +7,10,608},{7,10,976},{8,11,125},{8,11,369},{8,11,524},{9,10,146},{10,10,206},{10 +,10,596},{10,11,486},{11,11,13},{11,11,381},{11,11,736},{11,11,766},{11,11,845}, +{13,10,218},{13,11,114},{13,11,292},{14,10,153},{142,11,47},{7,11,759},{140,0, +693},{5,0,314},{6,0,221},{7,0,419},{10,0,650},{11,0,396},{12,0,156},{13,0,369},{ +14,0,333},{145,0,47},{6,11,1684},{6,11,1731},{7,11,356},{7,11,1932},{8,11,54},{8 +,11,221},{9,11,225},{9,11,356},{10,11,77},{10,11,446},{10,11,731},{12,11,404},{ +141,11,491},{132,11,375},{4,10,518},{135,10,1136},{4,0,913},{4,11,411},{11,11, +643},{140,11,115},{4,11,80},{133,11,44},{8,10,689},{137,10,863},{138,0,880},{4, +10,18},{7,10,145},{7,10,444},{7,10,1278},{8,10,49},{8,10,400},{9,10,71},{9,10, +250},{10,10,459},{12,10,160},{144,10,24},{136,0,475},{5,0,1016},{5,11,299},{135, +11,1083},{7,0,602},{8,0,179},{10,0,781},{140,0,126},{6,0,329},{138,0,111},{135,0 +,1864},{4,11,219},{7,11,1761},{137,11,86},{6,0,1888},{6,0,1892},{6,0,1901},{6,0, +1904},{9,0,953},{9,0,985},{9,0,991},{9,0,1001},{12,0,818},{12,0,846},{12,0,847}, +{12,0,861},{12,0,862},{12,0,873},{12,0,875},{12,0,877},{12,0,879},{12,0,881},{12 +,0,884},{12,0,903},{12,0,915},{12,0,926},{12,0,939},{15,0,182},{15,0,219},{15,0, +255},{18,0,191},{18,0,209},{18,0,211},{149,0,41},{5,11,328},{135,11,918},{137,0, +780},{12,0,82},{143,0,36},{133,10,1010},{5,0,821},{134,0,1687},{133,11,514},{132 +,0,956},{134,0,1180},{5,10,87},{7,10,313},{7,10,1103},{10,0,112},{10,10,582},{11 +,10,389},{11,10,813},{12,10,385},{13,10,286},{14,10,124},{146,10,108},{5,0,71},{ +7,0,1407},{9,0,704},{10,0,261},{10,0,619},{11,0,547},{11,0,619},{143,0,157},{4,0 +,531},{5,0,455},{5,11,301},{6,11,571},{14,11,49},{146,11,102},{132,10,267},{6,0, +385},{7,0,2008},{9,0,337},{138,0,517},{133,11,726},{133,11,364},{4,11,76},{7,11, +1550},{9,11,306},{9,11,430},{9,11,663},{10,11,683},{11,11,427},{11,11,753},{12, +11,334},{12,11,442},{14,11,258},{14,11,366},{143,11,131},{6,0,1865},{6,0,1879},{ +6,0,1881},{6,0,1894},{6,0,1908},{9,0,915},{9,0,926},{9,0,940},{9,0,943},{9,0,966 +},{9,0,980},{9,0,989},{9,0,1005},{9,0,1010},{12,0,813},{12,0,817},{12,0,840},{12 +,0,843},{12,0,855},{12,0,864},{12,0,871},{12,0,872},{12,0,899},{12,0,905},{12,0, +924},{15,0,171},{15,0,181},{15,0,224},{15,0,235},{15,0,251},{146,0,184},{137,11, +52},{5,0,16},{6,0,86},{6,0,603},{7,0,292},{7,0,561},{8,0,257},{8,0,382},{9,0,721 +},{9,0,778},{11,0,581},{140,0,466},{4,0,486},{5,0,491},{135,10,1121},{4,0,72},{6 +,0,265},{135,0,1300},{135,11,1183},{10,10,249},{139,10,209},{132,10,561},{137,11 +,519},{4,10,760},{4,11,656},{135,11,779},{9,10,154},{140,10,485},{135,11,1793},{ +135,11,144},{136,10,255},{133,0,621},{4,10,368},{135,10,641},{135,11,1373},{7,11 +,554},{7,11,605},{141,11,10},{137,0,234},{5,0,815},{6,0,1688},{134,0,1755},{5,11 +,838},{5,11,841},{134,11,1649},{7,0,1987},{7,0,2040},{136,0,743},{133,11,1012},{ +6,0,197},{136,0,205},{6,0,314},{134,11,314},{144,11,53},{6,11,251},{7,11,365},{7 +,11,1357},{7,11,1497},{8,11,154},{141,11,281},{133,11,340},{6,0,452},{7,0,312},{ +138,0,219},{138,0,589},{4,0,333},{9,0,176},{12,0,353},{141,0,187},{9,10,92},{147 +,10,91},{134,0,1110},{11,0,47},{139,11,495},{6,10,525},{8,10,806},{9,10,876},{ +140,10,284},{8,11,261},{9,11,144},{9,11,466},{10,11,370},{12,11,470},{13,11,144} +,{142,11,348},{137,11,897},{6,11,248},{8,0,863},{8,0,864},{8,0,868},{8,0,884},{9 +,11,546},{10,0,866},{10,0,868},{10,0,873},{10,0,911},{10,0,912},{10,0,944},{10, +11,535},{11,11,681},{12,0,727},{141,11,135},{6,0,300},{135,0,1515},{134,0,1237}, +{139,10,958},{133,10,594},{140,11,250},{134,0,1685},{134,11,567},{7,0,135},{8,0, +7},{8,0,62},{9,0,243},{10,0,658},{10,0,697},{11,0,456},{139,0,756},{9,0,395},{ +138,0,79},{6,10,1641},{136,10,820},{4,10,302},{135,10,1766},{134,11,174},{135,10 +,1313},{135,0,631},{134,10,1674},{134,11,395},{138,0,835},{7,0,406},{7,0,459},{8 +,0,606},{139,0,726},{134,11,617},{134,0,979},{6,10,389},{7,10,149},{9,10,142},{ +138,10,94},{5,11,878},{133,11,972},{6,10,8},{7,10,1881},{8,10,91},{136,11,511},{ +133,0,612},{132,11,351},{4,0,372},{7,0,482},{8,0,158},{9,0,602},{9,0,615},{10,0, +245},{10,0,678},{10,0,744},{11,0,248},{139,0,806},{5,0,854},{135,0,1991},{132,11 +,286},{135,11,344},{7,11,438},{7,11,627},{7,11,1516},{8,11,40},{9,11,56},{9,11, +294},{10,11,30},{10,11,259},{11,11,969},{146,11,148},{135,0,1492},{5,11,259},{7, +11,414},{7,11,854},{142,11,107},{135,10,1746},{6,0,833},{134,0,998},{135,10,24}, +{6,0,750},{135,0,1739},{4,10,503},{135,10,1661},{5,10,130},{7,10,1314},{9,10,610 +},{10,10,718},{11,10,601},{11,10,819},{11,10,946},{140,10,536},{10,10,149},{11, +10,280},{142,10,336},{132,11,738},{135,10,1946},{5,0,195},{135,0,1685},{7,0,1997 +},{8,0,730},{139,0,1006},{151,11,17},{133,11,866},{14,0,463},{14,0,470},{150,0, +61},{4,10,392},{5,0,751},{7,10,1597},{8,0,266},{139,0,578},{5,10,433},{9,10,633} +,{139,10,629},{135,0,821},{6,0,715},{134,0,1325},{133,11,116},{4,11,457},{134,0, +868},{134,0,959},{6,10,234},{138,11,199},{7,0,1053},{7,10,1950},{8,10,680},{11, +10,817},{147,10,88},{7,10,1222},{138,10,386},{5,0,950},{5,0,994},{6,0,351},{134, +0,1124},{134,0,1081},{6,10,5},{7,0,1595},{11,10,249},{12,10,313},{16,10,66},{145 +,10,26},{148,0,59},{5,11,527},{6,11,189},{135,11,859},{5,10,963},{6,10,1773},{11 +,11,104},{11,11,554},{15,11,60},{143,11,125},{135,0,47},{137,0,684},{134,11,116} +,{134,0,1606},{134,0,777},{7,0,1020},{8,10,509},{136,10,792},{135,0,1094},{132,0 +,350},{133,11,487},{4,11,86},{5,11,667},{5,11,753},{6,11,316},{6,11,455},{135,11 +,946},{7,0,1812},{13,0,259},{13,0,356},{14,0,242},{147,0,114},{132,10,931},{133, +0,967},{4,0,473},{7,0,623},{8,0,808},{9,0,871},{9,0,893},{11,0,38},{11,0,431},{ +12,0,112},{12,0,217},{12,0,243},{12,0,562},{12,0,663},{12,0,683},{13,0,141},{13, +0,197},{13,0,227},{13,0,406},{13,0,487},{14,0,156},{14,0,203},{14,0,224},{14,0, +256},{18,0,58},{150,0,0},{138,0,286},{7,10,943},{139,10,614},{135,10,1837},{150, +11,45},{132,0,798},{4,0,222},{7,0,286},{136,0,629},{4,11,79},{7,11,1773},{10,11, +450},{11,11,589},{13,11,332},{13,11,493},{14,11,183},{14,11,334},{14,11,362},{14 +,11,368},{14,11,376},{14,11,379},{19,11,90},{19,11,103},{19,11,127},{148,11,90}, +{4,10,90},{5,0,337},{5,10,545},{7,10,754},{9,10,186},{10,10,72},{10,10,782},{11, +0,513},{11,0,889},{11,0,961},{11,10,577},{11,10,610},{12,0,461},{12,10,354},{12, +10,362},{12,10,595},{13,0,79},{143,0,121},{141,0,306},{136,0,146},{7,0,1646},{9, +10,329},{11,10,254},{141,11,124},{4,0,465},{135,0,1663},{132,0,525},{133,11,663} +,{9,10,187},{10,0,299},{11,10,1016},{17,10,44},{146,0,74},{4,10,506},{7,0,165},{ +7,0,919},{136,10,517},{5,10,295},{135,10,1680},{133,11,846},{134,0,1064},{5,11, +378},{7,11,1402},{7,11,1414},{8,11,465},{9,11,286},{10,11,185},{10,11,562},{10, +11,635},{11,11,31},{11,11,393},{12,11,456},{13,11,312},{18,11,65},{18,11,96},{ +147,11,89},{132,0,596},{7,10,987},{9,10,688},{10,10,522},{11,10,788},{140,10,566 +},{4,11,648},{6,0,82},{6,10,1775},{7,0,138},{7,0,517},{7,0,1741},{139,0,238},{7, +0,1233},{7,10,700},{7,10,940},{8,10,514},{9,10,116},{9,10,535},{10,10,118},{11, +10,107},{11,10,148},{11,10,922},{12,10,254},{12,10,421},{142,10,238},{4,0,962},{ +6,0,1824},{8,0,894},{12,0,708},{12,0,725},{14,0,451},{20,0,94},{22,0,59},{150,0, +62},{5,11,945},{6,11,1656},{6,11,1787},{7,11,167},{8,11,824},{9,11,391},{10,11, +375},{139,11,185},{5,0,495},{7,0,834},{9,0,733},{139,0,378},{4,10,743},{135,11, +1273},{6,0,1204},{7,11,1645},{8,11,352},{137,11,249},{139,10,292},{133,0,559},{ +132,11,152},{7,10,1283},{9,0,499},{9,10,227},{10,0,341},{11,10,325},{11,10,408}, +{14,10,180},{15,0,144},{18,10,47},{147,0,49},{6,0,21},{6,0,1737},{7,0,1444},{136 +,0,224},{133,11,1006},{5,10,81},{7,0,1446},{7,10,146},{7,10,1342},{8,10,53},{8, +10,561},{8,10,694},{8,10,754},{9,0,97},{9,10,115},{9,10,894},{10,10,462},{10,10, +813},{11,10,230},{11,10,657},{11,10,699},{11,10,748},{12,10,119},{12,10,200},{12 +,10,283},{14,10,273},{145,0,15},{5,10,408},{137,10,747},{135,11,431},{135,11,832 +},{6,0,729},{134,0,953},{4,0,727},{5,11,351},{7,11,264},{8,0,565},{136,11,565},{ +134,0,1948},{5,0,519},{5,11,40},{7,11,598},{7,11,1638},{8,11,78},{9,11,166},{9, +11,640},{9,11,685},{9,11,773},{11,11,215},{13,11,65},{14,11,172},{14,11,317},{ +145,11,6},{8,11,60},{9,11,343},{139,11,769},{137,11,455},{134,0,1193},{140,0,790 +},{7,11,1951},{8,11,765},{8,11,772},{140,11,671},{7,11,108},{8,11,219},{8,11,388 +},{9,11,639},{9,11,775},{11,11,275},{140,11,464},{132,11,468},{7,10,30},{8,10,86 +},{8,10,315},{8,10,700},{9,10,576},{9,10,858},{11,10,310},{11,10,888},{11,10,904 +},{12,10,361},{141,10,248},{5,11,15},{6,11,56},{7,11,1758},{8,11,500},{9,11,730} +,{11,11,331},{13,11,150},{142,11,282},{4,0,402},{7,0,2},{8,0,323},{136,0,479},{ +138,10,839},{11,0,580},{142,0,201},{5,0,59},{135,0,672},{137,10,617},{146,0,34}, +{134,11,1886},{4,0,961},{136,0,896},{5,11,205},{6,0,1285},{6,11,438},{137,11,711 +},{134,10,428},{7,10,524},{8,10,169},{8,10,234},{9,10,480},{138,10,646},{148,0, +46},{141,0,479},{133,11,534},{6,0,2019},{134,10,1648},{4,0,85},{7,0,549},{7,10, +1205},{138,10,637},{4,0,663},{5,0,94},{7,11,235},{7,11,1475},{15,11,68},{146,11, +120},{6,11,443},{9,11,237},{9,11,571},{9,11,695},{10,11,139},{11,11,715},{12,11, +417},{141,11,421},{132,0,783},{4,0,682},{8,0,65},{9,10,39},{10,10,166},{11,10, +918},{12,10,635},{20,10,10},{22,10,27},{22,10,43},{150,10,52},{6,0,11},{135,0, +187},{132,0,522},{4,0,52},{135,0,661},{4,0,383},{133,0,520},{135,11,546},{11,0, +343},{142,0,127},{4,11,578},{7,10,157},{7,11,624},{7,11,916},{8,10,279},{10,11, +256},{11,11,87},{139,11,703},{134,10,604},{4,0,281},{5,0,38},{7,0,194},{7,0,668} +,{7,0,1893},{137,0,397},{7,10,945},{11,10,713},{139,10,744},{139,10,1022},{9,0, +635},{139,0,559},{5,11,923},{7,11,490},{12,11,553},{13,11,100},{14,11,118},{143, +11,75},{132,0,975},{132,10,567},{137,10,859},{7,10,1846},{7,11,1846},{8,10,628}, +{136,11,628},{148,0,116},{138,11,750},{14,0,51},{14,11,51},{15,11,7},{148,11,20} +,{132,0,858},{134,0,1075},{4,11,924},{133,10,762},{136,0,535},{133,0,448},{10,10 +,784},{141,10,191},{133,10,298},{7,0,610},{135,0,1501},{7,10,633},{7,10,905},{7, +10,909},{7,10,1538},{9,10,767},{140,10,636},{4,11,265},{7,11,807},{135,11,950},{ +5,11,93},{12,11,267},{144,11,26},{136,0,191},{139,10,301},{135,10,1970},{135,0, +267},{4,0,319},{5,0,699},{138,0,673},{6,0,336},{7,0,92},{7,0,182},{8,0,453},{8,0 +,552},{9,0,204},{9,0,285},{10,0,99},{11,0,568},{11,0,950},{12,0,94},{12,10,644}, +{16,0,20},{16,0,70},{16,10,90},{147,0,55},{6,0,551},{7,0,1308},{7,10,845},{7,11, +994},{8,10,160},{137,10,318},{19,11,1},{19,11,26},{150,11,9},{7,0,1406},{9,0,218 +},{141,0,222},{5,0,256},{138,0,69},{5,11,233},{5,11,320},{6,11,140},{7,11,330},{ +136,11,295},{6,0,1980},{136,0,952},{4,0,833},{137,11,678},{133,11,978},{4,11,905 +},{6,11,1701},{137,11,843},{138,10,735},{136,10,76},{17,0,39},{148,0,36},{18,0, +81},{146,11,81},{14,0,352},{17,0,53},{18,0,146},{18,0,152},{19,0,11},{150,0,54}, +{135,0,634},{138,10,841},{132,0,618},{4,0,339},{4,11,275},{7,0,259},{12,11,376}, +{145,0,73},{132,11,509},{7,11,273},{139,11,377},{4,0,759},{9,10,804},{141,0,169} +,{6,10,96},{135,10,1426},{4,10,651},{133,10,289},{7,0,1075},{8,10,35},{9,10,511} +,{10,10,767},{147,10,118},{6,0,649},{6,0,670},{136,0,482},{5,0,336},{6,0,341},{6 +,0,478},{6,0,1763},{136,0,386},{5,11,802},{7,11,2021},{8,11,805},{14,11,94},{15, +11,65},{16,11,4},{16,11,77},{16,11,80},{145,11,5},{5,11,167},{5,11,899},{6,0, +1035},{6,11,410},{137,11,777},{134,11,1705},{5,0,924},{133,0,969},{132,10,704},{ +135,0,73},{135,11,10},{135,10,1078},{5,11,11},{6,11,117},{6,11,485},{7,11,1133}, +{9,11,582},{9,11,594},{11,11,21},{11,11,818},{12,11,535},{141,11,86},{135,0,1971 +},{4,11,264},{7,11,1067},{8,11,204},{8,11,385},{139,11,953},{6,0,1458},{135,0, +1344},{5,0,396},{134,0,501},{4,10,720},{133,10,306},{4,0,929},{5,0,799},{5,10, +431},{8,0,46},{136,0,740},{7,11,646},{7,11,1730},{11,11,446},{141,11,178},{5,10, +464},{6,10,236},{7,0,276},{7,10,696},{7,10,914},{7,10,1108},{7,10,1448},{9,10,15 +},{9,10,564},{10,10,14},{12,10,565},{13,10,449},{14,10,53},{15,10,13},{16,10,64} +,{145,10,41},{4,0,892},{133,0,770},{6,10,1767},{12,10,194},{145,10,107},{135,0, +158},{5,10,840},{138,11,608},{134,0,1432},{138,11,250},{8,11,794},{9,11,400},{10 +,11,298},{142,11,228},{151,0,25},{7,11,1131},{135,11,1468},{135,0,2001},{9,10, +642},{11,10,236},{142,10,193},{4,10,68},{5,10,634},{6,10,386},{7,10,794},{8,10, +273},{9,10,563},{10,10,105},{10,10,171},{11,10,94},{139,10,354},{136,11,724},{ +132,0,478},{11,11,512},{13,11,205},{19,11,30},{22,11,36},{151,11,19},{7,0,1461}, +{140,0,91},{6,11,190},{7,11,768},{135,11,1170},{4,0,602},{4,10,95},{7,10,416},{8 +,0,211},{139,10,830},{7,10,731},{13,10,20},{143,10,11},{6,0,1068},{135,0,1872},{ +4,0,13},{5,0,567},{7,0,1498},{7,11,1023},{9,0,124},{11,0,521},{140,0,405},{135,0 +,1006},{132,0,735},{138,0,812},{4,0,170},{135,0,323},{6,11,137},{9,11,75},{9,11, +253},{10,11,194},{138,11,444},{5,0,304},{5,10,864},{7,0,1403},{10,10,648},{11,10 +,671},{143,10,46},{135,11,1180},{133,10,928},{4,0,148},{133,0,742},{11,10,986},{ +140,10,682},{133,0,523},{135,11,1743},{7,0,730},{8,10,44},{9,10,884},{10,10,580} +,{11,10,399},{11,10,894},{15,10,122},{18,0,144},{147,0,61},{5,11,760},{7,11,542} +,{8,11,135},{136,11,496},{136,0,981},{133,0,111},{10,0,132},{11,0,191},{11,0,358 +},{139,0,460},{7,11,319},{7,11,355},{7,11,763},{10,11,389},{145,11,43},{134,0, +890},{134,0,1420},{136,11,557},{133,10,518},{133,0,444},{135,0,1787},{135,10, +1852},{8,0,123},{15,0,6},{144,0,7},{6,0,2041},{10,11,38},{139,11,784},{136,0,932 +},{5,0,937},{135,0,100},{4,11,58},{5,11,286},{6,0,995},{6,11,319},{7,11,402},{7, +11,1254},{7,11,1903},{8,11,356},{140,11,408},{4,11,389},{9,11,181},{9,11,255},{ +10,11,8},{10,11,29},{10,11,816},{11,11,311},{11,11,561},{12,11,67},{141,11,181}, +{138,0,255},{4,10,934},{5,0,138},{136,10,610},{4,0,965},{10,0,863},{138,0,898},{ +10,10,804},{138,10,832},{8,10,96},{9,10,36},{10,10,607},{11,10,423},{11,10,442}, +{12,0,631},{12,10,309},{14,10,199},{15,10,90},{145,10,110},{134,0,1394},{4,0,652 +},{8,0,320},{9,10,13},{9,10,398},{9,10,727},{10,10,75},{10,10,184},{10,10,230},{ +10,10,564},{10,10,569},{11,10,973},{12,10,70},{12,10,189},{13,10,57},{13,10,257} +,{22,0,6},{150,0,16},{6,0,897},{134,0,1333},{4,0,692},{133,0,321},{133,11,373},{ +135,0,922},{5,0,619},{133,0,698},{137,10,631},{5,10,345},{135,10,1016},{9,0,957} +,{9,0,1018},{12,0,828},{12,0,844},{12,0,897},{12,0,901},{12,0,943},{15,0,180},{ +18,0,197},{18,0,200},{18,0,213},{18,0,214},{146,0,226},{5,0,917},{134,0,1659},{ +135,0,1100},{134,0,1173},{134,0,1930},{5,0,251},{5,0,956},{8,0,268},{9,0,214},{ +146,0,142},{133,10,673},{137,10,850},{4,10,287},{133,10,1018},{132,11,672},{5,0, +346},{5,0,711},{8,0,390},{11,11,752},{139,11,885},{5,10,34},{10,10,724},{12,10, +444},{13,10,354},{18,10,32},{23,10,24},{23,10,31},{152,10,5},{4,11,710},{134,11, +606},{134,0,744},{134,10,382},{133,11,145},{4,10,329},{7,11,884},{140,11,124},{4 +,11,467},{5,11,405},{134,11,544},{9,10,846},{138,10,827},{133,0,624},{9,11,372}, +{15,11,2},{19,11,10},{147,11,18},{4,11,387},{135,11,1288},{5,0,783},{7,0,1998},{ +135,0,2047},{132,10,906},{136,10,366},{135,11,550},{4,10,123},{4,10,649},{5,10, +605},{7,10,1509},{136,10,36},{134,0,1125},{132,0,594},{133,10,767},{135,11,1227} +,{136,11,467},{4,11,576},{135,11,1263},{4,0,268},{7,0,1534},{135,11,1534},{4,10, +273},{5,10,658},{5,10,995},{5,11,919},{134,11,1673},{133,0,563},{134,10,72},{135 +,10,1345},{4,11,82},{5,11,333},{5,11,904},{6,11,207},{7,11,325},{7,11,1726},{8, +11,101},{10,11,778},{139,11,220},{5,0,37},{5,10,589},{6,0,39},{6,0,451},{7,0,218 +},{7,0,667},{7,0,1166},{7,0,1687},{8,0,662},{144,0,2},{134,0,1332},{133,11,903}, +{134,0,508},{5,10,117},{6,10,514},{6,10,541},{7,10,1164},{7,10,1436},{8,10,220}, +{8,10,648},{10,10,688},{11,10,560},{140,11,147},{6,11,555},{135,11,485},{133,10, +686},{7,0,453},{7,0,635},{7,0,796},{8,0,331},{9,0,330},{9,0,865},{10,0,119},{10, +0,235},{11,0,111},{11,0,129},{11,0,240},{12,0,31},{12,0,66},{12,0,222},{12,0,269 +},{12,0,599},{12,0,684},{12,0,689},{12,0,691},{142,0,345},{135,0,1834},{4,11,705 +},{7,11,615},{138,11,251},{136,11,345},{137,0,527},{6,0,98},{7,0,702},{135,0,991 +},{7,10,196},{10,10,765},{11,0,576},{11,10,347},{11,10,552},{11,10,790},{12,10, +263},{13,10,246},{13,10,270},{13,10,395},{14,0,74},{14,10,176},{14,10,190},{14, +10,398},{14,10,412},{15,10,32},{15,10,63},{16,10,88},{147,10,105},{134,11,90},{ +13,0,84},{141,0,122},{6,0,37},{7,0,299},{7,0,1666},{8,0,195},{8,0,316},{9,0,178} +,{9,0,276},{9,0,339},{9,0,536},{10,0,102},{10,0,362},{10,0,785},{11,0,55},{11,0, +149},{11,0,773},{13,0,416},{13,0,419},{14,0,38},{14,0,41},{142,0,210},{5,10,381} +,{135,10,1792},{7,11,813},{12,11,497},{141,11,56},{7,10,616},{138,10,413},{133,0 +,645},{6,11,125},{135,11,1277},{132,0,290},{6,0,70},{7,0,1292},{10,0,762},{139,0 +,288},{6,10,120},{7,10,1188},{7,10,1710},{8,10,286},{9,10,667},{11,10,592},{139, +10,730},{135,11,1784},{7,0,1315},{135,11,1315},{134,0,1955},{135,10,1146},{7,0, +131},{7,0,422},{8,0,210},{140,0,573},{4,10,352},{135,10,687},{139,0,797},{143,0, +38},{14,0,179},{15,0,151},{150,0,11},{4,10,192},{5,10,49},{6,10,200},{6,10,293}, +{6,10,1696},{135,0,488},{132,0,936},{135,11,703},{6,11,160},{7,11,1106},{9,11, +770},{10,11,618},{11,11,112},{140,11,413},{5,0,453},{134,0,441},{135,0,595},{132 +,10,650},{132,10,147},{6,0,991},{6,0,1182},{12,11,271},{145,11,109},{133,10,934} +,{140,11,221},{132,0,653},{7,0,505},{135,0,523},{134,0,903},{135,11,479},{7,11, +304},{9,11,646},{9,11,862},{10,11,262},{11,11,696},{12,11,208},{15,11,79},{147, +11,108},{146,0,80},{135,11,981},{142,0,432},{132,0,314},{137,11,152},{7,0,1368}, +{8,0,232},{8,0,361},{10,0,682},{138,0,742},{135,11,1586},{4,11,434},{9,0,534},{ +11,11,663},{12,11,210},{13,11,166},{13,11,310},{14,11,373},{147,11,43},{7,11, +1091},{135,11,1765},{6,11,550},{135,11,652},{137,0,27},{142,0,12},{4,10,637},{5, +11,553},{7,11,766},{138,11,824},{7,11,737},{8,11,298},{136,11,452},{7,0,736},{ +139,0,264},{134,0,1657},{133,11,292},{138,11,135},{6,0,844},{134,0,1117},{135,0, +127},{9,10,867},{138,10,837},{6,0,1184},{134,0,1208},{134,0,1294},{136,0,364},{6 +,0,1415},{6,10,170},{7,0,1334},{7,11,393},{8,10,395},{8,10,487},{10,11,603},{11, +0,125},{11,11,206},{141,10,147},{137,11,748},{4,11,912},{137,11,232},{4,10,535}, +{136,10,618},{137,0,792},{7,11,1973},{136,11,716},{135,11,98},{5,0,909},{9,0,849 +},{138,0,805},{4,0,630},{132,0,699},{5,11,733},{14,11,103},{150,10,23},{12,11, +158},{18,11,8},{19,11,62},{20,11,6},{22,11,4},{23,11,2},{151,11,9},{132,0,968},{ +132,10,778},{132,10,46},{5,10,811},{6,10,1679},{6,10,1714},{135,10,2032},{6,0, +1446},{7,10,1458},{9,10,407},{139,10,15},{6,10,34},{7,0,206},{7,0,397},{7,0,621} +,{7,0,640},{7,10,1089},{8,0,124},{8,0,619},{8,10,708},{8,10,721},{9,0,305},{9,0, +643},{9,10,363},{10,0,264},{10,0,628},{11,0,40},{12,0,349},{13,0,134},{13,0,295} +,{14,0,155},{15,0,120},{18,0,105},{148,10,98},{4,0,262},{5,0,641},{135,0,342},{ +137,11,72},{4,0,99},{6,0,250},{6,0,346},{8,0,127},{138,0,81},{132,0,915},{5,0,75 +},{9,0,517},{10,0,470},{12,0,155},{141,0,224},{132,10,462},{11,11,600},{11,11, +670},{141,11,245},{142,0,83},{5,10,73},{6,10,23},{134,10,338},{6,0,1031},{139,11 +,923},{7,11,164},{7,11,1571},{9,11,107},{140,11,225},{134,0,1470},{133,0,954},{6 +,0,304},{8,0,418},{10,0,345},{11,0,341},{139,0,675},{9,0,410},{139,0,425},{4,11, +27},{5,11,484},{5,11,510},{6,11,434},{7,11,1000},{7,11,1098},{8,11,2},{136,11, +200},{134,0,734},{140,11,257},{7,10,725},{8,10,498},{139,10,268},{134,0,1822},{ +135,0,1798},{135,10,773},{132,11,460},{4,11,932},{133,11,891},{134,0,14},{132,10 +,583},{7,10,1462},{8,11,625},{139,10,659},{5,0,113},{5,10,220},{6,0,243},{6,0, +1708},{7,0,1865},{11,0,161},{16,0,37},{145,0,99},{134,11,76},{5,11,461},{135,11, +1925},{140,0,69},{8,11,92},{137,11,221},{139,10,803},{132,10,544},{4,0,274},{134 +,0,922},{132,0,541},{5,0,627},{6,10,437},{6,10,564},{11,10,181},{141,10,183},{ +135,10,1192},{4,11,763},{135,0,166},{133,11,253},{134,0,849},{9,11,73},{10,11, +110},{14,11,185},{145,11,119},{5,11,212},{12,11,35},{141,11,382},{133,0,717},{ +137,0,304},{136,0,600},{133,0,654},{6,0,273},{10,0,188},{13,0,377},{146,0,77},{4 +,10,790},{5,10,273},{134,10,394},{132,0,543},{135,0,410},{11,0,98},{11,0,524},{ +141,0,87},{132,0,941},{135,11,1175},{4,0,250},{6,10,127},{7,0,1612},{7,10,1511}, +{8,10,613},{11,0,186},{12,0,133},{12,10,495},{12,10,586},{12,10,660},{12,10,668} +,{14,10,385},{15,10,118},{17,10,20},{146,10,98},{5,11,816},{134,0,1785},{134,0, +1339},{6,10,230},{7,0,961},{7,0,1085},{7,0,1727},{7,11,1727},{136,0,462},{7,10, +1954},{137,0,636},{132,0,780},{5,11,869},{5,11,968},{6,11,1626},{8,11,734},{136, +11,784},{4,11,542},{6,11,1716},{6,11,1727},{7,11,1082},{7,11,1545},{8,11,56},{8, +11,118},{8,11,412},{8,11,564},{9,11,888},{9,11,908},{10,11,50},{10,11,423},{11, +11,685},{11,11,697},{11,11,933},{12,11,299},{13,11,126},{13,11,136},{13,11,170}, +{141,11,190},{134,11,226},{4,11,232},{9,11,202},{10,11,474},{140,11,433},{137,11 +,500},{5,0,529},{136,10,68},{132,10,654},{4,10,156},{7,10,998},{7,10,1045},{7,10 +,1860},{9,10,48},{9,10,692},{11,10,419},{139,10,602},{6,11,108},{7,0,1276},{7,11 +,1003},{7,11,1181},{8,0,474},{8,11,343},{137,0,652},{7,11,1264},{7,11,1678},{11, +11,945},{12,11,341},{12,11,471},{140,11,569},{134,11,1712},{5,0,948},{12,0,468}, +{19,0,96},{148,0,24},{4,11,133},{7,11,711},{7,11,1298},{7,11,1585},{135,11,1929} +,{6,0,753},{140,0,657},{139,0,941},{6,11,99},{7,11,1808},{145,11,57},{6,11,574}, +{7,11,428},{7,11,1250},{10,11,669},{11,11,485},{11,11,840},{12,11,300},{142,11, +250},{4,0,532},{5,0,706},{135,0,662},{5,0,837},{6,0,1651},{139,0,985},{7,0,1861} +,{9,10,197},{10,10,300},{12,10,473},{13,10,90},{141,10,405},{137,11,252},{6,11, +323},{135,11,1564},{4,0,330},{4,0,863},{7,0,933},{7,0,2012},{7,11,461},{8,0,292} +,{8,11,775},{138,11,435},{132,10,606},{4,11,655},{7,11,850},{17,11,75},{146,11, +137},{135,0,767},{7,10,1978},{136,10,676},{132,0,641},{135,11,1559},{134,0,1233} +,{137,0,242},{4,10,361},{5,10,315},{145,0,114},{137,0,883},{132,10,461},{138,0, +274},{134,0,2008},{134,0,1794},{4,0,703},{135,0,207},{4,10,472},{140,0,285},{132 +,0,571},{5,0,873},{5,0,960},{8,0,823},{8,11,577},{137,0,881},{7,0,617},{10,0,498 +},{11,0,501},{12,0,16},{140,0,150},{138,10,747},{132,0,431},{133,10,155},{7,10, +163},{8,10,319},{9,10,402},{10,10,24},{10,10,681},{11,0,283},{11,0,567},{11,10, +200},{12,10,253},{12,10,410},{142,10,219},{4,11,413},{5,11,677},{8,11,432},{140, +11,280},{5,10,475},{7,10,1780},{9,0,401},{11,10,297},{11,10,558},{14,10,322},{ +147,10,76},{6,0,781},{9,0,134},{10,0,2},{10,0,27},{10,0,333},{11,0,722},{143,0,1 +},{5,0,33},{6,0,470},{139,0,424},{135,0,2006},{7,10,1956},{140,0,783},{136,0,274 +},{135,0,1882},{132,0,794},{135,0,1848},{5,10,944},{134,10,1769},{6,0,47},{7,0, +90},{7,0,664},{7,0,830},{7,0,1380},{7,0,2025},{8,0,448},{136,0,828},{132,10,144} +,{134,0,1199},{4,11,395},{139,11,762},{135,11,1504},{9,0,417},{137,0,493},{9,11, +174},{10,11,164},{11,11,440},{11,11,841},{143,11,98},{134,11,426},{139,11,1002}, +{134,0,295},{134,0,816},{6,10,247},{137,10,555},{133,0,1019},{4,0,620},{5,11,476 +},{10,10,280},{138,10,797},{139,0,464},{5,11,76},{6,11,458},{6,11,497},{7,11,764 +},{7,11,868},{9,11,658},{10,11,594},{11,11,173},{11,11,566},{12,11,20},{12,11, +338},{141,11,200},{134,0,208},{4,11,526},{7,11,1029},{135,11,1054},{132,11,636}, +{6,11,233},{7,11,660},{7,11,1124},{17,11,31},{19,11,22},{151,11,14},{5,10,428},{ +138,0,442},{10,0,930},{140,0,778},{6,0,68},{7,0,448},{7,0,1629},{7,0,1769},{7,0, +1813},{7,10,1717},{8,0,442},{8,0,516},{9,0,710},{10,0,282},{10,0,722},{138,10, +546},{134,0,1128},{11,0,844},{12,0,104},{140,0,625},{4,11,432},{135,11,824},{138 +,10,189},{133,0,787},{133,10,99},{4,11,279},{7,11,301},{137,11,362},{4,10,397},{ +8,0,491},{136,10,555},{4,11,178},{133,11,399},{134,0,711},{144,0,9},{4,0,403},{5 +,0,441},{7,0,450},{10,0,840},{11,0,101},{12,0,193},{141,0,430},{135,11,1246},{12 +,10,398},{20,10,39},{21,10,11},{150,10,41},{4,10,485},{7,10,353},{135,10,1523},{ +6,10,366},{7,10,1384},{7,10,1601},{135,11,1912},{7,0,396},{7,11,396},{138,0,160} +,{137,10,282},{134,11,1692},{4,10,157},{5,10,471},{6,11,202},{10,11,448},{11,11, +208},{12,11,360},{17,11,117},{17,11,118},{18,11,27},{148,11,67},{133,0,679},{137 +,0,326},{136,10,116},{7,11,872},{10,11,516},{139,11,167},{132,11,224},{5,11,546} +,{7,11,35},{8,11,11},{8,11,12},{9,11,315},{9,11,533},{10,11,802},{11,11,166},{12 +,11,525},{142,11,243},{7,0,1128},{135,11,1920},{5,11,241},{8,11,242},{9,11,451}, +{10,11,667},{11,11,598},{140,11,429},{5,10,160},{6,0,737},{7,10,363},{7,10,589}, +{10,10,170},{141,10,55},{135,0,1796},{142,11,254},{4,0,574},{7,0,350},{7,0,1024} +,{8,0,338},{9,0,677},{138,0,808},{134,0,1096},{137,11,516},{4,10,108},{4,11,366} +,{7,0,405},{10,0,491},{139,10,498},{11,11,337},{142,11,303},{134,11,1736},{7,0, +1081},{140,11,364},{7,10,1005},{140,10,609},{4,10,895},{5,10,772},{135,0,1676},{ +135,0,2037},{6,0,1207},{11,11,916},{142,11,419},{14,11,140},{148,11,41},{6,11, +331},{136,11,623},{4,10,926},{5,10,983},{9,0,944},{9,0,969},{9,0,1022},{12,0,913 +},{12,0,936},{15,0,177},{143,0,193},{5,0,354},{135,11,506},{8,0,598},{9,0,664},{ +138,0,441},{4,11,640},{133,11,513},{137,0,297},{132,10,538},{6,10,294},{7,10, +1267},{136,10,624},{7,0,1772},{7,11,1888},{8,11,289},{11,11,45},{12,11,278},{140 +,11,537},{135,10,1325},{138,0,751},{141,0,37},{134,0,1828},{132,10,757},{132,11, +394},{6,0,257},{135,0,1522},{4,0,582},{7,11,1931},{137,0,191},{7,11,574},{7,11, +1719},{137,11,145},{132,11,658},{4,11,369},{138,0,790},{9,11,781},{10,11,144},{ +11,11,385},{13,11,161},{13,11,228},{13,11,268},{148,11,107},{8,0,469},{8,11,374} +,{138,0,47},{6,0,306},{7,0,1140},{7,0,1340},{8,0,133},{138,0,449},{139,0,1011},{ +7,10,1875},{139,10,124},{4,11,344},{6,11,498},{139,11,323},{137,0,299},{132,0, +837},{133,11,906},{5,0,329},{8,0,260},{138,0,10},{134,0,1320},{4,0,657},{146,0, +158},{135,0,1191},{152,0,7},{6,0,1939},{8,0,974},{138,0,996},{135,0,1665},{11,11 +,126},{139,11,287},{143,0,8},{14,11,149},{14,11,399},{143,11,57},{5,0,66},{7,0, +1896},{136,0,288},{5,10,150},{7,0,175},{8,10,603},{9,10,593},{9,10,634},{10,0, +494},{10,10,173},{11,10,462},{11,10,515},{13,10,216},{13,10,288},{142,10,400},{ +134,0,1643},{136,11,21},{4,0,21},{5,0,91},{5,0,648},{5,0,750},{5,0,781},{6,0,54} +,{6,0,112},{6,0,402},{6,0,1732},{7,0,315},{7,0,749},{7,0,1427},{7,0,1900},{9,0, +78},{9,0,508},{10,0,611},{10,0,811},{11,0,510},{11,0,728},{13,0,36},{14,0,39},{ +16,0,83},{17,0,124},{148,0,30},{4,0,668},{136,0,570},{10,0,322},{10,0,719},{139, +0,407},{135,11,1381},{136,11,193},{12,10,108},{141,10,291},{132,11,616},{136,11, +692},{8,0,125},{8,0,369},{8,0,524},{10,0,486},{11,0,13},{11,0,381},{11,0,736},{ +11,0,766},{11,0,845},{13,0,114},{13,0,292},{142,0,47},{134,0,1247},{6,0,1684},{6 +,0,1731},{7,0,356},{8,0,54},{8,0,221},{9,0,225},{9,0,356},{10,0,77},{10,0,446},{ +10,0,731},{12,0,404},{141,0,491},{135,10,1777},{4,10,493},{4,11,305},{144,10,55} +,{4,0,951},{6,0,1809},{6,0,1849},{8,0,846},{8,0,866},{8,0,899},{10,0,896},{12,0, +694},{142,0,468},{5,11,214},{7,11,603},{8,11,611},{9,11,686},{10,11,88},{11,11, +459},{11,11,496},{12,11,463},{12,11,590},{13,11,0},{142,11,214},{132,0,411},{4,0 +,80},{133,0,44},{140,11,74},{143,0,31},{6,10,568},{7,0,669},{7,10,1804},{8,10, +362},{8,10,410},{8,10,830},{9,10,514},{11,10,649},{142,10,157},{6,11,1703},{135, +0,673},{132,10,625},{134,0,1303},{5,0,299},{135,0,1083},{138,0,704},{6,0,275},{6 +,10,158},{7,0,408},{7,10,129},{7,10,181},{8,10,276},{8,10,377},{10,10,523},{11, +10,816},{12,10,455},{13,10,303},{142,10,135},{4,0,219},{7,0,367},{7,0,1713},{7,0 +,1761},{9,0,86},{9,0,537},{10,0,165},{12,0,219},{140,0,561},{4,10,1},{4,11,737}, +{6,11,317},{7,10,1143},{7,10,1463},{8,0,216},{9,10,207},{9,10,390},{9,10,467},{ +10,11,98},{11,10,836},{11,11,294},{12,11,60},{12,11,437},{13,11,64},{13,11,380}, +{142,11,430},{6,11,1758},{8,11,520},{9,11,345},{9,11,403},{142,11,350},{5,11,47} +,{10,11,242},{138,11,579},{5,11,139},{7,11,1168},{138,11,539},{135,0,1319},{4,10 +,295},{4,10,723},{5,10,895},{7,10,1031},{8,10,199},{8,10,340},{9,10,153},{9,10, +215},{10,10,21},{10,10,59},{10,10,80},{10,10,224},{10,10,838},{11,10,229},{11,10 +,652},{12,10,192},{13,10,146},{142,10,91},{140,0,428},{137,10,51},{133,0,514},{5 +,10,309},{140,10,211},{5,10,125},{6,0,1010},{8,10,77},{138,10,15},{4,0,55},{5,0, +301},{6,0,571},{142,0,49},{146,0,102},{136,11,370},{4,11,107},{7,11,613},{8,11, +358},{8,11,439},{8,11,504},{9,11,501},{10,11,383},{139,11,477},{132,11,229},{133 +,0,364},{133,10,439},{4,11,903},{135,11,1816},{11,0,379},{140,10,76},{4,0,76},{4 +,0,971},{7,0,1550},{9,0,306},{9,0,430},{9,0,663},{10,0,683},{10,0,921},{11,0,427 +},{11,0,753},{12,0,334},{12,0,442},{14,0,258},{14,0,366},{143,0,131},{137,0,52}, +{4,11,47},{6,11,373},{7,11,452},{7,11,543},{7,11,1714},{7,11,1856},{9,11,6},{11, +11,257},{139,11,391},{4,10,8},{7,10,1152},{7,10,1153},{7,10,1715},{9,10,374},{10 +,10,478},{139,10,648},{4,11,785},{133,11,368},{135,10,1099},{135,11,860},{5,11, +980},{134,11,1754},{134,0,1258},{6,0,1058},{6,0,1359},{7,11,536},{7,11,1331},{ +136,11,143},{4,0,656},{135,0,779},{136,10,87},{5,11,19},{6,11,533},{146,11,126}, +{7,0,144},{138,10,438},{5,11,395},{5,11,951},{134,11,1776},{135,0,1373},{7,0,554 +},{7,0,605},{141,0,10},{4,10,69},{5,10,122},{9,10,656},{138,10,464},{5,10,849},{ +134,10,1633},{5,0,838},{5,0,841},{134,0,1649},{133,0,1012},{139,10,499},{7,10, +476},{7,10,1592},{138,10,87},{6,0,251},{7,0,365},{7,0,1357},{7,0,1497},{8,0,154} +,{141,0,281},{132,11,441},{132,11,695},{7,11,497},{9,11,387},{147,11,81},{133,0, +340},{14,10,283},{142,11,283},{134,0,810},{135,11,1894},{139,0,495},{5,11,284},{ +6,11,49},{6,11,350},{7,11,1},{7,11,377},{7,11,1693},{8,11,18},{8,11,678},{9,11, +161},{9,11,585},{9,11,671},{9,11,839},{11,11,912},{141,11,427},{5,10,859},{7,10, +1160},{8,10,107},{9,10,291},{9,10,439},{10,10,663},{11,10,609},{140,10,197},{8,0 +,261},{9,0,144},{9,0,466},{10,0,370},{12,0,470},{13,0,144},{142,0,348},{137,0, +897},{6,0,248},{9,0,546},{10,0,535},{11,0,681},{141,0,135},{4,0,358},{135,0,1496 +},{134,0,567},{136,0,445},{4,10,117},{6,10,372},{7,10,1905},{142,10,323},{4,10, +722},{139,10,471},{6,0,697},{134,0,996},{7,11,2007},{9,11,101},{9,11,450},{10,11 +,66},{10,11,842},{11,11,536},{140,11,587},{132,0,577},{134,0,1336},{9,10,5},{12, +10,216},{12,10,294},{12,10,298},{12,10,400},{12,10,518},{13,10,229},{143,10,139} +,{6,0,174},{138,0,917},{134,10,1774},{5,10,12},{7,10,375},{9,10,88},{9,10,438},{ +11,10,270},{139,11,62},{134,11,1766},{6,11,0},{7,10,816},{7,10,1241},{7,11,84},{ +9,10,283},{9,10,520},{10,10,213},{10,10,307},{10,10,463},{10,10,671},{10,10,746} +,{11,10,401},{11,10,794},{11,11,895},{12,10,517},{17,11,11},{18,10,107},{147,10, +115},{5,0,878},{133,0,972},{6,11,1665},{7,11,256},{7,11,1388},{138,11,499},{4,10 +,258},{136,10,639},{4,11,22},{5,11,10},{6,10,22},{7,10,903},{7,10,1963},{7,11, +848},{8,11,97},{138,10,577},{5,10,681},{136,10,782},{133,11,481},{132,0,351},{4, +10,664},{5,10,804},{139,10,1013},{6,11,134},{7,11,437},{7,11,959},{9,11,37},{14, +11,285},{14,11,371},{144,11,60},{7,11,486},{8,11,155},{11,11,93},{140,11,164},{ +132,0,286},{7,0,438},{7,0,627},{7,0,1516},{8,0,40},{9,0,56},{9,0,294},{10,0,30}, +{11,0,969},{11,0,995},{146,0,148},{5,11,591},{135,11,337},{134,0,1950},{133,10, +32},{138,11,500},{5,11,380},{5,11,650},{136,11,310},{4,11,364},{7,11,1156},{7,11 +,1187},{137,11,409},{4,0,738},{134,11,482},{4,11,781},{6,11,487},{7,11,926},{8, +11,263},{139,11,500},{135,11,418},{4,10,289},{6,0,2047},{7,10,629},{7,10,1698},{ +7,10,1711},{10,0,969},{140,10,215},{6,10,450},{136,10,109},{134,0,818},{136,10, +705},{133,0,866},{4,11,94},{135,11,1265},{132,11,417},{134,0,1467},{135,10,1238} +,{4,0,972},{6,0,1851},{134,0,1857},{134,0,355},{133,0,116},{132,0,457},{135,11, +1411},{4,11,408},{4,11,741},{135,11,500},{134,10,26},{142,11,137},{5,0,527},{6,0 +,189},{7,0,859},{136,0,267},{11,0,104},{11,0,554},{15,0,60},{143,0,125},{134,0, +1613},{4,10,414},{5,10,467},{9,10,654},{10,10,451},{12,10,59},{141,10,375},{135, +10,17},{134,0,116},{135,11,541},{135,10,955},{6,11,73},{135,11,177},{133,11,576} +,{134,0,886},{133,0,487},{4,0,86},{5,0,667},{5,0,753},{6,0,316},{6,0,455},{135,0 +,946},{142,11,231},{150,0,45},{134,0,863},{134,0,1953},{6,10,280},{10,10,502},{ +11,10,344},{140,10,38},{4,0,79},{7,0,1773},{10,0,450},{11,0,589},{13,0,332},{13, +0,493},{14,0,183},{14,0,334},{14,0,362},{14,0,368},{14,0,376},{14,0,379},{19,0, +90},{19,0,103},{19,0,127},{148,0,90},{5,10,45},{7,10,1161},{11,10,448},{11,10, +880},{13,10,139},{13,10,407},{15,10,16},{17,10,95},{18,10,66},{18,10,88},{18,10, +123},{149,10,7},{136,10,777},{4,10,410},{135,10,521},{135,10,1778},{135,11,538}, +{142,0,381},{133,11,413},{134,0,1142},{6,0,1189},{136,11,495},{5,0,663},{6,0, +1962},{134,0,2003},{7,11,54},{8,11,312},{10,11,191},{10,11,614},{140,11,567},{ +132,10,436},{133,0,846},{7,10,1587},{7,10,1707},{10,0,528},{139,0,504},{5,0,378} +,{8,0,465},{9,0,286},{10,0,185},{10,0,562},{10,0,635},{11,0,31},{11,0,393},{13,0 +,312},{18,0,65},{18,0,96},{147,0,89},{6,11,468},{7,0,899},{7,11,567},{7,11,1478} +,{8,11,530},{14,0,325},{142,11,290},{7,0,1880},{9,0,680},{139,0,798},{134,0,1770 +},{132,0,648},{150,11,35},{5,0,945},{6,0,1656},{6,0,1787},{7,0,167},{8,0,824},{9 +,0,391},{10,0,375},{139,0,185},{6,11,484},{135,11,822},{134,0,2046},{7,0,1645},{ +8,0,352},{137,0,249},{132,0,152},{6,0,611},{135,0,1733},{6,11,1724},{135,11,2022 +},{133,0,1006},{141,11,96},{5,0,420},{135,0,1449},{146,11,149},{135,0,832},{135, +10,663},{133,0,351},{5,0,40},{7,0,598},{7,0,1638},{8,0,78},{9,0,166},{9,0,640},{ +9,0,685},{9,0,773},{11,0,215},{13,0,65},{14,0,172},{14,0,317},{145,0,6},{8,0,60} +,{9,0,343},{139,0,769},{134,0,1354},{132,0,724},{137,0,745},{132,11,474},{7,0, +1951},{8,0,765},{8,0,772},{140,0,671},{7,0,108},{8,0,219},{8,0,388},{9,0,775},{ +11,0,275},{140,0,464},{137,0,639},{135,10,503},{133,11,366},{5,0,15},{5,11,305}, +{6,0,56},{7,0,1758},{8,0,500},{9,0,730},{9,11,560},{11,0,331},{13,0,150},{13,11, +208},{142,0,282},{4,10,113},{5,10,163},{5,10,735},{7,10,1009},{9,10,9},{9,10,771 +},{12,10,90},{13,10,138},{13,10,410},{143,10,128},{4,10,324},{138,10,104},{135, +11,466},{142,11,27},{134,0,1886},{4,11,480},{5,0,205},{6,0,438},{6,11,167},{6,11 +,302},{6,11,1642},{7,11,130},{7,11,656},{7,11,837},{7,11,1547},{7,11,1657},{8,11 +,429},{9,0,711},{9,11,228},{10,11,643},{13,11,289},{13,11,343},{147,11,101},{134 +,0,865},{6,0,2025},{136,0,965},{7,11,278},{10,11,739},{11,11,708},{141,11,348},{ +133,0,534},{135,11,1922},{137,0,691},{4,10,935},{133,10,823},{6,0,443},{9,0,237} +,{9,0,571},{9,0,695},{10,0,139},{11,0,715},{12,0,417},{141,0,421},{5,10,269},{7, +10,434},{7,10,891},{8,10,339},{9,10,702},{11,10,594},{11,10,718},{145,10,100},{6 +,0,1555},{7,0,878},{9,10,485},{141,10,264},{134,10,1713},{7,10,1810},{11,10,866} +,{12,10,103},{141,10,495},{135,10,900},{6,0,1410},{9,11,316},{139,11,256},{4,0, +995},{135,0,1033},{132,0,578},{10,0,881},{12,0,740},{12,0,743},{140,0,759},{132, +0,822},{133,0,923},{142,10,143},{135,11,1696},{6,11,363},{7,11,1955},{136,11,725 +},{132,0,924},{133,0,665},{135,10,2029},{135,0,1901},{4,0,265},{6,0,1092},{6,0, +1417},{7,0,807},{135,0,950},{5,0,93},{12,0,267},{141,0,498},{135,0,1451},{5,11, +813},{135,11,2046},{5,10,625},{135,10,1617},{135,0,747},{6,0,788},{137,0,828},{5 +,11,712},{7,0,184},{7,11,1855},{8,10,425},{8,10,693},{9,10,720},{10,10,380},{10, +10,638},{11,0,307},{11,0,400},{11,10,473},{11,11,17},{12,10,61},{13,11,321},{15, +0,130},{144,11,67},{135,0,198},{6,11,320},{7,11,781},{7,11,1921},{9,11,55},{10, +11,186},{10,11,273},{10,11,664},{10,11,801},{11,11,996},{11,11,997},{13,11,157}, +{142,11,170},{136,11,271},{135,0,994},{7,11,103},{7,11,863},{11,11,184},{14,11, +299},{145,11,62},{11,10,551},{142,10,159},{5,0,233},{5,0,320},{6,0,140},{8,0,295 +},{8,0,615},{136,11,615},{133,0,978},{4,0,905},{6,0,1701},{137,0,843},{132,10, +168},{4,0,974},{8,0,850},{12,0,709},{12,0,768},{140,0,786},{135,10,91},{152,0,6} +,{138,10,532},{135,10,1884},{132,0,509},{6,0,1307},{135,0,273},{5,11,77},{7,11, +1455},{10,11,843},{19,11,73},{150,11,5},{132,11,458},{135,11,1420},{6,11,109},{ +138,11,382},{6,0,201},{6,11,330},{7,10,70},{7,11,1084},{10,10,240},{11,11,142},{ +147,10,93},{7,0,1041},{140,11,328},{133,11,354},{134,0,1040},{133,0,693},{134,0, +774},{139,0,234},{132,0,336},{7,0,1399},{139,10,392},{20,0,22},{148,11,22},{5,0, +802},{7,0,2021},{136,0,805},{5,0,167},{5,0,899},{6,0,410},{137,0,777},{137,0,789 +},{134,0,1705},{7,10,655},{135,10,1844},{4,10,145},{6,10,176},{7,10,395},{137,10 +,562},{132,10,501},{135,0,10},{5,0,11},{6,0,117},{6,0,485},{6,10,509},{7,0,1133} +,{9,0,582},{9,0,594},{10,0,82},{11,0,21},{11,0,818},{12,0,535},{13,0,86},{20,0, +91},{151,0,13},{4,0,264},{7,0,1067},{8,0,204},{8,0,385},{139,0,953},{139,11,737} +,{138,0,56},{134,0,1917},{133,0,470},{10,11,657},{14,11,297},{142,11,361},{135, +11,412},{7,0,1198},{7,11,1198},{8,11,556},{14,11,123},{14,11,192},{143,11,27},{7 +,11,1985},{14,11,146},{15,11,42},{16,11,23},{17,11,86},{146,11,17},{8,11,122},{ +139,0,1015},{4,10,114},{9,10,492},{13,10,462},{142,10,215},{4,10,77},{5,10,361}, +{6,10,139},{6,10,401},{6,10,404},{7,10,413},{7,10,715},{7,10,1716},{11,10,279},{ +12,10,179},{12,10,258},{13,10,244},{142,10,358},{134,10,1717},{7,10,1061},{8,10, +82},{11,10,250},{12,10,420},{141,10,184},{133,0,715},{135,10,724},{9,0,919},{9,0 +,922},{9,0,927},{9,0,933},{9,0,962},{9,0,1000},{9,0,1002},{9,0,1021},{12,0,890}, +{12,0,907},{12,0,930},{15,0,207},{15,0,228},{15,0,238},{149,0,61},{8,0,794},{9,0 +,400},{10,0,298},{142,0,228},{5,11,430},{5,11,932},{6,11,131},{7,11,417},{9,11, +522},{11,11,314},{141,11,390},{132,0,867},{4,11,507},{136,0,724},{137,11,261},{4 +,11,343},{133,11,511},{6,0,190},{7,0,768},{135,0,1170},{6,10,513},{135,10,1052}, +{7,11,455},{138,11,591},{134,0,1066},{137,10,899},{14,0,67},{147,0,60},{4,0,948} +,{18,0,174},{146,0,176},{135,0,1023},{7,10,1417},{12,10,382},{17,10,48},{152,10, +12},{134,11,575},{132,0,764},{6,10,545},{7,10,565},{7,10,1669},{10,10,114},{11, +10,642},{140,10,618},{6,0,137},{9,0,75},{9,0,253},{10,0,194},{138,0,444},{4,0, +756},{133,10,5},{7,10,192},{136,0,1008},{132,0,842},{8,10,763},{11,0,643},{140,0 +,115},{139,0,67},{133,10,759},{4,0,821},{5,0,760},{7,0,542},{7,11,580},{8,0,135} +,{136,0,496},{7,10,370},{7,10,1007},{7,10,1177},{135,10,1565},{135,10,1237},{140 +,0,736},{7,0,319},{7,0,355},{7,0,763},{10,0,389},{145,0,43},{8,11,333},{138,11, +182},{4,10,87},{5,10,250},{141,10,298},{138,0,786},{134,0,2044},{8,11,330},{140, +11,477},{135,11,1338},{132,11,125},{134,0,1030},{134,0,1083},{132,11,721},{135, +10,814},{7,11,776},{8,11,145},{147,11,56},{134,0,1226},{4,10,57},{7,10,1195},{7, +10,1438},{7,10,1548},{7,10,1835},{7,10,1904},{9,10,757},{10,10,604},{139,10,519} +,{7,11,792},{8,11,147},{10,11,821},{139,11,1021},{137,11,797},{4,0,58},{5,0,286} +,{6,0,319},{7,0,402},{7,0,1254},{7,0,1903},{8,0,356},{140,0,408},{4,0,389},{4,0, +815},{9,0,181},{9,0,255},{10,0,8},{10,0,29},{10,0,816},{11,0,311},{11,0,561},{12 +,0,67},{141,0,181},{7,11,1472},{135,11,1554},{7,11,1071},{7,11,1541},{7,11,1767} +,{7,11,1806},{7,11,1999},{9,11,248},{10,11,400},{11,11,162},{11,11,178},{11,11, +242},{12,11,605},{15,11,26},{144,11,44},{5,11,168},{5,11,930},{8,11,74},{9,11, +623},{12,11,500},{12,11,579},{13,11,41},{143,11,93},{6,11,220},{7,11,1101},{141, +11,105},{4,10,209},{5,0,474},{7,0,507},{7,10,902},{135,11,507},{132,0,427},{6,0, +413},{7,10,335},{7,10,1437},{7,10,1668},{8,10,553},{8,10,652},{8,10,656},{9,10, +558},{11,10,743},{149,10,18},{132,0,730},{6,11,19},{7,11,1413},{139,11,428},{133 +,0,373},{132,10,559},{7,11,96},{8,11,401},{137,11,896},{5,10,1017},{7,0,799},{7, +0,1972},{138,10,511},{135,0,1793},{7,11,1961},{7,11,1965},{8,11,702},{136,11,750 +},{8,11,150},{8,11,737},{140,11,366},{132,0,322},{133,10,709},{8,11,800},{9,11, +148},{9,11,872},{9,11,890},{11,11,309},{11,11,1001},{13,11,267},{141,11,323},{ +134,10,1745},{7,0,290},{136,10,206},{7,0,1651},{145,0,89},{139,0,2},{132,0,672}, +{6,0,1860},{8,0,905},{10,0,844},{10,0,846},{10,0,858},{12,0,699},{12,0,746},{140 +,0,772},{135,11,424},{133,11,547},{133,0,737},{5,11,490},{6,11,615},{6,11,620},{ +135,11,683},{6,0,746},{134,0,1612},{132,10,776},{9,11,385},{149,11,17},{133,0, +145},{135,10,1272},{7,0,884},{140,0,124},{4,0,387},{135,0,1288},{5,11,133},{136, +10,406},{136,11,187},{6,0,679},{8,11,8},{138,11,0},{135,0,550},{135,11,798},{136 +,11,685},{7,11,1086},{145,11,46},{8,10,175},{10,10,168},{138,10,573},{135,0,1305 +},{4,0,576},{135,0,1263},{6,0,686},{134,0,1563},{134,0,607},{5,0,919},{134,0, +1673},{148,0,37},{8,11,774},{10,11,670},{140,11,51},{133,10,784},{139,10,882},{4 +,0,82},{5,0,333},{5,0,904},{6,0,207},{7,0,325},{7,0,1726},{8,0,101},{10,0,778},{ +139,0,220},{135,11,371},{132,0,958},{133,0,903},{4,11,127},{5,11,350},{6,11,356} +,{8,11,426},{9,11,572},{10,11,247},{139,11,312},{140,0,147},{6,11,59},{7,11,885} +,{9,11,603},{141,11,397},{9,10,14},{9,10,441},{10,0,367},{139,10,9},{11,10,966}, +{12,10,287},{13,10,342},{13,10,402},{15,10,110},{143,10,163},{134,0,690},{132,0, +705},{7,10,1428},{7,10,1640},{7,10,1867},{9,0,651},{9,10,169},{9,10,182},{9,10, +367},{9,10,478},{9,10,506},{9,10,551},{9,10,557},{9,10,648},{9,10,697},{9,10,705 +},{9,10,725},{9,10,787},{9,10,794},{10,10,198},{10,10,214},{10,10,267},{10,10, +275},{10,10,456},{10,10,551},{10,10,561},{10,10,613},{10,10,627},{10,10,668},{10 +,10,675},{10,10,691},{10,10,695},{10,10,707},{10,10,715},{11,0,971},{11,10,183}, +{11,10,201},{11,10,262},{11,10,352},{11,10,439},{11,10,493},{11,10,572},{11,10, +591},{11,10,608},{11,10,611},{11,10,646},{11,10,674},{11,10,711},{11,10,751},{11 +,10,761},{11,10,776},{11,10,785},{11,10,850},{11,10,853},{11,10,862},{11,10,865} +,{11,10,868},{11,10,875},{11,10,898},{11,10,902},{11,10,903},{11,10,910},{11,10, +932},{11,10,942},{11,10,957},{11,10,967},{11,10,972},{12,10,148},{12,10,195},{12 +,10,220},{12,10,237},{12,10,318},{12,10,339},{12,10,393},{12,10,445},{12,10,450} +,{12,10,474},{12,10,505},{12,10,509},{12,10,533},{12,10,591},{12,10,594},{12,10, +597},{12,10,621},{12,10,633},{12,10,642},{13,0,273},{13,10,59},{13,10,60},{13,10 +,145},{13,10,239},{13,10,250},{13,10,329},{13,10,344},{13,10,365},{13,10,372},{ +13,10,387},{13,10,403},{13,10,414},{13,10,456},{13,10,470},{13,10,478},{13,10, +483},{13,10,489},{14,10,55},{14,10,57},{14,10,81},{14,10,90},{14,10,148},{14,10, +239},{14,10,266},{14,10,321},{14,10,326},{14,10,327},{14,10,330},{14,10,347},{14 +,10,355},{14,10,401},{14,10,404},{14,10,411},{14,10,414},{14,10,416},{14,10,420} +,{15,10,61},{15,10,74},{15,10,87},{15,10,88},{15,10,94},{15,10,96},{15,10,116},{ +15,10,149},{15,10,154},{16,10,50},{16,10,63},{16,10,73},{17,10,2},{17,10,66},{17 +,10,92},{17,10,103},{17,10,112},{17,10,120},{18,10,50},{18,10,54},{18,10,82},{18 +,10,86},{18,10,90},{18,10,111},{18,10,115},{18,10,156},{19,10,40},{19,10,79},{20 +,10,78},{149,10,22},{5,10,161},{7,0,887},{135,10,839},{142,11,98},{134,0,90},{ +138,11,356},{135,11,441},{6,11,111},{7,11,4},{8,11,163},{8,11,776},{138,11,566}, +{134,0,908},{134,0,1261},{7,0,813},{12,0,497},{141,0,56},{134,0,1235},{135,0,429 +},{135,11,1994},{138,0,904},{6,0,125},{7,0,1277},{137,0,772},{151,0,12},{4,0,841 +},{5,0,386},{133,11,386},{5,11,297},{135,11,1038},{6,0,860},{6,0,1069},{135,11, +309},{136,0,946},{135,10,1814},{141,11,418},{136,11,363},{10,0,768},{139,0,787}, +{22,11,30},{150,11,33},{6,0,160},{7,0,1106},{9,0,770},{11,0,112},{140,0,413},{11 +,11,216},{139,11,340},{136,10,139},{135,11,1390},{135,11,808},{132,11,280},{7,10 +,643},{8,10,236},{12,0,271},{145,0,109},{140,11,54},{4,11,421},{133,11,548},{11, +0,719},{12,0,36},{141,0,337},{7,0,581},{9,0,644},{137,0,699},{11,11,511},{13,11, +394},{14,11,298},{14,11,318},{146,11,103},{7,0,304},{9,0,646},{9,0,862},{11,0, +696},{12,0,208},{15,0,79},{147,0,108},{4,0,631},{7,0,1126},{135,0,1536},{135,11, +1527},{8,0,880},{10,0,869},{138,0,913},{5,10,54},{6,11,254},{7,0,1513},{9,11,109 +},{138,11,103},{135,0,981},{133,11,729},{132,10,744},{132,0,434},{134,0,550},{6, +11,1630},{7,0,930},{10,0,476},{10,10,402},{13,0,452},{18,10,55},{147,0,104},{5,0 +,553},{138,0,824},{136,0,452},{8,0,151},{137,10,624},{132,10,572},{132,0,772},{ +133,11,671},{133,0,292},{138,0,135},{132,11,889},{140,11,207},{6,10,43},{7,10,38 +},{8,10,248},{9,0,504},{138,10,513},{6,0,1089},{135,11,1910},{4,11,627},{133,11, +775},{135,0,783},{133,10,766},{133,10,363},{7,0,387},{135,11,387},{7,0,393},{7, +11,202},{10,0,603},{11,0,206},{11,11,362},{11,11,948},{140,11,388},{6,11,507},{7 +,11,451},{8,11,389},{12,11,490},{13,11,16},{13,11,215},{13,11,351},{18,11,132},{ +147,11,125},{4,0,912},{7,11,841},{137,0,232},{6,10,258},{140,10,409},{5,10,249}, +{148,10,82},{136,11,566},{6,0,977},{135,11,1214},{7,0,1973},{136,0,716},{135,0, +98},{133,0,733},{5,11,912},{134,11,1695},{5,10,393},{6,10,378},{7,10,1981},{9,10 +,32},{9,10,591},{10,10,685},{10,10,741},{142,10,382},{133,10,788},{7,10,1968},{ +10,0,19},{11,0,911},{141,10,509},{5,0,668},{5,11,236},{6,11,572},{8,11,492},{11, +11,618},{144,11,56},{135,11,1789},{4,0,360},{5,0,635},{5,0,700},{5,10,58},{5,10, +171},{5,10,683},{6,10,291},{6,10,566},{7,10,1650},{11,10,523},{12,10,273},{12,10 +,303},{15,10,39},{143,10,111},{133,0,901},{134,10,589},{5,11,190},{136,11,318},{ +140,0,656},{7,0,726},{152,0,9},{4,10,917},{133,10,1005},{135,10,1598},{134,11, +491},{4,10,919},{133,11,434},{137,0,72},{6,0,1269},{6,0,1566},{134,0,1621},{4,10 +,255},{5,10,302},{6,10,132},{7,10,128},{7,10,283},{7,10,1299},{9,0,463},{10,0, +595},{10,10,52},{10,10,514},{11,10,925},{13,10,92},{142,10,309},{135,0,1454},{ +134,0,1287},{9,10,173},{11,0,600},{141,0,245},{136,0,989},{7,0,164},{7,0,1571},{ +9,0,107},{140,0,225},{6,0,1061},{141,10,442},{4,0,27},{5,0,484},{5,0,510},{6,0, +434},{7,0,1000},{7,0,1098},{136,0,2},{7,11,85},{7,11,247},{8,11,585},{10,11,163} +,{138,11,316},{11,11,103},{142,11,0},{134,0,1127},{4,0,460},{134,0,852},{134,10, +210},{4,0,932},{133,0,891},{6,0,588},{147,11,83},{4,10,284},{6,10,223},{136,0, +625},{134,0,76},{8,0,92},{137,0,221},{4,11,124},{10,11,457},{11,11,121},{11,11, +169},{11,11,422},{11,11,870},{12,11,214},{13,11,389},{14,11,187},{143,11,77},{9, +11,618},{138,11,482},{4,10,218},{7,10,526},{143,10,137},{4,10,270},{5,10,192},{6 +,10,332},{7,10,1322},{13,0,9},{14,0,104},{142,0,311},{140,10,661},{135,11,1193}, +{6,11,107},{7,11,638},{7,11,1632},{137,11,396},{132,0,763},{4,0,622},{5,11,370}, +{134,11,1756},{133,0,253},{135,0,546},{5,11,204},{9,0,73},{10,0,110},{14,0,185}, +{145,0,119},{7,0,624},{7,0,916},{10,0,256},{139,0,87},{7,10,379},{8,10,481},{137 +,10,377},{5,0,212},{5,11,970},{6,11,1706},{12,0,35},{141,0,382},{5,10,1003},{6, +10,149},{137,0,746},{8,10,262},{9,10,627},{10,0,150},{11,0,849},{11,10,214},{11, +10,404},{11,10,457},{11,10,780},{11,10,913},{13,0,330},{13,10,401},{142,10,200}, +{134,0,1466},{135,11,3},{4,11,35},{5,11,121},{5,11,483},{5,11,685},{6,0,1299},{6 +,11,489},{7,11,1204},{136,11,394},{135,10,742},{4,10,142},{136,10,304},{4,11,921 +},{133,11,1007},{134,0,1518},{6,0,1229},{135,0,1175},{133,0,816},{4,10,471},{4, +11,712},{5,10,51},{6,10,602},{7,10,925},{8,10,484},{10,10,195},{140,0,159},{134, +11,1629},{5,0,869},{5,0,968},{6,0,1626},{8,0,734},{136,0,784},{4,0,542},{6,0, +1716},{6,0,1727},{7,0,1082},{7,0,1545},{8,0,56},{8,0,118},{8,0,412},{8,0,564},{8 +,10,688},{9,0,888},{9,0,908},{10,0,50},{10,0,423},{11,0,685},{11,0,697},{11,0, +933},{12,0,299},{13,0,126},{13,0,136},{13,0,170},{141,0,190},{132,10,697},{4,0, +232},{9,0,202},{10,0,474},{140,0,433},{136,0,212},{6,0,108},{7,0,1003},{7,0,1181 +},{8,0,111},{136,0,343},{5,10,221},{135,11,1255},{133,11,485},{134,0,1712},{142, +0,216},{4,11,285},{5,0,643},{5,11,317},{6,0,516},{6,11,301},{7,11,7},{8,11,153}, +{10,11,766},{11,11,468},{12,11,467},{141,11,143},{4,0,133},{7,0,711},{7,0,1298}, +{135,0,1585},{134,0,650},{135,11,512},{6,0,99},{7,0,1808},{145,0,57},{6,0,246},{ +6,0,574},{7,0,428},{9,0,793},{10,0,669},{11,0,485},{11,0,840},{12,0,300},{14,0, +250},{145,0,55},{4,10,132},{5,10,69},{135,10,1242},{136,0,1023},{4,10,111},{135, +0,302},{135,0,1871},{132,0,728},{4,10,767},{137,0,252},{6,0,461},{7,0,1590},{7, +10,1416},{7,10,2005},{8,10,131},{8,10,466},{9,10,672},{13,10,252},{148,10,103},{ +6,0,323},{135,0,1564},{7,0,461},{136,0,775},{6,10,44},{136,10,368},{139,0,172},{ +132,0,464},{4,10,570},{133,10,120},{137,11,269},{6,10,227},{135,10,1589},{6,11, +1719},{6,11,1735},{7,11,2016},{7,11,2020},{8,11,837},{137,11,852},{7,0,727},{146 +,0,73},{132,0,1023},{135,11,852},{135,10,1529},{136,0,577},{138,11,568},{134,0, +1037},{8,11,67},{138,11,419},{4,0,413},{5,0,677},{8,0,432},{140,0,280},{6,10, +1667},{7,10,2036},{7,11,967},{10,0,600},{141,11,11},{6,10,511},{140,10,132},{5, +10,568},{6,0,799},{6,10,138},{135,10,1293},{4,10,565},{8,0,159},{136,10,827},{7, +0,646},{7,0,1730},{11,0,446},{141,0,178},{4,10,922},{133,10,1023},{135,11,11},{ +132,0,395},{7,10,1002},{139,0,145},{9,0,174},{10,0,164},{11,0,440},{11,0,514},{ +11,0,841},{15,0,98},{149,0,20},{134,0,426},{10,0,608},{139,0,1002},{7,11,320},{8 +,11,51},{12,11,481},{12,11,570},{148,11,106},{4,11,445},{9,0,977},{137,0,983},{ +138,0,250},{139,0,100},{6,0,1982},{136,10,402},{133,11,239},{4,10,716},{141,10, +31},{5,0,476},{7,11,83},{7,11,1990},{8,11,130},{139,11,720},{8,10,691},{136,10, +731},{5,11,123},{6,11,530},{7,11,348},{135,11,1419},{5,0,76},{6,0,458},{6,0,497} +,{7,0,868},{9,0,658},{10,0,594},{11,0,173},{11,0,566},{12,0,20},{12,0,338},{141, +0,200},{9,11,139},{10,11,399},{11,11,469},{12,11,634},{141,11,223},{9,10,840},{ +138,10,803},{133,10,847},{11,11,223},{140,11,168},{132,11,210},{8,0,447},{9,10, +53},{9,10,268},{9,10,901},{10,10,518},{10,10,829},{11,10,188},{13,10,74},{14,10, +46},{15,10,17},{15,10,33},{17,10,40},{18,10,36},{19,10,20},{22,10,1},{152,10,2}, +{4,0,526},{7,0,1029},{135,0,1054},{19,11,59},{150,11,2},{4,0,636},{6,0,1875},{6, +0,1920},{8,10,532},{9,0,999},{12,0,807},{12,0,825},{15,0,179},{15,0,190},{146,0, +182},{6,0,1699},{7,0,660},{7,0,1124},{17,0,31},{19,0,22},{151,0,14},{135,10,681} +,{132,11,430},{140,10,677},{4,10,684},{136,10,384},{132,11,756},{133,11,213},{7, +0,188},{7,10,110},{8,10,290},{8,10,591},{9,10,382},{9,10,649},{11,10,71},{11,10, +155},{11,10,313},{12,10,5},{13,10,325},{142,10,287},{7,10,360},{7,10,425},{9,10, +66},{9,10,278},{138,10,644},{142,11,164},{4,0,279},{7,0,301},{137,0,362},{134,11 +,586},{135,0,1743},{4,0,178},{133,0,399},{4,10,900},{133,10,861},{5,10,254},{7, +10,985},{136,10,73},{133,11,108},{7,10,1959},{136,10,683},{133,11,219},{4,11,193 +},{5,11,916},{7,11,364},{10,11,398},{10,11,726},{11,11,317},{11,11,626},{12,11, +142},{12,11,288},{12,11,678},{13,11,313},{15,11,113},{18,11,114},{21,11,30},{150 +,11,53},{6,11,241},{7,11,907},{8,11,832},{9,11,342},{10,11,729},{11,11,284},{11, +11,445},{11,11,651},{11,11,863},{13,11,398},{146,11,99},{132,0,872},{134,0,831}, +{134,0,1692},{6,0,202},{6,0,1006},{9,0,832},{9,11,734},{10,0,636},{11,0,208},{12 +,0,360},{17,0,118},{18,0,27},{148,0,67},{132,10,725},{7,11,993},{138,11,666},{ +134,0,1954},{134,10,196},{7,0,872},{10,0,516},{139,0,167},{133,10,831},{4,11,562 +},{9,11,254},{139,11,879},{137,0,313},{4,0,224},{132,11,786},{8,10,723},{11,0,24 +},{140,0,170},{5,0,546},{7,0,35},{8,0,11},{8,0,12},{9,0,315},{9,0,533},{10,0,802 +},{11,0,166},{12,0,525},{142,0,243},{7,0,1937},{13,10,80},{13,10,437},{145,10,74 +},{5,0,241},{8,0,242},{9,0,451},{10,0,667},{11,0,598},{140,0,429},{150,0,46},{6, +0,1273},{137,0,830},{5,10,848},{6,10,66},{136,10,764},{6,0,825},{134,0,993},{4,0 +,1006},{4,10,36},{7,10,1387},{10,0,327},{11,10,755},{141,0,271},{134,0,1023},{ +135,0,1580},{4,0,366},{137,0,516},{132,10,887},{6,0,1736},{135,0,1891},{6,11,216 +},{7,11,901},{7,11,1343},{136,11,493},{6,10,165},{138,10,388},{7,11,341},{139,11 +,219},{4,10,719},{135,10,155},{134,0,1935},{132,0,826},{6,0,331},{6,0,1605},{8,0 +,623},{11,0,139},{139,0,171},{135,11,1734},{10,11,115},{11,11,420},{12,11,154},{ +13,11,404},{14,11,346},{15,11,54},{143,11,112},{4,10,353},{6,10,146},{6,10,1789} +,{7,0,288},{7,10,990},{7,10,1348},{9,10,665},{9,10,898},{11,10,893},{142,10,212} +,{6,0,916},{134,0,1592},{4,10,45},{7,0,1888},{135,10,1257},{5,11,1011},{136,11, +701},{139,11,596},{4,11,54},{5,11,666},{7,11,1039},{7,11,1130},{9,11,195},{138, +11,302},{134,0,1471},{134,0,1570},{132,0,394},{140,10,65},{136,10,816},{135,0, +1931},{7,0,574},{135,0,1719},{134,11,467},{132,0,658},{6,11,1669},{9,0,781},{10, +0,144},{11,0,385},{13,0,161},{13,0,228},{13,0,268},{148,0,107},{136,0,374},{135, +0,735},{4,0,344},{6,0,498},{139,0,323},{6,10,559},{6,10,1691},{7,0,586},{135,0, +1063},{137,0,155},{133,0,906},{7,11,122},{9,11,259},{10,11,84},{11,11,470},{12, +11,541},{141,11,379},{134,0,1139},{10,0,108},{139,0,116},{134,10,456},{133,10, +925},{5,11,82},{5,11,131},{7,11,1755},{8,11,31},{9,11,168},{9,11,764},{139,11, +869},{134,11,605},{5,11,278},{137,11,68},{4,11,163},{5,11,201},{5,11,307},{5,11, +310},{6,11,335},{7,11,284},{136,11,165},{135,11,1660},{6,11,33},{135,11,1244},{4 +,0,616},{136,11,483},{4,11,199},{8,0,857},{8,0,902},{8,0,910},{10,0,879},{11,11, +34},{140,0,726},{136,0,692},{6,10,193},{7,10,240},{7,10,1682},{10,10,51},{10,10, +640},{11,10,410},{13,10,82},{14,10,247},{14,10,331},{142,10,377},{6,0,823},{134, +0,983},{139,10,411},{132,0,305},{136,10,633},{138,11,203},{134,0,681},{6,11,326} +,{7,11,677},{137,11,425},{5,0,214},{7,0,603},{8,0,611},{9,0,686},{10,0,88},{11,0 +,459},{11,0,496},{12,0,463},{12,0,590},{141,0,0},{136,0,1004},{142,0,23},{134,0, +1703},{147,11,8},{145,11,56},{135,0,1443},{4,10,237},{135,10,514},{6,0,714},{145 +,0,19},{5,11,358},{7,11,473},{7,11,1184},{10,11,662},{13,11,212},{13,11,304},{13 +,11,333},{145,11,98},{4,0,737},{10,0,98},{11,0,294},{12,0,60},{12,0,437},{13,0, +64},{13,0,380},{142,0,430},{6,10,392},{7,10,65},{135,10,2019},{6,0,1758},{8,0, +520},{9,0,345},{9,0,403},{142,0,350},{5,0,47},{10,0,242},{138,0,579},{5,0,139},{ +7,0,1168},{138,0,539},{134,0,1459},{13,0,388},{141,11,388},{134,0,253},{7,10, +1260},{135,10,1790},{9,10,222},{10,0,252},{139,10,900},{140,0,745},{133,11,946}, +{4,0,107},{7,0,613},{8,0,439},{8,0,504},{9,0,501},{10,0,383},{139,0,477},{135,11 +,1485},{132,0,871},{7,11,411},{7,11,590},{8,11,631},{9,11,323},{10,11,355},{11, +11,491},{12,11,143},{12,11,402},{13,11,73},{14,11,408},{15,11,107},{146,11,71},{ +132,0,229},{132,0,903},{140,0,71},{133,0,549},{4,0,47},{6,0,373},{7,0,452},{7,0, +543},{7,0,1828},{7,0,1856},{9,0,6},{11,0,257},{139,0,391},{7,11,1467},{8,11,328} +,{10,11,544},{11,11,955},{13,11,320},{145,11,83},{5,0,980},{134,0,1754},{136,0, +865},{5,0,705},{137,0,606},{7,0,161},{8,10,201},{136,10,605},{143,11,35},{5,11, +835},{6,11,483},{140,10,224},{7,0,536},{7,0,1331},{136,0,143},{134,0,1388},{5,0, +724},{10,0,305},{11,0,151},{12,0,33},{12,0,121},{12,0,381},{17,0,3},{17,0,27},{ +17,0,78},{18,0,18},{19,0,54},{149,0,5},{4,10,523},{133,10,638},{5,0,19},{134,0, +533},{5,0,395},{5,0,951},{134,0,1776},{135,0,1908},{132,0,846},{6,10,242},{7,10, +227},{7,10,1581},{8,10,104},{9,10,113},{9,10,220},{9,10,427},{10,0,74},{10,10, +239},{11,0,663},{11,10,579},{11,10,1023},{12,0,210},{13,0,166},{13,0,310},{13,10 +,4},{13,10,204},{13,10,316},{14,0,373},{18,0,95},{19,0,43},{148,10,86},{9,11,716 +},{11,11,108},{13,11,123},{14,11,252},{19,11,38},{21,11,3},{151,11,11},{8,0,372} +,{9,0,122},{138,0,175},{132,11,677},{7,11,1374},{136,11,540},{135,10,861},{132,0 +,695},{7,0,497},{9,0,387},{147,0,81},{136,0,937},{134,0,718},{7,0,1328},{136,10, +494},{132,11,331},{5,11,747},{134,0,1581},{5,0,284},{6,0,49},{6,0,350},{7,0,1},{ +7,0,377},{7,0,1693},{8,0,18},{8,0,678},{9,0,161},{9,0,585},{9,0,671},{9,0,839},{ +11,0,912},{141,0,427},{7,10,1306},{8,10,505},{9,10,482},{10,10,126},{11,10,225}, +{12,10,347},{12,10,449},{13,10,19},{14,10,218},{142,10,435},{10,10,764},{12,10, +120},{13,10,39},{145,10,127},{4,0,597},{133,10,268},{134,0,1094},{4,0,1008},{134 +,0,1973},{132,0,811},{139,0,908},{135,0,1471},{133,11,326},{4,10,384},{135,10, +1022},{4,11,691},{7,0,1935},{7,11,1935},{8,0,324},{8,11,324},{9,11,35},{10,11, +680},{11,11,364},{12,0,42},{12,11,42},{13,11,357},{146,11,16},{135,0,2014},{6,11 +,32},{7,0,2007},{7,11,385},{7,11,757},{7,11,1916},{8,11,37},{8,11,94},{8,11,711} +,{9,0,101},{9,0,450},{9,11,541},{10,0,66},{10,0,842},{10,11,162},{10,11,795},{11 +,0,536},{11,11,989},{11,11,1010},{12,0,587},{12,11,14},{142,11,308},{139,0,586}, +{135,10,1703},{7,0,1077},{9,10,159},{11,0,28},{140,10,603},{6,0,1221},{136,10, +583},{6,11,152},{6,11,349},{6,11,1682},{7,11,1252},{8,11,112},{9,11,435},{9,11, +668},{10,11,290},{10,11,319},{10,11,815},{11,11,180},{11,11,837},{12,11,240},{13 +,11,152},{13,11,219},{142,11,158},{139,0,62},{132,10,515},{8,10,632},{8,10,697}, +{137,10,854},{134,0,1766},{132,11,581},{6,11,126},{7,11,573},{8,11,397},{142,11, +44},{150,0,28},{4,10,136},{5,10,551},{11,0,670},{150,0,25},{6,0,1665},{7,0,256}, +{7,0,1388},{138,0,499},{4,0,22},{5,0,10},{7,0,1576},{136,0,97},{134,10,1782},{5, +0,481},{7,10,1287},{9,10,44},{10,10,552},{10,10,642},{11,10,839},{12,10,274},{12 +,10,275},{12,10,372},{13,10,91},{142,10,125},{133,11,926},{7,11,1232},{137,11, +531},{6,0,134},{7,0,437},{7,0,1824},{9,0,37},{14,0,285},{142,0,371},{7,0,486},{8 +,0,155},{11,0,93},{140,0,164},{6,0,1391},{134,0,1442},{133,11,670},{133,0,591},{ +6,10,147},{7,10,886},{7,11,1957},{9,10,753},{138,10,268},{5,0,380},{5,0,650},{7, +0,1173},{136,0,310},{4,0,364},{7,0,1156},{7,0,1187},{137,0,409},{135,11,1621},{ +134,0,482},{133,11,506},{4,0,781},{6,0,487},{7,0,926},{8,0,263},{139,0,500},{138 +,10,137},{135,11,242},{139,11,96},{133,10,414},{135,10,1762},{134,0,804},{5,11, +834},{7,11,1202},{8,11,14},{9,11,481},{137,11,880},{134,10,599},{4,0,94},{135,0, +1265},{4,0,415},{132,0,417},{5,0,348},{6,0,522},{6,10,1749},{7,11,1526},{138,11, +465},{134,10,1627},{132,0,1012},{132,10,488},{4,11,357},{6,11,172},{7,11,143},{ +137,11,413},{4,10,83},{4,11,590},{146,11,76},{140,10,676},{7,11,287},{8,11,355}, +{9,11,293},{137,11,743},{134,10,278},{5,11,169},{6,0,1803},{7,11,333},{8,11,45}, +{18,0,165},{152,0,21},{12,10,97},{140,11,97},{4,0,408},{4,0,741},{135,0,500},{ +132,11,198},{7,10,388},{7,10,644},{139,10,781},{4,11,24},{5,11,140},{5,11,185},{ +7,11,1500},{11,11,565},{139,11,838},{6,0,1321},{7,10,229},{8,10,59},{9,0,257},{9 +,10,190},{10,10,378},{140,10,191},{4,11,334},{133,11,593},{135,11,1885},{134,0, +1138},{4,0,249},{6,0,73},{135,0,177},{133,0,576},{142,0,231},{137,0,288},{132,10 +,660},{7,10,1035},{138,10,737},{135,0,1487},{6,0,989},{7,10,690},{9,0,433},{9,10 +,587},{140,10,521},{7,0,1264},{7,0,1678},{11,0,945},{12,0,341},{12,0,471},{140,0 +,569},{132,11,709},{133,11,897},{5,11,224},{13,11,174},{146,11,52},{135,11,1840} +,{134,10,1744},{4,10,733},{9,10,194},{10,10,92},{11,10,198},{12,0,87},{12,10,84} +,{13,10,128},{144,0,74},{140,0,779},{135,0,538},{4,11,608},{133,11,497},{133,0, +413},{7,11,1375},{7,11,1466},{138,11,331},{136,0,495},{6,11,540},{136,11,136},{7 +,0,54},{8,0,312},{10,0,191},{10,0,614},{140,0,567},{5,11,999},{6,0,468},{7,0,567 +},{7,0,1478},{8,0,530},{142,0,290},{4,11,299},{7,10,306},{135,11,1004},{142,11, +296},{134,0,1484},{133,10,979},{6,0,609},{9,0,815},{12,11,137},{14,11,9},{14,11, +24},{142,11,64},{133,11,456},{6,0,484},{135,0,822},{133,10,178},{136,11,180},{ +132,11,755},{137,0,900},{135,0,1335},{6,0,1724},{135,0,2022},{135,11,1139},{4,10 +,390},{133,0,640},{6,0,1831},{138,11,633},{135,11,566},{4,11,890},{5,11,805},{5, +11,819},{5,11,961},{6,11,396},{6,11,1631},{6,11,1678},{7,11,1967},{7,11,2041},{9 +,11,630},{11,11,8},{11,11,1019},{12,11,176},{13,11,225},{14,11,292},{149,11,24}, +{132,0,474},{134,0,1103},{135,0,1504},{134,0,1576},{6,0,961},{6,0,1034},{140,0, +655},{11,11,514},{149,11,20},{5,0,305},{135,11,1815},{7,11,1505},{10,11,190},{10 +,11,634},{11,11,792},{12,11,358},{140,11,447},{5,11,0},{6,11,536},{7,11,604},{13 +,11,445},{145,11,126},{5,10,105},{135,0,1236},{4,0,480},{6,0,217},{6,0,302},{6,0 +,1642},{6,11,232},{6,11,412},{7,0,130},{7,0,837},{7,0,1321},{7,0,1547},{7,0,1657 +},{7,11,1074},{8,0,429},{8,11,9},{8,11,157},{8,11,786},{9,0,228},{9,11,196},{9, +11,352},{9,11,457},{10,11,337},{11,11,232},{11,11,877},{12,11,480},{12,11,546},{ +13,0,289},{13,0,343},{147,0,101},{5,10,438},{7,11,958},{9,10,694},{12,10,627},{ +13,10,210},{141,11,38},{4,11,382},{136,11,579},{7,0,278},{10,0,739},{11,0,708},{ +141,0,348},{4,11,212},{135,11,1206},{135,11,1898},{6,0,708},{6,0,1344},{152,10, +11},{137,11,768},{134,0,1840},{140,0,233},{8,10,25},{138,10,826},{5,11,655},{134 +,0,2017},{6,0,1488},{139,11,290},{132,10,308},{134,0,1590},{134,0,1800},{134,0, +1259},{6,11,231},{7,11,95},{8,11,423},{144,0,28},{133,11,300},{135,10,150},{136, +10,649},{7,11,1874},{137,11,641},{6,11,237},{7,11,611},{8,11,100},{9,11,416},{11 +,11,335},{12,11,173},{146,11,101},{137,0,45},{134,10,521},{14,11,26},{17,0,36},{ +146,11,150},{5,10,339},{7,0,1442},{14,0,22},{15,10,41},{15,10,166},{147,10,66},{ +6,11,581},{7,11,1119},{136,0,378},{134,0,1507},{147,11,117},{139,0,39},{134,0, +1054},{6,0,363},{7,0,1955},{136,0,725},{134,0,2036},{133,11,199},{6,0,1871},{9,0 +,935},{9,0,961},{9,0,1004},{9,0,1016},{12,0,805},{12,0,852},{12,0,853},{12,0,869 +},{12,0,882},{12,0,896},{12,0,906},{12,0,917},{12,0,940},{15,0,170},{15,0,176},{ +15,0,188},{15,0,201},{15,0,205},{15,0,212},{15,0,234},{15,0,244},{18,0,181},{18, +0,193},{18,0,196},{18,0,201},{18,0,202},{18,0,210},{18,0,217},{18,0,235},{18,0, +236},{18,0,237},{21,0,54},{21,0,55},{21,0,58},{21,0,59},{152,0,22},{134,10,1628} +,{137,0,805},{5,0,813},{135,0,2046},{142,11,42},{5,0,712},{6,0,1240},{11,0,17},{ +13,0,321},{144,0,67},{132,0,617},{135,10,829},{6,0,320},{7,0,781},{7,0,1921},{9, +0,55},{10,0,186},{10,0,273},{10,0,664},{10,0,801},{11,0,996},{11,0,997},{13,0, +157},{142,0,170},{136,0,271},{5,10,486},{135,10,1349},{18,11,91},{147,11,70},{7, +10,1635},{8,10,17},{10,0,445},{138,10,295},{136,11,404},{7,0,103},{7,0,863},{11, +0,184},{145,0,62},{138,10,558},{137,0,659},{6,11,312},{6,11,1715},{10,11,584},{ +11,11,546},{11,11,692},{12,11,259},{12,11,295},{13,11,46},{141,11,154},{134,0, +676},{132,11,588},{4,11,231},{5,11,61},{6,11,104},{7,11,729},{7,11,964},{7,11, +1658},{140,11,414},{6,11,263},{138,11,757},{11,0,337},{142,0,303},{135,11,1363}, +{132,11,320},{140,0,506},{134,10,447},{5,0,77},{7,0,1455},{10,0,843},{147,0,73}, +{7,10,577},{7,10,1432},{9,10,475},{9,10,505},{9,10,526},{9,10,609},{9,10,689},{9 +,10,726},{9,10,735},{9,10,738},{10,10,556},{10,10,674},{10,10,684},{11,10,89},{ +11,10,202},{11,10,272},{11,10,380},{11,10,415},{11,10,505},{11,10,537},{11,10, +550},{11,10,562},{11,10,640},{11,10,667},{11,10,688},{11,10,847},{11,10,927},{11 +,10,930},{11,10,940},{12,10,144},{12,10,325},{12,10,329},{12,10,389},{12,10,403} +,{12,10,451},{12,10,515},{12,10,604},{12,10,616},{12,10,626},{13,10,66},{13,10, +131},{13,10,167},{13,10,236},{13,10,368},{13,10,411},{13,10,434},{13,10,453},{13 +,10,461},{13,10,474},{14,10,59},{14,10,60},{14,10,139},{14,10,152},{14,10,276},{ +14,10,353},{14,10,402},{15,10,28},{15,10,81},{15,10,123},{15,10,152},{18,10,136} +,{148,10,88},{132,0,458},{135,0,1420},{4,10,609},{4,11,405},{6,0,109},{7,10,756} +,{7,11,817},{9,10,544},{10,0,382},{11,10,413},{14,10,307},{14,11,58},{16,10,25}, +{17,11,37},{146,11,124},{5,11,974},{6,0,330},{7,0,1084},{139,0,142},{4,10,930},{ +133,10,947},{5,10,939},{142,11,394},{16,0,91},{145,0,87},{5,10,962},{5,11,235},{ +7,11,1239},{11,11,131},{140,11,370},{5,10,651},{8,10,170},{9,10,61},{9,10,63},{ +10,10,23},{10,10,37},{10,10,834},{11,0,492},{11,10,4},{11,10,281},{11,10,503},{ +11,10,677},{12,10,96},{12,10,130},{12,10,244},{14,10,5},{14,10,40},{14,10,162},{ +14,10,202},{146,10,133},{4,10,406},{5,10,579},{12,10,492},{150,10,15},{9,11,137} +,{138,11,221},{134,0,1239},{11,0,211},{140,0,145},{7,11,390},{138,11,140},{135, +11,1418},{135,11,1144},{134,0,1049},{6,10,17},{7,0,321},{7,10,1001},{7,10,1982}, +{9,10,886},{10,10,489},{10,10,800},{11,10,782},{12,10,320},{13,10,467},{14,10, +145},{14,10,387},{143,10,119},{145,10,17},{5,11,407},{11,11,489},{19,11,37},{20, +11,73},{150,11,38},{133,10,458},{135,0,1985},{7,10,1983},{8,10,0},{8,10,171},{9, +10,120},{9,10,732},{10,10,473},{11,10,656},{11,10,998},{18,10,0},{18,10,2},{147, +10,21},{5,11,325},{7,11,1483},{8,11,5},{8,11,227},{9,11,105},{10,11,585},{140,11 +,614},{136,0,122},{132,0,234},{135,11,1196},{6,0,976},{6,0,1098},{134,0,1441},{7 +,0,253},{136,0,549},{6,11,621},{13,11,504},{144,11,19},{132,10,519},{5,0,430},{5 +,0,932},{6,0,131},{7,0,417},{9,0,522},{11,0,314},{141,0,390},{14,0,149},{14,0, +399},{143,0,57},{5,10,907},{6,10,31},{6,11,218},{7,10,491},{7,10,530},{8,10,592} +,{11,10,53},{11,10,779},{12,10,167},{12,10,411},{14,10,14},{14,10,136},{15,10,72 +},{16,10,17},{144,10,72},{140,11,330},{7,11,454},{7,11,782},{136,11,768},{132,0, +507},{10,11,676},{140,11,462},{4,10,208},{5,10,106},{6,0,630},{6,10,531},{8,10, +408},{9,0,811},{9,10,188},{138,10,572},{4,0,343},{5,0,511},{134,10,1693},{134,11 +,164},{132,0,448},{7,0,455},{138,0,591},{135,0,1381},{12,10,441},{150,11,50},{9, +10,449},{10,10,192},{138,10,740},{4,10,241},{134,0,575},{134,0,1175},{134,0,653} +,{134,0,1761},{134,0,1198},{132,10,259},{6,11,343},{7,11,195},{9,11,226},{10,11, +197},{10,11,575},{11,11,502},{139,11,899},{7,0,1127},{7,0,1572},{10,0,297},{10,0 +,422},{11,0,764},{11,0,810},{12,0,264},{13,0,102},{13,0,300},{13,0,484},{14,0, +147},{14,0,229},{17,0,71},{18,0,118},{147,0,120},{135,11,666},{132,0,678},{4,10, +173},{5,10,312},{5,10,512},{135,10,1285},{7,10,1603},{7,10,1691},{9,10,464},{11, +10,195},{12,10,279},{12,10,448},{14,10,11},{147,10,102},{16,0,99},{146,0,164},{7 +,11,1125},{9,11,143},{11,11,61},{14,11,405},{150,11,21},{137,11,260},{4,10,452}, +{5,10,583},{5,10,817},{6,10,433},{7,10,593},{7,10,720},{7,10,1378},{8,10,161},{9 +,10,284},{10,10,313},{139,10,886},{132,10,547},{136,10,722},{14,0,35},{142,0,191 +},{141,0,45},{138,0,121},{132,0,125},{134,0,1622},{133,11,959},{8,10,420},{139, +10,193},{132,0,721},{135,10,409},{136,0,145},{7,0,792},{8,0,147},{8,11,173},{10, +0,821},{11,0,970},{139,0,1021},{134,11,266},{132,0,715},{7,0,1999},{138,10,308}, +{133,0,531},{5,0,168},{5,0,930},{8,0,74},{9,0,623},{12,0,500},{140,0,579},{144,0 +,65},{138,11,246},{6,0,220},{7,0,1101},{13,0,105},{142,11,314},{5,10,1002},{136, +10,745},{134,0,960},{20,0,0},{148,11,0},{4,0,1005},{4,10,239},{6,10,477},{7,10, +1607},{11,10,68},{139,10,617},{6,0,19},{7,0,1413},{139,0,428},{149,10,13},{7,0, +96},{8,0,401},{8,0,703},{8,11,300},{137,0,896},{134,0,1595},{145,0,116},{136,0, +1021},{7,0,1961},{7,0,1965},{7,0,2030},{8,0,150},{8,0,702},{8,0,737},{8,0,750},{ +140,0,366},{11,11,75},{142,11,267},{132,10,367},{5,11,427},{5,11,734},{7,11,478} +,{8,0,800},{8,11,52},{9,0,148},{9,0,872},{9,0,890},{11,0,309},{11,0,1001},{13,0, +267},{141,0,323},{7,11,239},{11,11,217},{142,11,165},{132,11,323},{140,11,419},{ +13,0,299},{142,0,75},{6,11,87},{6,11,1734},{7,11,20},{7,11,1056},{8,11,732},{9, +11,406},{9,11,911},{138,11,694},{134,0,1383},{132,10,694},{133,11,613},{137,0, +779},{4,0,598},{140,10,687},{6,0,970},{135,0,424},{133,0,547},{7,11,32},{7,11, +984},{8,11,85},{8,11,709},{9,11,579},{9,11,847},{9,11,856},{10,11,799},{11,11, +258},{11,11,1007},{12,11,331},{12,11,615},{13,11,188},{13,11,435},{14,11,8},{15, +11,165},{16,11,27},{148,11,40},{6,0,1222},{134,0,1385},{132,0,876},{138,11,151}, +{135,10,213},{4,11,167},{135,11,82},{133,0,133},{6,11,24},{7,11,74},{7,11,678},{ +137,11,258},{5,11,62},{6,11,534},{7,11,684},{7,11,1043},{7,11,1072},{8,11,280},{ +8,11,541},{8,11,686},{10,11,519},{11,11,252},{140,11,282},{136,0,187},{8,0,8},{ +10,0,0},{10,0,818},{139,0,988},{132,11,359},{7,10,1672},{11,0,429},{143,0,51},{ +136,0,685},{5,11,211},{7,11,88},{136,11,627},{134,0,472},{136,0,132},{6,11,145}, +{141,11,336},{4,10,751},{11,10,390},{140,10,32},{4,10,409},{4,11,263},{5,10,78}, +{6,0,938},{134,0,1060},{137,0,874},{4,11,916},{6,10,473},{7,10,1602},{8,0,774},{ +10,0,670},{10,10,698},{12,0,51},{12,10,212},{13,10,307},{145,10,105},{146,0,92}, +{143,10,156},{132,0,830},{137,0,701},{4,11,599},{6,11,1634},{7,11,5},{7,11,55},{ +7,11,67},{7,11,97},{7,11,691},{7,11,979},{7,11,1697},{8,11,207},{8,11,214},{8,11 +,231},{8,11,294},{8,11,336},{8,11,428},{8,11,451},{8,11,460},{8,11,471},{8,11, +622},{8,11,626},{8,11,679},{8,11,759},{8,11,829},{9,11,11},{9,11,246},{9,11,484} +,{9,11,573},{9,11,706},{9,11,762},{9,11,798},{9,11,855},{9,11,870},{9,11,912},{ +10,11,303},{10,11,335},{10,11,424},{10,11,461},{10,11,543},{10,11,759},{10,11, +814},{11,11,59},{11,11,199},{11,11,235},{11,11,475},{11,11,590},{11,11,929},{11, +11,963},{12,11,114},{12,11,182},{12,11,226},{12,11,332},{12,11,439},{12,11,575}, +{12,11,598},{13,11,8},{13,11,125},{13,11,194},{13,11,287},{14,11,197},{14,11,383 +},{15,11,53},{17,11,63},{19,11,46},{19,11,98},{19,11,106},{148,11,85},{4,0,127}, +{5,0,350},{6,0,356},{8,0,426},{9,0,572},{10,0,247},{139,0,312},{134,0,1215},{6,0 +,59},{7,11,1853},{9,0,603},{10,11,437},{141,0,397},{134,0,1762},{147,11,126},{ +135,10,883},{13,0,293},{142,0,56},{133,10,617},{139,10,50},{5,11,187},{7,10,1518 +},{139,10,694},{135,0,441},{6,0,111},{7,0,4},{8,0,163},{8,0,776},{138,0,566},{ +132,0,806},{4,11,215},{9,11,38},{10,11,3},{11,11,23},{11,11,127},{139,11,796},{4 +,10,546},{7,10,2042},{142,0,233},{135,0,1994},{134,0,1739},{135,11,1530},{136,0, +393},{5,0,297},{7,0,1038},{14,0,359},{19,0,52},{148,0,47},{135,0,309},{4,10,313} +,{133,10,577},{8,10,184},{141,10,433},{135,10,935},{12,10,186},{12,10,292},{14, +10,100},{146,10,70},{136,0,363},{11,10,402},{12,10,109},{12,10,431},{13,10,179}, +{13,10,206},{14,0,175},{14,10,217},{16,10,3},{148,10,53},{5,10,886},{6,10,46},{6 +,10,1790},{7,10,14},{7,10,732},{7,10,1654},{8,10,95},{8,10,327},{8,10,616},{9,10 +,892},{10,10,598},{10,10,769},{11,10,134},{11,10,747},{12,10,378},{142,10,97},{ +136,0,666},{135,0,1675},{6,0,655},{134,0,1600},{135,0,808},{133,10,1021},{4,11, +28},{5,11,440},{7,11,248},{11,11,833},{140,11,344},{134,11,1654},{132,0,280},{ +140,0,54},{4,0,421},{133,0,548},{132,10,153},{6,11,339},{135,11,923},{133,11,853 +},{133,10,798},{132,10,587},{6,11,249},{7,11,1234},{139,11,573},{6,10,598},{7,10 +,42},{8,10,695},{10,10,212},{11,10,158},{14,10,196},{145,10,85},{5,10,957},{5,10 +,1008},{135,0,249},{4,10,129},{135,10,465},{6,0,254},{7,0,842},{7,0,1659},{7,10, +908},{7,10,1201},{9,0,109},{9,10,755},{10,0,103},{11,10,906},{12,10,527},{146,10 +,7},{5,0,262},{136,10,450},{144,0,1},{10,11,201},{142,11,319},{7,11,49},{7,11, +392},{8,11,20},{8,11,172},{8,11,690},{9,11,383},{9,11,845},{10,11,48},{11,11,293 +},{11,11,832},{11,11,920},{141,11,221},{5,11,858},{133,11,992},{134,0,805},{139, +10,1003},{6,0,1630},{134,11,307},{7,11,1512},{135,11,1794},{6,11,268},{137,11,62 +},{135,10,1868},{133,0,671},{4,0,989},{8,0,972},{136,0,998},{132,11,423},{132,0, +889},{135,0,1382},{135,0,1910},{7,10,965},{7,10,1460},{135,10,1604},{4,0,627},{5 +,0,775},{138,11,106},{134,11,348},{7,0,202},{11,0,362},{11,0,948},{140,0,388},{ +138,11,771},{6,11,613},{136,11,223},{6,0,560},{7,0,451},{8,0,389},{12,0,490},{13 +,0,16},{13,0,215},{13,0,351},{18,0,132},{147,0,125},{135,0,841},{136,0,566},{136 +,0,938},{132,11,670},{5,0,912},{6,0,1695},{140,11,55},{9,11,40},{139,11,136},{7, +0,1361},{7,10,982},{10,10,32},{143,10,56},{11,11,259},{140,11,270},{5,0,236},{6, +0,572},{8,0,492},{11,0,618},{144,0,56},{8,11,572},{9,11,310},{9,11,682},{137,11, +698},{134,0,1854},{5,0,190},{136,0,318},{133,10,435},{135,0,1376},{4,11,296},{6, +11,352},{7,11,401},{7,11,1410},{7,11,1594},{7,11,1674},{8,11,63},{8,11,660},{137 +,11,74},{5,10,85},{6,10,419},{7,0,349},{7,10,305},{7,10,361},{7,10,1337},{8,10, +71},{140,10,519},{4,11,139},{4,11,388},{140,11,188},{6,0,1972},{6,0,2013},{8,0, +951},{10,0,947},{10,0,974},{10,0,1018},{142,0,476},{140,10,688},{135,10,740},{5, +10,691},{7,10,345},{9,10,94},{140,10,169},{5,10,183},{6,10,582},{9,0,344},{10,10 +,679},{140,10,435},{135,10,511},{132,0,850},{8,11,441},{10,11,314},{143,11,3},{7 +,10,1993},{136,10,684},{4,11,747},{6,10,583},{6,11,290},{7,11,649},{7,11,1479},{ +135,11,1583},{133,11,232},{133,10,704},{134,0,910},{4,10,179},{5,10,198},{133,10 +,697},{7,10,347},{7,10,971},{8,10,181},{138,10,711},{136,11,525},{14,0,19},{14,0 +,28},{144,0,29},{7,0,85},{7,0,247},{8,0,585},{138,0,163},{4,0,487},{7,11,472},{7 +,11,1801},{10,11,748},{141,11,458},{4,10,243},{5,10,203},{7,10,19},{7,10,71},{7, +10,113},{10,10,405},{11,10,357},{142,10,240},{7,10,1450},{139,10,99},{132,11,425 +},{138,0,145},{147,0,83},{6,10,492},{137,11,247},{4,0,1013},{134,0,2033},{5,10, +134},{6,10,408},{6,10,495},{135,10,1593},{135,0,1922},{134,11,1768},{4,0,124},{ +10,0,457},{11,0,121},{11,0,169},{11,0,870},{11,0,874},{12,0,214},{14,0,187},{143 +,0,77},{5,0,557},{135,0,1457},{139,0,66},{5,11,943},{6,11,1779},{142,10,4},{4,10 +,248},{4,10,665},{7,10,137},{137,10,349},{5,11,245},{6,11,576},{7,0,1193},{7,11, +582},{136,11,225},{144,0,82},{7,10,1270},{139,10,612},{5,0,454},{10,0,352},{138, +11,352},{5,10,371},{7,10,563},{146,0,57},{135,0,1333},{6,0,107},{6,11,610},{7,0, +638},{7,0,1632},{137,0,396},{5,0,370},{134,0,1756},{4,10,374},{7,10,547},{7,10, +1700},{7,10,1833},{139,10,858},{133,0,204},{6,0,1305},{9,10,311},{141,10,42},{5, +0,970},{134,0,1706},{6,10,1647},{7,10,1552},{7,10,2010},{9,10,494},{137,10,509}, +{13,11,455},{15,11,99},{15,11,129},{144,11,68},{135,0,3},{4,0,35},{5,0,121},{5,0 +,483},{5,0,685},{6,0,489},{6,0,782},{6,0,1032},{7,0,1204},{136,0,394},{4,0,921}, +{133,0,1007},{8,11,360},{138,11,63},{135,0,1696},{134,0,1519},{132,11,443},{135, +11,944},{6,10,123},{7,10,214},{9,10,728},{10,10,157},{11,10,346},{11,10,662},{ +143,10,106},{137,0,981},{135,10,1435},{134,0,1072},{132,0,712},{134,0,1629},{134 +,0,728},{4,11,298},{137,11,483},{5,11,164},{6,0,1177},{6,0,1271},{7,11,121},{142 +,11,189},{4,10,707},{5,10,588},{6,10,393},{7,0,1608},{13,10,106},{18,10,49},{147 +,10,41},{23,0,16},{151,11,16},{6,10,211},{7,10,1690},{11,10,486},{140,10,369},{ +133,0,485},{19,11,15},{149,11,27},{4,11,172},{9,11,611},{10,11,436},{12,11,673}, +{141,11,255},{5,11,844},{10,11,484},{11,11,754},{12,11,457},{14,11,171},{14,11, +389},{146,11,153},{4,0,285},{5,0,27},{5,0,317},{6,0,301},{7,0,7},{8,0,153},{10,0 +,766},{11,0,468},{12,0,467},{141,0,143},{134,0,1462},{9,11,263},{10,11,147},{138 +,11,492},{133,11,537},{6,0,1945},{6,0,1986},{6,0,1991},{134,0,2038},{134,10,219} +,{137,11,842},{5,10,582},{6,10,1646},{7,10,99},{7,10,1962},{7,10,1986},{8,10,515 +},{8,10,773},{9,10,23},{9,10,491},{12,10,620},{14,0,52},{14,10,93},{145,0,50},{ +138,11,97},{5,10,851},{20,0,21},{148,0,44},{136,0,819},{139,0,917},{5,11,230},{5 +,11,392},{6,11,420},{8,10,762},{8,10,812},{9,10,910},{9,11,568},{140,11,612},{ +135,0,784},{15,0,135},{143,11,135},{10,0,454},{140,0,324},{4,11,0},{5,11,41},{7, +11,1459},{7,11,1469},{7,11,1618},{7,11,1859},{9,11,549},{139,11,905},{4,10,98},{ +7,10,1365},{9,10,422},{9,10,670},{10,10,775},{11,10,210},{13,10,26},{13,10,457}, +{141,10,476},{6,0,1719},{6,0,1735},{7,0,2016},{7,0,2020},{8,0,837},{137,0,852},{ +133,11,696},{135,0,852},{132,0,952},{134,10,1730},{132,11,771},{138,0,568},{137, +0,448},{139,0,146},{8,0,67},{138,0,419},{133,11,921},{137,10,147},{134,0,1826},{ +10,0,657},{14,0,297},{142,0,361},{6,0,666},{6,0,767},{134,0,1542},{139,0,729},{6 +,11,180},{7,11,1137},{8,11,751},{139,11,805},{4,11,183},{7,11,271},{11,11,824},{ +11,11,952},{13,11,278},{13,11,339},{13,11,482},{14,11,424},{148,11,99},{4,0,669} +,{5,11,477},{5,11,596},{6,11,505},{7,11,1221},{11,11,907},{12,11,209},{141,11, +214},{135,11,1215},{5,0,402},{6,10,30},{11,10,56},{139,10,305},{7,11,564},{142, +11,168},{139,0,152},{7,0,912},{135,10,1614},{4,10,150},{5,10,303},{134,10,327},{ +7,0,320},{8,0,51},{9,0,868},{10,0,833},{12,0,481},{12,0,570},{148,0,106},{132,0, +445},{7,11,274},{11,11,263},{11,11,479},{11,11,507},{140,11,277},{6,11,1645},{8, +10,192},{10,0,555},{10,10,78},{11,0,308},{13,10,359},{147,0,95},{135,10,786},{6, +11,92},{6,11,188},{7,11,1269},{7,11,1524},{7,11,1876},{10,11,228},{139,11,1020}, +{4,11,459},{133,11,966},{6,10,1638},{7,10,79},{7,10,496},{9,10,138},{10,10,336}, +{11,0,386},{12,10,412},{12,10,440},{142,10,305},{133,0,239},{7,0,83},{7,0,1990}, +{8,0,130},{139,0,720},{138,11,709},{4,0,143},{5,0,550},{133,0,752},{5,0,123},{6, +0,530},{7,0,348},{135,0,1419},{135,0,2024},{6,11,18},{7,11,179},{7,11,721},{7,11 +,932},{8,11,548},{8,11,757},{9,11,54},{9,11,65},{9,11,532},{9,11,844},{10,11,113 +},{10,11,117},{10,11,236},{10,11,315},{10,11,430},{10,11,798},{11,11,153},{11,11 +,351},{11,11,375},{12,11,78},{12,11,151},{12,11,392},{14,11,248},{143,11,23},{7, +10,204},{7,10,415},{8,10,42},{10,10,85},{139,10,564},{134,0,958},{133,11,965},{ +132,0,210},{135,11,1429},{138,11,480},{134,11,182},{139,11,345},{10,11,65},{10, +11,488},{138,11,497},{4,10,3},{5,10,247},{5,10,644},{7,10,744},{7,10,1207},{7,10 +,1225},{7,10,1909},{146,10,147},{132,0,430},{5,10,285},{9,10,67},{13,10,473},{ +143,10,82},{144,11,16},{7,11,1162},{9,11,588},{10,11,260},{151,10,8},{133,0,213} +,{138,0,7},{135,0,801},{134,11,1786},{135,11,308},{6,0,936},{134,0,1289},{133,0, +108},{132,0,885},{133,0,219},{139,0,587},{4,0,193},{5,0,916},{6,0,1041},{7,0,364 +},{10,0,398},{10,0,726},{11,0,317},{11,0,626},{12,0,142},{12,0,288},{12,0,678},{ +13,0,313},{15,0,113},{146,0,114},{135,0,1165},{6,0,241},{9,0,342},{10,0,729},{11 +,0,284},{11,0,445},{11,0,651},{11,0,863},{13,0,398},{146,0,99},{7,0,907},{136,0, +832},{4,10,29},{6,10,532},{7,10,1628},{7,10,1648},{9,0,303},{9,10,350},{10,10, +433},{11,10,97},{11,10,557},{11,10,745},{12,10,289},{12,10,335},{12,10,348},{12, +10,606},{13,10,116},{13,10,233},{13,10,466},{14,10,181},{14,10,209},{14,10,232}, +{14,10,236},{14,10,300},{16,10,41},{148,10,97},{7,10,1692},{7,11,423},{136,11, +588},{6,0,931},{134,0,1454},{5,10,501},{7,10,1704},{9,10,553},{11,10,520},{12,10 +,557},{141,10,249},{136,11,287},{4,0,562},{9,0,254},{139,0,879},{132,0,786},{14, +11,32},{18,11,85},{20,11,2},{152,11,16},{135,0,1294},{7,11,723},{135,11,1135},{6 +,0,216},{6,11,403},{7,0,901},{7,0,1343},{136,0,493},{7,11,719},{8,11,809},{136, +11,834},{5,11,210},{6,11,213},{7,11,60},{10,11,364},{139,11,135},{5,11,607},{7,0 +,341},{8,11,326},{8,11,490},{139,0,219},{4,11,701},{5,11,472},{5,11,639},{7,11, +1249},{9,11,758},{139,11,896},{135,11,380},{135,11,1947},{139,0,130},{135,0,1734 +},{10,0,115},{11,0,420},{12,0,154},{13,0,404},{14,0,346},{143,0,54},{134,10,129} +,{4,11,386},{7,11,41},{8,11,405},{9,11,497},{11,11,110},{11,11,360},{15,11,37},{ +144,11,84},{141,11,282},{5,11,46},{7,11,1452},{7,11,1480},{8,11,634},{140,11,472 +},{4,11,524},{136,11,810},{10,11,238},{141,11,33},{133,0,604},{5,0,1011},{136,0, +701},{8,0,856},{8,0,858},{8,0,879},{12,0,702},{142,0,447},{4,0,54},{5,0,666},{7, +0,1039},{7,0,1130},{9,0,195},{138,0,302},{4,10,25},{5,10,60},{6,10,504},{7,10, +614},{7,10,1155},{140,10,0},{7,10,1248},{11,10,621},{139,10,702},{133,11,997},{ +137,10,321},{134,0,1669},{134,0,1791},{4,10,379},{135,10,1397},{138,11,372},{5, +11,782},{5,11,829},{134,11,1738},{135,0,1228},{4,10,118},{6,10,274},{6,10,361},{ +7,10,75},{141,10,441},{132,0,623},{9,11,279},{10,11,407},{14,11,84},{150,11,18}, +{137,10,841},{135,0,798},{140,10,693},{5,10,314},{6,10,221},{7,10,419},{10,10, +650},{11,10,396},{12,10,156},{13,10,369},{14,10,333},{145,10,47},{135,11,1372},{ +7,0,122},{9,0,259},{10,0,84},{11,0,470},{12,0,541},{141,0,379},{134,0,837},{4,11 +,78},{5,11,96},{5,11,182},{7,11,1724},{7,11,1825},{8,0,1013},{10,11,394},{10,11, +471},{11,11,532},{14,11,340},{145,11,88},{134,0,577},{135,11,1964},{132,10,913}, +{134,0,460},{8,0,891},{10,0,901},{10,0,919},{10,0,932},{12,0,715},{12,0,728},{12 +,0,777},{14,0,457},{144,0,103},{5,0,82},{5,0,131},{7,0,1755},{8,0,31},{9,0,168}, +{9,0,764},{139,0,869},{136,10,475},{5,10,1016},{6,0,605},{9,11,601},{9,11,619},{ +10,11,505},{10,11,732},{11,11,355},{140,11,139},{7,10,602},{8,10,179},{10,10,781 +},{140,10,126},{134,0,1246},{6,10,329},{138,10,111},{6,11,215},{7,11,1028},{7,11 +,1473},{7,11,1721},{9,11,424},{138,11,779},{5,0,278},{137,0,68},{6,0,932},{6,0, +1084},{144,0,86},{4,0,163},{5,0,201},{5,0,307},{5,0,310},{6,0,335},{7,0,284},{7, +0,1660},{136,0,165},{136,0,781},{134,0,707},{6,0,33},{135,0,1244},{5,10,821},{6, +10,1687},{6,11,67},{7,11,258},{7,11,1630},{9,11,354},{9,11,675},{10,11,830},{14, +11,80},{145,11,80},{6,11,141},{7,11,225},{9,11,59},{9,11,607},{10,11,312},{11,11 +,687},{12,11,555},{13,11,373},{13,11,494},{148,11,58},{134,0,1113},{5,10,71},{7, +10,1407},{9,0,388},{9,10,704},{10,10,261},{10,10,619},{11,10,547},{11,10,619},{ +143,10,157},{7,0,1953},{136,0,720},{138,0,203},{7,10,2008},{9,10,337},{138,10, +517},{6,0,326},{7,0,677},{137,0,425},{139,11,81},{7,0,1316},{7,0,1412},{7,0,1839 +},{9,0,589},{11,0,241},{11,0,676},{11,0,811},{11,0,891},{12,0,140},{12,0,346},{ +12,0,479},{13,0,140},{13,0,381},{14,0,188},{18,0,30},{148,0,108},{5,0,416},{6,10 +,86},{6,10,603},{7,10,292},{7,10,561},{8,10,257},{8,10,382},{9,10,721},{9,10,778 +},{11,10,581},{140,10,466},{4,10,486},{133,10,491},{134,0,1300},{132,10,72},{6, +10,265},{7,0,847},{7,11,430},{139,11,46},{5,11,602},{6,11,106},{7,11,1786},{7,11 +,1821},{7,11,2018},{9,11,418},{137,11,763},{5,0,358},{7,0,535},{7,0,1184},{10,0, +662},{13,0,212},{13,0,304},{13,0,333},{145,0,98},{5,11,65},{6,11,416},{7,11,1720 +},{7,11,1924},{8,11,677},{10,11,109},{11,11,14},{11,11,70},{11,11,569},{11,11, +735},{15,11,153},{148,11,80},{6,0,1823},{8,0,839},{8,0,852},{8,0,903},{10,0,940} +,{12,0,707},{140,0,775},{135,11,1229},{6,0,1522},{140,0,654},{136,11,595},{139,0 +,163},{141,0,314},{132,0,978},{4,0,601},{6,0,2035},{137,10,234},{5,10,815},{6,10 +,1688},{134,10,1755},{133,0,946},{136,0,434},{6,10,197},{136,10,205},{7,0,411},{ +7,0,590},{8,0,631},{9,0,323},{10,0,355},{11,0,491},{12,0,143},{12,0,402},{13,0, +73},{14,0,408},{15,0,107},{146,0,71},{7,0,1467},{8,0,328},{10,0,544},{11,0,955}, +{12,0,13},{13,0,320},{145,0,83},{142,0,410},{11,0,511},{13,0,394},{14,0,298},{14 +,0,318},{146,0,103},{6,10,452},{7,10,312},{138,10,219},{138,10,589},{4,10,333},{ +9,10,176},{12,10,353},{141,10,187},{135,11,329},{132,11,469},{5,0,835},{134,0, +483},{134,11,1743},{5,11,929},{6,11,340},{8,11,376},{136,11,807},{134,10,1685},{ +132,0,677},{5,11,218},{7,11,1610},{138,11,83},{5,11,571},{135,11,1842},{132,11, +455},{137,0,70},{135,0,1405},{7,10,135},{8,10,7},{8,10,62},{9,10,243},{10,10,658 +},{10,10,697},{11,10,456},{139,10,756},{9,10,395},{138,10,79},{137,0,108},{6,11, +161},{7,11,372},{137,11,597},{132,11,349},{132,0,777},{132,0,331},{135,10,631},{ +133,0,747},{6,11,432},{6,11,608},{139,11,322},{138,10,835},{5,11,468},{7,11,1809 +},{10,11,325},{11,11,856},{12,11,345},{143,11,104},{133,11,223},{7,10,406},{7,10 +,459},{8,10,606},{139,10,726},{132,11,566},{142,0,68},{4,11,59},{135,11,1394},{6 +,11,436},{139,11,481},{4,11,48},{5,11,271},{135,11,953},{139,11,170},{5,11,610}, +{136,11,457},{133,11,755},{135,11,1217},{133,10,612},{132,11,197},{132,0,505},{4 +,10,372},{7,10,482},{8,10,158},{9,10,602},{9,10,615},{10,10,245},{10,10,678},{10 +,10,744},{11,10,248},{139,10,806},{133,0,326},{5,10,854},{135,10,1991},{4,0,691} +,{146,0,16},{6,0,628},{9,0,35},{10,0,680},{10,0,793},{11,0,364},{13,0,357},{143, +0,164},{138,0,654},{6,0,32},{7,0,385},{7,0,757},{7,0,1916},{8,0,37},{8,0,94},{8, +0,711},{9,0,541},{10,0,162},{10,0,795},{11,0,989},{11,0,1010},{12,0,14},{142,0, +308},{133,11,217},{6,0,152},{6,0,349},{6,0,1682},{7,0,1252},{8,0,112},{9,0,435}, +{9,0,668},{10,0,290},{10,0,319},{10,0,815},{11,0,180},{11,0,837},{12,0,240},{13, +0,152},{13,0,219},{142,0,158},{4,0,581},{134,0,726},{5,10,195},{135,10,1685},{6, +0,126},{7,0,573},{8,0,397},{142,0,44},{138,0,89},{7,10,1997},{8,10,730},{139,10, +1006},{134,0,1531},{134,0,1167},{5,0,926},{5,10,751},{140,0,203},{4,11,165},{7, +11,1398},{135,11,1829},{7,0,1232},{137,0,531},{135,10,821},{134,0,943},{133,0, +670},{4,0,880},{139,0,231},{134,0,1617},{135,0,1957},{5,11,9},{7,11,297},{7,11, +966},{140,11,306},{6,0,975},{134,0,985},{5,10,950},{5,10,994},{134,10,351},{12, +11,21},{151,11,7},{5,11,146},{6,11,411},{138,11,721},{7,0,242},{135,0,1942},{6, +11,177},{135,11,467},{5,0,421},{7,10,47},{137,10,684},{5,0,834},{7,0,1202},{8,0, +14},{9,0,481},{137,0,880},{138,0,465},{4,10,350},{6,0,688},{137,0,834},{132,0, +855},{4,0,357},{6,0,172},{7,0,143},{137,0,413},{133,11,200},{132,0,590},{7,10, +1812},{13,10,259},{13,10,356},{14,10,242},{147,10,114},{133,10,967},{4,10,473},{ +7,10,623},{8,10,808},{9,10,871},{9,10,893},{11,0,114},{11,10,431},{12,10,112},{ +12,10,217},{12,10,243},{12,10,562},{12,10,663},{12,10,683},{13,10,141},{13,10, +197},{13,10,227},{13,10,406},{13,10,487},{14,10,156},{14,10,203},{14,10,224},{14 +,10,256},{18,10,58},{150,10,0},{138,10,286},{4,10,222},{7,10,286},{136,10,629},{ +5,0,169},{7,0,333},{136,0,45},{134,11,481},{132,0,198},{4,0,24},{4,11,84},{5,0, +140},{5,0,185},{7,0,1500},{7,11,1482},{10,11,76},{10,11,142},{11,0,565},{139,0, +838},{133,0,585},{141,10,306},{133,11,1015},{4,11,315},{5,11,507},{135,11,1370}, +{136,10,146},{6,0,691},{134,0,1503},{4,0,334},{133,0,593},{4,10,465},{135,10, +1663},{142,11,173},{135,0,913},{6,11,1722},{140,0,116},{134,0,1360},{132,0,802}, +{8,11,222},{8,11,476},{9,11,238},{11,11,516},{11,11,575},{15,11,109},{146,11,100 +},{6,0,308},{7,10,138},{7,10,517},{9,0,673},{139,10,238},{132,0,709},{6,0,1876}, +{6,0,1895},{9,0,994},{9,0,1006},{12,0,829},{12,0,888},{12,0,891},{146,0,185},{ +148,10,94},{4,0,228},{133,0,897},{5,10,495},{7,0,1840},{7,10,834},{9,10,733},{ +139,10,378},{133,10,559},{6,10,21},{6,10,1737},{7,10,1444},{136,10,224},{4,0,608 +},{133,0,497},{6,11,40},{135,11,1781},{134,0,1573},{135,0,2039},{6,0,540},{136,0 +,136},{4,0,897},{5,0,786},{133,10,519},{6,0,1878},{6,0,1884},{9,0,938},{9,0,948} +,{9,0,955},{9,0,973},{9,0,1012},{12,0,895},{12,0,927},{143,0,254},{134,0,1469},{ +133,0,999},{4,0,299},{135,0,1004},{4,0,745},{133,0,578},{136,11,574},{133,0,456} +,{134,0,1457},{4,10,402},{135,0,1679},{7,0,693},{8,0,180},{8,10,323},{8,10,479}, +{140,0,163},{11,10,580},{142,10,201},{5,10,59},{135,10,672},{132,11,354},{146,10 +,34},{4,0,755},{135,11,1558},{7,0,1740},{146,0,48},{4,10,85},{135,10,549},{139,0 +,338},{133,10,94},{134,0,1091},{135,11,469},{5,11,830},{12,0,695},{12,0,704},{14 +,11,338},{20,0,113},{148,11,81},{135,0,1464},{6,10,11},{135,10,187},{135,0,975}, +{4,10,522},{141,0,335},{134,0,1979},{5,11,496},{135,11,203},{4,10,52},{135,10, +661},{7,0,1566},{8,0,269},{9,0,212},{9,0,718},{14,0,15},{14,0,132},{142,0,227},{ +4,0,890},{4,10,383},{5,0,805},{5,0,819},{5,0,961},{5,10,520},{6,0,396},{6,0,1631 +},{6,0,1678},{7,0,1967},{7,0,2041},{9,0,630},{11,0,8},{11,0,1019},{12,0,176},{13 +,0,225},{14,0,292},{149,0,24},{134,11,547},{135,11,1748},{5,11,88},{137,11,239}, +{146,11,128},{7,11,650},{135,11,1310},{4,10,281},{5,10,38},{7,10,194},{7,10,668} +,{7,10,1893},{137,10,397},{135,0,1815},{9,10,635},{139,10,559},{7,0,1505},{10,0, +190},{10,0,634},{11,0,792},{12,0,358},{140,0,447},{5,0,0},{6,0,536},{7,0,604},{ +13,0,445},{145,0,126},{7,11,1076},{9,11,80},{11,11,78},{11,11,421},{11,11,534},{ +140,11,545},{8,0,966},{10,0,1023},{14,11,369},{146,11,72},{135,11,1641},{6,0,232 +},{6,0,412},{7,0,1074},{8,0,9},{8,0,157},{8,0,786},{9,0,196},{9,0,352},{9,0,457} +,{10,0,337},{11,0,232},{11,0,877},{12,0,480},{140,0,546},{135,0,958},{4,0,382},{ +136,0,579},{4,0,212},{135,0,1206},{4,11,497},{5,11,657},{135,11,1584},{132,0,681 +},{8,0,971},{138,0,965},{5,10,448},{136,10,535},{14,0,16},{146,0,44},{11,0,584}, +{11,0,616},{11,11,584},{11,11,616},{14,0,275},{142,11,275},{136,11,13},{7,10,610 +},{135,10,1501},{7,11,642},{8,11,250},{11,11,123},{11,11,137},{13,11,48},{142,11 +,95},{133,0,655},{17,0,67},{147,0,74},{134,0,751},{134,0,1967},{6,0,231},{136,0, +423},{5,0,300},{138,0,1016},{4,10,319},{5,10,699},{138,10,673},{6,0,237},{6,10, +336},{7,0,611},{8,0,100},{8,10,552},{9,0,416},{9,10,285},{10,10,99},{11,0,335},{ +11,10,568},{12,0,173},{146,0,101},{134,0,1370},{7,10,1406},{9,10,218},{141,10, +222},{133,10,256},{135,0,1208},{14,11,213},{148,11,38},{6,0,1219},{135,11,1642}, +{13,0,417},{14,0,129},{143,0,15},{10,11,545},{140,11,301},{17,10,39},{148,10,36} +,{133,0,199},{4,11,904},{133,11,794},{12,0,427},{146,0,38},{134,0,949},{7,10,634 +},{136,0,665},{132,10,618},{135,10,259},{132,10,339},{133,11,761},{141,10,169},{ +132,10,759},{5,0,688},{7,0,539},{135,0,712},{7,11,386},{138,11,713},{134,0,1186} +,{6,11,7},{6,11,35},{7,11,147},{7,11,1069},{7,11,1568},{7,11,1575},{7,11,1917},{ +8,11,43},{8,11,208},{9,11,128},{9,11,866},{10,11,20},{11,11,981},{147,11,33},{7, +11,893},{8,10,482},{141,11,424},{6,0,312},{6,0,1715},{10,0,584},{11,0,546},{11,0 +,692},{12,0,259},{12,0,295},{13,0,46},{141,0,154},{5,10,336},{6,10,341},{6,10, +478},{6,10,1763},{136,10,386},{137,0,151},{132,0,588},{152,0,4},{6,11,322},{9,11 +,552},{11,11,274},{13,11,209},{13,11,499},{14,11,85},{15,11,126},{145,11,70},{ +135,10,73},{4,0,231},{5,0,61},{6,0,104},{7,0,729},{7,0,964},{7,0,1658},{140,0, +414},{6,0,263},{138,0,757},{135,10,1971},{4,0,612},{133,0,561},{132,0,320},{135, +10,1344},{8,11,83},{8,11,817},{9,11,28},{9,11,29},{9,11,885},{10,11,387},{11,11, +633},{11,11,740},{13,11,235},{13,11,254},{15,11,143},{143,11,146},{5,10,396},{ +134,10,501},{140,11,49},{132,0,225},{4,10,929},{5,10,799},{8,10,46},{136,10,740} +,{4,0,405},{7,0,817},{14,0,58},{17,0,37},{146,0,124},{133,0,974},{4,11,412},{133 +,11,581},{4,10,892},{133,10,770},{4,0,996},{134,0,2026},{4,0,527},{5,0,235},{7,0 +,1239},{11,0,131},{140,0,370},{7,11,421},{9,0,16},{141,0,386},{7,0,956},{7,0, +1157},{7,0,1506},{7,0,1606},{7,0,1615},{7,0,1619},{7,0,1736},{7,0,1775},{8,0,590 +},{9,0,324},{9,0,736},{9,0,774},{9,0,776},{9,0,784},{10,0,567},{10,0,708},{11,0, +518},{11,0,613},{11,0,695},{11,0,716},{11,0,739},{11,0,770},{11,0,771},{11,0,848 +},{11,0,857},{11,0,931},{11,0,947},{12,0,326},{12,0,387},{12,0,484},{12,0,528},{ +12,0,552},{12,0,613},{13,0,189},{13,0,256},{13,0,340},{13,0,432},{13,0,436},{13, +0,440},{13,0,454},{14,0,174},{14,0,220},{14,0,284},{14,0,390},{145,0,121},{135, +10,158},{9,0,137},{138,0,221},{4,11,110},{10,11,415},{10,11,597},{142,11,206},{ +141,11,496},{135,11,205},{151,10,25},{135,11,778},{7,10,2001},{7,11,1656},{9,11, +369},{10,11,338},{10,11,490},{11,11,154},{11,11,545},{11,11,775},{13,11,77},{141 +,11,274},{4,11,444},{10,11,146},{140,11,9},{7,0,390},{138,0,140},{135,0,1144},{ +134,0,464},{7,10,1461},{140,10,91},{132,10,602},{4,11,283},{135,11,1194},{5,0, +407},{11,0,204},{11,0,243},{11,0,489},{12,0,293},{19,0,37},{20,0,73},{150,0,38}, +{7,0,1218},{136,0,303},{4,10,13},{5,0,325},{5,10,567},{7,10,1498},{8,0,5},{8,0, +227},{9,0,105},{9,10,124},{10,0,585},{11,10,521},{12,0,614},{140,10,405},{135,10 +,1006},{6,11,1720},{7,0,800},{138,0,12},{135,0,1783},{132,10,735},{138,10,812},{ +4,10,170},{135,10,323},{6,0,621},{13,0,504},{144,0,89},{5,10,304},{135,10,1403}, +{137,11,216},{6,0,920},{6,0,1104},{9,11,183},{139,11,286},{4,0,376},{133,10,742} +,{134,0,218},{8,0,641},{11,0,388},{140,0,580},{7,0,454},{7,0,782},{8,0,768},{140 +,0,686},{137,11,33},{133,10,111},{144,0,0},{10,0,676},{140,0,462},{6,0,164},{136 +,11,735},{133,10,444},{150,0,50},{7,11,1862},{12,11,491},{12,11,520},{13,11,383} +,{14,11,244},{146,11,12},{5,11,132},{9,11,486},{9,11,715},{10,11,458},{11,11,373 +},{11,11,668},{11,11,795},{11,11,897},{12,11,272},{12,11,424},{12,11,539},{12,11 +,558},{14,11,245},{14,11,263},{14,11,264},{14,11,393},{142,11,403},{8,10,123},{ +15,10,6},{144,10,7},{6,0,285},{8,0,654},{11,0,749},{12,0,190},{12,0,327},{13,0, +120},{13,0,121},{13,0,327},{15,0,47},{146,0,40},{5,11,8},{6,11,89},{6,11,400},{7 +,11,1569},{7,11,1623},{7,11,1850},{8,11,218},{8,11,422},{9,11,570},{138,11,626}, +{6,11,387},{7,11,882},{141,11,111},{6,0,343},{6,11,224},{7,0,195},{7,11,877},{9, +0,226},{9,11,647},{10,0,197},{10,0,575},{11,0,502},{139,0,899},{5,10,937},{135, +10,100},{135,11,790},{150,0,29},{147,0,8},{134,0,1812},{149,0,8},{135,11,394},{7 +,0,1125},{9,0,143},{11,0,61},{14,0,405},{150,0,21},{10,11,755},{147,11,29},{9,11 +,378},{141,11,162},{135,10,922},{5,10,619},{133,10,698},{134,0,1327},{6,0,1598}, +{137,0,575},{9,11,569},{12,11,12},{12,11,81},{12,11,319},{13,11,69},{14,11,259}, +{16,11,87},{17,11,1},{17,11,21},{17,11,24},{18,11,15},{18,11,56},{18,11,59},{18, +11,127},{18,11,154},{19,11,19},{148,11,31},{6,0,895},{135,11,1231},{5,0,959},{7, +11,124},{136,11,38},{5,11,261},{7,11,78},{7,11,199},{8,11,815},{9,11,126},{138, +11,342},{5,10,917},{134,10,1659},{5,11,595},{7,0,1759},{135,11,1863},{136,0,173} +,{134,0,266},{142,0,261},{132,11,628},{5,10,251},{5,10,956},{8,10,268},{9,10,214 +},{146,10,142},{7,11,266},{136,11,804},{135,11,208},{6,11,79},{7,11,1021},{135, +11,1519},{11,11,704},{141,11,396},{5,10,346},{5,10,711},{136,10,390},{136,11,741 +},{134,11,376},{134,0,1427},{6,0,1033},{6,0,1217},{136,0,300},{133,10,624},{6,11 +,100},{7,11,244},{7,11,632},{7,11,1609},{8,11,178},{8,11,638},{141,11,58},{5,10, +783},{6,0,584},{7,10,1998},{135,10,2047},{5,0,427},{5,0,734},{7,0,478},{136,0,52 +},{7,0,239},{11,0,217},{142,0,165},{134,0,1129},{6,0,168},{6,0,1734},{7,0,20},{7 +,0,1056},{8,0,732},{9,0,406},{9,0,911},{138,0,694},{132,10,594},{133,11,791},{7, +11,686},{8,11,33},{8,11,238},{10,11,616},{11,11,467},{11,11,881},{13,11,217},{13 +,11,253},{142,11,268},{137,11,476},{134,0,418},{133,0,613},{132,0,632},{132,11, +447},{7,0,32},{7,0,984},{8,0,85},{8,0,709},{9,0,579},{9,0,847},{9,0,856},{10,0, +799},{11,0,258},{11,0,1007},{12,0,331},{12,0,615},{13,0,188},{13,0,435},{14,0,8} +,{15,0,165},{16,0,27},{16,11,35},{148,0,40},{4,11,128},{5,11,415},{6,11,462},{7, +11,294},{7,11,578},{10,11,710},{139,11,86},{5,0,694},{136,0,909},{5,10,37},{6,10 +,39},{6,10,451},{7,0,1109},{7,10,218},{7,10,1166},{7,10,1687},{8,10,662},{11,0,7 +},{144,10,2},{136,11,587},{6,11,427},{7,11,1018},{138,11,692},{4,11,195},{6,10, +508},{135,11,802},{4,0,167},{135,0,82},{5,0,62},{6,0,24},{6,0,534},{7,0,74},{7,0 +,678},{7,0,684},{7,0,1043},{7,0,1072},{8,0,280},{8,0,541},{8,0,686},{9,0,258},{ +10,0,519},{11,0,252},{140,0,282},{138,0,33},{4,0,359},{133,11,738},{7,0,980},{7, +10,635},{7,10,796},{8,10,331},{9,0,328},{9,10,330},{9,10,865},{10,10,119},{10,10 +,235},{11,10,111},{11,10,129},{11,10,240},{12,10,31},{12,10,66},{12,10,222},{12, +10,269},{12,10,599},{12,10,684},{12,10,689},{12,10,691},{13,0,186},{13,0,364},{ +142,10,345},{137,10,527},{6,0,596},{7,0,585},{135,10,702},{134,11,1683},{133,0, +211},{6,0,145},{141,0,336},{134,0,1130},{6,10,37},{7,0,873},{7,10,1666},{8,10, +195},{8,10,316},{9,10,178},{9,10,276},{9,10,339},{9,10,536},{10,10,102},{10,10, +362},{10,10,785},{11,10,55},{11,10,149},{11,10,773},{13,10,416},{13,10,419},{14, +10,38},{14,10,41},{142,10,210},{8,0,840},{136,0,841},{132,0,263},{5,11,3},{8,11, +578},{9,11,118},{10,11,705},{12,11,383},{141,11,279},{132,0,916},{133,11,229},{ +133,10,645},{8,11,102},{10,11,578},{10,11,672},{12,11,496},{13,11,408},{14,11, +121},{15,0,155},{16,0,79},{145,11,106},{4,0,599},{5,0,592},{6,0,1634},{7,0,5},{7 +,0,55},{7,0,67},{7,0,97},{7,0,691},{7,0,979},{7,0,1600},{7,0,1697},{8,0,207},{8, +0,214},{8,0,231},{8,0,294},{8,0,336},{8,0,428},{8,0,471},{8,0,622},{8,0,626},{8, +0,679},{8,0,759},{8,0,829},{9,0,11},{9,0,246},{9,0,484},{9,0,573},{9,0,706},{9,0 +,762},{9,0,798},{9,0,855},{9,0,870},{9,0,912},{10,0,303},{10,0,335},{10,0,424},{ +10,0,461},{10,0,543},{10,0,759},{10,0,814},{11,0,59},{11,0,199},{11,0,235},{11,0 +,590},{11,0,631},{11,0,929},{11,0,963},{11,0,987},{12,0,114},{12,0,182},{12,0, +226},{12,0,332},{12,0,439},{12,0,575},{12,0,598},{12,0,675},{13,0,8},{13,0,125}, +{13,0,194},{13,0,287},{14,0,197},{14,0,383},{15,0,53},{17,0,63},{19,0,46},{19,0, +98},{19,0,106},{148,0,85},{4,10,290},{135,0,1356},{6,10,70},{7,10,1292},{10,10, +762},{139,10,288},{150,11,55},{4,0,593},{8,11,115},{8,11,350},{9,11,489},{10,11, +128},{11,11,306},{12,11,373},{14,11,30},{17,11,79},{147,11,80},{135,11,1235},{ +134,0,1392},{4,11,230},{133,11,702},{147,0,126},{7,10,131},{7,10,422},{8,10,210} +,{140,10,573},{134,0,1179},{139,11,435},{139,10,797},{134,11,1728},{4,0,162},{18 +,11,26},{19,11,42},{20,11,43},{21,11,0},{23,11,27},{152,11,14},{132,10,936},{5, +10,453},{6,0,765},{134,10,441},{133,0,187},{135,0,1286},{6,0,635},{6,0,904},{6,0 +,1210},{134,0,1489},{4,0,215},{8,0,890},{9,0,38},{10,0,923},{11,0,23},{11,0,127} +,{139,0,796},{6,0,1165},{134,0,1306},{7,0,716},{13,0,97},{141,0,251},{132,10,653 +},{136,0,657},{146,10,80},{5,11,622},{7,11,1032},{11,11,26},{11,11,213},{11,11, +707},{12,11,380},{13,11,226},{141,11,355},{5,11,70},{6,0,299},{6,11,334},{9,11, +171},{11,11,637},{12,11,202},{14,11,222},{145,11,42},{142,0,134},{4,11,23},{5,11 +,313},{5,11,1014},{6,11,50},{6,11,51},{7,11,142},{7,11,384},{9,11,783},{139,11, +741},{4,11,141},{7,11,559},{8,11,640},{9,11,460},{12,11,183},{141,11,488},{136, +11,614},{7,10,1368},{8,10,232},{8,10,361},{10,10,682},{138,10,742},{137,10,534}, +{6,0,1082},{140,0,658},{137,10,27},{135,0,2002},{142,10,12},{4,0,28},{5,0,440},{ +7,0,248},{11,0,833},{140,0,344},{7,10,736},{139,10,264},{134,10,1657},{134,0, +1654},{138,0,531},{5,11,222},{9,11,140},{138,11,534},{6,0,634},{6,0,798},{134,0, +840},{138,11,503},{135,10,127},{133,0,853},{5,11,154},{7,11,1491},{10,11,379},{ +138,11,485},{6,0,249},{7,0,1234},{139,0,573},{133,11,716},{7,11,1570},{140,11, +542},{136,10,364},{138,0,527},{4,11,91},{5,11,388},{5,11,845},{6,11,206},{6,11, +252},{6,11,365},{7,11,136},{7,11,531},{8,11,264},{136,11,621},{134,0,1419},{135, +11,1441},{7,0,49},{7,0,392},{8,0,20},{8,0,172},{8,0,690},{9,0,383},{9,0,845},{10 +,0,48},{11,0,293},{11,0,832},{11,0,920},{11,0,984},{141,0,221},{5,0,858},{133,0, +992},{5,0,728},{137,10,792},{5,10,909},{9,10,849},{138,10,805},{7,0,525},{7,0, +1579},{8,0,497},{136,0,573},{6,0,268},{137,0,62},{135,11,576},{134,0,1201},{5,11 +,771},{5,11,863},{5,11,898},{6,11,1632},{6,11,1644},{134,11,1780},{133,11,331},{ +7,0,193},{7,0,1105},{7,10,397},{8,10,124},{8,10,619},{9,10,305},{10,0,495},{11, +10,40},{12,10,349},{13,10,134},{13,10,295},{14,10,155},{15,10,120},{146,10,105}, +{138,0,106},{5,11,107},{6,0,859},{7,11,201},{136,11,518},{6,11,446},{135,11,1817 +},{4,10,262},{7,10,342},{141,0,23},{133,10,641},{137,11,851},{6,0,925},{137,0, +813},{132,11,504},{6,0,613},{136,0,223},{4,10,99},{6,10,250},{6,10,346},{8,10, +127},{138,10,81},{136,0,953},{132,10,915},{139,11,892},{5,10,75},{9,10,517},{10, +10,470},{12,10,155},{141,10,224},{4,0,666},{7,0,1017},{7,11,996},{138,11,390},{5 +,11,883},{133,11,975},{14,10,83},{142,11,83},{4,0,670},{5,11,922},{134,11,1707}, +{135,0,216},{7,11,787},{9,0,40},{139,0,136},{5,10,954},{5,11,993},{7,11,515},{ +137,11,91},{139,0,259},{6,10,304},{7,0,1114},{8,10,418},{9,0,310},{9,0,682},{10, +0,440},{11,10,341},{11,10,675},{141,0,40},{9,10,410},{11,10,425},{142,0,296},{10 +,11,377},{12,11,363},{13,11,68},{13,11,94},{14,11,108},{142,11,306},{7,0,1401},{ +135,0,1476},{4,0,296},{6,0,475},{7,0,401},{7,0,1410},{7,0,1594},{7,0,1674},{8,0, +63},{8,0,660},{137,0,74},{4,0,139},{4,0,388},{140,0,188},{132,0,797},{132,11,766 +},{5,11,103},{7,11,921},{8,11,580},{8,11,593},{8,11,630},{138,11,28},{4,11,911}, +{5,11,867},{133,11,1013},{134,10,14},{134,0,1572},{134,10,1708},{5,10,113},{6,10 +,243},{7,10,1865},{11,10,161},{16,10,37},{17,10,99},{149,0,39},{7,11,1563},{141, +11,182},{5,11,135},{6,11,519},{7,11,1722},{10,11,271},{11,11,261},{145,11,54},{ +132,10,274},{134,0,1594},{4,11,300},{5,11,436},{135,11,484},{4,0,747},{6,0,290}, +{7,0,649},{7,0,1479},{135,0,1583},{133,11,535},{147,11,82},{133,0,232},{137,0, +887},{135,10,166},{136,0,521},{4,0,14},{7,0,472},{7,0,1801},{10,0,748},{141,0, +458},{134,0,741},{134,0,992},{9,10,304},{144,0,111},{4,0,425},{5,11,387},{7,11, +557},{12,11,547},{142,11,86},{135,11,1747},{5,10,654},{135,11,1489},{4,11,6},{5, +11,708},{7,0,789},{136,11,75},{6,10,273},{10,10,188},{13,10,377},{146,10,77},{4, +11,303},{6,0,1593},{7,11,619},{10,11,547},{10,11,687},{11,11,122},{140,11,601},{ +134,0,1768},{135,10,410},{138,11,772},{11,0,233},{139,10,524},{5,0,943},{134,0, +1779},{134,10,1785},{136,11,529},{132,0,955},{5,0,245},{6,0,576},{7,0,582},{136, +0,225},{132,10,780},{142,0,241},{134,0,1943},{4,11,106},{7,11,310},{7,11,1785},{ +10,11,690},{139,11,717},{134,0,1284},{5,11,890},{133,11,988},{6,11,626},{142,11, +431},{10,11,706},{145,11,32},{137,11,332},{132,11,698},{135,0,709},{5,10,948},{ +138,11,17},{136,0,554},{134,0,1564},{139,10,941},{132,0,443},{134,0,909},{134,11 +,84},{142,0,280},{4,10,532},{5,10,706},{135,10,662},{132,0,729},{5,10,837},{6,10 +,1651},{139,10,985},{135,10,1861},{4,0,348},{152,11,3},{5,11,986},{6,11,130},{7, +11,1582},{8,11,458},{10,11,101},{10,11,318},{138,11,823},{134,0,758},{4,0,298},{ +137,0,848},{4,10,330},{7,10,933},{7,10,2012},{136,10,292},{7,11,1644},{137,11, +129},{6,0,1422},{7,10,767},{137,0,829},{5,0,164},{7,0,121},{142,0,189},{7,0,812} +,{7,0,1261},{7,0,1360},{9,0,632},{140,0,352},{135,11,1788},{139,0,556},{135,11, +997},{145,10,114},{4,0,172},{9,0,611},{9,10,883},{10,0,436},{12,0,673},{141,0, +255},{10,10,274},{139,0,530},{133,0,844},{134,0,984},{4,10,703},{7,10,207},{13,0 +,232},{146,0,35},{132,10,571},{9,0,263},{10,0,147},{138,0,492},{7,11,1756},{137, +11,98},{5,10,873},{5,10,960},{8,10,823},{137,10,881},{133,0,537},{132,0,859},{7, +11,1046},{139,11,160},{137,0,842},{139,10,283},{5,10,33},{6,10,470},{139,10,424} +,{6,11,45},{7,11,433},{8,11,129},{9,11,21},{10,11,392},{11,11,79},{12,11,499},{ +13,11,199},{141,11,451},{135,0,1291},{135,10,1882},{7,11,558},{136,11,353},{134, +0,1482},{5,0,230},{5,0,392},{6,0,420},{9,0,568},{140,0,612},{6,0,262},{7,10,90}, +{7,10,664},{7,10,830},{7,10,1380},{7,10,2025},{8,10,448},{8,10,828},{8,11,81},{9 +,11,189},{9,11,201},{11,11,478},{11,11,712},{141,11,338},{142,0,31},{5,11,353},{ +151,11,26},{132,0,753},{4,0,0},{5,0,41},{7,0,1459},{7,0,1469},{7,0,1859},{9,0, +549},{139,0,905},{9,10,417},{137,10,493},{135,11,1113},{133,0,696},{141,11,448}, +{134,10,295},{132,0,834},{4,0,771},{5,10,1019},{6,11,25},{7,11,855},{7,11,1258}, +{144,11,32},{134,0,1076},{133,0,921},{133,0,674},{4,11,4},{7,11,1118},{7,11,1320 +},{7,11,1706},{8,11,277},{9,11,622},{10,11,9},{11,11,724},{12,11,350},{12,11,397 +},{13,11,28},{13,11,159},{15,11,89},{18,11,5},{19,11,9},{20,11,34},{150,11,47},{ +134,10,208},{6,0,444},{136,0,308},{6,0,180},{7,0,1137},{8,0,751},{139,0,805},{4, +0,183},{7,0,271},{11,0,824},{11,0,952},{13,0,278},{13,0,339},{13,0,482},{14,0, +424},{148,0,99},{7,11,317},{135,11,569},{4,0,19},{5,0,477},{5,0,596},{6,0,505},{ +7,0,1221},{11,0,907},{12,0,209},{141,0,214},{135,0,1215},{6,0,271},{7,0,398},{7, +10,448},{7,10,1629},{7,10,1813},{8,0,387},{8,10,442},{9,10,710},{10,0,344},{10, +10,282},{138,10,722},{11,10,844},{12,10,104},{140,10,625},{134,11,255},{133,10, +787},{134,0,1645},{11,11,956},{151,11,3},{6,0,92},{6,0,188},{7,0,209},{7,0,1269} +,{7,0,1524},{7,0,1876},{8,0,661},{10,0,42},{10,0,228},{11,0,58},{11,0,1020},{12, +0,58},{12,0,118},{141,0,32},{4,0,459},{133,0,966},{4,11,536},{7,11,1141},{10,11, +723},{139,11,371},{140,0,330},{134,0,1557},{7,11,285},{135,11,876},{136,10,491}, +{135,11,560},{6,0,18},{7,0,179},{7,0,932},{8,0,548},{8,0,757},{9,0,54},{9,0,65}, +{9,0,532},{9,0,844},{10,0,113},{10,0,117},{10,0,315},{10,0,560},{10,0,622},{10,0 +,798},{11,0,153},{11,0,351},{11,0,375},{12,0,78},{12,0,151},{12,0,392},{12,0,666 +},{14,0,248},{143,0,23},{4,11,690},{134,0,1742},{4,10,403},{5,10,441},{7,10,450} +,{10,10,840},{11,10,101},{12,10,193},{141,10,430},{133,0,965},{134,0,182},{10,0, +65},{10,0,488},{138,0,497},{135,11,1346},{6,0,973},{6,0,1158},{10,11,200},{19,11 +,2},{151,11,22},{4,11,190},{133,11,554},{133,10,679},{7,0,328},{137,10,326},{133 +,11,1001},{9,0,588},{138,0,260},{133,11,446},{135,10,1128},{135,10,1796},{147,11 +,119},{134,0,1786},{6,0,1328},{6,0,1985},{8,0,962},{138,0,1017},{135,0,308},{4, +10,574},{7,10,350},{7,10,1024},{8,10,338},{9,10,677},{10,10,808},{139,0,508},{ +138,11,752},{135,10,1081},{137,11,96},{7,10,1676},{135,10,2037},{136,0,588},{132 +,11,304},{133,0,614},{140,0,793},{136,0,287},{137,10,297},{141,10,37},{6,11,53}, +{6,11,199},{7,11,1408},{8,11,32},{8,11,93},{9,11,437},{10,11,397},{10,11,629},{ +11,11,593},{11,11,763},{13,11,326},{145,11,35},{134,11,105},{9,11,320},{10,11, +506},{138,11,794},{5,11,114},{5,11,255},{141,11,285},{140,0,290},{7,11,2035},{8, +11,19},{9,11,89},{138,11,831},{134,0,1136},{6,10,306},{7,0,719},{7,10,1140},{7, +10,1340},{8,0,796},{8,0,809},{8,0,834},{8,10,133},{138,10,449},{139,10,1011},{5, +0,210},{6,0,213},{7,0,60},{10,0,364},{139,0,135},{5,0,607},{8,0,326},{136,0,490} +,{138,11,176},{132,0,701},{5,0,472},{7,0,380},{137,0,758},{135,0,1947},{6,0,1079 +},{138,0,278},{138,11,391},{5,10,329},{8,10,260},{139,11,156},{4,0,386},{7,0,41} +,{8,0,405},{8,0,728},{9,0,497},{11,0,110},{11,0,360},{15,0,37},{144,0,84},{5,0, +46},{7,0,1452},{7,0,1480},{8,0,634},{140,0,472},{136,0,961},{4,0,524},{136,0,810 +},{10,0,238},{141,0,33},{132,10,657},{152,10,7},{133,0,532},{5,0,997},{135,10, +1665},{7,11,594},{7,11,851},{7,11,1858},{9,11,411},{9,11,574},{9,11,666},{9,11, +737},{10,11,346},{10,11,712},{11,11,246},{11,11,432},{11,11,517},{11,11,647},{11 +,11,679},{11,11,727},{12,11,304},{12,11,305},{12,11,323},{12,11,483},{12,11,572} +,{12,11,593},{12,11,602},{13,11,95},{13,11,101},{13,11,171},{13,11,315},{13,11, +378},{13,11,425},{13,11,475},{14,11,63},{14,11,380},{14,11,384},{15,11,133},{18, +11,112},{148,11,72},{5,11,955},{136,11,814},{134,0,1301},{5,10,66},{7,10,1896},{ +136,10,288},{133,11,56},{134,10,1643},{6,0,1298},{148,11,100},{5,0,782},{5,0,829 +},{6,0,671},{6,0,1156},{6,0,1738},{137,11,621},{4,0,306},{5,0,570},{5,10,91},{5, +10,648},{5,10,750},{5,10,781},{6,10,54},{6,10,112},{6,10,402},{6,10,1732},{7,0, +1347},{7,10,315},{7,10,749},{7,10,1900},{9,10,78},{9,10,508},{10,10,611},{10,10, +811},{11,10,510},{11,10,728},{13,10,36},{14,10,39},{16,10,83},{17,10,124},{148, +10,30},{8,10,570},{9,11,477},{141,11,78},{4,11,639},{10,10,322},{10,10,719},{10, +11,4},{11,10,407},{11,11,638},{12,11,177},{148,11,57},{7,0,1823},{139,0,693},{5, +11,758},{7,0,759},{8,10,125},{8,10,369},{8,10,524},{10,10,486},{11,10,13},{11,10 +,381},{11,10,736},{11,10,766},{11,10,845},{13,10,114},{13,10,292},{142,10,47},{6 +,10,1684},{6,10,1731},{7,0,1932},{7,10,356},{8,10,54},{8,10,221},{9,10,225},{9, +10,356},{10,10,77},{10,10,446},{10,10,731},{12,10,404},{141,10,491},{135,11,552} +,{135,11,1112},{4,0,78},{5,0,96},{5,0,182},{6,0,1257},{7,0,1724},{7,0,1825},{10, +0,394},{10,0,471},{11,0,532},{14,0,340},{145,0,88},{139,11,328},{135,0,1964},{ +132,10,411},{4,10,80},{5,10,44},{137,11,133},{5,11,110},{6,11,169},{6,11,1702},{ +7,11,400},{8,11,538},{9,11,184},{9,11,524},{140,11,218},{4,0,521},{5,10,299},{7, +10,1083},{140,11,554},{6,11,133},{9,11,353},{12,11,628},{146,11,79},{6,0,215},{7 +,0,584},{7,0,1028},{7,0,1473},{7,0,1721},{9,0,424},{138,0,779},{7,0,857},{7,0, +1209},{7,10,1713},{9,10,537},{10,10,165},{12,10,219},{140,10,561},{4,10,219},{6, +11,93},{7,10,1761},{7,11,1422},{7,11,1851},{8,11,673},{9,10,86},{9,11,529},{140, +11,43},{137,11,371},{136,0,671},{5,0,328},{135,0,918},{132,0,529},{9,11,25},{10, +11,467},{138,11,559},{4,11,335},{135,11,942},{134,0,716},{134,0,1509},{6,0,67},{ +7,0,258},{7,0,1630},{9,0,354},{9,0,675},{10,0,830},{12,10,428},{14,0,80},{145,0, +80},{134,0,1112},{6,0,141},{7,0,225},{9,0,59},{9,0,607},{10,0,312},{11,0,687},{ +12,0,555},{13,0,373},{13,0,494},{148,0,58},{133,10,514},{8,11,39},{10,11,773},{ +11,11,84},{12,11,205},{142,11,1},{5,11,601},{5,11,870},{136,0,783},{136,11,594}, +{4,10,55},{5,10,301},{6,10,571},{14,10,49},{146,10,102},{132,11,181},{134,11, +1652},{133,10,364},{4,11,97},{5,11,147},{6,11,286},{7,11,1362},{141,11,176},{4, +10,76},{7,10,1550},{9,10,306},{9,10,430},{9,10,663},{10,10,683},{11,10,427},{11, +10,753},{12,10,334},{12,10,442},{14,10,258},{14,10,366},{143,10,131},{137,10,52} +,{6,0,955},{134,0,1498},{6,11,375},{7,11,169},{7,11,254},{136,11,780},{7,0,430}, +{11,0,46},{14,0,343},{142,11,343},{135,0,1183},{5,0,602},{7,0,2018},{7,11,1447}, +{9,0,418},{137,0,803},{7,11,1044},{136,0,677},{139,11,285},{4,10,656},{135,10, +779},{135,10,144},{5,11,629},{135,11,1549},{135,10,1373},{138,11,209},{7,10,554} +,{7,10,605},{141,10,10},{5,10,838},{5,10,841},{134,10,1649},{133,10,1012},{6,0, +1357},{134,0,1380},{144,0,53},{6,0,590},{7,10,365},{7,10,1357},{7,10,1497},{8,10 +,154},{141,10,281},{133,10,340},{132,11,420},{135,0,329},{147,11,32},{4,0,469},{ +10,11,429},{139,10,495},{8,10,261},{9,10,144},{9,10,466},{10,10,370},{12,10,470} +,{13,10,144},{142,10,348},{142,0,460},{4,11,325},{9,10,897},{138,11,125},{6,0, +1743},{6,10,248},{9,10,546},{10,10,535},{11,10,681},{141,10,135},{4,0,990},{5,0, +929},{6,0,340},{8,0,376},{8,0,807},{8,0,963},{8,0,980},{138,0,1007},{134,0,1603} +,{140,0,250},{4,11,714},{133,11,469},{134,10,567},{136,10,445},{5,0,218},{7,0, +1610},{8,0,646},{10,0,83},{11,11,138},{140,11,40},{7,0,1512},{135,0,1794},{135, +11,1216},{4,11,718},{11,0,0},{144,0,78},{133,0,571},{132,0,455},{134,0,1012},{5, +11,124},{5,11,144},{6,11,548},{7,11,15},{7,11,153},{137,11,629},{142,11,10},{6, +11,75},{7,11,1531},{8,11,416},{9,11,240},{9,11,275},{10,11,100},{11,11,658},{11, +11,979},{12,11,86},{13,11,468},{14,11,66},{14,11,207},{15,11,20},{15,11,25},{144 +,11,58},{132,10,577},{5,11,141},{5,11,915},{6,11,1783},{7,11,211},{7,11,698},{7, +11,1353},{9,11,83},{9,11,281},{10,11,376},{10,11,431},{11,11,543},{12,11,664},{ +13,11,280},{13,11,428},{14,11,61},{14,11,128},{17,11,52},{145,11,81},{6,0,161},{ +7,0,372},{137,0,597},{132,0,349},{10,11,702},{139,11,245},{134,0,524},{134,10, +174},{6,0,432},{9,0,751},{139,0,322},{147,11,94},{4,11,338},{133,11,400},{5,0, +468},{10,0,325},{11,0,856},{12,0,345},{143,0,104},{133,0,223},{132,0,566},{4,11, +221},{5,11,659},{5,11,989},{7,11,697},{7,11,1211},{138,11,284},{135,11,1070},{4, +0,59},{135,0,1394},{5,10,878},{5,10,972},{6,0,436},{139,0,481},{4,0,48},{5,0,271 +},{135,0,953},{5,0,610},{136,0,457},{4,0,773},{5,0,618},{137,0,756},{133,0,755}, +{135,0,1217},{138,11,507},{132,10,351},{132,0,197},{143,11,78},{4,11,188},{7,11, +805},{11,11,276},{142,11,293},{5,11,884},{139,11,991},{132,10,286},{7,10,438},{7 +,10,627},{7,10,1516},{8,10,40},{9,10,56},{9,10,294},{10,0,259},{10,0,428},{11,10 +,969},{11,10,995},{146,10,148},{4,0,356},{5,0,217},{5,0,492},{5,0,656},{8,0,544} +,{136,11,544},{5,0,259},{6,0,1230},{7,0,414},{7,0,854},{142,0,107},{132,0,1007}, +{15,0,14},{144,0,5},{4,10,738},{134,0,1580},{132,11,596},{132,0,673},{133,10,866 +},{6,0,1843},{135,11,1847},{4,0,165},{7,0,1398},{135,0,1829},{135,11,1634},{147, +11,65},{6,0,885},{6,0,1009},{137,0,809},{133,10,116},{132,10,457},{136,11,770},{ +9,0,498},{10,11,361},{12,0,181},{142,11,316},{134,11,595},{5,0,9},{7,0,297},{7,0 +,966},{140,0,306},{4,11,89},{5,11,489},{6,11,315},{7,11,553},{7,11,1745},{138,11 +,243},{134,0,1487},{132,0,437},{5,0,146},{6,0,411},{138,0,721},{5,10,527},{6,10, +189},{135,10,859},{11,10,104},{11,10,554},{15,10,60},{143,10,125},{6,11,1658},{9 +,11,3},{10,11,154},{11,11,641},{13,11,85},{13,11,201},{141,11,346},{6,0,177},{ +135,0,467},{134,0,1377},{134,10,116},{136,11,645},{4,11,166},{5,11,505},{6,11, +1670},{137,11,110},{133,10,487},{4,10,86},{5,10,667},{5,10,753},{6,10,316},{6,10 +,455},{135,10,946},{133,0,200},{132,0,959},{6,0,1928},{134,0,1957},{139,11,203}, +{150,10,45},{4,10,79},{7,10,1773},{10,10,450},{11,10,589},{13,10,332},{13,10,493 +},{14,10,183},{14,10,334},{14,10,362},{14,10,368},{14,10,376},{14,10,379},{19,10 +,90},{19,10,103},{19,10,127},{148,10,90},{6,0,1435},{135,11,1275},{134,0,481},{7 +,11,445},{8,11,307},{8,11,704},{10,11,41},{10,11,439},{11,11,237},{11,11,622},{ +140,11,201},{135,11,869},{4,0,84},{7,0,1482},{10,0,76},{138,0,142},{11,11,277},{ +144,11,14},{135,11,1977},{4,11,189},{5,11,713},{136,11,57},{133,0,1015},{138,11, +371},{4,0,315},{5,0,507},{135,0,1370},{4,11,552},{142,10,381},{9,0,759},{16,0,31 +},{16,0,39},{16,0,75},{18,0,24},{20,0,42},{152,0,1},{134,0,712},{134,0,1722},{ +133,10,663},{133,10,846},{8,0,222},{8,0,476},{9,0,238},{11,0,516},{11,0,575},{15 +,0,109},{146,0,100},{5,10,378},{7,0,1402},{7,0,1414},{8,10,465},{9,10,286},{10, +10,185},{10,10,562},{10,10,635},{11,10,31},{11,10,393},{12,0,456},{13,10,312},{ +18,10,65},{18,10,96},{147,10,89},{4,0,986},{6,0,1958},{6,0,2032},{8,0,934},{138, +0,985},{7,10,1880},{9,10,680},{139,10,798},{134,10,1770},{145,11,49},{132,11,614 +},{132,10,648},{5,10,945},{6,10,1656},{6,10,1787},{7,10,167},{8,10,824},{9,10, +391},{10,10,375},{139,10,185},{138,11,661},{7,0,1273},{135,11,1945},{7,0,706},{7 +,0,1058},{138,0,538},{7,10,1645},{8,10,352},{137,10,249},{132,10,152},{11,0,92}, +{11,0,196},{11,0,409},{11,0,450},{11,0,666},{11,0,777},{12,0,262},{13,0,385},{13 +,0,393},{15,0,115},{16,0,45},{145,0,82},{133,10,1006},{6,0,40},{135,0,1781},{9, +11,614},{139,11,327},{5,10,420},{135,10,1449},{135,0,431},{7,10,832},{138,0,97}, +{6,0,423},{7,0,665},{135,0,1210},{7,0,237},{8,0,664},{9,0,42},{9,0,266},{9,0,380 +},{9,0,645},{10,0,177},{138,0,276},{5,10,351},{135,0,264},{5,10,40},{7,10,598},{ +7,10,1638},{8,0,213},{9,10,166},{9,10,640},{9,10,685},{9,10,773},{11,10,215},{13 +,10,65},{14,10,172},{14,10,317},{145,10,6},{5,11,84},{134,11,163},{8,10,60},{9, +10,343},{139,10,769},{137,0,455},{133,11,410},{8,0,906},{12,0,700},{12,0,706},{ +140,0,729},{21,11,33},{150,11,40},{7,10,1951},{8,10,765},{8,10,772},{140,10,671} +,{7,10,108},{8,10,219},{8,10,388},{9,10,639},{9,10,775},{11,10,275},{140,10,464} +,{5,11,322},{7,11,1941},{8,11,186},{9,11,262},{10,11,187},{14,11,208},{146,11, +130},{139,0,624},{5,11,227},{8,0,574},{140,11,29},{7,11,1546},{11,11,299},{142, +11,407},{5,10,15},{6,10,56},{7,10,1758},{8,10,500},{9,10,730},{11,10,331},{13,10 +,150},{142,10,282},{7,11,1395},{8,11,486},{9,11,236},{9,11,878},{10,11,218},{11, +11,95},{19,11,17},{147,11,31},{135,11,2043},{4,0,354},{146,11,4},{140,11,80},{ +135,0,1558},{134,10,1886},{5,10,205},{6,10,438},{137,10,711},{133,11,522},{133, +10,534},{7,0,235},{7,0,1475},{15,0,68},{146,0,120},{137,10,691},{4,0,942},{6,0, +1813},{8,0,917},{10,0,884},{12,0,696},{12,0,717},{12,0,723},{12,0,738},{12,0,749 +},{12,0,780},{16,0,97},{146,0,169},{6,10,443},{8,11,562},{9,10,237},{9,10,571},{ +9,10,695},{10,10,139},{11,10,715},{12,10,417},{141,10,421},{135,0,957},{133,0, +830},{134,11,1771},{146,0,23},{5,0,496},{6,0,694},{7,0,203},{7,11,1190},{137,11, +620},{137,11,132},{6,0,547},{134,0,1549},{8,11,258},{9,11,208},{137,11,359},{4,0 +,864},{5,0,88},{137,0,239},{135,11,493},{4,11,317},{135,11,1279},{132,11,477},{4 +,10,578},{5,11,63},{133,11,509},{7,0,650},{135,0,1310},{7,0,1076},{9,0,80},{11,0 +,78},{11,0,421},{11,0,534},{140,0,545},{132,11,288},{5,10,923},{12,0,553},{142,0 +,118},{7,0,274},{11,0,479},{139,0,507},{8,11,89},{8,11,620},{9,11,49},{10,11,774 +},{11,11,628},{12,11,322},{143,11,124},{4,0,497},{135,0,1584},{4,10,924},{7,0, +261},{7,0,1115},{7,0,1354},{7,0,1404},{7,0,1588},{7,0,1705},{7,0,1902},{9,0,465} +,{10,0,248},{10,0,349},{10,0,647},{11,0,527},{11,0,660},{11,0,669},{12,0,529},{ +141,0,305},{133,10,665},{136,0,13},{6,0,791},{138,11,120},{7,0,642},{8,0,250},{ +11,0,123},{11,0,137},{13,0,48},{142,0,95},{4,10,265},{7,10,807},{135,10,950},{5, +10,93},{140,10,267},{135,0,1429},{4,0,949},{10,0,885},{10,0,891},{10,0,900},{10, +0,939},{12,0,760},{142,0,449},{139,11,366},{132,0,818},{134,11,85},{135,10,994}, +{5,10,233},{5,10,320},{6,10,140},{7,0,330},{136,10,295},{4,0,1004},{8,0,982},{ +136,0,993},{133,10,978},{4,10,905},{6,10,1701},{137,10,843},{10,0,545},{140,0, +301},{6,0,947},{134,0,1062},{134,0,1188},{4,0,904},{5,0,794},{152,10,6},{134,0, +1372},{135,11,608},{5,11,279},{6,11,235},{7,11,468},{8,11,446},{9,11,637},{10,11 +,717},{11,11,738},{140,11,514},{132,10,509},{5,11,17},{6,11,371},{137,11,528},{ +132,0,693},{4,11,115},{5,11,669},{6,11,407},{8,11,311},{11,11,10},{141,11,5},{7, +10,273},{9,11,381},{139,0,377},{135,0,695},{7,0,386},{138,0,713},{135,10,1041},{ +134,0,1291},{6,0,7},{6,0,35},{7,0,147},{7,0,1069},{7,0,1568},{7,0,1575},{7,0, +1917},{8,0,43},{8,0,208},{9,0,128},{9,0,866},{10,0,20},{11,0,981},{147,0,33},{7, +0,893},{141,0,424},{139,10,234},{150,11,56},{5,11,779},{5,11,807},{6,11,1655},{ +134,11,1676},{5,10,802},{7,10,2021},{136,10,805},{4,11,196},{5,10,167},{5,10,899 +},{5,11,558},{5,11,949},{6,10,410},{137,10,777},{137,10,789},{134,10,1705},{8,0, +904},{140,0,787},{6,0,322},{9,0,552},{11,0,274},{13,0,209},{13,0,499},{14,0,85}, +{15,0,126},{145,0,70},{135,10,10},{5,10,11},{6,10,117},{6,10,485},{7,10,1133},{9 +,10,582},{9,10,594},{11,10,21},{11,10,818},{12,10,535},{141,10,86},{4,10,264},{7 +,10,1067},{8,10,204},{8,10,385},{139,10,953},{132,11,752},{138,10,56},{133,10, +470},{6,0,1808},{8,0,83},{8,0,742},{8,0,817},{9,0,28},{9,0,29},{9,0,885},{10,0, +387},{11,0,633},{11,0,740},{13,0,235},{13,0,254},{15,0,143},{143,0,146},{140,0, +49},{134,0,1832},{4,11,227},{5,11,159},{5,11,409},{7,11,80},{10,11,294},{10,11, +479},{12,11,418},{14,11,50},{14,11,249},{142,11,295},{7,11,1470},{8,11,66},{8,11 +,137},{8,11,761},{9,11,638},{11,11,80},{11,11,212},{11,11,368},{11,11,418},{12, +11,8},{13,11,15},{16,11,61},{17,11,59},{19,11,28},{148,11,84},{139,10,1015},{138 +,11,468},{135,0,421},{6,0,415},{7,0,1049},{137,0,442},{6,11,38},{7,11,1220},{8, +11,185},{8,11,256},{9,11,22},{9,11,331},{10,11,738},{11,11,205},{11,11,540},{11, +11,746},{13,11,399},{13,11,465},{14,11,88},{142,11,194},{139,0,289},{133,10,715} +,{4,0,110},{10,0,415},{10,0,597},{142,0,206},{4,11,159},{6,11,115},{7,11,252},{7 +,11,257},{7,11,1928},{8,11,69},{9,11,384},{10,11,91},{10,11,615},{12,11,375},{14 +,11,235},{18,11,117},{147,11,123},{5,11,911},{136,11,278},{7,0,205},{7,0,2000},{ +8,10,794},{9,10,400},{10,10,298},{142,10,228},{135,11,1774},{4,11,151},{7,11, +1567},{8,11,351},{137,11,322},{136,10,724},{133,11,990},{7,0,1539},{7,11,1539},{ +11,0,512},{13,0,205},{19,0,30},{22,0,36},{151,0,19},{5,11,194},{7,11,1662},{9,11 +,90},{140,11,180},{6,10,190},{7,10,768},{135,10,1170},{134,0,1340},{4,0,283},{ +135,0,1194},{133,11,425},{133,11,971},{12,0,549},{14,10,67},{147,10,60},{135,10, +1023},{134,0,1720},{138,11,587},{5,11,72},{6,11,264},{7,11,21},{7,11,46},{7,11, +2013},{8,11,215},{8,11,513},{10,11,266},{139,11,22},{5,0,319},{135,0,534},{6,10, +137},{9,10,75},{9,10,253},{10,10,194},{138,10,444},{6,11,239},{7,0,1180},{7,11, +118},{10,11,95},{11,11,603},{13,11,443},{14,11,160},{15,11,4},{148,0,112},{134, +11,431},{5,11,874},{6,11,1677},{11,10,643},{12,10,115},{143,11,0},{134,0,967},{6 +,11,65},{7,11,939},{7,11,1172},{7,11,1671},{9,11,540},{10,11,696},{11,11,265},{ +11,11,732},{11,11,928},{11,11,937},{12,11,399},{13,11,438},{149,11,19},{137,11, +200},{135,0,1940},{5,10,760},{7,10,542},{8,10,135},{136,10,496},{140,11,44},{7, +11,1655},{136,11,305},{7,10,319},{7,10,355},{7,10,763},{10,10,389},{145,10,43},{ +136,0,735},{138,10,786},{137,11,19},{132,11,696},{5,0,132},{9,0,486},{9,0,715},{ +10,0,458},{11,0,373},{11,0,668},{11,0,795},{11,0,897},{12,0,272},{12,0,424},{12, +0,539},{12,0,558},{14,0,245},{14,0,263},{14,0,264},{14,0,393},{142,0,403},{10,0, +38},{139,0,784},{132,0,838},{4,11,302},{135,11,1766},{133,0,379},{4,11,726},{5,0 +,8},{5,11,630},{6,0,89},{6,0,400},{7,0,1569},{7,0,1623},{7,0,1850},{8,0,218},{8, +0,422},{9,0,570},{138,0,626},{4,0,1017},{138,0,660},{6,0,387},{7,0,882},{141,0, +111},{6,0,224},{7,0,877},{137,0,647},{4,10,58},{5,10,286},{6,10,319},{7,10,402}, +{7,10,1254},{7,10,1903},{8,10,356},{140,10,408},{135,0,790},{4,10,389},{9,0,510} +,{9,10,181},{10,0,53},{10,10,29},{10,10,816},{11,10,311},{11,10,561},{12,10,67}, +{141,10,181},{142,0,458},{6,11,118},{7,11,215},{7,11,1521},{140,11,11},{134,0, +954},{135,0,394},{134,0,1367},{5,10,373},{133,11,225},{132,0,882},{7,0,1409},{ +135,10,1972},{135,10,1793},{4,11,370},{5,11,756},{135,11,1326},{150,11,13},{7,11 +,354},{10,11,410},{139,11,815},{6,11,1662},{7,11,48},{8,11,771},{10,11,116},{13, +11,104},{14,11,105},{14,11,184},{15,11,168},{19,11,92},{148,11,68},{7,0,124},{ +136,0,38},{5,0,261},{7,0,78},{7,0,199},{8,0,815},{9,0,126},{10,0,342},{140,0,647 +},{4,0,628},{140,0,724},{7,0,266},{7,10,1651},{8,0,804},{145,10,89},{135,0,208}, +{134,0,1178},{6,0,79},{135,0,1519},{132,10,672},{133,10,737},{136,0,741},{132,11 +,120},{4,0,710},{6,0,376},{134,0,606},{134,0,1347},{134,0,1494},{6,0,850},{6,0, +1553},{137,0,821},{5,10,145},{134,11,593},{7,0,1311},{140,0,135},{4,0,467},{5,0, +405},{134,0,544},{5,11,820},{135,11,931},{6,0,100},{7,0,244},{7,0,632},{7,0,1609 +},{8,0,178},{8,0,638},{141,0,58},{4,10,387},{135,10,1288},{6,11,151},{6,11,1675} +,{7,11,383},{151,11,10},{132,0,481},{135,10,550},{134,0,1378},{6,11,1624},{11,11 +,11},{12,11,422},{13,11,262},{142,11,360},{133,0,791},{4,11,43},{5,11,344},{133, +11,357},{7,0,1227},{140,0,978},{7,0,686},{8,0,33},{8,0,238},{10,0,616},{11,0,467 +},{11,0,881},{13,0,217},{13,0,253},{142,0,268},{137,0,857},{7,11,148},{8,0,467}, +{8,0,1006},{8,11,284},{141,11,63},{4,10,576},{135,10,1263},{133,11,888},{5,10, +919},{134,10,1673},{20,10,37},{148,11,37},{132,0,447},{132,11,711},{4,0,128},{5, +0,415},{6,0,462},{7,0,294},{7,0,578},{10,0,710},{139,0,86},{4,10,82},{5,10,333}, +{5,10,904},{6,10,207},{7,10,325},{7,10,1726},{8,10,101},{10,10,778},{139,10,220} +,{136,0,587},{137,11,440},{133,10,903},{6,0,427},{7,0,1018},{138,0,692},{4,0,195 +},{135,0,802},{140,10,147},{134,0,1546},{134,0,684},{132,10,705},{136,0,345},{11 +,11,678},{140,11,307},{133,0,365},{134,0,1683},{4,11,65},{5,11,479},{5,11,1004}, +{7,11,1913},{8,11,317},{9,11,302},{10,11,612},{141,11,22},{138,0,472},{4,11,261} +,{135,11,510},{134,10,90},{142,0,433},{151,0,28},{4,11,291},{7,11,101},{9,11,515 +},{12,11,152},{12,11,443},{13,11,392},{142,11,357},{140,0,997},{5,0,3},{8,0,578} +,{9,0,118},{10,0,705},{141,0,279},{135,11,1266},{7,10,813},{12,10,497},{141,10, +56},{133,0,229},{6,10,125},{135,10,1277},{8,0,102},{10,0,578},{10,0,672},{12,0, +496},{13,0,408},{14,0,121},{17,0,106},{151,10,12},{6,0,866},{134,0,1080},{136,0, +1022},{4,11,130},{135,11,843},{5,11,42},{5,11,879},{7,11,245},{7,11,324},{7,11, +1532},{11,11,463},{11,11,472},{13,11,363},{144,11,52},{150,0,55},{4,11,134},{5, +11,372},{8,0,115},{8,0,350},{9,0,489},{10,0,128},{11,0,306},{12,0,373},{14,0,30} +,{17,0,79},{147,0,80},{134,0,657},{134,0,933},{135,11,1147},{4,0,230},{133,0,702 +},{134,0,1728},{4,0,484},{18,0,26},{19,0,42},{20,0,43},{21,0,0},{23,0,27},{152,0 +,14},{7,0,185},{135,0,703},{6,0,417},{7,10,1106},{9,10,770},{10,0,618},{11,10, +112},{140,10,413},{134,0,803},{132,11,644},{134,0,1262},{7,11,540},{12,10,271},{ +145,10,109},{135,11,123},{132,0,633},{134,11,623},{4,11,908},{5,11,359},{5,11, +508},{6,11,1723},{7,11,343},{7,11,1996},{135,11,2026},{135,0,479},{7,10,304},{9, +10,646},{9,10,862},{10,0,262},{11,10,696},{12,10,208},{15,10,79},{147,10,108},{4 +,11,341},{135,11,480},{134,0,830},{5,0,70},{5,0,622},{6,0,334},{7,0,1032},{9,0, +171},{11,0,26},{11,0,213},{11,0,637},{11,0,707},{12,0,202},{12,0,380},{13,0,226} +,{13,0,355},{14,0,222},{145,0,42},{135,10,981},{143,0,217},{137,11,114},{4,0,23} +,{4,0,141},{5,0,313},{5,0,1014},{6,0,50},{6,0,51},{7,0,142},{7,0,384},{7,0,559}, +{8,0,640},{9,0,460},{9,0,783},{11,0,741},{12,0,183},{141,0,488},{141,0,360},{7,0 +,1586},{7,11,1995},{8,11,299},{11,11,890},{140,11,674},{132,10,434},{6,10,550},{ +135,0,652},{5,10,553},{7,0,766},{138,10,824},{7,0,737},{8,0,298},{136,10,452},{4 +,11,238},{5,11,503},{6,11,179},{7,11,2003},{8,11,381},{8,11,473},{9,11,149},{10, +11,183},{15,11,45},{143,11,86},{133,10,292},{5,0,222},{9,0,655},{138,0,534},{138 +,10,135},{4,11,121},{5,11,156},{5,11,349},{9,11,136},{10,11,605},{14,11,342},{ +147,11,107},{137,0,906},{6,0,1013},{134,0,1250},{6,0,1956},{6,0,2009},{8,0,991}, +{144,0,120},{135,11,1192},{138,0,503},{5,0,154},{7,0,1491},{10,0,379},{138,0,485 +},{6,0,1867},{6,0,1914},{6,0,1925},{9,0,917},{9,0,925},{9,0,932},{9,0,951},{9,0, +1007},{9,0,1013},{12,0,806},{12,0,810},{12,0,814},{12,0,816},{12,0,824},{12,0, +832},{12,0,837},{12,0,863},{12,0,868},{12,0,870},{12,0,889},{12,0,892},{12,0,900 +},{12,0,902},{12,0,908},{12,0,933},{12,0,942},{12,0,949},{12,0,954},{15,0,175},{ +15,0,203},{15,0,213},{15,0,218},{15,0,225},{15,0,231},{15,0,239},{15,0,248},{15, +0,252},{18,0,190},{18,0,204},{18,0,215},{18,0,216},{18,0,222},{18,0,225},{18,0, +230},{18,0,239},{18,0,241},{21,0,42},{21,0,43},{21,0,44},{21,0,45},{21,0,46},{21 +,0,53},{24,0,27},{152,0,31},{133,0,716},{135,0,844},{4,0,91},{5,0,388},{5,0,845} +,{6,0,206},{6,0,252},{6,0,365},{7,0,136},{7,0,531},{136,0,621},{7,10,393},{10,10 +,603},{139,10,206},{6,11,80},{6,11,1694},{7,11,173},{7,11,1974},{9,11,547},{10, +11,730},{14,11,18},{150,11,39},{137,0,748},{4,11,923},{134,11,1711},{4,10,912},{ +137,10,232},{7,10,98},{7,10,1973},{136,10,716},{5,10,733},{142,0,103},{132,11, +595},{5,11,240},{6,11,459},{7,11,12},{7,11,114},{7,11,502},{7,11,1751},{7,11, +1753},{7,11,1805},{8,11,658},{9,11,1},{11,11,959},{12,0,158},{13,11,446},{14,11, +211},{18,0,8},{19,0,62},{20,0,6},{22,0,4},{23,0,2},{151,0,9},{135,0,576},{5,0, +771},{5,0,863},{5,0,898},{6,0,648},{6,0,1632},{6,0,1644},{134,0,1780},{133,0,331 +},{7,11,633},{7,11,905},{7,11,909},{7,11,1538},{9,11,767},{140,11,636},{140,0, +632},{5,0,107},{7,0,201},{136,0,518},{6,0,446},{6,11,490},{135,0,1817},{9,0,851} +,{141,0,510},{7,11,250},{8,11,506},{136,11,507},{4,0,504},{137,10,72},{132,11, +158},{4,11,140},{7,11,362},{8,11,209},{9,11,10},{9,11,160},{9,11,503},{10,11,689 +},{11,11,350},{11,11,553},{11,11,725},{12,11,252},{12,11,583},{13,11,192},{13,11 +,352},{14,11,269},{14,11,356},{148,11,50},{6,11,597},{135,11,1318},{135,10,1454} +,{5,0,883},{5,0,975},{8,0,392},{148,0,7},{6,11,228},{7,11,1341},{9,11,408},{138, +11,343},{11,10,600},{11,11,348},{12,11,99},{13,10,245},{18,11,1},{18,11,11},{147 +,11,4},{134,11,296},{5,0,922},{134,0,1707},{132,11,557},{4,11,548},{7,10,164},{7 +,10,1571},{9,10,107},{140,10,225},{7,11,197},{8,11,142},{8,11,325},{9,11,150},{9 +,11,596},{10,11,350},{10,11,353},{11,11,74},{11,11,315},{14,11,423},{143,11,141} +,{5,0,993},{7,0,515},{137,0,91},{4,0,131},{5,10,484},{5,10,510},{6,10,434},{7,10 +,1000},{7,10,1098},{8,0,200},{136,10,2},{152,0,10},{4,11,62},{5,11,83},{6,11,399 +},{6,11,579},{7,11,692},{7,11,846},{7,11,1015},{7,11,1799},{8,11,403},{9,11,394} +,{10,11,133},{12,11,4},{12,11,297},{12,11,452},{16,11,81},{18,11,19},{18,11,25}, +{21,11,14},{22,11,12},{151,11,18},{140,11,459},{132,11,177},{7,0,1433},{9,0,365} +,{137,11,365},{132,10,460},{5,0,103},{5,11,411},{6,0,2004},{7,0,921},{7,11,653}, +{8,0,580},{8,0,593},{8,0,630},{138,0,28},{4,10,932},{133,10,891},{4,0,911},{5,0, +867},{5,0,1013},{7,0,2034},{8,0,798},{136,0,813},{7,11,439},{10,11,727},{11,11, +260},{139,11,684},{136,10,625},{5,11,208},{7,11,753},{135,11,1528},{5,0,461},{6, +10,76},{7,0,1925},{12,0,39},{13,0,265},{141,0,439},{6,0,853},{8,10,92},{137,10, +221},{5,0,135},{6,0,519},{7,0,1722},{10,0,271},{11,0,261},{145,0,54},{139,11,814 +},{14,0,338},{148,0,81},{4,0,300},{133,0,436},{5,0,419},{5,0,687},{7,0,864},{7, +11,864},{137,0,470},{5,11,242},{137,0,836},{134,0,1937},{4,10,763},{133,11,953}, +{132,10,622},{132,0,393},{133,10,253},{7,10,546},{8,0,357},{10,0,745},{14,0,426} +,{17,0,94},{147,0,57},{5,11,615},{146,11,37},{9,10,73},{10,10,110},{14,10,185},{ +145,10,119},{7,10,624},{7,10,916},{10,10,256},{11,0,703},{139,10,87},{133,11,290 +},{5,10,212},{12,10,35},{141,10,382},{132,11,380},{5,11,52},{7,11,277},{9,11,368 +},{139,11,791},{133,0,387},{10,11,138},{139,11,476},{4,0,6},{5,0,708},{136,0,75} +,{7,0,1351},{9,0,581},{10,0,639},{11,0,453},{140,0,584},{132,0,303},{138,0,772}, +{135,10,1175},{4,0,749},{5,10,816},{6,11,256},{7,11,307},{7,11,999},{7,11,1481}, +{7,11,1732},{7,11,1738},{8,11,265},{9,11,414},{11,11,316},{12,11,52},{13,11,420} +,{147,11,100},{135,11,1296},{5,10,869},{5,10,968},{6,0,1065},{6,10,1626},{8,10, +734},{136,10,784},{4,10,542},{6,10,1716},{6,10,1727},{7,10,1082},{7,10,1545},{8, +10,56},{8,10,118},{8,10,412},{8,10,564},{9,10,888},{9,10,908},{10,10,50},{10,10, +423},{11,10,685},{11,10,697},{11,10,933},{12,10,299},{13,10,126},{13,10,136},{13 +,10,170},{141,10,190},{134,0,226},{4,0,106},{5,11,723},{7,0,310},{139,0,717},{4, +10,232},{5,0,890},{5,0,988},{9,10,202},{10,10,474},{140,10,433},{6,0,626},{142,0 +,431},{10,0,706},{150,0,44},{6,10,108},{7,10,1003},{7,10,1181},{8,10,111},{8,10, +343},{141,0,51},{132,0,698},{5,11,109},{6,11,1784},{7,11,1895},{12,11,296},{140, +11,302},{134,0,828},{134,10,1712},{138,0,17},{4,10,133},{5,11,216},{7,0,1929},{7 +,10,711},{7,10,1298},{7,10,1585},{7,11,1879},{9,11,141},{9,11,270},{9,11,679},{ +10,11,159},{10,11,553},{11,11,197},{11,11,438},{12,11,538},{12,11,559},{13,11, +193},{13,11,423},{14,11,144},{14,11,166},{14,11,167},{15,11,67},{147,11,84},{141 +,11,127},{7,11,1872},{137,11,81},{6,10,99},{7,10,1808},{145,10,57},{134,11,391}, +{5,0,689},{6,0,84},{6,10,574},{7,0,1250},{7,10,428},{10,10,669},{11,10,485},{11, +10,840},{12,10,300},{142,10,250},{7,11,322},{136,11,249},{7,11,432},{135,11,1649 +},{135,10,1871},{137,10,252},{6,11,155},{140,11,234},{7,0,871},{19,0,27},{147,11 +,27},{140,0,498},{5,0,986},{6,0,130},{138,0,823},{6,0,1793},{6,10,323},{7,0,1582 +},{7,10,1564},{8,0,458},{10,0,101},{10,0,318},{10,0,945},{12,0,734},{16,0,104},{ +146,0,177},{5,11,632},{138,11,526},{7,10,461},{8,10,775},{138,0,435},{6,11,144}, +{7,11,948},{7,11,1042},{7,11,1857},{8,11,235},{8,11,461},{9,11,453},{9,11,530},{ +10,11,354},{17,11,77},{19,11,99},{148,11,79},{138,0,966},{7,0,1644},{137,0,129}, +{135,0,997},{136,0,502},{5,11,196},{6,11,486},{7,11,212},{8,11,309},{136,11,346} +,{7,10,727},{146,10,73},{132,0,823},{132,11,686},{135,0,1927},{4,0,762},{7,0, +1756},{137,0,98},{136,10,577},{4,11,30},{5,11,43},{24,0,8},{152,11,8},{7,0,1046} +,{139,0,160},{4,10,413},{5,10,677},{7,0,492},{7,11,492},{8,10,432},{140,10,280}, +{6,0,45},{7,0,433},{8,0,129},{9,0,21},{10,0,392},{11,0,79},{12,0,499},{13,0,199} +,{141,0,451},{7,0,558},{136,0,353},{4,11,220},{7,11,1535},{9,11,93},{139,11,474} +,{7,10,646},{7,10,1730},{11,10,446},{141,10,178},{133,0,785},{134,0,1145},{8,0, +81},{9,0,189},{9,0,201},{11,0,478},{11,0,712},{141,0,338},{5,0,353},{151,0,26},{ +4,10,395},{139,0,762},{134,0,2024},{4,0,611},{133,0,606},{9,10,174},{10,10,164}, +{11,10,440},{11,10,841},{143,10,98},{134,10,426},{10,10,608},{139,10,1002},{138, +10,250},{6,0,25},{7,0,855},{7,0,1258},{144,0,32},{7,11,1725},{138,11,393},{5,11, +263},{134,11,414},{5,10,476},{134,0,2011},{4,0,4},{6,11,178},{6,11,1750},{7,0, +1118},{7,0,1320},{7,0,1706},{8,0,277},{8,11,251},{9,0,622},{9,11,690},{10,0,9},{ +10,11,155},{10,11,196},{10,11,373},{11,0,724},{11,11,698},{12,0,350},{12,0,397}, +{13,0,28},{13,0,159},{13,11,155},{15,0,89},{18,0,5},{19,0,9},{20,0,34},{20,11,93 +},{150,0,47},{5,11,97},{137,11,393},{5,10,76},{6,10,458},{6,10,497},{7,0,764},{7 +,10,868},{9,10,658},{10,10,594},{11,0,461},{11,10,566},{12,0,172},{12,10,338},{ +141,10,200},{134,0,1449},{138,11,40},{134,11,1639},{134,0,1445},{4,10,526},{6,0, +1168},{7,10,1029},{135,10,1054},{4,11,191},{7,11,934},{8,11,647},{145,11,97},{ +132,10,636},{6,0,233},{7,10,660},{7,10,1124},{17,10,31},{19,10,22},{151,10,14},{ +6,10,1699},{136,11,110},{12,11,246},{15,11,162},{19,11,64},{20,11,8},{20,11,95}, +{22,11,24},{152,11,17},{5,11,165},{9,11,346},{138,11,655},{5,11,319},{135,11,534 +},{134,0,255},{8,11,128},{9,0,216},{139,11,179},{9,0,183},{139,0,286},{11,0,956} +,{151,0,3},{4,0,536},{7,0,1141},{10,0,723},{139,0,371},{4,10,279},{7,10,301},{ +137,10,362},{5,11,57},{6,11,101},{6,11,1663},{7,0,285},{7,11,132},{7,11,1048},{7 +,11,1154},{7,11,1415},{7,11,1507},{12,11,493},{15,11,105},{151,11,15},{5,11,459} +,{7,10,1743},{7,11,1073},{8,11,241},{136,11,334},{4,10,178},{133,10,399},{135,0, +560},{132,0,690},{135,0,1246},{18,0,157},{147,0,63},{10,0,599},{11,0,33},{12,0, +571},{149,0,1},{6,11,324},{6,11,520},{7,11,338},{7,11,1616},{7,11,1729},{8,11, +228},{9,11,69},{139,11,750},{7,0,1862},{12,0,491},{12,0,520},{13,0,383},{142,0, +244},{135,11,734},{134,10,1692},{6,10,202},{7,11,705},{10,0,448},{11,0,630},{12, +10,360},{17,0,117},{17,10,118},{18,10,27},{148,10,67},{4,11,73},{6,11,612},{7,11 +,927},{7,11,1822},{8,11,217},{9,11,472},{9,11,765},{9,11,766},{10,11,408},{11,11 +,51},{11,11,793},{12,11,266},{15,11,158},{20,11,89},{150,11,32},{4,0,190},{133,0 +,554},{133,0,1001},{5,11,389},{8,11,636},{137,11,229},{5,0,446},{7,10,872},{10, +10,516},{139,10,167},{137,10,313},{132,10,224},{134,0,1313},{5,10,546},{7,10,35} +,{8,10,11},{8,10,12},{9,10,315},{9,10,533},{10,10,802},{11,10,166},{12,10,525},{ +142,10,243},{6,0,636},{137,0,837},{5,10,241},{8,10,242},{9,10,451},{10,10,667},{ +11,10,598},{140,10,429},{22,10,46},{150,11,46},{136,11,472},{11,0,278},{142,0,73 +},{141,11,185},{132,0,868},{134,0,972},{4,10,366},{137,10,516},{138,0,1010},{5, +11,189},{6,10,1736},{7,11,442},{7,11,443},{8,11,281},{12,11,174},{13,11,83},{141 +,11,261},{139,11,384},{6,11,2},{7,11,191},{7,11,446},{7,11,758},{7,11,1262},{7, +11,1737},{8,11,22},{8,11,270},{8,11,612},{9,11,4},{9,11,167},{9,11,312},{9,11, +436},{10,11,156},{10,11,216},{10,11,311},{10,11,623},{11,11,72},{11,11,330},{11, +11,455},{12,11,101},{12,11,321},{12,11,504},{12,11,530},{12,11,543},{13,11,17},{ +13,11,156},{13,11,334},{14,11,48},{15,11,70},{17,11,60},{148,11,64},{6,10,331},{ +136,10,623},{135,0,1231},{132,0,304},{6,11,60},{7,11,670},{7,11,1327},{8,11,411} +,{8,11,435},{9,11,653},{9,11,740},{10,11,385},{11,11,222},{11,11,324},{11,11,829 +},{140,11,611},{6,11,166},{7,0,506},{7,11,374},{135,11,1174},{14,11,43},{146,11, +21},{135,11,1694},{135,10,1888},{5,11,206},{134,11,398},{135,11,50},{150,0,26},{ +6,0,53},{6,0,199},{7,0,1408},{8,0,32},{8,0,93},{10,0,397},{10,0,629},{11,0,593}, +{11,0,763},{13,0,326},{145,0,35},{134,0,105},{132,10,394},{4,0,843},{138,0,794}, +{11,0,704},{141,0,396},{5,0,114},{5,0,255},{141,0,285},{6,0,619},{7,0,898},{7,0, +1092},{7,10,1931},{8,0,485},{18,0,28},{147,0,116},{7,10,574},{7,10,1719},{137,0, +145},{7,0,2035},{8,0,19},{9,0,89},{138,0,831},{132,10,658},{6,11,517},{7,11,1159 +},{10,11,621},{139,11,192},{7,0,1933},{7,11,1933},{9,10,781},{10,10,144},{11,10, +385},{13,10,161},{13,10,228},{13,10,268},{148,10,107},{136,10,374},{10,11,223},{ +139,11,645},{135,0,1728},{7,11,64},{7,11,289},{136,11,245},{4,10,344},{6,10,498} +,{139,10,323},{136,0,746},{135,10,1063},{137,10,155},{4,0,987},{6,0,1964},{6,0, +1974},{6,0,1990},{136,0,995},{133,11,609},{133,10,906},{134,0,1550},{134,0,874}, +{5,11,129},{6,11,61},{135,11,947},{4,0,1018},{6,0,1938},{6,0,2021},{134,0,2039}, +{132,0,814},{11,0,126},{139,0,287},{134,0,1264},{5,0,955},{136,0,814},{141,11, +506},{132,11,314},{6,0,981},{139,11,1000},{5,0,56},{8,0,892},{8,0,915},{140,0, +776},{148,0,100},{10,0,4},{10,0,13},{11,0,638},{148,0,57},{148,11,74},{4,10,616} +,{133,0,738},{133,11,637},{136,10,692},{133,0,758},{132,10,305},{137,11,590},{5, +11,280},{135,11,1226},{134,11,494},{135,0,1112},{133,11,281},{5,10,214},{7,10, +603},{8,10,611},{9,10,686},{10,10,88},{11,10,459},{11,10,496},{12,10,463},{12,10 +,590},{13,0,44},{142,0,214},{139,0,328},{135,11,1064},{137,0,133},{7,0,168},{13, +0,196},{141,0,237},{134,10,1703},{134,0,1152},{135,0,1245},{5,0,110},{6,0,169},{ +6,0,1702},{7,0,400},{8,0,538},{9,0,184},{9,0,524},{140,0,218},{6,0,1816},{10,0, +871},{12,0,769},{140,0,785},{132,11,630},{7,11,33},{7,11,120},{8,11,489},{9,11, +319},{10,11,820},{11,11,1004},{12,11,379},{13,11,117},{13,11,412},{14,11,25},{15 +,11,52},{15,11,161},{16,11,47},{149,11,2},{6,0,133},{8,0,413},{9,0,353},{139,0, +993},{145,10,19},{4,11,937},{133,11,801},{134,0,978},{6,0,93},{6,0,1508},{7,0, +1422},{7,0,1851},{8,0,673},{9,0,529},{140,0,43},{4,10,737},{6,0,317},{10,0,512}, +{11,10,294},{12,10,60},{12,10,437},{13,10,64},{13,10,380},{142,10,430},{7,11, +1591},{9,0,371},{144,11,43},{6,10,1758},{8,10,520},{9,10,345},{9,10,403},{142,10 +,350},{5,0,526},{10,10,242},{138,10,579},{9,0,25},{10,0,467},{138,0,559},{5,10, +139},{7,10,1168},{138,10,539},{4,0,335},{135,0,942},{140,0,754},{132,11,365},{11 +,0,182},{142,0,195},{142,11,29},{5,11,7},{139,11,774},{4,11,746},{135,11,1090},{ +8,0,39},{10,0,773},{11,0,84},{12,0,205},{142,0,1},{5,0,601},{5,0,870},{5,11,360} +,{136,11,237},{132,0,181},{136,0,370},{134,0,1652},{4,10,107},{7,10,613},{8,0, +358},{8,10,439},{8,10,504},{9,10,501},{10,10,383},{139,10,477},{132,10,229},{137 +,11,785},{4,0,97},{5,0,147},{6,0,286},{7,0,1362},{141,0,176},{4,10,903},{6,0,537 +},{7,0,788},{135,0,1816},{140,10,71},{6,0,743},{134,0,1223},{6,0,375},{7,0,169}, +{7,0,254},{7,11,1493},{136,0,780},{4,10,47},{6,10,373},{7,0,1714},{7,10,452},{7, +10,543},{7,10,1856},{9,10,6},{11,10,257},{139,10,391},{6,0,896},{136,0,1003},{ +135,0,1447},{137,11,341},{5,10,980},{134,10,1754},{145,11,22},{4,11,277},{5,11, +608},{6,11,493},{7,11,457},{140,11,384},{7,10,536},{7,10,1331},{136,10,143},{140 +,0,744},{7,11,27},{135,11,316},{5,10,19},{6,10,533},{146,0,126},{4,0,788},{5,11, +552},{5,11,586},{5,11,676},{6,11,448},{8,11,244},{11,0,41},{11,11,1},{11,11,41}, +{13,11,3},{16,11,54},{17,11,4},{146,11,13},{4,0,985},{4,11,401},{6,0,1801},{137, +11,264},{5,10,395},{5,10,951},{134,10,1776},{5,0,629},{135,0,1549},{11,10,663},{ +12,10,210},{13,10,166},{13,10,310},{14,10,373},{147,10,43},{9,11,543},{10,11,524 +},{11,11,30},{12,11,524},{14,11,315},{16,11,18},{20,11,26},{148,11,65},{4,11,205 +},{5,11,623},{7,11,104},{136,11,519},{5,0,293},{134,0,601},{7,11,579},{9,11,41}, +{9,11,244},{9,11,669},{10,11,5},{11,11,861},{11,11,951},{139,11,980},{132,11,717 +},{132,10,695},{7,10,497},{9,10,387},{147,10,81},{132,0,420},{142,0,37},{6,0, +1134},{6,0,1900},{12,0,830},{12,0,878},{12,0,894},{15,0,221},{143,0,245},{132,11 +,489},{7,0,1570},{140,0,542},{8,0,933},{136,0,957},{5,10,284},{6,0,1371},{6,10, +49},{6,10,350},{7,0,31},{7,10,377},{7,10,1693},{8,0,373},{8,10,678},{9,10,161},{ +9,10,585},{9,10,671},{9,10,839},{11,10,912},{141,10,427},{135,11,892},{4,0,325}, +{138,0,125},{139,11,47},{132,10,597},{138,0,323},{6,0,1547},{7,11,1605},{9,11, +473},{11,11,962},{146,11,139},{139,10,908},{7,11,819},{9,11,26},{9,11,392},{10, +11,152},{10,11,226},{11,11,19},{12,11,276},{12,11,426},{12,11,589},{13,11,460},{ +15,11,97},{19,11,48},{148,11,104},{135,11,51},{4,0,718},{135,0,1216},{6,0,1896}, +{6,0,1905},{6,0,1912},{7,11,761},{7,11,1051},{9,0,947},{9,0,974},{9,11,545},{12, +0,809},{12,0,850},{12,0,858},{12,0,874},{12,0,887},{12,0,904},{12,0,929},{12,0, +948},{12,0,952},{15,0,198},{15,0,206},{15,0,220},{15,0,227},{15,0,247},{18,0,188 +},{21,0,48},{21,0,50},{24,0,25},{152,0,29},{5,0,124},{5,0,144},{6,0,548},{7,0,15 +},{7,0,153},{137,0,629},{135,11,606},{135,10,2014},{7,10,2007},{9,10,101},{9,10, +450},{9,11,46},{10,10,66},{10,10,842},{11,10,536},{140,10,587},{6,0,75},{7,0, +1531},{8,0,416},{9,0,240},{9,0,275},{10,0,100},{11,0,658},{11,0,979},{12,0,86},{ +14,0,207},{15,0,20},{143,0,25},{5,0,141},{5,0,915},{6,0,1783},{7,0,211},{7,0,698 +},{7,0,1353},{9,0,83},{9,0,281},{10,0,376},{10,0,431},{11,0,543},{12,0,664},{13, +0,280},{13,0,428},{14,0,61},{14,0,128},{17,0,52},{145,0,81},{132,11,674},{135,0, +533},{149,0,6},{132,11,770},{133,0,538},{5,11,79},{7,11,1027},{7,11,1477},{139, +11,52},{139,10,62},{4,0,338},{133,0,400},{5,11,789},{134,11,195},{4,11,251},{4, +11,688},{7,11,513},{7,11,1284},{9,11,87},{138,11,365},{134,10,1766},{6,0,0},{7,0 +,84},{11,0,895},{145,0,11},{139,0,892},{4,0,221},{5,0,659},{7,0,697},{7,0,1211}, +{138,0,284},{133,0,989},{133,11,889},{4,11,160},{5,11,330},{7,11,1434},{136,11, +174},{6,10,1665},{7,10,256},{7,10,1388},{10,10,499},{139,10,670},{4,10,22},{5,10 +,10},{7,0,848},{136,10,97},{138,0,507},{133,10,481},{4,0,188},{135,0,805},{5,0, +884},{6,0,732},{139,0,991},{135,11,968},{11,11,636},{15,11,145},{17,11,34},{19, +11,50},{151,11,20},{6,10,134},{7,0,959},{7,10,437},{9,10,37},{14,10,285},{14,10, +371},{144,0,60},{7,10,486},{8,10,155},{11,10,93},{140,10,164},{134,0,1653},{5,10 +,591},{135,0,337},{5,11,374},{6,0,1989},{8,0,922},{136,0,978},{132,0,638},{138,0 +,500},{133,11,731},{5,10,380},{5,10,650},{136,10,310},{138,11,381},{4,10,364},{7 +,10,1156},{7,10,1187},{137,10,409},{137,11,224},{140,0,166},{134,10,482},{4,11, +626},{5,11,642},{6,11,425},{10,11,202},{139,11,141},{4,10,781},{6,10,487},{7,10, +926},{8,10,263},{139,10,500},{135,0,418},{4,10,94},{135,10,1265},{136,0,760},{ +132,10,417},{136,11,835},{5,10,348},{134,10,522},{6,0,1277},{134,0,1538},{139,11 +,541},{135,11,1597},{5,11,384},{8,11,455},{140,11,48},{136,0,770},{5,11,264},{ +134,11,184},{4,0,89},{5,0,489},{6,0,315},{7,0,553},{7,0,1745},{138,0,243},{4,10, +408},{4,10,741},{135,10,500},{134,0,1396},{133,0,560},{6,0,1658},{9,0,3},{10,0, +154},{11,0,641},{13,0,85},{13,0,201},{141,0,346},{135,11,1595},{5,11,633},{6,11, +28},{7,11,219},{135,11,1323},{9,11,769},{140,11,185},{135,11,785},{7,11,359},{8, +11,243},{140,11,175},{138,0,586},{6,10,73},{135,0,1271},{132,11,105},{4,0,166},{ +5,0,505},{134,0,1670},{133,10,576},{4,11,324},{138,11,104},{142,10,231},{6,0,637 +},{7,10,1264},{7,10,1678},{11,10,945},{12,10,341},{12,10,471},{12,10,569},{23,11 +,21},{151,11,23},{8,11,559},{141,11,109},{134,0,1947},{7,0,445},{8,0,307},{8,0, +704},{10,0,41},{10,0,439},{11,0,237},{11,0,622},{140,0,201},{135,11,963},{135,0, +1977},{4,0,189},{5,0,713},{136,0,57},{138,0,371},{135,10,538},{132,0,552},{5,10, +413},{134,0,883},{4,11,758},{134,0,923},{138,11,215},{136,10,495},{7,10,54},{8, +10,312},{10,10,191},{10,10,614},{140,10,567},{7,11,351},{139,11,128},{6,10,468}, +{7,0,875},{7,10,1478},{8,10,530},{142,10,290},{135,0,1788},{5,11,918},{145,0,49} +,{12,11,398},{20,11,39},{21,11,11},{150,11,41},{6,10,484},{7,10,822},{138,0,661} +,{135,0,1945},{134,0,794},{137,10,900},{135,10,1335},{6,10,1724},{135,10,2022},{ +132,11,340},{134,0,1135},{4,0,784},{133,0,745},{5,0,84},{134,0,163},{133,0,410}, +{4,0,976},{5,11,985},{7,11,509},{7,11,529},{145,11,96},{132,10,474},{134,0,703}, +{135,11,1919},{5,0,322},{8,0,186},{9,0,262},{10,0,187},{142,0,208},{135,10,1504} +,{133,0,227},{5,10,305},{9,0,560},{141,0,208},{132,11,247},{7,0,1395},{8,0,486}, +{9,0,236},{9,0,878},{10,0,218},{11,0,95},{19,0,17},{147,0,31},{7,0,2043},{8,0, +672},{141,0,448},{4,11,184},{5,11,390},{6,11,337},{7,11,23},{7,11,494},{7,11,618 +},{7,11,1456},{8,11,27},{8,11,599},{10,11,153},{139,11,710},{135,0,466},{135,10, +1236},{4,10,480},{6,0,167},{6,10,302},{6,10,1642},{7,0,186},{7,0,656},{7,10,837} +,{7,10,1547},{7,10,1657},{8,10,429},{9,10,228},{10,0,643},{13,10,289},{13,10,343 +},{147,10,101},{134,0,1428},{134,0,1440},{5,0,412},{7,10,278},{10,10,739},{11,10 +,708},{141,10,348},{134,0,1118},{136,0,562},{148,11,46},{9,0,316},{139,0,256},{ +134,0,1771},{135,0,1190},{137,0,132},{10,11,227},{11,11,497},{11,11,709},{140,11 +,415},{143,0,66},{6,11,360},{7,11,1664},{136,11,478},{144,10,28},{4,0,317},{135, +0,1279},{5,0,63},{133,0,509},{136,11,699},{145,10,36},{134,0,1475},{11,11,343},{ +142,11,127},{132,11,739},{132,0,288},{135,11,1757},{8,0,89},{8,0,620},{9,0,608}, +{11,0,628},{12,0,322},{143,0,124},{134,0,1225},{4,11,67},{5,11,422},{6,10,363},{ +7,0,1189},{7,10,1955},{7,11,1037},{7,11,1289},{7,11,1555},{8,10,725},{9,11,741}, +{145,11,108},{134,0,1468},{6,0,689},{134,0,1451},{138,0,120},{151,0,1},{137,10, +805},{142,0,329},{5,10,813},{135,10,2046},{135,0,226},{138,11,96},{5,10,712},{7, +0,1855},{11,10,17},{13,10,321},{144,10,67},{6,10,320},{7,10,781},{7,10,1921},{9, +0,461},{9,10,55},{10,10,186},{10,10,273},{10,10,664},{10,10,801},{11,10,996},{11 +,10,997},{13,10,157},{142,10,170},{8,10,271},{8,11,203},{11,11,823},{11,11,846}, +{12,11,482},{13,11,133},{13,11,277},{13,11,302},{13,11,464},{14,11,205},{142,11, +221},{135,0,1346},{4,11,449},{133,11,718},{134,0,85},{7,10,103},{7,10,863},{11, +10,184},{14,0,299},{145,10,62},{4,11,355},{6,11,311},{9,11,256},{138,11,404},{ +137,10,659},{138,11,758},{133,11,827},{5,11,64},{140,11,581},{134,0,1171},{4,11, +442},{7,11,1047},{7,11,1352},{135,11,1643},{132,0,980},{5,11,977},{6,11,288},{7, +11,528},{135,11,1065},{5,0,279},{6,0,235},{7,0,468},{8,0,446},{9,0,637},{10,0, +717},{11,0,738},{140,0,514},{132,0,293},{11,10,337},{142,10,303},{136,11,285},{4 +,11,254},{5,0,17},{6,0,371},{9,0,528},{140,0,364},{5,10,77},{7,10,1455},{10,10, +843},{147,10,73},{150,0,5},{132,10,458},{6,11,12},{7,11,1219},{145,11,73},{135, +10,1420},{6,10,109},{138,10,382},{135,11,125},{6,10,330},{7,10,1084},{139,10,142 +},{6,11,369},{6,11,502},{7,11,1036},{8,11,348},{9,11,452},{10,11,26},{11,11,224} +,{11,11,387},{11,11,772},{12,11,95},{12,11,629},{13,11,195},{13,11,207},{13,11, +241},{14,11,260},{14,11,270},{143,11,140},{132,11,269},{5,11,480},{7,11,532},{7, +11,1197},{7,11,1358},{8,11,291},{11,11,349},{142,11,396},{150,0,48},{10,0,601},{ +13,0,353},{141,0,376},{5,0,779},{5,0,807},{6,0,1655},{134,0,1676},{142,11,223},{ +4,0,196},{5,0,558},{133,0,949},{148,11,15},{135,11,1764},{134,0,1322},{132,0,752 +},{139,0,737},{135,11,657},{136,11,533},{135,0,412},{4,0,227},{5,0,159},{5,0,409 +},{7,0,80},{8,0,556},{10,0,479},{12,0,418},{14,0,50},{14,0,123},{14,0,192},{14,0 +,249},{14,0,295},{143,0,27},{7,0,1470},{8,0,66},{8,0,137},{8,0,761},{9,0,638},{ +11,0,80},{11,0,212},{11,0,368},{11,0,418},{12,0,8},{13,0,15},{16,0,61},{17,0,59} +,{19,0,28},{148,0,84},{135,10,1985},{4,11,211},{4,11,332},{5,11,335},{6,11,238}, +{7,11,269},{7,11,811},{7,11,1797},{8,10,122},{8,11,836},{9,11,507},{141,11,242}, +{6,0,683},{134,0,1252},{4,0,873},{132,10,234},{134,0,835},{6,0,38},{7,0,1220},{8 +,0,185},{8,0,256},{9,0,22},{9,0,331},{10,0,738},{11,0,205},{11,0,540},{11,0,746} +,{13,0,465},{14,0,88},{142,0,194},{138,0,986},{5,11,1009},{12,11,582},{146,11, +131},{4,0,159},{6,0,115},{7,0,252},{7,0,257},{7,0,1928},{8,0,69},{9,0,384},{10,0 +,91},{10,0,615},{12,0,375},{14,0,235},{18,0,117},{147,0,123},{133,0,911},{136,0, +278},{5,10,430},{5,10,932},{6,10,131},{7,10,417},{9,10,522},{11,10,314},{141,10, +390},{14,10,149},{14,10,399},{143,10,57},{4,0,151},{7,0,1567},{136,0,749},{5,11, +228},{6,11,203},{7,11,156},{8,11,347},{137,11,265},{132,10,507},{10,0,989},{140, +0,956},{133,0,990},{5,0,194},{6,0,927},{7,0,1662},{9,0,90},{140,0,564},{4,10,343 +},{133,10,511},{133,0,425},{7,10,455},{138,10,591},{4,0,774},{7,11,476},{7,11, +1592},{138,11,87},{5,0,971},{135,10,1381},{5,11,318},{147,11,121},{5,11,291},{7, +11,765},{9,11,389},{140,11,548},{134,10,575},{4,0,827},{12,0,646},{12,0,705},{12 +,0,712},{140,0,714},{139,0,752},{137,0,662},{5,0,72},{6,0,264},{7,0,21},{7,0,46} +,{7,0,2013},{8,0,215},{8,0,513},{10,0,266},{139,0,22},{139,11,522},{6,0,239},{7, +0,118},{10,0,95},{11,0,603},{13,0,443},{14,0,160},{143,0,4},{6,0,431},{134,0,669 +},{7,10,1127},{7,10,1572},{10,10,297},{10,10,422},{11,10,764},{11,10,810},{12,10 +,264},{13,10,102},{13,10,300},{13,10,484},{14,10,147},{14,10,229},{17,10,71},{18 +,10,118},{147,10,120},{5,0,874},{6,0,1677},{10,11,525},{11,11,82},{143,0,0},{6,0 +,65},{7,0,939},{7,0,1172},{7,0,1671},{9,0,540},{10,0,696},{11,0,265},{11,0,732}, +{11,0,928},{11,0,937},{141,0,438},{134,0,1350},{136,11,547},{132,11,422},{5,11, +355},{145,11,0},{137,11,905},{5,0,682},{135,0,1887},{132,0,809},{4,0,696},{133, +11,865},{6,0,1074},{6,0,1472},{14,10,35},{142,10,191},{5,11,914},{134,11,1625},{ +133,11,234},{135,11,1383},{137,11,780},{132,10,125},{4,0,726},{133,0,630},{8,0, +802},{136,0,838},{132,10,721},{6,0,1337},{7,0,776},{8,10,145},{147,0,56},{132,0, +970},{7,10,792},{8,10,147},{10,10,821},{139,10,1021},{139,10,970},{8,0,940},{137 +,0,797},{135,11,1312},{7,10,1999},{7,11,816},{7,11,1241},{9,0,248},{9,11,283},{9 +,11,520},{10,0,400},{10,11,213},{10,11,307},{10,11,463},{10,11,671},{10,11,746}, +{11,11,401},{11,11,794},{12,11,517},{18,11,107},{147,11,115},{6,0,1951},{134,0, +2040},{135,11,339},{5,10,168},{5,10,930},{8,10,74},{9,10,623},{12,10,500},{12,10 +,579},{13,0,41},{143,0,93},{6,0,118},{7,0,215},{7,0,1521},{140,0,11},{6,10,220}, +{7,10,1101},{141,10,105},{6,11,421},{7,11,61},{7,11,1540},{10,11,11},{138,11,501 +},{7,0,615},{138,0,251},{140,11,631},{135,0,1044},{6,10,19},{7,10,1413},{139,10, +428},{133,0,225},{7,10,96},{8,10,401},{8,10,703},{137,10,896},{145,10,116},{6,11 +,102},{7,11,72},{15,11,142},{147,11,67},{7,10,1961},{7,10,1965},{8,10,702},{136, +10,750},{7,10,2030},{8,10,150},{8,10,737},{12,10,366},{151,11,30},{4,0,370},{5,0 +,756},{7,0,1326},{135,11,823},{8,10,800},{9,10,148},{9,10,872},{9,10,890},{11,10 +,309},{11,10,1001},{13,10,267},{141,10,323},{6,0,1662},{7,0,48},{8,0,771},{10,0, +116},{13,0,104},{14,0,105},{14,0,184},{15,0,168},{19,0,92},{148,0,68},{7,11,1870 +},{138,0,209},{7,11,68},{8,11,48},{8,11,88},{8,11,582},{8,11,681},{9,11,373},{9, +11,864},{11,11,157},{11,11,336},{11,11,843},{148,11,27},{134,0,930},{4,11,88},{5 +,11,137},{5,11,174},{5,11,777},{6,11,1664},{6,11,1725},{7,11,77},{7,11,426},{7, +11,1317},{7,11,1355},{8,11,126},{8,11,563},{9,11,523},{9,11,750},{10,11,310},{10 +,11,836},{11,11,42},{11,11,318},{11,11,731},{12,11,68},{12,11,92},{12,11,507},{ +12,11,692},{13,11,81},{13,11,238},{13,11,374},{18,11,138},{19,11,78},{19,11,111} +,{20,11,55},{20,11,77},{148,11,92},{4,11,938},{135,11,1831},{5,10,547},{7,10,424 +},{8,11,617},{138,11,351},{6,0,1286},{6,11,1668},{7,11,1499},{8,11,117},{9,11, +314},{138,11,174},{6,0,759},{6,0,894},{7,11,707},{139,11,563},{4,0,120},{135,0, +1894},{9,0,385},{149,0,17},{138,0,429},{133,11,403},{5,0,820},{135,0,931},{5,10, +133},{138,0,199},{6,0,151},{6,0,1675},{7,0,383},{151,0,10},{6,0,761},{136,10,187 +},{8,0,365},{10,10,0},{10,10,818},{139,10,988},{4,11,44},{5,11,311},{6,11,156},{ +7,11,639},{7,11,762},{7,11,1827},{9,11,8},{9,11,462},{148,11,83},{4,11,346},{7, +11,115},{9,11,180},{9,11,456},{138,11,363},{136,10,685},{7,0,1086},{145,0,46},{6 +,0,1624},{11,0,11},{12,0,422},{13,0,444},{142,0,360},{6,0,1020},{6,0,1260},{134, +0,1589},{4,0,43},{5,0,344},{5,0,357},{14,0,472},{150,0,58},{6,0,1864},{6,0,1866} +,{6,0,1868},{6,0,1869},{6,0,1874},{6,0,1877},{6,0,1903},{6,0,1911},{9,0,920},{9, +0,921},{9,0,924},{9,0,946},{9,0,959},{9,0,963},{9,0,970},{9,0,997},{9,0,1008},{9 +,0,1017},{12,0,795},{12,0,797},{12,0,798},{12,0,800},{12,0,803},{12,0,811},{12,0 +,820},{12,0,821},{12,0,839},{12,0,841},{12,0,848},{12,0,911},{12,0,921},{12,0, +922},{12,0,925},{12,0,937},{12,0,944},{12,0,945},{12,0,953},{15,0,184},{15,0,191 +},{15,0,199},{15,0,237},{15,0,240},{15,0,243},{15,0,246},{18,0,203},{21,0,40},{ +21,0,52},{21,0,57},{24,0,23},{24,0,28},{152,0,30},{134,0,725},{145,11,58},{133,0 +,888},{137,10,874},{4,0,711},{8,10,774},{10,10,670},{140,10,51},{144,11,40},{6, +11,185},{7,11,1899},{139,11,673},{137,10,701},{137,0,440},{4,11,327},{5,11,478}, +{7,11,1332},{8,11,753},{140,11,227},{4,10,127},{5,10,350},{6,10,356},{8,10,426}, +{9,10,572},{10,10,247},{139,10,312},{5,11,1020},{133,11,1022},{4,11,103},{133,11 +,401},{6,0,1913},{6,0,1926},{6,0,1959},{9,0,914},{9,0,939},{9,0,952},{9,0,979},{ +9,0,990},{9,0,998},{9,0,1003},{9,0,1023},{12,0,827},{12,0,834},{12,0,845},{12,0, +912},{12,0,935},{12,0,951},{15,0,172},{15,0,174},{18,0,198},{149,0,63},{4,11,499 +},{5,0,958},{5,0,987},{135,11,1421},{6,10,59},{6,10,1762},{7,0,885},{9,10,603},{ +141,10,397},{10,11,62},{141,11,164},{4,0,847},{135,0,326},{11,0,276},{142,0,293} +,{4,0,65},{4,11,96},{5,0,479},{5,0,1004},{7,0,1913},{8,0,317},{9,0,302},{10,0, +612},{141,0,22},{4,0,261},{135,0,510},{135,0,1514},{6,10,111},{7,10,4},{8,10,163 +},{8,10,776},{138,10,566},{4,0,291},{9,0,515},{12,0,152},{12,0,443},{13,0,392},{ +142,0,357},{7,11,399},{135,11,1492},{4,0,589},{139,0,282},{6,11,563},{135,10, +1994},{5,10,297},{135,10,1038},{4,0,130},{7,0,843},{135,0,1562},{5,0,42},{5,0, +879},{7,0,245},{7,0,324},{7,0,1532},{11,0,463},{11,0,472},{13,0,363},{144,0,52}, +{4,0,134},{133,0,372},{133,0,680},{136,10,363},{6,0,1997},{8,0,935},{136,0,977}, +{4,0,810},{135,0,1634},{135,10,1675},{4,11,910},{5,11,832},{135,0,1390},{7,10, +808},{8,11,266},{139,11,578},{132,0,644},{4,0,982},{138,0,867},{132,10,280},{135 +,0,540},{140,10,54},{135,0,123},{134,0,1978},{4,10,421},{133,10,548},{6,0,623},{ +136,0,789},{4,0,908},{5,0,359},{5,0,508},{6,0,1723},{7,0,343},{7,0,1996},{135,0, +2026},{134,0,1220},{4,0,341},{135,0,480},{6,10,254},{9,10,109},{138,10,103},{134 +,0,888},{8,11,528},{137,11,348},{4,11,20},{5,11,616},{7,0,1995},{8,0,299},{11,0, +890},{140,0,674},{135,11,1094},{134,10,1630},{4,0,238},{5,0,503},{6,0,179},{7,0, +2003},{8,0,381},{8,0,473},{9,0,149},{10,0,788},{15,0,45},{15,0,86},{20,0,110},{ +150,0,57},{133,10,671},{4,11,26},{5,11,429},{6,11,245},{7,11,704},{7,11,1379},{ +135,11,1474},{4,0,121},{5,0,156},{5,0,349},{9,0,431},{10,0,605},{142,0,342},{7, +11,943},{139,11,614},{132,10,889},{132,11,621},{7,10,1382},{7,10,1910},{135,11, +1382},{132,10,627},{133,10,775},{133,11,542},{133,11,868},{136,11,433},{6,0,1373 +},{7,0,1011},{11,10,362},{11,10,948},{140,10,388},{6,0,80},{7,0,173},{7,11,1495} +,{9,0,547},{10,0,730},{14,0,18},{150,0,39},{6,0,1694},{135,0,1974},{140,0,196},{ +4,0,923},{6,0,507},{6,0,1711},{7,10,451},{8,10,389},{12,10,490},{13,10,16},{13, +10,215},{13,10,351},{18,10,132},{147,10,125},{6,0,646},{134,0,1047},{135,10,841} +,{136,10,566},{6,0,1611},{135,0,1214},{139,0,926},{132,11,525},{132,0,595},{5,0, +240},{6,0,459},{7,0,12},{7,0,114},{7,0,949},{7,0,1753},{7,0,1805},{8,0,658},{9,0 +,1},{11,0,959},{141,0,446},{5,10,912},{134,10,1695},{132,0,446},{7,11,62},{12,11 +,45},{147,11,112},{5,10,236},{6,10,572},{8,10,492},{11,10,618},{144,10,56},{5,10 +,190},{136,10,318},{135,10,1376},{4,11,223},{6,11,359},{11,11,3},{13,11,108},{14 +,11,89},{144,11,22},{132,11,647},{134,0,490},{134,0,491},{134,0,1584},{135,11, +685},{138,11,220},{7,0,250},{136,0,507},{132,0,158},{4,0,140},{7,0,362},{8,0,209 +},{9,0,10},{9,0,160},{9,0,503},{9,0,614},{10,0,689},{11,0,327},{11,0,553},{11,0, +725},{11,0,767},{12,0,252},{12,0,583},{13,0,192},{14,0,269},{14,0,356},{148,0,50 +},{19,0,1},{19,0,26},{150,0,9},{132,11,109},{6,0,228},{7,0,1341},{9,0,408},{138, +0,343},{4,0,373},{5,0,283},{6,0,480},{7,0,609},{10,0,860},{138,0,878},{6,0,779}, +{134,0,1209},{4,0,557},{7,11,263},{7,11,628},{136,11,349},{132,0,548},{7,0,197}, +{8,0,142},{8,0,325},{9,0,150},{9,0,596},{10,0,350},{10,0,353},{11,0,74},{11,0, +315},{12,0,662},{12,0,681},{14,0,423},{143,0,141},{4,11,40},{10,11,67},{11,11, +117},{11,11,768},{139,11,935},{7,11,992},{8,11,301},{9,11,722},{12,11,63},{13,11 +,29},{14,11,161},{143,11,18},{6,0,1490},{138,11,532},{5,0,580},{7,0,378},{7,0, +674},{7,0,1424},{15,0,83},{15,11,83},{16,0,11},{144,11,11},{6,0,1057},{6,0,1335} +,{7,10,85},{7,10,247},{8,10,585},{10,0,316},{138,10,163},{4,0,169},{5,0,83},{6,0 +,399},{6,0,579},{6,0,1513},{7,0,692},{7,0,846},{7,0,1015},{7,0,1799},{8,0,403},{ +9,0,394},{10,0,133},{12,0,4},{12,0,297},{12,0,452},{16,0,81},{18,0,25},{21,0,14} +,{22,0,12},{151,0,18},{134,0,1106},{7,0,1546},{11,0,299},{142,0,407},{134,0,1192 +},{132,0,177},{5,0,411},{135,0,653},{7,0,439},{10,0,727},{11,0,260},{139,0,684}, +{138,10,145},{147,10,83},{5,0,208},{7,0,753},{135,0,1528},{137,11,617},{135,10, +1922},{135,11,825},{4,10,124},{10,10,457},{11,0,422},{11,10,121},{11,10,169},{11 +,10,870},{12,10,214},{13,0,389},{14,10,187},{143,10,77},{11,0,615},{11,11,615},{ +15,0,58},{143,11,58},{9,0,618},{138,0,482},{6,0,1952},{6,0,1970},{142,0,505},{7, +10,1193},{135,11,1838},{133,0,242},{135,10,1333},{6,10,107},{7,10,638},{7,10, +1632},{137,10,396},{133,0,953},{5,10,370},{134,10,1756},{5,11,28},{6,11,204},{10 +,11,320},{10,11,583},{13,11,502},{14,11,72},{14,11,274},{14,11,312},{14,11,344}, +{15,11,159},{16,11,62},{16,11,69},{17,11,30},{18,11,42},{18,11,53},{18,11,84},{ +18,11,140},{19,11,68},{19,11,85},{20,11,5},{20,11,45},{20,11,101},{22,11,7},{150 +,11,20},{4,11,558},{6,11,390},{7,11,162},{7,11,689},{9,11,360},{138,11,653},{11, +0,802},{141,0,67},{133,10,204},{133,0,290},{5,10,970},{134,10,1706},{132,0,380}, +{5,0,52},{7,0,277},{9,0,368},{139,0,791},{5,11,856},{6,11,1672},{6,11,1757},{6, +11,1781},{7,11,1150},{7,11,1425},{7,11,1453},{140,11,513},{5,11,92},{7,10,3},{10 +,11,736},{140,11,102},{4,0,112},{5,0,653},{5,10,483},{5,10,685},{6,10,489},{7,10 +,1204},{136,10,394},{132,10,921},{5,10,1007},{134,0,1028},{5,11,590},{9,11,213}, +{145,11,91},{135,10,1696},{10,0,138},{139,0,476},{5,0,725},{5,0,727},{135,0,1811 +},{4,0,979},{6,0,1821},{6,0,1838},{8,0,876},{8,0,883},{8,0,889},{8,0,893},{8,0, +895},{10,0,934},{12,0,720},{14,0,459},{148,0,123},{135,11,551},{4,0,38},{6,0,435 +},{7,0,307},{7,0,999},{7,0,1481},{7,0,1732},{7,0,1738},{8,0,371},{9,0,414},{11,0 +,316},{12,0,52},{13,0,420},{147,0,100},{135,0,1296},{132,10,712},{134,10,1629},{ +133,0,723},{134,0,651},{136,11,191},{9,11,791},{10,11,93},{11,11,301},{16,11,13} +,{17,11,23},{18,11,135},{19,11,12},{20,11,1},{20,11,12},{148,11,14},{136,11,503} +,{6,11,466},{135,11,671},{6,0,1200},{134,0,1330},{135,0,1255},{134,0,986},{5,0, +109},{6,0,1784},{7,0,1895},{12,0,296},{140,0,302},{135,11,983},{133,10,485},{134 +,0,660},{134,0,800},{4,10,285},{5,0,216},{5,0,294},{5,10,317},{6,0,591},{6,10, +301},{7,0,1879},{7,10,7},{8,10,153},{9,0,141},{9,0,270},{9,0,679},{10,0,159},{10 +,10,766},{11,0,197},{11,0,438},{11,10,468},{12,0,538},{12,0,559},{12,10,467},{13 +,10,143},{14,0,144},{14,0,167},{143,0,67},{136,0,945},{134,0,1090},{137,0,81},{ +12,11,468},{19,11,96},{148,11,24},{134,0,391},{138,11,241},{7,0,322},{136,0,249} +,{134,0,1412},{135,11,795},{5,0,632},{138,0,526},{136,10,819},{6,0,144},{7,0,948 +},{7,0,1042},{7,11,954},{8,0,235},{8,0,461},{9,0,453},{9,0,796},{10,0,354},{145, +0,77},{139,10,917},{6,0,940},{134,0,1228},{4,0,362},{7,0,52},{135,0,303},{6,11, +549},{8,11,34},{8,11,283},{9,11,165},{138,11,475},{7,11,370},{7,11,1007},{7,11, +1177},{135,11,1565},{5,11,652},{5,11,701},{135,11,449},{5,0,196},{6,0,486},{7,0, +212},{8,0,309},{136,0,346},{6,10,1719},{6,10,1735},{7,10,2016},{7,10,2020},{8,10 +,837},{137,10,852},{6,11,159},{6,11,364},{7,11,516},{7,11,1439},{137,11,518},{ +135,0,1912},{135,0,1290},{132,0,686},{141,11,151},{138,0,625},{136,0,706},{138, +10,568},{139,0,412},{4,0,30},{133,0,43},{8,10,67},{138,10,419},{7,0,967},{141,0, +11},{12,0,758},{14,0,441},{142,0,462},{10,10,657},{14,10,297},{142,10,361},{139, +10,729},{4,0,220},{135,0,1535},{7,11,501},{9,11,111},{10,11,141},{11,11,332},{13 +,11,43},{13,11,429},{14,11,130},{14,11,415},{145,11,102},{4,0,950},{6,0,1859},{7 +,0,11},{8,0,873},{12,0,710},{12,0,718},{12,0,748},{12,0,765},{148,0,124},{5,11, +149},{5,11,935},{136,11,233},{142,11,291},{134,0,1579},{7,0,890},{8,10,51},{9,10 +,868},{10,10,833},{12,10,481},{12,10,570},{148,10,106},{141,0,2},{132,10,445},{ +136,11,801},{135,0,1774},{7,0,1725},{138,0,393},{5,0,263},{134,0,414},{132,11, +322},{133,10,239},{7,0,456},{7,10,1990},{8,10,130},{139,10,720},{137,0,818},{5, +10,123},{6,10,530},{7,10,348},{135,10,1419},{135,10,2024},{6,0,178},{6,0,1750},{ +8,0,251},{9,0,690},{10,0,155},{10,0,196},{10,0,373},{11,0,698},{13,0,155},{148,0 +,93},{5,0,97},{137,0,393},{134,0,674},{11,0,223},{140,0,168},{132,10,210},{139, +11,464},{6,0,1639},{146,0,159},{139,11,2},{7,0,934},{8,0,647},{17,0,97},{19,0,59 +},{150,0,2},{132,0,191},{4,10,430},{5,0,165},{7,11,357},{9,0,346},{10,0,655},{ +139,0,885},{133,0,877},{5,10,213},{133,11,406},{8,0,128},{139,0,179},{6,11,69},{ +135,11,117},{135,0,1297},{11,11,43},{13,11,72},{141,11,142},{135,11,1830},{142,0 +,164},{5,0,57},{6,0,101},{6,0,586},{6,0,1663},{7,0,132},{7,0,1154},{7,0,1415},{7 +,0,1507},{12,0,493},{15,0,105},{151,0,15},{5,0,459},{7,0,1073},{8,0,241},{136,0, +334},{133,11,826},{133,10,108},{5,10,219},{10,11,132},{11,11,191},{11,11,358},{ +139,11,460},{6,0,324},{6,0,520},{7,0,338},{7,0,1729},{8,0,228},{139,0,750},{4,10 +,193},{5,10,916},{7,10,364},{10,10,398},{10,10,726},{11,10,317},{11,10,626},{12, +10,142},{12,10,288},{12,10,678},{13,10,313},{15,10,113},{18,10,114},{21,0,30},{ +150,0,53},{6,11,110},{135,11,1681},{135,0,910},{6,10,241},{7,10,907},{8,10,832}, +{9,10,342},{10,10,729},{11,10,284},{11,10,445},{11,10,651},{11,10,863},{13,10, +398},{146,10,99},{5,11,1000},{7,0,705},{7,11,733},{9,0,734},{137,11,583},{4,0,73 +},{6,0,612},{7,0,927},{7,0,1822},{8,0,217},{9,0,765},{9,0,766},{10,0,408},{11,0, +51},{11,0,793},{12,0,266},{15,0,158},{20,0,89},{150,0,32},{4,11,297},{6,11,529}, +{7,0,1330},{7,11,152},{7,11,713},{7,11,1845},{8,11,710},{8,11,717},{140,11,639}, +{5,0,389},{136,0,636},{134,0,1409},{4,10,562},{9,10,254},{139,10,879},{134,0,893 +},{132,10,786},{4,11,520},{135,11,575},{136,0,21},{140,0,721},{136,0,959},{7,11, +1428},{7,11,1640},{9,11,169},{9,11,182},{9,11,367},{9,11,478},{9,11,506},{9,11, +551},{9,11,648},{9,11,651},{9,11,697},{9,11,705},{9,11,725},{9,11,787},{9,11,794 +},{10,11,198},{10,11,214},{10,11,267},{10,11,275},{10,11,456},{10,11,551},{10,11 +,561},{10,11,613},{10,11,627},{10,11,668},{10,11,675},{10,11,691},{10,11,695},{ +10,11,707},{10,11,715},{11,11,183},{11,11,201},{11,11,244},{11,11,262},{11,11, +352},{11,11,439},{11,11,493},{11,11,572},{11,11,591},{11,11,608},{11,11,611},{11 +,11,646},{11,11,674},{11,11,711},{11,11,751},{11,11,761},{11,11,776},{11,11,785} +,{11,11,850},{11,11,853},{11,11,862},{11,11,865},{11,11,868},{11,11,898},{11,11, +902},{11,11,903},{11,11,910},{11,11,932},{11,11,942},{11,11,957},{11,11,967},{11 +,11,972},{12,11,148},{12,11,195},{12,11,220},{12,11,237},{12,11,318},{12,11,339} +,{12,11,393},{12,11,445},{12,11,450},{12,11,474},{12,11,509},{12,11,533},{12,11, +591},{12,11,594},{12,11,597},{12,11,621},{12,11,633},{12,11,642},{13,11,59},{13, +11,60},{13,11,145},{13,11,239},{13,11,250},{13,11,273},{13,11,329},{13,11,344},{ +13,11,365},{13,11,372},{13,11,387},{13,11,403},{13,11,414},{13,11,456},{13,11, +478},{13,11,483},{13,11,489},{14,11,55},{14,11,57},{14,11,81},{14,11,90},{14,11, +148},{14,11,239},{14,11,266},{14,11,321},{14,11,326},{14,11,327},{14,11,330},{14 +,11,347},{14,11,355},{14,11,401},{14,11,411},{14,11,414},{14,11,416},{14,11,420} +,{15,11,61},{15,11,74},{15,11,87},{15,11,88},{15,11,94},{15,11,96},{15,11,116},{ +15,11,149},{15,11,154},{16,11,50},{16,11,63},{16,11,73},{17,11,2},{17,11,66},{17 +,11,92},{17,11,103},{17,11,112},{18,11,50},{18,11,54},{18,11,82},{18,11,86},{18, +11,90},{18,11,111},{18,11,115},{18,11,156},{19,11,40},{19,11,79},{20,11,78},{149 +,11,22},{137,11,170},{134,0,1433},{135,11,1307},{139,11,411},{5,0,189},{7,0,442} +,{7,0,443},{8,0,281},{12,0,174},{141,0,261},{6,10,216},{7,10,901},{7,10,1343},{ +136,10,493},{5,11,397},{6,11,154},{7,10,341},{7,11,676},{8,11,443},{8,11,609},{9 +,11,24},{9,11,325},{10,11,35},{11,10,219},{11,11,535},{11,11,672},{11,11,1018},{ +12,11,637},{144,11,30},{6,0,2},{7,0,191},{7,0,446},{7,0,1262},{7,0,1737},{8,0,22 +},{8,0,270},{8,0,612},{9,0,4},{9,0,312},{9,0,436},{9,0,626},{10,0,216},{10,0,311 +},{10,0,521},{10,0,623},{11,0,72},{11,0,330},{11,0,455},{12,0,321},{12,0,504},{ +12,0,530},{12,0,543},{13,0,17},{13,0,156},{13,0,334},{14,0,131},{17,0,60},{148,0 +,64},{7,0,354},{10,0,410},{139,0,815},{139,10,130},{7,10,1734},{137,11,631},{10, +10,115},{11,10,420},{12,0,425},{13,10,404},{14,10,346},{15,0,112},{143,10,54},{6 +,0,60},{6,0,166},{7,0,374},{7,0,670},{7,0,1327},{8,0,411},{8,0,435},{9,0,653},{9 +,0,740},{10,0,385},{11,0,222},{11,0,324},{11,0,829},{140,0,611},{7,0,1611},{13,0 +,14},{15,0,44},{19,0,13},{148,0,76},{133,11,981},{4,11,56},{7,11,1791},{8,11,607 +},{8,11,651},{11,11,465},{11,11,835},{12,11,337},{141,11,480},{5,10,1011},{6,0, +1478},{136,10,701},{139,0,596},{5,0,206},{134,0,398},{4,10,54},{5,10,666},{7,10, +1039},{7,10,1130},{9,10,195},{138,10,302},{7,0,50},{9,11,158},{138,11,411},{135, +11,1120},{6,0,517},{6,10,1669},{7,0,1159},{10,0,621},{139,0,192},{4,0,592},{6,0, +600},{135,0,1653},{10,0,223},{139,0,645},{136,11,139},{7,0,64},{136,0,245},{142, +0,278},{6,11,622},{135,11,1030},{136,0,604},{134,0,1502},{138,0,265},{141,11,168 +},{7,0,1763},{140,0,310},{7,10,798},{139,11,719},{7,11,160},{10,11,624},{142,11, +279},{132,11,363},{7,10,122},{9,10,259},{10,10,84},{11,10,470},{12,10,541},{141, +10,379},{5,0,129},{6,0,61},{135,0,947},{134,0,1356},{135,11,1191},{13,0,505},{ +141,0,506},{5,10,82},{5,10,131},{7,10,1755},{8,10,31},{9,10,168},{9,10,764},{11, +0,1000},{139,10,869},{134,0,966},{134,10,605},{134,11,292},{5,11,177},{6,11,616} +,{7,11,827},{9,11,525},{138,11,656},{135,11,1486},{138,11,31},{5,10,278},{137,10 +,68},{4,10,163},{5,10,201},{5,10,307},{5,10,310},{6,10,335},{7,10,284},{136,10, +165},{6,0,839},{135,10,1660},{136,10,781},{6,10,33},{135,10,1244},{133,0,637},{4 +,11,161},{133,11,631},{137,0,590},{7,10,1953},{136,10,720},{5,0,280},{7,0,1226}, +{138,10,203},{134,0,1386},{5,0,281},{6,0,1026},{6,10,326},{7,10,677},{137,10,425 +},{7,11,1557},{135,11,1684},{135,0,1064},{9,11,469},{9,11,709},{12,11,512},{14, +11,65},{145,11,12},{134,0,917},{10,11,229},{11,11,73},{11,11,376},{139,11,433},{ +7,0,555},{7,10,1316},{7,10,1412},{7,10,1839},{9,0,192},{9,10,589},{11,10,241},{ +11,10,676},{11,10,811},{11,10,891},{12,10,140},{12,10,346},{12,10,479},{13,0,30} +,{13,0,49},{13,10,381},{14,10,188},{15,0,150},{16,0,76},{18,10,30},{148,0,52},{ +149,0,15},{6,0,1882},{6,0,1883},{6,0,1897},{9,0,945},{9,0,1014},{9,0,1020},{12,0 +,823},{12,0,842},{12,0,866},{12,0,934},{15,0,242},{146,0,208},{6,0,965},{134,0, +1499},{7,0,33},{7,0,120},{8,0,489},{9,0,319},{10,0,820},{11,0,1004},{12,0,379},{ +12,0,679},{13,0,117},{13,0,412},{14,0,25},{15,0,52},{15,0,161},{16,0,47},{149,0, +2},{6,11,558},{7,11,651},{8,11,421},{9,11,0},{138,11,34},{4,0,937},{5,0,801},{5, +10,358},{7,0,473},{7,10,1184},{10,10,662},{13,10,212},{13,10,304},{13,10,333},{ +145,10,98},{132,0,877},{6,0,693},{134,0,824},{132,0,365},{7,11,1832},{138,11,374 +},{5,0,7},{139,0,774},{4,0,734},{5,0,662},{134,0,430},{4,0,746},{135,0,1090},{5, +0,360},{8,0,237},{10,0,231},{147,0,124},{138,11,348},{6,11,6},{7,11,81},{7,11, +771},{7,11,1731},{9,11,405},{138,11,421},{6,0,740},{137,0,822},{133,10,946},{7,0 +,1485},{136,0,929},{7,10,411},{8,10,631},{9,10,323},{10,10,355},{11,10,491},{12, +10,143},{12,10,402},{13,10,73},{14,10,408},{15,10,107},{146,10,71},{135,10,590}, +{5,11,881},{133,11,885},{150,11,25},{4,0,852},{5,11,142},{134,11,546},{7,10,1467 +},{8,10,328},{10,10,544},{11,10,955},{13,10,320},{145,10,83},{9,0,17},{10,0,291} +,{11,10,511},{13,10,394},{14,10,298},{14,10,318},{146,10,103},{5,11,466},{11,11, +571},{12,11,198},{13,11,283},{14,11,186},{15,11,21},{143,11,103},{134,0,1001},{4 +,11,185},{5,11,257},{5,11,839},{5,11,936},{7,11,171},{9,11,399},{10,11,258},{10, +11,395},{10,11,734},{11,11,1014},{12,11,23},{13,11,350},{14,11,150},{147,11,6},{ +143,0,35},{132,0,831},{5,10,835},{134,10,483},{4,0,277},{5,0,608},{6,0,493},{7,0 +,457},{7,11,404},{7,11,1377},{7,11,1430},{7,11,2017},{8,11,149},{8,11,239},{8,11 +,512},{8,11,793},{8,11,818},{9,11,474},{9,11,595},{10,11,122},{10,11,565},{10,11 +,649},{10,11,783},{11,11,239},{11,11,295},{11,11,447},{11,11,528},{11,11,639},{ +11,11,800},{11,11,936},{12,0,384},{12,11,25},{12,11,73},{12,11,77},{12,11,157},{ +12,11,316},{12,11,390},{12,11,391},{12,11,394},{12,11,395},{12,11,478},{12,11, +503},{12,11,592},{12,11,680},{13,11,50},{13,11,53},{13,11,132},{13,11,198},{13, +11,275},{13,11,322},{13,11,415},{14,11,71},{14,11,257},{14,11,395},{15,11,71},{ +15,11,136},{17,11,123},{18,11,93},{147,11,58},{134,0,1351},{7,0,27},{135,0,316}, +{136,11,712},{136,0,984},{133,0,552},{137,0,264},{132,0,401},{6,0,710},{6,0,1111 +},{134,0,1343},{134,0,1211},{9,0,543},{10,0,524},{11,0,108},{11,0,653},{12,0,524 +},{13,0,123},{14,0,252},{16,0,18},{19,0,38},{20,0,26},{20,0,65},{21,0,3},{151,0, +11},{4,0,205},{5,0,623},{7,0,104},{8,0,519},{137,0,716},{132,10,677},{4,11,377}, +{152,11,13},{135,11,1673},{7,0,579},{9,0,41},{9,0,244},{9,0,669},{10,0,5},{11,0, +861},{11,0,951},{139,0,980},{132,0,717},{136,0,1011},{132,0,805},{4,11,180},{135 +,11,1906},{132,10,777},{132,10,331},{132,0,489},{4,11,491},{5,10,747},{134,0, +1024},{135,11,1182},{4,11,171},{138,11,234},{4,11,586},{7,11,1186},{138,11,631}, +{135,0,892},{135,11,336},{9,11,931},{10,11,334},{148,11,71},{137,0,473},{6,0,864 +},{11,11,926},{140,0,659},{7,0,819},{9,0,26},{9,0,392},{10,0,152},{10,0,226},{11 +,0,19},{12,0,276},{12,0,426},{12,0,589},{13,0,460},{15,0,97},{19,0,48},{148,0, +104},{135,0,51},{133,10,326},{4,10,691},{146,10,16},{9,0,130},{10,10,680},{10,10 +,793},{11,0,765},{141,10,357},{133,11,765},{6,10,32},{7,10,385},{7,10,757},{7,10 +,1916},{8,0,229},{8,10,94},{8,10,711},{9,10,541},{10,10,162},{10,10,795},{11,10, +989},{11,10,1010},{12,10,14},{142,10,308},{7,11,474},{137,11,578},{132,0,674},{ +132,0,770},{5,0,79},{7,0,1027},{7,0,1477},{139,0,52},{133,11,424},{134,0,1666},{ +6,0,409},{6,10,349},{6,10,1682},{7,10,1252},{8,10,112},{8,11,714},{9,10,435},{9, +10,668},{10,10,290},{10,10,319},{10,10,815},{11,10,180},{11,10,837},{12,10,240}, +{13,10,152},{13,10,219},{142,10,158},{5,0,789},{134,0,195},{4,0,251},{4,0,688},{ +7,0,513},{135,0,1284},{132,10,581},{9,11,420},{10,11,269},{10,11,285},{10,11,576 +},{11,11,397},{13,11,175},{145,11,90},{6,10,126},{7,10,573},{8,10,397},{142,10, +44},{132,11,429},{133,0,889},{4,0,160},{5,0,330},{7,0,1434},{136,0,174},{7,11,18 +},{7,11,699},{7,11,1966},{8,11,752},{9,11,273},{9,11,412},{9,11,703},{10,11,71}, +{10,11,427},{10,11,508},{146,11,97},{6,0,872},{134,0,899},{133,10,926},{134,0, +1126},{134,0,918},{4,11,53},{5,11,186},{135,11,752},{7,0,268},{136,0,569},{134,0 +,1224},{6,0,1361},{7,10,1232},{137,10,531},{8,11,575},{10,11,289},{139,11,319},{ +133,10,670},{132,11,675},{133,0,374},{135,10,1957},{133,0,731},{11,0,190},{11,11 +,190},{15,0,49},{143,11,49},{4,0,626},{5,0,506},{5,0,642},{6,0,425},{10,0,202},{ +139,0,141},{137,0,444},{7,10,242},{135,10,1942},{6,11,209},{8,11,468},{9,11,210} +,{11,11,36},{12,11,28},{12,11,630},{13,11,21},{13,11,349},{14,11,7},{145,11,13}, +{4,11,342},{135,11,1179},{5,10,834},{7,10,1202},{8,10,14},{9,10,481},{137,10,880 +},{4,11,928},{133,11,910},{4,11,318},{4,11,496},{7,11,856},{139,11,654},{136,0, +835},{7,0,1526},{138,10,465},{151,0,17},{135,0,477},{4,10,357},{6,10,172},{7,10, +143},{137,10,413},{6,0,1374},{138,0,994},{4,10,590},{146,0,76},{7,0,287},{8,0, +355},{9,0,293},{137,0,743},{134,0,1389},{7,11,915},{8,11,247},{147,11,0},{4,11, +202},{5,11,382},{6,11,454},{7,11,936},{7,11,1803},{8,11,758},{9,11,375},{9,11, +895},{10,11,743},{10,11,792},{11,11,978},{11,11,1012},{142,11,109},{5,0,384},{8, +0,455},{140,0,48},{132,11,390},{5,10,169},{7,10,333},{136,10,45},{5,0,264},{134, +0,184},{138,11,791},{133,11,717},{132,10,198},{6,11,445},{7,11,332},{137,11,909} +,{136,0,1001},{4,10,24},{5,10,140},{5,10,185},{7,10,1500},{11,10,565},{139,10, +838},{134,11,578},{5,0,633},{6,0,28},{135,0,1323},{132,0,851},{136,11,267},{7,0, +359},{8,0,243},{140,0,175},{4,10,334},{133,10,593},{141,11,87},{136,11,766},{10, +0,287},{10,11,287},{12,0,138},{140,11,138},{4,0,105},{132,0,740},{140,10,116},{ +134,0,857},{135,11,1841},{6,0,1402},{137,0,819},{132,11,584},{132,10,709},{133, +10,897},{5,0,224},{13,0,174},{146,0,52},{135,10,1840},{4,10,608},{133,10,497},{ +139,11,60},{4,0,758},{135,0,1649},{4,11,226},{4,11,326},{135,11,1770},{5,11,426} +,{8,11,30},{9,11,2},{11,11,549},{147,11,122},{135,10,2039},{6,10,540},{136,10, +136},{4,0,573},{4,10,897},{5,10,786},{136,0,655},{7,0,351},{139,0,128},{133,10, +999},{4,10,299},{135,10,1004},{133,0,918},{132,11,345},{4,11,385},{7,11,265},{ +135,11,587},{133,10,456},{136,10,180},{6,0,687},{134,0,1537},{4,11,347},{5,11, +423},{5,11,996},{135,11,1329},{132,10,755},{7,11,1259},{9,11,125},{11,11,65},{ +140,11,285},{5,11,136},{6,11,136},{136,11,644},{134,0,1525},{4,0,1009},{135,0, +1139},{139,10,338},{132,0,340},{135,10,1464},{8,0,847},{10,0,861},{10,0,876},{10 +,0,889},{10,0,922},{10,0,929},{10,0,933},{12,0,784},{140,0,791},{139,0,176},{9, +11,134},{10,11,2},{10,11,27},{10,11,333},{11,11,722},{143,11,1},{4,11,433},{133, +11,719},{5,0,985},{7,0,509},{7,0,529},{145,0,96},{132,0,615},{4,10,890},{5,10, +805},{5,10,819},{5,10,961},{6,10,396},{6,10,1631},{6,10,1678},{7,10,1967},{7,10, +2041},{9,10,630},{11,10,8},{11,10,1019},{12,10,176},{13,10,225},{14,10,292},{149 +,10,24},{135,0,1919},{134,0,1131},{144,11,21},{144,11,51},{135,10,1815},{4,0,247 +},{7,10,1505},{10,10,190},{10,10,634},{11,10,792},{12,10,358},{140,10,447},{5,10 +,0},{6,10,536},{7,10,604},{13,10,445},{145,10,126},{4,0,184},{5,0,390},{6,0,337} +,{7,0,23},{7,0,494},{7,0,618},{7,0,1456},{8,0,27},{8,0,599},{10,0,153},{139,0, +710},{6,10,232},{6,10,412},{7,10,1074},{8,10,9},{8,10,157},{8,10,786},{9,10,196} +,{9,10,352},{9,10,457},{10,10,337},{11,10,232},{11,10,877},{12,10,480},{140,10, +546},{7,10,958},{141,0,38},{4,10,382},{136,10,579},{4,10,212},{135,10,1206},{4, +11,555},{8,11,536},{138,11,288},{11,11,139},{139,11,171},{9,11,370},{138,11,90}, +{132,0,1015},{134,0,1088},{5,10,655},{135,11,977},{134,0,1585},{17,10,67},{147, +10,74},{10,0,227},{11,0,497},{11,0,709},{140,0,415},{6,0,360},{7,0,1664},{136,0, +478},{6,10,231},{7,0,95},{136,10,423},{140,11,65},{4,11,257},{135,11,2031},{135, +11,1768},{133,10,300},{139,11,211},{136,0,699},{6,10,237},{7,10,611},{8,10,100}, +{9,10,416},{11,10,335},{12,10,173},{146,10,101},{14,0,26},{146,0,150},{6,0,581}, +{135,0,1119},{135,10,1208},{132,0,739},{6,11,83},{6,11,1733},{135,11,1389},{137, +0,869},{4,0,67},{5,0,422},{7,0,1037},{7,0,1289},{7,0,1555},{9,0,741},{145,0,108} +,{133,10,199},{12,10,427},{146,10,38},{136,0,464},{142,0,42},{8,11,501},{9,11, +696},{138,0,96},{134,11,592},{4,0,512},{4,0,966},{5,0,342},{6,0,1855},{8,0,869}, +{8,0,875},{8,0,901},{144,0,26},{8,0,203},{11,0,823},{11,0,846},{12,0,482},{13,0, +277},{13,0,302},{13,0,464},{14,0,205},{142,0,221},{4,0,449},{133,0,718},{7,11, +1718},{9,11,95},{9,11,274},{10,11,279},{10,11,317},{10,11,420},{11,11,303},{11, +11,808},{12,11,134},{12,11,367},{13,11,149},{13,11,347},{14,11,349},{14,11,406}, +{18,11,22},{18,11,89},{18,11,122},{147,11,47},{133,11,26},{4,0,355},{6,0,311},{9 +,0,256},{138,0,404},{132,11,550},{6,10,312},{6,10,1715},{10,0,758},{10,10,584},{ +11,10,546},{11,10,692},{12,10,259},{12,10,295},{13,10,46},{141,10,154},{136,11, +822},{4,11,902},{5,0,827},{5,11,809},{6,11,122},{135,11,896},{5,0,64},{140,0,581 +},{4,0,442},{6,0,739},{7,0,1047},{7,0,1352},{7,0,1643},{7,11,1911},{9,11,449},{ +10,11,192},{138,11,740},{135,11,262},{132,10,588},{133,11,620},{4,11,34},{5,0, +977},{5,11,574},{6,0,288},{7,0,528},{7,11,279},{7,11,1624},{136,11,601},{4,10, +231},{5,10,61},{6,0,1375},{6,10,104},{7,10,729},{7,10,964},{7,10,1658},{140,10, +414},{6,10,263},{138,10,757},{132,10,320},{4,0,254},{5,11,332},{7,0,1309},{135, +11,1309},{6,11,261},{8,11,182},{139,11,943},{132,10,225},{6,0,12},{135,0,1219},{ +4,0,275},{6,11,1721},{12,0,376},{141,11,490},{4,11,933},{133,11,880},{4,10,405}, +{6,0,951},{6,0,1109},{6,0,1181},{7,0,154},{7,10,817},{14,10,58},{17,10,37},{146, +10,124},{5,10,974},{134,0,1520},{134,0,1753},{6,0,369},{6,0,502},{7,0,1036},{8,0 +,348},{9,0,452},{10,0,26},{11,0,224},{11,0,387},{11,0,772},{12,0,95},{12,0,629}, +{13,0,195},{13,0,207},{13,0,241},{14,0,260},{14,0,270},{143,0,140},{132,0,269},{ +5,0,480},{7,0,532},{7,0,1197},{7,0,1358},{8,0,291},{11,0,349},{142,0,396},{5,10, +235},{7,10,1239},{11,10,131},{140,10,370},{7,10,956},{7,10,1157},{7,10,1506},{7, +10,1606},{7,10,1615},{7,10,1619},{7,10,1736},{7,10,1775},{8,10,590},{9,10,324},{ +9,10,736},{9,10,774},{9,10,776},{9,10,784},{10,10,567},{10,10,708},{11,10,518},{ +11,10,613},{11,10,695},{11,10,716},{11,10,739},{11,10,770},{11,10,771},{11,10, +848},{11,10,857},{11,10,931},{11,10,947},{12,10,326},{12,10,387},{12,10,484},{12 +,10,528},{12,10,552},{12,10,613},{13,10,189},{13,10,256},{13,10,340},{13,10,432} +,{13,10,436},{13,10,440},{13,10,454},{14,10,174},{14,10,220},{14,10,284},{14,10, +390},{145,10,121},{8,11,598},{9,11,664},{138,11,441},{9,10,137},{138,10,221},{ +133,11,812},{148,0,15},{134,0,1341},{4,11,137},{6,0,1017},{7,11,1178},{135,11, +1520},{7,10,390},{138,10,140},{7,11,1260},{135,11,1790},{137,11,191},{135,10, +1144},{6,0,1810},{7,0,657},{8,0,886},{10,0,857},{14,0,440},{144,0,96},{6,11,1661 +},{7,11,1975},{7,11,2009},{7,11,2011},{136,0,533},{6,0,1453},{134,10,464},{132, +11,715},{5,10,407},{11,10,204},{11,10,243},{11,10,489},{12,10,293},{19,10,37},{ +20,10,73},{150,10,38},{133,11,703},{4,0,211},{5,10,325},{7,0,1483},{8,10,5},{8, +10,227},{9,10,105},{10,10,585},{140,10,614},{4,0,332},{5,0,335},{6,0,238},{7,0, +269},{7,0,811},{7,0,1797},{8,0,836},{9,0,507},{141,0,242},{5,11,89},{7,11,1915}, +{9,11,185},{9,11,235},{9,11,496},{10,11,64},{10,11,270},{10,11,403},{10,11,469}, +{10,11,529},{10,11,590},{11,11,140},{11,11,860},{13,11,1},{13,11,422},{14,11,341 +},{14,11,364},{17,11,93},{18,11,113},{19,11,97},{147,11,113},{133,11,695},{5,11, +6},{6,10,621},{6,11,183},{7,11,680},{7,11,978},{7,11,1013},{7,11,1055},{12,11, +230},{13,10,504},{13,11,172},{16,0,19},{146,11,29},{136,0,156},{133,0,1009},{6, +11,29},{139,11,63},{134,0,820},{134,10,218},{7,10,454},{7,10,782},{8,10,768},{ +140,10,686},{5,0,228},{6,0,203},{7,0,156},{8,0,347},{9,0,265},{15,11,8},{18,0,39 +},{18,11,39},{20,0,54},{20,11,54},{21,0,31},{21,11,31},{22,0,3},{22,11,3},{23,0, +0},{151,11,0},{7,0,1131},{135,0,1468},{144,10,0},{134,0,1276},{10,10,676},{140, +10,462},{132,11,311},{134,11,1740},{7,11,170},{8,11,90},{8,11,177},{8,11,415},{ +11,11,714},{142,11,281},{134,10,164},{6,0,1792},{138,0,849},{150,10,50},{5,0,291 +},{5,0,318},{7,0,765},{8,11,522},{9,0,389},{12,0,548},{142,11,328},{11,11,91},{ +13,11,129},{15,11,101},{145,11,125},{4,11,494},{6,11,74},{7,11,44},{7,11,407},{8 +,11,551},{12,11,17},{15,11,5},{148,11,11},{4,11,276},{133,11,296},{6,10,343},{7, +10,195},{7,11,1777},{9,10,226},{10,10,197},{10,10,575},{11,10,502},{139,10,899}, +{10,0,525},{139,0,82},{4,11,7},{5,11,90},{5,11,158},{6,11,542},{7,11,221},{7,11, +1574},{9,11,490},{10,11,540},{11,11,443},{11,11,757},{142,0,453},{135,0,666},{22 +,10,29},{150,11,29},{4,0,422},{147,10,8},{5,0,355},{145,0,0},{6,0,1873},{7,11, +588},{9,0,918},{9,11,175},{138,11,530},{143,11,31},{7,10,1125},{9,10,143},{11,0, +165},{14,10,405},{150,10,21},{9,0,260},{137,0,905},{5,11,872},{6,11,57},{6,11, +479},{6,11,562},{7,11,471},{7,11,1060},{9,11,447},{9,11,454},{141,11,6},{138,11, +704},{133,0,865},{5,0,914},{134,0,1625},{133,0,234},{5,11,31},{6,11,614},{7,0, +1383},{145,11,61},{7,11,1200},{138,11,460},{6,11,424},{135,11,1866},{136,0,306}, +{5,10,959},{12,11,30},{13,11,148},{14,11,87},{14,11,182},{16,11,42},{18,11,92},{ +148,11,70},{6,0,1919},{6,0,1921},{9,0,923},{9,0,930},{9,0,941},{9,0,949},{9,0, +987},{9,0,988},{9,0,992},{12,0,802},{12,0,815},{12,0,856},{12,0,885},{12,0,893}, +{12,0,898},{12,0,919},{12,0,920},{12,0,941},{12,0,947},{15,0,183},{15,0,185},{15 +,0,189},{15,0,197},{15,0,202},{15,0,233},{15,11,156},{18,0,218},{18,0,219},{146, +0,233},{135,10,1759},{136,10,173},{5,11,13},{6,11,142},{13,0,163},{13,0,180},{18 +,0,78},{148,0,35},{134,10,266},{6,11,97},{7,11,116},{8,11,322},{8,11,755},{9,11, +548},{10,11,714},{11,11,884},{141,11,324},{135,0,1312},{9,0,814},{137,11,676},{ +133,0,707},{135,0,1493},{6,0,421},{7,0,61},{7,0,1540},{10,0,11},{138,0,501},{7, +11,866},{7,11,1163},{12,0,733},{140,0,766},{137,0,341},{142,0,98},{145,11,115},{ +135,11,1111},{136,10,300},{136,0,1014},{8,11,1},{9,11,112},{138,11,326},{132,11, +730},{5,11,488},{6,11,527},{7,11,489},{7,11,1636},{8,11,121},{8,11,144},{8,11, +359},{9,11,193},{9,11,241},{9,11,336},{9,11,882},{11,11,266},{11,11,372},{11,11, +944},{12,11,401},{140,11,641},{6,0,971},{134,0,1121},{6,0,102},{7,0,72},{15,0, +142},{147,0,67},{151,0,30},{135,0,823},{134,0,1045},{5,10,427},{5,10,734},{7,10, +478},{136,10,52},{7,0,1930},{11,10,217},{142,10,165},{6,0,1512},{135,0,1870},{9, +11,31},{10,11,244},{10,11,699},{12,11,149},{141,11,497},{133,11,377},{145,11,101 +},{10,11,158},{13,11,13},{13,11,137},{13,11,258},{14,11,111},{14,11,225},{14,11, +253},{14,11,304},{14,11,339},{14,11,417},{146,11,33},{6,0,87},{6,10,1734},{7,10, +20},{7,10,1056},{8,10,732},{9,10,406},{9,10,911},{138,10,694},{134,0,1243},{137, +0,245},{7,0,68},{8,0,48},{8,0,88},{8,0,582},{8,0,681},{9,0,373},{9,0,864},{11,0, +157},{11,0,336},{11,0,843},{148,0,27},{8,11,663},{144,11,8},{133,10,613},{4,0,88 +},{5,0,137},{5,0,174},{5,0,777},{6,0,1664},{6,0,1725},{7,0,77},{7,0,426},{7,0, +1317},{7,0,1355},{8,0,126},{8,0,563},{9,0,523},{9,0,750},{10,0,310},{10,0,836},{ +11,0,42},{11,0,318},{11,0,731},{12,0,68},{12,0,92},{12,0,507},{12,0,692},{13,0, +81},{13,0,238},{13,0,374},{14,0,436},{18,0,138},{19,0,78},{19,0,111},{20,0,55},{ +20,0,77},{148,0,92},{141,0,418},{4,0,938},{137,0,625},{138,0,351},{5,11,843},{7, +10,32},{7,10,984},{8,10,85},{8,10,709},{9,10,579},{9,10,847},{9,10,856},{10,10, +799},{11,10,258},{11,10,1007},{12,10,331},{12,10,615},{13,10,188},{13,10,435},{ +14,10,8},{15,10,165},{16,10,27},{148,10,40},{6,0,1668},{7,0,1499},{8,0,117},{9,0 +,314},{138,0,174},{135,0,707},{132,11,554},{133,11,536},{5,0,403},{5,11,207},{9, +11,79},{11,11,625},{145,11,7},{132,11,424},{136,11,785},{4,10,167},{135,10,82},{ +9,0,7},{9,11,7},{23,0,6},{151,11,6},{5,10,62},{6,0,282},{6,10,534},{7,10,74},{7, +10,678},{7,10,684},{7,10,1043},{7,10,1072},{8,10,280},{8,10,541},{8,10,686},{9, +10,258},{10,10,519},{11,10,252},{140,10,282},{138,10,33},{132,10,359},{4,0,44},{ +5,0,311},{6,0,156},{7,0,639},{7,0,762},{7,0,1827},{9,0,8},{9,0,462},{148,0,83},{ +7,11,769},{9,11,18},{138,11,358},{4,0,346},{4,11,896},{6,11,1777},{7,0,115},{9,0 +,180},{9,0,456},{138,0,363},{133,10,211},{7,0,761},{7,0,1051},{137,0,545},{6,10, +145},{141,10,336},{7,11,750},{9,11,223},{11,11,27},{11,11,466},{12,11,624},{14, +11,265},{146,11,61},{6,0,752},{6,0,768},{6,0,1195},{6,0,1254},{6,0,1619},{137,0, +835},{6,0,1936},{8,0,930},{136,0,960},{132,10,263},{132,11,249},{4,10,916},{140, +0,653},{4,11,603},{133,11,661},{4,11,11},{6,11,128},{7,11,231},{7,11,1533},{8,0, +344},{138,11,725},{134,0,1483},{134,0,875},{6,0,185},{7,0,1899},{9,0,875},{139,0 +,673},{15,10,155},{144,10,79},{4,10,599},{6,10,1634},{7,0,93},{7,0,210},{7,0, +1223},{7,10,67},{7,10,691},{7,10,979},{7,10,1697},{8,0,451},{8,0,460},{8,10,207} +,{8,10,214},{8,10,231},{8,10,294},{8,10,336},{8,10,428},{8,10,471},{8,10,622},{8 +,10,626},{8,10,679},{8,10,759},{8,10,829},{9,10,11},{9,10,246},{9,10,484},{9,10, +573},{9,10,706},{9,10,762},{9,10,798},{9,10,855},{9,10,870},{9,10,912},{10,10, +303},{10,10,335},{10,10,424},{10,10,461},{10,10,543},{10,10,759},{10,10,814},{11 +,0,353},{11,0,475},{11,10,59},{11,10,235},{11,10,590},{11,10,929},{11,10,963},{ +11,10,987},{12,10,114},{12,10,182},{12,10,226},{12,10,332},{12,10,439},{12,10, +575},{12,10,598},{12,10,675},{13,10,8},{13,10,125},{13,10,194},{13,10,287},{14, +10,197},{14,10,383},{15,10,53},{17,10,63},{19,10,46},{19,10,98},{19,10,106},{148 +,10,85},{132,11,476},{4,0,327},{5,0,478},{7,0,1332},{136,0,753},{5,0,1020},{133, +0,1022},{135,11,1807},{4,0,103},{133,0,401},{4,0,499},{135,0,1421},{10,0,207},{ +13,0,164},{147,10,126},{9,11,20},{10,11,324},{139,11,488},{132,0,96},{9,11,280}, +{138,11,134},{135,0,968},{133,10,187},{135,10,1286},{5,11,112},{6,11,103},{134, +11,150},{4,10,215},{8,0,914},{9,10,38},{10,0,3},{11,10,23},{11,10,127},{139,10, +796},{135,0,399},{6,0,563},{137,0,224},{6,0,704},{134,0,1214},{4,11,708},{8,11, +15},{9,11,50},{9,11,386},{11,11,18},{11,11,529},{140,11,228},{4,11,563},{7,11, +109},{7,11,592},{7,11,637},{7,11,770},{7,11,1701},{8,11,436},{8,11,463},{9,11,60 +},{9,11,335},{9,11,904},{10,11,73},{11,11,434},{12,11,585},{13,11,331},{18,11, +110},{148,11,60},{134,0,1559},{132,11,502},{6,11,347},{138,11,161},{4,11,33},{5, +11,102},{5,11,500},{6,11,284},{7,11,1079},{7,11,1423},{7,11,1702},{8,11,470},{9, +11,554},{9,11,723},{139,11,333},{7,11,246},{135,11,840},{6,11,10},{8,11,571},{9, +11,739},{143,11,91},{5,11,626},{8,0,861},{10,0,905},{12,0,730},{140,0,789},{134, +0,946},{5,0,746},{12,0,333},{12,11,333},{14,0,332},{142,11,332},{5,11,18},{6,11, +526},{13,11,24},{13,11,110},{19,11,5},{147,11,44},{4,0,910},{5,0,832},{135,10, +2002},{10,11,768},{139,11,787},{4,11,309},{5,11,462},{7,11,970},{135,11,1097},{4 +,10,28},{5,10,440},{7,10,248},{11,10,833},{140,10,344},{134,10,1654},{6,0,632},{ +6,0,652},{6,0,1272},{6,0,1384},{134,0,1560},{134,11,1704},{5,10,853},{134,0,1393 +},{6,10,249},{7,10,1234},{139,10,573},{5,11,86},{7,11,743},{9,11,85},{10,11,281} +,{10,11,432},{11,11,490},{12,11,251},{13,11,118},{14,11,378},{146,11,143},{5,11, +524},{133,11,744},{134,0,1514},{10,0,201},{142,0,319},{7,0,717},{7,10,392},{8,10 +,20},{8,10,172},{8,10,690},{9,10,383},{9,10,845},{10,0,510},{11,10,293},{11,10, +832},{11,10,920},{11,10,984},{141,10,221},{134,0,1381},{5,10,858},{133,10,992},{ +8,0,528},{137,0,348},{10,11,107},{140,11,436},{4,0,20},{133,0,616},{134,0,1251}, +{132,11,927},{10,11,123},{12,11,670},{13,11,371},{14,11,142},{146,11,94},{134,0, +1163},{7,11,1149},{137,11,156},{134,0,307},{133,11,778},{7,0,1091},{135,0,1765}, +{5,11,502},{6,10,268},{137,10,62},{8,11,196},{10,11,283},{139,11,406},{4,0,26},{ +5,0,429},{6,0,245},{7,0,704},{7,0,1379},{135,0,1474},{133,11,855},{132,0,881},{4 +,0,621},{135,11,1596},{7,11,1400},{9,11,446},{138,11,45},{6,0,736},{138,10,106}, +{133,0,542},{134,0,348},{133,0,868},{136,0,433},{135,0,1495},{138,0,771},{6,10, +613},{136,10,223},{138,0,215},{141,0,124},{136,11,391},{135,11,172},{132,10,670} +,{140,0,55},{9,10,40},{139,10,136},{7,0,62},{147,0,112},{132,0,856},{132,11,568} +,{11,10,259},{140,0,270},{8,0,572},{137,0,698},{4,11,732},{9,10,310},{137,10,682 +},{142,10,296},{134,0,939},{136,11,733},{135,11,1435},{7,10,1401},{135,10,1476}, +{4,10,296},{6,0,352},{7,10,401},{7,10,1410},{7,10,1594},{7,10,1674},{8,10,63},{8 +,10,660},{137,10,74},{4,11,428},{133,11,668},{4,10,139},{4,10,388},{140,10,188}, +{7,11,2015},{140,11,665},{132,0,647},{146,0,10},{138,0,220},{142,0,464},{132,0, +109},{134,0,1746},{4,10,747},{6,0,515},{6,11,1623},{6,11,1681},{7,10,649},{7,10, +1479},{135,10,1583},{133,10,232},{135,0,566},{137,10,887},{4,0,40},{10,0,67},{11 +,0,117},{11,0,768},{139,0,935},{132,0,801},{7,0,992},{8,0,301},{9,0,722},{12,0, +63},{13,0,29},{14,0,161},{143,0,18},{139,0,923},{6,11,1748},{8,11,715},{9,11,802 +},{10,11,46},{10,11,819},{13,11,308},{14,11,351},{14,11,363},{146,11,67},{137,11 +,745},{4,10,14},{7,0,1145},{7,10,1801},{10,10,748},{141,10,458},{4,11,63},{5,11, +347},{134,11,474},{135,0,568},{4,10,425},{7,11,577},{7,11,1432},{9,11,475},{9,11 +,505},{9,11,526},{9,11,609},{9,11,689},{9,11,726},{9,11,735},{9,11,738},{10,11, +556},{10,11,674},{10,11,684},{11,11,89},{11,11,202},{11,11,272},{11,11,380},{11, +11,415},{11,11,505},{11,11,537},{11,11,550},{11,11,562},{11,11,640},{11,11,667}, +{11,11,688},{11,11,847},{11,11,927},{11,11,930},{11,11,940},{12,11,144},{12,11, +325},{12,11,329},{12,11,389},{12,11,403},{12,11,451},{12,11,515},{12,11,604},{12 +,11,616},{12,11,626},{13,11,66},{13,11,131},{13,11,167},{13,11,236},{13,11,368}, +{13,11,411},{13,11,434},{13,11,453},{13,11,461},{13,11,474},{14,11,59},{14,11,60 +},{14,11,139},{14,11,152},{14,11,276},{14,11,353},{14,11,402},{15,11,28},{15,11, +81},{15,11,123},{15,11,152},{18,11,136},{148,11,88},{137,0,247},{135,11,1622},{9 +,11,544},{11,11,413},{144,11,25},{4,0,645},{6,10,1768},{7,0,825},{135,11,89},{ +140,0,328},{5,10,943},{134,10,1779},{134,0,1363},{5,10,245},{6,10,576},{7,10,582 +},{136,10,225},{134,0,1280},{5,11,824},{133,11,941},{7,11,440},{8,11,230},{139, +11,106},{5,0,28},{6,0,204},{10,0,320},{10,0,583},{13,0,502},{14,0,72},{14,0,274} +,{14,0,312},{14,0,344},{15,0,159},{16,0,62},{16,0,69},{17,0,30},{18,0,42},{18,0, +53},{18,0,84},{18,0,140},{19,0,68},{19,0,85},{20,0,5},{20,0,45},{20,0,101},{22,0 +,7},{150,0,20},{4,0,558},{6,0,390},{7,0,162},{7,0,689},{9,0,360},{138,0,653},{ +134,0,764},{6,0,862},{137,0,833},{5,0,856},{6,0,1672},{6,0,1757},{134,0,1781},{5 +,0,92},{10,0,736},{140,0,102},{6,0,1927},{6,0,1944},{8,0,924},{8,0,948},{10,0, +967},{138,0,978},{134,0,1479},{5,0,590},{8,0,360},{9,0,213},{138,0,63},{134,0, +1521},{6,0,709},{134,0,891},{132,10,443},{13,0,477},{14,0,120},{148,0,61},{4,11, +914},{5,11,800},{133,11,852},{10,11,54},{141,11,115},{4,11,918},{133,11,876},{ +139,11,152},{4,11,92},{133,11,274},{135,11,1901},{9,11,800},{10,11,693},{11,11, +482},{11,11,734},{139,11,789},{4,10,298},{137,0,483},{6,0,1213},{141,11,498},{ +135,11,1451},{133,11,743},{4,0,1022},{10,0,1000},{12,0,957},{12,0,980},{12,0, +1013},{14,0,481},{144,0,116},{4,11,49},{7,11,280},{7,11,1633},{8,0,503},{145,0, +29},{135,0,1712},{134,0,466},{136,11,47},{5,10,164},{7,10,121},{142,10,189},{7, +10,812},{7,10,1261},{7,10,1360},{9,10,632},{140,10,352},{139,10,556},{132,0,731} +,{5,11,272},{5,11,908},{5,11,942},{7,11,1008},{7,11,1560},{8,11,197},{9,11,47},{ +11,11,538},{139,11,742},{4,10,172},{9,10,611},{10,10,436},{12,10,673},{141,10, +255},{133,10,844},{10,0,484},{11,0,754},{12,0,457},{14,0,171},{14,0,389},{146,0, +153},{9,10,263},{10,10,147},{138,10,492},{137,11,891},{138,0,241},{133,10,537},{ +6,0,2005},{136,0,964},{137,10,842},{151,11,8},{4,11,407},{132,11,560},{135,11, +1884},{6,0,1100},{134,0,1242},{135,0,954},{5,10,230},{5,10,392},{6,10,420},{9,10 +,568},{140,10,612},{4,11,475},{11,11,35},{11,11,90},{13,11,7},{13,11,71},{13,11, +177},{142,11,422},{136,11,332},{135,0,1958},{6,0,549},{8,0,34},{8,0,283},{9,0, +165},{138,0,475},{10,0,952},{12,0,966},{140,0,994},{5,0,652},{5,0,701},{135,0, +449},{4,0,655},{7,0,850},{17,0,75},{146,0,137},{4,0,146},{5,10,41},{7,0,1618},{7 +,10,1459},{7,10,1469},{7,10,1859},{8,0,670},{9,10,549},{139,10,905},{133,10,696} +,{6,0,159},{6,0,364},{7,0,516},{137,0,518},{135,0,1439},{6,11,222},{7,11,636},{7 +,11,1620},{8,11,409},{9,11,693},{139,11,77},{13,0,151},{141,11,45},{4,10,771},{4 +,11,336},{134,0,1027},{139,11,392},{10,11,121},{11,11,175},{149,11,16},{8,0,950} +,{138,0,983},{133,10,921},{135,0,993},{6,10,180},{7,10,1137},{8,10,751},{139,10, +805},{7,0,501},{9,0,111},{10,0,141},{11,0,332},{13,0,43},{13,0,429},{14,0,130},{ +14,0,415},{145,0,102},{4,10,183},{5,11,882},{7,10,271},{11,10,824},{11,10,952},{ +13,10,278},{13,10,339},{13,10,482},{14,10,424},{148,10,99},{4,10,19},{5,10,477}, +{5,10,596},{6,10,505},{7,10,1221},{11,10,907},{12,10,209},{141,10,214},{135,10, +1215},{133,0,452},{132,11,426},{5,0,149},{136,0,233},{133,0,935},{6,11,58},{7,11 +,654},{7,11,745},{7,11,1969},{8,11,240},{8,11,675},{9,11,479},{9,11,731},{10,11, +330},{10,11,593},{10,11,817},{11,11,32},{11,11,133},{11,11,221},{145,11,68},{7, +11,102},{9,11,538},{12,0,582},{146,0,131},{136,0,801},{134,10,1645},{132,0,70},{ +6,10,92},{6,10,188},{7,10,1269},{7,10,1524},{7,10,1876},{10,10,228},{139,10,1020 +},{4,10,459},{133,10,966},{138,0,369},{12,10,330},{144,0,36},{141,11,366},{6,10, +18},{7,0,721},{7,10,932},{8,10,757},{9,10,54},{9,10,65},{9,10,844},{10,0,236},{ +10,10,113},{10,10,315},{10,10,798},{11,10,153},{12,0,204},{12,10,151},{12,10,392 +},{12,10,666},{142,10,248},{7,0,241},{8,10,548},{9,10,532},{10,0,430},{10,10,117 +},{11,10,351},{11,10,375},{143,10,23},{134,10,1742},{133,10,965},{133,11,566},{6 +,11,48},{135,11,63},{134,10,182},{10,10,65},{10,10,488},{138,10,497},{6,11,114}, +{7,11,1224},{7,11,1556},{136,11,3},{134,0,1817},{8,11,576},{137,11,267},{6,0, +1078},{144,0,16},{9,10,588},{138,10,260},{138,0,1021},{5,0,406},{134,0,2022},{ +133,11,933},{6,0,69},{135,0,117},{7,0,1830},{136,11,427},{4,0,432},{135,0,824},{ +134,10,1786},{133,0,826},{139,11,67},{133,11,759},{135,10,308},{137,0,816},{133, +0,1000},{4,0,297},{6,0,529},{7,0,152},{7,0,713},{7,0,1845},{8,0,710},{8,0,717},{ +12,0,639},{140,0,685},{7,0,423},{136,10,588},{136,10,287},{136,0,510},{134,0, +1048},{6,0,618},{7,11,56},{7,11,1989},{8,11,337},{8,11,738},{9,11,600},{10,11, +483},{12,11,37},{13,11,447},{142,11,92},{4,0,520},{135,0,575},{8,0,990},{138,0, +977},{135,11,774},{9,11,347},{11,11,24},{140,11,170},{136,11,379},{140,10,290},{ +132,11,328},{4,0,321},{134,0,569},{4,11,101},{135,11,1171},{5,11,833},{7,0,723}, +{7,0,1135},{136,11,744},{7,10,719},{8,10,809},{136,10,834},{8,0,921},{136,10,796 +},{5,10,210},{6,10,213},{7,10,60},{10,10,364},{139,10,135},{5,0,397},{5,10,607}, +{6,0,154},{7,0,676},{8,0,443},{8,0,609},{8,10,326},{8,10,490},{9,0,24},{9,0,325} +,{10,0,35},{11,0,535},{11,0,672},{11,0,1018},{12,0,637},{144,0,30},{4,10,701},{5 +,10,472},{6,11,9},{6,11,397},{7,11,53},{7,11,1742},{9,10,758},{10,11,632},{11,11 +,828},{140,11,146},{135,10,380},{135,10,1947},{148,11,109},{10,10,278},{138,11, +278},{134,0,856},{4,10,386},{7,0,139},{8,10,405},{8,10,728},{9,10,497},{11,10, +110},{11,10,360},{15,10,37},{144,10,84},{141,0,282},{133,0,981},{5,0,288},{7,10, +1452},{7,10,1480},{8,10,634},{140,10,472},{7,0,1890},{8,11,367},{10,11,760},{14, +11,79},{20,11,17},{152,11,0},{4,10,524},{136,10,810},{4,0,56},{7,0,1791},{8,0, +607},{8,0,651},{11,0,465},{11,0,835},{12,0,337},{141,0,480},{10,10,238},{141,10, +33},{11,11,417},{12,11,223},{140,11,265},{9,0,158},{10,0,411},{140,0,261},{133, +10,532},{133,10,997},{12,11,186},{12,11,292},{14,11,100},{146,11,70},{6,0,1403}, +{136,0,617},{134,0,1205},{139,0,563},{4,0,242},{134,0,333},{4,11,186},{5,11,157} +,{8,11,168},{138,11,6},{132,0,369},{133,11,875},{5,10,782},{5,10,829},{134,10, +1738},{134,0,622},{135,11,1272},{6,0,1407},{7,11,111},{136,11,581},{7,10,1823},{ +139,10,693},{7,0,160},{10,0,624},{142,0,279},{132,0,363},{10,11,589},{12,11,111} +,{13,11,260},{14,11,82},{18,11,63},{147,11,45},{7,11,1364},{7,11,1907},{141,11, +158},{4,11,404},{4,11,659},{135,11,675},{13,11,211},{14,11,133},{14,11,204},{15, +11,64},{15,11,69},{15,11,114},{16,11,10},{19,11,23},{19,11,35},{19,11,39},{19,11 +,51},{19,11,71},{19,11,75},{152,11,15},{4,10,78},{5,10,96},{5,10,182},{7,10,1724 +},{7,10,1825},{10,10,394},{10,10,471},{11,10,532},{14,10,340},{145,10,88},{135, +10,1964},{133,11,391},{11,11,887},{14,11,365},{142,11,375},{5,11,540},{6,11,1697 +},{7,11,222},{136,11,341},{134,11,78},{9,0,601},{9,0,619},{10,0,505},{10,0,732}, +{11,0,355},{140,0,139},{134,0,292},{139,0,174},{5,0,177},{6,0,616},{7,0,827},{9, +0,525},{138,0,656},{6,10,215},{7,10,1028},{7,10,1473},{7,10,1721},{9,10,424},{10 +,0,31},{138,10,779},{135,10,584},{136,11,293},{134,0,685},{135,11,1868},{133,11, +460},{6,10,67},{7,0,647},{7,10,1630},{9,10,354},{9,10,675},{10,10,830},{14,10,80 +},{145,10,80},{4,0,161},{133,0,631},{6,10,141},{7,10,225},{9,10,59},{9,10,607},{ +10,10,312},{11,10,687},{12,10,555},{13,10,373},{13,10,494},{148,10,58},{7,11,965 +},{7,11,1460},{135,11,1604},{136,10,783},{134,11,388},{4,11,511},{6,0,722},{6,0, +1267},{9,11,333},{9,11,379},{10,11,602},{11,11,441},{11,11,723},{11,11,976},{140 +,11,357},{134,0,1797},{135,0,1684},{5,11,938},{8,11,707},{9,0,469},{9,0,709},{12 +,0,512},{14,0,65},{145,0,12},{7,0,1230},{136,0,531},{10,0,229},{11,0,73},{11,0, +376},{139,0,433},{12,0,268},{12,0,640},{142,0,119},{7,10,430},{139,10,46},{6,0, +558},{7,0,651},{8,0,421},{9,0,0},{10,0,34},{139,0,1008},{5,10,602},{6,0,106},{7, +0,1786},{7,0,1821},{7,10,2018},{9,0,102},{9,0,763},{137,10,418},{5,0,65},{6,0, +416},{7,0,1720},{7,0,1924},{8,10,677},{10,0,109},{11,0,14},{11,0,70},{11,0,569}, +{11,0,735},{15,0,153},{148,0,80},{135,11,1625},{137,11,772},{136,0,595},{6,11, +469},{7,11,1709},{138,11,515},{7,0,1832},{138,0,374},{9,0,106},{9,0,163},{9,0, +296},{10,0,167},{10,0,172},{10,0,777},{139,0,16},{6,0,6},{7,0,81},{7,0,771},{7,0 +,1731},{9,0,405},{138,0,421},{4,11,500},{135,11,938},{5,11,68},{134,11,383},{5,0 +,881},{133,0,885},{6,0,854},{6,0,1132},{6,0,1495},{6,0,1526},{6,0,1533},{134,0, +1577},{4,11,337},{6,11,353},{7,11,1934},{8,11,488},{137,11,429},{7,11,236},{7,11 +,1795},{8,11,259},{9,11,135},{9,11,177},{10,11,825},{11,11,115},{11,11,370},{11, +11,405},{11,11,604},{12,11,10},{12,11,667},{12,11,669},{13,11,76},{14,11,310},{ +15,11,76},{15,11,147},{148,11,23},{5,0,142},{134,0,546},{4,11,15},{5,11,22},{6, +11,244},{7,11,40},{7,11,200},{7,11,906},{7,11,1199},{9,11,616},{10,11,716},{11, +11,635},{11,11,801},{140,11,458},{5,0,466},{7,10,329},{11,0,571},{12,0,198},{13, +0,283},{14,0,186},{15,0,21},{143,0,103},{4,0,185},{5,0,257},{5,0,839},{5,0,936}, +{7,11,1735},{9,0,399},{10,0,258},{10,0,395},{10,0,734},{11,0,1014},{12,0,23},{13 +,0,350},{14,0,150},{147,0,6},{12,11,36},{141,11,337},{5,11,598},{7,11,791},{8,11 +,108},{137,11,123},{132,10,469},{7,0,404},{7,0,1377},{7,0,1430},{7,0,2017},{8,0, +149},{8,0,239},{8,0,512},{8,0,793},{8,0,818},{9,0,474},{9,0,595},{10,0,122},{10, +0,565},{10,0,649},{10,0,783},{11,0,239},{11,0,295},{11,0,447},{11,0,528},{11,0, +639},{11,0,800},{12,0,25},{12,0,77},{12,0,157},{12,0,256},{12,0,316},{12,0,390}, +{12,0,391},{12,0,395},{12,0,478},{12,0,503},{12,0,592},{12,0,680},{13,0,50},{13, +0,53},{13,0,132},{13,0,198},{13,0,322},{13,0,415},{13,0,511},{14,0,71},{14,0,395 +},{15,0,71},{15,0,136},{17,0,123},{18,0,93},{147,0,58},{136,0,712},{134,10,1743} +,{5,10,929},{6,10,340},{8,10,376},{136,10,807},{6,0,1848},{8,0,860},{10,0,856},{ +10,0,859},{10,0,925},{10,0,941},{140,0,762},{6,0,629},{6,0,906},{9,0,810},{140,0 +,652},{5,10,218},{7,10,1610},{138,10,83},{7,10,1512},{135,10,1794},{4,0,377},{4, +11,155},{7,11,1689},{11,10,0},{16,10,78},{152,0,13},{4,11,164},{5,11,151},{5,11, +730},{5,11,741},{7,11,498},{7,11,870},{7,11,1542},{12,11,213},{14,11,36},{14,11, +391},{17,11,111},{18,11,6},{18,11,46},{18,11,151},{19,11,36},{20,11,32},{20,11, +56},{20,11,69},{20,11,102},{21,11,4},{22,11,8},{22,11,10},{22,11,14},{150,11,31} +,{5,10,571},{135,0,1842},{4,10,455},{4,11,624},{135,11,1752},{134,0,1501},{4,11, +492},{5,11,451},{6,10,161},{7,10,372},{137,10,597},{132,10,349},{4,0,180},{135,0 +,1906},{135,11,835},{141,11,70},{132,0,491},{137,10,751},{6,10,432},{139,10,322} +,{4,0,171},{138,0,234},{6,11,113},{135,11,436},{4,0,586},{7,0,1186},{138,0,631}, +{5,10,468},{10,10,325},{11,10,856},{12,10,345},{143,10,104},{5,10,223},{10,11, +592},{10,11,753},{12,11,317},{12,11,355},{12,11,465},{12,11,469},{12,11,560},{12 +,11,578},{141,11,243},{132,10,566},{135,11,520},{4,10,59},{135,10,1394},{6,10, +436},{139,10,481},{4,10,48},{5,10,271},{7,10,953},{7,11,1878},{9,0,931},{10,0, +334},{148,0,71},{5,10,610},{8,10,457},{139,0,170},{133,10,755},{6,0,1587},{135, +10,1217},{4,10,197},{149,11,26},{133,11,585},{137,11,521},{133,0,765},{133,10, +217},{139,11,586},{133,0,424},{9,11,752},{12,11,610},{13,11,431},{16,11,59},{146 +,11,109},{136,0,714},{4,11,307},{135,0,685},{9,0,420},{10,0,269},{10,0,285},{10, +0,576},{11,0,397},{13,0,175},{145,0,90},{132,0,429},{133,11,964},{9,11,463},{138 +,11,595},{7,0,18},{7,0,699},{7,0,1966},{8,0,752},{9,0,273},{9,0,412},{9,0,703},{ +10,0,71},{10,0,427},{138,0,508},{4,10,165},{7,10,1398},{135,10,1829},{4,0,53},{5 +,0,186},{7,0,752},{7,0,828},{142,0,116},{8,0,575},{10,0,289},{139,0,319},{132,0, +675},{134,0,1424},{4,11,75},{5,11,180},{6,11,500},{7,11,58},{7,11,710},{138,11, +645},{133,11,649},{6,11,276},{7,11,282},{7,11,879},{7,11,924},{8,11,459},{9,11, +599},{9,11,754},{11,11,574},{12,11,128},{12,11,494},{13,11,52},{13,11,301},{15, +11,30},{143,11,132},{6,0,647},{134,0,1095},{5,10,9},{7,10,297},{7,10,966},{140, +10,306},{132,11,200},{134,0,1334},{5,10,146},{6,10,411},{138,10,721},{6,0,209},{ +6,0,1141},{6,0,1288},{8,0,468},{9,0,210},{11,0,36},{12,0,28},{12,0,630},{13,0,21 +},{13,0,349},{14,0,7},{145,0,13},{6,10,177},{135,10,467},{4,0,342},{135,0,1179}, +{10,11,454},{140,11,324},{4,0,928},{133,0,910},{6,11,225},{7,0,1838},{137,11,211 +},{16,0,101},{20,0,115},{20,0,118},{148,0,122},{4,0,496},{135,0,856},{4,0,318},{ +7,11,718},{11,0,654},{139,11,102},{8,11,58},{9,11,724},{11,11,809},{13,11,113},{ +145,11,72},{5,10,200},{6,11,345},{135,11,1247},{8,11,767},{8,11,803},{9,11,301}, +{137,11,903},{7,0,915},{7,11,1949},{8,0,247},{8,11,674},{147,0,0},{4,0,202},{5,0 +,382},{6,0,454},{7,0,936},{7,0,1803},{8,0,758},{9,0,375},{9,0,895},{10,0,743},{ +10,0,792},{11,0,978},{11,0,1012},{142,0,109},{7,0,1150},{7,0,1425},{7,0,1453},{ +140,0,513},{134,11,259},{138,0,791},{11,0,821},{12,0,110},{12,0,153},{18,0,41},{ +150,0,19},{134,10,481},{132,0,796},{6,0,445},{8,11,254},{137,0,909},{10,0,776},{ +13,0,345},{142,0,425},{4,10,84},{7,10,1482},{10,10,76},{138,10,142},{135,11,742} +,{5,10,1015},{134,0,578},{4,10,315},{5,10,507},{6,0,1387},{135,10,1370},{4,0,438 +},{133,0,555},{136,0,766},{133,11,248},{134,10,1722},{4,11,116},{5,11,95},{5,11, +445},{7,11,1688},{8,11,29},{9,11,272},{11,11,509},{139,11,915},{135,0,541},{133, +11,543},{8,10,222},{8,10,476},{9,10,238},{11,10,516},{11,10,575},{15,10,109},{ +146,10,100},{6,0,880},{134,0,1191},{5,11,181},{136,11,41},{134,0,1506},{132,11, +681},{7,11,25},{8,11,202},{138,11,536},{139,0,983},{137,0,768},{132,0,584},{9,11 +,423},{140,11,89},{8,11,113},{9,11,877},{10,11,554},{11,11,83},{12,11,136},{147, +11,109},{7,10,706},{7,10,1058},{138,10,538},{133,11,976},{4,11,206},{135,11,746} +,{136,11,526},{140,0,737},{11,10,92},{11,10,196},{11,10,409},{11,10,450},{11,10, +666},{11,10,777},{12,10,262},{13,10,385},{13,10,393},{15,10,115},{16,10,45},{145 +,10,82},{4,0,226},{4,0,326},{4,11,319},{5,11,699},{7,0,1770},{138,11,673},{6,10, +40},{135,10,1781},{5,0,426},{8,0,30},{9,0,2},{11,0,549},{147,0,122},{6,0,1161},{ +134,0,1329},{138,10,97},{6,10,423},{7,10,665},{135,10,1210},{7,11,13},{8,11,226} +,{10,11,537},{11,11,570},{11,11,605},{11,11,799},{11,11,804},{12,11,85},{12,11, +516},{12,11,623},{13,11,112},{13,11,361},{14,11,77},{14,11,78},{17,11,28},{147, +11,110},{132,11,769},{132,11,551},{132,11,728},{147,0,117},{9,11,57},{9,11,459}, +{10,11,425},{11,11,119},{12,11,184},{12,11,371},{13,11,358},{145,11,51},{5,11, +188},{5,11,814},{8,11,10},{9,11,421},{9,11,729},{10,11,609},{139,11,689},{134,11 +,624},{135,11,298},{135,0,462},{4,0,345},{139,10,624},{136,10,574},{4,0,385},{7, +0,265},{135,0,587},{4,11,528},{134,0,808},{133,0,398},{132,10,354},{4,0,347},{5, +0,423},{5,0,996},{135,0,1329},{135,10,1558},{7,0,1259},{9,0,125},{139,0,65},{5,0 +,136},{6,0,136},{136,0,644},{5,11,104},{6,11,173},{135,11,1631},{135,0,469},{133 +,10,830},{4,0,278},{5,0,465},{135,0,1367},{7,11,810},{8,11,138},{8,11,342},{9,11 +,84},{10,11,193},{11,11,883},{140,11,359},{5,10,496},{135,10,203},{4,0,433},{133 +,0,719},{6,10,547},{134,11,95},{5,10,88},{137,10,239},{6,11,406},{10,11,409},{10 +,11,447},{11,11,44},{140,11,100},{134,0,1423},{7,10,650},{135,10,1310},{134,0, +749},{135,11,1243},{135,0,1363},{6,0,381},{7,0,645},{7,0,694},{7,10,1076},{8,0, +546},{9,10,80},{11,10,78},{11,10,421},{11,10,534},{140,10,545},{134,11,1636},{ +135,11,1344},{7,10,274},{11,10,479},{11,10,507},{140,0,277},{4,11,282},{6,0,705} +,{6,0,783},{6,0,1275},{6,0,1481},{7,11,1034},{11,11,398},{11,11,634},{12,11,1},{ +12,11,79},{12,11,544},{14,11,237},{17,11,10},{146,11,20},{134,0,453},{4,0,555},{ +4,10,497},{7,10,1584},{8,0,536},{10,0,288},{139,0,1005},{5,11,118},{5,11,499},{6 +,11,476},{7,11,600},{7,11,888},{135,11,1096},{138,0,987},{7,0,1107},{7,10,261},{ +7,10,1115},{7,10,1354},{7,10,1588},{7,10,1705},{7,10,1902},{9,10,465},{10,10,248 +},{10,10,349},{10,10,647},{11,10,527},{11,10,660},{11,10,669},{12,10,529},{141, +10,305},{7,11,296},{7,11,596},{8,11,560},{8,11,586},{9,11,612},{11,11,100},{11, +11,304},{12,11,46},{13,11,89},{14,11,112},{145,11,122},{9,0,370},{138,0,90},{136 +,10,13},{132,0,860},{7,10,642},{8,10,250},{11,10,123},{11,10,137},{13,10,48},{ +142,10,95},{135,10,1429},{137,11,321},{132,0,257},{135,0,2031},{7,0,1768},{7,11, +1599},{7,11,1723},{8,11,79},{8,11,106},{8,11,190},{8,11,302},{8,11,383},{9,11, +119},{9,11,233},{9,11,298},{9,11,419},{9,11,471},{10,11,181},{10,11,406},{11,11, +57},{11,11,85},{11,11,120},{11,11,177},{11,11,296},{11,11,382},{11,11,454},{11, +11,758},{11,11,999},{12,11,27},{12,11,98},{12,11,131},{12,11,245},{12,11,312},{ +12,11,446},{12,11,454},{13,11,25},{13,11,98},{13,11,426},{13,11,508},{14,11,6},{ +14,11,163},{14,11,272},{14,11,277},{14,11,370},{15,11,95},{15,11,138},{15,11,167 +},{17,11,18},{17,11,38},{20,11,96},{149,11,32},{5,11,722},{134,11,1759},{145,11, +16},{6,0,1071},{134,0,1561},{10,10,545},{140,10,301},{6,0,83},{6,0,1733},{135,0, +1389},{4,0,835},{135,0,1818},{133,11,258},{4,10,904},{133,10,794},{134,0,2006},{ +5,11,30},{7,11,495},{8,11,134},{9,11,788},{140,11,438},{135,11,2004},{137,0,696} +,{5,11,50},{6,11,439},{7,11,780},{135,11,1040},{7,11,772},{7,11,1104},{7,11,1647 +},{11,11,269},{11,11,539},{11,11,607},{11,11,627},{11,11,706},{11,11,975},{12,11 +,248},{12,11,311},{12,11,434},{12,11,600},{12,11,622},{13,11,297},{13,11,367},{ +13,11,485},{14,11,69},{14,11,409},{143,11,108},{5,11,1},{6,11,81},{138,11,520},{ +7,0,1718},{9,0,95},{9,0,274},{10,0,279},{10,0,317},{10,0,420},{11,0,303},{11,0, +808},{12,0,134},{12,0,367},{13,0,149},{13,0,347},{14,0,349},{14,0,406},{18,0,22} +,{18,0,89},{18,0,122},{147,0,47},{5,11,482},{8,11,98},{9,11,172},{10,11,222},{10 +,11,700},{10,11,822},{11,11,302},{11,11,778},{12,11,50},{12,11,127},{12,11,396}, +{13,11,62},{13,11,328},{14,11,122},{147,11,72},{7,10,386},{138,10,713},{6,10,7}, +{6,10,35},{7,10,147},{7,10,1069},{7,10,1568},{7,10,1575},{7,10,1917},{8,10,43},{ +8,10,208},{9,10,128},{9,10,866},{10,10,20},{11,10,981},{147,10,33},{133,0,26},{ +132,0,550},{5,11,2},{7,11,1494},{136,11,589},{6,11,512},{7,11,797},{8,11,253},{9 +,11,77},{10,11,1},{10,11,129},{10,11,225},{11,11,118},{11,11,226},{11,11,251},{ +11,11,430},{11,11,701},{11,11,974},{11,11,982},{12,11,64},{12,11,260},{12,11,488 +},{140,11,690},{7,10,893},{141,10,424},{134,0,901},{136,0,822},{4,0,902},{5,0, +809},{134,0,122},{6,0,807},{134,0,1366},{5,11,748},{6,11,553},{135,0,262},{133,0 +,620},{4,0,34},{5,0,574},{7,0,279},{7,0,1624},{136,0,601},{6,10,322},{9,0,170},{ +9,10,552},{11,10,274},{13,10,209},{13,10,499},{14,10,85},{15,10,126},{145,10,70} +,{132,0,537},{4,11,12},{7,11,420},{7,11,522},{7,11,809},{8,11,797},{141,11,88},{ +133,0,332},{8,10,83},{8,10,742},{8,10,817},{9,10,28},{9,10,29},{9,10,885},{10,10 +,387},{11,10,633},{11,10,740},{13,10,235},{13,10,254},{15,10,143},{143,10,146},{ +6,0,1909},{9,0,964},{12,0,822},{12,0,854},{12,0,865},{12,0,910},{12,0,938},{15,0 +,169},{15,0,208},{15,0,211},{18,0,205},{18,0,206},{18,0,220},{18,0,223},{152,0, +24},{140,10,49},{5,11,528},{135,11,1580},{6,0,261},{8,0,182},{139,0,943},{134,0, +1721},{4,0,933},{133,0,880},{136,11,321},{5,11,266},{9,11,290},{9,11,364},{10,11 +,293},{11,11,606},{142,11,45},{4,11,50},{6,0,1609},{6,11,510},{6,11,594},{9,11, +121},{10,11,49},{10,11,412},{139,11,834},{7,0,895},{136,11,748},{132,11,466},{4, +10,110},{10,10,415},{10,10,597},{142,10,206},{133,0,812},{135,11,281},{6,0,1890} +,{6,0,1902},{6,0,1916},{7,10,205},{7,10,2000},{9,0,929},{9,0,942},{9,0,975},{9,0 +,984},{9,0,986},{9,0,1011},{9,0,1019},{12,0,804},{12,0,851},{12,0,867},{12,0,916 +},{12,0,923},{15,0,194},{15,0,204},{15,0,210},{15,0,222},{15,0,223},{15,0,229},{ +15,0,250},{18,0,179},{18,0,186},{146,0,192},{132,11,667},{135,0,778},{4,0,137},{ +7,0,1178},{135,0,1520},{134,0,1314},{4,11,242},{134,11,333},{6,0,1661},{7,0,1975 +},{7,0,2009},{135,0,2011},{134,0,1591},{4,10,283},{135,10,1194},{11,0,820},{150, +0,51},{4,11,39},{5,11,36},{7,11,1843},{8,11,407},{11,11,144},{140,11,523},{134, +10,1720},{4,11,510},{7,11,29},{7,11,66},{7,11,1980},{10,11,487},{10,11,809},{146 +,11,9},{5,0,89},{7,0,1915},{9,0,185},{9,0,235},{10,0,64},{10,0,270},{10,0,403},{ +10,0,469},{10,0,529},{10,0,590},{11,0,140},{11,0,860},{13,0,1},{13,0,422},{14,0, +341},{14,0,364},{17,0,93},{18,0,113},{19,0,97},{147,0,113},{133,0,695},{6,0,987} +,{134,0,1160},{5,0,6},{6,0,183},{7,0,680},{7,0,978},{7,0,1013},{7,0,1055},{12,0, +230},{13,0,172},{146,0,29},{134,11,570},{132,11,787},{134,11,518},{6,0,29},{139, +0,63},{132,11,516},{136,11,821},{132,0,311},{134,0,1740},{7,0,170},{8,0,90},{8,0 +,177},{8,0,415},{8,10,735},{11,0,714},{142,0,281},{134,0,1961},{135,11,1405},{4, +11,10},{7,11,917},{139,11,786},{5,10,132},{9,10,486},{9,10,715},{10,10,458},{11, +10,373},{11,10,668},{11,10,795},{11,10,897},{12,10,272},{12,10,424},{12,10,539}, +{12,10,558},{14,10,245},{14,10,263},{14,10,264},{14,10,393},{142,10,403},{11,0, +91},{13,0,129},{15,0,101},{145,0,125},{135,0,1132},{4,0,494},{6,0,74},{7,0,44},{ +7,0,407},{12,0,17},{15,0,5},{148,0,11},{133,10,379},{5,0,270},{5,11,684},{6,10, +89},{6,10,400},{7,10,1569},{7,10,1623},{7,10,1850},{8,10,218},{8,10,422},{9,10, +570},{138,10,626},{4,0,276},{133,0,296},{6,0,1523},{134,11,27},{6,10,387},{7,10, +882},{141,10,111},{6,10,224},{7,10,877},{137,10,647},{135,10,790},{4,0,7},{5,0, +90},{5,0,158},{6,0,542},{7,0,221},{7,0,1574},{9,0,490},{10,0,540},{11,0,443},{ +139,0,757},{7,0,588},{9,0,175},{138,0,530},{135,10,394},{142,11,23},{134,0,786}, +{135,0,580},{7,0,88},{136,0,627},{5,0,872},{6,0,57},{7,0,471},{9,0,447},{137,0, +454},{6,11,342},{6,11,496},{8,11,275},{137,11,206},{4,11,909},{133,11,940},{4,11 +,891},{134,0,735},{7,10,1409},{8,0,845},{136,0,916},{5,0,31},{134,0,614},{11,0, +458},{12,0,15},{140,0,432},{8,0,330},{140,0,477},{4,0,530},{4,11,687},{5,0,521}, +{7,0,1200},{138,0,460},{6,0,424},{135,0,1866},{9,0,569},{12,0,12},{12,0,81},{12, +0,319},{13,0,69},{14,0,259},{16,0,87},{17,0,1},{17,0,21},{17,0,24},{18,0,15},{18 +,0,56},{18,0,59},{18,0,127},{18,0,154},{19,0,19},{148,0,31},{7,0,1302},{136,10, +38},{134,11,253},{5,10,261},{7,10,78},{7,10,199},{8,10,815},{9,10,126},{138,10, +342},{5,0,595},{135,0,1863},{6,11,41},{141,11,160},{5,0,13},{134,0,142},{6,0,97} +,{7,0,116},{7,11,1304},{8,0,322},{8,0,755},{9,0,548},{10,0,714},{10,11,477},{11, +0,884},{141,0,324},{132,10,628},{134,11,1718},{7,10,266},{136,10,804},{135,10, +208},{6,10,79},{7,0,1021},{135,10,1519},{7,0,1472},{135,0,1554},{6,11,362},{146, +11,51},{7,0,1071},{7,0,1541},{7,0,1767},{7,0,1806},{11,0,162},{11,0,242},{11,0, +452},{12,0,605},{15,0,26},{144,0,44},{136,10,741},{133,11,115},{145,0,115},{134, +10,376},{6,0,1406},{134,0,1543},{5,11,193},{12,11,178},{13,11,130},{145,11,84},{ +135,0,1111},{5,11,705},{8,0,1},{9,0,650},{9,11,606},{138,0,326},{5,0,488},{6,0, +527},{7,0,489},{7,0,1636},{8,0,121},{8,0,144},{8,0,359},{9,0,193},{9,0,241},{9,0 +,336},{9,0,882},{11,0,266},{11,0,372},{11,0,944},{12,0,401},{140,0,641},{135,11, +174},{6,0,267},{7,10,244},{7,10,632},{7,10,1609},{8,10,178},{8,10,638},{141,10, +58},{134,0,1983},{134,0,1155},{134,0,1575},{134,0,1438},{9,0,31},{10,0,244},{10, +0,699},{12,0,149},{141,0,497},{133,0,377},{4,11,122},{5,11,796},{5,11,952},{6,11 +,1660},{6,11,1671},{8,11,567},{9,11,687},{9,11,742},{10,11,686},{11,11,356},{11, +11,682},{140,11,281},{145,0,101},{11,11,0},{144,11,78},{5,10,791},{5,11,179},{7, +11,1095},{135,11,1213},{8,11,372},{9,11,122},{138,11,175},{7,10,686},{8,10,33},{ +8,10,238},{10,10,616},{11,10,467},{11,10,881},{13,10,217},{13,10,253},{142,10, +268},{4,11,66},{7,11,722},{7,11,904},{137,0,476},{7,11,352},{137,11,684},{135,0, +2023},{135,0,1836},{132,10,447},{5,0,843},{144,0,35},{137,11,779},{141,11,35},{4 +,10,128},{5,10,415},{6,10,462},{7,10,294},{7,10,578},{10,10,710},{139,10,86},{ +132,0,554},{133,0,536},{136,10,587},{5,0,207},{9,0,79},{11,0,625},{145,0,7},{6, +10,427},{7,0,1371},{138,10,692},{4,0,424},{4,10,195},{135,10,802},{5,11,564},{ +136,0,785},{135,0,336},{4,0,896},{6,0,1777},{134,11,556},{137,11,103},{134,10, +1683},{7,11,544},{8,11,719},{138,11,61},{138,10,472},{4,11,5},{5,11,498},{136,11 +,637},{7,0,750},{9,0,223},{11,0,27},{11,0,466},{12,0,624},{14,0,265},{146,0,61}, +{12,0,238},{12,11,238},{18,0,155},{146,11,155},{151,10,28},{133,11,927},{5,10,3} +,{8,10,578},{9,10,118},{10,10,705},{12,0,383},{141,10,279},{4,11,893},{5,11,780} +,{133,11,893},{4,0,603},{133,0,661},{4,0,11},{5,10,229},{5,11,238},{6,0,128},{7, +0,231},{7,0,1533},{7,11,1350},{138,0,725},{8,10,102},{10,10,578},{10,10,672},{12 +,10,496},{13,10,408},{14,10,121},{145,10,106},{132,0,476},{134,0,1552},{134,11, +1729},{8,10,115},{8,10,350},{9,10,489},{10,10,128},{11,10,306},{12,10,373},{14, +10,30},{17,10,79},{19,10,80},{150,10,55},{135,0,1807},{4,0,680},{4,11,60},{7,11, +760},{7,11,1800},{8,11,314},{9,11,700},{139,11,487},{4,10,230},{5,10,702},{148, +11,94},{132,11,228},{139,0,435},{9,0,20},{10,0,324},{10,0,807},{139,0,488},{6,10 +,1728},{136,11,419},{4,10,484},{18,10,26},{19,10,42},{20,10,43},{21,10,0},{23,10 +,27},{152,10,14},{135,0,1431},{133,11,828},{5,0,112},{6,0,103},{6,0,150},{7,0, +1303},{7,11,176},{7,11,178},{7,11,1110},{9,0,292},{10,0,481},{10,11,481},{20,0, +13},{148,11,13},{138,0,356},{4,11,51},{5,11,39},{6,11,4},{7,11,591},{7,11,849},{ +7,11,951},{7,11,1129},{7,11,1613},{7,11,1760},{7,11,1988},{9,11,434},{10,11,754} +,{11,11,25},{11,11,37},{139,11,414},{6,0,1963},{134,0,2000},{132,10,633},{5,11, +902},{134,0,1244},{135,11,928},{140,0,18},{138,0,204},{135,11,1173},{134,0,867}, +{4,0,708},{8,0,15},{9,0,50},{9,0,386},{11,0,18},{11,0,529},{140,0,228},{134,11, +270},{4,0,563},{7,0,109},{7,0,592},{7,0,637},{7,0,770},{8,0,463},{9,0,60},{9,0, +335},{9,0,904},{10,0,73},{11,0,434},{12,0,585},{13,0,331},{18,0,110},{148,0,60}, +{132,0,502},{14,11,359},{19,11,52},{148,11,47},{6,11,377},{7,11,1025},{9,11,613} +,{145,11,104},{5,10,70},{5,10,622},{6,0,347},{6,10,334},{7,10,1032},{9,10,171},{ +10,0,161},{11,10,26},{11,10,213},{11,10,637},{11,10,707},{12,10,202},{12,10,380} +,{13,10,226},{13,10,355},{14,10,222},{145,10,42},{132,11,416},{4,0,33},{5,0,102} +,{6,0,284},{7,0,1079},{7,0,1423},{7,0,1702},{8,0,470},{9,0,554},{9,0,723},{11,0, +333},{142,11,372},{5,11,152},{5,11,197},{7,11,340},{7,11,867},{10,11,548},{10,11 +,581},{11,11,6},{12,11,3},{12,11,19},{14,11,110},{142,11,289},{7,0,246},{135,0, +840},{6,0,10},{8,0,571},{9,0,739},{143,0,91},{4,10,23},{4,10,141},{5,10,313},{5, +10,1014},{6,0,465},{6,10,50},{7,0,1465},{7,10,142},{7,10,559},{8,10,640},{9,10, +460},{9,10,783},{11,10,741},{12,10,183},{141,10,488},{133,0,626},{136,0,614},{ +138,0,237},{7,11,34},{7,11,190},{8,11,28},{8,11,141},{8,11,444},{8,11,811},{9,11 +,468},{11,11,334},{12,11,24},{12,11,386},{140,11,576},{133,11,757},{5,0,18},{6,0 +,526},{13,0,24},{13,0,110},{19,0,5},{147,0,44},{6,0,506},{134,11,506},{135,11, +1553},{4,0,309},{5,0,462},{7,0,970},{7,0,1097},{7,11,1385},{11,11,582},{11,11, +650},{11,11,901},{11,11,949},{12,11,232},{12,11,236},{13,11,413},{13,11,501},{18 +,11,116},{22,0,30},{150,0,33},{5,10,222},{9,0,140},{138,10,534},{6,0,1056},{137, +10,906},{134,0,1704},{138,10,503},{134,0,1036},{5,10,154},{7,10,1491},{10,10,379 +},{138,10,485},{4,11,383},{133,10,716},{134,0,1315},{5,0,86},{7,0,743},{9,0,85}, +{10,0,281},{10,0,432},{11,0,825},{12,0,251},{13,0,118},{142,0,378},{4,10,91},{5, +10,388},{5,10,845},{6,10,206},{6,10,252},{6,10,365},{7,10,136},{7,10,531},{8,0, +264},{136,10,621},{5,0,524},{133,0,744},{5,11,277},{141,11,247},{132,11,435},{10 +,0,107},{140,0,436},{132,0,927},{10,0,123},{12,0,670},{146,0,94},{7,0,1149},{9,0 +,156},{138,0,957},{5,11,265},{6,11,212},{135,11,28},{133,0,778},{133,0,502},{8,0 +,196},{10,0,283},{139,0,406},{135,10,576},{136,11,535},{134,0,1312},{5,10,771},{ +5,10,863},{5,10,898},{6,10,1632},{6,10,1644},{134,10,1780},{5,0,855},{5,10,331}, +{135,11,1487},{132,11,702},{5,11,808},{135,11,2045},{7,0,1400},{9,0,446},{138,0, +45},{140,10,632},{132,0,1003},{5,11,166},{8,11,739},{140,11,511},{5,10,107},{7, +10,201},{136,10,518},{6,10,446},{135,10,1817},{134,0,1532},{134,0,1097},{4,11, +119},{5,11,170},{5,11,447},{7,11,1708},{7,11,1889},{9,11,357},{9,11,719},{12,11, +486},{140,11,596},{9,10,851},{141,10,510},{4,10,504},{7,0,612},{8,0,545},{8,0, +568},{8,0,642},{9,0,717},{10,0,541},{10,0,763},{11,0,449},{12,0,489},{13,0,153}, +{13,0,296},{14,0,138},{14,0,392},{15,0,50},{16,0,6},{16,0,12},{148,0,9},{4,11, +450},{135,11,1158},{5,10,883},{5,10,975},{8,10,392},{11,0,54},{13,0,173},{13,0, +294},{148,10,7},{13,0,455},{15,0,99},{15,0,129},{144,0,68},{135,0,172},{132,11, +754},{5,10,922},{134,10,1707},{134,0,1029},{17,11,39},{148,11,36},{4,0,568},{5, +10,993},{7,10,515},{137,10,91},{132,0,732},{10,0,617},{138,11,617},{134,0,974},{ +7,0,989},{10,0,377},{12,0,363},{13,0,68},{13,0,94},{14,0,108},{142,0,306},{136,0 +,733},{132,0,428},{7,0,1789},{135,11,1062},{7,0,2015},{140,0,665},{135,10,1433}, +{5,0,287},{7,10,921},{8,10,580},{8,10,593},{8,10,630},{138,10,28},{138,0,806},{4 +,10,911},{5,10,867},{5,10,1013},{7,10,2034},{8,10,798},{136,10,813},{134,0,1539} +,{8,11,523},{150,11,34},{135,11,740},{7,11,238},{7,11,2033},{8,11,120},{8,11,188 +},{8,11,659},{9,11,598},{10,11,466},{12,11,342},{12,11,588},{13,11,503},{14,11, +246},{143,11,92},{7,0,1563},{141,0,182},{5,10,135},{6,10,519},{7,10,1722},{10,10 +,271},{11,10,261},{145,10,54},{14,10,338},{148,10,81},{4,10,300},{5,10,436},{135 +,0,484},{145,11,114},{6,0,1623},{134,0,1681},{133,11,640},{4,11,201},{7,11,1744} +,{8,11,602},{11,11,247},{11,11,826},{145,11,65},{8,11,164},{146,11,62},{6,0,1833 +},{6,0,1861},{136,0,878},{134,0,1569},{8,10,357},{10,10,745},{14,10,426},{17,10, +94},{147,10,57},{12,0,93},{12,0,501},{13,0,362},{14,0,151},{15,0,40},{15,0,59},{ +16,0,46},{17,0,25},{18,0,14},{18,0,134},{19,0,25},{19,0,69},{20,0,16},{20,0,19}, +{20,0,66},{21,0,23},{21,0,25},{150,0,42},{6,0,1748},{8,0,715},{9,0,802},{10,0,46 +},{10,0,819},{13,0,308},{14,0,351},{14,0,363},{146,0,67},{132,0,994},{4,0,63},{ +133,0,347},{132,0,591},{133,0,749},{7,11,1577},{10,11,304},{10,11,549},{11,11, +424},{12,11,365},{13,11,220},{13,11,240},{142,11,33},{133,0,366},{5,10,387},{7,0 +,557},{12,0,547},{142,0,86},{135,0,1747},{132,11,907},{5,11,100},{10,11,329},{12 +,11,416},{149,11,29},{4,10,6},{5,10,708},{136,10,75},{7,10,1351},{9,10,581},{10, +10,639},{11,10,453},{140,10,584},{4,10,303},{135,0,89},{138,10,772},{132,11,176} +,{5,11,636},{5,11,998},{8,11,26},{137,11,358},{7,11,9},{7,11,1508},{9,11,317},{ +10,11,210},{10,11,292},{10,11,533},{11,11,555},{12,11,526},{12,11,607},{13,11, +263},{13,11,459},{142,11,271},{134,0,1463},{6,0,772},{6,0,1137},{139,11,595},{7, +0,977},{139,11,66},{138,0,893},{20,0,48},{148,11,48},{5,0,824},{133,0,941},{134, +11,295},{4,10,106},{7,0,1543},{7,0,1785},{10,0,690},{139,10,717},{7,0,440},{8,0, +230},{139,0,106},{5,10,890},{133,10,988},{6,10,626},{142,10,431},{10,11,127},{ +141,11,27},{10,10,706},{17,0,32},{150,10,44},{132,0,216},{137,0,332},{4,10,698}, +{136,11,119},{139,11,267},{138,10,17},{11,11,526},{11,11,939},{141,11,290},{7,11 +,1167},{11,11,934},{13,11,391},{145,11,76},{139,11,39},{134,10,84},{4,0,914},{5, +0,800},{133,0,852},{10,0,416},{141,0,115},{7,0,564},{142,0,168},{4,0,918},{133,0 +,876},{134,0,1764},{152,0,3},{4,0,92},{5,0,274},{7,11,126},{136,11,84},{140,10, +498},{136,11,790},{5,10,986},{6,10,130},{7,10,1582},{8,0,501},{8,10,458},{10,10, +101},{10,10,318},{138,10,823},{6,11,64},{12,11,377},{141,11,309},{5,0,743},{138, +0,851},{4,0,49},{7,0,280},{135,0,1633},{134,0,879},{136,0,47},{7,10,1644},{137, +10,129},{132,0,865},{134,0,1202},{9,11,34},{139,11,484},{135,10,997},{5,0,272},{ +5,0,908},{5,0,942},{8,0,197},{9,0,47},{11,0,538},{139,0,742},{6,11,1700},{7,11, +26},{7,11,293},{7,11,382},{7,11,1026},{7,11,1087},{7,11,2027},{8,11,24},{8,11, +114},{8,11,252},{8,11,727},{8,11,729},{9,11,30},{9,11,199},{9,11,231},{9,11,251} +,{9,11,334},{9,11,361},{9,11,488},{9,11,712},{10,11,55},{10,11,60},{10,11,232},{ +10,11,332},{10,11,384},{10,11,396},{10,11,504},{10,11,542},{10,11,652},{11,11,20 +},{11,11,48},{11,11,207},{11,11,291},{11,11,298},{11,11,342},{11,11,365},{11,11, +394},{11,11,620},{11,11,705},{11,11,1017},{12,11,123},{12,11,340},{12,11,406},{ +12,11,643},{13,11,61},{13,11,269},{13,11,311},{13,11,319},{13,11,486},{14,11,234 +},{15,11,62},{15,11,85},{16,11,71},{18,11,119},{148,11,105},{6,0,1455},{150,11, +37},{135,10,1927},{135,0,1911},{137,0,891},{7,10,1756},{137,10,98},{7,10,1046},{ +139,10,160},{132,0,761},{6,11,379},{7,11,270},{7,11,1116},{8,11,176},{8,11,183}, +{9,11,432},{9,11,661},{12,11,247},{12,11,617},{146,11,125},{6,10,45},{7,10,433}, +{8,10,129},{9,10,21},{10,10,392},{11,10,79},{12,10,499},{13,10,199},{141,10,451} +,{4,0,407},{5,11,792},{133,11,900},{132,0,560},{135,0,183},{7,10,558},{8,10,353} +,{141,0,490},{4,0,475},{5,10,785},{6,0,731},{11,0,35},{13,0,71},{13,0,177},{142, +0,422},{8,10,81},{9,10,189},{9,10,201},{11,10,478},{11,10,712},{141,10,338},{4,0 +,418},{4,0,819},{133,10,353},{151,10,26},{4,11,901},{133,11,776},{132,0,575},{7, +0,818},{16,0,92},{17,0,14},{17,0,45},{18,0,75},{148,0,18},{6,0,222},{7,0,636},{7 +,0,1620},{8,0,409},{9,0,693},{139,0,77},{6,10,25},{7,10,855},{7,10,1258},{144,10 +,32},{6,0,1880},{6,0,1887},{6,0,1918},{6,0,1924},{9,0,967},{9,0,995},{9,0,1015}, +{12,0,826},{12,0,849},{12,0,857},{12,0,860},{12,0,886},{12,0,932},{18,0,228},{18 +,0,231},{146,0,240},{134,0,633},{134,0,1308},{4,11,37},{5,11,334},{135,11,1253}, +{4,10,4},{7,10,1118},{7,10,1320},{7,10,1706},{8,10,277},{9,10,622},{10,0,86},{11 +,10,724},{12,10,350},{12,10,397},{13,10,28},{13,10,159},{15,10,89},{18,10,5},{19 +,10,9},{20,10,34},{150,10,47},{132,11,508},{137,11,448},{12,11,107},{146,11,31}, +{132,0,817},{134,0,663},{133,0,882},{134,0,914},{132,11,540},{132,11,533},{136, +11,608},{8,0,885},{138,0,865},{132,0,426},{6,0,58},{7,0,745},{7,0,1969},{8,0,399 +},{8,0,675},{9,0,479},{9,0,731},{10,0,330},{10,0,593},{10,0,817},{11,0,32},{11,0 +,133},{11,0,221},{145,0,68},{134,10,255},{7,0,102},{137,0,538},{137,10,216},{7, +11,253},{136,11,549},{135,11,912},{9,10,183},{139,10,286},{11,10,956},{151,10,3} +,{8,11,527},{18,11,60},{147,11,24},{4,10,536},{7,10,1141},{10,10,723},{139,10, +371},{133,11,920},{7,0,876},{135,10,285},{135,10,560},{132,10,690},{142,11,126}, +{11,10,33},{12,10,571},{149,10,1},{133,0,566},{4,11,483},{9,0,139},{10,0,399},{ +11,0,469},{12,0,634},{141,0,223},{6,0,48},{135,0,63},{7,10,1862},{12,10,491},{12 +,10,520},{13,10,383},{14,10,244},{146,0,12},{135,11,1665},{132,11,448},{9,11,495 +},{146,11,104},{6,0,114},{7,0,1224},{7,0,1556},{136,0,3},{4,10,190},{133,10,554} +,{5,10,1001},{8,0,576},{137,0,267},{133,10,446},{133,0,933},{139,11,1009},{8,11, +653},{13,11,93},{147,11,14},{6,0,692},{6,0,821},{134,0,1077},{5,11,172},{135,11, +801},{138,0,752},{4,0,375},{134,0,638},{134,0,1011},{140,11,540},{5,11,260},{137 +,0,96},{139,11,587},{135,10,1231},{4,10,304},{12,0,30},{13,0,148},{14,0,87},{14, +0,182},{16,0,42},{148,0,70},{6,0,1398},{7,0,56},{7,0,1989},{8,0,337},{8,0,738},{ +9,0,600},{12,0,37},{13,0,447},{142,0,92},{138,0,666},{5,0,394},{7,0,487},{136,0, +246},{6,10,53},{6,10,199},{7,10,1408},{8,10,32},{8,10,93},{9,0,437},{10,10,397}, +{10,10,629},{11,10,593},{11,10,763},{13,10,326},{145,10,35},{134,10,105},{9,0, +320},{10,0,506},{138,10,794},{7,11,57},{8,11,167},{8,11,375},{9,11,82},{9,11,561 +},{10,11,620},{10,11,770},{11,10,704},{141,10,396},{5,10,114},{5,10,255},{6,0, +1003},{141,10,285},{7,0,866},{135,0,1163},{133,11,531},{132,0,328},{7,10,2035},{ +8,10,19},{9,10,89},{138,10,831},{8,11,194},{136,11,756},{136,0,1000},{5,11,453}, +{134,11,441},{4,0,101},{5,0,833},{7,0,1171},{136,0,744},{133,0,726},{136,10,746} +,{138,0,176},{6,0,9},{6,0,397},{7,0,53},{7,0,1742},{10,0,632},{11,0,828},{140,0, +146},{135,11,22},{145,11,64},{132,0,839},{11,0,417},{12,0,223},{140,0,265},{4,11 +,102},{7,11,815},{7,11,1699},{139,11,964},{5,10,955},{136,10,814},{6,0,1931},{6, +0,2007},{18,0,246},{146,0,247},{8,0,198},{11,0,29},{140,0,534},{135,0,1771},{6,0 +,846},{7,11,1010},{11,11,733},{11,11,759},{12,11,563},{13,11,34},{14,11,101},{18 +,11,45},{146,11,129},{4,0,186},{5,0,157},{8,0,168},{138,0,6},{132,11,899},{133, +10,56},{148,10,100},{133,0,875},{5,0,773},{5,0,991},{6,0,1635},{134,0,1788},{6,0 +,1274},{9,0,477},{141,0,78},{4,0,639},{6,11,52},{7,0,111},{8,0,581},{9,11,104},{ +9,11,559},{10,10,4},{10,10,13},{11,10,638},{12,0,177},{12,11,308},{19,11,87},{ +148,10,57},{132,11,604},{4,11,301},{133,10,738},{133,10,758},{134,0,1747},{7,11, +1440},{11,11,854},{11,11,872},{11,11,921},{12,11,551},{13,11,472},{142,11,367},{ +7,0,1364},{7,0,1907},{141,0,158},{134,0,873},{4,0,404},{4,0,659},{7,0,552},{135, +0,675},{135,10,1112},{139,10,328},{7,11,508},{137,10,133},{133,0,391},{5,10,110} +,{6,10,169},{6,10,1702},{7,10,400},{8,10,538},{9,10,184},{9,10,524},{140,10,218} +,{6,11,310},{7,11,1849},{8,11,72},{8,11,272},{8,11,431},{9,11,12},{9,11,351},{10 +,11,563},{10,11,630},{10,11,810},{11,11,367},{11,11,599},{11,11,686},{140,11,672 +},{5,0,540},{6,0,1697},{136,0,668},{132,0,883},{134,0,78},{6,10,133},{9,10,353}, +{11,10,993},{12,0,628},{146,0,79},{6,11,181},{7,11,537},{8,11,64},{9,11,127},{10 +,11,496},{12,11,510},{141,11,384},{6,10,93},{7,10,1422},{7,10,1851},{8,10,673},{ +9,10,529},{140,10,43},{137,10,371},{134,0,1460},{134,0,962},{4,11,244},{135,11, +233},{9,10,25},{10,10,467},{138,10,559},{4,10,335},{135,10,942},{133,0,460},{135 +,11,334},{134,11,1650},{4,0,199},{139,0,34},{5,10,601},{8,10,39},{10,10,773},{11 +,10,84},{12,10,205},{142,10,1},{133,10,870},{134,0,388},{14,0,474},{148,0,120},{ +133,11,369},{139,0,271},{4,0,511},{4,10,181},{9,0,333},{9,0,379},{10,0,602},{11, +0,441},{11,0,723},{11,0,976},{140,0,357},{134,0,608},{134,10,1652},{9,11,338},{ +150,0,49},{140,0,988},{134,0,617},{5,0,938},{136,0,707},{132,10,97},{5,10,147},{ +6,10,286},{7,10,1362},{141,10,176},{6,0,756},{134,0,1149},{133,11,896},{6,10,375 +},{7,10,169},{7,10,254},{136,10,780},{134,0,1583},{135,10,1447},{139,0,285},{7, +11,1117},{8,11,393},{136,11,539},{135,0,344},{6,0,469},{7,0,1709},{138,0,515},{5 +,10,629},{135,10,1549},{5,11,4},{5,11,810},{6,11,13},{6,11,538},{6,11,1690},{6, +11,1726},{7,11,499},{7,11,1819},{8,11,148},{8,11,696},{8,11,791},{12,11,125},{13 +,11,54},{143,11,9},{135,11,1268},{137,0,404},{132,0,500},{5,0,68},{134,0,383},{ +11,0,216},{139,0,340},{4,11,925},{5,11,803},{8,11,698},{138,11,828},{4,0,337},{6 +,0,353},{7,0,1934},{8,0,488},{137,0,429},{7,0,236},{7,0,1795},{8,0,259},{9,0,135 +},{9,0,177},{9,0,860},{10,0,825},{11,0,115},{11,0,370},{11,0,405},{11,0,604},{12 +,0,10},{12,0,667},{12,0,669},{13,0,76},{14,0,310},{15,0,76},{15,0,147},{148,0,23 +},{4,0,15},{4,0,490},{5,0,22},{6,0,244},{7,0,40},{7,0,200},{7,0,906},{7,0,1199}, +{9,0,616},{10,0,716},{11,0,635},{11,0,801},{140,0,458},{4,10,420},{140,0,756},{ +134,0,1504},{5,11,383},{134,0,757},{6,0,1266},{135,0,1735},{5,0,598},{7,0,791},{ +7,10,1570},{8,0,108},{9,0,123},{140,10,542},{142,11,410},{9,11,660},{138,11,347} +}; diff --git a/deps/brotli/c/enc/static_init.c b/deps/brotli/c/enc/static_init.c new file mode 100644 index 00000000000000..c0dff3a3a78a99 --- /dev/null +++ b/deps/brotli/c/enc/static_init.c @@ -0,0 +1,59 @@ +/* Copyright 2025 Google Inc. All Rights Reserved. + + Distributed under MIT license. + See file LICENSE for detail or copy at https://opensource.org/licenses/MIT +*/ + +#include "static_init.h" + +#include "../common/platform.h" +#include "../common/static_init.h" + +#if (BROTLI_STATIC_INIT != BROTLI_STATIC_INIT_NONE) +#include "../common/dictionary.h" +#include "dictionary_hash.h" +#include "static_dict_lut.h" +#endif + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#if (BROTLI_STATIC_INIT != BROTLI_STATIC_INIT_NONE) +static BROTLI_BOOL DoBrotliEncoderStaticInit(void) { + const BrotliDictionary* dict = BrotliGetDictionary(); + BROTLI_BOOL ok = BrotliEncoderInitStaticDictionaryLut( + dict, kStaticDictionaryBuckets, kStaticDictionaryWords); + if (!ok) return BROTLI_FALSE; + ok = BrotliEncoderInitDictionaryHash(dict, kStaticDictionaryHashWords, + kStaticDictionaryHashLengths); + if (!ok) return BROTLI_FALSE; + return BROTLI_TRUE; +} +#endif /* BROTLI_STATIC_INIT_NONE */ + +#if (BROTLI_STATIC_INIT == BROTLI_STATIC_INIT_EARLY) +static BROTLI_BOOL kEarlyInitOk; +static __attribute__((constructor)) void BrotliEncoderStaticInitEarly(void) { + kEarlyInitOk = DoBrotliEncoderStaticInit(); +} +#elif (BROTLI_STATIC_INIT == BROTLI_STATIC_INIT_LAZY) +static BROTLI_BOOL kLazyInitOk; +void BrotliEncoderLazyStaticInitInner(void) { + kLazyInitOk = DoBrotliEncoderStaticInit(); +} +#endif /* BROTLI_STATIC_INIT_EARLY */ + +BROTLI_BOOL BrotliEncoderEnsureStaticInit(void) { +#if (BROTLI_STATIC_INIT == BROTLI_STATIC_INIT_NONE) + return BROTLI_TRUE; +#elif (BROTLI_STATIC_INIT == BROTLI_STATIC_INIT_EARLY) + return kEarlyInitOk; +#else + return kLazyInitOk; +#endif +} + +#if defined(__cplusplus) || defined(c_plusplus) +} /* extern "C" */ +#endif diff --git a/deps/brotli/c/enc/static_init.h b/deps/brotli/c/enc/static_init.h new file mode 100644 index 00000000000000..e5cb2391693828 --- /dev/null +++ b/deps/brotli/c/enc/static_init.h @@ -0,0 +1,30 @@ +/* Copyright 2025 Google Inc. All Rights Reserved. + + Distributed under MIT license. + See file LICENSE for detail or copy at https://opensource.org/licenses/MIT +*/ + +/* Central point for static initialization. */ + +#ifndef THIRD_PARTY_BROTLI_ENC_STATIC_INIT_H_ +#define THIRD_PARTY_BROTLI_ENC_STATIC_INIT_H_ + +#include "../common/platform.h" +#include "../common/static_init.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +#if (BROTLI_STATIC_INIT == BROTLI_STATIC_INIT_LAZY) +BROTLI_INTERNAL void BrotliEncoderLazyStaticInitInner(void); +BROTLI_INTERNAL void BrotliEncoderLazyStaticInit(void); +#endif /* BROTLI_STATIC_INIT */ + +BROTLI_INTERNAL BROTLI_BOOL BrotliEncoderEnsureStaticInit(void); + +#if defined(__cplusplus) || defined(c_plusplus) +} /* extern "C" */ +#endif + +#endif // THIRD_PARTY_BROTLI_ENC_STATIC_INIT_H_ diff --git a/deps/brotli/c/enc/static_init_lazy.cc b/deps/brotli/c/enc/static_init_lazy.cc new file mode 100644 index 00000000000000..6e00cd3741f447 --- /dev/null +++ b/deps/brotli/c/enc/static_init_lazy.cc @@ -0,0 +1,26 @@ +#include "../common/platform.h" +#include "../common/static_init.h" +#include "static_init.h" + +#if (BROTLI_STATIC_INIT != BROTLI_STATIC_INIT_LAZY) +#error "BROTLI_STATIC_INIT should be BROTLI_STATIC_INIT_LAZY" +#else +void BrotliEncoderLazyStaticInit(void) { + /* From https://en.cppreference.com/w/cpp/language/storage_duration.html: + ### Static block variables ### + Block variables with static or thread (since C++11) storage duration are + initialized the first time control passes through their declaration... + On all further calls, the declaration is skipped... + If multiple threads attempt to initialize the same static local variable + concurrently, the initialization occurs exactly once... + Usual implementations of this feature use variants of the double-checked + locking pattern, which reduces runtime overhead for already-initialized + local statics to a single non-atomic boolean comparison. + */ + static bool ok = [](){ + BrotliEncoderLazyStaticInitInner(); + return true; + }(); + if (!ok) BROTLI_CRASH(); +} +#endif /* BROTLI_STATIC_INIT_LAZY */ diff --git a/deps/brotli/c/enc/utf8_util.c b/deps/brotli/c/enc/utf8_util.c index 65ec3f5c8d5b0a..d46c3644e01093 100644 --- a/deps/brotli/c/enc/utf8_util.c +++ b/deps/brotli/c/enc/utf8_util.c @@ -8,7 +8,7 @@ #include "utf8_util.h" -#include +#include "../common/platform.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { diff --git a/deps/brotli/c/enc/utf8_util.h b/deps/brotli/c/enc/utf8_util.h index a38a95383ccd53..cae3dba7af11be 100644 --- a/deps/brotli/c/enc/utf8_util.h +++ b/deps/brotli/c/enc/utf8_util.h @@ -9,8 +9,6 @@ #ifndef BROTLI_ENC_UTF8_UTIL_H_ #define BROTLI_ENC_UTF8_UTIL_H_ -#include - #include "../common/platform.h" #if defined(__cplusplus) || defined(c_plusplus) diff --git a/deps/brotli/c/enc/write_bits.h b/deps/brotli/c/enc/write_bits.h index 242754b0ee506b..0cdc3372b445bf 100644 --- a/deps/brotli/c/enc/write_bits.h +++ b/deps/brotli/c/enc/write_bits.h @@ -9,8 +9,6 @@ #ifndef BROTLI_ENC_WRITE_BITS_H_ #define BROTLI_ENC_WRITE_BITS_H_ -#include - #include "../common/platform.h" #if defined(__cplusplus) || defined(c_plusplus) diff --git a/deps/brotli/c/include/brotli/decode.h b/deps/brotli/c/include/brotli/decode.h index af1aa23f60d7cf..8d436db733c920 100644 --- a/deps/brotli/c/include/brotli/decode.h +++ b/deps/brotli/c/include/brotli/decode.h @@ -14,7 +14,7 @@ #include #include -#include +#include /* IWYU pragma: export */ #if defined(__cplusplus) || defined(c_plusplus) extern "C" { diff --git a/deps/brotli/c/include/brotli/encode.h b/deps/brotli/c/include/brotli/encode.h index dea9931ebb39f0..ac26ea8e62d220 100644 --- a/deps/brotli/c/include/brotli/encode.h +++ b/deps/brotli/c/include/brotli/encode.h @@ -14,7 +14,7 @@ #include #include -#include +#include /* IWYU pragma: export */ #if defined(__cplusplus) || defined(c_plusplus) extern "C" { @@ -283,6 +283,10 @@ typedef struct BrotliEncoderPreparedDictionaryStruct * passed to @p alloc_func and @p free_func when they are called. @p free_func * has to return without doing anything when asked to free a NULL pointer. * + * @warning Created instance is "lean"; it does not contain copy of @p data, + * rather it contains only pointer to it; therefore, + * @p data @b MUST outlive the created instance. + * * @param type type of dictionary stored in data * @param data_size size of @p data buffer * @param data pointer to the dictionary data diff --git a/deps/brotli/c/include/brotli/port.h b/deps/brotli/c/include/brotli/port.h index 0d50019042d1f4..11cefd791e4d91 100644 --- a/deps/brotli/c/include/brotli/port.h +++ b/deps/brotli/c/include/brotli/port.h @@ -239,8 +239,6 @@ #define BROTLI_PUBLIC #endif -/* BROTLI_INTERNAL could be defined to override visibility, e.g. for tests. */ -#if !defined(BROTLI_INTERNAL) #if defined(_WIN32) || defined(__CYGWIN__) #define BROTLI_INTERNAL #elif BROTLI_GNUC_VERSION_CHECK(3, 3, 0) || \ @@ -255,7 +253,6 @@ #else #define BROTLI_INTERNAL #endif -#endif #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \ !defined(__STDC_NO_VLA__) && !defined(__cplusplus) && \ @@ -272,20 +269,20 @@ #if defined(_WIN32) #if defined(BROTLICOMMON_SHARED_COMPILATION) #define BROTLI_COMMON_API __declspec(dllexport) -#else +#else /* !BROTLICOMMON_SHARED_COMPILATION */ #define BROTLI_COMMON_API __declspec(dllimport) #endif /* BROTLICOMMON_SHARED_COMPILATION */ #if defined(BROTLIDEC_SHARED_COMPILATION) #define BROTLI_DEC_API __declspec(dllexport) -#else +#else /* !BROTLIDEC_SHARED_COMPILATION */ #define BROTLI_DEC_API __declspec(dllimport) #endif /* BROTLIDEC_SHARED_COMPILATION */ #if defined(BROTLIENC_SHARED_COMPILATION) #define BROTLI_ENC_API __declspec(dllexport) -#else +#else /* !BROTLIENC_SHARED_COMPILATION */ #define BROTLI_ENC_API __declspec(dllimport) #endif /* BROTLIENC_SHARED_COMPILATION */ -#else /* _WIN32 */ +#else /* !_WIN32 */ #define BROTLI_COMMON_API BROTLI_PUBLIC #define BROTLI_DEC_API BROTLI_PUBLIC #define BROTLI_ENC_API BROTLI_PUBLIC diff --git a/deps/brotli/c/include/brotli/types.h b/deps/brotli/c/include/brotli/types.h index eff1a3cd07aefe..2dc61ff4076597 100644 --- a/deps/brotli/c/include/brotli/types.h +++ b/deps/brotli/c/include/brotli/types.h @@ -12,7 +12,7 @@ #ifndef BROTLI_COMMON_TYPES_H_ #define BROTLI_COMMON_TYPES_H_ -#include /* for size_t */ +#include /* IWYU pragma: export */ #if defined(_MSC_VER) && (_MSC_VER < 1600) typedef __int8 int8_t; @@ -24,7 +24,7 @@ typedef unsigned __int32 uint32_t; typedef unsigned __int64 uint64_t; typedef __int64 int64_t; #else -#include +#include /* IWYU pragma: export */ #endif /* defined(_MSC_VER) && (_MSC_VER < 1600) */ /** diff --git a/deps/brotli/c/tools/brotli.c b/deps/brotli/c/tools/brotli.c index 03f2d066ea6110..fe088d403e1148 100644 --- a/deps/brotli/c/tools/brotli.c +++ b/deps/brotli/c/tools/brotli.c @@ -7,6 +7,7 @@ /* Command line interface for Brotli library. */ /* Mute strerror/strcpy warnings. */ +#include #if !defined(_CRT_SECURE_NO_WARNINGS) #define _CRT_SECURE_NO_WARNINGS #endif @@ -20,12 +21,11 @@ #include #include -#include -#include #include - #include "../common/constants.h" #include "../common/version.h" +#include +#include #if defined(_WIN32) #include @@ -103,9 +103,17 @@ typedef enum { COMMAND_VERSION } Command; +typedef enum { + COMMENT_INIT, + COMMENT_READ, + COMMENT_OK, + COMMENT_BAD, +} CommentState; + #define DEFAULT_LGWIN 24 #define DEFAULT_SUFFIX ".br" -#define MAX_OPTIONS 20 +#define MAX_OPTIONS 24 +#define MAX_COMMENT_LEN 80 typedef struct { /* Parameters */ @@ -120,9 +128,14 @@ typedef struct { BROTLI_BOOL test_integrity; BROTLI_BOOL decompress; BROTLI_BOOL large_window; + BROTLI_BOOL allow_concatenated; const char* output_path; const char* dictionary_path; const char* suffix; + uint8_t comment[MAX_COMMENT_LEN]; + size_t comment_len; + size_t comment_pos; + CommentState comment_state; int not_input_indices[MAX_OPTIONS]; size_t longest_path_len; size_t input_count; @@ -133,6 +146,7 @@ typedef struct { uint8_t* dictionary; size_t dictionary_size; BrotliEncoderPreparedDictionary* prepared_dictionary; + BrotliDecoderState* decoder; char* modified_path; /* Storage for path with appended / cut suffix */ int iterator; int ignore; @@ -161,6 +175,55 @@ typedef struct { clock_t end_time; } Context; +/* Parse base 64 encoded string to buffer. Not performance-centric. + |out_len| as input is buffer size; |out_len| as output is decoded length. + Returns BROTLI_FALSE if either input is not (relaxed) base 64 conformant, + or output does not fit buffer. */ +static BROTLI_BOOL ParseBase64(const char* str, uint8_t* out, size_t* out_len) { + size_t in_len = strlen(str); + size_t max_out_len = *out_len; + size_t i; + size_t bit_count = 0; + uint32_t bits = 0; + size_t padding_count = 0; + size_t octet_count = 0; + for (i = 0; i < in_len; ++i) { + char c = str[i]; + int sextet = 0; + if (c == 9 || c == 10 || c == 13 || c == ' ') { + continue; + } + if (c == '=') { + padding_count++; + continue; + } + if (padding_count) return BROTLI_FALSE; + if (c == '+' || c == '-') { + sextet = 62; + } else if (c == '/' || c == '_') { + sextet = 63; + } else if (c >= 'A' && c <= 'Z') { + sextet = c - 'A'; + } else if (c >= 'a' && c <= 'z') { + sextet = c - 'a' + 26; + } else if (c >= '0' && c <= '9') { + sextet = c - '0' + 52; + } else { + return BROTLI_FALSE; + } + bits = (bits << 6) | (uint32_t)sextet; + bit_count += 6; + if (bit_count >= 8) { + if (octet_count == max_out_len) return BROTLI_FALSE; + bit_count -= 8; + out[octet_count++] = (bits >> bit_count) & 0xFF; + } + } + if (padding_count > 2) return BROTLI_FALSE; + *out_len = octet_count; + return BROTLI_TRUE; +} + /* Parse up to 5 decimal digits. */ static BROTLI_BOOL ParseInt(const char* s, int low, int high, int* result) { int value = 0; @@ -189,17 +252,16 @@ static const char* FileName(const char* path) { } /* Detect if the program name is a special alias that infers a command type. */ -static Command ParseAlias(const char* name) { +static BROTLI_BOOL CheckAlias(const char* name, const char* alias) { /* TODO: cast name to lower case? */ - const char* unbrotli = "unbrotli"; - size_t unbrotli_len = strlen(unbrotli); + size_t alias_len = strlen(alias); name = FileName(name); /* Partial comparison. On Windows there could be ".exe" suffix. */ - if (strncmp(name, unbrotli, unbrotli_len) == 0) { - char terminator = name[unbrotli_len]; - if (terminator == 0 || terminator == '.') return COMMAND_DECOMPRESS; + if (strncmp(name, alias, alias_len) == 0) { + char terminator = name[alias_len]; + if (terminator == 0 || terminator == '.') return BROTLI_TRUE; } - return COMMAND_COMPRESS; + return BROTLI_FALSE; } static Command ParseParams(Context* params) { @@ -217,7 +279,21 @@ static Command ParseParams(Context* params) { BROTLI_BOOL lgwin_set = BROTLI_FALSE; BROTLI_BOOL suffix_set = BROTLI_FALSE; BROTLI_BOOL after_dash_dash = BROTLI_FALSE; - Command command = ParseAlias(argv[0]); + BROTLI_BOOL comment_set = BROTLI_FALSE; + BROTLI_BOOL concatenated_set = BROTLI_FALSE; + Command command = COMMAND_COMPRESS; + + if (CheckAlias(argv[0], "brcat")) { + command_set = BROTLI_TRUE; + command = COMMAND_DECOMPRESS; + concatenated_set = BROTLI_TRUE; + params->allow_concatenated = BROTLI_TRUE; + output_set = BROTLI_TRUE; + params->write_to_stdout = BROTLI_TRUE; + } else if (CheckAlias(argv[0], "unbrotli")) { + command_set = BROTLI_TRUE; + command = COMMAND_DECOMPRESS; + } for (i = 1; i < argc; ++i) { const char* arg = argv[i]; @@ -231,7 +307,7 @@ static Command ParseParams(Context* params) { } /* Too many options. The expected longest option list is: - "-q 0 -w 10 -o f -D d -S b -d -f -k -n -v --", i.e. 16 items in total. + "-q 0 -w 10 -o f -D d -S b -d -f -k -n -v -K --", i.e. 17 items in total. This check is an additional guard that is never triggered, but provides a guard for future changes. */ if (next_option_index > (MAX_OPTIONS - 2)) { @@ -332,6 +408,14 @@ static Command ParseParams(Context* params) { } params->verbosity = 1; continue; + } else if (c == 'K') { + if (concatenated_set) { + fprintf(stderr, "argument -K / --concatenated already set\n"); + return COMMAND_INVALID; + } + concatenated_set = BROTLI_TRUE; + params->allow_concatenated = BROTLI_TRUE; + continue; } else if (c == 'V') { /* Don't parse further. */ return COMMAND_VERSION; @@ -344,8 +428,9 @@ static Command ParseParams(Context* params) { params->quality = 11; continue; } - /* o/q/w/D/S with parameter is expected */ - if (c != 'o' && c != 'q' && c != 'w' && c != 'D' && c != 'S') { + /* o/q/w/C/D/S with parameter is expected */ + if (c != 'o' && c != 'q' && c != 'w' && c != 'C' && c != 'D' && + c != 'S') { fprintf(stderr, "invalid argument -%c\n", c); return COMMAND_INVALID; } @@ -393,6 +478,17 @@ static Command ParseParams(Context* params) { params->lgwin, BROTLI_MIN_WINDOW_BITS); return COMMAND_INVALID; } + } else if (c == 'C') { + if (comment_set) { + fprintf(stderr, "comment already set\n"); + return COMMAND_INVALID; + } + params->comment_len = MAX_COMMENT_LEN; + if (!ParseBase64(argv[i], params->comment, ¶ms->comment_len)) { + fprintf(stderr, "invalid base64-encoded comment\n"); + return COMMAND_INVALID; + } + comment_set = BROTLI_TRUE; } else if (c == 'D') { if (params->dictionary_path) { fprintf(stderr, "dictionary path already set\n"); @@ -417,6 +513,14 @@ static Command ParseParams(Context* params) { } quality_set = BROTLI_TRUE; params->quality = 11; + } else if (strcmp("concatenated", arg) == 0) { + if (concatenated_set) { + fprintf(stderr, "argument -K / --concatenated already set\n"); + return COMMAND_INVALID; + } + concatenated_set = BROTLI_TRUE; + params->allow_concatenated = BROTLI_TRUE; + continue; } else if (strcmp("decompress", arg) == 0) { if (command_set) { fprintf(stderr, "command already set when parsing --decompress\n"); @@ -486,7 +590,7 @@ static Command ParseParams(Context* params) { return COMMAND_VERSION; } else { /* key=value */ - const char* value = strrchr(arg, '='); + const char* value = strchr(arg, '='); size_t key_len; if (!value || value[1] == 0) { fprintf(stderr, "must pass the parameter as --%s=value\n", arg); @@ -494,7 +598,18 @@ static Command ParseParams(Context* params) { } key_len = (size_t)(value - arg); value++; - if (strncmp("dictionary", arg, key_len) == 0) { + if (strncmp("comment", arg, key_len) == 0) { + if (comment_set) { + fprintf(stderr, "comment already set\n"); + return COMMAND_INVALID; + } + params->comment_len = MAX_COMMENT_LEN; + if (!ParseBase64(value, params->comment, ¶ms->comment_len)) { + fprintf(stderr, "invalid base64-encoded comment\n"); + return COMMAND_INVALID; + } + comment_set = BROTLI_TRUE; + } else if (strncmp("dictionary", arg, key_len) == 0) { if (params->dictionary_path) { fprintf(stderr, "dictionary path already set\n"); return COMMAND_INVALID; @@ -584,6 +699,12 @@ static Command ParseParams(Context* params) { if (strchr(params->suffix, '/') || strchr(params->suffix, '\\')) { return COMMAND_INVALID; } + if (!params->decompress && params->allow_concatenated) { + return COMMAND_INVALID; + } + if (params->allow_concatenated && params->comment_len) { + return COMMAND_INVALID; + } return command; } @@ -633,7 +754,14 @@ static void PrintHelp(const char* name, BROTLI_BOOL error) { " decodable with regular brotli decoders\n", BROTLI_MIN_WINDOW_BITS, BROTLI_LARGE_MAX_WINDOW_BITS); fprintf(media, -" -D FILE, --dictionary=FILE use FILE as raw (LZ77) dictionary\n"); +" -C B64, --comment=B64 set comment; argument is base64-decoded first;\n" +" (maximal decoded length: %d)\n" +" when decoding: check stream comment;\n" +" when encoding: embed comment (fingerprint)\n", + MAX_COMMENT_LEN); + fprintf(media, +" -D FILE, --dictionary=FILE use FILE as raw (LZ77) dictionary\n" +" -K, --concatenated allows concatenated brotli streams as input\n"); fprintf(media, " -S SUF, --suffix=SUF output file suffix (default:'%s')\n", DEFAULT_SUFFIX); @@ -995,6 +1123,7 @@ static BROTLI_BOOL ProvideOutput(Context* context) { static BROTLI_BOOL FlushOutput(Context* context) { if (!WriteOutput(context)) return BROTLI_FALSE; context->available_out = 0; + context->next_out = context->output; return BROTLI_TRUE; } @@ -1034,10 +1163,79 @@ static const char* PrettyDecoderErrorString(BrotliDecoderErrorCode code) { return error_str; } -static BROTLI_BOOL DecompressFile(Context* context, BrotliDecoderState* s) { +static void OnMetadataStart(void* opaque, size_t size) { + Context* context = (Context*) opaque; + if (context->comment_state == COMMENT_INIT) { + if (context->comment_len != size) { + context->comment_state = COMMENT_BAD; + return; + } + context->comment_pos = 0; + context->comment_state = COMMENT_READ; + } +} + +static void OnMetadataChunk(void* opaque, const uint8_t* data, size_t size) { + Context* context = (Context*) opaque; + if (context->comment_state == COMMENT_READ) { + size_t i; + for (i = 0; i < size; ++i) { + if (context->comment_pos >= context->comment_len) { + context->comment_state = COMMENT_BAD; + return; + } + if (context->comment[context->comment_pos++] != data[i]) { + context->comment_state = COMMENT_BAD; + return; + } + } + if (context->comment_pos == context->comment_len) { + context->comment_state = COMMENT_OK; + } + } +} + +static BROTLI_BOOL InitDecoder(Context* context) { + context->decoder = BrotliDecoderCreateInstance(NULL, NULL, NULL); + if (!context->decoder) { + fprintf(stderr, "out of memory\n"); + return BROTLI_FALSE; + } + /* This allows decoding "large-window" streams. Though it creates + fragmentation (new builds decode streams that old builds don't), + it is better from used experience perspective. */ + BrotliDecoderSetParameter( + context->decoder, BROTLI_DECODER_PARAM_LARGE_WINDOW, 1u); + if (context->dictionary) { + BrotliDecoderAttachDictionary(context->decoder, + BROTLI_SHARED_DICTIONARY_RAW, context->dictionary_size, + context->dictionary); + } + return BROTLI_TRUE; +} + +static BROTLI_BOOL DecompressFile(Context* context) { + BrotliDecoderState* s = context->decoder; BrotliDecoderResult result = BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT; + if (context->comment_len) { + context->comment_state = COMMENT_INIT; + BrotliDecoderSetMetadataCallbacks(s, &OnMetadataStart, &OnMetadataChunk, + (void*)context); + } else { + context->comment_state = COMMENT_OK; + } + InitializeBuffers(context); for (;;) { + /* Early check */ + if (context->comment_state == COMMENT_BAD) { + fprintf(stderr, "corrupt input [%s]\n", + PrintablePath(context->current_input_path)); + if (context->verbosity > 0) { + fprintf(stderr, "reason: comment mismatch\n"); + } + return BROTLI_FALSE; + } if (result == BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT) { if (!HasMoreInput(context)) { fprintf(stderr, "corrupt input [%s]\n", @@ -1052,23 +1250,52 @@ static BROTLI_BOOL DecompressFile(Context* context, BrotliDecoderState* s) { if (!ProvideOutput(context)) return BROTLI_FALSE; } else if (result == BROTLI_DECODER_RESULT_SUCCESS) { if (!FlushOutput(context)) return BROTLI_FALSE; - int has_more_input = - (context->available_in != 0) || (fgetc(context->fin) != EOF); + BROTLI_BOOL has_more_input = (context->available_in != 0); + int extra_char = EOF; + if (!has_more_input) { + extra_char = fgetc(context->fin); + if (extra_char != EOF) { + has_more_input = BROTLI_TRUE; + context->input[0] = (uint8_t)extra_char; + context->next_in = context->input; + context->available_in = 1; + } + } if (has_more_input) { - fprintf(stderr, "corrupt input [%s]\n", - PrintablePath(context->current_input_path)); + if (context->allow_concatenated) { + if (context->verbosity > 0) { + fprintf(stderr, "extra input\n"); + } + if (!ProvideOutput(context)) return BROTLI_FALSE; + BrotliDecoderDestroyInstance(context->decoder); + context->decoder = NULL; + if (!InitDecoder(context)) return BROTLI_FALSE; + s = context->decoder; + } else { + fprintf(stderr, "corrupt input [%s]\n", + PrintablePath(context->current_input_path)); + if (context->verbosity > 0) { + fprintf(stderr, "reason: extra input\n"); + } + return BROTLI_FALSE; + } + } else { if (context->verbosity > 0) { - fprintf(stderr, "reason: extra input\n"); + context->end_time = clock(); + fprintf(stderr, "Decompressed "); + PrintFileProcessingProgress(context); + fprintf(stderr, "\n"); } - return BROTLI_FALSE; - } - if (context->verbosity > 0) { - context->end_time = clock(); - fprintf(stderr, "Decompressed "); - PrintFileProcessingProgress(context); - fprintf(stderr, "\n"); + /* Final check */ + if (context->comment_state != COMMENT_OK) { + fprintf(stderr, "corrupt input [%s]\n", + PrintablePath(context->current_input_path)); + if (context->verbosity > 0) { + fprintf(stderr, "reason: comment mismatch\n"); + } + } + return BROTLI_TRUE; } - return BROTLI_TRUE; } else { /* result == BROTLI_DECODER_RESULT_ERROR */ fprintf(stderr, "corrupt input [%s]\n", PrintablePath(context->current_input_path)); @@ -1090,27 +1317,16 @@ static BROTLI_BOOL DecompressFiles(Context* context) { BROTLI_BOOL is_ok = BROTLI_TRUE; BROTLI_BOOL rm_input = BROTLI_FALSE; BROTLI_BOOL rm_output = BROTLI_TRUE; - BrotliDecoderState* s = BrotliDecoderCreateInstance(NULL, NULL, NULL); - if (!s) { - fprintf(stderr, "out of memory\n"); - return BROTLI_FALSE; - } - /* This allows decoding "large-window" streams. Though it creates - fragmentation (new builds decode streams that old builds don't), - it is better from used experience perspective. */ - BrotliDecoderSetParameter(s, BROTLI_DECODER_PARAM_LARGE_WINDOW, 1u); - if (context->dictionary) { - BrotliDecoderAttachDictionary(s, BROTLI_SHARED_DICTIONARY_RAW, - context->dictionary_size, context->dictionary); - } + if (!InitDecoder(context)) return BROTLI_FALSE; is_ok = OpenFiles(context); if (is_ok && !context->current_input_path && !context->force_overwrite && isatty(STDIN_FILENO)) { fprintf(stderr, "Use -h help. Use -f to force input from a terminal.\n"); is_ok = BROTLI_FALSE; } - if (is_ok) is_ok = DecompressFile(context, s); - BrotliDecoderDestroyInstance(s); + if (is_ok) is_ok = DecompressFile(context); + if (context->decoder) BrotliDecoderDestroyInstance(context->decoder); + context->decoder = NULL; rm_output = !is_ok; rm_input = !rm_output && context->junk_source; if (!CloseFiles(context, rm_input, rm_output)) is_ok = BROTLI_FALSE; @@ -1121,6 +1337,7 @@ static BROTLI_BOOL DecompressFiles(Context* context) { static BROTLI_BOOL CompressFile(Context* context, BrotliEncoderState* s) { BROTLI_BOOL is_eof = BROTLI_FALSE; + BROTLI_BOOL prologue = !!context->comment_len; InitializeBuffers(context); for (;;) { if (context->available_in == 0 && !is_eof) { @@ -1128,14 +1345,34 @@ static BROTLI_BOOL CompressFile(Context* context, BrotliEncoderState* s) { is_eof = !HasMoreInput(context); } - if (!BrotliEncoderCompressStream(s, - is_eof ? BROTLI_OPERATION_FINISH : BROTLI_OPERATION_PROCESS, - &context->available_in, &context->next_in, - &context->available_out, &context->next_out, NULL)) { - /* Should detect OOM? */ - fprintf(stderr, "failed to compress data [%s]\n", - PrintablePath(context->current_input_path)); - return BROTLI_FALSE; + if (prologue) { + prologue = BROTLI_FALSE; + const uint8_t* next_meta = context->comment; + size_t available_meta = context->comment_len; + if (!BrotliEncoderCompressStream(s, + BROTLI_OPERATION_EMIT_METADATA, + &available_meta, &next_meta, + &context->available_out, &context->next_out, NULL)) { + /* Should detect OOM? */ + fprintf(stderr, "failed to emit metadata [%s]\n", + PrintablePath(context->current_input_path)); + return BROTLI_FALSE; + } + if (available_meta != 0) { + fprintf(stderr, "failed to emit metadata [%s]\n", + PrintablePath(context->current_input_path)); + return BROTLI_FALSE; + } + } else { + if (!BrotliEncoderCompressStream(s, + is_eof ? BROTLI_OPERATION_FINISH : BROTLI_OPERATION_PROCESS, + &context->available_in, &context->next_in, + &context->available_out, &context->next_out, NULL)) { + /* Should detect OOM? */ + fprintf(stderr, "failed to compress data [%s]\n", + PrintablePath(context->current_input_path)); + return BROTLI_FALSE; + } } if (context->available_out == 0) { @@ -1230,6 +1467,7 @@ int main(int argc, char** argv) { context.quality = 11; context.lgwin = -1; context.verbosity = 0; + context.comment_len = 0; context.force_overwrite = BROTLI_FALSE; context.junk_source = BROTLI_FALSE; context.reject_uncompressible = BROTLI_FALSE; @@ -1238,6 +1476,7 @@ int main(int argc, char** argv) { context.write_to_stdout = BROTLI_FALSE; context.decompress = BROTLI_FALSE; context.large_window = BROTLI_FALSE; + context.allow_concatenated = BROTLI_FALSE; context.output_path = NULL; context.dictionary_path = NULL; context.suffix = DEFAULT_SUFFIX; @@ -1249,6 +1488,7 @@ int main(int argc, char** argv) { context.argv = argv; context.dictionary = NULL; context.dictionary_size = 0; + context.decoder = NULL; context.prepared_dictionary = NULL; context.modified_path = NULL; context.iterator = 0; diff --git a/deps/brotli/c/tools/brotli.md b/deps/brotli/c/tools/brotli.md index cb6d6f3813c1f1..8792314ee14953 100644 --- a/deps/brotli/c/tools/brotli.md +++ b/deps/brotli/c/tools/brotli.md @@ -1,11 +1,13 @@ # NAME -brotli(1) -- brotli, unbrotli - compress or decompress files +brotli(1) -- brotli, brcat, unbrotli - compress or decompress files # SYNOPSIS `brotli` [*OPTION|FILE*]... +`brcat` is equivalent to `brotli --decompress --concatenated --stdout` + `unbrotli` is equivalent to `brotli --decompress` # DESCRIPTION @@ -83,9 +85,15 @@ Conflicting or duplicate _options_ are not allowed. `(pow(2, NUM) - 16)`; 0 lets compressor decide over the optimal value; bigger windows size improve density; decoder might require up to window size memory to operate +* `-C B64`, `--comment=B64`: + set comment; argument is base64-decoded first; + when decoding: check stream comment; + when encoding: embed comment (fingerprint) * `-D FILE`, `--dictionary=FILE`: use FILE as raw (LZ77) dictionary; same dictionary MUST be used both for compression and decompression +* `-K`, `--concatenated`: + when decoding, allow concatenated brotli streams as input * `-S SUF`, `--suffix=SUF`: output file suffix (default: `.br`) * `-V`, `--version`: From 93c25815eeb23bf18f64dfd517c1462766e1b3da Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Fri, 21 Nov 2025 14:49:23 -0500 Subject: [PATCH 21/56] http: move writeHeader to end-of-life MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/60635 Reviewed-By: Yagiz Nizipli Reviewed-By: Matteo Collina Reviewed-By: Luigi Pinca Reviewed-By: Marco Ippolito Reviewed-By: Rafael Gonzaga Reviewed-By: James M Snell Reviewed-By: Ethan Arrowood Reviewed-By: Tobias Nießen --- doc/api/deprecations.md | 5 ++++- lib/_http_server.js | 5 ----- test/parallel/test-write-header.js | 20 -------------------- 3 files changed, 4 insertions(+), 26 deletions(-) delete mode 100644 test/parallel/test-write-header.js diff --git a/doc/api/deprecations.md b/doc/api/deprecations.md index 610bcc4f7302a1..95a237326f7f49 100644 --- a/doc/api/deprecations.md +++ b/doc/api/deprecations.md @@ -1600,6 +1600,9 @@ instead. -Type: Runtime +Type: End-of-Life The `node:http` module `ServerResponse.prototype.writeHeader()` API is deprecated. Please use `ServerResponse.prototype.writeHead()` instead. diff --git a/lib/_http_server.js b/lib/_http_server.js index 3fd14faedf46d8..9df050e84289ae 100644 --- a/lib/_http_server.js +++ b/lib/_http_server.js @@ -84,7 +84,6 @@ const { } = require('internal/errors'); const { assignFunctionName, - deprecate, kEmptyObject, promisify, } = require('internal/util'); @@ -447,10 +446,6 @@ function writeHead(statusCode, reason, obj) { return this; } -ServerResponse.prototype.writeHeader = deprecate(ServerResponse.prototype.writeHead, - 'ServerResponse.prototype.writeHeader is deprecated.', - 'DEP0063'); - function storeHTTPOptions(options) { this[kIncomingMessage] = options.IncomingMessage || IncomingMessage; this[kServerResponse] = options.ServerResponse || ServerResponse; diff --git a/test/parallel/test-write-header.js b/test/parallel/test-write-header.js deleted file mode 100644 index 38a835bcddbf9c..00000000000000 --- a/test/parallel/test-write-header.js +++ /dev/null @@ -1,20 +0,0 @@ -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const http = require('http'); - -common.expectWarning('DeprecationWarning', - 'ServerResponse.prototype.writeHeader is deprecated.', 'DEP0063'); - -const server = http.createServer(common.mustCall((req, res) => { - res.writeHeader(200, [ 'test', '2', 'test2', '2' ]); - res.end(); -})).listen(0, common.mustCall(() => { - http.get({ port: server.address().port }, common.mustCall((res) => { - assert.strictEqual(res.headers.test, '2'); - assert.strictEqual(res.headers.test2, '2'); - res.resume().on('end', common.mustCall(() => { - server.close(); - })); - })); -})); From 45eeb6f88cabdaafcf5e6075c9721c43847db99f Mon Sep 17 00:00:00 2001 From: npm CLI robot Date: Fri, 21 Nov 2025 13:07:32 -0800 Subject: [PATCH 22/56] deps: upgrade npm to 11.6.3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/60785 Reviewed-By: Michaël Zasso Reviewed-By: Colin Ihrig Reviewed-By: Luigi Pinca --- deps/npm/docs/content/commands/npm-access.md | 13 +- deps/npm/docs/content/commands/npm-adduser.md | 4 +- deps/npm/docs/content/commands/npm-audit.md | 132 +- deps/npm/docs/content/commands/npm-bugs.md | 32 +- deps/npm/docs/content/commands/npm-ci.md | 156 +- deps/npm/docs/content/commands/npm-config.md | 30 +- deps/npm/docs/content/commands/npm-dedupe.md | 146 +- .../docs/content/commands/npm-deprecate.md | 22 +- deps/npm/docs/content/commands/npm-diff.md | 59 +- .../npm/docs/content/commands/npm-dist-tag.md | 32 +- deps/npm/docs/content/commands/npm-docs.md | 32 +- deps/npm/docs/content/commands/npm-exec.md | 40 +- deps/npm/docs/content/commands/npm-explain.md | 16 +- deps/npm/docs/content/commands/npm-explore.md | 4 +- .../docs/content/commands/npm-find-dupes.md | 133 +- deps/npm/docs/content/commands/npm-fund.md | 28 +- deps/npm/docs/content/commands/npm-help.md | 3 +- deps/npm/docs/content/commands/npm-init.md | 71 +- .../content/commands/npm-install-ci-test.md | 156 +- .../docs/content/commands/npm-install-test.md | 219 +- deps/npm/docs/content/commands/npm-install.md | 219 +- deps/npm/docs/content/commands/npm-link.md | 164 +- deps/npm/docs/content/commands/npm-login.md | 4 +- deps/npm/docs/content/commands/npm-ls.md | 111 +- deps/npm/docs/content/commands/npm-org.md | 17 +- .../npm/docs/content/commands/npm-outdated.md | 53 +- deps/npm/docs/content/commands/npm-owner.md | 34 +- deps/npm/docs/content/commands/npm-pack.md | 57 +- deps/npm/docs/content/commands/npm-pkg.md | 45 +- deps/npm/docs/content/commands/npm-prefix.md | 11 +- deps/npm/docs/content/commands/npm-profile.md | 17 +- deps/npm/docs/content/commands/npm-prune.md | 98 +- deps/npm/docs/content/commands/npm-publish.md | 115 +- deps/npm/docs/content/commands/npm-query.md | 56 +- deps/npm/docs/content/commands/npm-rebuild.md | 78 +- deps/npm/docs/content/commands/npm-repo.md | 32 +- deps/npm/docs/content/commands/npm-restart.md | 12 +- deps/npm/docs/content/commands/npm-root.md | 11 +- deps/npm/docs/content/commands/npm-run.md | 71 +- deps/npm/docs/content/commands/npm-sbom.md | 49 +- deps/npm/docs/content/commands/npm-search.md | 34 +- deps/npm/docs/content/commands/npm-star.md | 18 +- deps/npm/docs/content/commands/npm-start.md | 12 +- deps/npm/docs/content/commands/npm-stop.md | 12 +- deps/npm/docs/content/commands/npm-team.md | 17 +- deps/npm/docs/content/commands/npm-test.md | 12 +- deps/npm/docs/content/commands/npm-token.md | 137 +- .../docs/content/commands/npm-undeprecate.md | 22 +- .../docs/content/commands/npm-uninstall.md | 52 +- .../docs/content/commands/npm-unpublish.md | 54 +- deps/npm/docs/content/commands/npm-unstar.md | 18 +- deps/npm/docs/content/commands/npm-update.md | 189 +- deps/npm/docs/content/commands/npm-version.md | 89 +- deps/npm/docs/content/commands/npm-view.md | 36 +- deps/npm/docs/content/commands/npm.md | 2 +- deps/npm/docs/content/using-npm/config.md | 932 ++++---- deps/npm/docs/output/commands/npm-access.html | 16 +- .../npm/docs/output/commands/npm-adduser.html | 8 +- deps/npm/docs/output/commands/npm-audit.html | 135 +- deps/npm/docs/output/commands/npm-bugs.html | 36 +- deps/npm/docs/output/commands/npm-cache.html | 4 +- deps/npm/docs/output/commands/npm-ci.html | 158 +- .../docs/output/commands/npm-completion.html | 4 +- deps/npm/docs/output/commands/npm-config.html | 34 +- deps/npm/docs/output/commands/npm-dedupe.html | 148 +- .../docs/output/commands/npm-deprecate.html | 25 +- deps/npm/docs/output/commands/npm-diff.html | 59 +- .../docs/output/commands/npm-dist-tag.html | 36 +- deps/npm/docs/output/commands/npm-docs.html | 36 +- deps/npm/docs/output/commands/npm-doctor.html | 4 +- deps/npm/docs/output/commands/npm-edit.html | 4 +- deps/npm/docs/output/commands/npm-exec.html | 41 +- .../npm/docs/output/commands/npm-explain.html | 20 +- .../npm/docs/output/commands/npm-explore.html | 8 +- .../docs/output/commands/npm-find-dupes.html | 135 +- deps/npm/docs/output/commands/npm-fund.html | 32 +- .../docs/output/commands/npm-help-search.html | 4 +- deps/npm/docs/output/commands/npm-help.html | 7 +- deps/npm/docs/output/commands/npm-init.html | 75 +- .../output/commands/npm-install-ci-test.html | 158 +- .../output/commands/npm-install-test.html | 221 +- .../npm/docs/output/commands/npm-install.html | 221 +- deps/npm/docs/output/commands/npm-link.html | 166 +- deps/npm/docs/output/commands/npm-login.html | 8 +- deps/npm/docs/output/commands/npm-logout.html | 4 +- deps/npm/docs/output/commands/npm-ls.html | 115 +- deps/npm/docs/output/commands/npm-org.html | 20 +- .../docs/output/commands/npm-outdated.html | 55 +- deps/npm/docs/output/commands/npm-owner.html | 37 +- deps/npm/docs/output/commands/npm-pack.html | 60 +- deps/npm/docs/output/commands/npm-ping.html | 4 +- deps/npm/docs/output/commands/npm-pkg.html | 49 +- deps/npm/docs/output/commands/npm-prefix.html | 15 +- .../npm/docs/output/commands/npm-profile.html | 20 +- deps/npm/docs/output/commands/npm-prune.html | 101 +- .../npm/docs/output/commands/npm-publish.html | 102 +- deps/npm/docs/output/commands/npm-query.html | 60 +- .../npm/docs/output/commands/npm-rebuild.html | 81 +- deps/npm/docs/output/commands/npm-repo.html | 36 +- .../npm/docs/output/commands/npm-restart.html | 14 +- deps/npm/docs/output/commands/npm-root.html | 15 +- deps/npm/docs/output/commands/npm-run.html | 73 +- deps/npm/docs/output/commands/npm-sbom.html | 53 +- deps/npm/docs/output/commands/npm-search.html | 38 +- .../docs/output/commands/npm-shrinkwrap.html | 4 +- deps/npm/docs/output/commands/npm-star.html | 21 +- deps/npm/docs/output/commands/npm-stars.html | 4 +- deps/npm/docs/output/commands/npm-start.html | 14 +- deps/npm/docs/output/commands/npm-stop.html | 14 +- deps/npm/docs/output/commands/npm-team.html | 20 +- deps/npm/docs/output/commands/npm-test.html | 14 +- deps/npm/docs/output/commands/npm-token.html | 109 +- .../docs/output/commands/npm-undeprecate.html | 25 +- .../docs/output/commands/npm-uninstall.html | 56 +- .../docs/output/commands/npm-unpublish.html | 58 +- deps/npm/docs/output/commands/npm-unstar.html | 21 +- deps/npm/docs/output/commands/npm-update.html | 191 +- .../npm/docs/output/commands/npm-version.html | 86 +- deps/npm/docs/output/commands/npm-view.html | 40 +- deps/npm/docs/output/commands/npm-whoami.html | 4 +- deps/npm/docs/output/commands/npm.html | 6 +- deps/npm/docs/output/commands/npx.html | 4 +- .../docs/output/configuring-npm/folders.html | 4 +- .../docs/output/configuring-npm/install.html | 4 +- .../output/configuring-npm/npm-global.html | 4 +- .../docs/output/configuring-npm/npm-json.html | 4 +- .../configuring-npm/npm-shrinkwrap-json.html | 4 +- .../docs/output/configuring-npm/npmrc.html | 4 +- .../output/configuring-npm/package-json.html | 4 +- .../configuring-npm/package-lock-json.html | 4 +- deps/npm/docs/output/using-npm/config.html | 891 ++++---- .../using-npm/dependency-selectors.html | 4 +- .../npm/docs/output/using-npm/developers.html | 4 +- deps/npm/docs/output/using-npm/logging.html | 4 +- deps/npm/docs/output/using-npm/orgs.html | 4 +- .../docs/output/using-npm/package-spec.html | 4 +- deps/npm/docs/output/using-npm/registry.html | 4 +- deps/npm/docs/output/using-npm/removal.html | 4 +- deps/npm/docs/output/using-npm/scope.html | 4 +- deps/npm/docs/output/using-npm/scripts.html | 4 +- .../npm/docs/output/using-npm/workspaces.html | 4 +- deps/npm/lib/commands/completion.js | 2 +- deps/npm/lib/commands/explain.js | 4 +- deps/npm/lib/commands/init.js | 2 +- deps/npm/lib/commands/token.js | 138 +- deps/npm/lib/commands/version.js | 2 + deps/npm/lib/utils/error-message.js | 2 +- deps/npm/man/man1/npm-access.1 | 5 +- deps/npm/man/man1/npm-adduser.1 | 2 +- deps/npm/man/man1/npm-audit.1 | 5 +- deps/npm/man/man1/npm-bugs.1 | 2 +- deps/npm/man/man1/npm-cache.1 | 2 +- deps/npm/man/man1/npm-ci.1 | 5 +- deps/npm/man/man1/npm-completion.1 | 2 +- deps/npm/man/man1/npm-config.1 | 2 +- deps/npm/man/man1/npm-dedupe.1 | 5 +- deps/npm/man/man1/npm-deprecate.1 | 5 +- deps/npm/man/man1/npm-diff.1 | 6 +- deps/npm/man/man1/npm-dist-tag.1 | 2 +- deps/npm/man/man1/npm-docs.1 | 2 +- deps/npm/man/man1/npm-doctor.1 | 2 +- deps/npm/man/man1/npm-edit.1 | 2 +- deps/npm/man/man1/npm-exec.1 | 2 +- deps/npm/man/man1/npm-explain.1 | 2 +- deps/npm/man/man1/npm-explore.1 | 2 +- deps/npm/man/man1/npm-find-dupes.1 | 5 +- deps/npm/man/man1/npm-fund.1 | 2 +- deps/npm/man/man1/npm-help-search.1 | 2 +- deps/npm/man/man1/npm-help.1 | 2 +- deps/npm/man/man1/npm-init.1 | 2 +- deps/npm/man/man1/npm-install-ci-test.1 | 5 +- deps/npm/man/man1/npm-install-test.1 | 5 +- deps/npm/man/man1/npm-install.1 | 5 +- deps/npm/man/man1/npm-link.1 | 5 +- deps/npm/man/man1/npm-login.1 | 2 +- deps/npm/man/man1/npm-logout.1 | 2 +- deps/npm/man/man1/npm-ls.1 | 4 +- deps/npm/man/man1/npm-org.1 | 5 +- deps/npm/man/man1/npm-outdated.1 | 2 +- deps/npm/man/man1/npm-owner.1 | 5 +- deps/npm/man/man1/npm-pack.1 | 5 +- deps/npm/man/man1/npm-ping.1 | 2 +- deps/npm/man/man1/npm-pkg.1 | 2 +- deps/npm/man/man1/npm-prefix.1 | 2 +- deps/npm/man/man1/npm-profile.1 | 5 +- deps/npm/man/man1/npm-prune.1 | 5 +- deps/npm/man/man1/npm-publish.1 | 45 +- deps/npm/man/man1/npm-query.1 | 2 +- deps/npm/man/man1/npm-rebuild.1 | 5 +- deps/npm/man/man1/npm-repo.1 | 2 +- deps/npm/man/man1/npm-restart.1 | 8 +- deps/npm/man/man1/npm-root.1 | 2 +- deps/npm/man/man1/npm-run.1 | 8 +- deps/npm/man/man1/npm-sbom.1 | 2 +- deps/npm/man/man1/npm-search.1 | 2 +- deps/npm/man/man1/npm-shrinkwrap.1 | 2 +- deps/npm/man/man1/npm-star.1 | 5 +- deps/npm/man/man1/npm-stars.1 | 2 +- deps/npm/man/man1/npm-start.1 | 8 +- deps/npm/man/man1/npm-stop.1 | 8 +- deps/npm/man/man1/npm-team.1 | 5 +- deps/npm/man/man1/npm-test.1 | 8 +- deps/npm/man/man1/npm-token.1 | 121 +- deps/npm/man/man1/npm-undeprecate.1 | 5 +- deps/npm/man/man1/npm-uninstall.1 | 2 +- deps/npm/man/man1/npm-unpublish.1 | 2 +- deps/npm/man/man1/npm-unstar.1 | 5 +- deps/npm/man/man1/npm-update.1 | 5 +- deps/npm/man/man1/npm-version.1 | 28 +- deps/npm/man/man1/npm-view.1 | 2 +- deps/npm/man/man1/npm-whoami.1 | 2 +- deps/npm/man/man1/npm.1 | 4 +- deps/npm/man/man1/npx.1 | 2 +- deps/npm/man/man5/folders.5 | 2 +- deps/npm/man/man5/install.5 | 2 +- deps/npm/man/man5/npm-global.5 | 2 +- deps/npm/man/man5/npm-json.5 | 2 +- deps/npm/man/man5/npm-shrinkwrap-json.5 | 2 +- deps/npm/man/man5/npmrc.5 | 2 +- deps/npm/man/man5/package-json.5 | 2 +- deps/npm/man/man5/package-lock-json.5 | 2 +- deps/npm/man/man7/config.7 | 131 +- deps/npm/man/man7/dependency-selectors.7 | 2 +- deps/npm/man/man7/developers.7 | 2 +- deps/npm/man/man7/logging.7 | 2 +- deps/npm/man/man7/orgs.7 | 2 +- deps/npm/man/man7/package-spec.7 | 2 +- deps/npm/man/man7/registry.7 | 2 +- deps/npm/man/man7/removal.7 | 2 +- deps/npm/man/man7/scope.7 | 2 +- deps/npm/man/man7/scripts.7 | 2 +- deps/npm/man/man7/workspaces.7 | 2 +- .../arborist/lib/arborist/build-ideal-tree.js | 66 +- .../@npmcli/arborist/lib/arborist/index.js | 30 + .../arborist/lib/arborist/isolated-reifier.js | 5 +- .../arborist/lib/arborist/load-actual.js | 13 - .../arborist/lib/arborist/load-virtual.js | 78 +- .../@npmcli/arborist/lib/arborist/rebuild.js | 31 +- .../@npmcli/arborist/lib/arborist/reify.js | 24 +- .../@npmcli/arborist/lib/calc-dep-flags.js | 214 +- .../node_modules/@npmcli/arborist/lib/edge.js | 12 +- .../node_modules/@npmcli/arborist/lib/node.js | 16 + .../@npmcli/arborist/lib/optional-set.js | 4 - .../@npmcli/arborist/lib/override-set.js | 78 +- .../@npmcli/arborist/lib/reset-dep-flags.js | 6 +- .../@npmcli/arborist/package.json | 20 +- .../config/lib/definitions/definitions.js | 110 + .../node_modules/@npmcli/config/package.json | 6 +- .../npm/node_modules/@npmcli/git/package.json | 10 +- .../installed-package-contents/package.json | 12 +- .../@npmcli/map-workspaces/package.json | 8 +- .../@npmcli/metavuln-calculator/package.json | 10 +- .../@npmcli/name-from-folder/package.json | 8 +- .../@npmcli/node-gyp/package.json | 8 +- .../@npmcli/package-json/lib/index.js | 2 +- .../@npmcli/package-json/package.json | 12 +- .../@npmcli/promise-spawn/lib/escape.js | 1 - .../@npmcli/promise-spawn/package.json | 12 +- .../node_modules/@npmcli/redact/package.json | 8 +- .../@npmcli/run-script/package.json | 18 +- .../npm/node_modules/@pkgjs/parseargs/LICENSE | 201 -- .../parseargs/examples/is-default-value.js | 25 - .../parseargs/examples/limit-long-syntax.js | 35 - .../@pkgjs/parseargs/examples/negate.js | 43 - .../parseargs/examples/no-repeated-options.js | 31 - .../parseargs/examples/ordered-options.mjs | 41 - .../parseargs/examples/simple-hard-coded.js | 26 - .../node_modules/@pkgjs/parseargs/index.js | 396 ---- .../@pkgjs/parseargs/internal/errors.js | 47 - .../@pkgjs/parseargs/internal/primordials.js | 393 ---- .../@pkgjs/parseargs/internal/util.js | 14 - .../@pkgjs/parseargs/internal/validators.js | 89 - .../@pkgjs/parseargs/package.json | 36 - .../node_modules/@pkgjs/parseargs/utils.js | 198 -- .../sign/node_modules/proc-log}/LICENSE | 2 +- .../sign/node_modules/proc-log/lib/index.js | 153 ++ .../sign/node_modules/proc-log/package.json | 46 + deps/npm/node_modules/abbrev/package.json | 26 +- deps/npm/node_modules/bin-links/package.json | 18 +- deps/npm/node_modules/cacache/package.json | 4 +- deps/npm/node_modules/cmd-shim/package.json | 8 +- .../exponential-backoff/package.json | 2 +- deps/npm/node_modules/ini/package.json | 8 +- .../init-package-json/package.json | 4 +- .../package.json | 8 +- deps/npm/node_modules/libnpmdiff/package.json | 4 +- .../node_modules/libnpmexec/lib/with-lock.js | 12 +- deps/npm/node_modules/libnpmexec/package.json | 8 +- deps/npm/node_modules/libnpmfund/package.json | 4 +- deps/npm/node_modules/libnpmpack/package.json | 4 +- .../node_modules/libnpmpublish/package.json | 6 +- .../node_modules/libnpmversion/package.json | 6 +- .../make-fetch-happen/package.json | 8 +- .../jackspeak => minimatch}/LICENSE.md | 0 .../minimatch/dist/commonjs/ast.js | 9 +- .../minimatch/dist/commonjs/escape.js | 12 +- .../minimatch/dist/commonjs/index.js | 21 +- .../minimatch/dist/commonjs/unescape.js | 30 +- .../node_modules/minimatch/dist/esm/ast.js | 9 +- .../node_modules/minimatch/dist/esm/escape.js | 12 +- .../node_modules/minimatch/dist/esm/index.js | 21 +- .../minimatch/dist/esm/unescape.js | 30 +- deps/npm/node_modules/minimatch/package.json | 13 +- .../node_modules/minipass-fetch/package.json | 8 +- .../node-gyp/.release-please-manifest.json | 2 +- deps/npm/node_modules/node-gyp/CHANGELOG.md | 57 + .../gyp/.release-please-manifest.json | 2 +- .../node-gyp/gyp/pylib/gyp/MSVSVersion.py | 27 +- .../gyp/pylib/gyp/generator/android.py | 2 +- .../gyp/generator/compile_commands_json.py | 2 +- .../node-gyp/gyp/pylib/gyp/generator/gypd.py | 2 +- .../node-gyp/gyp/pylib/gyp/generator/make.py | 2 +- .../node-gyp/gyp/pylib/gyp/generator/msvs.py | 6 +- .../node-gyp/gyp/pylib/gyp/generator/xcode.py | 8 +- .../node-gyp/gyp/pylib/gyp/input.py | 2 +- .../node-gyp/gyp/pylib/gyp/xcode_emulation.py | 8 +- .../node-gyp/gyp/pylib/gyp/xcode_ninja.py | 2 +- .../node-gyp/gyp/pylib/gyp/xcodeproj_file.py | 10 +- .../node_modules/node-gyp/gyp/pyproject.toml | 2 +- .../node-gyp/lib/find-visualstudio.js | 12 +- .../node_modules/@npmcli/agent/lib/agents.js | 206 -- .../node_modules/@npmcli/agent/lib/dns.js | 53 - .../node_modules/@npmcli/agent/lib/errors.js | 61 - .../node_modules/@npmcli/agent/lib/index.js | 56 - .../node_modules/@npmcli/agent/lib/options.js | 86 - .../node_modules/@npmcli/agent/lib/proxy.js | 88 - .../node-gyp/node_modules/cacache/LICENSE.md | 16 - .../node_modules/cacache/lib/content/path.js | 29 - .../node_modules/cacache/lib/content/read.js | 165 -- .../node_modules/cacache/lib/content/rm.js | 18 - .../node_modules/cacache/lib/content/write.js | 206 -- .../node_modules/cacache/lib/entry-index.js | 336 --- .../node-gyp/node_modules/cacache/lib/get.js | 170 -- .../node_modules/cacache/lib/index.js | 42 - .../node_modules/cacache/lib/memoization.js | 72 - .../node-gyp/node_modules/cacache/lib/put.js | 80 - .../node-gyp/node_modules/cacache/lib/rm.js | 31 - .../node_modules/cacache/lib/util/glob.js | 7 - .../cacache/lib/util/hash-to-segments.js | 7 - .../node_modules/cacache/lib/util/tmp.js | 26 - .../node_modules/cacache/lib/verify.js | 258 --- .../node_modules/cacache/package.json | 83 - .../node-gyp/node_modules/glob/README.md | 1265 ----------- .../node_modules/glob/dist/commonjs/glob.d.ts | 388 ---- .../glob/dist/commonjs/glob.d.ts.map | 1 - .../node_modules/glob/dist/commonjs/glob.js | 247 -- .../glob/dist/commonjs/glob.js.map | 1 - .../glob/dist/commonjs/has-magic.d.ts | 14 - .../glob/dist/commonjs/has-magic.d.ts.map | 1 - .../glob/dist/commonjs/has-magic.js | 27 - .../glob/dist/commonjs/has-magic.js.map | 1 - .../glob/dist/commonjs/ignore.d.ts | 24 - .../glob/dist/commonjs/ignore.d.ts.map | 1 - .../node_modules/glob/dist/commonjs/ignore.js | 119 - .../glob/dist/commonjs/ignore.js.map | 1 - .../glob/dist/commonjs/index.d.ts | 97 - .../glob/dist/commonjs/index.d.ts.map | 1 - .../node_modules/glob/dist/commonjs/index.js | 68 - .../glob/dist/commonjs/index.js.map | 1 - .../glob/dist/commonjs/package.json | 3 - .../glob/dist/commonjs/pattern.d.ts | 76 - .../glob/dist/commonjs/pattern.d.ts.map | 1 - .../glob/dist/commonjs/pattern.js | 219 -- .../glob/dist/commonjs/pattern.js.map | 1 - .../glob/dist/commonjs/processor.d.ts | 59 - .../glob/dist/commonjs/processor.d.ts.map | 1 - .../glob/dist/commonjs/processor.js | 301 --- .../glob/dist/commonjs/processor.js.map | 1 - .../glob/dist/commonjs/walker.d.ts | 97 - .../glob/dist/commonjs/walker.d.ts.map | 1 - .../node_modules/glob/dist/commonjs/walker.js | 387 ---- .../glob/dist/commonjs/walker.js.map | 1 - .../node_modules/glob/dist/esm/bin.d.mts | 3 - .../node_modules/glob/dist/esm/bin.d.mts.map | 1 - .../node_modules/glob/dist/esm/bin.mjs | 270 --- .../node_modules/glob/dist/esm/bin.mjs.map | 1 - .../node_modules/glob/dist/esm/glob.d.ts | 388 ---- .../node_modules/glob/dist/esm/glob.d.ts.map | 1 - .../node_modules/glob/dist/esm/glob.js | 243 -- .../node_modules/glob/dist/esm/glob.js.map | 1 - .../node_modules/glob/dist/esm/has-magic.d.ts | 14 - .../glob/dist/esm/has-magic.d.ts.map | 1 - .../node_modules/glob/dist/esm/has-magic.js | 23 - .../glob/dist/esm/has-magic.js.map | 1 - .../node_modules/glob/dist/esm/ignore.d.ts | 24 - .../glob/dist/esm/ignore.d.ts.map | 1 - .../node_modules/glob/dist/esm/ignore.js | 115 - .../node_modules/glob/dist/esm/ignore.js.map | 1 - .../node_modules/glob/dist/esm/index.d.ts | 97 - .../node_modules/glob/dist/esm/index.d.ts.map | 1 - .../node_modules/glob/dist/esm/index.js | 55 - .../node_modules/glob/dist/esm/index.js.map | 1 - .../node_modules/glob/dist/esm/package.json | 3 - .../node_modules/glob/dist/esm/pattern.d.ts | 76 - .../glob/dist/esm/pattern.d.ts.map | 1 - .../node_modules/glob/dist/esm/pattern.js | 215 -- .../node_modules/glob/dist/esm/pattern.js.map | 1 - .../node_modules/glob/dist/esm/processor.d.ts | 59 - .../glob/dist/esm/processor.d.ts.map | 1 - .../node_modules/glob/dist/esm/processor.js | 294 --- .../glob/dist/esm/processor.js.map | 1 - .../node_modules/glob/dist/esm/walker.d.ts | 97 - .../glob/dist/esm/walker.d.ts.map | 1 - .../node_modules/glob/dist/esm/walker.js | 381 ---- .../node_modules/glob/dist/esm/walker.js.map | 1 - .../node-gyp/node_modules/glob/package.json | 99 - .../jackspeak/dist/commonjs/index.js | 1010 --------- .../jackspeak/dist/commonjs/package.json | 3 - .../jackspeak/dist/commonjs/parse-args.js | 50 - .../node_modules/jackspeak/dist/esm/index.js | 1000 -------- .../jackspeak/dist/esm/package.json | 3 - .../jackspeak/dist/esm/parse-args.js | 26 - .../node_modules/jackspeak/package.json | 95 - .../lru-cache/dist/commonjs/index.js | 1546 ------------- .../lru-cache/dist/commonjs/index.min.js | 2 - .../lru-cache/dist/commonjs/package.json | 3 - .../node_modules/lru-cache/dist/esm/index.js | 1542 ------------- .../lru-cache/dist/esm/index.min.js | 2 - .../lru-cache/dist/esm/package.json | 3 - .../node_modules/lru-cache/package.json | 116 - .../node_modules/make-fetch-happen/LICENSE | 16 - .../make-fetch-happen/lib/cache/entry.js | 471 ---- .../make-fetch-happen/lib/cache/errors.js | 11 - .../make-fetch-happen/lib/cache/index.js | 49 - .../make-fetch-happen/lib/cache/key.js | 17 - .../make-fetch-happen/lib/cache/policy.js | 161 -- .../make-fetch-happen/lib/fetch.js | 118 - .../make-fetch-happen/lib/index.js | 41 - .../make-fetch-happen/lib/options.js | 59 - .../make-fetch-happen/lib/pipeline.js | 41 - .../make-fetch-happen/lib/remote.js | 132 -- .../make-fetch-happen/package.json | 74 - .../dist/commonjs/assert-valid-pattern.js | 14 - .../minimatch/dist/commonjs/ast.js | 592 ----- .../dist/commonjs/brace-expressions.js | 152 -- .../minimatch/dist/commonjs/escape.js | 22 - .../minimatch/dist/commonjs/index.js | 1017 --------- .../minimatch/dist/commonjs/package.json | 3 - .../minimatch/dist/commonjs/unescape.js | 24 - .../dist/esm/assert-valid-pattern.js | 10 - .../node_modules/minimatch/dist/esm/ast.js | 588 ----- .../minimatch/dist/esm/brace-expressions.js | 148 -- .../node_modules/minimatch/dist/esm/escape.js | 18 - .../node_modules/minimatch/dist/esm/index.js | 1001 -------- .../minimatch/dist/esm/package.json | 3 - .../minimatch/dist/esm/unescape.js | 20 - .../node_modules/minimatch/package.json | 82 - .../path-scurry/dist/commonjs/index.js | 2014 ----------------- .../path-scurry/dist/commonjs/package.json | 3 - .../path-scurry/dist/esm/index.js | 1979 ---------------- .../path-scurry/dist/esm/package.json | 3 - .../node_modules/path-scurry/package.json | 89 - deps/npm/node_modules/node-gyp/package.json | 26 +- deps/npm/node_modules/nopt/package.json | 10 +- .../npm/node_modules/npm-bundled/package.json | 10 +- .../npm-install-checks/package.json | 8 +- .../npm-normalize-package-bin/package.json | 8 +- .../node_modules/npm-package-arg/lib/npa.js | 2 - .../node_modules/npm-package-arg/package.json | 13 +- .../node_modules/npm-packlist/package.json | 8 +- .../npm-pick-manifest/package.json | 12 +- .../npm/node_modules/npm-profile/package.json | 8 +- .../npm-registry-fetch/lib/index.js | 1 + .../npm-registry-fetch/package.json | 16 +- deps/npm/node_modules/pacote/package.json | 16 +- .../parse-conflict-json/package.json | 10 +- deps/npm/node_modules/proc-log/package.json | 8 +- .../node_modules/read-cmd-shim/package.json | 8 +- deps/npm/node_modules/ssri/lib/index.js | 2 +- deps/npm/node_modules/ssri/package.json | 8 +- .../path-scurry => tar}/LICENSE.md | 0 .../node_modules/tar/dist/commonjs/header.js | 33 +- .../node_modules/tar/dist/commonjs/list.js | 6 +- .../node_modules/tar/dist/commonjs/pack.js | 5 +- .../node_modules/tar/dist/commonjs/parse.js | 6 +- deps/npm/node_modules/tar/dist/esm/header.js | 33 +- deps/npm/node_modules/tar/dist/esm/list.js | 6 +- deps/npm/node_modules/tar/dist/esm/pack.js | 5 +- deps/npm/node_modules/tar/dist/esm/parse.js | 6 +- deps/npm/node_modules/tar/package.json | 4 +- .../validate-npm-package-name/package.json | 8 +- deps/npm/node_modules/which/package.json | 8 +- .../write-file-atomic/package.json | 8 +- deps/npm/package.json | 76 +- .../test/lib/commands/config.js.test.cjs | 21 + .../test/lib/commands/ls.js.test.cjs | 6 +- .../tap-snapshots/test/lib/docs.js.test.cjs | 180 +- .../test/lib/utils/error-message.js.test.cjs | 4 +- deps/npm/test/lib/commands/token.js | 231 +- deps/npm/test/lib/utils/tar.js | 6 +- .../arborist/node_modules/nopt}/LICENSE | 0 .../arborist/node_modules/nopt/README.md | 214 ++ .../arborist/node_modules/nopt/bin/nopt.js | 29 + .../arborist/node_modules/nopt/lib/debug.js | 5 + .../node_modules/nopt/lib/nopt-lib.js | 514 +++++ .../arborist/node_modules/nopt/lib/nopt.js | 34 + .../node_modules/nopt/lib/type-defs.js | 91 + .../nopt/node_modules/abbrev/LICENSE | 46 + .../nopt/node_modules/abbrev/README.md | 23 + .../nopt/node_modules/abbrev/lib/index.js | 53 + .../nopt/node_modules/abbrev/package.json | 45 + .../arborist/node_modules/nopt/package.json | 52 + .../config/node_modules/nopt}/LICENSE | 2 +- .../config/node_modules/nopt/README.md | 214 ++ .../config/node_modules/nopt/bin/nopt.js | 29 + .../config/node_modules/nopt/lib/debug.js | 5 + .../config/node_modules/nopt/lib/nopt-lib.js | 514 +++++ .../config/node_modules/nopt/lib/nopt.js | 34 + .../config/node_modules/nopt/lib/type-defs.js | 91 + .../nopt/node_modules/abbrev/LICENSE | 46 + .../nopt/node_modules/abbrev/README.md | 23 + .../nopt/node_modules/abbrev/lib/index.js | 53 + .../nopt/node_modules/abbrev/package.json | 45 + .../config/node_modules/nopt/package.json | 52 + .../installed-package-contents}/LICENSE | 2 +- .../installed-package-contents/README.md | 109 + .../installed-package-contents/bin/index.js | 44 + .../installed-package-contents/lib/index.js | 181 ++ .../installed-package-contents}/package.json | 52 +- .../node_modules/npm-bundled}/LICENSE | 2 +- .../node_modules/npm-bundled/README.md | 48 + .../node_modules/npm-bundled/lib/index.js | 254 +++ .../node_modules/npm-bundled/package.json | 49 + .../npm-normalize-package-bin/LICENSE | 15 + .../npm-normalize-package-bin/README.md | 14 + .../npm-normalize-package-bin/lib/index.js | 64 + .../npm-normalize-package-bin/package.json | 45 + 527 files changed, 9440 insertions(+), 29229 deletions(-) delete mode 100644 deps/npm/node_modules/@pkgjs/parseargs/LICENSE delete mode 100644 deps/npm/node_modules/@pkgjs/parseargs/examples/is-default-value.js delete mode 100644 deps/npm/node_modules/@pkgjs/parseargs/examples/limit-long-syntax.js delete mode 100644 deps/npm/node_modules/@pkgjs/parseargs/examples/negate.js delete mode 100644 deps/npm/node_modules/@pkgjs/parseargs/examples/no-repeated-options.js delete mode 100644 deps/npm/node_modules/@pkgjs/parseargs/examples/ordered-options.mjs delete mode 100644 deps/npm/node_modules/@pkgjs/parseargs/examples/simple-hard-coded.js delete mode 100644 deps/npm/node_modules/@pkgjs/parseargs/index.js delete mode 100644 deps/npm/node_modules/@pkgjs/parseargs/internal/errors.js delete mode 100644 deps/npm/node_modules/@pkgjs/parseargs/internal/primordials.js delete mode 100644 deps/npm/node_modules/@pkgjs/parseargs/internal/util.js delete mode 100644 deps/npm/node_modules/@pkgjs/parseargs/internal/validators.js delete mode 100644 deps/npm/node_modules/@pkgjs/parseargs/package.json delete mode 100644 deps/npm/node_modules/@pkgjs/parseargs/utils.js rename deps/npm/node_modules/{minimatch => @sigstore/sign/node_modules/proc-log}/LICENSE (92%) create mode 100644 deps/npm/node_modules/@sigstore/sign/node_modules/proc-log/lib/index.js create mode 100644 deps/npm/node_modules/@sigstore/sign/node_modules/proc-log/package.json rename deps/npm/node_modules/{node-gyp/node_modules/jackspeak => minimatch}/LICENSE.md (100%) delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/agents.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/dns.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/errors.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/index.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/options.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/proxy.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/cacache/LICENSE.md delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/path.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/read.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/rm.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/write.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/cacache/lib/entry-index.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/cacache/lib/get.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/cacache/lib/index.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/cacache/lib/memoization.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/cacache/lib/put.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/cacache/lib/rm.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/cacache/lib/util/glob.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/cacache/lib/util/hash-to-segments.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/cacache/lib/util/tmp.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/cacache/lib/verify.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/cacache/package.json delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/README.md delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/glob.d.ts delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/glob.d.ts.map delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/glob.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/glob.js.map delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/has-magic.d.ts delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/has-magic.d.ts.map delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/has-magic.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/has-magic.js.map delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/ignore.d.ts delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/ignore.d.ts.map delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/ignore.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/ignore.js.map delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/index.d.ts delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/index.d.ts.map delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/index.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/index.js.map delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/package.json delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/pattern.d.ts delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/pattern.d.ts.map delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/pattern.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/pattern.js.map delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/processor.d.ts delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/processor.d.ts.map delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/processor.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/processor.js.map delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/walker.d.ts delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/walker.d.ts.map delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/walker.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/walker.js.map delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/bin.d.mts delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/bin.d.mts.map delete mode 100755 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/bin.mjs delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/bin.mjs.map delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/glob.d.ts delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/glob.d.ts.map delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/glob.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/glob.js.map delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/has-magic.d.ts delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/has-magic.d.ts.map delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/has-magic.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/has-magic.js.map delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/ignore.d.ts delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/ignore.d.ts.map delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/ignore.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/ignore.js.map delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/index.d.ts delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/index.d.ts.map delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/index.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/index.js.map delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/package.json delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/pattern.d.ts delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/pattern.d.ts.map delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/pattern.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/pattern.js.map delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/processor.d.ts delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/processor.d.ts.map delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/processor.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/processor.js.map delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/walker.d.ts delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/walker.d.ts.map delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/walker.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/walker.js.map delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/glob/package.json delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/jackspeak/dist/commonjs/index.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/jackspeak/dist/commonjs/package.json delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/jackspeak/dist/commonjs/parse-args.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/jackspeak/dist/esm/index.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/jackspeak/dist/esm/package.json delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/jackspeak/dist/esm/parse-args.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/jackspeak/package.json delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/lru-cache/dist/commonjs/index.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/lru-cache/dist/commonjs/index.min.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/lru-cache/dist/commonjs/package.json delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/lru-cache/dist/esm/index.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/lru-cache/dist/esm/index.min.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/lru-cache/dist/esm/package.json delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/lru-cache/package.json delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/LICENSE delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/entry.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/errors.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/index.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/key.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/policy.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/fetch.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/index.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/options.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/pipeline.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/remote.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/package.json delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/commonjs/ast.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/commonjs/brace-expressions.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/commonjs/escape.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/commonjs/index.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/commonjs/package.json delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/commonjs/unescape.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/esm/assert-valid-pattern.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/esm/ast.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/esm/brace-expressions.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/esm/escape.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/esm/index.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/esm/package.json delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/esm/unescape.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/minimatch/package.json delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/path-scurry/dist/commonjs/index.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/path-scurry/dist/commonjs/package.json delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/path-scurry/dist/esm/index.js delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/path-scurry/dist/esm/package.json delete mode 100644 deps/npm/node_modules/node-gyp/node_modules/path-scurry/package.json rename deps/npm/node_modules/{node-gyp/node_modules/path-scurry => tar}/LICENSE.md (100%) rename deps/npm/{node_modules/tar => workspaces/arborist/node_modules/nopt}/LICENSE (100%) create mode 100644 deps/npm/workspaces/arborist/node_modules/nopt/README.md create mode 100755 deps/npm/workspaces/arborist/node_modules/nopt/bin/nopt.js create mode 100644 deps/npm/workspaces/arborist/node_modules/nopt/lib/debug.js create mode 100644 deps/npm/workspaces/arborist/node_modules/nopt/lib/nopt-lib.js create mode 100644 deps/npm/workspaces/arborist/node_modules/nopt/lib/nopt.js create mode 100644 deps/npm/workspaces/arborist/node_modules/nopt/lib/type-defs.js create mode 100644 deps/npm/workspaces/arborist/node_modules/nopt/node_modules/abbrev/LICENSE create mode 100644 deps/npm/workspaces/arborist/node_modules/nopt/node_modules/abbrev/README.md create mode 100644 deps/npm/workspaces/arborist/node_modules/nopt/node_modules/abbrev/lib/index.js create mode 100644 deps/npm/workspaces/arborist/node_modules/nopt/node_modules/abbrev/package.json create mode 100644 deps/npm/workspaces/arborist/node_modules/nopt/package.json rename deps/npm/{node_modules/node-gyp/node_modules/glob => workspaces/config/node_modules/nopt}/LICENSE (92%) create mode 100644 deps/npm/workspaces/config/node_modules/nopt/README.md create mode 100755 deps/npm/workspaces/config/node_modules/nopt/bin/nopt.js create mode 100644 deps/npm/workspaces/config/node_modules/nopt/lib/debug.js create mode 100644 deps/npm/workspaces/config/node_modules/nopt/lib/nopt-lib.js create mode 100644 deps/npm/workspaces/config/node_modules/nopt/lib/nopt.js create mode 100644 deps/npm/workspaces/config/node_modules/nopt/lib/type-defs.js create mode 100644 deps/npm/workspaces/config/node_modules/nopt/node_modules/abbrev/LICENSE create mode 100644 deps/npm/workspaces/config/node_modules/nopt/node_modules/abbrev/README.md create mode 100644 deps/npm/workspaces/config/node_modules/nopt/node_modules/abbrev/lib/index.js create mode 100644 deps/npm/workspaces/config/node_modules/nopt/node_modules/abbrev/package.json create mode 100644 deps/npm/workspaces/config/node_modules/nopt/package.json rename deps/npm/{node_modules/node-gyp/node_modules/lru-cache => workspaces/libnpmdiff/node_modules/@npmcli/installed-package-contents}/LICENSE (92%) create mode 100644 deps/npm/workspaces/libnpmdiff/node_modules/@npmcli/installed-package-contents/README.md create mode 100755 deps/npm/workspaces/libnpmdiff/node_modules/@npmcli/installed-package-contents/bin/index.js create mode 100644 deps/npm/workspaces/libnpmdiff/node_modules/@npmcli/installed-package-contents/lib/index.js rename deps/npm/{node_modules/node-gyp/node_modules/@npmcli/agent => workspaces/libnpmdiff/node_modules/@npmcli/installed-package-contents}/package.json (58%) rename deps/npm/{node_modules/node-gyp/node_modules/minimatch => workspaces/libnpmdiff/node_modules/npm-bundled}/LICENSE (92%) create mode 100644 deps/npm/workspaces/libnpmdiff/node_modules/npm-bundled/README.md create mode 100644 deps/npm/workspaces/libnpmdiff/node_modules/npm-bundled/lib/index.js create mode 100644 deps/npm/workspaces/libnpmdiff/node_modules/npm-bundled/package.json create mode 100644 deps/npm/workspaces/libnpmdiff/node_modules/npm-normalize-package-bin/LICENSE create mode 100644 deps/npm/workspaces/libnpmdiff/node_modules/npm-normalize-package-bin/README.md create mode 100644 deps/npm/workspaces/libnpmdiff/node_modules/npm-normalize-package-bin/lib/index.js create mode 100644 deps/npm/workspaces/libnpmdiff/node_modules/npm-normalize-package-bin/package.json diff --git a/deps/npm/docs/content/commands/npm-access.md b/deps/npm/docs/content/commands/npm-access.md index 1c6e168f230138..2752703b64cd0c 100644 --- a/deps/npm/docs/content/commands/npm-access.md +++ b/deps/npm/docs/content/commands/npm-access.md @@ -57,8 +57,8 @@ Management of teams and team memberships is done with the `npm team` command. Whether or not to output JSON data, rather than the normal output. -* In `npm pkg set` it enables parsing set values with JSON.parse() - before saving them to your `package.json`. +* In `npm pkg set` it enables parsing set values with JSON.parse() before + saving them to your `package.json`. Not supported by all npm commands. @@ -69,12 +69,11 @@ Not supported by all npm commands. * Default: null * Type: null or String -This is a one-time password from a two-factor authenticator. It's -needed when publishing or changing package permissions with `npm -access`. +This is a one-time password from a two-factor authenticator. It's needed +when publishing or changing package permissions with `npm access`. -If not set, and a registry response fails with a challenge for a -one-time password, npm will prompt on the command line for one. +If not set, and a registry response fails with a challenge for a one-time +password, npm will prompt on the command line for one. diff --git a/deps/npm/docs/content/commands/npm-adduser.md b/deps/npm/docs/content/commands/npm-adduser.md index 78edb5d5702d7b..be2685d7853c4d 100644 --- a/deps/npm/docs/content/commands/npm-adduser.md +++ b/deps/npm/docs/content/commands/npm-adduser.md @@ -71,8 +71,8 @@ npm init --scope=@foo --yes * Default: "web" * Type: "legacy" or "web" -What authentication strategy to use with `login`. Note that if an -`otp` config is given, this value will always be set to `legacy`. +What authentication strategy to use with `login`. Note that if an `otp` +config is given, this value will always be set to `legacy`. diff --git a/deps/npm/docs/content/commands/npm-audit.md b/deps/npm/docs/content/commands/npm-audit.md index f38f933bee7962..f7d4e06718c96f 100644 --- a/deps/npm/docs/content/commands/npm-audit.md +++ b/deps/npm/docs/content/commands/npm-audit.md @@ -206,8 +206,8 @@ $ npm audit --audit-level=moderate * Default: null * Type: null, "info", "low", "moderate", "high", "critical", or "none" -The minimum level of vulnerability for `npm audit` to exit with a -non-zero exit code. +The minimum level of vulnerability for `npm audit` to exit with a non-zero +exit code. @@ -216,14 +216,13 @@ non-zero exit code. * Default: false * Type: Boolean -Indicates that you don't want npm to make any changes and that it -should only report what it would have done. This can be passed into -any of the commands that modify your local installation, eg, -`install`, `update`, `dedupe`, `uninstall`, as well as `pack` and -`publish`. +Indicates that you don't want npm to make any changes and that it should +only report what it would have done. This can be passed into any of the +commands that modify your local installation, eg, `install`, `update`, +`dedupe`, `uninstall`, as well as `pack` and `publish`. -Note: This is NOT honored by other network related commands, eg -`dist-tags`, `owner`, etc. +Note: This is NOT honored by other network related commands, eg `dist-tags`, +`owner`, etc. @@ -238,16 +237,14 @@ mistakes, unnecessary performance degradation, and malicious input. * Allow clobbering non-npm files in global installs. * Allow the `npm version` command to work on an unclean git repository. * Allow deleting the cache folder with `npm cache clean`. -* Allow installing packages that have an `engines` declaration - requiring a different version of npm. -* Allow installing packages that have an `engines` declaration - requiring a different version of `node`, even if `--engine-strict` is - enabled. -* Allow `npm audit fix` to install modules outside your stated - dependency range (including SemVer-major changes). +* Allow installing packages that have an `engines` declaration requiring a + different version of npm. +* Allow installing packages that have an `engines` declaration requiring a + different version of `node`, even if `--engine-strict` is enabled. +* Allow `npm audit fix` to install modules outside your stated dependency + range (including SemVer-major changes). * Allow unpublishing all versions of a published package. -* Allow conflicting peerDependencies to be installed in the root - project. +* Allow conflicting peerDependencies to be installed in the root project. * Implicitly set `--yes` during `npm init`. * Allow clobbering existing values in `npm pkg` * Allow unpublishing of entire packages (not just a single version). @@ -264,8 +261,8 @@ recommended that you do not use this option! Whether or not to output JSON data, rather than the normal output. -* In `npm pkg set` it enables parsing set values with JSON.parse() - before saving them to your `package.json`. +* In `npm pkg set` it enables parsing set values with JSON.parse() before + saving them to your `package.json`. Not supported by all npm commands. @@ -276,15 +273,14 @@ Not supported by all npm commands. * Default: false * Type: Boolean -If set to true, the current operation will only use the -`package-lock.json`, ignoring `node_modules`. +If set to true, the current operation will only use the `package-lock.json`, +ignoring `node_modules`. For `update` this means only the `package-lock.json` will be updated, instead of checking `node_modules` and downloading dependencies. -For `list` this means the output will be based on the tree described -by the `package-lock.json`, rather than the contents of -`node_modules`. +For `list` this means the output will be based on the tree described by the +`package-lock.json`, rather than the contents of `node_modules`. @@ -293,9 +289,8 @@ by the `package-lock.json`, rather than the contents of * Default: true * Type: Boolean -If set to false, then ignore `package-lock.json` files when -installing. This will also prevent _writing_ `package-lock.json` if -`save` is true. +If set to false, then ignore `package-lock.json` files when installing. This +will also prevent _writing_ `package-lock.json` if `save` is true. @@ -311,45 +306,40 @@ Note that these dependencies _are_ still resolved and added to the `package-lock.json` or `npm-shrinkwrap.json` file. They are just not physically installed on disk. -If a package type appears in both the `--include` and `--omit` lists, -then it will be included. +If a package type appears in both the `--include` and `--omit` lists, then +it will be included. -If the resulting omit list includes `'dev'`, then the `NODE_ENV` -environment variable will be set to `'production'` for all lifecycle -scripts. +If the resulting omit list includes `'dev'`, then the `NODE_ENV` environment +variable will be set to `'production'` for all lifecycle scripts. #### `include` * Default: -* Type: "prod", "dev", "optional", or "peer" (can be set multiple - times) +* Type: "prod", "dev", "optional", or "peer" (can be set multiple times) -Option that allows for defining which types of dependencies to -install. +Option that allows for defining which types of dependencies to install. This is the inverse of `--omit=`. -Dependency types specified in `--include` will not be omitted, -regardless of the order in which omit/include are specified on the -command-line. +Dependency types specified in `--include` will not be omitted, regardless of +the order in which omit/include are specified on the command-line. #### `foreground-scripts` -* Default: `false` unless when using `npm pack` or `npm publish` where - it defaults to `true` +* Default: `false` unless when using `npm pack` or `npm publish` where it + defaults to `true` * Type: Boolean -Run all build scripts (ie, `preinstall`, `install`, and -`postinstall`) scripts for installed packages in the foreground -process, sharing standard input, output, and error with the main npm -process. +Run all build scripts (ie, `preinstall`, `install`, and `postinstall`) +scripts for installed packages in the foreground process, sharing standard +input, output, and error with the main npm process. -Note that this will generally make installs run slower, and be much -noisier, but can be useful for debugging. +Note that this will generally make installs run slower, and be much noisier, +but can be useful for debugging. @@ -360,10 +350,10 @@ noisier, but can be useful for debugging. If true, npm does not run scripts specified in package.json files. -Note that commands explicitly intended to run a particular script, -such as `npm start`, `npm stop`, `npm restart`, `npm test`, and `npm -run` will still run their intended script if `ignore-scripts` is set, -but they will *not* run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as +`npm start`, `npm stop`, `npm restart`, `npm test`, and `npm run` will still +run their intended script if `ignore-scripts` is set, but they will *not* +run any pre- or post-scripts. @@ -372,9 +362,9 @@ but they will *not* run any pre- or post-scripts. * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -383,9 +373,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -397,14 +387,13 @@ This value is not exported to the environment for child processes. Set to true to run the command in the context of **all** configured workspaces. -Explicitly setting this to false will cause commands like `install` -to ignore workspaces altogether. When not set explicitly: +Explicitly setting this to false will cause commands like `install` to +ignore workspaces altogether. When not set explicitly: -- Commands that operate on the `node_modules` tree (install, update, -etc.) will link workspaces into the `node_modules` folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, _unless_ one or more workspaces are specified in the -`workspace` config. +- Commands that operate on the `node_modules` tree (install, update, etc.) +will link workspaces into the `node_modules` folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +_unless_ one or more workspaces are specified in the `workspace` config. This value is not exported to the environment for child processes. @@ -415,10 +404,9 @@ This value is not exported to the environment for child processes. Include the workspace root when workspaces are enabled for a command. -When false, specifying individual workspaces via the `workspace` -config, or all workspaces via the `workspaces` flag, will cause npm -to operate only on the specified workspaces, and not on the root -project. +When false, specifying individual workspaces via the `workspace` config, or +all workspaces via the `workspaces` flag, will cause npm to operate only on +the specified workspaces, and not on the root project. This value is not exported to the environment for child processes. @@ -427,9 +415,9 @@ This value is not exported to the environment for child processes. * Default: false * Type: Boolean -When set file: protocol dependencies will be packed and installed as -regular dependencies instead of creating a symlink. This option has -no effect on workspaces. +When set file: protocol dependencies will be packed and installed as regular +dependencies instead of creating a symlink. This option has no effect on +workspaces. diff --git a/deps/npm/docs/content/commands/npm-bugs.md b/deps/npm/docs/content/commands/npm-bugs.md index 8789f21aa0143d..0531b49083ea38 100644 --- a/deps/npm/docs/content/commands/npm-bugs.md +++ b/deps/npm/docs/content/commands/npm-bugs.md @@ -47,9 +47,9 @@ The base URL of the npm registry. * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -58,9 +58,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -72,14 +72,13 @@ This value is not exported to the environment for child processes. Set to true to run the command in the context of **all** configured workspaces. -Explicitly setting this to false will cause commands like `install` -to ignore workspaces altogether. When not set explicitly: +Explicitly setting this to false will cause commands like `install` to +ignore workspaces altogether. When not set explicitly: -- Commands that operate on the `node_modules` tree (install, update, -etc.) will link workspaces into the `node_modules` folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, _unless_ one or more workspaces are specified in the -`workspace` config. +- Commands that operate on the `node_modules` tree (install, update, etc.) +will link workspaces into the `node_modules` folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +_unless_ one or more workspaces are specified in the `workspace` config. This value is not exported to the environment for child processes. @@ -90,10 +89,9 @@ This value is not exported to the environment for child processes. Include the workspace root when workspaces are enabled for a command. -When false, specifying individual workspaces via the `workspace` -config, or all workspaces via the `workspaces` flag, will cause npm -to operate only on the specified workspaces, and not on the root -project. +When false, specifying individual workspaces via the `workspace` config, or +all workspaces via the `workspaces` flag, will cause npm to operate only on +the specified workspaces, and not on the root project. This value is not exported to the environment for child processes. diff --git a/deps/npm/docs/content/commands/npm-ci.md b/deps/npm/docs/content/commands/npm-ci.md index 115ea4a1b2a762..c76d7cf210d3ab 100644 --- a/deps/npm/docs/content/commands/npm-ci.md +++ b/deps/npm/docs/content/commands/npm-ci.md @@ -71,12 +71,11 @@ cache: * Type: "hoisted", "nested", "shallow", or "linked" Sets the strategy for installing packages in node_modules. hoisted -(default): Install non-duplicated in top-level, and duplicated as -necessary within directory structure. nested: (formerly ---legacy-bundling) install in place, no hoisting. shallow (formerly ---global-style) only install direct deps at top-level. linked: -(experimental) install in node_modules/.store, link in place, -unhoisted. +(default): Install non-duplicated in top-level, and duplicated as necessary +within directory structure. nested: (formerly --legacy-bundling) install in +place, no hoisting. shallow (formerly --global-style) only install direct +deps at top-level. linked: (experimental) install in node_modules/.store, +link in place, unhoisted. @@ -87,10 +86,10 @@ unhoisted. * DEPRECATED: This option has been deprecated in favor of `--install-strategy=nested` -Instead of hoisting package installs in `node_modules`, install -packages in the same manner that they are depended on. This may cause -very deep directory structures and duplicate package installs as -there is no de-duplicating. Sets `--install-strategy=nested`. +Instead of hoisting package installs in `node_modules`, install packages in +the same manner that they are depended on. This may cause very deep +directory structures and duplicate package installs as there is no +de-duplicating. Sets `--install-strategy=nested`. @@ -101,8 +100,8 @@ there is no de-duplicating. Sets `--install-strategy=nested`. * DEPRECATED: This option has been deprecated in favor of `--install-strategy=shallow` -Only install direct dependencies in the top level `node_modules`, but -hoist on deeper dependencies. Sets `--install-strategy=shallow`. +Only install direct dependencies in the top level `node_modules`, but hoist +on deeper dependencies. Sets `--install-strategy=shallow`. @@ -118,29 +117,25 @@ Note that these dependencies _are_ still resolved and added to the `package-lock.json` or `npm-shrinkwrap.json` file. They are just not physically installed on disk. -If a package type appears in both the `--include` and `--omit` lists, -then it will be included. +If a package type appears in both the `--include` and `--omit` lists, then +it will be included. -If the resulting omit list includes `'dev'`, then the `NODE_ENV` -environment variable will be set to `'production'` for all lifecycle -scripts. +If the resulting omit list includes `'dev'`, then the `NODE_ENV` environment +variable will be set to `'production'` for all lifecycle scripts. #### `include` * Default: -* Type: "prod", "dev", "optional", or "peer" (can be set multiple - times) +* Type: "prod", "dev", "optional", or "peer" (can be set multiple times) -Option that allows for defining which types of dependencies to -install. +Option that allows for defining which types of dependencies to install. This is the inverse of `--omit=`. -Dependency types specified in `--include` will not be omitted, -regardless of the order in which omit/include are specified on the -command-line. +Dependency types specified in `--include` will not be omitted, regardless of +the order in which omit/include are specified on the command-line. @@ -150,35 +145,33 @@ command-line. * Type: Boolean If set to `true`, and `--legacy-peer-deps` is not set, then _any_ -conflicting `peerDependencies` will be treated as an install failure, -even if npm could reasonably guess the appropriate resolution based -on non-peer dependency relationships. +conflicting `peerDependencies` will be treated as an install failure, even +if npm could reasonably guess the appropriate resolution based on non-peer +dependency relationships. -By default, conflicting `peerDependencies` deep in the dependency -graph will be resolved using the nearest non-peer dependency -specification, even if doing so will result in some packages -receiving a peer dependency outside the range set in their package's -`peerDependencies` object. +By default, conflicting `peerDependencies` deep in the dependency graph will +be resolved using the nearest non-peer dependency specification, even if +doing so will result in some packages receiving a peer dependency outside +the range set in their package's `peerDependencies` object. -When such an override is performed, a warning is printed, explaining -the conflict and the packages involved. If `--strict-peer-deps` is -set, then this warning is treated as a failure. +When such an override is performed, a warning is printed, explaining the +conflict and the packages involved. If `--strict-peer-deps` is set, then +this warning is treated as a failure. #### `foreground-scripts` -* Default: `false` unless when using `npm pack` or `npm publish` where - it defaults to `true` +* Default: `false` unless when using `npm pack` or `npm publish` where it + defaults to `true` * Type: Boolean -Run all build scripts (ie, `preinstall`, `install`, and -`postinstall`) scripts for installed packages in the foreground -process, sharing standard input, output, and error with the main npm -process. +Run all build scripts (ie, `preinstall`, `install`, and `postinstall`) +scripts for installed packages in the foreground process, sharing standard +input, output, and error with the main npm process. -Note that this will generally make installs run slower, and be much -noisier, but can be useful for debugging. +Note that this will generally make installs run slower, and be much noisier, +but can be useful for debugging. @@ -189,10 +182,10 @@ noisier, but can be useful for debugging. If true, npm does not run scripts specified in package.json files. -Note that commands explicitly intended to run a particular script, -such as `npm start`, `npm stop`, `npm restart`, `npm test`, and `npm -run` will still run their intended script if `ignore-scripts` is set, -but they will *not* run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as +`npm start`, `npm stop`, `npm restart`, `npm test`, and `npm run` will still +run their intended script if `ignore-scripts` is set, but they will *not* +run any pre- or post-scripts. @@ -201,10 +194,10 @@ but they will *not* run any pre- or post-scripts. * Default: true * Type: Boolean -When "true" submit audit reports alongside the current npm command to -the default registry and all registries configured for scopes. See -the documentation for [`npm audit`](/commands/npm-audit) for details -on what is submitted. +When "true" submit audit reports alongside the current npm command to the +default registry and all registries configured for scopes. See the +documentation for [`npm audit`](/commands/npm-audit) for details on what is +submitted. @@ -216,9 +209,9 @@ on what is submitted. Tells npm to create symlinks (or `.cmd` shims on Windows) for package executables. -Set to false to have it not do this. This can be used to work around -the fact that some file systems don't support symlinks, even on -ostensibly Unix systems. +Set to false to have it not do this. This can be used to work around the +fact that some file systems don't support symlinks, even on ostensibly Unix +systems. @@ -228,8 +221,8 @@ ostensibly Unix systems. * Type: Boolean When "true" displays the message at the end of each `npm install` -acknowledging the number of dependencies looking for funding. See -[`npm fund`](/commands/npm-fund) for details. +acknowledging the number of dependencies looking for funding. See [`npm +fund`](/commands/npm-fund) for details. @@ -238,14 +231,13 @@ acknowledging the number of dependencies looking for funding. See * Default: false * Type: Boolean -Indicates that you don't want npm to make any changes and that it -should only report what it would have done. This can be passed into -any of the commands that modify your local installation, eg, -`install`, `update`, `dedupe`, `uninstall`, as well as `pack` and -`publish`. +Indicates that you don't want npm to make any changes and that it should +only report what it would have done. This can be passed into any of the +commands that modify your local installation, eg, `install`, `update`, +`dedupe`, `uninstall`, as well as `pack` and `publish`. -Note: This is NOT honored by other network related commands, eg -`dist-tags`, `owner`, etc. +Note: This is NOT honored by other network related commands, eg `dist-tags`, +`owner`, etc. @@ -254,9 +246,9 @@ Note: This is NOT honored by other network related commands, eg * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -265,9 +257,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -279,14 +271,13 @@ This value is not exported to the environment for child processes. Set to true to run the command in the context of **all** configured workspaces. -Explicitly setting this to false will cause commands like `install` -to ignore workspaces altogether. When not set explicitly: +Explicitly setting this to false will cause commands like `install` to +ignore workspaces altogether. When not set explicitly: -- Commands that operate on the `node_modules` tree (install, update, -etc.) will link workspaces into the `node_modules` folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, _unless_ one or more workspaces are specified in the -`workspace` config. +- Commands that operate on the `node_modules` tree (install, update, etc.) +will link workspaces into the `node_modules` folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +_unless_ one or more workspaces are specified in the `workspace` config. This value is not exported to the environment for child processes. @@ -297,10 +288,9 @@ This value is not exported to the environment for child processes. Include the workspace root when workspaces are enabled for a command. -When false, specifying individual workspaces via the `workspace` -config, or all workspaces via the `workspaces` flag, will cause npm -to operate only on the specified workspaces, and not on the root -project. +When false, specifying individual workspaces via the `workspace` config, or +all workspaces via the `workspaces` flag, will cause npm to operate only on +the specified workspaces, and not on the root project. This value is not exported to the environment for child processes. @@ -309,9 +299,9 @@ This value is not exported to the environment for child processes. * Default: false * Type: Boolean -When set file: protocol dependencies will be packed and installed as -regular dependencies instead of creating a symlink. This option has -no effect on workspaces. +When set file: protocol dependencies will be packed and installed as regular +dependencies instead of creating a symlink. This option has no effect on +workspaces. diff --git a/deps/npm/docs/content/commands/npm-config.md b/deps/npm/docs/content/commands/npm-config.md index 78aa4c4d3fa3c1..2ca4a640031153 100644 --- a/deps/npm/docs/content/commands/npm-config.md +++ b/deps/npm/docs/content/commands/npm-config.md @@ -106,8 +106,8 @@ Usually this means attaching authentication config (i.e. Whether or not to output JSON data, rather than the normal output. -* In `npm pkg set` it enables parsing set values with JSON.parse() - before saving them to your `package.json`. +* In `npm pkg set` it enables parsing set values with JSON.parse() before + saving them to your `package.json`. Not supported by all npm commands. @@ -118,13 +118,12 @@ Not supported by all npm commands. * Default: false * Type: Boolean -Operates in "global" mode, so that packages are installed into the -`prefix` folder instead of the current working directory. See -[folders](/configuring-npm/folders) for more on the differences in -behavior. +Operates in "global" mode, so that packages are installed into the `prefix` +folder instead of the current working directory. See +[folders](/configuring-npm/folders) for more on the differences in behavior. -* packages are installed into the `{prefix}/lib/node_modules` folder, - instead of the current working directory. +* packages are installed into the `{prefix}/lib/node_modules` folder, instead + of the current working directory. * bin files are linked to `{prefix}/bin` * man pages are linked to `{prefix}/share/man` @@ -142,19 +141,18 @@ The command to run for `npm edit` and `npm config edit`. #### `location` -* Default: "user" unless `--global` is passed, which will also set this - value to "global" +* Default: "user" unless `--global` is passed, which will also set this value + to "global" * Type: "global", "user", or "project" When passed to `npm config` this refers to which config file to use. -When set to "global" mode, packages are installed into the `prefix` -folder instead of the current working directory. See -[folders](/configuring-npm/folders) for more on the differences in -behavior. +When set to "global" mode, packages are installed into the `prefix` folder +instead of the current working directory. See +[folders](/configuring-npm/folders) for more on the differences in behavior. -* packages are installed into the `{prefix}/lib/node_modules` folder, - instead of the current working directory. +* packages are installed into the `{prefix}/lib/node_modules` folder, instead + of the current working directory. * bin files are linked to `{prefix}/bin` * man pages are linked to `{prefix}/share/man` diff --git a/deps/npm/docs/content/commands/npm-dedupe.md b/deps/npm/docs/content/commands/npm-dedupe.md index beace9335f0629..b07d241f451f7c 100644 --- a/deps/npm/docs/content/commands/npm-dedupe.md +++ b/deps/npm/docs/content/commands/npm-dedupe.md @@ -71,12 +71,11 @@ Note: `npm dedupe` will never update the semver values of direct dependencies in * Type: "hoisted", "nested", "shallow", or "linked" Sets the strategy for installing packages in node_modules. hoisted -(default): Install non-duplicated in top-level, and duplicated as -necessary within directory structure. nested: (formerly ---legacy-bundling) install in place, no hoisting. shallow (formerly ---global-style) only install direct deps at top-level. linked: -(experimental) install in node_modules/.store, link in place, -unhoisted. +(default): Install non-duplicated in top-level, and duplicated as necessary +within directory structure. nested: (formerly --legacy-bundling) install in +place, no hoisting. shallow (formerly --global-style) only install direct +deps at top-level. linked: (experimental) install in node_modules/.store, +link in place, unhoisted. @@ -87,10 +86,10 @@ unhoisted. * DEPRECATED: This option has been deprecated in favor of `--install-strategy=nested` -Instead of hoisting package installs in `node_modules`, install -packages in the same manner that they are depended on. This may cause -very deep directory structures and duplicate package installs as -there is no de-duplicating. Sets `--install-strategy=nested`. +Instead of hoisting package installs in `node_modules`, install packages in +the same manner that they are depended on. This may cause very deep +directory structures and duplicate package installs as there is no +de-duplicating. Sets `--install-strategy=nested`. @@ -101,8 +100,8 @@ there is no de-duplicating. Sets `--install-strategy=nested`. * DEPRECATED: This option has been deprecated in favor of `--install-strategy=shallow` -Only install direct dependencies in the top level `node_modules`, but -hoist on deeper dependencies. Sets `--install-strategy=shallow`. +Only install direct dependencies in the top level `node_modules`, but hoist +on deeper dependencies. Sets `--install-strategy=shallow`. @@ -112,19 +111,18 @@ hoist on deeper dependencies. Sets `--install-strategy=shallow`. * Type: Boolean If set to `true`, and `--legacy-peer-deps` is not set, then _any_ -conflicting `peerDependencies` will be treated as an install failure, -even if npm could reasonably guess the appropriate resolution based -on non-peer dependency relationships. +conflicting `peerDependencies` will be treated as an install failure, even +if npm could reasonably guess the appropriate resolution based on non-peer +dependency relationships. -By default, conflicting `peerDependencies` deep in the dependency -graph will be resolved using the nearest non-peer dependency -specification, even if doing so will result in some packages -receiving a peer dependency outside the range set in their package's -`peerDependencies` object. +By default, conflicting `peerDependencies` deep in the dependency graph will +be resolved using the nearest non-peer dependency specification, even if +doing so will result in some packages receiving a peer dependency outside +the range set in their package's `peerDependencies` object. -When such an override is performed, a warning is printed, explaining -the conflict and the packages involved. If `--strict-peer-deps` is -set, then this warning is treated as a failure. +When such an override is performed, a warning is printed, explaining the +conflict and the packages involved. If `--strict-peer-deps` is set, then +this warning is treated as a failure. @@ -133,9 +131,8 @@ set, then this warning is treated as a failure. * Default: true * Type: Boolean -If set to false, then ignore `package-lock.json` files when -installing. This will also prevent _writing_ `package-lock.json` if -`save` is true. +If set to false, then ignore `package-lock.json` files when installing. This +will also prevent _writing_ `package-lock.json` if `save` is true. @@ -151,29 +148,25 @@ Note that these dependencies _are_ still resolved and added to the `package-lock.json` or `npm-shrinkwrap.json` file. They are just not physically installed on disk. -If a package type appears in both the `--include` and `--omit` lists, -then it will be included. +If a package type appears in both the `--include` and `--omit` lists, then +it will be included. -If the resulting omit list includes `'dev'`, then the `NODE_ENV` -environment variable will be set to `'production'` for all lifecycle -scripts. +If the resulting omit list includes `'dev'`, then the `NODE_ENV` environment +variable will be set to `'production'` for all lifecycle scripts. #### `include` * Default: -* Type: "prod", "dev", "optional", or "peer" (can be set multiple - times) +* Type: "prod", "dev", "optional", or "peer" (can be set multiple times) -Option that allows for defining which types of dependencies to -install. +Option that allows for defining which types of dependencies to install. This is the inverse of `--omit=`. -Dependency types specified in `--include` will not be omitted, -regardless of the order in which omit/include are specified on the -command-line. +Dependency types specified in `--include` will not be omitted, regardless of +the order in which omit/include are specified on the command-line. @@ -184,10 +177,10 @@ command-line. If true, npm does not run scripts specified in package.json files. -Note that commands explicitly intended to run a particular script, -such as `npm start`, `npm stop`, `npm restart`, `npm test`, and `npm -run` will still run their intended script if `ignore-scripts` is set, -but they will *not* run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as +`npm start`, `npm stop`, `npm restart`, `npm test`, and `npm run` will still +run their intended script if `ignore-scripts` is set, but they will *not* +run any pre- or post-scripts. @@ -196,10 +189,10 @@ but they will *not* run any pre- or post-scripts. * Default: true * Type: Boolean -When "true" submit audit reports alongside the current npm command to -the default registry and all registries configured for scopes. See -the documentation for [`npm audit`](/commands/npm-audit) for details -on what is submitted. +When "true" submit audit reports alongside the current npm command to the +default registry and all registries configured for scopes. See the +documentation for [`npm audit`](/commands/npm-audit) for details on what is +submitted. @@ -211,9 +204,9 @@ on what is submitted. Tells npm to create symlinks (or `.cmd` shims on Windows) for package executables. -Set to false to have it not do this. This can be used to work around -the fact that some file systems don't support symlinks, even on -ostensibly Unix systems. +Set to false to have it not do this. This can be used to work around the +fact that some file systems don't support symlinks, even on ostensibly Unix +systems. @@ -223,8 +216,8 @@ ostensibly Unix systems. * Type: Boolean When "true" displays the message at the end of each `npm install` -acknowledging the number of dependencies looking for funding. See -[`npm fund`](/commands/npm-fund) for details. +acknowledging the number of dependencies looking for funding. See [`npm +fund`](/commands/npm-fund) for details. @@ -233,14 +226,13 @@ acknowledging the number of dependencies looking for funding. See * Default: false * Type: Boolean -Indicates that you don't want npm to make any changes and that it -should only report what it would have done. This can be passed into -any of the commands that modify your local installation, eg, -`install`, `update`, `dedupe`, `uninstall`, as well as `pack` and -`publish`. +Indicates that you don't want npm to make any changes and that it should +only report what it would have done. This can be passed into any of the +commands that modify your local installation, eg, `install`, `update`, +`dedupe`, `uninstall`, as well as `pack` and `publish`. -Note: This is NOT honored by other network related commands, eg -`dist-tags`, `owner`, etc. +Note: This is NOT honored by other network related commands, eg `dist-tags`, +`owner`, etc. @@ -249,9 +241,9 @@ Note: This is NOT honored by other network related commands, eg * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -260,9 +252,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -274,14 +266,13 @@ This value is not exported to the environment for child processes. Set to true to run the command in the context of **all** configured workspaces. -Explicitly setting this to false will cause commands like `install` -to ignore workspaces altogether. When not set explicitly: +Explicitly setting this to false will cause commands like `install` to +ignore workspaces altogether. When not set explicitly: -- Commands that operate on the `node_modules` tree (install, update, -etc.) will link workspaces into the `node_modules` folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, _unless_ one or more workspaces are specified in the -`workspace` config. +- Commands that operate on the `node_modules` tree (install, update, etc.) +will link workspaces into the `node_modules` folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +_unless_ one or more workspaces are specified in the `workspace` config. This value is not exported to the environment for child processes. @@ -292,10 +283,9 @@ This value is not exported to the environment for child processes. Include the workspace root when workspaces are enabled for a command. -When false, specifying individual workspaces via the `workspace` -config, or all workspaces via the `workspaces` flag, will cause npm -to operate only on the specified workspaces, and not on the root -project. +When false, specifying individual workspaces via the `workspace` config, or +all workspaces via the `workspaces` flag, will cause npm to operate only on +the specified workspaces, and not on the root project. This value is not exported to the environment for child processes. @@ -304,9 +294,9 @@ This value is not exported to the environment for child processes. * Default: false * Type: Boolean -When set file: protocol dependencies will be packed and installed as -regular dependencies instead of creating a symlink. This option has -no effect on workspaces. +When set file: protocol dependencies will be packed and installed as regular +dependencies instead of creating a symlink. This option has no effect on +workspaces. diff --git a/deps/npm/docs/content/commands/npm-deprecate.md b/deps/npm/docs/content/commands/npm-deprecate.md index 0724791ef484ab..fbb207da6bfa45 100644 --- a/deps/npm/docs/content/commands/npm-deprecate.md +++ b/deps/npm/docs/content/commands/npm-deprecate.md @@ -53,12 +53,11 @@ The base URL of the npm registry. * Default: null * Type: null or String -This is a one-time password from a two-factor authenticator. It's -needed when publishing or changing package permissions with `npm -access`. +This is a one-time password from a two-factor authenticator. It's needed +when publishing or changing package permissions with `npm access`. -If not set, and a registry response fails with a challenge for a -one-time password, npm will prompt on the command line for one. +If not set, and a registry response fails with a challenge for a one-time +password, npm will prompt on the command line for one. @@ -67,14 +66,13 @@ one-time password, npm will prompt on the command line for one. * Default: false * Type: Boolean -Indicates that you don't want npm to make any changes and that it -should only report what it would have done. This can be passed into -any of the commands that modify your local installation, eg, -`install`, `update`, `dedupe`, `uninstall`, as well as `pack` and -`publish`. +Indicates that you don't want npm to make any changes and that it should +only report what it would have done. This can be passed into any of the +commands that modify your local installation, eg, `install`, `update`, +`dedupe`, `uninstall`, as well as `pack` and `publish`. -Note: This is NOT honored by other network related commands, eg -`dist-tags`, `owner`, etc. +Note: This is NOT honored by other network related commands, eg `dist-tags`, +`owner`, etc. diff --git a/deps/npm/docs/content/commands/npm-diff.md b/deps/npm/docs/content/commands/npm-diff.md index 6337c04ba03700..e29faff1caf9f1 100644 --- a/deps/npm/docs/content/commands/npm-diff.md +++ b/deps/npm/docs/content/commands/npm-diff.md @@ -192,13 +192,12 @@ Treat all files as text in `npm diff`. * Default: false * Type: Boolean -Operates in "global" mode, so that packages are installed into the -`prefix` folder instead of the current working directory. See -[folders](/configuring-npm/folders) for more on the differences in -behavior. +Operates in "global" mode, so that packages are installed into the `prefix` +folder instead of the current working directory. See +[folders](/configuring-npm/folders) for more on the differences in behavior. -* packages are installed into the `{prefix}/lib/node_modules` folder, - instead of the current working directory. +* packages are installed into the `{prefix}/lib/node_modules` folder, instead + of the current working directory. * bin files are linked to `{prefix}/bin` * man pages are linked to `{prefix}/share/man` @@ -209,17 +208,17 @@ behavior. * Default: "latest" * Type: String -If you ask npm to install a package and don't tell it a specific -version, then it will install the specified tag. +If you ask npm to install a package and don't tell it a specific version, +then it will install the specified tag. -It is the tag added to the package@version specified in the `npm -dist-tag add` command, if no explicit tag is given. +It is the tag added to the package@version specified in the `npm dist-tag +add` command, if no explicit tag is given. -When used by the `npm diff` command, this is the tag used to fetch -the tarball that will be compared with the local files by default. +When used by the `npm diff` command, this is the tag used to fetch the +tarball that will be compared with the local files by default. -If used in the `npm publish` command, this is the tag that will be -added to the package submitted to the registry. +If used in the `npm publish` command, this is the tag that will be added to +the package submitted to the registry. @@ -228,9 +227,9 @@ added to the package submitted to the registry. * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -239,9 +238,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -253,14 +252,13 @@ This value is not exported to the environment for child processes. Set to true to run the command in the context of **all** configured workspaces. -Explicitly setting this to false will cause commands like `install` -to ignore workspaces altogether. When not set explicitly: +Explicitly setting this to false will cause commands like `install` to +ignore workspaces altogether. When not set explicitly: -- Commands that operate on the `node_modules` tree (install, update, -etc.) will link workspaces into the `node_modules` folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, _unless_ one or more workspaces are specified in the -`workspace` config. +- Commands that operate on the `node_modules` tree (install, update, etc.) +will link workspaces into the `node_modules` folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +_unless_ one or more workspaces are specified in the `workspace` config. This value is not exported to the environment for child processes. @@ -271,10 +269,9 @@ This value is not exported to the environment for child processes. Include the workspace root when workspaces are enabled for a command. -When false, specifying individual workspaces via the `workspace` -config, or all workspaces via the `workspaces` flag, will cause npm -to operate only on the specified workspaces, and not on the root -project. +When false, specifying individual workspaces via the `workspace` config, or +all workspaces via the `workspaces` flag, will cause npm to operate only on +the specified workspaces, and not on the root project. This value is not exported to the environment for child processes. ## See Also diff --git a/deps/npm/docs/content/commands/npm-dist-tag.md b/deps/npm/docs/content/commands/npm-dist-tag.md index c39e54b6b28e32..1b775a9bf619f9 100644 --- a/deps/npm/docs/content/commands/npm-dist-tag.md +++ b/deps/npm/docs/content/commands/npm-dist-tag.md @@ -79,9 +79,9 @@ The simplest way to avoid semver problems with tags is to use tags that do not b * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -90,9 +90,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -104,14 +104,13 @@ This value is not exported to the environment for child processes. Set to true to run the command in the context of **all** configured workspaces. -Explicitly setting this to false will cause commands like `install` -to ignore workspaces altogether. When not set explicitly: +Explicitly setting this to false will cause commands like `install` to +ignore workspaces altogether. When not set explicitly: -- Commands that operate on the `node_modules` tree (install, update, -etc.) will link workspaces into the `node_modules` folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, _unless_ one or more workspaces are specified in the -`workspace` config. +- Commands that operate on the `node_modules` tree (install, update, etc.) +will link workspaces into the `node_modules` folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +_unless_ one or more workspaces are specified in the `workspace` config. This value is not exported to the environment for child processes. @@ -122,10 +121,9 @@ This value is not exported to the environment for child processes. Include the workspace root when workspaces are enabled for a command. -When false, specifying individual workspaces via the `workspace` -config, or all workspaces via the `workspaces` flag, will cause npm -to operate only on the specified workspaces, and not on the root -project. +When false, specifying individual workspaces via the `workspace` config, or +all workspaces via the `workspaces` flag, will cause npm to operate only on +the specified workspaces, and not on the root project. This value is not exported to the environment for child processes. diff --git a/deps/npm/docs/content/commands/npm-docs.md b/deps/npm/docs/content/commands/npm-docs.md index 21bbcbd58c3d76..6841307db72efd 100644 --- a/deps/npm/docs/content/commands/npm-docs.md +++ b/deps/npm/docs/content/commands/npm-docs.md @@ -48,9 +48,9 @@ The base URL of the npm registry. * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -59,9 +59,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -73,14 +73,13 @@ This value is not exported to the environment for child processes. Set to true to run the command in the context of **all** configured workspaces. -Explicitly setting this to false will cause commands like `install` -to ignore workspaces altogether. When not set explicitly: +Explicitly setting this to false will cause commands like `install` to +ignore workspaces altogether. When not set explicitly: -- Commands that operate on the `node_modules` tree (install, update, -etc.) will link workspaces into the `node_modules` folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, _unless_ one or more workspaces are specified in the -`workspace` config. +- Commands that operate on the `node_modules` tree (install, update, etc.) +will link workspaces into the `node_modules` folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +_unless_ one or more workspaces are specified in the `workspace` config. This value is not exported to the environment for child processes. @@ -91,10 +90,9 @@ This value is not exported to the environment for child processes. Include the workspace root when workspaces are enabled for a command. -When false, specifying individual workspaces via the `workspace` -config, or all workspaces via the `workspaces` flag, will cause npm -to operate only on the specified workspaces, and not on the root -project. +When false, specifying individual workspaces via the `workspace` config, or +all workspaces via the `workspaces` flag, will cause npm to operate only on +the specified workspaces, and not on the root project. This value is not exported to the environment for child processes. diff --git a/deps/npm/docs/content/commands/npm-exec.md b/deps/npm/docs/content/commands/npm-exec.md index ac5b2a471a74b8..72c63163be4d2f 100644 --- a/deps/npm/docs/content/commands/npm-exec.md +++ b/deps/npm/docs/content/commands/npm-exec.md @@ -87,8 +87,7 @@ $ npm exec -- foo@latest bar --package=@npmcli/foo * Default: * Type: String (can be set multiple times) -The package or packages to install for [`npm -exec`](/commands/npm-exec) +The package or packages to install for [`npm exec`](/commands/npm-exec) @@ -97,9 +96,8 @@ exec`](/commands/npm-exec) * Default: "" * Type: String -Optional companion option for `npm exec`, `npx` that allows for -specifying a custom command to be run along with the installed -packages. +Optional companion option for `npm exec`, `npx` that allows for specifying a +custom command to be run along with the installed packages. ```bash npm exec --package yo --package generator-node --call "yo node" @@ -112,9 +110,9 @@ npm exec --package yo --package generator-node --call "yo node" * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -123,9 +121,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -137,14 +135,13 @@ This value is not exported to the environment for child processes. Set to true to run the command in the context of **all** configured workspaces. -Explicitly setting this to false will cause commands like `install` -to ignore workspaces altogether. When not set explicitly: +Explicitly setting this to false will cause commands like `install` to +ignore workspaces altogether. When not set explicitly: -- Commands that operate on the `node_modules` tree (install, update, -etc.) will link workspaces into the `node_modules` folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, _unless_ one or more workspaces are specified in the -`workspace` config. +- Commands that operate on the `node_modules` tree (install, update, etc.) +will link workspaces into the `node_modules` folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +_unless_ one or more workspaces are specified in the `workspace` config. This value is not exported to the environment for child processes. @@ -155,10 +152,9 @@ This value is not exported to the environment for child processes. Include the workspace root when workspaces are enabled for a command. -When false, specifying individual workspaces via the `workspace` -config, or all workspaces via the `workspaces` flag, will cause npm -to operate only on the specified workspaces, and not on the root -project. +When false, specifying individual workspaces via the `workspace` config, or +all workspaces via the `workspaces` flag, will cause npm to operate only on +the specified workspaces, and not on the root project. This value is not exported to the environment for child processes. diff --git a/deps/npm/docs/content/commands/npm-explain.md b/deps/npm/docs/content/commands/npm-explain.md index c5a89ca793906d..a5e85a3c04ea9b 100644 --- a/deps/npm/docs/content/commands/npm-explain.md +++ b/deps/npm/docs/content/commands/npm-explain.md @@ -58,8 +58,8 @@ node_modules/nyc/node_modules/find-up Whether or not to output JSON data, rather than the normal output. -* In `npm pkg set` it enables parsing set values with JSON.parse() - before saving them to your `package.json`. +* In `npm pkg set` it enables parsing set values with JSON.parse() before + saving them to your `package.json`. Not supported by all npm commands. @@ -70,9 +70,9 @@ Not supported by all npm commands. * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -81,9 +81,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. diff --git a/deps/npm/docs/content/commands/npm-explore.md b/deps/npm/docs/content/commands/npm-explore.md index be37de759c83f2..5777aa89a4b923 100644 --- a/deps/npm/docs/content/commands/npm-explore.md +++ b/deps/npm/docs/content/commands/npm-explore.md @@ -30,8 +30,8 @@ Note that the package is *not* automatically rebuilt afterwards, so be sure to u #### `shell` -* Default: SHELL environment variable, or "bash" on Posix, or "cmd.exe" - on Windows +* Default: SHELL environment variable, or "bash" on Posix, or "cmd.exe" on + Windows * Type: String The shell to run for the `npm explore` command. diff --git a/deps/npm/docs/content/commands/npm-find-dupes.md b/deps/npm/docs/content/commands/npm-find-dupes.md index 25cf8a32b1b714..52bb59b9f81b57 100644 --- a/deps/npm/docs/content/commands/npm-find-dupes.md +++ b/deps/npm/docs/content/commands/npm-find-dupes.md @@ -22,12 +22,11 @@ Runs `npm dedupe` in `--dry-run` mode, making npm only output the duplications, * Type: "hoisted", "nested", "shallow", or "linked" Sets the strategy for installing packages in node_modules. hoisted -(default): Install non-duplicated in top-level, and duplicated as -necessary within directory structure. nested: (formerly ---legacy-bundling) install in place, no hoisting. shallow (formerly ---global-style) only install direct deps at top-level. linked: -(experimental) install in node_modules/.store, link in place, -unhoisted. +(default): Install non-duplicated in top-level, and duplicated as necessary +within directory structure. nested: (formerly --legacy-bundling) install in +place, no hoisting. shallow (formerly --global-style) only install direct +deps at top-level. linked: (experimental) install in node_modules/.store, +link in place, unhoisted. @@ -38,10 +37,10 @@ unhoisted. * DEPRECATED: This option has been deprecated in favor of `--install-strategy=nested` -Instead of hoisting package installs in `node_modules`, install -packages in the same manner that they are depended on. This may cause -very deep directory structures and duplicate package installs as -there is no de-duplicating. Sets `--install-strategy=nested`. +Instead of hoisting package installs in `node_modules`, install packages in +the same manner that they are depended on. This may cause very deep +directory structures and duplicate package installs as there is no +de-duplicating. Sets `--install-strategy=nested`. @@ -52,8 +51,8 @@ there is no de-duplicating. Sets `--install-strategy=nested`. * DEPRECATED: This option has been deprecated in favor of `--install-strategy=shallow` -Only install direct dependencies in the top level `node_modules`, but -hoist on deeper dependencies. Sets `--install-strategy=shallow`. +Only install direct dependencies in the top level `node_modules`, but hoist +on deeper dependencies. Sets `--install-strategy=shallow`. @@ -63,19 +62,18 @@ hoist on deeper dependencies. Sets `--install-strategy=shallow`. * Type: Boolean If set to `true`, and `--legacy-peer-deps` is not set, then _any_ -conflicting `peerDependencies` will be treated as an install failure, -even if npm could reasonably guess the appropriate resolution based -on non-peer dependency relationships. +conflicting `peerDependencies` will be treated as an install failure, even +if npm could reasonably guess the appropriate resolution based on non-peer +dependency relationships. -By default, conflicting `peerDependencies` deep in the dependency -graph will be resolved using the nearest non-peer dependency -specification, even if doing so will result in some packages -receiving a peer dependency outside the range set in their package's -`peerDependencies` object. +By default, conflicting `peerDependencies` deep in the dependency graph will +be resolved using the nearest non-peer dependency specification, even if +doing so will result in some packages receiving a peer dependency outside +the range set in their package's `peerDependencies` object. -When such an override is performed, a warning is printed, explaining -the conflict and the packages involved. If `--strict-peer-deps` is -set, then this warning is treated as a failure. +When such an override is performed, a warning is printed, explaining the +conflict and the packages involved. If `--strict-peer-deps` is set, then +this warning is treated as a failure. @@ -84,9 +82,8 @@ set, then this warning is treated as a failure. * Default: true * Type: Boolean -If set to false, then ignore `package-lock.json` files when -installing. This will also prevent _writing_ `package-lock.json` if -`save` is true. +If set to false, then ignore `package-lock.json` files when installing. This +will also prevent _writing_ `package-lock.json` if `save` is true. @@ -102,29 +99,25 @@ Note that these dependencies _are_ still resolved and added to the `package-lock.json` or `npm-shrinkwrap.json` file. They are just not physically installed on disk. -If a package type appears in both the `--include` and `--omit` lists, -then it will be included. +If a package type appears in both the `--include` and `--omit` lists, then +it will be included. -If the resulting omit list includes `'dev'`, then the `NODE_ENV` -environment variable will be set to `'production'` for all lifecycle -scripts. +If the resulting omit list includes `'dev'`, then the `NODE_ENV` environment +variable will be set to `'production'` for all lifecycle scripts. #### `include` * Default: -* Type: "prod", "dev", "optional", or "peer" (can be set multiple - times) +* Type: "prod", "dev", "optional", or "peer" (can be set multiple times) -Option that allows for defining which types of dependencies to -install. +Option that allows for defining which types of dependencies to install. This is the inverse of `--omit=`. -Dependency types specified in `--include` will not be omitted, -regardless of the order in which omit/include are specified on the -command-line. +Dependency types specified in `--include` will not be omitted, regardless of +the order in which omit/include are specified on the command-line. @@ -135,10 +128,10 @@ command-line. If true, npm does not run scripts specified in package.json files. -Note that commands explicitly intended to run a particular script, -such as `npm start`, `npm stop`, `npm restart`, `npm test`, and `npm -run` will still run their intended script if `ignore-scripts` is set, -but they will *not* run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as +`npm start`, `npm stop`, `npm restart`, `npm test`, and `npm run` will still +run their intended script if `ignore-scripts` is set, but they will *not* +run any pre- or post-scripts. @@ -147,10 +140,10 @@ but they will *not* run any pre- or post-scripts. * Default: true * Type: Boolean -When "true" submit audit reports alongside the current npm command to -the default registry and all registries configured for scopes. See -the documentation for [`npm audit`](/commands/npm-audit) for details -on what is submitted. +When "true" submit audit reports alongside the current npm command to the +default registry and all registries configured for scopes. See the +documentation for [`npm audit`](/commands/npm-audit) for details on what is +submitted. @@ -162,9 +155,9 @@ on what is submitted. Tells npm to create symlinks (or `.cmd` shims on Windows) for package executables. -Set to false to have it not do this. This can be used to work around -the fact that some file systems don't support symlinks, even on -ostensibly Unix systems. +Set to false to have it not do this. This can be used to work around the +fact that some file systems don't support symlinks, even on ostensibly Unix +systems. @@ -174,8 +167,8 @@ ostensibly Unix systems. * Type: Boolean When "true" displays the message at the end of each `npm install` -acknowledging the number of dependencies looking for funding. See -[`npm fund`](/commands/npm-fund) for details. +acknowledging the number of dependencies looking for funding. See [`npm +fund`](/commands/npm-fund) for details. @@ -184,9 +177,9 @@ acknowledging the number of dependencies looking for funding. See * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -195,9 +188,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -209,14 +202,13 @@ This value is not exported to the environment for child processes. Set to true to run the command in the context of **all** configured workspaces. -Explicitly setting this to false will cause commands like `install` -to ignore workspaces altogether. When not set explicitly: +Explicitly setting this to false will cause commands like `install` to +ignore workspaces altogether. When not set explicitly: -- Commands that operate on the `node_modules` tree (install, update, -etc.) will link workspaces into the `node_modules` folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, _unless_ one or more workspaces are specified in the -`workspace` config. +- Commands that operate on the `node_modules` tree (install, update, etc.) +will link workspaces into the `node_modules` folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +_unless_ one or more workspaces are specified in the `workspace` config. This value is not exported to the environment for child processes. @@ -227,10 +219,9 @@ This value is not exported to the environment for child processes. Include the workspace root when workspaces are enabled for a command. -When false, specifying individual workspaces via the `workspace` -config, or all workspaces via the `workspaces` flag, will cause npm -to operate only on the specified workspaces, and not on the root -project. +When false, specifying individual workspaces via the `workspace` config, or +all workspaces via the `workspaces` flag, will cause npm to operate only on +the specified workspaces, and not on the root project. This value is not exported to the environment for child processes. @@ -239,9 +230,9 @@ This value is not exported to the environment for child processes. * Default: false * Type: Boolean -When set file: protocol dependencies will be packed and installed as -regular dependencies instead of creating a symlink. This option has -no effect on workspaces. +When set file: protocol dependencies will be packed and installed as regular +dependencies instead of creating a symlink. This option has no effect on +workspaces. diff --git a/deps/npm/docs/content/commands/npm-fund.md b/deps/npm/docs/content/commands/npm-fund.md index 235d626c050231..b4d7e0b88897ed 100644 --- a/deps/npm/docs/content/commands/npm-fund.md +++ b/deps/npm/docs/content/commands/npm-fund.md @@ -63,8 +63,8 @@ test-workspaces-fund@1.0.0 Whether or not to output JSON data, rather than the normal output. -* In `npm pkg set` it enables parsing set values with JSON.parse() - before saving them to your `package.json`. +* In `npm pkg set` it enables parsing set values with JSON.parse() before + saving them to your `package.json`. Not supported by all npm commands. @@ -86,13 +86,12 @@ Set to `true` to use default system URL opener. #### `unicode` -* Default: false on windows, true on mac/unix systems with a unicode - locale, as defined by the `LC_ALL`, `LC_CTYPE`, or `LANG` environment - variables. +* Default: false on windows, true on mac/unix systems with a unicode locale, + as defined by the `LC_ALL`, `LC_CTYPE`, or `LANG` environment variables. * Type: Boolean -When set to true, npm uses unicode characters in the tree output. -When false, it uses ascii characters instead of unicode glyphs. +When set to true, npm uses unicode characters in the tree output. When +false, it uses ascii characters instead of unicode glyphs. @@ -101,9 +100,9 @@ When false, it uses ascii characters instead of unicode glyphs. * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -112,9 +111,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -123,8 +122,7 @@ This value is not exported to the environment for child processes. * Default: null * Type: null or Number -If there are multiple funding sources, which 1-indexed source URL to -open. +If there are multiple funding sources, which 1-indexed source URL to open. diff --git a/deps/npm/docs/content/commands/npm-help.md b/deps/npm/docs/content/commands/npm-help.md index 6e935670c6d666..79c4062c239cd8 100644 --- a/deps/npm/docs/content/commands/npm-help.md +++ b/deps/npm/docs/content/commands/npm-help.md @@ -30,8 +30,7 @@ Note that, if `help-search` finds a single subject, then it will run `help` on t The program to use to view help content. -Set to `"browser"` to view html help content in the default web -browser. +Set to `"browser"` to view html help content in the default web browser. diff --git a/deps/npm/docs/content/commands/npm-init.md b/deps/npm/docs/content/commands/npm-init.md index 3049eeead613d2..4b3b6342380d61 100644 --- a/deps/npm/docs/content/commands/npm-init.md +++ b/deps/npm/docs/content/commands/npm-init.md @@ -141,8 +141,7 @@ This will make sure to generate your react app as expected, one important consid * Default: "" * Type: String -The value `npm init` should use by default for the package author's -name. +The value `npm init` should use by default for the package author's name. @@ -172,8 +171,8 @@ The value `npm init` should use by default for the package license. A module that will be loaded by the `npm init` command. See the documentation for the -[init-package-json](https://github.com/npm/init-package-json) module -for more information, or [npm init](/commands/npm-init). +[init-package-json](https://github.com/npm/init-package-json) module for +more information, or [npm init](/commands/npm-init). @@ -182,8 +181,8 @@ for more information, or [npm init](/commands/npm-init). * Default: "commonjs" * Type: String -The value that `npm init` should use by default for the package.json -type field. +The value that `npm init` should use by default for the package.json type +field. @@ -192,8 +191,8 @@ type field. * Default: "1.0.0" * Type: SemVer string -The value that `npm init` should use by default for the package -version number, if not already set in package.json. +The value that `npm init` should use by default for the package version +number, if not already set in package.json. @@ -202,8 +201,7 @@ version number, if not already set in package.json. * Default: false * Type: Boolean -The value `npm init` should use by default for the package's private -flag. +The value `npm init` should use by default for the package's private flag. @@ -228,16 +226,14 @@ mistakes, unnecessary performance degradation, and malicious input. * Allow clobbering non-npm files in global installs. * Allow the `npm version` command to work on an unclean git repository. * Allow deleting the cache folder with `npm cache clean`. -* Allow installing packages that have an `engines` declaration - requiring a different version of npm. -* Allow installing packages that have an `engines` declaration - requiring a different version of `node`, even if `--engine-strict` is - enabled. -* Allow `npm audit fix` to install modules outside your stated - dependency range (including SemVer-major changes). +* Allow installing packages that have an `engines` declaration requiring a + different version of npm. +* Allow installing packages that have an `engines` declaration requiring a + different version of `node`, even if `--engine-strict` is enabled. +* Allow `npm audit fix` to install modules outside your stated dependency + range (including SemVer-major changes). * Allow unpublishing all versions of a published package. -* Allow conflicting peerDependencies to be installed in the root - project. +* Allow conflicting peerDependencies to be installed in the root project. * Implicitly set `--yes` during `npm init`. * Allow clobbering existing values in `npm pkg` * Allow unpublishing of entire packages (not just a single version). @@ -283,9 +279,9 @@ npm init --scope=@foo --yes * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -294,9 +290,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -308,14 +304,13 @@ This value is not exported to the environment for child processes. Set to true to run the command in the context of **all** configured workspaces. -Explicitly setting this to false will cause commands like `install` -to ignore workspaces altogether. When not set explicitly: +Explicitly setting this to false will cause commands like `install` to +ignore workspaces altogether. When not set explicitly: -- Commands that operate on the `node_modules` tree (install, update, -etc.) will link workspaces into the `node_modules` folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, _unless_ one or more workspaces are specified in the -`workspace` config. +- Commands that operate on the `node_modules` tree (install, update, etc.) +will link workspaces into the `node_modules` folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +_unless_ one or more workspaces are specified in the `workspace` config. This value is not exported to the environment for child processes. @@ -324,9 +319,8 @@ This value is not exported to the environment for child processes. * Default: true * Type: Boolean -If set to true, the npm cli will run an update after operations that -may possibly change the workspaces installed to the `node_modules` -folder. +If set to true, the npm cli will run an update after operations that may +possibly change the workspaces installed to the `node_modules` folder. @@ -337,10 +331,9 @@ folder. Include the workspace root when workspaces are enabled for a command. -When false, specifying individual workspaces via the `workspace` -config, or all workspaces via the `workspaces` flag, will cause npm -to operate only on the specified workspaces, and not on the root -project. +When false, specifying individual workspaces via the `workspace` config, or +all workspaces via the `workspaces` flag, will cause npm to operate only on +the specified workspaces, and not on the root project. This value is not exported to the environment for child processes. diff --git a/deps/npm/docs/content/commands/npm-install-ci-test.md b/deps/npm/docs/content/commands/npm-install-ci-test.md index 0ec8030a3197c4..aaeb44ea6d709d 100644 --- a/deps/npm/docs/content/commands/npm-install-ci-test.md +++ b/deps/npm/docs/content/commands/npm-install-ci-test.md @@ -24,12 +24,11 @@ This command runs `npm ci` followed immediately by `npm test`. * Type: "hoisted", "nested", "shallow", or "linked" Sets the strategy for installing packages in node_modules. hoisted -(default): Install non-duplicated in top-level, and duplicated as -necessary within directory structure. nested: (formerly ---legacy-bundling) install in place, no hoisting. shallow (formerly ---global-style) only install direct deps at top-level. linked: -(experimental) install in node_modules/.store, link in place, -unhoisted. +(default): Install non-duplicated in top-level, and duplicated as necessary +within directory structure. nested: (formerly --legacy-bundling) install in +place, no hoisting. shallow (formerly --global-style) only install direct +deps at top-level. linked: (experimental) install in node_modules/.store, +link in place, unhoisted. @@ -40,10 +39,10 @@ unhoisted. * DEPRECATED: This option has been deprecated in favor of `--install-strategy=nested` -Instead of hoisting package installs in `node_modules`, install -packages in the same manner that they are depended on. This may cause -very deep directory structures and duplicate package installs as -there is no de-duplicating. Sets `--install-strategy=nested`. +Instead of hoisting package installs in `node_modules`, install packages in +the same manner that they are depended on. This may cause very deep +directory structures and duplicate package installs as there is no +de-duplicating. Sets `--install-strategy=nested`. @@ -54,8 +53,8 @@ there is no de-duplicating. Sets `--install-strategy=nested`. * DEPRECATED: This option has been deprecated in favor of `--install-strategy=shallow` -Only install direct dependencies in the top level `node_modules`, but -hoist on deeper dependencies. Sets `--install-strategy=shallow`. +Only install direct dependencies in the top level `node_modules`, but hoist +on deeper dependencies. Sets `--install-strategy=shallow`. @@ -71,29 +70,25 @@ Note that these dependencies _are_ still resolved and added to the `package-lock.json` or `npm-shrinkwrap.json` file. They are just not physically installed on disk. -If a package type appears in both the `--include` and `--omit` lists, -then it will be included. +If a package type appears in both the `--include` and `--omit` lists, then +it will be included. -If the resulting omit list includes `'dev'`, then the `NODE_ENV` -environment variable will be set to `'production'` for all lifecycle -scripts. +If the resulting omit list includes `'dev'`, then the `NODE_ENV` environment +variable will be set to `'production'` for all lifecycle scripts. #### `include` * Default: -* Type: "prod", "dev", "optional", or "peer" (can be set multiple - times) +* Type: "prod", "dev", "optional", or "peer" (can be set multiple times) -Option that allows for defining which types of dependencies to -install. +Option that allows for defining which types of dependencies to install. This is the inverse of `--omit=`. -Dependency types specified in `--include` will not be omitted, -regardless of the order in which omit/include are specified on the -command-line. +Dependency types specified in `--include` will not be omitted, regardless of +the order in which omit/include are specified on the command-line. @@ -103,35 +98,33 @@ command-line. * Type: Boolean If set to `true`, and `--legacy-peer-deps` is not set, then _any_ -conflicting `peerDependencies` will be treated as an install failure, -even if npm could reasonably guess the appropriate resolution based -on non-peer dependency relationships. +conflicting `peerDependencies` will be treated as an install failure, even +if npm could reasonably guess the appropriate resolution based on non-peer +dependency relationships. -By default, conflicting `peerDependencies` deep in the dependency -graph will be resolved using the nearest non-peer dependency -specification, even if doing so will result in some packages -receiving a peer dependency outside the range set in their package's -`peerDependencies` object. +By default, conflicting `peerDependencies` deep in the dependency graph will +be resolved using the nearest non-peer dependency specification, even if +doing so will result in some packages receiving a peer dependency outside +the range set in their package's `peerDependencies` object. -When such an override is performed, a warning is printed, explaining -the conflict and the packages involved. If `--strict-peer-deps` is -set, then this warning is treated as a failure. +When such an override is performed, a warning is printed, explaining the +conflict and the packages involved. If `--strict-peer-deps` is set, then +this warning is treated as a failure. #### `foreground-scripts` -* Default: `false` unless when using `npm pack` or `npm publish` where - it defaults to `true` +* Default: `false` unless when using `npm pack` or `npm publish` where it + defaults to `true` * Type: Boolean -Run all build scripts (ie, `preinstall`, `install`, and -`postinstall`) scripts for installed packages in the foreground -process, sharing standard input, output, and error with the main npm -process. +Run all build scripts (ie, `preinstall`, `install`, and `postinstall`) +scripts for installed packages in the foreground process, sharing standard +input, output, and error with the main npm process. -Note that this will generally make installs run slower, and be much -noisier, but can be useful for debugging. +Note that this will generally make installs run slower, and be much noisier, +but can be useful for debugging. @@ -142,10 +135,10 @@ noisier, but can be useful for debugging. If true, npm does not run scripts specified in package.json files. -Note that commands explicitly intended to run a particular script, -such as `npm start`, `npm stop`, `npm restart`, `npm test`, and `npm -run` will still run their intended script if `ignore-scripts` is set, -but they will *not* run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as +`npm start`, `npm stop`, `npm restart`, `npm test`, and `npm run` will still +run their intended script if `ignore-scripts` is set, but they will *not* +run any pre- or post-scripts. @@ -154,10 +147,10 @@ but they will *not* run any pre- or post-scripts. * Default: true * Type: Boolean -When "true" submit audit reports alongside the current npm command to -the default registry and all registries configured for scopes. See -the documentation for [`npm audit`](/commands/npm-audit) for details -on what is submitted. +When "true" submit audit reports alongside the current npm command to the +default registry and all registries configured for scopes. See the +documentation for [`npm audit`](/commands/npm-audit) for details on what is +submitted. @@ -169,9 +162,9 @@ on what is submitted. Tells npm to create symlinks (or `.cmd` shims on Windows) for package executables. -Set to false to have it not do this. This can be used to work around -the fact that some file systems don't support symlinks, even on -ostensibly Unix systems. +Set to false to have it not do this. This can be used to work around the +fact that some file systems don't support symlinks, even on ostensibly Unix +systems. @@ -181,8 +174,8 @@ ostensibly Unix systems. * Type: Boolean When "true" displays the message at the end of each `npm install` -acknowledging the number of dependencies looking for funding. See -[`npm fund`](/commands/npm-fund) for details. +acknowledging the number of dependencies looking for funding. See [`npm +fund`](/commands/npm-fund) for details. @@ -191,14 +184,13 @@ acknowledging the number of dependencies looking for funding. See * Default: false * Type: Boolean -Indicates that you don't want npm to make any changes and that it -should only report what it would have done. This can be passed into -any of the commands that modify your local installation, eg, -`install`, `update`, `dedupe`, `uninstall`, as well as `pack` and -`publish`. +Indicates that you don't want npm to make any changes and that it should +only report what it would have done. This can be passed into any of the +commands that modify your local installation, eg, `install`, `update`, +`dedupe`, `uninstall`, as well as `pack` and `publish`. -Note: This is NOT honored by other network related commands, eg -`dist-tags`, `owner`, etc. +Note: This is NOT honored by other network related commands, eg `dist-tags`, +`owner`, etc. @@ -207,9 +199,9 @@ Note: This is NOT honored by other network related commands, eg * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -218,9 +210,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -232,14 +224,13 @@ This value is not exported to the environment for child processes. Set to true to run the command in the context of **all** configured workspaces. -Explicitly setting this to false will cause commands like `install` -to ignore workspaces altogether. When not set explicitly: +Explicitly setting this to false will cause commands like `install` to +ignore workspaces altogether. When not set explicitly: -- Commands that operate on the `node_modules` tree (install, update, -etc.) will link workspaces into the `node_modules` folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, _unless_ one or more workspaces are specified in the -`workspace` config. +- Commands that operate on the `node_modules` tree (install, update, etc.) +will link workspaces into the `node_modules` folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +_unless_ one or more workspaces are specified in the `workspace` config. This value is not exported to the environment for child processes. @@ -250,10 +241,9 @@ This value is not exported to the environment for child processes. Include the workspace root when workspaces are enabled for a command. -When false, specifying individual workspaces via the `workspace` -config, or all workspaces via the `workspaces` flag, will cause npm -to operate only on the specified workspaces, and not on the root -project. +When false, specifying individual workspaces via the `workspace` config, or +all workspaces via the `workspaces` flag, will cause npm to operate only on +the specified workspaces, and not on the root project. This value is not exported to the environment for child processes. @@ -262,9 +252,9 @@ This value is not exported to the environment for child processes. * Default: false * Type: Boolean -When set file: protocol dependencies will be packed and installed as -regular dependencies instead of creating a symlink. This option has -no effect on workspaces. +When set file: protocol dependencies will be packed and installed as regular +dependencies instead of creating a symlink. This option has no effect on +workspaces. diff --git a/deps/npm/docs/content/commands/npm-install-test.md b/deps/npm/docs/content/commands/npm-install-test.md index 275405ff5c1ce8..8f958e2b954c21 100644 --- a/deps/npm/docs/content/commands/npm-install-test.md +++ b/deps/npm/docs/content/commands/npm-install-test.md @@ -21,8 +21,7 @@ It takes exactly the same arguments as `npm install`. #### `save` -* Default: `true` unless when using `npm update` where it defaults to - `false` +* Default: `true` unless when using `npm update` where it defaults to `false` * Type: Boolean Save installed packages to a `package.json` file as dependencies. @@ -39,8 +38,8 @@ Will also prevent writing to `package-lock.json` if set to `false`. * Default: false * Type: Boolean -Dependencies saved to package.json will be configured with an exact -version rather than using npm's default semver range operator. +Dependencies saved to package.json will be configured with an exact version +rather than using npm's default semver range operator. @@ -49,13 +48,12 @@ version rather than using npm's default semver range operator. * Default: false * Type: Boolean -Operates in "global" mode, so that packages are installed into the -`prefix` folder instead of the current working directory. See -[folders](/configuring-npm/folders) for more on the differences in -behavior. +Operates in "global" mode, so that packages are installed into the `prefix` +folder instead of the current working directory. See +[folders](/configuring-npm/folders) for more on the differences in behavior. -* packages are installed into the `{prefix}/lib/node_modules` folder, - instead of the current working directory. +* packages are installed into the `{prefix}/lib/node_modules` folder, instead + of the current working directory. * bin files are linked to `{prefix}/bin` * man pages are linked to `{prefix}/share/man` @@ -67,12 +65,11 @@ behavior. * Type: "hoisted", "nested", "shallow", or "linked" Sets the strategy for installing packages in node_modules. hoisted -(default): Install non-duplicated in top-level, and duplicated as -necessary within directory structure. nested: (formerly ---legacy-bundling) install in place, no hoisting. shallow (formerly ---global-style) only install direct deps at top-level. linked: -(experimental) install in node_modules/.store, link in place, -unhoisted. +(default): Install non-duplicated in top-level, and duplicated as necessary +within directory structure. nested: (formerly --legacy-bundling) install in +place, no hoisting. shallow (formerly --global-style) only install direct +deps at top-level. linked: (experimental) install in node_modules/.store, +link in place, unhoisted. @@ -83,10 +80,10 @@ unhoisted. * DEPRECATED: This option has been deprecated in favor of `--install-strategy=nested` -Instead of hoisting package installs in `node_modules`, install -packages in the same manner that they are depended on. This may cause -very deep directory structures and duplicate package installs as -there is no de-duplicating. Sets `--install-strategy=nested`. +Instead of hoisting package installs in `node_modules`, install packages in +the same manner that they are depended on. This may cause very deep +directory structures and duplicate package installs as there is no +de-duplicating. Sets `--install-strategy=nested`. @@ -97,8 +94,8 @@ there is no de-duplicating. Sets `--install-strategy=nested`. * DEPRECATED: This option has been deprecated in favor of `--install-strategy=shallow` -Only install direct dependencies in the top level `node_modules`, but -hoist on deeper dependencies. Sets `--install-strategy=shallow`. +Only install direct dependencies in the top level `node_modules`, but hoist +on deeper dependencies. Sets `--install-strategy=shallow`. @@ -114,29 +111,25 @@ Note that these dependencies _are_ still resolved and added to the `package-lock.json` or `npm-shrinkwrap.json` file. They are just not physically installed on disk. -If a package type appears in both the `--include` and `--omit` lists, -then it will be included. +If a package type appears in both the `--include` and `--omit` lists, then +it will be included. -If the resulting omit list includes `'dev'`, then the `NODE_ENV` -environment variable will be set to `'production'` for all lifecycle -scripts. +If the resulting omit list includes `'dev'`, then the `NODE_ENV` environment +variable will be set to `'production'` for all lifecycle scripts. #### `include` * Default: -* Type: "prod", "dev", "optional", or "peer" (can be set multiple - times) +* Type: "prod", "dev", "optional", or "peer" (can be set multiple times) -Option that allows for defining which types of dependencies to -install. +Option that allows for defining which types of dependencies to install. This is the inverse of `--omit=`. -Dependency types specified in `--include` will not be omitted, -regardless of the order in which omit/include are specified on the -command-line. +Dependency types specified in `--include` will not be omitted, regardless of +the order in which omit/include are specified on the command-line. @@ -146,19 +139,18 @@ command-line. * Type: Boolean If set to `true`, and `--legacy-peer-deps` is not set, then _any_ -conflicting `peerDependencies` will be treated as an install failure, -even if npm could reasonably guess the appropriate resolution based -on non-peer dependency relationships. +conflicting `peerDependencies` will be treated as an install failure, even +if npm could reasonably guess the appropriate resolution based on non-peer +dependency relationships. -By default, conflicting `peerDependencies` deep in the dependency -graph will be resolved using the nearest non-peer dependency -specification, even if doing so will result in some packages -receiving a peer dependency outside the range set in their package's -`peerDependencies` object. +By default, conflicting `peerDependencies` deep in the dependency graph will +be resolved using the nearest non-peer dependency specification, even if +doing so will result in some packages receiving a peer dependency outside +the range set in their package's `peerDependencies` object. -When such an override is performed, a warning is printed, explaining -the conflict and the packages involved. If `--strict-peer-deps` is -set, then this warning is treated as a failure. +When such an override is performed, a warning is printed, explaining the +conflict and the packages involved. If `--strict-peer-deps` is set, then +this warning is treated as a failure. @@ -167,8 +159,8 @@ set, then this warning is treated as a failure. * Default: false * Type: Boolean -Prefer to deduplicate packages if possible, rather than choosing a -newer version of a dependency. +Prefer to deduplicate packages if possible, rather than choosing a newer +version of a dependency. @@ -177,9 +169,8 @@ newer version of a dependency. * Default: true * Type: Boolean -If set to false, then ignore `package-lock.json` files when -installing. This will also prevent _writing_ `package-lock.json` if -`save` is true. +If set to false, then ignore `package-lock.json` files when installing. This +will also prevent _writing_ `package-lock.json` if `save` is true. @@ -188,31 +179,29 @@ installing. This will also prevent _writing_ `package-lock.json` if * Default: false * Type: Boolean -If set to true, the current operation will only use the -`package-lock.json`, ignoring `node_modules`. +If set to true, the current operation will only use the `package-lock.json`, +ignoring `node_modules`. For `update` this means only the `package-lock.json` will be updated, instead of checking `node_modules` and downloading dependencies. -For `list` this means the output will be based on the tree described -by the `package-lock.json`, rather than the contents of -`node_modules`. +For `list` this means the output will be based on the tree described by the +`package-lock.json`, rather than the contents of `node_modules`. #### `foreground-scripts` -* Default: `false` unless when using `npm pack` or `npm publish` where - it defaults to `true` +* Default: `false` unless when using `npm pack` or `npm publish` where it + defaults to `true` * Type: Boolean -Run all build scripts (ie, `preinstall`, `install`, and -`postinstall`) scripts for installed packages in the foreground -process, sharing standard input, output, and error with the main npm -process. +Run all build scripts (ie, `preinstall`, `install`, and `postinstall`) +scripts for installed packages in the foreground process, sharing standard +input, output, and error with the main npm process. -Note that this will generally make installs run slower, and be much -noisier, but can be useful for debugging. +Note that this will generally make installs run slower, and be much noisier, +but can be useful for debugging. @@ -223,10 +212,10 @@ noisier, but can be useful for debugging. If true, npm does not run scripts specified in package.json files. -Note that commands explicitly intended to run a particular script, -such as `npm start`, `npm stop`, `npm restart`, `npm test`, and `npm -run` will still run their intended script if `ignore-scripts` is set, -but they will *not* run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as +`npm start`, `npm stop`, `npm restart`, `npm test`, and `npm run` will still +run their intended script if `ignore-scripts` is set, but they will *not* +run any pre- or post-scripts. @@ -235,10 +224,10 @@ but they will *not* run any pre- or post-scripts. * Default: true * Type: Boolean -When "true" submit audit reports alongside the current npm command to -the default registry and all registries configured for scopes. See -the documentation for [`npm audit`](/commands/npm-audit) for details -on what is submitted. +When "true" submit audit reports alongside the current npm command to the +default registry and all registries configured for scopes. See the +documentation for [`npm audit`](/commands/npm-audit) for details on what is +submitted. @@ -248,14 +237,14 @@ on what is submitted. * Type: null or Date If passed to `npm install`, will rebuild the npm tree such that only -versions that were available **on or before** the given date are -installed. If there are no versions available for the current set of -dependencies, the command will error. +versions that were available **on or before** the given date are installed. +If there are no versions available for the current set of dependencies, the +command will error. -If the requested version is a `dist-tag` and the given tag does not -pass the `--before` filter, the most recent version less than or -equal to that tag will be used. For example, `foo@latest` might -install `foo@1.2` even though `latest` is `2.0`. +If the requested version is a `dist-tag` and the given tag does not pass the +`--before` filter, the most recent version less than or equal to that tag +will be used. For example, `foo@latest` might install `foo@1.2` even though +`latest` is `2.0`. @@ -267,9 +256,9 @@ install `foo@1.2` even though `latest` is `2.0`. Tells npm to create symlinks (or `.cmd` shims on Windows) for package executables. -Set to false to have it not do this. This can be used to work around -the fact that some file systems don't support symlinks, even on -ostensibly Unix systems. +Set to false to have it not do this. This can be used to work around the +fact that some file systems don't support symlinks, even on ostensibly Unix +systems. @@ -279,8 +268,8 @@ ostensibly Unix systems. * Type: Boolean When "true" displays the message at the end of each `npm install` -acknowledging the number of dependencies looking for funding. See -[`npm fund`](/commands/npm-fund) for details. +acknowledging the number of dependencies looking for funding. See [`npm +fund`](/commands/npm-fund) for details. @@ -289,14 +278,13 @@ acknowledging the number of dependencies looking for funding. See * Default: false * Type: Boolean -Indicates that you don't want npm to make any changes and that it -should only report what it would have done. This can be passed into -any of the commands that modify your local installation, eg, -`install`, `update`, `dedupe`, `uninstall`, as well as `pack` and -`publish`. +Indicates that you don't want npm to make any changes and that it should +only report what it would have done. This can be passed into any of the +commands that modify your local installation, eg, `install`, `update`, +`dedupe`, `uninstall`, as well as `pack` and `publish`. -Note: This is NOT honored by other network related commands, eg -`dist-tags`, `owner`, etc. +Note: This is NOT honored by other network related commands, eg `dist-tags`, +`owner`, etc. @@ -305,9 +293,8 @@ Note: This is NOT honored by other network related commands, eg * Default: null * Type: null or String -Override CPU architecture of native modules to install. Acceptable -values are same as `cpu` field of package.json, which comes from -`process.arch`. +Override CPU architecture of native modules to install. Acceptable values +are same as `cpu` field of package.json, which comes from `process.arch`. @@ -316,8 +303,8 @@ values are same as `cpu` field of package.json, which comes from * Default: null * Type: null or String -Override OS of native modules to install. Acceptable values are same -as `os` field of package.json, which comes from `process.platform`. +Override OS of native modules to install. Acceptable values are same as `os` +field of package.json, which comes from `process.platform`. @@ -326,8 +313,8 @@ as `os` field of package.json, which comes from `process.platform`. * Default: null * Type: null or String -Override libc of native modules to install. Acceptable values are -same as `libc` field of package.json +Override libc of native modules to install. Acceptable values are same as +`libc` field of package.json @@ -336,9 +323,9 @@ same as `libc` field of package.json * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -347,9 +334,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -361,14 +348,13 @@ This value is not exported to the environment for child processes. Set to true to run the command in the context of **all** configured workspaces. -Explicitly setting this to false will cause commands like `install` -to ignore workspaces altogether. When not set explicitly: +Explicitly setting this to false will cause commands like `install` to +ignore workspaces altogether. When not set explicitly: -- Commands that operate on the `node_modules` tree (install, update, -etc.) will link workspaces into the `node_modules` folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, _unless_ one or more workspaces are specified in the -`workspace` config. +- Commands that operate on the `node_modules` tree (install, update, etc.) +will link workspaces into the `node_modules` folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +_unless_ one or more workspaces are specified in the `workspace` config. This value is not exported to the environment for child processes. @@ -379,10 +365,9 @@ This value is not exported to the environment for child processes. Include the workspace root when workspaces are enabled for a command. -When false, specifying individual workspaces via the `workspace` -config, or all workspaces via the `workspaces` flag, will cause npm -to operate only on the specified workspaces, and not on the root -project. +When false, specifying individual workspaces via the `workspace` config, or +all workspaces via the `workspaces` flag, will cause npm to operate only on +the specified workspaces, and not on the root project. This value is not exported to the environment for child processes. @@ -391,9 +376,9 @@ This value is not exported to the environment for child processes. * Default: false * Type: Boolean -When set file: protocol dependencies will be packed and installed as -regular dependencies instead of creating a symlink. This option has -no effect on workspaces. +When set file: protocol dependencies will be packed and installed as regular +dependencies instead of creating a symlink. This option has no effect on +workspaces. diff --git a/deps/npm/docs/content/commands/npm-install.md b/deps/npm/docs/content/commands/npm-install.md index edb71938893eda..cb7f45102577ab 100644 --- a/deps/npm/docs/content/commands/npm-install.md +++ b/deps/npm/docs/content/commands/npm-install.md @@ -338,8 +338,7 @@ These are some of the most common options related to installation. #### `save` -* Default: `true` unless when using `npm update` where it defaults to - `false` +* Default: `true` unless when using `npm update` where it defaults to `false` * Type: Boolean Save installed packages to a `package.json` file as dependencies. @@ -356,8 +355,8 @@ Will also prevent writing to `package-lock.json` if set to `false`. * Default: false * Type: Boolean -Dependencies saved to package.json will be configured with an exact -version rather than using npm's default semver range operator. +Dependencies saved to package.json will be configured with an exact version +rather than using npm's default semver range operator. @@ -366,13 +365,12 @@ version rather than using npm's default semver range operator. * Default: false * Type: Boolean -Operates in "global" mode, so that packages are installed into the -`prefix` folder instead of the current working directory. See -[folders](/configuring-npm/folders) for more on the differences in -behavior. +Operates in "global" mode, so that packages are installed into the `prefix` +folder instead of the current working directory. See +[folders](/configuring-npm/folders) for more on the differences in behavior. -* packages are installed into the `{prefix}/lib/node_modules` folder, - instead of the current working directory. +* packages are installed into the `{prefix}/lib/node_modules` folder, instead + of the current working directory. * bin files are linked to `{prefix}/bin` * man pages are linked to `{prefix}/share/man` @@ -384,12 +382,11 @@ behavior. * Type: "hoisted", "nested", "shallow", or "linked" Sets the strategy for installing packages in node_modules. hoisted -(default): Install non-duplicated in top-level, and duplicated as -necessary within directory structure. nested: (formerly ---legacy-bundling) install in place, no hoisting. shallow (formerly ---global-style) only install direct deps at top-level. linked: -(experimental) install in node_modules/.store, link in place, -unhoisted. +(default): Install non-duplicated in top-level, and duplicated as necessary +within directory structure. nested: (formerly --legacy-bundling) install in +place, no hoisting. shallow (formerly --global-style) only install direct +deps at top-level. linked: (experimental) install in node_modules/.store, +link in place, unhoisted. @@ -400,10 +397,10 @@ unhoisted. * DEPRECATED: This option has been deprecated in favor of `--install-strategy=nested` -Instead of hoisting package installs in `node_modules`, install -packages in the same manner that they are depended on. This may cause -very deep directory structures and duplicate package installs as -there is no de-duplicating. Sets `--install-strategy=nested`. +Instead of hoisting package installs in `node_modules`, install packages in +the same manner that they are depended on. This may cause very deep +directory structures and duplicate package installs as there is no +de-duplicating. Sets `--install-strategy=nested`. @@ -414,8 +411,8 @@ there is no de-duplicating. Sets `--install-strategy=nested`. * DEPRECATED: This option has been deprecated in favor of `--install-strategy=shallow` -Only install direct dependencies in the top level `node_modules`, but -hoist on deeper dependencies. Sets `--install-strategy=shallow`. +Only install direct dependencies in the top level `node_modules`, but hoist +on deeper dependencies. Sets `--install-strategy=shallow`. @@ -431,29 +428,25 @@ Note that these dependencies _are_ still resolved and added to the `package-lock.json` or `npm-shrinkwrap.json` file. They are just not physically installed on disk. -If a package type appears in both the `--include` and `--omit` lists, -then it will be included. +If a package type appears in both the `--include` and `--omit` lists, then +it will be included. -If the resulting omit list includes `'dev'`, then the `NODE_ENV` -environment variable will be set to `'production'` for all lifecycle -scripts. +If the resulting omit list includes `'dev'`, then the `NODE_ENV` environment +variable will be set to `'production'` for all lifecycle scripts. #### `include` * Default: -* Type: "prod", "dev", "optional", or "peer" (can be set multiple - times) +* Type: "prod", "dev", "optional", or "peer" (can be set multiple times) -Option that allows for defining which types of dependencies to -install. +Option that allows for defining which types of dependencies to install. This is the inverse of `--omit=`. -Dependency types specified in `--include` will not be omitted, -regardless of the order in which omit/include are specified on the -command-line. +Dependency types specified in `--include` will not be omitted, regardless of +the order in which omit/include are specified on the command-line. @@ -463,19 +456,18 @@ command-line. * Type: Boolean If set to `true`, and `--legacy-peer-deps` is not set, then _any_ -conflicting `peerDependencies` will be treated as an install failure, -even if npm could reasonably guess the appropriate resolution based -on non-peer dependency relationships. +conflicting `peerDependencies` will be treated as an install failure, even +if npm could reasonably guess the appropriate resolution based on non-peer +dependency relationships. -By default, conflicting `peerDependencies` deep in the dependency -graph will be resolved using the nearest non-peer dependency -specification, even if doing so will result in some packages -receiving a peer dependency outside the range set in their package's -`peerDependencies` object. +By default, conflicting `peerDependencies` deep in the dependency graph will +be resolved using the nearest non-peer dependency specification, even if +doing so will result in some packages receiving a peer dependency outside +the range set in their package's `peerDependencies` object. -When such an override is performed, a warning is printed, explaining -the conflict and the packages involved. If `--strict-peer-deps` is -set, then this warning is treated as a failure. +When such an override is performed, a warning is printed, explaining the +conflict and the packages involved. If `--strict-peer-deps` is set, then +this warning is treated as a failure. @@ -484,8 +476,8 @@ set, then this warning is treated as a failure. * Default: false * Type: Boolean -Prefer to deduplicate packages if possible, rather than choosing a -newer version of a dependency. +Prefer to deduplicate packages if possible, rather than choosing a newer +version of a dependency. @@ -494,9 +486,8 @@ newer version of a dependency. * Default: true * Type: Boolean -If set to false, then ignore `package-lock.json` files when -installing. This will also prevent _writing_ `package-lock.json` if -`save` is true. +If set to false, then ignore `package-lock.json` files when installing. This +will also prevent _writing_ `package-lock.json` if `save` is true. @@ -505,31 +496,29 @@ installing. This will also prevent _writing_ `package-lock.json` if * Default: false * Type: Boolean -If set to true, the current operation will only use the -`package-lock.json`, ignoring `node_modules`. +If set to true, the current operation will only use the `package-lock.json`, +ignoring `node_modules`. For `update` this means only the `package-lock.json` will be updated, instead of checking `node_modules` and downloading dependencies. -For `list` this means the output will be based on the tree described -by the `package-lock.json`, rather than the contents of -`node_modules`. +For `list` this means the output will be based on the tree described by the +`package-lock.json`, rather than the contents of `node_modules`. #### `foreground-scripts` -* Default: `false` unless when using `npm pack` or `npm publish` where - it defaults to `true` +* Default: `false` unless when using `npm pack` or `npm publish` where it + defaults to `true` * Type: Boolean -Run all build scripts (ie, `preinstall`, `install`, and -`postinstall`) scripts for installed packages in the foreground -process, sharing standard input, output, and error with the main npm -process. +Run all build scripts (ie, `preinstall`, `install`, and `postinstall`) +scripts for installed packages in the foreground process, sharing standard +input, output, and error with the main npm process. -Note that this will generally make installs run slower, and be much -noisier, but can be useful for debugging. +Note that this will generally make installs run slower, and be much noisier, +but can be useful for debugging. @@ -540,10 +529,10 @@ noisier, but can be useful for debugging. If true, npm does not run scripts specified in package.json files. -Note that commands explicitly intended to run a particular script, -such as `npm start`, `npm stop`, `npm restart`, `npm test`, and `npm -run` will still run their intended script if `ignore-scripts` is set, -but they will *not* run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as +`npm start`, `npm stop`, `npm restart`, `npm test`, and `npm run` will still +run their intended script if `ignore-scripts` is set, but they will *not* +run any pre- or post-scripts. @@ -552,10 +541,10 @@ but they will *not* run any pre- or post-scripts. * Default: true * Type: Boolean -When "true" submit audit reports alongside the current npm command to -the default registry and all registries configured for scopes. See -the documentation for [`npm audit`](/commands/npm-audit) for details -on what is submitted. +When "true" submit audit reports alongside the current npm command to the +default registry and all registries configured for scopes. See the +documentation for [`npm audit`](/commands/npm-audit) for details on what is +submitted. @@ -565,14 +554,14 @@ on what is submitted. * Type: null or Date If passed to `npm install`, will rebuild the npm tree such that only -versions that were available **on or before** the given date are -installed. If there are no versions available for the current set of -dependencies, the command will error. +versions that were available **on or before** the given date are installed. +If there are no versions available for the current set of dependencies, the +command will error. -If the requested version is a `dist-tag` and the given tag does not -pass the `--before` filter, the most recent version less than or -equal to that tag will be used. For example, `foo@latest` might -install `foo@1.2` even though `latest` is `2.0`. +If the requested version is a `dist-tag` and the given tag does not pass the +`--before` filter, the most recent version less than or equal to that tag +will be used. For example, `foo@latest` might install `foo@1.2` even though +`latest` is `2.0`. @@ -584,9 +573,9 @@ install `foo@1.2` even though `latest` is `2.0`. Tells npm to create symlinks (or `.cmd` shims on Windows) for package executables. -Set to false to have it not do this. This can be used to work around -the fact that some file systems don't support symlinks, even on -ostensibly Unix systems. +Set to false to have it not do this. This can be used to work around the +fact that some file systems don't support symlinks, even on ostensibly Unix +systems. @@ -596,8 +585,8 @@ ostensibly Unix systems. * Type: Boolean When "true" displays the message at the end of each `npm install` -acknowledging the number of dependencies looking for funding. See -[`npm fund`](/commands/npm-fund) for details. +acknowledging the number of dependencies looking for funding. See [`npm +fund`](/commands/npm-fund) for details. @@ -606,14 +595,13 @@ acknowledging the number of dependencies looking for funding. See * Default: false * Type: Boolean -Indicates that you don't want npm to make any changes and that it -should only report what it would have done. This can be passed into -any of the commands that modify your local installation, eg, -`install`, `update`, `dedupe`, `uninstall`, as well as `pack` and -`publish`. +Indicates that you don't want npm to make any changes and that it should +only report what it would have done. This can be passed into any of the +commands that modify your local installation, eg, `install`, `update`, +`dedupe`, `uninstall`, as well as `pack` and `publish`. -Note: This is NOT honored by other network related commands, eg -`dist-tags`, `owner`, etc. +Note: This is NOT honored by other network related commands, eg `dist-tags`, +`owner`, etc. @@ -622,9 +610,8 @@ Note: This is NOT honored by other network related commands, eg * Default: null * Type: null or String -Override CPU architecture of native modules to install. Acceptable -values are same as `cpu` field of package.json, which comes from -`process.arch`. +Override CPU architecture of native modules to install. Acceptable values +are same as `cpu` field of package.json, which comes from `process.arch`. @@ -633,8 +620,8 @@ values are same as `cpu` field of package.json, which comes from * Default: null * Type: null or String -Override OS of native modules to install. Acceptable values are same -as `os` field of package.json, which comes from `process.platform`. +Override OS of native modules to install. Acceptable values are same as `os` +field of package.json, which comes from `process.platform`. @@ -643,8 +630,8 @@ as `os` field of package.json, which comes from `process.platform`. * Default: null * Type: null or String -Override libc of native modules to install. Acceptable values are -same as `libc` field of package.json +Override libc of native modules to install. Acceptable values are same as +`libc` field of package.json @@ -653,9 +640,9 @@ same as `libc` field of package.json * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -664,9 +651,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -678,14 +665,13 @@ This value is not exported to the environment for child processes. Set to true to run the command in the context of **all** configured workspaces. -Explicitly setting this to false will cause commands like `install` -to ignore workspaces altogether. When not set explicitly: +Explicitly setting this to false will cause commands like `install` to +ignore workspaces altogether. When not set explicitly: -- Commands that operate on the `node_modules` tree (install, update, -etc.) will link workspaces into the `node_modules` folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, _unless_ one or more workspaces are specified in the -`workspace` config. +- Commands that operate on the `node_modules` tree (install, update, etc.) +will link workspaces into the `node_modules` folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +_unless_ one or more workspaces are specified in the `workspace` config. This value is not exported to the environment for child processes. @@ -696,10 +682,9 @@ This value is not exported to the environment for child processes. Include the workspace root when workspaces are enabled for a command. -When false, specifying individual workspaces via the `workspace` -config, or all workspaces via the `workspaces` flag, will cause npm -to operate only on the specified workspaces, and not on the root -project. +When false, specifying individual workspaces via the `workspace` config, or +all workspaces via the `workspaces` flag, will cause npm to operate only on +the specified workspaces, and not on the root project. This value is not exported to the environment for child processes. @@ -708,9 +693,9 @@ This value is not exported to the environment for child processes. * Default: false * Type: Boolean -When set file: protocol dependencies will be packed and installed as -regular dependencies instead of creating a symlink. This option has -no effect on workspaces. +When set file: protocol dependencies will be packed and installed as regular +dependencies instead of creating a symlink. This option has no effect on +workspaces. diff --git a/deps/npm/docs/content/commands/npm-link.md b/deps/npm/docs/content/commands/npm-link.md index 527c646c09adac..3e978bf128e0b9 100644 --- a/deps/npm/docs/content/commands/npm-link.md +++ b/deps/npm/docs/content/commands/npm-link.md @@ -91,8 +91,7 @@ Note that It may actually be linked into the parent project's `node_modules` fol #### `save` -* Default: `true` unless when using `npm update` where it defaults to - `false` +* Default: `true` unless when using `npm update` where it defaults to `false` * Type: Boolean Save installed packages to a `package.json` file as dependencies. @@ -109,8 +108,8 @@ Will also prevent writing to `package-lock.json` if set to `false`. * Default: false * Type: Boolean -Dependencies saved to package.json will be configured with an exact -version rather than using npm's default semver range operator. +Dependencies saved to package.json will be configured with an exact version +rather than using npm's default semver range operator. @@ -119,13 +118,12 @@ version rather than using npm's default semver range operator. * Default: false * Type: Boolean -Operates in "global" mode, so that packages are installed into the -`prefix` folder instead of the current working directory. See -[folders](/configuring-npm/folders) for more on the differences in -behavior. +Operates in "global" mode, so that packages are installed into the `prefix` +folder instead of the current working directory. See +[folders](/configuring-npm/folders) for more on the differences in behavior. -* packages are installed into the `{prefix}/lib/node_modules` folder, - instead of the current working directory. +* packages are installed into the `{prefix}/lib/node_modules` folder, instead + of the current working directory. * bin files are linked to `{prefix}/bin` * man pages are linked to `{prefix}/share/man` @@ -137,12 +135,11 @@ behavior. * Type: "hoisted", "nested", "shallow", or "linked" Sets the strategy for installing packages in node_modules. hoisted -(default): Install non-duplicated in top-level, and duplicated as -necessary within directory structure. nested: (formerly ---legacy-bundling) install in place, no hoisting. shallow (formerly ---global-style) only install direct deps at top-level. linked: -(experimental) install in node_modules/.store, link in place, -unhoisted. +(default): Install non-duplicated in top-level, and duplicated as necessary +within directory structure. nested: (formerly --legacy-bundling) install in +place, no hoisting. shallow (formerly --global-style) only install direct +deps at top-level. linked: (experimental) install in node_modules/.store, +link in place, unhoisted. @@ -153,10 +150,10 @@ unhoisted. * DEPRECATED: This option has been deprecated in favor of `--install-strategy=nested` -Instead of hoisting package installs in `node_modules`, install -packages in the same manner that they are depended on. This may cause -very deep directory structures and duplicate package installs as -there is no de-duplicating. Sets `--install-strategy=nested`. +Instead of hoisting package installs in `node_modules`, install packages in +the same manner that they are depended on. This may cause very deep +directory structures and duplicate package installs as there is no +de-duplicating. Sets `--install-strategy=nested`. @@ -167,8 +164,8 @@ there is no de-duplicating. Sets `--install-strategy=nested`. * DEPRECATED: This option has been deprecated in favor of `--install-strategy=shallow` -Only install direct dependencies in the top level `node_modules`, but -hoist on deeper dependencies. Sets `--install-strategy=shallow`. +Only install direct dependencies in the top level `node_modules`, but hoist +on deeper dependencies. Sets `--install-strategy=shallow`. @@ -178,19 +175,18 @@ hoist on deeper dependencies. Sets `--install-strategy=shallow`. * Type: Boolean If set to `true`, and `--legacy-peer-deps` is not set, then _any_ -conflicting `peerDependencies` will be treated as an install failure, -even if npm could reasonably guess the appropriate resolution based -on non-peer dependency relationships. +conflicting `peerDependencies` will be treated as an install failure, even +if npm could reasonably guess the appropriate resolution based on non-peer +dependency relationships. -By default, conflicting `peerDependencies` deep in the dependency -graph will be resolved using the nearest non-peer dependency -specification, even if doing so will result in some packages -receiving a peer dependency outside the range set in their package's -`peerDependencies` object. +By default, conflicting `peerDependencies` deep in the dependency graph will +be resolved using the nearest non-peer dependency specification, even if +doing so will result in some packages receiving a peer dependency outside +the range set in their package's `peerDependencies` object. -When such an override is performed, a warning is printed, explaining -the conflict and the packages involved. If `--strict-peer-deps` is -set, then this warning is treated as a failure. +When such an override is performed, a warning is printed, explaining the +conflict and the packages involved. If `--strict-peer-deps` is set, then +this warning is treated as a failure. @@ -199,9 +195,8 @@ set, then this warning is treated as a failure. * Default: true * Type: Boolean -If set to false, then ignore `package-lock.json` files when -installing. This will also prevent _writing_ `package-lock.json` if -`save` is true. +If set to false, then ignore `package-lock.json` files when installing. This +will also prevent _writing_ `package-lock.json` if `save` is true. @@ -217,29 +212,25 @@ Note that these dependencies _are_ still resolved and added to the `package-lock.json` or `npm-shrinkwrap.json` file. They are just not physically installed on disk. -If a package type appears in both the `--include` and `--omit` lists, -then it will be included. +If a package type appears in both the `--include` and `--omit` lists, then +it will be included. -If the resulting omit list includes `'dev'`, then the `NODE_ENV` -environment variable will be set to `'production'` for all lifecycle -scripts. +If the resulting omit list includes `'dev'`, then the `NODE_ENV` environment +variable will be set to `'production'` for all lifecycle scripts. #### `include` * Default: -* Type: "prod", "dev", "optional", or "peer" (can be set multiple - times) +* Type: "prod", "dev", "optional", or "peer" (can be set multiple times) -Option that allows for defining which types of dependencies to -install. +Option that allows for defining which types of dependencies to install. This is the inverse of `--omit=`. -Dependency types specified in `--include` will not be omitted, -regardless of the order in which omit/include are specified on the -command-line. +Dependency types specified in `--include` will not be omitted, regardless of +the order in which omit/include are specified on the command-line. @@ -250,10 +241,10 @@ command-line. If true, npm does not run scripts specified in package.json files. -Note that commands explicitly intended to run a particular script, -such as `npm start`, `npm stop`, `npm restart`, `npm test`, and `npm -run` will still run their intended script if `ignore-scripts` is set, -but they will *not* run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as +`npm start`, `npm stop`, `npm restart`, `npm test`, and `npm run` will still +run their intended script if `ignore-scripts` is set, but they will *not* +run any pre- or post-scripts. @@ -262,10 +253,10 @@ but they will *not* run any pre- or post-scripts. * Default: true * Type: Boolean -When "true" submit audit reports alongside the current npm command to -the default registry and all registries configured for scopes. See -the documentation for [`npm audit`](/commands/npm-audit) for details -on what is submitted. +When "true" submit audit reports alongside the current npm command to the +default registry and all registries configured for scopes. See the +documentation for [`npm audit`](/commands/npm-audit) for details on what is +submitted. @@ -277,9 +268,9 @@ on what is submitted. Tells npm to create symlinks (or `.cmd` shims on Windows) for package executables. -Set to false to have it not do this. This can be used to work around -the fact that some file systems don't support symlinks, even on -ostensibly Unix systems. +Set to false to have it not do this. This can be used to work around the +fact that some file systems don't support symlinks, even on ostensibly Unix +systems. @@ -289,8 +280,8 @@ ostensibly Unix systems. * Type: Boolean When "true" displays the message at the end of each `npm install` -acknowledging the number of dependencies looking for funding. See -[`npm fund`](/commands/npm-fund) for details. +acknowledging the number of dependencies looking for funding. See [`npm +fund`](/commands/npm-fund) for details. @@ -299,14 +290,13 @@ acknowledging the number of dependencies looking for funding. See * Default: false * Type: Boolean -Indicates that you don't want npm to make any changes and that it -should only report what it would have done. This can be passed into -any of the commands that modify your local installation, eg, -`install`, `update`, `dedupe`, `uninstall`, as well as `pack` and -`publish`. +Indicates that you don't want npm to make any changes and that it should +only report what it would have done. This can be passed into any of the +commands that modify your local installation, eg, `install`, `update`, +`dedupe`, `uninstall`, as well as `pack` and `publish`. -Note: This is NOT honored by other network related commands, eg -`dist-tags`, `owner`, etc. +Note: This is NOT honored by other network related commands, eg `dist-tags`, +`owner`, etc. @@ -315,9 +305,9 @@ Note: This is NOT honored by other network related commands, eg * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -326,9 +316,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -340,14 +330,13 @@ This value is not exported to the environment for child processes. Set to true to run the command in the context of **all** configured workspaces. -Explicitly setting this to false will cause commands like `install` -to ignore workspaces altogether. When not set explicitly: +Explicitly setting this to false will cause commands like `install` to +ignore workspaces altogether. When not set explicitly: -- Commands that operate on the `node_modules` tree (install, update, -etc.) will link workspaces into the `node_modules` folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, _unless_ one or more workspaces are specified in the -`workspace` config. +- Commands that operate on the `node_modules` tree (install, update, etc.) +will link workspaces into the `node_modules` folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +_unless_ one or more workspaces are specified in the `workspace` config. This value is not exported to the environment for child processes. @@ -358,10 +347,9 @@ This value is not exported to the environment for child processes. Include the workspace root when workspaces are enabled for a command. -When false, specifying individual workspaces via the `workspace` -config, or all workspaces via the `workspaces` flag, will cause npm -to operate only on the specified workspaces, and not on the root -project. +When false, specifying individual workspaces via the `workspace` config, or +all workspaces via the `workspaces` flag, will cause npm to operate only on +the specified workspaces, and not on the root project. This value is not exported to the environment for child processes. @@ -370,9 +358,9 @@ This value is not exported to the environment for child processes. * Default: false * Type: Boolean -When set file: protocol dependencies will be packed and installed as -regular dependencies instead of creating a symlink. This option has -no effect on workspaces. +When set file: protocol dependencies will be packed and installed as regular +dependencies instead of creating a symlink. This option has no effect on +workspaces. diff --git a/deps/npm/docs/content/commands/npm-login.md b/deps/npm/docs/content/commands/npm-login.md index 7738dc2c15c62d..59b24b6ad7ad86 100644 --- a/deps/npm/docs/content/commands/npm-login.md +++ b/deps/npm/docs/content/commands/npm-login.md @@ -77,8 +77,8 @@ npm init --scope=@foo --yes * Default: "web" * Type: "legacy" or "web" -What authentication strategy to use with `login`. Note that if an -`otp` config is given, this value will always be set to `legacy`. +What authentication strategy to use with `login`. Note that if an `otp` +config is given, this value will always be set to `legacy`. diff --git a/deps/npm/docs/content/commands/npm-ls.md b/deps/npm/docs/content/commands/npm-ls.md index 1d57122b828b41..dacee9be9200cb 100644 --- a/deps/npm/docs/content/commands/npm-ls.md +++ b/deps/npm/docs/content/commands/npm-ls.md @@ -23,7 +23,7 @@ Note that nested packages will *also* show the paths to the specified packages. For example, running `npm ls promzard` in npm's source tree will show: ```bash -npm@11.6.2 /path/to/npm +npm@11.6.3 /path/to/npm └─┬ init-package-json@0.0.4 └── promzard@0.1.5 ``` @@ -43,9 +43,9 @@ When run as `ll` or `la`, it shows extended information by default. * Default: false * Type: Boolean -When running `npm outdated` and `npm ls`, setting `--all` will show -all outdated or installed packages, rather than only those directly -depended upon by the current project. +When running `npm outdated` and `npm ls`, setting `--all` will show all +outdated or installed packages, rather than only those directly depended +upon by the current project. @@ -56,8 +56,8 @@ depended upon by the current project. Whether or not to output JSON data, rather than the normal output. -* In `npm pkg set` it enables parsing set values with JSON.parse() - before saving them to your `package.json`. +* In `npm pkg set` it enables parsing set values with JSON.parse() before + saving them to your `package.json`. Not supported by all npm commands. @@ -77,8 +77,8 @@ Show extended information in `ls`, `search`, and `help-search`. * Default: false * Type: Boolean -Output parseable results from commands that write to standard output. -For `npm search`, this will be tab-separated table format. +Output parseable results from commands that write to standard output. For +`npm search`, this will be tab-separated table format. @@ -87,13 +87,12 @@ For `npm search`, this will be tab-separated table format. * Default: false * Type: Boolean -Operates in "global" mode, so that packages are installed into the -`prefix` folder instead of the current working directory. See -[folders](/configuring-npm/folders) for more on the differences in -behavior. +Operates in "global" mode, so that packages are installed into the `prefix` +folder instead of the current working directory. See +[folders](/configuring-npm/folders) for more on the differences in behavior. -* packages are installed into the `{prefix}/lib/node_modules` folder, - instead of the current working directory. +* packages are installed into the `{prefix}/lib/node_modules` folder, instead + of the current working directory. * bin files are linked to `{prefix}/bin` * man pages are linked to `{prefix}/share/man` @@ -106,9 +105,8 @@ behavior. The depth to go when recursing packages for `npm ls`. -If not set, `npm ls` will show only the immediate dependencies of the -root project. If `--all` is set, then npm will show all dependencies -by default. +If not set, `npm ls` will show only the immediate dependencies of the root +project. If `--all` is set, then npm will show all dependencies by default. @@ -124,29 +122,25 @@ Note that these dependencies _are_ still resolved and added to the `package-lock.json` or `npm-shrinkwrap.json` file. They are just not physically installed on disk. -If a package type appears in both the `--include` and `--omit` lists, -then it will be included. +If a package type appears in both the `--include` and `--omit` lists, then +it will be included. -If the resulting omit list includes `'dev'`, then the `NODE_ENV` -environment variable will be set to `'production'` for all lifecycle -scripts. +If the resulting omit list includes `'dev'`, then the `NODE_ENV` environment +variable will be set to `'production'` for all lifecycle scripts. #### `include` * Default: -* Type: "prod", "dev", "optional", or "peer" (can be set multiple - times) +* Type: "prod", "dev", "optional", or "peer" (can be set multiple times) -Option that allows for defining which types of dependencies to -install. +Option that allows for defining which types of dependencies to install. This is the inverse of `--omit=`. -Dependency types specified in `--include` will not be omitted, -regardless of the order in which omit/include are specified on the -command-line. +Dependency types specified in `--include` will not be omitted, regardless of +the order in which omit/include are specified on the command-line. @@ -155,8 +149,7 @@ command-line. * Default: false * Type: Boolean -Used with `npm ls`, limiting output to only those packages that are -linked. +Used with `npm ls`, limiting output to only those packages that are linked. @@ -165,27 +158,25 @@ linked. * Default: false * Type: Boolean -If set to true, the current operation will only use the -`package-lock.json`, ignoring `node_modules`. +If set to true, the current operation will only use the `package-lock.json`, +ignoring `node_modules`. For `update` this means only the `package-lock.json` will be updated, instead of checking `node_modules` and downloading dependencies. -For `list` this means the output will be based on the tree described -by the `package-lock.json`, rather than the contents of -`node_modules`. +For `list` this means the output will be based on the tree described by the +`package-lock.json`, rather than the contents of `node_modules`. #### `unicode` -* Default: false on windows, true on mac/unix systems with a unicode - locale, as defined by the `LC_ALL`, `LC_CTYPE`, or `LANG` environment - variables. +* Default: false on windows, true on mac/unix systems with a unicode locale, + as defined by the `LC_ALL`, `LC_CTYPE`, or `LANG` environment variables. * Type: Boolean -When set to true, npm uses unicode characters in the tree output. -When false, it uses ascii characters instead of unicode glyphs. +When set to true, npm uses unicode characters in the tree output. When +false, it uses ascii characters instead of unicode glyphs. @@ -194,9 +185,9 @@ When false, it uses ascii characters instead of unicode glyphs. * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -205,9 +196,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -219,14 +210,13 @@ This value is not exported to the environment for child processes. Set to true to run the command in the context of **all** configured workspaces. -Explicitly setting this to false will cause commands like `install` -to ignore workspaces altogether. When not set explicitly: +Explicitly setting this to false will cause commands like `install` to +ignore workspaces altogether. When not set explicitly: -- Commands that operate on the `node_modules` tree (install, update, -etc.) will link workspaces into the `node_modules` folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, _unless_ one or more workspaces are specified in the -`workspace` config. +- Commands that operate on the `node_modules` tree (install, update, etc.) +will link workspaces into the `node_modules` folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +_unless_ one or more workspaces are specified in the `workspace` config. This value is not exported to the environment for child processes. @@ -237,10 +227,9 @@ This value is not exported to the environment for child processes. Include the workspace root when workspaces are enabled for a command. -When false, specifying individual workspaces via the `workspace` -config, or all workspaces via the `workspaces` flag, will cause npm -to operate only on the specified workspaces, and not on the root -project. +When false, specifying individual workspaces via the `workspace` config, or +all workspaces via the `workspaces` flag, will cause npm to operate only on +the specified workspaces, and not on the root project. This value is not exported to the environment for child processes. @@ -249,9 +238,9 @@ This value is not exported to the environment for child processes. * Default: false * Type: Boolean -When set file: protocol dependencies will be packed and installed as -regular dependencies instead of creating a symlink. This option has -no effect on workspaces. +When set file: protocol dependencies will be packed and installed as regular +dependencies instead of creating a symlink. This option has no effect on +workspaces. diff --git a/deps/npm/docs/content/commands/npm-org.md b/deps/npm/docs/content/commands/npm-org.md index 54ad8822660e3d..40cafafe6052af 100644 --- a/deps/npm/docs/content/commands/npm-org.md +++ b/deps/npm/docs/content/commands/npm-org.md @@ -75,12 +75,11 @@ The base URL of the npm registry. * Default: null * Type: null or String -This is a one-time password from a two-factor authenticator. It's -needed when publishing or changing package permissions with `npm -access`. +This is a one-time password from a two-factor authenticator. It's needed +when publishing or changing package permissions with `npm access`. -If not set, and a registry response fails with a challenge for a -one-time password, npm will prompt on the command line for one. +If not set, and a registry response fails with a challenge for a one-time +password, npm will prompt on the command line for one. @@ -91,8 +90,8 @@ one-time password, npm will prompt on the command line for one. Whether or not to output JSON data, rather than the normal output. -* In `npm pkg set` it enables parsing set values with JSON.parse() - before saving them to your `package.json`. +* In `npm pkg set` it enables parsing set values with JSON.parse() before + saving them to your `package.json`. Not supported by all npm commands. @@ -103,8 +102,8 @@ Not supported by all npm commands. * Default: false * Type: Boolean -Output parseable results from commands that write to standard output. -For `npm search`, this will be tab-separated table format. +Output parseable results from commands that write to standard output. For +`npm search`, this will be tab-separated table format. diff --git a/deps/npm/docs/content/commands/npm-outdated.md b/deps/npm/docs/content/commands/npm-outdated.md index 89e9a6ae849c28..d6aa3eb53a79a5 100644 --- a/deps/npm/docs/content/commands/npm-outdated.md +++ b/deps/npm/docs/content/commands/npm-outdated.md @@ -73,9 +73,9 @@ A few things to note: * Default: false * Type: Boolean -When running `npm outdated` and `npm ls`, setting `--all` will show -all outdated or installed packages, rather than only those directly -depended upon by the current project. +When running `npm outdated` and `npm ls`, setting `--all` will show all +outdated or installed packages, rather than only those directly depended +upon by the current project. @@ -86,8 +86,8 @@ depended upon by the current project. Whether or not to output JSON data, rather than the normal output. -* In `npm pkg set` it enables parsing set values with JSON.parse() - before saving them to your `package.json`. +* In `npm pkg set` it enables parsing set values with JSON.parse() before + saving them to your `package.json`. Not supported by all npm commands. @@ -107,8 +107,8 @@ Show extended information in `ls`, `search`, and `help-search`. * Default: false * Type: Boolean -Output parseable results from commands that write to standard output. -For `npm search`, this will be tab-separated table format. +Output parseable results from commands that write to standard output. For +`npm search`, this will be tab-separated table format. @@ -117,13 +117,12 @@ For `npm search`, this will be tab-separated table format. * Default: false * Type: Boolean -Operates in "global" mode, so that packages are installed into the -`prefix` folder instead of the current working directory. See -[folders](/configuring-npm/folders) for more on the differences in -behavior. +Operates in "global" mode, so that packages are installed into the `prefix` +folder instead of the current working directory. See +[folders](/configuring-npm/folders) for more on the differences in behavior. -* packages are installed into the `{prefix}/lib/node_modules` folder, - instead of the current working directory. +* packages are installed into the `{prefix}/lib/node_modules` folder, instead + of the current working directory. * bin files are linked to `{prefix}/bin` * man pages are linked to `{prefix}/share/man` @@ -134,9 +133,9 @@ behavior. * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -145,9 +144,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -157,14 +156,14 @@ This value is not exported to the environment for child processes. * Type: null or Date If passed to `npm install`, will rebuild the npm tree such that only -versions that were available **on or before** the given date are -installed. If there are no versions available for the current set of -dependencies, the command will error. - -If the requested version is a `dist-tag` and the given tag does not -pass the `--before` filter, the most recent version less than or -equal to that tag will be used. For example, `foo@latest` might -install `foo@1.2` even though `latest` is `2.0`. +versions that were available **on or before** the given date are installed. +If there are no versions available for the current set of dependencies, the +command will error. + +If the requested version is a `dist-tag` and the given tag does not pass the +`--before` filter, the most recent version less than or equal to that tag +will be used. For example, `foo@latest` might install `foo@1.2` even though +`latest` is `2.0`. diff --git a/deps/npm/docs/content/commands/npm-owner.md b/deps/npm/docs/content/commands/npm-owner.md index f3f8feb7c3d3f6..f20fa216860e40 100644 --- a/deps/npm/docs/content/commands/npm-owner.md +++ b/deps/npm/docs/content/commands/npm-owner.md @@ -47,12 +47,11 @@ The base URL of the npm registry. * Default: null * Type: null or String -This is a one-time password from a two-factor authenticator. It's -needed when publishing or changing package permissions with `npm -access`. +This is a one-time password from a two-factor authenticator. It's needed +when publishing or changing package permissions with `npm access`. -If not set, and a registry response fails with a challenge for a -one-time password, npm will prompt on the command line for one. +If not set, and a registry response fails with a challenge for a one-time +password, npm will prompt on the command line for one. @@ -61,9 +60,9 @@ one-time password, npm will prompt on the command line for one. * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -72,9 +71,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -86,14 +85,13 @@ This value is not exported to the environment for child processes. Set to true to run the command in the context of **all** configured workspaces. -Explicitly setting this to false will cause commands like `install` -to ignore workspaces altogether. When not set explicitly: +Explicitly setting this to false will cause commands like `install` to +ignore workspaces altogether. When not set explicitly: -- Commands that operate on the `node_modules` tree (install, update, -etc.) will link workspaces into the `node_modules` folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, _unless_ one or more workspaces are specified in the -`workspace` config. +- Commands that operate on the `node_modules` tree (install, update, etc.) +will link workspaces into the `node_modules` folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +_unless_ one or more workspaces are specified in the `workspace` config. This value is not exported to the environment for child processes. diff --git a/deps/npm/docs/content/commands/npm-pack.md b/deps/npm/docs/content/commands/npm-pack.md index 97356cd340d766..7d9c8974d290b1 100644 --- a/deps/npm/docs/content/commands/npm-pack.md +++ b/deps/npm/docs/content/commands/npm-pack.md @@ -17,14 +17,13 @@ npm pack * Default: false * Type: Boolean -Indicates that you don't want npm to make any changes and that it -should only report what it would have done. This can be passed into -any of the commands that modify your local installation, eg, -`install`, `update`, `dedupe`, `uninstall`, as well as `pack` and -`publish`. +Indicates that you don't want npm to make any changes and that it should +only report what it would have done. This can be passed into any of the +commands that modify your local installation, eg, `install`, `update`, +`dedupe`, `uninstall`, as well as `pack` and `publish`. -Note: This is NOT honored by other network related commands, eg -`dist-tags`, `owner`, etc. +Note: This is NOT honored by other network related commands, eg `dist-tags`, +`owner`, etc. @@ -35,8 +34,8 @@ Note: This is NOT honored by other network related commands, eg Whether or not to output JSON data, rather than the normal output. -* In `npm pkg set` it enables parsing set values with JSON.parse() - before saving them to your `package.json`. +* In `npm pkg set` it enables parsing set values with JSON.parse() before + saving them to your `package.json`. Not supported by all npm commands. @@ -56,9 +55,9 @@ Directory in which `npm pack` will save tarballs. * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -67,9 +66,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -81,14 +80,13 @@ This value is not exported to the environment for child processes. Set to true to run the command in the context of **all** configured workspaces. -Explicitly setting this to false will cause commands like `install` -to ignore workspaces altogether. When not set explicitly: +Explicitly setting this to false will cause commands like `install` to +ignore workspaces altogether. When not set explicitly: -- Commands that operate on the `node_modules` tree (install, update, -etc.) will link workspaces into the `node_modules` folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, _unless_ one or more workspaces are specified in the -`workspace` config. +- Commands that operate on the `node_modules` tree (install, update, etc.) +will link workspaces into the `node_modules` folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +_unless_ one or more workspaces are specified in the `workspace` config. This value is not exported to the environment for child processes. @@ -99,10 +97,9 @@ This value is not exported to the environment for child processes. Include the workspace root when workspaces are enabled for a command. -When false, specifying individual workspaces via the `workspace` -config, or all workspaces via the `workspaces` flag, will cause npm -to operate only on the specified workspaces, and not on the root -project. +When false, specifying individual workspaces via the `workspace` config, or +all workspaces via the `workspaces` flag, will cause npm to operate only on +the specified workspaces, and not on the root project. This value is not exported to the environment for child processes. @@ -113,10 +110,10 @@ This value is not exported to the environment for child processes. If true, npm does not run scripts specified in package.json files. -Note that commands explicitly intended to run a particular script, -such as `npm start`, `npm stop`, `npm restart`, `npm test`, and `npm -run` will still run their intended script if `ignore-scripts` is set, -but they will *not* run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as +`npm start`, `npm stop`, `npm restart`, `npm test`, and `npm run` will still +run their intended script if `ignore-scripts` is set, but they will *not* +run any pre- or post-scripts. diff --git a/deps/npm/docs/content/commands/npm-pkg.md b/deps/npm/docs/content/commands/npm-pkg.md index 7615343cbf9606..72a5a90d98fe3f 100644 --- a/deps/npm/docs/content/commands/npm-pkg.md +++ b/deps/npm/docs/content/commands/npm-pkg.md @@ -166,16 +166,14 @@ mistakes, unnecessary performance degradation, and malicious input. * Allow clobbering non-npm files in global installs. * Allow the `npm version` command to work on an unclean git repository. * Allow deleting the cache folder with `npm cache clean`. -* Allow installing packages that have an `engines` declaration - requiring a different version of npm. -* Allow installing packages that have an `engines` declaration - requiring a different version of `node`, even if `--engine-strict` is - enabled. -* Allow `npm audit fix` to install modules outside your stated - dependency range (including SemVer-major changes). +* Allow installing packages that have an `engines` declaration requiring a + different version of npm. +* Allow installing packages that have an `engines` declaration requiring a + different version of `node`, even if `--engine-strict` is enabled. +* Allow `npm audit fix` to install modules outside your stated dependency + range (including SemVer-major changes). * Allow unpublishing all versions of a published package. -* Allow conflicting peerDependencies to be installed in the root - project. +* Allow conflicting peerDependencies to be installed in the root project. * Implicitly set `--yes` during `npm init`. * Allow clobbering existing values in `npm pkg` * Allow unpublishing of entire packages (not just a single version). @@ -192,8 +190,8 @@ recommended that you do not use this option! Whether or not to output JSON data, rather than the normal output. -* In `npm pkg set` it enables parsing set values with JSON.parse() - before saving them to your `package.json`. +* In `npm pkg set` it enables parsing set values with JSON.parse() before + saving them to your `package.json`. Not supported by all npm commands. @@ -204,9 +202,9 @@ Not supported by all npm commands. * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -215,9 +213,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -229,14 +227,13 @@ This value is not exported to the environment for child processes. Set to true to run the command in the context of **all** configured workspaces. -Explicitly setting this to false will cause commands like `install` -to ignore workspaces altogether. When not set explicitly: +Explicitly setting this to false will cause commands like `install` to +ignore workspaces altogether. When not set explicitly: -- Commands that operate on the `node_modules` tree (install, update, -etc.) will link workspaces into the `node_modules` folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, _unless_ one or more workspaces are specified in the -`workspace` config. +- Commands that operate on the `node_modules` tree (install, update, etc.) +will link workspaces into the `node_modules` folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +_unless_ one or more workspaces are specified in the `workspace` config. This value is not exported to the environment for child processes. ## See Also diff --git a/deps/npm/docs/content/commands/npm-prefix.md b/deps/npm/docs/content/commands/npm-prefix.md index ba483428daecec..cc86ae0e2d515a 100644 --- a/deps/npm/docs/content/commands/npm-prefix.md +++ b/deps/npm/docs/content/commands/npm-prefix.md @@ -39,13 +39,12 @@ npm prefix -g * Default: false * Type: Boolean -Operates in "global" mode, so that packages are installed into the -`prefix` folder instead of the current working directory. See -[folders](/configuring-npm/folders) for more on the differences in -behavior. +Operates in "global" mode, so that packages are installed into the `prefix` +folder instead of the current working directory. See +[folders](/configuring-npm/folders) for more on the differences in behavior. -* packages are installed into the `{prefix}/lib/node_modules` folder, - instead of the current working directory. +* packages are installed into the `{prefix}/lib/node_modules` folder, instead + of the current working directory. * bin files are linked to `{prefix}/bin` * man pages are linked to `{prefix}/share/man` diff --git a/deps/npm/docs/content/commands/npm-profile.md b/deps/npm/docs/content/commands/npm-profile.md index aa344822d0c53c..8c1ad4ee79c5c5 100644 --- a/deps/npm/docs/content/commands/npm-profile.md +++ b/deps/npm/docs/content/commands/npm-profile.md @@ -74,8 +74,8 @@ The base URL of the npm registry. Whether or not to output JSON data, rather than the normal output. -* In `npm pkg set` it enables parsing set values with JSON.parse() - before saving them to your `package.json`. +* In `npm pkg set` it enables parsing set values with JSON.parse() before + saving them to your `package.json`. Not supported by all npm commands. @@ -86,8 +86,8 @@ Not supported by all npm commands. * Default: false * Type: Boolean -Output parseable results from commands that write to standard output. -For `npm search`, this will be tab-separated table format. +Output parseable results from commands that write to standard output. For +`npm search`, this will be tab-separated table format. @@ -96,12 +96,11 @@ For `npm search`, this will be tab-separated table format. * Default: null * Type: null or String -This is a one-time password from a two-factor authenticator. It's -needed when publishing or changing package permissions with `npm -access`. +This is a one-time password from a two-factor authenticator. It's needed +when publishing or changing package permissions with `npm access`. -If not set, and a registry response fails with a challenge for a -one-time password, npm will prompt on the command line for one. +If not set, and a registry response fails with a challenge for a one-time +password, npm will prompt on the command line for one. diff --git a/deps/npm/docs/content/commands/npm-prune.md b/deps/npm/docs/content/commands/npm-prune.md index 8a889831bf0988..35150fd5abcb16 100644 --- a/deps/npm/docs/content/commands/npm-prune.md +++ b/deps/npm/docs/content/commands/npm-prune.md @@ -40,29 +40,25 @@ Note that these dependencies _are_ still resolved and added to the `package-lock.json` or `npm-shrinkwrap.json` file. They are just not physically installed on disk. -If a package type appears in both the `--include` and `--omit` lists, -then it will be included. +If a package type appears in both the `--include` and `--omit` lists, then +it will be included. -If the resulting omit list includes `'dev'`, then the `NODE_ENV` -environment variable will be set to `'production'` for all lifecycle -scripts. +If the resulting omit list includes `'dev'`, then the `NODE_ENV` environment +variable will be set to `'production'` for all lifecycle scripts. #### `include` * Default: -* Type: "prod", "dev", "optional", or "peer" (can be set multiple - times) +* Type: "prod", "dev", "optional", or "peer" (can be set multiple times) -Option that allows for defining which types of dependencies to -install. +Option that allows for defining which types of dependencies to install. This is the inverse of `--omit=`. -Dependency types specified in `--include` will not be omitted, -regardless of the order in which omit/include are specified on the -command-line. +Dependency types specified in `--include` will not be omitted, regardless of +the order in which omit/include are specified on the command-line. @@ -71,14 +67,13 @@ command-line. * Default: false * Type: Boolean -Indicates that you don't want npm to make any changes and that it -should only report what it would have done. This can be passed into -any of the commands that modify your local installation, eg, -`install`, `update`, `dedupe`, `uninstall`, as well as `pack` and -`publish`. +Indicates that you don't want npm to make any changes and that it should +only report what it would have done. This can be passed into any of the +commands that modify your local installation, eg, `install`, `update`, +`dedupe`, `uninstall`, as well as `pack` and `publish`. -Note: This is NOT honored by other network related commands, eg -`dist-tags`, `owner`, etc. +Note: This is NOT honored by other network related commands, eg `dist-tags`, +`owner`, etc. @@ -89,8 +84,8 @@ Note: This is NOT honored by other network related commands, eg Whether or not to output JSON data, rather than the normal output. -* In `npm pkg set` it enables parsing set values with JSON.parse() - before saving them to your `package.json`. +* In `npm pkg set` it enables parsing set values with JSON.parse() before + saving them to your `package.json`. Not supported by all npm commands. @@ -98,17 +93,16 @@ Not supported by all npm commands. #### `foreground-scripts` -* Default: `false` unless when using `npm pack` or `npm publish` where - it defaults to `true` +* Default: `false` unless when using `npm pack` or `npm publish` where it + defaults to `true` * Type: Boolean -Run all build scripts (ie, `preinstall`, `install`, and -`postinstall`) scripts for installed packages in the foreground -process, sharing standard input, output, and error with the main npm -process. +Run all build scripts (ie, `preinstall`, `install`, and `postinstall`) +scripts for installed packages in the foreground process, sharing standard +input, output, and error with the main npm process. -Note that this will generally make installs run slower, and be much -noisier, but can be useful for debugging. +Note that this will generally make installs run slower, and be much noisier, +but can be useful for debugging. @@ -119,10 +113,10 @@ noisier, but can be useful for debugging. If true, npm does not run scripts specified in package.json files. -Note that commands explicitly intended to run a particular script, -such as `npm start`, `npm stop`, `npm restart`, `npm test`, and `npm -run` will still run their intended script if `ignore-scripts` is set, -but they will *not* run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as +`npm start`, `npm stop`, `npm restart`, `npm test`, and `npm run` will still +run their intended script if `ignore-scripts` is set, but they will *not* +run any pre- or post-scripts. @@ -131,9 +125,9 @@ but they will *not* run any pre- or post-scripts. * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -142,9 +136,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -156,14 +150,13 @@ This value is not exported to the environment for child processes. Set to true to run the command in the context of **all** configured workspaces. -Explicitly setting this to false will cause commands like `install` -to ignore workspaces altogether. When not set explicitly: +Explicitly setting this to false will cause commands like `install` to +ignore workspaces altogether. When not set explicitly: -- Commands that operate on the `node_modules` tree (install, update, -etc.) will link workspaces into the `node_modules` folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, _unless_ one or more workspaces are specified in the -`workspace` config. +- Commands that operate on the `node_modules` tree (install, update, etc.) +will link workspaces into the `node_modules` folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +_unless_ one or more workspaces are specified in the `workspace` config. This value is not exported to the environment for child processes. @@ -174,10 +167,9 @@ This value is not exported to the environment for child processes. Include the workspace root when workspaces are enabled for a command. -When false, specifying individual workspaces via the `workspace` -config, or all workspaces via the `workspaces` flag, will cause npm -to operate only on the specified workspaces, and not on the root -project. +When false, specifying individual workspaces via the `workspace` config, or +all workspaces via the `workspaces` flag, will cause npm to operate only on +the specified workspaces, and not on the root project. This value is not exported to the environment for child processes. @@ -186,9 +178,9 @@ This value is not exported to the environment for child processes. * Default: false * Type: Boolean -When set file: protocol dependencies will be packed and installed as -regular dependencies instead of creating a symlink. This option has -no effect on workspaces. +When set file: protocol dependencies will be packed and installed as regular +dependencies instead of creating a symlink. This option has no effect on +workspaces. diff --git a/deps/npm/docs/content/commands/npm-publish.md b/deps/npm/docs/content/commands/npm-publish.md index 0210f353a908fc..95429d0bdc7518 100644 --- a/deps/npm/docs/content/commands/npm-publish.md +++ b/deps/npm/docs/content/commands/npm-publish.md @@ -14,6 +14,32 @@ npm publish Publishes a package to the registry so that it can be installed by name. +### Examples + +Publish the package in the current directory: + +```bash +npm publish +``` + +Publish a specific workspace: + +```bash +npm publish --workspace= +``` + +Publish multiple workspaces: + +```bash +npm publish --workspace=workspace-a --workspace=workspace-b +``` + +Publish all workspaces: + +```bash +npm publish --workspaces +``` + By default npm will publish to the public registry. This can be overridden by specifying a different default registry or using a [`scope`](/using-npm/scope) in the name, combined with a scope-configured registry (see [`package.json`](/configuring-npm/package-json)). @@ -71,24 +97,24 @@ See [`package.json`](/configuring-npm/package-json) for more info on what can an * Default: "latest" * Type: String -If you ask npm to install a package and don't tell it a specific -version, then it will install the specified tag. +If you ask npm to install a package and don't tell it a specific version, +then it will install the specified tag. -It is the tag added to the package@version specified in the `npm -dist-tag add` command, if no explicit tag is given. +It is the tag added to the package@version specified in the `npm dist-tag +add` command, if no explicit tag is given. -When used by the `npm diff` command, this is the tag used to fetch -the tarball that will be compared with the local files by default. +When used by the `npm diff` command, this is the tag used to fetch the +tarball that will be compared with the local files by default. -If used in the `npm publish` command, this is the tag that will be -added to the package submitted to the registry. +If used in the `npm publish` command, this is the tag that will be added to +the package submitted to the registry. #### `access` -* Default: 'public' for new packages, existing packages it will not - change the current level +* Default: 'public' for new packages, existing packages it will not change the + current level * Type: null, "restricted", or "public" If you do not want your scoped package to be publicly viewable (and @@ -96,10 +122,10 @@ installable) set `--access=restricted`. Unscoped packages cannot be set to `restricted`. -Note: This defaults to not changing the current access level for -existing packages. Specifying a value of `restricted` or `public` -during publish will change the access for an existing package the -same way that `npm access set status` would. +Note: This defaults to not changing the current access level for existing +packages. Specifying a value of `restricted` or `public` during publish will +change the access for an existing package the same way that `npm access set +status` would. @@ -108,14 +134,13 @@ same way that `npm access set status` would. * Default: false * Type: Boolean -Indicates that you don't want npm to make any changes and that it -should only report what it would have done. This can be passed into -any of the commands that modify your local installation, eg, -`install`, `update`, `dedupe`, `uninstall`, as well as `pack` and -`publish`. +Indicates that you don't want npm to make any changes and that it should +only report what it would have done. This can be passed into any of the +commands that modify your local installation, eg, `install`, `update`, +`dedupe`, `uninstall`, as well as `pack` and `publish`. -Note: This is NOT honored by other network related commands, eg -`dist-tags`, `owner`, etc. +Note: This is NOT honored by other network related commands, eg `dist-tags`, +`owner`, etc. @@ -124,12 +149,11 @@ Note: This is NOT honored by other network related commands, eg * Default: null * Type: null or String -This is a one-time password from a two-factor authenticator. It's -needed when publishing or changing package permissions with `npm -access`. +This is a one-time password from a two-factor authenticator. It's needed +when publishing or changing package permissions with `npm access`. -If not set, and a registry response fails with a challenge for a -one-time password, npm will prompt on the command line for one. +If not set, and a registry response fails with a challenge for a one-time +password, npm will prompt on the command line for one. @@ -138,9 +162,9 @@ one-time password, npm will prompt on the command line for one. * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -149,9 +173,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -163,14 +187,13 @@ This value is not exported to the environment for child processes. Set to true to run the command in the context of **all** configured workspaces. -Explicitly setting this to false will cause commands like `install` -to ignore workspaces altogether. When not set explicitly: +Explicitly setting this to false will cause commands like `install` to +ignore workspaces altogether. When not set explicitly: -- Commands that operate on the `node_modules` tree (install, update, -etc.) will link workspaces into the `node_modules` folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, _unless_ one or more workspaces are specified in the -`workspace` config. +- Commands that operate on the `node_modules` tree (install, update, etc.) +will link workspaces into the `node_modules` folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +_unless_ one or more workspaces are specified in the `workspace` config. This value is not exported to the environment for child processes. @@ -181,10 +204,9 @@ This value is not exported to the environment for child processes. Include the workspace root when workspaces are enabled for a command. -When false, specifying individual workspaces via the `workspace` -config, or all workspaces via the `workspaces` flag, will cause npm -to operate only on the specified workspaces, and not on the root -project. +When false, specifying individual workspaces via the `workspace` config, or +all workspaces via the `workspaces` flag, will cause npm to operate only on +the specified workspaces, and not on the root project. This value is not exported to the environment for child processes. @@ -193,8 +215,8 @@ This value is not exported to the environment for child processes. * Default: false * Type: Boolean -When publishing from a supported cloud CI/CD system, the package will -be publicly linked to where it was built and published from. +When publishing from a supported cloud CI/CD system, the package will be +publicly linked to where it was built and published from. This config cannot be used with: `provenance-file` @@ -203,8 +225,7 @@ This config cannot be used with: `provenance-file` * Default: null * Type: Path -When publishing, the provenance bundle at the given path will be -used. +When publishing, the provenance bundle at the given path will be used. This config cannot be used with: `provenance` diff --git a/deps/npm/docs/content/commands/npm-query.md b/deps/npm/docs/content/commands/npm-query.md index 1b78734c317f7b..f80dfdcf58b194 100644 --- a/deps/npm/docs/content/commands/npm-query.md +++ b/deps/npm/docs/content/commands/npm-query.md @@ -164,13 +164,12 @@ This means that information from the package.json files of your dependencies wil * Default: false * Type: Boolean -Operates in "global" mode, so that packages are installed into the -`prefix` folder instead of the current working directory. See -[folders](/configuring-npm/folders) for more on the differences in -behavior. +Operates in "global" mode, so that packages are installed into the `prefix` +folder instead of the current working directory. See +[folders](/configuring-npm/folders) for more on the differences in behavior. -* packages are installed into the `{prefix}/lib/node_modules` folder, - instead of the current working directory. +* packages are installed into the `{prefix}/lib/node_modules` folder, instead + of the current working directory. * bin files are linked to `{prefix}/bin` * man pages are linked to `{prefix}/share/man` @@ -181,9 +180,9 @@ behavior. * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -192,9 +191,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -206,14 +205,13 @@ This value is not exported to the environment for child processes. Set to true to run the command in the context of **all** configured workspaces. -Explicitly setting this to false will cause commands like `install` -to ignore workspaces altogether. When not set explicitly: +Explicitly setting this to false will cause commands like `install` to +ignore workspaces altogether. When not set explicitly: -- Commands that operate on the `node_modules` tree (install, update, -etc.) will link workspaces into the `node_modules` folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, _unless_ one or more workspaces are specified in the -`workspace` config. +- Commands that operate on the `node_modules` tree (install, update, etc.) +will link workspaces into the `node_modules` folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +_unless_ one or more workspaces are specified in the `workspace` config. This value is not exported to the environment for child processes. @@ -224,10 +222,9 @@ This value is not exported to the environment for child processes. Include the workspace root when workspaces are enabled for a command. -When false, specifying individual workspaces via the `workspace` -config, or all workspaces via the `workspaces` flag, will cause npm -to operate only on the specified workspaces, and not on the root -project. +When false, specifying individual workspaces via the `workspace` config, or +all workspaces via the `workspaces` flag, will cause npm to operate only on +the specified workspaces, and not on the root project. This value is not exported to the environment for child processes. @@ -236,15 +233,14 @@ This value is not exported to the environment for child processes. * Default: false * Type: Boolean -If set to true, the current operation will only use the -`package-lock.json`, ignoring `node_modules`. +If set to true, the current operation will only use the `package-lock.json`, +ignoring `node_modules`. For `update` this means only the `package-lock.json` will be updated, instead of checking `node_modules` and downloading dependencies. -For `list` this means the output will be based on the tree described -by the `package-lock.json`, rather than the contents of -`node_modules`. +For `list` this means the output will be based on the tree described by the +`package-lock.json`, rather than the contents of `node_modules`. @@ -253,8 +249,8 @@ by the `package-lock.json`, rather than the contents of * Default: null * Type: null or Boolean -Tells npm whether or not to expect results from the command. Can be -either true (expect some results) or false (expect no results). +Tells npm whether or not to expect results from the command. Can be either +true (expect some results) or false (expect no results). This config cannot be used with: `expect-result-count` diff --git a/deps/npm/docs/content/commands/npm-rebuild.md b/deps/npm/docs/content/commands/npm-rebuild.md index 529a583b719748..9fb43567ac2eb4 100644 --- a/deps/npm/docs/content/commands/npm-rebuild.md +++ b/deps/npm/docs/content/commands/npm-rebuild.md @@ -46,13 +46,12 @@ It is also suppressed if the package specifies `"gypfile": false` * Default: false * Type: Boolean -Operates in "global" mode, so that packages are installed into the -`prefix` folder instead of the current working directory. See -[folders](/configuring-npm/folders) for more on the differences in -behavior. +Operates in "global" mode, so that packages are installed into the `prefix` +folder instead of the current working directory. See +[folders](/configuring-npm/folders) for more on the differences in behavior. -* packages are installed into the `{prefix}/lib/node_modules` folder, - instead of the current working directory. +* packages are installed into the `{prefix}/lib/node_modules` folder, instead + of the current working directory. * bin files are linked to `{prefix}/bin` * man pages are linked to `{prefix}/share/man` @@ -66,25 +65,24 @@ behavior. Tells npm to create symlinks (or `.cmd` shims on Windows) for package executables. -Set to false to have it not do this. This can be used to work around -the fact that some file systems don't support symlinks, even on -ostensibly Unix systems. +Set to false to have it not do this. This can be used to work around the +fact that some file systems don't support symlinks, even on ostensibly Unix +systems. #### `foreground-scripts` -* Default: `false` unless when using `npm pack` or `npm publish` where - it defaults to `true` +* Default: `false` unless when using `npm pack` or `npm publish` where it + defaults to `true` * Type: Boolean -Run all build scripts (ie, `preinstall`, `install`, and -`postinstall`) scripts for installed packages in the foreground -process, sharing standard input, output, and error with the main npm -process. +Run all build scripts (ie, `preinstall`, `install`, and `postinstall`) +scripts for installed packages in the foreground process, sharing standard +input, output, and error with the main npm process. -Note that this will generally make installs run slower, and be much -noisier, but can be useful for debugging. +Note that this will generally make installs run slower, and be much noisier, +but can be useful for debugging. @@ -95,10 +93,10 @@ noisier, but can be useful for debugging. If true, npm does not run scripts specified in package.json files. -Note that commands explicitly intended to run a particular script, -such as `npm start`, `npm stop`, `npm restart`, `npm test`, and `npm -run` will still run their intended script if `ignore-scripts` is set, -but they will *not* run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as +`npm start`, `npm stop`, `npm restart`, `npm test`, and `npm run` will still +run their intended script if `ignore-scripts` is set, but they will *not* +run any pre- or post-scripts. @@ -107,9 +105,9 @@ but they will *not* run any pre- or post-scripts. * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -118,9 +116,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -132,14 +130,13 @@ This value is not exported to the environment for child processes. Set to true to run the command in the context of **all** configured workspaces. -Explicitly setting this to false will cause commands like `install` -to ignore workspaces altogether. When not set explicitly: +Explicitly setting this to false will cause commands like `install` to +ignore workspaces altogether. When not set explicitly: -- Commands that operate on the `node_modules` tree (install, update, -etc.) will link workspaces into the `node_modules` folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, _unless_ one or more workspaces are specified in the -`workspace` config. +- Commands that operate on the `node_modules` tree (install, update, etc.) +will link workspaces into the `node_modules` folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +_unless_ one or more workspaces are specified in the `workspace` config. This value is not exported to the environment for child processes. @@ -150,10 +147,9 @@ This value is not exported to the environment for child processes. Include the workspace root when workspaces are enabled for a command. -When false, specifying individual workspaces via the `workspace` -config, or all workspaces via the `workspaces` flag, will cause npm -to operate only on the specified workspaces, and not on the root -project. +When false, specifying individual workspaces via the `workspace` config, or +all workspaces via the `workspaces` flag, will cause npm to operate only on +the specified workspaces, and not on the root project. This value is not exported to the environment for child processes. @@ -162,9 +158,9 @@ This value is not exported to the environment for child processes. * Default: false * Type: Boolean -When set file: protocol dependencies will be packed and installed as -regular dependencies instead of creating a symlink. This option has -no effect on workspaces. +When set file: protocol dependencies will be packed and installed as regular +dependencies instead of creating a symlink. This option has no effect on +workspaces. diff --git a/deps/npm/docs/content/commands/npm-repo.md b/deps/npm/docs/content/commands/npm-repo.md index 10e14c0204db06..71357ab3224032 100644 --- a/deps/npm/docs/content/commands/npm-repo.md +++ b/deps/npm/docs/content/commands/npm-repo.md @@ -45,9 +45,9 @@ The base URL of the npm registry. * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -56,9 +56,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -70,14 +70,13 @@ This value is not exported to the environment for child processes. Set to true to run the command in the context of **all** configured workspaces. -Explicitly setting this to false will cause commands like `install` -to ignore workspaces altogether. When not set explicitly: +Explicitly setting this to false will cause commands like `install` to +ignore workspaces altogether. When not set explicitly: -- Commands that operate on the `node_modules` tree (install, update, -etc.) will link workspaces into the `node_modules` folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, _unless_ one or more workspaces are specified in the -`workspace` config. +- Commands that operate on the `node_modules` tree (install, update, etc.) +will link workspaces into the `node_modules` folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +_unless_ one or more workspaces are specified in the `workspace` config. This value is not exported to the environment for child processes. @@ -88,10 +87,9 @@ This value is not exported to the environment for child processes. Include the workspace root when workspaces are enabled for a command. -When false, specifying individual workspaces via the `workspace` -config, or all workspaces via the `workspaces` flag, will cause npm -to operate only on the specified workspaces, and not on the root -project. +When false, specifying individual workspaces via the `workspace` config, or +all workspaces via the `workspaces` flag, will cause npm to operate only on +the specified workspaces, and not on the root project. This value is not exported to the environment for child processes. diff --git a/deps/npm/docs/content/commands/npm-restart.md b/deps/npm/docs/content/commands/npm-restart.md index 1c240de24953dd..03eeec5da785de 100644 --- a/deps/npm/docs/content/commands/npm-restart.md +++ b/deps/npm/docs/content/commands/npm-restart.md @@ -41,10 +41,10 @@ If it does _not_ have a `"restart"` script specified, but it does have `stop` an If true, npm does not run scripts specified in package.json files. -Note that commands explicitly intended to run a particular script, -such as `npm start`, `npm stop`, `npm restart`, `npm test`, and `npm -run` will still run their intended script if `ignore-scripts` is set, -but they will *not* run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as +`npm start`, `npm stop`, `npm restart`, `npm test`, and `npm run` will still +run their intended script if `ignore-scripts` is set, but they will *not* +run any pre- or post-scripts. @@ -53,8 +53,8 @@ but they will *not* run any pre- or post-scripts. * Default: '/bin/sh' on POSIX systems, 'cmd.exe' on Windows * Type: null or String -The shell to use for scripts run with the `npm exec`, `npm run` and -`npm init ` commands. +The shell to use for scripts run with the `npm exec`, `npm run` and `npm +init ` commands. diff --git a/deps/npm/docs/content/commands/npm-root.md b/deps/npm/docs/content/commands/npm-root.md index 8648eace72d45a..8f4825bafaa3f7 100644 --- a/deps/npm/docs/content/commands/npm-root.md +++ b/deps/npm/docs/content/commands/npm-root.md @@ -32,13 +32,12 @@ echo "Global packages installed in: ${global_node_modules}" * Default: false * Type: Boolean -Operates in "global" mode, so that packages are installed into the -`prefix` folder instead of the current working directory. See -[folders](/configuring-npm/folders) for more on the differences in -behavior. +Operates in "global" mode, so that packages are installed into the `prefix` +folder instead of the current working directory. See +[folders](/configuring-npm/folders) for more on the differences in behavior. -* packages are installed into the `{prefix}/lib/node_modules` folder, - instead of the current working directory. +* packages are installed into the `{prefix}/lib/node_modules` folder, instead + of the current working directory. * bin files are linked to `{prefix}/bin` * man pages are linked to `{prefix}/share/man` diff --git a/deps/npm/docs/content/commands/npm-run.md b/deps/npm/docs/content/commands/npm-run.md index 2066bf36817ebd..9894e4b939d0db 100644 --- a/deps/npm/docs/content/commands/npm-run.md +++ b/deps/npm/docs/content/commands/npm-run.md @@ -119,9 +119,9 @@ This last command will run `test` in both `./packages/a` and `./packages/b` pack * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -130,9 +130,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -144,14 +144,13 @@ This value is not exported to the environment for child processes. Set to true to run the command in the context of **all** configured workspaces. -Explicitly setting this to false will cause commands like `install` -to ignore workspaces altogether. When not set explicitly: +Explicitly setting this to false will cause commands like `install` to +ignore workspaces altogether. When not set explicitly: -- Commands that operate on the `node_modules` tree (install, update, -etc.) will link workspaces into the `node_modules` folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, _unless_ one or more workspaces are specified in the -`workspace` config. +- Commands that operate on the `node_modules` tree (install, update, etc.) +will link workspaces into the `node_modules` folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +_unless_ one or more workspaces are specified in the `workspace` config. This value is not exported to the environment for child processes. @@ -162,10 +161,9 @@ This value is not exported to the environment for child processes. Include the workspace root when workspaces are enabled for a command. -When false, specifying individual workspaces via the `workspace` -config, or all workspaces via the `workspaces` flag, will cause npm -to operate only on the specified workspaces, and not on the root -project. +When false, specifying individual workspaces via the `workspace` config, or +all workspaces via the `workspaces` flag, will cause npm to operate only on +the specified workspaces, and not on the root project. This value is not exported to the environment for child processes. @@ -174,12 +172,12 @@ This value is not exported to the environment for child processes. * Default: false * Type: Boolean -If true, npm will not exit with an error code when `run` is invoked -for a script that isn't defined in the `scripts` section of -`package.json`. This option can be used when it's desirable to -optionally run a script when it's present and fail if the script -fails. This is useful, for example, when running scripts that may -only apply for some builds in an otherwise generic CI setup. +If true, npm will not exit with an error code when `run` is invoked for a +script that isn't defined in the `scripts` section of `package.json`. This +option can be used when it's desirable to optionally run a script when it's +present and fail if the script fails. This is useful, for example, when +running scripts that may only apply for some builds in an otherwise generic +CI setup. This value is not exported to the environment for child processes. @@ -190,26 +188,25 @@ This value is not exported to the environment for child processes. If true, npm does not run scripts specified in package.json files. -Note that commands explicitly intended to run a particular script, -such as `npm start`, `npm stop`, `npm restart`, `npm test`, and `npm -run` will still run their intended script if `ignore-scripts` is set, -but they will *not* run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as +`npm start`, `npm stop`, `npm restart`, `npm test`, and `npm run` will still +run their intended script if `ignore-scripts` is set, but they will *not* +run any pre- or post-scripts. #### `foreground-scripts` -* Default: `false` unless when using `npm pack` or `npm publish` where - it defaults to `true` +* Default: `false` unless when using `npm pack` or `npm publish` where it + defaults to `true` * Type: Boolean -Run all build scripts (ie, `preinstall`, `install`, and -`postinstall`) scripts for installed packages in the foreground -process, sharing standard input, output, and error with the main npm -process. +Run all build scripts (ie, `preinstall`, `install`, and `postinstall`) +scripts for installed packages in the foreground process, sharing standard +input, output, and error with the main npm process. -Note that this will generally make installs run slower, and be much -noisier, but can be useful for debugging. +Note that this will generally make installs run slower, and be much noisier, +but can be useful for debugging. @@ -218,8 +215,8 @@ noisier, but can be useful for debugging. * Default: '/bin/sh' on POSIX systems, 'cmd.exe' on Windows * Type: null or String -The shell to use for scripts run with the `npm exec`, `npm run` and -`npm init ` commands. +The shell to use for scripts run with the `npm exec`, `npm run` and `npm +init ` commands. diff --git a/deps/npm/docs/content/commands/npm-sbom.md b/deps/npm/docs/content/commands/npm-sbom.md index fd9d183005790c..f15e30bfcd05d9 100644 --- a/deps/npm/docs/content/commands/npm-sbom.md +++ b/deps/npm/docs/content/commands/npm-sbom.md @@ -225,12 +225,11 @@ Note that these dependencies _are_ still resolved and added to the `package-lock.json` or `npm-shrinkwrap.json` file. They are just not physically installed on disk. -If a package type appears in both the `--include` and `--omit` lists, -then it will be included. +If a package type appears in both the `--include` and `--omit` lists, then +it will be included. -If the resulting omit list includes `'dev'`, then the `NODE_ENV` -environment variable will be set to `'production'` for all lifecycle -scripts. +If the resulting omit list includes `'dev'`, then the `NODE_ENV` environment +variable will be set to `'production'` for all lifecycle scripts. @@ -239,15 +238,14 @@ scripts. * Default: false * Type: Boolean -If set to true, the current operation will only use the -`package-lock.json`, ignoring `node_modules`. +If set to true, the current operation will only use the `package-lock.json`, +ignoring `node_modules`. For `update` this means only the `package-lock.json` will be updated, instead of checking `node_modules` and downloading dependencies. -For `list` this means the output will be based on the tree described -by the `package-lock.json`, rather than the contents of -`node_modules`. +For `list` this means the output will be based on the tree described by the +`package-lock.json`, rather than the contents of `node_modules`. @@ -265,9 +263,9 @@ SBOM format to use when generating SBOMs. * Default: "library" * Type: "library", "application", or "framework" -The type of package described by the generated SBOM. For SPDX, this -is the value for the `primaryPackagePurpose` field. For CycloneDX, -this is the value for the `type` field. +The type of package described by the generated SBOM. For SPDX, this is the +value for the `primaryPackagePurpose` field. For CycloneDX, this is the +value for the `type` field. @@ -276,9 +274,9 @@ this is the value for the `type` field. * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -287,9 +285,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -301,14 +299,13 @@ This value is not exported to the environment for child processes. Set to true to run the command in the context of **all** configured workspaces. -Explicitly setting this to false will cause commands like `install` -to ignore workspaces altogether. When not set explicitly: +Explicitly setting this to false will cause commands like `install` to +ignore workspaces altogether. When not set explicitly: -- Commands that operate on the `node_modules` tree (install, update, -etc.) will link workspaces into the `node_modules` folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, _unless_ one or more workspaces are specified in the -`workspace` config. +- Commands that operate on the `node_modules` tree (install, update, etc.) +will link workspaces into the `node_modules` folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +_unless_ one or more workspaces are specified in the `workspace` config. This value is not exported to the environment for child processes. ## See Also diff --git a/deps/npm/docs/content/commands/npm-search.md b/deps/npm/docs/content/commands/npm-search.md index 4803ef57dfc975..d3f46a90c1a236 100644 --- a/deps/npm/docs/content/commands/npm-search.md +++ b/deps/npm/docs/content/commands/npm-search.md @@ -40,8 +40,8 @@ In this case search will ignore a trailing `/` . (Note you must escape or quote Whether or not to output JSON data, rather than the normal output. -* In `npm pkg set` it enables parsing set values with JSON.parse() - before saving them to your `package.json`. +* In `npm pkg set` it enables parsing set values with JSON.parse() before + saving them to your `package.json`. Not supported by all npm commands. @@ -49,12 +49,11 @@ Not supported by all npm commands. #### `color` -* Default: true unless the NO_COLOR environ is set to something other - than '0' +* Default: true unless the NO_COLOR environ is set to something other than '0' * Type: "always" or Boolean -If false, never shows colors. If `"always"` then always shows colors. -If true, then only prints color codes for tty file descriptors. +If false, never shows colors. If `"always"` then always shows colors. If +true, then only prints color codes for tty file descriptors. @@ -63,8 +62,8 @@ If true, then only prints color codes for tty file descriptors. * Default: false * Type: Boolean -Output parseable results from commands that write to standard output. -For `npm search`, this will be tab-separated table format. +Output parseable results from commands that write to standard output. For +`npm search`, this will be tab-separated table format. @@ -82,8 +81,8 @@ Show the description in `npm search` * Default: 20 * Type: Number -Number of items to limit search results to. Will not apply at all to -legacy searches. +Number of items to limit search results to. Will not apply at all to legacy +searches. @@ -119,8 +118,8 @@ The base URL of the npm registry. * Default: false * Type: Boolean -If true, staleness checks for cached data will be forced, making the -CLI look for updates immediately even for fresh package data. +If true, staleness checks for cached data will be forced, making the CLI +look for updates immediately even for fresh package data. @@ -129,9 +128,9 @@ CLI look for updates immediately even for fresh package data. * Default: false * Type: Boolean -If true, staleness checks for cached data will be bypassed, but -missing data will be requested from the server. To force full offline -mode, use `--offline`. +If true, staleness checks for cached data will be bypassed, but missing data +will be requested from the server. To force full offline mode, use +`--offline`. @@ -140,9 +139,8 @@ mode, use `--offline`. * Default: false * Type: Boolean -Force offline mode: no network requests will be done during install. -To allow the CLI to fill in missing cache data, see -`--prefer-offline`. +Force offline mode: no network requests will be done during install. To +allow the CLI to fill in missing cache data, see `--prefer-offline`. diff --git a/deps/npm/docs/content/commands/npm-star.md b/deps/npm/docs/content/commands/npm-star.md index 163bce4a73af3a..2820d1ca2e2606 100644 --- a/deps/npm/docs/content/commands/npm-star.md +++ b/deps/npm/docs/content/commands/npm-star.md @@ -47,13 +47,12 @@ The base URL of the npm registry. #### `unicode` -* Default: false on windows, true on mac/unix systems with a unicode - locale, as defined by the `LC_ALL`, `LC_CTYPE`, or `LANG` environment - variables. +* Default: false on windows, true on mac/unix systems with a unicode locale, + as defined by the `LC_ALL`, `LC_CTYPE`, or `LANG` environment variables. * Type: Boolean -When set to true, npm uses unicode characters in the tree output. -When false, it uses ascii characters instead of unicode glyphs. +When set to true, npm uses unicode characters in the tree output. When +false, it uses ascii characters instead of unicode glyphs. @@ -62,12 +61,11 @@ When false, it uses ascii characters instead of unicode glyphs. * Default: null * Type: null or String -This is a one-time password from a two-factor authenticator. It's -needed when publishing or changing package permissions with `npm -access`. +This is a one-time password from a two-factor authenticator. It's needed +when publishing or changing package permissions with `npm access`. -If not set, and a registry response fails with a challenge for a -one-time password, npm will prompt on the command line for one. +If not set, and a registry response fails with a challenge for a one-time +password, npm will prompt on the command line for one. diff --git a/deps/npm/docs/content/commands/npm-start.md b/deps/npm/docs/content/commands/npm-start.md index 19afcc689e8093..eb5d5c54684ac8 100644 --- a/deps/npm/docs/content/commands/npm-start.md +++ b/deps/npm/docs/content/commands/npm-start.md @@ -50,10 +50,10 @@ npm start If true, npm does not run scripts specified in package.json files. -Note that commands explicitly intended to run a particular script, -such as `npm start`, `npm stop`, `npm restart`, `npm test`, and `npm -run` will still run their intended script if `ignore-scripts` is set, -but they will *not* run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as +`npm start`, `npm stop`, `npm restart`, `npm test`, and `npm run` will still +run their intended script if `ignore-scripts` is set, but they will *not* +run any pre- or post-scripts. @@ -62,8 +62,8 @@ but they will *not* run any pre- or post-scripts. * Default: '/bin/sh' on POSIX systems, 'cmd.exe' on Windows * Type: null or String -The shell to use for scripts run with the `npm exec`, `npm run` and -`npm init ` commands. +The shell to use for scripts run with the `npm exec`, `npm run` and `npm +init ` commands. diff --git a/deps/npm/docs/content/commands/npm-stop.md b/deps/npm/docs/content/commands/npm-stop.md index d342a81bda2108..2ccad18038e0b2 100644 --- a/deps/npm/docs/content/commands/npm-stop.md +++ b/deps/npm/docs/content/commands/npm-stop.md @@ -45,10 +45,10 @@ npm stop If true, npm does not run scripts specified in package.json files. -Note that commands explicitly intended to run a particular script, -such as `npm start`, `npm stop`, `npm restart`, `npm test`, and `npm -run` will still run their intended script if `ignore-scripts` is set, -but they will *not* run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as +`npm start`, `npm stop`, `npm restart`, `npm test`, and `npm run` will still +run their intended script if `ignore-scripts` is set, but they will *not* +run any pre- or post-scripts. @@ -57,8 +57,8 @@ but they will *not* run any pre- or post-scripts. * Default: '/bin/sh' on POSIX systems, 'cmd.exe' on Windows * Type: null or String -The shell to use for scripts run with the `npm exec`, `npm run` and -`npm init ` commands. +The shell to use for scripts run with the `npm exec`, `npm run` and `npm +init ` commands. diff --git a/deps/npm/docs/content/commands/npm-team.md b/deps/npm/docs/content/commands/npm-team.md index 4d660b0d3a583b..9ac1805c705e04 100644 --- a/deps/npm/docs/content/commands/npm-team.md +++ b/deps/npm/docs/content/commands/npm-team.md @@ -105,12 +105,11 @@ The base URL of the npm registry. * Default: null * Type: null or String -This is a one-time password from a two-factor authenticator. It's -needed when publishing or changing package permissions with `npm -access`. +This is a one-time password from a two-factor authenticator. It's needed +when publishing or changing package permissions with `npm access`. -If not set, and a registry response fails with a challenge for a -one-time password, npm will prompt on the command line for one. +If not set, and a registry response fails with a challenge for a one-time +password, npm will prompt on the command line for one. @@ -119,8 +118,8 @@ one-time password, npm will prompt on the command line for one. * Default: false * Type: Boolean -Output parseable results from commands that write to standard output. -For `npm search`, this will be tab-separated table format. +Output parseable results from commands that write to standard output. For +`npm search`, this will be tab-separated table format. @@ -131,8 +130,8 @@ For `npm search`, this will be tab-separated table format. Whether or not to output JSON data, rather than the normal output. -* In `npm pkg set` it enables parsing set values with JSON.parse() - before saving them to your `package.json`. +* In `npm pkg set` it enables parsing set values with JSON.parse() before + saving them to your `package.json`. Not supported by all npm commands. diff --git a/deps/npm/docs/content/commands/npm-test.md b/deps/npm/docs/content/commands/npm-test.md index 60d94eb2398063..f145dc8958bf8c 100644 --- a/deps/npm/docs/content/commands/npm-test.md +++ b/deps/npm/docs/content/commands/npm-test.md @@ -43,10 +43,10 @@ npm test If true, npm does not run scripts specified in package.json files. -Note that commands explicitly intended to run a particular script, -such as `npm start`, `npm stop`, `npm restart`, `npm test`, and `npm -run` will still run their intended script if `ignore-scripts` is set, -but they will *not* run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as +`npm start`, `npm stop`, `npm restart`, `npm test`, and `npm run` will still +run their intended script if `ignore-scripts` is set, but they will *not* +run any pre- or post-scripts. @@ -55,8 +55,8 @@ but they will *not* run any pre- or post-scripts. * Default: '/bin/sh' on POSIX systems, 'cmd.exe' on Windows * Type: null or String -The shell to use for scripts run with the `npm exec`, `npm run` and -`npm init ` commands. +The shell to use for scripts run with the `npm exec`, `npm run` and `npm +init ` commands. diff --git a/deps/npm/docs/content/commands/npm-token.md b/deps/npm/docs/content/commands/npm-token.md index 43c0fdc6c7309f..42dfed6086cea7 100644 --- a/deps/npm/docs/content/commands/npm-token.md +++ b/deps/npm/docs/content/commands/npm-token.md @@ -9,7 +9,7 @@ description: Manage your authentication tokens ```bash npm token list npm token revoke -npm token create [--read-only] [--cidr=list] +npm token create --name= [--token-description=] [--packages=] [--packages-all] [--scopes=] [--orgs=] [--packages-and-scopes-permission=] [--orgs-permission=] [--expires=] [--cidr=] [--bypass-2fa] [--password=] ``` Note: This command is unaware of workspaces. @@ -52,13 +52,98 @@ Created publish token a73c9572-f1b9-8983-983d-ba3ac3cc913d ### Configuration -#### `read-only` +#### `name` + +* Default: null +* Type: null or String + +When creating a Granular Access Token with `npm token create`, this sets the +name/description for the token. + + + +#### `token-description` + +* Default: null +* Type: null or String + +Description text for the token when using `npm token create`. + + + +#### `expires` + +* Default: null +* Type: null or Number + +When creating a Granular Access Token with `npm token create`, this sets the +expiration in days. If not specified, the server will determine the default +expiration. + + + +#### `packages` + +* Default: +* Type: null or String (can be set multiple times) + +When creating a Granular Access Token with `npm token create`, this limits +the token access to specific packages. Provide a comma-separated list of +package names. + + + +#### `packages-all` * Default: false * Type: Boolean -This is used to mark a token as unable to publish when configuring -limited access tokens with the `npm token create` command. +When creating a Granular Access Token with `npm token create`, grants the +token access to all packages instead of limiting to specific packages. + + + +#### `scopes` + +* Default: null +* Type: null or String (can be set multiple times) + +When creating a Granular Access Token with `npm token create`, this limits +the token access to specific scopes. Provide a comma-separated list of scope +names (with or without @ prefix). + + + +#### `orgs` + +* Default: null +* Type: null or String (can be set multiple times) + +When creating a Granular Access Token with `npm token create`, this limits +the token access to specific organizations. Provide a comma-separated list +of organization names. + + + +#### `packages-and-scopes-permission` + +* Default: null +* Type: null, "read-only", "read-write", or "no-access" + +When creating a Granular Access Token with `npm token create`, sets the +permission level for packages and scopes. Options are "read-only", +"read-write", or "no-access". + + + +#### `orgs-permission` + +* Default: null +* Type: null, "read-only", "read-write", or "no-access" + +When creating a Granular Access Token with `npm token create`, sets the +permission level for organizations. Options are "read-only", "read-write", +or "no-access". @@ -67,8 +152,29 @@ limited access tokens with the `npm token create` command. * Default: null * Type: null or String (can be set multiple times) -This is a list of CIDR address to be used when configuring limited -access tokens with the `npm token create` command. +This is a list of CIDR address to be used when configuring limited access +tokens with the `npm token create` command. + + + +#### `bypass-2fa` + +* Default: false +* Type: Boolean + +When creating a Granular Access Token with `npm token create`, setting this +to true will allow the token to bypass two-factor authentication. This is +useful for automation and CI/CD workflows. + + + +#### `password` + +* Default: null +* Type: null or String + +Password for authentication. Can be provided via command line when creating +tokens, though it's generally safer to be prompted for it. @@ -86,12 +192,21 @@ The base URL of the npm registry. * Default: null * Type: null or String -This is a one-time password from a two-factor authenticator. It's -needed when publishing or changing package permissions with `npm -access`. +This is a one-time password from a two-factor authenticator. It's needed +when publishing or changing package permissions with `npm access`. -If not set, and a registry response fails with a challenge for a -one-time password, npm will prompt on the command line for one. +If not set, and a registry response fails with a challenge for a one-time +password, npm will prompt on the command line for one. + + + +#### `read-only` + +* Default: false +* Type: Boolean + +This is used to mark a token as unable to publish when configuring limited +access tokens with the `npm token create` command. diff --git a/deps/npm/docs/content/commands/npm-undeprecate.md b/deps/npm/docs/content/commands/npm-undeprecate.md index 3034aca212f3db..fdd1a25504e1c4 100644 --- a/deps/npm/docs/content/commands/npm-undeprecate.md +++ b/deps/npm/docs/content/commands/npm-undeprecate.md @@ -34,12 +34,11 @@ The base URL of the npm registry. * Default: null * Type: null or String -This is a one-time password from a two-factor authenticator. It's -needed when publishing or changing package permissions with `npm -access`. +This is a one-time password from a two-factor authenticator. It's needed +when publishing or changing package permissions with `npm access`. -If not set, and a registry response fails with a challenge for a -one-time password, npm will prompt on the command line for one. +If not set, and a registry response fails with a challenge for a one-time +password, npm will prompt on the command line for one. @@ -48,14 +47,13 @@ one-time password, npm will prompt on the command line for one. * Default: false * Type: Boolean -Indicates that you don't want npm to make any changes and that it -should only report what it would have done. This can be passed into -any of the commands that modify your local installation, eg, -`install`, `update`, `dedupe`, `uninstall`, as well as `pack` and -`publish`. +Indicates that you don't want npm to make any changes and that it should +only report what it would have done. This can be passed into any of the +commands that modify your local installation, eg, `install`, `update`, +`dedupe`, `uninstall`, as well as `pack` and `publish`. -Note: This is NOT honored by other network related commands, eg -`dist-tags`, `owner`, etc. +Note: This is NOT honored by other network related commands, eg `dist-tags`, +`owner`, etc. ### See Also diff --git a/deps/npm/docs/content/commands/npm-uninstall.md b/deps/npm/docs/content/commands/npm-uninstall.md index 1d8bb6418e07cf..43b706f9c94401 100644 --- a/deps/npm/docs/content/commands/npm-uninstall.md +++ b/deps/npm/docs/content/commands/npm-uninstall.md @@ -50,8 +50,7 @@ npm uninstall lodash --no-save #### `save` -* Default: `true` unless when using `npm update` where it defaults to - `false` +* Default: `true` unless when using `npm update` where it defaults to `false` * Type: Boolean Save installed packages to a `package.json` file as dependencies. @@ -68,13 +67,12 @@ Will also prevent writing to `package-lock.json` if set to `false`. * Default: false * Type: Boolean -Operates in "global" mode, so that packages are installed into the -`prefix` folder instead of the current working directory. See -[folders](/configuring-npm/folders) for more on the differences in -behavior. +Operates in "global" mode, so that packages are installed into the `prefix` +folder instead of the current working directory. See +[folders](/configuring-npm/folders) for more on the differences in behavior. -* packages are installed into the `{prefix}/lib/node_modules` folder, - instead of the current working directory. +* packages are installed into the `{prefix}/lib/node_modules` folder, instead + of the current working directory. * bin files are linked to `{prefix}/bin` * man pages are linked to `{prefix}/share/man` @@ -85,9 +83,9 @@ behavior. * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -96,9 +94,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -110,14 +108,13 @@ This value is not exported to the environment for child processes. Set to true to run the command in the context of **all** configured workspaces. -Explicitly setting this to false will cause commands like `install` -to ignore workspaces altogether. When not set explicitly: +Explicitly setting this to false will cause commands like `install` to +ignore workspaces altogether. When not set explicitly: -- Commands that operate on the `node_modules` tree (install, update, -etc.) will link workspaces into the `node_modules` folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, _unless_ one or more workspaces are specified in the -`workspace` config. +- Commands that operate on the `node_modules` tree (install, update, etc.) +will link workspaces into the `node_modules` folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +_unless_ one or more workspaces are specified in the `workspace` config. This value is not exported to the environment for child processes. @@ -128,10 +125,9 @@ This value is not exported to the environment for child processes. Include the workspace root when workspaces are enabled for a command. -When false, specifying individual workspaces via the `workspace` -config, or all workspaces via the `workspaces` flag, will cause npm -to operate only on the specified workspaces, and not on the root -project. +When false, specifying individual workspaces via the `workspace` config, or +all workspaces via the `workspaces` flag, will cause npm to operate only on +the specified workspaces, and not on the root project. This value is not exported to the environment for child processes. @@ -140,9 +136,9 @@ This value is not exported to the environment for child processes. * Default: false * Type: Boolean -When set file: protocol dependencies will be packed and installed as -regular dependencies instead of creating a symlink. This option has -no effect on workspaces. +When set file: protocol dependencies will be packed and installed as regular +dependencies instead of creating a symlink. This option has no effect on +workspaces. diff --git a/deps/npm/docs/content/commands/npm-unpublish.md b/deps/npm/docs/content/commands/npm-unpublish.md index db68ae7d40bc03..fe2d9be0f4a97b 100644 --- a/deps/npm/docs/content/commands/npm-unpublish.md +++ b/deps/npm/docs/content/commands/npm-unpublish.md @@ -37,14 +37,13 @@ If you unpublish the entire package, you may not publish any new versions of tha * Default: false * Type: Boolean -Indicates that you don't want npm to make any changes and that it -should only report what it would have done. This can be passed into -any of the commands that modify your local installation, eg, -`install`, `update`, `dedupe`, `uninstall`, as well as `pack` and -`publish`. +Indicates that you don't want npm to make any changes and that it should +only report what it would have done. This can be passed into any of the +commands that modify your local installation, eg, `install`, `update`, +`dedupe`, `uninstall`, as well as `pack` and `publish`. -Note: This is NOT honored by other network related commands, eg -`dist-tags`, `owner`, etc. +Note: This is NOT honored by other network related commands, eg `dist-tags`, +`owner`, etc. @@ -59,16 +58,14 @@ mistakes, unnecessary performance degradation, and malicious input. * Allow clobbering non-npm files in global installs. * Allow the `npm version` command to work on an unclean git repository. * Allow deleting the cache folder with `npm cache clean`. -* Allow installing packages that have an `engines` declaration - requiring a different version of npm. -* Allow installing packages that have an `engines` declaration - requiring a different version of `node`, even if `--engine-strict` is - enabled. -* Allow `npm audit fix` to install modules outside your stated - dependency range (including SemVer-major changes). +* Allow installing packages that have an `engines` declaration requiring a + different version of npm. +* Allow installing packages that have an `engines` declaration requiring a + different version of `node`, even if `--engine-strict` is enabled. +* Allow `npm audit fix` to install modules outside your stated dependency + range (including SemVer-major changes). * Allow unpublishing all versions of a published package. -* Allow conflicting peerDependencies to be installed in the root - project. +* Allow conflicting peerDependencies to be installed in the root project. * Implicitly set `--yes` during `npm init`. * Allow clobbering existing values in `npm pkg` * Allow unpublishing of entire packages (not just a single version). @@ -83,9 +80,9 @@ recommended that you do not use this option! * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -94,9 +91,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -108,14 +105,13 @@ This value is not exported to the environment for child processes. Set to true to run the command in the context of **all** configured workspaces. -Explicitly setting this to false will cause commands like `install` -to ignore workspaces altogether. When not set explicitly: +Explicitly setting this to false will cause commands like `install` to +ignore workspaces altogether. When not set explicitly: -- Commands that operate on the `node_modules` tree (install, update, -etc.) will link workspaces into the `node_modules` folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, _unless_ one or more workspaces are specified in the -`workspace` config. +- Commands that operate on the `node_modules` tree (install, update, etc.) +will link workspaces into the `node_modules` folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +_unless_ one or more workspaces are specified in the `workspace` config. This value is not exported to the environment for child processes. diff --git a/deps/npm/docs/content/commands/npm-unstar.md b/deps/npm/docs/content/commands/npm-unstar.md index 8c560bc5da06dc..24764733e4a0e9 100644 --- a/deps/npm/docs/content/commands/npm-unstar.md +++ b/deps/npm/docs/content/commands/npm-unstar.md @@ -41,13 +41,12 @@ The base URL of the npm registry. #### `unicode` -* Default: false on windows, true on mac/unix systems with a unicode - locale, as defined by the `LC_ALL`, `LC_CTYPE`, or `LANG` environment - variables. +* Default: false on windows, true on mac/unix systems with a unicode locale, + as defined by the `LC_ALL`, `LC_CTYPE`, or `LANG` environment variables. * Type: Boolean -When set to true, npm uses unicode characters in the tree output. -When false, it uses ascii characters instead of unicode glyphs. +When set to true, npm uses unicode characters in the tree output. When +false, it uses ascii characters instead of unicode glyphs. @@ -56,12 +55,11 @@ When false, it uses ascii characters instead of unicode glyphs. * Default: null * Type: null or String -This is a one-time password from a two-factor authenticator. It's -needed when publishing or changing package permissions with `npm -access`. +This is a one-time password from a two-factor authenticator. It's needed +when publishing or changing package permissions with `npm access`. -If not set, and a registry response fails with a challenge for a -one-time password, npm will prompt on the command line for one. +If not set, and a registry response fails with a challenge for a one-time +password, npm will prompt on the command line for one. diff --git a/deps/npm/docs/content/commands/npm-update.md b/deps/npm/docs/content/commands/npm-update.md index c20da891716ba5..853bb24de32e8d 100644 --- a/deps/npm/docs/content/commands/npm-update.md +++ b/deps/npm/docs/content/commands/npm-update.md @@ -141,8 +141,7 @@ NOTE: If a package has been upgraded to a version newer than `latest`, it will b #### `save` -* Default: `true` unless when using `npm update` where it defaults to - `false` +* Default: `true` unless when using `npm update` where it defaults to `false` * Type: Boolean Save installed packages to a `package.json` file as dependencies. @@ -159,13 +158,12 @@ Will also prevent writing to `package-lock.json` if set to `false`. * Default: false * Type: Boolean -Operates in "global" mode, so that packages are installed into the -`prefix` folder instead of the current working directory. See -[folders](/configuring-npm/folders) for more on the differences in -behavior. +Operates in "global" mode, so that packages are installed into the `prefix` +folder instead of the current working directory. See +[folders](/configuring-npm/folders) for more on the differences in behavior. -* packages are installed into the `{prefix}/lib/node_modules` folder, - instead of the current working directory. +* packages are installed into the `{prefix}/lib/node_modules` folder, instead + of the current working directory. * bin files are linked to `{prefix}/bin` * man pages are linked to `{prefix}/share/man` @@ -177,12 +175,11 @@ behavior. * Type: "hoisted", "nested", "shallow", or "linked" Sets the strategy for installing packages in node_modules. hoisted -(default): Install non-duplicated in top-level, and duplicated as -necessary within directory structure. nested: (formerly ---legacy-bundling) install in place, no hoisting. shallow (formerly ---global-style) only install direct deps at top-level. linked: -(experimental) install in node_modules/.store, link in place, -unhoisted. +(default): Install non-duplicated in top-level, and duplicated as necessary +within directory structure. nested: (formerly --legacy-bundling) install in +place, no hoisting. shallow (formerly --global-style) only install direct +deps at top-level. linked: (experimental) install in node_modules/.store, +link in place, unhoisted. @@ -193,10 +190,10 @@ unhoisted. * DEPRECATED: This option has been deprecated in favor of `--install-strategy=nested` -Instead of hoisting package installs in `node_modules`, install -packages in the same manner that they are depended on. This may cause -very deep directory structures and duplicate package installs as -there is no de-duplicating. Sets `--install-strategy=nested`. +Instead of hoisting package installs in `node_modules`, install packages in +the same manner that they are depended on. This may cause very deep +directory structures and duplicate package installs as there is no +de-duplicating. Sets `--install-strategy=nested`. @@ -207,8 +204,8 @@ there is no de-duplicating. Sets `--install-strategy=nested`. * DEPRECATED: This option has been deprecated in favor of `--install-strategy=shallow` -Only install direct dependencies in the top level `node_modules`, but -hoist on deeper dependencies. Sets `--install-strategy=shallow`. +Only install direct dependencies in the top level `node_modules`, but hoist +on deeper dependencies. Sets `--install-strategy=shallow`. @@ -224,29 +221,25 @@ Note that these dependencies _are_ still resolved and added to the `package-lock.json` or `npm-shrinkwrap.json` file. They are just not physically installed on disk. -If a package type appears in both the `--include` and `--omit` lists, -then it will be included. +If a package type appears in both the `--include` and `--omit` lists, then +it will be included. -If the resulting omit list includes `'dev'`, then the `NODE_ENV` -environment variable will be set to `'production'` for all lifecycle -scripts. +If the resulting omit list includes `'dev'`, then the `NODE_ENV` environment +variable will be set to `'production'` for all lifecycle scripts. #### `include` * Default: -* Type: "prod", "dev", "optional", or "peer" (can be set multiple - times) +* Type: "prod", "dev", "optional", or "peer" (can be set multiple times) -Option that allows for defining which types of dependencies to -install. +Option that allows for defining which types of dependencies to install. This is the inverse of `--omit=`. -Dependency types specified in `--include` will not be omitted, -regardless of the order in which omit/include are specified on the -command-line. +Dependency types specified in `--include` will not be omitted, regardless of +the order in which omit/include are specified on the command-line. @@ -256,19 +249,18 @@ command-line. * Type: Boolean If set to `true`, and `--legacy-peer-deps` is not set, then _any_ -conflicting `peerDependencies` will be treated as an install failure, -even if npm could reasonably guess the appropriate resolution based -on non-peer dependency relationships. +conflicting `peerDependencies` will be treated as an install failure, even +if npm could reasonably guess the appropriate resolution based on non-peer +dependency relationships. -By default, conflicting `peerDependencies` deep in the dependency -graph will be resolved using the nearest non-peer dependency -specification, even if doing so will result in some packages -receiving a peer dependency outside the range set in their package's -`peerDependencies` object. +By default, conflicting `peerDependencies` deep in the dependency graph will +be resolved using the nearest non-peer dependency specification, even if +doing so will result in some packages receiving a peer dependency outside +the range set in their package's `peerDependencies` object. -When such an override is performed, a warning is printed, explaining -the conflict and the packages involved. If `--strict-peer-deps` is -set, then this warning is treated as a failure. +When such an override is performed, a warning is printed, explaining the +conflict and the packages involved. If `--strict-peer-deps` is set, then +this warning is treated as a failure. @@ -277,25 +269,23 @@ set, then this warning is treated as a failure. * Default: true * Type: Boolean -If set to false, then ignore `package-lock.json` files when -installing. This will also prevent _writing_ `package-lock.json` if -`save` is true. +If set to false, then ignore `package-lock.json` files when installing. This +will also prevent _writing_ `package-lock.json` if `save` is true. #### `foreground-scripts` -* Default: `false` unless when using `npm pack` or `npm publish` where - it defaults to `true` +* Default: `false` unless when using `npm pack` or `npm publish` where it + defaults to `true` * Type: Boolean -Run all build scripts (ie, `preinstall`, `install`, and -`postinstall`) scripts for installed packages in the foreground -process, sharing standard input, output, and error with the main npm -process. +Run all build scripts (ie, `preinstall`, `install`, and `postinstall`) +scripts for installed packages in the foreground process, sharing standard +input, output, and error with the main npm process. -Note that this will generally make installs run slower, and be much -noisier, but can be useful for debugging. +Note that this will generally make installs run slower, and be much noisier, +but can be useful for debugging. @@ -306,10 +296,10 @@ noisier, but can be useful for debugging. If true, npm does not run scripts specified in package.json files. -Note that commands explicitly intended to run a particular script, -such as `npm start`, `npm stop`, `npm restart`, `npm test`, and `npm -run` will still run their intended script if `ignore-scripts` is set, -but they will *not* run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as +`npm start`, `npm stop`, `npm restart`, `npm test`, and `npm run` will still +run their intended script if `ignore-scripts` is set, but they will *not* +run any pre- or post-scripts. @@ -318,10 +308,10 @@ but they will *not* run any pre- or post-scripts. * Default: true * Type: Boolean -When "true" submit audit reports alongside the current npm command to -the default registry and all registries configured for scopes. See -the documentation for [`npm audit`](/commands/npm-audit) for details -on what is submitted. +When "true" submit audit reports alongside the current npm command to the +default registry and all registries configured for scopes. See the +documentation for [`npm audit`](/commands/npm-audit) for details on what is +submitted. @@ -331,14 +321,14 @@ on what is submitted. * Type: null or Date If passed to `npm install`, will rebuild the npm tree such that only -versions that were available **on or before** the given date are -installed. If there are no versions available for the current set of -dependencies, the command will error. +versions that were available **on or before** the given date are installed. +If there are no versions available for the current set of dependencies, the +command will error. -If the requested version is a `dist-tag` and the given tag does not -pass the `--before` filter, the most recent version less than or -equal to that tag will be used. For example, `foo@latest` might -install `foo@1.2` even though `latest` is `2.0`. +If the requested version is a `dist-tag` and the given tag does not pass the +`--before` filter, the most recent version less than or equal to that tag +will be used. For example, `foo@latest` might install `foo@1.2` even though +`latest` is `2.0`. @@ -350,9 +340,9 @@ install `foo@1.2` even though `latest` is `2.0`. Tells npm to create symlinks (or `.cmd` shims on Windows) for package executables. -Set to false to have it not do this. This can be used to work around -the fact that some file systems don't support symlinks, even on -ostensibly Unix systems. +Set to false to have it not do this. This can be used to work around the +fact that some file systems don't support symlinks, even on ostensibly Unix +systems. @@ -362,8 +352,8 @@ ostensibly Unix systems. * Type: Boolean When "true" displays the message at the end of each `npm install` -acknowledging the number of dependencies looking for funding. See -[`npm fund`](/commands/npm-fund) for details. +acknowledging the number of dependencies looking for funding. See [`npm +fund`](/commands/npm-fund) for details. @@ -372,14 +362,13 @@ acknowledging the number of dependencies looking for funding. See * Default: false * Type: Boolean -Indicates that you don't want npm to make any changes and that it -should only report what it would have done. This can be passed into -any of the commands that modify your local installation, eg, -`install`, `update`, `dedupe`, `uninstall`, as well as `pack` and -`publish`. +Indicates that you don't want npm to make any changes and that it should +only report what it would have done. This can be passed into any of the +commands that modify your local installation, eg, `install`, `update`, +`dedupe`, `uninstall`, as well as `pack` and `publish`. -Note: This is NOT honored by other network related commands, eg -`dist-tags`, `owner`, etc. +Note: This is NOT honored by other network related commands, eg `dist-tags`, +`owner`, etc. @@ -388,9 +377,9 @@ Note: This is NOT honored by other network related commands, eg * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -399,9 +388,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -413,14 +402,13 @@ This value is not exported to the environment for child processes. Set to true to run the command in the context of **all** configured workspaces. -Explicitly setting this to false will cause commands like `install` -to ignore workspaces altogether. When not set explicitly: +Explicitly setting this to false will cause commands like `install` to +ignore workspaces altogether. When not set explicitly: -- Commands that operate on the `node_modules` tree (install, update, -etc.) will link workspaces into the `node_modules` folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, _unless_ one or more workspaces are specified in the -`workspace` config. +- Commands that operate on the `node_modules` tree (install, update, etc.) +will link workspaces into the `node_modules` folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +_unless_ one or more workspaces are specified in the `workspace` config. This value is not exported to the environment for child processes. @@ -431,10 +419,9 @@ This value is not exported to the environment for child processes. Include the workspace root when workspaces are enabled for a command. -When false, specifying individual workspaces via the `workspace` -config, or all workspaces via the `workspaces` flag, will cause npm -to operate only on the specified workspaces, and not on the root -project. +When false, specifying individual workspaces via the `workspace` config, or +all workspaces via the `workspaces` flag, will cause npm to operate only on +the specified workspaces, and not on the root project. This value is not exported to the environment for child processes. @@ -443,9 +430,9 @@ This value is not exported to the environment for child processes. * Default: false * Type: Boolean -When set file: protocol dependencies will be packed and installed as -regular dependencies instead of creating a symlink. This option has -no effect on workspaces. +When set file: protocol dependencies will be packed and installed as regular +dependencies instead of creating a symlink. This option has no effect on +workspaces. diff --git a/deps/npm/docs/content/commands/npm-version.md b/deps/npm/docs/content/commands/npm-version.md index aeaa764e0df5f9..89c3441a48e8ea 100644 --- a/deps/npm/docs/content/commands/npm-version.md +++ b/deps/npm/docs/content/commands/npm-version.md @@ -19,8 +19,8 @@ alias: verison * Default: false * Type: Boolean -Prevents throwing an error when `npm version` is used to set the new -version to the same value as the current version. +Prevents throwing an error when `npm version` is used to set the new version +to the same value as the current version. @@ -38,8 +38,8 @@ Run git commit hooks when using the `npm version` command. * Default: true * Type: Boolean -Tag the commit when using the `npm version` command. Setting this to -false results in no commit being made at all. +Tag the commit when using the `npm version` command. Setting this to false +results in no commit being made at all. @@ -50,8 +50,8 @@ false results in no commit being made at all. Whether or not to output JSON data, rather than the normal output. -* In `npm pkg set` it enables parsing set values with JSON.parse() - before saving them to your `package.json`. +* In `npm pkg set` it enables parsing set values with JSON.parse() before + saving them to your `package.json`. Not supported by all npm commands. @@ -62,8 +62,8 @@ Not supported by all npm commands. * Default: "" * Type: String -The "prerelease identifier" to use as a prefix for the "prerelease" -part of a semver. Like the `rc` in `1.2.0-rc.8`. +The "prerelease identifier" to use as a prefix for the "prerelease" part of +a semver. Like the `rc` in `1.2.0-rc.8`. @@ -72,11 +72,25 @@ part of a semver. Like the `rc` in `1.2.0-rc.8`. * Default: false * Type: Boolean -If set to true, then the `npm version` command will tag the version -using `-s` to add a signature. +If set to true, then the `npm version` command will tag the version using +`-s` to add a signature. -Note that git requires you to have set up GPG keys in your git -configs for this to work properly. +Note that git requires you to have set up GPG keys in your git configs for +this to work properly. + + + +#### `save` + +* Default: `true` unless when using `npm update` where it defaults to `false` +* Type: Boolean + +Save installed packages to a `package.json` file as dependencies. + +When used with the `npm rm` command, removes the dependency from +`package.json`. + +Will also prevent writing to `package-lock.json` if set to `false`. @@ -85,9 +99,9 @@ configs for this to work properly. * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -96,9 +110,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -110,14 +124,13 @@ This value is not exported to the environment for child processes. Set to true to run the command in the context of **all** configured workspaces. -Explicitly setting this to false will cause commands like `install` -to ignore workspaces altogether. When not set explicitly: +Explicitly setting this to false will cause commands like `install` to +ignore workspaces altogether. When not set explicitly: -- Commands that operate on the `node_modules` tree (install, update, -etc.) will link workspaces into the `node_modules` folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, _unless_ one or more workspaces are specified in the -`workspace` config. +- Commands that operate on the `node_modules` tree (install, update, etc.) +will link workspaces into the `node_modules` folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +_unless_ one or more workspaces are specified in the `workspace` config. This value is not exported to the environment for child processes. @@ -126,9 +139,8 @@ This value is not exported to the environment for child processes. * Default: true * Type: Boolean -If set to true, the npm cli will run an update after operations that -may possibly change the workspaces installed to the `node_modules` -folder. +If set to true, the npm cli will run an update after operations that may +possibly change the workspaces installed to the `node_modules` folder. @@ -139,13 +151,26 @@ folder. Include the workspace root when workspaces are enabled for a command. -When false, specifying individual workspaces via the `workspace` -config, or all workspaces via the `workspaces` flag, will cause npm -to operate only on the specified workspaces, and not on the root -project. +When false, specifying individual workspaces via the `workspace` config, or +all workspaces via the `workspaces` flag, will cause npm to operate only on +the specified workspaces, and not on the root project. This value is not exported to the environment for child processes. +#### `ignore-scripts` + +* Default: false +* Type: Boolean + +If true, npm does not run scripts specified in package.json files. + +Note that commands explicitly intended to run a particular script, such as +`npm start`, `npm stop`, `npm restart`, `npm test`, and `npm run` will still +run their intended script if `ignore-scripts` is set, but they will *not* +run any pre- or post-scripts. + + + ### Description Run this in a package directory to bump the version and write the new data back to `package.json`, `package-lock.json`, and, if present, diff --git a/deps/npm/docs/content/commands/npm-view.md b/deps/npm/docs/content/commands/npm-view.md index 9b803b01d12223..6353b3c359f6da 100644 --- a/deps/npm/docs/content/commands/npm-view.md +++ b/deps/npm/docs/content/commands/npm-view.md @@ -111,8 +111,8 @@ npm view connect versions Whether or not to output JSON data, rather than the normal output. -* In `npm pkg set` it enables parsing set values with JSON.parse() - before saving them to your `package.json`. +* In `npm pkg set` it enables parsing set values with JSON.parse() before + saving them to your `package.json`. Not supported by all npm commands. @@ -123,9 +123,9 @@ Not supported by all npm commands. * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -134,9 +134,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -148,14 +148,13 @@ This value is not exported to the environment for child processes. Set to true to run the command in the context of **all** configured workspaces. -Explicitly setting this to false will cause commands like `install` -to ignore workspaces altogether. When not set explicitly: +Explicitly setting this to false will cause commands like `install` to +ignore workspaces altogether. When not set explicitly: -- Commands that operate on the `node_modules` tree (install, update, -etc.) will link workspaces into the `node_modules` folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, _unless_ one or more workspaces are specified in the -`workspace` config. +- Commands that operate on the `node_modules` tree (install, update, etc.) +will link workspaces into the `node_modules` folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +_unless_ one or more workspaces are specified in the `workspace` config. This value is not exported to the environment for child processes. @@ -166,10 +165,9 @@ This value is not exported to the environment for child processes. Include the workspace root when workspaces are enabled for a command. -When false, specifying individual workspaces via the `workspace` -config, or all workspaces via the `workspaces` flag, will cause npm -to operate only on the specified workspaces, and not on the root -project. +When false, specifying individual workspaces via the `workspace` config, or +all workspaces via the `workspaces` flag, will cause npm to operate only on +the specified workspaces, and not on the root project. This value is not exported to the environment for child processes. diff --git a/deps/npm/docs/content/commands/npm.md b/deps/npm/docs/content/commands/npm.md index c53944048cf8a7..6d10a81bfde80d 100644 --- a/deps/npm/docs/content/commands/npm.md +++ b/deps/npm/docs/content/commands/npm.md @@ -14,7 +14,7 @@ Note: This command is unaware of workspaces. ### Version -11.6.2 +11.6.3 ### Description diff --git a/deps/npm/docs/content/using-npm/config.md b/deps/npm/docs/content/using-npm/config.md index 0118e280407797..e3d92d0f80bec5 100644 --- a/deps/npm/docs/content/using-npm/config.md +++ b/deps/npm/docs/content/using-npm/config.md @@ -116,21 +116,20 @@ npm ls --global --parseable --long --loglevel info * Default: null * Type: null or String -A basic-auth string to use when authenticating against the npm -registry. This will ONLY be used to authenticate against the npm -registry. For other registries you will need to scope it like -"//other-registry.tld/:_auth" +A basic-auth string to use when authenticating against the npm registry. +This will ONLY be used to authenticate against the npm registry. For other +registries you will need to scope it like "//other-registry.tld/:_auth" -Warning: This should generally not be set via a command-line option. -It is safer to use a registry-provided authentication bearer token -stored in the ~/.npmrc file by running `npm login`. +Warning: This should generally not be set via a command-line option. It is +safer to use a registry-provided authentication bearer token stored in the +~/.npmrc file by running `npm login`. #### `access` -* Default: 'public' for new packages, existing packages it will not - change the current level +* Default: 'public' for new packages, existing packages it will not change the + current level * Type: null, "restricted", or "public" If you do not want your scoped package to be publicly viewable (and @@ -138,10 +137,10 @@ installable) set `--access=restricted`. Unscoped packages cannot be set to `restricted`. -Note: This defaults to not changing the current access level for -existing packages. Specifying a value of `restricted` or `public` -during publish will change the access for an existing package the -same way that `npm access set status` would. +Note: This defaults to not changing the current access level for existing +packages. Specifying a value of `restricted` or `public` during publish will +change the access for an existing package the same way that `npm access set +status` would. @@ -150,9 +149,9 @@ same way that `npm access set status` would. * Default: false * Type: Boolean -When running `npm outdated` and `npm ls`, setting `--all` will show -all outdated or installed packages, rather than only those directly -depended upon by the current project. +When running `npm outdated` and `npm ls`, setting `--all` will show all +outdated or installed packages, rather than only those directly depended +upon by the current project. @@ -161,8 +160,8 @@ depended upon by the current project. * Default: false * Type: Boolean -Prevents throwing an error when `npm version` is used to set the new -version to the same value as the current version. +Prevents throwing an error when `npm version` is used to set the new version +to the same value as the current version. @@ -171,10 +170,10 @@ version to the same value as the current version. * Default: true * Type: Boolean -When "true" submit audit reports alongside the current npm command to -the default registry and all registries configured for scopes. See -the documentation for [`npm audit`](/commands/npm-audit) for details -on what is submitted. +When "true" submit audit reports alongside the current npm command to the +default registry and all registries configured for scopes. See the +documentation for [`npm audit`](/commands/npm-audit) for details on what is +submitted. @@ -183,8 +182,8 @@ on what is submitted. * Default: null * Type: null, "info", "low", "moderate", "high", "critical", or "none" -The minimum level of vulnerability for `npm audit` to exit with a -non-zero exit code. +The minimum level of vulnerability for `npm audit` to exit with a non-zero +exit code. @@ -193,8 +192,8 @@ non-zero exit code. * Default: "web" * Type: "legacy" or "web" -What authentication strategy to use with `login`. Note that if an -`otp` config is given, this value will always be set to `legacy`. +What authentication strategy to use with `login`. Note that if an `otp` +config is given, this value will always be set to `legacy`. @@ -204,14 +203,14 @@ What authentication strategy to use with `login`. Note that if an * Type: null or Date If passed to `npm install`, will rebuild the npm tree such that only -versions that were available **on or before** the given date are -installed. If there are no versions available for the current set of -dependencies, the command will error. +versions that were available **on or before** the given date are installed. +If there are no versions available for the current set of dependencies, the +command will error. -If the requested version is a `dist-tag` and the given tag does not -pass the `--before` filter, the most recent version less than or -equal to that tag will be used. For example, `foo@latest` might -install `foo@1.2` even though `latest` is `2.0`. +If the requested version is a `dist-tag` and the given tag does not pass the +`--before` filter, the most recent version less than or equal to that tag +will be used. For example, `foo@latest` might install `foo@1.2` even though +`latest` is `2.0`. @@ -223,9 +222,9 @@ install `foo@1.2` even though `latest` is `2.0`. Tells npm to create symlinks (or `.cmd` shims on Windows) for package executables. -Set to false to have it not do this. This can be used to work around -the fact that some file systems don't support symlinks, even on -ostensibly Unix systems. +Set to false to have it not do this. This can be used to work around the +fact that some file systems don't support symlinks, even on ostensibly Unix +systems. @@ -243,22 +242,33 @@ Set to `true` to use default system URL opener. +#### `bypass-2fa` + +* Default: false +* Type: Boolean + +When creating a Granular Access Token with `npm token create`, setting this +to true will allow the token to bypass two-factor authentication. This is +useful for automation and CI/CD workflows. + + + #### `ca` * Default: null * Type: null or String (can be set multiple times) The Certificate Authority signing certificate that is trusted for SSL -connections to the registry. Values should be in PEM format (Windows -calls it "Base-64 encoded X.509 (.CER)") with newlines replaced by -the string "\n". For example: +connections to the registry. Values should be in PEM format (Windows calls +it "Base-64 encoded X.509 (.CER)") with newlines replaced by the string +"\n". For example: ```ini ca="-----BEGIN CERTIFICATE-----\nXXXX\nXXXX\n-----END CERTIFICATE-----" ``` -Set to `null` to only allow "known" registrars, or to a specific CA -cert to trust only that specific signing authority. +Set to `null` to only allow "known" registrars, or to a specific CA cert to +trust only that specific signing authority. Multiple CAs can be trusted by specifying an array of certificates: @@ -285,10 +295,9 @@ The location of npm's cache directory. * Default: null * Type: Path -A path to a file containing one or multiple Certificate Authority -signing certificates. Similar to the `ca` setting, but allows for -multiple CA's, as well as for the CA information to be stored in a -file on disk. +A path to a file containing one or multiple Certificate Authority signing +certificates. Similar to the `ca` setting, but allows for multiple CA's, as +well as for the CA information to be stored in a file on disk. @@ -297,9 +306,8 @@ file on disk. * Default: "" * Type: String -Optional companion option for `npm exec`, `npx` that allows for -specifying a custom command to be run along with the installed -packages. +Optional companion option for `npm exec`, `npx` that allows for specifying a +custom command to be run along with the installed packages. ```bash npm exec --package yo --package generator-node --call "yo node" @@ -312,19 +320,18 @@ npm exec --package yo --package generator-node --call "yo node" * Default: null * Type: null or String (can be set multiple times) -This is a list of CIDR address to be used when configuring limited -access tokens with the `npm token create` command. +This is a list of CIDR address to be used when configuring limited access +tokens with the `npm token create` command. #### `color` -* Default: true unless the NO_COLOR environ is set to something other - than '0' +* Default: true unless the NO_COLOR environ is set to something other than '0' * Type: "always" or Boolean -If false, never shows colors. If `"always"` then always shows colors. -If true, then only prints color codes for tty file descriptors. +If false, never shows colors. If `"always"` then always shows colors. If +true, then only prints color codes for tty file descriptors. @@ -342,9 +349,8 @@ Run git commit hooks when using the `npm version` command. * Default: null * Type: null or String -Override CPU architecture of native modules to install. Acceptable -values are same as `cpu` field of package.json, which comes from -`process.arch`. +Override CPU architecture of native modules to install. Acceptable values +are same as `cpu` field of package.json, which comes from `process.arch`. @@ -355,9 +361,8 @@ values are same as `cpu` field of package.json, which comes from The depth to go when recursing packages for `npm ls`. -If not set, `npm ls` will show only the immediate dependencies of the -root project. If `--all` is set, then npm will show all dependencies -by default. +If not set, `npm ls` will show only the immediate dependencies of the root +project. If `--all` is set, then npm will show all dependencies by default. @@ -450,14 +455,13 @@ The number of lines of context to print in `npm diff`. * Default: false * Type: Boolean -Indicates that you don't want npm to make any changes and that it -should only report what it would have done. This can be passed into -any of the commands that modify your local installation, eg, -`install`, `update`, `dedupe`, `uninstall`, as well as `pack` and -`publish`. +Indicates that you don't want npm to make any changes and that it should +only report what it would have done. This can be passed into any of the +commands that modify your local installation, eg, `install`, `update`, +`dedupe`, `uninstall`, as well as `pack` and `publish`. -Note: This is NOT honored by other network related commands, eg -`dist-tags`, `owner`, etc. +Note: This is NOT honored by other network related commands, eg `dist-tags`, +`owner`, etc. @@ -476,9 +480,9 @@ The command to run for `npm edit` and `npm config edit`. * Default: false * Type: Boolean -If set to true, then npm will stubbornly refuse to install (or even -consider installing) any package that claims to not be compatible -with the current Node.js version. +If set to true, then npm will stubbornly refuse to install (or even consider +installing) any package that claims to not be compatible with the current +Node.js version. This can be overridden by setting the `--force` flag. @@ -498,21 +502,32 @@ This config cannot be used with: `expect-results` * Default: null * Type: null or Boolean -Tells npm whether or not to expect results from the command. Can be -either true (expect some results) or false (expect no results). +Tells npm whether or not to expect results from the command. Can be either +true (expect some results) or false (expect no results). This config cannot be used with: `expect-result-count` +#### `expires` + +* Default: null +* Type: null or Number + +When creating a Granular Access Token with `npm token create`, this sets the +expiration in days. If not specified, the server will determine the default +expiration. + + + #### `fetch-retries` * Default: 2 * Type: Number -The "retries" config for the `retry` module to use when fetching -packages from the registry. +The "retries" config for the `retry` module to use when fetching packages +from the registry. -npm will retry idempotent read requests to the registry in the case -of network failures or 5xx HTTP errors. +npm will retry idempotent read requests to the registry in the case of +network failures or 5xx HTTP errors. @@ -521,8 +536,7 @@ of network failures or 5xx HTTP errors. * Default: 10 * Type: Number -The "factor" config for the `retry` module to use when fetching -packages. +The "factor" config for the `retry` module to use when fetching packages. @@ -566,16 +580,14 @@ mistakes, unnecessary performance degradation, and malicious input. * Allow clobbering non-npm files in global installs. * Allow the `npm version` command to work on an unclean git repository. * Allow deleting the cache folder with `npm cache clean`. -* Allow installing packages that have an `engines` declaration - requiring a different version of npm. -* Allow installing packages that have an `engines` declaration - requiring a different version of `node`, even if `--engine-strict` is - enabled. -* Allow `npm audit fix` to install modules outside your stated - dependency range (including SemVer-major changes). +* Allow installing packages that have an `engines` declaration requiring a + different version of npm. +* Allow installing packages that have an `engines` declaration requiring a + different version of `node`, even if `--engine-strict` is enabled. +* Allow `npm audit fix` to install modules outside your stated dependency + range (including SemVer-major changes). * Allow unpublishing all versions of a published package. -* Allow conflicting peerDependencies to be installed in the root - project. +* Allow conflicting peerDependencies to be installed in the root project. * Implicitly set `--yes` during `npm init`. * Allow clobbering existing values in `npm pkg` * Allow unpublishing of entire packages (not just a single version). @@ -587,17 +599,16 @@ recommended that you do not use this option! #### `foreground-scripts` -* Default: `false` unless when using `npm pack` or `npm publish` where - it defaults to `true` +* Default: `false` unless when using `npm pack` or `npm publish` where it + defaults to `true` * Type: Boolean -Run all build scripts (ie, `preinstall`, `install`, and -`postinstall`) scripts for installed packages in the foreground -process, sharing standard input, output, and error with the main npm -process. +Run all build scripts (ie, `preinstall`, `install`, and `postinstall`) +scripts for installed packages in the foreground process, sharing standard +input, output, and error with the main npm process. -Note that this will generally make installs run slower, and be much -noisier, but can be useful for debugging. +Note that this will generally make installs run slower, and be much noisier, +but can be useful for debugging. @@ -606,8 +617,8 @@ noisier, but can be useful for debugging. * Default: true * Type: Boolean -Format `package-lock.json` or `npm-shrinkwrap.json` as a human -readable file. +Format `package-lock.json` or `npm-shrinkwrap.json` as a human readable +file. @@ -617,8 +628,8 @@ readable file. * Type: Boolean When "true" displays the message at the end of each `npm install` -acknowledging the number of dependencies looking for funding. See -[`npm fund`](/commands/npm-fund) for details. +acknowledging the number of dependencies looking for funding. See [`npm +fund`](/commands/npm-fund) for details. @@ -627,9 +638,8 @@ acknowledging the number of dependencies looking for funding. See * Default: "git" * Type: String -The command to use for git commands. If git is installed on the -computer, but is not in the `PATH`, then set this to the full path to -the git binary. +The command to use for git commands. If git is installed on the computer, +but is not in the `PATH`, then set this to the full path to the git binary. @@ -638,8 +648,8 @@ the git binary. * Default: true * Type: Boolean -Tag the commit when using the `npm version` command. Setting this to -false results in no commit being made at all. +Tag the commit when using the `npm version` command. Setting this to false +results in no commit being made at all. @@ -648,13 +658,12 @@ false results in no commit being made at all. * Default: false * Type: Boolean -Operates in "global" mode, so that packages are installed into the -`prefix` folder instead of the current working directory. See -[folders](/configuring-npm/folders) for more on the differences in -behavior. +Operates in "global" mode, so that packages are installed into the `prefix` +folder instead of the current working directory. See +[folders](/configuring-npm/folders) for more on the differences in behavior. -* packages are installed into the `{prefix}/lib/node_modules` folder, - instead of the current working directory. +* packages are installed into the `{prefix}/lib/node_modules` folder, instead + of the current working directory. * bin files are linked to `{prefix}/bin` * man pages are linked to `{prefix}/share/man` @@ -685,9 +694,9 @@ The string that starts all the debugging log output. * Type: null or URL A proxy to use for outgoing https requests. If the `HTTPS_PROXY` or -`https_proxy` or `HTTP_PROXY` or `http_proxy` environment variables -are set, proxy settings will be honored by the underlying -`make-fetch-happen` library. +`https_proxy` or `HTTP_PROXY` or `http_proxy` environment variables are set, +proxy settings will be honored by the underlying `make-fetch-happen` +library. @@ -696,12 +705,12 @@ are set, proxy settings will be honored by the underlying * Default: false * Type: Boolean -If true, npm will not exit with an error code when `run` is invoked -for a script that isn't defined in the `scripts` section of -`package.json`. This option can be used when it's desirable to -optionally run a script when it's present and fail if the script -fails. This is useful, for example, when running scripts that may -only apply for some builds in an otherwise generic CI setup. +If true, npm will not exit with an error code when `run` is invoked for a +script that isn't defined in the `scripts` section of `package.json`. This +option can be used when it's desirable to optionally run a script when it's +present and fail if the script fails. This is useful, for example, when +running scripts that may only apply for some builds in an otherwise generic +CI setup. This value is not exported to the environment for child processes. @@ -712,27 +721,24 @@ This value is not exported to the environment for child processes. If true, npm does not run scripts specified in package.json files. -Note that commands explicitly intended to run a particular script, -such as `npm start`, `npm stop`, `npm restart`, `npm test`, and `npm -run` will still run their intended script if `ignore-scripts` is set, -but they will *not* run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as +`npm start`, `npm stop`, `npm restart`, `npm test`, and `npm run` will still +run their intended script if `ignore-scripts` is set, but they will *not* +run any pre- or post-scripts. #### `include` * Default: -* Type: "prod", "dev", "optional", or "peer" (can be set multiple - times) +* Type: "prod", "dev", "optional", or "peer" (can be set multiple times) -Option that allows for defining which types of dependencies to -install. +Option that allows for defining which types of dependencies to install. This is the inverse of `--omit=`. -Dependency types specified in `--include` will not be omitted, -regardless of the order in which omit/include are specified on the -command-line. +Dependency types specified in `--include` will not be omitted, regardless of +the order in which omit/include are specified on the command-line. @@ -741,8 +747,8 @@ command-line. * Default: false * Type: Boolean -Allow installing "staged" published packages, as defined by [npm RFC -PR #92](https://github.com/npm/rfcs/pull/92). +Allow installing "staged" published packages, as defined by [npm RFC PR +#92](https://github.com/npm/rfcs/pull/92). This is experimental, and not implemented by the npm public registry. @@ -755,10 +761,9 @@ This is experimental, and not implemented by the npm public registry. Include the workspace root when workspaces are enabled for a command. -When false, specifying individual workspaces via the `workspace` -config, or all workspaces via the `workspaces` flag, will cause npm -to operate only on the specified workspaces, and not on the root -project. +When false, specifying individual workspaces via the `workspace` config, or +all workspaces via the `workspaces` flag, will cause npm to operate only on +the specified workspaces, and not on the root project. This value is not exported to the environment for child processes. @@ -767,8 +772,7 @@ This value is not exported to the environment for child processes. * Default: "" * Type: String -The value `npm init` should use by default for the package author's -email. +The value `npm init` should use by default for the package author's email. @@ -777,8 +781,7 @@ email. * Default: "" * Type: String -The value `npm init` should use by default for the package author's -name. +The value `npm init` should use by default for the package author's name. @@ -808,8 +811,8 @@ The value `npm init` should use by default for the package license. A module that will be loaded by the `npm init` command. See the documentation for the -[init-package-json](https://github.com/npm/init-package-json) module -for more information, or [npm init](/commands/npm-init). +[init-package-json](https://github.com/npm/init-package-json) module for +more information, or [npm init](/commands/npm-init). @@ -818,8 +821,7 @@ for more information, or [npm init](/commands/npm-init). * Default: false * Type: Boolean -The value `npm init` should use by default for the package's private -flag. +The value `npm init` should use by default for the package's private flag. @@ -828,8 +830,8 @@ flag. * Default: "commonjs" * Type: String -The value that `npm init` should use by default for the package.json -type field. +The value that `npm init` should use by default for the package.json type +field. @@ -838,8 +840,8 @@ type field. * Default: "1.0.0" * Type: SemVer string -The value that `npm init` should use by default for the package -version number, if not already set in package.json. +The value that `npm init` should use by default for the package version +number, if not already set in package.json. @@ -848,9 +850,9 @@ version number, if not already set in package.json. * Default: false * Type: Boolean -When set file: protocol dependencies will be packed and installed as -regular dependencies instead of creating a symlink. This option has -no effect on workspaces. +When set file: protocol dependencies will be packed and installed as regular +dependencies instead of creating a symlink. This option has no effect on +workspaces. @@ -860,12 +862,11 @@ no effect on workspaces. * Type: "hoisted", "nested", "shallow", or "linked" Sets the strategy for installing packages in node_modules. hoisted -(default): Install non-duplicated in top-level, and duplicated as -necessary within directory structure. nested: (formerly ---legacy-bundling) install in place, no hoisting. shallow (formerly ---global-style) only install direct deps at top-level. linked: -(experimental) install in node_modules/.store, link in place, -unhoisted. +(default): Install non-duplicated in top-level, and duplicated as necessary +within directory structure. nested: (formerly --legacy-bundling) install in +place, no hoisting. shallow (formerly --global-style) only install direct +deps at top-level. linked: (experimental) install in node_modules/.store, +link in place, unhoisted. @@ -876,8 +877,8 @@ unhoisted. Whether or not to output JSON data, rather than the normal output. -* In `npm pkg set` it enables parsing set values with JSON.parse() - before saving them to your `package.json`. +* In `npm pkg set` it enables parsing set values with JSON.parse() before + saving them to your `package.json`. Not supported by all npm commands. @@ -888,19 +889,18 @@ Not supported by all npm commands. * Default: false * Type: Boolean -Causes npm to completely ignore `peerDependencies` when building a -package tree, as in npm versions 3 through 6. +Causes npm to completely ignore `peerDependencies` when building a package +tree, as in npm versions 3 through 6. -If a package cannot be installed because of overly strict -`peerDependencies` that collide, it provides a way to move forward -resolving the situation. +If a package cannot be installed because of overly strict `peerDependencies` +that collide, it provides a way to move forward resolving the situation. -This differs from `--omit=peer`, in that `--omit=peer` will avoid -unpacking `peerDependencies` on disk, but will still design a tree -such that `peerDependencies` _could_ be unpacked in a correct place. +This differs from `--omit=peer`, in that `--omit=peer` will avoid unpacking +`peerDependencies` on disk, but will still design a tree such that +`peerDependencies` _could_ be unpacked in a correct place. -Use of `legacy-peer-deps` is not recommended, as it will not enforce -the `peerDependencies` contract that meta-dependencies may rely on. +Use of `legacy-peer-deps` is not recommended, as it will not enforce the +`peerDependencies` contract that meta-dependencies may rely on. @@ -909,8 +909,8 @@ the `peerDependencies` contract that meta-dependencies may rely on. * Default: null * Type: null or String -Override libc of native modules to install. Acceptable values are -same as `libc` field of package.json +Override libc of native modules to install. Acceptable values are same as +`libc` field of package.json @@ -919,8 +919,7 @@ same as `libc` field of package.json * Default: false * Type: Boolean -Used with `npm ls`, limiting output to only those packages that are -linked. +Used with `npm ls`, limiting output to only those packages that are linked. @@ -929,26 +928,25 @@ linked. * Default: null * Type: IP Address -The IP address of the local interface to use when making connections -to the npm registry. Must be IPv4 in versions of Node prior to 0.12. +The IP address of the local interface to use when making connections to the +npm registry. Must be IPv4 in versions of Node prior to 0.12. #### `location` -* Default: "user" unless `--global` is passed, which will also set this - value to "global" +* Default: "user" unless `--global` is passed, which will also set this value + to "global" * Type: "global", "user", or "project" When passed to `npm config` this refers to which config file to use. -When set to "global" mode, packages are installed into the `prefix` -folder instead of the current working directory. See -[folders](/configuring-npm/folders) for more on the differences in -behavior. +When set to "global" mode, packages are installed into the `prefix` folder +instead of the current working directory. See +[folders](/configuring-npm/folders) for more on the differences in behavior. -* packages are installed into the `{prefix}/lib/node_modules` folder, - instead of the current working directory. +* packages are installed into the `{prefix}/lib/node_modules` folder, instead + of the current working directory. * bin files are linked to `{prefix}/bin` * man pages are linked to `{prefix}/share/man` @@ -956,39 +954,36 @@ behavior. #### `lockfile-version` -* Default: Version 3 if no lockfile, auto-converting v1 lockfiles to - v3; otherwise, maintain current lockfile version. +* Default: Version 3 if no lockfile, auto-converting v1 lockfiles to v3; + otherwise, maintain current lockfile version. * Type: null, 1, 2, 3, "1", "2", or "3" Set the lockfile format version to be used in package-lock.json and npm-shrinkwrap-json files. Possible options are: -1: The lockfile version used by npm versions 5 and 6. Lacks some data -that is used during the install, resulting in slower and possibly -less deterministic installs. Prevents lockfile churn when -interoperating with older npm versions. +1: The lockfile version used by npm versions 5 and 6. Lacks some data that +is used during the install, resulting in slower and possibly less +deterministic installs. Prevents lockfile churn when interoperating with +older npm versions. -2: The default lockfile version used by npm version 7 and 8. Includes -both the version 1 lockfile data and version 3 lockfile data, for -maximum determinism and interoperability, at the expense of more -bytes on disk. +2: The default lockfile version used by npm version 7 and 8. Includes both +the version 1 lockfile data and version 3 lockfile data, for maximum +determinism and interoperability, at the expense of more bytes on disk. -3: Only the new lockfile information introduced in npm version 7. -Smaller on disk than lockfile version 2, but not interoperable with -older npm versions. Ideal if all users are on npm version 7 and -higher. +3: Only the new lockfile information introduced in npm version 7. Smaller on +disk than lockfile version 2, but not interoperable with older npm versions. +Ideal if all users are on npm version 7 and higher. #### `loglevel` * Default: "notice" -* Type: "silent", "error", "warn", "notice", "http", "info", "verbose", - or "silly" +* Type: "silent", "error", "warn", "notice", "http", "info", "verbose", or + "silly" -What level of logs to report. All logs are written to a debug log, -with the path to that file printed if the execution of a command -fails. +What level of logs to report. All logs are written to a debug log, with the +path to that file printed if the execution of a command fails. Any logs of a higher level than the setting are shown. The default is "notice". @@ -1002,8 +997,8 @@ See also the `foreground-scripts` config. * Default: A directory named `_logs` inside the cache * Type: null or Path -The location of npm's log directory. See [`npm -logging`](/using-npm/logging) for more information. +The location of npm's log directory. See [`npm logging`](/using-npm/logging) +for more information. @@ -1032,8 +1027,8 @@ Show extended information in `ls`, `search`, and `help-search`. * Default: 15 * Type: Number -The maximum number of connections to use per origin -(protocol/host/port combination). +The maximum number of connections to use per origin (protocol/host/port +combination). @@ -1042,23 +1037,32 @@ The maximum number of connections to use per origin * Default: "%s" * Type: String -Commit message which is used by `npm version` when creating version -commit. +Commit message which is used by `npm version` when creating version commit. Any "%s" in the message will be replaced with the version number. +#### `name` + +* Default: null +* Type: null or String + +When creating a Granular Access Token with `npm token create`, this sets the +name/description for the token. + + + #### `node-gyp` * Default: The path to the node-gyp bin that ships with npm * Type: Path -This is the location of the "node-gyp" bin. By default it uses one -that ships with npm itself. +This is the location of the "node-gyp" bin. By default it uses one that +ships with npm itself. -You can use this config to specify your own "node-gyp" to run when it -is required to build a package. +You can use this config to specify your own "node-gyp" to run when it is +required to build a package. @@ -1068,8 +1072,8 @@ is required to build a package. * Type: null or String Options to pass through to Node.js via the `NODE_OPTIONS` environment -variable. This does not impact how npm itself is executed but it does -impact how lifecycle scripts are called. +variable. This does not impact how npm itself is executed but it does impact +how lifecycle scripts are called. @@ -1089,9 +1093,8 @@ Also accepts a comma-delimited string. * Default: false * Type: Boolean -Force offline mode: no network requests will be done during install. -To allow the CLI to fill in missing cache data, see -`--prefer-offline`. +Force offline mode: no network requests will be done during install. To +allow the CLI to fill in missing cache data, see `--prefer-offline`. @@ -1107,12 +1110,11 @@ Note that these dependencies _are_ still resolved and added to the `package-lock.json` or `npm-shrinkwrap.json` file. They are just not physically installed on disk. -If a package type appears in both the `--include` and `--omit` lists, -then it will be included. +If a package type appears in both the `--include` and `--omit` lists, then +it will be included. -If the resulting omit list includes `'dev'`, then the `NODE_ENV` -environment variable will be set to `'production'` for all lifecycle -scripts. +If the resulting omit list includes `'dev'`, then the `NODE_ENV` environment +variable will be set to `'production'` for all lifecycle scripts. @@ -1121,10 +1123,32 @@ scripts. * Default: false * Type: Boolean -This option causes npm to create lock files without a `resolved` key -for registry dependencies. Subsequent installs will need to resolve -tarball endpoints with the configured registry, likely resulting in a -longer install time. +This option causes npm to create lock files without a `resolved` key for +registry dependencies. Subsequent installs will need to resolve tarball +endpoints with the configured registry, likely resulting in a longer install +time. + + + +#### `orgs` + +* Default: null +* Type: null or String (can be set multiple times) + +When creating a Granular Access Token with `npm token create`, this limits +the token access to specific organizations. Provide a comma-separated list +of organization names. + + + +#### `orgs-permission` + +* Default: null +* Type: null, "read-only", "read-write", or "no-access" + +When creating a Granular Access Token with `npm token create`, sets the +permission level for organizations. Options are "read-only", "read-write", +or "no-access". @@ -1133,8 +1157,8 @@ longer install time. * Default: null * Type: null or String -Override OS of native modules to install. Acceptable values are same -as `os` field of package.json, which comes from `process.platform`. +Override OS of native modules to install. Acceptable values are same as `os` +field of package.json, which comes from `process.platform`. @@ -1143,12 +1167,11 @@ as `os` field of package.json, which comes from `process.platform`. * Default: null * Type: null or String -This is a one-time password from a two-factor authenticator. It's -needed when publishing or changing package permissions with `npm -access`. +This is a one-time password from a two-factor authenticator. It's needed +when publishing or changing package permissions with `npm access`. -If not set, and a registry response fails with a challenge for a -one-time password, npm will prompt on the command line for one. +If not set, and a registry response fails with a challenge for a one-time +password, npm will prompt on the command line for one. @@ -1166,8 +1189,7 @@ Directory in which `npm pack` will save tarballs. * Default: * Type: String (can be set multiple times) -The package or packages to install for [`npm -exec`](/commands/npm-exec) +The package or packages to install for [`npm exec`](/commands/npm-exec) @@ -1176,9 +1198,8 @@ exec`](/commands/npm-exec) * Default: true * Type: Boolean -If set to false, then ignore `package-lock.json` files when -installing. This will also prevent _writing_ `package-lock.json` if -`save` is true. +If set to false, then ignore `package-lock.json` files when installing. This +will also prevent _writing_ `package-lock.json` if `save` is true. @@ -1187,15 +1208,46 @@ installing. This will also prevent _writing_ `package-lock.json` if * Default: false * Type: Boolean -If set to true, the current operation will only use the -`package-lock.json`, ignoring `node_modules`. +If set to true, the current operation will only use the `package-lock.json`, +ignoring `node_modules`. For `update` this means only the `package-lock.json` will be updated, instead of checking `node_modules` and downloading dependencies. -For `list` this means the output will be based on the tree described -by the `package-lock.json`, rather than the contents of -`node_modules`. +For `list` this means the output will be based on the tree described by the +`package-lock.json`, rather than the contents of `node_modules`. + + + +#### `packages` + +* Default: +* Type: null or String (can be set multiple times) + +When creating a Granular Access Token with `npm token create`, this limits +the token access to specific packages. Provide a comma-separated list of +package names. + + + +#### `packages-all` + +* Default: false +* Type: Boolean + +When creating a Granular Access Token with `npm token create`, grants the +token access to all packages instead of limiting to specific packages. + + + +#### `packages-and-scopes-permission` + +* Default: null +* Type: null, "read-only", "read-write", or "no-access" + +When creating a Granular Access Token with `npm token create`, sets the +permission level for packages and scopes. Options are "read-only", +"read-write", or "no-access". @@ -1204,8 +1256,18 @@ by the `package-lock.json`, rather than the contents of * Default: false * Type: Boolean -Output parseable results from commands that write to standard output. -For `npm search`, this will be tab-separated table format. +Output parseable results from commands that write to standard output. For +`npm search`, this will be tab-separated table format. + + + +#### `password` + +* Default: null +* Type: null or String + +Password for authentication. Can be provided via command line when creating +tokens, though it's generally safer to be prompted for it. @@ -1214,8 +1276,8 @@ For `npm search`, this will be tab-separated table format. * Default: false * Type: Boolean -Prefer to deduplicate packages if possible, rather than choosing a -newer version of a dependency. +Prefer to deduplicate packages if possible, rather than choosing a newer +version of a dependency. @@ -1224,9 +1286,9 @@ newer version of a dependency. * Default: false * Type: Boolean -If true, staleness checks for cached data will be bypassed, but -missing data will be requested from the server. To force full offline -mode, use `--offline`. +If true, staleness checks for cached data will be bypassed, but missing data +will be requested from the server. To force full offline mode, use +`--offline`. @@ -1235,20 +1297,20 @@ mode, use `--offline`. * Default: false * Type: Boolean -If true, staleness checks for cached data will be forced, making the -CLI look for updates immediately even for fresh package data. +If true, staleness checks for cached data will be forced, making the CLI +look for updates immediately even for fresh package data. #### `prefix` -* Default: In global mode, the folder where the node executable is - installed. Otherwise, the nearest parent folder containing either a - package.json file or a node_modules folder. +* Default: In global mode, the folder where the node executable is installed. + Otherwise, the nearest parent folder containing either a package.json file + or a node_modules folder. * Type: Path -The location to install global items. If set on the command line, -then it forces non-global commands to run in the specified folder. +The location to install global items. If set on the command line, then it +forces non-global commands to run in the specified folder. @@ -1257,20 +1319,19 @@ then it forces non-global commands to run in the specified folder. * Default: "" * Type: String -The "prerelease identifier" to use as a prefix for the "prerelease" -part of a semver. Like the `rc` in `1.2.0-rc.8`. +The "prerelease identifier" to use as a prefix for the "prerelease" part of +a semver. Like the `rc` in `1.2.0-rc.8`. #### `progress` -* Default: `true` when not in CI and both stderr and stdout are TTYs - and not in a dumb terminal +* Default: `true` when not in CI and both stderr and stdout are TTYs and not + in a dumb terminal * Type: Boolean -When set to `true`, npm will display a progress bar during time -intensive operations, if `process.stderr` and `process.stdout` are a -TTY. +When set to `true`, npm will display a progress bar during time intensive +operations, if `process.stderr` and `process.stdout` are a TTY. Set to `false` to suppress the progress bar. @@ -1281,8 +1342,8 @@ Set to `false` to suppress the progress bar. * Default: false * Type: Boolean -When publishing from a supported cloud CI/CD system, the package will -be publicly linked to where it was built and published from. +When publishing from a supported cloud CI/CD system, the package will be +publicly linked to where it was built and published from. This config cannot be used with: `provenance-file` @@ -1291,8 +1352,7 @@ This config cannot be used with: `provenance-file` * Default: null * Type: Path -When publishing, the provenance bundle at the given path will be -used. +When publishing, the provenance bundle at the given path will be used. This config cannot be used with: `provenance` @@ -1302,8 +1362,8 @@ This config cannot be used with: `provenance` * Type: null, false, or URL A proxy to use for outgoing http requests. If the `HTTP_PROXY` or -`http_proxy` environment variables are set, proxy settings will be -honored by the underlying `request` library. +`http_proxy` environment variables are set, proxy settings will be honored +by the underlying `request` library. @@ -1312,8 +1372,8 @@ honored by the underlying `request` library. * Default: false * Type: Boolean -This is used to mark a token as unable to publish when configuring -limited access tokens with the `npm token create` command. +This is used to mark a token as unable to publish when configuring limited +access tokens with the `npm token create` command. @@ -1340,13 +1400,13 @@ The base URL of the npm registry. * Default: "npmjs" * Type: "npmjs", "never", "always", or String -Defines behavior for replacing the registry host in a lockfile with -the configured registry. +Defines behavior for replacing the registry host in a lockfile with the +configured registry. The default behavior is to replace package dist URLs from the default -registry (https://registry.npmjs.org) to the configured registry. If -set to "never", then use the registry value. If set to "always", then -replace the registry host with the configured host every time. +registry (https://registry.npmjs.org) to the configured registry. If set to +"never", then use the registry value. If set to "always", then replace the +registry host with the configured host every time. You may also specify a bare hostname (e.g., "registry.npmjs.org"). @@ -1354,8 +1414,7 @@ You may also specify a bare hostname (e.g., "registry.npmjs.org"). #### `save` -* Default: `true` unless when using `npm update` where it defaults to - `false` +* Default: `true` unless when using `npm update` where it defaults to `false` * Type: Boolean Save installed packages to a `package.json` file as dependencies. @@ -1376,8 +1435,7 @@ If a package would be saved at install time by the use of `--save`, `--save-dev`, or `--save-optional`, then also put it in the `bundleDependencies` list. -Ignored if `--save-peer` is set, since peerDependencies cannot be -bundled. +Ignored if `--save-peer` is set, since peerDependencies cannot be bundled. @@ -1388,16 +1446,15 @@ bundled. Save installed packages to a package.json file as `devDependencies`. -This config cannot be used with: `save-optional`, `save-peer`, -`save-prod` +This config cannot be used with: `save-optional`, `save-peer`, `save-prod` #### `save-exact` * Default: false * Type: Boolean -Dependencies saved to package.json will be configured with an exact -version rather than using npm's default semver range operator. +Dependencies saved to package.json will be configured with an exact version +rather than using npm's default semver range operator. @@ -1406,8 +1463,7 @@ version rather than using npm's default semver range operator. * Default: false * Type: Boolean -Save installed packages to a package.json file as -`optionalDependencies`. +Save installed packages to a package.json file as `optionalDependencies`. This config cannot be used with: `save-dev`, `save-peer`, `save-prod` @@ -1418,21 +1474,20 @@ This config cannot be used with: `save-dev`, `save-peer`, `save-prod` Save installed packages to a package.json file as `peerDependencies` -This config cannot be used with: `save-dev`, `save-optional`, -`save-prod` +This config cannot be used with: `save-dev`, `save-optional`, `save-prod` #### `save-prefix` * Default: "^" * Type: String -Configure how versions of packages installed to a package.json file -via `--save` or `--save-dev` get prefixed. +Configure how versions of packages installed to a package.json file via +`--save` or `--save-dev` get prefixed. -For example if a package has version `1.2.3`, by default its version -is set to `^1.2.3` which allows minor upgrades for that package, but -after `npm config set save-prefix='~'` it would be set to `~1.2.3` -which only allows patch upgrades. +For example if a package has version `1.2.3`, by default its version is set +to `^1.2.3` which allows minor upgrades for that package, but after `npm +config set save-prefix='~'` it would be set to `~1.2.3` which only allows +patch upgrades. @@ -1441,16 +1496,14 @@ which only allows patch upgrades. * Default: false * Type: Boolean -Save installed packages into `dependencies` specifically. This is -useful if a package already exists in `devDependencies` or -`optionalDependencies`, but you want to move it to be a non-optional -production dependency. +Save installed packages into `dependencies` specifically. This is useful if +a package already exists in `devDependencies` or `optionalDependencies`, but +you want to move it to be a non-optional production dependency. -This is the default behavior if `--save` is true, and neither -`--save-dev` or `--save-optional` are true. +This is the default behavior if `--save` is true, and neither `--save-dev` +or `--save-optional` are true. -This config cannot be used with: `save-dev`, `save-optional`, -`save-peer` +This config cannot be used with: `save-dev`, `save-optional`, `save-peer` #### `sbom-format` @@ -1466,9 +1519,9 @@ SBOM format to use when generating SBOMs. * Default: "library" * Type: "library", "application", or "framework" -The type of package described by the generated SBOM. For SPDX, this -is the value for the `primaryPackagePurpose` field. For CycloneDX, -this is the value for the `type` field. +The type of package described by the generated SBOM. For SPDX, this is the +value for the `primaryPackagePurpose` field. For CycloneDX, this is the +value for the `type` field. @@ -1503,13 +1556,24 @@ npm init --scope=@foo --yes +#### `scopes` + +* Default: null +* Type: null or String (can be set multiple times) + +When creating a Granular Access Token with `npm token create`, this limits +the token access to specific scopes. Provide a comma-separated list of scope +names (with or without @ prefix). + + + #### `script-shell` * Default: '/bin/sh' on POSIX systems, 'cmd.exe' on Windows * Type: null or String -The shell to use for scripts run with the `npm exec`, `npm run` and -`npm init ` commands. +The shell to use for scripts run with the `npm exec`, `npm run` and `npm +init ` commands. @@ -1527,8 +1591,8 @@ Space-separated options that limit the results from search. * Default: 20 * Type: Number -Number of items to limit search results to. Will not apply at all to -legacy searches. +Number of items to limit search results to. Will not apply at all to legacy +searches. @@ -1546,15 +1610,15 @@ Space-separated options that are always passed to search. * Default: 900 * Type: Number -The age of the cache, in seconds, before another registry request is -made if using legacy search endpoint. +The age of the cache, in seconds, before another registry request is made if +using legacy search endpoint. #### `shell` -* Default: SHELL environment variable, or "bash" on Posix, or "cmd.exe" - on Windows +* Default: SHELL environment variable, or "bash" on Posix, or "cmd.exe" on + Windows * Type: String The shell to run for the `npm explore` command. @@ -1566,11 +1630,11 @@ The shell to run for the `npm explore` command. * Default: false * Type: Boolean -If set to true, then the `npm version` command will commit the new -package version using `-S` to add a signature. +If set to true, then the `npm version` command will commit the new package +version using `-S` to add a signature. -Note that git requires you to have set up GPG keys in your git -configs for this to work properly. +Note that git requires you to have set up GPG keys in your git configs for +this to work properly. @@ -1579,11 +1643,11 @@ configs for this to work properly. * Default: false * Type: Boolean -If set to true, then the `npm version` command will tag the version -using `-s` to add a signature. +If set to true, then the `npm version` command will tag the version using +`-s` to add a signature. -Note that git requires you to have set up GPG keys in your git -configs for this to work properly. +Note that git requires you to have set up GPG keys in your git configs for +this to work properly. @@ -1593,19 +1657,18 @@ configs for this to work properly. * Type: Boolean If set to `true`, and `--legacy-peer-deps` is not set, then _any_ -conflicting `peerDependencies` will be treated as an install failure, -even if npm could reasonably guess the appropriate resolution based -on non-peer dependency relationships. +conflicting `peerDependencies` will be treated as an install failure, even +if npm could reasonably guess the appropriate resolution based on non-peer +dependency relationships. -By default, conflicting `peerDependencies` deep in the dependency -graph will be resolved using the nearest non-peer dependency -specification, even if doing so will result in some packages -receiving a peer dependency outside the range set in their package's -`peerDependencies` object. +By default, conflicting `peerDependencies` deep in the dependency graph will +be resolved using the nearest non-peer dependency specification, even if +doing so will result in some packages receiving a peer dependency outside +the range set in their package's `peerDependencies` object. -When such an override is performed, a warning is printed, explaining -the conflict and the packages involved. If `--strict-peer-deps` is -set, then this warning is treated as a failure. +When such an override is performed, a warning is printed, explaining the +conflict and the packages involved. If `--strict-peer-deps` is set, then +this warning is treated as a failure. @@ -1614,8 +1677,8 @@ set, then this warning is treated as a failure. * Default: true * Type: Boolean -Whether or not to do SSL key validation when making requests to the -registry via https. +Whether or not to do SSL key validation when making requests to the registry +via https. See also the `ca` config. @@ -1626,17 +1689,17 @@ See also the `ca` config. * Default: "latest" * Type: String -If you ask npm to install a package and don't tell it a specific -version, then it will install the specified tag. +If you ask npm to install a package and don't tell it a specific version, +then it will install the specified tag. -It is the tag added to the package@version specified in the `npm -dist-tag add` command, if no explicit tag is given. +It is the tag added to the package@version specified in the `npm dist-tag +add` command, if no explicit tag is given. -When used by the `npm diff` command, this is the tag used to fetch -the tarball that will be compared with the local files by default. +When used by the `npm diff` command, this is the tag used to fetch the +tarball that will be compared with the local files by default. -If used in the `npm publish` command, this is the tag that will be -added to the package submitted to the registry. +If used in the `npm publish` command, this is the tag that will be added to +the package submitted to the registry. @@ -1645,14 +1708,13 @@ added to the package submitted to the registry. * Default: "v" * Type: String -If set, alters the prefix used when tagging a new version when -performing a version increment using `npm version`. To remove the -prefix altogether, set it to the empty string: `""`. +If set, alters the prefix used when tagging a new version when performing a +version increment using `npm version`. To remove the prefix altogether, set +it to the empty string: `""`. -Because other tools may rely on the convention that npm version tags -look like `v1.0.0`, _only use this property if it is absolutely -necessary_. In particular, use care when overriding this setting for -public packages. +Because other tools may rely on the convention that npm version tags look +like `v1.0.0`, _only use this property if it is absolutely necessary_. In +particular, use care when overriding this setting for public packages. @@ -1661,14 +1723,23 @@ public packages. * Default: false * Type: Boolean -If true, writes timing information to a process specific json file in -the cache or `logs-dir`. The file name ends with `-timing.json`. +If true, writes timing information to a process specific json file in the +cache or `logs-dir`. The file name ends with `-timing.json`. + +You can quickly view it with this [json](https://npm.im/json) command line: +`cat ~/.npm/_logs/*-timing.json | npm exec -- json -g`. + +Timing information will also be reported in the terminal. To suppress this +while still writing the timing file, use `--silent`. + + -You can quickly view it with this [json](https://npm.im/json) command -line: `cat ~/.npm/_logs/*-timing.json | npm exec -- json -g`. +#### `token-description` -Timing information will also be reported in the terminal. To suppress -this while still writing the timing file, use `--silent`. +* Default: null +* Type: null or String + +Description text for the token when using `npm token create`. @@ -1677,32 +1748,31 @@ this while still writing the timing file, use `--silent`. * Default: 0 * Type: Octal numeric string in range 0000..0777 (0..511) -The "umask" value to use when setting the file creation mode on files -and folders. +The "umask" value to use when setting the file creation mode on files and +folders. -Folders and executables are given a mode which is `0o777` masked -against this value. Other files are given a mode which is `0o666` -masked against this value. +Folders and executables are given a mode which is `0o777` masked against +this value. Other files are given a mode which is `0o666` masked against +this value. -Note that the underlying system will _also_ apply its own umask value -to files and folders that are created, and npm does not circumvent -this, but rather adds the `--umask` config to it. +Note that the underlying system will _also_ apply its own umask value to +files and folders that are created, and npm does not circumvent this, but +rather adds the `--umask` config to it. -Thus, the effective default umask value on most POSIX systems is -0o22, meaning that folders and executables are created with a mode of -0o755 and other files are created with a mode of 0o644. +Thus, the effective default umask value on most POSIX systems is 0o22, +meaning that folders and executables are created with a mode of 0o755 and +other files are created with a mode of 0o644. #### `unicode` -* Default: false on windows, true on mac/unix systems with a unicode - locale, as defined by the `LC_ALL`, `LC_CTYPE`, or `LANG` environment - variables. +* Default: false on windows, true on mac/unix systems with a unicode locale, + as defined by the `LC_ALL`, `LC_CTYPE`, or `LANG` environment variables. * Type: Boolean -When set to true, npm uses unicode characters in the tree output. -When false, it uses ascii characters instead of unicode glyphs. +When set to true, npm uses unicode characters in the tree output. When +false, it uses ascii characters instead of unicode glyphs. @@ -1711,8 +1781,8 @@ When false, it uses ascii characters instead of unicode glyphs. * Default: true * Type: Boolean -Set to false to suppress the update notification when using an older -version of npm than the latest. +Set to false to suppress the update notification when using an older version +of npm than the latest. @@ -1731,17 +1801,17 @@ Show short usage output about the command specified. workspaces/{workspaces} {ci}" * Type: String -Sets the User-Agent request header. The following fields are replaced -with their actual counterparts: +Sets the User-Agent request header. The following fields are replaced with +their actual counterparts: * `{npm-version}` - The npm version in use * `{node-version}` - The Node.js version in use * `{platform}` - The value of `process.platform` * `{arch}` - The value of `process.arch` -* `{workspaces}` - Set to `true` if the `workspaces` or `workspace` - options are set. -* `{ci}` - The value of the `ci-name` config, if set, prefixed with - `ci/`, or an empty string if `ci-name` is empty. +* `{workspaces}` - Set to `true` if the `workspaces` or `workspace` options + are set. +* `{ci}` - The value of the `ci-name` config, if set, prefixed with `ci/`, or + an empty string if `ci-name` is empty. @@ -1752,9 +1822,9 @@ with their actual counterparts: The location of user-level configuration settings. -This may be overridden by the `npm_config_userconfig` environment -variable or the `--userconfig` command line option, but may _not_ be -overridden by settings in the `globalconfig` file. +This may be overridden by the `npm_config_userconfig` environment variable +or the `--userconfig` command line option, but may _not_ be overridden by +settings in the `globalconfig` file. @@ -1774,9 +1844,9 @@ Only relevant when specified explicitly on the command line. * Default: false * Type: Boolean -If true, output the npm version as well as node's `process.versions` -map and the version in the current working directory's `package.json` -file if one exists, and exit successfully. +If true, output the npm version as well as node's `process.versions` map and +the version in the current working directory's `package.json` file if one +exists, and exit successfully. Only relevant when specified explicitly on the command line. @@ -1789,8 +1859,7 @@ Only relevant when specified explicitly on the command line. The program to use to view help content. -Set to `"browser"` to view html help content in the default web -browser. +Set to `"browser"` to view html help content in the default web browser. @@ -1799,8 +1868,7 @@ browser. * Default: null * Type: null or Number -If there are multiple funding sources, which 1-indexed source URL to -open. +If there are multiple funding sources, which 1-indexed source URL to open. @@ -1809,9 +1877,9 @@ open. * Default: * Type: String (can be set multiple times) -Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option. +Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option. Valid values for the `workspace` config are either: @@ -1820,9 +1888,9 @@ Valid values for the `workspace` config are either: * Path to a parent workspace directory (will result in selecting all workspaces within that folder) -When set for the `npm init` command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project. +When set for the `npm init` command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project. This value is not exported to the environment for child processes. @@ -1834,14 +1902,13 @@ This value is not exported to the environment for child processes. Set to true to run the command in the context of **all** configured workspaces. -Explicitly setting this to false will cause commands like `install` -to ignore workspaces altogether. When not set explicitly: +Explicitly setting this to false will cause commands like `install` to +ignore workspaces altogether. When not set explicitly: -- Commands that operate on the `node_modules` tree (install, update, -etc.) will link workspaces into the `node_modules` folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, _unless_ one or more workspaces are specified in the -`workspace` config. +- Commands that operate on the `node_modules` tree (install, update, etc.) +will link workspaces into the `node_modules` folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +_unless_ one or more workspaces are specified in the `workspace` config. This value is not exported to the environment for child processes. @@ -1850,9 +1917,8 @@ This value is not exported to the environment for child processes. * Default: true * Type: Boolean -If set to true, the npm cli will run an update after operations that -may possibly change the workspaces installed to the `node_modules` -folder. +If set to true, the npm cli will run an update after operations that may +possibly change the workspaces installed to the `node_modules` folder. @@ -1872,8 +1938,7 @@ command line. * Type: null, "dev", or "development" * DEPRECATED: Please use --include=dev instead. -When set to `dev` or `development`, this is an alias for -`--include=dev`. +When set to `dev` or `development`, this is an alias for `--include=dev`. @@ -1881,8 +1946,7 @@ When set to `dev` or `development`, this is an alias for * Default: Infinity * Type: Number -* DEPRECATED: This option has been deprecated in favor of - `--prefer-online` +* DEPRECATED: This option has been deprecated in favor of `--prefer-online` `--cache-max=0` is an alias for `--prefer-online` @@ -1892,8 +1956,7 @@ When set to `dev` or `development`, this is an alias for * Default: 0 * Type: Number -* DEPRECATED: This option has been deprecated in favor of - `--prefer-offline`. +* DEPRECATED: This option has been deprecated in favor of `--prefer-offline`. `--cache-min=9999 (or bigger)` is an alias for `--prefer-offline`. @@ -1904,13 +1967,13 @@ When set to `dev` or `development`, this is an alias for * Default: null * Type: null or String * DEPRECATED: `key` and `cert` are no longer used for most registry - operations. Use registry scoped `keyfile` and `certfile` instead. - Example: //other-registry.tld/:keyfile=/path/to/key.pem + operations. Use registry scoped `keyfile` and `certfile` instead. Example: + //other-registry.tld/:keyfile=/path/to/key.pem //other-registry.tld/:certfile=/path/to/cert.crt -A client certificate to pass when accessing the registry. Values -should be in PEM format (Windows calls it "Base-64 encoded X.509 -(.CER)") with newlines replaced by the string "\n". For example: +A client certificate to pass when accessing the registry. Values should be +in PEM format (Windows calls it "Base-64 encoded X.509 (.CER)") with +newlines replaced by the string "\n". For example: ```ini cert="-----BEGIN CERTIFICATE-----\nXXXX\nXXXX\n-----END CERTIFICATE-----" @@ -1939,8 +2002,8 @@ Alias for `--include=dev`. * DEPRECATED: This option has been deprecated in favor of `--install-strategy=shallow` -Only install direct dependencies in the top level `node_modules`, but -hoist on deeper dependencies. Sets `--install-strategy=shallow`. +Only install direct dependencies in the top level `node_modules`, but hoist +on deeper dependencies. Sets `--install-strategy=shallow`. @@ -2009,20 +2072,19 @@ Alias for `--init-version` * Default: null * Type: null or String * DEPRECATED: `key` and `cert` are no longer used for most registry - operations. Use registry scoped `keyfile` and `certfile` instead. - Example: //other-registry.tld/:keyfile=/path/to/key.pem + operations. Use registry scoped `keyfile` and `certfile` instead. Example: + //other-registry.tld/:keyfile=/path/to/key.pem //other-registry.tld/:certfile=/path/to/cert.crt -A client key to pass when accessing the registry. Values should be in -PEM format with newlines replaced by the string "\n". For example: +A client key to pass when accessing the registry. Values should be in PEM +format with newlines replaced by the string "\n". For example: ```ini key="-----BEGIN PRIVATE KEY-----\nXXXX\nXXXX\n-----END PRIVATE KEY-----" ``` -It is _not_ the path to a key file, though you can set a -registry-scoped "keyfile" path like -"//other-registry.tld/:keyfile=/path/to/key.pem". +It is _not_ the path to a key file, though you can set a registry-scoped +"keyfile" path like "//other-registry.tld/:keyfile=/path/to/key.pem". @@ -2033,10 +2095,10 @@ registry-scoped "keyfile" path like * DEPRECATED: This option has been deprecated in favor of `--install-strategy=nested` -Instead of hoisting package installs in `node_modules`, install -packages in the same manner that they are depended on. This may cause -very deep directory structures and duplicate package installs as -there is no de-duplicating. Sets `--install-strategy=nested`. +Instead of hoisting package installs in `node_modules`, install packages in +the same manner that they are depended on. This may cause very deep +directory structures and duplicate package installs as there is no +de-duplicating. Sets `--install-strategy=nested`. @@ -2044,11 +2106,9 @@ there is no de-duplicating. Sets `--install-strategy=nested`. * Default: null * Type: null, "prod", or "production" -* DEPRECATED: Use `--omit=dev` to omit dev dependencies from the - install. +* DEPRECATED: Use `--omit=dev` to omit dev dependencies from the install. -When set to `prod` or `production`, this is an alias for -`--omit=dev`. +When set to `prod` or `production`, this is an alias for `--omit=dev`. @@ -2056,8 +2116,8 @@ When set to `prod` or `production`, this is an alias for * Default: null * Type: null or Boolean -* DEPRECATED: Use `--omit=optional` to exclude optional dependencies, - or `--include=optional` to include them. +* DEPRECATED: Use `--omit=optional` to exclude optional dependencies, or + `--include=optional` to include them. Default value does install optional deps unless otherwise omitted. diff --git a/deps/npm/docs/output/commands/npm-access.html b/deps/npm/docs/output/commands/npm-access.html index 69d3f84ca3cfab..28c36edb9c4bdf 100644 --- a/deps/npm/docs/output/commands/npm-access.html +++ b/deps/npm/docs/output/commands/npm-access.html @@ -141,9 +141,9 @@
-

+

npm-access - @11.6.2 + @11.6.3

Set access level on published packages
@@ -192,8 +192,8 @@

json

Whether or not to output JSON data, rather than the normal output.

    -
  • In npm pkg set it enables parsing set values with JSON.parse() -before saving them to your package.json.
  • +
  • In npm pkg set it enables parsing set values with JSON.parse() before +saving them to your package.json.

Not supported by all npm commands.

otp

@@ -201,10 +201,10 @@

otp

  • Default: null
  • Type: null or String
  • -

    This is a one-time password from a two-factor authenticator. It's -needed when publishing or changing package permissions with npm access.

    -

    If not set, and a registry response fails with a challenge for a -one-time password, npm will prompt on the command line for one.

    +

    This is a one-time password from a two-factor authenticator. It's needed +when publishing or changing package permissions with npm access.

    +

    If not set, and a registry response fails with a challenge for a one-time +password, npm will prompt on the command line for one.

    registry

    • Default: "https://registry.npmjs.org/"
    • diff --git a/deps/npm/docs/output/commands/npm-adduser.html b/deps/npm/docs/output/commands/npm-adduser.html index 161be0cbf13350..35903fb603a650 100644 --- a/deps/npm/docs/output/commands/npm-adduser.html +++ b/deps/npm/docs/output/commands/npm-adduser.html @@ -141,9 +141,9 @@
      -

      +

      npm-adduser - @11.6.2 + @11.6.3

      Add a registry user account
      @@ -198,8 +198,8 @@

      auth-type

    • Default: "web"
    • Type: "legacy" or "web"
    -

    What authentication strategy to use with login. Note that if an -otp config is given, this value will always be set to legacy.

    +

    What authentication strategy to use with login. Note that if an otp +config is given, this value will always be set to legacy.

    See Also

    • npm registry
    • diff --git a/deps/npm/docs/output/commands/npm-audit.html b/deps/npm/docs/output/commands/npm-audit.html index c98c2a9720c770..6d530d7efb7429 100644 --- a/deps/npm/docs/output/commands/npm-audit.html +++ b/deps/npm/docs/output/commands/npm-audit.html @@ -141,9 +141,9 @@
      -

      +

      npm-audit - @11.6.2 + @11.6.3

      Run a security audit
      @@ -283,20 +283,19 @@

      audit-level

    • Default: null
    • Type: null, "info", "low", "moderate", "high", "critical", or "none"
    -

    The minimum level of vulnerability for npm audit to exit with a -non-zero exit code.

    +

    The minimum level of vulnerability for npm audit to exit with a non-zero +exit code.

    dry-run

    • Default: false
    • Type: Boolean
    -

    Indicates that you don't want npm to make any changes and that it -should only report what it would have done. This can be passed into -any of the commands that modify your local installation, eg, -install, update, dedupe, uninstall, as well as pack and -publish.

    -

    Note: This is NOT honored by other network related commands, eg -dist-tags, owner, etc.

    +

    Indicates that you don't want npm to make any changes and that it should +only report what it would have done. This can be passed into any of the +commands that modify your local installation, eg, install, update, +dedupe, uninstall, as well as pack and publish.

    +

    Note: This is NOT honored by other network related commands, eg dist-tags, +owner, etc.

    force

    • Default: false
    • @@ -308,16 +307,14 @@

      force

    • Allow clobbering non-npm files in global installs.
    • Allow the npm version command to work on an unclean git repository.
    • Allow deleting the cache folder with npm cache clean.
    • -
    • Allow installing packages that have an engines declaration -requiring a different version of npm.
    • -
    • Allow installing packages that have an engines declaration -requiring a different version of node, even if --engine-strict is -enabled.
    • -
    • Allow npm audit fix to install modules outside your stated -dependency range (including SemVer-major changes).
    • +
    • Allow installing packages that have an engines declaration requiring a +different version of npm.
    • +
    • Allow installing packages that have an engines declaration requiring a +different version of node, even if --engine-strict is enabled.
    • +
    • Allow npm audit fix to install modules outside your stated dependency +range (including SemVer-major changes).
    • Allow unpublishing all versions of a published package.
    • -
    • Allow conflicting peerDependencies to be installed in the root -project.
    • +
    • Allow conflicting peerDependencies to be installed in the root project.
    • Implicitly set --yes during npm init.
    • Allow clobbering existing values in npm pkg
    • Allow unpublishing of entire packages (not just a single version).
    • @@ -331,8 +328,8 @@

      json

    Whether or not to output JSON data, rather than the normal output.

      -
    • In npm pkg set it enables parsing set values with JSON.parse() -before saving them to your package.json.
    • +
    • In npm pkg set it enables parsing set values with JSON.parse() before +saving them to your package.json.

    Not supported by all npm commands.

    package-lock-only

    @@ -340,21 +337,19 @@

    package-lock-only

  • Default: false
  • Type: Boolean
  • -

    If set to true, the current operation will only use the -package-lock.json, ignoring node_modules.

    +

    If set to true, the current operation will only use the package-lock.json, +ignoring node_modules.

    For update this means only the package-lock.json will be updated, instead of checking node_modules and downloading dependencies.

    -

    For list this means the output will be based on the tree described -by the package-lock.json, rather than the contents of -node_modules.

    +

    For list this means the output will be based on the tree described by the +package-lock.json, rather than the contents of node_modules.

    package-lock

    • Default: true
    • Type: Boolean
    -

    If set to false, then ignore package-lock.json files when -installing. This will also prevent writing package-lock.json if -save is true.

    +

    If set to false, then ignore package-lock.json files when installing. This +will also prevent writing package-lock.json if save is true.

    omit

    • Default: 'dev' if the NODE_ENV environment variable is set to @@ -365,52 +360,48 @@

      omit

      Note that these dependencies are still resolved and added to the package-lock.json or npm-shrinkwrap.json file. They are just not physically installed on disk.

      -

      If a package type appears in both the --include and --omit lists, -then it will be included.

      -

      If the resulting omit list includes 'dev', then the NODE_ENV -environment variable will be set to 'production' for all lifecycle -scripts.

      +

      If a package type appears in both the --include and --omit lists, then +it will be included.

      +

      If the resulting omit list includes 'dev', then the NODE_ENV environment +variable will be set to 'production' for all lifecycle scripts.

      include

      • Default:
      • -
      • Type: "prod", "dev", "optional", or "peer" (can be set multiple -times)
      • +
      • Type: "prod", "dev", "optional", or "peer" (can be set multiple times)
      -

      Option that allows for defining which types of dependencies to -install.

      +

      Option that allows for defining which types of dependencies to install.

      This is the inverse of --omit=<type>.

      -

      Dependency types specified in --include will not be omitted, -regardless of the order in which omit/include are specified on the -command-line.

      +

      Dependency types specified in --include will not be omitted, regardless of +the order in which omit/include are specified on the command-line.

      foreground-scripts

        -
      • Default: false unless when using npm pack or npm publish where -it defaults to true
      • +
      • Default: false unless when using npm pack or npm publish where it +defaults to true
      • Type: Boolean
      -

      Run all build scripts (ie, preinstall, install, and -postinstall) scripts for installed packages in the foreground -process, sharing standard input, output, and error with the main npm -process.

      -

      Note that this will generally make installs run slower, and be much -noisier, but can be useful for debugging.

      +

      Run all build scripts (ie, preinstall, install, and postinstall) +scripts for installed packages in the foreground process, sharing standard +input, output, and error with the main npm process.

      +

      Note that this will generally make installs run slower, and be much noisier, +but can be useful for debugging.

      ignore-scripts

      • Default: false
      • Type: Boolean

      If true, npm does not run scripts specified in package.json files.

      -

      Note that commands explicitly intended to run a particular script, -such as npm start, npm stop, npm restart, npm test, and npm run will still run their intended script if ignore-scripts is set, -but they will not run any pre- or post-scripts.

      +

      Note that commands explicitly intended to run a particular script, such as +npm start, npm stop, npm restart, npm test, and npm run will still +run their intended script if ignore-scripts is set, but they will not +run any pre- or post-scripts.

      workspace

      • Default:
      • Type: String (can be set multiple times)
      -

      Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

      +

      Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

      Valid values for the workspace config are either:

      • Workspace names
      • @@ -418,9 +409,9 @@

        workspace

      • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
      -

      When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

      +

      When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

      This value is not exported to the environment for child processes.

      workspaces

        @@ -429,14 +420,13 @@

        workspaces

      Set to true to run the command in the context of all configured workspaces.

      -

      Explicitly setting this to false will cause commands like install -to ignore workspaces altogether. When not set explicitly:

      +

      Explicitly setting this to false will cause commands like install to +ignore workspaces altogether. When not set explicitly:

        -
      • Commands that operate on the node_modules tree (install, update, -etc.) will link workspaces into the node_modules folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, unless one or more workspaces are specified in the -workspace config.
      • +
      • Commands that operate on the node_modules tree (install, update, etc.) +will link workspaces into the node_modules folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +unless one or more workspaces are specified in the workspace config.

      This value is not exported to the environment for child processes.

      include-workspace-root

      @@ -445,19 +435,18 @@

      include-workspace-root

    • Type: Boolean

    Include the workspace root when workspaces are enabled for a command.

    -

    When false, specifying individual workspaces via the workspace -config, or all workspaces via the workspaces flag, will cause npm -to operate only on the specified workspaces, and not on the root -project.

    +

    When false, specifying individual workspaces via the workspace config, or +all workspaces via the workspaces flag, will cause npm to operate only on +the specified workspaces, and not on the root project.

    This value is not exported to the environment for child processes.

    • Default: false
    • Type: Boolean
    -

    When set file: protocol dependencies will be packed and installed as -regular dependencies instead of creating a symlink. This option has -no effect on workspaces.

    +

    When set file: protocol dependencies will be packed and installed as regular +dependencies instead of creating a symlink. This option has no effect on +workspaces.

    See Also

    • npm install
    • diff --git a/deps/npm/docs/output/commands/npm-bugs.html b/deps/npm/docs/output/commands/npm-bugs.html index a1464fa983236a..8950a7ccedb0d5 100644 --- a/deps/npm/docs/output/commands/npm-bugs.html +++ b/deps/npm/docs/output/commands/npm-bugs.html @@ -141,9 +141,9 @@
      -

      +

      npm-bugs - @11.6.2 + @11.6.3

      Report bugs for a package in a web browser
      @@ -182,9 +182,9 @@

      workspace

    • Default:
    • Type: String (can be set multiple times)
    -

    Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

    +

    Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

    Valid values for the workspace config are either:

    • Workspace names
    • @@ -192,9 +192,9 @@

      workspace

    • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
    -

    When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

    +

    When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

    This value is not exported to the environment for child processes.

    workspaces

      @@ -203,14 +203,13 @@

      workspaces

    Set to true to run the command in the context of all configured workspaces.

    -

    Explicitly setting this to false will cause commands like install -to ignore workspaces altogether. When not set explicitly:

    +

    Explicitly setting this to false will cause commands like install to +ignore workspaces altogether. When not set explicitly:

      -
    • Commands that operate on the node_modules tree (install, update, -etc.) will link workspaces into the node_modules folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, unless one or more workspaces are specified in the -workspace config.
    • +
    • Commands that operate on the node_modules tree (install, update, etc.) +will link workspaces into the node_modules folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +unless one or more workspaces are specified in the workspace config.

    This value is not exported to the environment for child processes.

    include-workspace-root

    @@ -219,10 +218,9 @@

    include-workspace-root

  • Type: Boolean
  • Include the workspace root when workspaces are enabled for a command.

    -

    When false, specifying individual workspaces via the workspace -config, or all workspaces via the workspaces flag, will cause npm -to operate only on the specified workspaces, and not on the root -project.

    +

    When false, specifying individual workspaces via the workspace config, or +all workspaces via the workspaces flag, will cause npm to operate only on +the specified workspaces, and not on the root project.

    This value is not exported to the environment for child processes.

    See Also

      diff --git a/deps/npm/docs/output/commands/npm-cache.html b/deps/npm/docs/output/commands/npm-cache.html index 312cff4a1bce7a..78e1628c1bb81e 100644 --- a/deps/npm/docs/output/commands/npm-cache.html +++ b/deps/npm/docs/output/commands/npm-cache.html @@ -141,9 +141,9 @@
      -

      +

      npm-cache - @11.6.2 + @11.6.3

      Manipulates packages cache
      diff --git a/deps/npm/docs/output/commands/npm-ci.html b/deps/npm/docs/output/commands/npm-ci.html index 95fea4d7bb9bcb..17aaf6140a1c6e 100644 --- a/deps/npm/docs/output/commands/npm-ci.html +++ b/deps/npm/docs/output/commands/npm-ci.html @@ -141,9 +141,9 @@
      -

      +

      npm-ci - @11.6.2 + @11.6.3

      Clean install a project
      @@ -203,12 +203,11 @@

      install-strategy

    • Type: "hoisted", "nested", "shallow", or "linked"

    Sets the strategy for installing packages in node_modules. hoisted -(default): Install non-duplicated in top-level, and duplicated as -necessary within directory structure. nested: (formerly ---legacy-bundling) install in place, no hoisting. shallow (formerly ---global-style) only install direct deps at top-level. linked: -(experimental) install in node_modules/.store, link in place, -unhoisted.

    +(default): Install non-duplicated in top-level, and duplicated as necessary +within directory structure. nested: (formerly --legacy-bundling) install in +place, no hoisting. shallow (formerly --global-style) only install direct +deps at top-level. linked: (experimental) install in node_modules/.store, +link in place, unhoisted.

    legacy-bundling

    • Default: false
    • @@ -216,10 +215,10 @@

      legacy-bundling

    • DEPRECATED: This option has been deprecated in favor of --install-strategy=nested
    -

    Instead of hoisting package installs in node_modules, install -packages in the same manner that they are depended on. This may cause -very deep directory structures and duplicate package installs as -there is no de-duplicating. Sets --install-strategy=nested.

    +

    Instead of hoisting package installs in node_modules, install packages in +the same manner that they are depended on. This may cause very deep +directory structures and duplicate package installs as there is no +de-duplicating. Sets --install-strategy=nested.

    global-style

    • Default: false
    • @@ -227,8 +226,8 @@

      global-style

    • DEPRECATED: This option has been deprecated in favor of --install-strategy=shallow
    -

    Only install direct dependencies in the top level node_modules, but -hoist on deeper dependencies. Sets --install-strategy=shallow.

    +

    Only install direct dependencies in the top level node_modules, but hoist +on deeper dependencies. Sets --install-strategy=shallow.

    omit

    • Default: 'dev' if the NODE_ENV environment variable is set to @@ -239,70 +238,65 @@

      omit

      Note that these dependencies are still resolved and added to the package-lock.json or npm-shrinkwrap.json file. They are just not physically installed on disk.

      -

      If a package type appears in both the --include and --omit lists, -then it will be included.

      -

      If the resulting omit list includes 'dev', then the NODE_ENV -environment variable will be set to 'production' for all lifecycle -scripts.

      +

      If a package type appears in both the --include and --omit lists, then +it will be included.

      +

      If the resulting omit list includes 'dev', then the NODE_ENV environment +variable will be set to 'production' for all lifecycle scripts.

      include

      • Default:
      • -
      • Type: "prod", "dev", "optional", or "peer" (can be set multiple -times)
      • +
      • Type: "prod", "dev", "optional", or "peer" (can be set multiple times)
      -

      Option that allows for defining which types of dependencies to -install.

      +

      Option that allows for defining which types of dependencies to install.

      This is the inverse of --omit=<type>.

      -

      Dependency types specified in --include will not be omitted, -regardless of the order in which omit/include are specified on the -command-line.

      +

      Dependency types specified in --include will not be omitted, regardless of +the order in which omit/include are specified on the command-line.

      strict-peer-deps

      • Default: false
      • Type: Boolean

      If set to true, and --legacy-peer-deps is not set, then any -conflicting peerDependencies will be treated as an install failure, -even if npm could reasonably guess the appropriate resolution based -on non-peer dependency relationships.

      -

      By default, conflicting peerDependencies deep in the dependency -graph will be resolved using the nearest non-peer dependency -specification, even if doing so will result in some packages -receiving a peer dependency outside the range set in their package's -peerDependencies object.

      -

      When such an override is performed, a warning is printed, explaining -the conflict and the packages involved. If --strict-peer-deps is -set, then this warning is treated as a failure.

      +conflicting peerDependencies will be treated as an install failure, even +if npm could reasonably guess the appropriate resolution based on non-peer +dependency relationships.

      +

      By default, conflicting peerDependencies deep in the dependency graph will +be resolved using the nearest non-peer dependency specification, even if +doing so will result in some packages receiving a peer dependency outside +the range set in their package's peerDependencies object.

      +

      When such an override is performed, a warning is printed, explaining the +conflict and the packages involved. If --strict-peer-deps is set, then +this warning is treated as a failure.

      foreground-scripts

        -
      • Default: false unless when using npm pack or npm publish where -it defaults to true
      • +
      • Default: false unless when using npm pack or npm publish where it +defaults to true
      • Type: Boolean
      -

      Run all build scripts (ie, preinstall, install, and -postinstall) scripts for installed packages in the foreground -process, sharing standard input, output, and error with the main npm -process.

      -

      Note that this will generally make installs run slower, and be much -noisier, but can be useful for debugging.

      +

      Run all build scripts (ie, preinstall, install, and postinstall) +scripts for installed packages in the foreground process, sharing standard +input, output, and error with the main npm process.

      +

      Note that this will generally make installs run slower, and be much noisier, +but can be useful for debugging.

      ignore-scripts

      • Default: false
      • Type: Boolean

      If true, npm does not run scripts specified in package.json files.

      -

      Note that commands explicitly intended to run a particular script, -such as npm start, npm stop, npm restart, npm test, and npm run will still run their intended script if ignore-scripts is set, -but they will not run any pre- or post-scripts.

      +

      Note that commands explicitly intended to run a particular script, such as +npm start, npm stop, npm restart, npm test, and npm run will still +run their intended script if ignore-scripts is set, but they will not +run any pre- or post-scripts.

      audit

      • Default: true
      • Type: Boolean
      -

      When "true" submit audit reports alongside the current npm command to -the default registry and all registries configured for scopes. See -the documentation for npm audit for details -on what is submitted.

      +

      When "true" submit audit reports alongside the current npm command to the +default registry and all registries configured for scopes. See the +documentation for npm audit for details on what is +submitted.

      • Default: true
      • @@ -310,37 +304,35 @@

      Tells npm to create symlinks (or .cmd shims on Windows) for package executables.

      -

      Set to false to have it not do this. This can be used to work around -the fact that some file systems don't support symlinks, even on -ostensibly Unix systems.

      +

      Set to false to have it not do this. This can be used to work around the +fact that some file systems don't support symlinks, even on ostensibly Unix +systems.

      fund

      • Default: true
      • Type: Boolean

      When "true" displays the message at the end of each npm install -acknowledging the number of dependencies looking for funding. See -npm fund for details.

      +acknowledging the number of dependencies looking for funding. See npm fund for details.

      dry-run

      • Default: false
      • Type: Boolean
      -

      Indicates that you don't want npm to make any changes and that it -should only report what it would have done. This can be passed into -any of the commands that modify your local installation, eg, -install, update, dedupe, uninstall, as well as pack and -publish.

      -

      Note: This is NOT honored by other network related commands, eg -dist-tags, owner, etc.

      +

      Indicates that you don't want npm to make any changes and that it should +only report what it would have done. This can be passed into any of the +commands that modify your local installation, eg, install, update, +dedupe, uninstall, as well as pack and publish.

      +

      Note: This is NOT honored by other network related commands, eg dist-tags, +owner, etc.

      workspace

      • Default:
      • Type: String (can be set multiple times)
      -

      Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

      +

      Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

      Valid values for the workspace config are either:

      • Workspace names
      • @@ -348,9 +340,9 @@

        workspace

      • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
      -

      When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

      +

      When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

      This value is not exported to the environment for child processes.

      workspaces

        @@ -359,14 +351,13 @@

        workspaces

      Set to true to run the command in the context of all configured workspaces.

      -

      Explicitly setting this to false will cause commands like install -to ignore workspaces altogether. When not set explicitly:

      +

      Explicitly setting this to false will cause commands like install to +ignore workspaces altogether. When not set explicitly:

        -
      • Commands that operate on the node_modules tree (install, update, -etc.) will link workspaces into the node_modules folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, unless one or more workspaces are specified in the -workspace config.
      • +
      • Commands that operate on the node_modules tree (install, update, etc.) +will link workspaces into the node_modules folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +unless one or more workspaces are specified in the workspace config.

      This value is not exported to the environment for child processes.

      include-workspace-root

      @@ -375,19 +366,18 @@

      include-workspace-root

    • Type: Boolean

    Include the workspace root when workspaces are enabled for a command.

    -

    When false, specifying individual workspaces via the workspace -config, or all workspaces via the workspaces flag, will cause npm -to operate only on the specified workspaces, and not on the root -project.

    +

    When false, specifying individual workspaces via the workspace config, or +all workspaces via the workspaces flag, will cause npm to operate only on +the specified workspaces, and not on the root project.

    This value is not exported to the environment for child processes.

    • Default: false
    • Type: Boolean
    -

    When set file: protocol dependencies will be packed and installed as -regular dependencies instead of creating a symlink. This option has -no effect on workspaces.

    +

    When set file: protocol dependencies will be packed and installed as regular +dependencies instead of creating a symlink. This option has no effect on +workspaces.

    See Also

    • npm install
    • diff --git a/deps/npm/docs/output/commands/npm-completion.html b/deps/npm/docs/output/commands/npm-completion.html index 62c34b3e664752..ad9ce77e828e48 100644 --- a/deps/npm/docs/output/commands/npm-completion.html +++ b/deps/npm/docs/output/commands/npm-completion.html @@ -141,9 +141,9 @@
      -

      +

      npm-completion - @11.6.2 + @11.6.3

      Tab Completion for npm
      diff --git a/deps/npm/docs/output/commands/npm-config.html b/deps/npm/docs/output/commands/npm-config.html index e8551dcacd9e96..0e7ffc87a4dbab 100644 --- a/deps/npm/docs/output/commands/npm-config.html +++ b/deps/npm/docs/output/commands/npm-config.html @@ -141,9 +141,9 @@
      -

      +

      npm-config - @11.6.2 + @11.6.3

      Manage the npm configuration files
      @@ -215,8 +215,8 @@

      json

    Whether or not to output JSON data, rather than the normal output.

      -
    • In npm pkg set it enables parsing set values with JSON.parse() -before saving them to your package.json.
    • +
    • In npm pkg set it enables parsing set values with JSON.parse() before +saving them to your package.json.

    Not supported by all npm commands.

    global

    @@ -224,13 +224,12 @@

    global

  • Default: false
  • Type: Boolean
  • -

    Operates in "global" mode, so that packages are installed into the -prefix folder instead of the current working directory. See -folders for more on the differences in -behavior.

    +

    Operates in "global" mode, so that packages are installed into the prefix +folder instead of the current working directory. See +folders for more on the differences in behavior.

      -
    • packages are installed into the {prefix}/lib/node_modules folder, -instead of the current working directory.
    • +
    • packages are installed into the {prefix}/lib/node_modules folder, instead +of the current working directory.
    • bin files are linked to {prefix}/bin
    • man pages are linked to {prefix}/share/man
    @@ -243,18 +242,17 @@

    editor

    The command to run for npm edit and npm config edit.

    location

      -
    • Default: "user" unless --global is passed, which will also set this -value to "global"
    • +
    • Default: "user" unless --global is passed, which will also set this value +to "global"
    • Type: "global", "user", or "project"

    When passed to npm config this refers to which config file to use.

    -

    When set to "global" mode, packages are installed into the prefix -folder instead of the current working directory. See -folders for more on the differences in -behavior.

    +

    When set to "global" mode, packages are installed into the prefix folder +instead of the current working directory. See +folders for more on the differences in behavior.

      -
    • packages are installed into the {prefix}/lib/node_modules folder, -instead of the current working directory.
    • +
    • packages are installed into the {prefix}/lib/node_modules folder, instead +of the current working directory.
    • bin files are linked to {prefix}/bin
    • man pages are linked to {prefix}/share/man
    diff --git a/deps/npm/docs/output/commands/npm-dedupe.html b/deps/npm/docs/output/commands/npm-dedupe.html index 761d5129fac3b3..67cec4c1115ac0 100644 --- a/deps/npm/docs/output/commands/npm-dedupe.html +++ b/deps/npm/docs/output/commands/npm-dedupe.html @@ -141,9 +141,9 @@
    -

    +

    npm-dedupe - @11.6.2 + @11.6.3

    Reduce duplication in the package tree
    @@ -197,12 +197,11 @@

    install-strategy

  • Type: "hoisted", "nested", "shallow", or "linked"
  • Sets the strategy for installing packages in node_modules. hoisted -(default): Install non-duplicated in top-level, and duplicated as -necessary within directory structure. nested: (formerly ---legacy-bundling) install in place, no hoisting. shallow (formerly ---global-style) only install direct deps at top-level. linked: -(experimental) install in node_modules/.store, link in place, -unhoisted.

    +(default): Install non-duplicated in top-level, and duplicated as necessary +within directory structure. nested: (formerly --legacy-bundling) install in +place, no hoisting. shallow (formerly --global-style) only install direct +deps at top-level. linked: (experimental) install in node_modules/.store, +link in place, unhoisted.

    legacy-bundling

    • Default: false
    • @@ -210,10 +209,10 @@

      legacy-bundling

    • DEPRECATED: This option has been deprecated in favor of --install-strategy=nested
    -

    Instead of hoisting package installs in node_modules, install -packages in the same manner that they are depended on. This may cause -very deep directory structures and duplicate package installs as -there is no de-duplicating. Sets --install-strategy=nested.

    +

    Instead of hoisting package installs in node_modules, install packages in +the same manner that they are depended on. This may cause very deep +directory structures and duplicate package installs as there is no +de-duplicating. Sets --install-strategy=nested.

    global-style

    • Default: false
    • @@ -221,33 +220,31 @@

      global-style

    • DEPRECATED: This option has been deprecated in favor of --install-strategy=shallow
    -

    Only install direct dependencies in the top level node_modules, but -hoist on deeper dependencies. Sets --install-strategy=shallow.

    +

    Only install direct dependencies in the top level node_modules, but hoist +on deeper dependencies. Sets --install-strategy=shallow.

    strict-peer-deps

    • Default: false
    • Type: Boolean

    If set to true, and --legacy-peer-deps is not set, then any -conflicting peerDependencies will be treated as an install failure, -even if npm could reasonably guess the appropriate resolution based -on non-peer dependency relationships.

    -

    By default, conflicting peerDependencies deep in the dependency -graph will be resolved using the nearest non-peer dependency -specification, even if doing so will result in some packages -receiving a peer dependency outside the range set in their package's -peerDependencies object.

    -

    When such an override is performed, a warning is printed, explaining -the conflict and the packages involved. If --strict-peer-deps is -set, then this warning is treated as a failure.

    +conflicting peerDependencies will be treated as an install failure, even +if npm could reasonably guess the appropriate resolution based on non-peer +dependency relationships.

    +

    By default, conflicting peerDependencies deep in the dependency graph will +be resolved using the nearest non-peer dependency specification, even if +doing so will result in some packages receiving a peer dependency outside +the range set in their package's peerDependencies object.

    +

    When such an override is performed, a warning is printed, explaining the +conflict and the packages involved. If --strict-peer-deps is set, then +this warning is treated as a failure.

    package-lock

    • Default: true
    • Type: Boolean
    -

    If set to false, then ignore package-lock.json files when -installing. This will also prevent writing package-lock.json if -save is true.

    +

    If set to false, then ignore package-lock.json files when installing. This +will also prevent writing package-lock.json if save is true.

    omit

    • Default: 'dev' if the NODE_ENV environment variable is set to @@ -258,41 +255,38 @@

      omit

      Note that these dependencies are still resolved and added to the package-lock.json or npm-shrinkwrap.json file. They are just not physically installed on disk.

      -

      If a package type appears in both the --include and --omit lists, -then it will be included.

      -

      If the resulting omit list includes 'dev', then the NODE_ENV -environment variable will be set to 'production' for all lifecycle -scripts.

      +

      If a package type appears in both the --include and --omit lists, then +it will be included.

      +

      If the resulting omit list includes 'dev', then the NODE_ENV environment +variable will be set to 'production' for all lifecycle scripts.

      include

      • Default:
      • -
      • Type: "prod", "dev", "optional", or "peer" (can be set multiple -times)
      • +
      • Type: "prod", "dev", "optional", or "peer" (can be set multiple times)
      -

      Option that allows for defining which types of dependencies to -install.

      +

      Option that allows for defining which types of dependencies to install.

      This is the inverse of --omit=<type>.

      -

      Dependency types specified in --include will not be omitted, -regardless of the order in which omit/include are specified on the -command-line.

      +

      Dependency types specified in --include will not be omitted, regardless of +the order in which omit/include are specified on the command-line.

      ignore-scripts

      • Default: false
      • Type: Boolean

      If true, npm does not run scripts specified in package.json files.

      -

      Note that commands explicitly intended to run a particular script, -such as npm start, npm stop, npm restart, npm test, and npm run will still run their intended script if ignore-scripts is set, -but they will not run any pre- or post-scripts.

      +

      Note that commands explicitly intended to run a particular script, such as +npm start, npm stop, npm restart, npm test, and npm run will still +run their intended script if ignore-scripts is set, but they will not +run any pre- or post-scripts.

      audit

      • Default: true
      • Type: Boolean
      -

      When "true" submit audit reports alongside the current npm command to -the default registry and all registries configured for scopes. See -the documentation for npm audit for details -on what is submitted.

      +

      When "true" submit audit reports alongside the current npm command to the +default registry and all registries configured for scopes. See the +documentation for npm audit for details on what is +submitted.

      • Default: true
      • @@ -300,37 +294,35 @@

      Tells npm to create symlinks (or .cmd shims on Windows) for package executables.

      -

      Set to false to have it not do this. This can be used to work around -the fact that some file systems don't support symlinks, even on -ostensibly Unix systems.

      +

      Set to false to have it not do this. This can be used to work around the +fact that some file systems don't support symlinks, even on ostensibly Unix +systems.

      fund

      • Default: true
      • Type: Boolean

      When "true" displays the message at the end of each npm install -acknowledging the number of dependencies looking for funding. See -npm fund for details.

      +acknowledging the number of dependencies looking for funding. See npm fund for details.

      dry-run

      • Default: false
      • Type: Boolean
      -

      Indicates that you don't want npm to make any changes and that it -should only report what it would have done. This can be passed into -any of the commands that modify your local installation, eg, -install, update, dedupe, uninstall, as well as pack and -publish.

      -

      Note: This is NOT honored by other network related commands, eg -dist-tags, owner, etc.

      +

      Indicates that you don't want npm to make any changes and that it should +only report what it would have done. This can be passed into any of the +commands that modify your local installation, eg, install, update, +dedupe, uninstall, as well as pack and publish.

      +

      Note: This is NOT honored by other network related commands, eg dist-tags, +owner, etc.

      workspace

      • Default:
      • Type: String (can be set multiple times)
      -

      Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

      +

      Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

      Valid values for the workspace config are either:

      • Workspace names
      • @@ -338,9 +330,9 @@

        workspace

      • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
      -

      When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

      +

      When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

      This value is not exported to the environment for child processes.

      workspaces

        @@ -349,14 +341,13 @@

        workspaces

      Set to true to run the command in the context of all configured workspaces.

      -

      Explicitly setting this to false will cause commands like install -to ignore workspaces altogether. When not set explicitly:

      +

      Explicitly setting this to false will cause commands like install to +ignore workspaces altogether. When not set explicitly:

        -
      • Commands that operate on the node_modules tree (install, update, -etc.) will link workspaces into the node_modules folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, unless one or more workspaces are specified in the -workspace config.
      • +
      • Commands that operate on the node_modules tree (install, update, etc.) +will link workspaces into the node_modules folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +unless one or more workspaces are specified in the workspace config.

      This value is not exported to the environment for child processes.

      include-workspace-root

      @@ -365,19 +356,18 @@

      include-workspace-root

    • Type: Boolean

    Include the workspace root when workspaces are enabled for a command.

    -

    When false, specifying individual workspaces via the workspace -config, or all workspaces via the workspaces flag, will cause npm -to operate only on the specified workspaces, and not on the root -project.

    +

    When false, specifying individual workspaces via the workspace config, or +all workspaces via the workspaces flag, will cause npm to operate only on +the specified workspaces, and not on the root project.

    This value is not exported to the environment for child processes.

    • Default: false
    • Type: Boolean
    -

    When set file: protocol dependencies will be packed and installed as -regular dependencies instead of creating a symlink. This option has -no effect on workspaces.

    +

    When set file: protocol dependencies will be packed and installed as regular +dependencies instead of creating a symlink. This option has no effect on +workspaces.

    See Also

    • npm find-dupes
    • diff --git a/deps/npm/docs/output/commands/npm-deprecate.html b/deps/npm/docs/output/commands/npm-deprecate.html index c3292a349b8cc7..0b9322fd055b43 100644 --- a/deps/npm/docs/output/commands/npm-deprecate.html +++ b/deps/npm/docs/output/commands/npm-deprecate.html @@ -141,9 +141,9 @@
      -

      +

      npm-deprecate - @11.6.2 + @11.6.3

      Deprecate a version of a package
      @@ -183,22 +183,21 @@

      otp

    • Default: null
    • Type: null or String
    -

    This is a one-time password from a two-factor authenticator. It's -needed when publishing or changing package permissions with npm access.

    -

    If not set, and a registry response fails with a challenge for a -one-time password, npm will prompt on the command line for one.

    +

    This is a one-time password from a two-factor authenticator. It's needed +when publishing or changing package permissions with npm access.

    +

    If not set, and a registry response fails with a challenge for a one-time +password, npm will prompt on the command line for one.

    dry-run

    • Default: false
    • Type: Boolean
    -

    Indicates that you don't want npm to make any changes and that it -should only report what it would have done. This can be passed into -any of the commands that modify your local installation, eg, -install, update, dedupe, uninstall, as well as pack and -publish.

    -

    Note: This is NOT honored by other network related commands, eg -dist-tags, owner, etc.

    +

    Indicates that you don't want npm to make any changes and that it should +only report what it would have done. This can be passed into any of the +commands that modify your local installation, eg, install, update, +dedupe, uninstall, as well as pack and publish.

    +

    Note: This is NOT honored by other network related commands, eg dist-tags, +owner, etc.

    See Also

    • package spec
    • diff --git a/deps/npm/docs/output/commands/npm-diff.html b/deps/npm/docs/output/commands/npm-diff.html index 18e0aaf07f306d..8ea1a7ba81b64b 100644 --- a/deps/npm/docs/output/commands/npm-diff.html +++ b/deps/npm/docs/output/commands/npm-diff.html @@ -141,9 +141,9 @@
      -

      +

      npm-diff - @11.6.2 + @11.6.3

      The registry diff command
      @@ -281,13 +281,12 @@

      global

    • Default: false
    • Type: Boolean
    -

    Operates in "global" mode, so that packages are installed into the -prefix folder instead of the current working directory. See -folders for more on the differences in -behavior.

    +

    Operates in "global" mode, so that packages are installed into the prefix +folder instead of the current working directory. See +folders for more on the differences in behavior.

      -
    • packages are installed into the {prefix}/lib/node_modules folder, -instead of the current working directory.
    • +
    • packages are installed into the {prefix}/lib/node_modules folder, instead +of the current working directory.
    • bin files are linked to {prefix}/bin
    • man pages are linked to {prefix}/share/man
    @@ -296,21 +295,21 @@

    tag

  • Default: "latest"
  • Type: String
  • -

    If you ask npm to install a package and don't tell it a specific -version, then it will install the specified tag.

    +

    If you ask npm to install a package and don't tell it a specific version, +then it will install the specified tag.

    It is the tag added to the package@version specified in the npm dist-tag add command, if no explicit tag is given.

    -

    When used by the npm diff command, this is the tag used to fetch -the tarball that will be compared with the local files by default.

    -

    If used in the npm publish command, this is the tag that will be -added to the package submitted to the registry.

    +

    When used by the npm diff command, this is the tag used to fetch the +tarball that will be compared with the local files by default.

    +

    If used in the npm publish command, this is the tag that will be added to +the package submitted to the registry.

    workspace

    • Default:
    • Type: String (can be set multiple times)
    -

    Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

    +

    Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

    Valid values for the workspace config are either:

    • Workspace names
    • @@ -318,9 +317,9 @@

      workspace

    • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
    -

    When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

    +

    When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

    This value is not exported to the environment for child processes.

    workspaces

      @@ -329,14 +328,13 @@

      workspaces

    Set to true to run the command in the context of all configured workspaces.

    -

    Explicitly setting this to false will cause commands like install -to ignore workspaces altogether. When not set explicitly:

    +

    Explicitly setting this to false will cause commands like install to +ignore workspaces altogether. When not set explicitly:

      -
    • Commands that operate on the node_modules tree (install, update, -etc.) will link workspaces into the node_modules folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, unless one or more workspaces are specified in the -workspace config.
    • +
    • Commands that operate on the node_modules tree (install, update, etc.) +will link workspaces into the node_modules folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +unless one or more workspaces are specified in the workspace config.

    This value is not exported to the environment for child processes.

    include-workspace-root

    @@ -345,10 +343,9 @@

    include-workspace-root

  • Type: Boolean
  • Include the workspace root when workspaces are enabled for a command.

    -

    When false, specifying individual workspaces via the workspace -config, or all workspaces via the workspaces flag, will cause npm -to operate only on the specified workspaces, and not on the root -project.

    +

    When false, specifying individual workspaces via the workspace config, or +all workspaces via the workspaces flag, will cause npm to operate only on +the specified workspaces, and not on the root project.

    This value is not exported to the environment for child processes.

    See Also

      diff --git a/deps/npm/docs/output/commands/npm-dist-tag.html b/deps/npm/docs/output/commands/npm-dist-tag.html index b7d2d1bf7cec7c..d5148c06bf7458 100644 --- a/deps/npm/docs/output/commands/npm-dist-tag.html +++ b/deps/npm/docs/output/commands/npm-dist-tag.html @@ -141,9 +141,9 @@
      -

      +

      npm-dist-tag - @11.6.2 + @11.6.3

      Modify package distribution tags
      @@ -207,9 +207,9 @@

      workspace

    • Default:
    • Type: String (can be set multiple times)
    -

    Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

    +

    Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

    Valid values for the workspace config are either:

    • Workspace names
    • @@ -217,9 +217,9 @@

      workspace

    • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
    -

    When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

    +

    When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

    This value is not exported to the environment for child processes.

    workspaces

      @@ -228,14 +228,13 @@

      workspaces

    Set to true to run the command in the context of all configured workspaces.

    -

    Explicitly setting this to false will cause commands like install -to ignore workspaces altogether. When not set explicitly:

    +

    Explicitly setting this to false will cause commands like install to +ignore workspaces altogether. When not set explicitly:

      -
    • Commands that operate on the node_modules tree (install, update, -etc.) will link workspaces into the node_modules folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, unless one or more workspaces are specified in the -workspace config.
    • +
    • Commands that operate on the node_modules tree (install, update, etc.) +will link workspaces into the node_modules folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +unless one or more workspaces are specified in the workspace config.

    This value is not exported to the environment for child processes.

    include-workspace-root

    @@ -244,10 +243,9 @@

    include-workspace-root

  • Type: Boolean
  • Include the workspace root when workspaces are enabled for a command.

    -

    When false, specifying individual workspaces via the workspace -config, or all workspaces via the workspaces flag, will cause npm -to operate only on the specified workspaces, and not on the root -project.

    +

    When false, specifying individual workspaces via the workspace config, or +all workspaces via the workspaces flag, will cause npm to operate only on +the specified workspaces, and not on the root project.

    This value is not exported to the environment for child processes.

    See Also

      diff --git a/deps/npm/docs/output/commands/npm-docs.html b/deps/npm/docs/output/commands/npm-docs.html index 64524857304ef5..3079c0a8f7dfb6 100644 --- a/deps/npm/docs/output/commands/npm-docs.html +++ b/deps/npm/docs/output/commands/npm-docs.html @@ -141,9 +141,9 @@
      -

      +

      npm-docs - @11.6.2 + @11.6.3

      Open documentation for a package in a web browser
      @@ -183,9 +183,9 @@

      workspace

    • Default:
    • Type: String (can be set multiple times)
    -

    Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

    +

    Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

    Valid values for the workspace config are either:

    • Workspace names
    • @@ -193,9 +193,9 @@

      workspace

    • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
    -

    When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

    +

    When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

    This value is not exported to the environment for child processes.

    workspaces

      @@ -204,14 +204,13 @@

      workspaces

    Set to true to run the command in the context of all configured workspaces.

    -

    Explicitly setting this to false will cause commands like install -to ignore workspaces altogether. When not set explicitly:

    +

    Explicitly setting this to false will cause commands like install to +ignore workspaces altogether. When not set explicitly:

      -
    • Commands that operate on the node_modules tree (install, update, -etc.) will link workspaces into the node_modules folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, unless one or more workspaces are specified in the -workspace config.
    • +
    • Commands that operate on the node_modules tree (install, update, etc.) +will link workspaces into the node_modules folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +unless one or more workspaces are specified in the workspace config.

    This value is not exported to the environment for child processes.

    include-workspace-root

    @@ -220,10 +219,9 @@

    include-workspace-root

  • Type: Boolean
  • Include the workspace root when workspaces are enabled for a command.

    -

    When false, specifying individual workspaces via the workspace -config, or all workspaces via the workspaces flag, will cause npm -to operate only on the specified workspaces, and not on the root -project.

    +

    When false, specifying individual workspaces via the workspace config, or +all workspaces via the workspaces flag, will cause npm to operate only on +the specified workspaces, and not on the root project.

    This value is not exported to the environment for child processes.

    See Also

      diff --git a/deps/npm/docs/output/commands/npm-doctor.html b/deps/npm/docs/output/commands/npm-doctor.html index f5c65a6ad7db19..af0992070b5bab 100644 --- a/deps/npm/docs/output/commands/npm-doctor.html +++ b/deps/npm/docs/output/commands/npm-doctor.html @@ -141,9 +141,9 @@
      -

      +

      npm-doctor - @11.6.2 + @11.6.3

      Check the health of your npm environment
      diff --git a/deps/npm/docs/output/commands/npm-edit.html b/deps/npm/docs/output/commands/npm-edit.html index b058b0bb0c8223..be573b8a910373 100644 --- a/deps/npm/docs/output/commands/npm-edit.html +++ b/deps/npm/docs/output/commands/npm-edit.html @@ -141,9 +141,9 @@
      -

      +

      npm-edit - @11.6.2 + @11.6.3

      Edit an installed package
      diff --git a/deps/npm/docs/output/commands/npm-exec.html b/deps/npm/docs/output/commands/npm-exec.html index b6b91582f0d828..cef51ac78c447e 100644 --- a/deps/npm/docs/output/commands/npm-exec.html +++ b/deps/npm/docs/output/commands/npm-exec.html @@ -141,9 +141,9 @@
      -

      +

      npm-exec - @11.6.2 + @11.6.3

      Run a command from a local or remote npm package
      @@ -213,9 +213,8 @@

      call

    • Default: ""
    • Type: String
    -

    Optional companion option for npm exec, npx that allows for -specifying a custom command to be run along with the installed -packages.

    +

    Optional companion option for npm exec, npx that allows for specifying a +custom command to be run along with the installed packages.

    npm exec --package yo --package generator-node --call "yo node"
     

    workspace

    @@ -223,9 +222,9 @@

    workspace

  • Default:
  • Type: String (can be set multiple times)
  • -

    Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

    +

    Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

    Valid values for the workspace config are either:

    • Workspace names
    • @@ -233,9 +232,9 @@

      workspace

    • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
    -

    When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

    +

    When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

    This value is not exported to the environment for child processes.

    workspaces

      @@ -244,14 +243,13 @@

      workspaces

    Set to true to run the command in the context of all configured workspaces.

    -

    Explicitly setting this to false will cause commands like install -to ignore workspaces altogether. When not set explicitly:

    +

    Explicitly setting this to false will cause commands like install to +ignore workspaces altogether. When not set explicitly:

      -
    • Commands that operate on the node_modules tree (install, update, -etc.) will link workspaces into the node_modules folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, unless one or more workspaces are specified in the -workspace config.
    • +
    • Commands that operate on the node_modules tree (install, update, etc.) +will link workspaces into the node_modules folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +unless one or more workspaces are specified in the workspace config.

    This value is not exported to the environment for child processes.

    include-workspace-root

    @@ -260,10 +258,9 @@

    include-workspace-root

  • Type: Boolean
  • Include the workspace root when workspaces are enabled for a command.

    -

    When false, specifying individual workspaces via the workspace -config, or all workspaces via the workspaces flag, will cause npm -to operate only on the specified workspaces, and not on the root -project.

    +

    When false, specifying individual workspaces via the workspace config, or +all workspaces via the workspaces flag, will cause npm to operate only on +the specified workspaces, and not on the root project.

    This value is not exported to the environment for child processes.

    Examples

    Run the version of tap in the local dependencies, with the provided arguments:

    diff --git a/deps/npm/docs/output/commands/npm-explain.html b/deps/npm/docs/output/commands/npm-explain.html index c1576d6630c503..ad349ead318759 100644 --- a/deps/npm/docs/output/commands/npm-explain.html +++ b/deps/npm/docs/output/commands/npm-explain.html @@ -141,9 +141,9 @@
    -

    +

    npm-explain - @11.6.2 + @11.6.3

    Explain installed packages
    @@ -194,8 +194,8 @@

    json

    Whether or not to output JSON data, rather than the normal output.

      -
    • In npm pkg set it enables parsing set values with JSON.parse() -before saving them to your package.json.
    • +
    • In npm pkg set it enables parsing set values with JSON.parse() before +saving them to your package.json.

    Not supported by all npm commands.

    workspace

    @@ -203,9 +203,9 @@

    workspace

  • Default:
  • Type: String (can be set multiple times)
  • -

    Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

    +

    Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

    Valid values for the workspace config are either:

    • Workspace names
    • @@ -213,9 +213,9 @@

      workspace

    • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
    -

    When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

    +

    When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

    This value is not exported to the environment for child processes.

    See Also

      diff --git a/deps/npm/docs/output/commands/npm-explore.html b/deps/npm/docs/output/commands/npm-explore.html index 6e0775684d9123..913e8e43add861 100644 --- a/deps/npm/docs/output/commands/npm-explore.html +++ b/deps/npm/docs/output/commands/npm-explore.html @@ -141,9 +141,9 @@
      -

      +

      npm-explore - @11.6.2 + @11.6.3

      Browse an installed package
      @@ -167,8 +167,8 @@

      Description

      Configuration

      shell

        -
      • Default: SHELL environment variable, or "bash" on Posix, or "cmd.exe" -on Windows
      • +
      • Default: SHELL environment variable, or "bash" on Posix, or "cmd.exe" on +Windows
      • Type: String

      The shell to run for the npm explore command.

      diff --git a/deps/npm/docs/output/commands/npm-find-dupes.html b/deps/npm/docs/output/commands/npm-find-dupes.html index 36654d5b7be6cb..82345e5a5ebb65 100644 --- a/deps/npm/docs/output/commands/npm-find-dupes.html +++ b/deps/npm/docs/output/commands/npm-find-dupes.html @@ -141,9 +141,9 @@
      -

      +

      npm-find-dupes - @11.6.2 + @11.6.3

      Find duplication in the package tree
      @@ -165,12 +165,11 @@

      install-strategy

    • Type: "hoisted", "nested", "shallow", or "linked"

    Sets the strategy for installing packages in node_modules. hoisted -(default): Install non-duplicated in top-level, and duplicated as -necessary within directory structure. nested: (formerly ---legacy-bundling) install in place, no hoisting. shallow (formerly ---global-style) only install direct deps at top-level. linked: -(experimental) install in node_modules/.store, link in place, -unhoisted.

    +(default): Install non-duplicated in top-level, and duplicated as necessary +within directory structure. nested: (formerly --legacy-bundling) install in +place, no hoisting. shallow (formerly --global-style) only install direct +deps at top-level. linked: (experimental) install in node_modules/.store, +link in place, unhoisted.

    legacy-bundling

    • Default: false
    • @@ -178,10 +177,10 @@

      legacy-bundling

    • DEPRECATED: This option has been deprecated in favor of --install-strategy=nested
    -

    Instead of hoisting package installs in node_modules, install -packages in the same manner that they are depended on. This may cause -very deep directory structures and duplicate package installs as -there is no de-duplicating. Sets --install-strategy=nested.

    +

    Instead of hoisting package installs in node_modules, install packages in +the same manner that they are depended on. This may cause very deep +directory structures and duplicate package installs as there is no +de-duplicating. Sets --install-strategy=nested.

    global-style

    • Default: false
    • @@ -189,33 +188,31 @@

      global-style

    • DEPRECATED: This option has been deprecated in favor of --install-strategy=shallow
    -

    Only install direct dependencies in the top level node_modules, but -hoist on deeper dependencies. Sets --install-strategy=shallow.

    +

    Only install direct dependencies in the top level node_modules, but hoist +on deeper dependencies. Sets --install-strategy=shallow.

    strict-peer-deps

    • Default: false
    • Type: Boolean

    If set to true, and --legacy-peer-deps is not set, then any -conflicting peerDependencies will be treated as an install failure, -even if npm could reasonably guess the appropriate resolution based -on non-peer dependency relationships.

    -

    By default, conflicting peerDependencies deep in the dependency -graph will be resolved using the nearest non-peer dependency -specification, even if doing so will result in some packages -receiving a peer dependency outside the range set in their package's -peerDependencies object.

    -

    When such an override is performed, a warning is printed, explaining -the conflict and the packages involved. If --strict-peer-deps is -set, then this warning is treated as a failure.

    +conflicting peerDependencies will be treated as an install failure, even +if npm could reasonably guess the appropriate resolution based on non-peer +dependency relationships.

    +

    By default, conflicting peerDependencies deep in the dependency graph will +be resolved using the nearest non-peer dependency specification, even if +doing so will result in some packages receiving a peer dependency outside +the range set in their package's peerDependencies object.

    +

    When such an override is performed, a warning is printed, explaining the +conflict and the packages involved. If --strict-peer-deps is set, then +this warning is treated as a failure.

    package-lock

    • Default: true
    • Type: Boolean
    -

    If set to false, then ignore package-lock.json files when -installing. This will also prevent writing package-lock.json if -save is true.

    +

    If set to false, then ignore package-lock.json files when installing. This +will also prevent writing package-lock.json if save is true.

    omit

    • Default: 'dev' if the NODE_ENV environment variable is set to @@ -226,41 +223,38 @@

      omit

      Note that these dependencies are still resolved and added to the package-lock.json or npm-shrinkwrap.json file. They are just not physically installed on disk.

      -

      If a package type appears in both the --include and --omit lists, -then it will be included.

      -

      If the resulting omit list includes 'dev', then the NODE_ENV -environment variable will be set to 'production' for all lifecycle -scripts.

      +

      If a package type appears in both the --include and --omit lists, then +it will be included.

      +

      If the resulting omit list includes 'dev', then the NODE_ENV environment +variable will be set to 'production' for all lifecycle scripts.

      include

      • Default:
      • -
      • Type: "prod", "dev", "optional", or "peer" (can be set multiple -times)
      • +
      • Type: "prod", "dev", "optional", or "peer" (can be set multiple times)
      -

      Option that allows for defining which types of dependencies to -install.

      +

      Option that allows for defining which types of dependencies to install.

      This is the inverse of --omit=<type>.

      -

      Dependency types specified in --include will not be omitted, -regardless of the order in which omit/include are specified on the -command-line.

      +

      Dependency types specified in --include will not be omitted, regardless of +the order in which omit/include are specified on the command-line.

      ignore-scripts

      • Default: false
      • Type: Boolean

      If true, npm does not run scripts specified in package.json files.

      -

      Note that commands explicitly intended to run a particular script, -such as npm start, npm stop, npm restart, npm test, and npm run will still run their intended script if ignore-scripts is set, -but they will not run any pre- or post-scripts.

      +

      Note that commands explicitly intended to run a particular script, such as +npm start, npm stop, npm restart, npm test, and npm run will still +run their intended script if ignore-scripts is set, but they will not +run any pre- or post-scripts.

      audit

      • Default: true
      • Type: Boolean
      -

      When "true" submit audit reports alongside the current npm command to -the default registry and all registries configured for scopes. See -the documentation for npm audit for details -on what is submitted.

      +

      When "true" submit audit reports alongside the current npm command to the +default registry and all registries configured for scopes. See the +documentation for npm audit for details on what is +submitted.

      • Default: true
      • @@ -268,25 +262,24 @@

      Tells npm to create symlinks (or .cmd shims on Windows) for package executables.

      -

      Set to false to have it not do this. This can be used to work around -the fact that some file systems don't support symlinks, even on -ostensibly Unix systems.

      +

      Set to false to have it not do this. This can be used to work around the +fact that some file systems don't support symlinks, even on ostensibly Unix +systems.

      fund

      • Default: true
      • Type: Boolean

      When "true" displays the message at the end of each npm install -acknowledging the number of dependencies looking for funding. See -npm fund for details.

      +acknowledging the number of dependencies looking for funding. See npm fund for details.

      workspace

      • Default:
      • Type: String (can be set multiple times)
      -

      Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

      +

      Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

      Valid values for the workspace config are either:

      • Workspace names
      • @@ -294,9 +287,9 @@

        workspace

      • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
      -

      When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

      +

      When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

      This value is not exported to the environment for child processes.

      workspaces

        @@ -305,14 +298,13 @@

        workspaces

      Set to true to run the command in the context of all configured workspaces.

      -

      Explicitly setting this to false will cause commands like install -to ignore workspaces altogether. When not set explicitly:

      +

      Explicitly setting this to false will cause commands like install to +ignore workspaces altogether. When not set explicitly:

        -
      • Commands that operate on the node_modules tree (install, update, -etc.) will link workspaces into the node_modules folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, unless one or more workspaces are specified in the -workspace config.
      • +
      • Commands that operate on the node_modules tree (install, update, etc.) +will link workspaces into the node_modules folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +unless one or more workspaces are specified in the workspace config.

      This value is not exported to the environment for child processes.

      include-workspace-root

      @@ -321,19 +313,18 @@

      include-workspace-root

    • Type: Boolean

    Include the workspace root when workspaces are enabled for a command.

    -

    When false, specifying individual workspaces via the workspace -config, or all workspaces via the workspaces flag, will cause npm -to operate only on the specified workspaces, and not on the root -project.

    +

    When false, specifying individual workspaces via the workspace config, or +all workspaces via the workspaces flag, will cause npm to operate only on +the specified workspaces, and not on the root project.

    This value is not exported to the environment for child processes.

    • Default: false
    • Type: Boolean
    -

    When set file: protocol dependencies will be packed and installed as -regular dependencies instead of creating a symlink. This option has -no effect on workspaces.

    +

    When set file: protocol dependencies will be packed and installed as regular +dependencies instead of creating a symlink. This option has no effect on +workspaces.

    See Also

    • npm dedupe
    • diff --git a/deps/npm/docs/output/commands/npm-fund.html b/deps/npm/docs/output/commands/npm-fund.html index b50ef08583fb2b..5608c295c2ad26 100644 --- a/deps/npm/docs/output/commands/npm-fund.html +++ b/deps/npm/docs/output/commands/npm-fund.html @@ -141,9 +141,9 @@
      -

      +

      npm-fund - @11.6.2 + @11.6.3

      Retrieve funding information
      @@ -195,8 +195,8 @@

      json

    Whether or not to output JSON data, rather than the normal output.

      -
    • In npm pkg set it enables parsing set values with JSON.parse() -before saving them to your package.json.
    • +
    • In npm pkg set it enables parsing set values with JSON.parse() before +saving them to your package.json.

    Not supported by all npm commands.

    browser

    @@ -210,21 +210,20 @@

    browser

    Set to true to use default system URL opener.

    unicode

      -
    • Default: false on windows, true on mac/unix systems with a unicode -locale, as defined by the LC_ALL, LC_CTYPE, or LANG environment -variables.
    • +
    • Default: false on windows, true on mac/unix systems with a unicode locale, +as defined by the LC_ALL, LC_CTYPE, or LANG environment variables.
    • Type: Boolean
    -

    When set to true, npm uses unicode characters in the tree output. -When false, it uses ascii characters instead of unicode glyphs.

    +

    When set to true, npm uses unicode characters in the tree output. When +false, it uses ascii characters instead of unicode glyphs.

    workspace

    • Default:
    • Type: String (can be set multiple times)
    -

    Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

    +

    Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

    Valid values for the workspace config are either:

    • Workspace names
    • @@ -232,17 +231,16 @@

      workspace

    • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
    -

    When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

    +

    When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

    This value is not exported to the environment for child processes.

    which

    • Default: null
    • Type: null or Number
    -

    If there are multiple funding sources, which 1-indexed source URL to -open.

    +

    If there are multiple funding sources, which 1-indexed source URL to open.

    See Also

    • package spec
    • diff --git a/deps/npm/docs/output/commands/npm-help-search.html b/deps/npm/docs/output/commands/npm-help-search.html index 302450849aa5bb..38715599a43535 100644 --- a/deps/npm/docs/output/commands/npm-help-search.html +++ b/deps/npm/docs/output/commands/npm-help-search.html @@ -141,9 +141,9 @@
      -

      +

      npm-help-search - @11.6.2 + @11.6.3

      Search npm help documentation
      diff --git a/deps/npm/docs/output/commands/npm-help.html b/deps/npm/docs/output/commands/npm-help.html index fcf951538a0cbc..a45b70b65b74b8 100644 --- a/deps/npm/docs/output/commands/npm-help.html +++ b/deps/npm/docs/output/commands/npm-help.html @@ -141,9 +141,9 @@
      -

      +

      npm-help - @11.6.2 + @11.6.3

      Get help on npm
      @@ -170,8 +170,7 @@

      viewer

    • Type: String

    The program to use to view help content.

    -

    Set to "browser" to view html help content in the default web -browser.

    +

    Set to "browser" to view html help content in the default web browser.

    See Also

    • npm
    • diff --git a/deps/npm/docs/output/commands/npm-init.html b/deps/npm/docs/output/commands/npm-init.html index a614375240ac91..7ca120139e16c4 100644 --- a/deps/npm/docs/output/commands/npm-init.html +++ b/deps/npm/docs/output/commands/npm-init.html @@ -141,9 +141,9 @@
      -

      +

      npm-init - @11.6.2 + @11.6.3

      Create a package.json file
      @@ -248,8 +248,7 @@

      init-author-name

    • Default: ""
    • Type: String
    -

    The value npm init should use by default for the package author's -name.

    +

    The value npm init should use by default for the package author's name.

    init-author-url

    • Default: ""
    • @@ -270,29 +269,28 @@

      init-module

    A module that will be loaded by the npm init command. See the documentation for the -init-package-json module -for more information, or npm init.

    +init-package-json module for +more information, or npm init.

    init-type

    • Default: "commonjs"
    • Type: String
    -

    The value that npm init should use by default for the package.json -type field.

    +

    The value that npm init should use by default for the package.json type +field.

    init-version

    • Default: "1.0.0"
    • Type: SemVer string
    -

    The value that npm init should use by default for the package -version number, if not already set in package.json.

    +

    The value that npm init should use by default for the package version +number, if not already set in package.json.

    init-private

    • Default: false
    • Type: Boolean
    -

    The value npm init should use by default for the package's private -flag.

    +

    The value npm init should use by default for the package's private flag.

    yes

    • Default: null
    • @@ -311,16 +309,14 @@

      force

    • Allow clobbering non-npm files in global installs.
    • Allow the npm version command to work on an unclean git repository.
    • Allow deleting the cache folder with npm cache clean.
    • -
    • Allow installing packages that have an engines declaration -requiring a different version of npm.
    • -
    • Allow installing packages that have an engines declaration -requiring a different version of node, even if --engine-strict is -enabled.
    • -
    • Allow npm audit fix to install modules outside your stated -dependency range (including SemVer-major changes).
    • +
    • Allow installing packages that have an engines declaration requiring a +different version of npm.
    • +
    • Allow installing packages that have an engines declaration requiring a +different version of node, even if --engine-strict is enabled.
    • +
    • Allow npm audit fix to install modules outside your stated dependency +range (including SemVer-major changes).
    • Allow unpublishing all versions of a published package.
    • -
    • Allow conflicting peerDependencies to be installed in the root -project.
    • +
    • Allow conflicting peerDependencies to be installed in the root project.
    • Implicitly set --yes during npm init.
    • Allow clobbering existing values in npm pkg
    • Allow unpublishing of entire packages (not just a single version).
    • @@ -353,9 +349,9 @@

      workspace

    • Default:
    • Type: String (can be set multiple times)
    -

    Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

    +

    Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

    Valid values for the workspace config are either:

    • Workspace names
    • @@ -363,9 +359,9 @@

      workspace

    • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
    -

    When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

    +

    When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

    This value is not exported to the environment for child processes.

    workspaces

      @@ -374,14 +370,13 @@

      workspaces

    Set to true to run the command in the context of all configured workspaces.

    -

    Explicitly setting this to false will cause commands like install -to ignore workspaces altogether. When not set explicitly:

    +

    Explicitly setting this to false will cause commands like install to +ignore workspaces altogether. When not set explicitly:

      -
    • Commands that operate on the node_modules tree (install, update, -etc.) will link workspaces into the node_modules folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, unless one or more workspaces are specified in the -workspace config.
    • +
    • Commands that operate on the node_modules tree (install, update, etc.) +will link workspaces into the node_modules folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +unless one or more workspaces are specified in the workspace config.

    This value is not exported to the environment for child processes.

    workspaces-update

    @@ -389,19 +384,17 @@

    workspaces-update

  • Default: true
  • Type: Boolean
  • -

    If set to true, the npm cli will run an update after operations that -may possibly change the workspaces installed to the node_modules -folder.

    +

    If set to true, the npm cli will run an update after operations that may +possibly change the workspaces installed to the node_modules folder.

    include-workspace-root

    • Default: false
    • Type: Boolean

    Include the workspace root when workspaces are enabled for a command.

    -

    When false, specifying individual workspaces via the workspace -config, or all workspaces via the workspaces flag, will cause npm -to operate only on the specified workspaces, and not on the root -project.

    +

    When false, specifying individual workspaces via the workspace config, or +all workspaces via the workspaces flag, will cause npm to operate only on +the specified workspaces, and not on the root project.

    This value is not exported to the environment for child processes.

    See Also

      diff --git a/deps/npm/docs/output/commands/npm-install-ci-test.html b/deps/npm/docs/output/commands/npm-install-ci-test.html index 5ce09186ea55cd..87ab6df8202828 100644 --- a/deps/npm/docs/output/commands/npm-install-ci-test.html +++ b/deps/npm/docs/output/commands/npm-install-ci-test.html @@ -141,9 +141,9 @@
      -

      +

      npm-install-ci-test - @11.6.2 + @11.6.3

      Install a project with a clean slate and run tests
      @@ -167,12 +167,11 @@

      install-strategy

    • Type: "hoisted", "nested", "shallow", or "linked"

    Sets the strategy for installing packages in node_modules. hoisted -(default): Install non-duplicated in top-level, and duplicated as -necessary within directory structure. nested: (formerly ---legacy-bundling) install in place, no hoisting. shallow (formerly ---global-style) only install direct deps at top-level. linked: -(experimental) install in node_modules/.store, link in place, -unhoisted.

    +(default): Install non-duplicated in top-level, and duplicated as necessary +within directory structure. nested: (formerly --legacy-bundling) install in +place, no hoisting. shallow (formerly --global-style) only install direct +deps at top-level. linked: (experimental) install in node_modules/.store, +link in place, unhoisted.

    legacy-bundling

    • Default: false
    • @@ -180,10 +179,10 @@

      legacy-bundling

    • DEPRECATED: This option has been deprecated in favor of --install-strategy=nested
    -

    Instead of hoisting package installs in node_modules, install -packages in the same manner that they are depended on. This may cause -very deep directory structures and duplicate package installs as -there is no de-duplicating. Sets --install-strategy=nested.

    +

    Instead of hoisting package installs in node_modules, install packages in +the same manner that they are depended on. This may cause very deep +directory structures and duplicate package installs as there is no +de-duplicating. Sets --install-strategy=nested.

    global-style

    • Default: false
    • @@ -191,8 +190,8 @@

      global-style

    • DEPRECATED: This option has been deprecated in favor of --install-strategy=shallow
    -

    Only install direct dependencies in the top level node_modules, but -hoist on deeper dependencies. Sets --install-strategy=shallow.

    +

    Only install direct dependencies in the top level node_modules, but hoist +on deeper dependencies. Sets --install-strategy=shallow.

    omit

    • Default: 'dev' if the NODE_ENV environment variable is set to @@ -203,70 +202,65 @@

      omit

      Note that these dependencies are still resolved and added to the package-lock.json or npm-shrinkwrap.json file. They are just not physically installed on disk.

      -

      If a package type appears in both the --include and --omit lists, -then it will be included.

      -

      If the resulting omit list includes 'dev', then the NODE_ENV -environment variable will be set to 'production' for all lifecycle -scripts.

      +

      If a package type appears in both the --include and --omit lists, then +it will be included.

      +

      If the resulting omit list includes 'dev', then the NODE_ENV environment +variable will be set to 'production' for all lifecycle scripts.

      include

      • Default:
      • -
      • Type: "prod", "dev", "optional", or "peer" (can be set multiple -times)
      • +
      • Type: "prod", "dev", "optional", or "peer" (can be set multiple times)
      -

      Option that allows for defining which types of dependencies to -install.

      +

      Option that allows for defining which types of dependencies to install.

      This is the inverse of --omit=<type>.

      -

      Dependency types specified in --include will not be omitted, -regardless of the order in which omit/include are specified on the -command-line.

      +

      Dependency types specified in --include will not be omitted, regardless of +the order in which omit/include are specified on the command-line.

      strict-peer-deps

      • Default: false
      • Type: Boolean

      If set to true, and --legacy-peer-deps is not set, then any -conflicting peerDependencies will be treated as an install failure, -even if npm could reasonably guess the appropriate resolution based -on non-peer dependency relationships.

      -

      By default, conflicting peerDependencies deep in the dependency -graph will be resolved using the nearest non-peer dependency -specification, even if doing so will result in some packages -receiving a peer dependency outside the range set in their package's -peerDependencies object.

      -

      When such an override is performed, a warning is printed, explaining -the conflict and the packages involved. If --strict-peer-deps is -set, then this warning is treated as a failure.

      +conflicting peerDependencies will be treated as an install failure, even +if npm could reasonably guess the appropriate resolution based on non-peer +dependency relationships.

      +

      By default, conflicting peerDependencies deep in the dependency graph will +be resolved using the nearest non-peer dependency specification, even if +doing so will result in some packages receiving a peer dependency outside +the range set in their package's peerDependencies object.

      +

      When such an override is performed, a warning is printed, explaining the +conflict and the packages involved. If --strict-peer-deps is set, then +this warning is treated as a failure.

      foreground-scripts

        -
      • Default: false unless when using npm pack or npm publish where -it defaults to true
      • +
      • Default: false unless when using npm pack or npm publish where it +defaults to true
      • Type: Boolean
      -

      Run all build scripts (ie, preinstall, install, and -postinstall) scripts for installed packages in the foreground -process, sharing standard input, output, and error with the main npm -process.

      -

      Note that this will generally make installs run slower, and be much -noisier, but can be useful for debugging.

      +

      Run all build scripts (ie, preinstall, install, and postinstall) +scripts for installed packages in the foreground process, sharing standard +input, output, and error with the main npm process.

      +

      Note that this will generally make installs run slower, and be much noisier, +but can be useful for debugging.

      ignore-scripts

      • Default: false
      • Type: Boolean

      If true, npm does not run scripts specified in package.json files.

      -

      Note that commands explicitly intended to run a particular script, -such as npm start, npm stop, npm restart, npm test, and npm run will still run their intended script if ignore-scripts is set, -but they will not run any pre- or post-scripts.

      +

      Note that commands explicitly intended to run a particular script, such as +npm start, npm stop, npm restart, npm test, and npm run will still +run their intended script if ignore-scripts is set, but they will not +run any pre- or post-scripts.

      audit

      • Default: true
      • Type: Boolean
      -

      When "true" submit audit reports alongside the current npm command to -the default registry and all registries configured for scopes. See -the documentation for npm audit for details -on what is submitted.

      +

      When "true" submit audit reports alongside the current npm command to the +default registry and all registries configured for scopes. See the +documentation for npm audit for details on what is +submitted.

      • Default: true
      • @@ -274,37 +268,35 @@

      Tells npm to create symlinks (or .cmd shims on Windows) for package executables.

      -

      Set to false to have it not do this. This can be used to work around -the fact that some file systems don't support symlinks, even on -ostensibly Unix systems.

      +

      Set to false to have it not do this. This can be used to work around the +fact that some file systems don't support symlinks, even on ostensibly Unix +systems.

      fund

      • Default: true
      • Type: Boolean

      When "true" displays the message at the end of each npm install -acknowledging the number of dependencies looking for funding. See -npm fund for details.

      +acknowledging the number of dependencies looking for funding. See npm fund for details.

      dry-run

      • Default: false
      • Type: Boolean
      -

      Indicates that you don't want npm to make any changes and that it -should only report what it would have done. This can be passed into -any of the commands that modify your local installation, eg, -install, update, dedupe, uninstall, as well as pack and -publish.

      -

      Note: This is NOT honored by other network related commands, eg -dist-tags, owner, etc.

      +

      Indicates that you don't want npm to make any changes and that it should +only report what it would have done. This can be passed into any of the +commands that modify your local installation, eg, install, update, +dedupe, uninstall, as well as pack and publish.

      +

      Note: This is NOT honored by other network related commands, eg dist-tags, +owner, etc.

      workspace

      • Default:
      • Type: String (can be set multiple times)
      -

      Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

      +

      Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

      Valid values for the workspace config are either:

      • Workspace names
      • @@ -312,9 +304,9 @@

        workspace

      • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
      -

      When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

      +

      When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

      This value is not exported to the environment for child processes.

      workspaces

        @@ -323,14 +315,13 @@

        workspaces

      Set to true to run the command in the context of all configured workspaces.

      -

      Explicitly setting this to false will cause commands like install -to ignore workspaces altogether. When not set explicitly:

      +

      Explicitly setting this to false will cause commands like install to +ignore workspaces altogether. When not set explicitly:

        -
      • Commands that operate on the node_modules tree (install, update, -etc.) will link workspaces into the node_modules folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, unless one or more workspaces are specified in the -workspace config.
      • +
      • Commands that operate on the node_modules tree (install, update, etc.) +will link workspaces into the node_modules folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +unless one or more workspaces are specified in the workspace config.

      This value is not exported to the environment for child processes.

      include-workspace-root

      @@ -339,19 +330,18 @@

      include-workspace-root

    • Type: Boolean

    Include the workspace root when workspaces are enabled for a command.

    -

    When false, specifying individual workspaces via the workspace -config, or all workspaces via the workspaces flag, will cause npm -to operate only on the specified workspaces, and not on the root -project.

    +

    When false, specifying individual workspaces via the workspace config, or +all workspaces via the workspaces flag, will cause npm to operate only on +the specified workspaces, and not on the root project.

    This value is not exported to the environment for child processes.

    • Default: false
    • Type: Boolean
    -

    When set file: protocol dependencies will be packed and installed as -regular dependencies instead of creating a symlink. This option has -no effect on workspaces.

    +

    When set file: protocol dependencies will be packed and installed as regular +dependencies instead of creating a symlink. This option has no effect on +workspaces.

    See Also

    • npm install-test
    • diff --git a/deps/npm/docs/output/commands/npm-install-test.html b/deps/npm/docs/output/commands/npm-install-test.html index e1db52fb95b05b..f230e441c05384 100644 --- a/deps/npm/docs/output/commands/npm-install-test.html +++ b/deps/npm/docs/output/commands/npm-install-test.html @@ -141,9 +141,9 @@
      -

      +

      npm-install-test - @11.6.2 + @11.6.3

      Install package(s) and run tests
      @@ -164,8 +164,7 @@

      Description

      Configuration

      save

        -
      • Default: true unless when using npm update where it defaults to -false
      • +
      • Default: true unless when using npm update where it defaults to false
      • Type: Boolean

      Save installed packages to a package.json file as dependencies.

      @@ -177,20 +176,19 @@

      save-exact

    • Default: false
    • Type: Boolean
    -

    Dependencies saved to package.json will be configured with an exact -version rather than using npm's default semver range operator.

    +

    Dependencies saved to package.json will be configured with an exact version +rather than using npm's default semver range operator.

    global

    • Default: false
    • Type: Boolean
    -

    Operates in "global" mode, so that packages are installed into the -prefix folder instead of the current working directory. See -folders for more on the differences in -behavior.

    +

    Operates in "global" mode, so that packages are installed into the prefix +folder instead of the current working directory. See +folders for more on the differences in behavior.

      -
    • packages are installed into the {prefix}/lib/node_modules folder, -instead of the current working directory.
    • +
    • packages are installed into the {prefix}/lib/node_modules folder, instead +of the current working directory.
    • bin files are linked to {prefix}/bin
    • man pages are linked to {prefix}/share/man
    @@ -200,12 +198,11 @@

    install-strategy

  • Type: "hoisted", "nested", "shallow", or "linked"
  • Sets the strategy for installing packages in node_modules. hoisted -(default): Install non-duplicated in top-level, and duplicated as -necessary within directory structure. nested: (formerly ---legacy-bundling) install in place, no hoisting. shallow (formerly ---global-style) only install direct deps at top-level. linked: -(experimental) install in node_modules/.store, link in place, -unhoisted.

    +(default): Install non-duplicated in top-level, and duplicated as necessary +within directory structure. nested: (formerly --legacy-bundling) install in +place, no hoisting. shallow (formerly --global-style) only install direct +deps at top-level. linked: (experimental) install in node_modules/.store, +link in place, unhoisted.

    legacy-bundling

    • Default: false
    • @@ -213,10 +210,10 @@

      legacy-bundling

    • DEPRECATED: This option has been deprecated in favor of --install-strategy=nested
    -

    Instead of hoisting package installs in node_modules, install -packages in the same manner that they are depended on. This may cause -very deep directory structures and duplicate package installs as -there is no de-duplicating. Sets --install-strategy=nested.

    +

    Instead of hoisting package installs in node_modules, install packages in +the same manner that they are depended on. This may cause very deep +directory structures and duplicate package installs as there is no +de-duplicating. Sets --install-strategy=nested.

    global-style

    • Default: false
    • @@ -224,8 +221,8 @@

      global-style

    • DEPRECATED: This option has been deprecated in favor of --install-strategy=shallow
    -

    Only install direct dependencies in the top level node_modules, but -hoist on deeper dependencies. Sets --install-strategy=shallow.

    +

    Only install direct dependencies in the top level node_modules, but hoist +on deeper dependencies. Sets --install-strategy=shallow.

    omit

    • Default: 'dev' if the NODE_ENV environment variable is set to @@ -236,110 +233,103 @@

      omit

      Note that these dependencies are still resolved and added to the package-lock.json or npm-shrinkwrap.json file. They are just not physically installed on disk.

      -

      If a package type appears in both the --include and --omit lists, -then it will be included.

      -

      If the resulting omit list includes 'dev', then the NODE_ENV -environment variable will be set to 'production' for all lifecycle -scripts.

      +

      If a package type appears in both the --include and --omit lists, then +it will be included.

      +

      If the resulting omit list includes 'dev', then the NODE_ENV environment +variable will be set to 'production' for all lifecycle scripts.

      include

      • Default:
      • -
      • Type: "prod", "dev", "optional", or "peer" (can be set multiple -times)
      • +
      • Type: "prod", "dev", "optional", or "peer" (can be set multiple times)
      -

      Option that allows for defining which types of dependencies to -install.

      +

      Option that allows for defining which types of dependencies to install.

      This is the inverse of --omit=<type>.

      -

      Dependency types specified in --include will not be omitted, -regardless of the order in which omit/include are specified on the -command-line.

      +

      Dependency types specified in --include will not be omitted, regardless of +the order in which omit/include are specified on the command-line.

      strict-peer-deps

      • Default: false
      • Type: Boolean

      If set to true, and --legacy-peer-deps is not set, then any -conflicting peerDependencies will be treated as an install failure, -even if npm could reasonably guess the appropriate resolution based -on non-peer dependency relationships.

      -

      By default, conflicting peerDependencies deep in the dependency -graph will be resolved using the nearest non-peer dependency -specification, even if doing so will result in some packages -receiving a peer dependency outside the range set in their package's -peerDependencies object.

      -

      When such an override is performed, a warning is printed, explaining -the conflict and the packages involved. If --strict-peer-deps is -set, then this warning is treated as a failure.

      +conflicting peerDependencies will be treated as an install failure, even +if npm could reasonably guess the appropriate resolution based on non-peer +dependency relationships.

      +

      By default, conflicting peerDependencies deep in the dependency graph will +be resolved using the nearest non-peer dependency specification, even if +doing so will result in some packages receiving a peer dependency outside +the range set in their package's peerDependencies object.

      +

      When such an override is performed, a warning is printed, explaining the +conflict and the packages involved. If --strict-peer-deps is set, then +this warning is treated as a failure.

      prefer-dedupe

      • Default: false
      • Type: Boolean
      -

      Prefer to deduplicate packages if possible, rather than choosing a -newer version of a dependency.

      +

      Prefer to deduplicate packages if possible, rather than choosing a newer +version of a dependency.

      package-lock

      • Default: true
      • Type: Boolean
      -

      If set to false, then ignore package-lock.json files when -installing. This will also prevent writing package-lock.json if -save is true.

      +

      If set to false, then ignore package-lock.json files when installing. This +will also prevent writing package-lock.json if save is true.

      package-lock-only

      • Default: false
      • Type: Boolean
      -

      If set to true, the current operation will only use the -package-lock.json, ignoring node_modules.

      +

      If set to true, the current operation will only use the package-lock.json, +ignoring node_modules.

      For update this means only the package-lock.json will be updated, instead of checking node_modules and downloading dependencies.

      -

      For list this means the output will be based on the tree described -by the package-lock.json, rather than the contents of -node_modules.

      +

      For list this means the output will be based on the tree described by the +package-lock.json, rather than the contents of node_modules.

      foreground-scripts

        -
      • Default: false unless when using npm pack or npm publish where -it defaults to true
      • +
      • Default: false unless when using npm pack or npm publish where it +defaults to true
      • Type: Boolean
      -

      Run all build scripts (ie, preinstall, install, and -postinstall) scripts for installed packages in the foreground -process, sharing standard input, output, and error with the main npm -process.

      -

      Note that this will generally make installs run slower, and be much -noisier, but can be useful for debugging.

      +

      Run all build scripts (ie, preinstall, install, and postinstall) +scripts for installed packages in the foreground process, sharing standard +input, output, and error with the main npm process.

      +

      Note that this will generally make installs run slower, and be much noisier, +but can be useful for debugging.

      ignore-scripts

      • Default: false
      • Type: Boolean

      If true, npm does not run scripts specified in package.json files.

      -

      Note that commands explicitly intended to run a particular script, -such as npm start, npm stop, npm restart, npm test, and npm run will still run their intended script if ignore-scripts is set, -but they will not run any pre- or post-scripts.

      +

      Note that commands explicitly intended to run a particular script, such as +npm start, npm stop, npm restart, npm test, and npm run will still +run their intended script if ignore-scripts is set, but they will not +run any pre- or post-scripts.

      audit

      • Default: true
      • Type: Boolean
      -

      When "true" submit audit reports alongside the current npm command to -the default registry and all registries configured for scopes. See -the documentation for npm audit for details -on what is submitted.

      +

      When "true" submit audit reports alongside the current npm command to the +default registry and all registries configured for scopes. See the +documentation for npm audit for details on what is +submitted.

      before

      • Default: null
      • Type: null or Date

      If passed to npm install, will rebuild the npm tree such that only -versions that were available on or before the given date are -installed. If there are no versions available for the current set of -dependencies, the command will error.

      -

      If the requested version is a dist-tag and the given tag does not -pass the --before filter, the most recent version less than or -equal to that tag will be used. For example, foo@latest might -install foo@1.2 even though latest is 2.0.

      +versions that were available on or before the given date are installed. +If there are no versions available for the current set of dependencies, the +command will error.

      +

      If the requested version is a dist-tag and the given tag does not pass the +--before filter, the most recent version less than or equal to that tag +will be used. For example, foo@latest might install foo@1.2 even though +latest is 2.0.

      • Default: true
      • @@ -347,59 +337,56 @@

      Tells npm to create symlinks (or .cmd shims on Windows) for package executables.

      -

      Set to false to have it not do this. This can be used to work around -the fact that some file systems don't support symlinks, even on -ostensibly Unix systems.

      +

      Set to false to have it not do this. This can be used to work around the +fact that some file systems don't support symlinks, even on ostensibly Unix +systems.

      fund

      • Default: true
      • Type: Boolean

      When "true" displays the message at the end of each npm install -acknowledging the number of dependencies looking for funding. See -npm fund for details.

      +acknowledging the number of dependencies looking for funding. See npm fund for details.

      dry-run

      • Default: false
      • Type: Boolean
      -

      Indicates that you don't want npm to make any changes and that it -should only report what it would have done. This can be passed into -any of the commands that modify your local installation, eg, -install, update, dedupe, uninstall, as well as pack and -publish.

      -

      Note: This is NOT honored by other network related commands, eg -dist-tags, owner, etc.

      +

      Indicates that you don't want npm to make any changes and that it should +only report what it would have done. This can be passed into any of the +commands that modify your local installation, eg, install, update, +dedupe, uninstall, as well as pack and publish.

      +

      Note: This is NOT honored by other network related commands, eg dist-tags, +owner, etc.

      cpu

      • Default: null
      • Type: null or String
      -

      Override CPU architecture of native modules to install. Acceptable -values are same as cpu field of package.json, which comes from -process.arch.

      +

      Override CPU architecture of native modules to install. Acceptable values +are same as cpu field of package.json, which comes from process.arch.

      os

      • Default: null
      • Type: null or String
      -

      Override OS of native modules to install. Acceptable values are same -as os field of package.json, which comes from process.platform.

      +

      Override OS of native modules to install. Acceptable values are same as os +field of package.json, which comes from process.platform.

      libc

      • Default: null
      • Type: null or String
      -

      Override libc of native modules to install. Acceptable values are -same as libc field of package.json

      +

      Override libc of native modules to install. Acceptable values are same as +libc field of package.json

      workspace

      • Default:
      • Type: String (can be set multiple times)
      -

      Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

      +

      Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

      Valid values for the workspace config are either:

      • Workspace names
      • @@ -407,9 +394,9 @@

        workspace

      • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
      -

      When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

      +

      When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

      This value is not exported to the environment for child processes.

      workspaces

        @@ -418,14 +405,13 @@

        workspaces

      Set to true to run the command in the context of all configured workspaces.

      -

      Explicitly setting this to false will cause commands like install -to ignore workspaces altogether. When not set explicitly:

      +

      Explicitly setting this to false will cause commands like install to +ignore workspaces altogether. When not set explicitly:

        -
      • Commands that operate on the node_modules tree (install, update, -etc.) will link workspaces into the node_modules folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, unless one or more workspaces are specified in the -workspace config.
      • +
      • Commands that operate on the node_modules tree (install, update, etc.) +will link workspaces into the node_modules folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +unless one or more workspaces are specified in the workspace config.

      This value is not exported to the environment for child processes.

      include-workspace-root

      @@ -434,19 +420,18 @@

      include-workspace-root

    • Type: Boolean

    Include the workspace root when workspaces are enabled for a command.

    -

    When false, specifying individual workspaces via the workspace -config, or all workspaces via the workspaces flag, will cause npm -to operate only on the specified workspaces, and not on the root -project.

    +

    When false, specifying individual workspaces via the workspace config, or +all workspaces via the workspaces flag, will cause npm to operate only on +the specified workspaces, and not on the root project.

    This value is not exported to the environment for child processes.

    • Default: false
    • Type: Boolean
    -

    When set file: protocol dependencies will be packed and installed as -regular dependencies instead of creating a symlink. This option has -no effect on workspaces.

    +

    When set file: protocol dependencies will be packed and installed as regular +dependencies instead of creating a symlink. This option has no effect on +workspaces.

    See Also

    • npm install
    • diff --git a/deps/npm/docs/output/commands/npm-install.html b/deps/npm/docs/output/commands/npm-install.html index f439db3cb17c69..89a97891b029ff 100644 --- a/deps/npm/docs/output/commands/npm-install.html +++ b/deps/npm/docs/output/commands/npm-install.html @@ -141,9 +141,9 @@
      -

      +

      npm-install - @11.6.2 + @11.6.3

      Install a package
      @@ -420,8 +420,7 @@

      Configuration

      These are some of the most common options related to installation.

      save

        -
      • Default: true unless when using npm update where it defaults to -false
      • +
      • Default: true unless when using npm update where it defaults to false
      • Type: Boolean

      Save installed packages to a package.json file as dependencies.

      @@ -433,20 +432,19 @@

      save-exact

    • Default: false
    • Type: Boolean
    -

    Dependencies saved to package.json will be configured with an exact -version rather than using npm's default semver range operator.

    +

    Dependencies saved to package.json will be configured with an exact version +rather than using npm's default semver range operator.

    global

    • Default: false
    • Type: Boolean
    -

    Operates in "global" mode, so that packages are installed into the -prefix folder instead of the current working directory. See -folders for more on the differences in -behavior.

    +

    Operates in "global" mode, so that packages are installed into the prefix +folder instead of the current working directory. See +folders for more on the differences in behavior.

      -
    • packages are installed into the {prefix}/lib/node_modules folder, -instead of the current working directory.
    • +
    • packages are installed into the {prefix}/lib/node_modules folder, instead +of the current working directory.
    • bin files are linked to {prefix}/bin
    • man pages are linked to {prefix}/share/man
    @@ -456,12 +454,11 @@

    install-strategy

  • Type: "hoisted", "nested", "shallow", or "linked"
  • Sets the strategy for installing packages in node_modules. hoisted -(default): Install non-duplicated in top-level, and duplicated as -necessary within directory structure. nested: (formerly ---legacy-bundling) install in place, no hoisting. shallow (formerly ---global-style) only install direct deps at top-level. linked: -(experimental) install in node_modules/.store, link in place, -unhoisted.

    +(default): Install non-duplicated in top-level, and duplicated as necessary +within directory structure. nested: (formerly --legacy-bundling) install in +place, no hoisting. shallow (formerly --global-style) only install direct +deps at top-level. linked: (experimental) install in node_modules/.store, +link in place, unhoisted.

    legacy-bundling

    • Default: false
    • @@ -469,10 +466,10 @@

      legacy-bundling

    • DEPRECATED: This option has been deprecated in favor of --install-strategy=nested
    -

    Instead of hoisting package installs in node_modules, install -packages in the same manner that they are depended on. This may cause -very deep directory structures and duplicate package installs as -there is no de-duplicating. Sets --install-strategy=nested.

    +

    Instead of hoisting package installs in node_modules, install packages in +the same manner that they are depended on. This may cause very deep +directory structures and duplicate package installs as there is no +de-duplicating. Sets --install-strategy=nested.

    global-style

    • Default: false
    • @@ -480,8 +477,8 @@

      global-style

    • DEPRECATED: This option has been deprecated in favor of --install-strategy=shallow
    -

    Only install direct dependencies in the top level node_modules, but -hoist on deeper dependencies. Sets --install-strategy=shallow.

    +

    Only install direct dependencies in the top level node_modules, but hoist +on deeper dependencies. Sets --install-strategy=shallow.

    omit

    • Default: 'dev' if the NODE_ENV environment variable is set to @@ -492,110 +489,103 @@

      omit

      Note that these dependencies are still resolved and added to the package-lock.json or npm-shrinkwrap.json file. They are just not physically installed on disk.

      -

      If a package type appears in both the --include and --omit lists, -then it will be included.

      -

      If the resulting omit list includes 'dev', then the NODE_ENV -environment variable will be set to 'production' for all lifecycle -scripts.

      +

      If a package type appears in both the --include and --omit lists, then +it will be included.

      +

      If the resulting omit list includes 'dev', then the NODE_ENV environment +variable will be set to 'production' for all lifecycle scripts.

      include

      • Default:
      • -
      • Type: "prod", "dev", "optional", or "peer" (can be set multiple -times)
      • +
      • Type: "prod", "dev", "optional", or "peer" (can be set multiple times)
      -

      Option that allows for defining which types of dependencies to -install.

      +

      Option that allows for defining which types of dependencies to install.

      This is the inverse of --omit=<type>.

      -

      Dependency types specified in --include will not be omitted, -regardless of the order in which omit/include are specified on the -command-line.

      +

      Dependency types specified in --include will not be omitted, regardless of +the order in which omit/include are specified on the command-line.

      strict-peer-deps

      • Default: false
      • Type: Boolean

      If set to true, and --legacy-peer-deps is not set, then any -conflicting peerDependencies will be treated as an install failure, -even if npm could reasonably guess the appropriate resolution based -on non-peer dependency relationships.

      -

      By default, conflicting peerDependencies deep in the dependency -graph will be resolved using the nearest non-peer dependency -specification, even if doing so will result in some packages -receiving a peer dependency outside the range set in their package's -peerDependencies object.

      -

      When such an override is performed, a warning is printed, explaining -the conflict and the packages involved. If --strict-peer-deps is -set, then this warning is treated as a failure.

      +conflicting peerDependencies will be treated as an install failure, even +if npm could reasonably guess the appropriate resolution based on non-peer +dependency relationships.

      +

      By default, conflicting peerDependencies deep in the dependency graph will +be resolved using the nearest non-peer dependency specification, even if +doing so will result in some packages receiving a peer dependency outside +the range set in their package's peerDependencies object.

      +

      When such an override is performed, a warning is printed, explaining the +conflict and the packages involved. If --strict-peer-deps is set, then +this warning is treated as a failure.

      prefer-dedupe

      • Default: false
      • Type: Boolean
      -

      Prefer to deduplicate packages if possible, rather than choosing a -newer version of a dependency.

      +

      Prefer to deduplicate packages if possible, rather than choosing a newer +version of a dependency.

      package-lock

      • Default: true
      • Type: Boolean
      -

      If set to false, then ignore package-lock.json files when -installing. This will also prevent writing package-lock.json if -save is true.

      +

      If set to false, then ignore package-lock.json files when installing. This +will also prevent writing package-lock.json if save is true.

      package-lock-only

      • Default: false
      • Type: Boolean
      -

      If set to true, the current operation will only use the -package-lock.json, ignoring node_modules.

      +

      If set to true, the current operation will only use the package-lock.json, +ignoring node_modules.

      For update this means only the package-lock.json will be updated, instead of checking node_modules and downloading dependencies.

      -

      For list this means the output will be based on the tree described -by the package-lock.json, rather than the contents of -node_modules.

      +

      For list this means the output will be based on the tree described by the +package-lock.json, rather than the contents of node_modules.

      foreground-scripts

        -
      • Default: false unless when using npm pack or npm publish where -it defaults to true
      • +
      • Default: false unless when using npm pack or npm publish where it +defaults to true
      • Type: Boolean
      -

      Run all build scripts (ie, preinstall, install, and -postinstall) scripts for installed packages in the foreground -process, sharing standard input, output, and error with the main npm -process.

      -

      Note that this will generally make installs run slower, and be much -noisier, but can be useful for debugging.

      +

      Run all build scripts (ie, preinstall, install, and postinstall) +scripts for installed packages in the foreground process, sharing standard +input, output, and error with the main npm process.

      +

      Note that this will generally make installs run slower, and be much noisier, +but can be useful for debugging.

      ignore-scripts

      • Default: false
      • Type: Boolean

      If true, npm does not run scripts specified in package.json files.

      -

      Note that commands explicitly intended to run a particular script, -such as npm start, npm stop, npm restart, npm test, and npm run will still run their intended script if ignore-scripts is set, -but they will not run any pre- or post-scripts.

      +

      Note that commands explicitly intended to run a particular script, such as +npm start, npm stop, npm restart, npm test, and npm run will still +run their intended script if ignore-scripts is set, but they will not +run any pre- or post-scripts.

      audit

      • Default: true
      • Type: Boolean
      -

      When "true" submit audit reports alongside the current npm command to -the default registry and all registries configured for scopes. See -the documentation for npm audit for details -on what is submitted.

      +

      When "true" submit audit reports alongside the current npm command to the +default registry and all registries configured for scopes. See the +documentation for npm audit for details on what is +submitted.

      before

      • Default: null
      • Type: null or Date

      If passed to npm install, will rebuild the npm tree such that only -versions that were available on or before the given date are -installed. If there are no versions available for the current set of -dependencies, the command will error.

      -

      If the requested version is a dist-tag and the given tag does not -pass the --before filter, the most recent version less than or -equal to that tag will be used. For example, foo@latest might -install foo@1.2 even though latest is 2.0.

      +versions that were available on or before the given date are installed. +If there are no versions available for the current set of dependencies, the +command will error.

      +

      If the requested version is a dist-tag and the given tag does not pass the +--before filter, the most recent version less than or equal to that tag +will be used. For example, foo@latest might install foo@1.2 even though +latest is 2.0.

      • Default: true
      • @@ -603,59 +593,56 @@

      Tells npm to create symlinks (or .cmd shims on Windows) for package executables.

      -

      Set to false to have it not do this. This can be used to work around -the fact that some file systems don't support symlinks, even on -ostensibly Unix systems.

      +

      Set to false to have it not do this. This can be used to work around the +fact that some file systems don't support symlinks, even on ostensibly Unix +systems.

      fund

      • Default: true
      • Type: Boolean

      When "true" displays the message at the end of each npm install -acknowledging the number of dependencies looking for funding. See -npm fund for details.

      +acknowledging the number of dependencies looking for funding. See npm fund for details.

      dry-run

      • Default: false
      • Type: Boolean
      -

      Indicates that you don't want npm to make any changes and that it -should only report what it would have done. This can be passed into -any of the commands that modify your local installation, eg, -install, update, dedupe, uninstall, as well as pack and -publish.

      -

      Note: This is NOT honored by other network related commands, eg -dist-tags, owner, etc.

      +

      Indicates that you don't want npm to make any changes and that it should +only report what it would have done. This can be passed into any of the +commands that modify your local installation, eg, install, update, +dedupe, uninstall, as well as pack and publish.

      +

      Note: This is NOT honored by other network related commands, eg dist-tags, +owner, etc.

      cpu

      • Default: null
      • Type: null or String
      -

      Override CPU architecture of native modules to install. Acceptable -values are same as cpu field of package.json, which comes from -process.arch.

      +

      Override CPU architecture of native modules to install. Acceptable values +are same as cpu field of package.json, which comes from process.arch.

      os

      • Default: null
      • Type: null or String
      -

      Override OS of native modules to install. Acceptable values are same -as os field of package.json, which comes from process.platform.

      +

      Override OS of native modules to install. Acceptable values are same as os +field of package.json, which comes from process.platform.

      libc

      • Default: null
      • Type: null or String
      -

      Override libc of native modules to install. Acceptable values are -same as libc field of package.json

      +

      Override libc of native modules to install. Acceptable values are same as +libc field of package.json

      workspace

      • Default:
      • Type: String (can be set multiple times)
      -

      Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

      +

      Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

      Valid values for the workspace config are either:

      • Workspace names
      • @@ -663,9 +650,9 @@

        workspace

      • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
      -

      When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

      +

      When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

      This value is not exported to the environment for child processes.

      workspaces

        @@ -674,14 +661,13 @@

        workspaces

      Set to true to run the command in the context of all configured workspaces.

      -

      Explicitly setting this to false will cause commands like install -to ignore workspaces altogether. When not set explicitly:

      +

      Explicitly setting this to false will cause commands like install to +ignore workspaces altogether. When not set explicitly:

        -
      • Commands that operate on the node_modules tree (install, update, -etc.) will link workspaces into the node_modules folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, unless one or more workspaces are specified in the -workspace config.
      • +
      • Commands that operate on the node_modules tree (install, update, etc.) +will link workspaces into the node_modules folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +unless one or more workspaces are specified in the workspace config.

      This value is not exported to the environment for child processes.

      include-workspace-root

      @@ -690,19 +676,18 @@

      include-workspace-root

    • Type: Boolean

    Include the workspace root when workspaces are enabled for a command.

    -

    When false, specifying individual workspaces via the workspace -config, or all workspaces via the workspaces flag, will cause npm -to operate only on the specified workspaces, and not on the root -project.

    +

    When false, specifying individual workspaces via the workspace config, or +all workspaces via the workspaces flag, will cause npm to operate only on +the specified workspaces, and not on the root project.

    This value is not exported to the environment for child processes.

    • Default: false
    • Type: Boolean
    -

    When set file: protocol dependencies will be packed and installed as -regular dependencies instead of creating a symlink. This option has -no effect on workspaces.

    +

    When set file: protocol dependencies will be packed and installed as regular +dependencies instead of creating a symlink. This option has no effect on +workspaces.

    Algorithm

    Given a package{dep} structure: A{B,C}, B{C}, C{D}, the npm install algorithm produces:

    A
    diff --git a/deps/npm/docs/output/commands/npm-link.html b/deps/npm/docs/output/commands/npm-link.html
    index 72ab0b3ada6997..444de4ffcb36ad 100644
    --- a/deps/npm/docs/output/commands/npm-link.html
    +++ b/deps/npm/docs/output/commands/npm-link.html
    @@ -141,9 +141,9 @@
     
     
    -

    +

    npm-link - @11.6.2 + @11.6.3

    Symlink a package folder
    @@ -206,8 +206,7 @@

    Workspace Usage

    Configuration

    save

      -
    • Default: true unless when using npm update where it defaults to -false
    • +
    • Default: true unless when using npm update where it defaults to false
    • Type: Boolean

    Save installed packages to a package.json file as dependencies.

    @@ -219,20 +218,19 @@

    save-exact

  • Default: false
  • Type: Boolean
  • -

    Dependencies saved to package.json will be configured with an exact -version rather than using npm's default semver range operator.

    +

    Dependencies saved to package.json will be configured with an exact version +rather than using npm's default semver range operator.

    global

    • Default: false
    • Type: Boolean
    -

    Operates in "global" mode, so that packages are installed into the -prefix folder instead of the current working directory. See -folders for more on the differences in -behavior.

    +

    Operates in "global" mode, so that packages are installed into the prefix +folder instead of the current working directory. See +folders for more on the differences in behavior.

      -
    • packages are installed into the {prefix}/lib/node_modules folder, -instead of the current working directory.
    • +
    • packages are installed into the {prefix}/lib/node_modules folder, instead +of the current working directory.
    • bin files are linked to {prefix}/bin
    • man pages are linked to {prefix}/share/man
    @@ -242,12 +240,11 @@

    install-strategy

  • Type: "hoisted", "nested", "shallow", or "linked"
  • Sets the strategy for installing packages in node_modules. hoisted -(default): Install non-duplicated in top-level, and duplicated as -necessary within directory structure. nested: (formerly ---legacy-bundling) install in place, no hoisting. shallow (formerly ---global-style) only install direct deps at top-level. linked: -(experimental) install in node_modules/.store, link in place, -unhoisted.

    +(default): Install non-duplicated in top-level, and duplicated as necessary +within directory structure. nested: (formerly --legacy-bundling) install in +place, no hoisting. shallow (formerly --global-style) only install direct +deps at top-level. linked: (experimental) install in node_modules/.store, +link in place, unhoisted.

    legacy-bundling

    • Default: false
    • @@ -255,10 +252,10 @@

      legacy-bundling

    • DEPRECATED: This option has been deprecated in favor of --install-strategy=nested
    -

    Instead of hoisting package installs in node_modules, install -packages in the same manner that they are depended on. This may cause -very deep directory structures and duplicate package installs as -there is no de-duplicating. Sets --install-strategy=nested.

    +

    Instead of hoisting package installs in node_modules, install packages in +the same manner that they are depended on. This may cause very deep +directory structures and duplicate package installs as there is no +de-duplicating. Sets --install-strategy=nested.

    global-style

    • Default: false
    • @@ -266,33 +263,31 @@

      global-style

    • DEPRECATED: This option has been deprecated in favor of --install-strategy=shallow
    -

    Only install direct dependencies in the top level node_modules, but -hoist on deeper dependencies. Sets --install-strategy=shallow.

    +

    Only install direct dependencies in the top level node_modules, but hoist +on deeper dependencies. Sets --install-strategy=shallow.

    strict-peer-deps

    • Default: false
    • Type: Boolean

    If set to true, and --legacy-peer-deps is not set, then any -conflicting peerDependencies will be treated as an install failure, -even if npm could reasonably guess the appropriate resolution based -on non-peer dependency relationships.

    -

    By default, conflicting peerDependencies deep in the dependency -graph will be resolved using the nearest non-peer dependency -specification, even if doing so will result in some packages -receiving a peer dependency outside the range set in their package's -peerDependencies object.

    -

    When such an override is performed, a warning is printed, explaining -the conflict and the packages involved. If --strict-peer-deps is -set, then this warning is treated as a failure.

    +conflicting peerDependencies will be treated as an install failure, even +if npm could reasonably guess the appropriate resolution based on non-peer +dependency relationships.

    +

    By default, conflicting peerDependencies deep in the dependency graph will +be resolved using the nearest non-peer dependency specification, even if +doing so will result in some packages receiving a peer dependency outside +the range set in their package's peerDependencies object.

    +

    When such an override is performed, a warning is printed, explaining the +conflict and the packages involved. If --strict-peer-deps is set, then +this warning is treated as a failure.

    package-lock

    • Default: true
    • Type: Boolean
    -

    If set to false, then ignore package-lock.json files when -installing. This will also prevent writing package-lock.json if -save is true.

    +

    If set to false, then ignore package-lock.json files when installing. This +will also prevent writing package-lock.json if save is true.

    omit

    • Default: 'dev' if the NODE_ENV environment variable is set to @@ -303,41 +298,38 @@

      omit

      Note that these dependencies are still resolved and added to the package-lock.json or npm-shrinkwrap.json file. They are just not physically installed on disk.

      -

      If a package type appears in both the --include and --omit lists, -then it will be included.

      -

      If the resulting omit list includes 'dev', then the NODE_ENV -environment variable will be set to 'production' for all lifecycle -scripts.

      +

      If a package type appears in both the --include and --omit lists, then +it will be included.

      +

      If the resulting omit list includes 'dev', then the NODE_ENV environment +variable will be set to 'production' for all lifecycle scripts.

      include

      • Default:
      • -
      • Type: "prod", "dev", "optional", or "peer" (can be set multiple -times)
      • +
      • Type: "prod", "dev", "optional", or "peer" (can be set multiple times)
      -

      Option that allows for defining which types of dependencies to -install.

      +

      Option that allows for defining which types of dependencies to install.

      This is the inverse of --omit=<type>.

      -

      Dependency types specified in --include will not be omitted, -regardless of the order in which omit/include are specified on the -command-line.

      +

      Dependency types specified in --include will not be omitted, regardless of +the order in which omit/include are specified on the command-line.

      ignore-scripts

      • Default: false
      • Type: Boolean

      If true, npm does not run scripts specified in package.json files.

      -

      Note that commands explicitly intended to run a particular script, -such as npm start, npm stop, npm restart, npm test, and npm run will still run their intended script if ignore-scripts is set, -but they will not run any pre- or post-scripts.

      +

      Note that commands explicitly intended to run a particular script, such as +npm start, npm stop, npm restart, npm test, and npm run will still +run their intended script if ignore-scripts is set, but they will not +run any pre- or post-scripts.

      audit

      • Default: true
      • Type: Boolean
      -

      When "true" submit audit reports alongside the current npm command to -the default registry and all registries configured for scopes. See -the documentation for npm audit for details -on what is submitted.

      +

      When "true" submit audit reports alongside the current npm command to the +default registry and all registries configured for scopes. See the +documentation for npm audit for details on what is +submitted.

      • Default: true
      • @@ -345,37 +337,35 @@

      Tells npm to create symlinks (or .cmd shims on Windows) for package executables.

      -

      Set to false to have it not do this. This can be used to work around -the fact that some file systems don't support symlinks, even on -ostensibly Unix systems.

      +

      Set to false to have it not do this. This can be used to work around the +fact that some file systems don't support symlinks, even on ostensibly Unix +systems.

      fund

      • Default: true
      • Type: Boolean

      When "true" displays the message at the end of each npm install -acknowledging the number of dependencies looking for funding. See -npm fund for details.

      +acknowledging the number of dependencies looking for funding. See npm fund for details.

      dry-run

      • Default: false
      • Type: Boolean
      -

      Indicates that you don't want npm to make any changes and that it -should only report what it would have done. This can be passed into -any of the commands that modify your local installation, eg, -install, update, dedupe, uninstall, as well as pack and -publish.

      -

      Note: This is NOT honored by other network related commands, eg -dist-tags, owner, etc.

      +

      Indicates that you don't want npm to make any changes and that it should +only report what it would have done. This can be passed into any of the +commands that modify your local installation, eg, install, update, +dedupe, uninstall, as well as pack and publish.

      +

      Note: This is NOT honored by other network related commands, eg dist-tags, +owner, etc.

      workspace

      • Default:
      • Type: String (can be set multiple times)
      -

      Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

      +

      Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

      Valid values for the workspace config are either:

      • Workspace names
      • @@ -383,9 +373,9 @@

        workspace

      • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
      -

      When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

      +

      When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

      This value is not exported to the environment for child processes.

      workspaces

        @@ -394,14 +384,13 @@

        workspaces

      Set to true to run the command in the context of all configured workspaces.

      -

      Explicitly setting this to false will cause commands like install -to ignore workspaces altogether. When not set explicitly:

      +

      Explicitly setting this to false will cause commands like install to +ignore workspaces altogether. When not set explicitly:

        -
      • Commands that operate on the node_modules tree (install, update, -etc.) will link workspaces into the node_modules folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, unless one or more workspaces are specified in the -workspace config.
      • +
      • Commands that operate on the node_modules tree (install, update, etc.) +will link workspaces into the node_modules folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +unless one or more workspaces are specified in the workspace config.

      This value is not exported to the environment for child processes.

      include-workspace-root

      @@ -410,19 +399,18 @@

      include-workspace-root

    • Type: Boolean

    Include the workspace root when workspaces are enabled for a command.

    -

    When false, specifying individual workspaces via the workspace -config, or all workspaces via the workspaces flag, will cause npm -to operate only on the specified workspaces, and not on the root -project.

    +

    When false, specifying individual workspaces via the workspace config, or +all workspaces via the workspaces flag, will cause npm to operate only on +the specified workspaces, and not on the root project.

    This value is not exported to the environment for child processes.

    • Default: false
    • Type: Boolean
    -

    When set file: protocol dependencies will be packed and installed as -regular dependencies instead of creating a symlink. This option has -no effect on workspaces.

    +

    When set file: protocol dependencies will be packed and installed as regular +dependencies instead of creating a symlink. This option has no effect on +workspaces.

    See Also

    • package spec
    • diff --git a/deps/npm/docs/output/commands/npm-login.html b/deps/npm/docs/output/commands/npm-login.html index 1031b01ae7559b..06b57e7c9d729b 100644 --- a/deps/npm/docs/output/commands/npm-login.html +++ b/deps/npm/docs/output/commands/npm-login.html @@ -141,9 +141,9 @@
      -

      +

      npm-login - @11.6.2 + @11.6.3

      Login to a registry user account
      @@ -201,8 +201,8 @@

      auth-type

    • Default: "web"
    • Type: "legacy" or "web"
    -

    What authentication strategy to use with login. Note that if an -otp config is given, this value will always be set to legacy.

    +

    What authentication strategy to use with login. Note that if an otp +config is given, this value will always be set to legacy.

    See Also

    • npm registry
    • diff --git a/deps/npm/docs/output/commands/npm-logout.html b/deps/npm/docs/output/commands/npm-logout.html index 2959f2369d51b9..9eca555d7258ec 100644 --- a/deps/npm/docs/output/commands/npm-logout.html +++ b/deps/npm/docs/output/commands/npm-logout.html @@ -141,9 +141,9 @@
      -

      +

      npm-logout - @11.6.2 + @11.6.3

      Log out of the registry
      diff --git a/deps/npm/docs/output/commands/npm-ls.html b/deps/npm/docs/output/commands/npm-ls.html index 2bbca3b4a70bc2..aaa2dcdcdcdfaa 100644 --- a/deps/npm/docs/output/commands/npm-ls.html +++ b/deps/npm/docs/output/commands/npm-ls.html @@ -141,9 +141,9 @@
      -

      +

      npm-ls - @11.6.2 + @11.6.3

      List installed packages
      @@ -164,7 +164,7 @@

      Description

      Positional arguments are name@version-range identifiers, which will limit the results to only the paths to the packages named. Note that nested packages will also show the paths to the specified packages. For example, running npm ls promzard in npm's source tree will show:

      -
      npm@11.6.2 /path/to/npm
      +
      npm@11.6.3 /path/to/npm
       └─┬ init-package-json@0.0.4
         └── promzard@0.1.5
       
      @@ -178,9 +178,9 @@

      all

    • Default: false
    • Type: Boolean
    -

    When running npm outdated and npm ls, setting --all will show -all outdated or installed packages, rather than only those directly -depended upon by the current project.

    +

    When running npm outdated and npm ls, setting --all will show all +outdated or installed packages, rather than only those directly depended +upon by the current project.

    json

    • Default: false
    • @@ -188,8 +188,8 @@

      json

    Whether or not to output JSON data, rather than the normal output.

      -
    • In npm pkg set it enables parsing set values with JSON.parse() -before saving them to your package.json.
    • +
    • In npm pkg set it enables parsing set values with JSON.parse() before +saving them to your package.json.

    Not supported by all npm commands.

    long

    @@ -203,20 +203,19 @@

    parseable

  • Default: false
  • Type: Boolean
  • -

    Output parseable results from commands that write to standard output. -For npm search, this will be tab-separated table format.

    +

    Output parseable results from commands that write to standard output. For +npm search, this will be tab-separated table format.

    global

    • Default: false
    • Type: Boolean
    -

    Operates in "global" mode, so that packages are installed into the -prefix folder instead of the current working directory. See -folders for more on the differences in -behavior.

    +

    Operates in "global" mode, so that packages are installed into the prefix +folder instead of the current working directory. See +folders for more on the differences in behavior.

      -
    • packages are installed into the {prefix}/lib/node_modules folder, -instead of the current working directory.
    • +
    • packages are installed into the {prefix}/lib/node_modules folder, instead +of the current working directory.
    • bin files are linked to {prefix}/bin
    • man pages are linked to {prefix}/share/man
    @@ -226,9 +225,8 @@

    depth

  • Type: null or Number
  • The depth to go when recursing packages for npm ls.

    -

    If not set, npm ls will show only the immediate dependencies of the -root project. If --all is set, then npm will show all dependencies -by default.

    +

    If not set, npm ls will show only the immediate dependencies of the root +project. If --all is set, then npm will show all dependencies by default.

    omit

    • Default: 'dev' if the NODE_ENV environment variable is set to @@ -239,59 +237,52 @@

      omit

      Note that these dependencies are still resolved and added to the package-lock.json or npm-shrinkwrap.json file. They are just not physically installed on disk.

      -

      If a package type appears in both the --include and --omit lists, -then it will be included.

      -

      If the resulting omit list includes 'dev', then the NODE_ENV -environment variable will be set to 'production' for all lifecycle -scripts.

      +

      If a package type appears in both the --include and --omit lists, then +it will be included.

      +

      If the resulting omit list includes 'dev', then the NODE_ENV environment +variable will be set to 'production' for all lifecycle scripts.

      include

      • Default:
      • -
      • Type: "prod", "dev", "optional", or "peer" (can be set multiple -times)
      • +
      • Type: "prod", "dev", "optional", or "peer" (can be set multiple times)
      -

      Option that allows for defining which types of dependencies to -install.

      +

      Option that allows for defining which types of dependencies to install.

      This is the inverse of --omit=<type>.

      -

      Dependency types specified in --include will not be omitted, -regardless of the order in which omit/include are specified on the -command-line.

      +

      Dependency types specified in --include will not be omitted, regardless of +the order in which omit/include are specified on the command-line.

      • Default: false
      • Type: Boolean
      -

      Used with npm ls, limiting output to only those packages that are -linked.

      +

      Used with npm ls, limiting output to only those packages that are linked.

      package-lock-only

      • Default: false
      • Type: Boolean
      -

      If set to true, the current operation will only use the -package-lock.json, ignoring node_modules.

      +

      If set to true, the current operation will only use the package-lock.json, +ignoring node_modules.

      For update this means only the package-lock.json will be updated, instead of checking node_modules and downloading dependencies.

      -

      For list this means the output will be based on the tree described -by the package-lock.json, rather than the contents of -node_modules.

      +

      For list this means the output will be based on the tree described by the +package-lock.json, rather than the contents of node_modules.

      unicode

        -
      • Default: false on windows, true on mac/unix systems with a unicode -locale, as defined by the LC_ALL, LC_CTYPE, or LANG environment -variables.
      • +
      • Default: false on windows, true on mac/unix systems with a unicode locale, +as defined by the LC_ALL, LC_CTYPE, or LANG environment variables.
      • Type: Boolean
      -

      When set to true, npm uses unicode characters in the tree output. -When false, it uses ascii characters instead of unicode glyphs.

      +

      When set to true, npm uses unicode characters in the tree output. When +false, it uses ascii characters instead of unicode glyphs.

      workspace

      • Default:
      • Type: String (can be set multiple times)
      -

      Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

      +

      Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

      Valid values for the workspace config are either:

      • Workspace names
      • @@ -299,9 +290,9 @@

        workspace

      • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
      -

      When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

      +

      When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

      This value is not exported to the environment for child processes.

      workspaces

        @@ -310,14 +301,13 @@

        workspaces

      Set to true to run the command in the context of all configured workspaces.

      -

      Explicitly setting this to false will cause commands like install -to ignore workspaces altogether. When not set explicitly:

      +

      Explicitly setting this to false will cause commands like install to +ignore workspaces altogether. When not set explicitly:

        -
      • Commands that operate on the node_modules tree (install, update, -etc.) will link workspaces into the node_modules folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, unless one or more workspaces are specified in the -workspace config.
      • +
      • Commands that operate on the node_modules tree (install, update, etc.) +will link workspaces into the node_modules folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +unless one or more workspaces are specified in the workspace config.

      This value is not exported to the environment for child processes.

      include-workspace-root

      @@ -326,19 +316,18 @@

      include-workspace-root

    • Type: Boolean

    Include the workspace root when workspaces are enabled for a command.

    -

    When false, specifying individual workspaces via the workspace -config, or all workspaces via the workspaces flag, will cause npm -to operate only on the specified workspaces, and not on the root -project.

    +

    When false, specifying individual workspaces via the workspace config, or +all workspaces via the workspaces flag, will cause npm to operate only on +the specified workspaces, and not on the root project.

    This value is not exported to the environment for child processes.

    • Default: false
    • Type: Boolean
    -

    When set file: protocol dependencies will be packed and installed as -regular dependencies instead of creating a symlink. This option has -no effect on workspaces.

    +

    When set file: protocol dependencies will be packed and installed as regular +dependencies instead of creating a symlink. This option has no effect on +workspaces.

    See Also

    • package spec
    • diff --git a/deps/npm/docs/output/commands/npm-org.html b/deps/npm/docs/output/commands/npm-org.html index 9082d54b259491..e57fc20d8f7d7d 100644 --- a/deps/npm/docs/output/commands/npm-org.html +++ b/deps/npm/docs/output/commands/npm-org.html @@ -141,9 +141,9 @@
      -

      +

      npm-org - @11.6.2 + @11.6.3

      Manage orgs
      @@ -195,10 +195,10 @@

      otp

    • Default: null
    • Type: null or String
    -

    This is a one-time password from a two-factor authenticator. It's -needed when publishing or changing package permissions with npm access.

    -

    If not set, and a registry response fails with a challenge for a -one-time password, npm will prompt on the command line for one.

    +

    This is a one-time password from a two-factor authenticator. It's needed +when publishing or changing package permissions with npm access.

    +

    If not set, and a registry response fails with a challenge for a one-time +password, npm will prompt on the command line for one.

    json

    • Default: false
    • @@ -206,8 +206,8 @@

      json

    Whether or not to output JSON data, rather than the normal output.

      -
    • In npm pkg set it enables parsing set values with JSON.parse() -before saving them to your package.json.
    • +
    • In npm pkg set it enables parsing set values with JSON.parse() before +saving them to your package.json.

    Not supported by all npm commands.

    parseable

    @@ -215,8 +215,8 @@

    parseable

  • Default: false
  • Type: Boolean
  • -

    Output parseable results from commands that write to standard output. -For npm search, this will be tab-separated table format.

    +

    Output parseable results from commands that write to standard output. For +npm search, this will be tab-separated table format.

    See Also

    • using orgs
    • diff --git a/deps/npm/docs/output/commands/npm-outdated.html b/deps/npm/docs/output/commands/npm-outdated.html index 441b0a65170d69..e29b0d5dfcda6e 100644 --- a/deps/npm/docs/output/commands/npm-outdated.html +++ b/deps/npm/docs/output/commands/npm-outdated.html @@ -141,9 +141,9 @@
      -

      +

      npm-outdated - @11.6.2 + @11.6.3

      Check for outdated packages
      @@ -210,9 +210,9 @@

      all

    • Default: false
    • Type: Boolean
    -

    When running npm outdated and npm ls, setting --all will show -all outdated or installed packages, rather than only those directly -depended upon by the current project.

    +

    When running npm outdated and npm ls, setting --all will show all +outdated or installed packages, rather than only those directly depended +upon by the current project.

    json

    • Default: false
    • @@ -220,8 +220,8 @@

      json

    Whether or not to output JSON data, rather than the normal output.

      -
    • In npm pkg set it enables parsing set values with JSON.parse() -before saving them to your package.json.
    • +
    • In npm pkg set it enables parsing set values with JSON.parse() before +saving them to your package.json.

    Not supported by all npm commands.

    long

    @@ -235,20 +235,19 @@

    parseable

  • Default: false
  • Type: Boolean
  • -

    Output parseable results from commands that write to standard output. -For npm search, this will be tab-separated table format.

    +

    Output parseable results from commands that write to standard output. For +npm search, this will be tab-separated table format.

    global

    • Default: false
    • Type: Boolean
    -

    Operates in "global" mode, so that packages are installed into the -prefix folder instead of the current working directory. See -folders for more on the differences in -behavior.

    +

    Operates in "global" mode, so that packages are installed into the prefix +folder instead of the current working directory. See +folders for more on the differences in behavior.

      -
    • packages are installed into the {prefix}/lib/node_modules folder, -instead of the current working directory.
    • +
    • packages are installed into the {prefix}/lib/node_modules folder, instead +of the current working directory.
    • bin files are linked to {prefix}/bin
    • man pages are linked to {prefix}/share/man
    @@ -257,9 +256,9 @@

    workspace

  • Default:
  • Type: String (can be set multiple times)
  • -

    Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

    +

    Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

    Valid values for the workspace config are either:

    • Workspace names
    • @@ -267,9 +266,9 @@

      workspace

    • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
    -

    When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

    +

    When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

    This value is not exported to the environment for child processes.

    before

      @@ -277,13 +276,13 @@

      before

    • Type: null or Date

    If passed to npm install, will rebuild the npm tree such that only -versions that were available on or before the given date are -installed. If there are no versions available for the current set of -dependencies, the command will error.

    -

    If the requested version is a dist-tag and the given tag does not -pass the --before filter, the most recent version less than or -equal to that tag will be used. For example, foo@latest might -install foo@1.2 even though latest is 2.0.

    +versions that were available on or before the given date are installed. +If there are no versions available for the current set of dependencies, the +command will error.

    +

    If the requested version is a dist-tag and the given tag does not pass the +--before filter, the most recent version less than or equal to that tag +will be used. For example, foo@latest might install foo@1.2 even though +latest is 2.0.

    See Also

    • package spec
    • diff --git a/deps/npm/docs/output/commands/npm-owner.html b/deps/npm/docs/output/commands/npm-owner.html index c846c1f6ca6339..ae8d37d42be3b1 100644 --- a/deps/npm/docs/output/commands/npm-owner.html +++ b/deps/npm/docs/output/commands/npm-owner.html @@ -141,9 +141,9 @@
      -

      +

      npm-owner - @11.6.2 + @11.6.3

      Manage package owners
      @@ -186,18 +186,18 @@

      otp

    • Default: null
    • Type: null or String
    -

    This is a one-time password from a two-factor authenticator. It's -needed when publishing or changing package permissions with npm access.

    -

    If not set, and a registry response fails with a challenge for a -one-time password, npm will prompt on the command line for one.

    +

    This is a one-time password from a two-factor authenticator. It's needed +when publishing or changing package permissions with npm access.

    +

    If not set, and a registry response fails with a challenge for a one-time +password, npm will prompt on the command line for one.

    workspace

    • Default:
    • Type: String (can be set multiple times)
    -

    Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

    +

    Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

    Valid values for the workspace config are either:

    • Workspace names
    • @@ -205,9 +205,9 @@

      workspace

    • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
    -

    When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

    +

    When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

    This value is not exported to the environment for child processes.

    workspaces

      @@ -216,14 +216,13 @@

      workspaces

    Set to true to run the command in the context of all configured workspaces.

    -

    Explicitly setting this to false will cause commands like install -to ignore workspaces altogether. When not set explicitly:

    +

    Explicitly setting this to false will cause commands like install to +ignore workspaces altogether. When not set explicitly:

      -
    • Commands that operate on the node_modules tree (install, update, -etc.) will link workspaces into the node_modules folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, unless one or more workspaces are specified in the -workspace config.
    • +
    • Commands that operate on the node_modules tree (install, update, etc.) +will link workspaces into the node_modules folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +unless one or more workspaces are specified in the workspace config.

    This value is not exported to the environment for child processes.

    See Also

    diff --git a/deps/npm/docs/output/commands/npm-pack.html b/deps/npm/docs/output/commands/npm-pack.html index c8172c92333766..402f9550fac9bc 100644 --- a/deps/npm/docs/output/commands/npm-pack.html +++ b/deps/npm/docs/output/commands/npm-pack.html @@ -141,9 +141,9 @@
    -

    +

    npm-pack - @11.6.2 + @11.6.3

    Create a tarball from a package
    @@ -162,13 +162,12 @@

    dry-run

  • Default: false
  • Type: Boolean
  • -

    Indicates that you don't want npm to make any changes and that it -should only report what it would have done. This can be passed into -any of the commands that modify your local installation, eg, -install, update, dedupe, uninstall, as well as pack and -publish.

    -

    Note: This is NOT honored by other network related commands, eg -dist-tags, owner, etc.

    +

    Indicates that you don't want npm to make any changes and that it should +only report what it would have done. This can be passed into any of the +commands that modify your local installation, eg, install, update, +dedupe, uninstall, as well as pack and publish.

    +

    Note: This is NOT honored by other network related commands, eg dist-tags, +owner, etc.

    json

    • Default: false
    • @@ -176,8 +175,8 @@

      json

    Whether or not to output JSON data, rather than the normal output.

      -
    • In npm pkg set it enables parsing set values with JSON.parse() -before saving them to your package.json.
    • +
    • In npm pkg set it enables parsing set values with JSON.parse() before +saving them to your package.json.

    Not supported by all npm commands.

    pack-destination

    @@ -191,9 +190,9 @@

    workspace

  • Default:
  • Type: String (can be set multiple times)
  • -

    Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

    +

    Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

    Valid values for the workspace config are either:

    • Workspace names
    • @@ -201,9 +200,9 @@

      workspace

    • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
    -

    When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

    +

    When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

    This value is not exported to the environment for child processes.

    workspaces

      @@ -212,14 +211,13 @@

      workspaces

    Set to true to run the command in the context of all configured workspaces.

    -

    Explicitly setting this to false will cause commands like install -to ignore workspaces altogether. When not set explicitly:

    +

    Explicitly setting this to false will cause commands like install to +ignore workspaces altogether. When not set explicitly:

      -
    • Commands that operate on the node_modules tree (install, update, -etc.) will link workspaces into the node_modules folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, unless one or more workspaces are specified in the -workspace config.
    • +
    • Commands that operate on the node_modules tree (install, update, etc.) +will link workspaces into the node_modules folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +unless one or more workspaces are specified in the workspace config.

    This value is not exported to the environment for child processes.

    include-workspace-root

    @@ -228,10 +226,9 @@

    include-workspace-root

  • Type: Boolean
  • Include the workspace root when workspaces are enabled for a command.

    -

    When false, specifying individual workspaces via the workspace -config, or all workspaces via the workspaces flag, will cause npm -to operate only on the specified workspaces, and not on the root -project.

    +

    When false, specifying individual workspaces via the workspace config, or +all workspaces via the workspaces flag, will cause npm to operate only on +the specified workspaces, and not on the root project.

    This value is not exported to the environment for child processes.

    ignore-scripts

      @@ -239,9 +236,10 @@

      ignore-scripts

    • Type: Boolean

    If true, npm does not run scripts specified in package.json files.

    -

    Note that commands explicitly intended to run a particular script, -such as npm start, npm stop, npm restart, npm test, and npm run will still run their intended script if ignore-scripts is set, -but they will not run any pre- or post-scripts.

    +

    Note that commands explicitly intended to run a particular script, such as +npm start, npm stop, npm restart, npm test, and npm run will still +run their intended script if ignore-scripts is set, but they will not +run any pre- or post-scripts.

    Description

    For anything that's installable (that is, a package folder, tarball, tarball url, git url, name@tag, name@version, name, or scoped name), this command will fetch it to the cache, copy the tarball to the current working directory as <name>-<version>.tgz, and then write the filenames out to stdout.

    If the same package is specified multiple times, then the file will be overwritten the second time.

    diff --git a/deps/npm/docs/output/commands/npm-ping.html b/deps/npm/docs/output/commands/npm-ping.html index 3c99ecd918e10b..594c954e2769cb 100644 --- a/deps/npm/docs/output/commands/npm-ping.html +++ b/deps/npm/docs/output/commands/npm-ping.html @@ -141,9 +141,9 @@
    -

    +

    npm-ping - @11.6.2 + @11.6.3

    Ping npm registry
    diff --git a/deps/npm/docs/output/commands/npm-pkg.html b/deps/npm/docs/output/commands/npm-pkg.html index 64c2c9b83796ca..3fe81a8d81d60f 100644 --- a/deps/npm/docs/output/commands/npm-pkg.html +++ b/deps/npm/docs/output/commands/npm-pkg.html @@ -141,9 +141,9 @@
    -

    +

    npm-pkg - @11.6.2 + @11.6.3

    Manages your package.json
    @@ -261,16 +261,14 @@

    force

  • Allow clobbering non-npm files in global installs.
  • Allow the npm version command to work on an unclean git repository.
  • Allow deleting the cache folder with npm cache clean.
  • -
  • Allow installing packages that have an engines declaration -requiring a different version of npm.
  • -
  • Allow installing packages that have an engines declaration -requiring a different version of node, even if --engine-strict is -enabled.
  • -
  • Allow npm audit fix to install modules outside your stated -dependency range (including SemVer-major changes).
  • +
  • Allow installing packages that have an engines declaration requiring a +different version of npm.
  • +
  • Allow installing packages that have an engines declaration requiring a +different version of node, even if --engine-strict is enabled.
  • +
  • Allow npm audit fix to install modules outside your stated dependency +range (including SemVer-major changes).
  • Allow unpublishing all versions of a published package.
  • -
  • Allow conflicting peerDependencies to be installed in the root -project.
  • +
  • Allow conflicting peerDependencies to be installed in the root project.
  • Implicitly set --yes during npm init.
  • Allow clobbering existing values in npm pkg
  • Allow unpublishing of entire packages (not just a single version).
  • @@ -284,8 +282,8 @@

    json

    Whether or not to output JSON data, rather than the normal output.

      -
    • In npm pkg set it enables parsing set values with JSON.parse() -before saving them to your package.json.
    • +
    • In npm pkg set it enables parsing set values with JSON.parse() before +saving them to your package.json.

    Not supported by all npm commands.

    workspace

    @@ -293,9 +291,9 @@

    workspace

  • Default:
  • Type: String (can be set multiple times)
  • -

    Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

    +

    Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

    Valid values for the workspace config are either:

    • Workspace names
    • @@ -303,9 +301,9 @@

      workspace

    • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
    -

    When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

    +

    When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

    This value is not exported to the environment for child processes.

    workspaces

      @@ -314,14 +312,13 @@

      workspaces

    Set to true to run the command in the context of all configured workspaces.

    -

    Explicitly setting this to false will cause commands like install -to ignore workspaces altogether. When not set explicitly:

    +

    Explicitly setting this to false will cause commands like install to +ignore workspaces altogether. When not set explicitly:

      -
    • Commands that operate on the node_modules tree (install, update, -etc.) will link workspaces into the node_modules folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, unless one or more workspaces are specified in the -workspace config.
    • +
    • Commands that operate on the node_modules tree (install, update, etc.) +will link workspaces into the node_modules folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +unless one or more workspaces are specified in the workspace config.

    This value is not exported to the environment for child processes.

    See Also

    diff --git a/deps/npm/docs/output/commands/npm-prefix.html b/deps/npm/docs/output/commands/npm-prefix.html index df4c70981f3bc0..53a8c6846a6e70 100644 --- a/deps/npm/docs/output/commands/npm-prefix.html +++ b/deps/npm/docs/output/commands/npm-prefix.html @@ -141,9 +141,9 @@
    -

    +

    npm-prefix - @11.6.2 + @11.6.3

    Display prefix
    @@ -175,13 +175,12 @@

    global

  • Default: false
  • Type: Boolean
  • -

    Operates in "global" mode, so that packages are installed into the -prefix folder instead of the current working directory. See -folders for more on the differences in -behavior.

    +

    Operates in "global" mode, so that packages are installed into the prefix +folder instead of the current working directory. See +folders for more on the differences in behavior.

      -
    • packages are installed into the {prefix}/lib/node_modules folder, -instead of the current working directory.
    • +
    • packages are installed into the {prefix}/lib/node_modules folder, instead +of the current working directory.
    • bin files are linked to {prefix}/bin
    • man pages are linked to {prefix}/share/man
    diff --git a/deps/npm/docs/output/commands/npm-profile.html b/deps/npm/docs/output/commands/npm-profile.html index e6632924f28ecb..6d49dde54698ac 100644 --- a/deps/npm/docs/output/commands/npm-profile.html +++ b/deps/npm/docs/output/commands/npm-profile.html @@ -141,9 +141,9 @@
    -

    +

    npm-profile - @11.6.2 + @11.6.3

    Change settings on your registry profile
    @@ -218,8 +218,8 @@

    json

    Whether or not to output JSON data, rather than the normal output.

      -
    • In npm pkg set it enables parsing set values with JSON.parse() -before saving them to your package.json.
    • +
    • In npm pkg set it enables parsing set values with JSON.parse() before +saving them to your package.json.

    Not supported by all npm commands.

    parseable

    @@ -227,17 +227,17 @@

    parseable

  • Default: false
  • Type: Boolean
  • -

    Output parseable results from commands that write to standard output. -For npm search, this will be tab-separated table format.

    +

    Output parseable results from commands that write to standard output. For +npm search, this will be tab-separated table format.

    otp

    • Default: null
    • Type: null or String
    -

    This is a one-time password from a two-factor authenticator. It's -needed when publishing or changing package permissions with npm access.

    -

    If not set, and a registry response fails with a challenge for a -one-time password, npm will prompt on the command line for one.

    +

    This is a one-time password from a two-factor authenticator. It's needed +when publishing or changing package permissions with npm access.

    +

    If not set, and a registry response fails with a challenge for a one-time +password, npm will prompt on the command line for one.

    See Also

    • npm adduser
    • diff --git a/deps/npm/docs/output/commands/npm-prune.html b/deps/npm/docs/output/commands/npm-prune.html index 921556183dc5b0..bedc9c1badf58f 100644 --- a/deps/npm/docs/output/commands/npm-prune.html +++ b/deps/npm/docs/output/commands/npm-prune.html @@ -141,9 +141,9 @@
      -

      +

      npm-prune - @11.6.2 + @11.6.3

      Remove extraneous packages
      @@ -176,35 +176,30 @@

      omit

      Note that these dependencies are still resolved and added to the package-lock.json or npm-shrinkwrap.json file. They are just not physically installed on disk.

      -

      If a package type appears in both the --include and --omit lists, -then it will be included.

      -

      If the resulting omit list includes 'dev', then the NODE_ENV -environment variable will be set to 'production' for all lifecycle -scripts.

      +

      If a package type appears in both the --include and --omit lists, then +it will be included.

      +

      If the resulting omit list includes 'dev', then the NODE_ENV environment +variable will be set to 'production' for all lifecycle scripts.

      include

      • Default:
      • -
      • Type: "prod", "dev", "optional", or "peer" (can be set multiple -times)
      • +
      • Type: "prod", "dev", "optional", or "peer" (can be set multiple times)
      -

      Option that allows for defining which types of dependencies to -install.

      +

      Option that allows for defining which types of dependencies to install.

      This is the inverse of --omit=<type>.

      -

      Dependency types specified in --include will not be omitted, -regardless of the order in which omit/include are specified on the -command-line.

      +

      Dependency types specified in --include will not be omitted, regardless of +the order in which omit/include are specified on the command-line.

      dry-run

      • Default: false
      • Type: Boolean
      -

      Indicates that you don't want npm to make any changes and that it -should only report what it would have done. This can be passed into -any of the commands that modify your local installation, eg, -install, update, dedupe, uninstall, as well as pack and -publish.

      -

      Note: This is NOT honored by other network related commands, eg -dist-tags, owner, etc.

      +

      Indicates that you don't want npm to make any changes and that it should +only report what it would have done. This can be passed into any of the +commands that modify your local installation, eg, install, update, +dedupe, uninstall, as well as pack and publish.

      +

      Note: This is NOT honored by other network related commands, eg dist-tags, +owner, etc.

      json

      • Default: false
      • @@ -212,39 +207,39 @@

        json

      Whether or not to output JSON data, rather than the normal output.

        -
      • In npm pkg set it enables parsing set values with JSON.parse() -before saving them to your package.json.
      • +
      • In npm pkg set it enables parsing set values with JSON.parse() before +saving them to your package.json.

      Not supported by all npm commands.

      foreground-scripts

        -
      • Default: false unless when using npm pack or npm publish where -it defaults to true
      • +
      • Default: false unless when using npm pack or npm publish where it +defaults to true
      • Type: Boolean
      -

      Run all build scripts (ie, preinstall, install, and -postinstall) scripts for installed packages in the foreground -process, sharing standard input, output, and error with the main npm -process.

      -

      Note that this will generally make installs run slower, and be much -noisier, but can be useful for debugging.

      +

      Run all build scripts (ie, preinstall, install, and postinstall) +scripts for installed packages in the foreground process, sharing standard +input, output, and error with the main npm process.

      +

      Note that this will generally make installs run slower, and be much noisier, +but can be useful for debugging.

      ignore-scripts

      • Default: false
      • Type: Boolean

      If true, npm does not run scripts specified in package.json files.

      -

      Note that commands explicitly intended to run a particular script, -such as npm start, npm stop, npm restart, npm test, and npm run will still run their intended script if ignore-scripts is set, -but they will not run any pre- or post-scripts.

      +

      Note that commands explicitly intended to run a particular script, such as +npm start, npm stop, npm restart, npm test, and npm run will still +run their intended script if ignore-scripts is set, but they will not +run any pre- or post-scripts.

      workspace

      • Default:
      • Type: String (can be set multiple times)
      -

      Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

      +

      Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

      Valid values for the workspace config are either:

      • Workspace names
      • @@ -252,9 +247,9 @@

        workspace

      • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
      -

      When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

      +

      When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

      This value is not exported to the environment for child processes.

      workspaces

        @@ -263,14 +258,13 @@

        workspaces

      Set to true to run the command in the context of all configured workspaces.

      -

      Explicitly setting this to false will cause commands like install -to ignore workspaces altogether. When not set explicitly:

      +

      Explicitly setting this to false will cause commands like install to +ignore workspaces altogether. When not set explicitly:

        -
      • Commands that operate on the node_modules tree (install, update, -etc.) will link workspaces into the node_modules folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, unless one or more workspaces are specified in the -workspace config.
      • +
      • Commands that operate on the node_modules tree (install, update, etc.) +will link workspaces into the node_modules folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +unless one or more workspaces are specified in the workspace config.

      This value is not exported to the environment for child processes.

      include-workspace-root

      @@ -279,19 +273,18 @@

      include-workspace-root

    • Type: Boolean

    Include the workspace root when workspaces are enabled for a command.

    -

    When false, specifying individual workspaces via the workspace -config, or all workspaces via the workspaces flag, will cause npm -to operate only on the specified workspaces, and not on the root -project.

    +

    When false, specifying individual workspaces via the workspace config, or +all workspaces via the workspaces flag, will cause npm to operate only on +the specified workspaces, and not on the root project.

    This value is not exported to the environment for child processes.

    • Default: false
    • Type: Boolean
    -

    When set file: protocol dependencies will be packed and installed as -regular dependencies instead of creating a symlink. This option has -no effect on workspaces.

    +

    When set file: protocol dependencies will be packed and installed as regular +dependencies instead of creating a symlink. This option has no effect on +workspaces.

    See Also

    Description

    Publishes a package to the registry so that it can be installed by name.

    +

    Examples

    +

    Publish the package in the current directory:

    +
    npm publish
    +
    +

    Publish a specific workspace:

    +
    npm publish --workspace=<workspace-name>
    +
    +

    Publish multiple workspaces:

    +
    npm publish --workspace=workspace-a --workspace=workspace-b
    +
    +

    Publish all workspaces:

    +
    npm publish --workspaces
    +

    By default npm will publish to the public registry. This can be overridden by specifying a different default registry or using a scope in the name, combined with a scope-configured registry (see package.json).

    A package is interpreted the same way as other commands (like npm install) and can be:

    @@ -209,55 +222,53 @@

    tag

  • Default: "latest"
  • Type: String
  • -

    If you ask npm to install a package and don't tell it a specific -version, then it will install the specified tag.

    +

    If you ask npm to install a package and don't tell it a specific version, +then it will install the specified tag.

    It is the tag added to the package@version specified in the npm dist-tag add command, if no explicit tag is given.

    -

    When used by the npm diff command, this is the tag used to fetch -the tarball that will be compared with the local files by default.

    -

    If used in the npm publish command, this is the tag that will be -added to the package submitted to the registry.

    +

    When used by the npm diff command, this is the tag used to fetch the +tarball that will be compared with the local files by default.

    +

    If used in the npm publish command, this is the tag that will be added to +the package submitted to the registry.

    access

      -
    • Default: 'public' for new packages, existing packages it will not -change the current level
    • +
    • Default: 'public' for new packages, existing packages it will not change the +current level
    • Type: null, "restricted", or "public"

    If you do not want your scoped package to be publicly viewable (and installable) set --access=restricted.

    Unscoped packages cannot be set to restricted.

    -

    Note: This defaults to not changing the current access level for -existing packages. Specifying a value of restricted or public -during publish will change the access for an existing package the -same way that npm access set status would.

    +

    Note: This defaults to not changing the current access level for existing +packages. Specifying a value of restricted or public during publish will +change the access for an existing package the same way that npm access set status would.

    dry-run

    • Default: false
    • Type: Boolean
    -

    Indicates that you don't want npm to make any changes and that it -should only report what it would have done. This can be passed into -any of the commands that modify your local installation, eg, -install, update, dedupe, uninstall, as well as pack and -publish.

    -

    Note: This is NOT honored by other network related commands, eg -dist-tags, owner, etc.

    +

    Indicates that you don't want npm to make any changes and that it should +only report what it would have done. This can be passed into any of the +commands that modify your local installation, eg, install, update, +dedupe, uninstall, as well as pack and publish.

    +

    Note: This is NOT honored by other network related commands, eg dist-tags, +owner, etc.

    otp

    • Default: null
    • Type: null or String
    -

    This is a one-time password from a two-factor authenticator. It's -needed when publishing or changing package permissions with npm access.

    -

    If not set, and a registry response fails with a challenge for a -one-time password, npm will prompt on the command line for one.

    +

    This is a one-time password from a two-factor authenticator. It's needed +when publishing or changing package permissions with npm access.

    +

    If not set, and a registry response fails with a challenge for a one-time +password, npm will prompt on the command line for one.

    workspace

    • Default:
    • Type: String (can be set multiple times)
    -

    Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

    +

    Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

    Valid values for the workspace config are either:

    • Workspace names
    • @@ -265,9 +276,9 @@

      workspace

    • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
    -

    When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

    +

    When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

    This value is not exported to the environment for child processes.

    workspaces

      @@ -276,14 +287,13 @@

      workspaces

    Set to true to run the command in the context of all configured workspaces.

    -

    Explicitly setting this to false will cause commands like install -to ignore workspaces altogether. When not set explicitly:

    +

    Explicitly setting this to false will cause commands like install to +ignore workspaces altogether. When not set explicitly:

      -
    • Commands that operate on the node_modules tree (install, update, -etc.) will link workspaces into the node_modules folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, unless one or more workspaces are specified in the -workspace config.
    • +
    • Commands that operate on the node_modules tree (install, update, etc.) +will link workspaces into the node_modules folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +unless one or more workspaces are specified in the workspace config.

    This value is not exported to the environment for child processes.

    include-workspace-root

    @@ -292,26 +302,24 @@

    include-workspace-root

  • Type: Boolean
  • Include the workspace root when workspaces are enabled for a command.

    -

    When false, specifying individual workspaces via the workspace -config, or all workspaces via the workspaces flag, will cause npm -to operate only on the specified workspaces, and not on the root -project.

    +

    When false, specifying individual workspaces via the workspace config, or +all workspaces via the workspaces flag, will cause npm to operate only on +the specified workspaces, and not on the root project.

    This value is not exported to the environment for child processes.

    provenance

    • Default: false
    • Type: Boolean
    -

    When publishing from a supported cloud CI/CD system, the package will -be publicly linked to where it was built and published from.

    +

    When publishing from a supported cloud CI/CD system, the package will be +publicly linked to where it was built and published from.

    This config cannot be used with: provenance-file

    provenance-file

    • Default: null
    • Type: Path
    -

    When publishing, the provenance bundle at the given path will be -used.

    +

    When publishing, the provenance bundle at the given path will be used.

    This config cannot be used with: provenance

    See Also

      diff --git a/deps/npm/docs/output/commands/npm-query.html b/deps/npm/docs/output/commands/npm-query.html index 0e4aab89d146dc..5a8113a49b0f7c 100644 --- a/deps/npm/docs/output/commands/npm-query.html +++ b/deps/npm/docs/output/commands/npm-query.html @@ -141,9 +141,9 @@
      -

      +

      npm-query - @11.6.2 + @11.6.3

      Dependency selector query
      @@ -289,13 +289,12 @@

      global

    • Default: false
    • Type: Boolean
    -

    Operates in "global" mode, so that packages are installed into the -prefix folder instead of the current working directory. See -folders for more on the differences in -behavior.

    +

    Operates in "global" mode, so that packages are installed into the prefix +folder instead of the current working directory. See +folders for more on the differences in behavior.

      -
    • packages are installed into the {prefix}/lib/node_modules folder, -instead of the current working directory.
    • +
    • packages are installed into the {prefix}/lib/node_modules folder, instead +of the current working directory.
    • bin files are linked to {prefix}/bin
    • man pages are linked to {prefix}/share/man
    @@ -304,9 +303,9 @@

    workspace

  • Default:
  • Type: String (can be set multiple times)
  • -

    Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

    +

    Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

    Valid values for the workspace config are either:

    • Workspace names
    • @@ -314,9 +313,9 @@

      workspace

    • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
    -

    When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

    +

    When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

    This value is not exported to the environment for child processes.

    workspaces

      @@ -325,14 +324,13 @@

      workspaces

    Set to true to run the command in the context of all configured workspaces.

    -

    Explicitly setting this to false will cause commands like install -to ignore workspaces altogether. When not set explicitly:

    +

    Explicitly setting this to false will cause commands like install to +ignore workspaces altogether. When not set explicitly:

      -
    • Commands that operate on the node_modules tree (install, update, -etc.) will link workspaces into the node_modules folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, unless one or more workspaces are specified in the -workspace config.
    • +
    • Commands that operate on the node_modules tree (install, update, etc.) +will link workspaces into the node_modules folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +unless one or more workspaces are specified in the workspace config.

    This value is not exported to the environment for child processes.

    include-workspace-root

    @@ -341,30 +339,28 @@

    include-workspace-root

  • Type: Boolean
  • Include the workspace root when workspaces are enabled for a command.

    -

    When false, specifying individual workspaces via the workspace -config, or all workspaces via the workspaces flag, will cause npm -to operate only on the specified workspaces, and not on the root -project.

    +

    When false, specifying individual workspaces via the workspace config, or +all workspaces via the workspaces flag, will cause npm to operate only on +the specified workspaces, and not on the root project.

    This value is not exported to the environment for child processes.

    package-lock-only

    • Default: false
    • Type: Boolean
    -

    If set to true, the current operation will only use the -package-lock.json, ignoring node_modules.

    +

    If set to true, the current operation will only use the package-lock.json, +ignoring node_modules.

    For update this means only the package-lock.json will be updated, instead of checking node_modules and downloading dependencies.

    -

    For list this means the output will be based on the tree described -by the package-lock.json, rather than the contents of -node_modules.

    +

    For list this means the output will be based on the tree described by the +package-lock.json, rather than the contents of node_modules.

    expect-results

    • Default: null
    • Type: null or Boolean
    -

    Tells npm whether or not to expect results from the command. Can be -either true (expect some results) or false (expect no results).

    +

    Tells npm whether or not to expect results from the command. Can be either +true (expect some results) or false (expect no results).

    This config cannot be used with: expect-result-count

    expect-result-count

      diff --git a/deps/npm/docs/output/commands/npm-rebuild.html b/deps/npm/docs/output/commands/npm-rebuild.html index 9eac53b7fe6079..e96d953caf1940 100644 --- a/deps/npm/docs/output/commands/npm-rebuild.html +++ b/deps/npm/docs/output/commands/npm-rebuild.html @@ -141,9 +141,9 @@
      -

      +

      npm-rebuild - @11.6.2 + @11.6.3

      Rebuild a package
      @@ -184,13 +184,12 @@

      global

    • Default: false
    • Type: Boolean
    -

    Operates in "global" mode, so that packages are installed into the -prefix folder instead of the current working directory. See -folders for more on the differences in -behavior.

    +

    Operates in "global" mode, so that packages are installed into the prefix +folder instead of the current working directory. See +folders for more on the differences in behavior.

      -
    • packages are installed into the {prefix}/lib/node_modules folder, -instead of the current working directory.
    • +
    • packages are installed into the {prefix}/lib/node_modules folder, instead +of the current working directory.
    • bin files are linked to {prefix}/bin
    • man pages are linked to {prefix}/share/man
    @@ -201,38 +200,38 @@

    Tells npm to create symlinks (or .cmd shims on Windows) for package executables.

    -

    Set to false to have it not do this. This can be used to work around -the fact that some file systems don't support symlinks, even on -ostensibly Unix systems.

    +

    Set to false to have it not do this. This can be used to work around the +fact that some file systems don't support symlinks, even on ostensibly Unix +systems.

    foreground-scripts

      -
    • Default: false unless when using npm pack or npm publish where -it defaults to true
    • +
    • Default: false unless when using npm pack or npm publish where it +defaults to true
    • Type: Boolean
    -

    Run all build scripts (ie, preinstall, install, and -postinstall) scripts for installed packages in the foreground -process, sharing standard input, output, and error with the main npm -process.

    -

    Note that this will generally make installs run slower, and be much -noisier, but can be useful for debugging.

    +

    Run all build scripts (ie, preinstall, install, and postinstall) +scripts for installed packages in the foreground process, sharing standard +input, output, and error with the main npm process.

    +

    Note that this will generally make installs run slower, and be much noisier, +but can be useful for debugging.

    ignore-scripts

    • Default: false
    • Type: Boolean

    If true, npm does not run scripts specified in package.json files.

    -

    Note that commands explicitly intended to run a particular script, -such as npm start, npm stop, npm restart, npm test, and npm run will still run their intended script if ignore-scripts is set, -but they will not run any pre- or post-scripts.

    +

    Note that commands explicitly intended to run a particular script, such as +npm start, npm stop, npm restart, npm test, and npm run will still +run their intended script if ignore-scripts is set, but they will not +run any pre- or post-scripts.

    workspace

    • Default:
    • Type: String (can be set multiple times)
    -

    Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

    +

    Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

    Valid values for the workspace config are either:

    • Workspace names
    • @@ -240,9 +239,9 @@

      workspace

    • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
    -

    When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

    +

    When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

    This value is not exported to the environment for child processes.

    workspaces

      @@ -251,14 +250,13 @@

      workspaces

    Set to true to run the command in the context of all configured workspaces.

    -

    Explicitly setting this to false will cause commands like install -to ignore workspaces altogether. When not set explicitly:

    +

    Explicitly setting this to false will cause commands like install to +ignore workspaces altogether. When not set explicitly:

      -
    • Commands that operate on the node_modules tree (install, update, -etc.) will link workspaces into the node_modules folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, unless one or more workspaces are specified in the -workspace config.
    • +
    • Commands that operate on the node_modules tree (install, update, etc.) +will link workspaces into the node_modules folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +unless one or more workspaces are specified in the workspace config.

    This value is not exported to the environment for child processes.

    include-workspace-root

    @@ -267,19 +265,18 @@

    include-workspace-root

  • Type: Boolean
  • Include the workspace root when workspaces are enabled for a command.

    -

    When false, specifying individual workspaces via the workspace -config, or all workspaces via the workspaces flag, will cause npm -to operate only on the specified workspaces, and not on the root -project.

    +

    When false, specifying individual workspaces via the workspace config, or +all workspaces via the workspaces flag, will cause npm to operate only on +the specified workspaces, and not on the root project.

    This value is not exported to the environment for child processes.

    • Default: false
    • Type: Boolean
    -

    When set file: protocol dependencies will be packed and installed as -regular dependencies instead of creating a symlink. This option has -no effect on workspaces.

    +

    When set file: protocol dependencies will be packed and installed as regular +dependencies instead of creating a symlink. This option has no effect on +workspaces.

    See Also

    • package spec
    • diff --git a/deps/npm/docs/output/commands/npm-repo.html b/deps/npm/docs/output/commands/npm-repo.html index 2fa1fcc138f40b..d4eb1388728ed1 100644 --- a/deps/npm/docs/output/commands/npm-repo.html +++ b/deps/npm/docs/output/commands/npm-repo.html @@ -141,9 +141,9 @@
      -

      +

      npm-repo - @11.6.2 + @11.6.3

      Open package repository page in the browser
      @@ -180,9 +180,9 @@

      workspace

    • Default:
    • Type: String (can be set multiple times)
    -

    Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

    +

    Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

    Valid values for the workspace config are either:

    • Workspace names
    • @@ -190,9 +190,9 @@

      workspace

    • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
    -

    When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

    +

    When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

    This value is not exported to the environment for child processes.

    workspaces

      @@ -201,14 +201,13 @@

      workspaces

    Set to true to run the command in the context of all configured workspaces.

    -

    Explicitly setting this to false will cause commands like install -to ignore workspaces altogether. When not set explicitly:

    +

    Explicitly setting this to false will cause commands like install to +ignore workspaces altogether. When not set explicitly:

      -
    • Commands that operate on the node_modules tree (install, update, -etc.) will link workspaces into the node_modules folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, unless one or more workspaces are specified in the -workspace config.
    • +
    • Commands that operate on the node_modules tree (install, update, etc.) +will link workspaces into the node_modules folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +unless one or more workspaces are specified in the workspace config.

    This value is not exported to the environment for child processes.

    include-workspace-root

    @@ -217,10 +216,9 @@

    include-workspace-root

  • Type: Boolean
  • Include the workspace root when workspaces are enabled for a command.

    -

    When false, specifying individual workspaces via the workspace -config, or all workspaces via the workspaces flag, will cause npm -to operate only on the specified workspaces, and not on the root -project.

    +

    When false, specifying individual workspaces via the workspace config, or +all workspaces via the workspaces flag, will cause npm to operate only on +the specified workspaces, and not on the root project.

    This value is not exported to the environment for child processes.

    See Also

      diff --git a/deps/npm/docs/output/commands/npm-restart.html b/deps/npm/docs/output/commands/npm-restart.html index 14fdcfe42503bf..9b3771a4a57d56 100644 --- a/deps/npm/docs/output/commands/npm-restart.html +++ b/deps/npm/docs/output/commands/npm-restart.html @@ -141,9 +141,9 @@
      -

      +

      npm-restart - @11.6.2 + @11.6.3

      Restart a package
      @@ -183,16 +183,16 @@

      ignore-scripts

    • Type: Boolean

    If true, npm does not run scripts specified in package.json files.

    -

    Note that commands explicitly intended to run a particular script, -such as npm start, npm stop, npm restart, npm test, and npm run will still run their intended script if ignore-scripts is set, -but they will not run any pre- or post-scripts.

    +

    Note that commands explicitly intended to run a particular script, such as +npm start, npm stop, npm restart, npm test, and npm run will still +run their intended script if ignore-scripts is set, but they will not +run any pre- or post-scripts.

    script-shell

    • Default: '/bin/sh' on POSIX systems, 'cmd.exe' on Windows
    • Type: null or String
    -

    The shell to use for scripts run with the npm exec, npm run and -npm init <package-spec> commands.

    +

    The shell to use for scripts run with the npm exec, npm run and npm init <package-spec> commands.

    See Also

    • npm run
    • diff --git a/deps/npm/docs/output/commands/npm-root.html b/deps/npm/docs/output/commands/npm-root.html index 0498af80a8b4f2..f09fb6805f2420 100644 --- a/deps/npm/docs/output/commands/npm-root.html +++ b/deps/npm/docs/output/commands/npm-root.html @@ -141,9 +141,9 @@
      -

      +

      npm-root - @11.6.2 + @11.6.3

      Display npm root
      @@ -171,13 +171,12 @@

      global

    • Default: false
    • Type: Boolean
    -

    Operates in "global" mode, so that packages are installed into the -prefix folder instead of the current working directory. See -folders for more on the differences in -behavior.

    +

    Operates in "global" mode, so that packages are installed into the prefix +folder instead of the current working directory. See +folders for more on the differences in behavior.

      -
    • packages are installed into the {prefix}/lib/node_modules folder, -instead of the current working directory.
    • +
    • packages are installed into the {prefix}/lib/node_modules folder, instead +of the current working directory.
    • bin files are linked to {prefix}/bin
    • man pages are linked to {prefix}/share/man
    diff --git a/deps/npm/docs/output/commands/npm-run.html b/deps/npm/docs/output/commands/npm-run.html index b481925c92e9c3..b5043c6baf5cdc 100644 --- a/deps/npm/docs/output/commands/npm-run.html +++ b/deps/npm/docs/output/commands/npm-run.html @@ -141,9 +141,9 @@
    -

    +

    npm-run - @11.6.2 + @11.6.3

    Run arbitrary package scripts
    @@ -226,9 +226,9 @@

    workspace

  • Default:
  • Type: String (can be set multiple times)
  • -

    Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

    +

    Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

    Valid values for the workspace config are either:

    • Workspace names
    • @@ -236,9 +236,9 @@

      workspace

    • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
    -

    When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

    +

    When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

    This value is not exported to the environment for child processes.

    workspaces

      @@ -247,14 +247,13 @@

      workspaces

    Set to true to run the command in the context of all configured workspaces.

    -

    Explicitly setting this to false will cause commands like install -to ignore workspaces altogether. When not set explicitly:

    +

    Explicitly setting this to false will cause commands like install to +ignore workspaces altogether. When not set explicitly:

      -
    • Commands that operate on the node_modules tree (install, update, -etc.) will link workspaces into the node_modules folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, unless one or more workspaces are specified in the -workspace config.
    • +
    • Commands that operate on the node_modules tree (install, update, etc.) +will link workspaces into the node_modules folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +unless one or more workspaces are specified in the workspace config.

    This value is not exported to the environment for child processes.

    include-workspace-root

    @@ -263,22 +262,21 @@

    include-workspace-root

  • Type: Boolean
  • Include the workspace root when workspaces are enabled for a command.

    -

    When false, specifying individual workspaces via the workspace -config, or all workspaces via the workspaces flag, will cause npm -to operate only on the specified workspaces, and not on the root -project.

    +

    When false, specifying individual workspaces via the workspace config, or +all workspaces via the workspaces flag, will cause npm to operate only on +the specified workspaces, and not on the root project.

    This value is not exported to the environment for child processes.

    if-present

    • Default: false
    • Type: Boolean
    -

    If true, npm will not exit with an error code when run is invoked -for a script that isn't defined in the scripts section of -package.json. This option can be used when it's desirable to -optionally run a script when it's present and fail if the script -fails. This is useful, for example, when running scripts that may -only apply for some builds in an otherwise generic CI setup.

    +

    If true, npm will not exit with an error code when run is invoked for a +script that isn't defined in the scripts section of package.json. This +option can be used when it's desirable to optionally run a script when it's +present and fail if the script fails. This is useful, for example, when +running scripts that may only apply for some builds in an otherwise generic +CI setup.

    This value is not exported to the environment for child processes.

    ignore-scripts

      @@ -286,28 +284,27 @@

      ignore-scripts

    • Type: Boolean

    If true, npm does not run scripts specified in package.json files.

    -

    Note that commands explicitly intended to run a particular script, -such as npm start, npm stop, npm restart, npm test, and npm run will still run their intended script if ignore-scripts is set, -but they will not run any pre- or post-scripts.

    +

    Note that commands explicitly intended to run a particular script, such as +npm start, npm stop, npm restart, npm test, and npm run will still +run their intended script if ignore-scripts is set, but they will not +run any pre- or post-scripts.

    foreground-scripts

      -
    • Default: false unless when using npm pack or npm publish where -it defaults to true
    • +
    • Default: false unless when using npm pack or npm publish where it +defaults to true
    • Type: Boolean
    -

    Run all build scripts (ie, preinstall, install, and -postinstall) scripts for installed packages in the foreground -process, sharing standard input, output, and error with the main npm -process.

    -

    Note that this will generally make installs run slower, and be much -noisier, but can be useful for debugging.

    +

    Run all build scripts (ie, preinstall, install, and postinstall) +scripts for installed packages in the foreground process, sharing standard +input, output, and error with the main npm process.

    +

    Note that this will generally make installs run slower, and be much noisier, +but can be useful for debugging.

    script-shell

    • Default: '/bin/sh' on POSIX systems, 'cmd.exe' on Windows
    • Type: null or String
    -

    The shell to use for scripts run with the npm exec, npm run and -npm init <package-spec> commands.

    +

    The shell to use for scripts run with the npm exec, npm run and npm init <package-spec> commands.

    See Also

    • npm scripts
    • diff --git a/deps/npm/docs/output/commands/npm-sbom.html b/deps/npm/docs/output/commands/npm-sbom.html index 1aa1d701f3570f..97be8fe8c0e64d 100644 --- a/deps/npm/docs/output/commands/npm-sbom.html +++ b/deps/npm/docs/output/commands/npm-sbom.html @@ -141,9 +141,9 @@
      -

      +

      npm-sbom - @11.6.2 + @11.6.3

      Generate a Software Bill of Materials (SBOM)
      @@ -358,23 +358,21 @@

      omit

      Note that these dependencies are still resolved and added to the package-lock.json or npm-shrinkwrap.json file. They are just not physically installed on disk.

      -

      If a package type appears in both the --include and --omit lists, -then it will be included.

      -

      If the resulting omit list includes 'dev', then the NODE_ENV -environment variable will be set to 'production' for all lifecycle -scripts.

      +

      If a package type appears in both the --include and --omit lists, then +it will be included.

      +

      If the resulting omit list includes 'dev', then the NODE_ENV environment +variable will be set to 'production' for all lifecycle scripts.

      package-lock-only

      • Default: false
      • Type: Boolean
      -

      If set to true, the current operation will only use the -package-lock.json, ignoring node_modules.

      +

      If set to true, the current operation will only use the package-lock.json, +ignoring node_modules.

      For update this means only the package-lock.json will be updated, instead of checking node_modules and downloading dependencies.

      -

      For list this means the output will be based on the tree described -by the package-lock.json, rather than the contents of -node_modules.

      +

      For list this means the output will be based on the tree described by the +package-lock.json, rather than the contents of node_modules.

      sbom-format

      • Default: null
      • @@ -386,17 +384,17 @@

        sbom-type

      • Default: "library"
      • Type: "library", "application", or "framework"
      -

      The type of package described by the generated SBOM. For SPDX, this -is the value for the primaryPackagePurpose field. For CycloneDX, -this is the value for the type field.

      +

      The type of package described by the generated SBOM. For SPDX, this is the +value for the primaryPackagePurpose field. For CycloneDX, this is the +value for the type field.

      workspace

      • Default:
      • Type: String (can be set multiple times)
      -

      Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

      +

      Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

      Valid values for the workspace config are either:

      • Workspace names
      • @@ -404,9 +402,9 @@

        workspace

      • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
      -

      When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

      +

      When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

      This value is not exported to the environment for child processes.

      workspaces

        @@ -415,14 +413,13 @@

        workspaces

      Set to true to run the command in the context of all configured workspaces.

      -

      Explicitly setting this to false will cause commands like install -to ignore workspaces altogether. When not set explicitly:

      +

      Explicitly setting this to false will cause commands like install to +ignore workspaces altogether. When not set explicitly:

        -
      • Commands that operate on the node_modules tree (install, update, -etc.) will link workspaces into the node_modules folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, unless one or more workspaces are specified in the -workspace config.
      • +
      • Commands that operate on the node_modules tree (install, update, etc.) +will link workspaces into the node_modules folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +unless one or more workspaces are specified in the workspace config.

      This value is not exported to the environment for child processes.

      See Also

      diff --git a/deps/npm/docs/output/commands/npm-search.html b/deps/npm/docs/output/commands/npm-search.html index 82bf85d1347d26..d663dc288e36ae 100644 --- a/deps/npm/docs/output/commands/npm-search.html +++ b/deps/npm/docs/output/commands/npm-search.html @@ -141,9 +141,9 @@
      -

      +

      npm-search - @11.6.2 + @11.6.3

      Search for packages
      @@ -179,25 +179,24 @@

      json

    Whether or not to output JSON data, rather than the normal output.

      -
    • In npm pkg set it enables parsing set values with JSON.parse() -before saving them to your package.json.
    • +
    • In npm pkg set it enables parsing set values with JSON.parse() before +saving them to your package.json.

    Not supported by all npm commands.

    color

      -
    • Default: true unless the NO_COLOR environ is set to something other -than '0'
    • +
    • Default: true unless the NO_COLOR environ is set to something other than '0'
    • Type: "always" or Boolean
    -

    If false, never shows colors. If "always" then always shows colors. -If true, then only prints color codes for tty file descriptors.

    +

    If false, never shows colors. If "always" then always shows colors. If +true, then only prints color codes for tty file descriptors.

    parseable

    • Default: false
    • Type: Boolean
    -

    Output parseable results from commands that write to standard output. -For npm search, this will be tab-separated table format.

    +

    Output parseable results from commands that write to standard output. For +npm search, this will be tab-separated table format.

    description

    • Default: true
    • @@ -209,8 +208,8 @@

      searchlimit

    • Default: 20
    • Type: Number
    -

    Number of items to limit search results to. Will not apply at all to -legacy searches.

    +

    Number of items to limit search results to. Will not apply at all to legacy +searches.

    searchopts

    • Default: ""
    • @@ -234,24 +233,23 @@

      prefer-online

    • Default: false
    • Type: Boolean
    -

    If true, staleness checks for cached data will be forced, making the -CLI look for updates immediately even for fresh package data.

    +

    If true, staleness checks for cached data will be forced, making the CLI +look for updates immediately even for fresh package data.

    prefer-offline

    • Default: false
    • Type: Boolean
    -

    If true, staleness checks for cached data will be bypassed, but -missing data will be requested from the server. To force full offline -mode, use --offline.

    +

    If true, staleness checks for cached data will be bypassed, but missing data +will be requested from the server. To force full offline mode, use +--offline.

    offline

    • Default: false
    • Type: Boolean
    -

    Force offline mode: no network requests will be done during install. -To allow the CLI to fill in missing cache data, see ---prefer-offline.

    +

    Force offline mode: no network requests will be done during install. To +allow the CLI to fill in missing cache data, see --prefer-offline.

    See Also

    • npm registry
    • diff --git a/deps/npm/docs/output/commands/npm-shrinkwrap.html b/deps/npm/docs/output/commands/npm-shrinkwrap.html index f898acb8713c23..ef3f3858819f6a 100644 --- a/deps/npm/docs/output/commands/npm-shrinkwrap.html +++ b/deps/npm/docs/output/commands/npm-shrinkwrap.html @@ -141,9 +141,9 @@
      -

      +

      npm-shrinkwrap - @11.6.2 + @11.6.3

      Lock down dependency versions for publication
      diff --git a/deps/npm/docs/output/commands/npm-star.html b/deps/npm/docs/output/commands/npm-star.html index 4c8a18633f1d59..cec90004e9b6a8 100644 --- a/deps/npm/docs/output/commands/npm-star.html +++ b/deps/npm/docs/output/commands/npm-star.html @@ -141,9 +141,9 @@
      -

      +

      npm-star - @11.6.2 + @11.6.3

      Mark your favorite packages
      @@ -178,22 +178,21 @@

      registry

      The base URL of the npm registry.

      unicode

        -
      • Default: false on windows, true on mac/unix systems with a unicode -locale, as defined by the LC_ALL, LC_CTYPE, or LANG environment -variables.
      • +
      • Default: false on windows, true on mac/unix systems with a unicode locale, +as defined by the LC_ALL, LC_CTYPE, or LANG environment variables.
      • Type: Boolean
      -

      When set to true, npm uses unicode characters in the tree output. -When false, it uses ascii characters instead of unicode glyphs.

      +

      When set to true, npm uses unicode characters in the tree output. When +false, it uses ascii characters instead of unicode glyphs.

      otp

      • Default: null
      • Type: null or String
      -

      This is a one-time password from a two-factor authenticator. It's -needed when publishing or changing package permissions with npm access.

      -

      If not set, and a registry response fails with a challenge for a -one-time password, npm will prompt on the command line for one.

      +

      This is a one-time password from a two-factor authenticator. It's needed +when publishing or changing package permissions with npm access.

      +

      If not set, and a registry response fails with a challenge for a one-time +password, npm will prompt on the command line for one.

      See Also

      • package spec
      • diff --git a/deps/npm/docs/output/commands/npm-stars.html b/deps/npm/docs/output/commands/npm-stars.html index cbf6a3e230b327..09012e7f3de48d 100644 --- a/deps/npm/docs/output/commands/npm-stars.html +++ b/deps/npm/docs/output/commands/npm-stars.html @@ -141,9 +141,9 @@
        -

        +

        npm-stars - @11.6.2 + @11.6.3

        View packages marked as favorites
        diff --git a/deps/npm/docs/output/commands/npm-start.html b/deps/npm/docs/output/commands/npm-start.html index dc5efc037fbf76..5c60765f584442 100644 --- a/deps/npm/docs/output/commands/npm-start.html +++ b/deps/npm/docs/output/commands/npm-start.html @@ -141,9 +141,9 @@
        -

        +

        npm-start - @11.6.2 + @11.6.3

        Start a package
        @@ -184,16 +184,16 @@

        ignore-scripts

      • Type: Boolean

      If true, npm does not run scripts specified in package.json files.

      -

      Note that commands explicitly intended to run a particular script, -such as npm start, npm stop, npm restart, npm test, and npm run will still run their intended script if ignore-scripts is set, -but they will not run any pre- or post-scripts.

      +

      Note that commands explicitly intended to run a particular script, such as +npm start, npm stop, npm restart, npm test, and npm run will still +run their intended script if ignore-scripts is set, but they will not +run any pre- or post-scripts.

      script-shell

      • Default: '/bin/sh' on POSIX systems, 'cmd.exe' on Windows
      • Type: null or String
      -

      The shell to use for scripts run with the npm exec, npm run and -npm init <package-spec> commands.

      +

      The shell to use for scripts run with the npm exec, npm run and npm init <package-spec> commands.

      See Also

      • npm run
      • diff --git a/deps/npm/docs/output/commands/npm-stop.html b/deps/npm/docs/output/commands/npm-stop.html index c0adcdc7ba495d..29a4de71806196 100644 --- a/deps/npm/docs/output/commands/npm-stop.html +++ b/deps/npm/docs/output/commands/npm-stop.html @@ -141,9 +141,9 @@
        -

        +

        npm-stop - @11.6.2 + @11.6.3

        Stop a package
        @@ -181,16 +181,16 @@

        ignore-scripts

      • Type: Boolean

      If true, npm does not run scripts specified in package.json files.

      -

      Note that commands explicitly intended to run a particular script, -such as npm start, npm stop, npm restart, npm test, and npm run will still run their intended script if ignore-scripts is set, -but they will not run any pre- or post-scripts.

      +

      Note that commands explicitly intended to run a particular script, such as +npm start, npm stop, npm restart, npm test, and npm run will still +run their intended script if ignore-scripts is set, but they will not +run any pre- or post-scripts.

      script-shell

      • Default: '/bin/sh' on POSIX systems, 'cmd.exe' on Windows
      • Type: null or String
      -

      The shell to use for scripts run with the npm exec, npm run and -npm init <package-spec> commands.

      +

      The shell to use for scripts run with the npm exec, npm run and npm init <package-spec> commands.

      See Also

      • npm run
      • diff --git a/deps/npm/docs/output/commands/npm-team.html b/deps/npm/docs/output/commands/npm-team.html index 8e88ded725cef9..64050b2a67e565 100644 --- a/deps/npm/docs/output/commands/npm-team.html +++ b/deps/npm/docs/output/commands/npm-team.html @@ -141,9 +141,9 @@
        -

        +

        npm-team - @11.6.2 + @11.6.3

        Manage organization teams and team memberships
        @@ -225,17 +225,17 @@

        otp

      • Default: null
      • Type: null or String
      -

      This is a one-time password from a two-factor authenticator. It's -needed when publishing or changing package permissions with npm access.

      -

      If not set, and a registry response fails with a challenge for a -one-time password, npm will prompt on the command line for one.

      +

      This is a one-time password from a two-factor authenticator. It's needed +when publishing or changing package permissions with npm access.

      +

      If not set, and a registry response fails with a challenge for a one-time +password, npm will prompt on the command line for one.

      parseable

      • Default: false
      • Type: Boolean
      -

      Output parseable results from commands that write to standard output. -For npm search, this will be tab-separated table format.

      +

      Output parseable results from commands that write to standard output. For +npm search, this will be tab-separated table format.

      json

      • Default: false
      • @@ -243,8 +243,8 @@

        json

      Whether or not to output JSON data, rather than the normal output.

        -
      • In npm pkg set it enables parsing set values with JSON.parse() -before saving them to your package.json.
      • +
      • In npm pkg set it enables parsing set values with JSON.parse() before +saving them to your package.json.

      Not supported by all npm commands.

      See Also

      diff --git a/deps/npm/docs/output/commands/npm-test.html b/deps/npm/docs/output/commands/npm-test.html index d2fd55d9c7d547..adfc216fc7a61b 100644 --- a/deps/npm/docs/output/commands/npm-test.html +++ b/deps/npm/docs/output/commands/npm-test.html @@ -141,9 +141,9 @@
      -

      +

      npm-test - @11.6.2 + @11.6.3

      Test a package
      @@ -180,16 +180,16 @@

      ignore-scripts

    • Type: Boolean

    If true, npm does not run scripts specified in package.json files.

    -

    Note that commands explicitly intended to run a particular script, -such as npm start, npm stop, npm restart, npm test, and npm run will still run their intended script if ignore-scripts is set, -but they will not run any pre- or post-scripts.

    +

    Note that commands explicitly intended to run a particular script, such as +npm start, npm stop, npm restart, npm test, and npm run will still +run their intended script if ignore-scripts is set, but they will not +run any pre- or post-scripts.

    script-shell

    • Default: '/bin/sh' on POSIX systems, 'cmd.exe' on Windows
    • Type: null or String
    -

    The shell to use for scripts run with the npm exec, npm run and -npm init <package-spec> commands.

    +

    The shell to use for scripts run with the npm exec, npm run and npm init <package-spec> commands.

    See Also

    Configuration

    -

    read-only

    +

    name

    +
      +
    • Default: null
    • +
    • Type: null or String
    • +
    +

    When creating a Granular Access Token with npm token create, this sets the +name/description for the token.

    +

    token-description

    +
      +
    • Default: null
    • +
    • Type: null or String
    • +
    +

    Description text for the token when using npm token create.

    +

    expires

    +
      +
    • Default: null
    • +
    • Type: null or Number
    • +
    +

    When creating a Granular Access Token with npm token create, this sets the +expiration in days. If not specified, the server will determine the default +expiration.

    +

    packages

    +
      +
    • Default:
    • +
    • Type: null or String (can be set multiple times)
    • +
    +

    When creating a Granular Access Token with npm token create, this limits +the token access to specific packages. Provide a comma-separated list of +package names.

    +

    packages-all

    • Default: false
    • Type: Boolean
    -

    This is used to mark a token as unable to publish when configuring -limited access tokens with the npm token create command.

    +

    When creating a Granular Access Token with npm token create, grants the +token access to all packages instead of limiting to specific packages.

    +

    scopes

    +
      +
    • Default: null
    • +
    • Type: null or String (can be set multiple times)
    • +
    +

    When creating a Granular Access Token with npm token create, this limits +the token access to specific scopes. Provide a comma-separated list of scope +names (with or without @ prefix).

    +

    orgs

    +
      +
    • Default: null
    • +
    • Type: null or String (can be set multiple times)
    • +
    +

    When creating a Granular Access Token with npm token create, this limits +the token access to specific organizations. Provide a comma-separated list +of organization names.

    +

    packages-and-scopes-permission

    +
      +
    • Default: null
    • +
    • Type: null, "read-only", "read-write", or "no-access"
    • +
    +

    When creating a Granular Access Token with npm token create, sets the +permission level for packages and scopes. Options are "read-only", +"read-write", or "no-access".

    +

    orgs-permission

    +
      +
    • Default: null
    • +
    • Type: null, "read-only", "read-write", or "no-access"
    • +
    +

    When creating a Granular Access Token with npm token create, sets the +permission level for organizations. Options are "read-only", "read-write", +or "no-access".

    cidr

    • Default: null
    • Type: null or String (can be set multiple times)
    -

    This is a list of CIDR address to be used when configuring limited -access tokens with the npm token create command.

    +

    This is a list of CIDR address to be used when configuring limited access +tokens with the npm token create command.

    +

    bypass-2fa

    +
      +
    • Default: false
    • +
    • Type: Boolean
    • +
    +

    When creating a Granular Access Token with npm token create, setting this +to true will allow the token to bypass two-factor authentication. This is +useful for automation and CI/CD workflows.

    +

    password

    +
      +
    • Default: null
    • +
    • Type: null or String
    • +
    +

    Password for authentication. Can be provided via command line when creating +tokens, though it's generally safer to be prompted for it.

    registry

    -

    This is a one-time password from a two-factor authenticator. It's -needed when publishing or changing package permissions with npm access.

    -

    If not set, and a registry response fails with a challenge for a -one-time password, npm will prompt on the command line for one.

    +

    This is a one-time password from a two-factor authenticator. It's needed +when publishing or changing package permissions with npm access.

    +

    If not set, and a registry response fails with a challenge for a one-time +password, npm will prompt on the command line for one.

    +

    read-only

    +
      +
    • Default: false
    • +
    • Type: Boolean
    • +
    +

    This is used to mark a token as unable to publish when configuring limited +access tokens with the npm token create command.

    See Also

    • npm adduser
    • diff --git a/deps/npm/docs/output/commands/npm-undeprecate.html b/deps/npm/docs/output/commands/npm-undeprecate.html index c1d80ebb5b58ee..c1de6aa4565e94 100644 --- a/deps/npm/docs/output/commands/npm-undeprecate.html +++ b/deps/npm/docs/output/commands/npm-undeprecate.html @@ -141,9 +141,9 @@
      -

      +

      npm-undeprecate - @11.6.2 + @11.6.3

      Undeprecate a version of a package
      @@ -172,22 +172,21 @@

      otp

    • Default: null
    • Type: null or String
    -

    This is a one-time password from a two-factor authenticator. It's -needed when publishing or changing package permissions with npm access.

    -

    If not set, and a registry response fails with a challenge for a -one-time password, npm will prompt on the command line for one.

    +

    This is a one-time password from a two-factor authenticator. It's needed +when publishing or changing package permissions with npm access.

    +

    If not set, and a registry response fails with a challenge for a one-time +password, npm will prompt on the command line for one.

    dry-run

    • Default: false
    • Type: Boolean
    -

    Indicates that you don't want npm to make any changes and that it -should only report what it would have done. This can be passed into -any of the commands that modify your local installation, eg, -install, update, dedupe, uninstall, as well as pack and -publish.

    -

    Note: This is NOT honored by other network related commands, eg -dist-tags, owner, etc.

    +

    Indicates that you don't want npm to make any changes and that it should +only report what it would have done. This can be passed into any of the +commands that modify your local installation, eg, install, update, +dedupe, uninstall, as well as pack and publish.

    +

    Note: This is NOT honored by other network related commands, eg dist-tags, +owner, etc.

    See Also

    • npm deprecate
    • diff --git a/deps/npm/docs/output/commands/npm-uninstall.html b/deps/npm/docs/output/commands/npm-uninstall.html index 8d594127caa15c..fb9ca4c192247e 100644 --- a/deps/npm/docs/output/commands/npm-uninstall.html +++ b/deps/npm/docs/output/commands/npm-uninstall.html @@ -141,9 +141,9 @@
      -

      +

      npm-uninstall - @11.6.2 + @11.6.3

      Remove a package
      @@ -180,8 +180,7 @@

      Examples

      Configuration

      save

        -
      • Default: true unless when using npm update where it defaults to -false
      • +
      • Default: true unless when using npm update where it defaults to false
      • Type: Boolean

      Save installed packages to a package.json file as dependencies.

      @@ -193,13 +192,12 @@

      global

    • Default: false
    • Type: Boolean
    -

    Operates in "global" mode, so that packages are installed into the -prefix folder instead of the current working directory. See -folders for more on the differences in -behavior.

    +

    Operates in "global" mode, so that packages are installed into the prefix +folder instead of the current working directory. See +folders for more on the differences in behavior.

      -
    • packages are installed into the {prefix}/lib/node_modules folder, -instead of the current working directory.
    • +
    • packages are installed into the {prefix}/lib/node_modules folder, instead +of the current working directory.
    • bin files are linked to {prefix}/bin
    • man pages are linked to {prefix}/share/man
    @@ -208,9 +206,9 @@

    workspace

  • Default:
  • Type: String (can be set multiple times)
  • -

    Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

    +

    Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

    Valid values for the workspace config are either:

    • Workspace names
    • @@ -218,9 +216,9 @@

      workspace

    • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
    -

    When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

    +

    When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

    This value is not exported to the environment for child processes.

    workspaces

      @@ -229,14 +227,13 @@

      workspaces

    Set to true to run the command in the context of all configured workspaces.

    -

    Explicitly setting this to false will cause commands like install -to ignore workspaces altogether. When not set explicitly:

    +

    Explicitly setting this to false will cause commands like install to +ignore workspaces altogether. When not set explicitly:

      -
    • Commands that operate on the node_modules tree (install, update, -etc.) will link workspaces into the node_modules folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, unless one or more workspaces are specified in the -workspace config.
    • +
    • Commands that operate on the node_modules tree (install, update, etc.) +will link workspaces into the node_modules folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +unless one or more workspaces are specified in the workspace config.

    This value is not exported to the environment for child processes.

    include-workspace-root

    @@ -245,19 +242,18 @@

    include-workspace-root

  • Type: Boolean
  • Include the workspace root when workspaces are enabled for a command.

    -

    When false, specifying individual workspaces via the workspace -config, or all workspaces via the workspaces flag, will cause npm -to operate only on the specified workspaces, and not on the root -project.

    +

    When false, specifying individual workspaces via the workspace config, or +all workspaces via the workspaces flag, will cause npm to operate only on +the specified workspaces, and not on the root project.

    This value is not exported to the environment for child processes.

    • Default: false
    • Type: Boolean
    -

    When set file: protocol dependencies will be packed and installed as -regular dependencies instead of creating a symlink. This option has -no effect on workspaces.

    +

    When set file: protocol dependencies will be packed and installed as regular +dependencies instead of creating a symlink. This option has no effect on +workspaces.

    See Also

    • npm prune
    • diff --git a/deps/npm/docs/output/commands/npm-unpublish.html b/deps/npm/docs/output/commands/npm-unpublish.html index 97c04a4eea2ecc..27ce30074d090b 100644 --- a/deps/npm/docs/output/commands/npm-unpublish.html +++ b/deps/npm/docs/output/commands/npm-unpublish.html @@ -141,9 +141,9 @@
      -

      +

      npm-unpublish - @11.6.2 + @11.6.3

      Remove a package from the registry
      @@ -173,13 +173,12 @@

      dry-run

    • Default: false
    • Type: Boolean
    -

    Indicates that you don't want npm to make any changes and that it -should only report what it would have done. This can be passed into -any of the commands that modify your local installation, eg, -install, update, dedupe, uninstall, as well as pack and -publish.

    -

    Note: This is NOT honored by other network related commands, eg -dist-tags, owner, etc.

    +

    Indicates that you don't want npm to make any changes and that it should +only report what it would have done. This can be passed into any of the +commands that modify your local installation, eg, install, update, +dedupe, uninstall, as well as pack and publish.

    +

    Note: This is NOT honored by other network related commands, eg dist-tags, +owner, etc.

    force

    • Default: false
    • @@ -191,16 +190,14 @@

      force

    • Allow clobbering non-npm files in global installs.
    • Allow the npm version command to work on an unclean git repository.
    • Allow deleting the cache folder with npm cache clean.
    • -
    • Allow installing packages that have an engines declaration -requiring a different version of npm.
    • -
    • Allow installing packages that have an engines declaration -requiring a different version of node, even if --engine-strict is -enabled.
    • -
    • Allow npm audit fix to install modules outside your stated -dependency range (including SemVer-major changes).
    • +
    • Allow installing packages that have an engines declaration requiring a +different version of npm.
    • +
    • Allow installing packages that have an engines declaration requiring a +different version of node, even if --engine-strict is enabled.
    • +
    • Allow npm audit fix to install modules outside your stated dependency +range (including SemVer-major changes).
    • Allow unpublishing all versions of a published package.
    • -
    • Allow conflicting peerDependencies to be installed in the root -project.
    • +
    • Allow conflicting peerDependencies to be installed in the root project.
    • Implicitly set --yes during npm init.
    • Allow clobbering existing values in npm pkg
    • Allow unpublishing of entire packages (not just a single version).
    • @@ -212,9 +209,9 @@

      workspace

    • Default:
    • Type: String (can be set multiple times)
    -

    Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

    +

    Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

    Valid values for the workspace config are either:

    • Workspace names
    • @@ -222,9 +219,9 @@

      workspace

    • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
    -

    When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

    +

    When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

    This value is not exported to the environment for child processes.

    workspaces

      @@ -233,14 +230,13 @@

      workspaces

    Set to true to run the command in the context of all configured workspaces.

    -

    Explicitly setting this to false will cause commands like install -to ignore workspaces altogether. When not set explicitly:

    +

    Explicitly setting this to false will cause commands like install to +ignore workspaces altogether. When not set explicitly:

      -
    • Commands that operate on the node_modules tree (install, update, -etc.) will link workspaces into the node_modules folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, unless one or more workspaces are specified in the -workspace config.
    • +
    • Commands that operate on the node_modules tree (install, update, etc.) +will link workspaces into the node_modules folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +unless one or more workspaces are specified in the workspace config.

    This value is not exported to the environment for child processes.

    See Also

    diff --git a/deps/npm/docs/output/commands/npm-unstar.html b/deps/npm/docs/output/commands/npm-unstar.html index b3976de6064321..d5257fc3a379fd 100644 --- a/deps/npm/docs/output/commands/npm-unstar.html +++ b/deps/npm/docs/output/commands/npm-unstar.html @@ -141,9 +141,9 @@
    -

    +

    npm-unstar - @11.6.2 + @11.6.3

    Remove an item from your favorite packages
    @@ -174,22 +174,21 @@

    registry

    The base URL of the npm registry.

    unicode

      -
    • Default: false on windows, true on mac/unix systems with a unicode -locale, as defined by the LC_ALL, LC_CTYPE, or LANG environment -variables.
    • +
    • Default: false on windows, true on mac/unix systems with a unicode locale, +as defined by the LC_ALL, LC_CTYPE, or LANG environment variables.
    • Type: Boolean
    -

    When set to true, npm uses unicode characters in the tree output. -When false, it uses ascii characters instead of unicode glyphs.

    +

    When set to true, npm uses unicode characters in the tree output. When +false, it uses ascii characters instead of unicode glyphs.

    otp

    • Default: null
    • Type: null or String
    -

    This is a one-time password from a two-factor authenticator. It's -needed when publishing or changing package permissions with npm access.

    -

    If not set, and a registry response fails with a challenge for a -one-time password, npm will prompt on the command line for one.

    +

    This is a one-time password from a two-factor authenticator. It's needed +when publishing or changing package permissions with npm access.

    +

    If not set, and a registry response fails with a challenge for a one-time +password, npm will prompt on the command line for one.

    See Also

    • npm star
    • diff --git a/deps/npm/docs/output/commands/npm-update.html b/deps/npm/docs/output/commands/npm-update.html index ecd560cc49574c..bda592e900b0b4 100644 --- a/deps/npm/docs/output/commands/npm-update.html +++ b/deps/npm/docs/output/commands/npm-update.html @@ -141,9 +141,9 @@
      -

      +

      npm-update - @11.6.2 + @11.6.3

      Update packages
      @@ -243,8 +243,7 @@

      Updating Globally-Installed Packag

      Configuration

      save

        -
      • Default: true unless when using npm update where it defaults to -false
      • +
      • Default: true unless when using npm update where it defaults to false
      • Type: Boolean

      Save installed packages to a package.json file as dependencies.

      @@ -256,13 +255,12 @@

      global

    • Default: false
    • Type: Boolean
    -

    Operates in "global" mode, so that packages are installed into the -prefix folder instead of the current working directory. See -folders for more on the differences in -behavior.

    +

    Operates in "global" mode, so that packages are installed into the prefix +folder instead of the current working directory. See +folders for more on the differences in behavior.

      -
    • packages are installed into the {prefix}/lib/node_modules folder, -instead of the current working directory.
    • +
    • packages are installed into the {prefix}/lib/node_modules folder, instead +of the current working directory.
    • bin files are linked to {prefix}/bin
    • man pages are linked to {prefix}/share/man
    @@ -272,12 +270,11 @@

    install-strategy

  • Type: "hoisted", "nested", "shallow", or "linked"
  • Sets the strategy for installing packages in node_modules. hoisted -(default): Install non-duplicated in top-level, and duplicated as -necessary within directory structure. nested: (formerly ---legacy-bundling) install in place, no hoisting. shallow (formerly ---global-style) only install direct deps at top-level. linked: -(experimental) install in node_modules/.store, link in place, -unhoisted.

    +(default): Install non-duplicated in top-level, and duplicated as necessary +within directory structure. nested: (formerly --legacy-bundling) install in +place, no hoisting. shallow (formerly --global-style) only install direct +deps at top-level. linked: (experimental) install in node_modules/.store, +link in place, unhoisted.

    legacy-bundling

    • Default: false
    • @@ -285,10 +282,10 @@

      legacy-bundling

    • DEPRECATED: This option has been deprecated in favor of --install-strategy=nested
    -

    Instead of hoisting package installs in node_modules, install -packages in the same manner that they are depended on. This may cause -very deep directory structures and duplicate package installs as -there is no de-duplicating. Sets --install-strategy=nested.

    +

    Instead of hoisting package installs in node_modules, install packages in +the same manner that they are depended on. This may cause very deep +directory structures and duplicate package installs as there is no +de-duplicating. Sets --install-strategy=nested.

    global-style

    • Default: false
    • @@ -296,8 +293,8 @@

      global-style

    • DEPRECATED: This option has been deprecated in favor of --install-strategy=shallow
    -

    Only install direct dependencies in the top level node_modules, but -hoist on deeper dependencies. Sets --install-strategy=shallow.

    +

    Only install direct dependencies in the top level node_modules, but hoist +on deeper dependencies. Sets --install-strategy=shallow.

    omit

    • Default: 'dev' if the NODE_ENV environment variable is set to @@ -308,91 +305,85 @@

      omit

      Note that these dependencies are still resolved and added to the package-lock.json or npm-shrinkwrap.json file. They are just not physically installed on disk.

      -

      If a package type appears in both the --include and --omit lists, -then it will be included.

      -

      If the resulting omit list includes 'dev', then the NODE_ENV -environment variable will be set to 'production' for all lifecycle -scripts.

      +

      If a package type appears in both the --include and --omit lists, then +it will be included.

      +

      If the resulting omit list includes 'dev', then the NODE_ENV environment +variable will be set to 'production' for all lifecycle scripts.

      include

      • Default:
      • -
      • Type: "prod", "dev", "optional", or "peer" (can be set multiple -times)
      • +
      • Type: "prod", "dev", "optional", or "peer" (can be set multiple times)
      -

      Option that allows for defining which types of dependencies to -install.

      +

      Option that allows for defining which types of dependencies to install.

      This is the inverse of --omit=<type>.

      -

      Dependency types specified in --include will not be omitted, -regardless of the order in which omit/include are specified on the -command-line.

      +

      Dependency types specified in --include will not be omitted, regardless of +the order in which omit/include are specified on the command-line.

      strict-peer-deps

      • Default: false
      • Type: Boolean

      If set to true, and --legacy-peer-deps is not set, then any -conflicting peerDependencies will be treated as an install failure, -even if npm could reasonably guess the appropriate resolution based -on non-peer dependency relationships.

      -

      By default, conflicting peerDependencies deep in the dependency -graph will be resolved using the nearest non-peer dependency -specification, even if doing so will result in some packages -receiving a peer dependency outside the range set in their package's -peerDependencies object.

      -

      When such an override is performed, a warning is printed, explaining -the conflict and the packages involved. If --strict-peer-deps is -set, then this warning is treated as a failure.

      +conflicting peerDependencies will be treated as an install failure, even +if npm could reasonably guess the appropriate resolution based on non-peer +dependency relationships.

      +

      By default, conflicting peerDependencies deep in the dependency graph will +be resolved using the nearest non-peer dependency specification, even if +doing so will result in some packages receiving a peer dependency outside +the range set in their package's peerDependencies object.

      +

      When such an override is performed, a warning is printed, explaining the +conflict and the packages involved. If --strict-peer-deps is set, then +this warning is treated as a failure.

      package-lock

      • Default: true
      • Type: Boolean
      -

      If set to false, then ignore package-lock.json files when -installing. This will also prevent writing package-lock.json if -save is true.

      +

      If set to false, then ignore package-lock.json files when installing. This +will also prevent writing package-lock.json if save is true.

      foreground-scripts

        -
      • Default: false unless when using npm pack or npm publish where -it defaults to true
      • +
      • Default: false unless when using npm pack or npm publish where it +defaults to true
      • Type: Boolean
      -

      Run all build scripts (ie, preinstall, install, and -postinstall) scripts for installed packages in the foreground -process, sharing standard input, output, and error with the main npm -process.

      -

      Note that this will generally make installs run slower, and be much -noisier, but can be useful for debugging.

      +

      Run all build scripts (ie, preinstall, install, and postinstall) +scripts for installed packages in the foreground process, sharing standard +input, output, and error with the main npm process.

      +

      Note that this will generally make installs run slower, and be much noisier, +but can be useful for debugging.

      ignore-scripts

      • Default: false
      • Type: Boolean

      If true, npm does not run scripts specified in package.json files.

      -

      Note that commands explicitly intended to run a particular script, -such as npm start, npm stop, npm restart, npm test, and npm run will still run their intended script if ignore-scripts is set, -but they will not run any pre- or post-scripts.

      +

      Note that commands explicitly intended to run a particular script, such as +npm start, npm stop, npm restart, npm test, and npm run will still +run their intended script if ignore-scripts is set, but they will not +run any pre- or post-scripts.

      audit

      • Default: true
      • Type: Boolean
      -

      When "true" submit audit reports alongside the current npm command to -the default registry and all registries configured for scopes. See -the documentation for npm audit for details -on what is submitted.

      +

      When "true" submit audit reports alongside the current npm command to the +default registry and all registries configured for scopes. See the +documentation for npm audit for details on what is +submitted.

      before

      • Default: null
      • Type: null or Date

      If passed to npm install, will rebuild the npm tree such that only -versions that were available on or before the given date are -installed. If there are no versions available for the current set of -dependencies, the command will error.

      -

      If the requested version is a dist-tag and the given tag does not -pass the --before filter, the most recent version less than or -equal to that tag will be used. For example, foo@latest might -install foo@1.2 even though latest is 2.0.

      +versions that were available on or before the given date are installed. +If there are no versions available for the current set of dependencies, the +command will error.

      +

      If the requested version is a dist-tag and the given tag does not pass the +--before filter, the most recent version less than or equal to that tag +will be used. For example, foo@latest might install foo@1.2 even though +latest is 2.0.

      • Default: true
      • @@ -400,37 +391,35 @@

      Tells npm to create symlinks (or .cmd shims on Windows) for package executables.

      -

      Set to false to have it not do this. This can be used to work around -the fact that some file systems don't support symlinks, even on -ostensibly Unix systems.

      +

      Set to false to have it not do this. This can be used to work around the +fact that some file systems don't support symlinks, even on ostensibly Unix +systems.

      fund

      • Default: true
      • Type: Boolean

      When "true" displays the message at the end of each npm install -acknowledging the number of dependencies looking for funding. See -npm fund for details.

      +acknowledging the number of dependencies looking for funding. See npm fund for details.

      dry-run

      • Default: false
      • Type: Boolean
      -

      Indicates that you don't want npm to make any changes and that it -should only report what it would have done. This can be passed into -any of the commands that modify your local installation, eg, -install, update, dedupe, uninstall, as well as pack and -publish.

      -

      Note: This is NOT honored by other network related commands, eg -dist-tags, owner, etc.

      +

      Indicates that you don't want npm to make any changes and that it should +only report what it would have done. This can be passed into any of the +commands that modify your local installation, eg, install, update, +dedupe, uninstall, as well as pack and publish.

      +

      Note: This is NOT honored by other network related commands, eg dist-tags, +owner, etc.

      workspace

      • Default:
      • Type: String (can be set multiple times)
      -

      Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

      +

      Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

      Valid values for the workspace config are either:

      • Workspace names
      • @@ -438,9 +427,9 @@

        workspace

      • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
      -

      When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

      +

      When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

      This value is not exported to the environment for child processes.

      workspaces

        @@ -449,14 +438,13 @@

        workspaces

      Set to true to run the command in the context of all configured workspaces.

      -

      Explicitly setting this to false will cause commands like install -to ignore workspaces altogether. When not set explicitly:

      +

      Explicitly setting this to false will cause commands like install to +ignore workspaces altogether. When not set explicitly:

        -
      • Commands that operate on the node_modules tree (install, update, -etc.) will link workspaces into the node_modules folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, unless one or more workspaces are specified in the -workspace config.
      • +
      • Commands that operate on the node_modules tree (install, update, etc.) +will link workspaces into the node_modules folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +unless one or more workspaces are specified in the workspace config.

      This value is not exported to the environment for child processes.

      include-workspace-root

      @@ -465,19 +453,18 @@

      include-workspace-root

    • Type: Boolean

    Include the workspace root when workspaces are enabled for a command.

    -

    When false, specifying individual workspaces via the workspace -config, or all workspaces via the workspaces flag, will cause npm -to operate only on the specified workspaces, and not on the root -project.

    +

    When false, specifying individual workspaces via the workspace config, or +all workspaces via the workspaces flag, will cause npm to operate only on +the specified workspaces, and not on the root project.

    This value is not exported to the environment for child processes.

    • Default: false
    • Type: Boolean
    -

    When set file: protocol dependencies will be packed and installed as -regular dependencies instead of creating a symlink. This option has -no effect on workspaces.

    +

    When set file: protocol dependencies will be packed and installed as regular +dependencies instead of creating a symlink. This option has no effect on +workspaces.

    See Also

    -

    Prevents throwing an error when npm version is used to set the new -version to the same value as the current version.

    +

    Prevents throwing an error when npm version is used to set the new version +to the same value as the current version.

    commit-hooks

    • Default: true
    • @@ -177,8 +177,8 @@

      git-tag-version

    • Default: true
    • Type: Boolean
    -

    Tag the commit when using the npm version command. Setting this to -false results in no commit being made at all.

    +

    Tag the commit when using the npm version command. Setting this to false +results in no commit being made at all.

    json

    • Default: false
    • @@ -186,8 +186,8 @@

      json

    Whether or not to output JSON data, rather than the normal output.

      -
    • In npm pkg set it enables parsing set values with JSON.parse() -before saving them to your package.json.
    • +
    • In npm pkg set it enables parsing set values with JSON.parse() before +saving them to your package.json.

    Not supported by all npm commands.

    preid

    @@ -195,25 +195,34 @@

    preid

  • Default: ""
  • Type: String
  • -

    The "prerelease identifier" to use as a prefix for the "prerelease" -part of a semver. Like the rc in 1.2.0-rc.8.

    +

    The "prerelease identifier" to use as a prefix for the "prerelease" part of +a semver. Like the rc in 1.2.0-rc.8.

    sign-git-tag

    • Default: false
    • Type: Boolean
    -

    If set to true, then the npm version command will tag the version -using -s to add a signature.

    -

    Note that git requires you to have set up GPG keys in your git -configs for this to work properly.

    +

    If set to true, then the npm version command will tag the version using +-s to add a signature.

    +

    Note that git requires you to have set up GPG keys in your git configs for +this to work properly.

    +

    save

    +
      +
    • Default: true unless when using npm update where it defaults to false
    • +
    • Type: Boolean
    • +
    +

    Save installed packages to a package.json file as dependencies.

    +

    When used with the npm rm command, removes the dependency from +package.json.

    +

    Will also prevent writing to package-lock.json if set to false.

    workspace

    • Default:
    • Type: String (can be set multiple times)
    -

    Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

    +

    Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

    Valid values for the workspace config are either:

    • Workspace names
    • @@ -221,9 +230,9 @@

      workspace

    • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
    -

    When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

    +

    When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

    This value is not exported to the environment for child processes.

    workspaces

      @@ -232,14 +241,13 @@

      workspaces

    Set to true to run the command in the context of all configured workspaces.

    -

    Explicitly setting this to false will cause commands like install -to ignore workspaces altogether. When not set explicitly:

    +

    Explicitly setting this to false will cause commands like install to +ignore workspaces altogether. When not set explicitly:

      -
    • Commands that operate on the node_modules tree (install, update, -etc.) will link workspaces into the node_modules folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, unless one or more workspaces are specified in the -workspace config.
    • +
    • Commands that operate on the node_modules tree (install, update, etc.) +will link workspaces into the node_modules folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +unless one or more workspaces are specified in the workspace config.

    This value is not exported to the environment for child processes.

    workspaces-update

    @@ -247,20 +255,28 @@

    workspaces-update

  • Default: true
  • Type: Boolean
  • -

    If set to true, the npm cli will run an update after operations that -may possibly change the workspaces installed to the node_modules -folder.

    +

    If set to true, the npm cli will run an update after operations that may +possibly change the workspaces installed to the node_modules folder.

    include-workspace-root

    • Default: false
    • Type: Boolean

    Include the workspace root when workspaces are enabled for a command.

    -

    When false, specifying individual workspaces via the workspace -config, or all workspaces via the workspaces flag, will cause npm -to operate only on the specified workspaces, and not on the root -project.

    +

    When false, specifying individual workspaces via the workspace config, or +all workspaces via the workspaces flag, will cause npm to operate only on +the specified workspaces, and not on the root project.

    This value is not exported to the environment for child processes.

    +

    ignore-scripts

    +
      +
    • Default: false
    • +
    • Type: Boolean
    • +
    +

    If true, npm does not run scripts specified in package.json files.

    +

    Note that commands explicitly intended to run a particular script, such as +npm start, npm stop, npm restart, npm test, and npm run will still +run their intended script if ignore-scripts is set, but they will not +run any pre- or post-scripts.

    Description

    Run this in a package directory to bump the version and write the new data back to package.json, package-lock.json, and, if present, npm-shrinkwrap.json.

    diff --git a/deps/npm/docs/output/commands/npm-view.html b/deps/npm/docs/output/commands/npm-view.html index e48ae33a4c619d..9c0e30efee1218 100644 --- a/deps/npm/docs/output/commands/npm-view.html +++ b/deps/npm/docs/output/commands/npm-view.html @@ -141,9 +141,9 @@
    -

    +

    npm-view - @11.6.2 + @11.6.3

    View registry info
    @@ -217,8 +217,8 @@

    json

    Whether or not to output JSON data, rather than the normal output.

      -
    • In npm pkg set it enables parsing set values with JSON.parse() -before saving them to your package.json.
    • +
    • In npm pkg set it enables parsing set values with JSON.parse() before +saving them to your package.json.

    Not supported by all npm commands.

    workspace

    @@ -226,9 +226,9 @@

    workspace

  • Default:
  • Type: String (can be set multiple times)
  • -

    Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

    +

    Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

    Valid values for the workspace config are either:

    • Workspace names
    • @@ -236,9 +236,9 @@

      workspace

    • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
    -

    When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

    +

    When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

    This value is not exported to the environment for child processes.

    workspaces

      @@ -247,14 +247,13 @@

      workspaces

    Set to true to run the command in the context of all configured workspaces.

    -

    Explicitly setting this to false will cause commands like install -to ignore workspaces altogether. When not set explicitly:

    +

    Explicitly setting this to false will cause commands like install to +ignore workspaces altogether. When not set explicitly:

      -
    • Commands that operate on the node_modules tree (install, update, -etc.) will link workspaces into the node_modules folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, unless one or more workspaces are specified in the -workspace config.
    • +
    • Commands that operate on the node_modules tree (install, update, etc.) +will link workspaces into the node_modules folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +unless one or more workspaces are specified in the workspace config.

    This value is not exported to the environment for child processes.

    include-workspace-root

    @@ -263,10 +262,9 @@

    include-workspace-root

  • Type: Boolean
  • Include the workspace root when workspaces are enabled for a command.

    -

    When false, specifying individual workspaces via the workspace -config, or all workspaces via the workspaces flag, will cause npm -to operate only on the specified workspaces, and not on the root -project.

    +

    When false, specifying individual workspaces via the workspace config, or +all workspaces via the workspaces flag, will cause npm to operate only on +the specified workspaces, and not on the root project.

    This value is not exported to the environment for child processes.

    Output

    If only a single string field for a single version is output, then it will not be colorized or quoted, to enable piping the output to another command. diff --git a/deps/npm/docs/output/commands/npm-whoami.html b/deps/npm/docs/output/commands/npm-whoami.html index f7407455d0de8b..86515fe7870f42 100644 --- a/deps/npm/docs/output/commands/npm-whoami.html +++ b/deps/npm/docs/output/commands/npm-whoami.html @@ -141,9 +141,9 @@

    -

    +

    npm-whoami - @11.6.2 + @11.6.3

    Display npm username
    diff --git a/deps/npm/docs/output/commands/npm.html b/deps/npm/docs/output/commands/npm.html index 6bb3e7ffd89962..5cb902d2b16709 100644 --- a/deps/npm/docs/output/commands/npm.html +++ b/deps/npm/docs/output/commands/npm.html @@ -141,9 +141,9 @@
    -

    +

    npm - @11.6.2 + @11.6.3

    javascript package manager
    @@ -158,7 +158,7 @@

    Table of contents

    Note: This command is unaware of workspaces.

    Version

    -

    11.6.2

    +

    11.6.3

    Description

    npm is the package manager for the Node JavaScript platform. It puts modules in place so that node can find them, and manages dependency conflicts intelligently.

    diff --git a/deps/npm/docs/output/commands/npx.html b/deps/npm/docs/output/commands/npx.html index 1358a8399dce97..721cfd0967e28b 100644 --- a/deps/npm/docs/output/commands/npx.html +++ b/deps/npm/docs/output/commands/npx.html @@ -141,9 +141,9 @@
    -

    +

    npx - @11.6.2 + @11.6.3

    Run a command from a local or remote npm package
    diff --git a/deps/npm/docs/output/configuring-npm/folders.html b/deps/npm/docs/output/configuring-npm/folders.html index 5b0f7946324bdf..506da51d46c0d6 100644 --- a/deps/npm/docs/output/configuring-npm/folders.html +++ b/deps/npm/docs/output/configuring-npm/folders.html @@ -141,9 +141,9 @@
    -

    +

    folders - @11.6.2 + @11.6.3

    Folder Structures Used by npm
    diff --git a/deps/npm/docs/output/configuring-npm/install.html b/deps/npm/docs/output/configuring-npm/install.html index 2c55261fc691f4..a4f342963dd06f 100644 --- a/deps/npm/docs/output/configuring-npm/install.html +++ b/deps/npm/docs/output/configuring-npm/install.html @@ -141,9 +141,9 @@
    -

    +

    install - @11.6.2 + @11.6.3

    Download and install node and npm
    diff --git a/deps/npm/docs/output/configuring-npm/npm-global.html b/deps/npm/docs/output/configuring-npm/npm-global.html index 5b0f7946324bdf..506da51d46c0d6 100644 --- a/deps/npm/docs/output/configuring-npm/npm-global.html +++ b/deps/npm/docs/output/configuring-npm/npm-global.html @@ -141,9 +141,9 @@
    -

    +

    folders - @11.6.2 + @11.6.3

    Folder Structures Used by npm
    diff --git a/deps/npm/docs/output/configuring-npm/npm-json.html b/deps/npm/docs/output/configuring-npm/npm-json.html index bd50e9c1f15907..6682591557b5a4 100644 --- a/deps/npm/docs/output/configuring-npm/npm-json.html +++ b/deps/npm/docs/output/configuring-npm/npm-json.html @@ -141,9 +141,9 @@
    -

    +

    package.json - @11.6.2 + @11.6.3

    Specifics of npm's package.json handling
    diff --git a/deps/npm/docs/output/configuring-npm/npm-shrinkwrap-json.html b/deps/npm/docs/output/configuring-npm/npm-shrinkwrap-json.html index db174340c220bf..2d81edfc27cf39 100644 --- a/deps/npm/docs/output/configuring-npm/npm-shrinkwrap-json.html +++ b/deps/npm/docs/output/configuring-npm/npm-shrinkwrap-json.html @@ -141,9 +141,9 @@
    -

    +

    npm-shrinkwrap.json - @11.6.2 + @11.6.3

    A publishable lockfile
    diff --git a/deps/npm/docs/output/configuring-npm/npmrc.html b/deps/npm/docs/output/configuring-npm/npmrc.html index 819e8c80b66213..2b2b876a44188f 100644 --- a/deps/npm/docs/output/configuring-npm/npmrc.html +++ b/deps/npm/docs/output/configuring-npm/npmrc.html @@ -141,9 +141,9 @@
    -

    +

    npmrc - @11.6.2 + @11.6.3

    The npm config files
    diff --git a/deps/npm/docs/output/configuring-npm/package-json.html b/deps/npm/docs/output/configuring-npm/package-json.html index bd50e9c1f15907..6682591557b5a4 100644 --- a/deps/npm/docs/output/configuring-npm/package-json.html +++ b/deps/npm/docs/output/configuring-npm/package-json.html @@ -141,9 +141,9 @@
    -

    +

    package.json - @11.6.2 + @11.6.3

    Specifics of npm's package.json handling
    diff --git a/deps/npm/docs/output/configuring-npm/package-lock-json.html b/deps/npm/docs/output/configuring-npm/package-lock-json.html index cfb5d95a827395..1065eb0f69bd8f 100644 --- a/deps/npm/docs/output/configuring-npm/package-lock-json.html +++ b/deps/npm/docs/output/configuring-npm/package-lock-json.html @@ -141,9 +141,9 @@
    -

    +

    package-lock.json - @11.6.2 + @11.6.3

    A manifestation of the manifest
    diff --git a/deps/npm/docs/output/using-npm/config.html b/deps/npm/docs/output/using-npm/config.html index 1cffacc56efad2..12fff8d16e8067 100644 --- a/deps/npm/docs/output/using-npm/config.html +++ b/deps/npm/docs/output/using-npm/config.html @@ -141,16 +141,16 @@
    -

    +

    config - @11.6.2 + @11.6.3

    More than you probably want to know about npm configuration

    Table of contents

    -
    +

    Description

    @@ -244,77 +244,75 @@

    _auth

  • Default: null
  • Type: null or String
  • -

    A basic-auth string to use when authenticating against the npm -registry. This will ONLY be used to authenticate against the npm -registry. For other registries you will need to scope it like -"//other-registry.tld/:_auth"

    -

    Warning: This should generally not be set via a command-line option. -It is safer to use a registry-provided authentication bearer token -stored in the ~/.npmrc file by running npm login.

    +

    A basic-auth string to use when authenticating against the npm registry. +This will ONLY be used to authenticate against the npm registry. For other +registries you will need to scope it like "//other-registry.tld/:_auth"

    +

    Warning: This should generally not be set via a command-line option. It is +safer to use a registry-provided authentication bearer token stored in the +~/.npmrc file by running npm login.

    access

      -
    • Default: 'public' for new packages, existing packages it will not -change the current level
    • +
    • Default: 'public' for new packages, existing packages it will not change the +current level
    • Type: null, "restricted", or "public"

    If you do not want your scoped package to be publicly viewable (and installable) set --access=restricted.

    Unscoped packages cannot be set to restricted.

    -

    Note: This defaults to not changing the current access level for -existing packages. Specifying a value of restricted or public -during publish will change the access for an existing package the -same way that npm access set status would.

    +

    Note: This defaults to not changing the current access level for existing +packages. Specifying a value of restricted or public during publish will +change the access for an existing package the same way that npm access set status would.

    all

    • Default: false
    • Type: Boolean
    -

    When running npm outdated and npm ls, setting --all will show -all outdated or installed packages, rather than only those directly -depended upon by the current project.

    +

    When running npm outdated and npm ls, setting --all will show all +outdated or installed packages, rather than only those directly depended +upon by the current project.

    allow-same-version

    • Default: false
    • Type: Boolean
    -

    Prevents throwing an error when npm version is used to set the new -version to the same value as the current version.

    +

    Prevents throwing an error when npm version is used to set the new version +to the same value as the current version.

    audit

    • Default: true
    • Type: Boolean
    -

    When "true" submit audit reports alongside the current npm command to -the default registry and all registries configured for scopes. See -the documentation for npm audit for details -on what is submitted.

    +

    When "true" submit audit reports alongside the current npm command to the +default registry and all registries configured for scopes. See the +documentation for npm audit for details on what is +submitted.

    audit-level

    • Default: null
    • Type: null, "info", "low", "moderate", "high", "critical", or "none"
    -

    The minimum level of vulnerability for npm audit to exit with a -non-zero exit code.

    +

    The minimum level of vulnerability for npm audit to exit with a non-zero +exit code.

    auth-type

    • Default: "web"
    • Type: "legacy" or "web"
    -

    What authentication strategy to use with login. Note that if an -otp config is given, this value will always be set to legacy.

    +

    What authentication strategy to use with login. Note that if an otp +config is given, this value will always be set to legacy.

    before

    • Default: null
    • Type: null or Date

    If passed to npm install, will rebuild the npm tree such that only -versions that were available on or before the given date are -installed. If there are no versions available for the current set of -dependencies, the command will error.

    -

    If the requested version is a dist-tag and the given tag does not -pass the --before filter, the most recent version less than or -equal to that tag will be used. For example, foo@latest might -install foo@1.2 even though latest is 2.0.

    +versions that were available on or before the given date are installed. +If there are no versions available for the current set of dependencies, the +command will error.

    +

    If the requested version is a dist-tag and the given tag does not pass the +--before filter, the most recent version less than or equal to that tag +will be used. For example, foo@latest might install foo@1.2 even though +latest is 2.0.

    • Default: true
    • @@ -322,9 +320,9 @@

    Tells npm to create symlinks (or .cmd shims on Windows) for package executables.

    -

    Set to false to have it not do this. This can be used to work around -the fact that some file systems don't support symlinks, even on -ostensibly Unix systems.

    +

    Set to false to have it not do this. This can be used to work around the +fact that some file systems don't support symlinks, even on ostensibly Unix +systems.

    browser

    • Default: macOS: "open", Windows: "start", Others: "xdg-open"
    • @@ -334,19 +332,27 @@

      browser

      Set to false to suppress browser behavior and instead print urls to terminal.

      Set to true to use default system URL opener.

      +

      bypass-2fa

      +
        +
      • Default: false
      • +
      • Type: Boolean
      • +
      +

      When creating a Granular Access Token with npm token create, setting this +to true will allow the token to bypass two-factor authentication. This is +useful for automation and CI/CD workflows.

      ca

      • Default: null
      • Type: null or String (can be set multiple times)

      The Certificate Authority signing certificate that is trusted for SSL -connections to the registry. Values should be in PEM format (Windows -calls it "Base-64 encoded X.509 (.CER)") with newlines replaced by -the string "\n". For example:

      +connections to the registry. Values should be in PEM format (Windows calls +it "Base-64 encoded X.509 (.CER)") with newlines replaced by the string +"\n". For example:

      ca="-----BEGIN CERTIFICATE-----\nXXXX\nXXXX\n-----END CERTIFICATE-----"
       
      -

      Set to null to only allow "known" registrars, or to a specific CA -cert to trust only that specific signing authority.

      +

      Set to null to only allow "known" registrars, or to a specific CA cert to +trust only that specific signing authority.

      Multiple CAs can be trusted by specifying an array of certificates:

      ca[]="..."
       ca[]="..."
      @@ -363,18 +369,16 @@ 

      cafile

    • Default: null
    • Type: Path
    -

    A path to a file containing one or multiple Certificate Authority -signing certificates. Similar to the ca setting, but allows for -multiple CA's, as well as for the CA information to be stored in a -file on disk.

    +

    A path to a file containing one or multiple Certificate Authority signing +certificates. Similar to the ca setting, but allows for multiple CA's, as +well as for the CA information to be stored in a file on disk.

    call

    • Default: ""
    • Type: String
    -

    Optional companion option for npm exec, npx that allows for -specifying a custom command to be run along with the installed -packages.

    +

    Optional companion option for npm exec, npx that allows for specifying a +custom command to be run along with the installed packages.

    npm exec --package yo --package generator-node --call "yo node"
     

    cidr

    @@ -382,16 +386,15 @@

    cidr

  • Default: null
  • Type: null or String (can be set multiple times)
  • -

    This is a list of CIDR address to be used when configuring limited -access tokens with the npm token create command.

    +

    This is a list of CIDR address to be used when configuring limited access +tokens with the npm token create command.

    color

      -
    • Default: true unless the NO_COLOR environ is set to something other -than '0'
    • +
    • Default: true unless the NO_COLOR environ is set to something other than '0'
    • Type: "always" or Boolean
    -

    If false, never shows colors. If "always" then always shows colors. -If true, then only prints color codes for tty file descriptors.

    +

    If false, never shows colors. If "always" then always shows colors. If +true, then only prints color codes for tty file descriptors.

    commit-hooks

    • Default: true
    • @@ -403,18 +406,16 @@

      cpu

    • Default: null
    • Type: null or String
    -

    Override CPU architecture of native modules to install. Acceptable -values are same as cpu field of package.json, which comes from -process.arch.

    +

    Override CPU architecture of native modules to install. Acceptable values +are same as cpu field of package.json, which comes from process.arch.

    depth

    • Default: Infinity if --all is set; otherwise, 0
    • Type: null or Number

    The depth to go when recursing packages for npm ls.

    -

    If not set, npm ls will show only the immediate dependencies of the -root project. If --all is set, then npm will show all dependencies -by default.

    +

    If not set, npm ls will show only the immediate dependencies of the root +project. If --all is set, then npm will show all dependencies by default.

    description

    • Default: true
    • @@ -476,13 +477,12 @@

      dry-run

    • Default: false
    • Type: Boolean
    -

    Indicates that you don't want npm to make any changes and that it -should only report what it would have done. This can be passed into -any of the commands that modify your local installation, eg, -install, update, dedupe, uninstall, as well as pack and -publish.

    -

    Note: This is NOT honored by other network related commands, eg -dist-tags, owner, etc.

    +

    Indicates that you don't want npm to make any changes and that it should +only report what it would have done. This can be passed into any of the +commands that modify your local installation, eg, install, update, +dedupe, uninstall, as well as pack and publish.

    +

    Note: This is NOT honored by other network related commands, eg dist-tags, +owner, etc.

    editor

    • Default: The EDITOR or VISUAL environment variables, or @@ -495,9 +495,9 @@

      engine-strict

    • Default: false
    • Type: Boolean
    -

    If set to true, then npm will stubbornly refuse to install (or even -consider installing) any package that claims to not be compatible -with the current Node.js version.

    +

    If set to true, then npm will stubbornly refuse to install (or even consider +installing) any package that claims to not be compatible with the current +Node.js version.

    This can be overridden by setting the --force flag.

    expect-result-count

      @@ -511,25 +511,32 @@

      expect-results

    • Default: null
    • Type: null or Boolean
    -

    Tells npm whether or not to expect results from the command. Can be -either true (expect some results) or false (expect no results).

    +

    Tells npm whether or not to expect results from the command. Can be either +true (expect some results) or false (expect no results).

    This config cannot be used with: expect-result-count

    +

    expires

    +
      +
    • Default: null
    • +
    • Type: null or Number
    • +
    +

    When creating a Granular Access Token with npm token create, this sets the +expiration in days. If not specified, the server will determine the default +expiration.

    fetch-retries

    • Default: 2
    • Type: Number
    -

    The "retries" config for the retry module to use when fetching -packages from the registry.

    -

    npm will retry idempotent read requests to the registry in the case -of network failures or 5xx HTTP errors.

    +

    The "retries" config for the retry module to use when fetching packages +from the registry.

    +

    npm will retry idempotent read requests to the registry in the case of +network failures or 5xx HTTP errors.

    fetch-retry-factor

    • Default: 10
    • Type: Number
    -

    The "factor" config for the retry module to use when fetching -packages.

    +

    The "factor" config for the retry module to use when fetching packages.

    fetch-retry-maxtimeout

    • Default: 60000 (1 minute)
    • @@ -561,16 +568,14 @@

      force

    • Allow clobbering non-npm files in global installs.
    • Allow the npm version command to work on an unclean git repository.
    • Allow deleting the cache folder with npm cache clean.
    • -
    • Allow installing packages that have an engines declaration -requiring a different version of npm.
    • -
    • Allow installing packages that have an engines declaration -requiring a different version of node, even if --engine-strict is -enabled.
    • -
    • Allow npm audit fix to install modules outside your stated -dependency range (including SemVer-major changes).
    • +
    • Allow installing packages that have an engines declaration requiring a +different version of npm.
    • +
    • Allow installing packages that have an engines declaration requiring a +different version of node, even if --engine-strict is enabled.
    • +
    • Allow npm audit fix to install modules outside your stated dependency +range (including SemVer-major changes).
    • Allow unpublishing all versions of a published package.
    • -
    • Allow conflicting peerDependencies to be installed in the root -project.
    • +
    • Allow conflicting peerDependencies to be installed in the root project.
    • Implicitly set --yes during npm init.
    • Allow clobbering existing values in npm pkg
    • Allow unpublishing of entire packages (not just a single version).
    • @@ -579,58 +584,54 @@

      force

      recommended that you do not use this option!

      foreground-scripts

        -
      • Default: false unless when using npm pack or npm publish where -it defaults to true
      • +
      • Default: false unless when using npm pack or npm publish where it +defaults to true
      • Type: Boolean
      -

      Run all build scripts (ie, preinstall, install, and -postinstall) scripts for installed packages in the foreground -process, sharing standard input, output, and error with the main npm -process.

      -

      Note that this will generally make installs run slower, and be much -noisier, but can be useful for debugging.

      +

      Run all build scripts (ie, preinstall, install, and postinstall) +scripts for installed packages in the foreground process, sharing standard +input, output, and error with the main npm process.

      +

      Note that this will generally make installs run slower, and be much noisier, +but can be useful for debugging.

      format-package-lock

      • Default: true
      • Type: Boolean
      -

      Format package-lock.json or npm-shrinkwrap.json as a human -readable file.

      +

      Format package-lock.json or npm-shrinkwrap.json as a human readable +file.

      fund

      • Default: true
      • Type: Boolean

      When "true" displays the message at the end of each npm install -acknowledging the number of dependencies looking for funding. See -npm fund for details.

      +acknowledging the number of dependencies looking for funding. See npm fund for details.

      git

      • Default: "git"
      • Type: String
      -

      The command to use for git commands. If git is installed on the -computer, but is not in the PATH, then set this to the full path to -the git binary.

      +

      The command to use for git commands. If git is installed on the computer, +but is not in the PATH, then set this to the full path to the git binary.

      git-tag-version

      • Default: true
      • Type: Boolean
      -

      Tag the commit when using the npm version command. Setting this to -false results in no commit being made at all.

      +

      Tag the commit when using the npm version command. Setting this to false +results in no commit being made at all.

      global

      • Default: false
      • Type: Boolean
      -

      Operates in "global" mode, so that packages are installed into the -prefix folder instead of the current working directory. See -folders for more on the differences in -behavior.

      +

      Operates in "global" mode, so that packages are installed into the prefix +folder instead of the current working directory. See +folders for more on the differences in behavior.

        -
      • packages are installed into the {prefix}/lib/node_modules folder, -instead of the current working directory.
      • +
      • packages are installed into the {prefix}/lib/node_modules folder, instead +of the current working directory.
      • bin files are linked to {prefix}/bin
      • man pages are linked to {prefix}/share/man
      @@ -653,20 +654,20 @@

      https-proxy

    • Type: null or URL

    A proxy to use for outgoing https requests. If the HTTPS_PROXY or -https_proxy or HTTP_PROXY or http_proxy environment variables -are set, proxy settings will be honored by the underlying -make-fetch-happen library.

    +https_proxy or HTTP_PROXY or http_proxy environment variables are set, +proxy settings will be honored by the underlying make-fetch-happen +library.

    if-present

    • Default: false
    • Type: Boolean
    -

    If true, npm will not exit with an error code when run is invoked -for a script that isn't defined in the scripts section of -package.json. This option can be used when it's desirable to -optionally run a script when it's present and fail if the script -fails. This is useful, for example, when running scripts that may -only apply for some builds in an otherwise generic CI setup.

    +

    If true, npm will not exit with an error code when run is invoked for a +script that isn't defined in the scripts section of package.json. This +option can be used when it's desirable to optionally run a script when it's +present and fail if the script fails. This is useful, for example, when +running scripts that may only apply for some builds in an otherwise generic +CI setup.

    This value is not exported to the environment for child processes.

    ignore-scripts

      @@ -674,28 +675,26 @@

      ignore-scripts

    • Type: Boolean

    If true, npm does not run scripts specified in package.json files.

    -

    Note that commands explicitly intended to run a particular script, -such as npm start, npm stop, npm restart, npm test, and npm run will still run their intended script if ignore-scripts is set, -but they will not run any pre- or post-scripts.

    +

    Note that commands explicitly intended to run a particular script, such as +npm start, npm stop, npm restart, npm test, and npm run will still +run their intended script if ignore-scripts is set, but they will not +run any pre- or post-scripts.

    include

    • Default:
    • -
    • Type: "prod", "dev", "optional", or "peer" (can be set multiple -times)
    • +
    • Type: "prod", "dev", "optional", or "peer" (can be set multiple times)
    -

    Option that allows for defining which types of dependencies to -install.

    +

    Option that allows for defining which types of dependencies to install.

    This is the inverse of --omit=<type>.

    -

    Dependency types specified in --include will not be omitted, -regardless of the order in which omit/include are specified on the -command-line.

    +

    Dependency types specified in --include will not be omitted, regardless of +the order in which omit/include are specified on the command-line.

    include-staged

    • Default: false
    • Type: Boolean
    -

    Allow installing "staged" published packages, as defined by npm RFC -PR #92.

    +

    Allow installing "staged" published packages, as defined by npm RFC PR +#92.

    This is experimental, and not implemented by the npm public registry.

    include-workspace-root

      @@ -703,25 +702,22 @@

      include-workspace-root

    • Type: Boolean

    Include the workspace root when workspaces are enabled for a command.

    -

    When false, specifying individual workspaces via the workspace -config, or all workspaces via the workspaces flag, will cause npm -to operate only on the specified workspaces, and not on the root -project.

    +

    When false, specifying individual workspaces via the workspace config, or +all workspaces via the workspaces flag, will cause npm to operate only on +the specified workspaces, and not on the root project.

    This value is not exported to the environment for child processes.

    init-author-email

    • Default: ""
    • Type: String
    -

    The value npm init should use by default for the package author's -email.

    +

    The value npm init should use by default for the package author's email.

    init-author-name

    • Default: ""
    • Type: String
    -

    The value npm init should use by default for the package author's -name.

    +

    The value npm init should use by default for the package author's name.

    init-author-url

    • Default: ""
    • @@ -742,49 +738,47 @@

      init-module

    A module that will be loaded by the npm init command. See the documentation for the -init-package-json module -for more information, or npm init.

    +init-package-json module for +more information, or npm init.

    init-private

    • Default: false
    • Type: Boolean
    -

    The value npm init should use by default for the package's private -flag.

    +

    The value npm init should use by default for the package's private flag.

    init-type

    • Default: "commonjs"
    • Type: String
    -

    The value that npm init should use by default for the package.json -type field.

    +

    The value that npm init should use by default for the package.json type +field.

    init-version

    • Default: "1.0.0"
    • Type: SemVer string
    -

    The value that npm init should use by default for the package -version number, if not already set in package.json.

    +

    The value that npm init should use by default for the package version +number, if not already set in package.json.

    • Default: false
    • Type: Boolean
    -

    When set file: protocol dependencies will be packed and installed as -regular dependencies instead of creating a symlink. This option has -no effect on workspaces.

    +

    When set file: protocol dependencies will be packed and installed as regular +dependencies instead of creating a symlink. This option has no effect on +workspaces.

    install-strategy

    • Default: "hoisted"
    • Type: "hoisted", "nested", "shallow", or "linked"

    Sets the strategy for installing packages in node_modules. hoisted -(default): Install non-duplicated in top-level, and duplicated as -necessary within directory structure. nested: (formerly ---legacy-bundling) install in place, no hoisting. shallow (formerly ---global-style) only install direct deps at top-level. linked: -(experimental) install in node_modules/.store, link in place, -unhoisted.

    +(default): Install non-duplicated in top-level, and duplicated as necessary +within directory structure. nested: (formerly --legacy-bundling) install in +place, no hoisting. shallow (formerly --global-style) only install direct +deps at top-level. linked: (experimental) install in node_modules/.store, +link in place, unhoisted.

    json

    • Default: false
    • @@ -792,8 +786,8 @@

      json

    Whether or not to output JSON data, rather than the normal output.

      -
    • In npm pkg set it enables parsing set values with JSON.parse() -before saving them to your package.json.
    • +
    • In npm pkg set it enables parsing set values with JSON.parse() before +saving them to your package.json.

    Not supported by all npm commands.

    legacy-peer-deps

    @@ -801,83 +795,77 @@

    legacy-peer-deps

  • Default: false
  • Type: Boolean
  • -

    Causes npm to completely ignore peerDependencies when building a -package tree, as in npm versions 3 through 6.

    -

    If a package cannot be installed because of overly strict -peerDependencies that collide, it provides a way to move forward -resolving the situation.

    -

    This differs from --omit=peer, in that --omit=peer will avoid -unpacking peerDependencies on disk, but will still design a tree -such that peerDependencies could be unpacked in a correct place.

    -

    Use of legacy-peer-deps is not recommended, as it will not enforce -the peerDependencies contract that meta-dependencies may rely on.

    +

    Causes npm to completely ignore peerDependencies when building a package +tree, as in npm versions 3 through 6.

    +

    If a package cannot be installed because of overly strict peerDependencies +that collide, it provides a way to move forward resolving the situation.

    +

    This differs from --omit=peer, in that --omit=peer will avoid unpacking +peerDependencies on disk, but will still design a tree such that +peerDependencies could be unpacked in a correct place.

    +

    Use of legacy-peer-deps is not recommended, as it will not enforce the +peerDependencies contract that meta-dependencies may rely on.

    libc

    • Default: null
    • Type: null or String
    -

    Override libc of native modules to install. Acceptable values are -same as libc field of package.json

    +

    Override libc of native modules to install. Acceptable values are same as +libc field of package.json

    • Default: false
    • Type: Boolean
    -

    Used with npm ls, limiting output to only those packages that are -linked.

    +

    Used with npm ls, limiting output to only those packages that are linked.

    local-address

    • Default: null
    • Type: IP Address
    -

    The IP address of the local interface to use when making connections -to the npm registry. Must be IPv4 in versions of Node prior to 0.12.

    +

    The IP address of the local interface to use when making connections to the +npm registry. Must be IPv4 in versions of Node prior to 0.12.

    location

      -
    • Default: "user" unless --global is passed, which will also set this -value to "global"
    • +
    • Default: "user" unless --global is passed, which will also set this value +to "global"
    • Type: "global", "user", or "project"

    When passed to npm config this refers to which config file to use.

    -

    When set to "global" mode, packages are installed into the prefix -folder instead of the current working directory. See -folders for more on the differences in -behavior.

    +

    When set to "global" mode, packages are installed into the prefix folder +instead of the current working directory. See +folders for more on the differences in behavior.

      -
    • packages are installed into the {prefix}/lib/node_modules folder, -instead of the current working directory.
    • +
    • packages are installed into the {prefix}/lib/node_modules folder, instead +of the current working directory.
    • bin files are linked to {prefix}/bin
    • man pages are linked to {prefix}/share/man

    lockfile-version

      -
    • Default: Version 3 if no lockfile, auto-converting v1 lockfiles to -v3; otherwise, maintain current lockfile version.
    • +
    • Default: Version 3 if no lockfile, auto-converting v1 lockfiles to v3; +otherwise, maintain current lockfile version.
    • Type: null, 1, 2, 3, "1", "2", or "3"

    Set the lockfile format version to be used in package-lock.json and npm-shrinkwrap-json files. Possible options are:

    -

    1: The lockfile version used by npm versions 5 and 6. Lacks some data -that is used during the install, resulting in slower and possibly -less deterministic installs. Prevents lockfile churn when -interoperating with older npm versions.

    -

    2: The default lockfile version used by npm version 7 and 8. Includes -both the version 1 lockfile data and version 3 lockfile data, for -maximum determinism and interoperability, at the expense of more -bytes on disk.

    -

    3: Only the new lockfile information introduced in npm version 7. -Smaller on disk than lockfile version 2, but not interoperable with -older npm versions. Ideal if all users are on npm version 7 and -higher.

    +

    1: The lockfile version used by npm versions 5 and 6. Lacks some data that +is used during the install, resulting in slower and possibly less +deterministic installs. Prevents lockfile churn when interoperating with +older npm versions.

    +

    2: The default lockfile version used by npm version 7 and 8. Includes both +the version 1 lockfile data and version 3 lockfile data, for maximum +determinism and interoperability, at the expense of more bytes on disk.

    +

    3: Only the new lockfile information introduced in npm version 7. Smaller on +disk than lockfile version 2, but not interoperable with older npm versions. +Ideal if all users are on npm version 7 and higher.

    loglevel

    • Default: "notice"
    • -
    • Type: "silent", "error", "warn", "notice", "http", "info", "verbose", -or "silly"
    • +
    • Type: "silent", "error", "warn", "notice", "http", "info", "verbose", or +"silly"
    -

    What level of logs to report. All logs are written to a debug log, -with the path to that file printed if the execution of a command -fails.

    +

    What level of logs to report. All logs are written to a debug log, with the +path to that file printed if the execution of a command fails.

    Any logs of a higher level than the setting are shown. The default is "notice".

    See also the foreground-scripts config.

    @@ -886,7 +874,8 @@

    logs-dir

  • Default: A directory named _logs inside the cache
  • Type: null or Path
  • -

    The location of npm's log directory. See npm logging for more information.

    +

    The location of npm's log directory. See npm logging +for more information.

    logs-max

    • Default: 10
    • @@ -905,33 +894,39 @@

      maxsockets

    • Default: 15
    • Type: Number
    -

    The maximum number of connections to use per origin -(protocol/host/port combination).

    +

    The maximum number of connections to use per origin (protocol/host/port +combination).

    message

    • Default: "%s"
    • Type: String
    -

    Commit message which is used by npm version when creating version -commit.

    +

    Commit message which is used by npm version when creating version commit.

    Any "%s" in the message will be replaced with the version number.

    +

    name

    +
      +
    • Default: null
    • +
    • Type: null or String
    • +
    +

    When creating a Granular Access Token with npm token create, this sets the +name/description for the token.

    node-gyp

    • Default: The path to the node-gyp bin that ships with npm
    • Type: Path
    -

    This is the location of the "node-gyp" bin. By default it uses one -that ships with npm itself.

    -

    You can use this config to specify your own "node-gyp" to run when it -is required to build a package.

    +

    This is the location of the "node-gyp" bin. By default it uses one that +ships with npm itself.

    +

    You can use this config to specify your own "node-gyp" to run when it is +required to build a package.

    node-options

    • Default: null
    • Type: null or String

    Options to pass through to Node.js via the NODE_OPTIONS environment -variable. This does not impact how npm itself is executed but it does -impact how lifecycle scripts are called.

    +variable. This does not impact how npm itself is executed but it does impact +how lifecycle scripts are called.

    noproxy

    • Default: The value of the NO_PROXY environment variable
    • @@ -944,9 +939,8 @@

      offline

    • Default: false
    • Type: Boolean
    -

    Force offline mode: no network requests will be done during install. -To allow the CLI to fill in missing cache data, see ---prefer-offline.

    +

    Force offline mode: no network requests will be done during install. To +allow the CLI to fill in missing cache data, see --prefer-offline.

    omit

    • Default: 'dev' if the NODE_ENV environment variable is set to @@ -957,36 +951,51 @@

      omit

      Note that these dependencies are still resolved and added to the package-lock.json or npm-shrinkwrap.json file. They are just not physically installed on disk.

      -

      If a package type appears in both the --include and --omit lists, -then it will be included.

      -

      If the resulting omit list includes 'dev', then the NODE_ENV -environment variable will be set to 'production' for all lifecycle -scripts.

      +

      If a package type appears in both the --include and --omit lists, then +it will be included.

      +

      If the resulting omit list includes 'dev', then the NODE_ENV environment +variable will be set to 'production' for all lifecycle scripts.

      omit-lockfile-registry-resolved

      • Default: false
      • Type: Boolean
      -

      This option causes npm to create lock files without a resolved key -for registry dependencies. Subsequent installs will need to resolve -tarball endpoints with the configured registry, likely resulting in a -longer install time.

      +

      This option causes npm to create lock files without a resolved key for +registry dependencies. Subsequent installs will need to resolve tarball +endpoints with the configured registry, likely resulting in a longer install +time.

      +

      orgs

      +
        +
      • Default: null
      • +
      • Type: null or String (can be set multiple times)
      • +
      +

      When creating a Granular Access Token with npm token create, this limits +the token access to specific organizations. Provide a comma-separated list +of organization names.

      +

      orgs-permission

      +
        +
      • Default: null
      • +
      • Type: null, "read-only", "read-write", or "no-access"
      • +
      +

      When creating a Granular Access Token with npm token create, sets the +permission level for organizations. Options are "read-only", "read-write", +or "no-access".

      os

      • Default: null
      • Type: null or String
      -

      Override OS of native modules to install. Acceptable values are same -as os field of package.json, which comes from process.platform.

      +

      Override OS of native modules to install. Acceptable values are same as os +field of package.json, which comes from process.platform.

      otp

      • Default: null
      • Type: null or String
      -

      This is a one-time password from a two-factor authenticator. It's -needed when publishing or changing package permissions with npm access.

      -

      If not set, and a registry response fails with a challenge for a -one-time password, npm will prompt on the command line for one.

      +

      This is a one-time password from a two-factor authenticator. It's needed +when publishing or changing package permissions with npm access.

      +

      If not set, and a registry response fails with a challenge for a one-time +password, npm will prompt on the command line for one.

      pack-destination

      • Default: "."
      • @@ -1004,91 +1013,117 @@

        package-lock

      • Default: true
      • Type: Boolean
      -

      If set to false, then ignore package-lock.json files when -installing. This will also prevent writing package-lock.json if -save is true.

      +

      If set to false, then ignore package-lock.json files when installing. This +will also prevent writing package-lock.json if save is true.

      package-lock-only

      • Default: false
      • Type: Boolean
      -

      If set to true, the current operation will only use the -package-lock.json, ignoring node_modules.

      +

      If set to true, the current operation will only use the package-lock.json, +ignoring node_modules.

      For update this means only the package-lock.json will be updated, instead of checking node_modules and downloading dependencies.

      -

      For list this means the output will be based on the tree described -by the package-lock.json, rather than the contents of -node_modules.

      +

      For list this means the output will be based on the tree described by the +package-lock.json, rather than the contents of node_modules.

      +

      packages

      +
        +
      • Default:
      • +
      • Type: null or String (can be set multiple times)
      • +
      +

      When creating a Granular Access Token with npm token create, this limits +the token access to specific packages. Provide a comma-separated list of +package names.

      +

      packages-all

      +
        +
      • Default: false
      • +
      • Type: Boolean
      • +
      +

      When creating a Granular Access Token with npm token create, grants the +token access to all packages instead of limiting to specific packages.

      +

      packages-and-scopes-permission

      +
        +
      • Default: null
      • +
      • Type: null, "read-only", "read-write", or "no-access"
      • +
      +

      When creating a Granular Access Token with npm token create, sets the +permission level for packages and scopes. Options are "read-only", +"read-write", or "no-access".

      parseable

      • Default: false
      • Type: Boolean
      -

      Output parseable results from commands that write to standard output. -For npm search, this will be tab-separated table format.

      +

      Output parseable results from commands that write to standard output. For +npm search, this will be tab-separated table format.

      +

      password

      +
        +
      • Default: null
      • +
      • Type: null or String
      • +
      +

      Password for authentication. Can be provided via command line when creating +tokens, though it's generally safer to be prompted for it.

      prefer-dedupe

      • Default: false
      • Type: Boolean
      -

      Prefer to deduplicate packages if possible, rather than choosing a -newer version of a dependency.

      +

      Prefer to deduplicate packages if possible, rather than choosing a newer +version of a dependency.

      prefer-offline

      • Default: false
      • Type: Boolean
      -

      If true, staleness checks for cached data will be bypassed, but -missing data will be requested from the server. To force full offline -mode, use --offline.

      +

      If true, staleness checks for cached data will be bypassed, but missing data +will be requested from the server. To force full offline mode, use +--offline.

      prefer-online

      • Default: false
      • Type: Boolean
      -

      If true, staleness checks for cached data will be forced, making the -CLI look for updates immediately even for fresh package data.

      +

      If true, staleness checks for cached data will be forced, making the CLI +look for updates immediately even for fresh package data.

      prefix

        -
      • Default: In global mode, the folder where the node executable is -installed. Otherwise, the nearest parent folder containing either a -package.json file or a node_modules folder.
      • +
      • Default: In global mode, the folder where the node executable is installed. +Otherwise, the nearest parent folder containing either a package.json file +or a node_modules folder.
      • Type: Path
      -

      The location to install global items. If set on the command line, -then it forces non-global commands to run in the specified folder.

      +

      The location to install global items. If set on the command line, then it +forces non-global commands to run in the specified folder.

      preid

      • Default: ""
      • Type: String
      -

      The "prerelease identifier" to use as a prefix for the "prerelease" -part of a semver. Like the rc in 1.2.0-rc.8.

      +

      The "prerelease identifier" to use as a prefix for the "prerelease" part of +a semver. Like the rc in 1.2.0-rc.8.

      progress

        -
      • Default: true when not in CI and both stderr and stdout are TTYs -and not in a dumb terminal
      • +
      • Default: true when not in CI and both stderr and stdout are TTYs and not +in a dumb terminal
      • Type: Boolean
      -

      When set to true, npm will display a progress bar during time -intensive operations, if process.stderr and process.stdout are a -TTY.

      +

      When set to true, npm will display a progress bar during time intensive +operations, if process.stderr and process.stdout are a TTY.

      Set to false to suppress the progress bar.

      provenance

      • Default: false
      • Type: Boolean
      -

      When publishing from a supported cloud CI/CD system, the package will -be publicly linked to where it was built and published from.

      +

      When publishing from a supported cloud CI/CD system, the package will be +publicly linked to where it was built and published from.

      This config cannot be used with: provenance-file

      provenance-file

      • Default: null
      • Type: Path
      -

      When publishing, the provenance bundle at the given path will be -used.

      +

      When publishing, the provenance bundle at the given path will be used.

      This config cannot be used with: provenance

      proxy

        @@ -1096,15 +1131,15 @@

        proxy

      • Type: null, false, or URL

      A proxy to use for outgoing http requests. If the HTTP_PROXY or -http_proxy environment variables are set, proxy settings will be -honored by the underlying request library.

      +http_proxy environment variables are set, proxy settings will be honored +by the underlying request library.

      read-only

      • Default: false
      • Type: Boolean
      -

      This is used to mark a token as unable to publish when configuring -limited access tokens with the npm token create command.

      +

      This is used to mark a token as unable to publish when configuring limited +access tokens with the npm token create command.

      rebuild-bundle

      • Default: true
      • @@ -1122,17 +1157,16 @@

        replace-registry-host

      • Default: "npmjs"
      • Type: "npmjs", "never", "always", or String
      -

      Defines behavior for replacing the registry host in a lockfile with -the configured registry.

      +

      Defines behavior for replacing the registry host in a lockfile with the +configured registry.

      The default behavior is to replace package dist URLs from the default -registry (https://registry.npmjs.org) to the configured registry. If -set to "never", then use the registry value. If set to "always", then -replace the registry host with the configured host every time.

      +registry (https://registry.npmjs.org) to the configured registry. If set to +"never", then use the registry value. If set to "always", then replace the +registry host with the configured host every time.

      You may also specify a bare hostname (e.g., "registry.npmjs.org").

      save

        -
      • Default: true unless when using npm update where it defaults to -false
      • +
      • Default: true unless when using npm update where it defaults to false
      • Type: Boolean

      Save installed packages to a package.json file as dependencies.

      @@ -1147,30 +1181,27 @@

      save-bundle

      If a package would be saved at install time by the use of --save, --save-dev, or --save-optional, then also put it in the bundleDependencies list.

      -

      Ignored if --save-peer is set, since peerDependencies cannot be -bundled.

      +

      Ignored if --save-peer is set, since peerDependencies cannot be bundled.

      save-dev

      • Default: false
      • Type: Boolean

      Save installed packages to a package.json file as devDependencies.

      -

      This config cannot be used with: save-optional, save-peer, -save-prod

      +

      This config cannot be used with: save-optional, save-peer, save-prod

      save-exact

      • Default: false
      • Type: Boolean
      -

      Dependencies saved to package.json will be configured with an exact -version rather than using npm's default semver range operator.

      +

      Dependencies saved to package.json will be configured with an exact version +rather than using npm's default semver range operator.

      save-optional

      • Default: false
      • Type: Boolean
      -

      Save installed packages to a package.json file as -optionalDependencies.

      +

      Save installed packages to a package.json file as optionalDependencies.

      This config cannot be used with: save-dev, save-peer, save-prod

      save-peer

        @@ -1178,32 +1209,28 @@

        save-peer

      • Type: Boolean

      Save installed packages to a package.json file as peerDependencies

      -

      This config cannot be used with: save-dev, save-optional, -save-prod

      +

      This config cannot be used with: save-dev, save-optional, save-prod

      save-prefix

      • Default: "^"
      • Type: String
      -

      Configure how versions of packages installed to a package.json file -via --save or --save-dev get prefixed.

      -

      For example if a package has version 1.2.3, by default its version -is set to ^1.2.3 which allows minor upgrades for that package, but -after npm config set save-prefix='~' it would be set to ~1.2.3 -which only allows patch upgrades.

      +

      Configure how versions of packages installed to a package.json file via +--save or --save-dev get prefixed.

      +

      For example if a package has version 1.2.3, by default its version is set +to ^1.2.3 which allows minor upgrades for that package, but after npm config set save-prefix='~' it would be set to ~1.2.3 which only allows +patch upgrades.

      save-prod

      • Default: false
      • Type: Boolean
      -

      Save installed packages into dependencies specifically. This is -useful if a package already exists in devDependencies or -optionalDependencies, but you want to move it to be a non-optional -production dependency.

      -

      This is the default behavior if --save is true, and neither ---save-dev or --save-optional are true.

      -

      This config cannot be used with: save-dev, save-optional, -save-peer

      +

      Save installed packages into dependencies specifically. This is useful if +a package already exists in devDependencies or optionalDependencies, but +you want to move it to be a non-optional production dependency.

      +

      This is the default behavior if --save is true, and neither --save-dev +or --save-optional are true.

      +

      This config cannot be used with: save-dev, save-optional, save-peer

      sbom-format

      • Default: null
      • @@ -1215,9 +1242,9 @@

        sbom-type

      • Default: "library"
      • Type: "library", "application", or "framework"
      -

      The type of package described by the generated SBOM. For SPDX, this -is the value for the primaryPackagePurpose field. For CycloneDX, -this is the value for the type field.

      +

      The type of package described by the generated SBOM. For SPDX, this is the +value for the primaryPackagePurpose field. For CycloneDX, this is the +value for the type field.

      scope

      • Default: the scope of the current project, if any, or ""
      • @@ -1239,13 +1266,20 @@

        scope

        # instead of just named "whatever" npm init --scope=@foo --yes
        +

        scopes

        +
          +
        • Default: null
        • +
        • Type: null or String (can be set multiple times)
        • +
        +

        When creating a Granular Access Token with npm token create, this limits +the token access to specific scopes. Provide a comma-separated list of scope +names (with or without @ prefix).

        script-shell

        • Default: '/bin/sh' on POSIX systems, 'cmd.exe' on Windows
        • Type: null or String
        -

        The shell to use for scripts run with the npm exec, npm run and -npm init <package-spec> commands.

        +

        The shell to use for scripts run with the npm exec, npm run and npm init <package-spec> commands.

        searchexclude

        • Default: ""
        • @@ -1257,8 +1291,8 @@

          searchlimit

        • Default: 20
        • Type: Number
        -

        Number of items to limit search results to. Will not apply at all to -legacy searches.

        +

        Number of items to limit search results to. Will not apply at all to legacy +searches.

        searchopts

        • Default: ""
        • @@ -1270,12 +1304,12 @@

          searchstaleness

        • Default: 900
        • Type: Number
        -

        The age of the cache, in seconds, before another registry request is -made if using legacy search endpoint.

        +

        The age of the cache, in seconds, before another registry request is made if +using legacy search endpoint.

        shell

          -
        • Default: SHELL environment variable, or "bash" on Posix, or "cmd.exe" -on Windows
        • +
        • Default: SHELL environment variable, or "bash" on Posix, or "cmd.exe" on +Windows
        • Type: String

        The shell to run for the npm explore command.

        @@ -1284,111 +1318,114 @@

        sign-git-commit

      • Default: false
      • Type: Boolean
      -

      If set to true, then the npm version command will commit the new -package version using -S to add a signature.

      -

      Note that git requires you to have set up GPG keys in your git -configs for this to work properly.

      +

      If set to true, then the npm version command will commit the new package +version using -S to add a signature.

      +

      Note that git requires you to have set up GPG keys in your git configs for +this to work properly.

      sign-git-tag

      • Default: false
      • Type: Boolean
      -

      If set to true, then the npm version command will tag the version -using -s to add a signature.

      -

      Note that git requires you to have set up GPG keys in your git -configs for this to work properly.

      +

      If set to true, then the npm version command will tag the version using +-s to add a signature.

      +

      Note that git requires you to have set up GPG keys in your git configs for +this to work properly.

      strict-peer-deps

      • Default: false
      • Type: Boolean

      If set to true, and --legacy-peer-deps is not set, then any -conflicting peerDependencies will be treated as an install failure, -even if npm could reasonably guess the appropriate resolution based -on non-peer dependency relationships.

      -

      By default, conflicting peerDependencies deep in the dependency -graph will be resolved using the nearest non-peer dependency -specification, even if doing so will result in some packages -receiving a peer dependency outside the range set in their package's -peerDependencies object.

      -

      When such an override is performed, a warning is printed, explaining -the conflict and the packages involved. If --strict-peer-deps is -set, then this warning is treated as a failure.

      +conflicting peerDependencies will be treated as an install failure, even +if npm could reasonably guess the appropriate resolution based on non-peer +dependency relationships.

      +

      By default, conflicting peerDependencies deep in the dependency graph will +be resolved using the nearest non-peer dependency specification, even if +doing so will result in some packages receiving a peer dependency outside +the range set in their package's peerDependencies object.

      +

      When such an override is performed, a warning is printed, explaining the +conflict and the packages involved. If --strict-peer-deps is set, then +this warning is treated as a failure.

      strict-ssl

      • Default: true
      • Type: Boolean
      -

      Whether or not to do SSL key validation when making requests to the -registry via https.

      +

      Whether or not to do SSL key validation when making requests to the registry +via https.

      See also the ca config.

      tag

      • Default: "latest"
      • Type: String
      -

      If you ask npm to install a package and don't tell it a specific -version, then it will install the specified tag.

      +

      If you ask npm to install a package and don't tell it a specific version, +then it will install the specified tag.

      It is the tag added to the package@version specified in the npm dist-tag add command, if no explicit tag is given.

      -

      When used by the npm diff command, this is the tag used to fetch -the tarball that will be compared with the local files by default.

      -

      If used in the npm publish command, this is the tag that will be -added to the package submitted to the registry.

      +

      When used by the npm diff command, this is the tag used to fetch the +tarball that will be compared with the local files by default.

      +

      If used in the npm publish command, this is the tag that will be added to +the package submitted to the registry.

      tag-version-prefix

      • Default: "v"
      • Type: String
      -

      If set, alters the prefix used when tagging a new version when -performing a version increment using npm version. To remove the -prefix altogether, set it to the empty string: "".

      -

      Because other tools may rely on the convention that npm version tags -look like v1.0.0, only use this property if it is absolutely -necessary. In particular, use care when overriding this setting for -public packages.

      +

      If set, alters the prefix used when tagging a new version when performing a +version increment using npm version. To remove the prefix altogether, set +it to the empty string: "".

      +

      Because other tools may rely on the convention that npm version tags look +like v1.0.0, only use this property if it is absolutely necessary. In +particular, use care when overriding this setting for public packages.

      timing

      • Default: false
      • Type: Boolean
      -

      If true, writes timing information to a process specific json file in -the cache or logs-dir. The file name ends with -timing.json.

      -

      You can quickly view it with this json command -line: cat ~/.npm/_logs/*-timing.json | npm exec -- json -g.

      -

      Timing information will also be reported in the terminal. To suppress -this while still writing the timing file, use --silent.

      +

      If true, writes timing information to a process specific json file in the +cache or logs-dir. The file name ends with -timing.json.

      +

      You can quickly view it with this json command line: +cat ~/.npm/_logs/*-timing.json | npm exec -- json -g.

      +

      Timing information will also be reported in the terminal. To suppress this +while still writing the timing file, use --silent.

      +

      token-description

      +
        +
      • Default: null
      • +
      • Type: null or String
      • +
      +

      Description text for the token when using npm token create.

      umask

      • Default: 0
      • Type: Octal numeric string in range 0000..0777 (0..511)
      -

      The "umask" value to use when setting the file creation mode on files -and folders.

      -

      Folders and executables are given a mode which is 0o777 masked -against this value. Other files are given a mode which is 0o666 -masked against this value.

      -

      Note that the underlying system will also apply its own umask value -to files and folders that are created, and npm does not circumvent -this, but rather adds the --umask config to it.

      -

      Thus, the effective default umask value on most POSIX systems is -0o22, meaning that folders and executables are created with a mode of -0o755 and other files are created with a mode of 0o644.

      +

      The "umask" value to use when setting the file creation mode on files and +folders.

      +

      Folders and executables are given a mode which is 0o777 masked against +this value. Other files are given a mode which is 0o666 masked against +this value.

      +

      Note that the underlying system will also apply its own umask value to +files and folders that are created, and npm does not circumvent this, but +rather adds the --umask config to it.

      +

      Thus, the effective default umask value on most POSIX systems is 0o22, +meaning that folders and executables are created with a mode of 0o755 and +other files are created with a mode of 0o644.

      unicode

        -
      • Default: false on windows, true on mac/unix systems with a unicode -locale, as defined by the LC_ALL, LC_CTYPE, or LANG environment -variables.
      • +
      • Default: false on windows, true on mac/unix systems with a unicode locale, +as defined by the LC_ALL, LC_CTYPE, or LANG environment variables.
      • Type: Boolean
      -

      When set to true, npm uses unicode characters in the tree output. -When false, it uses ascii characters instead of unicode glyphs.

      +

      When set to true, npm uses unicode characters in the tree output. When +false, it uses ascii characters instead of unicode glyphs.

      update-notifier

      • Default: true
      • Type: Boolean
      -

      Set to false to suppress the update notification when using an older -version of npm than the latest.

      +

      Set to false to suppress the update notification when using an older version +of npm than the latest.

      usage

      • Default: false
      • @@ -1401,17 +1438,17 @@

        user-agent

        workspaces/{workspaces} {ci}"
      • Type: String
      -

      Sets the User-Agent request header. The following fields are replaced -with their actual counterparts:

      +

      Sets the User-Agent request header. The following fields are replaced with +their actual counterparts:

      • {npm-version} - The npm version in use
      • {node-version} - The Node.js version in use
      • {platform} - The value of process.platform
      • {arch} - The value of process.arch
      • -
      • {workspaces} - Set to true if the workspaces or workspace -options are set.
      • -
      • {ci} - The value of the ci-name config, if set, prefixed with -ci/, or an empty string if ci-name is empty.
      • +
      • {workspaces} - Set to true if the workspaces or workspace options +are set.
      • +
      • {ci} - The value of the ci-name config, if set, prefixed with ci/, or +an empty string if ci-name is empty.

      userconfig

        @@ -1419,9 +1456,9 @@

        userconfig

      • Type: Path

      The location of user-level configuration settings.

      -

      This may be overridden by the npm_config_userconfig environment -variable or the --userconfig command line option, but may not be -overridden by settings in the globalconfig file.

      +

      This may be overridden by the npm_config_userconfig environment variable +or the --userconfig command line option, but may not be overridden by +settings in the globalconfig file.

      version

      • Default: false
      • @@ -1434,9 +1471,9 @@

        versions

      • Default: false
      • Type: Boolean
      -

      If true, output the npm version as well as node's process.versions -map and the version in the current working directory's package.json -file if one exists, and exit successfully.

      +

      If true, output the npm version as well as node's process.versions map and +the version in the current working directory's package.json file if one +exists, and exit successfully.

      Only relevant when specified explicitly on the command line.

      viewer

        @@ -1444,23 +1481,21 @@

        viewer

      • Type: String

      The program to use to view help content.

      -

      Set to "browser" to view html help content in the default web -browser.

      +

      Set to "browser" to view html help content in the default web browser.

      which

      • Default: null
      • Type: null or Number
      -

      If there are multiple funding sources, which 1-indexed source URL to -open.

      +

      If there are multiple funding sources, which 1-indexed source URL to open.

      workspace

      • Default:
      • Type: String (can be set multiple times)
      -

      Enable running a command in the context of the configured workspaces -of the current project while filtering by running only the workspaces -defined by this configuration option.

      +

      Enable running a command in the context of the configured workspaces of the +current project while filtering by running only the workspaces defined by +this configuration option.

      Valid values for the workspace config are either:

      • Workspace names
      • @@ -1468,9 +1503,9 @@

        workspace

      • Path to a parent workspace directory (will result in selecting all workspaces within that folder)
      -

      When set for the npm init command, this may be set to the folder of -a workspace which does not yet exist, to create the folder and set it -up as a brand new workspace within the project.

      +

      When set for the npm init command, this may be set to the folder of a +workspace which does not yet exist, to create the folder and set it up as a +brand new workspace within the project.

      This value is not exported to the environment for child processes.

      workspaces

        @@ -1479,14 +1514,13 @@

        workspaces

      Set to true to run the command in the context of all configured workspaces.

      -

      Explicitly setting this to false will cause commands like install -to ignore workspaces altogether. When not set explicitly:

      +

      Explicitly setting this to false will cause commands like install to +ignore workspaces altogether. When not set explicitly:

        -
      • Commands that operate on the node_modules tree (install, update, -etc.) will link workspaces into the node_modules folder. - Commands -that do other things (test, exec, publish, etc.) will operate on the -root project, unless one or more workspaces are specified in the -workspace config.
      • +
      • Commands that operate on the node_modules tree (install, update, etc.) +will link workspaces into the node_modules folder. - Commands that do +other things (test, exec, publish, etc.) will operate on the root project, +unless one or more workspaces are specified in the workspace config.

      This value is not exported to the environment for child processes.

      workspaces-update

      @@ -1494,9 +1528,8 @@

      workspaces-update

    • Default: true
    • Type: Boolean
    -

    If set to true, the npm cli will run an update after operations that -may possibly change the workspaces installed to the node_modules -folder.

    +

    If set to true, the npm cli will run an update after operations that may +possibly change the workspaces installed to the node_modules folder.

    yes

    • Default: null
    • @@ -1510,22 +1543,19 @@

      also

    • Type: null, "dev", or "development"
    • DEPRECATED: Please use --include=dev instead.
    -

    When set to dev or development, this is an alias for ---include=dev.

    +

    When set to dev or development, this is an alias for --include=dev.

    cache-max

    • Default: Infinity
    • Type: Number
    • -
    • DEPRECATED: This option has been deprecated in favor of ---prefer-online
    • +
    • DEPRECATED: This option has been deprecated in favor of --prefer-online

    --cache-max=0 is an alias for --prefer-online

    cache-min

    • Default: 0
    • Type: Number
    • -
    • DEPRECATED: This option has been deprecated in favor of ---prefer-offline.
    • +
    • DEPRECATED: This option has been deprecated in favor of --prefer-offline.

    --cache-min=9999 (or bigger) is an alias for --prefer-offline.

    cert

    @@ -1533,13 +1563,13 @@

    cert

  • Default: null
  • Type: null or String
  • DEPRECATED: key and cert are no longer used for most registry -operations. Use registry scoped keyfile and certfile instead. -Example: //other-registry.tld/:keyfile=/path/to/key.pem +operations. Use registry scoped keyfile and certfile instead. Example: +//other-registry.tld/:keyfile=/path/to/key.pem //other-registry.tld/:certfile=/path/to/cert.crt
  • -

    A client certificate to pass when accessing the registry. Values -should be in PEM format (Windows calls it "Base-64 encoded X.509 -(.CER)") with newlines replaced by the string "\n". For example:

    +

    A client certificate to pass when accessing the registry. Values should be +in PEM format (Windows calls it "Base-64 encoded X.509 (.CER)") with +newlines replaced by the string "\n". For example:

    cert="-----BEGIN CERTIFICATE-----\nXXXX\nXXXX\n-----END CERTIFICATE-----"
     

    It is not the path to a certificate file, though you can set a @@ -1559,8 +1589,8 @@

    global-style

  • DEPRECATED: This option has been deprecated in favor of --install-strategy=shallow
  • -

    Only install direct dependencies in the top level node_modules, but -hoist on deeper dependencies. Sets --install-strategy=shallow.

    +

    Only install direct dependencies in the top level node_modules, but hoist +on deeper dependencies. Sets --install-strategy=shallow.

    init.author.email

    • Default: ""
    • @@ -1608,17 +1638,16 @@

      key

    • Default: null
    • Type: null or String
    • DEPRECATED: key and cert are no longer used for most registry -operations. Use registry scoped keyfile and certfile instead. -Example: //other-registry.tld/:keyfile=/path/to/key.pem +operations. Use registry scoped keyfile and certfile instead. Example: +//other-registry.tld/:keyfile=/path/to/key.pem //other-registry.tld/:certfile=/path/to/cert.crt
    -

    A client key to pass when accessing the registry. Values should be in -PEM format with newlines replaced by the string "\n". For example:

    +

    A client key to pass when accessing the registry. Values should be in PEM +format with newlines replaced by the string "\n". For example:

    key="-----BEGIN PRIVATE KEY-----\nXXXX\nXXXX\n-----END PRIVATE KEY-----"
     
    -

    It is not the path to a key file, though you can set a -registry-scoped "keyfile" path like -"//other-registry.tld/:keyfile=/path/to/key.pem".

    +

    It is not the path to a key file, though you can set a registry-scoped +"keyfile" path like "//other-registry.tld/:keyfile=/path/to/key.pem".

    legacy-bundling

    • Default: false
    • @@ -1626,25 +1655,23 @@

      legacy-bundling

    • DEPRECATED: This option has been deprecated in favor of --install-strategy=nested
    -

    Instead of hoisting package installs in node_modules, install -packages in the same manner that they are depended on. This may cause -very deep directory structures and duplicate package installs as -there is no de-duplicating. Sets --install-strategy=nested.

    +

    Instead of hoisting package installs in node_modules, install packages in +the same manner that they are depended on. This may cause very deep +directory structures and duplicate package installs as there is no +de-duplicating. Sets --install-strategy=nested.

    only

    • Default: null
    • Type: null, "prod", or "production"
    • -
    • DEPRECATED: Use --omit=dev to omit dev dependencies from the -install.
    • +
    • DEPRECATED: Use --omit=dev to omit dev dependencies from the install.
    -

    When set to prod or production, this is an alias for ---omit=dev.

    +

    When set to prod or production, this is an alias for --omit=dev.

    optional

    • Default: null
    • Type: null or Boolean
    • -
    • DEPRECATED: Use --omit=optional to exclude optional dependencies, -or --include=optional to include them.
    • +
    • DEPRECATED: Use --omit=optional to exclude optional dependencies, or +--include=optional to include them.

    Default value does install optional deps unless otherwise omitted.

    Alias for --include=optional or --omit=optional

    diff --git a/deps/npm/docs/output/using-npm/dependency-selectors.html b/deps/npm/docs/output/using-npm/dependency-selectors.html index 67ea145085b0b6..a333f55fff5ce7 100644 --- a/deps/npm/docs/output/using-npm/dependency-selectors.html +++ b/deps/npm/docs/output/using-npm/dependency-selectors.html @@ -141,9 +141,9 @@
    -

    +

    Dependency Selector Syntax & Querying - @11.6.2 + @11.6.3

    Dependency Selector Syntax & Querying
    diff --git a/deps/npm/docs/output/using-npm/developers.html b/deps/npm/docs/output/using-npm/developers.html index 41890488eead60..3d33984abd9bee 100644 --- a/deps/npm/docs/output/using-npm/developers.html +++ b/deps/npm/docs/output/using-npm/developers.html @@ -141,9 +141,9 @@
    -

    +

    developers - @11.6.2 + @11.6.3

    Developer Guide
    diff --git a/deps/npm/docs/output/using-npm/logging.html b/deps/npm/docs/output/using-npm/logging.html index b2d76c4b1c54c6..6b33e9df878464 100644 --- a/deps/npm/docs/output/using-npm/logging.html +++ b/deps/npm/docs/output/using-npm/logging.html @@ -141,9 +141,9 @@
    -

    +

    Logging - @11.6.2 + @11.6.3

    Why, What & How We Log
    diff --git a/deps/npm/docs/output/using-npm/orgs.html b/deps/npm/docs/output/using-npm/orgs.html index b998bb01581526..4d791ea11feacf 100644 --- a/deps/npm/docs/output/using-npm/orgs.html +++ b/deps/npm/docs/output/using-npm/orgs.html @@ -141,9 +141,9 @@
    -

    +

    orgs - @11.6.2 + @11.6.3

    Working with Teams & Orgs
    diff --git a/deps/npm/docs/output/using-npm/package-spec.html b/deps/npm/docs/output/using-npm/package-spec.html index 764a2ad3eb4291..a6aae850e60b2e 100644 --- a/deps/npm/docs/output/using-npm/package-spec.html +++ b/deps/npm/docs/output/using-npm/package-spec.html @@ -141,9 +141,9 @@
    -

    +

    package-spec - @11.6.2 + @11.6.3

    Package name specifier
    diff --git a/deps/npm/docs/output/using-npm/registry.html b/deps/npm/docs/output/using-npm/registry.html index 95fe69d0f0e1fb..b658abe719e6b5 100644 --- a/deps/npm/docs/output/using-npm/registry.html +++ b/deps/npm/docs/output/using-npm/registry.html @@ -141,9 +141,9 @@
    -

    +

    registry - @11.6.2 + @11.6.3

    The JavaScript Package Registry
    diff --git a/deps/npm/docs/output/using-npm/removal.html b/deps/npm/docs/output/using-npm/removal.html index 23db6a16ca78d5..8caa2947f58bb8 100644 --- a/deps/npm/docs/output/using-npm/removal.html +++ b/deps/npm/docs/output/using-npm/removal.html @@ -141,9 +141,9 @@
    -

    +

    removal - @11.6.2 + @11.6.3

    Cleaning the Slate
    diff --git a/deps/npm/docs/output/using-npm/scope.html b/deps/npm/docs/output/using-npm/scope.html index a2ff83d6221a24..0d50f0417d40e2 100644 --- a/deps/npm/docs/output/using-npm/scope.html +++ b/deps/npm/docs/output/using-npm/scope.html @@ -141,9 +141,9 @@
    -

    +

    scope - @11.6.2 + @11.6.3

    Scoped packages
    diff --git a/deps/npm/docs/output/using-npm/scripts.html b/deps/npm/docs/output/using-npm/scripts.html index 1e76b658763907..8f8f112be4ccc4 100644 --- a/deps/npm/docs/output/using-npm/scripts.html +++ b/deps/npm/docs/output/using-npm/scripts.html @@ -141,9 +141,9 @@
    -

    +

    scripts - @11.6.2 + @11.6.3

    How npm handles the "scripts" field
    diff --git a/deps/npm/docs/output/using-npm/workspaces.html b/deps/npm/docs/output/using-npm/workspaces.html index f1062e2d28399f..e050cafb0a6ee0 100644 --- a/deps/npm/docs/output/using-npm/workspaces.html +++ b/deps/npm/docs/output/using-npm/workspaces.html @@ -141,9 +141,9 @@
    -

    +

    workspaces - @11.6.2 + @11.6.3

    Working with workspaces
    diff --git a/deps/npm/lib/commands/completion.js b/deps/npm/lib/commands/completion.js index 1a1cb901ee5a0d..ae459aaaf31ce5 100644 --- a/deps/npm/lib/commands/completion.js +++ b/deps/npm/lib/commands/completion.js @@ -164,7 +164,7 @@ class Completion extends BaseCommand { return this.wrap(opts, comps) } } catch { - // it wasnt a valid command, so do nothing + // it wasn't a valid command, so do nothing } } diff --git a/deps/npm/lib/commands/explain.js b/deps/npm/lib/commands/explain.js index 1505b4dbf5e9a4..5f37ba9925f410 100644 --- a/deps/npm/lib/commands/explain.js +++ b/deps/npm/lib/commands/explain.js @@ -92,7 +92,7 @@ class Explain extends ArboristWorkspaceCmd { } // if it's a location, get that node - const maybeLoc = arg.replace(/\\/g, '/').replace(/\/+$/, '') + const maybeLoc = arg.replace(/\\/g, '/').replace(/(? resolve(this.npm.localPrefix, filterArg) diff --git a/deps/npm/lib/commands/token.js b/deps/npm/lib/commands/token.js index fac55d46e0c3bd..9cc04f83e7dd24 100644 --- a/deps/npm/lib/commands/token.js +++ b/deps/npm/lib/commands/token.js @@ -1,14 +1,38 @@ -const { log, output } = require('proc-log') -const { listTokens, createToken, removeToken } = require('npm-profile') +const { log, output, META } = require('proc-log') +const fetch = require('npm-registry-fetch') const { otplease } = require('../utils/auth.js') const readUserInfo = require('../utils/read-user-info.js') const BaseCommand = require('../base-cmd.js') +async function paginate (href, opts, items = []) { + while (href) { + const result = await fetch.json(href, opts) + items = items.concat(result.objects) + href = result.urls.next + } + return items +} + class Token extends BaseCommand { static description = 'Manage your authentication tokens' static name = 'token' - static usage = ['list', 'revoke ', 'create [--read-only] [--cidr=list]'] - static params = ['read-only', 'cidr', 'registry', 'otp'] + static usage = ['list', 'revoke ', 'create --name= [--token-description=] [--packages=] [--packages-all] [--scopes=] [--orgs=] [--packages-and-scopes-permission=] [--orgs-permission=] [--expires=] [--cidr=] [--bypass-2fa] [--password=]'] + static params = ['name', + 'token-description', + 'expires', + 'packages', + 'packages-all', + 'scopes', + 'orgs', + 'packages-and-scopes-permission', + 'orgs-permission', + 'cidr', + 'bypass-2fa', + 'password', + 'registry', + 'otp', + 'read-only', + ] static async completion (opts) { const argv = opts.conf.argv.remain @@ -48,7 +72,7 @@ class Token extends BaseCommand { const json = this.npm.config.get('json') const parseable = this.npm.config.get('parseable') log.info('token', 'getting list') - const tokens = await listTokens(this.npm.flatOptions) + const tokens = await paginate('/-/npm/v1/tokens', this.npm.flatOptions) if (json) { output.buffer(tokens) return @@ -89,10 +113,9 @@ class Token extends BaseCommand { const json = this.npm.config.get('json') const parseable = this.npm.config.get('parseable') const toRemove = [] - const opts = { ...this.npm.flatOptions } log.info('token', `removing ${toRemove.length} tokens`) - const tokens = await listTokens(opts) - args.forEach(id => { + const tokens = await paginate('/-/npm/v1/tokens', this.npm.flatOptions) + for (const id of args) { const matches = tokens.filter(token => token.key.indexOf(id) === 0) if (matches.length === 1) { toRemove.push(matches[0].key) @@ -108,12 +131,16 @@ class Token extends BaseCommand { toRemove.push(id) } - }) - await Promise.all( - toRemove.map(key => { - return otplease(this.npm, opts, c => removeToken(key, c)) - }) - ) + } + for (const tokenKey of toRemove) { + await otplease(this.npm, this.npm.flatOptions, opts => + fetch(`/-/npm/v1/tokens/token/${tokenKey}`, { + ...opts, + method: 'DELETE', + ignoreBody: true, + }) + ) + } if (json) { output.buffer(toRemove) } else if (parseable) { @@ -127,15 +154,74 @@ class Token extends BaseCommand { const json = this.npm.config.get('json') const parseable = this.npm.config.get('parseable') const cidr = this.npm.config.get('cidr') - const readonly = this.npm.config.get('read-only') + const name = this.npm.config.get('name') + const tokenDescription = this.npm.config.get('token-description') + const expires = this.npm.config.get('expires') + const packages = this.npm.config.get('packages') + const packagesAll = this.npm.config.get('packages-all') + const scopes = this.npm.config.get('scopes') + const orgs = this.npm.config.get('orgs') + const packagesAndScopesPermission = this.npm.config.get('packages-and-scopes-permission') + const orgsPermission = this.npm.config.get('orgs-permission') + const bypassTwoFactor = this.npm.config.get('bypass-2fa') + let password = this.npm.config.get('password') const validCIDR = await this.validateCIDRList(cidr) - const password = await readUserInfo.password() + + /* istanbul ignore if - skip testing read input */ + if (!password) { + password = await readUserInfo.password() + } + + const tokenData = { + name: name, + password: password, + } + + if (tokenDescription) { + tokenData.description = tokenDescription + } + + if (packages?.length > 0) { + tokenData.packages = packages + } + if (packagesAll) { + tokenData.packages_all = true + } + if (scopes?.length > 0) { + tokenData.scopes = scopes + } + if (orgs?.length > 0) { + tokenData.orgs = orgs + } + + if (packagesAndScopesPermission) { + tokenData.packages_and_scopes_permission = packagesAndScopesPermission + } + if (orgsPermission) { + tokenData.orgs_permission = orgsPermission + } + + // Add expiration in days + if (expires) { + tokenData.expires = parseInt(expires, 10) + } + + // Add optional fields + if (validCIDR?.length > 0) { + tokenData.cidr_whitelist = validCIDR + } + if (bypassTwoFactor) { + tokenData.bypass_2fa = true + } + log.info('token', 'creating') - const result = await otplease( - this.npm, - { ...this.npm.flatOptions }, - c => createToken(password, readonly, validCIDR, c) + const result = await otplease(this.npm, this.npm.flatOptions, opts => + fetch.json('/-/npm/v1/tokens', { + ...opts, + method: 'POST', + body: tokenData, + }) ) delete result.key delete result.updated @@ -145,12 +231,16 @@ class Token extends BaseCommand { Object.keys(result).forEach(k => output.standard(k + '\t' + result[k])) } else { const chalk = this.npm.chalk - // Identical to list - const level = result.readonly ? 'read only' : 'publish' - output.standard(`Created ${chalk.blue(level)} token ${result.token}`) + // Display based on access level + // Identical to list? XXX + const level = result.access === 'read-only' || result.readonly ? 'read only' : 'publish' + output.standard(`Created ${chalk.blue(level)} token ${result.token}`, { [META]: true, redact: false }) if (result.cidr_whitelist?.length) { output.standard(`with IP whitelist: ${chalk.green(result.cidr_whitelist.join(','))}`) } + if (result.expires) { + output.standard(`expires: ${result.expires}`) + } } } @@ -180,7 +270,7 @@ class Token extends BaseCommand { for (const cidr of list) { if (isCidrV6(cidr)) { throw this.invalidCIDRError( - `CIDR whitelist can only contain IPv4 addresses${cidr} is IPv6` + `CIDR whitelist can only contain IPv4 addresses, ${cidr} is IPv6` ) } diff --git a/deps/npm/lib/commands/version.js b/deps/npm/lib/commands/version.js index 1d1a6753c70de1..fe70322fd7cb9c 100644 --- a/deps/npm/lib/commands/version.js +++ b/deps/npm/lib/commands/version.js @@ -13,10 +13,12 @@ class Version extends BaseCommand { 'json', 'preid', 'sign-git-tag', + 'save', 'workspace', 'workspaces', 'workspaces-update', 'include-workspace-root', + 'ignore-scripts', ] static workspaces = true diff --git a/deps/npm/lib/utils/error-message.js b/deps/npm/lib/utils/error-message.js index 4fc14c92c17a98..578bcc82287de2 100644 --- a/deps/npm/lib/utils/error-message.js +++ b/deps/npm/lib/utils/error-message.js @@ -301,7 +301,7 @@ const errorMessage = (er, npm) => { 'Not compatible with your version of node/npm: ' + er.pkgid, 'Required: ' + JSON.stringify(er.required), 'Actual: ' + - JSON.stringify({ npm: npm.version, node: process.version }), + JSON.stringify({ node: process.version, npm: npm.version }), ].join('\n')]) break diff --git a/deps/npm/man/man1/npm-access.1 b/deps/npm/man/man1/npm-access.1 index 8165aa386bd0d9..52a667c9847687 100644 --- a/deps/npm/man/man1/npm-access.1 +++ b/deps/npm/man/man1/npm-access.1 @@ -1,4 +1,4 @@ -.TH "NPM-ACCESS" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-ACCESS" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-access\fR - Set access level on published packages .SS "Synopsis" @@ -77,8 +77,7 @@ Type: null or String .RE 0 .P -This is a one-time password from a two-factor authenticator. It's needed when publishing or changing package permissions with \fBnpm -access\fR. +This is a one-time password from a two-factor authenticator. It's needed when publishing or changing package permissions with \fBnpm access\fR. .P If not set, and a registry response fails with a challenge for a one-time password, npm will prompt on the command line for one. .SS "\fBregistry\fR" diff --git a/deps/npm/man/man1/npm-adduser.1 b/deps/npm/man/man1/npm-adduser.1 index 9435eb6f819788..16daea9418cc3b 100644 --- a/deps/npm/man/man1/npm-adduser.1 +++ b/deps/npm/man/man1/npm-adduser.1 @@ -1,4 +1,4 @@ -.TH "NPM-ADDUSER" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-ADDUSER" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-adduser\fR - Add a registry user account .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-audit.1 b/deps/npm/man/man1/npm-audit.1 index 70e8b778937a12..f5379fd10a8d49 100644 --- a/deps/npm/man/man1/npm-audit.1 +++ b/deps/npm/man/man1/npm-audit.1 @@ -1,4 +1,4 @@ -.TH "NPM-AUDIT" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-AUDIT" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-audit\fR - Run a security audit .SS "Synopsis" @@ -368,8 +368,7 @@ Type: Boolean .P If true, npm does not run scripts specified in package.json files. .P -Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm -run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. .SS "\fBworkspace\fR" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-bugs.1 b/deps/npm/man/man1/npm-bugs.1 index 72053050d6e14f..f7eb770fb44200 100644 --- a/deps/npm/man/man1/npm-bugs.1 +++ b/deps/npm/man/man1/npm-bugs.1 @@ -1,4 +1,4 @@ -.TH "NPM-BUGS" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-BUGS" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-bugs\fR - Report bugs for a package in a web browser .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-cache.1 b/deps/npm/man/man1/npm-cache.1 index 41a41ba928e1ed..573907f8b308f6 100644 --- a/deps/npm/man/man1/npm-cache.1 +++ b/deps/npm/man/man1/npm-cache.1 @@ -1,4 +1,4 @@ -.TH "NPM-CACHE" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-CACHE" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-cache\fR - Manipulates packages cache .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-ci.1 b/deps/npm/man/man1/npm-ci.1 index 87ae6170434e39..ed11ab54ed4499 100644 --- a/deps/npm/man/man1/npm-ci.1 +++ b/deps/npm/man/man1/npm-ci.1 @@ -1,4 +1,4 @@ -.TH "NPM-CI" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-CI" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-ci\fR - Clean install a project .SS "Synopsis" @@ -167,8 +167,7 @@ Type: Boolean .P If true, npm does not run scripts specified in package.json files. .P -Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm -run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. .SS "\fBaudit\fR" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-completion.1 b/deps/npm/man/man1/npm-completion.1 index 06e58655c486d5..09e3965d4641c8 100644 --- a/deps/npm/man/man1/npm-completion.1 +++ b/deps/npm/man/man1/npm-completion.1 @@ -1,4 +1,4 @@ -.TH "NPM-COMPLETION" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-COMPLETION" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-completion\fR - Tab Completion for npm .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-config.1 b/deps/npm/man/man1/npm-config.1 index 17f27ea10b5f71..4e9b5136fadf7c 100644 --- a/deps/npm/man/man1/npm-config.1 +++ b/deps/npm/man/man1/npm-config.1 @@ -1,4 +1,4 @@ -.TH "NPM-CONFIG" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-CONFIG" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-config\fR - Manage the npm configuration files .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-dedupe.1 b/deps/npm/man/man1/npm-dedupe.1 index 10472a8aa93446..1154b0f4603ad3 100644 --- a/deps/npm/man/man1/npm-dedupe.1 +++ b/deps/npm/man/man1/npm-dedupe.1 @@ -1,4 +1,4 @@ -.TH "NPM-DEDUPE" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-DEDUPE" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-dedupe\fR - Reduce duplication in the package tree .SS "Synopsis" @@ -164,8 +164,7 @@ Type: Boolean .P If true, npm does not run scripts specified in package.json files. .P -Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm -run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. .SS "\fBaudit\fR" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-deprecate.1 b/deps/npm/man/man1/npm-deprecate.1 index 871577b872385f..50e36d9c989420 100644 --- a/deps/npm/man/man1/npm-deprecate.1 +++ b/deps/npm/man/man1/npm-deprecate.1 @@ -1,4 +1,4 @@ -.TH "NPM-DEPRECATE" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-DEPRECATE" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-deprecate\fR - Deprecate a version of a package .SS "Synopsis" @@ -55,8 +55,7 @@ Type: null or String .RE 0 .P -This is a one-time password from a two-factor authenticator. It's needed when publishing or changing package permissions with \fBnpm -access\fR. +This is a one-time password from a two-factor authenticator. It's needed when publishing or changing package permissions with \fBnpm access\fR. .P If not set, and a registry response fails with a challenge for a one-time password, npm will prompt on the command line for one. .SS "\fBdry-run\fR" diff --git a/deps/npm/man/man1/npm-diff.1 b/deps/npm/man/man1/npm-diff.1 index a1f2b5f2e38c78..7949ae477b6ad4 100644 --- a/deps/npm/man/man1/npm-diff.1 +++ b/deps/npm/man/man1/npm-diff.1 @@ -1,4 +1,4 @@ -.TH "NPM-DIFF" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-DIFF" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-diff\fR - The registry diff command .SS "Synopsis" @@ -233,8 +233,8 @@ Type: String .P If you ask npm to install a package and don't tell it a specific version, then it will install the specified tag. .P -It is the tag added to the package@version specified in the \fBnpm -dist-tag add\fR command, if no explicit tag is given. +It is the tag added to the package@version specified in the \fBnpm dist-tag +add\fR command, if no explicit tag is given. .P When used by the \fBnpm diff\fR command, this is the tag used to fetch the tarball that will be compared with the local files by default. .P diff --git a/deps/npm/man/man1/npm-dist-tag.1 b/deps/npm/man/man1/npm-dist-tag.1 index 6defc97bdfe2af..6417845460e3d3 100644 --- a/deps/npm/man/man1/npm-dist-tag.1 +++ b/deps/npm/man/man1/npm-dist-tag.1 @@ -1,4 +1,4 @@ -.TH "NPM-DIST-TAG" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-DIST-TAG" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-dist-tag\fR - Modify package distribution tags .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-docs.1 b/deps/npm/man/man1/npm-docs.1 index 602888e1d713f1..d07b611895c9e0 100644 --- a/deps/npm/man/man1/npm-docs.1 +++ b/deps/npm/man/man1/npm-docs.1 @@ -1,4 +1,4 @@ -.TH "NPM-DOCS" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-DOCS" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-docs\fR - Open documentation for a package in a web browser .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-doctor.1 b/deps/npm/man/man1/npm-doctor.1 index 1f5f653bbf5ad5..e38807ad2c0dd5 100644 --- a/deps/npm/man/man1/npm-doctor.1 +++ b/deps/npm/man/man1/npm-doctor.1 @@ -1,4 +1,4 @@ -.TH "NPM-DOCTOR" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-DOCTOR" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-doctor\fR - Check the health of your npm environment .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-edit.1 b/deps/npm/man/man1/npm-edit.1 index 19d5c537d889f6..5f815c8ddd59f6 100644 --- a/deps/npm/man/man1/npm-edit.1 +++ b/deps/npm/man/man1/npm-edit.1 @@ -1,4 +1,4 @@ -.TH "NPM-EDIT" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-EDIT" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-edit\fR - Edit an installed package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-exec.1 b/deps/npm/man/man1/npm-exec.1 index d6b3d384eae666..072d60ebe39f91 100644 --- a/deps/npm/man/man1/npm-exec.1 +++ b/deps/npm/man/man1/npm-exec.1 @@ -1,4 +1,4 @@ -.TH "NPM-EXEC" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-EXEC" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-exec\fR - Run a command from a local or remote npm package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-explain.1 b/deps/npm/man/man1/npm-explain.1 index 88f209f5ddc1b5..be2d0d9bcd9a3e 100644 --- a/deps/npm/man/man1/npm-explain.1 +++ b/deps/npm/man/man1/npm-explain.1 @@ -1,4 +1,4 @@ -.TH "NPM-EXPLAIN" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-EXPLAIN" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-explain\fR - Explain installed packages .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-explore.1 b/deps/npm/man/man1/npm-explore.1 index b91eb6dbee5cc9..1d38e872498638 100644 --- a/deps/npm/man/man1/npm-explore.1 +++ b/deps/npm/man/man1/npm-explore.1 @@ -1,4 +1,4 @@ -.TH "NPM-EXPLORE" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-EXPLORE" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-explore\fR - Browse an installed package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-find-dupes.1 b/deps/npm/man/man1/npm-find-dupes.1 index 2373a842661e3e..5b59f2b70ff2f6 100644 --- a/deps/npm/man/man1/npm-find-dupes.1 +++ b/deps/npm/man/man1/npm-find-dupes.1 @@ -1,4 +1,4 @@ -.TH "NPM-FIND-DUPES" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-FIND-DUPES" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-find-dupes\fR - Find duplication in the package tree .SS "Synopsis" @@ -111,8 +111,7 @@ Type: Boolean .P If true, npm does not run scripts specified in package.json files. .P -Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm -run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. .SS "\fBaudit\fR" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-fund.1 b/deps/npm/man/man1/npm-fund.1 index 58eb3cd3577615..ebed13a09c88e9 100644 --- a/deps/npm/man/man1/npm-fund.1 +++ b/deps/npm/man/man1/npm-fund.1 @@ -1,4 +1,4 @@ -.TH "NPM-FUND" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-FUND" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-fund\fR - Retrieve funding information .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-help-search.1 b/deps/npm/man/man1/npm-help-search.1 index 94c7dc9e7b8b2a..14133d023ad663 100644 --- a/deps/npm/man/man1/npm-help-search.1 +++ b/deps/npm/man/man1/npm-help-search.1 @@ -1,4 +1,4 @@ -.TH "NPM-HELP-SEARCH" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-HELP-SEARCH" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-help-search\fR - Search npm help documentation .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-help.1 b/deps/npm/man/man1/npm-help.1 index 0f07f5a9582fd1..c1141b6383e136 100644 --- a/deps/npm/man/man1/npm-help.1 +++ b/deps/npm/man/man1/npm-help.1 @@ -1,4 +1,4 @@ -.TH "NPM-HELP" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-HELP" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-help\fR - Get help on npm .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-init.1 b/deps/npm/man/man1/npm-init.1 index 322cd28ccbb29f..ba6f4474ed5018 100644 --- a/deps/npm/man/man1/npm-init.1 +++ b/deps/npm/man/man1/npm-init.1 @@ -1,4 +1,4 @@ -.TH "NPM-INIT" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-INIT" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-init\fR - Create a package.json file .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-install-ci-test.1 b/deps/npm/man/man1/npm-install-ci-test.1 index 035b5c073523de..2273c50a7be872 100644 --- a/deps/npm/man/man1/npm-install-ci-test.1 +++ b/deps/npm/man/man1/npm-install-ci-test.1 @@ -1,4 +1,4 @@ -.TH "NPM-INSTALL-CI-TEST" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-INSTALL-CI-TEST" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-install-ci-test\fR - Install a project with a clean slate and run tests .SS "Synopsis" @@ -115,8 +115,7 @@ Type: Boolean .P If true, npm does not run scripts specified in package.json files. .P -Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm -run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. .SS "\fBaudit\fR" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-install-test.1 b/deps/npm/man/man1/npm-install-test.1 index fe6ae37b386184..ea527d0024ab96 100644 --- a/deps/npm/man/man1/npm-install-test.1 +++ b/deps/npm/man/man1/npm-install-test.1 @@ -1,4 +1,4 @@ -.TH "NPM-INSTALL-TEST" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-INSTALL-TEST" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-install-test\fR - Install package(s) and run tests .SS "Synopsis" @@ -192,8 +192,7 @@ Type: Boolean .P If true, npm does not run scripts specified in package.json files. .P -Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm -run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. .SS "\fBaudit\fR" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-install.1 b/deps/npm/man/man1/npm-install.1 index b90459ae8ce71a..8a9eef28d3ddea 100644 --- a/deps/npm/man/man1/npm-install.1 +++ b/deps/npm/man/man1/npm-install.1 @@ -1,4 +1,4 @@ -.TH "NPM-INSTALL" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-INSTALL" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-install\fR - Install a package .SS "Synopsis" @@ -553,8 +553,7 @@ Type: Boolean .P If true, npm does not run scripts specified in package.json files. .P -Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm -run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. .SS "\fBaudit\fR" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-link.1 b/deps/npm/man/man1/npm-link.1 index 9850cd544a93d8..7ffea61ec64e6e 100644 --- a/deps/npm/man/man1/npm-link.1 +++ b/deps/npm/man/man1/npm-link.1 @@ -1,4 +1,4 @@ -.TH "NPM-LINK" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-LINK" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-link\fR - Symlink a package folder .SS "Synopsis" @@ -223,8 +223,7 @@ Type: Boolean .P If true, npm does not run scripts specified in package.json files. .P -Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm -run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. .SS "\fBaudit\fR" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-login.1 b/deps/npm/man/man1/npm-login.1 index de24dae466d3ac..fb57066b2f74ad 100644 --- a/deps/npm/man/man1/npm-login.1 +++ b/deps/npm/man/man1/npm-login.1 @@ -1,4 +1,4 @@ -.TH "NPM-LOGIN" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-LOGIN" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-login\fR - Login to a registry user account .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-logout.1 b/deps/npm/man/man1/npm-logout.1 index 7d7624bbea3f25..a9ec065ca92591 100644 --- a/deps/npm/man/man1/npm-logout.1 +++ b/deps/npm/man/man1/npm-logout.1 @@ -1,4 +1,4 @@ -.TH "NPM-LOGOUT" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-LOGOUT" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-logout\fR - Log out of the registry .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-ls.1 b/deps/npm/man/man1/npm-ls.1 index 88858109203301..a0eca71370bb45 100644 --- a/deps/npm/man/man1/npm-ls.1 +++ b/deps/npm/man/man1/npm-ls.1 @@ -1,4 +1,4 @@ -.TH "NPM-LS" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-LS" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-ls\fR - List installed packages .SS "Synopsis" @@ -20,7 +20,7 @@ Positional arguments are \fBname@version-range\fR identifiers, which will limit .P .RS 2 .nf -npm@11.6.2 /path/to/npm +npm@11.6.3 /path/to/npm └─┬ init-package-json@0.0.4 └── promzard@0.1.5 .fi diff --git a/deps/npm/man/man1/npm-org.1 b/deps/npm/man/man1/npm-org.1 index 56f6f269509a97..e94126b1b20c15 100644 --- a/deps/npm/man/man1/npm-org.1 +++ b/deps/npm/man/man1/npm-org.1 @@ -1,4 +1,4 @@ -.TH "NPM-ORG" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-ORG" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-org\fR - Manage orgs .SS "Synopsis" @@ -86,8 +86,7 @@ Type: null or String .RE 0 .P -This is a one-time password from a two-factor authenticator. It's needed when publishing or changing package permissions with \fBnpm -access\fR. +This is a one-time password from a two-factor authenticator. It's needed when publishing or changing package permissions with \fBnpm access\fR. .P If not set, and a registry response fails with a challenge for a one-time password, npm will prompt on the command line for one. .SS "\fBjson\fR" diff --git a/deps/npm/man/man1/npm-outdated.1 b/deps/npm/man/man1/npm-outdated.1 index 5e715d6bf25b34..eba7b06ae0a986 100644 --- a/deps/npm/man/man1/npm-outdated.1 +++ b/deps/npm/man/man1/npm-outdated.1 @@ -1,4 +1,4 @@ -.TH "NPM-OUTDATED" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-OUTDATED" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-outdated\fR - Check for outdated packages .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-owner.1 b/deps/npm/man/man1/npm-owner.1 index 0e51922629f3ce..0472c9e894a3d6 100644 --- a/deps/npm/man/man1/npm-owner.1 +++ b/deps/npm/man/man1/npm-owner.1 @@ -1,4 +1,4 @@ -.TH "NPM-OWNER" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-OWNER" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-owner\fR - Manage package owners .SS "Synopsis" @@ -48,8 +48,7 @@ Type: null or String .RE 0 .P -This is a one-time password from a two-factor authenticator. It's needed when publishing or changing package permissions with \fBnpm -access\fR. +This is a one-time password from a two-factor authenticator. It's needed when publishing or changing package permissions with \fBnpm access\fR. .P If not set, and a registry response fails with a challenge for a one-time password, npm will prompt on the command line for one. .SS "\fBworkspace\fR" diff --git a/deps/npm/man/man1/npm-pack.1 b/deps/npm/man/man1/npm-pack.1 index 52d7feb68d94d5..8c4f204f02dea5 100644 --- a/deps/npm/man/man1/npm-pack.1 +++ b/deps/npm/man/man1/npm-pack.1 @@ -1,4 +1,4 @@ -.TH "NPM-PACK" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-PACK" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-pack\fR - Create a tarball from a package .SS "Synopsis" @@ -117,8 +117,7 @@ Type: Boolean .P If true, npm does not run scripts specified in package.json files. .P -Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm -run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. .SS "Description" .P For anything that's installable (that is, a package folder, tarball, tarball url, git url, name@tag, name@version, name, or scoped name), this command will fetch it to the cache, copy the tarball to the current working directory as \fB-.tgz\fR, and then write the filenames out to stdout. diff --git a/deps/npm/man/man1/npm-ping.1 b/deps/npm/man/man1/npm-ping.1 index 7a686e9fff0539..28d50e2c71f06d 100644 --- a/deps/npm/man/man1/npm-ping.1 +++ b/deps/npm/man/man1/npm-ping.1 @@ -1,4 +1,4 @@ -.TH "NPM-PING" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-PING" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-ping\fR - Ping npm registry .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-pkg.1 b/deps/npm/man/man1/npm-pkg.1 index 4940be8a413210..37f28fcc0592e5 100644 --- a/deps/npm/man/man1/npm-pkg.1 +++ b/deps/npm/man/man1/npm-pkg.1 @@ -1,4 +1,4 @@ -.TH "NPM-PKG" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-PKG" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-pkg\fR - Manages your package.json .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-prefix.1 b/deps/npm/man/man1/npm-prefix.1 index b0c93b019644fd..d0270d8ad8f6ae 100644 --- a/deps/npm/man/man1/npm-prefix.1 +++ b/deps/npm/man/man1/npm-prefix.1 @@ -1,4 +1,4 @@ -.TH "NPM-PREFIX" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-PREFIX" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-prefix\fR - Display prefix .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-profile.1 b/deps/npm/man/man1/npm-profile.1 index 0e53039daf0625..017953fc4364ef 100644 --- a/deps/npm/man/man1/npm-profile.1 +++ b/deps/npm/man/man1/npm-profile.1 @@ -1,4 +1,4 @@ -.TH "NPM-PROFILE" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-PROFILE" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-profile\fR - Change settings on your registry profile .SS "Synopsis" @@ -104,8 +104,7 @@ Type: null or String .RE 0 .P -This is a one-time password from a two-factor authenticator. It's needed when publishing or changing package permissions with \fBnpm -access\fR. +This is a one-time password from a two-factor authenticator. It's needed when publishing or changing package permissions with \fBnpm access\fR. .P If not set, and a registry response fails with a challenge for a one-time password, npm will prompt on the command line for one. .SS "See Also" diff --git a/deps/npm/man/man1/npm-prune.1 b/deps/npm/man/man1/npm-prune.1 index 8f139fd2f4df9c..f43ee8b687b20e 100644 --- a/deps/npm/man/man1/npm-prune.1 +++ b/deps/npm/man/man1/npm-prune.1 @@ -1,4 +1,4 @@ -.TH "NPM-PRUNE" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-PRUNE" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-prune\fR - Remove extraneous packages .SS "Synopsis" @@ -104,8 +104,7 @@ Type: Boolean .P If true, npm does not run scripts specified in package.json files. .P -Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm -run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. .SS "\fBworkspace\fR" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-publish.1 b/deps/npm/man/man1/npm-publish.1 index 96be016f9fdacf..b93c07e0563633 100644 --- a/deps/npm/man/man1/npm-publish.1 +++ b/deps/npm/man/man1/npm-publish.1 @@ -1,4 +1,4 @@ -.TH "NPM-PUBLISH" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-PUBLISH" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-publish\fR - Publish a package .SS "Synopsis" @@ -11,6 +11,39 @@ npm publish .SS "Description" .P Publishes a package to the registry so that it can be installed by name. +.SS "Examples" +.P +Publish the package in the current directory: +.P +.RS 2 +.nf +npm publish +.fi +.RE +.P +Publish a specific workspace: +.P +.RS 2 +.nf +npm publish --workspace= +.fi +.RE +.P +Publish multiple workspaces: +.P +.RS 2 +.nf +npm publish --workspace=workspace-a --workspace=workspace-b +.fi +.RE +.P +Publish all workspaces: +.P +.RS 2 +.nf +npm publish --workspaces +.fi +.RE .P By default npm will publish to the public registry. This can be overridden by specifying a different default registry or using a npm help scope in the name, combined with a scope-configured registry (see \fB\[rs]fBpackage.json\[rs]fR\fR \fI\(la/configuring-npm/package-json\(ra\fR). .P @@ -74,8 +107,8 @@ Type: String .P If you ask npm to install a package and don't tell it a specific version, then it will install the specified tag. .P -It is the tag added to the package@version specified in the \fBnpm -dist-tag add\fR command, if no explicit tag is given. +It is the tag added to the package@version specified in the \fBnpm dist-tag +add\fR command, if no explicit tag is given. .P When used by the \fBnpm diff\fR command, this is the tag used to fetch the tarball that will be compared with the local files by default. .P @@ -93,7 +126,8 @@ If you do not want your scoped package to be publicly viewable (and installable) .P Unscoped packages cannot be set to \fBrestricted\fR. .P -Note: This defaults to not changing the current access level for existing packages. Specifying a value of \fBrestricted\fR or \fBpublic\fR during publish will change the access for an existing package the same way that \fBnpm access set status\fR would. +Note: This defaults to not changing the current access level for existing packages. Specifying a value of \fBrestricted\fR or \fBpublic\fR during publish will change the access for an existing package the same way that \fBnpm access set +status\fR would. .SS "\fBdry-run\fR" .RS 0 .IP \(bu 4 @@ -115,8 +149,7 @@ Type: null or String .RE 0 .P -This is a one-time password from a two-factor authenticator. It's needed when publishing or changing package permissions with \fBnpm -access\fR. +This is a one-time password from a two-factor authenticator. It's needed when publishing or changing package permissions with \fBnpm access\fR. .P If not set, and a registry response fails with a challenge for a one-time password, npm will prompt on the command line for one. .SS "\fBworkspace\fR" diff --git a/deps/npm/man/man1/npm-query.1 b/deps/npm/man/man1/npm-query.1 index 7e626c7f1d4a6a..1fbd15c4308fcf 100644 --- a/deps/npm/man/man1/npm-query.1 +++ b/deps/npm/man/man1/npm-query.1 @@ -1,4 +1,4 @@ -.TH "NPM-QUERY" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-QUERY" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-query\fR - Dependency selector query .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-rebuild.1 b/deps/npm/man/man1/npm-rebuild.1 index dcd4dfb91210d9..da9c7600a41a6b 100644 --- a/deps/npm/man/man1/npm-rebuild.1 +++ b/deps/npm/man/man1/npm-rebuild.1 @@ -1,4 +1,4 @@ -.TH "NPM-REBUILD" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-REBUILD" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-rebuild\fR - Rebuild a package .SS "Synopsis" @@ -100,8 +100,7 @@ Type: Boolean .P If true, npm does not run scripts specified in package.json files. .P -Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm -run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. .SS "\fBworkspace\fR" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-repo.1 b/deps/npm/man/man1/npm-repo.1 index 634e6358838e0c..682757d6c506ce 100644 --- a/deps/npm/man/man1/npm-repo.1 +++ b/deps/npm/man/man1/npm-repo.1 @@ -1,4 +1,4 @@ -.TH "NPM-REPO" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-REPO" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-repo\fR - Open package repository page in the browser .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-restart.1 b/deps/npm/man/man1/npm-restart.1 index 837fffcfd05d92..11a4f1502ae1a8 100644 --- a/deps/npm/man/man1/npm-restart.1 +++ b/deps/npm/man/man1/npm-restart.1 @@ -1,4 +1,4 @@ -.TH "NPM-RESTART" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-RESTART" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-restart\fR - Restart a package .SS "Synopsis" @@ -55,8 +55,7 @@ Type: Boolean .P If true, npm does not run scripts specified in package.json files. .P -Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm -run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. .SS "\fBscript-shell\fR" .RS 0 .IP \(bu 4 @@ -66,7 +65,8 @@ Type: null or String .RE 0 .P -The shell to use for scripts run with the \fBnpm exec\fR, \fBnpm run\fR and \fBnpm init \fR commands. +The shell to use for scripts run with the \fBnpm exec\fR, \fBnpm run\fR and \fBnpm +init \fR commands. .SS "See Also" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-root.1 b/deps/npm/man/man1/npm-root.1 index 97d5c3f868dc06..70dd8b1e31ea1b 100644 --- a/deps/npm/man/man1/npm-root.1 +++ b/deps/npm/man/man1/npm-root.1 @@ -1,4 +1,4 @@ -.TH "NPM-ROOT" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-ROOT" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-root\fR - Display npm root .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-run.1 b/deps/npm/man/man1/npm-run.1 index a1834d3d2bc2df..0a005689055d29 100644 --- a/deps/npm/man/man1/npm-run.1 +++ b/deps/npm/man/man1/npm-run.1 @@ -1,4 +1,4 @@ -.TH "NPM-RUN" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-RUN" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-run\fR - Run arbitrary package scripts .SS "Synopsis" @@ -191,8 +191,7 @@ Type: Boolean .P If true, npm does not run scripts specified in package.json files. .P -Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm -run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. .SS "\fBforeground-scripts\fR" .RS 0 .IP \(bu 4 @@ -214,7 +213,8 @@ Type: null or String .RE 0 .P -The shell to use for scripts run with the \fBnpm exec\fR, \fBnpm run\fR and \fBnpm init \fR commands. +The shell to use for scripts run with the \fBnpm exec\fR, \fBnpm run\fR and \fBnpm +init \fR commands. .SS "See Also" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-sbom.1 b/deps/npm/man/man1/npm-sbom.1 index 11212d9653b5b0..16bee1a5dae39d 100644 --- a/deps/npm/man/man1/npm-sbom.1 +++ b/deps/npm/man/man1/npm-sbom.1 @@ -1,4 +1,4 @@ -.TH "NPM-SBOM" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-SBOM" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-sbom\fR - Generate a Software Bill of Materials (SBOM) .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-search.1 b/deps/npm/man/man1/npm-search.1 index 0fb57fafd4512e..fc0030a854141f 100644 --- a/deps/npm/man/man1/npm-search.1 +++ b/deps/npm/man/man1/npm-search.1 @@ -1,4 +1,4 @@ -.TH "NPM-SEARCH" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-SEARCH" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-search\fR - Search for packages .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-shrinkwrap.1 b/deps/npm/man/man1/npm-shrinkwrap.1 index c47c6b76bc0e8a..683ec9374f3505 100644 --- a/deps/npm/man/man1/npm-shrinkwrap.1 +++ b/deps/npm/man/man1/npm-shrinkwrap.1 @@ -1,4 +1,4 @@ -.TH "NPM-SHRINKWRAP" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-SHRINKWRAP" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-shrinkwrap\fR - Lock down dependency versions for publication .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-star.1 b/deps/npm/man/man1/npm-star.1 index 2f137195aa92c7..063c07ab838ed6 100644 --- a/deps/npm/man/man1/npm-star.1 +++ b/deps/npm/man/man1/npm-star.1 @@ -1,4 +1,4 @@ -.TH "NPM-STAR" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-STAR" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-star\fR - Mark your favorite packages .SS "Synopsis" @@ -56,8 +56,7 @@ Type: null or String .RE 0 .P -This is a one-time password from a two-factor authenticator. It's needed when publishing or changing package permissions with \fBnpm -access\fR. +This is a one-time password from a two-factor authenticator. It's needed when publishing or changing package permissions with \fBnpm access\fR. .P If not set, and a registry response fails with a challenge for a one-time password, npm will prompt on the command line for one. .SS "See Also" diff --git a/deps/npm/man/man1/npm-stars.1 b/deps/npm/man/man1/npm-stars.1 index 8c0533aadfb997..656d82a3b9bfc6 100644 --- a/deps/npm/man/man1/npm-stars.1 +++ b/deps/npm/man/man1/npm-stars.1 @@ -1,4 +1,4 @@ -.TH "NPM-STARS" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-STARS" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-stars\fR - View packages marked as favorites .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-start.1 b/deps/npm/man/man1/npm-start.1 index c9c55e4ec6ee3c..3bc7bb47d1911b 100644 --- a/deps/npm/man/man1/npm-start.1 +++ b/deps/npm/man/man1/npm-start.1 @@ -1,4 +1,4 @@ -.TH "NPM-START" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-START" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-start\fR - Start a package .SS "Synopsis" @@ -52,8 +52,7 @@ Type: Boolean .P If true, npm does not run scripts specified in package.json files. .P -Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm -run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. .SS "\fBscript-shell\fR" .RS 0 .IP \(bu 4 @@ -63,7 +62,8 @@ Type: null or String .RE 0 .P -The shell to use for scripts run with the \fBnpm exec\fR, \fBnpm run\fR and \fBnpm init \fR commands. +The shell to use for scripts run with the \fBnpm exec\fR, \fBnpm run\fR and \fBnpm +init \fR commands. .SS "See Also" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-stop.1 b/deps/npm/man/man1/npm-stop.1 index da49dd07de80a6..5b870c5cb25d29 100644 --- a/deps/npm/man/man1/npm-stop.1 +++ b/deps/npm/man/man1/npm-stop.1 @@ -1,4 +1,4 @@ -.TH "NPM-STOP" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-STOP" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-stop\fR - Stop a package .SS "Synopsis" @@ -48,8 +48,7 @@ Type: Boolean .P If true, npm does not run scripts specified in package.json files. .P -Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm -run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. .SS "\fBscript-shell\fR" .RS 0 .IP \(bu 4 @@ -59,7 +58,8 @@ Type: null or String .RE 0 .P -The shell to use for scripts run with the \fBnpm exec\fR, \fBnpm run\fR and \fBnpm init \fR commands. +The shell to use for scripts run with the \fBnpm exec\fR, \fBnpm run\fR and \fBnpm +init \fR commands. .SS "See Also" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-team.1 b/deps/npm/man/man1/npm-team.1 index e4c885229a41d7..7a351a7b2ef46b 100644 --- a/deps/npm/man/man1/npm-team.1 +++ b/deps/npm/man/man1/npm-team.1 @@ -1,4 +1,4 @@ -.TH "NPM-TEAM" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-TEAM" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-team\fR - Manage organization teams and team memberships .SS "Synopsis" @@ -107,8 +107,7 @@ Type: null or String .RE 0 .P -This is a one-time password from a two-factor authenticator. It's needed when publishing or changing package permissions with \fBnpm -access\fR. +This is a one-time password from a two-factor authenticator. It's needed when publishing or changing package permissions with \fBnpm access\fR. .P If not set, and a registry response fails with a challenge for a one-time password, npm will prompt on the command line for one. .SS "\fBparseable\fR" diff --git a/deps/npm/man/man1/npm-test.1 b/deps/npm/man/man1/npm-test.1 index d233bd2c54ccd8..6d82bad6e0dd93 100644 --- a/deps/npm/man/man1/npm-test.1 +++ b/deps/npm/man/man1/npm-test.1 @@ -1,4 +1,4 @@ -.TH "NPM-TEST" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-TEST" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-test\fR - Test a package .SS "Synopsis" @@ -46,8 +46,7 @@ Type: Boolean .P If true, npm does not run scripts specified in package.json files. .P -Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm -run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. .SS "\fBscript-shell\fR" .RS 0 .IP \(bu 4 @@ -57,7 +56,8 @@ Type: null or String .RE 0 .P -The shell to use for scripts run with the \fBnpm exec\fR, \fBnpm run\fR and \fBnpm init \fR commands. +The shell to use for scripts run with the \fBnpm exec\fR, \fBnpm run\fR and \fBnpm +init \fR commands. .SS "See Also" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-token.1 b/deps/npm/man/man1/npm-token.1 index e1005725bdcf74..0c31d163bb7075 100644 --- a/deps/npm/man/man1/npm-token.1 +++ b/deps/npm/man/man1/npm-token.1 @@ -1,4 +1,4 @@ -.TH "NPM-TOKEN" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-TOKEN" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-token\fR - Manage your authentication tokens .SS "Synopsis" @@ -7,7 +7,7 @@ .nf npm token list npm token revoke -npm token create \[lB]--read-only\[rB] \[lB]--cidr=list\[rB] +npm token create --name= \[lB]--token-description=\[rB] \[lB]--packages=\[rB] \[lB]--packages-all\[rB] \[lB]--scopes=\[rB] \[lB]--orgs=\[rB] \[lB]--packages-and-scopes-permission=\[rB] \[lB]--orgs-permission=\[rB] \[lB]--expires=\[rB] \[lB]--cidr=\[rB] \[lB]--bypass-2fa\[rB] \[lB]--password=\[rB] .fi .RE .P @@ -51,7 +51,47 @@ Created publish token a73c9572-f1b9-8983-983d-ba3ac3cc913d .RE 0 .SS "Configuration" -.SS "\fBread-only\fR" +.SS "\fBname\fR" +.RS 0 +.IP \(bu 4 +Default: null +.IP \(bu 4 +Type: null or String +.RE 0 + +.P +When creating a Granular Access Token with \fBnpm token create\fR, this sets the name/description for the token. +.SS "\fBtoken-description\fR" +.RS 0 +.IP \(bu 4 +Default: null +.IP \(bu 4 +Type: null or String +.RE 0 + +.P +Description text for the token when using \fBnpm token create\fR. +.SS "\fBexpires\fR" +.RS 0 +.IP \(bu 4 +Default: null +.IP \(bu 4 +Type: null or Number +.RE 0 + +.P +When creating a Granular Access Token with \fBnpm token create\fR, this sets the expiration in days. If not specified, the server will determine the default expiration. +.SS "\fBpackages\fR" +.RS 0 +.IP \(bu 4 +Default: +.IP \(bu 4 +Type: null or String (can be set multiple times) +.RE 0 + +.P +When creating a Granular Access Token with \fBnpm token create\fR, this limits the token access to specific packages. Provide a comma-separated list of package names. +.SS "\fBpackages-all\fR" .RS 0 .IP \(bu 4 Default: false @@ -60,7 +100,47 @@ Type: Boolean .RE 0 .P -This is used to mark a token as unable to publish when configuring limited access tokens with the \fBnpm token create\fR command. +When creating a Granular Access Token with \fBnpm token create\fR, grants the token access to all packages instead of limiting to specific packages. +.SS "\fBscopes\fR" +.RS 0 +.IP \(bu 4 +Default: null +.IP \(bu 4 +Type: null or String (can be set multiple times) +.RE 0 + +.P +When creating a Granular Access Token with \fBnpm token create\fR, this limits the token access to specific scopes. Provide a comma-separated list of scope names (with or without @ prefix). +.SS "\fBorgs\fR" +.RS 0 +.IP \(bu 4 +Default: null +.IP \(bu 4 +Type: null or String (can be set multiple times) +.RE 0 + +.P +When creating a Granular Access Token with \fBnpm token create\fR, this limits the token access to specific organizations. Provide a comma-separated list of organization names. +.SS "\fBpackages-and-scopes-permission\fR" +.RS 0 +.IP \(bu 4 +Default: null +.IP \(bu 4 +Type: null, "read-only", "read-write", or "no-access" +.RE 0 + +.P +When creating a Granular Access Token with \fBnpm token create\fR, sets the permission level for packages and scopes. Options are "read-only", "read-write", or "no-access". +.SS "\fBorgs-permission\fR" +.RS 0 +.IP \(bu 4 +Default: null +.IP \(bu 4 +Type: null, "read-only", "read-write", or "no-access" +.RE 0 + +.P +When creating a Granular Access Token with \fBnpm token create\fR, sets the permission level for organizations. Options are "read-only", "read-write", or "no-access". .SS "\fBcidr\fR" .RS 0 .IP \(bu 4 @@ -71,6 +151,26 @@ Type: null or String (can be set multiple times) .P This is a list of CIDR address to be used when configuring limited access tokens with the \fBnpm token create\fR command. +.SS "\fBbypass-2fa\fR" +.RS 0 +.IP \(bu 4 +Default: false +.IP \(bu 4 +Type: Boolean +.RE 0 + +.P +When creating a Granular Access Token with \fBnpm token create\fR, setting this to true will allow the token to bypass two-factor authentication. This is useful for automation and CI/CD workflows. +.SS "\fBpassword\fR" +.RS 0 +.IP \(bu 4 +Default: null +.IP \(bu 4 +Type: null or String +.RE 0 + +.P +Password for authentication. Can be provided via command line when creating tokens, though it's generally safer to be prompted for it. .SS "\fBregistry\fR" .RS 0 .IP \(bu 4 @@ -90,10 +190,19 @@ Type: null or String .RE 0 .P -This is a one-time password from a two-factor authenticator. It's needed when publishing or changing package permissions with \fBnpm -access\fR. +This is a one-time password from a two-factor authenticator. It's needed when publishing or changing package permissions with \fBnpm access\fR. .P If not set, and a registry response fails with a challenge for a one-time password, npm will prompt on the command line for one. +.SS "\fBread-only\fR" +.RS 0 +.IP \(bu 4 +Default: false +.IP \(bu 4 +Type: Boolean +.RE 0 + +.P +This is used to mark a token as unable to publish when configuring limited access tokens with the \fBnpm token create\fR command. .SS "See Also" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-undeprecate.1 b/deps/npm/man/man1/npm-undeprecate.1 index 2593ba2bb3adf9..7d9f2b8a0acf6e 100644 --- a/deps/npm/man/man1/npm-undeprecate.1 +++ b/deps/npm/man/man1/npm-undeprecate.1 @@ -1,4 +1,4 @@ -.TH "NPM-UNDEPRECATE" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-UNDEPRECATE" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-undeprecate\fR - Undeprecate a version of a package .SS "Synopsis" @@ -35,8 +35,7 @@ Type: null or String .RE 0 .P -This is a one-time password from a two-factor authenticator. It's needed when publishing or changing package permissions with \fBnpm -access\fR. +This is a one-time password from a two-factor authenticator. It's needed when publishing or changing package permissions with \fBnpm access\fR. .P If not set, and a registry response fails with a challenge for a one-time password, npm will prompt on the command line for one. .SS "\fBdry-run\fR" diff --git a/deps/npm/man/man1/npm-uninstall.1 b/deps/npm/man/man1/npm-uninstall.1 index 9a3713bba4051e..31abec58e8851c 100644 --- a/deps/npm/man/man1/npm-uninstall.1 +++ b/deps/npm/man/man1/npm-uninstall.1 @@ -1,4 +1,4 @@ -.TH "NPM-UNINSTALL" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-UNINSTALL" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-uninstall\fR - Remove a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-unpublish.1 b/deps/npm/man/man1/npm-unpublish.1 index eb8073bf3575d7..574c93034c0f75 100644 --- a/deps/npm/man/man1/npm-unpublish.1 +++ b/deps/npm/man/man1/npm-unpublish.1 @@ -1,4 +1,4 @@ -.TH "NPM-UNPUBLISH" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-UNPUBLISH" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-unpublish\fR - Remove a package from the registry .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-unstar.1 b/deps/npm/man/man1/npm-unstar.1 index 3c0fd6a17d546d..71fcd92da083cc 100644 --- a/deps/npm/man/man1/npm-unstar.1 +++ b/deps/npm/man/man1/npm-unstar.1 @@ -1,4 +1,4 @@ -.TH "NPM-UNSTAR" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-UNSTAR" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-unstar\fR - Remove an item from your favorite packages .SS "Synopsis" @@ -52,8 +52,7 @@ Type: null or String .RE 0 .P -This is a one-time password from a two-factor authenticator. It's needed when publishing or changing package permissions with \fBnpm -access\fR. +This is a one-time password from a two-factor authenticator. It's needed when publishing or changing package permissions with \fBnpm access\fR. .P If not set, and a registry response fails with a challenge for a one-time password, npm will prompt on the command line for one. .SS "See Also" diff --git a/deps/npm/man/man1/npm-update.1 b/deps/npm/man/man1/npm-update.1 index 50eaa09ef1a2de..aad4792b445c68 100644 --- a/deps/npm/man/man1/npm-update.1 +++ b/deps/npm/man/man1/npm-update.1 @@ -1,4 +1,4 @@ -.TH "NPM-UPDATE" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-UPDATE" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-update\fR - Update packages .SS "Synopsis" @@ -276,8 +276,7 @@ Type: Boolean .P If true, npm does not run scripts specified in package.json files. .P -Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm -run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. .SS "\fBaudit\fR" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-version.1 b/deps/npm/man/man1/npm-version.1 index 4d467c1682102b..281b6d05b5f7a1 100644 --- a/deps/npm/man/man1/npm-version.1 +++ b/deps/npm/man/man1/npm-version.1 @@ -1,4 +1,4 @@ -.TH "NPM-VERSION" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-VERSION" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-version\fR - Bump a package version .SS "Synopsis" @@ -80,6 +80,20 @@ Type: Boolean If set to true, then the \fBnpm version\fR command will tag the version using \fB-s\fR to add a signature. .P Note that git requires you to have set up GPG keys in your git configs for this to work properly. +.SS "\fBsave\fR" +.RS 0 +.IP \(bu 4 +Default: \fBtrue\fR unless when using \fBnpm update\fR where it defaults to \fBfalse\fR +.IP \(bu 4 +Type: Boolean +.RE 0 + +.P +Save installed packages to a \fBpackage.json\fR file as dependencies. +.P +When used with the \fBnpm rm\fR command, removes the dependency from \fBpackage.json\fR. +.P +Will also prevent writing to \fBpackage-lock.json\fR if set to \fBfalse\fR. .SS "\fBworkspace\fR" .RS 0 .IP \(bu 4 @@ -148,6 +162,18 @@ Include the workspace root when workspaces are enabled for a command. When false, specifying individual workspaces via the \fBworkspace\fR config, or all workspaces via the \fBworkspaces\fR flag, will cause npm to operate only on the specified workspaces, and not on the root project. .P This value is not exported to the environment for child processes. +.SS "\fBignore-scripts\fR" +.RS 0 +.IP \(bu 4 +Default: false +.IP \(bu 4 +Type: Boolean +.RE 0 + +.P +If true, npm does not run scripts specified in package.json files. +.P +Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. .SS "Description" .P Run this in a package directory to bump the version and write the new data back to \fBpackage.json\fR, \fBpackage-lock.json\fR, and, if present, \fBnpm-shrinkwrap.json\fR. diff --git a/deps/npm/man/man1/npm-view.1 b/deps/npm/man/man1/npm-view.1 index 63c57ffa7156bc..006e021625faff 100644 --- a/deps/npm/man/man1/npm-view.1 +++ b/deps/npm/man/man1/npm-view.1 @@ -1,4 +1,4 @@ -.TH "NPM-VIEW" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-VIEW" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-view\fR - View registry info .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-whoami.1 b/deps/npm/man/man1/npm-whoami.1 index 0a316e3a3fc72f..8e662fde73ad9e 100644 --- a/deps/npm/man/man1/npm-whoami.1 +++ b/deps/npm/man/man1/npm-whoami.1 @@ -1,4 +1,4 @@ -.TH "NPM-WHOAMI" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM-WHOAMI" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-whoami\fR - Display npm username .SS "Synopsis" diff --git a/deps/npm/man/man1/npm.1 b/deps/npm/man/man1/npm.1 index cda18c5f71c59c..15e8927d3c17f4 100644 --- a/deps/npm/man/man1/npm.1 +++ b/deps/npm/man/man1/npm.1 @@ -1,4 +1,4 @@ -.TH "NPM" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPM" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm\fR - javascript package manager .SS "Synopsis" @@ -12,7 +12,7 @@ npm Note: This command is unaware of workspaces. .SS "Version" .P -11.6.2 +11.6.3 .SS "Description" .P npm is the package manager for the Node JavaScript platform. It puts modules in place so that node can find them, and manages dependency conflicts intelligently. diff --git a/deps/npm/man/man1/npx.1 b/deps/npm/man/man1/npx.1 index a862e5d6e8b2b6..beb7652683f09a 100644 --- a/deps/npm/man/man1/npx.1 +++ b/deps/npm/man/man1/npx.1 @@ -1,4 +1,4 @@ -.TH "NPX" "1" "October 2025" "NPM@11.6.2" "" +.TH "NPX" "1" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpx\fR - Run a command from a local or remote npm package .SS "Synopsis" diff --git a/deps/npm/man/man5/folders.5 b/deps/npm/man/man5/folders.5 index e6b255cef3eda8..3a9dc52805d9e1 100644 --- a/deps/npm/man/man5/folders.5 +++ b/deps/npm/man/man5/folders.5 @@ -1,4 +1,4 @@ -.TH "FOLDERS" "5" "October 2025" "NPM@11.6.2" "" +.TH "FOLDERS" "5" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBfolders\fR - Folder Structures Used by npm .SS "Description" diff --git a/deps/npm/man/man5/install.5 b/deps/npm/man/man5/install.5 index 2864350ce80d94..5fc71b73adabda 100644 --- a/deps/npm/man/man5/install.5 +++ b/deps/npm/man/man5/install.5 @@ -1,4 +1,4 @@ -.TH "INSTALL" "5" "October 2025" "NPM@11.6.2" "" +.TH "INSTALL" "5" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBinstall\fR - Download and install node and npm .SS "Description" diff --git a/deps/npm/man/man5/npm-global.5 b/deps/npm/man/man5/npm-global.5 index e6b255cef3eda8..3a9dc52805d9e1 100644 --- a/deps/npm/man/man5/npm-global.5 +++ b/deps/npm/man/man5/npm-global.5 @@ -1,4 +1,4 @@ -.TH "FOLDERS" "5" "October 2025" "NPM@11.6.2" "" +.TH "FOLDERS" "5" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBfolders\fR - Folder Structures Used by npm .SS "Description" diff --git a/deps/npm/man/man5/npm-json.5 b/deps/npm/man/man5/npm-json.5 index c12aa8fe3b1b31..a465ba0ab32ddb 100644 --- a/deps/npm/man/man5/npm-json.5 +++ b/deps/npm/man/man5/npm-json.5 @@ -1,4 +1,4 @@ -.TH "PACKAGE.JSON" "5" "October 2025" "NPM@11.6.2" "" +.TH "PACKAGE.JSON" "5" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBpackage.json\fR - Specifics of npm's package.json handling .SS "Description" diff --git a/deps/npm/man/man5/npm-shrinkwrap-json.5 b/deps/npm/man/man5/npm-shrinkwrap-json.5 index b4b8cee1b390f5..b0ddc4e9b1b004 100644 --- a/deps/npm/man/man5/npm-shrinkwrap-json.5 +++ b/deps/npm/man/man5/npm-shrinkwrap-json.5 @@ -1,4 +1,4 @@ -.TH "NPM-SHRINKWRAP.JSON" "5" "October 2025" "NPM@11.6.2" "" +.TH "NPM-SHRINKWRAP.JSON" "5" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpm-shrinkwrap.json\fR - A publishable lockfile .SS "Description" diff --git a/deps/npm/man/man5/npmrc.5 b/deps/npm/man/man5/npmrc.5 index 1d50198b83e0ab..824d29ecb741d0 100644 --- a/deps/npm/man/man5/npmrc.5 +++ b/deps/npm/man/man5/npmrc.5 @@ -1,4 +1,4 @@ -.TH "NPMRC" "5" "October 2025" "NPM@11.6.2" "" +.TH "NPMRC" "5" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBnpmrc\fR - The npm config files .SS "Description" diff --git a/deps/npm/man/man5/package-json.5 b/deps/npm/man/man5/package-json.5 index c12aa8fe3b1b31..a465ba0ab32ddb 100644 --- a/deps/npm/man/man5/package-json.5 +++ b/deps/npm/man/man5/package-json.5 @@ -1,4 +1,4 @@ -.TH "PACKAGE.JSON" "5" "October 2025" "NPM@11.6.2" "" +.TH "PACKAGE.JSON" "5" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBpackage.json\fR - Specifics of npm's package.json handling .SS "Description" diff --git a/deps/npm/man/man5/package-lock-json.5 b/deps/npm/man/man5/package-lock-json.5 index 3bbf561cce657e..75f1a9d86fa99e 100644 --- a/deps/npm/man/man5/package-lock-json.5 +++ b/deps/npm/man/man5/package-lock-json.5 @@ -1,4 +1,4 @@ -.TH "PACKAGE-LOCK.JSON" "5" "October 2025" "NPM@11.6.2" "" +.TH "PACKAGE-LOCK.JSON" "5" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBpackage-lock.json\fR - A manifestation of the manifest .SS "Description" diff --git a/deps/npm/man/man7/config.7 b/deps/npm/man/man7/config.7 index 3703e0634686b9..6bdae9b9dbeb8a 100644 --- a/deps/npm/man/man7/config.7 +++ b/deps/npm/man/man7/config.7 @@ -1,4 +1,4 @@ -.TH "CONFIG" "7" "October 2025" "NPM@11.6.2" "" +.TH "CONFIG" "7" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBconfig\fR - More than you probably want to know about npm configuration .SS "Description" @@ -167,7 +167,8 @@ If you do not want your scoped package to be publicly viewable (and installable) .P Unscoped packages cannot be set to \fBrestricted\fR. .P -Note: This defaults to not changing the current access level for existing packages. Specifying a value of \fBrestricted\fR or \fBpublic\fR during publish will change the access for an existing package the same way that \fBnpm access set status\fR would. +Note: This defaults to not changing the current access level for existing packages. Specifying a value of \fBrestricted\fR or \fBpublic\fR during publish will change the access for an existing package the same way that \fBnpm access set +status\fR would. .SS "\fBall\fR" .RS 0 .IP \(bu 4 @@ -256,6 +257,16 @@ The browser that is called by npm commands to open websites. Set to \fBfalse\fR to suppress browser behavior and instead print urls to terminal. .P Set to \fBtrue\fR to use default system URL opener. +.SS "\fBbypass-2fa\fR" +.RS 0 +.IP \(bu 4 +Default: false +.IP \(bu 4 +Type: Boolean +.RE 0 + +.P +When creating a Granular Access Token with \fBnpm token create\fR, setting this to true will allow the token to bypass two-factor authentication. This is useful for automation and CI/CD workflows. .SS "\fBca\fR" .RS 0 .IP \(bu 4 @@ -523,6 +534,16 @@ Type: null or Boolean Tells npm whether or not to expect results from the command. Can be either true (expect some results) or false (expect no results). .P This config cannot be used with: \fBexpect-result-count\fR +.SS "\fBexpires\fR" +.RS 0 +.IP \(bu 4 +Default: null +.IP \(bu 4 +Type: null or Number +.RE 0 + +.P +When creating a Granular Access Token with \fBnpm token create\fR, this sets the expiration in days. If not specified, the server will determine the default expiration. .SS "\fBfetch-retries\fR" .RS 0 .IP \(bu 4 @@ -736,8 +757,7 @@ Type: Boolean .P If true, npm does not run scripts specified in package.json files. .P -Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm -run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. +Note that commands explicitly intended to run a particular script, such as \fBnpm start\fR, \fBnpm stop\fR, \fBnpm restart\fR, \fBnpm test\fR, and \fBnpm run\fR will still run their intended script if \fBignore-scripts\fR is set, but they will \fInot\fR run any pre- or post-scripts. .SS "\fBinclude\fR" .RS 0 .IP \(bu 4 @@ -1046,6 +1066,16 @@ Type: String Commit message which is used by \fBnpm version\fR when creating version commit. .P Any "%s" in the message will be replaced with the version number. +.SS "\fBname\fR" +.RS 0 +.IP \(bu 4 +Default: null +.IP \(bu 4 +Type: null or String +.RE 0 + +.P +When creating a Granular Access Token with \fBnpm token create\fR, this sets the name/description for the token. .SS "\fBnode-gyp\fR" .RS 0 .IP \(bu 4 @@ -1116,6 +1146,26 @@ Type: Boolean .P This option causes npm to create lock files without a \fBresolved\fR key for registry dependencies. Subsequent installs will need to resolve tarball endpoints with the configured registry, likely resulting in a longer install time. +.SS "\fBorgs\fR" +.RS 0 +.IP \(bu 4 +Default: null +.IP \(bu 4 +Type: null or String (can be set multiple times) +.RE 0 + +.P +When creating a Granular Access Token with \fBnpm token create\fR, this limits the token access to specific organizations. Provide a comma-separated list of organization names. +.SS "\fBorgs-permission\fR" +.RS 0 +.IP \(bu 4 +Default: null +.IP \(bu 4 +Type: null, "read-only", "read-write", or "no-access" +.RE 0 + +.P +When creating a Granular Access Token with \fBnpm token create\fR, sets the permission level for organizations. Options are "read-only", "read-write", or "no-access". .SS "\fBos\fR" .RS 0 .IP \(bu 4 @@ -1135,8 +1185,7 @@ Type: null or String .RE 0 .P -This is a one-time password from a two-factor authenticator. It's needed when publishing or changing package permissions with \fBnpm -access\fR. +This is a one-time password from a two-factor authenticator. It's needed when publishing or changing package permissions with \fBnpm access\fR. .P If not set, and a registry response fails with a challenge for a one-time password, npm will prompt on the command line for one. .SS "\fBpack-destination\fR" @@ -1183,6 +1232,36 @@ If set to true, the current operation will only use the \fBpackage-lock.json\fR, For \fBupdate\fR this means only the \fBpackage-lock.json\fR will be updated, instead of checking \fBnode_modules\fR and downloading dependencies. .P For \fBlist\fR this means the output will be based on the tree described by the \fBpackage-lock.json\fR, rather than the contents of \fBnode_modules\fR. +.SS "\fBpackages\fR" +.RS 0 +.IP \(bu 4 +Default: +.IP \(bu 4 +Type: null or String (can be set multiple times) +.RE 0 + +.P +When creating a Granular Access Token with \fBnpm token create\fR, this limits the token access to specific packages. Provide a comma-separated list of package names. +.SS "\fBpackages-all\fR" +.RS 0 +.IP \(bu 4 +Default: false +.IP \(bu 4 +Type: Boolean +.RE 0 + +.P +When creating a Granular Access Token with \fBnpm token create\fR, grants the token access to all packages instead of limiting to specific packages. +.SS "\fBpackages-and-scopes-permission\fR" +.RS 0 +.IP \(bu 4 +Default: null +.IP \(bu 4 +Type: null, "read-only", "read-write", or "no-access" +.RE 0 + +.P +When creating a Granular Access Token with \fBnpm token create\fR, sets the permission level for packages and scopes. Options are "read-only", "read-write", or "no-access". .SS "\fBparseable\fR" .RS 0 .IP \(bu 4 @@ -1193,6 +1272,16 @@ Type: Boolean .P Output parseable results from commands that write to standard output. For \fBnpm search\fR, this will be tab-separated table format. +.SS "\fBpassword\fR" +.RS 0 +.IP \(bu 4 +Default: null +.IP \(bu 4 +Type: null or String +.RE 0 + +.P +Password for authentication. Can be provided via command line when creating tokens, though it's generally safer to be prompted for it. .SS "\fBprefer-dedupe\fR" .RS 0 .IP \(bu 4 @@ -1416,7 +1505,8 @@ Type: String .P Configure how versions of packages installed to a package.json file via \fB--save\fR or \fB--save-dev\fR get prefixed. .P -For example if a package has version \fB1.2.3\fR, by default its version is set to \fB^1.2.3\fR which allows minor upgrades for that package, but after \fBnpm config set save-prefix='~'\fR it would be set to \fB~1.2.3\fR which only allows patch upgrades. +For example if a package has version \fB1.2.3\fR, by default its version is set to \fB^1.2.3\fR which allows minor upgrades for that package, but after \fBnpm +config set save-prefix='~'\fR it would be set to \fB~1.2.3\fR which only allows patch upgrades. .SS "\fBsave-prod\fR" .RS 0 .IP \(bu 4 @@ -1485,6 +1575,16 @@ This will also cause \fBnpm init\fR to create a scoped package. npm init --scope=@foo --yes .fi .RE +.SS "\fBscopes\fR" +.RS 0 +.IP \(bu 4 +Default: null +.IP \(bu 4 +Type: null or String (can be set multiple times) +.RE 0 + +.P +When creating a Granular Access Token with \fBnpm token create\fR, this limits the token access to specific scopes. Provide a comma-separated list of scope names (with or without @ prefix). .SS "\fBscript-shell\fR" .RS 0 .IP \(bu 4 @@ -1494,7 +1594,8 @@ Type: null or String .RE 0 .P -The shell to use for scripts run with the \fBnpm exec\fR, \fBnpm run\fR and \fBnpm init \fR commands. +The shell to use for scripts run with the \fBnpm exec\fR, \fBnpm run\fR and \fBnpm +init \fR commands. .SS "\fBsearchexclude\fR" .RS 0 .IP \(bu 4 @@ -1606,8 +1707,8 @@ Type: String .P If you ask npm to install a package and don't tell it a specific version, then it will install the specified tag. .P -It is the tag added to the package@version specified in the \fBnpm -dist-tag add\fR command, if no explicit tag is given. +It is the tag added to the package@version specified in the \fBnpm dist-tag +add\fR command, if no explicit tag is given. .P When used by the \fBnpm diff\fR command, this is the tag used to fetch the tarball that will be compared with the local files by default. .P @@ -1638,6 +1739,16 @@ If true, writes timing information to a process specific json file in the cache You can quickly view it with this \fBjson\fR \fI\(lahttps://npm.im/json\(ra\fR command line: \fBcat ~/.npm/_logs/*-timing.json | npm exec -- json -g\fR. .P Timing information will also be reported in the terminal. To suppress this while still writing the timing file, use \fB--silent\fR. +.SS "\fBtoken-description\fR" +.RS 0 +.IP \(bu 4 +Default: null +.IP \(bu 4 +Type: null or String +.RE 0 + +.P +Description text for the token when using \fBnpm token create\fR. .SS "\fBumask\fR" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man7/dependency-selectors.7 b/deps/npm/man/man7/dependency-selectors.7 index eed3d6c769106f..188ed46f626db4 100644 --- a/deps/npm/man/man7/dependency-selectors.7 +++ b/deps/npm/man/man7/dependency-selectors.7 @@ -1,4 +1,4 @@ -.TH "QUERYING" "7" "October 2025" "NPM@11.6.2" "" +.TH "QUERYING" "7" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBQuerying\fR - Dependency Selector Syntax & Querying .SS "Description" diff --git a/deps/npm/man/man7/developers.7 b/deps/npm/man/man7/developers.7 index a65327f7813f1d..92311087536ef9 100644 --- a/deps/npm/man/man7/developers.7 +++ b/deps/npm/man/man7/developers.7 @@ -1,4 +1,4 @@ -.TH "DEVELOPERS" "7" "October 2025" "NPM@11.6.2" "" +.TH "DEVELOPERS" "7" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBdevelopers\fR - Developer Guide .SS "Description" diff --git a/deps/npm/man/man7/logging.7 b/deps/npm/man/man7/logging.7 index fcdcfcec66c5aa..a8070b5a9f4873 100644 --- a/deps/npm/man/man7/logging.7 +++ b/deps/npm/man/man7/logging.7 @@ -1,4 +1,4 @@ -.TH "LOGGING" "7" "October 2025" "NPM@11.6.2" "" +.TH "LOGGING" "7" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBLogging\fR - Why, What & How We Log .SS "Description" diff --git a/deps/npm/man/man7/orgs.7 b/deps/npm/man/man7/orgs.7 index e68241ff36fe19..5112f9668bf7d6 100644 --- a/deps/npm/man/man7/orgs.7 +++ b/deps/npm/man/man7/orgs.7 @@ -1,4 +1,4 @@ -.TH "ORGS" "7" "October 2025" "NPM@11.6.2" "" +.TH "ORGS" "7" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBorgs\fR - Working with Teams & Orgs .SS "Description" diff --git a/deps/npm/man/man7/package-spec.7 b/deps/npm/man/man7/package-spec.7 index c70815de103705..29121b9ff2a871 100644 --- a/deps/npm/man/man7/package-spec.7 +++ b/deps/npm/man/man7/package-spec.7 @@ -1,4 +1,4 @@ -.TH "PACKAGE-SPEC" "7" "October 2025" "NPM@11.6.2" "" +.TH "PACKAGE-SPEC" "7" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBpackage-spec\fR - Package name specifier .SS "Description" diff --git a/deps/npm/man/man7/registry.7 b/deps/npm/man/man7/registry.7 index 1c0b0bf111a2e6..e23ed66824a6d9 100644 --- a/deps/npm/man/man7/registry.7 +++ b/deps/npm/man/man7/registry.7 @@ -1,4 +1,4 @@ -.TH "REGISTRY" "7" "October 2025" "NPM@11.6.2" "" +.TH "REGISTRY" "7" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBregistry\fR - The JavaScript Package Registry .SS "Description" diff --git a/deps/npm/man/man7/removal.7 b/deps/npm/man/man7/removal.7 index 750f5a0b35ed84..6e12a153ac0788 100644 --- a/deps/npm/man/man7/removal.7 +++ b/deps/npm/man/man7/removal.7 @@ -1,4 +1,4 @@ -.TH "REMOVAL" "7" "October 2025" "NPM@11.6.2" "" +.TH "REMOVAL" "7" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBremoval\fR - Cleaning the Slate .SS "Synopsis" diff --git a/deps/npm/man/man7/scope.7 b/deps/npm/man/man7/scope.7 index c12c8360f3f076..aaadc2f935fae9 100644 --- a/deps/npm/man/man7/scope.7 +++ b/deps/npm/man/man7/scope.7 @@ -1,4 +1,4 @@ -.TH "SCOPE" "7" "October 2025" "NPM@11.6.2" "" +.TH "SCOPE" "7" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBscope\fR - Scoped packages .SS "Description" diff --git a/deps/npm/man/man7/scripts.7 b/deps/npm/man/man7/scripts.7 index cbef73ef64ad2d..e10d871bf3342e 100644 --- a/deps/npm/man/man7/scripts.7 +++ b/deps/npm/man/man7/scripts.7 @@ -1,4 +1,4 @@ -.TH "SCRIPTS" "7" "October 2025" "NPM@11.6.2" "" +.TH "SCRIPTS" "7" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBscripts\fR - How npm handles the "scripts" field .SS "Description" diff --git a/deps/npm/man/man7/workspaces.7 b/deps/npm/man/man7/workspaces.7 index 74a291685b8b29..06517e0ab5c037 100644 --- a/deps/npm/man/man7/workspaces.7 +++ b/deps/npm/man/man7/workspaces.7 @@ -1,4 +1,4 @@ -.TH "WORKSPACES" "7" "October 2025" "NPM@11.6.2" "" +.TH "WORKSPACES" "7" "November 2025" "NPM@11.6.3" "" .SH "NAME" \fBworkspaces\fR - Working with workspaces .SS "Description" diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/build-ideal-tree.js b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/build-ideal-tree.js index 3a066d9b6d336f..699735f3498262 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/build-ideal-tree.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/build-ideal-tree.js @@ -42,7 +42,6 @@ const _flagsSuspect = Symbol.for('flagsSuspect') const _setWorkspaces = Symbol.for('setWorkspaces') const _updateNames = Symbol.for('updateNames') const _resolvedAdd = Symbol.for('resolvedAdd') -const _usePackageLock = Symbol.for('usePackageLock') const _rpcache = Symbol.for('realpathCache') const _stcache = Symbol.for('statCache') @@ -101,39 +100,28 @@ module.exports = cls => class IdealTreeBuilder extends cls { constructor (options) { super(options) - // normalize trailing slash - const registry = options.registry || 'https://registry.npmjs.org' - options.registry = this.registry = registry.replace(/\/+$/, '') + '/' - const { follow = false, installStrategy = 'hoisted', - idealTree = null, - installLinks = false, - legacyPeerDeps = false, - packageLock = true, strictPeerDeps = false, - workspaces, global, } = options this.#strictPeerDeps = !!strictPeerDeps - this.idealTree = idealTree - this.installLinks = installLinks - this.legacyPeerDeps = legacyPeerDeps - - this[_usePackageLock] = packageLock this.#installStrategy = global ? 'shallow' : installStrategy this.#follow = !!follow - if (workspaces?.length && global) { - throw new Error('Cannot operate on workspaces in global mode') - } - this[_updateAll] = false this[_updateNames] = [] this[_resolvedAdd] = [] + + // caches for cached realpath calls + const cwd = process.cwd() + // assume that the cwd is real enough for our purposes + this[_rpcache] = new Map([[cwd, cwd]]) + this[_stcache] = new Map() + this[_flagsSuspect] = false } get explicitRequests () { @@ -298,7 +286,7 @@ module.exports = cls => class IdealTreeBuilder extends cls { .then(root => { if (this.options.global) { return root - } else if (!this[_usePackageLock] || this[_updateAll]) { + } else if (!this.options.usePackageLock || this[_updateAll]) { return Shrinkwrap.reset({ path: this.path, lockfileVersion: this.options.lockfileVersion, @@ -351,7 +339,7 @@ module.exports = cls => class IdealTreeBuilder extends cls { filter: node => node, visit: node => { for (const edge of node.edgesOut.values()) { - if (!edge.to || !edge.valid) { + if ((!edge.to && edge.type !== 'peerOptional') || !edge.valid) { this.#depsQueue.push(node) break // no need to continue the loop after the first hit } @@ -754,6 +742,7 @@ This is a one-time fix-up, please be patient... // have to re-calc dep flags, because the nodes don't have edges // until their packages get assigned, so everything looks extraneous + resetDepFlags(this.idealTree) calcDepFlags(this.idealTree) // yes, yes, this isn't the "original" version, but now that it's been @@ -1230,7 +1219,7 @@ This is a one-time fix-up, please be patient... } } - #nodeFromSpec (name, spec, parent, edge) { + async #nodeFromSpec (name, spec, parent, edge) { // pacote will slap integrity on its options, so we have to clone // the object so it doesn't get mutated. // Don't bother to load the manifest for link deps, because the target @@ -1259,7 +1248,13 @@ This is a one-time fix-up, please be patient... // Decide whether to link or copy the dependency const shouldLink = (isWorkspace || isProjectInternalFileSpec || !installLinks) && !isTransitiveFileDep if (spec.type === 'directory' && shouldLink) { - return this.#linkFromSpec(name, spec, parent, edge) + const realpath = spec.fetchSpec + const { content: pkg } = await PackageJson.normalize(realpath).catch(() => { + return { content: {} } + }) + const link = new Link({ name, parent, realpath, pkg, installLinks, legacyPeerDeps }) + this.#linkNodes.add(link) + return link } // if the spec matches a workspace name, then see if the workspace node will satisfy the edge. if it does, we return the workspace node to make sure it takes priority. @@ -1300,17 +1295,6 @@ This is a one-time fix-up, please be patient... }) } - async #linkFromSpec (name, spec, parent) { - const realpath = spec.fetchSpec - const { installLinks, legacyPeerDeps } = this - const { content: pkg } = await PackageJson.normalize(realpath).catch(() => { - return { content: {} } - }) - const link = new Link({ name, parent, realpath, pkg, installLinks, legacyPeerDeps }) - this.#linkNodes.add(link) - return link - } - // load all peer deps and meta-peer deps into the node's parent // At the end of this, the node's peer-type outward edges are all // resolved, and so are all of theirs, but other dep types are not. @@ -1445,6 +1429,7 @@ This is a one-time fix-up, please be patient... // and add it to the _depsQueue // // call buildDepStep if anything was added to the queue; otherwise, we're done + // XXX load-virtual also has a #resolveLinks, is there overlap? #resolveLinks () { for (const link of this.#linkNodes) { this.#linkNodes.delete(link) @@ -1508,11 +1493,7 @@ This is a one-time fix-up, please be patient... } else { // otherwise just unset all the flags on the root node // since they will sometimes have the default value - this.idealTree.extraneous = false - this.idealTree.dev = false - this.idealTree.optional = false - this.idealTree.devOptional = false - this.idealTree.peer = false + this.idealTree.unsetDepFlags() } // at this point, any node marked as extraneous should be pruned. @@ -1555,12 +1536,7 @@ This is a one-time fix-up, please be patient... #idealTreePrune () { for (const node of this.idealTree.inventory.values()) { - // optional peer dependencies are meant to be added to the tree - // through an explicit required dependency (most commonly in the - // root package.json), at which point they won't be optional so - // any dependencies still marked as both optional and peer at - // this point can be pruned as a special kind of extraneous - if (node.extraneous || (node.peer && node.optional)) { + if (node.extraneous) { node.parent = null } } diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/index.js b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/index.js index 3622f957b7acde..4c1faffa786f35 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/index.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/index.js @@ -68,6 +68,34 @@ class Arborist extends Base { constructor (options = {}) { const timeEnd = time.start('arborist:ctor') super(options) + + // normalize trailing slash + const registry = options.registry || 'https://registry.npmjs.org' + options.registry = this.registry = registry.replace(/(? class IsolatedReifier extends cls { result.hasInstallScript = node.hasInstallScript } - async [_createBundledTree] () { + async #createBundledTree () { // TODO: make sure that idealTree object exists const idealTree = this.idealTree // TODO: test workspaces having bundled deps @@ -217,7 +216,7 @@ module.exports = cls => class IsolatedReifier extends cls { const proxiedIdealTree = this.idealGraph - const bundledTree = await this[_createBundledTree]() + const bundledTree = await this.#createBundledTree() const treeHash = (startNode) => { // generate short hash based on the dependency tree diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/load-actual.js b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/load-actual.js index 3be44780e01aee..30a11e392cd168 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/load-actual.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/load-actual.js @@ -41,19 +41,6 @@ module.exports = cls => class ActualLoader extends cls { #topNodes = new Set() #transplantFilter - constructor (options) { - super(options) - - // the tree of nodes on disk - this.actualTree = options.actualTree - - // caches for cached realpath calls - const cwd = process.cwd() - // assume that the cwd is real enough for our purposes - this[_rpcache] = new Map([[cwd, cwd]]) - this[_stcache] = new Map() - } - // public method // TODO remove options param in next semver major async loadActual (options = {}) { diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/load-virtual.js b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/load-virtual.js index ba1b7478bd510f..e5a96a0b5f0b08 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/load-virtual.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/load-virtual.js @@ -18,14 +18,6 @@ const setWorkspaces = Symbol.for('setWorkspaces') module.exports = cls => class VirtualLoader extends cls { #rootOptionProvided - constructor (options) { - super(options) - - // the virtual tree we load from a shrinkwrap - this.virtualTree = options.virtualTree - this[flagsSuspect] = false - } - // public method async loadVirtual (options = {}) { if (this.virtualTree) { @@ -69,11 +61,7 @@ module.exports = cls => class VirtualLoader extends cls { if (!this.#rootOptionProvided) { // root is never any of these things, but might be a brand new // baby Node object that never had its dep flags calculated. - root.extraneous = false - root.dev = false - root.optional = false - root.devOptional = false - root.peer = false + root.unsetDepFlags() } else { this[flagsSuspect] = true } @@ -81,7 +69,21 @@ module.exports = cls => class VirtualLoader extends cls { this.#checkRootEdges(s, root) root.meta = s this.virtualTree = root - const { links, nodes } = this.#resolveNodes(s, root) + // separate out link metadata, and create Node objects for nodes + const links = new Map() + const nodes = new Map([['', root]]) + for (const [location, meta] of Object.entries(s.data.packages)) { + // skip the root because we already got it + if (!location) { + continue + } + + if (meta.link) { + links.set(location, meta) + } else { + nodes.set(location, this.#loadNode(location, meta)) + } + } await this.#resolveLinks(links, nodes) if (!(s.originalLockfileVersion >= 2)) { this.#assignBundles(nodes) @@ -93,11 +95,7 @@ module.exports = cls => class VirtualLoader extends cls { if (node.isRoot || node === this.#rootOptionProvided) { continue } - node.extraneous = true - node.dev = true - node.optional = true - node.devOptional = true - node.peer = true + node.resetDepFlags() } calcDepFlags(this.virtualTree, !this.#rootOptionProvided) } @@ -168,27 +166,9 @@ module.exports = cls => class VirtualLoader extends cls { } } - // separate out link metadata, and create Node objects for nodes - #resolveNodes (s, root) { - const links = new Map() - const nodes = new Map([['', root]]) - for (const [location, meta] of Object.entries(s.data.packages)) { - // skip the root because we already got it - if (!location) { - continue - } - - if (meta.link) { - links.set(location, meta) - } else { - nodes.set(location, this.#loadNode(location, meta)) - } - } - return { links, nodes } - } - // links is the set of metadata, and nodes is the map of non-Link nodes // Set the targets to nodes in the set, if we have them (we might not) + // XXX build-ideal-tree also has a #resolveLinks, is there overlap? async #resolveLinks (links, nodes) { for (const [location, meta] of links.entries()) { const targetPath = resolve(this.path, meta.resolved) @@ -255,11 +235,6 @@ To fix: sw.name = nameFromFolder(path) } - const dev = sw.dev - const optional = sw.optional - const devOptional = dev || optional || sw.devOptional - const peer = sw.peer - const node = new Node({ installLinks: this.installLinks, legacyPeerDeps: this.legacyPeerDeps, @@ -270,18 +245,15 @@ To fix: resolved: consistentResolve(sw.resolved, this.path, path), pkg: sw, hasShrinkwrap: sw.hasShrinkwrap, - dev, - optional, - devOptional, - peer, loadOverrides, + // cast to boolean because they're undefined in the lock file when false + extraneous: !!sw.extraneous, + devOptional: !!(sw.devOptional || sw.dev || sw.optional), + peer: !!sw.peer, + optional: !!sw.optional, + dev: !!sw.dev, }) - // cast to boolean because they're undefined in the lock file when false - node.extraneous = !!sw.extraneous - node.devOptional = !!(sw.devOptional || sw.dev || sw.optional) - node.peer = !!sw.peer - node.optional = !!sw.optional - node.dev = !!sw.dev + return node } diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/rebuild.js b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/rebuild.js index 272d6a4122aef7..eef557208208d9 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/rebuild.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/rebuild.js @@ -24,13 +24,12 @@ const _trashList = Symbol.for('trashList') module.exports = cls => class Builder extends cls { #doHandleOptionalFailure #oldMeta = null - #queues - - constructor (options) { - super(options) - - this.scriptsRun = new Set() - this.#resetQueues() + #queues = { + preinstall: [], + install: [], + postinstall: [], + prepare: [], + bin: [], } async rebuild ({ nodes, handleOptionalFailure = false } = {}) { @@ -62,7 +61,13 @@ module.exports = cls => class Builder extends cls { // build link deps if (linkNodes.size) { - this.#resetQueues() + this.#queues = { + preinstall: [], + install: [], + postinstall: [], + prepare: [], + bin: [], + } await this.#build(linkNodes, { type: 'links' }) } @@ -132,16 +137,6 @@ module.exports = cls => class Builder extends cls { } } - #resetQueues () { - this.#queues = { - preinstall: [], - install: [], - postinstall: [], - prepare: [], - bin: [], - } - } - async #build (nodes, { type = 'deps' }) { const timeEnd = time.start(`build:${type}`) diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/reify.js b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/reify.js index 70d4d9796d2e72..ff71044536d8c8 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/reify.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/reify.js @@ -57,11 +57,9 @@ const _rollbackRetireShallowNodes = Symbol.for('rollbackRetireShallowNodes') const _rollbackCreateSparseTree = Symbol.for('rollbackCreateSparseTree') const _rollbackMoveBackRetiredUnchanged = Symbol.for('rollbackMoveBackRetiredUnchanged') const _saveIdealTree = Symbol.for('saveIdealTree') -const _reifyPackages = Symbol.for('reifyPackages') // defined by build-ideal-tree mixin const _resolvedAdd = Symbol.for('resolvedAdd') -const _usePackageLock = Symbol.for('usePackageLock') // used by build-ideal-tree mixin const _addNodeToTrashList = Symbol.for('addNodeToTrashList') @@ -70,12 +68,10 @@ const _createIsolatedTree = Symbol.for('createIsolatedTree') module.exports = cls => class Reifier extends cls { #bundleMissing = new Set() // child nodes we'd EXPECT to be included in a bundle, but aren't #bundleUnpacked = new Set() // the nodes we unpack to read their bundles - #dryRun #nmValidated = new Set() #omit #retiredPaths = {} #retiredUnchanged = {} - #savePrefix #shrinkwrapInflated = new Set() #sparseTreeDirs = new Set() #sparseTreeRoots = new Set() @@ -122,7 +118,7 @@ module.exports = cls => class Reifier extends cls { this.idealTree = await this[_createIsolatedTree]() } await this[_diffTrees]() - await this[_reifyPackages]() + await this.#reifyPackages() if (linked) { // swap back in the idealTree // so that the lockfile is preserved @@ -261,7 +257,7 @@ module.exports = cls => class Reifier extends cls { return treeCheck(this.actualTree) } - async [_reifyPackages] () { + async #reifyPackages () { // we don't submit the audit report or write to disk on dry runs if (this.options.dryRun) { return @@ -817,9 +813,17 @@ module.exports = cls => class Reifier extends cls { // Make sure we don't double-include the path if it's already there const registryPath = registryURL.pathname.replace(/\/$/, '') - if (registryPath && registryPath !== '/' && !resolvedURL.pathname.startsWith(registryPath)) { - // Since hostname is changed, we need to ensure the registry path is included - resolvedURL.pathname = registryPath + resolvedURL.pathname + if (registryPath && registryPath !== '/') { + // Check if the resolved pathname already starts with the registry path + // We need to ensure it's a proper path prefix, not just a string prefix + // e.g., registry path '/npm' should not match '/npm-run-path' + const hasRegistryPath = resolvedURL.pathname === registryPath || + resolvedURL.pathname.startsWith(registryPath + '/') + + if (!hasRegistryPath) { + // Since hostname is changed, we need to ensure the registry path is included + resolvedURL.pathname = registryPath + resolvedURL.pathname + } } return resolvedURL.toString() @@ -1496,7 +1500,7 @@ module.exports = cls => class Reifier extends cls { // before now edge specs could be changing, affecting the `requires` field // in the package lock, so we hold off saving to the very last action - if (this[_usePackageLock]) { + if (this.options.usePackageLock) { // preserve indentation, if possible let format = this.idealTree.package[Symbol.for('indent')] if (format === undefined) { diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/calc-dep-flags.js b/deps/npm/node_modules/@npmcli/arborist/lib/calc-dep-flags.js index 76de452ed3d80f..5f2484858094dc 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/calc-dep-flags.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/calc-dep-flags.js @@ -1,144 +1,102 @@ -const { depth } = require('treeverse') - +// Dep flag (dev, peer, etc.) calculation requires default or reset flags. +// Flags are true by default and are unset to false as we walk deps. +// We iterate outward edges looking for dep flags that can +// be unset based on the current nodes flags and edge type. +// Examples: +// - a non-optional node with a non-optional edge out, the edge node should not be optional +// - a non-peer node with a non-peer edge out, the edge node should not be peer +// If a node is changed, we add to the queue and continue until no more changes. +// Flags that remain after all this unsetting should be valid. +// Examples: +// - a node still flagged optional must only be reachable via optional edges +// - a node still flagged peer must only be reachable via peer edges const calcDepFlags = (tree, resetRoot = true) => { if (resetRoot) { - tree.dev = false - tree.optional = false - tree.devOptional = false - tree.peer = false + tree.unsetDepFlags() } - const ret = depth({ - tree, - visit: node => calcDepFlagsStep(node), - filter: node => node, - getChildren: (node, tree) => - [...tree.edgesOut.values()].map(edge => edge.to), - }) - return ret -} - -const calcDepFlagsStep = (node) => { - // This rewalk is necessary to handle cases where devDep and optional - // or normal dependency graphs overlap deep in the dep graph. - // Since we're only walking through deps that are not already flagged - // as non-dev/non-optional, it's typically a very shallow traversal - - node.extraneous = false - resetParents(node, 'extraneous') - resetParents(node, 'dev') - resetParents(node, 'peer') - resetParents(node, 'devOptional') - resetParents(node, 'optional') - - // for links, map their hierarchy appropriately - if (node.isLink) { - // node.target can be null, we check to ensure it's not null before proceeding - if (node.target == null) { - return node - } - node.target.dev = node.dev - node.target.optional = node.optional - node.target.devOptional = node.devOptional - node.target.peer = node.peer - return calcDepFlagsStep(node.target) - } - - node.edgesOut.forEach(({ peer, optional, dev, to }) => { - // if the dep is missing, then its flags are already maximally unset - if (!to) { - return - } - // everything with any kind of edge into it is not extraneous - to.extraneous = false - - // If this is a peer edge, mark the target as peer - if (peer) { - to.peer = true - } else if (to.peer && !hasIncomingPeerEdge(to)) { - unsetFlag(to, 'peer') - } - // devOptional is the *overlap* of the dev and optional tree. - // however, for convenience and to save an extra rewalk, we leave - // it set when we are in *either* tree, and then omit it from the - // package-lock if either dev or optional are set. - const unsetDevOpt = !node.devOptional && !node.dev && !node.optional && !dev && !optional + const seen = new Set() + const queue = [tree] - // if we are not in the devOpt tree, then we're also not in - // either the dev or opt trees - const unsetDev = unsetDevOpt || !node.dev && !dev - const unsetOpt = unsetDevOpt || !node.optional && !optional + let node + while (node = queue.pop()) { + seen.add(node) - if (unsetDevOpt) { - unsetFlag(to, 'devOptional') + // Unset extraneous from all parents to avoid removal of children. + if (!node.extraneous) { + for (let n = node.resolveParent; n?.extraneous; n = n.resolveParent) { + n.extraneous = false + } } - if (unsetDev) { - unsetFlag(to, 'dev') + // for links, map their hierarchy appropriately + if (node.isLink) { + // node.target can be null, we check to ensure it's not null before proceeding + if (node.target == null) { + continue + } + node.target.dev = node.dev + node.target.optional = node.optional + node.target.devOptional = node.devOptional + node.target.peer = node.peer + node.target.extraneous = node.extraneous + queue.push(node.target) + continue } - if (unsetOpt) { - unsetFlag(to, 'optional') - } - }) - - return node -} - -const hasIncomingPeerEdge = (node) => { - const target = node.isLink && node.target ? node.target : node - for (const edge of target.edgesIn) { - if (edge.type === 'peer') { - return true + for (const { peer, optional, dev, to } of node.edgesOut.values()) { + // if the dep is missing, then its flags are already maximally unset + if (!to) { + continue + } + + let changed = false + + // only optional peer dependencies should stay extraneous + if (to.extraneous && !node.extraneous && !(peer && optional)) { + to.extraneous = false + changed = true + } + + if (to.dev && !node.dev && !dev) { + to.dev = false + changed = true + } + + if (to.optional && !node.optional && !optional) { + to.optional = false + changed = true + } + + // devOptional is the *overlap* of the dev and optional tree. + // A node may be depended on by separate dev and optional nodes. + // It SHOULD NOT be removed when pruning dev OR optional. + // It SHOULD be removed when pruning dev AND optional. + // We only unset here if a node is not dev AND not optional because + // if we did unset, it would prevent any overlap deeper in the tree. + // We correct this later by removing if dev OR optional is set. + if (to.devOptional && !node.devOptional && !node.dev && !node.optional && !dev && !optional) { + to.devOptional = false + changed = true + } + + if (to.peer && !node.peer && !peer) { + to.peer = false + changed = true + } + + if (changed) { + queue.push(to) + } } } - return false -} -const resetParents = (node, flag) => { - if (node[flag]) { - return - } - - for (let p = node; p && (p === node || p[flag]); p = p.resolveParent) { - p[flag] = false - } -} - -// typically a short walk, since it only traverses deps that have the flag set. -const unsetFlag = (node, flag) => { - if (node[flag]) { - node[flag] = false - depth({ - tree: node, - visit: node => { - node.extraneous = node[flag] = false - if (node.isLink && node.target) { - node.target.extraneous = node.target[flag] = false - } - }, - getChildren: node => { - const children = [] - const targetNode = node.isLink && node.target ? node.target : node - for (const edge of targetNode.edgesOut.values()) { - if (edge.to?.[flag]) { - // For the peer flag, only follow peer edges to unset the flag - // Don't propagate peer flag through prod/dev/optional edges - if (flag === 'peer') { - if (edge.type === 'peer') { - children.push(edge.to) - } - } else { - // For other flags, follow prod edges (and peer edges for non-peer flags) - if (edge.type === 'prod' || edge.type === 'peer') { - children.push(edge.to) - } - } - } - } - return children - }, - }) + // Remove incorrect devOptional flags now that we have walked all deps. + seen.delete(tree) + for (const node of seen.values()) { + if (node.devOptional && (node.dev || node.optional)) { + node.devOptional = false + } } } diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/edge.js b/deps/npm/node_modules/@npmcli/arborist/lib/edge.js index 242d2669ae4ca3..32e523cbc83cac 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/edge.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/edge.js @@ -276,9 +276,15 @@ class Edge { } else if (!this.satisfiedBy(this.#to)) { this.#error = 'INVALID' } else if (this.overrides && this.#to.edgesOut.size && OverrideSet.doOverrideSetsConflict(this.overrides, this.#to.overrides)) { - // Any inconsistency between the edge's override set and the target's override set is potentially problematic. - // But we only say the edge is in error if the override sets are plainly conflicting. - // Note that if the target doesn't have any dependencies of their own, then this inconsistency is irrelevant. + // Check for conflicts between the edge's override set and the target node's override set. + // This catches cases where different parts of the tree have genuinely incompatible + // version requirements for the same package. + // The improved conflict detection uses semantic comparison (checking for incompatible + // version ranges) rather than pure structural equality, avoiding false positives from: + // - Reference overrides ($syntax) that resolve to compatible versions + // - Peer dependencies with different but compatible override contexts + // Note: We only check if the target has dependencies (edgesOut.size > 0), since + // override conflicts are only relevant if the target has its own dependencies. this.#error = 'INVALID' } else { this.#error = 'OK' diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/node.js b/deps/npm/node_modules/@npmcli/arborist/lib/node.js index 41871756c221cc..8c6d361e863858 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/node.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/node.js @@ -1613,6 +1613,22 @@ class Node { [util.inspect.custom] () { return this.toJSON() } + + resetDepFlags () { + this.extraneous = true + this.dev = true + this.optional = true + this.devOptional = true + this.peer = true + } + + unsetDepFlags () { + this.extraneous = false + this.dev = false + this.optional = false + this.devOptional = false + this.peer = false + } } module.exports = Node diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/optional-set.js b/deps/npm/node_modules/@npmcli/arborist/lib/optional-set.js index 76d557c0e52c55..021a0ef72aa172 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/optional-set.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/optional-set.js @@ -10,10 +10,6 @@ const gatherDepSet = require('./gather-dep-set.js') const optionalSet = node => { - if (!node.optional) { - return new Set() - } - // start with the node, then walk up the dependency graph until we // get to the boundaries that define the optional set. since the // node is optional, we know that all paths INTO this area of the diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/override-set.js b/deps/npm/node_modules/@npmcli/arborist/lib/override-set.js index 3f05609bfacc1f..b4a11ba589df77 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/override-set.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/override-set.js @@ -201,8 +201,82 @@ class OverrideSet { static doOverrideSetsConflict (first, second) { // If override sets contain one another then we can try to use the more specific one. - // If neither one is more specific, then we consider them to be in conflict. - return (this.findSpecificOverrideSet(first, second) === undefined) + // If neither one is more specific, check for semantic conflicts. + const specificSet = this.findSpecificOverrideSet(first, second) + if (specificSet !== undefined) { + // One contains the other, so no conflict + return false + } + + // The override sets are structurally incomparable, but this doesn't necessarily + // mean they conflict. We need to check if they have conflicting version requirements + // for any package that appears in both rulesets. + return this.haveConflictingRules(first, second) + } + + static haveConflictingRules (first, second) { + // Get all rules from both override sets + const firstRules = first.ruleset + const secondRules = second.ruleset + + // Check each package that appears in both rulesets + for (const [key, firstRule] of firstRules) { + const secondRule = secondRules.get(key) + if (!secondRule) { + // Package only appears in one ruleset, no conflict + continue + } + + // Same rule object means no conflict + if (firstRule === secondRule || firstRule.isEqual(secondRule)) { + continue + } + + // Both rulesets have rules for this package with different values. + // Check if the version requirements are actually incompatible. + const firstValue = firstRule.value + const secondValue = secondRule.value + + // If either value is a reference (starts with $), we can't determine + // compatibility here - the reference might resolve to compatible versions. + // We defer to runtime resolution rather than failing early. + if (firstValue.startsWith('$') || secondValue.startsWith('$')) { + continue + } + + // Check if the version ranges are compatible using semver + // If both specify version ranges, they conflict only if they have no overlap + try { + const firstSpec = npa(`${firstRule.name}@${firstValue}`) + const secondSpec = npa(`${secondRule.name}@${secondValue}`) + + // For range/version types, check if they intersect + if ((firstSpec.type === 'range' || firstSpec.type === 'version') && + (secondSpec.type === 'range' || secondSpec.type === 'version')) { + // Check if the ranges intersect + const firstRange = firstSpec.fetchSpec + const secondRange = secondSpec.fetchSpec + + // If the ranges don't intersect, we have a real conflict + if (!semver.intersects(firstRange, secondRange)) { + log.silly('Found conflicting override rules', { + package: firstRule.name, + first: firstValue, + second: secondValue, + }) + return true + } + } + // For other types (git, file, directory, tag), we can't easily determine + // compatibility, so we conservatively assume no conflict + } catch { + // If we can't parse the specs, conservatively assume no conflict + // Real conflicts will be caught during dependency resolution + } + } + + // No conflicting rules found + return false } } diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/reset-dep-flags.js b/deps/npm/node_modules/@npmcli/arborist/lib/reset-dep-flags.js index e259e901a56254..6bb4ceceb6972f 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/reset-dep-flags.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/reset-dep-flags.js @@ -6,10 +6,6 @@ // we can find the set that is actually extraneous. module.exports = tree => { for (const node of tree.inventory.values()) { - node.extraneous = true - node.dev = true - node.devOptional = true - node.peer = true - node.optional = true + node.resetDepFlags() } } diff --git a/deps/npm/node_modules/@npmcli/arborist/package.json b/deps/npm/node_modules/@npmcli/arborist/package.json index ed00181eceaec0..ae7dbc433c5b28 100644 --- a/deps/npm/node_modules/@npmcli/arborist/package.json +++ b/deps/npm/node_modules/@npmcli/arborist/package.json @@ -1,20 +1,20 @@ { "name": "@npmcli/arborist", - "version": "9.1.6", + "version": "9.1.7", "description": "Manage node_modules trees", "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/fs": "^4.0.0", - "@npmcli/installed-package-contents": "^3.0.0", + "@npmcli/installed-package-contents": "^4.0.0", "@npmcli/map-workspaces": "^5.0.0", "@npmcli/metavuln-calculator": "^9.0.2", - "@npmcli/name-from-folder": "^3.0.0", - "@npmcli/node-gyp": "^4.0.0", + "@npmcli/name-from-folder": "^4.0.0", + "@npmcli/node-gyp": "^5.0.0", "@npmcli/package-json": "^7.0.0", "@npmcli/query": "^4.0.0", - "@npmcli/redact": "^3.0.0", + "@npmcli/redact": "^4.0.0", "@npmcli/run-script": "^10.0.0", - "bin-links": "^5.0.0", + "bin-links": "^6.0.0", "cacache": "^20.0.1", "common-ancestor-path": "^1.0.1", "hosted-git-info": "^9.0.0", @@ -22,18 +22,18 @@ "lru-cache": "^11.2.1", "minimatch": "^10.0.3", "nopt": "^8.0.0", - "npm-install-checks": "^7.1.0", + "npm-install-checks": "^8.0.0", "npm-package-arg": "^13.0.0", "npm-pick-manifest": "^11.0.1", "npm-registry-fetch": "^19.0.0", "pacote": "^21.0.2", - "parse-conflict-json": "^4.0.0", - "proc-log": "^5.0.0", + "parse-conflict-json": "^5.0.1", + "proc-log": "^6.0.0", "proggy": "^3.0.0", "promise-all-reject-late": "^1.0.0", "promise-call-limit": "^3.0.1", "semver": "^7.3.7", - "ssri": "^12.0.0", + "ssri": "^13.0.0", "treeverse": "^3.0.0", "walk-up-path": "^4.0.0" }, diff --git a/deps/npm/node_modules/@npmcli/config/lib/definitions/definitions.js b/deps/npm/node_modules/@npmcli/config/lib/definitions/definitions.js index 739428508d2fe9..a91baf6927dfa3 100644 --- a/deps/npm/node_modules/@npmcli/config/lib/definitions/definitions.js +++ b/deps/npm/node_modules/@npmcli/config/lib/definitions/definitions.js @@ -274,6 +274,16 @@ const definitions = { `, flatten, }), + 'bypass-2fa': new Definition('bypass-2fa', { + default: false, + type: Boolean, + description: ` + When creating a Granular Access Token with \`npm token create\`, + setting this to true will allow the token to bypass two-factor + authentication. This is useful for automation and CI/CD workflows. + `, + flatten, + }), ca: new Definition('ca', { default: null, type: [null, String, Array], @@ -624,6 +634,16 @@ const definitions = { Can be either true (expect some results) or false (expect no results). `, }), + expires: new Definition('expires', { + default: null, + type: [null, Number], + description: ` + When creating a Granular Access Token with \`npm token create\`, + this sets the expiration in days. If not specified, the server + will determine the default expiration. + `, + flatten, + }), 'fetch-retries': new Definition('fetch-retries', { default: 2, type: Number, @@ -1281,6 +1301,16 @@ const definitions = { Show extended information in \`ls\`, \`search\`, and \`help-search\`. `, }), + name: new Definition('name', { + default: null, + type: [null, String], + hint: '', + description: ` + When creating a Granular Access Token with \`npm token create\`, + this sets the name/description for the token. + `, + flatten, + }), maxsockets: new Definition('maxsockets', { default: 15, type: Number, @@ -1409,6 +1439,17 @@ const definitions = { definitions.omit.flatten('omit', obj, flatOptions) }, }), + orgs: new Definition('orgs', { + default: null, + type: [null, String, Array], + hint: '', + description: ` + When creating a Granular Access Token with \`npm token create\`, + this limits the token access to specific organizations. Provide + a comma-separated list of organization names. + `, + flatten, + }), optional: new Definition('optional', { default: null, type: [null, Boolean], @@ -1505,6 +1546,17 @@ const definitions = { `, flatten, }), + packages: new Definition('packages', { + default: [], + type: [null, String, Array], + hint: '', + description: ` + When creating a Granular Access Token with \`npm token create\`, + this limits the token access to specific packages. Provide + a comma-separated list of package names. + `, + flatten, + }), parseable: new Definition('parseable', { default: false, type: Boolean, @@ -1900,6 +1952,64 @@ const definitions = { flatOptions.projectScope = scope }, }), + scopes: new Definition('scopes', { + default: null, + type: [null, String, Array], + hint: '<@scope1,@scope2>', + description: ` + When creating a Granular Access Token with \`npm token create\`, + this limits the token access to specific scopes. Provide + a comma-separated list of scope names (with or without @ prefix). + `, + flatten, + }), + 'packages-all': new Definition('packages-all', { + default: false, + type: Boolean, + description: ` + When creating a Granular Access Token with \`npm token create\`, + grants the token access to all packages instead of limiting to + specific packages. + `, + flatten, + }), + 'packages-and-scopes-permission': new Definition('packages-and-scopes-permission', { + default: null, + type: [null, 'read-only', 'read-write', 'no-access'], + description: ` + When creating a Granular Access Token with \`npm token create\`, + sets the permission level for packages and scopes. Options are + "read-only", "read-write", or "no-access". + `, + flatten, + }), + 'orgs-permission': new Definition('orgs-permission', { + default: null, + type: [null, 'read-only', 'read-write', 'no-access'], + description: ` + When creating a Granular Access Token with \`npm token create\`, + sets the permission level for organizations. Options are + "read-only", "read-write", or "no-access". + `, + flatten, + }), + password: new Definition('password', { + default: null, + type: [null, String], + description: ` + Password for authentication. Can be provided via command line when + creating tokens, though it's generally safer to be prompted for it. + `, + flatten, + }), + 'token-description': new Definition('token-description', { + default: null, + type: [null, String], + description: ` + Description text for the token when using \`npm token create\`. + `, + flatten, + }), 'script-shell': new Definition('script-shell', { default: null, defaultDescription: ` diff --git a/deps/npm/node_modules/@npmcli/config/package.json b/deps/npm/node_modules/@npmcli/config/package.json index 651e2135893f48..7317cda73cd816 100644 --- a/deps/npm/node_modules/@npmcli/config/package.json +++ b/deps/npm/node_modules/@npmcli/config/package.json @@ -1,6 +1,6 @@ { "name": "@npmcli/config", - "version": "10.4.2", + "version": "10.4.3", "files": [ "bin/", "lib/" @@ -40,9 +40,9 @@ "@npmcli/map-workspaces": "^5.0.0", "@npmcli/package-json": "^7.0.0", "ci-info": "^4.0.0", - "ini": "^5.0.0", + "ini": "^6.0.0", "nopt": "^8.1.0", - "proc-log": "^5.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.5", "walk-up-path": "^4.0.0" }, diff --git a/deps/npm/node_modules/@npmcli/git/package.json b/deps/npm/node_modules/@npmcli/git/package.json index f4e844bccab0db..78d077513dd81a 100644 --- a/deps/npm/node_modules/@npmcli/git/package.json +++ b/deps/npm/node_modules/@npmcli/git/package.json @@ -1,6 +1,6 @@ { "name": "@npmcli/git", - "version": "7.0.0", + "version": "7.0.1", "main": "lib/index.js", "files": [ "bin/", @@ -38,14 +38,14 @@ "tap": "^16.0.1" }, "dependencies": { - "@npmcli/promise-spawn": "^8.0.0", - "ini": "^5.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "ini": "^6.0.0", "lru-cache": "^11.2.1", "npm-pick-manifest": "^11.0.1", - "proc-log": "^5.0.0", + "proc-log": "^6.0.0", "promise-retry": "^2.0.1", "semver": "^7.3.5", - "which": "^5.0.0" + "which": "^6.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" diff --git a/deps/npm/node_modules/@npmcli/installed-package-contents/package.json b/deps/npm/node_modules/@npmcli/installed-package-contents/package.json index d5b68a737daf49..599b285fb467d7 100644 --- a/deps/npm/node_modules/@npmcli/installed-package-contents/package.json +++ b/deps/npm/node_modules/@npmcli/installed-package-contents/package.json @@ -1,6 +1,6 @@ { "name": "@npmcli/installed-package-contents", - "version": "3.0.0", + "version": "4.0.0", "description": "Get the list of files installed in a package in node_modules, including bundled dependencies", "author": "GitHub Inc.", "main": "lib/index.js", @@ -20,12 +20,12 @@ }, "devDependencies": { "@npmcli/eslint-config": "^5.0.0", - "@npmcli/template-oss": "4.23.3", + "@npmcli/template-oss": "4.27.1", "tap": "^16.3.0" }, "dependencies": { - "npm-bundled": "^4.0.0", - "npm-normalize-package-bin": "^4.0.0" + "npm-bundled": "^5.0.0", + "npm-normalize-package-bin": "^5.0.0" }, "repository": { "type": "git", @@ -36,11 +36,11 @@ "lib/" ], "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.23.3", + "version": "4.27.1", "publish": true }, "tap": { diff --git a/deps/npm/node_modules/@npmcli/map-workspaces/package.json b/deps/npm/node_modules/@npmcli/map-workspaces/package.json index fb77ea8615c1ca..5f6c9c24f5ed76 100644 --- a/deps/npm/node_modules/@npmcli/map-workspaces/package.json +++ b/deps/npm/node_modules/@npmcli/map-workspaces/package.json @@ -1,6 +1,6 @@ { "name": "@npmcli/map-workspaces", - "version": "5.0.0", + "version": "5.0.1", "main": "lib/index.js", "files": [ "bin/", @@ -44,18 +44,18 @@ }, "devDependencies": { "@npmcli/eslint-config": "^5.0.0", - "@npmcli/template-oss": "4.25.0", + "@npmcli/template-oss": "4.27.1", "tap": "^16.0.1" }, "dependencies": { - "@npmcli/name-from-folder": "^3.0.0", + "@npmcli/name-from-folder": "^4.0.0", "@npmcli/package-json": "^7.0.0", "glob": "^11.0.3", "minimatch": "^10.0.3" }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.25.0", + "version": "4.27.1", "publish": "true" } } diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/package.json b/deps/npm/node_modules/@npmcli/metavuln-calculator/package.json index 9d17000653c0e7..02b13bc8e82193 100644 --- a/deps/npm/node_modules/@npmcli/metavuln-calculator/package.json +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/package.json @@ -1,6 +1,6 @@ { "name": "@npmcli/metavuln-calculator", - "version": "9.0.2", + "version": "9.0.3", "main": "lib/index.js", "files": [ "bin/", @@ -34,15 +34,15 @@ }, "devDependencies": { "@npmcli/eslint-config": "^5.0.0", - "@npmcli/template-oss": "4.25.0", + "@npmcli/template-oss": "4.27.1", "require-inject": "^1.4.4", "tap": "^16.0.1" }, "dependencies": { "cacache": "^20.0.0", - "json-parse-even-better-errors": "^4.0.0", + "json-parse-even-better-errors": "^5.0.0", "pacote": "^21.0.0", - "proc-log": "^5.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.5" }, "engines": { @@ -50,7 +50,7 @@ }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.25.0", + "version": "4.27.1", "publish": "true", "ciVersions": [ "16.14.0", diff --git a/deps/npm/node_modules/@npmcli/name-from-folder/package.json b/deps/npm/node_modules/@npmcli/name-from-folder/package.json index 323edd81d22fb4..503667521565d4 100644 --- a/deps/npm/node_modules/@npmcli/name-from-folder/package.json +++ b/deps/npm/node_modules/@npmcli/name-from-folder/package.json @@ -1,6 +1,6 @@ { "name": "@npmcli/name-from-folder", - "version": "3.0.0", + "version": "4.0.0", "files": [ "bin/", "lib/" @@ -25,15 +25,15 @@ }, "devDependencies": { "@npmcli/eslint-config": "^5.0.0", - "@npmcli/template-oss": "4.23.3", + "@npmcli/template-oss": "4.27.1", "tap": "^16.3.2" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.23.3", + "version": "4.27.1", "publish": true }, "tap": { diff --git a/deps/npm/node_modules/@npmcli/node-gyp/package.json b/deps/npm/node_modules/@npmcli/node-gyp/package.json index 3be9663a39de04..a34dc6be617516 100644 --- a/deps/npm/node_modules/@npmcli/node-gyp/package.json +++ b/deps/npm/node_modules/@npmcli/node-gyp/package.json @@ -1,6 +1,6 @@ { "name": "@npmcli/node-gyp", - "version": "4.0.0", + "version": "5.0.0", "description": "Tools for dealing with node-gyp packages", "scripts": { "test": "tap", @@ -30,15 +30,15 @@ "license": "ISC", "devDependencies": { "@npmcli/eslint-config": "^5.0.0", - "@npmcli/template-oss": "4.23.3", + "@npmcli/template-oss": "4.27.1", "tap": "^16.0.1" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.23.3", + "version": "4.27.1", "publish": true }, "tap": { diff --git a/deps/npm/node_modules/@npmcli/package-json/lib/index.js b/deps/npm/node_modules/@npmcli/package-json/lib/index.js index fabe5fbcda7bc5..adcbac67eabbac 100644 --- a/deps/npm/node_modules/@npmcli/package-json/lib/index.js +++ b/deps/npm/node_modules/@npmcli/package-json/lib/index.js @@ -225,7 +225,7 @@ class PackageJson { this.#manifest = step({ content, originalContent: this.content }) } - // unknown properties will just be overwitten + // unknown properties will just be overwritten for (const [key, value] of Object.entries(content)) { if (!knownKeys.has(key)) { this.content[key] = value diff --git a/deps/npm/node_modules/@npmcli/package-json/package.json b/deps/npm/node_modules/@npmcli/package-json/package.json index 46c39c22a19007..3dc9f45c847cf4 100644 --- a/deps/npm/node_modules/@npmcli/package-json/package.json +++ b/deps/npm/node_modules/@npmcli/package-json/package.json @@ -1,6 +1,6 @@ { "name": "@npmcli/package-json", - "version": "7.0.1", + "version": "7.0.2", "description": "Programmatic API to update package.json", "keywords": [ "npm", @@ -32,14 +32,14 @@ "@npmcli/git": "^7.0.0", "glob": "^11.0.3", "hosted-git-info": "^9.0.0", - "json-parse-even-better-errors": "^4.0.0", - "proc-log": "^5.0.0", + "json-parse-even-better-errors": "^5.0.0", + "proc-log": "^6.0.0", "semver": "^7.5.3", "validate-npm-package-license": "^3.0.4" }, "devDependencies": { - "@npmcli/eslint-config": "^5.1.0", - "@npmcli/template-oss": "4.25.0", + "@npmcli/eslint-config": "^6.0.0", + "@npmcli/template-oss": "4.28.0", "tap": "^16.0.1" }, "engines": { @@ -47,7 +47,7 @@ }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.25.0", + "version": "4.28.0", "publish": "true" }, "tap": { diff --git a/deps/npm/node_modules/@npmcli/promise-spawn/lib/escape.js b/deps/npm/node_modules/@npmcli/promise-spawn/lib/escape.js index 9aca8bde70a6e9..5fab00210f26c1 100644 --- a/deps/npm/node_modules/@npmcli/promise-spawn/lib/escape.js +++ b/deps/npm/node_modules/@npmcli/promise-spawn/lib/escape.js @@ -1,6 +1,5 @@ 'use strict' -// eslint-disable-next-line max-len // this code adapted from: https://blogs.msdn.microsoft.com/twistylittlepassagesallalike/2011/04/23/everyone-quotes-command-line-arguments-the-wrong-way/ const cmd = (input, doubleEscape) => { if (!input.length) { diff --git a/deps/npm/node_modules/@npmcli/promise-spawn/package.json b/deps/npm/node_modules/@npmcli/promise-spawn/package.json index 1436659a446126..f00ee324355c8f 100644 --- a/deps/npm/node_modules/@npmcli/promise-spawn/package.json +++ b/deps/npm/node_modules/@npmcli/promise-spawn/package.json @@ -1,6 +1,6 @@ { "name": "@npmcli/promise-spawn", - "version": "8.0.3", + "version": "9.0.1", "files": [ "bin/", "lib/" @@ -32,20 +32,20 @@ ] }, "devDependencies": { - "@npmcli/eslint-config": "^5.0.0", - "@npmcli/template-oss": "4.25.0", + "@npmcli/eslint-config": "^6.0.0", + "@npmcli/template-oss": "4.28.0", "spawk": "^1.7.1", "tap": "^16.0.1" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.25.0", + "version": "4.28.0", "publish": true }, "dependencies": { - "which": "^5.0.0" + "which": "^6.0.0" } } diff --git a/deps/npm/node_modules/@npmcli/redact/package.json b/deps/npm/node_modules/@npmcli/redact/package.json index b5070113b1330c..53d0edf50b73d4 100644 --- a/deps/npm/node_modules/@npmcli/redact/package.json +++ b/deps/npm/node_modules/@npmcli/redact/package.json @@ -1,6 +1,6 @@ { "name": "@npmcli/redact", - "version": "3.2.2", + "version": "4.0.0", "description": "Redact sensitive npm information from output", "main": "lib/index.js", "exports": { @@ -31,7 +31,7 @@ }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.24.3", + "version": "4.27.1", "publish": true }, "tap": { @@ -43,10 +43,10 @@ }, "devDependencies": { "@npmcli/eslint-config": "^5.0.0", - "@npmcli/template-oss": "4.24.3", + "@npmcli/template-oss": "4.27.1", "tap": "^16.3.10" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } } diff --git a/deps/npm/node_modules/@npmcli/run-script/package.json b/deps/npm/node_modules/@npmcli/run-script/package.json index 2873f7cbf91c52..9ddb499084173c 100644 --- a/deps/npm/node_modules/@npmcli/run-script/package.json +++ b/deps/npm/node_modules/@npmcli/run-script/package.json @@ -1,6 +1,6 @@ { "name": "@npmcli/run-script", - "version": "10.0.0", + "version": "10.0.3", "description": "Run a lifecycle script for a package (descendant of npm-lifecycle)", "author": "GitHub Inc.", "license": "ISC", @@ -15,18 +15,18 @@ "template-oss-apply": "template-oss-apply --force" }, "devDependencies": { - "@npmcli/eslint-config": "^5.0.0", - "@npmcli/template-oss": "4.25.0", + "@npmcli/eslint-config": "^6.0.0", + "@npmcli/template-oss": "4.28.0", "spawk": "^1.8.1", "tap": "^16.0.1" }, "dependencies": { - "@npmcli/node-gyp": "^4.0.0", + "@npmcli/node-gyp": "^5.0.0", "@npmcli/package-json": "^7.0.0", - "@npmcli/promise-spawn": "^8.0.0", - "node-gyp": "^11.0.0", - "proc-log": "^5.0.0", - "which": "^5.0.0" + "@npmcli/promise-spawn": "^9.0.0", + "node-gyp": "^12.1.0", + "proc-log": "^6.0.0", + "which": "^6.0.0" }, "files": [ "bin/", @@ -42,7 +42,7 @@ }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.25.0", + "version": "4.28.0", "publish": "true" }, "tap": { diff --git a/deps/npm/node_modules/@pkgjs/parseargs/LICENSE b/deps/npm/node_modules/@pkgjs/parseargs/LICENSE deleted file mode 100644 index 261eeb9e9f8b2b..00000000000000 --- a/deps/npm/node_modules/@pkgjs/parseargs/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/deps/npm/node_modules/@pkgjs/parseargs/examples/is-default-value.js b/deps/npm/node_modules/@pkgjs/parseargs/examples/is-default-value.js deleted file mode 100644 index 0a67972b71d135..00000000000000 --- a/deps/npm/node_modules/@pkgjs/parseargs/examples/is-default-value.js +++ /dev/null @@ -1,25 +0,0 @@ -'use strict'; - -// This example shows how to understand if a default value is used or not. - -// 1. const { parseArgs } = require('node:util'); // from node -// 2. const { parseArgs } = require('@pkgjs/parseargs'); // from package -const { parseArgs } = require('..'); // in repo - -const options = { - file: { short: 'f', type: 'string', default: 'FOO' }, -}; - -const { values, tokens } = parseArgs({ options, tokens: true }); - -const isFileDefault = !tokens.some((token) => token.kind === 'option' && - token.name === 'file' -); - -console.log(values); -console.log(`Is the file option [${values.file}] the default value? ${isFileDefault}`); - -// Try the following: -// node is-default-value.js -// node is-default-value.js -f FILE -// node is-default-value.js --file FILE diff --git a/deps/npm/node_modules/@pkgjs/parseargs/examples/limit-long-syntax.js b/deps/npm/node_modules/@pkgjs/parseargs/examples/limit-long-syntax.js deleted file mode 100644 index 943e643ee9553b..00000000000000 --- a/deps/npm/node_modules/@pkgjs/parseargs/examples/limit-long-syntax.js +++ /dev/null @@ -1,35 +0,0 @@ -'use strict'; - -// This is an example of using tokens to add a custom behaviour. -// -// Require the use of `=` for long options and values by blocking -// the use of space separated values. -// So allow `--foo=bar`, and not allow `--foo bar`. -// -// Note: this is not a common behaviour, most CLIs allow both forms. - -// 1. const { parseArgs } = require('node:util'); // from node -// 2. const { parseArgs } = require('@pkgjs/parseargs'); // from package -const { parseArgs } = require('..'); // in repo - -const options = { - file: { short: 'f', type: 'string' }, - log: { type: 'string' }, -}; - -const { values, tokens } = parseArgs({ options, tokens: true }); - -const badToken = tokens.find((token) => token.kind === 'option' && - token.value != null && - token.rawName.startsWith('--') && - !token.inlineValue -); -if (badToken) { - throw new Error(`Option value for '${badToken.rawName}' must be inline, like '${badToken.rawName}=VALUE'`); -} - -console.log(values); - -// Try the following: -// node limit-long-syntax.js -f FILE --log=LOG -// node limit-long-syntax.js --file FILE diff --git a/deps/npm/node_modules/@pkgjs/parseargs/examples/negate.js b/deps/npm/node_modules/@pkgjs/parseargs/examples/negate.js deleted file mode 100644 index b6634690a4a0c0..00000000000000 --- a/deps/npm/node_modules/@pkgjs/parseargs/examples/negate.js +++ /dev/null @@ -1,43 +0,0 @@ -'use strict'; - -// This example is used in the documentation. - -// How might I add my own support for --no-foo? - -// 1. const { parseArgs } = require('node:util'); // from node -// 2. const { parseArgs } = require('@pkgjs/parseargs'); // from package -const { parseArgs } = require('..'); // in repo - -const options = { - 'color': { type: 'boolean' }, - 'no-color': { type: 'boolean' }, - 'logfile': { type: 'string' }, - 'no-logfile': { type: 'boolean' }, -}; -const { values, tokens } = parseArgs({ options, tokens: true }); - -// Reprocess the option tokens and overwrite the returned values. -tokens - .filter((token) => token.kind === 'option') - .forEach((token) => { - if (token.name.startsWith('no-')) { - // Store foo:false for --no-foo - const positiveName = token.name.slice(3); - values[positiveName] = false; - delete values[token.name]; - } else { - // Resave value so last one wins if both --foo and --no-foo. - values[token.name] = token.value ?? true; - } - }); - -const color = values.color; -const logfile = values.logfile ?? 'default.log'; - -console.log({ logfile, color }); - -// Try the following: -// node negate.js -// node negate.js --no-logfile --no-color -// negate.js --logfile=test.log --color -// node negate.js --no-logfile --logfile=test.log --color --no-color diff --git a/deps/npm/node_modules/@pkgjs/parseargs/examples/no-repeated-options.js b/deps/npm/node_modules/@pkgjs/parseargs/examples/no-repeated-options.js deleted file mode 100644 index 0c324688af0305..00000000000000 --- a/deps/npm/node_modules/@pkgjs/parseargs/examples/no-repeated-options.js +++ /dev/null @@ -1,31 +0,0 @@ -'use strict'; - -// This is an example of using tokens to add a custom behaviour. -// -// Throw an error if an option is used more than once. - -// 1. const { parseArgs } = require('node:util'); // from node -// 2. const { parseArgs } = require('@pkgjs/parseargs'); // from package -const { parseArgs } = require('..'); // in repo - -const options = { - ding: { type: 'boolean', short: 'd' }, - beep: { type: 'boolean', short: 'b' } -}; -const { values, tokens } = parseArgs({ options, tokens: true }); - -const seenBefore = new Set(); -tokens.forEach((token) => { - if (token.kind !== 'option') return; - if (seenBefore.has(token.name)) { - throw new Error(`option '${token.name}' used multiple times`); - } - seenBefore.add(token.name); -}); - -console.log(values); - -// Try the following: -// node no-repeated-options --ding --beep -// node no-repeated-options --beep -b -// node no-repeated-options -ddd diff --git a/deps/npm/node_modules/@pkgjs/parseargs/examples/ordered-options.mjs b/deps/npm/node_modules/@pkgjs/parseargs/examples/ordered-options.mjs deleted file mode 100644 index 8ab7367b8bbb11..00000000000000 --- a/deps/npm/node_modules/@pkgjs/parseargs/examples/ordered-options.mjs +++ /dev/null @@ -1,41 +0,0 @@ -// This is an example of using tokens to add a custom behaviour. -// -// This adds a option order check so that --some-unstable-option -// may only be used after --enable-experimental-options -// -// Note: this is not a common behaviour, the order of different options -// does not usually matter. - -import { parseArgs } from '../index.js'; - -function findTokenIndex(tokens, target) { - return tokens.findIndex((token) => token.kind === 'option' && - token.name === target - ); -} - -const experimentalName = 'enable-experimental-options'; -const unstableName = 'some-unstable-option'; - -const options = { - [experimentalName]: { type: 'boolean' }, - [unstableName]: { type: 'boolean' }, -}; - -const { values, tokens } = parseArgs({ options, tokens: true }); - -const experimentalIndex = findTokenIndex(tokens, experimentalName); -const unstableIndex = findTokenIndex(tokens, unstableName); -if (unstableIndex !== -1 && - ((experimentalIndex === -1) || (unstableIndex < experimentalIndex))) { - throw new Error(`'--${experimentalName}' must be specified before '--${unstableName}'`); -} - -console.log(values); - -/* eslint-disable max-len */ -// Try the following: -// node ordered-options.mjs -// node ordered-options.mjs --some-unstable-option -// node ordered-options.mjs --some-unstable-option --enable-experimental-options -// node ordered-options.mjs --enable-experimental-options --some-unstable-option diff --git a/deps/npm/node_modules/@pkgjs/parseargs/examples/simple-hard-coded.js b/deps/npm/node_modules/@pkgjs/parseargs/examples/simple-hard-coded.js deleted file mode 100644 index eff04c2a60fa21..00000000000000 --- a/deps/npm/node_modules/@pkgjs/parseargs/examples/simple-hard-coded.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict'; - -// This example is used in the documentation. - -// 1. const { parseArgs } = require('node:util'); // from node -// 2. const { parseArgs } = require('@pkgjs/parseargs'); // from package -const { parseArgs } = require('..'); // in repo - -const args = ['-f', '--bar', 'b']; -const options = { - foo: { - type: 'boolean', - short: 'f' - }, - bar: { - type: 'string' - } -}; -const { - values, - positionals -} = parseArgs({ args, options }); -console.log(values, positionals); - -// Try the following: -// node simple-hard-coded.js diff --git a/deps/npm/node_modules/@pkgjs/parseargs/index.js b/deps/npm/node_modules/@pkgjs/parseargs/index.js deleted file mode 100644 index b1004c7b72f271..00000000000000 --- a/deps/npm/node_modules/@pkgjs/parseargs/index.js +++ /dev/null @@ -1,396 +0,0 @@ -'use strict'; - -const { - ArrayPrototypeForEach, - ArrayPrototypeIncludes, - ArrayPrototypeMap, - ArrayPrototypePush, - ArrayPrototypePushApply, - ArrayPrototypeShift, - ArrayPrototypeSlice, - ArrayPrototypeUnshiftApply, - ObjectEntries, - ObjectPrototypeHasOwnProperty: ObjectHasOwn, - StringPrototypeCharAt, - StringPrototypeIndexOf, - StringPrototypeSlice, - StringPrototypeStartsWith, -} = require('./internal/primordials'); - -const { - validateArray, - validateBoolean, - validateBooleanArray, - validateObject, - validateString, - validateStringArray, - validateUnion, -} = require('./internal/validators'); - -const { - kEmptyObject, -} = require('./internal/util'); - -const { - findLongOptionForShort, - isLoneLongOption, - isLoneShortOption, - isLongOptionAndValue, - isOptionValue, - isOptionLikeValue, - isShortOptionAndValue, - isShortOptionGroup, - useDefaultValueOption, - objectGetOwn, - optionsGetOwn, -} = require('./utils'); - -const { - codes: { - ERR_INVALID_ARG_VALUE, - ERR_PARSE_ARGS_INVALID_OPTION_VALUE, - ERR_PARSE_ARGS_UNKNOWN_OPTION, - ERR_PARSE_ARGS_UNEXPECTED_POSITIONAL, - }, -} = require('./internal/errors'); - -function getMainArgs() { - // Work out where to slice process.argv for user supplied arguments. - - // Check node options for scenarios where user CLI args follow executable. - const execArgv = process.execArgv; - if (ArrayPrototypeIncludes(execArgv, '-e') || - ArrayPrototypeIncludes(execArgv, '--eval') || - ArrayPrototypeIncludes(execArgv, '-p') || - ArrayPrototypeIncludes(execArgv, '--print')) { - return ArrayPrototypeSlice(process.argv, 1); - } - - // Normally first two arguments are executable and script, then CLI arguments - return ArrayPrototypeSlice(process.argv, 2); -} - -/** - * In strict mode, throw for possible usage errors like --foo --bar - * - * @param {object} token - from tokens as available from parseArgs - */ -function checkOptionLikeValue(token) { - if (!token.inlineValue && isOptionLikeValue(token.value)) { - // Only show short example if user used short option. - const example = StringPrototypeStartsWith(token.rawName, '--') ? - `'${token.rawName}=-XYZ'` : - `'--${token.name}=-XYZ' or '${token.rawName}-XYZ'`; - const errorMessage = `Option '${token.rawName}' argument is ambiguous. -Did you forget to specify the option argument for '${token.rawName}'? -To specify an option argument starting with a dash use ${example}.`; - throw new ERR_PARSE_ARGS_INVALID_OPTION_VALUE(errorMessage); - } -} - -/** - * In strict mode, throw for usage errors. - * - * @param {object} config - from config passed to parseArgs - * @param {object} token - from tokens as available from parseArgs - */ -function checkOptionUsage(config, token) { - if (!ObjectHasOwn(config.options, token.name)) { - throw new ERR_PARSE_ARGS_UNKNOWN_OPTION( - token.rawName, config.allowPositionals); - } - - const short = optionsGetOwn(config.options, token.name, 'short'); - const shortAndLong = `${short ? `-${short}, ` : ''}--${token.name}`; - const type = optionsGetOwn(config.options, token.name, 'type'); - if (type === 'string' && typeof token.value !== 'string') { - throw new ERR_PARSE_ARGS_INVALID_OPTION_VALUE(`Option '${shortAndLong} ' argument missing`); - } - // (Idiomatic test for undefined||null, expecting undefined.) - if (type === 'boolean' && token.value != null) { - throw new ERR_PARSE_ARGS_INVALID_OPTION_VALUE(`Option '${shortAndLong}' does not take an argument`); - } -} - - -/** - * Store the option value in `values`. - * - * @param {string} longOption - long option name e.g. 'foo' - * @param {string|undefined} optionValue - value from user args - * @param {object} options - option configs, from parseArgs({ options }) - * @param {object} values - option values returned in `values` by parseArgs - */ -function storeOption(longOption, optionValue, options, values) { - if (longOption === '__proto__') { - return; // No. Just no. - } - - // We store based on the option value rather than option type, - // preserving the users intent for author to deal with. - const newValue = optionValue ?? true; - if (optionsGetOwn(options, longOption, 'multiple')) { - // Always store value in array, including for boolean. - // values[longOption] starts out not present, - // first value is added as new array [newValue], - // subsequent values are pushed to existing array. - // (note: values has null prototype, so simpler usage) - if (values[longOption]) { - ArrayPrototypePush(values[longOption], newValue); - } else { - values[longOption] = [newValue]; - } - } else { - values[longOption] = newValue; - } -} - -/** - * Store the default option value in `values`. - * - * @param {string} longOption - long option name e.g. 'foo' - * @param {string - * | boolean - * | string[] - * | boolean[]} optionValue - default value from option config - * @param {object} values - option values returned in `values` by parseArgs - */ -function storeDefaultOption(longOption, optionValue, values) { - if (longOption === '__proto__') { - return; // No. Just no. - } - - values[longOption] = optionValue; -} - -/** - * Process args and turn into identified tokens: - * - option (along with value, if any) - * - positional - * - option-terminator - * - * @param {string[]} args - from parseArgs({ args }) or mainArgs - * @param {object} options - option configs, from parseArgs({ options }) - */ -function argsToTokens(args, options) { - const tokens = []; - let index = -1; - let groupCount = 0; - - const remainingArgs = ArrayPrototypeSlice(args); - while (remainingArgs.length > 0) { - const arg = ArrayPrototypeShift(remainingArgs); - const nextArg = remainingArgs[0]; - if (groupCount > 0) - groupCount--; - else - index++; - - // Check if `arg` is an options terminator. - // Guideline 10 in https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html - if (arg === '--') { - // Everything after a bare '--' is considered a positional argument. - ArrayPrototypePush(tokens, { kind: 'option-terminator', index }); - ArrayPrototypePushApply( - tokens, ArrayPrototypeMap(remainingArgs, (arg) => { - return { kind: 'positional', index: ++index, value: arg }; - }) - ); - break; // Finished processing args, leave while loop. - } - - if (isLoneShortOption(arg)) { - // e.g. '-f' - const shortOption = StringPrototypeCharAt(arg, 1); - const longOption = findLongOptionForShort(shortOption, options); - let value; - let inlineValue; - if (optionsGetOwn(options, longOption, 'type') === 'string' && - isOptionValue(nextArg)) { - // e.g. '-f', 'bar' - value = ArrayPrototypeShift(remainingArgs); - inlineValue = false; - } - ArrayPrototypePush( - tokens, - { kind: 'option', name: longOption, rawName: arg, - index, value, inlineValue }); - if (value != null) ++index; - continue; - } - - if (isShortOptionGroup(arg, options)) { - // Expand -fXzy to -f -X -z -y - const expanded = []; - for (let index = 1; index < arg.length; index++) { - const shortOption = StringPrototypeCharAt(arg, index); - const longOption = findLongOptionForShort(shortOption, options); - if (optionsGetOwn(options, longOption, 'type') !== 'string' || - index === arg.length - 1) { - // Boolean option, or last short in group. Well formed. - ArrayPrototypePush(expanded, `-${shortOption}`); - } else { - // String option in middle. Yuck. - // Expand -abfFILE to -a -b -fFILE - ArrayPrototypePush(expanded, `-${StringPrototypeSlice(arg, index)}`); - break; // finished short group - } - } - ArrayPrototypeUnshiftApply(remainingArgs, expanded); - groupCount = expanded.length; - continue; - } - - if (isShortOptionAndValue(arg, options)) { - // e.g. -fFILE - const shortOption = StringPrototypeCharAt(arg, 1); - const longOption = findLongOptionForShort(shortOption, options); - const value = StringPrototypeSlice(arg, 2); - ArrayPrototypePush( - tokens, - { kind: 'option', name: longOption, rawName: `-${shortOption}`, - index, value, inlineValue: true }); - continue; - } - - if (isLoneLongOption(arg)) { - // e.g. '--foo' - const longOption = StringPrototypeSlice(arg, 2); - let value; - let inlineValue; - if (optionsGetOwn(options, longOption, 'type') === 'string' && - isOptionValue(nextArg)) { - // e.g. '--foo', 'bar' - value = ArrayPrototypeShift(remainingArgs); - inlineValue = false; - } - ArrayPrototypePush( - tokens, - { kind: 'option', name: longOption, rawName: arg, - index, value, inlineValue }); - if (value != null) ++index; - continue; - } - - if (isLongOptionAndValue(arg)) { - // e.g. --foo=bar - const equalIndex = StringPrototypeIndexOf(arg, '='); - const longOption = StringPrototypeSlice(arg, 2, equalIndex); - const value = StringPrototypeSlice(arg, equalIndex + 1); - ArrayPrototypePush( - tokens, - { kind: 'option', name: longOption, rawName: `--${longOption}`, - index, value, inlineValue: true }); - continue; - } - - ArrayPrototypePush(tokens, { kind: 'positional', index, value: arg }); - } - - return tokens; -} - -const parseArgs = (config = kEmptyObject) => { - const args = objectGetOwn(config, 'args') ?? getMainArgs(); - const strict = objectGetOwn(config, 'strict') ?? true; - const allowPositionals = objectGetOwn(config, 'allowPositionals') ?? !strict; - const returnTokens = objectGetOwn(config, 'tokens') ?? false; - const options = objectGetOwn(config, 'options') ?? { __proto__: null }; - // Bundle these up for passing to strict-mode checks. - const parseConfig = { args, strict, options, allowPositionals }; - - // Validate input configuration. - validateArray(args, 'args'); - validateBoolean(strict, 'strict'); - validateBoolean(allowPositionals, 'allowPositionals'); - validateBoolean(returnTokens, 'tokens'); - validateObject(options, 'options'); - ArrayPrototypeForEach( - ObjectEntries(options), - ({ 0: longOption, 1: optionConfig }) => { - validateObject(optionConfig, `options.${longOption}`); - - // type is required - const optionType = objectGetOwn(optionConfig, 'type'); - validateUnion(optionType, `options.${longOption}.type`, ['string', 'boolean']); - - if (ObjectHasOwn(optionConfig, 'short')) { - const shortOption = optionConfig.short; - validateString(shortOption, `options.${longOption}.short`); - if (shortOption.length !== 1) { - throw new ERR_INVALID_ARG_VALUE( - `options.${longOption}.short`, - shortOption, - 'must be a single character' - ); - } - } - - const multipleOption = objectGetOwn(optionConfig, 'multiple'); - if (ObjectHasOwn(optionConfig, 'multiple')) { - validateBoolean(multipleOption, `options.${longOption}.multiple`); - } - - const defaultValue = objectGetOwn(optionConfig, 'default'); - if (defaultValue !== undefined) { - let validator; - switch (optionType) { - case 'string': - validator = multipleOption ? validateStringArray : validateString; - break; - - case 'boolean': - validator = multipleOption ? validateBooleanArray : validateBoolean; - break; - } - validator(defaultValue, `options.${longOption}.default`); - } - } - ); - - // Phase 1: identify tokens - const tokens = argsToTokens(args, options); - - // Phase 2: process tokens into parsed option values and positionals - const result = { - values: { __proto__: null }, - positionals: [], - }; - if (returnTokens) { - result.tokens = tokens; - } - ArrayPrototypeForEach(tokens, (token) => { - if (token.kind === 'option') { - if (strict) { - checkOptionUsage(parseConfig, token); - checkOptionLikeValue(token); - } - storeOption(token.name, token.value, options, result.values); - } else if (token.kind === 'positional') { - if (!allowPositionals) { - throw new ERR_PARSE_ARGS_UNEXPECTED_POSITIONAL(token.value); - } - ArrayPrototypePush(result.positionals, token.value); - } - }); - - // Phase 3: fill in default values for missing args - ArrayPrototypeForEach(ObjectEntries(options), ({ 0: longOption, - 1: optionConfig }) => { - const mustSetDefault = useDefaultValueOption(longOption, - optionConfig, - result.values); - if (mustSetDefault) { - storeDefaultOption(longOption, - objectGetOwn(optionConfig, 'default'), - result.values); - } - }); - - - return result; -}; - -module.exports = { - parseArgs, -}; diff --git a/deps/npm/node_modules/@pkgjs/parseargs/internal/errors.js b/deps/npm/node_modules/@pkgjs/parseargs/internal/errors.js deleted file mode 100644 index e1b237b5b16395..00000000000000 --- a/deps/npm/node_modules/@pkgjs/parseargs/internal/errors.js +++ /dev/null @@ -1,47 +0,0 @@ -'use strict'; - -class ERR_INVALID_ARG_TYPE extends TypeError { - constructor(name, expected, actual) { - super(`${name} must be ${expected} got ${actual}`); - this.code = 'ERR_INVALID_ARG_TYPE'; - } -} - -class ERR_INVALID_ARG_VALUE extends TypeError { - constructor(arg1, arg2, expected) { - super(`The property ${arg1} ${expected}. Received '${arg2}'`); - this.code = 'ERR_INVALID_ARG_VALUE'; - } -} - -class ERR_PARSE_ARGS_INVALID_OPTION_VALUE extends Error { - constructor(message) { - super(message); - this.code = 'ERR_PARSE_ARGS_INVALID_OPTION_VALUE'; - } -} - -class ERR_PARSE_ARGS_UNKNOWN_OPTION extends Error { - constructor(option, allowPositionals) { - const suggestDashDash = allowPositionals ? `. To specify a positional argument starting with a '-', place it at the end of the command after '--', as in '-- ${JSON.stringify(option)}` : ''; - super(`Unknown option '${option}'${suggestDashDash}`); - this.code = 'ERR_PARSE_ARGS_UNKNOWN_OPTION'; - } -} - -class ERR_PARSE_ARGS_UNEXPECTED_POSITIONAL extends Error { - constructor(positional) { - super(`Unexpected argument '${positional}'. This command does not take positional arguments`); - this.code = 'ERR_PARSE_ARGS_UNEXPECTED_POSITIONAL'; - } -} - -module.exports = { - codes: { - ERR_INVALID_ARG_TYPE, - ERR_INVALID_ARG_VALUE, - ERR_PARSE_ARGS_INVALID_OPTION_VALUE, - ERR_PARSE_ARGS_UNKNOWN_OPTION, - ERR_PARSE_ARGS_UNEXPECTED_POSITIONAL, - } -}; diff --git a/deps/npm/node_modules/@pkgjs/parseargs/internal/primordials.js b/deps/npm/node_modules/@pkgjs/parseargs/internal/primordials.js deleted file mode 100644 index 63e23ab117a9cc..00000000000000 --- a/deps/npm/node_modules/@pkgjs/parseargs/internal/primordials.js +++ /dev/null @@ -1,393 +0,0 @@ -/* -This file is copied from https://github.com/nodejs/node/blob/v14.19.3/lib/internal/per_context/primordials.js -under the following license: - -Copyright Node.js contributors. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. -*/ - -'use strict'; - -/* eslint-disable node-core/prefer-primordials */ - -// This file subclasses and stores the JS builtins that come from the VM -// so that Node.js's builtin modules do not need to later look these up from -// the global proxy, which can be mutated by users. - -// Use of primordials have sometimes a dramatic impact on performance, please -// benchmark all changes made in performance-sensitive areas of the codebase. -// See: https://github.com/nodejs/node/pull/38248 - -const primordials = {}; - -const { - defineProperty: ReflectDefineProperty, - getOwnPropertyDescriptor: ReflectGetOwnPropertyDescriptor, - ownKeys: ReflectOwnKeys, -} = Reflect; - -// `uncurryThis` is equivalent to `func => Function.prototype.call.bind(func)`. -// It is using `bind.bind(call)` to avoid using `Function.prototype.bind` -// and `Function.prototype.call` after it may have been mutated by users. -const { apply, bind, call } = Function.prototype; -const uncurryThis = bind.bind(call); -primordials.uncurryThis = uncurryThis; - -// `applyBind` is equivalent to `func => Function.prototype.apply.bind(func)`. -// It is using `bind.bind(apply)` to avoid using `Function.prototype.bind` -// and `Function.prototype.apply` after it may have been mutated by users. -const applyBind = bind.bind(apply); -primordials.applyBind = applyBind; - -// Methods that accept a variable number of arguments, and thus it's useful to -// also create `${prefix}${key}Apply`, which uses `Function.prototype.apply`, -// instead of `Function.prototype.call`, and thus doesn't require iterator -// destructuring. -const varargsMethods = [ - // 'ArrayPrototypeConcat' is omitted, because it performs the spread - // on its own for arrays and array-likes with a truthy - // @@isConcatSpreadable symbol property. - 'ArrayOf', - 'ArrayPrototypePush', - 'ArrayPrototypeUnshift', - // 'FunctionPrototypeCall' is omitted, since there's 'ReflectApply' - // and 'FunctionPrototypeApply'. - 'MathHypot', - 'MathMax', - 'MathMin', - 'StringPrototypeConcat', - 'TypedArrayOf', -]; - -function getNewKey(key) { - return typeof key === 'symbol' ? - `Symbol${key.description[7].toUpperCase()}${key.description.slice(8)}` : - `${key[0].toUpperCase()}${key.slice(1)}`; -} - -function copyAccessor(dest, prefix, key, { enumerable, get, set }) { - ReflectDefineProperty(dest, `${prefix}Get${key}`, { - value: uncurryThis(get), - enumerable - }); - if (set !== undefined) { - ReflectDefineProperty(dest, `${prefix}Set${key}`, { - value: uncurryThis(set), - enumerable - }); - } -} - -function copyPropsRenamed(src, dest, prefix) { - for (const key of ReflectOwnKeys(src)) { - const newKey = getNewKey(key); - const desc = ReflectGetOwnPropertyDescriptor(src, key); - if ('get' in desc) { - copyAccessor(dest, prefix, newKey, desc); - } else { - const name = `${prefix}${newKey}`; - ReflectDefineProperty(dest, name, desc); - if (varargsMethods.includes(name)) { - ReflectDefineProperty(dest, `${name}Apply`, { - // `src` is bound as the `this` so that the static `this` points - // to the object it was defined on, - // e.g.: `ArrayOfApply` gets a `this` of `Array`: - value: applyBind(desc.value, src), - }); - } - } - } -} - -function copyPropsRenamedBound(src, dest, prefix) { - for (const key of ReflectOwnKeys(src)) { - const newKey = getNewKey(key); - const desc = ReflectGetOwnPropertyDescriptor(src, key); - if ('get' in desc) { - copyAccessor(dest, prefix, newKey, desc); - } else { - const { value } = desc; - if (typeof value === 'function') { - desc.value = value.bind(src); - } - - const name = `${prefix}${newKey}`; - ReflectDefineProperty(dest, name, desc); - if (varargsMethods.includes(name)) { - ReflectDefineProperty(dest, `${name}Apply`, { - value: applyBind(value, src), - }); - } - } - } -} - -function copyPrototype(src, dest, prefix) { - for (const key of ReflectOwnKeys(src)) { - const newKey = getNewKey(key); - const desc = ReflectGetOwnPropertyDescriptor(src, key); - if ('get' in desc) { - copyAccessor(dest, prefix, newKey, desc); - } else { - const { value } = desc; - if (typeof value === 'function') { - desc.value = uncurryThis(value); - } - - const name = `${prefix}${newKey}`; - ReflectDefineProperty(dest, name, desc); - if (varargsMethods.includes(name)) { - ReflectDefineProperty(dest, `${name}Apply`, { - value: applyBind(value), - }); - } - } - } -} - -// Create copies of configurable value properties of the global object -[ - 'Proxy', - 'globalThis', -].forEach((name) => { - // eslint-disable-next-line no-restricted-globals - primordials[name] = globalThis[name]; -}); - -// Create copies of URI handling functions -[ - decodeURI, - decodeURIComponent, - encodeURI, - encodeURIComponent, -].forEach((fn) => { - primordials[fn.name] = fn; -}); - -// Create copies of the namespace objects -[ - 'JSON', - 'Math', - 'Proxy', - 'Reflect', -].forEach((name) => { - // eslint-disable-next-line no-restricted-globals - copyPropsRenamed(global[name], primordials, name); -}); - -// Create copies of intrinsic objects -[ - 'Array', - 'ArrayBuffer', - 'BigInt', - 'BigInt64Array', - 'BigUint64Array', - 'Boolean', - 'DataView', - 'Date', - 'Error', - 'EvalError', - 'Float32Array', - 'Float64Array', - 'Function', - 'Int16Array', - 'Int32Array', - 'Int8Array', - 'Map', - 'Number', - 'Object', - 'RangeError', - 'ReferenceError', - 'RegExp', - 'Set', - 'String', - 'Symbol', - 'SyntaxError', - 'TypeError', - 'URIError', - 'Uint16Array', - 'Uint32Array', - 'Uint8Array', - 'Uint8ClampedArray', - 'WeakMap', - 'WeakSet', -].forEach((name) => { - // eslint-disable-next-line no-restricted-globals - const original = global[name]; - primordials[name] = original; - copyPropsRenamed(original, primordials, name); - copyPrototype(original.prototype, primordials, `${name}Prototype`); -}); - -// Create copies of intrinsic objects that require a valid `this` to call -// static methods. -// Refs: https://www.ecma-international.org/ecma-262/#sec-promise.all -[ - 'Promise', -].forEach((name) => { - // eslint-disable-next-line no-restricted-globals - const original = global[name]; - primordials[name] = original; - copyPropsRenamedBound(original, primordials, name); - copyPrototype(original.prototype, primordials, `${name}Prototype`); -}); - -// Create copies of abstract intrinsic objects that are not directly exposed -// on the global object. -// Refs: https://tc39.es/ecma262/#sec-%typedarray%-intrinsic-object -[ - { name: 'TypedArray', original: Reflect.getPrototypeOf(Uint8Array) }, - { name: 'ArrayIterator', original: { - prototype: Reflect.getPrototypeOf(Array.prototype[Symbol.iterator]()), - } }, - { name: 'StringIterator', original: { - prototype: Reflect.getPrototypeOf(String.prototype[Symbol.iterator]()), - } }, -].forEach(({ name, original }) => { - primordials[name] = original; - // The static %TypedArray% methods require a valid `this`, but can't be bound, - // as they need a subclass constructor as the receiver: - copyPrototype(original, primordials, name); - copyPrototype(original.prototype, primordials, `${name}Prototype`); -}); - -/* eslint-enable node-core/prefer-primordials */ - -const { - ArrayPrototypeForEach, - FunctionPrototypeCall, - Map, - ObjectFreeze, - ObjectSetPrototypeOf, - Set, - SymbolIterator, - WeakMap, - WeakSet, -} = primordials; - -// Because these functions are used by `makeSafe`, which is exposed -// on the `primordials` object, it's important to use const references -// to the primordials that they use: -const createSafeIterator = (factory, next) => { - class SafeIterator { - constructor(iterable) { - this._iterator = factory(iterable); - } - next() { - return next(this._iterator); - } - [SymbolIterator]() { - return this; - } - } - ObjectSetPrototypeOf(SafeIterator.prototype, null); - ObjectFreeze(SafeIterator.prototype); - ObjectFreeze(SafeIterator); - return SafeIterator; -}; - -primordials.SafeArrayIterator = createSafeIterator( - primordials.ArrayPrototypeSymbolIterator, - primordials.ArrayIteratorPrototypeNext -); -primordials.SafeStringIterator = createSafeIterator( - primordials.StringPrototypeSymbolIterator, - primordials.StringIteratorPrototypeNext -); - -const copyProps = (src, dest) => { - ArrayPrototypeForEach(ReflectOwnKeys(src), (key) => { - if (!ReflectGetOwnPropertyDescriptor(dest, key)) { - ReflectDefineProperty( - dest, - key, - ReflectGetOwnPropertyDescriptor(src, key)); - } - }); -}; - -const makeSafe = (unsafe, safe) => { - if (SymbolIterator in unsafe.prototype) { - const dummy = new unsafe(); - let next; // We can reuse the same `next` method. - - ArrayPrototypeForEach(ReflectOwnKeys(unsafe.prototype), (key) => { - if (!ReflectGetOwnPropertyDescriptor(safe.prototype, key)) { - const desc = ReflectGetOwnPropertyDescriptor(unsafe.prototype, key); - if ( - typeof desc.value === 'function' && - desc.value.length === 0 && - SymbolIterator in (FunctionPrototypeCall(desc.value, dummy) ?? {}) - ) { - const createIterator = uncurryThis(desc.value); - next = next ?? uncurryThis(createIterator(dummy).next); - const SafeIterator = createSafeIterator(createIterator, next); - desc.value = function() { - return new SafeIterator(this); - }; - } - ReflectDefineProperty(safe.prototype, key, desc); - } - }); - } else { - copyProps(unsafe.prototype, safe.prototype); - } - copyProps(unsafe, safe); - - ObjectSetPrototypeOf(safe.prototype, null); - ObjectFreeze(safe.prototype); - ObjectFreeze(safe); - return safe; -}; -primordials.makeSafe = makeSafe; - -// Subclass the constructors because we need to use their prototype -// methods later. -// Defining the `constructor` is necessary here to avoid the default -// constructor which uses the user-mutable `%ArrayIteratorPrototype%.next`. -primordials.SafeMap = makeSafe( - Map, - class SafeMap extends Map { - constructor(i) { super(i); } // eslint-disable-line no-useless-constructor - } -); -primordials.SafeWeakMap = makeSafe( - WeakMap, - class SafeWeakMap extends WeakMap { - constructor(i) { super(i); } // eslint-disable-line no-useless-constructor - } -); -primordials.SafeSet = makeSafe( - Set, - class SafeSet extends Set { - constructor(i) { super(i); } // eslint-disable-line no-useless-constructor - } -); -primordials.SafeWeakSet = makeSafe( - WeakSet, - class SafeWeakSet extends WeakSet { - constructor(i) { super(i); } // eslint-disable-line no-useless-constructor - } -); - -ObjectSetPrototypeOf(primordials, null); -ObjectFreeze(primordials); - -module.exports = primordials; diff --git a/deps/npm/node_modules/@pkgjs/parseargs/internal/util.js b/deps/npm/node_modules/@pkgjs/parseargs/internal/util.js deleted file mode 100644 index b9b8fe5b8d7c02..00000000000000 --- a/deps/npm/node_modules/@pkgjs/parseargs/internal/util.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; - -// This is a placeholder for util.js in node.js land. - -const { - ObjectCreate, - ObjectFreeze, -} = require('./primordials'); - -const kEmptyObject = ObjectFreeze(ObjectCreate(null)); - -module.exports = { - kEmptyObject, -}; diff --git a/deps/npm/node_modules/@pkgjs/parseargs/internal/validators.js b/deps/npm/node_modules/@pkgjs/parseargs/internal/validators.js deleted file mode 100644 index b5ac4fb501eff4..00000000000000 --- a/deps/npm/node_modules/@pkgjs/parseargs/internal/validators.js +++ /dev/null @@ -1,89 +0,0 @@ -'use strict'; - -// This file is a proxy of the original file located at: -// https://github.com/nodejs/node/blob/main/lib/internal/validators.js -// Every addition or modification to this file must be evaluated -// during the PR review. - -const { - ArrayIsArray, - ArrayPrototypeIncludes, - ArrayPrototypeJoin, -} = require('./primordials'); - -const { - codes: { - ERR_INVALID_ARG_TYPE - } -} = require('./errors'); - -function validateString(value, name) { - if (typeof value !== 'string') { - throw new ERR_INVALID_ARG_TYPE(name, 'String', value); - } -} - -function validateUnion(value, name, union) { - if (!ArrayPrototypeIncludes(union, value)) { - throw new ERR_INVALID_ARG_TYPE(name, `('${ArrayPrototypeJoin(union, '|')}')`, value); - } -} - -function validateBoolean(value, name) { - if (typeof value !== 'boolean') { - throw new ERR_INVALID_ARG_TYPE(name, 'Boolean', value); - } -} - -function validateArray(value, name) { - if (!ArrayIsArray(value)) { - throw new ERR_INVALID_ARG_TYPE(name, 'Array', value); - } -} - -function validateStringArray(value, name) { - validateArray(value, name); - for (let i = 0; i < value.length; i++) { - validateString(value[i], `${name}[${i}]`); - } -} - -function validateBooleanArray(value, name) { - validateArray(value, name); - for (let i = 0; i < value.length; i++) { - validateBoolean(value[i], `${name}[${i}]`); - } -} - -/** - * @param {unknown} value - * @param {string} name - * @param {{ - * allowArray?: boolean, - * allowFunction?: boolean, - * nullable?: boolean - * }} [options] - */ -function validateObject(value, name, options) { - const useDefaultOptions = options == null; - const allowArray = useDefaultOptions ? false : options.allowArray; - const allowFunction = useDefaultOptions ? false : options.allowFunction; - const nullable = useDefaultOptions ? false : options.nullable; - if ((!nullable && value === null) || - (!allowArray && ArrayIsArray(value)) || - (typeof value !== 'object' && ( - !allowFunction || typeof value !== 'function' - ))) { - throw new ERR_INVALID_ARG_TYPE(name, 'Object', value); - } -} - -module.exports = { - validateArray, - validateObject, - validateString, - validateStringArray, - validateUnion, - validateBoolean, - validateBooleanArray, -}; diff --git a/deps/npm/node_modules/@pkgjs/parseargs/package.json b/deps/npm/node_modules/@pkgjs/parseargs/package.json deleted file mode 100644 index 0bcc05c0d4a3ec..00000000000000 --- a/deps/npm/node_modules/@pkgjs/parseargs/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "@pkgjs/parseargs", - "version": "0.11.0", - "description": "Polyfill of future proposal for `util.parseArgs()`", - "engines": { - "node": ">=14" - }, - "main": "index.js", - "exports": { - ".": "./index.js", - "./package.json": "./package.json" - }, - "scripts": { - "coverage": "c8 --check-coverage tape 'test/*.js'", - "test": "c8 tape 'test/*.js'", - "posttest": "eslint .", - "fix": "npm run posttest -- --fix" - }, - "repository": { - "type": "git", - "url": "git@github.com:pkgjs/parseargs.git" - }, - "keywords": [], - "author": "", - "license": "MIT", - "bugs": { - "url": "https://github.com/pkgjs/parseargs/issues" - }, - "homepage": "https://github.com/pkgjs/parseargs#readme", - "devDependencies": { - "c8": "^7.10.0", - "eslint": "^8.2.0", - "eslint-plugin-node-core": "iansu/eslint-plugin-node-core", - "tape": "^5.2.2" - } -} diff --git a/deps/npm/node_modules/@pkgjs/parseargs/utils.js b/deps/npm/node_modules/@pkgjs/parseargs/utils.js deleted file mode 100644 index d7f420a2339246..00000000000000 --- a/deps/npm/node_modules/@pkgjs/parseargs/utils.js +++ /dev/null @@ -1,198 +0,0 @@ -'use strict'; - -const { - ArrayPrototypeFind, - ObjectEntries, - ObjectPrototypeHasOwnProperty: ObjectHasOwn, - StringPrototypeCharAt, - StringPrototypeIncludes, - StringPrototypeStartsWith, -} = require('./internal/primordials'); - -const { - validateObject, -} = require('./internal/validators'); - -// These are internal utilities to make the parsing logic easier to read, and -// add lots of detail for the curious. They are in a separate file to allow -// unit testing, although that is not essential (this could be rolled into -// main file and just tested implicitly via API). -// -// These routines are for internal use, not for export to client. - -/** - * Return the named property, but only if it is an own property. - */ -function objectGetOwn(obj, prop) { - if (ObjectHasOwn(obj, prop)) - return obj[prop]; -} - -/** - * Return the named options property, but only if it is an own property. - */ -function optionsGetOwn(options, longOption, prop) { - if (ObjectHasOwn(options, longOption)) - return objectGetOwn(options[longOption], prop); -} - -/** - * Determines if the argument may be used as an option value. - * @example - * isOptionValue('V') // returns true - * isOptionValue('-v') // returns true (greedy) - * isOptionValue('--foo') // returns true (greedy) - * isOptionValue(undefined) // returns false - */ -function isOptionValue(value) { - if (value == null) return false; - - // Open Group Utility Conventions are that an option-argument - // is the argument after the option, and may start with a dash. - return true; // greedy! -} - -/** - * Detect whether there is possible confusion and user may have omitted - * the option argument, like `--port --verbose` when `port` of type:string. - * In strict mode we throw errors if value is option-like. - */ -function isOptionLikeValue(value) { - if (value == null) return false; - - return value.length > 1 && StringPrototypeCharAt(value, 0) === '-'; -} - -/** - * Determines if `arg` is just a short option. - * @example '-f' - */ -function isLoneShortOption(arg) { - return arg.length === 2 && - StringPrototypeCharAt(arg, 0) === '-' && - StringPrototypeCharAt(arg, 1) !== '-'; -} - -/** - * Determines if `arg` is a lone long option. - * @example - * isLoneLongOption('a') // returns false - * isLoneLongOption('-a') // returns false - * isLoneLongOption('--foo') // returns true - * isLoneLongOption('--foo=bar') // returns false - */ -function isLoneLongOption(arg) { - return arg.length > 2 && - StringPrototypeStartsWith(arg, '--') && - !StringPrototypeIncludes(arg, '=', 3); -} - -/** - * Determines if `arg` is a long option and value in the same argument. - * @example - * isLongOptionAndValue('--foo') // returns false - * isLongOptionAndValue('--foo=bar') // returns true - */ -function isLongOptionAndValue(arg) { - return arg.length > 2 && - StringPrototypeStartsWith(arg, '--') && - StringPrototypeIncludes(arg, '=', 3); -} - -/** - * Determines if `arg` is a short option group. - * - * See Guideline 5 of the [Open Group Utility Conventions](https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html). - * One or more options without option-arguments, followed by at most one - * option that takes an option-argument, should be accepted when grouped - * behind one '-' delimiter. - * @example - * isShortOptionGroup('-a', {}) // returns false - * isShortOptionGroup('-ab', {}) // returns true - * // -fb is an option and a value, not a short option group - * isShortOptionGroup('-fb', { - * options: { f: { type: 'string' } } - * }) // returns false - * isShortOptionGroup('-bf', { - * options: { f: { type: 'string' } } - * }) // returns true - * // -bfb is an edge case, return true and caller sorts it out - * isShortOptionGroup('-bfb', { - * options: { f: { type: 'string' } } - * }) // returns true - */ -function isShortOptionGroup(arg, options) { - if (arg.length <= 2) return false; - if (StringPrototypeCharAt(arg, 0) !== '-') return false; - if (StringPrototypeCharAt(arg, 1) === '-') return false; - - const firstShort = StringPrototypeCharAt(arg, 1); - const longOption = findLongOptionForShort(firstShort, options); - return optionsGetOwn(options, longOption, 'type') !== 'string'; -} - -/** - * Determine if arg is a short string option followed by its value. - * @example - * isShortOptionAndValue('-a', {}); // returns false - * isShortOptionAndValue('-ab', {}); // returns false - * isShortOptionAndValue('-fFILE', { - * options: { foo: { short: 'f', type: 'string' }} - * }) // returns true - */ -function isShortOptionAndValue(arg, options) { - validateObject(options, 'options'); - - if (arg.length <= 2) return false; - if (StringPrototypeCharAt(arg, 0) !== '-') return false; - if (StringPrototypeCharAt(arg, 1) === '-') return false; - - const shortOption = StringPrototypeCharAt(arg, 1); - const longOption = findLongOptionForShort(shortOption, options); - return optionsGetOwn(options, longOption, 'type') === 'string'; -} - -/** - * Find the long option associated with a short option. Looks for a configured - * `short` and returns the short option itself if a long option is not found. - * @example - * findLongOptionForShort('a', {}) // returns 'a' - * findLongOptionForShort('b', { - * options: { bar: { short: 'b' } } - * }) // returns 'bar' - */ -function findLongOptionForShort(shortOption, options) { - validateObject(options, 'options'); - const longOptionEntry = ArrayPrototypeFind( - ObjectEntries(options), - ({ 1: optionConfig }) => objectGetOwn(optionConfig, 'short') === shortOption - ); - return longOptionEntry?.[0] ?? shortOption; -} - -/** - * Check if the given option includes a default value - * and that option has not been set by the input args. - * - * @param {string} longOption - long option name e.g. 'foo' - * @param {object} optionConfig - the option configuration properties - * @param {object} values - option values returned in `values` by parseArgs - */ -function useDefaultValueOption(longOption, optionConfig, values) { - return objectGetOwn(optionConfig, 'default') !== undefined && - values[longOption] === undefined; -} - -module.exports = { - findLongOptionForShort, - isLoneLongOption, - isLoneShortOption, - isLongOptionAndValue, - isOptionValue, - isOptionLikeValue, - isShortOptionAndValue, - isShortOptionGroup, - useDefaultValueOption, - objectGetOwn, - optionsGetOwn, -}; diff --git a/deps/npm/node_modules/minimatch/LICENSE b/deps/npm/node_modules/@sigstore/sign/node_modules/proc-log/LICENSE similarity index 92% rename from deps/npm/node_modules/minimatch/LICENSE rename to deps/npm/node_modules/@sigstore/sign/node_modules/proc-log/LICENSE index 1493534e60dce4..83837797202b70 100644 --- a/deps/npm/node_modules/minimatch/LICENSE +++ b/deps/npm/node_modules/@sigstore/sign/node_modules/proc-log/LICENSE @@ -1,6 +1,6 @@ The ISC License -Copyright (c) 2011-2023 Isaac Z. Schlueter and Contributors +Copyright (c) GitHub, Inc. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/proc-log/lib/index.js b/deps/npm/node_modules/@sigstore/sign/node_modules/proc-log/lib/index.js new file mode 100644 index 00000000000000..86d90861078dab --- /dev/null +++ b/deps/npm/node_modules/@sigstore/sign/node_modules/proc-log/lib/index.js @@ -0,0 +1,153 @@ +const META = Symbol('proc-log.meta') +module.exports = { + META: META, + output: { + LEVELS: [ + 'standard', + 'error', + 'buffer', + 'flush', + ], + KEYS: { + standard: 'standard', + error: 'error', + buffer: 'buffer', + flush: 'flush', + }, + standard: function (...args) { + return process.emit('output', 'standard', ...args) + }, + error: function (...args) { + return process.emit('output', 'error', ...args) + }, + buffer: function (...args) { + return process.emit('output', 'buffer', ...args) + }, + flush: function (...args) { + return process.emit('output', 'flush', ...args) + }, + }, + log: { + LEVELS: [ + 'notice', + 'error', + 'warn', + 'info', + 'verbose', + 'http', + 'silly', + 'timing', + 'pause', + 'resume', + ], + KEYS: { + notice: 'notice', + error: 'error', + warn: 'warn', + info: 'info', + verbose: 'verbose', + http: 'http', + silly: 'silly', + timing: 'timing', + pause: 'pause', + resume: 'resume', + }, + error: function (...args) { + return process.emit('log', 'error', ...args) + }, + notice: function (...args) { + return process.emit('log', 'notice', ...args) + }, + warn: function (...args) { + return process.emit('log', 'warn', ...args) + }, + info: function (...args) { + return process.emit('log', 'info', ...args) + }, + verbose: function (...args) { + return process.emit('log', 'verbose', ...args) + }, + http: function (...args) { + return process.emit('log', 'http', ...args) + }, + silly: function (...args) { + return process.emit('log', 'silly', ...args) + }, + timing: function (...args) { + return process.emit('log', 'timing', ...args) + }, + pause: function () { + return process.emit('log', 'pause') + }, + resume: function () { + return process.emit('log', 'resume') + }, + }, + time: { + LEVELS: [ + 'start', + 'end', + ], + KEYS: { + start: 'start', + end: 'end', + }, + start: function (name, fn) { + process.emit('time', 'start', name) + function end () { + return process.emit('time', 'end', name) + } + if (typeof fn === 'function') { + const res = fn() + if (res && res.finally) { + return res.finally(end) + } + end() + return res + } + return end + }, + end: function (name) { + return process.emit('time', 'end', name) + }, + }, + input: { + LEVELS: [ + 'start', + 'end', + 'read', + ], + KEYS: { + start: 'start', + end: 'end', + read: 'read', + }, + start: function (fn) { + process.emit('input', 'start') + function end () { + return process.emit('input', 'end') + } + if (typeof fn === 'function') { + const res = fn() + if (res && res.finally) { + return res.finally(end) + } + end() + return res + } + return end + }, + end: function () { + return process.emit('input', 'end') + }, + read: function (...args) { + let resolve, reject + const promise = new Promise((_resolve, _reject) => { + resolve = _resolve + reject = _reject + }) + process.emit('input', 'read', resolve, reject, ...args) + return promise + }, + }, +} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/proc-log/package.json b/deps/npm/node_modules/@sigstore/sign/node_modules/proc-log/package.json new file mode 100644 index 00000000000000..957209d3954e53 --- /dev/null +++ b/deps/npm/node_modules/@sigstore/sign/node_modules/proc-log/package.json @@ -0,0 +1,46 @@ +{ + "name": "proc-log", + "version": "5.0.0", + "files": [ + "bin/", + "lib/" + ], + "main": "lib/index.js", + "description": "just emit 'log' events on the process object", + "repository": { + "type": "git", + "url": "git+https://github.com/npm/proc-log.git" + }, + "author": "GitHub Inc.", + "license": "ISC", + "scripts": { + "test": "tap", + "snap": "tap", + "posttest": "npm run lint", + "postsnap": "eslint index.js test/*.js --fix", + "lint": "npm run eslint", + "postlint": "template-oss-check", + "lintfix": "npm run eslint -- --fix", + "template-oss-apply": "template-oss-apply --force", + "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"" + }, + "devDependencies": { + "@npmcli/eslint-config": "^5.0.0", + "@npmcli/template-oss": "4.23.3", + "tap": "^16.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + }, + "templateOSS": { + "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", + "version": "4.23.3", + "publish": true + }, + "tap": { + "nyc-arg": [ + "--exclude", + "tap-snapshots/**" + ] + } +} diff --git a/deps/npm/node_modules/abbrev/package.json b/deps/npm/node_modules/abbrev/package.json index 077d4bccd0e69e..f17aaccfa56add 100644 --- a/deps/npm/node_modules/abbrev/package.json +++ b/deps/npm/node_modules/abbrev/package.json @@ -1,18 +1,19 @@ { "name": "abbrev", - "version": "3.0.1", + "version": "4.0.0", "description": "Like ruby's abbrev module, but in js", "author": "GitHub Inc.", "main": "lib/index.js", "scripts": { - "test": "tap", + "test": "node --test", "lint": "npm run eslint", "postlint": "template-oss-check", "template-oss-apply": "template-oss-apply --force", "lintfix": "npm run eslint -- --fix", - "snap": "tap", + "snap": "node --test --test-update-snapshots", "posttest": "npm run lint", - "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"" + "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", + "test:cover": "node --test --experimental-test-coverage --test-timeout=3000 --test-coverage-lines=100 --test-coverage-functions=100 --test-coverage-branches=100" }, "repository": { "type": "git", @@ -21,25 +22,20 @@ "license": "ISC", "devDependencies": { "@npmcli/eslint-config": "^5.0.0", - "@npmcli/template-oss": "4.24.3", - "tap": "^16.3.0" - }, - "tap": { - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] + "@npmcli/template-oss": "4.26.1" }, "files": [ "bin/", "lib/" ], "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.24.3", - "publish": true + "version": "4.26.1", + "publish": true, + "testRunner": "node:test", + "latestCiVersion": 24 } } diff --git a/deps/npm/node_modules/bin-links/package.json b/deps/npm/node_modules/bin-links/package.json index 22858d660ae0b9..23f52cfc96ec46 100644 --- a/deps/npm/node_modules/bin-links/package.json +++ b/deps/npm/node_modules/bin-links/package.json @@ -1,6 +1,6 @@ { "name": "bin-links", - "version": "5.0.0", + "version": "6.0.0", "description": "JavaScript package binary linker", "main": "./lib/index.js", "scripts": { @@ -24,15 +24,15 @@ ], "license": "ISC", "dependencies": { - "cmd-shim": "^7.0.0", - "npm-normalize-package-bin": "^4.0.0", - "proc-log": "^5.0.0", - "read-cmd-shim": "^5.0.0", - "write-file-atomic": "^6.0.0" + "cmd-shim": "^8.0.0", + "npm-normalize-package-bin": "^5.0.0", + "proc-log": "^6.0.0", + "read-cmd-shim": "^6.0.0", + "write-file-atomic": "^7.0.0" }, "devDependencies": { "@npmcli/eslint-config": "^5.0.0", - "@npmcli/template-oss": "4.23.3", + "@npmcli/template-oss": "4.27.1", "require-inject": "^1.4.4", "tap": "^16.0.1" }, @@ -49,13 +49,13 @@ "lib/" ], "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" }, "author": "GitHub Inc.", "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", "windowsCI": false, - "version": "4.23.3", + "version": "4.27.1", "publish": true } } diff --git a/deps/npm/node_modules/cacache/package.json b/deps/npm/node_modules/cacache/package.json index 6eec0a8375e5cc..40a84748948ac2 100644 --- a/deps/npm/node_modules/cacache/package.json +++ b/deps/npm/node_modules/cacache/package.json @@ -1,6 +1,6 @@ { "name": "cacache", - "version": "20.0.1", + "version": "20.0.2", "cache-version": { "content": "2", "index": "5" @@ -55,7 +55,7 @@ "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^7.0.2", - "ssri": "^12.0.0", + "ssri": "^13.0.0", "unique-filename": "^4.0.0" }, "devDependencies": { diff --git a/deps/npm/node_modules/cmd-shim/package.json b/deps/npm/node_modules/cmd-shim/package.json index 5f2e85d1c73db0..0da1978b985d2c 100644 --- a/deps/npm/node_modules/cmd-shim/package.json +++ b/deps/npm/node_modules/cmd-shim/package.json @@ -1,6 +1,6 @@ { "name": "cmd-shim", - "version": "7.0.0", + "version": "8.0.0", "description": "Used in npm for command line application support", "scripts": { "test": "tap", @@ -19,7 +19,7 @@ "license": "ISC", "devDependencies": { "@npmcli/eslint-config": "^5.0.0", - "@npmcli/template-oss": "4.23.1", + "@npmcli/template-oss": "4.27.1", "tap": "^16.0.1" }, "files": [ @@ -37,12 +37,12 @@ ] }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" }, "author": "GitHub Inc.", "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.23.1", + "version": "4.27.1", "publish": true } } diff --git a/deps/npm/node_modules/exponential-backoff/package.json b/deps/npm/node_modules/exponential-backoff/package.json index 53fb159f827828..e3e8dc9a5dccd1 100644 --- a/deps/npm/node_modules/exponential-backoff/package.json +++ b/deps/npm/node_modules/exponential-backoff/package.json @@ -1,6 +1,6 @@ { "name": "exponential-backoff", - "version": "3.1.2", + "version": "3.1.3", "description": "A utility that allows retrying a function with an exponential delay between attempts.", "files": [ "dist/", diff --git a/deps/npm/node_modules/ini/package.json b/deps/npm/node_modules/ini/package.json index 6a3995f158cc5b..7bbc0576937c50 100644 --- a/deps/npm/node_modules/ini/package.json +++ b/deps/npm/node_modules/ini/package.json @@ -2,7 +2,7 @@ "author": "GitHub Inc.", "name": "ini", "description": "An ini encoder/decoder for node", - "version": "5.0.0", + "version": "6.0.0", "repository": { "type": "git", "url": "git+https://github.com/npm/ini.git" @@ -20,7 +20,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^5.0.0", - "@npmcli/template-oss": "4.23.3", + "@npmcli/template-oss": "4.27.1", "tap": "^16.0.1" }, "license": "ISC", @@ -29,11 +29,11 @@ "lib/" ], "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.23.3", + "version": "4.27.1", "publish": "true" }, "tap": { diff --git a/deps/npm/node_modules/init-package-json/package.json b/deps/npm/node_modules/init-package-json/package.json index de404b658c7b76..715fc64673598a 100644 --- a/deps/npm/node_modules/init-package-json/package.json +++ b/deps/npm/node_modules/init-package-json/package.json @@ -1,6 +1,6 @@ { "name": "init-package-json", - "version": "8.2.2", + "version": "8.2.3", "main": "lib/init-package-json.js", "scripts": { "test": "tap", @@ -26,7 +26,7 @@ "read": "^4.0.0", "semver": "^7.7.2", "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^6.0.2" + "validate-npm-package-name": "^7.0.0" }, "devDependencies": { "@npmcli/config": "^10.0.0", diff --git a/deps/npm/node_modules/json-parse-even-better-errors/package.json b/deps/npm/node_modules/json-parse-even-better-errors/package.json index 193f0d9d459a53..6e696c98548db5 100644 --- a/deps/npm/node_modules/json-parse-even-better-errors/package.json +++ b/deps/npm/node_modules/json-parse-even-better-errors/package.json @@ -1,6 +1,6 @@ { "name": "json-parse-even-better-errors", - "version": "4.0.0", + "version": "5.0.0", "description": "JSON.parse with context information on error", "main": "lib/index.js", "files": [ @@ -29,7 +29,7 @@ "license": "MIT", "devDependencies": { "@npmcli/eslint-config": "^5.0.0", - "@npmcli/template-oss": "4.23.3", + "@npmcli/template-oss": "4.27.1", "tap": "^16.3.0" }, "tap": { @@ -40,11 +40,11 @@ ] }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.23.3", + "version": "4.27.1", "publish": true } } diff --git a/deps/npm/node_modules/libnpmdiff/package.json b/deps/npm/node_modules/libnpmdiff/package.json index ff894976468dbc..6813bf882e44b4 100644 --- a/deps/npm/node_modules/libnpmdiff/package.json +++ b/deps/npm/node_modules/libnpmdiff/package.json @@ -1,6 +1,6 @@ { "name": "libnpmdiff", - "version": "8.0.9", + "version": "8.0.10", "description": "The registry diff", "repository": { "type": "git", @@ -47,7 +47,7 @@ "tap": "^16.3.8" }, "dependencies": { - "@npmcli/arborist": "^9.1.6", + "@npmcli/arborist": "^9.1.7", "@npmcli/installed-package-contents": "^3.0.0", "binary-extensions": "^3.0.0", "diff": "^8.0.2", diff --git a/deps/npm/node_modules/libnpmexec/lib/with-lock.js b/deps/npm/node_modules/libnpmexec/lib/with-lock.js index 897046adedb8a7..c7ba531ca5484d 100644 --- a/deps/npm/node_modules/libnpmexec/lib/with-lock.js +++ b/deps/npm/node_modules/libnpmexec/lib/with-lock.js @@ -18,9 +18,10 @@ const { onExit } = require('signal-exit') // - more ergonomic compromised lock handling (i.e. withLock will reject, and callbacks have access to an AbortSignal) // - uses a more recent version of signal-exit +// mtime precision is platform dependent, so deal in seconds const touchInterval = 1_000 -// mtime precision is platform dependent, so use a reasonably large threshold -const staleThreshold = 5_000 +// use a reasonably large threshold, in case stat calls take a while +const staleThreshold = 60_000 // track current locks and their cleanup functions const currentLocks = new Map() @@ -144,6 +145,7 @@ async function maintainLock (lockPath) { let mtime = Math.round(stats.mtimeMs / 1000) const signal = controller.signal + let timeout async function touchLock () { try { const currentStats = (await fs.stat(lockPath)) @@ -156,16 +158,16 @@ async function maintainLock (lockPath) { if (currentLocks.has(lockPath)) { await fs.utimes(lockPath, mtime, mtime) } + timeout = setTimeout(touchLock, touchInterval).unref() } catch (err) { // stats mismatch or other fs error means the lock was compromised controller.abort() } } - const timeout = setInterval(touchLock, touchInterval) - timeout.unref() + timeout = setTimeout(touchLock, touchInterval).unref() function cleanup () { - clearInterval(timeout) + clearTimeout(timeout) deleteLock(lockPath) } currentLocks.set(lockPath, cleanup) diff --git a/deps/npm/node_modules/libnpmexec/package.json b/deps/npm/node_modules/libnpmexec/package.json index d06081ce21a609..cd380abf3cb9cd 100644 --- a/deps/npm/node_modules/libnpmexec/package.json +++ b/deps/npm/node_modules/libnpmexec/package.json @@ -1,6 +1,6 @@ { "name": "libnpmexec", - "version": "10.1.8", + "version": "10.1.9", "files": [ "bin/", "lib/" @@ -53,20 +53,20 @@ "@npmcli/eslint-config": "^5.0.1", "@npmcli/mock-registry": "^1.0.0", "@npmcli/template-oss": "4.25.1", - "bin-links": "^5.0.0", + "bin-links": "^6.0.0", "chalk": "^5.2.0", "just-extend": "^6.2.0", "just-safe-set": "^4.2.1", "tap": "^16.3.8" }, "dependencies": { - "@npmcli/arborist": "^9.1.6", + "@npmcli/arborist": "^9.1.7", "@npmcli/package-json": "^7.0.0", "@npmcli/run-script": "^10.0.0", "ci-info": "^4.0.0", "npm-package-arg": "^13.0.0", "pacote": "^21.0.2", - "proc-log": "^5.0.0", + "proc-log": "^6.0.0", "promise-retry": "^2.0.1", "read": "^4.0.0", "semver": "^7.3.7", diff --git a/deps/npm/node_modules/libnpmfund/package.json b/deps/npm/node_modules/libnpmfund/package.json index 7b9bf8e703a5f5..d77a056fc6884d 100644 --- a/deps/npm/node_modules/libnpmfund/package.json +++ b/deps/npm/node_modules/libnpmfund/package.json @@ -1,6 +1,6 @@ { "name": "libnpmfund", - "version": "7.0.9", + "version": "7.0.10", "main": "lib/index.js", "files": [ "bin/", @@ -46,7 +46,7 @@ "tap": "^16.3.8" }, "dependencies": { - "@npmcli/arborist": "^9.1.6" + "@npmcli/arborist": "^9.1.7" }, "engines": { "node": "^20.17.0 || >=22.9.0" diff --git a/deps/npm/node_modules/libnpmpack/package.json b/deps/npm/node_modules/libnpmpack/package.json index dc4def4651723c..b105cb045cc0a7 100644 --- a/deps/npm/node_modules/libnpmpack/package.json +++ b/deps/npm/node_modules/libnpmpack/package.json @@ -1,6 +1,6 @@ { "name": "libnpmpack", - "version": "9.0.9", + "version": "9.0.10", "description": "Programmatic API for the bits behind npm pack", "author": "GitHub Inc.", "main": "lib/index.js", @@ -37,7 +37,7 @@ "bugs": "https://github.com/npm/libnpmpack/issues", "homepage": "https://npmjs.com/package/libnpmpack", "dependencies": { - "@npmcli/arborist": "^9.1.6", + "@npmcli/arborist": "^9.1.7", "@npmcli/run-script": "^10.0.0", "npm-package-arg": "^13.0.0", "pacote": "^21.0.2" diff --git a/deps/npm/node_modules/libnpmpublish/package.json b/deps/npm/node_modules/libnpmpublish/package.json index d9f00aaffac6c5..65a4ae3c11d0ce 100644 --- a/deps/npm/node_modules/libnpmpublish/package.json +++ b/deps/npm/node_modules/libnpmpublish/package.json @@ -1,6 +1,6 @@ { "name": "libnpmpublish", - "version": "11.1.2", + "version": "11.1.3", "description": "Programmatic API for the bits behind npm publish and unpublish", "author": "GitHub Inc.", "main": "lib/index.js", @@ -42,10 +42,10 @@ "ci-info": "^4.0.0", "npm-package-arg": "^13.0.0", "npm-registry-fetch": "^19.0.0", - "proc-log": "^5.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.7", "sigstore": "^4.0.0", - "ssri": "^12.0.0" + "ssri": "^13.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" diff --git a/deps/npm/node_modules/libnpmversion/package.json b/deps/npm/node_modules/libnpmversion/package.json index db1538b5721cce..e80966b6aeeb8c 100644 --- a/deps/npm/node_modules/libnpmversion/package.json +++ b/deps/npm/node_modules/libnpmversion/package.json @@ -1,6 +1,6 @@ { "name": "libnpmversion", - "version": "8.0.2", + "version": "8.0.3", "main": "lib/index.js", "files": [ "bin/", @@ -40,8 +40,8 @@ "dependencies": { "@npmcli/git": "^7.0.0", "@npmcli/run-script": "^10.0.0", - "json-parse-even-better-errors": "^4.0.0", - "proc-log": "^5.0.0", + "json-parse-even-better-errors": "^5.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.7" }, "engines": { diff --git a/deps/npm/node_modules/make-fetch-happen/package.json b/deps/npm/node_modules/make-fetch-happen/package.json index 41815ec3c8f110..203b32304c461c 100644 --- a/deps/npm/node_modules/make-fetch-happen/package.json +++ b/deps/npm/node_modules/make-fetch-happen/package.json @@ -1,6 +1,6 @@ { "name": "make-fetch-happen", - "version": "15.0.2", + "version": "15.0.3", "description": "Opinionated, caching, retrying fetch client", "main": "lib/index.js", "files": [ @@ -37,13 +37,13 @@ "cacache": "^20.0.1", "http-cache-semantics": "^4.1.1", "minipass": "^7.0.2", - "minipass-fetch": "^4.0.0", + "minipass-fetch": "^5.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^1.0.0", - "proc-log": "^5.0.0", + "proc-log": "^6.0.0", "promise-retry": "^2.0.1", - "ssri": "^12.0.0" + "ssri": "^13.0.0" }, "devDependencies": { "@npmcli/eslint-config": "^5.0.0", diff --git a/deps/npm/node_modules/node-gyp/node_modules/jackspeak/LICENSE.md b/deps/npm/node_modules/minimatch/LICENSE.md similarity index 100% rename from deps/npm/node_modules/node-gyp/node_modules/jackspeak/LICENSE.md rename to deps/npm/node_modules/minimatch/LICENSE.md diff --git a/deps/npm/node_modules/minimatch/dist/commonjs/ast.js b/deps/npm/node_modules/minimatch/dist/commonjs/ast.js index 9e1f9e765c597e..997343fbd1eab1 100644 --- a/deps/npm/node_modules/minimatch/dist/commonjs/ast.js +++ b/deps/npm/node_modules/minimatch/dist/commonjs/ast.js @@ -415,7 +415,9 @@ class AST { if (this.#root === this) this.#fillNegs(); if (!this.type) { - const noEmpty = this.isStart() && this.isEnd(); + const noEmpty = this.isStart() && + this.isEnd() && + !this.#parts.some(s => typeof s !== 'string'); const src = this.#parts .map(p => { const [re, _, hasMagic, uflag] = typeof p === 'string' @@ -571,10 +573,7 @@ class AST { } } if (c === '*') { - if (noEmpty && glob === '*') - re += starNoEmpty; - else - re += star; + re += noEmpty && glob === '*' ? starNoEmpty : star; hasMagic = true; continue; } diff --git a/deps/npm/node_modules/minimatch/dist/commonjs/escape.js b/deps/npm/node_modules/minimatch/dist/commonjs/escape.js index 02a4f8a8e0a588..6fb634fb41033c 100644 --- a/deps/npm/node_modules/minimatch/dist/commonjs/escape.js +++ b/deps/npm/node_modules/minimatch/dist/commonjs/escape.js @@ -4,16 +4,24 @@ exports.escape = void 0; /** * Escape all magic characters in a glob pattern. * - * If the {@link windowsPathsNoEscape | GlobOptions.windowsPathsNoEscape} + * If the {@link MinimatchOptions.windowsPathsNoEscape} * option is used, then characters are escaped by wrapping in `[]`, because * a magic character wrapped in a character class can only be satisfied by * that exact character. In this mode, `\` is _not_ escaped, because it is * not interpreted as a magic character, but instead as a path separator. + * + * If the {@link MinimatchOptions.magicalBraces} option is used, + * then braces (`{` and `}`) will be escaped. */ -const escape = (s, { windowsPathsNoEscape = false, } = {}) => { +const escape = (s, { windowsPathsNoEscape = false, magicalBraces = false, } = {}) => { // don't need to escape +@! because we escape the parens // that make those magic, and escaping ! as [!] isn't valid, // because [!]] is a valid glob class meaning not ']'. + if (magicalBraces) { + return windowsPathsNoEscape + ? s.replace(/[?*()[\]{}]/g, '[$&]') + : s.replace(/[?*()[\]\\{}]/g, '\\$&'); + } return windowsPathsNoEscape ? s.replace(/[?*()[\]]/g, '[$&]') : s.replace(/[?*()[\]\\]/g, '\\$&'); diff --git a/deps/npm/node_modules/minimatch/dist/commonjs/index.js b/deps/npm/node_modules/minimatch/dist/commonjs/index.js index f58fb8616aa9ab..966dc9b8bb2165 100644 --- a/deps/npm/node_modules/minimatch/dist/commonjs/index.js +++ b/deps/npm/node_modules/minimatch/dist/commonjs/index.js @@ -640,7 +640,7 @@ class Minimatch { } } // resolve and reduce . and .. portions in the file as well. - // dont' need to do the second phase, because it's only one string[] + // don't need to do the second phase, because it's only one string[] const { optimizationLevel = 1 } = this.options; if (optimizationLevel >= 2) { file = this.levelTwoFileOptimize(file); @@ -893,14 +893,25 @@ class Minimatch { } } else if (next === undefined) { - pp[i - 1] = prev + '(?:\\/|' + twoStar + ')?'; + pp[i - 1] = prev + '(?:\\/|\\/' + twoStar + ')?'; } else if (next !== exports.GLOBSTAR) { pp[i - 1] = prev + '(?:\\/|\\/' + twoStar + '\\/)' + next; pp[i + 1] = exports.GLOBSTAR; } }); - return pp.filter(p => p !== exports.GLOBSTAR).join('/'); + const filtered = pp.filter(p => p !== exports.GLOBSTAR); + // For partial matches, we need to make the pattern match + // any prefix of the full path. We do this by generating + // alternative patterns that match progressively longer prefixes. + if (this.partial && filtered.length >= 1) { + const prefixes = []; + for (let i = 1; i <= filtered.length; i++) { + prefixes.push(filtered.slice(0, i).join('/')); + } + return '(?:' + prefixes.join('|') + ')'; + } + return filtered.join('/'); }) .join('|'); // need to wrap in parens if we had more than one thing with |, @@ -909,6 +920,10 @@ class Minimatch { // must match entire pattern // ending in a * or ** will make it less strict. re = '^' + open + re + close + '$'; + // In partial mode, '/' should always match as it's a valid prefix for any pattern + if (this.partial) { + re = '^(?:\\/|' + open + re.slice(1, -1) + close + ')$'; + } // can match anything, as long as it's not this. if (this.negate) re = '^(?!' + re + ').+$'; diff --git a/deps/npm/node_modules/minimatch/dist/commonjs/unescape.js b/deps/npm/node_modules/minimatch/dist/commonjs/unescape.js index 47c36bcee5a02a..171098d8a4ceb5 100644 --- a/deps/npm/node_modules/minimatch/dist/commonjs/unescape.js +++ b/deps/npm/node_modules/minimatch/dist/commonjs/unescape.js @@ -4,21 +4,35 @@ exports.unescape = void 0; /** * Un-escape a string that has been escaped with {@link escape}. * - * If the {@link windowsPathsNoEscape} option is used, then square-brace - * escapes are removed, but not backslash escapes. For example, it will turn - * the string `'[*]'` into `*`, but it will not turn `'\\*'` into `'*'`, - * becuase `\` is a path separator in `windowsPathsNoEscape` mode. + * If the {@link MinimatchOptions.windowsPathsNoEscape} option is used, then + * square-bracket escapes are removed, but not backslash escapes. * - * When `windowsPathsNoEscape` is not set, then both brace escapes and + * For example, it will turn the string `'[*]'` into `*`, but it will not + * turn `'\\*'` into `'*'`, because `\` is a path separator in + * `windowsPathsNoEscape` mode. + * + * When `windowsPathsNoEscape` is not set, then both square-bracket escapes and * backslash escapes are removed. * * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped * or unescaped. + * + * When `magicalBraces` is not set, escapes of braces (`{` and `}`) will not be + * unescaped. */ -const unescape = (s, { windowsPathsNoEscape = false, } = {}) => { +const unescape = (s, { windowsPathsNoEscape = false, magicalBraces = true, } = {}) => { + if (magicalBraces) { + return windowsPathsNoEscape + ? s.replace(/\[([^\/\\])\]/g, '$1') + : s + .replace(/((?!\\).|^)\[([^\/\\])\]/g, '$1$2') + .replace(/\\([^\/])/g, '$1'); + } return windowsPathsNoEscape - ? s.replace(/\[([^\/\\])\]/g, '$1') - : s.replace(/((?!\\).|^)\[([^\/\\])\]/g, '$1$2').replace(/\\([^\/])/g, '$1'); + ? s.replace(/\[([^\/\\{}])\]/g, '$1') + : s + .replace(/((?!\\).|^)\[([^\/\\{}])\]/g, '$1$2') + .replace(/\\([^\/{}])/g, '$1'); }; exports.unescape = unescape; //# sourceMappingURL=unescape.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/minimatch/dist/esm/ast.js b/deps/npm/node_modules/minimatch/dist/esm/ast.js index 02c6bda68427fc..0ae609ad10d519 100644 --- a/deps/npm/node_modules/minimatch/dist/esm/ast.js +++ b/deps/npm/node_modules/minimatch/dist/esm/ast.js @@ -412,7 +412,9 @@ export class AST { if (this.#root === this) this.#fillNegs(); if (!this.type) { - const noEmpty = this.isStart() && this.isEnd(); + const noEmpty = this.isStart() && + this.isEnd() && + !this.#parts.some(s => typeof s !== 'string'); const src = this.#parts .map(p => { const [re, _, hasMagic, uflag] = typeof p === 'string' @@ -568,10 +570,7 @@ export class AST { } } if (c === '*') { - if (noEmpty && glob === '*') - re += starNoEmpty; - else - re += star; + re += noEmpty && glob === '*' ? starNoEmpty : star; hasMagic = true; continue; } diff --git a/deps/npm/node_modules/minimatch/dist/esm/escape.js b/deps/npm/node_modules/minimatch/dist/esm/escape.js index 16f7c8c7bdc646..bab968ff3d83c9 100644 --- a/deps/npm/node_modules/minimatch/dist/esm/escape.js +++ b/deps/npm/node_modules/minimatch/dist/esm/escape.js @@ -1,16 +1,24 @@ /** * Escape all magic characters in a glob pattern. * - * If the {@link windowsPathsNoEscape | GlobOptions.windowsPathsNoEscape} + * If the {@link MinimatchOptions.windowsPathsNoEscape} * option is used, then characters are escaped by wrapping in `[]`, because * a magic character wrapped in a character class can only be satisfied by * that exact character. In this mode, `\` is _not_ escaped, because it is * not interpreted as a magic character, but instead as a path separator. + * + * If the {@link MinimatchOptions.magicalBraces} option is used, + * then braces (`{` and `}`) will be escaped. */ -export const escape = (s, { windowsPathsNoEscape = false, } = {}) => { +export const escape = (s, { windowsPathsNoEscape = false, magicalBraces = false, } = {}) => { // don't need to escape +@! because we escape the parens // that make those magic, and escaping ! as [!] isn't valid, // because [!]] is a valid glob class meaning not ']'. + if (magicalBraces) { + return windowsPathsNoEscape + ? s.replace(/[?*()[\]{}]/g, '[$&]') + : s.replace(/[?*()[\]\\{}]/g, '\\$&'); + } return windowsPathsNoEscape ? s.replace(/[?*()[\]]/g, '[$&]') : s.replace(/[?*()[\]\\]/g, '\\$&'); diff --git a/deps/npm/node_modules/minimatch/dist/esm/index.js b/deps/npm/node_modules/minimatch/dist/esm/index.js index 790d6c02a2f22e..e83823fa6e1b55 100644 --- a/deps/npm/node_modules/minimatch/dist/esm/index.js +++ b/deps/npm/node_modules/minimatch/dist/esm/index.js @@ -631,7 +631,7 @@ export class Minimatch { } } // resolve and reduce . and .. portions in the file as well. - // dont' need to do the second phase, because it's only one string[] + // don't need to do the second phase, because it's only one string[] const { optimizationLevel = 1 } = this.options; if (optimizationLevel >= 2) { file = this.levelTwoFileOptimize(file); @@ -884,14 +884,25 @@ export class Minimatch { } } else if (next === undefined) { - pp[i - 1] = prev + '(?:\\/|' + twoStar + ')?'; + pp[i - 1] = prev + '(?:\\/|\\/' + twoStar + ')?'; } else if (next !== GLOBSTAR) { pp[i - 1] = prev + '(?:\\/|\\/' + twoStar + '\\/)' + next; pp[i + 1] = GLOBSTAR; } }); - return pp.filter(p => p !== GLOBSTAR).join('/'); + const filtered = pp.filter(p => p !== GLOBSTAR); + // For partial matches, we need to make the pattern match + // any prefix of the full path. We do this by generating + // alternative patterns that match progressively longer prefixes. + if (this.partial && filtered.length >= 1) { + const prefixes = []; + for (let i = 1; i <= filtered.length; i++) { + prefixes.push(filtered.slice(0, i).join('/')); + } + return '(?:' + prefixes.join('|') + ')'; + } + return filtered.join('/'); }) .join('|'); // need to wrap in parens if we had more than one thing with |, @@ -900,6 +911,10 @@ export class Minimatch { // must match entire pattern // ending in a * or ** will make it less strict. re = '^' + open + re + close + '$'; + // In partial mode, '/' should always match as it's a valid prefix for any pattern + if (this.partial) { + re = '^(?:\\/|' + open + re.slice(1, -1) + close + ')$'; + } // can match anything, as long as it's not this. if (this.negate) re = '^(?!' + re + ').+$'; diff --git a/deps/npm/node_modules/minimatch/dist/esm/unescape.js b/deps/npm/node_modules/minimatch/dist/esm/unescape.js index 0faf9a2b7306f7..dfa408d39853bc 100644 --- a/deps/npm/node_modules/minimatch/dist/esm/unescape.js +++ b/deps/npm/node_modules/minimatch/dist/esm/unescape.js @@ -1,20 +1,34 @@ /** * Un-escape a string that has been escaped with {@link escape}. * - * If the {@link windowsPathsNoEscape} option is used, then square-brace - * escapes are removed, but not backslash escapes. For example, it will turn - * the string `'[*]'` into `*`, but it will not turn `'\\*'` into `'*'`, - * becuase `\` is a path separator in `windowsPathsNoEscape` mode. + * If the {@link MinimatchOptions.windowsPathsNoEscape} option is used, then + * square-bracket escapes are removed, but not backslash escapes. * - * When `windowsPathsNoEscape` is not set, then both brace escapes and + * For example, it will turn the string `'[*]'` into `*`, but it will not + * turn `'\\*'` into `'*'`, because `\` is a path separator in + * `windowsPathsNoEscape` mode. + * + * When `windowsPathsNoEscape` is not set, then both square-bracket escapes and * backslash escapes are removed. * * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped * or unescaped. + * + * When `magicalBraces` is not set, escapes of braces (`{` and `}`) will not be + * unescaped. */ -export const unescape = (s, { windowsPathsNoEscape = false, } = {}) => { +export const unescape = (s, { windowsPathsNoEscape = false, magicalBraces = true, } = {}) => { + if (magicalBraces) { + return windowsPathsNoEscape + ? s.replace(/\[([^\/\\])\]/g, '$1') + : s + .replace(/((?!\\).|^)\[([^\/\\])\]/g, '$1$2') + .replace(/\\([^\/])/g, '$1'); + } return windowsPathsNoEscape - ? s.replace(/\[([^\/\\])\]/g, '$1') - : s.replace(/((?!\\).|^)\[([^\/\\])\]/g, '$1$2').replace(/\\([^\/])/g, '$1'); + ? s.replace(/\[([^\/\\{}])\]/g, '$1') + : s + .replace(/((?!\\).|^)\[([^\/\\{}])\]/g, '$1$2') + .replace(/\\([^\/{}])/g, '$1'); }; //# sourceMappingURL=unescape.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/minimatch/package.json b/deps/npm/node_modules/minimatch/package.json index bfa2423f50b5e2..620c0309f0d16d 100644 --- a/deps/npm/node_modules/minimatch/package.json +++ b/deps/npm/node_modules/minimatch/package.json @@ -2,10 +2,10 @@ "author": "Isaac Z. Schlueter (http://blog.izs.me)", "name": "minimatch", "description": "a glob matcher in javascript", - "version": "10.0.3", + "version": "10.1.1", "repository": { "type": "git", - "url": "git://github.com/isaacs/minimatch.git" + "url": "git@github.com:isaacs/minimatch" }, "main": "./dist/commonjs/index.js", "types": "./dist/commonjs/index.d.ts", @@ -34,9 +34,9 @@ "presnap": "npm run prepare", "test": "tap", "snap": "tap", - "format": "prettier --write . --loglevel warn", + "format": "prettier --write . --log-level warn", "benchmark": "node benchmark/index.js", - "typedoc": "typedoc --tsconfig tsconfig-esm.json ./src/*.ts" + "typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts" }, "prettier": { "semi": false, @@ -53,10 +53,9 @@ "node": "20 || >=22" }, "devDependencies": { - "@types/brace-expansion": "^1.1.2", "@types/node": "^24.0.0", "mkdirp": "^3.0.1", - "prettier": "^3.3.2", + "prettier": "^3.6.2", "tap": "^21.1.0", "tshy": "^3.0.2", "typedoc": "^0.28.5" @@ -64,7 +63,7 @@ "funding": { "url": "https://github.com/sponsors/isaacs" }, - "license": "ISC", + "license": "BlueOak-1.0.0", "tshy": { "exports": { "./package.json": "./package.json", diff --git a/deps/npm/node_modules/minipass-fetch/package.json b/deps/npm/node_modules/minipass-fetch/package.json index eb8a4d4fac40d4..7863e7e5e9dee9 100644 --- a/deps/npm/node_modules/minipass-fetch/package.json +++ b/deps/npm/node_modules/minipass-fetch/package.json @@ -1,6 +1,6 @@ { "name": "minipass-fetch", - "version": "4.0.1", + "version": "5.0.0", "description": "An implementation of window.fetch in Node.js using Minipass streams", "license": "MIT", "main": "lib/index.js", @@ -25,7 +25,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^5.0.0", - "@npmcli/template-oss": "4.23.3", + "@npmcli/template-oss": "4.27.1", "@ungap/url-search-params": "^0.2.2", "abort-controller": "^3.0.0", "abortcontroller-polyfill": "~1.7.3", @@ -59,12 +59,12 @@ "lib/" ], "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" }, "author": "GitHub Inc.", "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.23.3", + "version": "4.27.1", "publish": "true" } } diff --git a/deps/npm/node_modules/node-gyp/.release-please-manifest.json b/deps/npm/node_modules/node-gyp/.release-please-manifest.json index a94451c9e13429..4899c67643487d 100644 --- a/deps/npm/node_modules/node-gyp/.release-please-manifest.json +++ b/deps/npm/node_modules/node-gyp/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.4.2" + ".": "12.1.0" } diff --git a/deps/npm/node_modules/node-gyp/CHANGELOG.md b/deps/npm/node_modules/node-gyp/CHANGELOG.md index 952284d697f828..2bdec2cc6b5e4e 100644 --- a/deps/npm/node_modules/node-gyp/CHANGELOG.md +++ b/deps/npm/node_modules/node-gyp/CHANGELOG.md @@ -1,5 +1,62 @@ # Changelog +## [12.1.0](https://github.com/nodejs/node-gyp/compare/v12.0.0...v12.1.0) (2025-11-12) + + +### Features + +* Add support for Visual Studio 2026 (18.x) ([69e5fd2](https://github.com/nodejs/node-gyp/commit/69e5fd2c98ac83dad5200a47515b301ccd80d2d3)) +* Support for Visual Studio 2026 (18.x) ([69e5fd2](https://github.com/nodejs/node-gyp/commit/69e5fd2c98ac83dad5200a47515b301ccd80d2d3)) + +## [12.0.0](https://github.com/nodejs/node-gyp/compare/v11.5.0...v12.0.0) (2025-11-10) + + +### ⚠ BREAKING CHANGES + +* align to npm 11 node engine range + +### Features + +* align to npm 11 node engine range ([2f85686](https://github.com/nodejs/node-gyp/commit/2f85686bbe745673350a8f9dbb0e86ee0190f213)) +* update gyp-next to v0.21.0 ([c57cd2e](https://github.com/nodejs/node-gyp/commit/c57cd2e86dc57707475b9f7e676e189f064817de)) + + +### Core + +* **deps:** bump actions/setup-node from 5 to 6 ([ae90e63](https://github.com/nodejs/node-gyp/commit/ae90e632d9fab85f4cd902dc9205ba9dfafaf3bc)) +* **deps:** bump env-paths from 2.2.1 to 3.0.0 ([#3235](https://github.com/nodejs/node-gyp/issues/3235)) ([5fffb2f](https://github.com/nodejs/node-gyp/commit/5fffb2ffee304cc898fdea7a0cd9e41d54c53839)) +* **deps:** bump which from 5.0.0 to 6.0.0 ([#3238](https://github.com/nodejs/node-gyp/issues/3238)) ([eaa8e34](https://github.com/nodejs/node-gyp/commit/eaa8e34cb5a0710bef0602c42e5840b47eb76822)) +* make-fetch-happen@15.0.0 ([e2b9d21](https://github.com/nodejs/node-gyp/commit/e2b9d21bce27c35d18fcb6f8583e386d15ce395c)) +* nopt@9.0.0 ([9bdeaf3](https://github.com/nodejs/node-gyp/commit/9bdeaf307cd7a254946859d306465989fa39dfb2)) +* proc-log@6.0.0 ([dfc68df](https://github.com/nodejs/node-gyp/commit/dfc68dfba3c17deb0bda9a395bb49d8fb9fa5951)) + + +### Miscellaneous + +* increase test timeouts ([#3237](https://github.com/nodejs/node-gyp/issues/3237)) ([3b41971](https://github.com/nodejs/node-gyp/commit/3b41971e2f6b90e02b1d7df592d403b8dfc8fa4d)) +* setup dependabot for npm ([86d65c7](https://github.com/nodejs/node-gyp/commit/86d65c7874eb41eb49c9b8bbf342becac8e57c6f)) +* update devDependencies ([41b0cea](https://github.com/nodejs/node-gyp/commit/41b0cea2f12342a790580cc8f844f075d49e096c)) + +## [11.5.0](https://github.com/nodejs/node-gyp/compare/v11.4.2...v11.5.0) (2025-10-15) + + +### Features + +* update gyp-next to v0.20.5 ([#3222](https://github.com/nodejs/node-gyp/issues/3222)) ([848e950](https://github.com/nodejs/node-gyp/commit/848e950833b90f0b25f346710ee42e9be4797604)) + + +### Bug Fixes + +* **ci:** Run Visual Studio test on Windows 11 on ARM ([#3217](https://github.com/nodejs/node-gyp/issues/3217)) ([8bd3f63](https://github.com/nodejs/node-gyp/commit/8bd3f6354b8bd43262a4d99d58a568beab0459e8)) +* **ci:** Test on Python 3.14 release candidate 3 on Linux and macOS ([#3216](https://github.com/nodejs/node-gyp/issues/3216)) ([085b445](https://github.com/nodejs/node-gyp/commit/085b445d1c00f8f1fc6a6ff80d8a93c6643f11ee)) + + +### Core + +* **deps:** bump actions/github-script from 7 to 8 ([#3213](https://github.com/nodejs/node-gyp/issues/3213)) ([c6b968c](https://github.com/nodejs/node-gyp/commit/c6b968caf7f4e22687fc10716162675b1411f713)) +* **deps:** bump actions/setup-node from 4 to 5 ([#3211](https://github.com/nodejs/node-gyp/issues/3211)) ([921c04d](https://github.com/nodejs/node-gyp/commit/921c04d142549f172d3aeae4097c9e0af05599dd)) +* **deps:** bump actions/setup-python from 5 to 6 ([#3210](https://github.com/nodejs/node-gyp/issues/3210)) ([6b70b05](https://github.com/nodejs/node-gyp/commit/6b70b05ed21cb977214348c97c2b97515c0d08f3)) + ## [11.4.2](https://github.com/nodejs/node-gyp/compare/v11.4.1...v11.4.2) (2025-08-26) diff --git a/deps/npm/node_modules/node-gyp/gyp/.release-please-manifest.json b/deps/npm/node_modules/node-gyp/gyp/.release-please-manifest.json index bdb726346fc28b..ca64307ab84750 100644 --- a/deps/npm/node_modules/node-gyp/gyp/.release-please-manifest.json +++ b/deps/npm/node_modules/node-gyp/gyp/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.20.4" + ".": "0.21.0" } diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSVersion.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSVersion.py index 09baf44b2b0f8a..2d8e4ceab9a94c 100644 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSVersion.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSVersion.py @@ -270,6 +270,18 @@ def _CreateVersion(name, path, sdk_based=False): if path: path = os.path.normpath(path) versions = { + "2026": VisualStudioVersion( + "2026", + "Visual Studio 2026", + solution_version="12.00", + project_version="18.0", + flat_sln=False, + uses_vcxproj=True, + path=path, + sdk_based=sdk_based, + default_toolset="v145", + compatible_sdks=["v8.1", "v10.0"], + ), "2022": VisualStudioVersion( "2022", "Visual Studio 2022", @@ -462,6 +474,7 @@ def _DetectVisualStudioVersions(versions_to_check, force_express): "15.0": "2017", "16.0": "2019", "17.0": "2022", + "18.0": "2026", } versions = [] for version in versions_to_check: @@ -537,7 +550,18 @@ def SelectVisualStudioVersion(version="auto", allow_fallback=True): if version == "auto": version = os.environ.get("GYP_MSVS_VERSION", "auto") version_map = { - "auto": ("17.0", "16.0", "15.0", "14.0", "12.0", "10.0", "9.0", "8.0", "11.0"), + "auto": ( + "18.0", + "17.0", + "16.0", + "15.0", + "14.0", + "12.0", + "10.0", + "9.0", + "8.0", + "11.0", + ), "2005": ("8.0",), "2005e": ("8.0",), "2008": ("9.0",), @@ -552,6 +576,7 @@ def SelectVisualStudioVersion(version="auto", allow_fallback=True): "2017": ("15.0",), "2019": ("16.0",), "2022": ("17.0",), + "2026": ("18.0",), } if override_path := os.environ.get("GYP_MSVS_OVERRIDE_PATH"): msvs_version = os.environ.get("GYP_MSVS_VERSION") diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py index cfc0681f6bb049..5d5cae2afbf668 100644 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py @@ -378,7 +378,7 @@ def WriteRules(self, rules, extra_sources, extra_outputs): inputs = rule.get("inputs") for rule_source in rule.get("rule_sources", []): (rule_source_dirname, rule_source_basename) = os.path.split(rule_source) - (rule_source_root, rule_source_ext) = os.path.splitext( + (rule_source_root, _rule_source_ext) = os.path.splitext( rule_source_basename ) diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/compile_commands_json.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/compile_commands_json.py index bebb1303154e16..1361aeca48d0cd 100644 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/compile_commands_json.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/compile_commands_json.py @@ -100,7 +100,7 @@ def resolve(filename): def GenerateOutput(target_list, target_dicts, data, params): per_config_commands = {} for qualified_target, target in target_dicts.items(): - build_file, target_name, toolset = gyp.common.ParseQualifiedTarget( + build_file, _target_name, _toolset = gyp.common.ParseQualifiedTarget( qualified_target ) if IsMac(params): diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/gypd.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/gypd.py index 3c70b81fd25625..89af24a201b101 100644 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/gypd.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/gypd.py @@ -73,7 +73,7 @@ def GenerateOutput(target_list, target_dicts, data, params): output_files = {} for qualified_target in target_list: - [input_file, target] = gyp.common.ParseQualifiedTarget(qualified_target)[0:2] + [input_file, _target] = gyp.common.ParseQualifiedTarget(qualified_target)[0:2] if input_file[-4:] != ".gyp": continue diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/make.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/make.py index 1f0995718b59b7..5f30f39fc503e5 100644 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/make.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/make.py @@ -1169,7 +1169,7 @@ def WriteRules( for rule_source in rule.get("rule_sources", []): dirs = set() (rule_source_dirname, rule_source_basename) = os.path.split(rule_source) - (rule_source_root, rule_source_ext) = os.path.splitext( + (rule_source_root, _rule_source_ext) = os.path.splitext( rule_source_basename ) diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py index 3b258ee8f395e7..0f14c055049add 100644 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py @@ -1666,7 +1666,7 @@ def _HandlePreCompiledHeaders(p, sources, spec): p.AddFileConfig( source, _ConfigFullName(config_name, config), {}, tools=[tool] ) - basename, extension = os.path.splitext(source) + _basename, extension = os.path.splitext(source) if extension == ".c": extensions_excluded_from_precompile = [".cc", ".cpp", ".cxx"] else: @@ -1677,7 +1677,7 @@ def DisableForSourceTree(source_tree): if isinstance(source, MSVSProject.Filter): DisableForSourceTree(source.contents) else: - basename, extension = os.path.splitext(source) + _basename, extension = os.path.splitext(source) if extension in extensions_excluded_from_precompile: for config_name, config in spec["configurations"].items(): tool = MSVSProject.Tool( @@ -3579,7 +3579,7 @@ def _AddSources2( # If the precompiled header is generated by a C source, # we must not try to use it for C++ sources, # and vice versa. - basename, extension = os.path.splitext(precompiled_source) + _basename, extension = os.path.splitext(precompiled_source) if extension == ".c": extensions_excluded_from_precompile = [ ".cc", diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode.py index 8e05657961fe98..db4b45d1a04d25 100644 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode.py @@ -531,7 +531,7 @@ def AddSourceToTarget(source, type, pbxp, xct): library_extensions = ["a", "dylib", "framework", "o"] basename = posixpath.basename(source) - (root, ext) = posixpath.splitext(basename) + (_root, ext) = posixpath.splitext(basename) if ext: ext = ext[1:].lower() @@ -696,7 +696,7 @@ def GenerateOutput(target_list, target_dicts, data, params): xcode_targets = {} xcode_target_to_target_dict = {} for qualified_target in target_list: - [build_file, target_name, toolset] = gyp.common.ParseQualifiedTarget( + [build_file, target_name, _toolset] = gyp.common.ParseQualifiedTarget( qualified_target ) @@ -1215,7 +1215,7 @@ def GenerateOutput(target_list, target_dicts, data, params): # Add "sources". for source in spec.get("sources", []): - (source_root, source_extension) = posixpath.splitext(source) + (_source_root, source_extension) = posixpath.splitext(source) if source_extension[1:] not in rules_by_ext: # AddSourceToTarget will add the file to a root group if it's not # already there. @@ -1227,7 +1227,7 @@ def GenerateOutput(target_list, target_dicts, data, params): # it's a bundle of any type. if is_bundle: for resource in tgt_mac_bundle_resources: - (resource_root, resource_extension) = posixpath.splitext(resource) + (_resource_root, resource_extension) = posixpath.splitext(resource) if resource_extension[1:] not in rules_by_ext: AddResourceToTarget(resource, pbxp, xct) else: diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/input.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/input.py index 4965ff1571c73c..f3a5e168f2075d 100644 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/input.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/input.py @@ -2757,7 +2757,7 @@ def ValidateRulesInTarget(target, target_dict, extra_sources_for_rules): source_keys.extend(extra_sources_for_rules) for source_key in source_keys: for source in target_dict.get(source_key, []): - (source_root, source_extension) = os.path.splitext(source) + (_source_root, source_extension) = os.path.splitext(source) if source_extension.startswith("."): source_extension = source_extension[1:] if source_extension == rule_extension: diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation.py index 192a523529fddd..d13eaa9af240b7 100644 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation.py @@ -1534,18 +1534,20 @@ def CLTVersion(): FROM_XCODE_PKG_ID = "com.apple.pkg.DeveloperToolsCLI" MAVERICKS_PKG_ID = "com.apple.pkg.CLTools_Executables" - regex = re.compile("version: (?P.+)") + regex = re.compile(r"version: (?P.+)") for key in [MAVERICKS_PKG_ID, STANDALONE_PKG_ID, FROM_XCODE_PKG_ID]: try: output = GetStdout(["/usr/sbin/pkgutil", "--pkg-info", key]) - return re.search(regex, output).groupdict()["version"] + if m := re.search(regex, output): + return m.groupdict()["version"] except (GypError, OSError): continue regex = re.compile(r"Command Line Tools for Xcode\s+(?P\S+)") try: output = GetStdout(["/usr/sbin/softwareupdate", "--history"]) - return re.search(regex, output).groupdict()["version"] + if m := re.search(regex, output): + return m.groupdict()["version"] except (GypError, OSError): return None diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/xcode_ninja.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/xcode_ninja.py index 1a97a06c51d9f5..a133fdbe8b4f58 100644 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/xcode_ninja.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/xcode_ninja.py @@ -22,7 +22,7 @@ def _WriteWorkspace(main_gyp, sources_gyp, params): """Create a workspace to wrap main and sources gyp paths.""" - (build_file_root, build_file_ext) = os.path.splitext(main_gyp) + (build_file_root, _build_file_ext) = os.path.splitext(main_gyp) workspace_path = build_file_root + ".xcworkspace" options = params["options"] if options.generator_output: diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/xcodeproj_file.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/xcodeproj_file.py index 11e2be07372230..cb467470d3044b 100644 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/xcodeproj_file.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/xcodeproj_file.py @@ -487,7 +487,7 @@ def Children(self): children = [] for property, attributes in self._schema.items(): - (is_list, property_type, is_strong) = attributes[0:3] + (is_list, _property_type, is_strong) = attributes[0:3] if is_strong and property in self._properties: if not is_list: children.append(self._properties[property]) @@ -913,7 +913,7 @@ def VerifyHasRequiredProperties(self): # TODO(mark): A stronger verification mechanism is needed. Some # subclasses need to perform validation beyond what the schema can enforce. for property, attributes in self._schema.items(): - (is_list, property_type, is_strong, is_required) = attributes[0:4] + (_is_list, _property_type, _is_strong, is_required) = attributes[0:4] if is_required and property not in self._properties: raise KeyError(self.__class__.__name__ + " requires " + property) @@ -923,7 +923,7 @@ def _SetDefaultsFromSchema(self): defaults = {} for property, attributes in self._schema.items(): - (is_list, property_type, is_strong, is_required) = attributes[0:4] + (_is_list, _property_type, _is_strong, is_required) = attributes[0:4] if ( is_required and len(attributes) >= 5 @@ -1616,7 +1616,7 @@ def __init__(self, properties=None, id=None, parent=None): prop_name = "lastKnownFileType" else: basename = posixpath.basename(self._properties["path"]) - (root, ext) = posixpath.splitext(basename) + (_root, ext) = posixpath.splitext(basename) # Check the map using a lowercase extension. # TODO(mark): Maybe it should try with the original case first and fall # back to lowercase, in case there are any instances where case @@ -2010,7 +2010,7 @@ def Name(self): return "Frameworks" def FileGroup(self, path): - (root, ext) = posixpath.splitext(path) + (_root, ext) = posixpath.splitext(path) if ext != "": ext = ext[1:].lower() if ext == "o": diff --git a/deps/npm/node_modules/node-gyp/gyp/pyproject.toml b/deps/npm/node_modules/node-gyp/gyp/pyproject.toml index 3a029c4fc5140c..cd4f0383fd37c7 100644 --- a/deps/npm/node_modules/node-gyp/gyp/pyproject.toml +++ b/deps/npm/node_modules/node-gyp/gyp/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "gyp-next" -version = "0.20.4" +version = "0.21.0" authors = [ { name="Node.js contributors", email="ryzokuken@disroot.org" }, ] diff --git a/deps/npm/node_modules/node-gyp/lib/find-visualstudio.js b/deps/npm/node_modules/node-gyp/lib/find-visualstudio.js index e9aa7fafdc98a4..e0cf383489e282 100644 --- a/deps/npm/node_modules/node-gyp/lib/find-visualstudio.js +++ b/deps/npm/node_modules/node-gyp/lib/find-visualstudio.js @@ -119,7 +119,7 @@ class VisualStudioFinder { } async findVisualStudio2019OrNewerFromSpecifiedLocation () { - return this.findVSFromSpecifiedLocation([2019, 2022]) + return this.findVSFromSpecifiedLocation([2019, 2022, 2026]) } async findVisualStudio2017FromSpecifiedLocation () { @@ -162,7 +162,7 @@ class VisualStudioFinder { } async findVisualStudio2019OrNewerUsingSetupModule () { - return this.findNewVSUsingSetupModule([2019, 2022]) + return this.findNewVSUsingSetupModule([2019, 2022, 2026]) } async findVisualStudio2017UsingSetupModule () { @@ -223,7 +223,7 @@ class VisualStudioFinder { // Invoke the PowerShell script to get information about Visual Studio 2019 // or newer installations async findVisualStudio2019OrNewer () { - return this.findNewVS([2019, 2022]) + return this.findNewVS([2019, 2022, 2026]) } // Invoke the PowerShell script to get information about Visual Studio 2017 @@ -389,6 +389,10 @@ class VisualStudioFinder { ret.versionYear = 2022 return ret } + if (ret.versionMajor === 18) { + ret.versionYear = 2026 + return ret + } this.log.silly('- unsupported version:', ret.versionMajor) return {} } @@ -456,6 +460,8 @@ class VisualStudioFinder { return 'v142' } else if (versionYear === 2022) { return 'v143' + } else if (versionYear === 2026) { + return 'v145' } this.log.silly('- invalid versionYear:', versionYear) return null diff --git a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/agents.js b/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/agents.js deleted file mode 100644 index c541b93001517e..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/agents.js +++ /dev/null @@ -1,206 +0,0 @@ -'use strict' - -const net = require('net') -const tls = require('tls') -const { once } = require('events') -const timers = require('timers/promises') -const { normalizeOptions, cacheOptions } = require('./options') -const { getProxy, getProxyAgent, proxyCache } = require('./proxy.js') -const Errors = require('./errors.js') -const { Agent: AgentBase } = require('agent-base') - -module.exports = class Agent extends AgentBase { - #options - #timeouts - #proxy - #noProxy - #ProxyAgent - - constructor (options = {}) { - const { timeouts, proxy, noProxy, ...normalizedOptions } = normalizeOptions(options) - - super(normalizedOptions) - - this.#options = normalizedOptions - this.#timeouts = timeouts - - if (proxy) { - this.#proxy = new URL(proxy) - this.#noProxy = noProxy - this.#ProxyAgent = getProxyAgent(proxy) - } - } - - get proxy () { - return this.#proxy ? { url: this.#proxy } : {} - } - - #getProxy (options) { - if (!this.#proxy) { - return - } - - const proxy = getProxy(`${options.protocol}//${options.host}:${options.port}`, { - proxy: this.#proxy, - noProxy: this.#noProxy, - }) - - if (!proxy) { - return - } - - const cacheKey = cacheOptions({ - ...options, - ...this.#options, - timeouts: this.#timeouts, - proxy, - }) - - if (proxyCache.has(cacheKey)) { - return proxyCache.get(cacheKey) - } - - let ProxyAgent = this.#ProxyAgent - if (Array.isArray(ProxyAgent)) { - ProxyAgent = this.isSecureEndpoint(options) ? ProxyAgent[1] : ProxyAgent[0] - } - - const proxyAgent = new ProxyAgent(proxy, { - ...this.#options, - socketOptions: { family: this.#options.family }, - }) - proxyCache.set(cacheKey, proxyAgent) - - return proxyAgent - } - - // takes an array of promises and races them against the connection timeout - // which will throw the necessary error if it is hit. This will return the - // result of the promise race. - async #timeoutConnection ({ promises, options, timeout }, ac = new AbortController()) { - if (timeout) { - const connectionTimeout = timers.setTimeout(timeout, null, { signal: ac.signal }) - .then(() => { - throw new Errors.ConnectionTimeoutError(`${options.host}:${options.port}`) - }).catch((err) => { - if (err.name === 'AbortError') { - return - } - throw err - }) - promises.push(connectionTimeout) - } - - let result - try { - result = await Promise.race(promises) - ac.abort() - } catch (err) { - ac.abort() - throw err - } - return result - } - - async connect (request, options) { - // if the connection does not have its own lookup function - // set, then use the one from our options - options.lookup ??= this.#options.lookup - - let socket - let timeout = this.#timeouts.connection - const isSecureEndpoint = this.isSecureEndpoint(options) - - const proxy = this.#getProxy(options) - if (proxy) { - // some of the proxies will wait for the socket to fully connect before - // returning so we have to await this while also racing it against the - // connection timeout. - const start = Date.now() - socket = await this.#timeoutConnection({ - options, - timeout, - promises: [proxy.connect(request, options)], - }) - // see how much time proxy.connect took and subtract it from - // the timeout - if (timeout) { - timeout = timeout - (Date.now() - start) - } - } else { - socket = (isSecureEndpoint ? tls : net).connect(options) - } - - socket.setKeepAlive(this.keepAlive, this.keepAliveMsecs) - socket.setNoDelay(this.keepAlive) - - const abortController = new AbortController() - const { signal } = abortController - - const connectPromise = socket[isSecureEndpoint ? 'secureConnecting' : 'connecting'] - ? once(socket, isSecureEndpoint ? 'secureConnect' : 'connect', { signal }) - : Promise.resolve() - - await this.#timeoutConnection({ - options, - timeout, - promises: [ - connectPromise, - once(socket, 'error', { signal }).then((err) => { - throw err[0] - }), - ], - }, abortController) - - if (this.#timeouts.idle) { - socket.setTimeout(this.#timeouts.idle, () => { - socket.destroy(new Errors.IdleTimeoutError(`${options.host}:${options.port}`)) - }) - } - - return socket - } - - addRequest (request, options) { - const proxy = this.#getProxy(options) - // it would be better to call proxy.addRequest here but this causes the - // http-proxy-agent to call its super.addRequest which causes the request - // to be added to the agent twice. since we only support 3 agents - // currently (see the required agents in proxy.js) we have manually - // checked that the only public methods we need to call are called in the - // next block. this could change in the future and presumably we would get - // failing tests until we have properly called the necessary methods on - // each of our proxy agents - if (proxy?.setRequestProps) { - proxy.setRequestProps(request, options) - } - - request.setHeader('connection', this.keepAlive ? 'keep-alive' : 'close') - - if (this.#timeouts.response) { - let responseTimeout - request.once('finish', () => { - setTimeout(() => { - request.destroy(new Errors.ResponseTimeoutError(request, this.#proxy)) - }, this.#timeouts.response) - }) - request.once('response', () => { - clearTimeout(responseTimeout) - }) - } - - if (this.#timeouts.transfer) { - let transferTimeout - request.once('response', (res) => { - setTimeout(() => { - res.destroy(new Errors.TransferTimeoutError(request, this.#proxy)) - }, this.#timeouts.transfer) - res.once('close', () => { - clearTimeout(transferTimeout) - }) - }) - } - - return super.addRequest(request, options) - } -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/dns.js b/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/dns.js deleted file mode 100644 index 3c6946c566d736..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/dns.js +++ /dev/null @@ -1,53 +0,0 @@ -'use strict' - -const { LRUCache } = require('lru-cache') -const dns = require('dns') - -// this is a factory so that each request can have its own opts (i.e. ttl) -// while still sharing the cache across all requests -const cache = new LRUCache({ max: 50 }) - -const getOptions = ({ - family = 0, - hints = dns.ADDRCONFIG, - all = false, - verbatim = undefined, - ttl = 5 * 60 * 1000, - lookup = dns.lookup, -}) => ({ - // hints and lookup are returned since both are top level properties to (net|tls).connect - hints, - lookup: (hostname, ...args) => { - const callback = args.pop() // callback is always last arg - const lookupOptions = args[0] ?? {} - - const options = { - family, - hints, - all, - verbatim, - ...(typeof lookupOptions === 'number' ? { family: lookupOptions } : lookupOptions), - } - - const key = JSON.stringify({ hostname, ...options }) - - if (cache.has(key)) { - const cached = cache.get(key) - return process.nextTick(callback, null, ...cached) - } - - lookup(hostname, options, (err, ...result) => { - if (err) { - return callback(err) - } - - cache.set(key, result, { ttl }) - return callback(null, ...result) - }) - }, -}) - -module.exports = { - cache, - getOptions, -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/errors.js b/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/errors.js deleted file mode 100644 index 70475aec8eb357..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/errors.js +++ /dev/null @@ -1,61 +0,0 @@ -'use strict' - -class InvalidProxyProtocolError extends Error { - constructor (url) { - super(`Invalid protocol \`${url.protocol}\` connecting to proxy \`${url.host}\``) - this.code = 'EINVALIDPROXY' - this.proxy = url - } -} - -class ConnectionTimeoutError extends Error { - constructor (host) { - super(`Timeout connecting to host \`${host}\``) - this.code = 'ECONNECTIONTIMEOUT' - this.host = host - } -} - -class IdleTimeoutError extends Error { - constructor (host) { - super(`Idle timeout reached for host \`${host}\``) - this.code = 'EIDLETIMEOUT' - this.host = host - } -} - -class ResponseTimeoutError extends Error { - constructor (request, proxy) { - let msg = 'Response timeout ' - if (proxy) { - msg += `from proxy \`${proxy.host}\` ` - } - msg += `connecting to host \`${request.host}\`` - super(msg) - this.code = 'ERESPONSETIMEOUT' - this.proxy = proxy - this.request = request - } -} - -class TransferTimeoutError extends Error { - constructor (request, proxy) { - let msg = 'Transfer timeout ' - if (proxy) { - msg += `from proxy \`${proxy.host}\` ` - } - msg += `for \`${request.host}\`` - super(msg) - this.code = 'ETRANSFERTIMEOUT' - this.proxy = proxy - this.request = request - } -} - -module.exports = { - InvalidProxyProtocolError, - ConnectionTimeoutError, - IdleTimeoutError, - ResponseTimeoutError, - TransferTimeoutError, -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/index.js b/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/index.js deleted file mode 100644 index b33d6eaef07a21..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/index.js +++ /dev/null @@ -1,56 +0,0 @@ -'use strict' - -const { LRUCache } = require('lru-cache') -const { normalizeOptions, cacheOptions } = require('./options') -const { getProxy, proxyCache } = require('./proxy.js') -const dns = require('./dns.js') -const Agent = require('./agents.js') - -const agentCache = new LRUCache({ max: 20 }) - -const getAgent = (url, { agent, proxy, noProxy, ...options } = {}) => { - // false has meaning so this can't be a simple truthiness check - if (agent != null) { - return agent - } - - url = new URL(url) - - const proxyForUrl = getProxy(url, { proxy, noProxy }) - const normalizedOptions = { - ...normalizeOptions(options), - proxy: proxyForUrl, - } - - const cacheKey = cacheOptions({ - ...normalizedOptions, - secureEndpoint: url.protocol === 'https:', - }) - - if (agentCache.has(cacheKey)) { - return agentCache.get(cacheKey) - } - - const newAgent = new Agent(normalizedOptions) - agentCache.set(cacheKey, newAgent) - - return newAgent -} - -module.exports = { - getAgent, - Agent, - // these are exported for backwards compatability - HttpAgent: Agent, - HttpsAgent: Agent, - cache: { - proxy: proxyCache, - agent: agentCache, - dns: dns.cache, - clear: () => { - proxyCache.clear() - agentCache.clear() - dns.cache.clear() - }, - }, -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/options.js b/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/options.js deleted file mode 100644 index 0bf53f725f0846..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/options.js +++ /dev/null @@ -1,86 +0,0 @@ -'use strict' - -const dns = require('./dns') - -const normalizeOptions = (opts) => { - const family = parseInt(opts.family ?? '0', 10) - const keepAlive = opts.keepAlive ?? true - - const normalized = { - // nodejs http agent options. these are all the defaults - // but kept here to increase the likelihood of cache hits - // https://nodejs.org/api/http.html#new-agentoptions - keepAliveMsecs: keepAlive ? 1000 : undefined, - maxSockets: opts.maxSockets ?? 15, - maxTotalSockets: Infinity, - maxFreeSockets: keepAlive ? 256 : undefined, - scheduling: 'fifo', - // then spread the rest of the options - ...opts, - // we already set these to their defaults that we want - family, - keepAlive, - // our custom timeout options - timeouts: { - // the standard timeout option is mapped to our idle timeout - // and then deleted below - idle: opts.timeout ?? 0, - connection: 0, - response: 0, - transfer: 0, - ...opts.timeouts, - }, - // get the dns options that go at the top level of socket connection - ...dns.getOptions({ family, ...opts.dns }), - } - - // remove timeout since we already used it to set our own idle timeout - delete normalized.timeout - - return normalized -} - -const createKey = (obj) => { - let key = '' - const sorted = Object.entries(obj).sort((a, b) => a[0] - b[0]) - for (let [k, v] of sorted) { - if (v == null) { - v = 'null' - } else if (v instanceof URL) { - v = v.toString() - } else if (typeof v === 'object') { - v = createKey(v) - } - key += `${k}:${v}:` - } - return key -} - -const cacheOptions = ({ secureEndpoint, ...options }) => createKey({ - secureEndpoint: !!secureEndpoint, - // socket connect options - family: options.family, - hints: options.hints, - localAddress: options.localAddress, - // tls specific connect options - strictSsl: secureEndpoint ? !!options.rejectUnauthorized : false, - ca: secureEndpoint ? options.ca : null, - cert: secureEndpoint ? options.cert : null, - key: secureEndpoint ? options.key : null, - // http agent options - keepAlive: options.keepAlive, - keepAliveMsecs: options.keepAliveMsecs, - maxSockets: options.maxSockets, - maxTotalSockets: options.maxTotalSockets, - maxFreeSockets: options.maxFreeSockets, - scheduling: options.scheduling, - // timeout options - timeouts: options.timeouts, - // proxy - proxy: options.proxy, -}) - -module.exports = { - normalizeOptions, - cacheOptions, -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/proxy.js b/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/proxy.js deleted file mode 100644 index 6272e929e57bcf..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/proxy.js +++ /dev/null @@ -1,88 +0,0 @@ -'use strict' - -const { HttpProxyAgent } = require('http-proxy-agent') -const { HttpsProxyAgent } = require('https-proxy-agent') -const { SocksProxyAgent } = require('socks-proxy-agent') -const { LRUCache } = require('lru-cache') -const { InvalidProxyProtocolError } = require('./errors.js') - -const PROXY_CACHE = new LRUCache({ max: 20 }) - -const SOCKS_PROTOCOLS = new Set(SocksProxyAgent.protocols) - -const PROXY_ENV_KEYS = new Set(['https_proxy', 'http_proxy', 'proxy', 'no_proxy']) - -const PROXY_ENV = Object.entries(process.env).reduce((acc, [key, value]) => { - key = key.toLowerCase() - if (PROXY_ENV_KEYS.has(key)) { - acc[key] = value - } - return acc -}, {}) - -const getProxyAgent = (url) => { - url = new URL(url) - - const protocol = url.protocol.slice(0, -1) - if (SOCKS_PROTOCOLS.has(protocol)) { - return SocksProxyAgent - } - if (protocol === 'https' || protocol === 'http') { - return [HttpProxyAgent, HttpsProxyAgent] - } - - throw new InvalidProxyProtocolError(url) -} - -const isNoProxy = (url, noProxy) => { - if (typeof noProxy === 'string') { - noProxy = noProxy.split(',').map((p) => p.trim()).filter(Boolean) - } - - if (!noProxy || !noProxy.length) { - return false - } - - const hostSegments = url.hostname.split('.').reverse() - - return noProxy.some((no) => { - const noSegments = no.split('.').filter(Boolean).reverse() - if (!noSegments.length) { - return false - } - - for (let i = 0; i < noSegments.length; i++) { - if (hostSegments[i] !== noSegments[i]) { - return false - } - } - - return true - }) -} - -const getProxy = (url, { proxy, noProxy }) => { - url = new URL(url) - - if (!proxy) { - proxy = url.protocol === 'https:' - ? PROXY_ENV.https_proxy - : PROXY_ENV.https_proxy || PROXY_ENV.http_proxy || PROXY_ENV.proxy - } - - if (!noProxy) { - noProxy = PROXY_ENV.no_proxy - } - - if (!proxy || isNoProxy(url, noProxy)) { - return null - } - - return new URL(proxy) -} - -module.exports = { - getProxyAgent, - getProxy, - proxyCache: PROXY_CACHE, -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/LICENSE.md b/deps/npm/node_modules/node-gyp/node_modules/cacache/LICENSE.md deleted file mode 100644 index 8d28acf866d932..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/LICENSE.md +++ /dev/null @@ -1,16 +0,0 @@ -ISC License - -Copyright (c) npm, Inc. - -Permission to use, copy, modify, and/or distribute this software for -any purpose with or without fee is hereby granted, provided that the -above copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE COPYRIGHT HOLDER DISCLAIMS -ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR -CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE -USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/path.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/path.js deleted file mode 100644 index ad5a76a4f73f26..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/path.js +++ /dev/null @@ -1,29 +0,0 @@ -'use strict' - -const contentVer = require('../../package.json')['cache-version'].content -const hashToSegments = require('../util/hash-to-segments') -const path = require('path') -const ssri = require('ssri') - -// Current format of content file path: -// -// sha512-BaSE64Hex= -> -// ~/.my-cache/content-v2/sha512/ba/da/55deadbeefc0ffee -// -module.exports = contentPath - -function contentPath (cache, integrity) { - const sri = ssri.parse(integrity, { single: true }) - // contentPath is the *strongest* algo given - return path.join( - contentDir(cache), - sri.algorithm, - ...hashToSegments(sri.hexDigest()) - ) -} - -module.exports.contentDir = contentDir - -function contentDir (cache) { - return path.join(cache, `content-v${contentVer}`) -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/read.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/read.js deleted file mode 100644 index 5f6192c3cec566..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/read.js +++ /dev/null @@ -1,165 +0,0 @@ -'use strict' - -const fs = require('fs/promises') -const fsm = require('fs-minipass') -const ssri = require('ssri') -const contentPath = require('./path') -const Pipeline = require('minipass-pipeline') - -module.exports = read - -const MAX_SINGLE_READ_SIZE = 64 * 1024 * 1024 -async function read (cache, integrity, opts = {}) { - const { size } = opts - const { stat, cpath, sri } = await withContentSri(cache, integrity, async (cpath, sri) => { - // get size - const stat = size ? { size } : await fs.stat(cpath) - return { stat, cpath, sri } - }) - - if (stat.size > MAX_SINGLE_READ_SIZE) { - return readPipeline(cpath, stat.size, sri, new Pipeline()).concat() - } - - const data = await fs.readFile(cpath, { encoding: null }) - - if (stat.size !== data.length) { - throw sizeError(stat.size, data.length) - } - - if (!ssri.checkData(data, sri)) { - throw integrityError(sri, cpath) - } - - return data -} - -const readPipeline = (cpath, size, sri, stream) => { - stream.push( - new fsm.ReadStream(cpath, { - size, - readSize: MAX_SINGLE_READ_SIZE, - }), - ssri.integrityStream({ - integrity: sri, - size, - }) - ) - return stream -} - -module.exports.stream = readStream -module.exports.readStream = readStream - -function readStream (cache, integrity, opts = {}) { - const { size } = opts - const stream = new Pipeline() - // Set all this up to run on the stream and then just return the stream - Promise.resolve().then(async () => { - const { stat, cpath, sri } = await withContentSri(cache, integrity, async (cpath, sri) => { - // get size - const stat = size ? { size } : await fs.stat(cpath) - return { stat, cpath, sri } - }) - - return readPipeline(cpath, stat.size, sri, stream) - }).catch(err => stream.emit('error', err)) - - return stream -} - -module.exports.copy = copy - -function copy (cache, integrity, dest) { - return withContentSri(cache, integrity, (cpath) => { - return fs.copyFile(cpath, dest) - }) -} - -module.exports.hasContent = hasContent - -async function hasContent (cache, integrity) { - if (!integrity) { - return false - } - - try { - return await withContentSri(cache, integrity, async (cpath, sri) => { - const stat = await fs.stat(cpath) - return { size: stat.size, sri, stat } - }) - } catch (err) { - if (err.code === 'ENOENT') { - return false - } - - if (err.code === 'EPERM') { - /* istanbul ignore else */ - if (process.platform !== 'win32') { - throw err - } else { - return false - } - } - } -} - -async function withContentSri (cache, integrity, fn) { - const sri = ssri.parse(integrity) - // If `integrity` has multiple entries, pick the first digest - // with available local data. - const algo = sri.pickAlgorithm() - const digests = sri[algo] - - if (digests.length <= 1) { - const cpath = contentPath(cache, digests[0]) - return fn(cpath, digests[0]) - } else { - // Can't use race here because a generic error can happen before - // a ENOENT error, and can happen before a valid result - const results = await Promise.all(digests.map(async (meta) => { - try { - return await withContentSri(cache, meta, fn) - } catch (err) { - if (err.code === 'ENOENT') { - return Object.assign( - new Error('No matching content found for ' + sri.toString()), - { code: 'ENOENT' } - ) - } - return err - } - })) - // Return the first non error if it is found - const result = results.find((r) => !(r instanceof Error)) - if (result) { - return result - } - - // Throw the No matching content found error - const enoentError = results.find((r) => r.code === 'ENOENT') - if (enoentError) { - throw enoentError - } - - // Throw generic error - throw results.find((r) => r instanceof Error) - } -} - -function sizeError (expected, found) { - /* eslint-disable-next-line max-len */ - const err = new Error(`Bad data size: expected inserted data to be ${expected} bytes, but got ${found} instead`) - err.expected = expected - err.found = found - err.code = 'EBADSIZE' - return err -} - -function integrityError (sri, path) { - const err = new Error(`Integrity verification failed for ${sri} (${path})`) - err.code = 'EINTEGRITY' - err.sri = sri - err.path = path - return err -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/rm.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/rm.js deleted file mode 100644 index ce58d679e4cb25..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/rm.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict' - -const fs = require('fs/promises') -const contentPath = require('./path') -const { hasContent } = require('./read') - -module.exports = rm - -async function rm (cache, integrity) { - const content = await hasContent(cache, integrity) - // ~pretty~ sure we can't end up with a content lacking sri, but be safe - if (content && content.sri) { - await fs.rm(contentPath(cache, content.sri), { recursive: true, force: true }) - return true - } else { - return false - } -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/write.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/write.js deleted file mode 100644 index e7187abca8788a..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/write.js +++ /dev/null @@ -1,206 +0,0 @@ -'use strict' - -const events = require('events') - -const contentPath = require('./path') -const fs = require('fs/promises') -const { moveFile } = require('@npmcli/fs') -const { Minipass } = require('minipass') -const Pipeline = require('minipass-pipeline') -const Flush = require('minipass-flush') -const path = require('path') -const ssri = require('ssri') -const uniqueFilename = require('unique-filename') -const fsm = require('fs-minipass') - -module.exports = write - -// Cache of move operations in process so we don't duplicate -const moveOperations = new Map() - -async function write (cache, data, opts = {}) { - const { algorithms, size, integrity } = opts - - if (typeof size === 'number' && data.length !== size) { - throw sizeError(size, data.length) - } - - const sri = ssri.fromData(data, algorithms ? { algorithms } : {}) - if (integrity && !ssri.checkData(data, integrity, opts)) { - throw checksumError(integrity, sri) - } - - for (const algo in sri) { - const tmp = await makeTmp(cache, opts) - const hash = sri[algo].toString() - try { - await fs.writeFile(tmp.target, data, { flag: 'wx' }) - await moveToDestination(tmp, cache, hash, opts) - } finally { - if (!tmp.moved) { - await fs.rm(tmp.target, { recursive: true, force: true }) - } - } - } - return { integrity: sri, size: data.length } -} - -module.exports.stream = writeStream - -// writes proxied to the 'inputStream' that is passed to the Promise -// 'end' is deferred until content is handled. -class CacacheWriteStream extends Flush { - constructor (cache, opts) { - super() - this.opts = opts - this.cache = cache - this.inputStream = new Minipass() - this.inputStream.on('error', er => this.emit('error', er)) - this.inputStream.on('drain', () => this.emit('drain')) - this.handleContentP = null - } - - write (chunk, encoding, cb) { - if (!this.handleContentP) { - this.handleContentP = handleContent( - this.inputStream, - this.cache, - this.opts - ) - this.handleContentP.catch(error => this.emit('error', error)) - } - return this.inputStream.write(chunk, encoding, cb) - } - - flush (cb) { - this.inputStream.end(() => { - if (!this.handleContentP) { - const e = new Error('Cache input stream was empty') - e.code = 'ENODATA' - // empty streams are probably emitting end right away. - // defer this one tick by rejecting a promise on it. - return Promise.reject(e).catch(cb) - } - // eslint-disable-next-line promise/catch-or-return - this.handleContentP.then( - (res) => { - res.integrity && this.emit('integrity', res.integrity) - // eslint-disable-next-line promise/always-return - res.size !== null && this.emit('size', res.size) - cb() - }, - (er) => cb(er) - ) - }) - } -} - -function writeStream (cache, opts = {}) { - return new CacacheWriteStream(cache, opts) -} - -async function handleContent (inputStream, cache, opts) { - const tmp = await makeTmp(cache, opts) - try { - const res = await pipeToTmp(inputStream, cache, tmp.target, opts) - await moveToDestination( - tmp, - cache, - res.integrity, - opts - ) - return res - } finally { - if (!tmp.moved) { - await fs.rm(tmp.target, { recursive: true, force: true }) - } - } -} - -async function pipeToTmp (inputStream, cache, tmpTarget, opts) { - const outStream = new fsm.WriteStream(tmpTarget, { - flags: 'wx', - }) - - if (opts.integrityEmitter) { - // we need to create these all simultaneously since they can fire in any order - const [integrity, size] = await Promise.all([ - events.once(opts.integrityEmitter, 'integrity').then(res => res[0]), - events.once(opts.integrityEmitter, 'size').then(res => res[0]), - new Pipeline(inputStream, outStream).promise(), - ]) - return { integrity, size } - } - - let integrity - let size - const hashStream = ssri.integrityStream({ - integrity: opts.integrity, - algorithms: opts.algorithms, - size: opts.size, - }) - hashStream.on('integrity', i => { - integrity = i - }) - hashStream.on('size', s => { - size = s - }) - - const pipeline = new Pipeline(inputStream, hashStream, outStream) - await pipeline.promise() - return { integrity, size } -} - -async function makeTmp (cache, opts) { - const tmpTarget = uniqueFilename(path.join(cache, 'tmp'), opts.tmpPrefix) - await fs.mkdir(path.dirname(tmpTarget), { recursive: true }) - return { - target: tmpTarget, - moved: false, - } -} - -async function moveToDestination (tmp, cache, sri) { - const destination = contentPath(cache, sri) - const destDir = path.dirname(destination) - if (moveOperations.has(destination)) { - return moveOperations.get(destination) - } - moveOperations.set( - destination, - fs.mkdir(destDir, { recursive: true }) - .then(async () => { - await moveFile(tmp.target, destination, { overwrite: false }) - tmp.moved = true - return tmp.moved - }) - .catch(err => { - if (!err.message.startsWith('The destination file exists')) { - throw Object.assign(err, { code: 'EEXIST' }) - } - }).finally(() => { - moveOperations.delete(destination) - }) - - ) - return moveOperations.get(destination) -} - -function sizeError (expected, found) { - /* eslint-disable-next-line max-len */ - const err = new Error(`Bad data size: expected inserted data to be ${expected} bytes, but got ${found} instead`) - err.expected = expected - err.found = found - err.code = 'EBADSIZE' - return err -} - -function checksumError (expected, found) { - const err = new Error(`Integrity check failed: - Wanted: ${expected} - Found: ${found}`) - err.code = 'EINTEGRITY' - err.expected = expected - err.found = found - return err -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/entry-index.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/entry-index.js deleted file mode 100644 index 0e09b10818d097..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/entry-index.js +++ /dev/null @@ -1,336 +0,0 @@ -'use strict' - -const crypto = require('crypto') -const { - appendFile, - mkdir, - readFile, - readdir, - rm, - writeFile, -} = require('fs/promises') -const { Minipass } = require('minipass') -const path = require('path') -const ssri = require('ssri') -const uniqueFilename = require('unique-filename') - -const contentPath = require('./content/path') -const hashToSegments = require('./util/hash-to-segments') -const indexV = require('../package.json')['cache-version'].index -const { moveFile } = require('@npmcli/fs') - -const lsStreamConcurrency = 5 - -module.exports.NotFoundError = class NotFoundError extends Error { - constructor (cache, key) { - super(`No cache entry for ${key} found in ${cache}`) - this.code = 'ENOENT' - this.cache = cache - this.key = key - } -} - -module.exports.compact = compact - -async function compact (cache, key, matchFn, opts = {}) { - const bucket = bucketPath(cache, key) - const entries = await bucketEntries(bucket) - const newEntries = [] - // we loop backwards because the bottom-most result is the newest - // since we add new entries with appendFile - for (let i = entries.length - 1; i >= 0; --i) { - const entry = entries[i] - // a null integrity could mean either a delete was appended - // or the user has simply stored an index that does not map - // to any content. we determine if the user wants to keep the - // null integrity based on the validateEntry function passed in options. - // if the integrity is null and no validateEntry is provided, we break - // as we consider the null integrity to be a deletion of everything - // that came before it. - if (entry.integrity === null && !opts.validateEntry) { - break - } - - // if this entry is valid, and it is either the first entry or - // the newEntries array doesn't already include an entry that - // matches this one based on the provided matchFn, then we add - // it to the beginning of our list - if ((!opts.validateEntry || opts.validateEntry(entry) === true) && - (newEntries.length === 0 || - !newEntries.find((oldEntry) => matchFn(oldEntry, entry)))) { - newEntries.unshift(entry) - } - } - - const newIndex = '\n' + newEntries.map((entry) => { - const stringified = JSON.stringify(entry) - const hash = hashEntry(stringified) - return `${hash}\t${stringified}` - }).join('\n') - - const setup = async () => { - const target = uniqueFilename(path.join(cache, 'tmp'), opts.tmpPrefix) - await mkdir(path.dirname(target), { recursive: true }) - return { - target, - moved: false, - } - } - - const teardown = async (tmp) => { - if (!tmp.moved) { - return rm(tmp.target, { recursive: true, force: true }) - } - } - - const write = async (tmp) => { - await writeFile(tmp.target, newIndex, { flag: 'wx' }) - await mkdir(path.dirname(bucket), { recursive: true }) - // we use @npmcli/move-file directly here because we - // want to overwrite the existing file - await moveFile(tmp.target, bucket) - tmp.moved = true - } - - // write the file atomically - const tmp = await setup() - try { - await write(tmp) - } finally { - await teardown(tmp) - } - - // we reverse the list we generated such that the newest - // entries come first in order to make looping through them easier - // the true passed to formatEntry tells it to keep null - // integrity values, if they made it this far it's because - // validateEntry returned true, and as such we should return it - return newEntries.reverse().map((entry) => formatEntry(cache, entry, true)) -} - -module.exports.insert = insert - -async function insert (cache, key, integrity, opts = {}) { - const { metadata, size, time } = opts - const bucket = bucketPath(cache, key) - const entry = { - key, - integrity: integrity && ssri.stringify(integrity), - time: time || Date.now(), - size, - metadata, - } - try { - await mkdir(path.dirname(bucket), { recursive: true }) - const stringified = JSON.stringify(entry) - // NOTE - Cleverness ahoy! - // - // This works because it's tremendously unlikely for an entry to corrupt - // another while still preserving the string length of the JSON in - // question. So, we just slap the length in there and verify it on read. - // - // Thanks to @isaacs for the whiteboarding session that ended up with - // this. - await appendFile(bucket, `\n${hashEntry(stringified)}\t${stringified}`) - } catch (err) { - if (err.code === 'ENOENT') { - return undefined - } - - throw err - } - return formatEntry(cache, entry) -} - -module.exports.find = find - -async function find (cache, key) { - const bucket = bucketPath(cache, key) - try { - const entries = await bucketEntries(bucket) - return entries.reduce((latest, next) => { - if (next && next.key === key) { - return formatEntry(cache, next) - } else { - return latest - } - }, null) - } catch (err) { - if (err.code === 'ENOENT') { - return null - } else { - throw err - } - } -} - -module.exports.delete = del - -function del (cache, key, opts = {}) { - if (!opts.removeFully) { - return insert(cache, key, null, opts) - } - - const bucket = bucketPath(cache, key) - return rm(bucket, { recursive: true, force: true }) -} - -module.exports.lsStream = lsStream - -function lsStream (cache) { - const indexDir = bucketDir(cache) - const stream = new Minipass({ objectMode: true }) - - // Set all this up to run on the stream and then just return the stream - Promise.resolve().then(async () => { - const { default: pMap } = await import('p-map') - const buckets = await readdirOrEmpty(indexDir) - await pMap(buckets, async (bucket) => { - const bucketPath = path.join(indexDir, bucket) - const subbuckets = await readdirOrEmpty(bucketPath) - await pMap(subbuckets, async (subbucket) => { - const subbucketPath = path.join(bucketPath, subbucket) - - // "/cachename//./*" - const subbucketEntries = await readdirOrEmpty(subbucketPath) - await pMap(subbucketEntries, async (entry) => { - const entryPath = path.join(subbucketPath, entry) - try { - const entries = await bucketEntries(entryPath) - // using a Map here prevents duplicate keys from showing up - // twice, I guess? - const reduced = entries.reduce((acc, entry) => { - acc.set(entry.key, entry) - return acc - }, new Map()) - // reduced is a map of key => entry - for (const entry of reduced.values()) { - const formatted = formatEntry(cache, entry) - if (formatted) { - stream.write(formatted) - } - } - } catch (err) { - if (err.code === 'ENOENT') { - return undefined - } - throw err - } - }, - { concurrency: lsStreamConcurrency }) - }, - { concurrency: lsStreamConcurrency }) - }, - { concurrency: lsStreamConcurrency }) - stream.end() - return stream - }).catch(err => stream.emit('error', err)) - - return stream -} - -module.exports.ls = ls - -async function ls (cache) { - const entries = await lsStream(cache).collect() - return entries.reduce((acc, xs) => { - acc[xs.key] = xs - return acc - }, {}) -} - -module.exports.bucketEntries = bucketEntries - -async function bucketEntries (bucket, filter) { - const data = await readFile(bucket, 'utf8') - return _bucketEntries(data, filter) -} - -function _bucketEntries (data) { - const entries = [] - data.split('\n').forEach((entry) => { - if (!entry) { - return - } - - const pieces = entry.split('\t') - if (!pieces[1] || hashEntry(pieces[1]) !== pieces[0]) { - // Hash is no good! Corruption or malice? Doesn't matter! - // EJECT EJECT - return - } - let obj - try { - obj = JSON.parse(pieces[1]) - } catch (_) { - // eslint-ignore-next-line no-empty-block - } - // coverage disabled here, no need to test with an entry that parses to something falsey - // istanbul ignore else - if (obj) { - entries.push(obj) - } - }) - return entries -} - -module.exports.bucketDir = bucketDir - -function bucketDir (cache) { - return path.join(cache, `index-v${indexV}`) -} - -module.exports.bucketPath = bucketPath - -function bucketPath (cache, key) { - const hashed = hashKey(key) - return path.join.apply( - path, - [bucketDir(cache)].concat(hashToSegments(hashed)) - ) -} - -module.exports.hashKey = hashKey - -function hashKey (key) { - return hash(key, 'sha256') -} - -module.exports.hashEntry = hashEntry - -function hashEntry (str) { - return hash(str, 'sha1') -} - -function hash (str, digest) { - return crypto - .createHash(digest) - .update(str) - .digest('hex') -} - -function formatEntry (cache, entry, keepAll) { - // Treat null digests as deletions. They'll shadow any previous entries. - if (!entry.integrity && !keepAll) { - return null - } - - return { - key: entry.key, - integrity: entry.integrity, - path: entry.integrity ? contentPath(cache, entry.integrity) : undefined, - size: entry.size, - time: entry.time, - metadata: entry.metadata, - } -} - -function readdirOrEmpty (dir) { - return readdir(dir).catch((err) => { - if (err.code === 'ENOENT' || err.code === 'ENOTDIR') { - return [] - } - - throw err - }) -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/get.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/get.js deleted file mode 100644 index 80ec206c7ecaaa..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/get.js +++ /dev/null @@ -1,170 +0,0 @@ -'use strict' - -const Collect = require('minipass-collect') -const { Minipass } = require('minipass') -const Pipeline = require('minipass-pipeline') - -const index = require('./entry-index') -const memo = require('./memoization') -const read = require('./content/read') - -async function getData (cache, key, opts = {}) { - const { integrity, memoize, size } = opts - const memoized = memo.get(cache, key, opts) - if (memoized && memoize !== false) { - return { - metadata: memoized.entry.metadata, - data: memoized.data, - integrity: memoized.entry.integrity, - size: memoized.entry.size, - } - } - - const entry = await index.find(cache, key, opts) - if (!entry) { - throw new index.NotFoundError(cache, key) - } - const data = await read(cache, entry.integrity, { integrity, size }) - if (memoize) { - memo.put(cache, entry, data, opts) - } - - return { - data, - metadata: entry.metadata, - size: entry.size, - integrity: entry.integrity, - } -} -module.exports = getData - -async function getDataByDigest (cache, key, opts = {}) { - const { integrity, memoize, size } = opts - const memoized = memo.get.byDigest(cache, key, opts) - if (memoized && memoize !== false) { - return memoized - } - - const res = await read(cache, key, { integrity, size }) - if (memoize) { - memo.put.byDigest(cache, key, res, opts) - } - return res -} -module.exports.byDigest = getDataByDigest - -const getMemoizedStream = (memoized) => { - const stream = new Minipass() - stream.on('newListener', function (ev, cb) { - ev === 'metadata' && cb(memoized.entry.metadata) - ev === 'integrity' && cb(memoized.entry.integrity) - ev === 'size' && cb(memoized.entry.size) - }) - stream.end(memoized.data) - return stream -} - -function getStream (cache, key, opts = {}) { - const { memoize, size } = opts - const memoized = memo.get(cache, key, opts) - if (memoized && memoize !== false) { - return getMemoizedStream(memoized) - } - - const stream = new Pipeline() - // Set all this up to run on the stream and then just return the stream - Promise.resolve().then(async () => { - const entry = await index.find(cache, key) - if (!entry) { - throw new index.NotFoundError(cache, key) - } - - stream.emit('metadata', entry.metadata) - stream.emit('integrity', entry.integrity) - stream.emit('size', entry.size) - stream.on('newListener', function (ev, cb) { - ev === 'metadata' && cb(entry.metadata) - ev === 'integrity' && cb(entry.integrity) - ev === 'size' && cb(entry.size) - }) - - const src = read.readStream( - cache, - entry.integrity, - { ...opts, size: typeof size !== 'number' ? entry.size : size } - ) - - if (memoize) { - const memoStream = new Collect.PassThrough() - memoStream.on('collect', data => memo.put(cache, entry, data, opts)) - stream.unshift(memoStream) - } - stream.unshift(src) - return stream - }).catch((err) => stream.emit('error', err)) - - return stream -} - -module.exports.stream = getStream - -function getStreamDigest (cache, integrity, opts = {}) { - const { memoize } = opts - const memoized = memo.get.byDigest(cache, integrity, opts) - if (memoized && memoize !== false) { - const stream = new Minipass() - stream.end(memoized) - return stream - } else { - const stream = read.readStream(cache, integrity, opts) - if (!memoize) { - return stream - } - - const memoStream = new Collect.PassThrough() - memoStream.on('collect', data => memo.put.byDigest( - cache, - integrity, - data, - opts - )) - return new Pipeline(stream, memoStream) - } -} - -module.exports.stream.byDigest = getStreamDigest - -function info (cache, key, opts = {}) { - const { memoize } = opts - const memoized = memo.get(cache, key, opts) - if (memoized && memoize !== false) { - return Promise.resolve(memoized.entry) - } else { - return index.find(cache, key) - } -} -module.exports.info = info - -async function copy (cache, key, dest, opts = {}) { - const entry = await index.find(cache, key, opts) - if (!entry) { - throw new index.NotFoundError(cache, key) - } - await read.copy(cache, entry.integrity, dest, opts) - return { - metadata: entry.metadata, - size: entry.size, - integrity: entry.integrity, - } -} - -module.exports.copy = copy - -async function copyByDigest (cache, key, dest, opts = {}) { - await read.copy(cache, key, dest, opts) - return key -} - -module.exports.copy.byDigest = copyByDigest - -module.exports.hasContent = read.hasContent diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/index.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/index.js deleted file mode 100644 index c9b0da5f3a271b..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/index.js +++ /dev/null @@ -1,42 +0,0 @@ -'use strict' - -const get = require('./get.js') -const put = require('./put.js') -const rm = require('./rm.js') -const verify = require('./verify.js') -const { clearMemoized } = require('./memoization.js') -const tmp = require('./util/tmp.js') -const index = require('./entry-index.js') - -module.exports.index = {} -module.exports.index.compact = index.compact -module.exports.index.insert = index.insert - -module.exports.ls = index.ls -module.exports.ls.stream = index.lsStream - -module.exports.get = get -module.exports.get.byDigest = get.byDigest -module.exports.get.stream = get.stream -module.exports.get.stream.byDigest = get.stream.byDigest -module.exports.get.copy = get.copy -module.exports.get.copy.byDigest = get.copy.byDigest -module.exports.get.info = get.info -module.exports.get.hasContent = get.hasContent - -module.exports.put = put -module.exports.put.stream = put.stream - -module.exports.rm = rm.entry -module.exports.rm.all = rm.all -module.exports.rm.entry = module.exports.rm -module.exports.rm.content = rm.content - -module.exports.clearMemoized = clearMemoized - -module.exports.tmp = {} -module.exports.tmp.mkdir = tmp.mkdir -module.exports.tmp.withTmp = tmp.withTmp - -module.exports.verify = verify -module.exports.verify.lastRun = verify.lastRun diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/memoization.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/memoization.js deleted file mode 100644 index 2ecc60912e4563..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/memoization.js +++ /dev/null @@ -1,72 +0,0 @@ -'use strict' - -const { LRUCache } = require('lru-cache') - -const MEMOIZED = new LRUCache({ - max: 500, - maxSize: 50 * 1024 * 1024, // 50MB - ttl: 3 * 60 * 1000, // 3 minutes - sizeCalculation: (entry, key) => key.startsWith('key:') ? entry.data.length : entry.length, -}) - -module.exports.clearMemoized = clearMemoized - -function clearMemoized () { - const old = {} - MEMOIZED.forEach((v, k) => { - old[k] = v - }) - MEMOIZED.clear() - return old -} - -module.exports.put = put - -function put (cache, entry, data, opts) { - pickMem(opts).set(`key:${cache}:${entry.key}`, { entry, data }) - putDigest(cache, entry.integrity, data, opts) -} - -module.exports.put.byDigest = putDigest - -function putDigest (cache, integrity, data, opts) { - pickMem(opts).set(`digest:${cache}:${integrity}`, data) -} - -module.exports.get = get - -function get (cache, key, opts) { - return pickMem(opts).get(`key:${cache}:${key}`) -} - -module.exports.get.byDigest = getDigest - -function getDigest (cache, integrity, opts) { - return pickMem(opts).get(`digest:${cache}:${integrity}`) -} - -class ObjProxy { - constructor (obj) { - this.obj = obj - } - - get (key) { - return this.obj[key] - } - - set (key, val) { - this.obj[key] = val - } -} - -function pickMem (opts) { - if (!opts || !opts.memoize) { - return MEMOIZED - } else if (opts.memoize.get && opts.memoize.set) { - return opts.memoize - } else if (typeof opts.memoize === 'object') { - return new ObjProxy(opts.memoize) - } else { - return MEMOIZED - } -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/put.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/put.js deleted file mode 100644 index 9fc932d5f6dec5..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/put.js +++ /dev/null @@ -1,80 +0,0 @@ -'use strict' - -const index = require('./entry-index') -const memo = require('./memoization') -const write = require('./content/write') -const Flush = require('minipass-flush') -const { PassThrough } = require('minipass-collect') -const Pipeline = require('minipass-pipeline') - -const putOpts = (opts) => ({ - algorithms: ['sha512'], - ...opts, -}) - -module.exports = putData - -async function putData (cache, key, data, opts = {}) { - const { memoize } = opts - opts = putOpts(opts) - const res = await write(cache, data, opts) - const entry = await index.insert(cache, key, res.integrity, { ...opts, size: res.size }) - if (memoize) { - memo.put(cache, entry, data, opts) - } - - return res.integrity -} - -module.exports.stream = putStream - -function putStream (cache, key, opts = {}) { - const { memoize } = opts - opts = putOpts(opts) - let integrity - let size - let error - - let memoData - const pipeline = new Pipeline() - // first item in the pipeline is the memoizer, because we need - // that to end first and get the collected data. - if (memoize) { - const memoizer = new PassThrough().on('collect', data => { - memoData = data - }) - pipeline.push(memoizer) - } - - // contentStream is a write-only, not a passthrough - // no data comes out of it. - const contentStream = write.stream(cache, opts) - .on('integrity', (int) => { - integrity = int - }) - .on('size', (s) => { - size = s - }) - .on('error', (err) => { - error = err - }) - - pipeline.push(contentStream) - - // last but not least, we write the index and emit hash and size, - // and memoize if we're doing that - pipeline.push(new Flush({ - async flush () { - if (!error) { - const entry = await index.insert(cache, key, integrity, { ...opts, size }) - if (memoize && memoData) { - memo.put(cache, entry, memoData, opts) - } - pipeline.emit('integrity', integrity) - pipeline.emit('size', size) - } - }, - })) - - return pipeline -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/rm.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/rm.js deleted file mode 100644 index a94760c7cf2430..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/rm.js +++ /dev/null @@ -1,31 +0,0 @@ -'use strict' - -const { rm } = require('fs/promises') -const glob = require('./util/glob.js') -const index = require('./entry-index') -const memo = require('./memoization') -const path = require('path') -const rmContent = require('./content/rm') - -module.exports = entry -module.exports.entry = entry - -function entry (cache, key, opts) { - memo.clearMemoized() - return index.delete(cache, key, opts) -} - -module.exports.content = content - -function content (cache, integrity) { - memo.clearMemoized() - return rmContent(cache, integrity) -} - -module.exports.all = all - -async function all (cache) { - memo.clearMemoized() - const paths = await glob(path.join(cache, '*(content-*|index-*)'), { silent: true, nosort: true }) - return Promise.all(paths.map((p) => rm(p, { recursive: true, force: true }))) -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/util/glob.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/util/glob.js deleted file mode 100644 index 8500c1c16a429f..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/util/glob.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict' - -const { glob } = require('glob') -const path = require('path') - -const globify = (pattern) => pattern.split(path.win32.sep).join(path.posix.sep) -module.exports = (path, options) => glob(globify(path), options) diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/util/hash-to-segments.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/util/hash-to-segments.js deleted file mode 100644 index 445599b5038088..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/util/hash-to-segments.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict' - -module.exports = hashToSegments - -function hashToSegments (hash) { - return [hash.slice(0, 2), hash.slice(2, 4), hash.slice(4)] -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/util/tmp.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/util/tmp.js deleted file mode 100644 index 0bf5302136ebeb..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/util/tmp.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict' - -const { withTempDir } = require('@npmcli/fs') -const fs = require('fs/promises') -const path = require('path') - -module.exports.mkdir = mktmpdir - -async function mktmpdir (cache, opts = {}) { - const { tmpPrefix } = opts - const tmpDir = path.join(cache, 'tmp') - await fs.mkdir(tmpDir, { recursive: true, owner: 'inherit' }) - // do not use path.join(), it drops the trailing / if tmpPrefix is unset - const target = `${tmpDir}${path.sep}${tmpPrefix || ''}` - return fs.mkdtemp(target, { owner: 'inherit' }) -} - -module.exports.withTmp = withTmp - -function withTmp (cache, opts, cb) { - if (!cb) { - cb = opts - opts = {} - } - return withTempDir(path.join(cache, 'tmp'), cb, opts) -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/verify.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/verify.js deleted file mode 100644 index dcff3aa73f3173..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/verify.js +++ /dev/null @@ -1,258 +0,0 @@ -'use strict' - -const { - mkdir, - readFile, - rm, - stat, - truncate, - writeFile, -} = require('fs/promises') -const contentPath = require('./content/path') -const fsm = require('fs-minipass') -const glob = require('./util/glob.js') -const index = require('./entry-index') -const path = require('path') -const ssri = require('ssri') - -const hasOwnProperty = (obj, key) => - Object.prototype.hasOwnProperty.call(obj, key) - -const verifyOpts = (opts) => ({ - concurrency: 20, - log: { silly () {} }, - ...opts, -}) - -module.exports = verify - -async function verify (cache, opts) { - opts = verifyOpts(opts) - opts.log.silly('verify', 'verifying cache at', cache) - - const steps = [ - markStartTime, - fixPerms, - garbageCollect, - rebuildIndex, - cleanTmp, - writeVerifile, - markEndTime, - ] - - const stats = {} - for (const step of steps) { - const label = step.name - const start = new Date() - const s = await step(cache, opts) - if (s) { - Object.keys(s).forEach((k) => { - stats[k] = s[k] - }) - } - const end = new Date() - if (!stats.runTime) { - stats.runTime = {} - } - stats.runTime[label] = end - start - } - stats.runTime.total = stats.endTime - stats.startTime - opts.log.silly( - 'verify', - 'verification finished for', - cache, - 'in', - `${stats.runTime.total}ms` - ) - return stats -} - -async function markStartTime () { - return { startTime: new Date() } -} - -async function markEndTime () { - return { endTime: new Date() } -} - -async function fixPerms (cache, opts) { - opts.log.silly('verify', 'fixing cache permissions') - await mkdir(cache, { recursive: true }) - return null -} - -// Implements a naive mark-and-sweep tracing garbage collector. -// -// The algorithm is basically as follows: -// 1. Read (and filter) all index entries ("pointers") -// 2. Mark each integrity value as "live" -// 3. Read entire filesystem tree in `content-vX/` dir -// 4. If content is live, verify its checksum and delete it if it fails -// 5. If content is not marked as live, rm it. -// -async function garbageCollect (cache, opts) { - opts.log.silly('verify', 'garbage collecting content') - const { default: pMap } = await import('p-map') - const indexStream = index.lsStream(cache) - const liveContent = new Set() - indexStream.on('data', (entry) => { - if (opts.filter && !opts.filter(entry)) { - return - } - - // integrity is stringified, re-parse it so we can get each hash - const integrity = ssri.parse(entry.integrity) - for (const algo in integrity) { - liveContent.add(integrity[algo].toString()) - } - }) - await new Promise((resolve, reject) => { - indexStream.on('end', resolve).on('error', reject) - }) - const contentDir = contentPath.contentDir(cache) - const files = await glob(path.join(contentDir, '**'), { - follow: false, - nodir: true, - nosort: true, - }) - const stats = { - verifiedContent: 0, - reclaimedCount: 0, - reclaimedSize: 0, - badContentCount: 0, - keptSize: 0, - } - await pMap( - files, - async (f) => { - const split = f.split(/[/\\]/) - const digest = split.slice(split.length - 3).join('') - const algo = split[split.length - 4] - const integrity = ssri.fromHex(digest, algo) - if (liveContent.has(integrity.toString())) { - const info = await verifyContent(f, integrity) - if (!info.valid) { - stats.reclaimedCount++ - stats.badContentCount++ - stats.reclaimedSize += info.size - } else { - stats.verifiedContent++ - stats.keptSize += info.size - } - } else { - // No entries refer to this content. We can delete. - stats.reclaimedCount++ - const s = await stat(f) - await rm(f, { recursive: true, force: true }) - stats.reclaimedSize += s.size - } - return stats - }, - { concurrency: opts.concurrency } - ) - return stats -} - -async function verifyContent (filepath, sri) { - const contentInfo = {} - try { - const { size } = await stat(filepath) - contentInfo.size = size - contentInfo.valid = true - await ssri.checkStream(new fsm.ReadStream(filepath), sri) - } catch (err) { - if (err.code === 'ENOENT') { - return { size: 0, valid: false } - } - if (err.code !== 'EINTEGRITY') { - throw err - } - - await rm(filepath, { recursive: true, force: true }) - contentInfo.valid = false - } - return contentInfo -} - -async function rebuildIndex (cache, opts) { - opts.log.silly('verify', 'rebuilding index') - const { default: pMap } = await import('p-map') - const entries = await index.ls(cache) - const stats = { - missingContent: 0, - rejectedEntries: 0, - totalEntries: 0, - } - const buckets = {} - for (const k in entries) { - /* istanbul ignore else */ - if (hasOwnProperty(entries, k)) { - const hashed = index.hashKey(k) - const entry = entries[k] - const excluded = opts.filter && !opts.filter(entry) - excluded && stats.rejectedEntries++ - if (buckets[hashed] && !excluded) { - buckets[hashed].push(entry) - } else if (buckets[hashed] && excluded) { - // skip - } else if (excluded) { - buckets[hashed] = [] - buckets[hashed]._path = index.bucketPath(cache, k) - } else { - buckets[hashed] = [entry] - buckets[hashed]._path = index.bucketPath(cache, k) - } - } - } - await pMap( - Object.keys(buckets), - (key) => { - return rebuildBucket(cache, buckets[key], stats, opts) - }, - { concurrency: opts.concurrency } - ) - return stats -} - -async function rebuildBucket (cache, bucket, stats) { - await truncate(bucket._path) - // This needs to be serialized because cacache explicitly - // lets very racy bucket conflicts clobber each other. - for (const entry of bucket) { - const content = contentPath(cache, entry.integrity) - try { - await stat(content) - await index.insert(cache, entry.key, entry.integrity, { - metadata: entry.metadata, - size: entry.size, - time: entry.time, - }) - stats.totalEntries++ - } catch (err) { - if (err.code === 'ENOENT') { - stats.rejectedEntries++ - stats.missingContent++ - } else { - throw err - } - } - } -} - -function cleanTmp (cache, opts) { - opts.log.silly('verify', 'cleaning tmp directory') - return rm(path.join(cache, 'tmp'), { recursive: true, force: true }) -} - -async function writeVerifile (cache, opts) { - const verifile = path.join(cache, '_lastverified') - opts.log.silly('verify', 'writing verifile to ' + verifile) - return writeFile(verifile, `${Date.now()}`) -} - -module.exports.lastRun = lastRun - -async function lastRun (cache) { - const data = await readFile(path.join(cache, '_lastverified'), { encoding: 'utf8' }) - return new Date(+data) -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/package.json b/deps/npm/node_modules/node-gyp/node_modules/cacache/package.json deleted file mode 100644 index ebb0f3f8ed4108..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/package.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "name": "cacache", - "version": "19.0.1", - "cache-version": { - "content": "2", - "index": "5" - }, - "description": "Fast, fault-tolerant, cross-platform, disk-based, data-agnostic, content-addressable cache.", - "main": "lib/index.js", - "files": [ - "bin/", - "lib/" - ], - "scripts": { - "test": "tap", - "snap": "tap", - "coverage": "tap", - "test-docker": "docker run -it --rm --name pacotest -v \"$PWD\":/tmp -w /tmp node:latest npm test", - "lint": "npm run eslint", - "npmclilint": "npmcli-lint", - "lintfix": "npm run eslint -- --fix", - "postsnap": "npm run lintfix --", - "postlint": "template-oss-check", - "posttest": "npm run lint", - "template-oss-apply": "template-oss-apply --force", - "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/npm/cacache.git" - }, - "keywords": [ - "cache", - "caching", - "content-addressable", - "sri", - "sri hash", - "subresource integrity", - "cache", - "storage", - "store", - "file store", - "filesystem", - "disk cache", - "disk storage" - ], - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^4.0.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^7.0.2", - "ssri": "^12.0.0", - "tar": "^7.4.3", - "unique-filename": "^4.0.0" - }, - "devDependencies": { - "@npmcli/eslint-config": "^5.0.0", - "@npmcli/template-oss": "4.23.3", - "tap": "^16.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "windowsCI": false, - "version": "4.23.3", - "publish": "true" - }, - "author": "GitHub Inc.", - "tap": { - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - } -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/README.md b/deps/npm/node_modules/node-gyp/node_modules/glob/README.md deleted file mode 100644 index 023cd7796820e0..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/README.md +++ /dev/null @@ -1,1265 +0,0 @@ -# Glob - -Match files using the patterns the shell uses. - -The most correct and second fastest glob implementation in -JavaScript. (See **Comparison to Other JavaScript Glob -Implementations** at the bottom of this readme.) - -![a fun cartoon logo made of glob characters](https://github.com/isaacs/node-glob/raw/main/logo/glob.png) - -## Usage - -Install with npm - -``` -npm i glob -``` - -**Note** the npm package name is _not_ `node-glob` that's a -different thing that was abandoned years ago. Just `glob`. - -```js -// load using import -import { glob, globSync, globStream, globStreamSync, Glob } from 'glob' -// or using commonjs, that's fine, too -const { - glob, - globSync, - globStream, - globStreamSync, - Glob, -} = require('glob') - -// the main glob() and globSync() resolve/return array of filenames - -// all js files, but don't look in node_modules -const jsfiles = await glob('**/*.js', { ignore: 'node_modules/**' }) - -// pass in a signal to cancel the glob walk -const stopAfter100ms = await glob('**/*.css', { - signal: AbortSignal.timeout(100), -}) - -// multiple patterns supported as well -const images = await glob(['css/*.{png,jpeg}', 'public/*.{png,jpeg}']) - -// but of course you can do that with the glob pattern also -// the sync function is the same, just returns a string[] instead -// of Promise -const imagesAlt = globSync('{css,public}/*.{png,jpeg}') - -// you can also stream them, this is a Minipass stream -const filesStream = globStream(['**/*.dat', 'logs/**/*.log']) - -// construct a Glob object if you wanna do it that way, which -// allows for much faster walks if you have to look in the same -// folder multiple times. -const g = new Glob('**/foo', {}) -// glob objects are async iterators, can also do globIterate() or -// g.iterate(), same deal -for await (const file of g) { - console.log('found a foo file:', file) -} -// pass a glob as the glob options to reuse its settings and caches -const g2 = new Glob('**/bar', g) -// sync iteration works as well -for (const file of g2) { - console.log('found a bar file:', file) -} - -// you can also pass withFileTypes: true to get Path objects -// these are like a Dirent, but with some more added powers -// check out http://npm.im/path-scurry for more info on their API -const g3 = new Glob('**/baz/**', { withFileTypes: true }) -g3.stream().on('data', path => { - console.log( - 'got a path object', - path.fullpath(), - path.isDirectory(), - path.readdirSync().map(e => e.name), - ) -}) - -// if you use stat:true and withFileTypes, you can sort results -// by things like modified time, filter by permission mode, etc. -// All Stats fields will be available in that case. Slightly -// slower, though. -// For example: -const results = await glob('**', { stat: true, withFileTypes: true }) - -const timeSortedFiles = results - .sort((a, b) => a.mtimeMs - b.mtimeMs) - .map(path => path.fullpath()) - -const groupReadableFiles = results - .filter(path => path.mode & 0o040) - .map(path => path.fullpath()) - -// custom ignores can be done like this, for example by saying -// you'll ignore all markdown files, and all folders named 'docs' -const customIgnoreResults = await glob('**', { - ignore: { - ignored: p => /\.md$/.test(p.name), - childrenIgnored: p => p.isNamed('docs'), - }, -}) - -// another fun use case, only return files with the same name as -// their parent folder, plus either `.ts` or `.js` -const folderNamedModules = await glob('**/*.{ts,js}', { - ignore: { - ignored: p => { - const pp = p.parent - return !(p.isNamed(pp.name + '.ts') || p.isNamed(pp.name + '.js')) - }, - }, -}) - -// find all files edited in the last hour, to do this, we ignore -// all of them that are more than an hour old -const newFiles = await glob('**', { - // need stat so we have mtime - stat: true, - // only want the files, not the dirs - nodir: true, - ignore: { - ignored: p => { - return new Date() - p.mtime > 60 * 60 * 1000 - }, - // could add similar childrenIgnored here as well, but - // directory mtime is inconsistent across platforms, so - // probably better not to, unless you know the system - // tracks this reliably. - }, -}) -``` - -**Note** Glob patterns should always use `/` as a path separator, -even on Windows systems, as `\` is used to escape glob -characters. If you wish to use `\` as a path separator _instead -of_ using it as an escape character on Windows platforms, you may -set `windowsPathsNoEscape:true` in the options. In this mode, -special glob characters cannot be escaped, making it impossible -to match a literal `*` `?` and so on in filenames. - -## Command Line Interface - -``` -$ glob -h - -Usage: - glob [options] [ [ ...]] - -Expand the positional glob expression arguments into any matching file system -paths found. - - -c --cmd= - Run the command provided, passing the glob expression - matches as arguments. - - -A --all By default, the glob cli command will not expand any - arguments that are an exact match to a file on disk. - - This prevents double-expanding, in case the shell - expands an argument whose filename is a glob - expression. - - For example, if 'app/*.ts' would match 'app/[id].ts', - then on Windows powershell or cmd.exe, 'glob app/*.ts' - will expand to 'app/[id].ts', as expected. However, in - posix shells such as bash or zsh, the shell will first - expand 'app/*.ts' to a list of filenames. Then glob - will look for a file matching 'app/[id].ts' (ie, - 'app/i.ts' or 'app/d.ts'), which is unexpected. - - Setting '--all' prevents this behavior, causing glob to - treat ALL patterns as glob expressions to be expanded, - even if they are an exact match to a file on disk. - - When setting this option, be sure to enquote arguments - so that the shell will not expand them prior to passing - them to the glob command process. - - -a --absolute Expand to absolute paths - -d --dot-relative Prepend './' on relative matches - -m --mark Append a / on any directories matched - -x --posix Always resolve to posix style paths, using '/' as the - directory separator, even on Windows. Drive letter - absolute matches on Windows will be expanded to their - full resolved UNC maths, eg instead of 'C:\foo\bar', it - will expand to '//?/C:/foo/bar'. - - -f --follow Follow symlinked directories when expanding '**' - -R --realpath Call 'fs.realpath' on all of the results. In the case - of an entry that cannot be resolved, the entry is - omitted. This incurs a slight performance penalty, of - course, because of the added system calls. - - -s --stat Call 'fs.lstat' on all entries, whether required or not - to determine if it's a valid match. - - -b --match-base Perform a basename-only match if the pattern does not - contain any slash characters. That is, '*.js' would be - treated as equivalent to '**/*.js', matching js files - in all directories. - - --dot Allow patterns to match files/directories that start - with '.', even if the pattern does not start with '.' - - --nobrace Do not expand {...} patterns - --nocase Perform a case-insensitive match. This defaults to - 'true' on macOS and Windows platforms, and false on all - others. - - Note: 'nocase' should only be explicitly set when it is - known that the filesystem's case sensitivity differs - from the platform default. If set 'true' on - case-insensitive file systems, then the walk may return - more or less results than expected. - - --nodir Do not match directories, only files. - - Note: to *only* match directories, append a '/' at the - end of the pattern. - - --noext Do not expand extglob patterns, such as '+(a|b)' - --noglobstar Do not expand '**' against multiple path portions. Ie, - treat it as a normal '*' instead. - - --windows-path-no-escape - Use '\' as a path separator *only*, and *never* as an - escape character. If set, all '\' characters are - replaced with '/' in the pattern. - - -D --max-depth= Maximum depth to traverse from the current working - directory - - -C --cwd= Current working directory to execute/match in - -r --root= A string path resolved against the 'cwd', which is used - as the starting point for absolute patterns that start - with '/' (but not drive letters or UNC paths on - Windows). - - Note that this *doesn't* necessarily limit the walk to - the 'root' directory, and doesn't affect the cwd - starting point for non-absolute patterns. A pattern - containing '..' will still be able to traverse out of - the root directory, if it is not an actual root - directory on the filesystem, and any non-absolute - patterns will still be matched in the 'cwd'. - - To start absolute and non-absolute patterns in the same - path, you can use '--root=' to set it to the empty - string. However, be aware that on Windows systems, a - pattern like 'x:/*' or '//host/share/*' will *always* - start in the 'x:/' or '//host/share/' directory, - regardless of the --root setting. - - --platform= Defaults to the value of 'process.platform' if - available, or 'linux' if not. Setting --platform=win32 - on non-Windows systems may cause strange behavior! - - -i --ignore= - Glob patterns to ignore Can be set multiple times - -v --debug Output a huge amount of noisy debug information about - patterns as they are parsed and used to match files. - - -h --help Show this usage information -``` - -## `glob(pattern: string | string[], options?: GlobOptions) => Promise` - -Perform an asynchronous glob search for the pattern(s) specified. -Returns -[Path](https://isaacs.github.io/path-scurry/classes/PathBase) -objects if the `withFileTypes` option is set to `true`. See below -for full options field desciptions. - -## `globSync(pattern: string | string[], options?: GlobOptions) => string[] | Path[]` - -Synchronous form of `glob()`. - -Alias: `glob.sync()` - -## `globIterate(pattern: string | string[], options?: GlobOptions) => AsyncGenerator` - -Return an async iterator for walking glob pattern matches. - -Alias: `glob.iterate()` - -## `globIterateSync(pattern: string | string[], options?: GlobOptions) => Generator` - -Return a sync iterator for walking glob pattern matches. - -Alias: `glob.iterate.sync()`, `glob.sync.iterate()` - -## `globStream(pattern: string | string[], options?: GlobOptions) => Minipass` - -Return a stream that emits all the strings or `Path` objects and -then emits `end` when completed. - -Alias: `glob.stream()` - -## `globStreamSync(pattern: string | string[], options?: GlobOptions) => Minipass` - -Syncronous form of `globStream()`. Will read all the matches as -fast as you consume them, even all in a single tick if you -consume them immediately, but will still respond to backpressure -if they're not consumed immediately. - -Alias: `glob.stream.sync()`, `glob.sync.stream()` - -## `hasMagic(pattern: string | string[], options?: GlobOptions) => boolean` - -Returns `true` if the provided pattern contains any "magic" glob -characters, given the options provided. - -Brace expansion is not considered "magic" unless the -`magicalBraces` option is set, as brace expansion just turns one -string into an array of strings. So a pattern like `'x{a,b}y'` -would return `false`, because `'xay'` and `'xby'` both do not -contain any magic glob characters, and it's treated the same as -if you had called it on `['xay', 'xby']`. When -`magicalBraces:true` is in the options, brace expansion _is_ -treated as a pattern having magic. - -## `escape(pattern: string, options?: GlobOptions) => string` - -Escape all magic characters in a glob pattern, so that it will -only ever match literal strings - -If the `windowsPathsNoEscape` option is used, then characters are -escaped by wrapping in `[]`, because a magic character wrapped in -a character class can only be satisfied by that exact character. - -Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot -be escaped or unescaped. - -## `unescape(pattern: string, options?: GlobOptions) => string` - -Un-escape a glob string that may contain some escaped characters. - -If the `windowsPathsNoEscape` option is used, then square-brace -escapes are removed, but not backslash escapes. For example, it -will turn the string `'[*]'` into `*`, but it will not turn -`'\\*'` into `'*'`, because `\` is a path separator in -`windowsPathsNoEscape` mode. - -When `windowsPathsNoEscape` is not set, then both brace escapes -and backslash escapes are removed. - -Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot -be escaped or unescaped. - -## Class `Glob` - -An object that can perform glob pattern traversals. - -### `const g = new Glob(pattern: string | string[], options: GlobOptions)` - -Options object is required. - -See full options descriptions below. - -Note that a previous `Glob` object can be passed as the -`GlobOptions` to another `Glob` instantiation to re-use settings -and caches with a new pattern. - -Traversal functions can be called multiple times to run the walk -again. - -### `g.stream()` - -Stream results asynchronously, - -### `g.streamSync()` - -Stream results synchronously. - -### `g.iterate()` - -Default async iteration function. Returns an AsyncGenerator that -iterates over the results. - -### `g.iterateSync()` - -Default sync iteration function. Returns a Generator that -iterates over the results. - -### `g.walk()` - -Returns a Promise that resolves to the results array. - -### `g.walkSync()` - -Returns a results array. - -### Properties - -All options are stored as properties on the `Glob` object. - -- `opts` The options provided to the constructor. -- `patterns` An array of parsed immutable `Pattern` objects. - -## Options - -Exported as `GlobOptions` TypeScript interface. A `GlobOptions` -object may be provided to any of the exported methods, and must -be provided to the `Glob` constructor. - -All options are optional, boolean, and false by default, unless -otherwise noted. - -All resolved options are added to the Glob object as properties. - -If you are running many `glob` operations, you can pass a Glob -object as the `options` argument to a subsequent operation to -share the previously loaded cache. - -- `cwd` String path or `file://` string or URL object. The - current working directory in which to search. Defaults to - `process.cwd()`. See also: "Windows, CWDs, Drive Letters, and - UNC Paths", below. - - This option may be either a string path or a `file://` URL - object or string. - -- `root` A string path resolved against the `cwd` option, which - is used as the starting point for absolute patterns that start - with `/`, (but not drive letters or UNC paths on Windows). - - Note that this _doesn't_ necessarily limit the walk to the - `root` directory, and doesn't affect the cwd starting point for - non-absolute patterns. A pattern containing `..` will still be - able to traverse out of the root directory, if it is not an - actual root directory on the filesystem, and any non-absolute - patterns will be matched in the `cwd`. For example, the - pattern `/../*` with `{root:'/some/path'}` will return all - files in `/some`, not all files in `/some/path`. The pattern - `*` with `{root:'/some/path'}` will return all the entries in - the cwd, not the entries in `/some/path`. - - To start absolute and non-absolute patterns in the same - path, you can use `{root:''}`. However, be aware that on - Windows systems, a pattern like `x:/*` or `//host/share/*` will - _always_ start in the `x:/` or `//host/share` directory, - regardless of the `root` setting. - -- `windowsPathsNoEscape` Use `\\` as a path separator _only_, and - _never_ as an escape character. If set, all `\\` characters are - replaced with `/` in the pattern. - - Note that this makes it **impossible** to match against paths - containing literal glob pattern characters, but allows matching - with patterns constructed using `path.join()` and - `path.resolve()` on Windows platforms, mimicking the (buggy!) - behavior of Glob v7 and before on Windows. Please use with - caution, and be mindful of [the caveat below about Windows - paths](#windows). (For legacy reasons, this is also set if - `allowWindowsEscape` is set to the exact value `false`.) - -- `dot` Include `.dot` files in normal matches and `globstar` - matches. Note that an explicit dot in a portion of the pattern - will always match dot files. - -- `magicalBraces` Treat brace expansion like `{a,b}` as a "magic" - pattern. Has no effect if {@link nobrace} is set. - - Only has effect on the {@link hasMagic} function, no effect on - glob pattern matching itself. - -- `dotRelative` Prepend all relative path strings with `./` (or - `.\` on Windows). - - Without this option, returned relative paths are "bare", so - instead of returning `'./foo/bar'`, they are returned as - `'foo/bar'`. - - Relative patterns starting with `'../'` are not prepended with - `./`, even if this option is set. - -- `mark` Add a `/` character to directory matches. Note that this - requires additional stat calls. - -- `nobrace` Do not expand `{a,b}` and `{1..3}` brace sets. - -- `noglobstar` Do not match `**` against multiple filenames. (Ie, - treat it as a normal `*` instead.) - -- `noext` Do not match "extglob" patterns such as `+(a|b)`. - -- `nocase` Perform a case-insensitive match. This defaults to - `true` on macOS and Windows systems, and `false` on all others. - - **Note** `nocase` should only be explicitly set when it is - known that the filesystem's case sensitivity differs from the - platform default. If set `true` on case-sensitive file - systems, or `false` on case-insensitive file systems, then the - walk may return more or less results than expected. - -- `maxDepth` Specify a number to limit the depth of the directory - traversal to this many levels below the `cwd`. - -- `matchBase` Perform a basename-only match if the pattern does - not contain any slash characters. That is, `*.js` would be - treated as equivalent to `**/*.js`, matching all js files in - all directories. - -- `nodir` Do not match directories, only files. (Note: to match - _only_ directories, put a `/` at the end of the pattern.) - - Note: when `follow` and `nodir` are both set, then symbolic - links to directories are also omitted. - -- `stat` Call `lstat()` on all entries, whether required or not - to determine whether it's a valid match. When used with - `withFileTypes`, this means that matches will include data such - as modified time, permissions, and so on. Note that this will - incur a performance cost due to the added system calls. - -- `ignore` string or string[], or an object with `ignore` and - `ignoreChildren` methods. - - If a string or string[] is provided, then this is treated as a - glob pattern or array of glob patterns to exclude from matches. - To ignore all children within a directory, as well as the entry - itself, append `'/**'` to the ignore pattern. - - **Note** `ignore` patterns are _always_ in `dot:true` mode, - regardless of any other settings. - - If an object is provided that has `ignored(path)` and/or - `childrenIgnored(path)` methods, then these methods will be - called to determine whether any Path is a match or if its - children should be traversed, respectively. - -- `follow` Follow symlinked directories when expanding `**` - patterns. This can result in a lot of duplicate references in - the presence of cyclic links, and make performance quite bad. - - By default, a `**` in a pattern will follow 1 symbolic link if - it is not the first item in the pattern, or none if it is the - first item in the pattern, following the same behavior as Bash. - - Note: when `follow` and `nodir` are both set, then symbolic - links to directories are also omitted. - -- `realpath` Set to true to call `fs.realpath` on all of the - results. In the case of an entry that cannot be resolved, the - entry is omitted. This incurs a slight performance penalty, of - course, because of the added system calls. - -- `absolute` Set to true to always receive absolute paths for - matched files. Set to `false` to always receive relative paths - for matched files. - - By default, when this option is not set, absolute paths are - returned for patterns that are absolute, and otherwise paths - are returned that are relative to the `cwd` setting. - - This does _not_ make an extra system call to get the realpath, - it only does string path resolution. - - `absolute` may not be used along with `withFileTypes`. - -- `posix` Set to true to use `/` as the path separator in - returned results. On posix systems, this has no effect. On - Windows systems, this will return `/` delimited path results, - and absolute paths will be returned in their full resolved UNC - path form, eg insted of `'C:\\foo\\bar'`, it will return - `//?/C:/foo/bar`. - -- `platform` Defaults to value of `process.platform` if - available, or `'linux'` if not. Setting `platform:'win32'` on - non-Windows systems may cause strange behavior. - -- `withFileTypes` Return [PathScurry](http://npm.im/path-scurry) - `Path` objects instead of strings. These are similar to a - NodeJS `Dirent` object, but with additional methods and - properties. - - `withFileTypes` may not be used along with `absolute`. - -- `signal` An AbortSignal which will cancel the Glob walk when - triggered. - -- `fs` An override object to pass in custom filesystem methods. - See [PathScurry docs](http://npm.im/path-scurry) for what can - be overridden. - -- `scurry` A [PathScurry](http://npm.im/path-scurry) object used - to traverse the file system. If the `nocase` option is set - explicitly, then any provided `scurry` object must match this - setting. - -- `includeChildMatches` boolean, default `true`. Do not match any - children of any matches. For example, the pattern `**\/foo` - would match `a/foo`, but not `a/foo/b/foo` in this mode. - - This is especially useful for cases like "find all - `node_modules` folders, but not the ones in `node_modules`". - - In order to support this, the `Ignore` implementation must - support an `add(pattern: string)` method. If using the default - `Ignore` class, then this is fine, but if this is set to - `false`, and a custom `Ignore` is provided that does not have - an `add()` method, then it will throw an error. - - **Caveat** It _only_ ignores matches that would be a descendant - of a previous match, and only if that descendant is matched - _after_ the ancestor is encountered. Since the file system walk - happens in indeterminate order, it's possible that a match will - already be added before its ancestor, if multiple or braced - patterns are used. - - For example: - - ```js - const results = await glob( - [ - // likely to match first, since it's just a stat - 'a/b/c/d/e/f', - - // this pattern is more complicated! It must to various readdir() - // calls and test the results against a regular expression, and that - // is certainly going to take a little bit longer. - // - // So, later on, it encounters a match at 'a/b/c/d/e', but it's too - // late to ignore a/b/c/d/e/f, because it's already been emitted. - 'a/[bdf]/?/[a-z]/*', - ], - { includeChildMatches: false }, - ) - ``` - - It's best to only set this to `false` if you can be reasonably - sure that no components of the pattern will potentially match - one another's file system descendants, or if the occasional - included child entry will not cause problems. - -## Glob Primer - -Much more information about glob pattern expansion can be found -by running `man bash` and searching for `Pattern Matching`. - -"Globs" are the patterns you type when you do stuff like `ls -*.js` on the command line, or put `build/*` in a `.gitignore` -file. - -Before parsing the path part patterns, braced sections are -expanded into a set. Braced sections start with `{` and end with -`}`, with 2 or more comma-delimited sections within. Braced -sections may contain slash characters, so `a{/b/c,bcd}` would -expand into `a/b/c` and `abcd`. - -The following characters have special magic meaning when used in -a path portion. With the exception of `**`, none of these match -path separators (ie, `/` on all platforms, and `\` on Windows). - -- `*` Matches 0 or more characters in a single path portion. - When alone in a path portion, it must match at least 1 - character. If `dot:true` is not specified, then `*` will not - match against a `.` character at the start of a path portion. -- `?` Matches 1 character. If `dot:true` is not specified, then - `?` will not match against a `.` character at the start of a - path portion. -- `[...]` Matches a range of characters, similar to a RegExp - range. If the first character of the range is `!` or `^` then - it matches any character not in the range. If the first - character is `]`, then it will be considered the same as `\]`, - rather than the end of the character class. -- `!(pattern|pattern|pattern)` Matches anything that does not - match any of the patterns provided. May _not_ contain `/` - characters. Similar to `*`, if alone in a path portion, then - the path portion must have at least one character. -- `?(pattern|pattern|pattern)` Matches zero or one occurrence of - the patterns provided. May _not_ contain `/` characters. -- `+(pattern|pattern|pattern)` Matches one or more occurrences of - the patterns provided. May _not_ contain `/` characters. -- `*(a|b|c)` Matches zero or more occurrences of the patterns - provided. May _not_ contain `/` characters. -- `@(pattern|pat*|pat?erN)` Matches exactly one of the patterns - provided. May _not_ contain `/` characters. -- `**` If a "globstar" is alone in a path portion, then it - matches zero or more directories and subdirectories searching - for matches. It does not crawl symlinked directories, unless - `{follow:true}` is passed in the options object. A pattern - like `a/b/**` will only match `a/b` if it is a directory. - Follows 1 symbolic link if not the first item in the pattern, - or 0 if it is the first item, unless `follow:true` is set, in - which case it follows all symbolic links. - -`[:class:]` patterns are supported by this implementation, but -`[=c=]` and `[.symbol.]` style class patterns are not. - -### Dots - -If a file or directory path portion has a `.` as the first -character, then it will not match any glob pattern unless that -pattern's corresponding path part also has a `.` as its first -character. - -For example, the pattern `a/.*/c` would match the file at -`a/.b/c`. However the pattern `a/*/c` would not, because `*` does -not start with a dot character. - -You can make glob treat dots as normal characters by setting -`dot:true` in the options. - -### Basename Matching - -If you set `matchBase:true` in the options, and the pattern has -no slashes in it, then it will seek for any file anywhere in the -tree with a matching basename. For example, `*.js` would match -`test/simple/basic.js`. - -### Empty Sets - -If no matching files are found, then an empty array is returned. -This differs from the shell, where the pattern itself is -returned. For example: - -```sh -$ echo a*s*d*f -a*s*d*f -``` - -## Comparisons to other fnmatch/glob implementations - -While strict compliance with the existing standards is a -worthwhile goal, some discrepancies exist between node-glob and -other implementations, and are intentional. - -The double-star character `**` is supported by default, unless -the `noglobstar` flag is set. This is supported in the manner of -bsdglob and bash 5, where `**` only has special significance if -it is the only thing in a path part. That is, `a/**/b` will match -`a/x/y/b`, but `a/**b` will not. - -Note that symlinked directories are not traversed as part of a -`**`, though their contents may match against subsequent portions -of the pattern. This prevents infinite loops and duplicates and -the like. You can force glob to traverse symlinks with `**` by -setting `{follow:true}` in the options. - -There is no equivalent of the `nonull` option. A pattern that -does not find any matches simply resolves to nothing. (An empty -array, immediately ended stream, etc.) - -If brace expansion is not disabled, then it is performed before -any other interpretation of the glob pattern. Thus, a pattern -like `+(a|{b),c)}`, which would not be valid in bash or zsh, is -expanded **first** into the set of `+(a|b)` and `+(a|c)`, and -those patterns are checked for validity. Since those two are -valid, matching proceeds. - -The character class patterns `[:class:]` (posix standard named -classes) style class patterns are supported and unicode-aware, -but `[=c=]` (locale-specific character collation weight), and -`[.symbol.]` (collating symbol), are not. - -### Repeated Slashes - -Unlike Bash and zsh, repeated `/` are always coalesced into a -single path separator. - -### Comments and Negation - -Previously, this module let you mark a pattern as a "comment" if -it started with a `#` character, or a "negated" pattern if it -started with a `!` character. - -These options were deprecated in version 5, and removed in -version 6. - -To specify things that should not match, use the `ignore` option. - -## Windows - -**Please only use forward-slashes in glob expressions.** - -Though windows uses either `/` or `\` as its path separator, only -`/` characters are used by this glob implementation. You must use -forward-slashes **only** in glob expressions. Back-slashes will -always be interpreted as escape characters, not path separators. - -Results from absolute patterns such as `/foo/*` are mounted onto -the root setting using `path.join`. On windows, this will by -default result in `/foo/*` matching `C:\foo\bar.txt`. - -To automatically coerce all `\` characters to `/` in pattern -strings, **thus making it impossible to escape literal glob -characters**, you may set the `windowsPathsNoEscape` option to -`true`. - -### Windows, CWDs, Drive Letters, and UNC Paths - -On posix systems, when a pattern starts with `/`, any `cwd` -option is ignored, and the traversal starts at `/`, plus any -non-magic path portions specified in the pattern. - -On Windows systems, the behavior is similar, but the concept of -an "absolute path" is somewhat more involved. - -#### UNC Paths - -A UNC path may be used as the start of a pattern on Windows -platforms. For example, a pattern like: `//?/x:/*` will return -all file entries in the root of the `x:` drive. A pattern like -`//ComputerName/Share/*` will return all files in the associated -share. - -UNC path roots are always compared case insensitively. - -#### Drive Letters - -A pattern starting with a drive letter, like `c:/*`, will search -in that drive, regardless of any `cwd` option provided. - -If the pattern starts with `/`, and is not a UNC path, and there -is an explicit `cwd` option set with a drive letter, then the -drive letter in the `cwd` is used as the root of the directory -traversal. - -For example, `glob('/tmp', { cwd: 'c:/any/thing' })` will return -`['c:/tmp']` as the result. - -If an explicit `cwd` option is not provided, and the pattern -starts with `/`, then the traversal will run on the root of the -drive provided as the `cwd` option. (That is, it is the result of -`path.resolve('/')`.) - -## Race Conditions - -Glob searching, by its very nature, is susceptible to race -conditions, since it relies on directory walking. - -As a result, it is possible that a file that exists when glob -looks for it may have been deleted or modified by the time it -returns the result. - -By design, this implementation caches all readdir calls that it -makes, in order to cut down on system overhead. However, this -also makes it even more susceptible to races, especially if the -cache object is reused between glob calls. - -Users are thus advised not to use a glob result as a guarantee of -filesystem state in the face of rapid changes. For the vast -majority of operations, this is never a problem. - -### See Also: - -- `man sh` -- `man bash` [Pattern - Matching](https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html) -- `man 3 fnmatch` -- `man 5 gitignore` -- [minimatch documentation](https://github.com/isaacs/minimatch) - -## Glob Logo - -Glob's logo was created by [Tanya -Brassie](http://tanyabrassie.com/). Logo files can be found -[here](https://github.com/isaacs/node-glob/tree/master/logo). - -The logo is licensed under a [Creative Commons -Attribution-ShareAlike 4.0 International -License](https://creativecommons.org/licenses/by-sa/4.0/). - -## Contributing - -Any change to behavior (including bugfixes) must come with a -test. - -Patches that fail tests or reduce performance will be rejected. - -```sh -# to run tests -npm test - -# to re-generate test fixtures -npm run test-regen - -# run the benchmarks -npm run bench - -# to profile javascript -npm run prof -``` - -## Comparison to Other JavaScript Glob Implementations - -**tl;dr** - -- If you want glob matching that is as faithful as possible to - Bash pattern expansion semantics, and as fast as possible - within that constraint, _use this module_. -- If you are reasonably sure that the patterns you will encounter - are relatively simple, and want the absolutely fastest glob - matcher out there, _use [fast-glob](http://npm.im/fast-glob)_. -- If you are reasonably sure that the patterns you will encounter - are relatively simple, and want the convenience of - automatically respecting `.gitignore` files, _use - [globby](http://npm.im/globby)_. - -There are some other glob matcher libraries on npm, but these -three are (in my opinion, as of 2023) the best. - ---- - -**full explanation** - -Every library reflects a set of opinions and priorities in the -trade-offs it makes. Other than this library, I can personally -recommend both [globby](http://npm.im/globby) and -[fast-glob](http://npm.im/fast-glob), though they differ in their -benefits and drawbacks. - -Both have very nice APIs and are reasonably fast. - -`fast-glob` is, as far as I am aware, the fastest glob -implementation in JavaScript today. However, there are many -cases where the choices that `fast-glob` makes in pursuit of -speed mean that its results differ from the results returned by -Bash and other sh-like shells, which may be surprising. - -In my testing, `fast-glob` is around 10-20% faster than this -module when walking over 200k files nested 4 directories -deep[1](#fn-webscale). However, there are some inconsistencies -with Bash matching behavior that this module does not suffer -from: - -- `**` only matches files, not directories -- `..` path portions are not handled unless they appear at the - start of the pattern -- `./!()` will not match any files that _start_ with - ``, even if they do not match ``. For - example, `!(9).txt` will not match `9999.txt`. -- Some brace patterns in the middle of a pattern will result in - failing to find certain matches. -- Extglob patterns are allowed to contain `/` characters. - -Globby exhibits all of the same pattern semantics as fast-glob, -(as it is a wrapper around fast-glob) and is slightly slower than -node-glob (by about 10-20% in the benchmark test set, or in other -words, anywhere from 20-50% slower than fast-glob). However, it -adds some API conveniences that may be worth the costs. - -- Support for `.gitignore` and other ignore files. -- Support for negated globs (ie, patterns starting with `!` - rather than using a separate `ignore` option). - -The priority of this module is "correctness" in the sense of -performing a glob pattern expansion as faithfully as possible to -the behavior of Bash and other sh-like shells, with as much speed -as possible. - -Note that prior versions of `node-glob` are _not_ on this list. -Former versions of this module are far too slow for any cases -where performance matters at all, and were designed with APIs -that are extremely dated by current JavaScript standards. - ---- - -[1]: In the cases where this module -returns results and `fast-glob` doesn't, it's even faster, of -course. - -![lumpy space princess saying 'oh my GLOB'](https://github.com/isaacs/node-glob/raw/main/oh-my-glob.gif) - -### Benchmark Results - -First number is time, smaller is better. - -Second number is the count of results returned. - -``` ---- pattern: '**' --- -~~ sync ~~ -node fast-glob sync 0m0.598s 200364 -node globby sync 0m0.765s 200364 -node current globSync mjs 0m0.683s 222656 -node current glob syncStream 0m0.649s 222656 -~~ async ~~ -node fast-glob async 0m0.350s 200364 -node globby async 0m0.509s 200364 -node current glob async mjs 0m0.463s 222656 -node current glob stream 0m0.411s 222656 - ---- pattern: '**/..' --- -~~ sync ~~ -node fast-glob sync 0m0.486s 0 -node globby sync 0m0.769s 200364 -node current globSync mjs 0m0.564s 2242 -node current glob syncStream 0m0.583s 2242 -~~ async ~~ -node fast-glob async 0m0.283s 0 -node globby async 0m0.512s 200364 -node current glob async mjs 0m0.299s 2242 -node current glob stream 0m0.312s 2242 - ---- pattern: './**/0/**/0/**/0/**/0/**/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.490s 10 -node globby sync 0m0.517s 10 -node current globSync mjs 0m0.540s 10 -node current glob syncStream 0m0.550s 10 -~~ async ~~ -node fast-glob async 0m0.290s 10 -node globby async 0m0.296s 10 -node current glob async mjs 0m0.278s 10 -node current glob stream 0m0.302s 10 - ---- pattern: './**/[01]/**/[12]/**/[23]/**/[45]/**/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.500s 160 -node globby sync 0m0.528s 160 -node current globSync mjs 0m0.556s 160 -node current glob syncStream 0m0.573s 160 -~~ async ~~ -node fast-glob async 0m0.283s 160 -node globby async 0m0.301s 160 -node current glob async mjs 0m0.306s 160 -node current glob stream 0m0.322s 160 - ---- pattern: './**/0/**/0/**/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.502s 5230 -node globby sync 0m0.527s 5230 -node current globSync mjs 0m0.544s 5230 -node current glob syncStream 0m0.557s 5230 -~~ async ~~ -node fast-glob async 0m0.285s 5230 -node globby async 0m0.305s 5230 -node current glob async mjs 0m0.304s 5230 -node current glob stream 0m0.310s 5230 - ---- pattern: '**/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.580s 200023 -node globby sync 0m0.771s 200023 -node current globSync mjs 0m0.685s 200023 -node current glob syncStream 0m0.649s 200023 -~~ async ~~ -node fast-glob async 0m0.349s 200023 -node globby async 0m0.509s 200023 -node current glob async mjs 0m0.427s 200023 -node current glob stream 0m0.388s 200023 - ---- pattern: '{**/*.txt,**/?/**/*.txt,**/?/**/?/**/*.txt,**/?/**/?/**/?/**/*.txt,**/?/**/?/**/?/**/?/**/*.txt}' --- -~~ sync ~~ -node fast-glob sync 0m0.589s 200023 -node globby sync 0m0.771s 200023 -node current globSync mjs 0m0.716s 200023 -node current glob syncStream 0m0.684s 200023 -~~ async ~~ -node fast-glob async 0m0.351s 200023 -node globby async 0m0.518s 200023 -node current glob async mjs 0m0.462s 200023 -node current glob stream 0m0.468s 200023 - ---- pattern: '**/5555/0000/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.496s 1000 -node globby sync 0m0.519s 1000 -node current globSync mjs 0m0.539s 1000 -node current glob syncStream 0m0.567s 1000 -~~ async ~~ -node fast-glob async 0m0.285s 1000 -node globby async 0m0.299s 1000 -node current glob async mjs 0m0.305s 1000 -node current glob stream 0m0.301s 1000 - ---- pattern: './**/0/**/../[01]/**/0/../**/0/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.484s 0 -node globby sync 0m0.507s 0 -node current globSync mjs 0m0.577s 4880 -node current glob syncStream 0m0.586s 4880 -~~ async ~~ -node fast-glob async 0m0.280s 0 -node globby async 0m0.298s 0 -node current glob async mjs 0m0.327s 4880 -node current glob stream 0m0.324s 4880 - ---- pattern: '**/????/????/????/????/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.547s 100000 -node globby sync 0m0.673s 100000 -node current globSync mjs 0m0.626s 100000 -node current glob syncStream 0m0.618s 100000 -~~ async ~~ -node fast-glob async 0m0.315s 100000 -node globby async 0m0.414s 100000 -node current glob async mjs 0m0.366s 100000 -node current glob stream 0m0.345s 100000 - ---- pattern: './{**/?{/**/?{/**/?{/**/?,,,,},,,,},,,,},,,}/**/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.588s 100000 -node globby sync 0m0.670s 100000 -node current globSync mjs 0m0.717s 200023 -node current glob syncStream 0m0.687s 200023 -~~ async ~~ -node fast-glob async 0m0.343s 100000 -node globby async 0m0.418s 100000 -node current glob async mjs 0m0.519s 200023 -node current glob stream 0m0.451s 200023 - ---- pattern: '**/!(0|9).txt' --- -~~ sync ~~ -node fast-glob sync 0m0.573s 160023 -node globby sync 0m0.731s 160023 -node current globSync mjs 0m0.680s 180023 -node current glob syncStream 0m0.659s 180023 -~~ async ~~ -node fast-glob async 0m0.345s 160023 -node globby async 0m0.476s 160023 -node current glob async mjs 0m0.427s 180023 -node current glob stream 0m0.388s 180023 - ---- pattern: './{*/**/../{*/**/../{*/**/../{*/**/../{*/**,,,,},,,,},,,,},,,,},,,,}/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.483s 0 -node globby sync 0m0.512s 0 -node current globSync mjs 0m0.811s 200023 -node current glob syncStream 0m0.773s 200023 -~~ async ~~ -node fast-glob async 0m0.280s 0 -node globby async 0m0.299s 0 -node current glob async mjs 0m0.617s 200023 -node current glob stream 0m0.568s 200023 - ---- pattern: './*/**/../*/**/../*/**/../*/**/../*/**/../*/**/../*/**/../*/**/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.485s 0 -node globby sync 0m0.507s 0 -node current globSync mjs 0m0.759s 200023 -node current glob syncStream 0m0.740s 200023 -~~ async ~~ -node fast-glob async 0m0.281s 0 -node globby async 0m0.297s 0 -node current glob async mjs 0m0.544s 200023 -node current glob stream 0m0.464s 200023 - ---- pattern: './*/**/../*/**/../*/**/../*/**/../*/**/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.486s 0 -node globby sync 0m0.513s 0 -node current globSync mjs 0m0.734s 200023 -node current glob syncStream 0m0.696s 200023 -~~ async ~~ -node fast-glob async 0m0.286s 0 -node globby async 0m0.296s 0 -node current glob async mjs 0m0.506s 200023 -node current glob stream 0m0.483s 200023 - ---- pattern: './0/**/../1/**/../2/**/../3/**/../4/**/../5/**/../6/**/../7/**/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.060s 0 -node globby sync 0m0.074s 0 -node current globSync mjs 0m0.067s 0 -node current glob syncStream 0m0.066s 0 -~~ async ~~ -node fast-glob async 0m0.060s 0 -node globby async 0m0.075s 0 -node current glob async mjs 0m0.066s 0 -node current glob stream 0m0.067s 0 - ---- pattern: './**/?/**/?/**/?/**/?/**/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.568s 100000 -node globby sync 0m0.651s 100000 -node current globSync mjs 0m0.619s 100000 -node current glob syncStream 0m0.617s 100000 -~~ async ~~ -node fast-glob async 0m0.332s 100000 -node globby async 0m0.409s 100000 -node current glob async mjs 0m0.372s 100000 -node current glob stream 0m0.351s 100000 - ---- pattern: '**/*/**/*/**/*/**/*/**' --- -~~ sync ~~ -node fast-glob sync 0m0.603s 200113 -node globby sync 0m0.798s 200113 -node current globSync mjs 0m0.730s 222137 -node current glob syncStream 0m0.693s 222137 -~~ async ~~ -node fast-glob async 0m0.356s 200113 -node globby async 0m0.525s 200113 -node current glob async mjs 0m0.508s 222137 -node current glob stream 0m0.455s 222137 - ---- pattern: './**/*/**/*/**/*/**/*/**/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.622s 200000 -node globby sync 0m0.792s 200000 -node current globSync mjs 0m0.722s 200000 -node current glob syncStream 0m0.695s 200000 -~~ async ~~ -node fast-glob async 0m0.369s 200000 -node globby async 0m0.527s 200000 -node current glob async mjs 0m0.502s 200000 -node current glob stream 0m0.481s 200000 - ---- pattern: '**/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.588s 200023 -node globby sync 0m0.771s 200023 -node current globSync mjs 0m0.684s 200023 -node current glob syncStream 0m0.658s 200023 -~~ async ~~ -node fast-glob async 0m0.352s 200023 -node globby async 0m0.516s 200023 -node current glob async mjs 0m0.432s 200023 -node current glob stream 0m0.384s 200023 - ---- pattern: './**/**/**/**/**/**/**/**/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.589s 200023 -node globby sync 0m0.766s 200023 -node current globSync mjs 0m0.682s 200023 -node current glob syncStream 0m0.652s 200023 -~~ async ~~ -node fast-glob async 0m0.352s 200023 -node globby async 0m0.523s 200023 -node current glob async mjs 0m0.436s 200023 -node current glob stream 0m0.380s 200023 - ---- pattern: '**/*/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.592s 200023 -node globby sync 0m0.776s 200023 -node current globSync mjs 0m0.691s 200023 -node current glob syncStream 0m0.659s 200023 -~~ async ~~ -node fast-glob async 0m0.357s 200023 -node globby async 0m0.513s 200023 -node current glob async mjs 0m0.471s 200023 -node current glob stream 0m0.424s 200023 - ---- pattern: '**/*/**/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.585s 200023 -node globby sync 0m0.766s 200023 -node current globSync mjs 0m0.694s 200023 -node current glob syncStream 0m0.664s 200023 -~~ async ~~ -node fast-glob async 0m0.350s 200023 -node globby async 0m0.514s 200023 -node current glob async mjs 0m0.472s 200023 -node current glob stream 0m0.424s 200023 - ---- pattern: '**/[0-9]/**/*.txt' --- -~~ sync ~~ -node fast-glob sync 0m0.544s 100000 -node globby sync 0m0.636s 100000 -node current globSync mjs 0m0.626s 100000 -node current glob syncStream 0m0.621s 100000 -~~ async ~~ -node fast-glob async 0m0.322s 100000 -node globby async 0m0.404s 100000 -node current glob async mjs 0m0.360s 100000 -node current glob stream 0m0.352s 100000 -``` diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/glob.d.ts b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/glob.d.ts deleted file mode 100644 index 25262b3ddf489e..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/glob.d.ts +++ /dev/null @@ -1,388 +0,0 @@ -import { Minimatch } from 'minimatch'; -import { Minipass } from 'minipass'; -import { FSOption, Path, PathScurry } from 'path-scurry'; -import { IgnoreLike } from './ignore.js'; -import { Pattern } from './pattern.js'; -export type MatchSet = Minimatch['set']; -export type GlobParts = Exclude; -/** - * A `GlobOptions` object may be provided to any of the exported methods, and - * must be provided to the `Glob` constructor. - * - * All options are optional, boolean, and false by default, unless otherwise - * noted. - * - * All resolved options are added to the Glob object as properties. - * - * If you are running many `glob` operations, you can pass a Glob object as the - * `options` argument to a subsequent operation to share the previously loaded - * cache. - */ -export interface GlobOptions { - /** - * Set to `true` to always receive absolute paths for - * matched files. Set to `false` to always return relative paths. - * - * When this option is not set, absolute paths are returned for patterns - * that are absolute, and otherwise paths are returned that are relative - * to the `cwd` setting. - * - * This does _not_ make an extra system call to get - * the realpath, it only does string path resolution. - * - * Conflicts with {@link withFileTypes} - */ - absolute?: boolean; - /** - * Set to false to enable {@link windowsPathsNoEscape} - * - * @deprecated - */ - allowWindowsEscape?: boolean; - /** - * The current working directory in which to search. Defaults to - * `process.cwd()`. - * - * May be eiher a string path or a `file://` URL object or string. - */ - cwd?: string | URL; - /** - * Include `.dot` files in normal matches and `globstar` - * matches. Note that an explicit dot in a portion of the pattern - * will always match dot files. - */ - dot?: boolean; - /** - * Prepend all relative path strings with `./` (or `.\` on Windows). - * - * Without this option, returned relative paths are "bare", so instead of - * returning `'./foo/bar'`, they are returned as `'foo/bar'`. - * - * Relative patterns starting with `'../'` are not prepended with `./`, even - * if this option is set. - */ - dotRelative?: boolean; - /** - * Follow symlinked directories when expanding `**` - * patterns. This can result in a lot of duplicate references in - * the presence of cyclic links, and make performance quite bad. - * - * By default, a `**` in a pattern will follow 1 symbolic link if - * it is not the first item in the pattern, or none if it is the - * first item in the pattern, following the same behavior as Bash. - */ - follow?: boolean; - /** - * string or string[], or an object with `ignore` and `ignoreChildren` - * methods. - * - * If a string or string[] is provided, then this is treated as a glob - * pattern or array of glob patterns to exclude from matches. To ignore all - * children within a directory, as well as the entry itself, append `'/**'` - * to the ignore pattern. - * - * **Note** `ignore` patterns are _always_ in `dot:true` mode, regardless of - * any other settings. - * - * If an object is provided that has `ignored(path)` and/or - * `childrenIgnored(path)` methods, then these methods will be called to - * determine whether any Path is a match or if its children should be - * traversed, respectively. - */ - ignore?: string | string[] | IgnoreLike; - /** - * Treat brace expansion like `{a,b}` as a "magic" pattern. Has no - * effect if {@link nobrace} is set. - * - * Only has effect on the {@link hasMagic} function. - */ - magicalBraces?: boolean; - /** - * Add a `/` character to directory matches. Note that this requires - * additional stat calls in some cases. - */ - mark?: boolean; - /** - * Perform a basename-only match if the pattern does not contain any slash - * characters. That is, `*.js` would be treated as equivalent to - * `**\/*.js`, matching all js files in all directories. - */ - matchBase?: boolean; - /** - * Limit the directory traversal to a given depth below the cwd. - * Note that this does NOT prevent traversal to sibling folders, - * root patterns, and so on. It only limits the maximum folder depth - * that the walk will descend, relative to the cwd. - */ - maxDepth?: number; - /** - * Do not expand `{a,b}` and `{1..3}` brace sets. - */ - nobrace?: boolean; - /** - * Perform a case-insensitive match. This defaults to `true` on macOS and - * Windows systems, and `false` on all others. - * - * **Note** `nocase` should only be explicitly set when it is - * known that the filesystem's case sensitivity differs from the - * platform default. If set `true` on case-sensitive file - * systems, or `false` on case-insensitive file systems, then the - * walk may return more or less results than expected. - */ - nocase?: boolean; - /** - * Do not match directories, only files. (Note: to match - * _only_ directories, put a `/` at the end of the pattern.) - */ - nodir?: boolean; - /** - * Do not match "extglob" patterns such as `+(a|b)`. - */ - noext?: boolean; - /** - * Do not match `**` against multiple filenames. (Ie, treat it as a normal - * `*` instead.) - * - * Conflicts with {@link matchBase} - */ - noglobstar?: boolean; - /** - * Defaults to value of `process.platform` if available, or `'linux'` if - * not. Setting `platform:'win32'` on non-Windows systems may cause strange - * behavior. - */ - platform?: NodeJS.Platform; - /** - * Set to true to call `fs.realpath` on all of the - * results. In the case of an entry that cannot be resolved, the - * entry is omitted. This incurs a slight performance penalty, of - * course, because of the added system calls. - */ - realpath?: boolean; - /** - * - * A string path resolved against the `cwd` option, which - * is used as the starting point for absolute patterns that start - * with `/`, (but not drive letters or UNC paths on Windows). - * - * Note that this _doesn't_ necessarily limit the walk to the - * `root` directory, and doesn't affect the cwd starting point for - * non-absolute patterns. A pattern containing `..` will still be - * able to traverse out of the root directory, if it is not an - * actual root directory on the filesystem, and any non-absolute - * patterns will be matched in the `cwd`. For example, the - * pattern `/../*` with `{root:'/some/path'}` will return all - * files in `/some`, not all files in `/some/path`. The pattern - * `*` with `{root:'/some/path'}` will return all the entries in - * the cwd, not the entries in `/some/path`. - * - * To start absolute and non-absolute patterns in the same - * path, you can use `{root:''}`. However, be aware that on - * Windows systems, a pattern like `x:/*` or `//host/share/*` will - * _always_ start in the `x:/` or `//host/share` directory, - * regardless of the `root` setting. - */ - root?: string; - /** - * A [PathScurry](http://npm.im/path-scurry) object used - * to traverse the file system. If the `nocase` option is set - * explicitly, then any provided `scurry` object must match this - * setting. - */ - scurry?: PathScurry; - /** - * Call `lstat()` on all entries, whether required or not to determine - * if it's a valid match. When used with {@link withFileTypes}, this means - * that matches will include data such as modified time, permissions, and - * so on. Note that this will incur a performance cost due to the added - * system calls. - */ - stat?: boolean; - /** - * An AbortSignal which will cancel the Glob walk when - * triggered. - */ - signal?: AbortSignal; - /** - * Use `\\` as a path separator _only_, and - * _never_ as an escape character. If set, all `\\` characters are - * replaced with `/` in the pattern. - * - * Note that this makes it **impossible** to match against paths - * containing literal glob pattern characters, but allows matching - * with patterns constructed using `path.join()` and - * `path.resolve()` on Windows platforms, mimicking the (buggy!) - * behavior of Glob v7 and before on Windows. Please use with - * caution, and be mindful of [the caveat below about Windows - * paths](#windows). (For legacy reasons, this is also set if - * `allowWindowsEscape` is set to the exact value `false`.) - */ - windowsPathsNoEscape?: boolean; - /** - * Return [PathScurry](http://npm.im/path-scurry) - * `Path` objects instead of strings. These are similar to a - * NodeJS `Dirent` object, but with additional methods and - * properties. - * - * Conflicts with {@link absolute} - */ - withFileTypes?: boolean; - /** - * An fs implementation to override some or all of the defaults. See - * http://npm.im/path-scurry for details about what can be overridden. - */ - fs?: FSOption; - /** - * Just passed along to Minimatch. Note that this makes all pattern - * matching operations slower and *extremely* noisy. - */ - debug?: boolean; - /** - * Return `/` delimited paths, even on Windows. - * - * On posix systems, this has no effect. But, on Windows, it means that - * paths will be `/` delimited, and absolute paths will be their full - * resolved UNC forms, eg instead of `'C:\\foo\\bar'`, it would return - * `'//?/C:/foo/bar'` - */ - posix?: boolean; - /** - * Do not match any children of any matches. For example, the pattern - * `**\/foo` would match `a/foo`, but not `a/foo/b/foo` in this mode. - * - * This is especially useful for cases like "find all `node_modules` - * folders, but not the ones in `node_modules`". - * - * In order to support this, the `Ignore` implementation must support an - * `add(pattern: string)` method. If using the default `Ignore` class, then - * this is fine, but if this is set to `false`, and a custom `Ignore` is - * provided that does not have an `add()` method, then it will throw an - * error. - * - * **Caveat** It *only* ignores matches that would be a descendant of a - * previous match, and only if that descendant is matched *after* the - * ancestor is encountered. Since the file system walk happens in - * indeterminate order, it's possible that a match will already be added - * before its ancestor, if multiple or braced patterns are used. - * - * For example: - * - * ```ts - * const results = await glob([ - * // likely to match first, since it's just a stat - * 'a/b/c/d/e/f', - * - * // this pattern is more complicated! It must to various readdir() - * // calls and test the results against a regular expression, and that - * // is certainly going to take a little bit longer. - * // - * // So, later on, it encounters a match at 'a/b/c/d/e', but it's too - * // late to ignore a/b/c/d/e/f, because it's already been emitted. - * 'a/[bdf]/?/[a-z]/*', - * ], { includeChildMatches: false }) - * ``` - * - * It's best to only set this to `false` if you can be reasonably sure that - * no components of the pattern will potentially match one another's file - * system descendants, or if the occasional included child entry will not - * cause problems. - * - * @default true - */ - includeChildMatches?: boolean; -} -export type GlobOptionsWithFileTypesTrue = GlobOptions & { - withFileTypes: true; - absolute?: undefined; - mark?: undefined; - posix?: undefined; -}; -export type GlobOptionsWithFileTypesFalse = GlobOptions & { - withFileTypes?: false; -}; -export type GlobOptionsWithFileTypesUnset = GlobOptions & { - withFileTypes?: undefined; -}; -export type Result = Opts extends GlobOptionsWithFileTypesTrue ? Path : Opts extends GlobOptionsWithFileTypesFalse ? string : Opts extends GlobOptionsWithFileTypesUnset ? string : string | Path; -export type Results = Result[]; -export type FileTypes = Opts extends GlobOptionsWithFileTypesTrue ? true : Opts extends GlobOptionsWithFileTypesFalse ? false : Opts extends GlobOptionsWithFileTypesUnset ? false : boolean; -/** - * An object that can perform glob pattern traversals. - */ -export declare class Glob implements GlobOptions { - absolute?: boolean; - cwd: string; - root?: string; - dot: boolean; - dotRelative: boolean; - follow: boolean; - ignore?: string | string[] | IgnoreLike; - magicalBraces: boolean; - mark?: boolean; - matchBase: boolean; - maxDepth: number; - nobrace: boolean; - nocase: boolean; - nodir: boolean; - noext: boolean; - noglobstar: boolean; - pattern: string[]; - platform: NodeJS.Platform; - realpath: boolean; - scurry: PathScurry; - stat: boolean; - signal?: AbortSignal; - windowsPathsNoEscape: boolean; - withFileTypes: FileTypes; - includeChildMatches: boolean; - /** - * The options provided to the constructor. - */ - opts: Opts; - /** - * An array of parsed immutable {@link Pattern} objects. - */ - patterns: Pattern[]; - /** - * All options are stored as properties on the `Glob` object. - * - * See {@link GlobOptions} for full options descriptions. - * - * Note that a previous `Glob` object can be passed as the - * `GlobOptions` to another `Glob` instantiation to re-use settings - * and caches with a new pattern. - * - * Traversal functions can be called multiple times to run the walk - * again. - */ - constructor(pattern: string | string[], opts: Opts); - /** - * Returns a Promise that resolves to the results array. - */ - walk(): Promise>; - /** - * synchronous {@link Glob.walk} - */ - walkSync(): Results; - /** - * Stream results asynchronously. - */ - stream(): Minipass, Result>; - /** - * Stream results synchronously. - */ - streamSync(): Minipass, Result>; - /** - * Default sync iteration function. Returns a Generator that - * iterates over the results. - */ - iterateSync(): Generator, void, void>; - [Symbol.iterator](): Generator, void, void>; - /** - * Default async iteration function. Returns an AsyncGenerator that - * iterates over the results. - */ - iterate(): AsyncGenerator, void, void>; - [Symbol.asyncIterator](): AsyncGenerator, void, void>; -} -//# sourceMappingURL=glob.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/glob.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/glob.d.ts.map deleted file mode 100644 index c32dc74c967741..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/glob.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../src/glob.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAoB,MAAM,WAAW,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAEnC,OAAO,EACL,QAAQ,EACR,IAAI,EACJ,UAAU,EAIX,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAGtC,MAAM,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,CAAA;AACvC,MAAM,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,CAAA;AAalE;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAElB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAE5B;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,CAAA;IAElB;;;;OAIG;IACH,GAAG,CAAC,EAAE,OAAO,CAAA;IAEb;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IAErB;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAEhB;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,UAAU,CAAA;IAEvC;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IAEvB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;IAEd;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IAEnB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IAEjB;;;;;;;;;OASG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAEhB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IAEf;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IAEf;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IAEpB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAA;IAE1B;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAElB;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IAEb;;;;;OAKG;IACH,MAAM,CAAC,EAAE,UAAU,CAAA;IAEnB;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;IAEd;;;OAGG;IACH,MAAM,CAAC,EAAE,WAAW,CAAA;IAEpB;;;;;;;;;;;;;OAaG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAE9B;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IAEvB;;;OAGG;IACH,EAAE,CAAC,EAAE,QAAQ,CAAA;IAEb;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IAEf;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IAEf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA0CG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAC9B;AAED,MAAM,MAAM,4BAA4B,GAAG,WAAW,GAAG;IACvD,aAAa,EAAE,IAAI,CAAA;IAEnB,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,6BAA6B,GAAG,WAAW,GAAG;IACxD,aAAa,CAAC,EAAE,KAAK,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,6BAA6B,GAAG,WAAW,GAAG;IACxD,aAAa,CAAC,EAAE,SAAS,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,MAAM,CAAC,IAAI,IACrB,IAAI,SAAS,4BAA4B,GAAG,IAAI,GAC9C,IAAI,SAAS,6BAA6B,GAAG,MAAM,GACnD,IAAI,SAAS,6BAA6B,GAAG,MAAM,GACnD,MAAM,GAAG,IAAI,CAAA;AACjB,MAAM,MAAM,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAA;AAE1C,MAAM,MAAM,SAAS,CAAC,IAAI,IACxB,IAAI,SAAS,4BAA4B,GAAG,IAAI,GAC9C,IAAI,SAAS,6BAA6B,GAAG,KAAK,GAClD,IAAI,SAAS,6BAA6B,GAAG,KAAK,GAClD,OAAO,CAAA;AAEX;;GAEG;AACH,qBAAa,IAAI,CAAC,IAAI,SAAS,WAAW,CAAE,YAAW,WAAW;IAChE,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,OAAO,CAAA;IACZ,WAAW,EAAE,OAAO,CAAA;IACpB,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,UAAU,CAAA;IACvC,aAAa,EAAE,OAAO,CAAA;IACtB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,OAAO,CAAA;IACf,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,EAAE,OAAO,CAAA;IACd,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAA;IACzB,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,EAAE,UAAU,CAAA;IAClB,IAAI,EAAE,OAAO,CAAA;IACb,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,oBAAoB,EAAE,OAAO,CAAA;IAC7B,aAAa,EAAE,SAAS,CAAC,IAAI,CAAC,CAAA;IAC9B,mBAAmB,EAAE,OAAO,CAAA;IAE5B;;OAEG;IACH,IAAI,EAAE,IAAI,CAAA;IAEV;;OAEG;IACH,QAAQ,EAAE,OAAO,EAAE,CAAA;IAEnB;;;;;;;;;;;OAWG;gBACS,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI;IA2HlD;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAoBpC;;OAEG;IACH,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBzB;;OAEG;IACH,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAc9C;;OAEG;IACH,UAAU,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAclD;;;OAGG;IACH,WAAW,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;IAGlD,CAAC,MAAM,CAAC,QAAQ,CAAC;IAIjB;;;OAGG;IACH,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;IAGnD,CAAC,MAAM,CAAC,aAAa,CAAC;CAGvB"} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/glob.js b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/glob.js deleted file mode 100644 index e1339bbbcf57f3..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/glob.js +++ /dev/null @@ -1,247 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Glob = void 0; -const minimatch_1 = require("minimatch"); -const node_url_1 = require("node:url"); -const path_scurry_1 = require("path-scurry"); -const pattern_js_1 = require("./pattern.js"); -const walker_js_1 = require("./walker.js"); -// if no process global, just call it linux. -// so we default to case-sensitive, / separators -const defaultPlatform = (typeof process === 'object' && - process && - typeof process.platform === 'string') ? - process.platform - : 'linux'; -/** - * An object that can perform glob pattern traversals. - */ -class Glob { - absolute; - cwd; - root; - dot; - dotRelative; - follow; - ignore; - magicalBraces; - mark; - matchBase; - maxDepth; - nobrace; - nocase; - nodir; - noext; - noglobstar; - pattern; - platform; - realpath; - scurry; - stat; - signal; - windowsPathsNoEscape; - withFileTypes; - includeChildMatches; - /** - * The options provided to the constructor. - */ - opts; - /** - * An array of parsed immutable {@link Pattern} objects. - */ - patterns; - /** - * All options are stored as properties on the `Glob` object. - * - * See {@link GlobOptions} for full options descriptions. - * - * Note that a previous `Glob` object can be passed as the - * `GlobOptions` to another `Glob` instantiation to re-use settings - * and caches with a new pattern. - * - * Traversal functions can be called multiple times to run the walk - * again. - */ - constructor(pattern, opts) { - /* c8 ignore start */ - if (!opts) - throw new TypeError('glob options required'); - /* c8 ignore stop */ - this.withFileTypes = !!opts.withFileTypes; - this.signal = opts.signal; - this.follow = !!opts.follow; - this.dot = !!opts.dot; - this.dotRelative = !!opts.dotRelative; - this.nodir = !!opts.nodir; - this.mark = !!opts.mark; - if (!opts.cwd) { - this.cwd = ''; - } - else if (opts.cwd instanceof URL || opts.cwd.startsWith('file://')) { - opts.cwd = (0, node_url_1.fileURLToPath)(opts.cwd); - } - this.cwd = opts.cwd || ''; - this.root = opts.root; - this.magicalBraces = !!opts.magicalBraces; - this.nobrace = !!opts.nobrace; - this.noext = !!opts.noext; - this.realpath = !!opts.realpath; - this.absolute = opts.absolute; - this.includeChildMatches = opts.includeChildMatches !== false; - this.noglobstar = !!opts.noglobstar; - this.matchBase = !!opts.matchBase; - this.maxDepth = - typeof opts.maxDepth === 'number' ? opts.maxDepth : Infinity; - this.stat = !!opts.stat; - this.ignore = opts.ignore; - if (this.withFileTypes && this.absolute !== undefined) { - throw new Error('cannot set absolute and withFileTypes:true'); - } - if (typeof pattern === 'string') { - pattern = [pattern]; - } - this.windowsPathsNoEscape = - !!opts.windowsPathsNoEscape || - opts.allowWindowsEscape === - false; - if (this.windowsPathsNoEscape) { - pattern = pattern.map(p => p.replace(/\\/g, '/')); - } - if (this.matchBase) { - if (opts.noglobstar) { - throw new TypeError('base matching requires globstar'); - } - pattern = pattern.map(p => (p.includes('/') ? p : `./**/${p}`)); - } - this.pattern = pattern; - this.platform = opts.platform || defaultPlatform; - this.opts = { ...opts, platform: this.platform }; - if (opts.scurry) { - this.scurry = opts.scurry; - if (opts.nocase !== undefined && - opts.nocase !== opts.scurry.nocase) { - throw new Error('nocase option contradicts provided scurry option'); - } - } - else { - const Scurry = opts.platform === 'win32' ? path_scurry_1.PathScurryWin32 - : opts.platform === 'darwin' ? path_scurry_1.PathScurryDarwin - : opts.platform ? path_scurry_1.PathScurryPosix - : path_scurry_1.PathScurry; - this.scurry = new Scurry(this.cwd, { - nocase: opts.nocase, - fs: opts.fs, - }); - } - this.nocase = this.scurry.nocase; - // If you do nocase:true on a case-sensitive file system, then - // we need to use regexps instead of strings for non-magic - // path portions, because statting `aBc` won't return results - // for the file `AbC` for example. - const nocaseMagicOnly = this.platform === 'darwin' || this.platform === 'win32'; - const mmo = { - // default nocase based on platform - ...opts, - dot: this.dot, - matchBase: this.matchBase, - nobrace: this.nobrace, - nocase: this.nocase, - nocaseMagicOnly, - nocomment: true, - noext: this.noext, - nonegate: true, - optimizationLevel: 2, - platform: this.platform, - windowsPathsNoEscape: this.windowsPathsNoEscape, - debug: !!this.opts.debug, - }; - const mms = this.pattern.map(p => new minimatch_1.Minimatch(p, mmo)); - const [matchSet, globParts] = mms.reduce((set, m) => { - set[0].push(...m.set); - set[1].push(...m.globParts); - return set; - }, [[], []]); - this.patterns = matchSet.map((set, i) => { - const g = globParts[i]; - /* c8 ignore start */ - if (!g) - throw new Error('invalid pattern object'); - /* c8 ignore stop */ - return new pattern_js_1.Pattern(set, g, 0, this.platform); - }); - } - async walk() { - // Walkers always return array of Path objects, so we just have to - // coerce them into the right shape. It will have already called - // realpath() if the option was set to do so, so we know that's cached. - // start out knowing the cwd, at least - return [ - ...(await new walker_js_1.GlobWalker(this.patterns, this.scurry.cwd, { - ...this.opts, - maxDepth: this.maxDepth !== Infinity ? - this.maxDepth + this.scurry.cwd.depth() - : Infinity, - platform: this.platform, - nocase: this.nocase, - includeChildMatches: this.includeChildMatches, - }).walk()), - ]; - } - walkSync() { - return [ - ...new walker_js_1.GlobWalker(this.patterns, this.scurry.cwd, { - ...this.opts, - maxDepth: this.maxDepth !== Infinity ? - this.maxDepth + this.scurry.cwd.depth() - : Infinity, - platform: this.platform, - nocase: this.nocase, - includeChildMatches: this.includeChildMatches, - }).walkSync(), - ]; - } - stream() { - return new walker_js_1.GlobStream(this.patterns, this.scurry.cwd, { - ...this.opts, - maxDepth: this.maxDepth !== Infinity ? - this.maxDepth + this.scurry.cwd.depth() - : Infinity, - platform: this.platform, - nocase: this.nocase, - includeChildMatches: this.includeChildMatches, - }).stream(); - } - streamSync() { - return new walker_js_1.GlobStream(this.patterns, this.scurry.cwd, { - ...this.opts, - maxDepth: this.maxDepth !== Infinity ? - this.maxDepth + this.scurry.cwd.depth() - : Infinity, - platform: this.platform, - nocase: this.nocase, - includeChildMatches: this.includeChildMatches, - }).streamSync(); - } - /** - * Default sync iteration function. Returns a Generator that - * iterates over the results. - */ - iterateSync() { - return this.streamSync()[Symbol.iterator](); - } - [Symbol.iterator]() { - return this.iterateSync(); - } - /** - * Default async iteration function. Returns an AsyncGenerator that - * iterates over the results. - */ - iterate() { - return this.stream()[Symbol.asyncIterator](); - } - [Symbol.asyncIterator]() { - return this.iterate(); - } -} -exports.Glob = Glob; -//# sourceMappingURL=glob.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/glob.js.map b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/glob.js.map deleted file mode 100644 index ddab419717efa5..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/glob.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/glob.ts"],"names":[],"mappings":";;;AAAA,yCAAuD;AAEvD,uCAAwC;AACxC,6CAOoB;AAEpB,6CAAsC;AACtC,2CAAoD;AAKpD,4CAA4C;AAC5C,gDAAgD;AAChD,MAAM,eAAe,GACnB,CACE,OAAO,OAAO,KAAK,QAAQ;IAC3B,OAAO;IACP,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,CACrC,CAAC,CAAC;IACD,OAAO,CAAC,QAAQ;IAClB,CAAC,CAAC,OAAO,CAAA;AAyVX;;GAEG;AACH,MAAa,IAAI;IACf,QAAQ,CAAU;IAClB,GAAG,CAAQ;IACX,IAAI,CAAS;IACb,GAAG,CAAS;IACZ,WAAW,CAAS;IACpB,MAAM,CAAS;IACf,MAAM,CAAiC;IACvC,aAAa,CAAS;IACtB,IAAI,CAAU;IACd,SAAS,CAAS;IAClB,QAAQ,CAAQ;IAChB,OAAO,CAAS;IAChB,MAAM,CAAS;IACf,KAAK,CAAS;IACd,KAAK,CAAS;IACd,UAAU,CAAS;IACnB,OAAO,CAAU;IACjB,QAAQ,CAAiB;IACzB,QAAQ,CAAS;IACjB,MAAM,CAAY;IAClB,IAAI,CAAS;IACb,MAAM,CAAc;IACpB,oBAAoB,CAAS;IAC7B,aAAa,CAAiB;IAC9B,mBAAmB,CAAS;IAE5B;;OAEG;IACH,IAAI,CAAM;IAEV;;OAEG;IACH,QAAQ,CAAW;IAEnB;;;;;;;;;;;OAWG;IACH,YAAY,OAA0B,EAAE,IAAU;QAChD,qBAAqB;QACrB,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,SAAS,CAAC,uBAAuB,CAAC,CAAA;QACvD,oBAAoB;QACpB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,aAAgC,CAAA;QAC5D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QACzB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAA;QAC3B,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAA;QACrB,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,CAAA;QACrC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAA;QACzB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAA;QACvB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,GAAG,GAAG,EAAE,CAAA;QACf,CAAC;aAAM,IAAI,IAAI,CAAC,GAAG,YAAY,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACrE,IAAI,CAAC,GAAG,GAAG,IAAA,wBAAa,EAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACpC,CAAC;QACD,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,CAAA;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QACrB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,CAAA;QACzC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAA;QAC7B,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAA;QACzB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAA;QAC/B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;QAC7B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,KAAK,KAAK,CAAA;QAE7D,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAA;QACnC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAA;QACjC,IAAI,CAAC,QAAQ;YACX,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAA;QAC9D,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAA;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QAEzB,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;QAC/D,CAAC;QAED,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,GAAG,CAAC,OAAO,CAAC,CAAA;QACrB,CAAC;QAED,IAAI,CAAC,oBAAoB;YACvB,CAAC,CAAC,IAAI,CAAC,oBAAoB;gBAC1B,IAAyC,CAAC,kBAAkB;oBAC3D,KAAK,CAAA;QAET,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9B,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAA;QACnD,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,MAAM,IAAI,SAAS,CAAC,iCAAiC,CAAC,CAAA;YACxD,CAAC;YACD,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA;QACjE,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QAEtB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,eAAe,CAAA;QAChD,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAA;QAChD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;YACzB,IACE,IAAI,CAAC,MAAM,KAAK,SAAS;gBACzB,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,EAClC,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;YACrE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GACV,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,6BAAe;gBAC3C,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,8BAAgB;oBAC/C,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,6BAAe;wBACjC,CAAC,CAAC,wBAAU,CAAA;YACd,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;gBACjC,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,EAAE,EAAE,IAAI,CAAC,EAAE;aACZ,CAAC,CAAA;QACJ,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;QAEhC,8DAA8D;QAC9D,0DAA0D;QAC1D,6DAA6D;QAC7D,kCAAkC;QAClC,MAAM,eAAe,GACnB,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAA;QAEzD,MAAM,GAAG,GAAqB;YAC5B,mCAAmC;YACnC,GAAG,IAAI;YACP,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,eAAe;YACf,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,IAAI;YACd,iBAAiB,EAAE,CAAC;YACpB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;YAC/C,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;SACzB,CAAA;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,qBAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QACxD,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,GAAG,CAAC,MAAM,CACtC,CAAC,GAA0B,EAAE,CAAC,EAAE,EAAE;YAChC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;YACrB,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAA;YAC3B,OAAO,GAAG,CAAA;QACZ,CAAC,EACD,CAAC,EAAE,EAAE,EAAE,CAAC,CACT,CAAA;QACD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YACtC,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;YACtB,qBAAqB;YACrB,IAAI,CAAC,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;YACjD,oBAAoB;YACpB,OAAO,IAAI,oBAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC9C,CAAC,CAAC,CAAA;IACJ,CAAC;IAMD,KAAK,CAAC,IAAI;QACR,kEAAkE;QAClE,iEAAiE;QACjE,uEAAuE;QACvE,sCAAsC;QACtC,OAAO;YACL,GAAG,CAAC,MAAM,IAAI,sBAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;gBACvD,GAAG,IAAI,CAAC,IAAI;gBACZ,QAAQ,EACN,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;oBAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE;oBACzC,CAAC,CAAC,QAAQ;gBACZ,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;aAC9C,CAAC,CAAC,IAAI,EAAE,CAAC;SACX,CAAA;IACH,CAAC;IAMD,QAAQ;QACN,OAAO;YACL,GAAG,IAAI,sBAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;gBAChD,GAAG,IAAI,CAAC,IAAI;gBACZ,QAAQ,EACN,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;oBAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE;oBACzC,CAAC,CAAC,QAAQ;gBACZ,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;aAC9C,CAAC,CAAC,QAAQ,EAAE;SACd,CAAA;IACH,CAAC;IAMD,MAAM;QACJ,OAAO,IAAI,sBAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;YACpD,GAAG,IAAI,CAAC,IAAI;YACZ,QAAQ,EACN,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;gBAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE;gBACzC,CAAC,CAAC,QAAQ;YACZ,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;SAC9C,CAAC,CAAC,MAAM,EAAE,CAAA;IACb,CAAC;IAMD,UAAU;QACR,OAAO,IAAI,sBAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;YACpD,GAAG,IAAI,CAAC,IAAI;YACZ,QAAQ,EACN,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;gBAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE;gBACzC,CAAC,CAAC,QAAQ;YACZ,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;SAC9C,CAAC,CAAC,UAAU,EAAE,CAAA;IACjB,CAAC;IAED;;;OAGG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAA;IAC7C,CAAC;IACD,CAAC,MAAM,CAAC,QAAQ,CAAC;QACf,OAAO,IAAI,CAAC,WAAW,EAAE,CAAA;IAC3B,CAAC;IAED;;;OAGG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAA;IAC9C,CAAC;IACD,CAAC,MAAM,CAAC,aAAa,CAAC;QACpB,OAAO,IAAI,CAAC,OAAO,EAAE,CAAA;IACvB,CAAC;CACF;AA7QD,oBA6QC","sourcesContent":["import { Minimatch, MinimatchOptions } from 'minimatch'\nimport { Minipass } from 'minipass'\nimport { fileURLToPath } from 'node:url'\nimport {\n FSOption,\n Path,\n PathScurry,\n PathScurryDarwin,\n PathScurryPosix,\n PathScurryWin32,\n} from 'path-scurry'\nimport { IgnoreLike } from './ignore.js'\nimport { Pattern } from './pattern.js'\nimport { GlobStream, GlobWalker } from './walker.js'\n\nexport type MatchSet = Minimatch['set']\nexport type GlobParts = Exclude\n\n// if no process global, just call it linux.\n// so we default to case-sensitive, / separators\nconst defaultPlatform: NodeJS.Platform =\n (\n typeof process === 'object' &&\n process &&\n typeof process.platform === 'string'\n ) ?\n process.platform\n : 'linux'\n\n/**\n * A `GlobOptions` object may be provided to any of the exported methods, and\n * must be provided to the `Glob` constructor.\n *\n * All options are optional, boolean, and false by default, unless otherwise\n * noted.\n *\n * All resolved options are added to the Glob object as properties.\n *\n * If you are running many `glob` operations, you can pass a Glob object as the\n * `options` argument to a subsequent operation to share the previously loaded\n * cache.\n */\nexport interface GlobOptions {\n /**\n * Set to `true` to always receive absolute paths for\n * matched files. Set to `false` to always return relative paths.\n *\n * When this option is not set, absolute paths are returned for patterns\n * that are absolute, and otherwise paths are returned that are relative\n * to the `cwd` setting.\n *\n * This does _not_ make an extra system call to get\n * the realpath, it only does string path resolution.\n *\n * Conflicts with {@link withFileTypes}\n */\n absolute?: boolean\n\n /**\n * Set to false to enable {@link windowsPathsNoEscape}\n *\n * @deprecated\n */\n allowWindowsEscape?: boolean\n\n /**\n * The current working directory in which to search. Defaults to\n * `process.cwd()`.\n *\n * May be eiher a string path or a `file://` URL object or string.\n */\n cwd?: string | URL\n\n /**\n * Include `.dot` files in normal matches and `globstar`\n * matches. Note that an explicit dot in a portion of the pattern\n * will always match dot files.\n */\n dot?: boolean\n\n /**\n * Prepend all relative path strings with `./` (or `.\\` on Windows).\n *\n * Without this option, returned relative paths are \"bare\", so instead of\n * returning `'./foo/bar'`, they are returned as `'foo/bar'`.\n *\n * Relative patterns starting with `'../'` are not prepended with `./`, even\n * if this option is set.\n */\n dotRelative?: boolean\n\n /**\n * Follow symlinked directories when expanding `**`\n * patterns. This can result in a lot of duplicate references in\n * the presence of cyclic links, and make performance quite bad.\n *\n * By default, a `**` in a pattern will follow 1 symbolic link if\n * it is not the first item in the pattern, or none if it is the\n * first item in the pattern, following the same behavior as Bash.\n */\n follow?: boolean\n\n /**\n * string or string[], or an object with `ignore` and `ignoreChildren`\n * methods.\n *\n * If a string or string[] is provided, then this is treated as a glob\n * pattern or array of glob patterns to exclude from matches. To ignore all\n * children within a directory, as well as the entry itself, append `'/**'`\n * to the ignore pattern.\n *\n * **Note** `ignore` patterns are _always_ in `dot:true` mode, regardless of\n * any other settings.\n *\n * If an object is provided that has `ignored(path)` and/or\n * `childrenIgnored(path)` methods, then these methods will be called to\n * determine whether any Path is a match or if its children should be\n * traversed, respectively.\n */\n ignore?: string | string[] | IgnoreLike\n\n /**\n * Treat brace expansion like `{a,b}` as a \"magic\" pattern. Has no\n * effect if {@link nobrace} is set.\n *\n * Only has effect on the {@link hasMagic} function.\n */\n magicalBraces?: boolean\n\n /**\n * Add a `/` character to directory matches. Note that this requires\n * additional stat calls in some cases.\n */\n mark?: boolean\n\n /**\n * Perform a basename-only match if the pattern does not contain any slash\n * characters. That is, `*.js` would be treated as equivalent to\n * `**\\/*.js`, matching all js files in all directories.\n */\n matchBase?: boolean\n\n /**\n * Limit the directory traversal to a given depth below the cwd.\n * Note that this does NOT prevent traversal to sibling folders,\n * root patterns, and so on. It only limits the maximum folder depth\n * that the walk will descend, relative to the cwd.\n */\n maxDepth?: number\n\n /**\n * Do not expand `{a,b}` and `{1..3}` brace sets.\n */\n nobrace?: boolean\n\n /**\n * Perform a case-insensitive match. This defaults to `true` on macOS and\n * Windows systems, and `false` on all others.\n *\n * **Note** `nocase` should only be explicitly set when it is\n * known that the filesystem's case sensitivity differs from the\n * platform default. If set `true` on case-sensitive file\n * systems, or `false` on case-insensitive file systems, then the\n * walk may return more or less results than expected.\n */\n nocase?: boolean\n\n /**\n * Do not match directories, only files. (Note: to match\n * _only_ directories, put a `/` at the end of the pattern.)\n */\n nodir?: boolean\n\n /**\n * Do not match \"extglob\" patterns such as `+(a|b)`.\n */\n noext?: boolean\n\n /**\n * Do not match `**` against multiple filenames. (Ie, treat it as a normal\n * `*` instead.)\n *\n * Conflicts with {@link matchBase}\n */\n noglobstar?: boolean\n\n /**\n * Defaults to value of `process.platform` if available, or `'linux'` if\n * not. Setting `platform:'win32'` on non-Windows systems may cause strange\n * behavior.\n */\n platform?: NodeJS.Platform\n\n /**\n * Set to true to call `fs.realpath` on all of the\n * results. In the case of an entry that cannot be resolved, the\n * entry is omitted. This incurs a slight performance penalty, of\n * course, because of the added system calls.\n */\n realpath?: boolean\n\n /**\n *\n * A string path resolved against the `cwd` option, which\n * is used as the starting point for absolute patterns that start\n * with `/`, (but not drive letters or UNC paths on Windows).\n *\n * Note that this _doesn't_ necessarily limit the walk to the\n * `root` directory, and doesn't affect the cwd starting point for\n * non-absolute patterns. A pattern containing `..` will still be\n * able to traverse out of the root directory, if it is not an\n * actual root directory on the filesystem, and any non-absolute\n * patterns will be matched in the `cwd`. For example, the\n * pattern `/../*` with `{root:'/some/path'}` will return all\n * files in `/some`, not all files in `/some/path`. The pattern\n * `*` with `{root:'/some/path'}` will return all the entries in\n * the cwd, not the entries in `/some/path`.\n *\n * To start absolute and non-absolute patterns in the same\n * path, you can use `{root:''}`. However, be aware that on\n * Windows systems, a pattern like `x:/*` or `//host/share/*` will\n * _always_ start in the `x:/` or `//host/share` directory,\n * regardless of the `root` setting.\n */\n root?: string\n\n /**\n * A [PathScurry](http://npm.im/path-scurry) object used\n * to traverse the file system. If the `nocase` option is set\n * explicitly, then any provided `scurry` object must match this\n * setting.\n */\n scurry?: PathScurry\n\n /**\n * Call `lstat()` on all entries, whether required or not to determine\n * if it's a valid match. When used with {@link withFileTypes}, this means\n * that matches will include data such as modified time, permissions, and\n * so on. Note that this will incur a performance cost due to the added\n * system calls.\n */\n stat?: boolean\n\n /**\n * An AbortSignal which will cancel the Glob walk when\n * triggered.\n */\n signal?: AbortSignal\n\n /**\n * Use `\\\\` as a path separator _only_, and\n * _never_ as an escape character. If set, all `\\\\` characters are\n * replaced with `/` in the pattern.\n *\n * Note that this makes it **impossible** to match against paths\n * containing literal glob pattern characters, but allows matching\n * with patterns constructed using `path.join()` and\n * `path.resolve()` on Windows platforms, mimicking the (buggy!)\n * behavior of Glob v7 and before on Windows. Please use with\n * caution, and be mindful of [the caveat below about Windows\n * paths](#windows). (For legacy reasons, this is also set if\n * `allowWindowsEscape` is set to the exact value `false`.)\n */\n windowsPathsNoEscape?: boolean\n\n /**\n * Return [PathScurry](http://npm.im/path-scurry)\n * `Path` objects instead of strings. These are similar to a\n * NodeJS `Dirent` object, but with additional methods and\n * properties.\n *\n * Conflicts with {@link absolute}\n */\n withFileTypes?: boolean\n\n /**\n * An fs implementation to override some or all of the defaults. See\n * http://npm.im/path-scurry for details about what can be overridden.\n */\n fs?: FSOption\n\n /**\n * Just passed along to Minimatch. Note that this makes all pattern\n * matching operations slower and *extremely* noisy.\n */\n debug?: boolean\n\n /**\n * Return `/` delimited paths, even on Windows.\n *\n * On posix systems, this has no effect. But, on Windows, it means that\n * paths will be `/` delimited, and absolute paths will be their full\n * resolved UNC forms, eg instead of `'C:\\\\foo\\\\bar'`, it would return\n * `'//?/C:/foo/bar'`\n */\n posix?: boolean\n\n /**\n * Do not match any children of any matches. For example, the pattern\n * `**\\/foo` would match `a/foo`, but not `a/foo/b/foo` in this mode.\n *\n * This is especially useful for cases like \"find all `node_modules`\n * folders, but not the ones in `node_modules`\".\n *\n * In order to support this, the `Ignore` implementation must support an\n * `add(pattern: string)` method. If using the default `Ignore` class, then\n * this is fine, but if this is set to `false`, and a custom `Ignore` is\n * provided that does not have an `add()` method, then it will throw an\n * error.\n *\n * **Caveat** It *only* ignores matches that would be a descendant of a\n * previous match, and only if that descendant is matched *after* the\n * ancestor is encountered. Since the file system walk happens in\n * indeterminate order, it's possible that a match will already be added\n * before its ancestor, if multiple or braced patterns are used.\n *\n * For example:\n *\n * ```ts\n * const results = await glob([\n * // likely to match first, since it's just a stat\n * 'a/b/c/d/e/f',\n *\n * // this pattern is more complicated! It must to various readdir()\n * // calls and test the results against a regular expression, and that\n * // is certainly going to take a little bit longer.\n * //\n * // So, later on, it encounters a match at 'a/b/c/d/e', but it's too\n * // late to ignore a/b/c/d/e/f, because it's already been emitted.\n * 'a/[bdf]/?/[a-z]/*',\n * ], { includeChildMatches: false })\n * ```\n *\n * It's best to only set this to `false` if you can be reasonably sure that\n * no components of the pattern will potentially match one another's file\n * system descendants, or if the occasional included child entry will not\n * cause problems.\n *\n * @default true\n */\n includeChildMatches?: boolean\n}\n\nexport type GlobOptionsWithFileTypesTrue = GlobOptions & {\n withFileTypes: true\n // string options not relevant if returning Path objects.\n absolute?: undefined\n mark?: undefined\n posix?: undefined\n}\n\nexport type GlobOptionsWithFileTypesFalse = GlobOptions & {\n withFileTypes?: false\n}\n\nexport type GlobOptionsWithFileTypesUnset = GlobOptions & {\n withFileTypes?: undefined\n}\n\nexport type Result =\n Opts extends GlobOptionsWithFileTypesTrue ? Path\n : Opts extends GlobOptionsWithFileTypesFalse ? string\n : Opts extends GlobOptionsWithFileTypesUnset ? string\n : string | Path\nexport type Results = Result[]\n\nexport type FileTypes =\n Opts extends GlobOptionsWithFileTypesTrue ? true\n : Opts extends GlobOptionsWithFileTypesFalse ? false\n : Opts extends GlobOptionsWithFileTypesUnset ? false\n : boolean\n\n/**\n * An object that can perform glob pattern traversals.\n */\nexport class Glob implements GlobOptions {\n absolute?: boolean\n cwd: string\n root?: string\n dot: boolean\n dotRelative: boolean\n follow: boolean\n ignore?: string | string[] | IgnoreLike\n magicalBraces: boolean\n mark?: boolean\n matchBase: boolean\n maxDepth: number\n nobrace: boolean\n nocase: boolean\n nodir: boolean\n noext: boolean\n noglobstar: boolean\n pattern: string[]\n platform: NodeJS.Platform\n realpath: boolean\n scurry: PathScurry\n stat: boolean\n signal?: AbortSignal\n windowsPathsNoEscape: boolean\n withFileTypes: FileTypes\n includeChildMatches: boolean\n\n /**\n * The options provided to the constructor.\n */\n opts: Opts\n\n /**\n * An array of parsed immutable {@link Pattern} objects.\n */\n patterns: Pattern[]\n\n /**\n * All options are stored as properties on the `Glob` object.\n *\n * See {@link GlobOptions} for full options descriptions.\n *\n * Note that a previous `Glob` object can be passed as the\n * `GlobOptions` to another `Glob` instantiation to re-use settings\n * and caches with a new pattern.\n *\n * Traversal functions can be called multiple times to run the walk\n * again.\n */\n constructor(pattern: string | string[], opts: Opts) {\n /* c8 ignore start */\n if (!opts) throw new TypeError('glob options required')\n /* c8 ignore stop */\n this.withFileTypes = !!opts.withFileTypes as FileTypes\n this.signal = opts.signal\n this.follow = !!opts.follow\n this.dot = !!opts.dot\n this.dotRelative = !!opts.dotRelative\n this.nodir = !!opts.nodir\n this.mark = !!opts.mark\n if (!opts.cwd) {\n this.cwd = ''\n } else if (opts.cwd instanceof URL || opts.cwd.startsWith('file://')) {\n opts.cwd = fileURLToPath(opts.cwd)\n }\n this.cwd = opts.cwd || ''\n this.root = opts.root\n this.magicalBraces = !!opts.magicalBraces\n this.nobrace = !!opts.nobrace\n this.noext = !!opts.noext\n this.realpath = !!opts.realpath\n this.absolute = opts.absolute\n this.includeChildMatches = opts.includeChildMatches !== false\n\n this.noglobstar = !!opts.noglobstar\n this.matchBase = !!opts.matchBase\n this.maxDepth =\n typeof opts.maxDepth === 'number' ? opts.maxDepth : Infinity\n this.stat = !!opts.stat\n this.ignore = opts.ignore\n\n if (this.withFileTypes && this.absolute !== undefined) {\n throw new Error('cannot set absolute and withFileTypes:true')\n }\n\n if (typeof pattern === 'string') {\n pattern = [pattern]\n }\n\n this.windowsPathsNoEscape =\n !!opts.windowsPathsNoEscape ||\n (opts as { allowWindowsEscape?: boolean }).allowWindowsEscape ===\n false\n\n if (this.windowsPathsNoEscape) {\n pattern = pattern.map(p => p.replace(/\\\\/g, '/'))\n }\n\n if (this.matchBase) {\n if (opts.noglobstar) {\n throw new TypeError('base matching requires globstar')\n }\n pattern = pattern.map(p => (p.includes('/') ? p : `./**/${p}`))\n }\n\n this.pattern = pattern\n\n this.platform = opts.platform || defaultPlatform\n this.opts = { ...opts, platform: this.platform }\n if (opts.scurry) {\n this.scurry = opts.scurry\n if (\n opts.nocase !== undefined &&\n opts.nocase !== opts.scurry.nocase\n ) {\n throw new Error('nocase option contradicts provided scurry option')\n }\n } else {\n const Scurry =\n opts.platform === 'win32' ? PathScurryWin32\n : opts.platform === 'darwin' ? PathScurryDarwin\n : opts.platform ? PathScurryPosix\n : PathScurry\n this.scurry = new Scurry(this.cwd, {\n nocase: opts.nocase,\n fs: opts.fs,\n })\n }\n this.nocase = this.scurry.nocase\n\n // If you do nocase:true on a case-sensitive file system, then\n // we need to use regexps instead of strings for non-magic\n // path portions, because statting `aBc` won't return results\n // for the file `AbC` for example.\n const nocaseMagicOnly =\n this.platform === 'darwin' || this.platform === 'win32'\n\n const mmo: MinimatchOptions = {\n // default nocase based on platform\n ...opts,\n dot: this.dot,\n matchBase: this.matchBase,\n nobrace: this.nobrace,\n nocase: this.nocase,\n nocaseMagicOnly,\n nocomment: true,\n noext: this.noext,\n nonegate: true,\n optimizationLevel: 2,\n platform: this.platform,\n windowsPathsNoEscape: this.windowsPathsNoEscape,\n debug: !!this.opts.debug,\n }\n\n const mms = this.pattern.map(p => new Minimatch(p, mmo))\n const [matchSet, globParts] = mms.reduce(\n (set: [MatchSet, GlobParts], m) => {\n set[0].push(...m.set)\n set[1].push(...m.globParts)\n return set\n },\n [[], []],\n )\n this.patterns = matchSet.map((set, i) => {\n const g = globParts[i]\n /* c8 ignore start */\n if (!g) throw new Error('invalid pattern object')\n /* c8 ignore stop */\n return new Pattern(set, g, 0, this.platform)\n })\n }\n\n /**\n * Returns a Promise that resolves to the results array.\n */\n async walk(): Promise>\n async walk(): Promise<(string | Path)[]> {\n // Walkers always return array of Path objects, so we just have to\n // coerce them into the right shape. It will have already called\n // realpath() if the option was set to do so, so we know that's cached.\n // start out knowing the cwd, at least\n return [\n ...(await new GlobWalker(this.patterns, this.scurry.cwd, {\n ...this.opts,\n maxDepth:\n this.maxDepth !== Infinity ?\n this.maxDepth + this.scurry.cwd.depth()\n : Infinity,\n platform: this.platform,\n nocase: this.nocase,\n includeChildMatches: this.includeChildMatches,\n }).walk()),\n ]\n }\n\n /**\n * synchronous {@link Glob.walk}\n */\n walkSync(): Results\n walkSync(): (string | Path)[] {\n return [\n ...new GlobWalker(this.patterns, this.scurry.cwd, {\n ...this.opts,\n maxDepth:\n this.maxDepth !== Infinity ?\n this.maxDepth + this.scurry.cwd.depth()\n : Infinity,\n platform: this.platform,\n nocase: this.nocase,\n includeChildMatches: this.includeChildMatches,\n }).walkSync(),\n ]\n }\n\n /**\n * Stream results asynchronously.\n */\n stream(): Minipass, Result>\n stream(): Minipass {\n return new GlobStream(this.patterns, this.scurry.cwd, {\n ...this.opts,\n maxDepth:\n this.maxDepth !== Infinity ?\n this.maxDepth + this.scurry.cwd.depth()\n : Infinity,\n platform: this.platform,\n nocase: this.nocase,\n includeChildMatches: this.includeChildMatches,\n }).stream()\n }\n\n /**\n * Stream results synchronously.\n */\n streamSync(): Minipass, Result>\n streamSync(): Minipass {\n return new GlobStream(this.patterns, this.scurry.cwd, {\n ...this.opts,\n maxDepth:\n this.maxDepth !== Infinity ?\n this.maxDepth + this.scurry.cwd.depth()\n : Infinity,\n platform: this.platform,\n nocase: this.nocase,\n includeChildMatches: this.includeChildMatches,\n }).streamSync()\n }\n\n /**\n * Default sync iteration function. Returns a Generator that\n * iterates over the results.\n */\n iterateSync(): Generator, void, void> {\n return this.streamSync()[Symbol.iterator]()\n }\n [Symbol.iterator]() {\n return this.iterateSync()\n }\n\n /**\n * Default async iteration function. Returns an AsyncGenerator that\n * iterates over the results.\n */\n iterate(): AsyncGenerator, void, void> {\n return this.stream()[Symbol.asyncIterator]()\n }\n [Symbol.asyncIterator]() {\n return this.iterate()\n }\n}\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/has-magic.d.ts b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/has-magic.d.ts deleted file mode 100644 index 8aec3bd9725175..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/has-magic.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { GlobOptions } from './glob.js'; -/** - * Return true if the patterns provided contain any magic glob characters, - * given the options provided. - * - * Brace expansion is not considered "magic" unless the `magicalBraces` option - * is set, as brace expansion just turns one string into an array of strings. - * So a pattern like `'x{a,b}y'` would return `false`, because `'xay'` and - * `'xby'` both do not contain any magic glob characters, and it's treated the - * same as if you had called it on `['xay', 'xby']`. When `magicalBraces:true` - * is in the options, brace expansion _is_ treated as a pattern having magic. - */ -export declare const hasMagic: (pattern: string | string[], options?: GlobOptions) => boolean; -//# sourceMappingURL=has-magic.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/has-magic.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/has-magic.d.ts.map deleted file mode 100644 index b24dd4ec47e0bb..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/has-magic.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"has-magic.d.ts","sourceRoot":"","sources":["../../src/has-magic.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAEvC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,QAAQ,YACV,MAAM,GAAG,MAAM,EAAE,YACjB,WAAW,KACnB,OAQF,CAAA"} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/has-magic.js b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/has-magic.js deleted file mode 100644 index 0918bd57e0f1c2..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/has-magic.js +++ /dev/null @@ -1,27 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.hasMagic = void 0; -const minimatch_1 = require("minimatch"); -/** - * Return true if the patterns provided contain any magic glob characters, - * given the options provided. - * - * Brace expansion is not considered "magic" unless the `magicalBraces` option - * is set, as brace expansion just turns one string into an array of strings. - * So a pattern like `'x{a,b}y'` would return `false`, because `'xay'` and - * `'xby'` both do not contain any magic glob characters, and it's treated the - * same as if you had called it on `['xay', 'xby']`. When `magicalBraces:true` - * is in the options, brace expansion _is_ treated as a pattern having magic. - */ -const hasMagic = (pattern, options = {}) => { - if (!Array.isArray(pattern)) { - pattern = [pattern]; - } - for (const p of pattern) { - if (new minimatch_1.Minimatch(p, options).hasMagic()) - return true; - } - return false; -}; -exports.hasMagic = hasMagic; -//# sourceMappingURL=has-magic.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/has-magic.js.map b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/has-magic.js.map deleted file mode 100644 index 44deab29058276..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/has-magic.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"has-magic.js","sourceRoot":"","sources":["../../src/has-magic.ts"],"names":[],"mappings":";;;AAAA,yCAAqC;AAGrC;;;;;;;;;;GAUG;AACI,MAAM,QAAQ,GAAG,CACtB,OAA0B,EAC1B,UAAuB,EAAE,EAChB,EAAE;IACX,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAC,OAAO,CAAC,CAAA;IACrB,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,IAAI,qBAAS,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE;YAAE,OAAO,IAAI,CAAA;IACvD,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAXY,QAAA,QAAQ,YAWpB","sourcesContent":["import { Minimatch } from 'minimatch'\nimport { GlobOptions } from './glob.js'\n\n/**\n * Return true if the patterns provided contain any magic glob characters,\n * given the options provided.\n *\n * Brace expansion is not considered \"magic\" unless the `magicalBraces` option\n * is set, as brace expansion just turns one string into an array of strings.\n * So a pattern like `'x{a,b}y'` would return `false`, because `'xay'` and\n * `'xby'` both do not contain any magic glob characters, and it's treated the\n * same as if you had called it on `['xay', 'xby']`. When `magicalBraces:true`\n * is in the options, brace expansion _is_ treated as a pattern having magic.\n */\nexport const hasMagic = (\n pattern: string | string[],\n options: GlobOptions = {},\n): boolean => {\n if (!Array.isArray(pattern)) {\n pattern = [pattern]\n }\n for (const p of pattern) {\n if (new Minimatch(p, options).hasMagic()) return true\n }\n return false\n}\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/ignore.d.ts b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/ignore.d.ts deleted file mode 100644 index 1893b16df877c9..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/ignore.d.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Minimatch, MinimatchOptions } from 'minimatch'; -import { Path } from 'path-scurry'; -import { GlobWalkerOpts } from './walker.js'; -export interface IgnoreLike { - ignored?: (p: Path) => boolean; - childrenIgnored?: (p: Path) => boolean; - add?: (ignore: string) => void; -} -/** - * Class used to process ignored patterns - */ -export declare class Ignore implements IgnoreLike { - relative: Minimatch[]; - relativeChildren: Minimatch[]; - absolute: Minimatch[]; - absoluteChildren: Minimatch[]; - platform: NodeJS.Platform; - mmopts: MinimatchOptions; - constructor(ignored: string[], { nobrace, nocase, noext, noglobstar, platform, }: GlobWalkerOpts); - add(ign: string): void; - ignored(p: Path): boolean; - childrenIgnored(p: Path): boolean; -} -//# sourceMappingURL=ignore.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/ignore.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/ignore.d.ts.map deleted file mode 100644 index 57d6ab6153d770..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/ignore.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ignore.d.ts","sourceRoot":"","sources":["../../src/ignore.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAElC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,OAAO,CAAA;IAC9B,eAAe,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,OAAO,CAAA;IACtC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;CAC/B;AAWD;;GAEG;AACH,qBAAa,MAAO,YAAW,UAAU;IACvC,QAAQ,EAAE,SAAS,EAAE,CAAA;IACrB,gBAAgB,EAAE,SAAS,EAAE,CAAA;IAC7B,QAAQ,EAAE,SAAS,EAAE,CAAA;IACrB,gBAAgB,EAAE,SAAS,EAAE,CAAA;IAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAA;IACzB,MAAM,EAAE,gBAAgB,CAAA;gBAGtB,OAAO,EAAE,MAAM,EAAE,EACjB,EACE,OAAO,EACP,MAAM,EACN,KAAK,EACL,UAAU,EACV,QAA0B,GAC3B,EAAE,cAAc;IAqBnB,GAAG,CAAC,GAAG,EAAE,MAAM;IAyCf,OAAO,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO;IAczB,eAAe,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO;CAWlC"} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/ignore.js b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/ignore.js deleted file mode 100644 index 5f1fde0680dea3..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/ignore.js +++ /dev/null @@ -1,119 +0,0 @@ -"use strict"; -// give it a pattern, and it'll be able to tell you if -// a given path should be ignored. -// Ignoring a path ignores its children if the pattern ends in /** -// Ignores are always parsed in dot:true mode -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Ignore = void 0; -const minimatch_1 = require("minimatch"); -const pattern_js_1 = require("./pattern.js"); -const defaultPlatform = (typeof process === 'object' && - process && - typeof process.platform === 'string') ? - process.platform - : 'linux'; -/** - * Class used to process ignored patterns - */ -class Ignore { - relative; - relativeChildren; - absolute; - absoluteChildren; - platform; - mmopts; - constructor(ignored, { nobrace, nocase, noext, noglobstar, platform = defaultPlatform, }) { - this.relative = []; - this.absolute = []; - this.relativeChildren = []; - this.absoluteChildren = []; - this.platform = platform; - this.mmopts = { - dot: true, - nobrace, - nocase, - noext, - noglobstar, - optimizationLevel: 2, - platform, - nocomment: true, - nonegate: true, - }; - for (const ign of ignored) - this.add(ign); - } - add(ign) { - // this is a little weird, but it gives us a clean set of optimized - // minimatch matchers, without getting tripped up if one of them - // ends in /** inside a brace section, and it's only inefficient at - // the start of the walk, not along it. - // It'd be nice if the Pattern class just had a .test() method, but - // handling globstars is a bit of a pita, and that code already lives - // in minimatch anyway. - // Another way would be if maybe Minimatch could take its set/globParts - // as an option, and then we could at least just use Pattern to test - // for absolute-ness. - // Yet another way, Minimatch could take an array of glob strings, and - // a cwd option, and do the right thing. - const mm = new minimatch_1.Minimatch(ign, this.mmopts); - for (let i = 0; i < mm.set.length; i++) { - const parsed = mm.set[i]; - const globParts = mm.globParts[i]; - /* c8 ignore start */ - if (!parsed || !globParts) { - throw new Error('invalid pattern object'); - } - // strip off leading ./ portions - // https://github.com/isaacs/node-glob/issues/570 - while (parsed[0] === '.' && globParts[0] === '.') { - parsed.shift(); - globParts.shift(); - } - /* c8 ignore stop */ - const p = new pattern_js_1.Pattern(parsed, globParts, 0, this.platform); - const m = new minimatch_1.Minimatch(p.globString(), this.mmopts); - const children = globParts[globParts.length - 1] === '**'; - const absolute = p.isAbsolute(); - if (absolute) - this.absolute.push(m); - else - this.relative.push(m); - if (children) { - if (absolute) - this.absoluteChildren.push(m); - else - this.relativeChildren.push(m); - } - } - } - ignored(p) { - const fullpath = p.fullpath(); - const fullpaths = `${fullpath}/`; - const relative = p.relative() || '.'; - const relatives = `${relative}/`; - for (const m of this.relative) { - if (m.match(relative) || m.match(relatives)) - return true; - } - for (const m of this.absolute) { - if (m.match(fullpath) || m.match(fullpaths)) - return true; - } - return false; - } - childrenIgnored(p) { - const fullpath = p.fullpath() + '/'; - const relative = (p.relative() || '.') + '/'; - for (const m of this.relativeChildren) { - if (m.match(relative)) - return true; - } - for (const m of this.absoluteChildren) { - if (m.match(fullpath)) - return true; - } - return false; - } -} -exports.Ignore = Ignore; -//# sourceMappingURL=ignore.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/ignore.js.map b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/ignore.js.map deleted file mode 100644 index d9dfdfa34ab5c0..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/ignore.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ignore.js","sourceRoot":"","sources":["../../src/ignore.ts"],"names":[],"mappings":";AAAA,sDAAsD;AACtD,kCAAkC;AAClC,kEAAkE;AAClE,6CAA6C;;;AAE7C,yCAAuD;AAEvD,6CAAsC;AAStC,MAAM,eAAe,GACnB,CACE,OAAO,OAAO,KAAK,QAAQ;IAC3B,OAAO;IACP,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,CACrC,CAAC,CAAC;IACD,OAAO,CAAC,QAAQ;IAClB,CAAC,CAAC,OAAO,CAAA;AAEX;;GAEG;AACH,MAAa,MAAM;IACjB,QAAQ,CAAa;IACrB,gBAAgB,CAAa;IAC7B,QAAQ,CAAa;IACrB,gBAAgB,CAAa;IAC7B,QAAQ,CAAiB;IACzB,MAAM,CAAkB;IAExB,YACE,OAAiB,EACjB,EACE,OAAO,EACP,MAAM,EACN,KAAK,EACL,UAAU,EACV,QAAQ,GAAG,eAAe,GACX;QAEjB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;QAClB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;QAClB,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAA;QAC1B,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAA;QAC1B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,MAAM,GAAG;YACZ,GAAG,EAAE,IAAI;YACT,OAAO;YACP,MAAM;YACN,KAAK;YACL,UAAU;YACV,iBAAiB,EAAE,CAAC;YACpB,QAAQ;YACR,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,IAAI;SACf,CAAA;QACD,KAAK,MAAM,GAAG,IAAI,OAAO;YAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC1C,CAAC;IAED,GAAG,CAAC,GAAW;QACb,mEAAmE;QACnE,gEAAgE;QAChE,mEAAmE;QACnE,uCAAuC;QACvC,mEAAmE;QACnE,qEAAqE;QACrE,uBAAuB;QACvB,uEAAuE;QACvE,oEAAoE;QACpE,qBAAqB;QACrB,sEAAsE;QACtE,wCAAwC;QACxC,MAAM,EAAE,GAAG,IAAI,qBAAS,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YACxB,MAAM,SAAS,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YACjC,qBAAqB;YACrB,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;YAC3C,CAAC;YACD,gCAAgC;YAChC,iDAAiD;YACjD,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACjD,MAAM,CAAC,KAAK,EAAE,CAAA;gBACd,SAAS,CAAC,KAAK,EAAE,CAAA;YACnB,CAAC;YACD,oBAAoB;YACpB,MAAM,CAAC,GAAG,IAAI,oBAAO,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;YAC1D,MAAM,CAAC,GAAG,IAAI,qBAAS,CAAC,CAAC,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;YACpD,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI,CAAA;YACzD,MAAM,QAAQ,GAAG,CAAC,CAAC,UAAU,EAAE,CAAA;YAC/B,IAAI,QAAQ;gBAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;;gBAC9B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAC1B,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,QAAQ;oBAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;;oBACtC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACpC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,CAAO;QACb,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC7B,MAAM,SAAS,GAAG,GAAG,QAAQ,GAAG,CAAA;QAChC,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAA;QACpC,MAAM,SAAS,GAAG,GAAG,QAAQ,GAAG,CAAA;QAChC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;gBAAE,OAAO,IAAI,CAAA;QAC1D,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;gBAAE,OAAO,IAAI,CAAA;QAC1D,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,eAAe,CAAC,CAAO;QACrB,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,EAAE,GAAG,GAAG,CAAA;QACnC,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,GAAG,GAAG,CAAA;QAC5C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtC,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;gBAAE,OAAO,IAAI,CAAA;QACpC,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtC,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;gBAAE,OAAO,IAAI,CAAA;QACpC,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;CACF;AAvGD,wBAuGC","sourcesContent":["// give it a pattern, and it'll be able to tell you if\n// a given path should be ignored.\n// Ignoring a path ignores its children if the pattern ends in /**\n// Ignores are always parsed in dot:true mode\n\nimport { Minimatch, MinimatchOptions } from 'minimatch'\nimport { Path } from 'path-scurry'\nimport { Pattern } from './pattern.js'\nimport { GlobWalkerOpts } from './walker.js'\n\nexport interface IgnoreLike {\n ignored?: (p: Path) => boolean\n childrenIgnored?: (p: Path) => boolean\n add?: (ignore: string) => void\n}\n\nconst defaultPlatform: NodeJS.Platform =\n (\n typeof process === 'object' &&\n process &&\n typeof process.platform === 'string'\n ) ?\n process.platform\n : 'linux'\n\n/**\n * Class used to process ignored patterns\n */\nexport class Ignore implements IgnoreLike {\n relative: Minimatch[]\n relativeChildren: Minimatch[]\n absolute: Minimatch[]\n absoluteChildren: Minimatch[]\n platform: NodeJS.Platform\n mmopts: MinimatchOptions\n\n constructor(\n ignored: string[],\n {\n nobrace,\n nocase,\n noext,\n noglobstar,\n platform = defaultPlatform,\n }: GlobWalkerOpts,\n ) {\n this.relative = []\n this.absolute = []\n this.relativeChildren = []\n this.absoluteChildren = []\n this.platform = platform\n this.mmopts = {\n dot: true,\n nobrace,\n nocase,\n noext,\n noglobstar,\n optimizationLevel: 2,\n platform,\n nocomment: true,\n nonegate: true,\n }\n for (const ign of ignored) this.add(ign)\n }\n\n add(ign: string) {\n // this is a little weird, but it gives us a clean set of optimized\n // minimatch matchers, without getting tripped up if one of them\n // ends in /** inside a brace section, and it's only inefficient at\n // the start of the walk, not along it.\n // It'd be nice if the Pattern class just had a .test() method, but\n // handling globstars is a bit of a pita, and that code already lives\n // in minimatch anyway.\n // Another way would be if maybe Minimatch could take its set/globParts\n // as an option, and then we could at least just use Pattern to test\n // for absolute-ness.\n // Yet another way, Minimatch could take an array of glob strings, and\n // a cwd option, and do the right thing.\n const mm = new Minimatch(ign, this.mmopts)\n for (let i = 0; i < mm.set.length; i++) {\n const parsed = mm.set[i]\n const globParts = mm.globParts[i]\n /* c8 ignore start */\n if (!parsed || !globParts) {\n throw new Error('invalid pattern object')\n }\n // strip off leading ./ portions\n // https://github.com/isaacs/node-glob/issues/570\n while (parsed[0] === '.' && globParts[0] === '.') {\n parsed.shift()\n globParts.shift()\n }\n /* c8 ignore stop */\n const p = new Pattern(parsed, globParts, 0, this.platform)\n const m = new Minimatch(p.globString(), this.mmopts)\n const children = globParts[globParts.length - 1] === '**'\n const absolute = p.isAbsolute()\n if (absolute) this.absolute.push(m)\n else this.relative.push(m)\n if (children) {\n if (absolute) this.absoluteChildren.push(m)\n else this.relativeChildren.push(m)\n }\n }\n }\n\n ignored(p: Path): boolean {\n const fullpath = p.fullpath()\n const fullpaths = `${fullpath}/`\n const relative = p.relative() || '.'\n const relatives = `${relative}/`\n for (const m of this.relative) {\n if (m.match(relative) || m.match(relatives)) return true\n }\n for (const m of this.absolute) {\n if (m.match(fullpath) || m.match(fullpaths)) return true\n }\n return false\n }\n\n childrenIgnored(p: Path): boolean {\n const fullpath = p.fullpath() + '/'\n const relative = (p.relative() || '.') + '/'\n for (const m of this.relativeChildren) {\n if (m.match(relative)) return true\n }\n for (const m of this.absoluteChildren) {\n if (m.match(fullpath)) return true\n }\n return false\n }\n}\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/index.d.ts b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/index.d.ts deleted file mode 100644 index 9c326ddc895b61..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/index.d.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { Minipass } from 'minipass'; -import { Path } from 'path-scurry'; -import type { GlobOptions, GlobOptionsWithFileTypesFalse, GlobOptionsWithFileTypesTrue, GlobOptionsWithFileTypesUnset } from './glob.js'; -import { Glob } from './glob.js'; -export { escape, unescape } from 'minimatch'; -export type { FSOption, Path, WalkOptions, WalkOptionsWithFileTypesTrue, WalkOptionsWithFileTypesUnset, } from 'path-scurry'; -export { Glob } from './glob.js'; -export type { GlobOptions, GlobOptionsWithFileTypesFalse, GlobOptionsWithFileTypesTrue, GlobOptionsWithFileTypesUnset, } from './glob.js'; -export { hasMagic } from './has-magic.js'; -export { Ignore } from './ignore.js'; -export type { IgnoreLike } from './ignore.js'; -export type { MatchStream } from './walker.js'; -/** - * Syncronous form of {@link globStream}. Will read all the matches as fast as - * you consume them, even all in a single tick if you consume them immediately, - * but will still respond to backpressure if they're not consumed immediately. - */ -export declare function globStreamSync(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): Minipass; -export declare function globStreamSync(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): Minipass; -export declare function globStreamSync(pattern: string | string[], options: GlobOptionsWithFileTypesUnset): Minipass; -export declare function globStreamSync(pattern: string | string[], options: GlobOptions): Minipass | Minipass; -/** - * Return a stream that emits all the strings or `Path` objects and - * then emits `end` when completed. - */ -export declare function globStream(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): Minipass; -export declare function globStream(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): Minipass; -export declare function globStream(pattern: string | string[], options?: GlobOptionsWithFileTypesUnset | undefined): Minipass; -export declare function globStream(pattern: string | string[], options: GlobOptions): Minipass | Minipass; -/** - * Synchronous form of {@link glob} - */ -export declare function globSync(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): string[]; -export declare function globSync(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): Path[]; -export declare function globSync(pattern: string | string[], options?: GlobOptionsWithFileTypesUnset | undefined): string[]; -export declare function globSync(pattern: string | string[], options: GlobOptions): Path[] | string[]; -/** - * Perform an asynchronous glob search for the pattern(s) specified. Returns - * [Path](https://isaacs.github.io/path-scurry/classes/PathBase) objects if the - * {@link withFileTypes} option is set to `true`. See {@link GlobOptions} for - * full option descriptions. - */ -declare function glob_(pattern: string | string[], options?: GlobOptionsWithFileTypesUnset | undefined): Promise; -declare function glob_(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): Promise; -declare function glob_(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): Promise; -declare function glob_(pattern: string | string[], options: GlobOptions): Promise; -/** - * Return a sync iterator for walking glob pattern matches. - */ -export declare function globIterateSync(pattern: string | string[], options?: GlobOptionsWithFileTypesUnset | undefined): Generator; -export declare function globIterateSync(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): Generator; -export declare function globIterateSync(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): Generator; -export declare function globIterateSync(pattern: string | string[], options: GlobOptions): Generator | Generator; -/** - * Return an async iterator for walking glob pattern matches. - */ -export declare function globIterate(pattern: string | string[], options?: GlobOptionsWithFileTypesUnset | undefined): AsyncGenerator; -export declare function globIterate(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): AsyncGenerator; -export declare function globIterate(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): AsyncGenerator; -export declare function globIterate(pattern: string | string[], options: GlobOptions): AsyncGenerator | AsyncGenerator; -export declare const streamSync: typeof globStreamSync; -export declare const stream: typeof globStream & { - sync: typeof globStreamSync; -}; -export declare const iterateSync: typeof globIterateSync; -export declare const iterate: typeof globIterate & { - sync: typeof globIterateSync; -}; -export declare const sync: typeof globSync & { - stream: typeof globStreamSync; - iterate: typeof globIterateSync; -}; -export declare const glob: typeof glob_ & { - glob: typeof glob_; - globSync: typeof globSync; - sync: typeof globSync & { - stream: typeof globStreamSync; - iterate: typeof globIterateSync; - }; - globStream: typeof globStream; - stream: typeof globStream & { - sync: typeof globStreamSync; - }; - globStreamSync: typeof globStreamSync; - streamSync: typeof globStreamSync; - globIterate: typeof globIterate; - iterate: typeof globIterate & { - sync: typeof globIterateSync; - }; - globIterateSync: typeof globIterateSync; - iterateSync: typeof globIterateSync; - Glob: typeof Glob; - hasMagic: (pattern: string | string[], options?: GlobOptions) => boolean; - escape: (s: string, { windowsPathsNoEscape, }?: Pick) => string; - unescape: (s: string, { windowsPathsNoEscape, }?: Pick) => string; -}; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/index.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/index.d.ts.map deleted file mode 100644 index 5fb32252b63747..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,KAAK,EACV,WAAW,EACX,6BAA6B,EAC7B,4BAA4B,EAC5B,6BAA6B,EAC9B,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAGhC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAC5C,YAAY,EACV,QAAQ,EACR,IAAI,EACJ,WAAW,EACX,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,YAAY,EACV,WAAW,EACX,6BAA6B,EAC7B,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,4BAA4B,GACpC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;AACvB,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAC3B,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAC3B,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,WAAW,GACnB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAQlD;;;GAGG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAC3B,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,4BAA4B,GACpC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;AACvB,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,6BAA6B,GAAG,SAAS,GAClD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAC3B,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,WAAW,GACnB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAQlD;;GAEG;AACH,wBAAgB,QAAQ,CACtB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,MAAM,EAAE,CAAA;AACX,wBAAgB,QAAQ,CACtB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,4BAA4B,GACpC,IAAI,EAAE,CAAA;AACT,wBAAgB,QAAQ,CACtB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,6BAA6B,GAAG,SAAS,GAClD,MAAM,EAAE,CAAA;AACX,wBAAgB,QAAQ,CACtB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,WAAW,GACnB,IAAI,EAAE,GAAG,MAAM,EAAE,CAAA;AAQpB;;;;;GAKG;AACH,iBAAe,KAAK,CAClB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,6BAA6B,GAAG,SAAS,GAClD,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;AACpB,iBAAe,KAAK,CAClB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;AAClB,iBAAe,KAAK,CAClB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;AACpB,iBAAe,KAAK,CAClB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;AAQ7B;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,6BAA6B,GAAG,SAAS,GAClD,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AAChC,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,4BAA4B,GACpC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AAC9B,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AAChC,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,WAAW,GACnB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AAQ9D;;GAEG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,6BAA6B,GAAG,SAAS,GAClD,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AACrC,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,4BAA4B,GACpC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AACnC,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AACrC,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,WAAW,GACnB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AASxE,eAAO,MAAM,UAAU,uBAAiB,CAAA;AACxC,eAAO,MAAM,MAAM;;CAAsD,CAAA;AACzE,eAAO,MAAM,WAAW,wBAAkB,CAAA;AAC1C,eAAO,MAAM,OAAO;;CAElB,CAAA;AACF,eAAO,MAAM,IAAI;;;CAGf,CAAA;AAEF,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;CAgBf,CAAA"} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/index.js b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/index.js deleted file mode 100644 index 151495d170efa2..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/index.js +++ /dev/null @@ -1,68 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.glob = exports.sync = exports.iterate = exports.iterateSync = exports.stream = exports.streamSync = exports.Ignore = exports.hasMagic = exports.Glob = exports.unescape = exports.escape = void 0; -exports.globStreamSync = globStreamSync; -exports.globStream = globStream; -exports.globSync = globSync; -exports.globIterateSync = globIterateSync; -exports.globIterate = globIterate; -const minimatch_1 = require("minimatch"); -const glob_js_1 = require("./glob.js"); -const has_magic_js_1 = require("./has-magic.js"); -var minimatch_2 = require("minimatch"); -Object.defineProperty(exports, "escape", { enumerable: true, get: function () { return minimatch_2.escape; } }); -Object.defineProperty(exports, "unescape", { enumerable: true, get: function () { return minimatch_2.unescape; } }); -var glob_js_2 = require("./glob.js"); -Object.defineProperty(exports, "Glob", { enumerable: true, get: function () { return glob_js_2.Glob; } }); -var has_magic_js_2 = require("./has-magic.js"); -Object.defineProperty(exports, "hasMagic", { enumerable: true, get: function () { return has_magic_js_2.hasMagic; } }); -var ignore_js_1 = require("./ignore.js"); -Object.defineProperty(exports, "Ignore", { enumerable: true, get: function () { return ignore_js_1.Ignore; } }); -function globStreamSync(pattern, options = {}) { - return new glob_js_1.Glob(pattern, options).streamSync(); -} -function globStream(pattern, options = {}) { - return new glob_js_1.Glob(pattern, options).stream(); -} -function globSync(pattern, options = {}) { - return new glob_js_1.Glob(pattern, options).walkSync(); -} -async function glob_(pattern, options = {}) { - return new glob_js_1.Glob(pattern, options).walk(); -} -function globIterateSync(pattern, options = {}) { - return new glob_js_1.Glob(pattern, options).iterateSync(); -} -function globIterate(pattern, options = {}) { - return new glob_js_1.Glob(pattern, options).iterate(); -} -// aliases: glob.sync.stream() glob.stream.sync() glob.sync() etc -exports.streamSync = globStreamSync; -exports.stream = Object.assign(globStream, { sync: globStreamSync }); -exports.iterateSync = globIterateSync; -exports.iterate = Object.assign(globIterate, { - sync: globIterateSync, -}); -exports.sync = Object.assign(globSync, { - stream: globStreamSync, - iterate: globIterateSync, -}); -exports.glob = Object.assign(glob_, { - glob: glob_, - globSync, - sync: exports.sync, - globStream, - stream: exports.stream, - globStreamSync, - streamSync: exports.streamSync, - globIterate, - iterate: exports.iterate, - globIterateSync, - iterateSync: exports.iterateSync, - Glob: glob_js_1.Glob, - hasMagic: has_magic_js_1.hasMagic, - escape: minimatch_1.escape, - unescape: minimatch_1.unescape, -}); -exports.glob.glob = exports.glob; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/index.js.map b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/index.js.map deleted file mode 100644 index e648b1d01939bc..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAqDA,wCAKC;AAsBD,gCAKC;AAqBD,4BAKC;AAkDD,0CAKC;AAqBD,kCAKC;AAhMD,yCAA4C;AAS5C,uCAAgC;AAChC,iDAAyC;AAEzC,uCAA4C;AAAnC,mGAAA,MAAM,OAAA;AAAE,qGAAA,QAAQ,OAAA;AAQzB,qCAAgC;AAAvB,+FAAA,IAAI,OAAA;AAOb,+CAAyC;AAAhC,wGAAA,QAAQ,OAAA;AACjB,yCAAoC;AAA3B,mGAAA,MAAM,OAAA;AAyBf,SAAgB,cAAc,CAC5B,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,cAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,UAAU,EAAE,CAAA;AAChD,CAAC;AAsBD,SAAgB,UAAU,CACxB,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,cAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,EAAE,CAAA;AAC5C,CAAC;AAqBD,SAAgB,QAAQ,CACtB,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,cAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAA;AAC9C,CAAC;AAwBD,KAAK,UAAU,KAAK,CAClB,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,cAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;AAC1C,CAAC;AAqBD,SAAgB,eAAe,CAC7B,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,cAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAA;AACjD,CAAC;AAqBD,SAAgB,WAAW,CACzB,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,cAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,OAAO,EAAE,CAAA;AAC7C,CAAC;AAED,iEAAiE;AACpD,QAAA,UAAU,GAAG,cAAc,CAAA;AAC3B,QAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAA;AAC5D,QAAA,WAAW,GAAG,eAAe,CAAA;AAC7B,QAAA,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE;IAChD,IAAI,EAAE,eAAe;CACtB,CAAC,CAAA;AACW,QAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE;IAC1C,MAAM,EAAE,cAAc;IACtB,OAAO,EAAE,eAAe;CACzB,CAAC,CAAA;AAEW,QAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;IACvC,IAAI,EAAE,KAAK;IACX,QAAQ;IACR,IAAI,EAAJ,YAAI;IACJ,UAAU;IACV,MAAM,EAAN,cAAM;IACN,cAAc;IACd,UAAU,EAAV,kBAAU;IACV,WAAW;IACX,OAAO,EAAP,eAAO;IACP,eAAe;IACf,WAAW,EAAX,mBAAW;IACX,IAAI,EAAJ,cAAI;IACJ,QAAQ,EAAR,uBAAQ;IACR,MAAM,EAAN,kBAAM;IACN,QAAQ,EAAR,oBAAQ;CACT,CAAC,CAAA;AACF,YAAI,CAAC,IAAI,GAAG,YAAI,CAAA","sourcesContent":["import { escape, unescape } from 'minimatch'\nimport { Minipass } from 'minipass'\nimport { Path } from 'path-scurry'\nimport type {\n GlobOptions,\n GlobOptionsWithFileTypesFalse,\n GlobOptionsWithFileTypesTrue,\n GlobOptionsWithFileTypesUnset,\n} from './glob.js'\nimport { Glob } from './glob.js'\nimport { hasMagic } from './has-magic.js'\n\nexport { escape, unescape } from 'minimatch'\nexport type {\n FSOption,\n Path,\n WalkOptions,\n WalkOptionsWithFileTypesTrue,\n WalkOptionsWithFileTypesUnset,\n} from 'path-scurry'\nexport { Glob } from './glob.js'\nexport type {\n GlobOptions,\n GlobOptionsWithFileTypesFalse,\n GlobOptionsWithFileTypesTrue,\n GlobOptionsWithFileTypesUnset,\n} from './glob.js'\nexport { hasMagic } from './has-magic.js'\nexport { Ignore } from './ignore.js'\nexport type { IgnoreLike } from './ignore.js'\nexport type { MatchStream } from './walker.js'\n\n/**\n * Syncronous form of {@link globStream}. Will read all the matches as fast as\n * you consume them, even all in a single tick if you consume them immediately,\n * but will still respond to backpressure if they're not consumed immediately.\n */\nexport function globStreamSync(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesTrue,\n): Minipass\nexport function globStreamSync(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesFalse,\n): Minipass\nexport function globStreamSync(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesUnset,\n): Minipass\nexport function globStreamSync(\n pattern: string | string[],\n options: GlobOptions,\n): Minipass | Minipass\nexport function globStreamSync(\n pattern: string | string[],\n options: GlobOptions = {},\n) {\n return new Glob(pattern, options).streamSync()\n}\n\n/**\n * Return a stream that emits all the strings or `Path` objects and\n * then emits `end` when completed.\n */\nexport function globStream(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesFalse,\n): Minipass\nexport function globStream(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesTrue,\n): Minipass\nexport function globStream(\n pattern: string | string[],\n options?: GlobOptionsWithFileTypesUnset | undefined,\n): Minipass\nexport function globStream(\n pattern: string | string[],\n options: GlobOptions,\n): Minipass | Minipass\nexport function globStream(\n pattern: string | string[],\n options: GlobOptions = {},\n) {\n return new Glob(pattern, options).stream()\n}\n\n/**\n * Synchronous form of {@link glob}\n */\nexport function globSync(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesFalse,\n): string[]\nexport function globSync(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesTrue,\n): Path[]\nexport function globSync(\n pattern: string | string[],\n options?: GlobOptionsWithFileTypesUnset | undefined,\n): string[]\nexport function globSync(\n pattern: string | string[],\n options: GlobOptions,\n): Path[] | string[]\nexport function globSync(\n pattern: string | string[],\n options: GlobOptions = {},\n) {\n return new Glob(pattern, options).walkSync()\n}\n\n/**\n * Perform an asynchronous glob search for the pattern(s) specified. Returns\n * [Path](https://isaacs.github.io/path-scurry/classes/PathBase) objects if the\n * {@link withFileTypes} option is set to `true`. See {@link GlobOptions} for\n * full option descriptions.\n */\nasync function glob_(\n pattern: string | string[],\n options?: GlobOptionsWithFileTypesUnset | undefined,\n): Promise\nasync function glob_(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesTrue,\n): Promise\nasync function glob_(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesFalse,\n): Promise\nasync function glob_(\n pattern: string | string[],\n options: GlobOptions,\n): Promise\nasync function glob_(\n pattern: string | string[],\n options: GlobOptions = {},\n) {\n return new Glob(pattern, options).walk()\n}\n\n/**\n * Return a sync iterator for walking glob pattern matches.\n */\nexport function globIterateSync(\n pattern: string | string[],\n options?: GlobOptionsWithFileTypesUnset | undefined,\n): Generator\nexport function globIterateSync(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesTrue,\n): Generator\nexport function globIterateSync(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesFalse,\n): Generator\nexport function globIterateSync(\n pattern: string | string[],\n options: GlobOptions,\n): Generator | Generator\nexport function globIterateSync(\n pattern: string | string[],\n options: GlobOptions = {},\n) {\n return new Glob(pattern, options).iterateSync()\n}\n\n/**\n * Return an async iterator for walking glob pattern matches.\n */\nexport function globIterate(\n pattern: string | string[],\n options?: GlobOptionsWithFileTypesUnset | undefined,\n): AsyncGenerator\nexport function globIterate(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesTrue,\n): AsyncGenerator\nexport function globIterate(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesFalse,\n): AsyncGenerator\nexport function globIterate(\n pattern: string | string[],\n options: GlobOptions,\n): AsyncGenerator | AsyncGenerator\nexport function globIterate(\n pattern: string | string[],\n options: GlobOptions = {},\n) {\n return new Glob(pattern, options).iterate()\n}\n\n// aliases: glob.sync.stream() glob.stream.sync() glob.sync() etc\nexport const streamSync = globStreamSync\nexport const stream = Object.assign(globStream, { sync: globStreamSync })\nexport const iterateSync = globIterateSync\nexport const iterate = Object.assign(globIterate, {\n sync: globIterateSync,\n})\nexport const sync = Object.assign(globSync, {\n stream: globStreamSync,\n iterate: globIterateSync,\n})\n\nexport const glob = Object.assign(glob_, {\n glob: glob_,\n globSync,\n sync,\n globStream,\n stream,\n globStreamSync,\n streamSync,\n globIterate,\n iterate,\n globIterateSync,\n iterateSync,\n Glob,\n hasMagic,\n escape,\n unescape,\n})\nglob.glob = glob\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/package.json b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/package.json deleted file mode 100644 index 5bbefffbabee39..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "commonjs" -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/pattern.d.ts b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/pattern.d.ts deleted file mode 100644 index 9636df3b54df29..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/pattern.d.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { GLOBSTAR } from 'minimatch'; -export type MMPattern = string | RegExp | typeof GLOBSTAR; -export type PatternList = [p: MMPattern, ...rest: MMPattern[]]; -export type UNCPatternList = [ - p0: '', - p1: '', - p2: string, - p3: string, - ...rest: MMPattern[] -]; -export type DrivePatternList = [p0: string, ...rest: MMPattern[]]; -export type AbsolutePatternList = [p0: '', ...rest: MMPattern[]]; -export type GlobList = [p: string, ...rest: string[]]; -/** - * An immutable-ish view on an array of glob parts and their parsed - * results - */ -export declare class Pattern { - #private; - readonly length: number; - constructor(patternList: MMPattern[], globList: string[], index: number, platform: NodeJS.Platform); - /** - * The first entry in the parsed list of patterns - */ - pattern(): MMPattern; - /** - * true of if pattern() returns a string - */ - isString(): boolean; - /** - * true of if pattern() returns GLOBSTAR - */ - isGlobstar(): boolean; - /** - * true if pattern() returns a regexp - */ - isRegExp(): boolean; - /** - * The /-joined set of glob parts that make up this pattern - */ - globString(): string; - /** - * true if there are more pattern parts after this one - */ - hasMore(): boolean; - /** - * The rest of the pattern after this part, or null if this is the end - */ - rest(): Pattern | null; - /** - * true if the pattern represents a //unc/path/ on windows - */ - isUNC(): boolean; - /** - * True if the pattern starts with a drive letter on Windows - */ - isDrive(): boolean; - /** - * True if the pattern is rooted on an absolute path - */ - isAbsolute(): boolean; - /** - * consume the root of the pattern, and return it - */ - root(): string; - /** - * Check to see if the current globstar pattern is allowed to follow - * a symbolic link. - */ - checkFollowGlobstar(): boolean; - /** - * Mark that the current globstar pattern is following a symbolic link - */ - markFollowGlobstar(): boolean; -} -//# sourceMappingURL=pattern.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/pattern.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/pattern.d.ts.map deleted file mode 100644 index cdf322346317d8..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/pattern.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"pattern.d.ts","sourceRoot":"","sources":["../../src/pattern.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,QAAQ,CAAA;AAGzD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;AAC9D,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,MAAM;IACV,EAAE,EAAE,MAAM;IACV,GAAG,IAAI,EAAE,SAAS,EAAE;CACrB,CAAA;AACD,MAAM,MAAM,gBAAgB,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;AACjE,MAAM,MAAM,mBAAmB,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;AAChE,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;AAMrD;;;GAGG;AACH,qBAAa,OAAO;;IAIlB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;gBAUrB,WAAW,EAAE,SAAS,EAAE,EACxB,QAAQ,EAAE,MAAM,EAAE,EAClB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,CAAC,QAAQ;IA6D3B;;OAEG;IACH,OAAO,IAAI,SAAS;IAIpB;;OAEG;IACH,QAAQ,IAAI,OAAO;IAGnB;;OAEG;IACH,UAAU,IAAI,OAAO;IAGrB;;OAEG;IACH,QAAQ,IAAI,OAAO;IAInB;;OAEG;IACH,UAAU,IAAI,MAAM;IAUpB;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;OAEG;IACH,IAAI,IAAI,OAAO,GAAG,IAAI;IAetB;;OAEG;IACH,KAAK,IAAI,OAAO;IAoBhB;;OAEG;IACH,OAAO,IAAI,OAAO;IAelB;;OAEG;IACH,UAAU,IAAI,OAAO;IAUrB;;OAEG;IACH,IAAI,IAAI,MAAM;IASd;;;OAGG;IACH,mBAAmB,IAAI,OAAO;IAQ9B;;OAEG;IACH,kBAAkB,IAAI,OAAO;CAM9B"} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/pattern.js b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/pattern.js deleted file mode 100644 index f0de35fb5bed9d..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/pattern.js +++ /dev/null @@ -1,219 +0,0 @@ -"use strict"; -// this is just a very light wrapper around 2 arrays with an offset index -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Pattern = void 0; -const minimatch_1 = require("minimatch"); -const isPatternList = (pl) => pl.length >= 1; -const isGlobList = (gl) => gl.length >= 1; -/** - * An immutable-ish view on an array of glob parts and their parsed - * results - */ -class Pattern { - #patternList; - #globList; - #index; - length; - #platform; - #rest; - #globString; - #isDrive; - #isUNC; - #isAbsolute; - #followGlobstar = true; - constructor(patternList, globList, index, platform) { - if (!isPatternList(patternList)) { - throw new TypeError('empty pattern list'); - } - if (!isGlobList(globList)) { - throw new TypeError('empty glob list'); - } - if (globList.length !== patternList.length) { - throw new TypeError('mismatched pattern list and glob list lengths'); - } - this.length = patternList.length; - if (index < 0 || index >= this.length) { - throw new TypeError('index out of range'); - } - this.#patternList = patternList; - this.#globList = globList; - this.#index = index; - this.#platform = platform; - // normalize root entries of absolute patterns on initial creation. - if (this.#index === 0) { - // c: => ['c:/'] - // C:/ => ['C:/'] - // C:/x => ['C:/', 'x'] - // //host/share => ['//host/share/'] - // //host/share/ => ['//host/share/'] - // //host/share/x => ['//host/share/', 'x'] - // /etc => ['/', 'etc'] - // / => ['/'] - if (this.isUNC()) { - // '' / '' / 'host' / 'share' - const [p0, p1, p2, p3, ...prest] = this.#patternList; - const [g0, g1, g2, g3, ...grest] = this.#globList; - if (prest[0] === '') { - // ends in / - prest.shift(); - grest.shift(); - } - const p = [p0, p1, p2, p3, ''].join('/'); - const g = [g0, g1, g2, g3, ''].join('/'); - this.#patternList = [p, ...prest]; - this.#globList = [g, ...grest]; - this.length = this.#patternList.length; - } - else if (this.isDrive() || this.isAbsolute()) { - const [p1, ...prest] = this.#patternList; - const [g1, ...grest] = this.#globList; - if (prest[0] === '') { - // ends in / - prest.shift(); - grest.shift(); - } - const p = p1 + '/'; - const g = g1 + '/'; - this.#patternList = [p, ...prest]; - this.#globList = [g, ...grest]; - this.length = this.#patternList.length; - } - } - } - /** - * The first entry in the parsed list of patterns - */ - pattern() { - return this.#patternList[this.#index]; - } - /** - * true of if pattern() returns a string - */ - isString() { - return typeof this.#patternList[this.#index] === 'string'; - } - /** - * true of if pattern() returns GLOBSTAR - */ - isGlobstar() { - return this.#patternList[this.#index] === minimatch_1.GLOBSTAR; - } - /** - * true if pattern() returns a regexp - */ - isRegExp() { - return this.#patternList[this.#index] instanceof RegExp; - } - /** - * The /-joined set of glob parts that make up this pattern - */ - globString() { - return (this.#globString = - this.#globString || - (this.#index === 0 ? - this.isAbsolute() ? - this.#globList[0] + this.#globList.slice(1).join('/') - : this.#globList.join('/') - : this.#globList.slice(this.#index).join('/'))); - } - /** - * true if there are more pattern parts after this one - */ - hasMore() { - return this.length > this.#index + 1; - } - /** - * The rest of the pattern after this part, or null if this is the end - */ - rest() { - if (this.#rest !== undefined) - return this.#rest; - if (!this.hasMore()) - return (this.#rest = null); - this.#rest = new Pattern(this.#patternList, this.#globList, this.#index + 1, this.#platform); - this.#rest.#isAbsolute = this.#isAbsolute; - this.#rest.#isUNC = this.#isUNC; - this.#rest.#isDrive = this.#isDrive; - return this.#rest; - } - /** - * true if the pattern represents a //unc/path/ on windows - */ - isUNC() { - const pl = this.#patternList; - return this.#isUNC !== undefined ? - this.#isUNC - : (this.#isUNC = - this.#platform === 'win32' && - this.#index === 0 && - pl[0] === '' && - pl[1] === '' && - typeof pl[2] === 'string' && - !!pl[2] && - typeof pl[3] === 'string' && - !!pl[3]); - } - // pattern like C:/... - // split = ['C:', ...] - // XXX: would be nice to handle patterns like `c:*` to test the cwd - // in c: for *, but I don't know of a way to even figure out what that - // cwd is without actually chdir'ing into it? - /** - * True if the pattern starts with a drive letter on Windows - */ - isDrive() { - const pl = this.#patternList; - return this.#isDrive !== undefined ? - this.#isDrive - : (this.#isDrive = - this.#platform === 'win32' && - this.#index === 0 && - this.length > 1 && - typeof pl[0] === 'string' && - /^[a-z]:$/i.test(pl[0])); - } - // pattern = '/' or '/...' or '/x/...' - // split = ['', ''] or ['', ...] or ['', 'x', ...] - // Drive and UNC both considered absolute on windows - /** - * True if the pattern is rooted on an absolute path - */ - isAbsolute() { - const pl = this.#patternList; - return this.#isAbsolute !== undefined ? - this.#isAbsolute - : (this.#isAbsolute = - (pl[0] === '' && pl.length > 1) || - this.isDrive() || - this.isUNC()); - } - /** - * consume the root of the pattern, and return it - */ - root() { - const p = this.#patternList[0]; - return (typeof p === 'string' && this.isAbsolute() && this.#index === 0) ? - p - : ''; - } - /** - * Check to see if the current globstar pattern is allowed to follow - * a symbolic link. - */ - checkFollowGlobstar() { - return !(this.#index === 0 || - !this.isGlobstar() || - !this.#followGlobstar); - } - /** - * Mark that the current globstar pattern is following a symbolic link - */ - markFollowGlobstar() { - if (this.#index === 0 || !this.isGlobstar() || !this.#followGlobstar) - return false; - this.#followGlobstar = false; - return true; - } -} -exports.Pattern = Pattern; -//# sourceMappingURL=pattern.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/pattern.js.map b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/pattern.js.map deleted file mode 100644 index fc10ea5d6c4ef4..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/pattern.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"pattern.js","sourceRoot":"","sources":["../../src/pattern.ts"],"names":[],"mappings":";AAAA,yEAAyE;;;AAEzE,yCAAoC;AAgBpC,MAAM,aAAa,GAAG,CAAC,EAAe,EAAqB,EAAE,CAC3D,EAAE,CAAC,MAAM,IAAI,CAAC,CAAA;AAChB,MAAM,UAAU,GAAG,CAAC,EAAY,EAAkB,EAAE,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,CAAA;AAEnE;;;GAGG;AACH,MAAa,OAAO;IACT,YAAY,CAAa;IACzB,SAAS,CAAU;IACnB,MAAM,CAAQ;IACd,MAAM,CAAQ;IACd,SAAS,CAAiB;IACnC,KAAK,CAAiB;IACtB,WAAW,CAAS;IACpB,QAAQ,CAAU;IAClB,MAAM,CAAU;IAChB,WAAW,CAAU;IACrB,eAAe,GAAY,IAAI,CAAA;IAE/B,YACE,WAAwB,EACxB,QAAkB,EAClB,KAAa,EACb,QAAyB;QAEzB,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,SAAS,CAAC,oBAAoB,CAAC,CAAA;QAC3C,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAA;QACxC,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,EAAE,CAAC;YAC3C,MAAM,IAAI,SAAS,CAAC,+CAA+C,CAAC,CAAA;QACtE,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAA;QAChC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACtC,MAAM,IAAI,SAAS,CAAC,oBAAoB,CAAC,CAAA;QAC3C,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,WAAW,CAAA;QAC/B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;QACzB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;QAEzB,mEAAmE;QACnE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,gBAAgB;YAChB,iBAAiB;YACjB,uBAAuB;YACvB,oCAAoC;YACpC,qCAAqC;YACrC,2CAA2C;YAC3C,uBAAuB;YACvB,aAAa;YACb,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;gBACjB,6BAA6B;gBAC7B,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,YAAY,CAAA;gBACpD,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAA;gBACjD,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;oBACpB,YAAY;oBACZ,KAAK,CAAC,KAAK,EAAE,CAAA;oBACb,KAAK,CAAC,KAAK,EAAE,CAAA;gBACf,CAAC;gBACD,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACxC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACxC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAA;gBACjC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAA;gBAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAA;YACxC,CAAC;iBAAM,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;gBAC/C,MAAM,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,YAAY,CAAA;gBACxC,MAAM,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAA;gBACrC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;oBACpB,YAAY;oBACZ,KAAK,CAAC,KAAK,EAAE,CAAA;oBACb,KAAK,CAAC,KAAK,EAAE,CAAA;gBACf,CAAC;gBACD,MAAM,CAAC,GAAI,EAAa,GAAG,GAAG,CAAA;gBAC9B,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,CAAA;gBAClB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAA;gBACjC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAA;gBAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAA;YACxC,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAc,CAAA;IACpD,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAA;IAC3D,CAAC;IACD;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,oBAAQ,CAAA;IACpD,CAAC;IACD;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,MAAM,CAAA;IACzD,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,CAAC,IAAI,CAAC,WAAW;YACtB,IAAI,CAAC,WAAW;gBAChB,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;oBAClB,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;wBACjB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;wBACvD,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;oBAC5B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IACnD,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAA;IACtC,CAAC;IAED;;OAEG;IACH,IAAI;QACF,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,KAAK,CAAA;QAC/C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAAE,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAA;QAC/C,IAAI,CAAC,KAAK,GAAG,IAAI,OAAO,CACtB,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,MAAM,GAAG,CAAC,EACf,IAAI,CAAC,SAAS,CACf,CAAA;QACD,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAA;QACzC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QAC/B,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;QACnC,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAA;QAC5B,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;YAC9B,IAAI,CAAC,MAAM;YACb,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM;gBACV,IAAI,CAAC,SAAS,KAAK,OAAO;oBAC1B,IAAI,CAAC,MAAM,KAAK,CAAC;oBACjB,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE;oBACZ,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE;oBACZ,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,QAAQ;oBACzB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBACP,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,QAAQ;oBACzB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAChB,CAAC;IAED,sBAAsB;IACtB,sBAAsB;IACtB,mEAAmE;IACnE,sEAAsE;IACtE,6CAA6C;IAC7C;;OAEG;IACH,OAAO;QACL,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAA;QAC5B,OAAO,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;YAChC,IAAI,CAAC,QAAQ;YACf,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ;gBACZ,IAAI,CAAC,SAAS,KAAK,OAAO;oBAC1B,IAAI,CAAC,MAAM,KAAK,CAAC;oBACjB,IAAI,CAAC,MAAM,GAAG,CAAC;oBACf,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,QAAQ;oBACzB,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAChC,CAAC;IAED,sCAAsC;IACtC,kDAAkD;IAClD,oDAAoD;IACpD;;OAEG;IACH,UAAU;QACR,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAA;QAC5B,OAAO,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC;YACnC,IAAI,CAAC,WAAW;YAClB,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW;gBACf,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;oBAC/B,IAAI,CAAC,OAAO,EAAE;oBACd,IAAI,CAAC,KAAK,EAAE,CAAC,CAAA;IACrB,CAAC;IAED;;OAEG;IACH,IAAI;QACF,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC9B,OAAO,CACH,OAAO,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAChE,CAAC,CAAC;YACD,CAAC;YACH,CAAC,CAAC,EAAE,CAAA;IACR,CAAC;IAED;;;OAGG;IACH,mBAAmB;QACjB,OAAO,CAAC,CACN,IAAI,CAAC,MAAM,KAAK,CAAC;YACjB,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,CAAC,IAAI,CAAC,eAAe,CACtB,CAAA;IACH,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe;YAClE,OAAO,KAAK,CAAA;QACd,IAAI,CAAC,eAAe,GAAG,KAAK,CAAA;QAC5B,OAAO,IAAI,CAAA;IACb,CAAC;CACF;AArOD,0BAqOC","sourcesContent":["// this is just a very light wrapper around 2 arrays with an offset index\n\nimport { GLOBSTAR } from 'minimatch'\nexport type MMPattern = string | RegExp | typeof GLOBSTAR\n\n// an array of length >= 1\nexport type PatternList = [p: MMPattern, ...rest: MMPattern[]]\nexport type UNCPatternList = [\n p0: '',\n p1: '',\n p2: string,\n p3: string,\n ...rest: MMPattern[],\n]\nexport type DrivePatternList = [p0: string, ...rest: MMPattern[]]\nexport type AbsolutePatternList = [p0: '', ...rest: MMPattern[]]\nexport type GlobList = [p: string, ...rest: string[]]\n\nconst isPatternList = (pl: MMPattern[]): pl is PatternList =>\n pl.length >= 1\nconst isGlobList = (gl: string[]): gl is GlobList => gl.length >= 1\n\n/**\n * An immutable-ish view on an array of glob parts and their parsed\n * results\n */\nexport class Pattern {\n readonly #patternList: PatternList\n readonly #globList: GlobList\n readonly #index: number\n readonly length: number\n readonly #platform: NodeJS.Platform\n #rest?: Pattern | null\n #globString?: string\n #isDrive?: boolean\n #isUNC?: boolean\n #isAbsolute?: boolean\n #followGlobstar: boolean = true\n\n constructor(\n patternList: MMPattern[],\n globList: string[],\n index: number,\n platform: NodeJS.Platform,\n ) {\n if (!isPatternList(patternList)) {\n throw new TypeError('empty pattern list')\n }\n if (!isGlobList(globList)) {\n throw new TypeError('empty glob list')\n }\n if (globList.length !== patternList.length) {\n throw new TypeError('mismatched pattern list and glob list lengths')\n }\n this.length = patternList.length\n if (index < 0 || index >= this.length) {\n throw new TypeError('index out of range')\n }\n this.#patternList = patternList\n this.#globList = globList\n this.#index = index\n this.#platform = platform\n\n // normalize root entries of absolute patterns on initial creation.\n if (this.#index === 0) {\n // c: => ['c:/']\n // C:/ => ['C:/']\n // C:/x => ['C:/', 'x']\n // //host/share => ['//host/share/']\n // //host/share/ => ['//host/share/']\n // //host/share/x => ['//host/share/', 'x']\n // /etc => ['/', 'etc']\n // / => ['/']\n if (this.isUNC()) {\n // '' / '' / 'host' / 'share'\n const [p0, p1, p2, p3, ...prest] = this.#patternList\n const [g0, g1, g2, g3, ...grest] = this.#globList\n if (prest[0] === '') {\n // ends in /\n prest.shift()\n grest.shift()\n }\n const p = [p0, p1, p2, p3, ''].join('/')\n const g = [g0, g1, g2, g3, ''].join('/')\n this.#patternList = [p, ...prest]\n this.#globList = [g, ...grest]\n this.length = this.#patternList.length\n } else if (this.isDrive() || this.isAbsolute()) {\n const [p1, ...prest] = this.#patternList\n const [g1, ...grest] = this.#globList\n if (prest[0] === '') {\n // ends in /\n prest.shift()\n grest.shift()\n }\n const p = (p1 as string) + '/'\n const g = g1 + '/'\n this.#patternList = [p, ...prest]\n this.#globList = [g, ...grest]\n this.length = this.#patternList.length\n }\n }\n }\n\n /**\n * The first entry in the parsed list of patterns\n */\n pattern(): MMPattern {\n return this.#patternList[this.#index] as MMPattern\n }\n\n /**\n * true of if pattern() returns a string\n */\n isString(): boolean {\n return typeof this.#patternList[this.#index] === 'string'\n }\n /**\n * true of if pattern() returns GLOBSTAR\n */\n isGlobstar(): boolean {\n return this.#patternList[this.#index] === GLOBSTAR\n }\n /**\n * true if pattern() returns a regexp\n */\n isRegExp(): boolean {\n return this.#patternList[this.#index] instanceof RegExp\n }\n\n /**\n * The /-joined set of glob parts that make up this pattern\n */\n globString(): string {\n return (this.#globString =\n this.#globString ||\n (this.#index === 0 ?\n this.isAbsolute() ?\n this.#globList[0] + this.#globList.slice(1).join('/')\n : this.#globList.join('/')\n : this.#globList.slice(this.#index).join('/')))\n }\n\n /**\n * true if there are more pattern parts after this one\n */\n hasMore(): boolean {\n return this.length > this.#index + 1\n }\n\n /**\n * The rest of the pattern after this part, or null if this is the end\n */\n rest(): Pattern | null {\n if (this.#rest !== undefined) return this.#rest\n if (!this.hasMore()) return (this.#rest = null)\n this.#rest = new Pattern(\n this.#patternList,\n this.#globList,\n this.#index + 1,\n this.#platform,\n )\n this.#rest.#isAbsolute = this.#isAbsolute\n this.#rest.#isUNC = this.#isUNC\n this.#rest.#isDrive = this.#isDrive\n return this.#rest\n }\n\n /**\n * true if the pattern represents a //unc/path/ on windows\n */\n isUNC(): boolean {\n const pl = this.#patternList\n return this.#isUNC !== undefined ?\n this.#isUNC\n : (this.#isUNC =\n this.#platform === 'win32' &&\n this.#index === 0 &&\n pl[0] === '' &&\n pl[1] === '' &&\n typeof pl[2] === 'string' &&\n !!pl[2] &&\n typeof pl[3] === 'string' &&\n !!pl[3])\n }\n\n // pattern like C:/...\n // split = ['C:', ...]\n // XXX: would be nice to handle patterns like `c:*` to test the cwd\n // in c: for *, but I don't know of a way to even figure out what that\n // cwd is without actually chdir'ing into it?\n /**\n * True if the pattern starts with a drive letter on Windows\n */\n isDrive(): boolean {\n const pl = this.#patternList\n return this.#isDrive !== undefined ?\n this.#isDrive\n : (this.#isDrive =\n this.#platform === 'win32' &&\n this.#index === 0 &&\n this.length > 1 &&\n typeof pl[0] === 'string' &&\n /^[a-z]:$/i.test(pl[0]))\n }\n\n // pattern = '/' or '/...' or '/x/...'\n // split = ['', ''] or ['', ...] or ['', 'x', ...]\n // Drive and UNC both considered absolute on windows\n /**\n * True if the pattern is rooted on an absolute path\n */\n isAbsolute(): boolean {\n const pl = this.#patternList\n return this.#isAbsolute !== undefined ?\n this.#isAbsolute\n : (this.#isAbsolute =\n (pl[0] === '' && pl.length > 1) ||\n this.isDrive() ||\n this.isUNC())\n }\n\n /**\n * consume the root of the pattern, and return it\n */\n root(): string {\n const p = this.#patternList[0]\n return (\n typeof p === 'string' && this.isAbsolute() && this.#index === 0\n ) ?\n p\n : ''\n }\n\n /**\n * Check to see if the current globstar pattern is allowed to follow\n * a symbolic link.\n */\n checkFollowGlobstar(): boolean {\n return !(\n this.#index === 0 ||\n !this.isGlobstar() ||\n !this.#followGlobstar\n )\n }\n\n /**\n * Mark that the current globstar pattern is following a symbolic link\n */\n markFollowGlobstar(): boolean {\n if (this.#index === 0 || !this.isGlobstar() || !this.#followGlobstar)\n return false\n this.#followGlobstar = false\n return true\n }\n}\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/processor.d.ts b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/processor.d.ts deleted file mode 100644 index ccedfbf2820f7d..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/processor.d.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { MMRegExp } from 'minimatch'; -import { Path } from 'path-scurry'; -import { Pattern } from './pattern.js'; -import { GlobWalkerOpts } from './walker.js'; -/** - * A cache of which patterns have been processed for a given Path - */ -export declare class HasWalkedCache { - store: Map>; - constructor(store?: Map>); - copy(): HasWalkedCache; - hasWalked(target: Path, pattern: Pattern): boolean | undefined; - storeWalked(target: Path, pattern: Pattern): void; -} -/** - * A record of which paths have been matched in a given walk step, - * and whether they only are considered a match if they are a directory, - * and whether their absolute or relative path should be returned. - */ -export declare class MatchRecord { - store: Map; - add(target: Path, absolute: boolean, ifDir: boolean): void; - entries(): [Path, boolean, boolean][]; -} -/** - * A collection of patterns that must be processed in a subsequent step - * for a given path. - */ -export declare class SubWalks { - store: Map; - add(target: Path, pattern: Pattern): void; - get(target: Path): Pattern[]; - entries(): [Path, Pattern[]][]; - keys(): Path[]; -} -/** - * The class that processes patterns for a given path. - * - * Handles child entry filtering, and determining whether a path's - * directory contents must be read. - */ -export declare class Processor { - hasWalkedCache: HasWalkedCache; - matches: MatchRecord; - subwalks: SubWalks; - patterns?: Pattern[]; - follow: boolean; - dot: boolean; - opts: GlobWalkerOpts; - constructor(opts: GlobWalkerOpts, hasWalkedCache?: HasWalkedCache); - processPatterns(target: Path, patterns: Pattern[]): this; - subwalkTargets(): Path[]; - child(): Processor; - filterEntries(parent: Path, entries: Path[]): Processor; - testGlobstar(e: Path, pattern: Pattern, rest: Pattern | null, absolute: boolean): void; - testRegExp(e: Path, p: MMRegExp, rest: Pattern | null, absolute: boolean): void; - testString(e: Path, p: string, rest: Pattern | null, absolute: boolean): void; -} -//# sourceMappingURL=processor.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/processor.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/processor.d.ts.map deleted file mode 100644 index aa266fee4a0544..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/processor.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"processor.d.ts","sourceRoot":"","sources":["../../src/processor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAY,QAAQ,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAa,OAAO,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C;;GAEG;AACH,qBAAa,cAAc;IACzB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;gBACnB,KAAK,GAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;IAGvD,IAAI;IAGJ,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO;IAGxC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO;CAM3C;AAED;;;;GAIG;AACH,qBAAa,WAAW;IACtB,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAY;IACpC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO;IAMnD,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE;CAOtC;AAED;;;GAGG;AACH,qBAAa,QAAQ;IACnB,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAY;IACvC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO;IAWlC,GAAG,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,EAAE;IAS5B,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE;IAG9B,IAAI,IAAI,IAAI,EAAE;CAGf;AAED;;;;;GAKG;AACH,qBAAa,SAAS;IACpB,cAAc,EAAE,cAAc,CAAA;IAC9B,OAAO,cAAoB;IAC3B,QAAQ,WAAiB;IACzB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;IACpB,MAAM,EAAE,OAAO,CAAA;IACf,GAAG,EAAE,OAAO,CAAA;IACZ,IAAI,EAAE,cAAc,CAAA;gBAER,IAAI,EAAE,cAAc,EAAE,cAAc,CAAC,EAAE,cAAc;IAQjE,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE;IAmGjD,cAAc,IAAI,IAAI,EAAE;IAIxB,KAAK;IAQL,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,SAAS;IAqBvD,YAAY,CACV,CAAC,EAAE,IAAI,EACP,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,OAAO,GAAG,IAAI,EACpB,QAAQ,EAAE,OAAO;IA8CnB,UAAU,CACR,CAAC,EAAE,IAAI,EACP,CAAC,EAAE,QAAQ,EACX,IAAI,EAAE,OAAO,GAAG,IAAI,EACpB,QAAQ,EAAE,OAAO;IAUnB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,EAAE,QAAQ,EAAE,OAAO;CASvE"} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/processor.js b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/processor.js deleted file mode 100644 index ee3bb4397e0b2d..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/processor.js +++ /dev/null @@ -1,301 +0,0 @@ -"use strict"; -// synchronous utility for filtering entries and calculating subwalks -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Processor = exports.SubWalks = exports.MatchRecord = exports.HasWalkedCache = void 0; -const minimatch_1 = require("minimatch"); -/** - * A cache of which patterns have been processed for a given Path - */ -class HasWalkedCache { - store; - constructor(store = new Map()) { - this.store = store; - } - copy() { - return new HasWalkedCache(new Map(this.store)); - } - hasWalked(target, pattern) { - return this.store.get(target.fullpath())?.has(pattern.globString()); - } - storeWalked(target, pattern) { - const fullpath = target.fullpath(); - const cached = this.store.get(fullpath); - if (cached) - cached.add(pattern.globString()); - else - this.store.set(fullpath, new Set([pattern.globString()])); - } -} -exports.HasWalkedCache = HasWalkedCache; -/** - * A record of which paths have been matched in a given walk step, - * and whether they only are considered a match if they are a directory, - * and whether their absolute or relative path should be returned. - */ -class MatchRecord { - store = new Map(); - add(target, absolute, ifDir) { - const n = (absolute ? 2 : 0) | (ifDir ? 1 : 0); - const current = this.store.get(target); - this.store.set(target, current === undefined ? n : n & current); - } - // match, absolute, ifdir - entries() { - return [...this.store.entries()].map(([path, n]) => [ - path, - !!(n & 2), - !!(n & 1), - ]); - } -} -exports.MatchRecord = MatchRecord; -/** - * A collection of patterns that must be processed in a subsequent step - * for a given path. - */ -class SubWalks { - store = new Map(); - add(target, pattern) { - if (!target.canReaddir()) { - return; - } - const subs = this.store.get(target); - if (subs) { - if (!subs.find(p => p.globString() === pattern.globString())) { - subs.push(pattern); - } - } - else - this.store.set(target, [pattern]); - } - get(target) { - const subs = this.store.get(target); - /* c8 ignore start */ - if (!subs) { - throw new Error('attempting to walk unknown path'); - } - /* c8 ignore stop */ - return subs; - } - entries() { - return this.keys().map(k => [k, this.store.get(k)]); - } - keys() { - return [...this.store.keys()].filter(t => t.canReaddir()); - } -} -exports.SubWalks = SubWalks; -/** - * The class that processes patterns for a given path. - * - * Handles child entry filtering, and determining whether a path's - * directory contents must be read. - */ -class Processor { - hasWalkedCache; - matches = new MatchRecord(); - subwalks = new SubWalks(); - patterns; - follow; - dot; - opts; - constructor(opts, hasWalkedCache) { - this.opts = opts; - this.follow = !!opts.follow; - this.dot = !!opts.dot; - this.hasWalkedCache = - hasWalkedCache ? hasWalkedCache.copy() : new HasWalkedCache(); - } - processPatterns(target, patterns) { - this.patterns = patterns; - const processingSet = patterns.map(p => [target, p]); - // map of paths to the magic-starting subwalks they need to walk - // first item in patterns is the filter - for (let [t, pattern] of processingSet) { - this.hasWalkedCache.storeWalked(t, pattern); - const root = pattern.root(); - const absolute = pattern.isAbsolute() && this.opts.absolute !== false; - // start absolute patterns at root - if (root) { - t = t.resolve(root === '/' && this.opts.root !== undefined ? - this.opts.root - : root); - const rest = pattern.rest(); - if (!rest) { - this.matches.add(t, true, false); - continue; - } - else { - pattern = rest; - } - } - if (t.isENOENT()) - continue; - let p; - let rest; - let changed = false; - while (typeof (p = pattern.pattern()) === 'string' && - (rest = pattern.rest())) { - const c = t.resolve(p); - t = c; - pattern = rest; - changed = true; - } - p = pattern.pattern(); - rest = pattern.rest(); - if (changed) { - if (this.hasWalkedCache.hasWalked(t, pattern)) - continue; - this.hasWalkedCache.storeWalked(t, pattern); - } - // now we have either a final string for a known entry, - // more strings for an unknown entry, - // or a pattern starting with magic, mounted on t. - if (typeof p === 'string') { - // must not be final entry, otherwise we would have - // concatenated it earlier. - const ifDir = p === '..' || p === '' || p === '.'; - this.matches.add(t.resolve(p), absolute, ifDir); - continue; - } - else if (p === minimatch_1.GLOBSTAR) { - // if no rest, match and subwalk pattern - // if rest, process rest and subwalk pattern - // if it's a symlink, but we didn't get here by way of a - // globstar match (meaning it's the first time THIS globstar - // has traversed a symlink), then we follow it. Otherwise, stop. - if (!t.isSymbolicLink() || - this.follow || - pattern.checkFollowGlobstar()) { - this.subwalks.add(t, pattern); - } - const rp = rest?.pattern(); - const rrest = rest?.rest(); - if (!rest || ((rp === '' || rp === '.') && !rrest)) { - // only HAS to be a dir if it ends in **/ or **/. - // but ending in ** will match files as well. - this.matches.add(t, absolute, rp === '' || rp === '.'); - } - else { - if (rp === '..') { - // this would mean you're matching **/.. at the fs root, - // and no thanks, I'm not gonna test that specific case. - /* c8 ignore start */ - const tp = t.parent || t; - /* c8 ignore stop */ - if (!rrest) - this.matches.add(tp, absolute, true); - else if (!this.hasWalkedCache.hasWalked(tp, rrest)) { - this.subwalks.add(tp, rrest); - } - } - } - } - else if (p instanceof RegExp) { - this.subwalks.add(t, pattern); - } - } - return this; - } - subwalkTargets() { - return this.subwalks.keys(); - } - child() { - return new Processor(this.opts, this.hasWalkedCache); - } - // return a new Processor containing the subwalks for each - // child entry, and a set of matches, and - // a hasWalkedCache that's a copy of this one - // then we're going to call - filterEntries(parent, entries) { - const patterns = this.subwalks.get(parent); - // put matches and entry walks into the results processor - const results = this.child(); - for (const e of entries) { - for (const pattern of patterns) { - const absolute = pattern.isAbsolute(); - const p = pattern.pattern(); - const rest = pattern.rest(); - if (p === minimatch_1.GLOBSTAR) { - results.testGlobstar(e, pattern, rest, absolute); - } - else if (p instanceof RegExp) { - results.testRegExp(e, p, rest, absolute); - } - else { - results.testString(e, p, rest, absolute); - } - } - } - return results; - } - testGlobstar(e, pattern, rest, absolute) { - if (this.dot || !e.name.startsWith('.')) { - if (!pattern.hasMore()) { - this.matches.add(e, absolute, false); - } - if (e.canReaddir()) { - // if we're in follow mode or it's not a symlink, just keep - // testing the same pattern. If there's more after the globstar, - // then this symlink consumes the globstar. If not, then we can - // follow at most ONE symlink along the way, so we mark it, which - // also checks to ensure that it wasn't already marked. - if (this.follow || !e.isSymbolicLink()) { - this.subwalks.add(e, pattern); - } - else if (e.isSymbolicLink()) { - if (rest && pattern.checkFollowGlobstar()) { - this.subwalks.add(e, rest); - } - else if (pattern.markFollowGlobstar()) { - this.subwalks.add(e, pattern); - } - } - } - } - // if the NEXT thing matches this entry, then also add - // the rest. - if (rest) { - const rp = rest.pattern(); - if (typeof rp === 'string' && - // dots and empty were handled already - rp !== '..' && - rp !== '' && - rp !== '.') { - this.testString(e, rp, rest.rest(), absolute); - } - else if (rp === '..') { - /* c8 ignore start */ - const ep = e.parent || e; - /* c8 ignore stop */ - this.subwalks.add(ep, rest); - } - else if (rp instanceof RegExp) { - this.testRegExp(e, rp, rest.rest(), absolute); - } - } - } - testRegExp(e, p, rest, absolute) { - if (!p.test(e.name)) - return; - if (!rest) { - this.matches.add(e, absolute, false); - } - else { - this.subwalks.add(e, rest); - } - } - testString(e, p, rest, absolute) { - // should never happen? - if (!e.isNamed(p)) - return; - if (!rest) { - this.matches.add(e, absolute, false); - } - else { - this.subwalks.add(e, rest); - } - } -} -exports.Processor = Processor; -//# sourceMappingURL=processor.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/processor.js.map b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/processor.js.map deleted file mode 100644 index 58a70882e9462f..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/processor.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"processor.js","sourceRoot":"","sources":["../../src/processor.ts"],"names":[],"mappings":";AAAA,qEAAqE;;;AAErE,yCAA8C;AAK9C;;GAEG;AACH,MAAa,cAAc;IACzB,KAAK,CAA0B;IAC/B,YAAY,QAAkC,IAAI,GAAG,EAAE;QACrD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;IACD,IAAI;QACF,OAAO,IAAI,cAAc,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;IAChD,CAAC;IACD,SAAS,CAAC,MAAY,EAAE,OAAgB;QACtC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAA;IACrE,CAAC;IACD,WAAW,CAAC,MAAY,EAAE,OAAgB;QACxC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAA;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACvC,IAAI,MAAM;YAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAA;;YACvC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAA;IAChE,CAAC;CACF;AAjBD,wCAiBC;AAED;;;;GAIG;AACH,MAAa,WAAW;IACtB,KAAK,GAAsB,IAAI,GAAG,EAAE,CAAA;IACpC,GAAG,CAAC,MAAY,EAAE,QAAiB,EAAE,KAAc;QACjD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACtC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAA;IACjE,CAAC;IACD,yBAAyB;IACzB,OAAO;QACL,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YAClD,IAAI;YACJ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACT,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;SACV,CAAC,CAAA;IACJ,CAAC;CACF;AAfD,kCAeC;AAED;;;GAGG;AACH,MAAa,QAAQ;IACnB,KAAK,GAAyB,IAAI,GAAG,EAAE,CAAA;IACvC,GAAG,CAAC,MAAY,EAAE,OAAgB;QAChC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;YACzB,OAAM;QACR,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACnC,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC;gBAC7D,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACpB,CAAC;QACH,CAAC;;YAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;IAC1C,CAAC;IACD,GAAG,CAAC,MAAY;QACd,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACnC,qBAAqB;QACrB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;QACpD,CAAC;QACD,oBAAoB;QACpB,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAc,CAAC,CAAC,CAAA;IAClE,CAAC;IACD,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAA;IAC3D,CAAC;CACF;AA5BD,4BA4BC;AAED;;;;;GAKG;AACH,MAAa,SAAS;IACpB,cAAc,CAAgB;IAC9B,OAAO,GAAG,IAAI,WAAW,EAAE,CAAA;IAC3B,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAA;IACzB,QAAQ,CAAY;IACpB,MAAM,CAAS;IACf,GAAG,CAAS;IACZ,IAAI,CAAgB;IAEpB,YAAY,IAAoB,EAAE,cAA+B;QAC/D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAA;QAC3B,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAA;QACrB,IAAI,CAAC,cAAc;YACjB,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,cAAc,EAAE,CAAA;IACjE,CAAC;IAED,eAAe,CAAC,MAAY,EAAE,QAAmB;QAC/C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,MAAM,aAAa,GAAsB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;QAEvE,gEAAgE;QAChE,uCAAuC;QAEvC,KAAK,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,aAAa,EAAE,CAAC;YACvC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;YAE3C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;YAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAA;YAErE,kCAAkC;YAClC,IAAI,IAAI,EAAE,CAAC;gBACT,CAAC,GAAG,CAAC,CAAC,OAAO,CACX,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;oBAC5C,IAAI,CAAC,IAAI,CAAC,IAAI;oBAChB,CAAC,CAAC,IAAI,CACP,CAAA;gBACD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;gBAC3B,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;oBAChC,SAAQ;gBACV,CAAC;qBAAM,CAAC;oBACN,OAAO,GAAG,IAAI,CAAA;gBAChB,CAAC;YACH,CAAC;YAED,IAAI,CAAC,CAAC,QAAQ,EAAE;gBAAE,SAAQ;YAE1B,IAAI,CAAY,CAAA;YAChB,IAAI,IAAoB,CAAA;YACxB,IAAI,OAAO,GAAG,KAAK,CAAA;YACnB,OACE,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,QAAQ;gBAC3C,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EACvB,CAAC;gBACD,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;gBACtB,CAAC,GAAG,CAAC,CAAA;gBACL,OAAO,GAAG,IAAI,CAAA;gBACd,OAAO,GAAG,IAAI,CAAA;YAChB,CAAC;YACD,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAA;YACrB,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;YACrB,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC;oBAAE,SAAQ;gBACvD,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;YAC7C,CAAC;YAED,uDAAuD;YACvD,qCAAqC;YACrC,kDAAkD;YAClD,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAC1B,mDAAmD;gBACnD,2BAA2B;gBAC3B,MAAM,KAAK,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,CAAA;gBACjD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;gBAC/C,SAAQ;YACV,CAAC;iBAAM,IAAI,CAAC,KAAK,oBAAQ,EAAE,CAAC;gBAC1B,wCAAwC;gBACxC,4CAA4C;gBAC5C,wDAAwD;gBACxD,4DAA4D;gBAC5D,gEAAgE;gBAChE,IACE,CAAC,CAAC,CAAC,cAAc,EAAE;oBACnB,IAAI,CAAC,MAAM;oBACX,OAAO,CAAC,mBAAmB,EAAE,EAC7B,CAAC;oBACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;gBAC/B,CAAC;gBACD,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAA;gBAC1B,MAAM,KAAK,GAAG,IAAI,EAAE,IAAI,EAAE,CAAA;gBAC1B,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBACnD,iDAAiD;oBACjD,6CAA6C;oBAC7C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,CAAA;gBACxD,CAAC;qBAAM,CAAC;oBACN,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;wBAChB,wDAAwD;wBACxD,wDAAwD;wBACxD,qBAAqB;wBACrB,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAA;wBACxB,oBAAoB;wBACpB,IAAI,CAAC,KAAK;4BAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;6BAC3C,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC;4BACnD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;wBAC9B,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,IAAI,CAAC,YAAY,MAAM,EAAE,CAAC;gBAC/B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;YAC/B,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC7B,CAAC;IAED,KAAK;QACH,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,CAAA;IACtD,CAAC;IAED,0DAA0D;IAC1D,yCAAyC;IACzC,6CAA6C;IAC7C,2BAA2B;IAC3B,aAAa,CAAC,MAAY,EAAE,OAAe;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAC1C,yDAAyD;QACzD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;QAC5B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,EAAE,CAAA;gBACrC,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAA;gBAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;gBAC3B,IAAI,CAAC,KAAK,oBAAQ,EAAE,CAAC;oBACnB,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;gBAClD,CAAC;qBAAM,IAAI,CAAC,YAAY,MAAM,EAAE,CAAC;oBAC/B,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;gBAC1C,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;gBAC1C,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,YAAY,CACV,CAAO,EACP,OAAgB,EAChB,IAAoB,EACpB,QAAiB;QAEjB,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;gBACvB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;YACtC,CAAC;YACD,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC;gBACnB,2DAA2D;gBAC3D,gEAAgE;gBAChE,+DAA+D;gBAC/D,iEAAiE;gBACjE,uDAAuD;gBACvD,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC;oBACvC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;gBAC/B,CAAC;qBAAM,IAAI,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC;oBAC9B,IAAI,IAAI,IAAI,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC;wBAC1C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;oBAC5B,CAAC;yBAAM,IAAI,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;wBACxC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;oBAC/B,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,sDAAsD;QACtD,YAAY;QACZ,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;YACzB,IACE,OAAO,EAAE,KAAK,QAAQ;gBACtB,sCAAsC;gBACtC,EAAE,KAAK,IAAI;gBACX,EAAE,KAAK,EAAE;gBACT,EAAE,KAAK,GAAG,EACV,CAAC;gBACD,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAA;YAC/C,CAAC;iBAAM,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;gBACvB,qBAAqB;gBACrB,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAA;gBACxB,oBAAoB;gBACpB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;YAC7B,CAAC;iBAAM,IAAI,EAAE,YAAY,MAAM,EAAE,CAAC;gBAChC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAA;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;IAED,UAAU,CACR,CAAO,EACP,CAAW,EACX,IAAoB,EACpB,QAAiB;QAEjB,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,OAAM;QAC3B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;QACtC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QAC5B,CAAC;IACH,CAAC;IAED,UAAU,CAAC,CAAO,EAAE,CAAS,EAAE,IAAoB,EAAE,QAAiB;QACpE,uBAAuB;QACvB,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YAAE,OAAM;QACzB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;QACtC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QAC5B,CAAC;IACH,CAAC;CACF;AA9ND,8BA8NC","sourcesContent":["// synchronous utility for filtering entries and calculating subwalks\n\nimport { GLOBSTAR, MMRegExp } from 'minimatch'\nimport { Path } from 'path-scurry'\nimport { MMPattern, Pattern } from './pattern.js'\nimport { GlobWalkerOpts } from './walker.js'\n\n/**\n * A cache of which patterns have been processed for a given Path\n */\nexport class HasWalkedCache {\n store: Map>\n constructor(store: Map> = new Map()) {\n this.store = store\n }\n copy() {\n return new HasWalkedCache(new Map(this.store))\n }\n hasWalked(target: Path, pattern: Pattern) {\n return this.store.get(target.fullpath())?.has(pattern.globString())\n }\n storeWalked(target: Path, pattern: Pattern) {\n const fullpath = target.fullpath()\n const cached = this.store.get(fullpath)\n if (cached) cached.add(pattern.globString())\n else this.store.set(fullpath, new Set([pattern.globString()]))\n }\n}\n\n/**\n * A record of which paths have been matched in a given walk step,\n * and whether they only are considered a match if they are a directory,\n * and whether their absolute or relative path should be returned.\n */\nexport class MatchRecord {\n store: Map = new Map()\n add(target: Path, absolute: boolean, ifDir: boolean) {\n const n = (absolute ? 2 : 0) | (ifDir ? 1 : 0)\n const current = this.store.get(target)\n this.store.set(target, current === undefined ? n : n & current)\n }\n // match, absolute, ifdir\n entries(): [Path, boolean, boolean][] {\n return [...this.store.entries()].map(([path, n]) => [\n path,\n !!(n & 2),\n !!(n & 1),\n ])\n }\n}\n\n/**\n * A collection of patterns that must be processed in a subsequent step\n * for a given path.\n */\nexport class SubWalks {\n store: Map = new Map()\n add(target: Path, pattern: Pattern) {\n if (!target.canReaddir()) {\n return\n }\n const subs = this.store.get(target)\n if (subs) {\n if (!subs.find(p => p.globString() === pattern.globString())) {\n subs.push(pattern)\n }\n } else this.store.set(target, [pattern])\n }\n get(target: Path): Pattern[] {\n const subs = this.store.get(target)\n /* c8 ignore start */\n if (!subs) {\n throw new Error('attempting to walk unknown path')\n }\n /* c8 ignore stop */\n return subs\n }\n entries(): [Path, Pattern[]][] {\n return this.keys().map(k => [k, this.store.get(k) as Pattern[]])\n }\n keys(): Path[] {\n return [...this.store.keys()].filter(t => t.canReaddir())\n }\n}\n\n/**\n * The class that processes patterns for a given path.\n *\n * Handles child entry filtering, and determining whether a path's\n * directory contents must be read.\n */\nexport class Processor {\n hasWalkedCache: HasWalkedCache\n matches = new MatchRecord()\n subwalks = new SubWalks()\n patterns?: Pattern[]\n follow: boolean\n dot: boolean\n opts: GlobWalkerOpts\n\n constructor(opts: GlobWalkerOpts, hasWalkedCache?: HasWalkedCache) {\n this.opts = opts\n this.follow = !!opts.follow\n this.dot = !!opts.dot\n this.hasWalkedCache =\n hasWalkedCache ? hasWalkedCache.copy() : new HasWalkedCache()\n }\n\n processPatterns(target: Path, patterns: Pattern[]) {\n this.patterns = patterns\n const processingSet: [Path, Pattern][] = patterns.map(p => [target, p])\n\n // map of paths to the magic-starting subwalks they need to walk\n // first item in patterns is the filter\n\n for (let [t, pattern] of processingSet) {\n this.hasWalkedCache.storeWalked(t, pattern)\n\n const root = pattern.root()\n const absolute = pattern.isAbsolute() && this.opts.absolute !== false\n\n // start absolute patterns at root\n if (root) {\n t = t.resolve(\n root === '/' && this.opts.root !== undefined ?\n this.opts.root\n : root,\n )\n const rest = pattern.rest()\n if (!rest) {\n this.matches.add(t, true, false)\n continue\n } else {\n pattern = rest\n }\n }\n\n if (t.isENOENT()) continue\n\n let p: MMPattern\n let rest: Pattern | null\n let changed = false\n while (\n typeof (p = pattern.pattern()) === 'string' &&\n (rest = pattern.rest())\n ) {\n const c = t.resolve(p)\n t = c\n pattern = rest\n changed = true\n }\n p = pattern.pattern()\n rest = pattern.rest()\n if (changed) {\n if (this.hasWalkedCache.hasWalked(t, pattern)) continue\n this.hasWalkedCache.storeWalked(t, pattern)\n }\n\n // now we have either a final string for a known entry,\n // more strings for an unknown entry,\n // or a pattern starting with magic, mounted on t.\n if (typeof p === 'string') {\n // must not be final entry, otherwise we would have\n // concatenated it earlier.\n const ifDir = p === '..' || p === '' || p === '.'\n this.matches.add(t.resolve(p), absolute, ifDir)\n continue\n } else if (p === GLOBSTAR) {\n // if no rest, match and subwalk pattern\n // if rest, process rest and subwalk pattern\n // if it's a symlink, but we didn't get here by way of a\n // globstar match (meaning it's the first time THIS globstar\n // has traversed a symlink), then we follow it. Otherwise, stop.\n if (\n !t.isSymbolicLink() ||\n this.follow ||\n pattern.checkFollowGlobstar()\n ) {\n this.subwalks.add(t, pattern)\n }\n const rp = rest?.pattern()\n const rrest = rest?.rest()\n if (!rest || ((rp === '' || rp === '.') && !rrest)) {\n // only HAS to be a dir if it ends in **/ or **/.\n // but ending in ** will match files as well.\n this.matches.add(t, absolute, rp === '' || rp === '.')\n } else {\n if (rp === '..') {\n // this would mean you're matching **/.. at the fs root,\n // and no thanks, I'm not gonna test that specific case.\n /* c8 ignore start */\n const tp = t.parent || t\n /* c8 ignore stop */\n if (!rrest) this.matches.add(tp, absolute, true)\n else if (!this.hasWalkedCache.hasWalked(tp, rrest)) {\n this.subwalks.add(tp, rrest)\n }\n }\n }\n } else if (p instanceof RegExp) {\n this.subwalks.add(t, pattern)\n }\n }\n\n return this\n }\n\n subwalkTargets(): Path[] {\n return this.subwalks.keys()\n }\n\n child() {\n return new Processor(this.opts, this.hasWalkedCache)\n }\n\n // return a new Processor containing the subwalks for each\n // child entry, and a set of matches, and\n // a hasWalkedCache that's a copy of this one\n // then we're going to call\n filterEntries(parent: Path, entries: Path[]): Processor {\n const patterns = this.subwalks.get(parent)\n // put matches and entry walks into the results processor\n const results = this.child()\n for (const e of entries) {\n for (const pattern of patterns) {\n const absolute = pattern.isAbsolute()\n const p = pattern.pattern()\n const rest = pattern.rest()\n if (p === GLOBSTAR) {\n results.testGlobstar(e, pattern, rest, absolute)\n } else if (p instanceof RegExp) {\n results.testRegExp(e, p, rest, absolute)\n } else {\n results.testString(e, p, rest, absolute)\n }\n }\n }\n return results\n }\n\n testGlobstar(\n e: Path,\n pattern: Pattern,\n rest: Pattern | null,\n absolute: boolean,\n ) {\n if (this.dot || !e.name.startsWith('.')) {\n if (!pattern.hasMore()) {\n this.matches.add(e, absolute, false)\n }\n if (e.canReaddir()) {\n // if we're in follow mode or it's not a symlink, just keep\n // testing the same pattern. If there's more after the globstar,\n // then this symlink consumes the globstar. If not, then we can\n // follow at most ONE symlink along the way, so we mark it, which\n // also checks to ensure that it wasn't already marked.\n if (this.follow || !e.isSymbolicLink()) {\n this.subwalks.add(e, pattern)\n } else if (e.isSymbolicLink()) {\n if (rest && pattern.checkFollowGlobstar()) {\n this.subwalks.add(e, rest)\n } else if (pattern.markFollowGlobstar()) {\n this.subwalks.add(e, pattern)\n }\n }\n }\n }\n // if the NEXT thing matches this entry, then also add\n // the rest.\n if (rest) {\n const rp = rest.pattern()\n if (\n typeof rp === 'string' &&\n // dots and empty were handled already\n rp !== '..' &&\n rp !== '' &&\n rp !== '.'\n ) {\n this.testString(e, rp, rest.rest(), absolute)\n } else if (rp === '..') {\n /* c8 ignore start */\n const ep = e.parent || e\n /* c8 ignore stop */\n this.subwalks.add(ep, rest)\n } else if (rp instanceof RegExp) {\n this.testRegExp(e, rp, rest.rest(), absolute)\n }\n }\n }\n\n testRegExp(\n e: Path,\n p: MMRegExp,\n rest: Pattern | null,\n absolute: boolean,\n ) {\n if (!p.test(e.name)) return\n if (!rest) {\n this.matches.add(e, absolute, false)\n } else {\n this.subwalks.add(e, rest)\n }\n }\n\n testString(e: Path, p: string, rest: Pattern | null, absolute: boolean) {\n // should never happen?\n if (!e.isNamed(p)) return\n if (!rest) {\n this.matches.add(e, absolute, false)\n } else {\n this.subwalks.add(e, rest)\n }\n }\n}\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/walker.d.ts b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/walker.d.ts deleted file mode 100644 index 499c8f4933857a..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/walker.d.ts +++ /dev/null @@ -1,97 +0,0 @@ -/** - * Single-use utility classes to provide functionality to the {@link Glob} - * methods. - * - * @module - */ -import { Minipass } from 'minipass'; -import { Path } from 'path-scurry'; -import { IgnoreLike } from './ignore.js'; -import { Pattern } from './pattern.js'; -import { Processor } from './processor.js'; -export interface GlobWalkerOpts { - absolute?: boolean; - allowWindowsEscape?: boolean; - cwd?: string | URL; - dot?: boolean; - dotRelative?: boolean; - follow?: boolean; - ignore?: string | string[] | IgnoreLike; - mark?: boolean; - matchBase?: boolean; - maxDepth?: number; - nobrace?: boolean; - nocase?: boolean; - nodir?: boolean; - noext?: boolean; - noglobstar?: boolean; - platform?: NodeJS.Platform; - posix?: boolean; - realpath?: boolean; - root?: string; - stat?: boolean; - signal?: AbortSignal; - windowsPathsNoEscape?: boolean; - withFileTypes?: boolean; - includeChildMatches?: boolean; -} -export type GWOFileTypesTrue = GlobWalkerOpts & { - withFileTypes: true; -}; -export type GWOFileTypesFalse = GlobWalkerOpts & { - withFileTypes: false; -}; -export type GWOFileTypesUnset = GlobWalkerOpts & { - withFileTypes?: undefined; -}; -export type Result = O extends GWOFileTypesTrue ? Path : O extends GWOFileTypesFalse ? string : O extends GWOFileTypesUnset ? string : Path | string; -export type Matches = O extends GWOFileTypesTrue ? Set : O extends GWOFileTypesFalse ? Set : O extends GWOFileTypesUnset ? Set : Set; -export type MatchStream = Minipass, Result>; -/** - * basic walking utilities that all the glob walker types use - */ -export declare abstract class GlobUtil { - #private; - path: Path; - patterns: Pattern[]; - opts: O; - seen: Set; - paused: boolean; - aborted: boolean; - signal?: AbortSignal; - maxDepth: number; - includeChildMatches: boolean; - constructor(patterns: Pattern[], path: Path, opts: O); - pause(): void; - resume(): void; - onResume(fn: () => any): void; - matchCheck(e: Path, ifDir: boolean): Promise; - matchCheckTest(e: Path | undefined, ifDir: boolean): Path | undefined; - matchCheckSync(e: Path, ifDir: boolean): Path | undefined; - abstract matchEmit(p: Result): void; - abstract matchEmit(p: string | Path): void; - matchFinish(e: Path, absolute: boolean): void; - match(e: Path, absolute: boolean, ifDir: boolean): Promise; - matchSync(e: Path, absolute: boolean, ifDir: boolean): void; - walkCB(target: Path, patterns: Pattern[], cb: () => any): void; - walkCB2(target: Path, patterns: Pattern[], processor: Processor, cb: () => any): any; - walkCB3(target: Path, entries: Path[], processor: Processor, cb: () => any): void; - walkCBSync(target: Path, patterns: Pattern[], cb: () => any): void; - walkCB2Sync(target: Path, patterns: Pattern[], processor: Processor, cb: () => any): any; - walkCB3Sync(target: Path, entries: Path[], processor: Processor, cb: () => any): void; -} -export declare class GlobWalker extends GlobUtil { - matches: Set>; - constructor(patterns: Pattern[], path: Path, opts: O); - matchEmit(e: Result): void; - walk(): Promise>>; - walkSync(): Set>; -} -export declare class GlobStream extends GlobUtil { - results: Minipass, Result>; - constructor(patterns: Pattern[], path: Path, opts: O); - matchEmit(e: Result): void; - stream(): MatchStream; - streamSync(): MatchStream; -} -//# sourceMappingURL=walker.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/walker.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/walker.d.ts.map deleted file mode 100644 index 769957bd59bb1c..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/walker.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"walker.d.ts","sourceRoot":"","sources":["../../src/walker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAU,UAAU,EAAE,MAAM,aAAa,CAAA;AAOhD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE1C,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,CAAA;IAClB,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,UAAU,CAAA;IACvC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,SAAS,CAAC,EAAE,OAAO,CAAA;IAGnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAA;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAC9B;AAED,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAAG;IAC9C,aAAa,EAAE,IAAI,CAAA;CACpB,CAAA;AACD,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG;IAC/C,aAAa,EAAE,KAAK,CAAA;CACrB,CAAA;AACD,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG;IAC/C,aAAa,CAAC,EAAE,SAAS,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,cAAc,IACzC,CAAC,SAAS,gBAAgB,GAAG,IAAI,GAC/B,CAAC,SAAS,iBAAiB,GAAG,MAAM,GACpC,CAAC,SAAS,iBAAiB,GAAG,MAAM,GACpC,IAAI,GAAG,MAAM,CAAA;AAEjB,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,cAAc,IAC1C,CAAC,SAAS,gBAAgB,GAAG,GAAG,CAAC,IAAI,CAAC,GACpC,CAAC,SAAS,iBAAiB,GAAG,GAAG,CAAC,MAAM,CAAC,GACzC,CAAC,SAAS,iBAAiB,GAAG,GAAG,CAAC,MAAM,CAAC,GACzC,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,CAAA;AAEtB,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,cAAc,IAAI,QAAQ,CAC1D,MAAM,CAAC,CAAC,CAAC,EACT,MAAM,CAAC,CAAC,CAAC,CACV,CAAA;AAUD;;GAEG;AACH,8BAAsB,QAAQ,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc;;IACtE,IAAI,EAAE,IAAI,CAAA;IACV,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,IAAI,EAAE,CAAC,CAAA;IACP,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAkB;IACjC,MAAM,EAAE,OAAO,CAAQ;IACvB,OAAO,EAAE,OAAO,CAAQ;IAIxB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,mBAAmB,EAAE,OAAO,CAAA;gBAEhB,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAsCpD,KAAK;IAGL,MAAM;IAUN,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG;IAahB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;IAqBpE,cAAc,CAAC,CAAC,EAAE,IAAI,GAAG,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS;IAgBrE,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS;IAmBzD,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI;IACtC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAE1C,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO;IA2BhC,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtE,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAK3D,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG;IAOvD,OAAO,CACL,MAAM,EAAE,IAAI,EACZ,QAAQ,EAAE,OAAO,EAAE,EACnB,SAAS,EAAE,SAAS,EACpB,EAAE,EAAE,MAAM,GAAG;IA2Cf,OAAO,CACL,MAAM,EAAE,IAAI,EACZ,OAAO,EAAE,IAAI,EAAE,EACf,SAAS,EAAE,SAAS,EACpB,EAAE,EAAE,MAAM,GAAG;IAsBf,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG;IAO3D,WAAW,CACT,MAAM,EAAE,IAAI,EACZ,QAAQ,EAAE,OAAO,EAAE,EACnB,SAAS,EAAE,SAAS,EACpB,EAAE,EAAE,MAAM,GAAG;IAqCf,WAAW,CACT,MAAM,EAAE,IAAI,EACZ,OAAO,EAAE,IAAI,EAAE,EACf,SAAS,EAAE,SAAS,EACpB,EAAE,EAAE,MAAM,GAAG;CAoBhB;AAED,qBAAa,UAAU,CACrB,CAAC,SAAS,cAAc,GAAG,cAAc,CACzC,SAAQ,QAAQ,CAAC,CAAC,CAAC;IACnB,OAAO,iBAAuB;gBAElB,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAIpD,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI;IAIvB,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAiBrC,QAAQ,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;CAW3B;AAED,qBAAa,UAAU,CACrB,CAAC,SAAS,cAAc,GAAG,cAAc,CACzC,SAAQ,QAAQ,CAAC,CAAC,CAAC;IACnB,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;gBAE3B,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAUpD,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI;IAK7B,MAAM,IAAI,WAAW,CAAC,CAAC,CAAC;IAYxB,UAAU,IAAI,WAAW,CAAC,CAAC,CAAC;CAO7B"} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/walker.js b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/walker.js deleted file mode 100644 index cb15946d9a852c..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/walker.js +++ /dev/null @@ -1,387 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.GlobStream = exports.GlobWalker = exports.GlobUtil = void 0; -/** - * Single-use utility classes to provide functionality to the {@link Glob} - * methods. - * - * @module - */ -const minipass_1 = require("minipass"); -const ignore_js_1 = require("./ignore.js"); -const processor_js_1 = require("./processor.js"); -const makeIgnore = (ignore, opts) => typeof ignore === 'string' ? new ignore_js_1.Ignore([ignore], opts) - : Array.isArray(ignore) ? new ignore_js_1.Ignore(ignore, opts) - : ignore; -/** - * basic walking utilities that all the glob walker types use - */ -class GlobUtil { - path; - patterns; - opts; - seen = new Set(); - paused = false; - aborted = false; - #onResume = []; - #ignore; - #sep; - signal; - maxDepth; - includeChildMatches; - constructor(patterns, path, opts) { - this.patterns = patterns; - this.path = path; - this.opts = opts; - this.#sep = !opts.posix && opts.platform === 'win32' ? '\\' : '/'; - this.includeChildMatches = opts.includeChildMatches !== false; - if (opts.ignore || !this.includeChildMatches) { - this.#ignore = makeIgnore(opts.ignore ?? [], opts); - if (!this.includeChildMatches && - typeof this.#ignore.add !== 'function') { - const m = 'cannot ignore child matches, ignore lacks add() method.'; - throw new Error(m); - } - } - // ignore, always set with maxDepth, but it's optional on the - // GlobOptions type - /* c8 ignore start */ - this.maxDepth = opts.maxDepth || Infinity; - /* c8 ignore stop */ - if (opts.signal) { - this.signal = opts.signal; - this.signal.addEventListener('abort', () => { - this.#onResume.length = 0; - }); - } - } - #ignored(path) { - return this.seen.has(path) || !!this.#ignore?.ignored?.(path); - } - #childrenIgnored(path) { - return !!this.#ignore?.childrenIgnored?.(path); - } - // backpressure mechanism - pause() { - this.paused = true; - } - resume() { - /* c8 ignore start */ - if (this.signal?.aborted) - return; - /* c8 ignore stop */ - this.paused = false; - let fn = undefined; - while (!this.paused && (fn = this.#onResume.shift())) { - fn(); - } - } - onResume(fn) { - if (this.signal?.aborted) - return; - /* c8 ignore start */ - if (!this.paused) { - fn(); - } - else { - /* c8 ignore stop */ - this.#onResume.push(fn); - } - } - // do the requisite realpath/stat checking, and return the path - // to add or undefined to filter it out. - async matchCheck(e, ifDir) { - if (ifDir && this.opts.nodir) - return undefined; - let rpc; - if (this.opts.realpath) { - rpc = e.realpathCached() || (await e.realpath()); - if (!rpc) - return undefined; - e = rpc; - } - const needStat = e.isUnknown() || this.opts.stat; - const s = needStat ? await e.lstat() : e; - if (this.opts.follow && this.opts.nodir && s?.isSymbolicLink()) { - const target = await s.realpath(); - /* c8 ignore start */ - if (target && (target.isUnknown() || this.opts.stat)) { - await target.lstat(); - } - /* c8 ignore stop */ - } - return this.matchCheckTest(s, ifDir); - } - matchCheckTest(e, ifDir) { - return (e && - (this.maxDepth === Infinity || e.depth() <= this.maxDepth) && - (!ifDir || e.canReaddir()) && - (!this.opts.nodir || !e.isDirectory()) && - (!this.opts.nodir || - !this.opts.follow || - !e.isSymbolicLink() || - !e.realpathCached()?.isDirectory()) && - !this.#ignored(e)) ? - e - : undefined; - } - matchCheckSync(e, ifDir) { - if (ifDir && this.opts.nodir) - return undefined; - let rpc; - if (this.opts.realpath) { - rpc = e.realpathCached() || e.realpathSync(); - if (!rpc) - return undefined; - e = rpc; - } - const needStat = e.isUnknown() || this.opts.stat; - const s = needStat ? e.lstatSync() : e; - if (this.opts.follow && this.opts.nodir && s?.isSymbolicLink()) { - const target = s.realpathSync(); - if (target && (target?.isUnknown() || this.opts.stat)) { - target.lstatSync(); - } - } - return this.matchCheckTest(s, ifDir); - } - matchFinish(e, absolute) { - if (this.#ignored(e)) - return; - // we know we have an ignore if this is false, but TS doesn't - if (!this.includeChildMatches && this.#ignore?.add) { - const ign = `${e.relativePosix()}/**`; - this.#ignore.add(ign); - } - const abs = this.opts.absolute === undefined ? absolute : this.opts.absolute; - this.seen.add(e); - const mark = this.opts.mark && e.isDirectory() ? this.#sep : ''; - // ok, we have what we need! - if (this.opts.withFileTypes) { - this.matchEmit(e); - } - else if (abs) { - const abs = this.opts.posix ? e.fullpathPosix() : e.fullpath(); - this.matchEmit(abs + mark); - } - else { - const rel = this.opts.posix ? e.relativePosix() : e.relative(); - const pre = this.opts.dotRelative && !rel.startsWith('..' + this.#sep) ? - '.' + this.#sep - : ''; - this.matchEmit(!rel ? '.' + mark : pre + rel + mark); - } - } - async match(e, absolute, ifDir) { - const p = await this.matchCheck(e, ifDir); - if (p) - this.matchFinish(p, absolute); - } - matchSync(e, absolute, ifDir) { - const p = this.matchCheckSync(e, ifDir); - if (p) - this.matchFinish(p, absolute); - } - walkCB(target, patterns, cb) { - /* c8 ignore start */ - if (this.signal?.aborted) - cb(); - /* c8 ignore stop */ - this.walkCB2(target, patterns, new processor_js_1.Processor(this.opts), cb); - } - walkCB2(target, patterns, processor, cb) { - if (this.#childrenIgnored(target)) - return cb(); - if (this.signal?.aborted) - cb(); - if (this.paused) { - this.onResume(() => this.walkCB2(target, patterns, processor, cb)); - return; - } - processor.processPatterns(target, patterns); - // done processing. all of the above is sync, can be abstracted out. - // subwalks is a map of paths to the entry filters they need - // matches is a map of paths to [absolute, ifDir] tuples. - let tasks = 1; - const next = () => { - if (--tasks === 0) - cb(); - }; - for (const [m, absolute, ifDir] of processor.matches.entries()) { - if (this.#ignored(m)) - continue; - tasks++; - this.match(m, absolute, ifDir).then(() => next()); - } - for (const t of processor.subwalkTargets()) { - if (this.maxDepth !== Infinity && t.depth() >= this.maxDepth) { - continue; - } - tasks++; - const childrenCached = t.readdirCached(); - if (t.calledReaddir()) - this.walkCB3(t, childrenCached, processor, next); - else { - t.readdirCB((_, entries) => this.walkCB3(t, entries, processor, next), true); - } - } - next(); - } - walkCB3(target, entries, processor, cb) { - processor = processor.filterEntries(target, entries); - let tasks = 1; - const next = () => { - if (--tasks === 0) - cb(); - }; - for (const [m, absolute, ifDir] of processor.matches.entries()) { - if (this.#ignored(m)) - continue; - tasks++; - this.match(m, absolute, ifDir).then(() => next()); - } - for (const [target, patterns] of processor.subwalks.entries()) { - tasks++; - this.walkCB2(target, patterns, processor.child(), next); - } - next(); - } - walkCBSync(target, patterns, cb) { - /* c8 ignore start */ - if (this.signal?.aborted) - cb(); - /* c8 ignore stop */ - this.walkCB2Sync(target, patterns, new processor_js_1.Processor(this.opts), cb); - } - walkCB2Sync(target, patterns, processor, cb) { - if (this.#childrenIgnored(target)) - return cb(); - if (this.signal?.aborted) - cb(); - if (this.paused) { - this.onResume(() => this.walkCB2Sync(target, patterns, processor, cb)); - return; - } - processor.processPatterns(target, patterns); - // done processing. all of the above is sync, can be abstracted out. - // subwalks is a map of paths to the entry filters they need - // matches is a map of paths to [absolute, ifDir] tuples. - let tasks = 1; - const next = () => { - if (--tasks === 0) - cb(); - }; - for (const [m, absolute, ifDir] of processor.matches.entries()) { - if (this.#ignored(m)) - continue; - this.matchSync(m, absolute, ifDir); - } - for (const t of processor.subwalkTargets()) { - if (this.maxDepth !== Infinity && t.depth() >= this.maxDepth) { - continue; - } - tasks++; - const children = t.readdirSync(); - this.walkCB3Sync(t, children, processor, next); - } - next(); - } - walkCB3Sync(target, entries, processor, cb) { - processor = processor.filterEntries(target, entries); - let tasks = 1; - const next = () => { - if (--tasks === 0) - cb(); - }; - for (const [m, absolute, ifDir] of processor.matches.entries()) { - if (this.#ignored(m)) - continue; - this.matchSync(m, absolute, ifDir); - } - for (const [target, patterns] of processor.subwalks.entries()) { - tasks++; - this.walkCB2Sync(target, patterns, processor.child(), next); - } - next(); - } -} -exports.GlobUtil = GlobUtil; -class GlobWalker extends GlobUtil { - matches = new Set(); - constructor(patterns, path, opts) { - super(patterns, path, opts); - } - matchEmit(e) { - this.matches.add(e); - } - async walk() { - if (this.signal?.aborted) - throw this.signal.reason; - if (this.path.isUnknown()) { - await this.path.lstat(); - } - await new Promise((res, rej) => { - this.walkCB(this.path, this.patterns, () => { - if (this.signal?.aborted) { - rej(this.signal.reason); - } - else { - res(this.matches); - } - }); - }); - return this.matches; - } - walkSync() { - if (this.signal?.aborted) - throw this.signal.reason; - if (this.path.isUnknown()) { - this.path.lstatSync(); - } - // nothing for the callback to do, because this never pauses - this.walkCBSync(this.path, this.patterns, () => { - if (this.signal?.aborted) - throw this.signal.reason; - }); - return this.matches; - } -} -exports.GlobWalker = GlobWalker; -class GlobStream extends GlobUtil { - results; - constructor(patterns, path, opts) { - super(patterns, path, opts); - this.results = new minipass_1.Minipass({ - signal: this.signal, - objectMode: true, - }); - this.results.on('drain', () => this.resume()); - this.results.on('resume', () => this.resume()); - } - matchEmit(e) { - this.results.write(e); - if (!this.results.flowing) - this.pause(); - } - stream() { - const target = this.path; - if (target.isUnknown()) { - target.lstat().then(() => { - this.walkCB(target, this.patterns, () => this.results.end()); - }); - } - else { - this.walkCB(target, this.patterns, () => this.results.end()); - } - return this.results; - } - streamSync() { - if (this.path.isUnknown()) { - this.path.lstatSync(); - } - this.walkCBSync(this.path, this.patterns, () => this.results.end()); - return this.results; - } -} -exports.GlobStream = GlobStream; -//# sourceMappingURL=walker.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/walker.js.map b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/walker.js.map deleted file mode 100644 index 49b013864d534b..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/commonjs/walker.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"walker.js","sourceRoot":"","sources":["../../src/walker.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACH,uCAAmC;AAEnC,2CAAgD;AAQhD,iDAA0C;AA0D1C,MAAM,UAAU,GAAG,CACjB,MAAsC,EACtC,IAAoB,EACR,EAAE,CACd,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,kBAAM,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC;IACvD,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,kBAAM,CAAC,MAAM,EAAE,IAAI,CAAC;QAClD,CAAC,CAAC,MAAM,CAAA;AAEV;;GAEG;AACH,MAAsB,QAAQ;IAC5B,IAAI,CAAM;IACV,QAAQ,CAAW;IACnB,IAAI,CAAG;IACP,IAAI,GAAc,IAAI,GAAG,EAAQ,CAAA;IACjC,MAAM,GAAY,KAAK,CAAA;IACvB,OAAO,GAAY,KAAK,CAAA;IACxB,SAAS,GAAkB,EAAE,CAAA;IAC7B,OAAO,CAAa;IACpB,IAAI,CAAY;IAChB,MAAM,CAAc;IACpB,QAAQ,CAAQ;IAChB,mBAAmB,CAAS;IAG5B,YAAY,QAAmB,EAAE,IAAU,EAAE,IAAO;QAClD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAA;QACjE,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,KAAK,KAAK,CAAA;QAC7D,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7C,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,IAAI,CAAC,CAAA;YAClD,IACE,CAAC,IAAI,CAAC,mBAAmB;gBACzB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,UAAU,EACtC,CAAC;gBACD,MAAM,CAAC,GAAG,yDAAyD,CAAA;gBACnE,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAA;YACpB,CAAC;QACH,CAAC;QACD,6DAA6D;QAC7D,mBAAmB;QACnB,qBAAqB;QACrB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAA;QACzC,oBAAoB;QACpB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;YACzB,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;gBACzC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAA;YAC3B,CAAC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,IAAU;QACjB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,CAAA;IAC/D,CAAC;IACD,gBAAgB,CAAC,IAAU;QACzB,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC,IAAI,CAAC,CAAA;IAChD,CAAC;IAED,yBAAyB;IACzB,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;IACpB,CAAC;IACD,MAAM;QACJ,qBAAqB;QACrB,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,OAAM;QAChC,oBAAoB;QACpB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,EAAE,GAA4B,SAAS,CAAA;QAC3C,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;YACrD,EAAE,EAAE,CAAA;QACN,CAAC;IACH,CAAC;IACD,QAAQ,CAAC,EAAa;QACpB,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,OAAM;QAChC,qBAAqB;QACrB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,EAAE,EAAE,CAAA;QACN,CAAC;aAAM,CAAC;YACN,oBAAoB;YACpB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACzB,CAAC;IACH,CAAC;IAED,+DAA+D;IAC/D,wCAAwC;IACxC,KAAK,CAAC,UAAU,CAAC,CAAO,EAAE,KAAc;QACtC,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAA;QAC9C,IAAI,GAAqB,CAAA;QACzB,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACvB,GAAG,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;YAChD,IAAI,CAAC,GAAG;gBAAE,OAAO,SAAS,CAAA;YAC1B,CAAC,GAAG,GAAG,CAAA;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;QAChD,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QACxC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,cAAc,EAAE,EAAE,CAAC;YAC/D,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAA;YACjC,qBAAqB;YACrB,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrD,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;YACtB,CAAC;YACD,oBAAoB;QACtB,CAAC;QACD,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IACtC,CAAC;IAED,cAAc,CAAC,CAAmB,EAAE,KAAc;QAChD,OAAO,CACH,CAAC;YACC,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC;YAC1D,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;YAC1B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACtC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;gBACf,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM;gBACjB,CAAC,CAAC,CAAC,cAAc,EAAE;gBACnB,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,WAAW,EAAE,CAAC;YACrC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CACpB,CAAC,CAAC;YACD,CAAC;YACH,CAAC,CAAC,SAAS,CAAA;IACf,CAAC;IAED,cAAc,CAAC,CAAO,EAAE,KAAc;QACpC,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAA;QAC9C,IAAI,GAAqB,CAAA;QACzB,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACvB,GAAG,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,YAAY,EAAE,CAAA;YAC5C,IAAI,CAAC,GAAG;gBAAE,OAAO,SAAS,CAAA;YAC1B,CAAC,GAAG,GAAG,CAAA;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;QAChD,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QACtC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,cAAc,EAAE,EAAE,CAAC;YAC/D,MAAM,MAAM,GAAG,CAAC,CAAC,YAAY,EAAE,CAAA;YAC/B,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtD,MAAM,CAAC,SAAS,EAAE,CAAA;YACpB,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IACtC,CAAC;IAKD,WAAW,CAAC,CAAO,EAAE,QAAiB;QACpC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAM;QAC5B,6DAA6D;QAC7D,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;YACnD,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,aAAa,EAAE,KAAK,CAAA;YACrC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACvB,CAAC;QACD,MAAM,GAAG,GACP,IAAI,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAA;QAClE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAChB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;QAC/D,4BAA4B;QAC5B,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YAC5B,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QACnB,CAAC;aAAM,IAAI,GAAG,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;YAC9D,IAAI,CAAC,SAAS,CAAC,GAAG,GAAG,IAAI,CAAC,CAAA;QAC5B,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;YAC9D,MAAM,GAAG,GACP,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC1D,GAAG,GAAG,IAAI,CAAC,IAAI;gBACjB,CAAC,CAAC,EAAE,CAAA;YACN,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,CAAA;QACtD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,CAAO,EAAE,QAAiB,EAAE,KAAc;QACpD,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;QACzC,IAAI,CAAC;YAAE,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;IACtC,CAAC;IAED,SAAS,CAAC,CAAO,EAAE,QAAiB,EAAE,KAAc;QAClD,MAAM,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;QACvC,IAAI,CAAC;YAAE,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;IACtC,CAAC;IAED,MAAM,CAAC,MAAY,EAAE,QAAmB,EAAE,EAAa;QACrD,qBAAqB;QACrB,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,EAAE,EAAE,CAAA;QAC9B,oBAAoB;QACpB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,wBAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;IAC9D,CAAC;IAED,OAAO,CACL,MAAY,EACZ,QAAmB,EACnB,SAAoB,EACpB,EAAa;QAEb,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,EAAE,CAAA;QAC9C,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,EAAE,EAAE,CAAA;QAC9B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,CAAA;YAClE,OAAM;QACR,CAAC;QACD,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QAE3C,qEAAqE;QACrE,4DAA4D;QAC5D,yDAAyD;QACzD,IAAI,KAAK,GAAG,CAAC,CAAA;QACb,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,IAAI,EAAE,KAAK,KAAK,CAAC;gBAAE,EAAE,EAAE,CAAA;QACzB,CAAC,CAAA;QAED,KAAK,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YAC/D,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,SAAQ;YAC9B,KAAK,EAAE,CAAA;YACP,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAA;QACnD,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,cAAc,EAAE,EAAE,CAAC;YAC3C,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC7D,SAAQ;YACV,CAAC;YACD,KAAK,EAAE,CAAA;YACP,MAAM,cAAc,GAAG,CAAC,CAAC,aAAa,EAAE,CAAA;YACxC,IAAI,CAAC,CAAC,aAAa,EAAE;gBACnB,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,cAAc,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;iBAC7C,CAAC;gBACJ,CAAC,CAAC,SAAS,CACT,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,EACzD,IAAI,CACL,CAAA;YACH,CAAC;QACH,CAAC;QAED,IAAI,EAAE,CAAA;IACR,CAAC;IAED,OAAO,CACL,MAAY,EACZ,OAAe,EACf,SAAoB,EACpB,EAAa;QAEb,SAAS,GAAG,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAEpD,IAAI,KAAK,GAAG,CAAC,CAAA;QACb,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,IAAI,EAAE,KAAK,KAAK,CAAC;gBAAE,EAAE,EAAE,CAAA;QACzB,CAAC,CAAA;QAED,KAAK,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YAC/D,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,SAAQ;YAC9B,KAAK,EAAE,CAAA;YACP,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAA;QACnD,CAAC;QACD,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9D,KAAK,EAAE,CAAA;YACP,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAA;QACzD,CAAC;QAED,IAAI,EAAE,CAAA;IACR,CAAC;IAED,UAAU,CAAC,MAAY,EAAE,QAAmB,EAAE,EAAa;QACzD,qBAAqB;QACrB,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,EAAE,EAAE,CAAA;QAC9B,oBAAoB;QACpB,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,wBAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;IAClE,CAAC;IAED,WAAW,CACT,MAAY,EACZ,QAAmB,EACnB,SAAoB,EACpB,EAAa;QAEb,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,EAAE,CAAA;QAC9C,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,EAAE,EAAE,CAAA;QAC9B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CACjB,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAC,CAClD,CAAA;YACD,OAAM;QACR,CAAC;QACD,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QAE3C,qEAAqE;QACrE,4DAA4D;QAC5D,yDAAyD;QACzD,IAAI,KAAK,GAAG,CAAC,CAAA;QACb,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,IAAI,EAAE,KAAK,KAAK,CAAC;gBAAE,EAAE,EAAE,CAAA;QACzB,CAAC,CAAA;QAED,KAAK,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YAC/D,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,SAAQ;YAC9B,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;QACpC,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,cAAc,EAAE,EAAE,CAAC;YAC3C,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC7D,SAAQ;YACV,CAAC;YACD,KAAK,EAAE,CAAA;YACP,MAAM,QAAQ,GAAG,CAAC,CAAC,WAAW,EAAE,CAAA;YAChC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;QAChD,CAAC;QAED,IAAI,EAAE,CAAA;IACR,CAAC;IAED,WAAW,CACT,MAAY,EACZ,OAAe,EACf,SAAoB,EACpB,EAAa;QAEb,SAAS,GAAG,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAEpD,IAAI,KAAK,GAAG,CAAC,CAAA;QACb,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,IAAI,EAAE,KAAK,KAAK,CAAC;gBAAE,EAAE,EAAE,CAAA;QACzB,CAAC,CAAA;QAED,KAAK,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YAC/D,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,SAAQ;YAC9B,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;QACpC,CAAC;QACD,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9D,KAAK,EAAE,CAAA;YACP,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAA;QAC7D,CAAC;QAED,IAAI,EAAE,CAAA;IACR,CAAC;CACF;AAtUD,4BAsUC;AAED,MAAa,UAEX,SAAQ,QAAW;IACnB,OAAO,GAAG,IAAI,GAAG,EAAa,CAAA;IAE9B,YAAY,QAAmB,EAAE,IAAU,EAAE,IAAO;QAClD,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;IAC7B,CAAC;IAED,SAAS,CAAC,CAAY;QACpB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;QAClD,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YAC1B,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAA;QACzB,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;gBACzC,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;oBACzB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;gBACzB,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBACnB,CAAC;YACH,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QACF,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,QAAQ;QACN,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;QAClD,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAA;QACvB,CAAC;QACD,4DAA4D;QAC5D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;YAC7C,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;gBAAE,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;QACpD,CAAC,CAAC,CAAA;QACF,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;CACF;AAzCD,gCAyCC;AAED,MAAa,UAEX,SAAQ,QAAW;IACnB,OAAO,CAAgC;IAEvC,YAAY,QAAmB,EAAE,IAAU,EAAE,IAAO;QAClD,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,mBAAQ,CAAuB;YAChD,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,UAAU,EAAE,IAAI;SACjB,CAAC,CAAA;QACF,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;QAC7C,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;IAChD,CAAC;IAED,SAAS,CAAC,CAAY;QACpB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACrB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,IAAI,CAAC,KAAK,EAAE,CAAA;IACzC,CAAC;IAED,MAAM;QACJ,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAA;QACxB,IAAI,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC;YACvB,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;gBACvB,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;YAC9D,CAAC,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;QAC9D,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,UAAU;QACR,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAA;QACvB,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;QACnE,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;CACF;AAvCD,gCAuCC","sourcesContent":["/**\n * Single-use utility classes to provide functionality to the {@link Glob}\n * methods.\n *\n * @module\n */\nimport { Minipass } from 'minipass'\nimport { Path } from 'path-scurry'\nimport { Ignore, IgnoreLike } from './ignore.js'\n\n// XXX can we somehow make it so that it NEVER processes a given path more than\n// once, enough that the match set tracking is no longer needed? that'd speed\n// things up a lot. Or maybe bring back nounique, and skip it in that case?\n\n// a single minimatch set entry with 1 or more parts\nimport { Pattern } from './pattern.js'\nimport { Processor } from './processor.js'\n\nexport interface GlobWalkerOpts {\n absolute?: boolean\n allowWindowsEscape?: boolean\n cwd?: string | URL\n dot?: boolean\n dotRelative?: boolean\n follow?: boolean\n ignore?: string | string[] | IgnoreLike\n mark?: boolean\n matchBase?: boolean\n // Note: maxDepth here means \"maximum actual Path.depth()\",\n // not \"maximum depth beyond cwd\"\n maxDepth?: number\n nobrace?: boolean\n nocase?: boolean\n nodir?: boolean\n noext?: boolean\n noglobstar?: boolean\n platform?: NodeJS.Platform\n posix?: boolean\n realpath?: boolean\n root?: string\n stat?: boolean\n signal?: AbortSignal\n windowsPathsNoEscape?: boolean\n withFileTypes?: boolean\n includeChildMatches?: boolean\n}\n\nexport type GWOFileTypesTrue = GlobWalkerOpts & {\n withFileTypes: true\n}\nexport type GWOFileTypesFalse = GlobWalkerOpts & {\n withFileTypes: false\n}\nexport type GWOFileTypesUnset = GlobWalkerOpts & {\n withFileTypes?: undefined\n}\n\nexport type Result =\n O extends GWOFileTypesTrue ? Path\n : O extends GWOFileTypesFalse ? string\n : O extends GWOFileTypesUnset ? string\n : Path | string\n\nexport type Matches =\n O extends GWOFileTypesTrue ? Set\n : O extends GWOFileTypesFalse ? Set\n : O extends GWOFileTypesUnset ? Set\n : Set\n\nexport type MatchStream = Minipass<\n Result,\n Result\n>\n\nconst makeIgnore = (\n ignore: string | string[] | IgnoreLike,\n opts: GlobWalkerOpts,\n): IgnoreLike =>\n typeof ignore === 'string' ? new Ignore([ignore], opts)\n : Array.isArray(ignore) ? new Ignore(ignore, opts)\n : ignore\n\n/**\n * basic walking utilities that all the glob walker types use\n */\nexport abstract class GlobUtil {\n path: Path\n patterns: Pattern[]\n opts: O\n seen: Set = new Set()\n paused: boolean = false\n aborted: boolean = false\n #onResume: (() => any)[] = []\n #ignore?: IgnoreLike\n #sep: '\\\\' | '/'\n signal?: AbortSignal\n maxDepth: number\n includeChildMatches: boolean\n\n constructor(patterns: Pattern[], path: Path, opts: O)\n constructor(patterns: Pattern[], path: Path, opts: O) {\n this.patterns = patterns\n this.path = path\n this.opts = opts\n this.#sep = !opts.posix && opts.platform === 'win32' ? '\\\\' : '/'\n this.includeChildMatches = opts.includeChildMatches !== false\n if (opts.ignore || !this.includeChildMatches) {\n this.#ignore = makeIgnore(opts.ignore ?? [], opts)\n if (\n !this.includeChildMatches &&\n typeof this.#ignore.add !== 'function'\n ) {\n const m = 'cannot ignore child matches, ignore lacks add() method.'\n throw new Error(m)\n }\n }\n // ignore, always set with maxDepth, but it's optional on the\n // GlobOptions type\n /* c8 ignore start */\n this.maxDepth = opts.maxDepth || Infinity\n /* c8 ignore stop */\n if (opts.signal) {\n this.signal = opts.signal\n this.signal.addEventListener('abort', () => {\n this.#onResume.length = 0\n })\n }\n }\n\n #ignored(path: Path): boolean {\n return this.seen.has(path) || !!this.#ignore?.ignored?.(path)\n }\n #childrenIgnored(path: Path): boolean {\n return !!this.#ignore?.childrenIgnored?.(path)\n }\n\n // backpressure mechanism\n pause() {\n this.paused = true\n }\n resume() {\n /* c8 ignore start */\n if (this.signal?.aborted) return\n /* c8 ignore stop */\n this.paused = false\n let fn: (() => any) | undefined = undefined\n while (!this.paused && (fn = this.#onResume.shift())) {\n fn()\n }\n }\n onResume(fn: () => any) {\n if (this.signal?.aborted) return\n /* c8 ignore start */\n if (!this.paused) {\n fn()\n } else {\n /* c8 ignore stop */\n this.#onResume.push(fn)\n }\n }\n\n // do the requisite realpath/stat checking, and return the path\n // to add or undefined to filter it out.\n async matchCheck(e: Path, ifDir: boolean): Promise {\n if (ifDir && this.opts.nodir) return undefined\n let rpc: Path | undefined\n if (this.opts.realpath) {\n rpc = e.realpathCached() || (await e.realpath())\n if (!rpc) return undefined\n e = rpc\n }\n const needStat = e.isUnknown() || this.opts.stat\n const s = needStat ? await e.lstat() : e\n if (this.opts.follow && this.opts.nodir && s?.isSymbolicLink()) {\n const target = await s.realpath()\n /* c8 ignore start */\n if (target && (target.isUnknown() || this.opts.stat)) {\n await target.lstat()\n }\n /* c8 ignore stop */\n }\n return this.matchCheckTest(s, ifDir)\n }\n\n matchCheckTest(e: Path | undefined, ifDir: boolean): Path | undefined {\n return (\n e &&\n (this.maxDepth === Infinity || e.depth() <= this.maxDepth) &&\n (!ifDir || e.canReaddir()) &&\n (!this.opts.nodir || !e.isDirectory()) &&\n (!this.opts.nodir ||\n !this.opts.follow ||\n !e.isSymbolicLink() ||\n !e.realpathCached()?.isDirectory()) &&\n !this.#ignored(e)\n ) ?\n e\n : undefined\n }\n\n matchCheckSync(e: Path, ifDir: boolean): Path | undefined {\n if (ifDir && this.opts.nodir) return undefined\n let rpc: Path | undefined\n if (this.opts.realpath) {\n rpc = e.realpathCached() || e.realpathSync()\n if (!rpc) return undefined\n e = rpc\n }\n const needStat = e.isUnknown() || this.opts.stat\n const s = needStat ? e.lstatSync() : e\n if (this.opts.follow && this.opts.nodir && s?.isSymbolicLink()) {\n const target = s.realpathSync()\n if (target && (target?.isUnknown() || this.opts.stat)) {\n target.lstatSync()\n }\n }\n return this.matchCheckTest(s, ifDir)\n }\n\n abstract matchEmit(p: Result): void\n abstract matchEmit(p: string | Path): void\n\n matchFinish(e: Path, absolute: boolean) {\n if (this.#ignored(e)) return\n // we know we have an ignore if this is false, but TS doesn't\n if (!this.includeChildMatches && this.#ignore?.add) {\n const ign = `${e.relativePosix()}/**`\n this.#ignore.add(ign)\n }\n const abs =\n this.opts.absolute === undefined ? absolute : this.opts.absolute\n this.seen.add(e)\n const mark = this.opts.mark && e.isDirectory() ? this.#sep : ''\n // ok, we have what we need!\n if (this.opts.withFileTypes) {\n this.matchEmit(e)\n } else if (abs) {\n const abs = this.opts.posix ? e.fullpathPosix() : e.fullpath()\n this.matchEmit(abs + mark)\n } else {\n const rel = this.opts.posix ? e.relativePosix() : e.relative()\n const pre =\n this.opts.dotRelative && !rel.startsWith('..' + this.#sep) ?\n '.' + this.#sep\n : ''\n this.matchEmit(!rel ? '.' + mark : pre + rel + mark)\n }\n }\n\n async match(e: Path, absolute: boolean, ifDir: boolean): Promise {\n const p = await this.matchCheck(e, ifDir)\n if (p) this.matchFinish(p, absolute)\n }\n\n matchSync(e: Path, absolute: boolean, ifDir: boolean): void {\n const p = this.matchCheckSync(e, ifDir)\n if (p) this.matchFinish(p, absolute)\n }\n\n walkCB(target: Path, patterns: Pattern[], cb: () => any) {\n /* c8 ignore start */\n if (this.signal?.aborted) cb()\n /* c8 ignore stop */\n this.walkCB2(target, patterns, new Processor(this.opts), cb)\n }\n\n walkCB2(\n target: Path,\n patterns: Pattern[],\n processor: Processor,\n cb: () => any,\n ) {\n if (this.#childrenIgnored(target)) return cb()\n if (this.signal?.aborted) cb()\n if (this.paused) {\n this.onResume(() => this.walkCB2(target, patterns, processor, cb))\n return\n }\n processor.processPatterns(target, patterns)\n\n // done processing. all of the above is sync, can be abstracted out.\n // subwalks is a map of paths to the entry filters they need\n // matches is a map of paths to [absolute, ifDir] tuples.\n let tasks = 1\n const next = () => {\n if (--tasks === 0) cb()\n }\n\n for (const [m, absolute, ifDir] of processor.matches.entries()) {\n if (this.#ignored(m)) continue\n tasks++\n this.match(m, absolute, ifDir).then(() => next())\n }\n\n for (const t of processor.subwalkTargets()) {\n if (this.maxDepth !== Infinity && t.depth() >= this.maxDepth) {\n continue\n }\n tasks++\n const childrenCached = t.readdirCached()\n if (t.calledReaddir())\n this.walkCB3(t, childrenCached, processor, next)\n else {\n t.readdirCB(\n (_, entries) => this.walkCB3(t, entries, processor, next),\n true,\n )\n }\n }\n\n next()\n }\n\n walkCB3(\n target: Path,\n entries: Path[],\n processor: Processor,\n cb: () => any,\n ) {\n processor = processor.filterEntries(target, entries)\n\n let tasks = 1\n const next = () => {\n if (--tasks === 0) cb()\n }\n\n for (const [m, absolute, ifDir] of processor.matches.entries()) {\n if (this.#ignored(m)) continue\n tasks++\n this.match(m, absolute, ifDir).then(() => next())\n }\n for (const [target, patterns] of processor.subwalks.entries()) {\n tasks++\n this.walkCB2(target, patterns, processor.child(), next)\n }\n\n next()\n }\n\n walkCBSync(target: Path, patterns: Pattern[], cb: () => any) {\n /* c8 ignore start */\n if (this.signal?.aborted) cb()\n /* c8 ignore stop */\n this.walkCB2Sync(target, patterns, new Processor(this.opts), cb)\n }\n\n walkCB2Sync(\n target: Path,\n patterns: Pattern[],\n processor: Processor,\n cb: () => any,\n ) {\n if (this.#childrenIgnored(target)) return cb()\n if (this.signal?.aborted) cb()\n if (this.paused) {\n this.onResume(() =>\n this.walkCB2Sync(target, patterns, processor, cb),\n )\n return\n }\n processor.processPatterns(target, patterns)\n\n // done processing. all of the above is sync, can be abstracted out.\n // subwalks is a map of paths to the entry filters they need\n // matches is a map of paths to [absolute, ifDir] tuples.\n let tasks = 1\n const next = () => {\n if (--tasks === 0) cb()\n }\n\n for (const [m, absolute, ifDir] of processor.matches.entries()) {\n if (this.#ignored(m)) continue\n this.matchSync(m, absolute, ifDir)\n }\n\n for (const t of processor.subwalkTargets()) {\n if (this.maxDepth !== Infinity && t.depth() >= this.maxDepth) {\n continue\n }\n tasks++\n const children = t.readdirSync()\n this.walkCB3Sync(t, children, processor, next)\n }\n\n next()\n }\n\n walkCB3Sync(\n target: Path,\n entries: Path[],\n processor: Processor,\n cb: () => any,\n ) {\n processor = processor.filterEntries(target, entries)\n\n let tasks = 1\n const next = () => {\n if (--tasks === 0) cb()\n }\n\n for (const [m, absolute, ifDir] of processor.matches.entries()) {\n if (this.#ignored(m)) continue\n this.matchSync(m, absolute, ifDir)\n }\n for (const [target, patterns] of processor.subwalks.entries()) {\n tasks++\n this.walkCB2Sync(target, patterns, processor.child(), next)\n }\n\n next()\n }\n}\n\nexport class GlobWalker<\n O extends GlobWalkerOpts = GlobWalkerOpts,\n> extends GlobUtil {\n matches = new Set>()\n\n constructor(patterns: Pattern[], path: Path, opts: O) {\n super(patterns, path, opts)\n }\n\n matchEmit(e: Result): void {\n this.matches.add(e)\n }\n\n async walk(): Promise>> {\n if (this.signal?.aborted) throw this.signal.reason\n if (this.path.isUnknown()) {\n await this.path.lstat()\n }\n await new Promise((res, rej) => {\n this.walkCB(this.path, this.patterns, () => {\n if (this.signal?.aborted) {\n rej(this.signal.reason)\n } else {\n res(this.matches)\n }\n })\n })\n return this.matches\n }\n\n walkSync(): Set> {\n if (this.signal?.aborted) throw this.signal.reason\n if (this.path.isUnknown()) {\n this.path.lstatSync()\n }\n // nothing for the callback to do, because this never pauses\n this.walkCBSync(this.path, this.patterns, () => {\n if (this.signal?.aborted) throw this.signal.reason\n })\n return this.matches\n }\n}\n\nexport class GlobStream<\n O extends GlobWalkerOpts = GlobWalkerOpts,\n> extends GlobUtil {\n results: Minipass, Result>\n\n constructor(patterns: Pattern[], path: Path, opts: O) {\n super(patterns, path, opts)\n this.results = new Minipass, Result>({\n signal: this.signal,\n objectMode: true,\n })\n this.results.on('drain', () => this.resume())\n this.results.on('resume', () => this.resume())\n }\n\n matchEmit(e: Result): void {\n this.results.write(e)\n if (!this.results.flowing) this.pause()\n }\n\n stream(): MatchStream {\n const target = this.path\n if (target.isUnknown()) {\n target.lstat().then(() => {\n this.walkCB(target, this.patterns, () => this.results.end())\n })\n } else {\n this.walkCB(target, this.patterns, () => this.results.end())\n }\n return this.results\n }\n\n streamSync(): MatchStream {\n if (this.path.isUnknown()) {\n this.path.lstatSync()\n }\n this.walkCBSync(this.path, this.patterns, () => this.results.end())\n return this.results\n }\n}\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/bin.d.mts b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/bin.d.mts deleted file mode 100644 index 77298e47708175..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/bin.d.mts +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env node -export {}; -//# sourceMappingURL=bin.d.mts.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/bin.d.mts.map b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/bin.d.mts.map deleted file mode 100644 index ec64bdda861bc9..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/bin.d.mts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"bin.d.mts","sourceRoot":"","sources":["../../src/bin.mts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/bin.mjs b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/bin.mjs deleted file mode 100755 index 5c7bf1e9256105..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/bin.mjs +++ /dev/null @@ -1,270 +0,0 @@ -#!/usr/bin/env node -import { foregroundChild } from 'foreground-child'; -import { existsSync } from 'fs'; -import { jack } from 'jackspeak'; -import { loadPackageJson } from 'package-json-from-dist'; -import { join } from 'path'; -import { globStream } from './index.js'; -const { version } = loadPackageJson(import.meta.url, '../package.json'); -const j = jack({ - usage: 'glob [options] [ [ ...]]', -}) - .description(` - Glob v${version} - - Expand the positional glob expression arguments into any matching file - system paths found. - `) - .opt({ - cmd: { - short: 'c', - hint: 'command', - description: `Run the command provided, passing the glob expression - matches as arguments.`, - }, -}) - .opt({ - default: { - short: 'p', - hint: 'pattern', - description: `If no positional arguments are provided, glob will use - this pattern`, - }, -}) - .flag({ - all: { - short: 'A', - description: `By default, the glob cli command will not expand any - arguments that are an exact match to a file on disk. - - This prevents double-expanding, in case the shell expands - an argument whose filename is a glob expression. - - For example, if 'app/*.ts' would match 'app/[id].ts', then - on Windows powershell or cmd.exe, 'glob app/*.ts' will - expand to 'app/[id].ts', as expected. However, in posix - shells such as bash or zsh, the shell will first expand - 'app/*.ts' to a list of filenames. Then glob will look - for a file matching 'app/[id].ts' (ie, 'app/i.ts' or - 'app/d.ts'), which is unexpected. - - Setting '--all' prevents this behavior, causing glob - to treat ALL patterns as glob expressions to be expanded, - even if they are an exact match to a file on disk. - - When setting this option, be sure to enquote arguments - so that the shell will not expand them prior to passing - them to the glob command process. - `, - }, - absolute: { - short: 'a', - description: 'Expand to absolute paths', - }, - 'dot-relative': { - short: 'd', - description: `Prepend './' on relative matches`, - }, - mark: { - short: 'm', - description: `Append a / on any directories matched`, - }, - posix: { - short: 'x', - description: `Always resolve to posix style paths, using '/' as the - directory separator, even on Windows. Drive letter - absolute matches on Windows will be expanded to their - full resolved UNC maths, eg instead of 'C:\\foo\\bar', - it will expand to '//?/C:/foo/bar'. - `, - }, - follow: { - short: 'f', - description: `Follow symlinked directories when expanding '**'`, - }, - realpath: { - short: 'R', - description: `Call 'fs.realpath' on all of the results. In the case - of an entry that cannot be resolved, the entry is - omitted. This incurs a slight performance penalty, of - course, because of the added system calls.`, - }, - stat: { - short: 's', - description: `Call 'fs.lstat' on all entries, whether required or not - to determine if it's a valid match.`, - }, - 'match-base': { - short: 'b', - description: `Perform a basename-only match if the pattern does not - contain any slash characters. That is, '*.js' would be - treated as equivalent to '**/*.js', matching js files - in all directories. - `, - }, - dot: { - description: `Allow patterns to match files/directories that start - with '.', even if the pattern does not start with '.' - `, - }, - nobrace: { - description: 'Do not expand {...} patterns', - }, - nocase: { - description: `Perform a case-insensitive match. This defaults to - 'true' on macOS and Windows platforms, and false on - all others. - - Note: 'nocase' should only be explicitly set when it is - known that the filesystem's case sensitivity differs - from the platform default. If set 'true' on - case-insensitive file systems, then the walk may return - more or less results than expected. - `, - }, - nodir: { - description: `Do not match directories, only files. - - Note: to *only* match directories, append a '/' at the - end of the pattern. - `, - }, - noext: { - description: `Do not expand extglob patterns, such as '+(a|b)'`, - }, - noglobstar: { - description: `Do not expand '**' against multiple path portions. - Ie, treat it as a normal '*' instead.`, - }, - 'windows-path-no-escape': { - description: `Use '\\' as a path separator *only*, and *never* as an - escape character. If set, all '\\' characters are - replaced with '/' in the pattern.`, - }, -}) - .num({ - 'max-depth': { - short: 'D', - description: `Maximum depth to traverse from the current - working directory`, - }, -}) - .opt({ - cwd: { - short: 'C', - description: 'Current working directory to execute/match in', - default: process.cwd(), - }, - root: { - short: 'r', - description: `A string path resolved against the 'cwd', which is - used as the starting point for absolute patterns that - start with '/' (but not drive letters or UNC paths - on Windows). - - Note that this *doesn't* necessarily limit the walk to - the 'root' directory, and doesn't affect the cwd - starting point for non-absolute patterns. A pattern - containing '..' will still be able to traverse out of - the root directory, if it is not an actual root directory - on the filesystem, and any non-absolute patterns will - still be matched in the 'cwd'. - - To start absolute and non-absolute patterns in the same - path, you can use '--root=' to set it to the empty - string. However, be aware that on Windows systems, a - pattern like 'x:/*' or '//host/share/*' will *always* - start in the 'x:/' or '//host/share/' directory, - regardless of the --root setting. - `, - }, - platform: { - description: `Defaults to the value of 'process.platform' if - available, or 'linux' if not. Setting --platform=win32 - on non-Windows systems may cause strange behavior!`, - validOptions: [ - 'aix', - 'android', - 'darwin', - 'freebsd', - 'haiku', - 'linux', - 'openbsd', - 'sunos', - 'win32', - 'cygwin', - 'netbsd', - ], - }, -}) - .optList({ - ignore: { - short: 'i', - description: `Glob patterns to ignore`, - }, -}) - .flag({ - debug: { - short: 'v', - description: `Output a huge amount of noisy debug information about - patterns as they are parsed and used to match files.`, - }, -}) - .flag({ - help: { - short: 'h', - description: 'Show this usage information', - }, -}); -try { - const { positionals, values } = j.parse(); - if (values.help) { - console.log(j.usage()); - process.exit(0); - } - if (positionals.length === 0 && !values.default) - throw 'No patterns provided'; - if (positionals.length === 0 && values.default) - positionals.push(values.default); - const patterns = values.all ? positionals : positionals.filter(p => !existsSync(p)); - const matches = values.all ? - [] - : positionals.filter(p => existsSync(p)).map(p => join(p)); - const stream = globStream(patterns, { - absolute: values.absolute, - cwd: values.cwd, - dot: values.dot, - dotRelative: values['dot-relative'], - follow: values.follow, - ignore: values.ignore, - mark: values.mark, - matchBase: values['match-base'], - maxDepth: values['max-depth'], - nobrace: values.nobrace, - nocase: values.nocase, - nodir: values.nodir, - noext: values.noext, - noglobstar: values.noglobstar, - platform: values.platform, - realpath: values.realpath, - root: values.root, - stat: values.stat, - debug: values.debug, - posix: values.posix, - }); - const cmd = values.cmd; - if (!cmd) { - matches.forEach(m => console.log(m)); - stream.on('data', f => console.log(f)); - } - else { - stream.on('data', f => matches.push(f)); - stream.on('end', () => foregroundChild(cmd, matches, { shell: true })); - } -} -catch (e) { - console.error(j.usage()); - console.error(e instanceof Error ? e.message : String(e)); - process.exit(1); -} -//# sourceMappingURL=bin.mjs.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/bin.mjs.map b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/bin.mjs.map deleted file mode 100644 index 67247d5b4634a5..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/bin.mjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"bin.mjs","sourceRoot":"","sources":["../../src/bin.mts"],"names":[],"mappings":";AACA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvC,MAAM,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAA;AAEvE,MAAM,CAAC,GAAG,IAAI,CAAC;IACb,KAAK,EAAE,4CAA4C;CACpD,CAAC;KACC,WAAW,CACV;YACQ,OAAO;;;;GAIhB,CACA;KACA,GAAG,CAAC;IACH,GAAG,EAAE;QACH,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,SAAS;QACf,WAAW,EAAE;0CACuB;KACrC;CACF,CAAC;KACD,GAAG,CAAC;IACH,OAAO,EAAE;QACP,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,SAAS;QACf,WAAW,EAAE;iCACc;KAC5B;CACF,CAAC;KACD,IAAI,CAAC;IACJ,GAAG,EAAE;QACH,KAAK,EAAE,GAAG;QACV,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;OAqBZ;KACF;IACD,QAAQ,EAAE;QACR,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,0BAA0B;KACxC;IACD,cAAc,EAAE;QACd,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,kCAAkC;KAChD;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,uCAAuC;KACrD;IACD,KAAK,EAAE;QACL,KAAK,EAAE,GAAG;QACV,WAAW,EAAE;;;;;OAKZ;KACF;IAED,MAAM,EAAE;QACN,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,kDAAkD;KAChE;IACD,QAAQ,EAAE;QACR,KAAK,EAAE,GAAG;QACV,WAAW,EAAE;;;+DAG4C;KAC1D;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,GAAG;QACV,WAAW,EAAE;wDACqC;KACnD;IACD,YAAY,EAAE;QACZ,KAAK,EAAE,GAAG;QACV,WAAW,EAAE;;;;OAIZ;KACF;IAED,GAAG,EAAE;QACH,WAAW,EAAE;;OAEZ;KACF;IACD,OAAO,EAAE;QACP,WAAW,EAAE,8BAA8B;KAC5C;IACD,MAAM,EAAE;QACN,WAAW,EAAE;;;;;;;;;OASZ;KACF;IACD,KAAK,EAAE;QACL,WAAW,EAAE;;;;OAIZ;KACF;IACD,KAAK,EAAE;QACL,WAAW,EAAE,kDAAkD;KAChE;IACD,UAAU,EAAE;QACV,WAAW,EAAE;0DACuC;KACrD;IACD,wBAAwB,EAAE;QACxB,WAAW,EAAE;;sDAEmC;KACjD;CACF,CAAC;KACD,GAAG,CAAC;IACH,WAAW,EAAE;QACX,KAAK,EAAE,GAAG;QACV,WAAW,EAAE;sCACmB;KACjC;CACF,CAAC;KACD,GAAG,CAAC;IACH,GAAG,EAAE;QACH,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,+CAA+C;QAC5D,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE;KACvB;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,GAAG;QACV,WAAW,EAAE;;;;;;;;;;;;;;;;;;;OAmBZ;KACF;IACD,QAAQ,EAAE;QACR,WAAW,EAAE;;uEAEoD;QACjE,YAAY,EAAE;YACZ,KAAK;YACL,SAAS;YACT,QAAQ;YACR,SAAS;YACT,OAAO;YACP,OAAO;YACP,SAAS;YACT,OAAO;YACP,OAAO;YACP,QAAQ;YACR,QAAQ;SACT;KACF;CACF,CAAC;KACD,OAAO,CAAC;IACP,MAAM,EAAE;QACN,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,yBAAyB;KACvC;CACF,CAAC;KACD,IAAI,CAAC;IACJ,KAAK,EAAE;QACL,KAAK,EAAE,GAAG;QACV,WAAW,EAAE;yEACsD;KACpE;CACF,CAAC;KACD,IAAI,CAAC;IACJ,IAAI,EAAE;QACJ,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,6BAA6B;KAC3C;CACF,CAAC,CAAA;AAEJ,IAAI,CAAC;IACH,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,CAAA;IACzC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;QACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO;QAC7C,MAAM,sBAAsB,CAAA;IAC9B,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO;QAC5C,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAClC,MAAM,QAAQ,GACZ,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;IACpE,MAAM,OAAO,GACX,MAAM,CAAC,GAAG,CAAC,CAAC;QACV,EAAE;QACJ,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IAC5D,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,EAAE;QAClC,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,WAAW,EAAE,MAAM,CAAC,cAAc,CAAC;QACnC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,SAAS,EAAE,MAAM,CAAC,YAAY,CAAC;QAC/B,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC;QAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,QAAQ,EAAE,MAAM,CAAC,QAAuC;QACxD,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC,CAAA;IAEF,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAA;IACtB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QACpC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACxC,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QACvC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IACxE,CAAC;AACH,CAAC;AAAC,OAAO,CAAC,EAAE,CAAC;IACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;IACxB,OAAO,CAAC,KAAK,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC","sourcesContent":["#!/usr/bin/env node\nimport { foregroundChild } from 'foreground-child'\nimport { existsSync } from 'fs'\nimport { jack } from 'jackspeak'\nimport { loadPackageJson } from 'package-json-from-dist'\nimport { join } from 'path'\nimport { globStream } from './index.js'\n\nconst { version } = loadPackageJson(import.meta.url, '../package.json')\n\nconst j = jack({\n usage: 'glob [options] [ [ ...]]',\n})\n .description(\n `\n Glob v${version}\n\n Expand the positional glob expression arguments into any matching file\n system paths found.\n `,\n )\n .opt({\n cmd: {\n short: 'c',\n hint: 'command',\n description: `Run the command provided, passing the glob expression\n matches as arguments.`,\n },\n })\n .opt({\n default: {\n short: 'p',\n hint: 'pattern',\n description: `If no positional arguments are provided, glob will use\n this pattern`,\n },\n })\n .flag({\n all: {\n short: 'A',\n description: `By default, the glob cli command will not expand any\n arguments that are an exact match to a file on disk.\n\n This prevents double-expanding, in case the shell expands\n an argument whose filename is a glob expression.\n\n For example, if 'app/*.ts' would match 'app/[id].ts', then\n on Windows powershell or cmd.exe, 'glob app/*.ts' will\n expand to 'app/[id].ts', as expected. However, in posix\n shells such as bash or zsh, the shell will first expand\n 'app/*.ts' to a list of filenames. Then glob will look\n for a file matching 'app/[id].ts' (ie, 'app/i.ts' or\n 'app/d.ts'), which is unexpected.\n\n Setting '--all' prevents this behavior, causing glob\n to treat ALL patterns as glob expressions to be expanded,\n even if they are an exact match to a file on disk.\n\n When setting this option, be sure to enquote arguments\n so that the shell will not expand them prior to passing\n them to the glob command process.\n `,\n },\n absolute: {\n short: 'a',\n description: 'Expand to absolute paths',\n },\n 'dot-relative': {\n short: 'd',\n description: `Prepend './' on relative matches`,\n },\n mark: {\n short: 'm',\n description: `Append a / on any directories matched`,\n },\n posix: {\n short: 'x',\n description: `Always resolve to posix style paths, using '/' as the\n directory separator, even on Windows. Drive letter\n absolute matches on Windows will be expanded to their\n full resolved UNC maths, eg instead of 'C:\\\\foo\\\\bar',\n it will expand to '//?/C:/foo/bar'.\n `,\n },\n\n follow: {\n short: 'f',\n description: `Follow symlinked directories when expanding '**'`,\n },\n realpath: {\n short: 'R',\n description: `Call 'fs.realpath' on all of the results. In the case\n of an entry that cannot be resolved, the entry is\n omitted. This incurs a slight performance penalty, of\n course, because of the added system calls.`,\n },\n stat: {\n short: 's',\n description: `Call 'fs.lstat' on all entries, whether required or not\n to determine if it's a valid match.`,\n },\n 'match-base': {\n short: 'b',\n description: `Perform a basename-only match if the pattern does not\n contain any slash characters. That is, '*.js' would be\n treated as equivalent to '**/*.js', matching js files\n in all directories.\n `,\n },\n\n dot: {\n description: `Allow patterns to match files/directories that start\n with '.', even if the pattern does not start with '.'\n `,\n },\n nobrace: {\n description: 'Do not expand {...} patterns',\n },\n nocase: {\n description: `Perform a case-insensitive match. This defaults to\n 'true' on macOS and Windows platforms, and false on\n all others.\n\n Note: 'nocase' should only be explicitly set when it is\n known that the filesystem's case sensitivity differs\n from the platform default. If set 'true' on\n case-insensitive file systems, then the walk may return\n more or less results than expected.\n `,\n },\n nodir: {\n description: `Do not match directories, only files.\n\n Note: to *only* match directories, append a '/' at the\n end of the pattern.\n `,\n },\n noext: {\n description: `Do not expand extglob patterns, such as '+(a|b)'`,\n },\n noglobstar: {\n description: `Do not expand '**' against multiple path portions.\n Ie, treat it as a normal '*' instead.`,\n },\n 'windows-path-no-escape': {\n description: `Use '\\\\' as a path separator *only*, and *never* as an\n escape character. If set, all '\\\\' characters are\n replaced with '/' in the pattern.`,\n },\n })\n .num({\n 'max-depth': {\n short: 'D',\n description: `Maximum depth to traverse from the current\n working directory`,\n },\n })\n .opt({\n cwd: {\n short: 'C',\n description: 'Current working directory to execute/match in',\n default: process.cwd(),\n },\n root: {\n short: 'r',\n description: `A string path resolved against the 'cwd', which is\n used as the starting point for absolute patterns that\n start with '/' (but not drive letters or UNC paths\n on Windows).\n\n Note that this *doesn't* necessarily limit the walk to\n the 'root' directory, and doesn't affect the cwd\n starting point for non-absolute patterns. A pattern\n containing '..' will still be able to traverse out of\n the root directory, if it is not an actual root directory\n on the filesystem, and any non-absolute patterns will\n still be matched in the 'cwd'.\n\n To start absolute and non-absolute patterns in the same\n path, you can use '--root=' to set it to the empty\n string. However, be aware that on Windows systems, a\n pattern like 'x:/*' or '//host/share/*' will *always*\n start in the 'x:/' or '//host/share/' directory,\n regardless of the --root setting.\n `,\n },\n platform: {\n description: `Defaults to the value of 'process.platform' if\n available, or 'linux' if not. Setting --platform=win32\n on non-Windows systems may cause strange behavior!`,\n validOptions: [\n 'aix',\n 'android',\n 'darwin',\n 'freebsd',\n 'haiku',\n 'linux',\n 'openbsd',\n 'sunos',\n 'win32',\n 'cygwin',\n 'netbsd',\n ],\n },\n })\n .optList({\n ignore: {\n short: 'i',\n description: `Glob patterns to ignore`,\n },\n })\n .flag({\n debug: {\n short: 'v',\n description: `Output a huge amount of noisy debug information about\n patterns as they are parsed and used to match files.`,\n },\n })\n .flag({\n help: {\n short: 'h',\n description: 'Show this usage information',\n },\n })\n\ntry {\n const { positionals, values } = j.parse()\n if (values.help) {\n console.log(j.usage())\n process.exit(0)\n }\n if (positionals.length === 0 && !values.default)\n throw 'No patterns provided'\n if (positionals.length === 0 && values.default)\n positionals.push(values.default)\n const patterns =\n values.all ? positionals : positionals.filter(p => !existsSync(p))\n const matches =\n values.all ?\n []\n : positionals.filter(p => existsSync(p)).map(p => join(p))\n const stream = globStream(patterns, {\n absolute: values.absolute,\n cwd: values.cwd,\n dot: values.dot,\n dotRelative: values['dot-relative'],\n follow: values.follow,\n ignore: values.ignore,\n mark: values.mark,\n matchBase: values['match-base'],\n maxDepth: values['max-depth'],\n nobrace: values.nobrace,\n nocase: values.nocase,\n nodir: values.nodir,\n noext: values.noext,\n noglobstar: values.noglobstar,\n platform: values.platform as undefined | NodeJS.Platform,\n realpath: values.realpath,\n root: values.root,\n stat: values.stat,\n debug: values.debug,\n posix: values.posix,\n })\n\n const cmd = values.cmd\n if (!cmd) {\n matches.forEach(m => console.log(m))\n stream.on('data', f => console.log(f))\n } else {\n stream.on('data', f => matches.push(f))\n stream.on('end', () => foregroundChild(cmd, matches, { shell: true }))\n }\n} catch (e) {\n console.error(j.usage())\n console.error(e instanceof Error ? e.message : String(e))\n process.exit(1)\n}\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/glob.d.ts b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/glob.d.ts deleted file mode 100644 index 25262b3ddf489e..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/glob.d.ts +++ /dev/null @@ -1,388 +0,0 @@ -import { Minimatch } from 'minimatch'; -import { Minipass } from 'minipass'; -import { FSOption, Path, PathScurry } from 'path-scurry'; -import { IgnoreLike } from './ignore.js'; -import { Pattern } from './pattern.js'; -export type MatchSet = Minimatch['set']; -export type GlobParts = Exclude; -/** - * A `GlobOptions` object may be provided to any of the exported methods, and - * must be provided to the `Glob` constructor. - * - * All options are optional, boolean, and false by default, unless otherwise - * noted. - * - * All resolved options are added to the Glob object as properties. - * - * If you are running many `glob` operations, you can pass a Glob object as the - * `options` argument to a subsequent operation to share the previously loaded - * cache. - */ -export interface GlobOptions { - /** - * Set to `true` to always receive absolute paths for - * matched files. Set to `false` to always return relative paths. - * - * When this option is not set, absolute paths are returned for patterns - * that are absolute, and otherwise paths are returned that are relative - * to the `cwd` setting. - * - * This does _not_ make an extra system call to get - * the realpath, it only does string path resolution. - * - * Conflicts with {@link withFileTypes} - */ - absolute?: boolean; - /** - * Set to false to enable {@link windowsPathsNoEscape} - * - * @deprecated - */ - allowWindowsEscape?: boolean; - /** - * The current working directory in which to search. Defaults to - * `process.cwd()`. - * - * May be eiher a string path or a `file://` URL object or string. - */ - cwd?: string | URL; - /** - * Include `.dot` files in normal matches and `globstar` - * matches. Note that an explicit dot in a portion of the pattern - * will always match dot files. - */ - dot?: boolean; - /** - * Prepend all relative path strings with `./` (or `.\` on Windows). - * - * Without this option, returned relative paths are "bare", so instead of - * returning `'./foo/bar'`, they are returned as `'foo/bar'`. - * - * Relative patterns starting with `'../'` are not prepended with `./`, even - * if this option is set. - */ - dotRelative?: boolean; - /** - * Follow symlinked directories when expanding `**` - * patterns. This can result in a lot of duplicate references in - * the presence of cyclic links, and make performance quite bad. - * - * By default, a `**` in a pattern will follow 1 symbolic link if - * it is not the first item in the pattern, or none if it is the - * first item in the pattern, following the same behavior as Bash. - */ - follow?: boolean; - /** - * string or string[], or an object with `ignore` and `ignoreChildren` - * methods. - * - * If a string or string[] is provided, then this is treated as a glob - * pattern or array of glob patterns to exclude from matches. To ignore all - * children within a directory, as well as the entry itself, append `'/**'` - * to the ignore pattern. - * - * **Note** `ignore` patterns are _always_ in `dot:true` mode, regardless of - * any other settings. - * - * If an object is provided that has `ignored(path)` and/or - * `childrenIgnored(path)` methods, then these methods will be called to - * determine whether any Path is a match or if its children should be - * traversed, respectively. - */ - ignore?: string | string[] | IgnoreLike; - /** - * Treat brace expansion like `{a,b}` as a "magic" pattern. Has no - * effect if {@link nobrace} is set. - * - * Only has effect on the {@link hasMagic} function. - */ - magicalBraces?: boolean; - /** - * Add a `/` character to directory matches. Note that this requires - * additional stat calls in some cases. - */ - mark?: boolean; - /** - * Perform a basename-only match if the pattern does not contain any slash - * characters. That is, `*.js` would be treated as equivalent to - * `**\/*.js`, matching all js files in all directories. - */ - matchBase?: boolean; - /** - * Limit the directory traversal to a given depth below the cwd. - * Note that this does NOT prevent traversal to sibling folders, - * root patterns, and so on. It only limits the maximum folder depth - * that the walk will descend, relative to the cwd. - */ - maxDepth?: number; - /** - * Do not expand `{a,b}` and `{1..3}` brace sets. - */ - nobrace?: boolean; - /** - * Perform a case-insensitive match. This defaults to `true` on macOS and - * Windows systems, and `false` on all others. - * - * **Note** `nocase` should only be explicitly set when it is - * known that the filesystem's case sensitivity differs from the - * platform default. If set `true` on case-sensitive file - * systems, or `false` on case-insensitive file systems, then the - * walk may return more or less results than expected. - */ - nocase?: boolean; - /** - * Do not match directories, only files. (Note: to match - * _only_ directories, put a `/` at the end of the pattern.) - */ - nodir?: boolean; - /** - * Do not match "extglob" patterns such as `+(a|b)`. - */ - noext?: boolean; - /** - * Do not match `**` against multiple filenames. (Ie, treat it as a normal - * `*` instead.) - * - * Conflicts with {@link matchBase} - */ - noglobstar?: boolean; - /** - * Defaults to value of `process.platform` if available, or `'linux'` if - * not. Setting `platform:'win32'` on non-Windows systems may cause strange - * behavior. - */ - platform?: NodeJS.Platform; - /** - * Set to true to call `fs.realpath` on all of the - * results. In the case of an entry that cannot be resolved, the - * entry is omitted. This incurs a slight performance penalty, of - * course, because of the added system calls. - */ - realpath?: boolean; - /** - * - * A string path resolved against the `cwd` option, which - * is used as the starting point for absolute patterns that start - * with `/`, (but not drive letters or UNC paths on Windows). - * - * Note that this _doesn't_ necessarily limit the walk to the - * `root` directory, and doesn't affect the cwd starting point for - * non-absolute patterns. A pattern containing `..` will still be - * able to traverse out of the root directory, if it is not an - * actual root directory on the filesystem, and any non-absolute - * patterns will be matched in the `cwd`. For example, the - * pattern `/../*` with `{root:'/some/path'}` will return all - * files in `/some`, not all files in `/some/path`. The pattern - * `*` with `{root:'/some/path'}` will return all the entries in - * the cwd, not the entries in `/some/path`. - * - * To start absolute and non-absolute patterns in the same - * path, you can use `{root:''}`. However, be aware that on - * Windows systems, a pattern like `x:/*` or `//host/share/*` will - * _always_ start in the `x:/` or `//host/share` directory, - * regardless of the `root` setting. - */ - root?: string; - /** - * A [PathScurry](http://npm.im/path-scurry) object used - * to traverse the file system. If the `nocase` option is set - * explicitly, then any provided `scurry` object must match this - * setting. - */ - scurry?: PathScurry; - /** - * Call `lstat()` on all entries, whether required or not to determine - * if it's a valid match. When used with {@link withFileTypes}, this means - * that matches will include data such as modified time, permissions, and - * so on. Note that this will incur a performance cost due to the added - * system calls. - */ - stat?: boolean; - /** - * An AbortSignal which will cancel the Glob walk when - * triggered. - */ - signal?: AbortSignal; - /** - * Use `\\` as a path separator _only_, and - * _never_ as an escape character. If set, all `\\` characters are - * replaced with `/` in the pattern. - * - * Note that this makes it **impossible** to match against paths - * containing literal glob pattern characters, but allows matching - * with patterns constructed using `path.join()` and - * `path.resolve()` on Windows platforms, mimicking the (buggy!) - * behavior of Glob v7 and before on Windows. Please use with - * caution, and be mindful of [the caveat below about Windows - * paths](#windows). (For legacy reasons, this is also set if - * `allowWindowsEscape` is set to the exact value `false`.) - */ - windowsPathsNoEscape?: boolean; - /** - * Return [PathScurry](http://npm.im/path-scurry) - * `Path` objects instead of strings. These are similar to a - * NodeJS `Dirent` object, but with additional methods and - * properties. - * - * Conflicts with {@link absolute} - */ - withFileTypes?: boolean; - /** - * An fs implementation to override some or all of the defaults. See - * http://npm.im/path-scurry for details about what can be overridden. - */ - fs?: FSOption; - /** - * Just passed along to Minimatch. Note that this makes all pattern - * matching operations slower and *extremely* noisy. - */ - debug?: boolean; - /** - * Return `/` delimited paths, even on Windows. - * - * On posix systems, this has no effect. But, on Windows, it means that - * paths will be `/` delimited, and absolute paths will be their full - * resolved UNC forms, eg instead of `'C:\\foo\\bar'`, it would return - * `'//?/C:/foo/bar'` - */ - posix?: boolean; - /** - * Do not match any children of any matches. For example, the pattern - * `**\/foo` would match `a/foo`, but not `a/foo/b/foo` in this mode. - * - * This is especially useful for cases like "find all `node_modules` - * folders, but not the ones in `node_modules`". - * - * In order to support this, the `Ignore` implementation must support an - * `add(pattern: string)` method. If using the default `Ignore` class, then - * this is fine, but if this is set to `false`, and a custom `Ignore` is - * provided that does not have an `add()` method, then it will throw an - * error. - * - * **Caveat** It *only* ignores matches that would be a descendant of a - * previous match, and only if that descendant is matched *after* the - * ancestor is encountered. Since the file system walk happens in - * indeterminate order, it's possible that a match will already be added - * before its ancestor, if multiple or braced patterns are used. - * - * For example: - * - * ```ts - * const results = await glob([ - * // likely to match first, since it's just a stat - * 'a/b/c/d/e/f', - * - * // this pattern is more complicated! It must to various readdir() - * // calls and test the results against a regular expression, and that - * // is certainly going to take a little bit longer. - * // - * // So, later on, it encounters a match at 'a/b/c/d/e', but it's too - * // late to ignore a/b/c/d/e/f, because it's already been emitted. - * 'a/[bdf]/?/[a-z]/*', - * ], { includeChildMatches: false }) - * ``` - * - * It's best to only set this to `false` if you can be reasonably sure that - * no components of the pattern will potentially match one another's file - * system descendants, or if the occasional included child entry will not - * cause problems. - * - * @default true - */ - includeChildMatches?: boolean; -} -export type GlobOptionsWithFileTypesTrue = GlobOptions & { - withFileTypes: true; - absolute?: undefined; - mark?: undefined; - posix?: undefined; -}; -export type GlobOptionsWithFileTypesFalse = GlobOptions & { - withFileTypes?: false; -}; -export type GlobOptionsWithFileTypesUnset = GlobOptions & { - withFileTypes?: undefined; -}; -export type Result = Opts extends GlobOptionsWithFileTypesTrue ? Path : Opts extends GlobOptionsWithFileTypesFalse ? string : Opts extends GlobOptionsWithFileTypesUnset ? string : string | Path; -export type Results = Result[]; -export type FileTypes = Opts extends GlobOptionsWithFileTypesTrue ? true : Opts extends GlobOptionsWithFileTypesFalse ? false : Opts extends GlobOptionsWithFileTypesUnset ? false : boolean; -/** - * An object that can perform glob pattern traversals. - */ -export declare class Glob implements GlobOptions { - absolute?: boolean; - cwd: string; - root?: string; - dot: boolean; - dotRelative: boolean; - follow: boolean; - ignore?: string | string[] | IgnoreLike; - magicalBraces: boolean; - mark?: boolean; - matchBase: boolean; - maxDepth: number; - nobrace: boolean; - nocase: boolean; - nodir: boolean; - noext: boolean; - noglobstar: boolean; - pattern: string[]; - platform: NodeJS.Platform; - realpath: boolean; - scurry: PathScurry; - stat: boolean; - signal?: AbortSignal; - windowsPathsNoEscape: boolean; - withFileTypes: FileTypes; - includeChildMatches: boolean; - /** - * The options provided to the constructor. - */ - opts: Opts; - /** - * An array of parsed immutable {@link Pattern} objects. - */ - patterns: Pattern[]; - /** - * All options are stored as properties on the `Glob` object. - * - * See {@link GlobOptions} for full options descriptions. - * - * Note that a previous `Glob` object can be passed as the - * `GlobOptions` to another `Glob` instantiation to re-use settings - * and caches with a new pattern. - * - * Traversal functions can be called multiple times to run the walk - * again. - */ - constructor(pattern: string | string[], opts: Opts); - /** - * Returns a Promise that resolves to the results array. - */ - walk(): Promise>; - /** - * synchronous {@link Glob.walk} - */ - walkSync(): Results; - /** - * Stream results asynchronously. - */ - stream(): Minipass, Result>; - /** - * Stream results synchronously. - */ - streamSync(): Minipass, Result>; - /** - * Default sync iteration function. Returns a Generator that - * iterates over the results. - */ - iterateSync(): Generator, void, void>; - [Symbol.iterator](): Generator, void, void>; - /** - * Default async iteration function. Returns an AsyncGenerator that - * iterates over the results. - */ - iterate(): AsyncGenerator, void, void>; - [Symbol.asyncIterator](): AsyncGenerator, void, void>; -} -//# sourceMappingURL=glob.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/glob.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/glob.d.ts.map deleted file mode 100644 index c32dc74c967741..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/glob.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../src/glob.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAoB,MAAM,WAAW,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAEnC,OAAO,EACL,QAAQ,EACR,IAAI,EACJ,UAAU,EAIX,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAGtC,MAAM,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,CAAA;AACvC,MAAM,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,CAAA;AAalE;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAElB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAE5B;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,CAAA;IAElB;;;;OAIG;IACH,GAAG,CAAC,EAAE,OAAO,CAAA;IAEb;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IAErB;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAEhB;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,UAAU,CAAA;IAEvC;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IAEvB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;IAEd;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IAEnB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IAEjB;;;;;;;;;OASG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAEhB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IAEf;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IAEf;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IAEpB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAA;IAE1B;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAElB;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IAEb;;;;;OAKG;IACH,MAAM,CAAC,EAAE,UAAU,CAAA;IAEnB;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;IAEd;;;OAGG;IACH,MAAM,CAAC,EAAE,WAAW,CAAA;IAEpB;;;;;;;;;;;;;OAaG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAE9B;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IAEvB;;;OAGG;IACH,EAAE,CAAC,EAAE,QAAQ,CAAA;IAEb;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IAEf;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IAEf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA0CG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAC9B;AAED,MAAM,MAAM,4BAA4B,GAAG,WAAW,GAAG;IACvD,aAAa,EAAE,IAAI,CAAA;IAEnB,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,6BAA6B,GAAG,WAAW,GAAG;IACxD,aAAa,CAAC,EAAE,KAAK,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,6BAA6B,GAAG,WAAW,GAAG;IACxD,aAAa,CAAC,EAAE,SAAS,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,MAAM,CAAC,IAAI,IACrB,IAAI,SAAS,4BAA4B,GAAG,IAAI,GAC9C,IAAI,SAAS,6BAA6B,GAAG,MAAM,GACnD,IAAI,SAAS,6BAA6B,GAAG,MAAM,GACnD,MAAM,GAAG,IAAI,CAAA;AACjB,MAAM,MAAM,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAA;AAE1C,MAAM,MAAM,SAAS,CAAC,IAAI,IACxB,IAAI,SAAS,4BAA4B,GAAG,IAAI,GAC9C,IAAI,SAAS,6BAA6B,GAAG,KAAK,GAClD,IAAI,SAAS,6BAA6B,GAAG,KAAK,GAClD,OAAO,CAAA;AAEX;;GAEG;AACH,qBAAa,IAAI,CAAC,IAAI,SAAS,WAAW,CAAE,YAAW,WAAW;IAChE,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,OAAO,CAAA;IACZ,WAAW,EAAE,OAAO,CAAA;IACpB,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,UAAU,CAAA;IACvC,aAAa,EAAE,OAAO,CAAA;IACtB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,OAAO,CAAA;IACf,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,EAAE,OAAO,CAAA;IACd,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAA;IACzB,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,EAAE,UAAU,CAAA;IAClB,IAAI,EAAE,OAAO,CAAA;IACb,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,oBAAoB,EAAE,OAAO,CAAA;IAC7B,aAAa,EAAE,SAAS,CAAC,IAAI,CAAC,CAAA;IAC9B,mBAAmB,EAAE,OAAO,CAAA;IAE5B;;OAEG;IACH,IAAI,EAAE,IAAI,CAAA;IAEV;;OAEG;IACH,QAAQ,EAAE,OAAO,EAAE,CAAA;IAEnB;;;;;;;;;;;OAWG;gBACS,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI;IA2HlD;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAoBpC;;OAEG;IACH,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBzB;;OAEG;IACH,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAc9C;;OAEG;IACH,UAAU,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAclD;;;OAGG;IACH,WAAW,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;IAGlD,CAAC,MAAM,CAAC,QAAQ,CAAC;IAIjB;;;OAGG;IACH,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;IAGnD,CAAC,MAAM,CAAC,aAAa,CAAC;CAGvB"} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/glob.js b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/glob.js deleted file mode 100644 index c9ff3b0036d945..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/glob.js +++ /dev/null @@ -1,243 +0,0 @@ -import { Minimatch } from 'minimatch'; -import { fileURLToPath } from 'node:url'; -import { PathScurry, PathScurryDarwin, PathScurryPosix, PathScurryWin32, } from 'path-scurry'; -import { Pattern } from './pattern.js'; -import { GlobStream, GlobWalker } from './walker.js'; -// if no process global, just call it linux. -// so we default to case-sensitive, / separators -const defaultPlatform = (typeof process === 'object' && - process && - typeof process.platform === 'string') ? - process.platform - : 'linux'; -/** - * An object that can perform glob pattern traversals. - */ -export class Glob { - absolute; - cwd; - root; - dot; - dotRelative; - follow; - ignore; - magicalBraces; - mark; - matchBase; - maxDepth; - nobrace; - nocase; - nodir; - noext; - noglobstar; - pattern; - platform; - realpath; - scurry; - stat; - signal; - windowsPathsNoEscape; - withFileTypes; - includeChildMatches; - /** - * The options provided to the constructor. - */ - opts; - /** - * An array of parsed immutable {@link Pattern} objects. - */ - patterns; - /** - * All options are stored as properties on the `Glob` object. - * - * See {@link GlobOptions} for full options descriptions. - * - * Note that a previous `Glob` object can be passed as the - * `GlobOptions` to another `Glob` instantiation to re-use settings - * and caches with a new pattern. - * - * Traversal functions can be called multiple times to run the walk - * again. - */ - constructor(pattern, opts) { - /* c8 ignore start */ - if (!opts) - throw new TypeError('glob options required'); - /* c8 ignore stop */ - this.withFileTypes = !!opts.withFileTypes; - this.signal = opts.signal; - this.follow = !!opts.follow; - this.dot = !!opts.dot; - this.dotRelative = !!opts.dotRelative; - this.nodir = !!opts.nodir; - this.mark = !!opts.mark; - if (!opts.cwd) { - this.cwd = ''; - } - else if (opts.cwd instanceof URL || opts.cwd.startsWith('file://')) { - opts.cwd = fileURLToPath(opts.cwd); - } - this.cwd = opts.cwd || ''; - this.root = opts.root; - this.magicalBraces = !!opts.magicalBraces; - this.nobrace = !!opts.nobrace; - this.noext = !!opts.noext; - this.realpath = !!opts.realpath; - this.absolute = opts.absolute; - this.includeChildMatches = opts.includeChildMatches !== false; - this.noglobstar = !!opts.noglobstar; - this.matchBase = !!opts.matchBase; - this.maxDepth = - typeof opts.maxDepth === 'number' ? opts.maxDepth : Infinity; - this.stat = !!opts.stat; - this.ignore = opts.ignore; - if (this.withFileTypes && this.absolute !== undefined) { - throw new Error('cannot set absolute and withFileTypes:true'); - } - if (typeof pattern === 'string') { - pattern = [pattern]; - } - this.windowsPathsNoEscape = - !!opts.windowsPathsNoEscape || - opts.allowWindowsEscape === - false; - if (this.windowsPathsNoEscape) { - pattern = pattern.map(p => p.replace(/\\/g, '/')); - } - if (this.matchBase) { - if (opts.noglobstar) { - throw new TypeError('base matching requires globstar'); - } - pattern = pattern.map(p => (p.includes('/') ? p : `./**/${p}`)); - } - this.pattern = pattern; - this.platform = opts.platform || defaultPlatform; - this.opts = { ...opts, platform: this.platform }; - if (opts.scurry) { - this.scurry = opts.scurry; - if (opts.nocase !== undefined && - opts.nocase !== opts.scurry.nocase) { - throw new Error('nocase option contradicts provided scurry option'); - } - } - else { - const Scurry = opts.platform === 'win32' ? PathScurryWin32 - : opts.platform === 'darwin' ? PathScurryDarwin - : opts.platform ? PathScurryPosix - : PathScurry; - this.scurry = new Scurry(this.cwd, { - nocase: opts.nocase, - fs: opts.fs, - }); - } - this.nocase = this.scurry.nocase; - // If you do nocase:true on a case-sensitive file system, then - // we need to use regexps instead of strings for non-magic - // path portions, because statting `aBc` won't return results - // for the file `AbC` for example. - const nocaseMagicOnly = this.platform === 'darwin' || this.platform === 'win32'; - const mmo = { - // default nocase based on platform - ...opts, - dot: this.dot, - matchBase: this.matchBase, - nobrace: this.nobrace, - nocase: this.nocase, - nocaseMagicOnly, - nocomment: true, - noext: this.noext, - nonegate: true, - optimizationLevel: 2, - platform: this.platform, - windowsPathsNoEscape: this.windowsPathsNoEscape, - debug: !!this.opts.debug, - }; - const mms = this.pattern.map(p => new Minimatch(p, mmo)); - const [matchSet, globParts] = mms.reduce((set, m) => { - set[0].push(...m.set); - set[1].push(...m.globParts); - return set; - }, [[], []]); - this.patterns = matchSet.map((set, i) => { - const g = globParts[i]; - /* c8 ignore start */ - if (!g) - throw new Error('invalid pattern object'); - /* c8 ignore stop */ - return new Pattern(set, g, 0, this.platform); - }); - } - async walk() { - // Walkers always return array of Path objects, so we just have to - // coerce them into the right shape. It will have already called - // realpath() if the option was set to do so, so we know that's cached. - // start out knowing the cwd, at least - return [ - ...(await new GlobWalker(this.patterns, this.scurry.cwd, { - ...this.opts, - maxDepth: this.maxDepth !== Infinity ? - this.maxDepth + this.scurry.cwd.depth() - : Infinity, - platform: this.platform, - nocase: this.nocase, - includeChildMatches: this.includeChildMatches, - }).walk()), - ]; - } - walkSync() { - return [ - ...new GlobWalker(this.patterns, this.scurry.cwd, { - ...this.opts, - maxDepth: this.maxDepth !== Infinity ? - this.maxDepth + this.scurry.cwd.depth() - : Infinity, - platform: this.platform, - nocase: this.nocase, - includeChildMatches: this.includeChildMatches, - }).walkSync(), - ]; - } - stream() { - return new GlobStream(this.patterns, this.scurry.cwd, { - ...this.opts, - maxDepth: this.maxDepth !== Infinity ? - this.maxDepth + this.scurry.cwd.depth() - : Infinity, - platform: this.platform, - nocase: this.nocase, - includeChildMatches: this.includeChildMatches, - }).stream(); - } - streamSync() { - return new GlobStream(this.patterns, this.scurry.cwd, { - ...this.opts, - maxDepth: this.maxDepth !== Infinity ? - this.maxDepth + this.scurry.cwd.depth() - : Infinity, - platform: this.platform, - nocase: this.nocase, - includeChildMatches: this.includeChildMatches, - }).streamSync(); - } - /** - * Default sync iteration function. Returns a Generator that - * iterates over the results. - */ - iterateSync() { - return this.streamSync()[Symbol.iterator](); - } - [Symbol.iterator]() { - return this.iterateSync(); - } - /** - * Default async iteration function. Returns an AsyncGenerator that - * iterates over the results. - */ - iterate() { - return this.stream()[Symbol.asyncIterator](); - } - [Symbol.asyncIterator]() { - return this.iterate(); - } -} -//# sourceMappingURL=glob.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/glob.js.map b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/glob.js.map deleted file mode 100644 index a62c3239827814..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/glob.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/glob.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAoB,MAAM,WAAW,CAAA;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAGL,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,eAAe,GAChB,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAKpD,4CAA4C;AAC5C,gDAAgD;AAChD,MAAM,eAAe,GACnB,CACE,OAAO,OAAO,KAAK,QAAQ;IAC3B,OAAO;IACP,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,CACrC,CAAC,CAAC;IACD,OAAO,CAAC,QAAQ;IAClB,CAAC,CAAC,OAAO,CAAA;AAyVX;;GAEG;AACH,MAAM,OAAO,IAAI;IACf,QAAQ,CAAU;IAClB,GAAG,CAAQ;IACX,IAAI,CAAS;IACb,GAAG,CAAS;IACZ,WAAW,CAAS;IACpB,MAAM,CAAS;IACf,MAAM,CAAiC;IACvC,aAAa,CAAS;IACtB,IAAI,CAAU;IACd,SAAS,CAAS;IAClB,QAAQ,CAAQ;IAChB,OAAO,CAAS;IAChB,MAAM,CAAS;IACf,KAAK,CAAS;IACd,KAAK,CAAS;IACd,UAAU,CAAS;IACnB,OAAO,CAAU;IACjB,QAAQ,CAAiB;IACzB,QAAQ,CAAS;IACjB,MAAM,CAAY;IAClB,IAAI,CAAS;IACb,MAAM,CAAc;IACpB,oBAAoB,CAAS;IAC7B,aAAa,CAAiB;IAC9B,mBAAmB,CAAS;IAE5B;;OAEG;IACH,IAAI,CAAM;IAEV;;OAEG;IACH,QAAQ,CAAW;IAEnB;;;;;;;;;;;OAWG;IACH,YAAY,OAA0B,EAAE,IAAU;QAChD,qBAAqB;QACrB,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,SAAS,CAAC,uBAAuB,CAAC,CAAA;QACvD,oBAAoB;QACpB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,aAAgC,CAAA;QAC5D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QACzB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAA;QAC3B,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAA;QACrB,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,CAAA;QACrC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAA;QACzB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAA;QACvB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,GAAG,GAAG,EAAE,CAAA;QACf,CAAC;aAAM,IAAI,IAAI,CAAC,GAAG,YAAY,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACrE,IAAI,CAAC,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACpC,CAAC;QACD,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,CAAA;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QACrB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,CAAA;QACzC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAA;QAC7B,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAA;QACzB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAA;QAC/B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;QAC7B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,KAAK,KAAK,CAAA;QAE7D,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAA;QACnC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAA;QACjC,IAAI,CAAC,QAAQ;YACX,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAA;QAC9D,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAA;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QAEzB,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;QAC/D,CAAC;QAED,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,GAAG,CAAC,OAAO,CAAC,CAAA;QACrB,CAAC;QAED,IAAI,CAAC,oBAAoB;YACvB,CAAC,CAAC,IAAI,CAAC,oBAAoB;gBAC1B,IAAyC,CAAC,kBAAkB;oBAC3D,KAAK,CAAA;QAET,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9B,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAA;QACnD,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,MAAM,IAAI,SAAS,CAAC,iCAAiC,CAAC,CAAA;YACxD,CAAC;YACD,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA;QACjE,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QAEtB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,eAAe,CAAA;QAChD,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAA;QAChD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;YACzB,IACE,IAAI,CAAC,MAAM,KAAK,SAAS;gBACzB,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,EAClC,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;YACrE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GACV,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe;gBAC3C,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB;oBAC/C,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAe;wBACjC,CAAC,CAAC,UAAU,CAAA;YACd,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;gBACjC,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,EAAE,EAAE,IAAI,CAAC,EAAE;aACZ,CAAC,CAAA;QACJ,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;QAEhC,8DAA8D;QAC9D,0DAA0D;QAC1D,6DAA6D;QAC7D,kCAAkC;QAClC,MAAM,eAAe,GACnB,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAA;QAEzD,MAAM,GAAG,GAAqB;YAC5B,mCAAmC;YACnC,GAAG,IAAI;YACP,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,eAAe;YACf,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,IAAI;YACd,iBAAiB,EAAE,CAAC;YACpB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;YAC/C,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;SACzB,CAAA;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QACxD,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,GAAG,CAAC,MAAM,CACtC,CAAC,GAA0B,EAAE,CAAC,EAAE,EAAE;YAChC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;YACrB,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAA;YAC3B,OAAO,GAAG,CAAA;QACZ,CAAC,EACD,CAAC,EAAE,EAAE,EAAE,CAAC,CACT,CAAA;QACD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YACtC,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;YACtB,qBAAqB;YACrB,IAAI,CAAC,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;YACjD,oBAAoB;YACpB,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC9C,CAAC,CAAC,CAAA;IACJ,CAAC;IAMD,KAAK,CAAC,IAAI;QACR,kEAAkE;QAClE,iEAAiE;QACjE,uEAAuE;QACvE,sCAAsC;QACtC,OAAO;YACL,GAAG,CAAC,MAAM,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;gBACvD,GAAG,IAAI,CAAC,IAAI;gBACZ,QAAQ,EACN,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;oBAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE;oBACzC,CAAC,CAAC,QAAQ;gBACZ,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;aAC9C,CAAC,CAAC,IAAI,EAAE,CAAC;SACX,CAAA;IACH,CAAC;IAMD,QAAQ;QACN,OAAO;YACL,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;gBAChD,GAAG,IAAI,CAAC,IAAI;gBACZ,QAAQ,EACN,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;oBAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE;oBACzC,CAAC,CAAC,QAAQ;gBACZ,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;aAC9C,CAAC,CAAC,QAAQ,EAAE;SACd,CAAA;IACH,CAAC;IAMD,MAAM;QACJ,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;YACpD,GAAG,IAAI,CAAC,IAAI;YACZ,QAAQ,EACN,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;gBAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE;gBACzC,CAAC,CAAC,QAAQ;YACZ,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;SAC9C,CAAC,CAAC,MAAM,EAAE,CAAA;IACb,CAAC;IAMD,UAAU;QACR,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;YACpD,GAAG,IAAI,CAAC,IAAI;YACZ,QAAQ,EACN,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;gBAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE;gBACzC,CAAC,CAAC,QAAQ;YACZ,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;SAC9C,CAAC,CAAC,UAAU,EAAE,CAAA;IACjB,CAAC;IAED;;;OAGG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAA;IAC7C,CAAC;IACD,CAAC,MAAM,CAAC,QAAQ,CAAC;QACf,OAAO,IAAI,CAAC,WAAW,EAAE,CAAA;IAC3B,CAAC;IAED;;;OAGG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAA;IAC9C,CAAC;IACD,CAAC,MAAM,CAAC,aAAa,CAAC;QACpB,OAAO,IAAI,CAAC,OAAO,EAAE,CAAA;IACvB,CAAC;CACF","sourcesContent":["import { Minimatch, MinimatchOptions } from 'minimatch'\nimport { Minipass } from 'minipass'\nimport { fileURLToPath } from 'node:url'\nimport {\n FSOption,\n Path,\n PathScurry,\n PathScurryDarwin,\n PathScurryPosix,\n PathScurryWin32,\n} from 'path-scurry'\nimport { IgnoreLike } from './ignore.js'\nimport { Pattern } from './pattern.js'\nimport { GlobStream, GlobWalker } from './walker.js'\n\nexport type MatchSet = Minimatch['set']\nexport type GlobParts = Exclude\n\n// if no process global, just call it linux.\n// so we default to case-sensitive, / separators\nconst defaultPlatform: NodeJS.Platform =\n (\n typeof process === 'object' &&\n process &&\n typeof process.platform === 'string'\n ) ?\n process.platform\n : 'linux'\n\n/**\n * A `GlobOptions` object may be provided to any of the exported methods, and\n * must be provided to the `Glob` constructor.\n *\n * All options are optional, boolean, and false by default, unless otherwise\n * noted.\n *\n * All resolved options are added to the Glob object as properties.\n *\n * If you are running many `glob` operations, you can pass a Glob object as the\n * `options` argument to a subsequent operation to share the previously loaded\n * cache.\n */\nexport interface GlobOptions {\n /**\n * Set to `true` to always receive absolute paths for\n * matched files. Set to `false` to always return relative paths.\n *\n * When this option is not set, absolute paths are returned for patterns\n * that are absolute, and otherwise paths are returned that are relative\n * to the `cwd` setting.\n *\n * This does _not_ make an extra system call to get\n * the realpath, it only does string path resolution.\n *\n * Conflicts with {@link withFileTypes}\n */\n absolute?: boolean\n\n /**\n * Set to false to enable {@link windowsPathsNoEscape}\n *\n * @deprecated\n */\n allowWindowsEscape?: boolean\n\n /**\n * The current working directory in which to search. Defaults to\n * `process.cwd()`.\n *\n * May be eiher a string path or a `file://` URL object or string.\n */\n cwd?: string | URL\n\n /**\n * Include `.dot` files in normal matches and `globstar`\n * matches. Note that an explicit dot in a portion of the pattern\n * will always match dot files.\n */\n dot?: boolean\n\n /**\n * Prepend all relative path strings with `./` (or `.\\` on Windows).\n *\n * Without this option, returned relative paths are \"bare\", so instead of\n * returning `'./foo/bar'`, they are returned as `'foo/bar'`.\n *\n * Relative patterns starting with `'../'` are not prepended with `./`, even\n * if this option is set.\n */\n dotRelative?: boolean\n\n /**\n * Follow symlinked directories when expanding `**`\n * patterns. This can result in a lot of duplicate references in\n * the presence of cyclic links, and make performance quite bad.\n *\n * By default, a `**` in a pattern will follow 1 symbolic link if\n * it is not the first item in the pattern, or none if it is the\n * first item in the pattern, following the same behavior as Bash.\n */\n follow?: boolean\n\n /**\n * string or string[], or an object with `ignore` and `ignoreChildren`\n * methods.\n *\n * If a string or string[] is provided, then this is treated as a glob\n * pattern or array of glob patterns to exclude from matches. To ignore all\n * children within a directory, as well as the entry itself, append `'/**'`\n * to the ignore pattern.\n *\n * **Note** `ignore` patterns are _always_ in `dot:true` mode, regardless of\n * any other settings.\n *\n * If an object is provided that has `ignored(path)` and/or\n * `childrenIgnored(path)` methods, then these methods will be called to\n * determine whether any Path is a match or if its children should be\n * traversed, respectively.\n */\n ignore?: string | string[] | IgnoreLike\n\n /**\n * Treat brace expansion like `{a,b}` as a \"magic\" pattern. Has no\n * effect if {@link nobrace} is set.\n *\n * Only has effect on the {@link hasMagic} function.\n */\n magicalBraces?: boolean\n\n /**\n * Add a `/` character to directory matches. Note that this requires\n * additional stat calls in some cases.\n */\n mark?: boolean\n\n /**\n * Perform a basename-only match if the pattern does not contain any slash\n * characters. That is, `*.js` would be treated as equivalent to\n * `**\\/*.js`, matching all js files in all directories.\n */\n matchBase?: boolean\n\n /**\n * Limit the directory traversal to a given depth below the cwd.\n * Note that this does NOT prevent traversal to sibling folders,\n * root patterns, and so on. It only limits the maximum folder depth\n * that the walk will descend, relative to the cwd.\n */\n maxDepth?: number\n\n /**\n * Do not expand `{a,b}` and `{1..3}` brace sets.\n */\n nobrace?: boolean\n\n /**\n * Perform a case-insensitive match. This defaults to `true` on macOS and\n * Windows systems, and `false` on all others.\n *\n * **Note** `nocase` should only be explicitly set when it is\n * known that the filesystem's case sensitivity differs from the\n * platform default. If set `true` on case-sensitive file\n * systems, or `false` on case-insensitive file systems, then the\n * walk may return more or less results than expected.\n */\n nocase?: boolean\n\n /**\n * Do not match directories, only files. (Note: to match\n * _only_ directories, put a `/` at the end of the pattern.)\n */\n nodir?: boolean\n\n /**\n * Do not match \"extglob\" patterns such as `+(a|b)`.\n */\n noext?: boolean\n\n /**\n * Do not match `**` against multiple filenames. (Ie, treat it as a normal\n * `*` instead.)\n *\n * Conflicts with {@link matchBase}\n */\n noglobstar?: boolean\n\n /**\n * Defaults to value of `process.platform` if available, or `'linux'` if\n * not. Setting `platform:'win32'` on non-Windows systems may cause strange\n * behavior.\n */\n platform?: NodeJS.Platform\n\n /**\n * Set to true to call `fs.realpath` on all of the\n * results. In the case of an entry that cannot be resolved, the\n * entry is omitted. This incurs a slight performance penalty, of\n * course, because of the added system calls.\n */\n realpath?: boolean\n\n /**\n *\n * A string path resolved against the `cwd` option, which\n * is used as the starting point for absolute patterns that start\n * with `/`, (but not drive letters or UNC paths on Windows).\n *\n * Note that this _doesn't_ necessarily limit the walk to the\n * `root` directory, and doesn't affect the cwd starting point for\n * non-absolute patterns. A pattern containing `..` will still be\n * able to traverse out of the root directory, if it is not an\n * actual root directory on the filesystem, and any non-absolute\n * patterns will be matched in the `cwd`. For example, the\n * pattern `/../*` with `{root:'/some/path'}` will return all\n * files in `/some`, not all files in `/some/path`. The pattern\n * `*` with `{root:'/some/path'}` will return all the entries in\n * the cwd, not the entries in `/some/path`.\n *\n * To start absolute and non-absolute patterns in the same\n * path, you can use `{root:''}`. However, be aware that on\n * Windows systems, a pattern like `x:/*` or `//host/share/*` will\n * _always_ start in the `x:/` or `//host/share` directory,\n * regardless of the `root` setting.\n */\n root?: string\n\n /**\n * A [PathScurry](http://npm.im/path-scurry) object used\n * to traverse the file system. If the `nocase` option is set\n * explicitly, then any provided `scurry` object must match this\n * setting.\n */\n scurry?: PathScurry\n\n /**\n * Call `lstat()` on all entries, whether required or not to determine\n * if it's a valid match. When used with {@link withFileTypes}, this means\n * that matches will include data such as modified time, permissions, and\n * so on. Note that this will incur a performance cost due to the added\n * system calls.\n */\n stat?: boolean\n\n /**\n * An AbortSignal which will cancel the Glob walk when\n * triggered.\n */\n signal?: AbortSignal\n\n /**\n * Use `\\\\` as a path separator _only_, and\n * _never_ as an escape character. If set, all `\\\\` characters are\n * replaced with `/` in the pattern.\n *\n * Note that this makes it **impossible** to match against paths\n * containing literal glob pattern characters, but allows matching\n * with patterns constructed using `path.join()` and\n * `path.resolve()` on Windows platforms, mimicking the (buggy!)\n * behavior of Glob v7 and before on Windows. Please use with\n * caution, and be mindful of [the caveat below about Windows\n * paths](#windows). (For legacy reasons, this is also set if\n * `allowWindowsEscape` is set to the exact value `false`.)\n */\n windowsPathsNoEscape?: boolean\n\n /**\n * Return [PathScurry](http://npm.im/path-scurry)\n * `Path` objects instead of strings. These are similar to a\n * NodeJS `Dirent` object, but with additional methods and\n * properties.\n *\n * Conflicts with {@link absolute}\n */\n withFileTypes?: boolean\n\n /**\n * An fs implementation to override some or all of the defaults. See\n * http://npm.im/path-scurry for details about what can be overridden.\n */\n fs?: FSOption\n\n /**\n * Just passed along to Minimatch. Note that this makes all pattern\n * matching operations slower and *extremely* noisy.\n */\n debug?: boolean\n\n /**\n * Return `/` delimited paths, even on Windows.\n *\n * On posix systems, this has no effect. But, on Windows, it means that\n * paths will be `/` delimited, and absolute paths will be their full\n * resolved UNC forms, eg instead of `'C:\\\\foo\\\\bar'`, it would return\n * `'//?/C:/foo/bar'`\n */\n posix?: boolean\n\n /**\n * Do not match any children of any matches. For example, the pattern\n * `**\\/foo` would match `a/foo`, but not `a/foo/b/foo` in this mode.\n *\n * This is especially useful for cases like \"find all `node_modules`\n * folders, but not the ones in `node_modules`\".\n *\n * In order to support this, the `Ignore` implementation must support an\n * `add(pattern: string)` method. If using the default `Ignore` class, then\n * this is fine, but if this is set to `false`, and a custom `Ignore` is\n * provided that does not have an `add()` method, then it will throw an\n * error.\n *\n * **Caveat** It *only* ignores matches that would be a descendant of a\n * previous match, and only if that descendant is matched *after* the\n * ancestor is encountered. Since the file system walk happens in\n * indeterminate order, it's possible that a match will already be added\n * before its ancestor, if multiple or braced patterns are used.\n *\n * For example:\n *\n * ```ts\n * const results = await glob([\n * // likely to match first, since it's just a stat\n * 'a/b/c/d/e/f',\n *\n * // this pattern is more complicated! It must to various readdir()\n * // calls and test the results against a regular expression, and that\n * // is certainly going to take a little bit longer.\n * //\n * // So, later on, it encounters a match at 'a/b/c/d/e', but it's too\n * // late to ignore a/b/c/d/e/f, because it's already been emitted.\n * 'a/[bdf]/?/[a-z]/*',\n * ], { includeChildMatches: false })\n * ```\n *\n * It's best to only set this to `false` if you can be reasonably sure that\n * no components of the pattern will potentially match one another's file\n * system descendants, or if the occasional included child entry will not\n * cause problems.\n *\n * @default true\n */\n includeChildMatches?: boolean\n}\n\nexport type GlobOptionsWithFileTypesTrue = GlobOptions & {\n withFileTypes: true\n // string options not relevant if returning Path objects.\n absolute?: undefined\n mark?: undefined\n posix?: undefined\n}\n\nexport type GlobOptionsWithFileTypesFalse = GlobOptions & {\n withFileTypes?: false\n}\n\nexport type GlobOptionsWithFileTypesUnset = GlobOptions & {\n withFileTypes?: undefined\n}\n\nexport type Result =\n Opts extends GlobOptionsWithFileTypesTrue ? Path\n : Opts extends GlobOptionsWithFileTypesFalse ? string\n : Opts extends GlobOptionsWithFileTypesUnset ? string\n : string | Path\nexport type Results = Result[]\n\nexport type FileTypes =\n Opts extends GlobOptionsWithFileTypesTrue ? true\n : Opts extends GlobOptionsWithFileTypesFalse ? false\n : Opts extends GlobOptionsWithFileTypesUnset ? false\n : boolean\n\n/**\n * An object that can perform glob pattern traversals.\n */\nexport class Glob implements GlobOptions {\n absolute?: boolean\n cwd: string\n root?: string\n dot: boolean\n dotRelative: boolean\n follow: boolean\n ignore?: string | string[] | IgnoreLike\n magicalBraces: boolean\n mark?: boolean\n matchBase: boolean\n maxDepth: number\n nobrace: boolean\n nocase: boolean\n nodir: boolean\n noext: boolean\n noglobstar: boolean\n pattern: string[]\n platform: NodeJS.Platform\n realpath: boolean\n scurry: PathScurry\n stat: boolean\n signal?: AbortSignal\n windowsPathsNoEscape: boolean\n withFileTypes: FileTypes\n includeChildMatches: boolean\n\n /**\n * The options provided to the constructor.\n */\n opts: Opts\n\n /**\n * An array of parsed immutable {@link Pattern} objects.\n */\n patterns: Pattern[]\n\n /**\n * All options are stored as properties on the `Glob` object.\n *\n * See {@link GlobOptions} for full options descriptions.\n *\n * Note that a previous `Glob` object can be passed as the\n * `GlobOptions` to another `Glob` instantiation to re-use settings\n * and caches with a new pattern.\n *\n * Traversal functions can be called multiple times to run the walk\n * again.\n */\n constructor(pattern: string | string[], opts: Opts) {\n /* c8 ignore start */\n if (!opts) throw new TypeError('glob options required')\n /* c8 ignore stop */\n this.withFileTypes = !!opts.withFileTypes as FileTypes\n this.signal = opts.signal\n this.follow = !!opts.follow\n this.dot = !!opts.dot\n this.dotRelative = !!opts.dotRelative\n this.nodir = !!opts.nodir\n this.mark = !!opts.mark\n if (!opts.cwd) {\n this.cwd = ''\n } else if (opts.cwd instanceof URL || opts.cwd.startsWith('file://')) {\n opts.cwd = fileURLToPath(opts.cwd)\n }\n this.cwd = opts.cwd || ''\n this.root = opts.root\n this.magicalBraces = !!opts.magicalBraces\n this.nobrace = !!opts.nobrace\n this.noext = !!opts.noext\n this.realpath = !!opts.realpath\n this.absolute = opts.absolute\n this.includeChildMatches = opts.includeChildMatches !== false\n\n this.noglobstar = !!opts.noglobstar\n this.matchBase = !!opts.matchBase\n this.maxDepth =\n typeof opts.maxDepth === 'number' ? opts.maxDepth : Infinity\n this.stat = !!opts.stat\n this.ignore = opts.ignore\n\n if (this.withFileTypes && this.absolute !== undefined) {\n throw new Error('cannot set absolute and withFileTypes:true')\n }\n\n if (typeof pattern === 'string') {\n pattern = [pattern]\n }\n\n this.windowsPathsNoEscape =\n !!opts.windowsPathsNoEscape ||\n (opts as { allowWindowsEscape?: boolean }).allowWindowsEscape ===\n false\n\n if (this.windowsPathsNoEscape) {\n pattern = pattern.map(p => p.replace(/\\\\/g, '/'))\n }\n\n if (this.matchBase) {\n if (opts.noglobstar) {\n throw new TypeError('base matching requires globstar')\n }\n pattern = pattern.map(p => (p.includes('/') ? p : `./**/${p}`))\n }\n\n this.pattern = pattern\n\n this.platform = opts.platform || defaultPlatform\n this.opts = { ...opts, platform: this.platform }\n if (opts.scurry) {\n this.scurry = opts.scurry\n if (\n opts.nocase !== undefined &&\n opts.nocase !== opts.scurry.nocase\n ) {\n throw new Error('nocase option contradicts provided scurry option')\n }\n } else {\n const Scurry =\n opts.platform === 'win32' ? PathScurryWin32\n : opts.platform === 'darwin' ? PathScurryDarwin\n : opts.platform ? PathScurryPosix\n : PathScurry\n this.scurry = new Scurry(this.cwd, {\n nocase: opts.nocase,\n fs: opts.fs,\n })\n }\n this.nocase = this.scurry.nocase\n\n // If you do nocase:true on a case-sensitive file system, then\n // we need to use regexps instead of strings for non-magic\n // path portions, because statting `aBc` won't return results\n // for the file `AbC` for example.\n const nocaseMagicOnly =\n this.platform === 'darwin' || this.platform === 'win32'\n\n const mmo: MinimatchOptions = {\n // default nocase based on platform\n ...opts,\n dot: this.dot,\n matchBase: this.matchBase,\n nobrace: this.nobrace,\n nocase: this.nocase,\n nocaseMagicOnly,\n nocomment: true,\n noext: this.noext,\n nonegate: true,\n optimizationLevel: 2,\n platform: this.platform,\n windowsPathsNoEscape: this.windowsPathsNoEscape,\n debug: !!this.opts.debug,\n }\n\n const mms = this.pattern.map(p => new Minimatch(p, mmo))\n const [matchSet, globParts] = mms.reduce(\n (set: [MatchSet, GlobParts], m) => {\n set[0].push(...m.set)\n set[1].push(...m.globParts)\n return set\n },\n [[], []],\n )\n this.patterns = matchSet.map((set, i) => {\n const g = globParts[i]\n /* c8 ignore start */\n if (!g) throw new Error('invalid pattern object')\n /* c8 ignore stop */\n return new Pattern(set, g, 0, this.platform)\n })\n }\n\n /**\n * Returns a Promise that resolves to the results array.\n */\n async walk(): Promise>\n async walk(): Promise<(string | Path)[]> {\n // Walkers always return array of Path objects, so we just have to\n // coerce them into the right shape. It will have already called\n // realpath() if the option was set to do so, so we know that's cached.\n // start out knowing the cwd, at least\n return [\n ...(await new GlobWalker(this.patterns, this.scurry.cwd, {\n ...this.opts,\n maxDepth:\n this.maxDepth !== Infinity ?\n this.maxDepth + this.scurry.cwd.depth()\n : Infinity,\n platform: this.platform,\n nocase: this.nocase,\n includeChildMatches: this.includeChildMatches,\n }).walk()),\n ]\n }\n\n /**\n * synchronous {@link Glob.walk}\n */\n walkSync(): Results\n walkSync(): (string | Path)[] {\n return [\n ...new GlobWalker(this.patterns, this.scurry.cwd, {\n ...this.opts,\n maxDepth:\n this.maxDepth !== Infinity ?\n this.maxDepth + this.scurry.cwd.depth()\n : Infinity,\n platform: this.platform,\n nocase: this.nocase,\n includeChildMatches: this.includeChildMatches,\n }).walkSync(),\n ]\n }\n\n /**\n * Stream results asynchronously.\n */\n stream(): Minipass, Result>\n stream(): Minipass {\n return new GlobStream(this.patterns, this.scurry.cwd, {\n ...this.opts,\n maxDepth:\n this.maxDepth !== Infinity ?\n this.maxDepth + this.scurry.cwd.depth()\n : Infinity,\n platform: this.platform,\n nocase: this.nocase,\n includeChildMatches: this.includeChildMatches,\n }).stream()\n }\n\n /**\n * Stream results synchronously.\n */\n streamSync(): Minipass, Result>\n streamSync(): Minipass {\n return new GlobStream(this.patterns, this.scurry.cwd, {\n ...this.opts,\n maxDepth:\n this.maxDepth !== Infinity ?\n this.maxDepth + this.scurry.cwd.depth()\n : Infinity,\n platform: this.platform,\n nocase: this.nocase,\n includeChildMatches: this.includeChildMatches,\n }).streamSync()\n }\n\n /**\n * Default sync iteration function. Returns a Generator that\n * iterates over the results.\n */\n iterateSync(): Generator, void, void> {\n return this.streamSync()[Symbol.iterator]()\n }\n [Symbol.iterator]() {\n return this.iterateSync()\n }\n\n /**\n * Default async iteration function. Returns an AsyncGenerator that\n * iterates over the results.\n */\n iterate(): AsyncGenerator, void, void> {\n return this.stream()[Symbol.asyncIterator]()\n }\n [Symbol.asyncIterator]() {\n return this.iterate()\n }\n}\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/has-magic.d.ts b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/has-magic.d.ts deleted file mode 100644 index 8aec3bd9725175..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/has-magic.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { GlobOptions } from './glob.js'; -/** - * Return true if the patterns provided contain any magic glob characters, - * given the options provided. - * - * Brace expansion is not considered "magic" unless the `magicalBraces` option - * is set, as brace expansion just turns one string into an array of strings. - * So a pattern like `'x{a,b}y'` would return `false`, because `'xay'` and - * `'xby'` both do not contain any magic glob characters, and it's treated the - * same as if you had called it on `['xay', 'xby']`. When `magicalBraces:true` - * is in the options, brace expansion _is_ treated as a pattern having magic. - */ -export declare const hasMagic: (pattern: string | string[], options?: GlobOptions) => boolean; -//# sourceMappingURL=has-magic.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/has-magic.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/has-magic.d.ts.map deleted file mode 100644 index b24dd4ec47e0bb..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/has-magic.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"has-magic.d.ts","sourceRoot":"","sources":["../../src/has-magic.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAEvC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,QAAQ,YACV,MAAM,GAAG,MAAM,EAAE,YACjB,WAAW,KACnB,OAQF,CAAA"} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/has-magic.js b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/has-magic.js deleted file mode 100644 index ba2321ab868d02..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/has-magic.js +++ /dev/null @@ -1,23 +0,0 @@ -import { Minimatch } from 'minimatch'; -/** - * Return true if the patterns provided contain any magic glob characters, - * given the options provided. - * - * Brace expansion is not considered "magic" unless the `magicalBraces` option - * is set, as brace expansion just turns one string into an array of strings. - * So a pattern like `'x{a,b}y'` would return `false`, because `'xay'` and - * `'xby'` both do not contain any magic glob characters, and it's treated the - * same as if you had called it on `['xay', 'xby']`. When `magicalBraces:true` - * is in the options, brace expansion _is_ treated as a pattern having magic. - */ -export const hasMagic = (pattern, options = {}) => { - if (!Array.isArray(pattern)) { - pattern = [pattern]; - } - for (const p of pattern) { - if (new Minimatch(p, options).hasMagic()) - return true; - } - return false; -}; -//# sourceMappingURL=has-magic.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/has-magic.js.map b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/has-magic.js.map deleted file mode 100644 index a20f5aa2e0fdb5..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/has-magic.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"has-magic.js","sourceRoot":"","sources":["../../src/has-magic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAGrC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,OAA0B,EAC1B,UAAuB,EAAE,EAChB,EAAE;IACX,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAC,OAAO,CAAC,CAAA;IACrB,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,IAAI,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE;YAAE,OAAO,IAAI,CAAA;IACvD,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA","sourcesContent":["import { Minimatch } from 'minimatch'\nimport { GlobOptions } from './glob.js'\n\n/**\n * Return true if the patterns provided contain any magic glob characters,\n * given the options provided.\n *\n * Brace expansion is not considered \"magic\" unless the `magicalBraces` option\n * is set, as brace expansion just turns one string into an array of strings.\n * So a pattern like `'x{a,b}y'` would return `false`, because `'xay'` and\n * `'xby'` both do not contain any magic glob characters, and it's treated the\n * same as if you had called it on `['xay', 'xby']`. When `magicalBraces:true`\n * is in the options, brace expansion _is_ treated as a pattern having magic.\n */\nexport const hasMagic = (\n pattern: string | string[],\n options: GlobOptions = {},\n): boolean => {\n if (!Array.isArray(pattern)) {\n pattern = [pattern]\n }\n for (const p of pattern) {\n if (new Minimatch(p, options).hasMagic()) return true\n }\n return false\n}\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/ignore.d.ts b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/ignore.d.ts deleted file mode 100644 index 1893b16df877c9..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/ignore.d.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Minimatch, MinimatchOptions } from 'minimatch'; -import { Path } from 'path-scurry'; -import { GlobWalkerOpts } from './walker.js'; -export interface IgnoreLike { - ignored?: (p: Path) => boolean; - childrenIgnored?: (p: Path) => boolean; - add?: (ignore: string) => void; -} -/** - * Class used to process ignored patterns - */ -export declare class Ignore implements IgnoreLike { - relative: Minimatch[]; - relativeChildren: Minimatch[]; - absolute: Minimatch[]; - absoluteChildren: Minimatch[]; - platform: NodeJS.Platform; - mmopts: MinimatchOptions; - constructor(ignored: string[], { nobrace, nocase, noext, noglobstar, platform, }: GlobWalkerOpts); - add(ign: string): void; - ignored(p: Path): boolean; - childrenIgnored(p: Path): boolean; -} -//# sourceMappingURL=ignore.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/ignore.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/ignore.d.ts.map deleted file mode 100644 index 57d6ab6153d770..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/ignore.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ignore.d.ts","sourceRoot":"","sources":["../../src/ignore.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAElC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,OAAO,CAAA;IAC9B,eAAe,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,OAAO,CAAA;IACtC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;CAC/B;AAWD;;GAEG;AACH,qBAAa,MAAO,YAAW,UAAU;IACvC,QAAQ,EAAE,SAAS,EAAE,CAAA;IACrB,gBAAgB,EAAE,SAAS,EAAE,CAAA;IAC7B,QAAQ,EAAE,SAAS,EAAE,CAAA;IACrB,gBAAgB,EAAE,SAAS,EAAE,CAAA;IAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAA;IACzB,MAAM,EAAE,gBAAgB,CAAA;gBAGtB,OAAO,EAAE,MAAM,EAAE,EACjB,EACE,OAAO,EACP,MAAM,EACN,KAAK,EACL,UAAU,EACV,QAA0B,GAC3B,EAAE,cAAc;IAqBnB,GAAG,CAAC,GAAG,EAAE,MAAM;IAyCf,OAAO,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO;IAczB,eAAe,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO;CAWlC"} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/ignore.js b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/ignore.js deleted file mode 100644 index 539c4a4fdebc4b..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/ignore.js +++ /dev/null @@ -1,115 +0,0 @@ -// give it a pattern, and it'll be able to tell you if -// a given path should be ignored. -// Ignoring a path ignores its children if the pattern ends in /** -// Ignores are always parsed in dot:true mode -import { Minimatch } from 'minimatch'; -import { Pattern } from './pattern.js'; -const defaultPlatform = (typeof process === 'object' && - process && - typeof process.platform === 'string') ? - process.platform - : 'linux'; -/** - * Class used to process ignored patterns - */ -export class Ignore { - relative; - relativeChildren; - absolute; - absoluteChildren; - platform; - mmopts; - constructor(ignored, { nobrace, nocase, noext, noglobstar, platform = defaultPlatform, }) { - this.relative = []; - this.absolute = []; - this.relativeChildren = []; - this.absoluteChildren = []; - this.platform = platform; - this.mmopts = { - dot: true, - nobrace, - nocase, - noext, - noglobstar, - optimizationLevel: 2, - platform, - nocomment: true, - nonegate: true, - }; - for (const ign of ignored) - this.add(ign); - } - add(ign) { - // this is a little weird, but it gives us a clean set of optimized - // minimatch matchers, without getting tripped up if one of them - // ends in /** inside a brace section, and it's only inefficient at - // the start of the walk, not along it. - // It'd be nice if the Pattern class just had a .test() method, but - // handling globstars is a bit of a pita, and that code already lives - // in minimatch anyway. - // Another way would be if maybe Minimatch could take its set/globParts - // as an option, and then we could at least just use Pattern to test - // for absolute-ness. - // Yet another way, Minimatch could take an array of glob strings, and - // a cwd option, and do the right thing. - const mm = new Minimatch(ign, this.mmopts); - for (let i = 0; i < mm.set.length; i++) { - const parsed = mm.set[i]; - const globParts = mm.globParts[i]; - /* c8 ignore start */ - if (!parsed || !globParts) { - throw new Error('invalid pattern object'); - } - // strip off leading ./ portions - // https://github.com/isaacs/node-glob/issues/570 - while (parsed[0] === '.' && globParts[0] === '.') { - parsed.shift(); - globParts.shift(); - } - /* c8 ignore stop */ - const p = new Pattern(parsed, globParts, 0, this.platform); - const m = new Minimatch(p.globString(), this.mmopts); - const children = globParts[globParts.length - 1] === '**'; - const absolute = p.isAbsolute(); - if (absolute) - this.absolute.push(m); - else - this.relative.push(m); - if (children) { - if (absolute) - this.absoluteChildren.push(m); - else - this.relativeChildren.push(m); - } - } - } - ignored(p) { - const fullpath = p.fullpath(); - const fullpaths = `${fullpath}/`; - const relative = p.relative() || '.'; - const relatives = `${relative}/`; - for (const m of this.relative) { - if (m.match(relative) || m.match(relatives)) - return true; - } - for (const m of this.absolute) { - if (m.match(fullpath) || m.match(fullpaths)) - return true; - } - return false; - } - childrenIgnored(p) { - const fullpath = p.fullpath() + '/'; - const relative = (p.relative() || '.') + '/'; - for (const m of this.relativeChildren) { - if (m.match(relative)) - return true; - } - for (const m of this.absoluteChildren) { - if (m.match(fullpath)) - return true; - } - return false; - } -} -//# sourceMappingURL=ignore.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/ignore.js.map b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/ignore.js.map deleted file mode 100644 index 2cddba2ecfe9f6..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/ignore.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ignore.js","sourceRoot":"","sources":["../../src/ignore.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,kCAAkC;AAClC,kEAAkE;AAClE,6CAA6C;AAE7C,OAAO,EAAE,SAAS,EAAoB,MAAM,WAAW,CAAA;AAEvD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAStC,MAAM,eAAe,GACnB,CACE,OAAO,OAAO,KAAK,QAAQ;IAC3B,OAAO;IACP,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,CACrC,CAAC,CAAC;IACD,OAAO,CAAC,QAAQ;IAClB,CAAC,CAAC,OAAO,CAAA;AAEX;;GAEG;AACH,MAAM,OAAO,MAAM;IACjB,QAAQ,CAAa;IACrB,gBAAgB,CAAa;IAC7B,QAAQ,CAAa;IACrB,gBAAgB,CAAa;IAC7B,QAAQ,CAAiB;IACzB,MAAM,CAAkB;IAExB,YACE,OAAiB,EACjB,EACE,OAAO,EACP,MAAM,EACN,KAAK,EACL,UAAU,EACV,QAAQ,GAAG,eAAe,GACX;QAEjB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;QAClB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;QAClB,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAA;QAC1B,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAA;QAC1B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,MAAM,GAAG;YACZ,GAAG,EAAE,IAAI;YACT,OAAO;YACP,MAAM;YACN,KAAK;YACL,UAAU;YACV,iBAAiB,EAAE,CAAC;YACpB,QAAQ;YACR,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,IAAI;SACf,CAAA;QACD,KAAK,MAAM,GAAG,IAAI,OAAO;YAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC1C,CAAC;IAED,GAAG,CAAC,GAAW;QACb,mEAAmE;QACnE,gEAAgE;QAChE,mEAAmE;QACnE,uCAAuC;QACvC,mEAAmE;QACnE,qEAAqE;QACrE,uBAAuB;QACvB,uEAAuE;QACvE,oEAAoE;QACpE,qBAAqB;QACrB,sEAAsE;QACtE,wCAAwC;QACxC,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YACxB,MAAM,SAAS,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YACjC,qBAAqB;YACrB,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;YAC3C,CAAC;YACD,gCAAgC;YAChC,iDAAiD;YACjD,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACjD,MAAM,CAAC,KAAK,EAAE,CAAA;gBACd,SAAS,CAAC,KAAK,EAAE,CAAA;YACnB,CAAC;YACD,oBAAoB;YACpB,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;YAC1D,MAAM,CAAC,GAAG,IAAI,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;YACpD,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI,CAAA;YACzD,MAAM,QAAQ,GAAG,CAAC,CAAC,UAAU,EAAE,CAAA;YAC/B,IAAI,QAAQ;gBAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;;gBAC9B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAC1B,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,QAAQ;oBAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;;oBACtC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACpC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,CAAO;QACb,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC7B,MAAM,SAAS,GAAG,GAAG,QAAQ,GAAG,CAAA;QAChC,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAA;QACpC,MAAM,SAAS,GAAG,GAAG,QAAQ,GAAG,CAAA;QAChC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;gBAAE,OAAO,IAAI,CAAA;QAC1D,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;gBAAE,OAAO,IAAI,CAAA;QAC1D,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,eAAe,CAAC,CAAO;QACrB,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,EAAE,GAAG,GAAG,CAAA;QACnC,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,GAAG,GAAG,CAAA;QAC5C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtC,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;gBAAE,OAAO,IAAI,CAAA;QACpC,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtC,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;gBAAE,OAAO,IAAI,CAAA;QACpC,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;CACF","sourcesContent":["// give it a pattern, and it'll be able to tell you if\n// a given path should be ignored.\n// Ignoring a path ignores its children if the pattern ends in /**\n// Ignores are always parsed in dot:true mode\n\nimport { Minimatch, MinimatchOptions } from 'minimatch'\nimport { Path } from 'path-scurry'\nimport { Pattern } from './pattern.js'\nimport { GlobWalkerOpts } from './walker.js'\n\nexport interface IgnoreLike {\n ignored?: (p: Path) => boolean\n childrenIgnored?: (p: Path) => boolean\n add?: (ignore: string) => void\n}\n\nconst defaultPlatform: NodeJS.Platform =\n (\n typeof process === 'object' &&\n process &&\n typeof process.platform === 'string'\n ) ?\n process.platform\n : 'linux'\n\n/**\n * Class used to process ignored patterns\n */\nexport class Ignore implements IgnoreLike {\n relative: Minimatch[]\n relativeChildren: Minimatch[]\n absolute: Minimatch[]\n absoluteChildren: Minimatch[]\n platform: NodeJS.Platform\n mmopts: MinimatchOptions\n\n constructor(\n ignored: string[],\n {\n nobrace,\n nocase,\n noext,\n noglobstar,\n platform = defaultPlatform,\n }: GlobWalkerOpts,\n ) {\n this.relative = []\n this.absolute = []\n this.relativeChildren = []\n this.absoluteChildren = []\n this.platform = platform\n this.mmopts = {\n dot: true,\n nobrace,\n nocase,\n noext,\n noglobstar,\n optimizationLevel: 2,\n platform,\n nocomment: true,\n nonegate: true,\n }\n for (const ign of ignored) this.add(ign)\n }\n\n add(ign: string) {\n // this is a little weird, but it gives us a clean set of optimized\n // minimatch matchers, without getting tripped up if one of them\n // ends in /** inside a brace section, and it's only inefficient at\n // the start of the walk, not along it.\n // It'd be nice if the Pattern class just had a .test() method, but\n // handling globstars is a bit of a pita, and that code already lives\n // in minimatch anyway.\n // Another way would be if maybe Minimatch could take its set/globParts\n // as an option, and then we could at least just use Pattern to test\n // for absolute-ness.\n // Yet another way, Minimatch could take an array of glob strings, and\n // a cwd option, and do the right thing.\n const mm = new Minimatch(ign, this.mmopts)\n for (let i = 0; i < mm.set.length; i++) {\n const parsed = mm.set[i]\n const globParts = mm.globParts[i]\n /* c8 ignore start */\n if (!parsed || !globParts) {\n throw new Error('invalid pattern object')\n }\n // strip off leading ./ portions\n // https://github.com/isaacs/node-glob/issues/570\n while (parsed[0] === '.' && globParts[0] === '.') {\n parsed.shift()\n globParts.shift()\n }\n /* c8 ignore stop */\n const p = new Pattern(parsed, globParts, 0, this.platform)\n const m = new Minimatch(p.globString(), this.mmopts)\n const children = globParts[globParts.length - 1] === '**'\n const absolute = p.isAbsolute()\n if (absolute) this.absolute.push(m)\n else this.relative.push(m)\n if (children) {\n if (absolute) this.absoluteChildren.push(m)\n else this.relativeChildren.push(m)\n }\n }\n }\n\n ignored(p: Path): boolean {\n const fullpath = p.fullpath()\n const fullpaths = `${fullpath}/`\n const relative = p.relative() || '.'\n const relatives = `${relative}/`\n for (const m of this.relative) {\n if (m.match(relative) || m.match(relatives)) return true\n }\n for (const m of this.absolute) {\n if (m.match(fullpath) || m.match(fullpaths)) return true\n }\n return false\n }\n\n childrenIgnored(p: Path): boolean {\n const fullpath = p.fullpath() + '/'\n const relative = (p.relative() || '.') + '/'\n for (const m of this.relativeChildren) {\n if (m.match(relative)) return true\n }\n for (const m of this.absoluteChildren) {\n if (m.match(fullpath)) return true\n }\n return false\n }\n}\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/index.d.ts b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/index.d.ts deleted file mode 100644 index 9c326ddc895b61..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/index.d.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { Minipass } from 'minipass'; -import { Path } from 'path-scurry'; -import type { GlobOptions, GlobOptionsWithFileTypesFalse, GlobOptionsWithFileTypesTrue, GlobOptionsWithFileTypesUnset } from './glob.js'; -import { Glob } from './glob.js'; -export { escape, unescape } from 'minimatch'; -export type { FSOption, Path, WalkOptions, WalkOptionsWithFileTypesTrue, WalkOptionsWithFileTypesUnset, } from 'path-scurry'; -export { Glob } from './glob.js'; -export type { GlobOptions, GlobOptionsWithFileTypesFalse, GlobOptionsWithFileTypesTrue, GlobOptionsWithFileTypesUnset, } from './glob.js'; -export { hasMagic } from './has-magic.js'; -export { Ignore } from './ignore.js'; -export type { IgnoreLike } from './ignore.js'; -export type { MatchStream } from './walker.js'; -/** - * Syncronous form of {@link globStream}. Will read all the matches as fast as - * you consume them, even all in a single tick if you consume them immediately, - * but will still respond to backpressure if they're not consumed immediately. - */ -export declare function globStreamSync(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): Minipass; -export declare function globStreamSync(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): Minipass; -export declare function globStreamSync(pattern: string | string[], options: GlobOptionsWithFileTypesUnset): Minipass; -export declare function globStreamSync(pattern: string | string[], options: GlobOptions): Minipass | Minipass; -/** - * Return a stream that emits all the strings or `Path` objects and - * then emits `end` when completed. - */ -export declare function globStream(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): Minipass; -export declare function globStream(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): Minipass; -export declare function globStream(pattern: string | string[], options?: GlobOptionsWithFileTypesUnset | undefined): Minipass; -export declare function globStream(pattern: string | string[], options: GlobOptions): Minipass | Minipass; -/** - * Synchronous form of {@link glob} - */ -export declare function globSync(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): string[]; -export declare function globSync(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): Path[]; -export declare function globSync(pattern: string | string[], options?: GlobOptionsWithFileTypesUnset | undefined): string[]; -export declare function globSync(pattern: string | string[], options: GlobOptions): Path[] | string[]; -/** - * Perform an asynchronous glob search for the pattern(s) specified. Returns - * [Path](https://isaacs.github.io/path-scurry/classes/PathBase) objects if the - * {@link withFileTypes} option is set to `true`. See {@link GlobOptions} for - * full option descriptions. - */ -declare function glob_(pattern: string | string[], options?: GlobOptionsWithFileTypesUnset | undefined): Promise; -declare function glob_(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): Promise; -declare function glob_(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): Promise; -declare function glob_(pattern: string | string[], options: GlobOptions): Promise; -/** - * Return a sync iterator for walking glob pattern matches. - */ -export declare function globIterateSync(pattern: string | string[], options?: GlobOptionsWithFileTypesUnset | undefined): Generator; -export declare function globIterateSync(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): Generator; -export declare function globIterateSync(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): Generator; -export declare function globIterateSync(pattern: string | string[], options: GlobOptions): Generator | Generator; -/** - * Return an async iterator for walking glob pattern matches. - */ -export declare function globIterate(pattern: string | string[], options?: GlobOptionsWithFileTypesUnset | undefined): AsyncGenerator; -export declare function globIterate(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): AsyncGenerator; -export declare function globIterate(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): AsyncGenerator; -export declare function globIterate(pattern: string | string[], options: GlobOptions): AsyncGenerator | AsyncGenerator; -export declare const streamSync: typeof globStreamSync; -export declare const stream: typeof globStream & { - sync: typeof globStreamSync; -}; -export declare const iterateSync: typeof globIterateSync; -export declare const iterate: typeof globIterate & { - sync: typeof globIterateSync; -}; -export declare const sync: typeof globSync & { - stream: typeof globStreamSync; - iterate: typeof globIterateSync; -}; -export declare const glob: typeof glob_ & { - glob: typeof glob_; - globSync: typeof globSync; - sync: typeof globSync & { - stream: typeof globStreamSync; - iterate: typeof globIterateSync; - }; - globStream: typeof globStream; - stream: typeof globStream & { - sync: typeof globStreamSync; - }; - globStreamSync: typeof globStreamSync; - streamSync: typeof globStreamSync; - globIterate: typeof globIterate; - iterate: typeof globIterate & { - sync: typeof globIterateSync; - }; - globIterateSync: typeof globIterateSync; - iterateSync: typeof globIterateSync; - Glob: typeof Glob; - hasMagic: (pattern: string | string[], options?: GlobOptions) => boolean; - escape: (s: string, { windowsPathsNoEscape, }?: Pick) => string; - unescape: (s: string, { windowsPathsNoEscape, }?: Pick) => string; -}; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/index.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/index.d.ts.map deleted file mode 100644 index 5fb32252b63747..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,KAAK,EACV,WAAW,EACX,6BAA6B,EAC7B,4BAA4B,EAC5B,6BAA6B,EAC9B,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAGhC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAC5C,YAAY,EACV,QAAQ,EACR,IAAI,EACJ,WAAW,EACX,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,YAAY,EACV,WAAW,EACX,6BAA6B,EAC7B,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,4BAA4B,GACpC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;AACvB,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAC3B,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAC3B,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,WAAW,GACnB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAQlD;;;GAGG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAC3B,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,4BAA4B,GACpC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;AACvB,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,6BAA6B,GAAG,SAAS,GAClD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAC3B,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,WAAW,GACnB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAQlD;;GAEG;AACH,wBAAgB,QAAQ,CACtB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,MAAM,EAAE,CAAA;AACX,wBAAgB,QAAQ,CACtB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,4BAA4B,GACpC,IAAI,EAAE,CAAA;AACT,wBAAgB,QAAQ,CACtB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,6BAA6B,GAAG,SAAS,GAClD,MAAM,EAAE,CAAA;AACX,wBAAgB,QAAQ,CACtB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,WAAW,GACnB,IAAI,EAAE,GAAG,MAAM,EAAE,CAAA;AAQpB;;;;;GAKG;AACH,iBAAe,KAAK,CAClB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,6BAA6B,GAAG,SAAS,GAClD,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;AACpB,iBAAe,KAAK,CAClB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;AAClB,iBAAe,KAAK,CAClB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;AACpB,iBAAe,KAAK,CAClB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;AAQ7B;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,6BAA6B,GAAG,SAAS,GAClD,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AAChC,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,4BAA4B,GACpC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AAC9B,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AAChC,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,WAAW,GACnB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AAQ9D;;GAEG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,6BAA6B,GAAG,SAAS,GAClD,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AACrC,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,4BAA4B,GACpC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AACnC,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AACrC,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,WAAW,GACnB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AASxE,eAAO,MAAM,UAAU,uBAAiB,CAAA;AACxC,eAAO,MAAM,MAAM;;CAAsD,CAAA;AACzE,eAAO,MAAM,WAAW,wBAAkB,CAAA;AAC1C,eAAO,MAAM,OAAO;;CAElB,CAAA;AACF,eAAO,MAAM,IAAI;;;CAGf,CAAA;AAEF,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;CAgBf,CAAA"} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/index.js b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/index.js deleted file mode 100644 index e15c1f9c4cb032..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/index.js +++ /dev/null @@ -1,55 +0,0 @@ -import { escape, unescape } from 'minimatch'; -import { Glob } from './glob.js'; -import { hasMagic } from './has-magic.js'; -export { escape, unescape } from 'minimatch'; -export { Glob } from './glob.js'; -export { hasMagic } from './has-magic.js'; -export { Ignore } from './ignore.js'; -export function globStreamSync(pattern, options = {}) { - return new Glob(pattern, options).streamSync(); -} -export function globStream(pattern, options = {}) { - return new Glob(pattern, options).stream(); -} -export function globSync(pattern, options = {}) { - return new Glob(pattern, options).walkSync(); -} -async function glob_(pattern, options = {}) { - return new Glob(pattern, options).walk(); -} -export function globIterateSync(pattern, options = {}) { - return new Glob(pattern, options).iterateSync(); -} -export function globIterate(pattern, options = {}) { - return new Glob(pattern, options).iterate(); -} -// aliases: glob.sync.stream() glob.stream.sync() glob.sync() etc -export const streamSync = globStreamSync; -export const stream = Object.assign(globStream, { sync: globStreamSync }); -export const iterateSync = globIterateSync; -export const iterate = Object.assign(globIterate, { - sync: globIterateSync, -}); -export const sync = Object.assign(globSync, { - stream: globStreamSync, - iterate: globIterateSync, -}); -export const glob = Object.assign(glob_, { - glob: glob_, - globSync, - sync, - globStream, - stream, - globStreamSync, - streamSync, - globIterate, - iterate, - globIterateSync, - iterateSync, - Glob, - hasMagic, - escape, - unescape, -}); -glob.glob = glob; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/index.js.map b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/index.js.map deleted file mode 100644 index a4f93dd0c1d87d..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAS5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAQ5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAOhC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAyBpC,MAAM,UAAU,cAAc,CAC5B,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,UAAU,EAAE,CAAA;AAChD,CAAC;AAsBD,MAAM,UAAU,UAAU,CACxB,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,EAAE,CAAA;AAC5C,CAAC;AAqBD,MAAM,UAAU,QAAQ,CACtB,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAA;AAC9C,CAAC;AAwBD,KAAK,UAAU,KAAK,CAClB,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;AAC1C,CAAC;AAqBD,MAAM,UAAU,eAAe,CAC7B,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAA;AACjD,CAAC;AAqBD,MAAM,UAAU,WAAW,CACzB,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,OAAO,EAAE,CAAA;AAC7C,CAAC;AAED,iEAAiE;AACjE,MAAM,CAAC,MAAM,UAAU,GAAG,cAAc,CAAA;AACxC,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAA;AACzE,MAAM,CAAC,MAAM,WAAW,GAAG,eAAe,CAAA;AAC1C,MAAM,CAAC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE;IAChD,IAAI,EAAE,eAAe;CACtB,CAAC,CAAA;AACF,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE;IAC1C,MAAM,EAAE,cAAc;IACtB,OAAO,EAAE,eAAe;CACzB,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;IACvC,IAAI,EAAE,KAAK;IACX,QAAQ;IACR,IAAI;IACJ,UAAU;IACV,MAAM;IACN,cAAc;IACd,UAAU;IACV,WAAW;IACX,OAAO;IACP,eAAe;IACf,WAAW;IACX,IAAI;IACJ,QAAQ;IACR,MAAM;IACN,QAAQ;CACT,CAAC,CAAA;AACF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA","sourcesContent":["import { escape, unescape } from 'minimatch'\nimport { Minipass } from 'minipass'\nimport { Path } from 'path-scurry'\nimport type {\n GlobOptions,\n GlobOptionsWithFileTypesFalse,\n GlobOptionsWithFileTypesTrue,\n GlobOptionsWithFileTypesUnset,\n} from './glob.js'\nimport { Glob } from './glob.js'\nimport { hasMagic } from './has-magic.js'\n\nexport { escape, unescape } from 'minimatch'\nexport type {\n FSOption,\n Path,\n WalkOptions,\n WalkOptionsWithFileTypesTrue,\n WalkOptionsWithFileTypesUnset,\n} from 'path-scurry'\nexport { Glob } from './glob.js'\nexport type {\n GlobOptions,\n GlobOptionsWithFileTypesFalse,\n GlobOptionsWithFileTypesTrue,\n GlobOptionsWithFileTypesUnset,\n} from './glob.js'\nexport { hasMagic } from './has-magic.js'\nexport { Ignore } from './ignore.js'\nexport type { IgnoreLike } from './ignore.js'\nexport type { MatchStream } from './walker.js'\n\n/**\n * Syncronous form of {@link globStream}. Will read all the matches as fast as\n * you consume them, even all in a single tick if you consume them immediately,\n * but will still respond to backpressure if they're not consumed immediately.\n */\nexport function globStreamSync(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesTrue,\n): Minipass\nexport function globStreamSync(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesFalse,\n): Minipass\nexport function globStreamSync(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesUnset,\n): Minipass\nexport function globStreamSync(\n pattern: string | string[],\n options: GlobOptions,\n): Minipass | Minipass\nexport function globStreamSync(\n pattern: string | string[],\n options: GlobOptions = {},\n) {\n return new Glob(pattern, options).streamSync()\n}\n\n/**\n * Return a stream that emits all the strings or `Path` objects and\n * then emits `end` when completed.\n */\nexport function globStream(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesFalse,\n): Minipass\nexport function globStream(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesTrue,\n): Minipass\nexport function globStream(\n pattern: string | string[],\n options?: GlobOptionsWithFileTypesUnset | undefined,\n): Minipass\nexport function globStream(\n pattern: string | string[],\n options: GlobOptions,\n): Minipass | Minipass\nexport function globStream(\n pattern: string | string[],\n options: GlobOptions = {},\n) {\n return new Glob(pattern, options).stream()\n}\n\n/**\n * Synchronous form of {@link glob}\n */\nexport function globSync(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesFalse,\n): string[]\nexport function globSync(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesTrue,\n): Path[]\nexport function globSync(\n pattern: string | string[],\n options?: GlobOptionsWithFileTypesUnset | undefined,\n): string[]\nexport function globSync(\n pattern: string | string[],\n options: GlobOptions,\n): Path[] | string[]\nexport function globSync(\n pattern: string | string[],\n options: GlobOptions = {},\n) {\n return new Glob(pattern, options).walkSync()\n}\n\n/**\n * Perform an asynchronous glob search for the pattern(s) specified. Returns\n * [Path](https://isaacs.github.io/path-scurry/classes/PathBase) objects if the\n * {@link withFileTypes} option is set to `true`. See {@link GlobOptions} for\n * full option descriptions.\n */\nasync function glob_(\n pattern: string | string[],\n options?: GlobOptionsWithFileTypesUnset | undefined,\n): Promise\nasync function glob_(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesTrue,\n): Promise\nasync function glob_(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesFalse,\n): Promise\nasync function glob_(\n pattern: string | string[],\n options: GlobOptions,\n): Promise\nasync function glob_(\n pattern: string | string[],\n options: GlobOptions = {},\n) {\n return new Glob(pattern, options).walk()\n}\n\n/**\n * Return a sync iterator for walking glob pattern matches.\n */\nexport function globIterateSync(\n pattern: string | string[],\n options?: GlobOptionsWithFileTypesUnset | undefined,\n): Generator\nexport function globIterateSync(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesTrue,\n): Generator\nexport function globIterateSync(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesFalse,\n): Generator\nexport function globIterateSync(\n pattern: string | string[],\n options: GlobOptions,\n): Generator | Generator\nexport function globIterateSync(\n pattern: string | string[],\n options: GlobOptions = {},\n) {\n return new Glob(pattern, options).iterateSync()\n}\n\n/**\n * Return an async iterator for walking glob pattern matches.\n */\nexport function globIterate(\n pattern: string | string[],\n options?: GlobOptionsWithFileTypesUnset | undefined,\n): AsyncGenerator\nexport function globIterate(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesTrue,\n): AsyncGenerator\nexport function globIterate(\n pattern: string | string[],\n options: GlobOptionsWithFileTypesFalse,\n): AsyncGenerator\nexport function globIterate(\n pattern: string | string[],\n options: GlobOptions,\n): AsyncGenerator | AsyncGenerator\nexport function globIterate(\n pattern: string | string[],\n options: GlobOptions = {},\n) {\n return new Glob(pattern, options).iterate()\n}\n\n// aliases: glob.sync.stream() glob.stream.sync() glob.sync() etc\nexport const streamSync = globStreamSync\nexport const stream = Object.assign(globStream, { sync: globStreamSync })\nexport const iterateSync = globIterateSync\nexport const iterate = Object.assign(globIterate, {\n sync: globIterateSync,\n})\nexport const sync = Object.assign(globSync, {\n stream: globStreamSync,\n iterate: globIterateSync,\n})\n\nexport const glob = Object.assign(glob_, {\n glob: glob_,\n globSync,\n sync,\n globStream,\n stream,\n globStreamSync,\n streamSync,\n globIterate,\n iterate,\n globIterateSync,\n iterateSync,\n Glob,\n hasMagic,\n escape,\n unescape,\n})\nglob.glob = glob\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/package.json b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/package.json deleted file mode 100644 index 3dbc1ca591c055..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "module" -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/pattern.d.ts b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/pattern.d.ts deleted file mode 100644 index 9636df3b54df29..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/pattern.d.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { GLOBSTAR } from 'minimatch'; -export type MMPattern = string | RegExp | typeof GLOBSTAR; -export type PatternList = [p: MMPattern, ...rest: MMPattern[]]; -export type UNCPatternList = [ - p0: '', - p1: '', - p2: string, - p3: string, - ...rest: MMPattern[] -]; -export type DrivePatternList = [p0: string, ...rest: MMPattern[]]; -export type AbsolutePatternList = [p0: '', ...rest: MMPattern[]]; -export type GlobList = [p: string, ...rest: string[]]; -/** - * An immutable-ish view on an array of glob parts and their parsed - * results - */ -export declare class Pattern { - #private; - readonly length: number; - constructor(patternList: MMPattern[], globList: string[], index: number, platform: NodeJS.Platform); - /** - * The first entry in the parsed list of patterns - */ - pattern(): MMPattern; - /** - * true of if pattern() returns a string - */ - isString(): boolean; - /** - * true of if pattern() returns GLOBSTAR - */ - isGlobstar(): boolean; - /** - * true if pattern() returns a regexp - */ - isRegExp(): boolean; - /** - * The /-joined set of glob parts that make up this pattern - */ - globString(): string; - /** - * true if there are more pattern parts after this one - */ - hasMore(): boolean; - /** - * The rest of the pattern after this part, or null if this is the end - */ - rest(): Pattern | null; - /** - * true if the pattern represents a //unc/path/ on windows - */ - isUNC(): boolean; - /** - * True if the pattern starts with a drive letter on Windows - */ - isDrive(): boolean; - /** - * True if the pattern is rooted on an absolute path - */ - isAbsolute(): boolean; - /** - * consume the root of the pattern, and return it - */ - root(): string; - /** - * Check to see if the current globstar pattern is allowed to follow - * a symbolic link. - */ - checkFollowGlobstar(): boolean; - /** - * Mark that the current globstar pattern is following a symbolic link - */ - markFollowGlobstar(): boolean; -} -//# sourceMappingURL=pattern.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/pattern.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/pattern.d.ts.map deleted file mode 100644 index cdf322346317d8..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/pattern.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"pattern.d.ts","sourceRoot":"","sources":["../../src/pattern.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,QAAQ,CAAA;AAGzD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;AAC9D,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,MAAM;IACV,EAAE,EAAE,MAAM;IACV,GAAG,IAAI,EAAE,SAAS,EAAE;CACrB,CAAA;AACD,MAAM,MAAM,gBAAgB,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;AACjE,MAAM,MAAM,mBAAmB,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;AAChE,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;AAMrD;;;GAGG;AACH,qBAAa,OAAO;;IAIlB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;gBAUrB,WAAW,EAAE,SAAS,EAAE,EACxB,QAAQ,EAAE,MAAM,EAAE,EAClB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,CAAC,QAAQ;IA6D3B;;OAEG;IACH,OAAO,IAAI,SAAS;IAIpB;;OAEG;IACH,QAAQ,IAAI,OAAO;IAGnB;;OAEG;IACH,UAAU,IAAI,OAAO;IAGrB;;OAEG;IACH,QAAQ,IAAI,OAAO;IAInB;;OAEG;IACH,UAAU,IAAI,MAAM;IAUpB;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;OAEG;IACH,IAAI,IAAI,OAAO,GAAG,IAAI;IAetB;;OAEG;IACH,KAAK,IAAI,OAAO;IAoBhB;;OAEG;IACH,OAAO,IAAI,OAAO;IAelB;;OAEG;IACH,UAAU,IAAI,OAAO;IAUrB;;OAEG;IACH,IAAI,IAAI,MAAM;IASd;;;OAGG;IACH,mBAAmB,IAAI,OAAO;IAQ9B;;OAEG;IACH,kBAAkB,IAAI,OAAO;CAM9B"} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/pattern.js b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/pattern.js deleted file mode 100644 index b41defa10c6a3a..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/pattern.js +++ /dev/null @@ -1,215 +0,0 @@ -// this is just a very light wrapper around 2 arrays with an offset index -import { GLOBSTAR } from 'minimatch'; -const isPatternList = (pl) => pl.length >= 1; -const isGlobList = (gl) => gl.length >= 1; -/** - * An immutable-ish view on an array of glob parts and their parsed - * results - */ -export class Pattern { - #patternList; - #globList; - #index; - length; - #platform; - #rest; - #globString; - #isDrive; - #isUNC; - #isAbsolute; - #followGlobstar = true; - constructor(patternList, globList, index, platform) { - if (!isPatternList(patternList)) { - throw new TypeError('empty pattern list'); - } - if (!isGlobList(globList)) { - throw new TypeError('empty glob list'); - } - if (globList.length !== patternList.length) { - throw new TypeError('mismatched pattern list and glob list lengths'); - } - this.length = patternList.length; - if (index < 0 || index >= this.length) { - throw new TypeError('index out of range'); - } - this.#patternList = patternList; - this.#globList = globList; - this.#index = index; - this.#platform = platform; - // normalize root entries of absolute patterns on initial creation. - if (this.#index === 0) { - // c: => ['c:/'] - // C:/ => ['C:/'] - // C:/x => ['C:/', 'x'] - // //host/share => ['//host/share/'] - // //host/share/ => ['//host/share/'] - // //host/share/x => ['//host/share/', 'x'] - // /etc => ['/', 'etc'] - // / => ['/'] - if (this.isUNC()) { - // '' / '' / 'host' / 'share' - const [p0, p1, p2, p3, ...prest] = this.#patternList; - const [g0, g1, g2, g3, ...grest] = this.#globList; - if (prest[0] === '') { - // ends in / - prest.shift(); - grest.shift(); - } - const p = [p0, p1, p2, p3, ''].join('/'); - const g = [g0, g1, g2, g3, ''].join('/'); - this.#patternList = [p, ...prest]; - this.#globList = [g, ...grest]; - this.length = this.#patternList.length; - } - else if (this.isDrive() || this.isAbsolute()) { - const [p1, ...prest] = this.#patternList; - const [g1, ...grest] = this.#globList; - if (prest[0] === '') { - // ends in / - prest.shift(); - grest.shift(); - } - const p = p1 + '/'; - const g = g1 + '/'; - this.#patternList = [p, ...prest]; - this.#globList = [g, ...grest]; - this.length = this.#patternList.length; - } - } - } - /** - * The first entry in the parsed list of patterns - */ - pattern() { - return this.#patternList[this.#index]; - } - /** - * true of if pattern() returns a string - */ - isString() { - return typeof this.#patternList[this.#index] === 'string'; - } - /** - * true of if pattern() returns GLOBSTAR - */ - isGlobstar() { - return this.#patternList[this.#index] === GLOBSTAR; - } - /** - * true if pattern() returns a regexp - */ - isRegExp() { - return this.#patternList[this.#index] instanceof RegExp; - } - /** - * The /-joined set of glob parts that make up this pattern - */ - globString() { - return (this.#globString = - this.#globString || - (this.#index === 0 ? - this.isAbsolute() ? - this.#globList[0] + this.#globList.slice(1).join('/') - : this.#globList.join('/') - : this.#globList.slice(this.#index).join('/'))); - } - /** - * true if there are more pattern parts after this one - */ - hasMore() { - return this.length > this.#index + 1; - } - /** - * The rest of the pattern after this part, or null if this is the end - */ - rest() { - if (this.#rest !== undefined) - return this.#rest; - if (!this.hasMore()) - return (this.#rest = null); - this.#rest = new Pattern(this.#patternList, this.#globList, this.#index + 1, this.#platform); - this.#rest.#isAbsolute = this.#isAbsolute; - this.#rest.#isUNC = this.#isUNC; - this.#rest.#isDrive = this.#isDrive; - return this.#rest; - } - /** - * true if the pattern represents a //unc/path/ on windows - */ - isUNC() { - const pl = this.#patternList; - return this.#isUNC !== undefined ? - this.#isUNC - : (this.#isUNC = - this.#platform === 'win32' && - this.#index === 0 && - pl[0] === '' && - pl[1] === '' && - typeof pl[2] === 'string' && - !!pl[2] && - typeof pl[3] === 'string' && - !!pl[3]); - } - // pattern like C:/... - // split = ['C:', ...] - // XXX: would be nice to handle patterns like `c:*` to test the cwd - // in c: for *, but I don't know of a way to even figure out what that - // cwd is without actually chdir'ing into it? - /** - * True if the pattern starts with a drive letter on Windows - */ - isDrive() { - const pl = this.#patternList; - return this.#isDrive !== undefined ? - this.#isDrive - : (this.#isDrive = - this.#platform === 'win32' && - this.#index === 0 && - this.length > 1 && - typeof pl[0] === 'string' && - /^[a-z]:$/i.test(pl[0])); - } - // pattern = '/' or '/...' or '/x/...' - // split = ['', ''] or ['', ...] or ['', 'x', ...] - // Drive and UNC both considered absolute on windows - /** - * True if the pattern is rooted on an absolute path - */ - isAbsolute() { - const pl = this.#patternList; - return this.#isAbsolute !== undefined ? - this.#isAbsolute - : (this.#isAbsolute = - (pl[0] === '' && pl.length > 1) || - this.isDrive() || - this.isUNC()); - } - /** - * consume the root of the pattern, and return it - */ - root() { - const p = this.#patternList[0]; - return (typeof p === 'string' && this.isAbsolute() && this.#index === 0) ? - p - : ''; - } - /** - * Check to see if the current globstar pattern is allowed to follow - * a symbolic link. - */ - checkFollowGlobstar() { - return !(this.#index === 0 || - !this.isGlobstar() || - !this.#followGlobstar); - } - /** - * Mark that the current globstar pattern is following a symbolic link - */ - markFollowGlobstar() { - if (this.#index === 0 || !this.isGlobstar() || !this.#followGlobstar) - return false; - this.#followGlobstar = false; - return true; - } -} -//# sourceMappingURL=pattern.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/pattern.js.map b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/pattern.js.map deleted file mode 100644 index 566a306ad1bf40..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/pattern.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"pattern.js","sourceRoot":"","sources":["../../src/pattern.ts"],"names":[],"mappings":"AAAA,yEAAyE;AAEzE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAgBpC,MAAM,aAAa,GAAG,CAAC,EAAe,EAAqB,EAAE,CAC3D,EAAE,CAAC,MAAM,IAAI,CAAC,CAAA;AAChB,MAAM,UAAU,GAAG,CAAC,EAAY,EAAkB,EAAE,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,CAAA;AAEnE;;;GAGG;AACH,MAAM,OAAO,OAAO;IACT,YAAY,CAAa;IACzB,SAAS,CAAU;IACnB,MAAM,CAAQ;IACd,MAAM,CAAQ;IACd,SAAS,CAAiB;IACnC,KAAK,CAAiB;IACtB,WAAW,CAAS;IACpB,QAAQ,CAAU;IAClB,MAAM,CAAU;IAChB,WAAW,CAAU;IACrB,eAAe,GAAY,IAAI,CAAA;IAE/B,YACE,WAAwB,EACxB,QAAkB,EAClB,KAAa,EACb,QAAyB;QAEzB,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,SAAS,CAAC,oBAAoB,CAAC,CAAA;QAC3C,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAA;QACxC,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,EAAE,CAAC;YAC3C,MAAM,IAAI,SAAS,CAAC,+CAA+C,CAAC,CAAA;QACtE,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAA;QAChC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACtC,MAAM,IAAI,SAAS,CAAC,oBAAoB,CAAC,CAAA;QAC3C,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,WAAW,CAAA;QAC/B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;QACzB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;QAEzB,mEAAmE;QACnE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,gBAAgB;YAChB,iBAAiB;YACjB,uBAAuB;YACvB,oCAAoC;YACpC,qCAAqC;YACrC,2CAA2C;YAC3C,uBAAuB;YACvB,aAAa;YACb,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;gBACjB,6BAA6B;gBAC7B,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,YAAY,CAAA;gBACpD,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAA;gBACjD,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;oBACpB,YAAY;oBACZ,KAAK,CAAC,KAAK,EAAE,CAAA;oBACb,KAAK,CAAC,KAAK,EAAE,CAAA;gBACf,CAAC;gBACD,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACxC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACxC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAA;gBACjC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAA;gBAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAA;YACxC,CAAC;iBAAM,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;gBAC/C,MAAM,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,YAAY,CAAA;gBACxC,MAAM,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAA;gBACrC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;oBACpB,YAAY;oBACZ,KAAK,CAAC,KAAK,EAAE,CAAA;oBACb,KAAK,CAAC,KAAK,EAAE,CAAA;gBACf,CAAC;gBACD,MAAM,CAAC,GAAI,EAAa,GAAG,GAAG,CAAA;gBAC9B,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,CAAA;gBAClB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAA;gBACjC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAA;gBAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAA;YACxC,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAc,CAAA;IACpD,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAA;IAC3D,CAAC;IACD;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAA;IACpD,CAAC;IACD;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,MAAM,CAAA;IACzD,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,CAAC,IAAI,CAAC,WAAW;YACtB,IAAI,CAAC,WAAW;gBAChB,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;oBAClB,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;wBACjB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;wBACvD,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;oBAC5B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IACnD,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAA;IACtC,CAAC;IAED;;OAEG;IACH,IAAI;QACF,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,KAAK,CAAA;QAC/C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAAE,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAA;QAC/C,IAAI,CAAC,KAAK,GAAG,IAAI,OAAO,CACtB,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,MAAM,GAAG,CAAC,EACf,IAAI,CAAC,SAAS,CACf,CAAA;QACD,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAA;QACzC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QAC/B,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;QACnC,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAA;QAC5B,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;YAC9B,IAAI,CAAC,MAAM;YACb,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM;gBACV,IAAI,CAAC,SAAS,KAAK,OAAO;oBAC1B,IAAI,CAAC,MAAM,KAAK,CAAC;oBACjB,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE;oBACZ,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE;oBACZ,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,QAAQ;oBACzB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBACP,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,QAAQ;oBACzB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAChB,CAAC;IAED,sBAAsB;IACtB,sBAAsB;IACtB,mEAAmE;IACnE,sEAAsE;IACtE,6CAA6C;IAC7C;;OAEG;IACH,OAAO;QACL,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAA;QAC5B,OAAO,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;YAChC,IAAI,CAAC,QAAQ;YACf,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ;gBACZ,IAAI,CAAC,SAAS,KAAK,OAAO;oBAC1B,IAAI,CAAC,MAAM,KAAK,CAAC;oBACjB,IAAI,CAAC,MAAM,GAAG,CAAC;oBACf,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,QAAQ;oBACzB,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAChC,CAAC;IAED,sCAAsC;IACtC,kDAAkD;IAClD,oDAAoD;IACpD;;OAEG;IACH,UAAU;QACR,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAA;QAC5B,OAAO,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC;YACnC,IAAI,CAAC,WAAW;YAClB,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW;gBACf,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;oBAC/B,IAAI,CAAC,OAAO,EAAE;oBACd,IAAI,CAAC,KAAK,EAAE,CAAC,CAAA;IACrB,CAAC;IAED;;OAEG;IACH,IAAI;QACF,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC9B,OAAO,CACH,OAAO,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAChE,CAAC,CAAC;YACD,CAAC;YACH,CAAC,CAAC,EAAE,CAAA;IACR,CAAC;IAED;;;OAGG;IACH,mBAAmB;QACjB,OAAO,CAAC,CACN,IAAI,CAAC,MAAM,KAAK,CAAC;YACjB,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,CAAC,IAAI,CAAC,eAAe,CACtB,CAAA;IACH,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe;YAClE,OAAO,KAAK,CAAA;QACd,IAAI,CAAC,eAAe,GAAG,KAAK,CAAA;QAC5B,OAAO,IAAI,CAAA;IACb,CAAC;CACF","sourcesContent":["// this is just a very light wrapper around 2 arrays with an offset index\n\nimport { GLOBSTAR } from 'minimatch'\nexport type MMPattern = string | RegExp | typeof GLOBSTAR\n\n// an array of length >= 1\nexport type PatternList = [p: MMPattern, ...rest: MMPattern[]]\nexport type UNCPatternList = [\n p0: '',\n p1: '',\n p2: string,\n p3: string,\n ...rest: MMPattern[],\n]\nexport type DrivePatternList = [p0: string, ...rest: MMPattern[]]\nexport type AbsolutePatternList = [p0: '', ...rest: MMPattern[]]\nexport type GlobList = [p: string, ...rest: string[]]\n\nconst isPatternList = (pl: MMPattern[]): pl is PatternList =>\n pl.length >= 1\nconst isGlobList = (gl: string[]): gl is GlobList => gl.length >= 1\n\n/**\n * An immutable-ish view on an array of glob parts and their parsed\n * results\n */\nexport class Pattern {\n readonly #patternList: PatternList\n readonly #globList: GlobList\n readonly #index: number\n readonly length: number\n readonly #platform: NodeJS.Platform\n #rest?: Pattern | null\n #globString?: string\n #isDrive?: boolean\n #isUNC?: boolean\n #isAbsolute?: boolean\n #followGlobstar: boolean = true\n\n constructor(\n patternList: MMPattern[],\n globList: string[],\n index: number,\n platform: NodeJS.Platform,\n ) {\n if (!isPatternList(patternList)) {\n throw new TypeError('empty pattern list')\n }\n if (!isGlobList(globList)) {\n throw new TypeError('empty glob list')\n }\n if (globList.length !== patternList.length) {\n throw new TypeError('mismatched pattern list and glob list lengths')\n }\n this.length = patternList.length\n if (index < 0 || index >= this.length) {\n throw new TypeError('index out of range')\n }\n this.#patternList = patternList\n this.#globList = globList\n this.#index = index\n this.#platform = platform\n\n // normalize root entries of absolute patterns on initial creation.\n if (this.#index === 0) {\n // c: => ['c:/']\n // C:/ => ['C:/']\n // C:/x => ['C:/', 'x']\n // //host/share => ['//host/share/']\n // //host/share/ => ['//host/share/']\n // //host/share/x => ['//host/share/', 'x']\n // /etc => ['/', 'etc']\n // / => ['/']\n if (this.isUNC()) {\n // '' / '' / 'host' / 'share'\n const [p0, p1, p2, p3, ...prest] = this.#patternList\n const [g0, g1, g2, g3, ...grest] = this.#globList\n if (prest[0] === '') {\n // ends in /\n prest.shift()\n grest.shift()\n }\n const p = [p0, p1, p2, p3, ''].join('/')\n const g = [g0, g1, g2, g3, ''].join('/')\n this.#patternList = [p, ...prest]\n this.#globList = [g, ...grest]\n this.length = this.#patternList.length\n } else if (this.isDrive() || this.isAbsolute()) {\n const [p1, ...prest] = this.#patternList\n const [g1, ...grest] = this.#globList\n if (prest[0] === '') {\n // ends in /\n prest.shift()\n grest.shift()\n }\n const p = (p1 as string) + '/'\n const g = g1 + '/'\n this.#patternList = [p, ...prest]\n this.#globList = [g, ...grest]\n this.length = this.#patternList.length\n }\n }\n }\n\n /**\n * The first entry in the parsed list of patterns\n */\n pattern(): MMPattern {\n return this.#patternList[this.#index] as MMPattern\n }\n\n /**\n * true of if pattern() returns a string\n */\n isString(): boolean {\n return typeof this.#patternList[this.#index] === 'string'\n }\n /**\n * true of if pattern() returns GLOBSTAR\n */\n isGlobstar(): boolean {\n return this.#patternList[this.#index] === GLOBSTAR\n }\n /**\n * true if pattern() returns a regexp\n */\n isRegExp(): boolean {\n return this.#patternList[this.#index] instanceof RegExp\n }\n\n /**\n * The /-joined set of glob parts that make up this pattern\n */\n globString(): string {\n return (this.#globString =\n this.#globString ||\n (this.#index === 0 ?\n this.isAbsolute() ?\n this.#globList[0] + this.#globList.slice(1).join('/')\n : this.#globList.join('/')\n : this.#globList.slice(this.#index).join('/')))\n }\n\n /**\n * true if there are more pattern parts after this one\n */\n hasMore(): boolean {\n return this.length > this.#index + 1\n }\n\n /**\n * The rest of the pattern after this part, or null if this is the end\n */\n rest(): Pattern | null {\n if (this.#rest !== undefined) return this.#rest\n if (!this.hasMore()) return (this.#rest = null)\n this.#rest = new Pattern(\n this.#patternList,\n this.#globList,\n this.#index + 1,\n this.#platform,\n )\n this.#rest.#isAbsolute = this.#isAbsolute\n this.#rest.#isUNC = this.#isUNC\n this.#rest.#isDrive = this.#isDrive\n return this.#rest\n }\n\n /**\n * true if the pattern represents a //unc/path/ on windows\n */\n isUNC(): boolean {\n const pl = this.#patternList\n return this.#isUNC !== undefined ?\n this.#isUNC\n : (this.#isUNC =\n this.#platform === 'win32' &&\n this.#index === 0 &&\n pl[0] === '' &&\n pl[1] === '' &&\n typeof pl[2] === 'string' &&\n !!pl[2] &&\n typeof pl[3] === 'string' &&\n !!pl[3])\n }\n\n // pattern like C:/...\n // split = ['C:', ...]\n // XXX: would be nice to handle patterns like `c:*` to test the cwd\n // in c: for *, but I don't know of a way to even figure out what that\n // cwd is without actually chdir'ing into it?\n /**\n * True if the pattern starts with a drive letter on Windows\n */\n isDrive(): boolean {\n const pl = this.#patternList\n return this.#isDrive !== undefined ?\n this.#isDrive\n : (this.#isDrive =\n this.#platform === 'win32' &&\n this.#index === 0 &&\n this.length > 1 &&\n typeof pl[0] === 'string' &&\n /^[a-z]:$/i.test(pl[0]))\n }\n\n // pattern = '/' or '/...' or '/x/...'\n // split = ['', ''] or ['', ...] or ['', 'x', ...]\n // Drive and UNC both considered absolute on windows\n /**\n * True if the pattern is rooted on an absolute path\n */\n isAbsolute(): boolean {\n const pl = this.#patternList\n return this.#isAbsolute !== undefined ?\n this.#isAbsolute\n : (this.#isAbsolute =\n (pl[0] === '' && pl.length > 1) ||\n this.isDrive() ||\n this.isUNC())\n }\n\n /**\n * consume the root of the pattern, and return it\n */\n root(): string {\n const p = this.#patternList[0]\n return (\n typeof p === 'string' && this.isAbsolute() && this.#index === 0\n ) ?\n p\n : ''\n }\n\n /**\n * Check to see if the current globstar pattern is allowed to follow\n * a symbolic link.\n */\n checkFollowGlobstar(): boolean {\n return !(\n this.#index === 0 ||\n !this.isGlobstar() ||\n !this.#followGlobstar\n )\n }\n\n /**\n * Mark that the current globstar pattern is following a symbolic link\n */\n markFollowGlobstar(): boolean {\n if (this.#index === 0 || !this.isGlobstar() || !this.#followGlobstar)\n return false\n this.#followGlobstar = false\n return true\n }\n}\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/processor.d.ts b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/processor.d.ts deleted file mode 100644 index ccedfbf2820f7d..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/processor.d.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { MMRegExp } from 'minimatch'; -import { Path } from 'path-scurry'; -import { Pattern } from './pattern.js'; -import { GlobWalkerOpts } from './walker.js'; -/** - * A cache of which patterns have been processed for a given Path - */ -export declare class HasWalkedCache { - store: Map>; - constructor(store?: Map>); - copy(): HasWalkedCache; - hasWalked(target: Path, pattern: Pattern): boolean | undefined; - storeWalked(target: Path, pattern: Pattern): void; -} -/** - * A record of which paths have been matched in a given walk step, - * and whether they only are considered a match if they are a directory, - * and whether their absolute or relative path should be returned. - */ -export declare class MatchRecord { - store: Map; - add(target: Path, absolute: boolean, ifDir: boolean): void; - entries(): [Path, boolean, boolean][]; -} -/** - * A collection of patterns that must be processed in a subsequent step - * for a given path. - */ -export declare class SubWalks { - store: Map; - add(target: Path, pattern: Pattern): void; - get(target: Path): Pattern[]; - entries(): [Path, Pattern[]][]; - keys(): Path[]; -} -/** - * The class that processes patterns for a given path. - * - * Handles child entry filtering, and determining whether a path's - * directory contents must be read. - */ -export declare class Processor { - hasWalkedCache: HasWalkedCache; - matches: MatchRecord; - subwalks: SubWalks; - patterns?: Pattern[]; - follow: boolean; - dot: boolean; - opts: GlobWalkerOpts; - constructor(opts: GlobWalkerOpts, hasWalkedCache?: HasWalkedCache); - processPatterns(target: Path, patterns: Pattern[]): this; - subwalkTargets(): Path[]; - child(): Processor; - filterEntries(parent: Path, entries: Path[]): Processor; - testGlobstar(e: Path, pattern: Pattern, rest: Pattern | null, absolute: boolean): void; - testRegExp(e: Path, p: MMRegExp, rest: Pattern | null, absolute: boolean): void; - testString(e: Path, p: string, rest: Pattern | null, absolute: boolean): void; -} -//# sourceMappingURL=processor.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/processor.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/processor.d.ts.map deleted file mode 100644 index aa266fee4a0544..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/processor.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"processor.d.ts","sourceRoot":"","sources":["../../src/processor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAY,QAAQ,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAa,OAAO,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C;;GAEG;AACH,qBAAa,cAAc;IACzB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;gBACnB,KAAK,GAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;IAGvD,IAAI;IAGJ,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO;IAGxC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO;CAM3C;AAED;;;;GAIG;AACH,qBAAa,WAAW;IACtB,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAY;IACpC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO;IAMnD,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE;CAOtC;AAED;;;GAGG;AACH,qBAAa,QAAQ;IACnB,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAY;IACvC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO;IAWlC,GAAG,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,EAAE;IAS5B,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE;IAG9B,IAAI,IAAI,IAAI,EAAE;CAGf;AAED;;;;;GAKG;AACH,qBAAa,SAAS;IACpB,cAAc,EAAE,cAAc,CAAA;IAC9B,OAAO,cAAoB;IAC3B,QAAQ,WAAiB;IACzB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;IACpB,MAAM,EAAE,OAAO,CAAA;IACf,GAAG,EAAE,OAAO,CAAA;IACZ,IAAI,EAAE,cAAc,CAAA;gBAER,IAAI,EAAE,cAAc,EAAE,cAAc,CAAC,EAAE,cAAc;IAQjE,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE;IAmGjD,cAAc,IAAI,IAAI,EAAE;IAIxB,KAAK;IAQL,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,SAAS;IAqBvD,YAAY,CACV,CAAC,EAAE,IAAI,EACP,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,OAAO,GAAG,IAAI,EACpB,QAAQ,EAAE,OAAO;IA8CnB,UAAU,CACR,CAAC,EAAE,IAAI,EACP,CAAC,EAAE,QAAQ,EACX,IAAI,EAAE,OAAO,GAAG,IAAI,EACpB,QAAQ,EAAE,OAAO;IAUnB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,EAAE,QAAQ,EAAE,OAAO;CASvE"} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/processor.js b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/processor.js deleted file mode 100644 index f874892ffed0c4..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/processor.js +++ /dev/null @@ -1,294 +0,0 @@ -// synchronous utility for filtering entries and calculating subwalks -import { GLOBSTAR } from 'minimatch'; -/** - * A cache of which patterns have been processed for a given Path - */ -export class HasWalkedCache { - store; - constructor(store = new Map()) { - this.store = store; - } - copy() { - return new HasWalkedCache(new Map(this.store)); - } - hasWalked(target, pattern) { - return this.store.get(target.fullpath())?.has(pattern.globString()); - } - storeWalked(target, pattern) { - const fullpath = target.fullpath(); - const cached = this.store.get(fullpath); - if (cached) - cached.add(pattern.globString()); - else - this.store.set(fullpath, new Set([pattern.globString()])); - } -} -/** - * A record of which paths have been matched in a given walk step, - * and whether they only are considered a match if they are a directory, - * and whether their absolute or relative path should be returned. - */ -export class MatchRecord { - store = new Map(); - add(target, absolute, ifDir) { - const n = (absolute ? 2 : 0) | (ifDir ? 1 : 0); - const current = this.store.get(target); - this.store.set(target, current === undefined ? n : n & current); - } - // match, absolute, ifdir - entries() { - return [...this.store.entries()].map(([path, n]) => [ - path, - !!(n & 2), - !!(n & 1), - ]); - } -} -/** - * A collection of patterns that must be processed in a subsequent step - * for a given path. - */ -export class SubWalks { - store = new Map(); - add(target, pattern) { - if (!target.canReaddir()) { - return; - } - const subs = this.store.get(target); - if (subs) { - if (!subs.find(p => p.globString() === pattern.globString())) { - subs.push(pattern); - } - } - else - this.store.set(target, [pattern]); - } - get(target) { - const subs = this.store.get(target); - /* c8 ignore start */ - if (!subs) { - throw new Error('attempting to walk unknown path'); - } - /* c8 ignore stop */ - return subs; - } - entries() { - return this.keys().map(k => [k, this.store.get(k)]); - } - keys() { - return [...this.store.keys()].filter(t => t.canReaddir()); - } -} -/** - * The class that processes patterns for a given path. - * - * Handles child entry filtering, and determining whether a path's - * directory contents must be read. - */ -export class Processor { - hasWalkedCache; - matches = new MatchRecord(); - subwalks = new SubWalks(); - patterns; - follow; - dot; - opts; - constructor(opts, hasWalkedCache) { - this.opts = opts; - this.follow = !!opts.follow; - this.dot = !!opts.dot; - this.hasWalkedCache = - hasWalkedCache ? hasWalkedCache.copy() : new HasWalkedCache(); - } - processPatterns(target, patterns) { - this.patterns = patterns; - const processingSet = patterns.map(p => [target, p]); - // map of paths to the magic-starting subwalks they need to walk - // first item in patterns is the filter - for (let [t, pattern] of processingSet) { - this.hasWalkedCache.storeWalked(t, pattern); - const root = pattern.root(); - const absolute = pattern.isAbsolute() && this.opts.absolute !== false; - // start absolute patterns at root - if (root) { - t = t.resolve(root === '/' && this.opts.root !== undefined ? - this.opts.root - : root); - const rest = pattern.rest(); - if (!rest) { - this.matches.add(t, true, false); - continue; - } - else { - pattern = rest; - } - } - if (t.isENOENT()) - continue; - let p; - let rest; - let changed = false; - while (typeof (p = pattern.pattern()) === 'string' && - (rest = pattern.rest())) { - const c = t.resolve(p); - t = c; - pattern = rest; - changed = true; - } - p = pattern.pattern(); - rest = pattern.rest(); - if (changed) { - if (this.hasWalkedCache.hasWalked(t, pattern)) - continue; - this.hasWalkedCache.storeWalked(t, pattern); - } - // now we have either a final string for a known entry, - // more strings for an unknown entry, - // or a pattern starting with magic, mounted on t. - if (typeof p === 'string') { - // must not be final entry, otherwise we would have - // concatenated it earlier. - const ifDir = p === '..' || p === '' || p === '.'; - this.matches.add(t.resolve(p), absolute, ifDir); - continue; - } - else if (p === GLOBSTAR) { - // if no rest, match and subwalk pattern - // if rest, process rest and subwalk pattern - // if it's a symlink, but we didn't get here by way of a - // globstar match (meaning it's the first time THIS globstar - // has traversed a symlink), then we follow it. Otherwise, stop. - if (!t.isSymbolicLink() || - this.follow || - pattern.checkFollowGlobstar()) { - this.subwalks.add(t, pattern); - } - const rp = rest?.pattern(); - const rrest = rest?.rest(); - if (!rest || ((rp === '' || rp === '.') && !rrest)) { - // only HAS to be a dir if it ends in **/ or **/. - // but ending in ** will match files as well. - this.matches.add(t, absolute, rp === '' || rp === '.'); - } - else { - if (rp === '..') { - // this would mean you're matching **/.. at the fs root, - // and no thanks, I'm not gonna test that specific case. - /* c8 ignore start */ - const tp = t.parent || t; - /* c8 ignore stop */ - if (!rrest) - this.matches.add(tp, absolute, true); - else if (!this.hasWalkedCache.hasWalked(tp, rrest)) { - this.subwalks.add(tp, rrest); - } - } - } - } - else if (p instanceof RegExp) { - this.subwalks.add(t, pattern); - } - } - return this; - } - subwalkTargets() { - return this.subwalks.keys(); - } - child() { - return new Processor(this.opts, this.hasWalkedCache); - } - // return a new Processor containing the subwalks for each - // child entry, and a set of matches, and - // a hasWalkedCache that's a copy of this one - // then we're going to call - filterEntries(parent, entries) { - const patterns = this.subwalks.get(parent); - // put matches and entry walks into the results processor - const results = this.child(); - for (const e of entries) { - for (const pattern of patterns) { - const absolute = pattern.isAbsolute(); - const p = pattern.pattern(); - const rest = pattern.rest(); - if (p === GLOBSTAR) { - results.testGlobstar(e, pattern, rest, absolute); - } - else if (p instanceof RegExp) { - results.testRegExp(e, p, rest, absolute); - } - else { - results.testString(e, p, rest, absolute); - } - } - } - return results; - } - testGlobstar(e, pattern, rest, absolute) { - if (this.dot || !e.name.startsWith('.')) { - if (!pattern.hasMore()) { - this.matches.add(e, absolute, false); - } - if (e.canReaddir()) { - // if we're in follow mode or it's not a symlink, just keep - // testing the same pattern. If there's more after the globstar, - // then this symlink consumes the globstar. If not, then we can - // follow at most ONE symlink along the way, so we mark it, which - // also checks to ensure that it wasn't already marked. - if (this.follow || !e.isSymbolicLink()) { - this.subwalks.add(e, pattern); - } - else if (e.isSymbolicLink()) { - if (rest && pattern.checkFollowGlobstar()) { - this.subwalks.add(e, rest); - } - else if (pattern.markFollowGlobstar()) { - this.subwalks.add(e, pattern); - } - } - } - } - // if the NEXT thing matches this entry, then also add - // the rest. - if (rest) { - const rp = rest.pattern(); - if (typeof rp === 'string' && - // dots and empty were handled already - rp !== '..' && - rp !== '' && - rp !== '.') { - this.testString(e, rp, rest.rest(), absolute); - } - else if (rp === '..') { - /* c8 ignore start */ - const ep = e.parent || e; - /* c8 ignore stop */ - this.subwalks.add(ep, rest); - } - else if (rp instanceof RegExp) { - this.testRegExp(e, rp, rest.rest(), absolute); - } - } - } - testRegExp(e, p, rest, absolute) { - if (!p.test(e.name)) - return; - if (!rest) { - this.matches.add(e, absolute, false); - } - else { - this.subwalks.add(e, rest); - } - } - testString(e, p, rest, absolute) { - // should never happen? - if (!e.isNamed(p)) - return; - if (!rest) { - this.matches.add(e, absolute, false); - } - else { - this.subwalks.add(e, rest); - } - } -} -//# sourceMappingURL=processor.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/processor.js.map b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/processor.js.map deleted file mode 100644 index 05a832420b8b2f..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/processor.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"processor.js","sourceRoot":"","sources":["../../src/processor.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAErE,OAAO,EAAE,QAAQ,EAAY,MAAM,WAAW,CAAA;AAK9C;;GAEG;AACH,MAAM,OAAO,cAAc;IACzB,KAAK,CAA0B;IAC/B,YAAY,QAAkC,IAAI,GAAG,EAAE;QACrD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;IACD,IAAI;QACF,OAAO,IAAI,cAAc,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;IAChD,CAAC;IACD,SAAS,CAAC,MAAY,EAAE,OAAgB;QACtC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAA;IACrE,CAAC;IACD,WAAW,CAAC,MAAY,EAAE,OAAgB;QACxC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAA;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACvC,IAAI,MAAM;YAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAA;;YACvC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAA;IAChE,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,OAAO,WAAW;IACtB,KAAK,GAAsB,IAAI,GAAG,EAAE,CAAA;IACpC,GAAG,CAAC,MAAY,EAAE,QAAiB,EAAE,KAAc;QACjD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACtC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAA;IACjE,CAAC;IACD,yBAAyB;IACzB,OAAO;QACL,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YAClD,IAAI;YACJ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACT,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;SACV,CAAC,CAAA;IACJ,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,QAAQ;IACnB,KAAK,GAAyB,IAAI,GAAG,EAAE,CAAA;IACvC,GAAG,CAAC,MAAY,EAAE,OAAgB;QAChC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;YACzB,OAAM;QACR,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACnC,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC;gBAC7D,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACpB,CAAC;QACH,CAAC;;YAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;IAC1C,CAAC;IACD,GAAG,CAAC,MAAY;QACd,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACnC,qBAAqB;QACrB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;QACpD,CAAC;QACD,oBAAoB;QACpB,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAc,CAAC,CAAC,CAAA;IAClE,CAAC;IACD,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAA;IAC3D,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,SAAS;IACpB,cAAc,CAAgB;IAC9B,OAAO,GAAG,IAAI,WAAW,EAAE,CAAA;IAC3B,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAA;IACzB,QAAQ,CAAY;IACpB,MAAM,CAAS;IACf,GAAG,CAAS;IACZ,IAAI,CAAgB;IAEpB,YAAY,IAAoB,EAAE,cAA+B;QAC/D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAA;QAC3B,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAA;QACrB,IAAI,CAAC,cAAc;YACjB,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,cAAc,EAAE,CAAA;IACjE,CAAC;IAED,eAAe,CAAC,MAAY,EAAE,QAAmB;QAC/C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,MAAM,aAAa,GAAsB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;QAEvE,gEAAgE;QAChE,uCAAuC;QAEvC,KAAK,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,aAAa,EAAE,CAAC;YACvC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;YAE3C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;YAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAA;YAErE,kCAAkC;YAClC,IAAI,IAAI,EAAE,CAAC;gBACT,CAAC,GAAG,CAAC,CAAC,OAAO,CACX,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;oBAC5C,IAAI,CAAC,IAAI,CAAC,IAAI;oBAChB,CAAC,CAAC,IAAI,CACP,CAAA;gBACD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;gBAC3B,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;oBAChC,SAAQ;gBACV,CAAC;qBAAM,CAAC;oBACN,OAAO,GAAG,IAAI,CAAA;gBAChB,CAAC;YACH,CAAC;YAED,IAAI,CAAC,CAAC,QAAQ,EAAE;gBAAE,SAAQ;YAE1B,IAAI,CAAY,CAAA;YAChB,IAAI,IAAoB,CAAA;YACxB,IAAI,OAAO,GAAG,KAAK,CAAA;YACnB,OACE,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,QAAQ;gBAC3C,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EACvB,CAAC;gBACD,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;gBACtB,CAAC,GAAG,CAAC,CAAA;gBACL,OAAO,GAAG,IAAI,CAAA;gBACd,OAAO,GAAG,IAAI,CAAA;YAChB,CAAC;YACD,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAA;YACrB,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;YACrB,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC;oBAAE,SAAQ;gBACvD,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;YAC7C,CAAC;YAED,uDAAuD;YACvD,qCAAqC;YACrC,kDAAkD;YAClD,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAC1B,mDAAmD;gBACnD,2BAA2B;gBAC3B,MAAM,KAAK,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,CAAA;gBACjD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;gBAC/C,SAAQ;YACV,CAAC;iBAAM,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAC1B,wCAAwC;gBACxC,4CAA4C;gBAC5C,wDAAwD;gBACxD,4DAA4D;gBAC5D,gEAAgE;gBAChE,IACE,CAAC,CAAC,CAAC,cAAc,EAAE;oBACnB,IAAI,CAAC,MAAM;oBACX,OAAO,CAAC,mBAAmB,EAAE,EAC7B,CAAC;oBACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;gBAC/B,CAAC;gBACD,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAA;gBAC1B,MAAM,KAAK,GAAG,IAAI,EAAE,IAAI,EAAE,CAAA;gBAC1B,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBACnD,iDAAiD;oBACjD,6CAA6C;oBAC7C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,CAAA;gBACxD,CAAC;qBAAM,CAAC;oBACN,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;wBAChB,wDAAwD;wBACxD,wDAAwD;wBACxD,qBAAqB;wBACrB,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAA;wBACxB,oBAAoB;wBACpB,IAAI,CAAC,KAAK;4BAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;6BAC3C,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC;4BACnD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;wBAC9B,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,IAAI,CAAC,YAAY,MAAM,EAAE,CAAC;gBAC/B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;YAC/B,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC7B,CAAC;IAED,KAAK;QACH,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,CAAA;IACtD,CAAC;IAED,0DAA0D;IAC1D,yCAAyC;IACzC,6CAA6C;IAC7C,2BAA2B;IAC3B,aAAa,CAAC,MAAY,EAAE,OAAe;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAC1C,yDAAyD;QACzD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;QAC5B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,EAAE,CAAA;gBACrC,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAA;gBAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;gBAC3B,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;oBACnB,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;gBAClD,CAAC;qBAAM,IAAI,CAAC,YAAY,MAAM,EAAE,CAAC;oBAC/B,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;gBAC1C,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;gBAC1C,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,YAAY,CACV,CAAO,EACP,OAAgB,EAChB,IAAoB,EACpB,QAAiB;QAEjB,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;gBACvB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;YACtC,CAAC;YACD,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC;gBACnB,2DAA2D;gBAC3D,gEAAgE;gBAChE,+DAA+D;gBAC/D,iEAAiE;gBACjE,uDAAuD;gBACvD,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC;oBACvC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;gBAC/B,CAAC;qBAAM,IAAI,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC;oBAC9B,IAAI,IAAI,IAAI,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC;wBAC1C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;oBAC5B,CAAC;yBAAM,IAAI,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;wBACxC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;oBAC/B,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,sDAAsD;QACtD,YAAY;QACZ,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;YACzB,IACE,OAAO,EAAE,KAAK,QAAQ;gBACtB,sCAAsC;gBACtC,EAAE,KAAK,IAAI;gBACX,EAAE,KAAK,EAAE;gBACT,EAAE,KAAK,GAAG,EACV,CAAC;gBACD,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAA;YAC/C,CAAC;iBAAM,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;gBACvB,qBAAqB;gBACrB,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAA;gBACxB,oBAAoB;gBACpB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;YAC7B,CAAC;iBAAM,IAAI,EAAE,YAAY,MAAM,EAAE,CAAC;gBAChC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAA;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;IAED,UAAU,CACR,CAAO,EACP,CAAW,EACX,IAAoB,EACpB,QAAiB;QAEjB,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,OAAM;QAC3B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;QACtC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QAC5B,CAAC;IACH,CAAC;IAED,UAAU,CAAC,CAAO,EAAE,CAAS,EAAE,IAAoB,EAAE,QAAiB;QACpE,uBAAuB;QACvB,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YAAE,OAAM;QACzB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;QACtC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QAC5B,CAAC;IACH,CAAC;CACF","sourcesContent":["// synchronous utility for filtering entries and calculating subwalks\n\nimport { GLOBSTAR, MMRegExp } from 'minimatch'\nimport { Path } from 'path-scurry'\nimport { MMPattern, Pattern } from './pattern.js'\nimport { GlobWalkerOpts } from './walker.js'\n\n/**\n * A cache of which patterns have been processed for a given Path\n */\nexport class HasWalkedCache {\n store: Map>\n constructor(store: Map> = new Map()) {\n this.store = store\n }\n copy() {\n return new HasWalkedCache(new Map(this.store))\n }\n hasWalked(target: Path, pattern: Pattern) {\n return this.store.get(target.fullpath())?.has(pattern.globString())\n }\n storeWalked(target: Path, pattern: Pattern) {\n const fullpath = target.fullpath()\n const cached = this.store.get(fullpath)\n if (cached) cached.add(pattern.globString())\n else this.store.set(fullpath, new Set([pattern.globString()]))\n }\n}\n\n/**\n * A record of which paths have been matched in a given walk step,\n * and whether they only are considered a match if they are a directory,\n * and whether their absolute or relative path should be returned.\n */\nexport class MatchRecord {\n store: Map = new Map()\n add(target: Path, absolute: boolean, ifDir: boolean) {\n const n = (absolute ? 2 : 0) | (ifDir ? 1 : 0)\n const current = this.store.get(target)\n this.store.set(target, current === undefined ? n : n & current)\n }\n // match, absolute, ifdir\n entries(): [Path, boolean, boolean][] {\n return [...this.store.entries()].map(([path, n]) => [\n path,\n !!(n & 2),\n !!(n & 1),\n ])\n }\n}\n\n/**\n * A collection of patterns that must be processed in a subsequent step\n * for a given path.\n */\nexport class SubWalks {\n store: Map = new Map()\n add(target: Path, pattern: Pattern) {\n if (!target.canReaddir()) {\n return\n }\n const subs = this.store.get(target)\n if (subs) {\n if (!subs.find(p => p.globString() === pattern.globString())) {\n subs.push(pattern)\n }\n } else this.store.set(target, [pattern])\n }\n get(target: Path): Pattern[] {\n const subs = this.store.get(target)\n /* c8 ignore start */\n if (!subs) {\n throw new Error('attempting to walk unknown path')\n }\n /* c8 ignore stop */\n return subs\n }\n entries(): [Path, Pattern[]][] {\n return this.keys().map(k => [k, this.store.get(k) as Pattern[]])\n }\n keys(): Path[] {\n return [...this.store.keys()].filter(t => t.canReaddir())\n }\n}\n\n/**\n * The class that processes patterns for a given path.\n *\n * Handles child entry filtering, and determining whether a path's\n * directory contents must be read.\n */\nexport class Processor {\n hasWalkedCache: HasWalkedCache\n matches = new MatchRecord()\n subwalks = new SubWalks()\n patterns?: Pattern[]\n follow: boolean\n dot: boolean\n opts: GlobWalkerOpts\n\n constructor(opts: GlobWalkerOpts, hasWalkedCache?: HasWalkedCache) {\n this.opts = opts\n this.follow = !!opts.follow\n this.dot = !!opts.dot\n this.hasWalkedCache =\n hasWalkedCache ? hasWalkedCache.copy() : new HasWalkedCache()\n }\n\n processPatterns(target: Path, patterns: Pattern[]) {\n this.patterns = patterns\n const processingSet: [Path, Pattern][] = patterns.map(p => [target, p])\n\n // map of paths to the magic-starting subwalks they need to walk\n // first item in patterns is the filter\n\n for (let [t, pattern] of processingSet) {\n this.hasWalkedCache.storeWalked(t, pattern)\n\n const root = pattern.root()\n const absolute = pattern.isAbsolute() && this.opts.absolute !== false\n\n // start absolute patterns at root\n if (root) {\n t = t.resolve(\n root === '/' && this.opts.root !== undefined ?\n this.opts.root\n : root,\n )\n const rest = pattern.rest()\n if (!rest) {\n this.matches.add(t, true, false)\n continue\n } else {\n pattern = rest\n }\n }\n\n if (t.isENOENT()) continue\n\n let p: MMPattern\n let rest: Pattern | null\n let changed = false\n while (\n typeof (p = pattern.pattern()) === 'string' &&\n (rest = pattern.rest())\n ) {\n const c = t.resolve(p)\n t = c\n pattern = rest\n changed = true\n }\n p = pattern.pattern()\n rest = pattern.rest()\n if (changed) {\n if (this.hasWalkedCache.hasWalked(t, pattern)) continue\n this.hasWalkedCache.storeWalked(t, pattern)\n }\n\n // now we have either a final string for a known entry,\n // more strings for an unknown entry,\n // or a pattern starting with magic, mounted on t.\n if (typeof p === 'string') {\n // must not be final entry, otherwise we would have\n // concatenated it earlier.\n const ifDir = p === '..' || p === '' || p === '.'\n this.matches.add(t.resolve(p), absolute, ifDir)\n continue\n } else if (p === GLOBSTAR) {\n // if no rest, match and subwalk pattern\n // if rest, process rest and subwalk pattern\n // if it's a symlink, but we didn't get here by way of a\n // globstar match (meaning it's the first time THIS globstar\n // has traversed a symlink), then we follow it. Otherwise, stop.\n if (\n !t.isSymbolicLink() ||\n this.follow ||\n pattern.checkFollowGlobstar()\n ) {\n this.subwalks.add(t, pattern)\n }\n const rp = rest?.pattern()\n const rrest = rest?.rest()\n if (!rest || ((rp === '' || rp === '.') && !rrest)) {\n // only HAS to be a dir if it ends in **/ or **/.\n // but ending in ** will match files as well.\n this.matches.add(t, absolute, rp === '' || rp === '.')\n } else {\n if (rp === '..') {\n // this would mean you're matching **/.. at the fs root,\n // and no thanks, I'm not gonna test that specific case.\n /* c8 ignore start */\n const tp = t.parent || t\n /* c8 ignore stop */\n if (!rrest) this.matches.add(tp, absolute, true)\n else if (!this.hasWalkedCache.hasWalked(tp, rrest)) {\n this.subwalks.add(tp, rrest)\n }\n }\n }\n } else if (p instanceof RegExp) {\n this.subwalks.add(t, pattern)\n }\n }\n\n return this\n }\n\n subwalkTargets(): Path[] {\n return this.subwalks.keys()\n }\n\n child() {\n return new Processor(this.opts, this.hasWalkedCache)\n }\n\n // return a new Processor containing the subwalks for each\n // child entry, and a set of matches, and\n // a hasWalkedCache that's a copy of this one\n // then we're going to call\n filterEntries(parent: Path, entries: Path[]): Processor {\n const patterns = this.subwalks.get(parent)\n // put matches and entry walks into the results processor\n const results = this.child()\n for (const e of entries) {\n for (const pattern of patterns) {\n const absolute = pattern.isAbsolute()\n const p = pattern.pattern()\n const rest = pattern.rest()\n if (p === GLOBSTAR) {\n results.testGlobstar(e, pattern, rest, absolute)\n } else if (p instanceof RegExp) {\n results.testRegExp(e, p, rest, absolute)\n } else {\n results.testString(e, p, rest, absolute)\n }\n }\n }\n return results\n }\n\n testGlobstar(\n e: Path,\n pattern: Pattern,\n rest: Pattern | null,\n absolute: boolean,\n ) {\n if (this.dot || !e.name.startsWith('.')) {\n if (!pattern.hasMore()) {\n this.matches.add(e, absolute, false)\n }\n if (e.canReaddir()) {\n // if we're in follow mode or it's not a symlink, just keep\n // testing the same pattern. If there's more after the globstar,\n // then this symlink consumes the globstar. If not, then we can\n // follow at most ONE symlink along the way, so we mark it, which\n // also checks to ensure that it wasn't already marked.\n if (this.follow || !e.isSymbolicLink()) {\n this.subwalks.add(e, pattern)\n } else if (e.isSymbolicLink()) {\n if (rest && pattern.checkFollowGlobstar()) {\n this.subwalks.add(e, rest)\n } else if (pattern.markFollowGlobstar()) {\n this.subwalks.add(e, pattern)\n }\n }\n }\n }\n // if the NEXT thing matches this entry, then also add\n // the rest.\n if (rest) {\n const rp = rest.pattern()\n if (\n typeof rp === 'string' &&\n // dots and empty were handled already\n rp !== '..' &&\n rp !== '' &&\n rp !== '.'\n ) {\n this.testString(e, rp, rest.rest(), absolute)\n } else if (rp === '..') {\n /* c8 ignore start */\n const ep = e.parent || e\n /* c8 ignore stop */\n this.subwalks.add(ep, rest)\n } else if (rp instanceof RegExp) {\n this.testRegExp(e, rp, rest.rest(), absolute)\n }\n }\n }\n\n testRegExp(\n e: Path,\n p: MMRegExp,\n rest: Pattern | null,\n absolute: boolean,\n ) {\n if (!p.test(e.name)) return\n if (!rest) {\n this.matches.add(e, absolute, false)\n } else {\n this.subwalks.add(e, rest)\n }\n }\n\n testString(e: Path, p: string, rest: Pattern | null, absolute: boolean) {\n // should never happen?\n if (!e.isNamed(p)) return\n if (!rest) {\n this.matches.add(e, absolute, false)\n } else {\n this.subwalks.add(e, rest)\n }\n }\n}\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/walker.d.ts b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/walker.d.ts deleted file mode 100644 index 499c8f4933857a..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/walker.d.ts +++ /dev/null @@ -1,97 +0,0 @@ -/** - * Single-use utility classes to provide functionality to the {@link Glob} - * methods. - * - * @module - */ -import { Minipass } from 'minipass'; -import { Path } from 'path-scurry'; -import { IgnoreLike } from './ignore.js'; -import { Pattern } from './pattern.js'; -import { Processor } from './processor.js'; -export interface GlobWalkerOpts { - absolute?: boolean; - allowWindowsEscape?: boolean; - cwd?: string | URL; - dot?: boolean; - dotRelative?: boolean; - follow?: boolean; - ignore?: string | string[] | IgnoreLike; - mark?: boolean; - matchBase?: boolean; - maxDepth?: number; - nobrace?: boolean; - nocase?: boolean; - nodir?: boolean; - noext?: boolean; - noglobstar?: boolean; - platform?: NodeJS.Platform; - posix?: boolean; - realpath?: boolean; - root?: string; - stat?: boolean; - signal?: AbortSignal; - windowsPathsNoEscape?: boolean; - withFileTypes?: boolean; - includeChildMatches?: boolean; -} -export type GWOFileTypesTrue = GlobWalkerOpts & { - withFileTypes: true; -}; -export type GWOFileTypesFalse = GlobWalkerOpts & { - withFileTypes: false; -}; -export type GWOFileTypesUnset = GlobWalkerOpts & { - withFileTypes?: undefined; -}; -export type Result = O extends GWOFileTypesTrue ? Path : O extends GWOFileTypesFalse ? string : O extends GWOFileTypesUnset ? string : Path | string; -export type Matches = O extends GWOFileTypesTrue ? Set : O extends GWOFileTypesFalse ? Set : O extends GWOFileTypesUnset ? Set : Set; -export type MatchStream = Minipass, Result>; -/** - * basic walking utilities that all the glob walker types use - */ -export declare abstract class GlobUtil { - #private; - path: Path; - patterns: Pattern[]; - opts: O; - seen: Set; - paused: boolean; - aborted: boolean; - signal?: AbortSignal; - maxDepth: number; - includeChildMatches: boolean; - constructor(patterns: Pattern[], path: Path, opts: O); - pause(): void; - resume(): void; - onResume(fn: () => any): void; - matchCheck(e: Path, ifDir: boolean): Promise; - matchCheckTest(e: Path | undefined, ifDir: boolean): Path | undefined; - matchCheckSync(e: Path, ifDir: boolean): Path | undefined; - abstract matchEmit(p: Result): void; - abstract matchEmit(p: string | Path): void; - matchFinish(e: Path, absolute: boolean): void; - match(e: Path, absolute: boolean, ifDir: boolean): Promise; - matchSync(e: Path, absolute: boolean, ifDir: boolean): void; - walkCB(target: Path, patterns: Pattern[], cb: () => any): void; - walkCB2(target: Path, patterns: Pattern[], processor: Processor, cb: () => any): any; - walkCB3(target: Path, entries: Path[], processor: Processor, cb: () => any): void; - walkCBSync(target: Path, patterns: Pattern[], cb: () => any): void; - walkCB2Sync(target: Path, patterns: Pattern[], processor: Processor, cb: () => any): any; - walkCB3Sync(target: Path, entries: Path[], processor: Processor, cb: () => any): void; -} -export declare class GlobWalker extends GlobUtil { - matches: Set>; - constructor(patterns: Pattern[], path: Path, opts: O); - matchEmit(e: Result): void; - walk(): Promise>>; - walkSync(): Set>; -} -export declare class GlobStream extends GlobUtil { - results: Minipass, Result>; - constructor(patterns: Pattern[], path: Path, opts: O); - matchEmit(e: Result): void; - stream(): MatchStream; - streamSync(): MatchStream; -} -//# sourceMappingURL=walker.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/walker.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/walker.d.ts.map deleted file mode 100644 index 769957bd59bb1c..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/walker.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"walker.d.ts","sourceRoot":"","sources":["../../src/walker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAU,UAAU,EAAE,MAAM,aAAa,CAAA;AAOhD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE1C,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,CAAA;IAClB,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,UAAU,CAAA;IACvC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,SAAS,CAAC,EAAE,OAAO,CAAA;IAGnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAA;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAC9B;AAED,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAAG;IAC9C,aAAa,EAAE,IAAI,CAAA;CACpB,CAAA;AACD,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG;IAC/C,aAAa,EAAE,KAAK,CAAA;CACrB,CAAA;AACD,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG;IAC/C,aAAa,CAAC,EAAE,SAAS,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,cAAc,IACzC,CAAC,SAAS,gBAAgB,GAAG,IAAI,GAC/B,CAAC,SAAS,iBAAiB,GAAG,MAAM,GACpC,CAAC,SAAS,iBAAiB,GAAG,MAAM,GACpC,IAAI,GAAG,MAAM,CAAA;AAEjB,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,cAAc,IAC1C,CAAC,SAAS,gBAAgB,GAAG,GAAG,CAAC,IAAI,CAAC,GACpC,CAAC,SAAS,iBAAiB,GAAG,GAAG,CAAC,MAAM,CAAC,GACzC,CAAC,SAAS,iBAAiB,GAAG,GAAG,CAAC,MAAM,CAAC,GACzC,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,CAAA;AAEtB,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,cAAc,IAAI,QAAQ,CAC1D,MAAM,CAAC,CAAC,CAAC,EACT,MAAM,CAAC,CAAC,CAAC,CACV,CAAA;AAUD;;GAEG;AACH,8BAAsB,QAAQ,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc;;IACtE,IAAI,EAAE,IAAI,CAAA;IACV,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,IAAI,EAAE,CAAC,CAAA;IACP,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAkB;IACjC,MAAM,EAAE,OAAO,CAAQ;IACvB,OAAO,EAAE,OAAO,CAAQ;IAIxB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,mBAAmB,EAAE,OAAO,CAAA;gBAEhB,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAsCpD,KAAK;IAGL,MAAM;IAUN,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG;IAahB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;IAqBpE,cAAc,CAAC,CAAC,EAAE,IAAI,GAAG,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS;IAgBrE,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS;IAmBzD,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI;IACtC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAE1C,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO;IA2BhC,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtE,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAK3D,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG;IAOvD,OAAO,CACL,MAAM,EAAE,IAAI,EACZ,QAAQ,EAAE,OAAO,EAAE,EACnB,SAAS,EAAE,SAAS,EACpB,EAAE,EAAE,MAAM,GAAG;IA2Cf,OAAO,CACL,MAAM,EAAE,IAAI,EACZ,OAAO,EAAE,IAAI,EAAE,EACf,SAAS,EAAE,SAAS,EACpB,EAAE,EAAE,MAAM,GAAG;IAsBf,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG;IAO3D,WAAW,CACT,MAAM,EAAE,IAAI,EACZ,QAAQ,EAAE,OAAO,EAAE,EACnB,SAAS,EAAE,SAAS,EACpB,EAAE,EAAE,MAAM,GAAG;IAqCf,WAAW,CACT,MAAM,EAAE,IAAI,EACZ,OAAO,EAAE,IAAI,EAAE,EACf,SAAS,EAAE,SAAS,EACpB,EAAE,EAAE,MAAM,GAAG;CAoBhB;AAED,qBAAa,UAAU,CACrB,CAAC,SAAS,cAAc,GAAG,cAAc,CACzC,SAAQ,QAAQ,CAAC,CAAC,CAAC;IACnB,OAAO,iBAAuB;gBAElB,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAIpD,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI;IAIvB,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAiBrC,QAAQ,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;CAW3B;AAED,qBAAa,UAAU,CACrB,CAAC,SAAS,cAAc,GAAG,cAAc,CACzC,SAAQ,QAAQ,CAAC,CAAC,CAAC;IACnB,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;gBAE3B,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAUpD,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI;IAK7B,MAAM,IAAI,WAAW,CAAC,CAAC,CAAC;IAYxB,UAAU,IAAI,WAAW,CAAC,CAAC,CAAC;CAO7B"} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/walker.js b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/walker.js deleted file mode 100644 index 3d68196c4f175f..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/walker.js +++ /dev/null @@ -1,381 +0,0 @@ -/** - * Single-use utility classes to provide functionality to the {@link Glob} - * methods. - * - * @module - */ -import { Minipass } from 'minipass'; -import { Ignore } from './ignore.js'; -import { Processor } from './processor.js'; -const makeIgnore = (ignore, opts) => typeof ignore === 'string' ? new Ignore([ignore], opts) - : Array.isArray(ignore) ? new Ignore(ignore, opts) - : ignore; -/** - * basic walking utilities that all the glob walker types use - */ -export class GlobUtil { - path; - patterns; - opts; - seen = new Set(); - paused = false; - aborted = false; - #onResume = []; - #ignore; - #sep; - signal; - maxDepth; - includeChildMatches; - constructor(patterns, path, opts) { - this.patterns = patterns; - this.path = path; - this.opts = opts; - this.#sep = !opts.posix && opts.platform === 'win32' ? '\\' : '/'; - this.includeChildMatches = opts.includeChildMatches !== false; - if (opts.ignore || !this.includeChildMatches) { - this.#ignore = makeIgnore(opts.ignore ?? [], opts); - if (!this.includeChildMatches && - typeof this.#ignore.add !== 'function') { - const m = 'cannot ignore child matches, ignore lacks add() method.'; - throw new Error(m); - } - } - // ignore, always set with maxDepth, but it's optional on the - // GlobOptions type - /* c8 ignore start */ - this.maxDepth = opts.maxDepth || Infinity; - /* c8 ignore stop */ - if (opts.signal) { - this.signal = opts.signal; - this.signal.addEventListener('abort', () => { - this.#onResume.length = 0; - }); - } - } - #ignored(path) { - return this.seen.has(path) || !!this.#ignore?.ignored?.(path); - } - #childrenIgnored(path) { - return !!this.#ignore?.childrenIgnored?.(path); - } - // backpressure mechanism - pause() { - this.paused = true; - } - resume() { - /* c8 ignore start */ - if (this.signal?.aborted) - return; - /* c8 ignore stop */ - this.paused = false; - let fn = undefined; - while (!this.paused && (fn = this.#onResume.shift())) { - fn(); - } - } - onResume(fn) { - if (this.signal?.aborted) - return; - /* c8 ignore start */ - if (!this.paused) { - fn(); - } - else { - /* c8 ignore stop */ - this.#onResume.push(fn); - } - } - // do the requisite realpath/stat checking, and return the path - // to add or undefined to filter it out. - async matchCheck(e, ifDir) { - if (ifDir && this.opts.nodir) - return undefined; - let rpc; - if (this.opts.realpath) { - rpc = e.realpathCached() || (await e.realpath()); - if (!rpc) - return undefined; - e = rpc; - } - const needStat = e.isUnknown() || this.opts.stat; - const s = needStat ? await e.lstat() : e; - if (this.opts.follow && this.opts.nodir && s?.isSymbolicLink()) { - const target = await s.realpath(); - /* c8 ignore start */ - if (target && (target.isUnknown() || this.opts.stat)) { - await target.lstat(); - } - /* c8 ignore stop */ - } - return this.matchCheckTest(s, ifDir); - } - matchCheckTest(e, ifDir) { - return (e && - (this.maxDepth === Infinity || e.depth() <= this.maxDepth) && - (!ifDir || e.canReaddir()) && - (!this.opts.nodir || !e.isDirectory()) && - (!this.opts.nodir || - !this.opts.follow || - !e.isSymbolicLink() || - !e.realpathCached()?.isDirectory()) && - !this.#ignored(e)) ? - e - : undefined; - } - matchCheckSync(e, ifDir) { - if (ifDir && this.opts.nodir) - return undefined; - let rpc; - if (this.opts.realpath) { - rpc = e.realpathCached() || e.realpathSync(); - if (!rpc) - return undefined; - e = rpc; - } - const needStat = e.isUnknown() || this.opts.stat; - const s = needStat ? e.lstatSync() : e; - if (this.opts.follow && this.opts.nodir && s?.isSymbolicLink()) { - const target = s.realpathSync(); - if (target && (target?.isUnknown() || this.opts.stat)) { - target.lstatSync(); - } - } - return this.matchCheckTest(s, ifDir); - } - matchFinish(e, absolute) { - if (this.#ignored(e)) - return; - // we know we have an ignore if this is false, but TS doesn't - if (!this.includeChildMatches && this.#ignore?.add) { - const ign = `${e.relativePosix()}/**`; - this.#ignore.add(ign); - } - const abs = this.opts.absolute === undefined ? absolute : this.opts.absolute; - this.seen.add(e); - const mark = this.opts.mark && e.isDirectory() ? this.#sep : ''; - // ok, we have what we need! - if (this.opts.withFileTypes) { - this.matchEmit(e); - } - else if (abs) { - const abs = this.opts.posix ? e.fullpathPosix() : e.fullpath(); - this.matchEmit(abs + mark); - } - else { - const rel = this.opts.posix ? e.relativePosix() : e.relative(); - const pre = this.opts.dotRelative && !rel.startsWith('..' + this.#sep) ? - '.' + this.#sep - : ''; - this.matchEmit(!rel ? '.' + mark : pre + rel + mark); - } - } - async match(e, absolute, ifDir) { - const p = await this.matchCheck(e, ifDir); - if (p) - this.matchFinish(p, absolute); - } - matchSync(e, absolute, ifDir) { - const p = this.matchCheckSync(e, ifDir); - if (p) - this.matchFinish(p, absolute); - } - walkCB(target, patterns, cb) { - /* c8 ignore start */ - if (this.signal?.aborted) - cb(); - /* c8 ignore stop */ - this.walkCB2(target, patterns, new Processor(this.opts), cb); - } - walkCB2(target, patterns, processor, cb) { - if (this.#childrenIgnored(target)) - return cb(); - if (this.signal?.aborted) - cb(); - if (this.paused) { - this.onResume(() => this.walkCB2(target, patterns, processor, cb)); - return; - } - processor.processPatterns(target, patterns); - // done processing. all of the above is sync, can be abstracted out. - // subwalks is a map of paths to the entry filters they need - // matches is a map of paths to [absolute, ifDir] tuples. - let tasks = 1; - const next = () => { - if (--tasks === 0) - cb(); - }; - for (const [m, absolute, ifDir] of processor.matches.entries()) { - if (this.#ignored(m)) - continue; - tasks++; - this.match(m, absolute, ifDir).then(() => next()); - } - for (const t of processor.subwalkTargets()) { - if (this.maxDepth !== Infinity && t.depth() >= this.maxDepth) { - continue; - } - tasks++; - const childrenCached = t.readdirCached(); - if (t.calledReaddir()) - this.walkCB3(t, childrenCached, processor, next); - else { - t.readdirCB((_, entries) => this.walkCB3(t, entries, processor, next), true); - } - } - next(); - } - walkCB3(target, entries, processor, cb) { - processor = processor.filterEntries(target, entries); - let tasks = 1; - const next = () => { - if (--tasks === 0) - cb(); - }; - for (const [m, absolute, ifDir] of processor.matches.entries()) { - if (this.#ignored(m)) - continue; - tasks++; - this.match(m, absolute, ifDir).then(() => next()); - } - for (const [target, patterns] of processor.subwalks.entries()) { - tasks++; - this.walkCB2(target, patterns, processor.child(), next); - } - next(); - } - walkCBSync(target, patterns, cb) { - /* c8 ignore start */ - if (this.signal?.aborted) - cb(); - /* c8 ignore stop */ - this.walkCB2Sync(target, patterns, new Processor(this.opts), cb); - } - walkCB2Sync(target, patterns, processor, cb) { - if (this.#childrenIgnored(target)) - return cb(); - if (this.signal?.aborted) - cb(); - if (this.paused) { - this.onResume(() => this.walkCB2Sync(target, patterns, processor, cb)); - return; - } - processor.processPatterns(target, patterns); - // done processing. all of the above is sync, can be abstracted out. - // subwalks is a map of paths to the entry filters they need - // matches is a map of paths to [absolute, ifDir] tuples. - let tasks = 1; - const next = () => { - if (--tasks === 0) - cb(); - }; - for (const [m, absolute, ifDir] of processor.matches.entries()) { - if (this.#ignored(m)) - continue; - this.matchSync(m, absolute, ifDir); - } - for (const t of processor.subwalkTargets()) { - if (this.maxDepth !== Infinity && t.depth() >= this.maxDepth) { - continue; - } - tasks++; - const children = t.readdirSync(); - this.walkCB3Sync(t, children, processor, next); - } - next(); - } - walkCB3Sync(target, entries, processor, cb) { - processor = processor.filterEntries(target, entries); - let tasks = 1; - const next = () => { - if (--tasks === 0) - cb(); - }; - for (const [m, absolute, ifDir] of processor.matches.entries()) { - if (this.#ignored(m)) - continue; - this.matchSync(m, absolute, ifDir); - } - for (const [target, patterns] of processor.subwalks.entries()) { - tasks++; - this.walkCB2Sync(target, patterns, processor.child(), next); - } - next(); - } -} -export class GlobWalker extends GlobUtil { - matches = new Set(); - constructor(patterns, path, opts) { - super(patterns, path, opts); - } - matchEmit(e) { - this.matches.add(e); - } - async walk() { - if (this.signal?.aborted) - throw this.signal.reason; - if (this.path.isUnknown()) { - await this.path.lstat(); - } - await new Promise((res, rej) => { - this.walkCB(this.path, this.patterns, () => { - if (this.signal?.aborted) { - rej(this.signal.reason); - } - else { - res(this.matches); - } - }); - }); - return this.matches; - } - walkSync() { - if (this.signal?.aborted) - throw this.signal.reason; - if (this.path.isUnknown()) { - this.path.lstatSync(); - } - // nothing for the callback to do, because this never pauses - this.walkCBSync(this.path, this.patterns, () => { - if (this.signal?.aborted) - throw this.signal.reason; - }); - return this.matches; - } -} -export class GlobStream extends GlobUtil { - results; - constructor(patterns, path, opts) { - super(patterns, path, opts); - this.results = new Minipass({ - signal: this.signal, - objectMode: true, - }); - this.results.on('drain', () => this.resume()); - this.results.on('resume', () => this.resume()); - } - matchEmit(e) { - this.results.write(e); - if (!this.results.flowing) - this.pause(); - } - stream() { - const target = this.path; - if (target.isUnknown()) { - target.lstat().then(() => { - this.walkCB(target, this.patterns, () => this.results.end()); - }); - } - else { - this.walkCB(target, this.patterns, () => this.results.end()); - } - return this.results; - } - streamSync() { - if (this.path.isUnknown()) { - this.path.lstatSync(); - } - this.walkCBSync(this.path, this.patterns, () => this.results.end()); - return this.results; - } -} -//# sourceMappingURL=walker.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/walker.js.map b/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/walker.js.map deleted file mode 100644 index daeeda6752713f..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/dist/esm/walker.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"walker.js","sourceRoot":"","sources":["../../src/walker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAEnC,OAAO,EAAE,MAAM,EAAc,MAAM,aAAa,CAAA;AAQhD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AA0D1C,MAAM,UAAU,GAAG,CACjB,MAAsC,EACtC,IAAoB,EACR,EAAE,CACd,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC;IACvD,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC;QAClD,CAAC,CAAC,MAAM,CAAA;AAEV;;GAEG;AACH,MAAM,OAAgB,QAAQ;IAC5B,IAAI,CAAM;IACV,QAAQ,CAAW;IACnB,IAAI,CAAG;IACP,IAAI,GAAc,IAAI,GAAG,EAAQ,CAAA;IACjC,MAAM,GAAY,KAAK,CAAA;IACvB,OAAO,GAAY,KAAK,CAAA;IACxB,SAAS,GAAkB,EAAE,CAAA;IAC7B,OAAO,CAAa;IACpB,IAAI,CAAY;IAChB,MAAM,CAAc;IACpB,QAAQ,CAAQ;IAChB,mBAAmB,CAAS;IAG5B,YAAY,QAAmB,EAAE,IAAU,EAAE,IAAO;QAClD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAA;QACjE,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,KAAK,KAAK,CAAA;QAC7D,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7C,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,IAAI,CAAC,CAAA;YAClD,IACE,CAAC,IAAI,CAAC,mBAAmB;gBACzB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,UAAU,EACtC,CAAC;gBACD,MAAM,CAAC,GAAG,yDAAyD,CAAA;gBACnE,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAA;YACpB,CAAC;QACH,CAAC;QACD,6DAA6D;QAC7D,mBAAmB;QACnB,qBAAqB;QACrB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAA;QACzC,oBAAoB;QACpB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;YACzB,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;gBACzC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAA;YAC3B,CAAC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,IAAU;QACjB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,CAAA;IAC/D,CAAC;IACD,gBAAgB,CAAC,IAAU;QACzB,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC,IAAI,CAAC,CAAA;IAChD,CAAC;IAED,yBAAyB;IACzB,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;IACpB,CAAC;IACD,MAAM;QACJ,qBAAqB;QACrB,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,OAAM;QAChC,oBAAoB;QACpB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,EAAE,GAA4B,SAAS,CAAA;QAC3C,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;YACrD,EAAE,EAAE,CAAA;QACN,CAAC;IACH,CAAC;IACD,QAAQ,CAAC,EAAa;QACpB,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,OAAM;QAChC,qBAAqB;QACrB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,EAAE,EAAE,CAAA;QACN,CAAC;aAAM,CAAC;YACN,oBAAoB;YACpB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACzB,CAAC;IACH,CAAC;IAED,+DAA+D;IAC/D,wCAAwC;IACxC,KAAK,CAAC,UAAU,CAAC,CAAO,EAAE,KAAc;QACtC,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAA;QAC9C,IAAI,GAAqB,CAAA;QACzB,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACvB,GAAG,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;YAChD,IAAI,CAAC,GAAG;gBAAE,OAAO,SAAS,CAAA;YAC1B,CAAC,GAAG,GAAG,CAAA;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;QAChD,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QACxC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,cAAc,EAAE,EAAE,CAAC;YAC/D,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAA;YACjC,qBAAqB;YACrB,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrD,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;YACtB,CAAC;YACD,oBAAoB;QACtB,CAAC;QACD,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IACtC,CAAC;IAED,cAAc,CAAC,CAAmB,EAAE,KAAc;QAChD,OAAO,CACH,CAAC;YACC,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC;YAC1D,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;YAC1B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACtC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;gBACf,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM;gBACjB,CAAC,CAAC,CAAC,cAAc,EAAE;gBACnB,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,WAAW,EAAE,CAAC;YACrC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CACpB,CAAC,CAAC;YACD,CAAC;YACH,CAAC,CAAC,SAAS,CAAA;IACf,CAAC;IAED,cAAc,CAAC,CAAO,EAAE,KAAc;QACpC,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAA;QAC9C,IAAI,GAAqB,CAAA;QACzB,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACvB,GAAG,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,YAAY,EAAE,CAAA;YAC5C,IAAI,CAAC,GAAG;gBAAE,OAAO,SAAS,CAAA;YAC1B,CAAC,GAAG,GAAG,CAAA;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;QAChD,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QACtC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,cAAc,EAAE,EAAE,CAAC;YAC/D,MAAM,MAAM,GAAG,CAAC,CAAC,YAAY,EAAE,CAAA;YAC/B,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtD,MAAM,CAAC,SAAS,EAAE,CAAA;YACpB,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IACtC,CAAC;IAKD,WAAW,CAAC,CAAO,EAAE,QAAiB;QACpC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAM;QAC5B,6DAA6D;QAC7D,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;YACnD,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,aAAa,EAAE,KAAK,CAAA;YACrC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACvB,CAAC;QACD,MAAM,GAAG,GACP,IAAI,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAA;QAClE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAChB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;QAC/D,4BAA4B;QAC5B,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YAC5B,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QACnB,CAAC;aAAM,IAAI,GAAG,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;YAC9D,IAAI,CAAC,SAAS,CAAC,GAAG,GAAG,IAAI,CAAC,CAAA;QAC5B,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;YAC9D,MAAM,GAAG,GACP,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC1D,GAAG,GAAG,IAAI,CAAC,IAAI;gBACjB,CAAC,CAAC,EAAE,CAAA;YACN,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,CAAA;QACtD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,CAAO,EAAE,QAAiB,EAAE,KAAc;QACpD,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;QACzC,IAAI,CAAC;YAAE,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;IACtC,CAAC;IAED,SAAS,CAAC,CAAO,EAAE,QAAiB,EAAE,KAAc;QAClD,MAAM,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;QACvC,IAAI,CAAC;YAAE,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;IACtC,CAAC;IAED,MAAM,CAAC,MAAY,EAAE,QAAmB,EAAE,EAAa;QACrD,qBAAqB;QACrB,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,EAAE,EAAE,CAAA;QAC9B,oBAAoB;QACpB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;IAC9D,CAAC;IAED,OAAO,CACL,MAAY,EACZ,QAAmB,EACnB,SAAoB,EACpB,EAAa;QAEb,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,EAAE,CAAA;QAC9C,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,EAAE,EAAE,CAAA;QAC9B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,CAAA;YAClE,OAAM;QACR,CAAC;QACD,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QAE3C,qEAAqE;QACrE,4DAA4D;QAC5D,yDAAyD;QACzD,IAAI,KAAK,GAAG,CAAC,CAAA;QACb,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,IAAI,EAAE,KAAK,KAAK,CAAC;gBAAE,EAAE,EAAE,CAAA;QACzB,CAAC,CAAA;QAED,KAAK,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YAC/D,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,SAAQ;YAC9B,KAAK,EAAE,CAAA;YACP,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAA;QACnD,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,cAAc,EAAE,EAAE,CAAC;YAC3C,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC7D,SAAQ;YACV,CAAC;YACD,KAAK,EAAE,CAAA;YACP,MAAM,cAAc,GAAG,CAAC,CAAC,aAAa,EAAE,CAAA;YACxC,IAAI,CAAC,CAAC,aAAa,EAAE;gBACnB,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,cAAc,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;iBAC7C,CAAC;gBACJ,CAAC,CAAC,SAAS,CACT,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,EACzD,IAAI,CACL,CAAA;YACH,CAAC;QACH,CAAC;QAED,IAAI,EAAE,CAAA;IACR,CAAC;IAED,OAAO,CACL,MAAY,EACZ,OAAe,EACf,SAAoB,EACpB,EAAa;QAEb,SAAS,GAAG,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAEpD,IAAI,KAAK,GAAG,CAAC,CAAA;QACb,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,IAAI,EAAE,KAAK,KAAK,CAAC;gBAAE,EAAE,EAAE,CAAA;QACzB,CAAC,CAAA;QAED,KAAK,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YAC/D,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,SAAQ;YAC9B,KAAK,EAAE,CAAA;YACP,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAA;QACnD,CAAC;QACD,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9D,KAAK,EAAE,CAAA;YACP,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAA;QACzD,CAAC;QAED,IAAI,EAAE,CAAA;IACR,CAAC;IAED,UAAU,CAAC,MAAY,EAAE,QAAmB,EAAE,EAAa;QACzD,qBAAqB;QACrB,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,EAAE,EAAE,CAAA;QAC9B,oBAAoB;QACpB,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;IAClE,CAAC;IAED,WAAW,CACT,MAAY,EACZ,QAAmB,EACnB,SAAoB,EACpB,EAAa;QAEb,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,EAAE,CAAA;QAC9C,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,EAAE,EAAE,CAAA;QAC9B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CACjB,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAC,CAClD,CAAA;YACD,OAAM;QACR,CAAC;QACD,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QAE3C,qEAAqE;QACrE,4DAA4D;QAC5D,yDAAyD;QACzD,IAAI,KAAK,GAAG,CAAC,CAAA;QACb,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,IAAI,EAAE,KAAK,KAAK,CAAC;gBAAE,EAAE,EAAE,CAAA;QACzB,CAAC,CAAA;QAED,KAAK,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YAC/D,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,SAAQ;YAC9B,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;QACpC,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,cAAc,EAAE,EAAE,CAAC;YAC3C,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC7D,SAAQ;YACV,CAAC;YACD,KAAK,EAAE,CAAA;YACP,MAAM,QAAQ,GAAG,CAAC,CAAC,WAAW,EAAE,CAAA;YAChC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;QAChD,CAAC;QAED,IAAI,EAAE,CAAA;IACR,CAAC;IAED,WAAW,CACT,MAAY,EACZ,OAAe,EACf,SAAoB,EACpB,EAAa;QAEb,SAAS,GAAG,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAEpD,IAAI,KAAK,GAAG,CAAC,CAAA;QACb,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,IAAI,EAAE,KAAK,KAAK,CAAC;gBAAE,EAAE,EAAE,CAAA;QACzB,CAAC,CAAA;QAED,KAAK,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YAC/D,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,SAAQ;YAC9B,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;QACpC,CAAC;QACD,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9D,KAAK,EAAE,CAAA;YACP,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAA;QAC7D,CAAC;QAED,IAAI,EAAE,CAAA;IACR,CAAC;CACF;AAED,MAAM,OAAO,UAEX,SAAQ,QAAW;IACnB,OAAO,GAAG,IAAI,GAAG,EAAa,CAAA;IAE9B,YAAY,QAAmB,EAAE,IAAU,EAAE,IAAO;QAClD,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;IAC7B,CAAC;IAED,SAAS,CAAC,CAAY;QACpB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;QAClD,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YAC1B,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAA;QACzB,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;gBACzC,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;oBACzB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;gBACzB,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBACnB,CAAC;YACH,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QACF,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,QAAQ;QACN,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;QAClD,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAA;QACvB,CAAC;QACD,4DAA4D;QAC5D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;YAC7C,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;gBAAE,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;QACpD,CAAC,CAAC,CAAA;QACF,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;CACF;AAED,MAAM,OAAO,UAEX,SAAQ,QAAW;IACnB,OAAO,CAAgC;IAEvC,YAAY,QAAmB,EAAE,IAAU,EAAE,IAAO;QAClD,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,QAAQ,CAAuB;YAChD,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,UAAU,EAAE,IAAI;SACjB,CAAC,CAAA;QACF,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;QAC7C,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;IAChD,CAAC;IAED,SAAS,CAAC,CAAY;QACpB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACrB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,IAAI,CAAC,KAAK,EAAE,CAAA;IACzC,CAAC;IAED,MAAM;QACJ,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAA;QACxB,IAAI,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC;YACvB,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;gBACvB,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;YAC9D,CAAC,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;QAC9D,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,UAAU;QACR,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAA;QACvB,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;QACnE,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;CACF","sourcesContent":["/**\n * Single-use utility classes to provide functionality to the {@link Glob}\n * methods.\n *\n * @module\n */\nimport { Minipass } from 'minipass'\nimport { Path } from 'path-scurry'\nimport { Ignore, IgnoreLike } from './ignore.js'\n\n// XXX can we somehow make it so that it NEVER processes a given path more than\n// once, enough that the match set tracking is no longer needed? that'd speed\n// things up a lot. Or maybe bring back nounique, and skip it in that case?\n\n// a single minimatch set entry with 1 or more parts\nimport { Pattern } from './pattern.js'\nimport { Processor } from './processor.js'\n\nexport interface GlobWalkerOpts {\n absolute?: boolean\n allowWindowsEscape?: boolean\n cwd?: string | URL\n dot?: boolean\n dotRelative?: boolean\n follow?: boolean\n ignore?: string | string[] | IgnoreLike\n mark?: boolean\n matchBase?: boolean\n // Note: maxDepth here means \"maximum actual Path.depth()\",\n // not \"maximum depth beyond cwd\"\n maxDepth?: number\n nobrace?: boolean\n nocase?: boolean\n nodir?: boolean\n noext?: boolean\n noglobstar?: boolean\n platform?: NodeJS.Platform\n posix?: boolean\n realpath?: boolean\n root?: string\n stat?: boolean\n signal?: AbortSignal\n windowsPathsNoEscape?: boolean\n withFileTypes?: boolean\n includeChildMatches?: boolean\n}\n\nexport type GWOFileTypesTrue = GlobWalkerOpts & {\n withFileTypes: true\n}\nexport type GWOFileTypesFalse = GlobWalkerOpts & {\n withFileTypes: false\n}\nexport type GWOFileTypesUnset = GlobWalkerOpts & {\n withFileTypes?: undefined\n}\n\nexport type Result =\n O extends GWOFileTypesTrue ? Path\n : O extends GWOFileTypesFalse ? string\n : O extends GWOFileTypesUnset ? string\n : Path | string\n\nexport type Matches =\n O extends GWOFileTypesTrue ? Set\n : O extends GWOFileTypesFalse ? Set\n : O extends GWOFileTypesUnset ? Set\n : Set\n\nexport type MatchStream = Minipass<\n Result,\n Result\n>\n\nconst makeIgnore = (\n ignore: string | string[] | IgnoreLike,\n opts: GlobWalkerOpts,\n): IgnoreLike =>\n typeof ignore === 'string' ? new Ignore([ignore], opts)\n : Array.isArray(ignore) ? new Ignore(ignore, opts)\n : ignore\n\n/**\n * basic walking utilities that all the glob walker types use\n */\nexport abstract class GlobUtil {\n path: Path\n patterns: Pattern[]\n opts: O\n seen: Set = new Set()\n paused: boolean = false\n aborted: boolean = false\n #onResume: (() => any)[] = []\n #ignore?: IgnoreLike\n #sep: '\\\\' | '/'\n signal?: AbortSignal\n maxDepth: number\n includeChildMatches: boolean\n\n constructor(patterns: Pattern[], path: Path, opts: O)\n constructor(patterns: Pattern[], path: Path, opts: O) {\n this.patterns = patterns\n this.path = path\n this.opts = opts\n this.#sep = !opts.posix && opts.platform === 'win32' ? '\\\\' : '/'\n this.includeChildMatches = opts.includeChildMatches !== false\n if (opts.ignore || !this.includeChildMatches) {\n this.#ignore = makeIgnore(opts.ignore ?? [], opts)\n if (\n !this.includeChildMatches &&\n typeof this.#ignore.add !== 'function'\n ) {\n const m = 'cannot ignore child matches, ignore lacks add() method.'\n throw new Error(m)\n }\n }\n // ignore, always set with maxDepth, but it's optional on the\n // GlobOptions type\n /* c8 ignore start */\n this.maxDepth = opts.maxDepth || Infinity\n /* c8 ignore stop */\n if (opts.signal) {\n this.signal = opts.signal\n this.signal.addEventListener('abort', () => {\n this.#onResume.length = 0\n })\n }\n }\n\n #ignored(path: Path): boolean {\n return this.seen.has(path) || !!this.#ignore?.ignored?.(path)\n }\n #childrenIgnored(path: Path): boolean {\n return !!this.#ignore?.childrenIgnored?.(path)\n }\n\n // backpressure mechanism\n pause() {\n this.paused = true\n }\n resume() {\n /* c8 ignore start */\n if (this.signal?.aborted) return\n /* c8 ignore stop */\n this.paused = false\n let fn: (() => any) | undefined = undefined\n while (!this.paused && (fn = this.#onResume.shift())) {\n fn()\n }\n }\n onResume(fn: () => any) {\n if (this.signal?.aborted) return\n /* c8 ignore start */\n if (!this.paused) {\n fn()\n } else {\n /* c8 ignore stop */\n this.#onResume.push(fn)\n }\n }\n\n // do the requisite realpath/stat checking, and return the path\n // to add or undefined to filter it out.\n async matchCheck(e: Path, ifDir: boolean): Promise {\n if (ifDir && this.opts.nodir) return undefined\n let rpc: Path | undefined\n if (this.opts.realpath) {\n rpc = e.realpathCached() || (await e.realpath())\n if (!rpc) return undefined\n e = rpc\n }\n const needStat = e.isUnknown() || this.opts.stat\n const s = needStat ? await e.lstat() : e\n if (this.opts.follow && this.opts.nodir && s?.isSymbolicLink()) {\n const target = await s.realpath()\n /* c8 ignore start */\n if (target && (target.isUnknown() || this.opts.stat)) {\n await target.lstat()\n }\n /* c8 ignore stop */\n }\n return this.matchCheckTest(s, ifDir)\n }\n\n matchCheckTest(e: Path | undefined, ifDir: boolean): Path | undefined {\n return (\n e &&\n (this.maxDepth === Infinity || e.depth() <= this.maxDepth) &&\n (!ifDir || e.canReaddir()) &&\n (!this.opts.nodir || !e.isDirectory()) &&\n (!this.opts.nodir ||\n !this.opts.follow ||\n !e.isSymbolicLink() ||\n !e.realpathCached()?.isDirectory()) &&\n !this.#ignored(e)\n ) ?\n e\n : undefined\n }\n\n matchCheckSync(e: Path, ifDir: boolean): Path | undefined {\n if (ifDir && this.opts.nodir) return undefined\n let rpc: Path | undefined\n if (this.opts.realpath) {\n rpc = e.realpathCached() || e.realpathSync()\n if (!rpc) return undefined\n e = rpc\n }\n const needStat = e.isUnknown() || this.opts.stat\n const s = needStat ? e.lstatSync() : e\n if (this.opts.follow && this.opts.nodir && s?.isSymbolicLink()) {\n const target = s.realpathSync()\n if (target && (target?.isUnknown() || this.opts.stat)) {\n target.lstatSync()\n }\n }\n return this.matchCheckTest(s, ifDir)\n }\n\n abstract matchEmit(p: Result): void\n abstract matchEmit(p: string | Path): void\n\n matchFinish(e: Path, absolute: boolean) {\n if (this.#ignored(e)) return\n // we know we have an ignore if this is false, but TS doesn't\n if (!this.includeChildMatches && this.#ignore?.add) {\n const ign = `${e.relativePosix()}/**`\n this.#ignore.add(ign)\n }\n const abs =\n this.opts.absolute === undefined ? absolute : this.opts.absolute\n this.seen.add(e)\n const mark = this.opts.mark && e.isDirectory() ? this.#sep : ''\n // ok, we have what we need!\n if (this.opts.withFileTypes) {\n this.matchEmit(e)\n } else if (abs) {\n const abs = this.opts.posix ? e.fullpathPosix() : e.fullpath()\n this.matchEmit(abs + mark)\n } else {\n const rel = this.opts.posix ? e.relativePosix() : e.relative()\n const pre =\n this.opts.dotRelative && !rel.startsWith('..' + this.#sep) ?\n '.' + this.#sep\n : ''\n this.matchEmit(!rel ? '.' + mark : pre + rel + mark)\n }\n }\n\n async match(e: Path, absolute: boolean, ifDir: boolean): Promise {\n const p = await this.matchCheck(e, ifDir)\n if (p) this.matchFinish(p, absolute)\n }\n\n matchSync(e: Path, absolute: boolean, ifDir: boolean): void {\n const p = this.matchCheckSync(e, ifDir)\n if (p) this.matchFinish(p, absolute)\n }\n\n walkCB(target: Path, patterns: Pattern[], cb: () => any) {\n /* c8 ignore start */\n if (this.signal?.aborted) cb()\n /* c8 ignore stop */\n this.walkCB2(target, patterns, new Processor(this.opts), cb)\n }\n\n walkCB2(\n target: Path,\n patterns: Pattern[],\n processor: Processor,\n cb: () => any,\n ) {\n if (this.#childrenIgnored(target)) return cb()\n if (this.signal?.aborted) cb()\n if (this.paused) {\n this.onResume(() => this.walkCB2(target, patterns, processor, cb))\n return\n }\n processor.processPatterns(target, patterns)\n\n // done processing. all of the above is sync, can be abstracted out.\n // subwalks is a map of paths to the entry filters they need\n // matches is a map of paths to [absolute, ifDir] tuples.\n let tasks = 1\n const next = () => {\n if (--tasks === 0) cb()\n }\n\n for (const [m, absolute, ifDir] of processor.matches.entries()) {\n if (this.#ignored(m)) continue\n tasks++\n this.match(m, absolute, ifDir).then(() => next())\n }\n\n for (const t of processor.subwalkTargets()) {\n if (this.maxDepth !== Infinity && t.depth() >= this.maxDepth) {\n continue\n }\n tasks++\n const childrenCached = t.readdirCached()\n if (t.calledReaddir())\n this.walkCB3(t, childrenCached, processor, next)\n else {\n t.readdirCB(\n (_, entries) => this.walkCB3(t, entries, processor, next),\n true,\n )\n }\n }\n\n next()\n }\n\n walkCB3(\n target: Path,\n entries: Path[],\n processor: Processor,\n cb: () => any,\n ) {\n processor = processor.filterEntries(target, entries)\n\n let tasks = 1\n const next = () => {\n if (--tasks === 0) cb()\n }\n\n for (const [m, absolute, ifDir] of processor.matches.entries()) {\n if (this.#ignored(m)) continue\n tasks++\n this.match(m, absolute, ifDir).then(() => next())\n }\n for (const [target, patterns] of processor.subwalks.entries()) {\n tasks++\n this.walkCB2(target, patterns, processor.child(), next)\n }\n\n next()\n }\n\n walkCBSync(target: Path, patterns: Pattern[], cb: () => any) {\n /* c8 ignore start */\n if (this.signal?.aborted) cb()\n /* c8 ignore stop */\n this.walkCB2Sync(target, patterns, new Processor(this.opts), cb)\n }\n\n walkCB2Sync(\n target: Path,\n patterns: Pattern[],\n processor: Processor,\n cb: () => any,\n ) {\n if (this.#childrenIgnored(target)) return cb()\n if (this.signal?.aborted) cb()\n if (this.paused) {\n this.onResume(() =>\n this.walkCB2Sync(target, patterns, processor, cb),\n )\n return\n }\n processor.processPatterns(target, patterns)\n\n // done processing. all of the above is sync, can be abstracted out.\n // subwalks is a map of paths to the entry filters they need\n // matches is a map of paths to [absolute, ifDir] tuples.\n let tasks = 1\n const next = () => {\n if (--tasks === 0) cb()\n }\n\n for (const [m, absolute, ifDir] of processor.matches.entries()) {\n if (this.#ignored(m)) continue\n this.matchSync(m, absolute, ifDir)\n }\n\n for (const t of processor.subwalkTargets()) {\n if (this.maxDepth !== Infinity && t.depth() >= this.maxDepth) {\n continue\n }\n tasks++\n const children = t.readdirSync()\n this.walkCB3Sync(t, children, processor, next)\n }\n\n next()\n }\n\n walkCB3Sync(\n target: Path,\n entries: Path[],\n processor: Processor,\n cb: () => any,\n ) {\n processor = processor.filterEntries(target, entries)\n\n let tasks = 1\n const next = () => {\n if (--tasks === 0) cb()\n }\n\n for (const [m, absolute, ifDir] of processor.matches.entries()) {\n if (this.#ignored(m)) continue\n this.matchSync(m, absolute, ifDir)\n }\n for (const [target, patterns] of processor.subwalks.entries()) {\n tasks++\n this.walkCB2Sync(target, patterns, processor.child(), next)\n }\n\n next()\n }\n}\n\nexport class GlobWalker<\n O extends GlobWalkerOpts = GlobWalkerOpts,\n> extends GlobUtil {\n matches = new Set>()\n\n constructor(patterns: Pattern[], path: Path, opts: O) {\n super(patterns, path, opts)\n }\n\n matchEmit(e: Result): void {\n this.matches.add(e)\n }\n\n async walk(): Promise>> {\n if (this.signal?.aborted) throw this.signal.reason\n if (this.path.isUnknown()) {\n await this.path.lstat()\n }\n await new Promise((res, rej) => {\n this.walkCB(this.path, this.patterns, () => {\n if (this.signal?.aborted) {\n rej(this.signal.reason)\n } else {\n res(this.matches)\n }\n })\n })\n return this.matches\n }\n\n walkSync(): Set> {\n if (this.signal?.aborted) throw this.signal.reason\n if (this.path.isUnknown()) {\n this.path.lstatSync()\n }\n // nothing for the callback to do, because this never pauses\n this.walkCBSync(this.path, this.patterns, () => {\n if (this.signal?.aborted) throw this.signal.reason\n })\n return this.matches\n }\n}\n\nexport class GlobStream<\n O extends GlobWalkerOpts = GlobWalkerOpts,\n> extends GlobUtil {\n results: Minipass, Result>\n\n constructor(patterns: Pattern[], path: Path, opts: O) {\n super(patterns, path, opts)\n this.results = new Minipass, Result>({\n signal: this.signal,\n objectMode: true,\n })\n this.results.on('drain', () => this.resume())\n this.results.on('resume', () => this.resume())\n }\n\n matchEmit(e: Result): void {\n this.results.write(e)\n if (!this.results.flowing) this.pause()\n }\n\n stream(): MatchStream {\n const target = this.path\n if (target.isUnknown()) {\n target.lstat().then(() => {\n this.walkCB(target, this.patterns, () => this.results.end())\n })\n } else {\n this.walkCB(target, this.patterns, () => this.results.end())\n }\n return this.results\n }\n\n streamSync(): MatchStream {\n if (this.path.isUnknown()) {\n this.path.lstatSync()\n }\n this.walkCBSync(this.path, this.patterns, () => this.results.end())\n return this.results\n }\n}\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/package.json b/deps/npm/node_modules/node-gyp/node_modules/glob/package.json deleted file mode 100644 index 6d4893b5f327ba..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/package.json +++ /dev/null @@ -1,99 +0,0 @@ -{ - "author": "Isaac Z. Schlueter (https://blog.izs.me/)", - "publishConfig": { - "tag": "legacy-v10" - }, - "name": "glob", - "description": "the most correct and second fastest glob implementation in JavaScript", - "version": "10.4.5", - "type": "module", - "tshy": { - "main": true, - "exports": { - "./package.json": "./package.json", - ".": "./src/index.ts" - } - }, - "bin": "./dist/esm/bin.mjs", - "main": "./dist/commonjs/index.js", - "types": "./dist/commonjs/index.d.ts", - "exports": { - "./package.json": "./package.json", - ".": { - "import": { - "types": "./dist/esm/index.d.ts", - "default": "./dist/esm/index.js" - }, - "require": { - "types": "./dist/commonjs/index.d.ts", - "default": "./dist/commonjs/index.js" - } - } - }, - "repository": { - "type": "git", - "url": "git://github.com/isaacs/node-glob.git" - }, - "files": [ - "dist" - ], - "scripts": { - "preversion": "npm test", - "postversion": "npm publish", - "prepublishOnly": "git push origin --follow-tags", - "prepare": "tshy", - "pretest": "npm run prepare", - "presnap": "npm run prepare", - "test": "tap", - "snap": "tap", - "format": "prettier --write . --log-level warn", - "typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts", - "prepublish": "npm run benchclean", - "profclean": "rm -f v8.log profile.txt", - "test-regen": "npm run profclean && TEST_REGEN=1 node --no-warnings --loader ts-node/esm test/00-setup.ts", - "prebench": "npm run prepare", - "bench": "bash benchmark.sh", - "preprof": "npm run prepare", - "prof": "bash prof.sh", - "benchclean": "node benchclean.cjs" - }, - "prettier": { - "experimentalTernaries": true, - "semi": false, - "printWidth": 75, - "tabWidth": 2, - "useTabs": false, - "singleQuote": true, - "jsxSingleQuote": false, - "bracketSameLine": true, - "arrowParens": "avoid", - "endOfLine": "lf" - }, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "devDependencies": { - "@types/node": "^20.11.30", - "memfs": "^3.4.13", - "mkdirp": "^3.0.1", - "prettier": "^3.2.5", - "rimraf": "^5.0.7", - "sync-content": "^1.0.2", - "tap": "^19.0.0", - "tshy": "^1.14.0", - "typedoc": "^0.25.12" - }, - "tap": { - "before": "test/00-setup.ts" - }, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "module": "./dist/esm/index.js" -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/jackspeak/dist/commonjs/index.js b/deps/npm/node_modules/node-gyp/node_modules/jackspeak/dist/commonjs/index.js deleted file mode 100644 index f7fc9cb69a2af0..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/jackspeak/dist/commonjs/index.js +++ /dev/null @@ -1,1010 +0,0 @@ -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.jack = exports.Jack = exports.isConfigOption = exports.isConfigType = void 0; -const node_util_1 = require("node:util"); -const parse_args_js_1 = require("./parse-args.js"); -// it's a tiny API, just cast it inline, it's fine -//@ts-ignore -const cliui_1 = __importDefault(require("@isaacs/cliui")); -const node_path_1 = require("node:path"); -const width = Math.min((process && process.stdout && process.stdout.columns) || 80, 80); -// indentation spaces from heading level -const indent = (n) => (n - 1) * 2; -const toEnvKey = (pref, key) => { - return [pref, key.replace(/[^a-zA-Z0-9]+/g, ' ')] - .join(' ') - .trim() - .toUpperCase() - .replace(/ /g, '_'); -}; -const toEnvVal = (value, delim = '\n') => { - const str = typeof value === 'string' ? value - : typeof value === 'boolean' ? - value ? '1' - : '0' - : typeof value === 'number' ? String(value) - : Array.isArray(value) ? - value.map((v) => toEnvVal(v)).join(delim) - : /* c8 ignore start */ undefined; - if (typeof str !== 'string') { - throw new Error(`could not serialize value to environment: ${JSON.stringify(value)}`); - } - /* c8 ignore stop */ - return str; -}; -const fromEnvVal = (env, type, multiple, delim = '\n') => (multiple ? - env ? env.split(delim).map(v => fromEnvVal(v, type, false)) - : [] - : type === 'string' ? env - : type === 'boolean' ? env === '1' - : +env.trim()); -const isConfigType = (t) => typeof t === 'string' && - (t === 'string' || t === 'number' || t === 'boolean'); -exports.isConfigType = isConfigType; -const undefOrType = (v, t) => v === undefined || typeof v === t; -const undefOrTypeArray = (v, t) => v === undefined || (Array.isArray(v) && v.every(x => typeof x === t)); -const isValidOption = (v, vo) => Array.isArray(v) ? v.every(x => isValidOption(x, vo)) : vo.includes(v); -// print the value type, for error message reporting -const valueType = (v) => typeof v === 'string' ? 'string' - : typeof v === 'boolean' ? 'boolean' - : typeof v === 'number' ? 'number' - : Array.isArray(v) ? - joinTypes([...new Set(v.map(v => valueType(v)))]) + '[]' - : `${v.type}${v.multiple ? '[]' : ''}`; -const joinTypes = (types) => types.length === 1 && typeof types[0] === 'string' ? - types[0] - : `(${types.join('|')})`; -const isValidValue = (v, type, multi) => { - if (multi) { - if (!Array.isArray(v)) - return false; - return !v.some((v) => !isValidValue(v, type, false)); - } - if (Array.isArray(v)) - return false; - return typeof v === type; -}; -const isConfigOption = (o, type, multi) => !!o && - typeof o === 'object' && - (0, exports.isConfigType)(o.type) && - o.type === type && - undefOrType(o.short, 'string') && - undefOrType(o.description, 'string') && - undefOrType(o.hint, 'string') && - undefOrType(o.validate, 'function') && - (o.type === 'boolean' ? - o.validOptions === undefined - : undefOrTypeArray(o.validOptions, o.type)) && - (o.default === undefined || isValidValue(o.default, type, multi)) && - !!o.multiple === multi; -exports.isConfigOption = isConfigOption; -function num(o = {}) { - const { default: def, validate: val, validOptions, ...rest } = o; - if (def !== undefined && !isValidValue(def, 'number', false)) { - throw new TypeError('invalid default value', { - cause: { - found: def, - wanted: 'number', - }, - }); - } - if (!undefOrTypeArray(validOptions, 'number')) { - throw new TypeError('invalid validOptions', { - cause: { - found: validOptions, - wanted: 'number[]', - }, - }); - } - const validate = val ? - val - : undefined; - return { - ...rest, - default: def, - validate, - validOptions, - type: 'number', - multiple: false, - }; -} -function numList(o = {}) { - const { default: def, validate: val, validOptions, ...rest } = o; - if (def !== undefined && !isValidValue(def, 'number', true)) { - throw new TypeError('invalid default value', { - cause: { - found: def, - wanted: 'number[]', - }, - }); - } - if (!undefOrTypeArray(validOptions, 'number')) { - throw new TypeError('invalid validOptions', { - cause: { - found: validOptions, - wanted: 'number[]', - }, - }); - } - const validate = val ? - val - : undefined; - return { - ...rest, - default: def, - validate, - validOptions, - type: 'number', - multiple: true, - }; -} -function opt(o = {}) { - const { default: def, validate: val, validOptions, ...rest } = o; - if (def !== undefined && !isValidValue(def, 'string', false)) { - throw new TypeError('invalid default value', { - cause: { - found: def, - wanted: 'string', - }, - }); - } - if (!undefOrTypeArray(validOptions, 'string')) { - throw new TypeError('invalid validOptions', { - cause: { - found: validOptions, - wanted: 'string[]', - }, - }); - } - const validate = val ? - val - : undefined; - return { - ...rest, - default: def, - validate, - validOptions, - type: 'string', - multiple: false, - }; -} -function optList(o = {}) { - const { default: def, validate: val, validOptions, ...rest } = o; - if (def !== undefined && !isValidValue(def, 'string', true)) { - throw new TypeError('invalid default value', { - cause: { - found: def, - wanted: 'string[]', - }, - }); - } - if (!undefOrTypeArray(validOptions, 'string')) { - throw new TypeError('invalid validOptions', { - cause: { - found: validOptions, - wanted: 'string[]', - }, - }); - } - const validate = val ? - val - : undefined; - return { - ...rest, - default: def, - validate, - validOptions, - type: 'string', - multiple: true, - }; -} -function flag(o = {}) { - const { hint, default: def, validate: val, ...rest } = o; - delete rest.validOptions; - if (def !== undefined && !isValidValue(def, 'boolean', false)) { - throw new TypeError('invalid default value'); - } - const validate = val ? - val - : undefined; - if (hint !== undefined) { - throw new TypeError('cannot provide hint for flag'); - } - return { - ...rest, - default: def, - validate, - type: 'boolean', - multiple: false, - }; -} -function flagList(o = {}) { - const { hint, default: def, validate: val, ...rest } = o; - delete rest.validOptions; - if (def !== undefined && !isValidValue(def, 'boolean', true)) { - throw new TypeError('invalid default value'); - } - const validate = val ? - val - : undefined; - if (hint !== undefined) { - throw new TypeError('cannot provide hint for flag list'); - } - return { - ...rest, - default: def, - validate, - type: 'boolean', - multiple: true, - }; -} -const toParseArgsOptionsConfig = (options) => { - const c = {}; - for (const longOption in options) { - const config = options[longOption]; - /* c8 ignore start */ - if (!config) { - throw new Error('config must be an object: ' + longOption); - } - /* c8 ignore start */ - if ((0, exports.isConfigOption)(config, 'number', true)) { - c[longOption] = { - type: 'string', - multiple: true, - default: config.default?.map(c => String(c)), - }; - } - else if ((0, exports.isConfigOption)(config, 'number', false)) { - c[longOption] = { - type: 'string', - multiple: false, - default: config.default === undefined ? - undefined - : String(config.default), - }; - } - else { - const conf = config; - c[longOption] = { - type: conf.type, - multiple: !!conf.multiple, - default: conf.default, - }; - } - const clo = c[longOption]; - if (typeof config.short === 'string') { - clo.short = config.short; - } - if (config.type === 'boolean' && - !longOption.startsWith('no-') && - !options[`no-${longOption}`]) { - c[`no-${longOption}`] = { - type: 'boolean', - multiple: config.multiple, - }; - } - } - return c; -}; -const isHeading = (r) => r.type === 'heading'; -const isDescription = (r) => r.type === 'description'; -/** - * Class returned by the {@link jack} function and all configuration - * definition methods. This is what gets chained together. - */ -class Jack { - #configSet; - #shorts; - #options; - #fields = []; - #env; - #envPrefix; - #allowPositionals; - #usage; - #usageMarkdown; - constructor(options = {}) { - this.#options = options; - this.#allowPositionals = options.allowPositionals !== false; - this.#env = - this.#options.env === undefined ? process.env : this.#options.env; - this.#envPrefix = options.envPrefix; - // We need to fib a little, because it's always the same object, but it - // starts out as having an empty config set. Then each method that adds - // fields returns `this as Jack` - this.#configSet = Object.create(null); - this.#shorts = Object.create(null); - } - /** - * Set the default value (which will still be overridden by env or cli) - * as if from a parsed config file. The optional `source` param, if - * provided, will be included in error messages if a value is invalid or - * unknown. - */ - setConfigValues(values, source = '') { - try { - this.validate(values); - } - catch (er) { - const e = er; - if (source && e && typeof e === 'object') { - if (e.cause && typeof e.cause === 'object') { - Object.assign(e.cause, { path: source }); - } - else { - e.cause = { path: source }; - } - } - throw e; - } - for (const [field, value] of Object.entries(values)) { - const my = this.#configSet[field]; - // already validated, just for TS's benefit - /* c8 ignore start */ - if (!my) { - throw new Error('unexpected field in config set: ' + field, { - cause: { found: field }, - }); - } - /* c8 ignore stop */ - my.default = value; - } - return this; - } - /** - * Parse a string of arguments, and return the resulting - * `{ values, positionals }` object. - * - * If an {@link JackOptions#envPrefix} is set, then it will read default - * values from the environment, and write the resulting values back - * to the environment as well. - * - * Environment values always take precedence over any other value, except - * an explicit CLI setting. - */ - parse(args = process.argv) { - this.loadEnvDefaults(); - const p = this.parseRaw(args); - this.applyDefaults(p); - this.writeEnv(p); - return p; - } - loadEnvDefaults() { - if (this.#envPrefix) { - for (const [field, my] of Object.entries(this.#configSet)) { - const ek = toEnvKey(this.#envPrefix, field); - const env = this.#env[ek]; - if (env !== undefined) { - my.default = fromEnvVal(env, my.type, !!my.multiple, my.delim); - } - } - } - } - applyDefaults(p) { - for (const [field, c] of Object.entries(this.#configSet)) { - if (c.default !== undefined && !(field in p.values)) { - //@ts-ignore - p.values[field] = c.default; - } - } - } - /** - * Only parse the command line arguments passed in. - * Does not strip off the `node script.js` bits, so it must be just the - * arguments you wish to have parsed. - * Does not read from or write to the environment, or set defaults. - */ - parseRaw(args) { - if (args === process.argv) { - args = args.slice(process._eval !== undefined ? 1 : 2); - } - const options = toParseArgsOptionsConfig(this.#configSet); - const result = (0, parse_args_js_1.parseArgs)({ - args, - options, - // always strict, but using our own logic - strict: false, - allowPositionals: this.#allowPositionals, - tokens: true, - }); - const p = { - values: {}, - positionals: [], - }; - for (const token of result.tokens) { - if (token.kind === 'positional') { - p.positionals.push(token.value); - if (this.#options.stopAtPositional || - this.#options.stopAtPositionalTest?.(token.value)) { - p.positionals.push(...args.slice(token.index + 1)); - break; - } - } - else if (token.kind === 'option') { - let value = undefined; - if (token.name.startsWith('no-')) { - const my = this.#configSet[token.name]; - const pname = token.name.substring('no-'.length); - const pos = this.#configSet[pname]; - if (pos && - pos.type === 'boolean' && - (!my || - (my.type === 'boolean' && !!my.multiple === !!pos.multiple))) { - value = false; - token.name = pname; - } - } - const my = this.#configSet[token.name]; - if (!my) { - throw new Error(`Unknown option '${token.rawName}'. ` + - `To specify a positional argument starting with a '-', ` + - `place it at the end of the command after '--', as in ` + - `'-- ${token.rawName}'`, { - cause: { - found: token.rawName + (token.value ? `=${token.value}` : ''), - }, - }); - } - if (value === undefined) { - if (token.value === undefined) { - if (my.type !== 'boolean') { - throw new Error(`No value provided for ${token.rawName}, expected ${my.type}`, { - cause: { - name: token.rawName, - wanted: valueType(my), - }, - }); - } - value = true; - } - else { - if (my.type === 'boolean') { - throw new Error(`Flag ${token.rawName} does not take a value, received '${token.value}'`, { cause: { found: token } }); - } - if (my.type === 'string') { - value = token.value; - } - else { - value = +token.value; - if (value !== value) { - throw new Error(`Invalid value '${token.value}' provided for ` + - `'${token.rawName}' option, expected number`, { - cause: { - name: token.rawName, - found: token.value, - wanted: 'number', - }, - }); - } - } - } - } - if (my.multiple) { - const pv = p.values; - const tn = pv[token.name] ?? []; - pv[token.name] = tn; - tn.push(value); - } - else { - const pv = p.values; - pv[token.name] = value; - } - } - } - for (const [field, value] of Object.entries(p.values)) { - const valid = this.#configSet[field]?.validate; - const validOptions = this.#configSet[field]?.validOptions; - let cause; - if (validOptions && !isValidOption(value, validOptions)) { - cause = { name: field, found: value, validOptions: validOptions }; - } - if (valid && !valid(value)) { - cause = cause || { name: field, found: value }; - } - if (cause) { - throw new Error(`Invalid value provided for --${field}: ${JSON.stringify(value)}`, { cause }); - } - } - return p; - } - /** - * do not set fields as 'no-foo' if 'foo' exists and both are bools - * just set foo. - */ - #noNoFields(f, val, s = f) { - if (!f.startsWith('no-') || typeof val !== 'boolean') - return; - const yes = f.substring('no-'.length); - // recurse so we get the core config key we care about. - this.#noNoFields(yes, val, s); - if (this.#configSet[yes]?.type === 'boolean') { - throw new Error(`do not set '${s}', instead set '${yes}' as desired.`, { cause: { found: s, wanted: yes } }); - } - } - /** - * Validate that any arbitrary object is a valid configuration `values` - * object. Useful when loading config files or other sources. - */ - validate(o) { - if (!o || typeof o !== 'object') { - throw new Error('Invalid config: not an object', { - cause: { found: o }, - }); - } - const opts = o; - for (const field in o) { - const value = opts[field]; - /* c8 ignore next - for TS */ - if (value === undefined) - continue; - this.#noNoFields(field, value); - const config = this.#configSet[field]; - if (!config) { - throw new Error(`Unknown config option: ${field}`, { - cause: { found: field }, - }); - } - if (!isValidValue(value, config.type, !!config.multiple)) { - throw new Error(`Invalid value ${valueType(value)} for ${field}, expected ${valueType(config)}`, { - cause: { - name: field, - found: value, - wanted: valueType(config), - }, - }); - } - let cause; - if (config.validOptions && - !isValidOption(value, config.validOptions)) { - cause = { - name: field, - found: value, - validOptions: config.validOptions, - }; - } - if (config.validate && !config.validate(value)) { - cause = cause || { name: field, found: value }; - } - if (cause) { - throw new Error(`Invalid config value for ${field}: ${value}`, { - cause, - }); - } - } - } - writeEnv(p) { - if (!this.#env || !this.#envPrefix) - return; - for (const [field, value] of Object.entries(p.values)) { - const my = this.#configSet[field]; - this.#env[toEnvKey(this.#envPrefix, field)] = toEnvVal(value, my?.delim); - } - } - /** - * Add a heading to the usage output banner - */ - heading(text, level, { pre = false } = {}) { - if (level === undefined) { - level = this.#fields.some(r => isHeading(r)) ? 2 : 1; - } - this.#fields.push({ type: 'heading', text, level, pre }); - return this; - } - /** - * Add a long-form description to the usage output at this position. - */ - description(text, { pre } = {}) { - this.#fields.push({ type: 'description', text, pre }); - return this; - } - /** - * Add one or more number fields. - */ - num(fields) { - return this.#addFields(fields, num); - } - /** - * Add one or more multiple number fields. - */ - numList(fields) { - return this.#addFields(fields, numList); - } - /** - * Add one or more string option fields. - */ - opt(fields) { - return this.#addFields(fields, opt); - } - /** - * Add one or more multiple string option fields. - */ - optList(fields) { - return this.#addFields(fields, optList); - } - /** - * Add one or more flag fields. - */ - flag(fields) { - return this.#addFields(fields, flag); - } - /** - * Add one or more multiple flag fields. - */ - flagList(fields) { - return this.#addFields(fields, flagList); - } - /** - * Generic field definition method. Similar to flag/flagList/number/etc, - * but you must specify the `type` (and optionally `multiple` and `delim`) - * fields on each one, or Jack won't know how to define them. - */ - addFields(fields) { - const next = this; - for (const [name, field] of Object.entries(fields)) { - this.#validateName(name, field); - next.#fields.push({ - type: 'config', - name, - value: field, - }); - } - Object.assign(next.#configSet, fields); - return next; - } - #addFields(fields, fn) { - const next = this; - Object.assign(next.#configSet, Object.fromEntries(Object.entries(fields).map(([name, field]) => { - this.#validateName(name, field); - const option = fn(field); - next.#fields.push({ - type: 'config', - name, - value: option, - }); - return [name, option]; - }))); - return next; - } - #validateName(name, field) { - if (!/^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?$/.test(name)) { - throw new TypeError(`Invalid option name: ${name}, ` + - `must be '-' delimited ASCII alphanumeric`); - } - if (this.#configSet[name]) { - throw new TypeError(`Cannot redefine option ${field}`); - } - if (this.#shorts[name]) { - throw new TypeError(`Cannot redefine option ${name}, already ` + - `in use for ${this.#shorts[name]}`); - } - if (field.short) { - if (!/^[a-zA-Z0-9]$/.test(field.short)) { - throw new TypeError(`Invalid ${name} short option: ${field.short}, ` + - 'must be 1 ASCII alphanumeric character'); - } - if (this.#shorts[field.short]) { - throw new TypeError(`Invalid ${name} short option: ${field.short}, ` + - `already in use for ${this.#shorts[field.short]}`); - } - this.#shorts[field.short] = name; - this.#shorts[name] = name; - } - } - /** - * Return the usage banner for the given configuration - */ - usage() { - if (this.#usage) - return this.#usage; - let headingLevel = 1; - const ui = (0, cliui_1.default)({ width }); - const first = this.#fields[0]; - let start = first?.type === 'heading' ? 1 : 0; - if (first?.type === 'heading') { - ui.div({ - padding: [0, 0, 0, 0], - text: normalize(first.text), - }); - } - ui.div({ padding: [0, 0, 0, 0], text: 'Usage:' }); - if (this.#options.usage) { - ui.div({ - text: this.#options.usage, - padding: [0, 0, 0, 2], - }); - } - else { - const cmd = (0, node_path_1.basename)(String(process.argv[1])); - const shortFlags = []; - const shorts = []; - const flags = []; - const opts = []; - for (const [field, config] of Object.entries(this.#configSet)) { - if (config.short) { - if (config.type === 'boolean') - shortFlags.push(config.short); - else - shorts.push([config.short, config.hint || field]); - } - else { - if (config.type === 'boolean') - flags.push(field); - else - opts.push([field, config.hint || field]); - } - } - const sf = shortFlags.length ? ' -' + shortFlags.join('') : ''; - const so = shorts.map(([k, v]) => ` --${k}=<${v}>`).join(''); - const lf = flags.map(k => ` --${k}`).join(''); - const lo = opts.map(([k, v]) => ` --${k}=<${v}>`).join(''); - const usage = `${cmd}${sf}${so}${lf}${lo}`.trim(); - ui.div({ - text: usage, - padding: [0, 0, 0, 2], - }); - } - ui.div({ padding: [0, 0, 0, 0], text: '' }); - const maybeDesc = this.#fields[start]; - if (maybeDesc && isDescription(maybeDesc)) { - const print = normalize(maybeDesc.text, maybeDesc.pre); - start++; - ui.div({ padding: [0, 0, 0, 0], text: print }); - ui.div({ padding: [0, 0, 0, 0], text: '' }); - } - const { rows, maxWidth } = this.#usageRows(start); - // every heading/description after the first gets indented by 2 - // extra spaces. - for (const row of rows) { - if (row.left) { - // If the row is too long, don't wrap it - // Bump the right-hand side down a line to make room - const configIndent = indent(Math.max(headingLevel, 2)); - if (row.left.length > maxWidth - 3) { - ui.div({ text: row.left, padding: [0, 0, 0, configIndent] }); - ui.div({ text: row.text, padding: [0, 0, 0, maxWidth] }); - } - else { - ui.div({ - text: row.left, - padding: [0, 1, 0, configIndent], - width: maxWidth, - }, { padding: [0, 0, 0, 0], text: row.text }); - } - if (row.skipLine) { - ui.div({ padding: [0, 0, 0, 0], text: '' }); - } - } - else { - if (isHeading(row)) { - const { level } = row; - headingLevel = level; - // only h1 and h2 have bottom padding - // h3-h6 do not - const b = level <= 2 ? 1 : 0; - ui.div({ ...row, padding: [0, 0, b, indent(level)] }); - } - else { - ui.div({ ...row, padding: [0, 0, 1, indent(headingLevel + 1)] }); - } - } - } - return (this.#usage = ui.toString()); - } - /** - * Return the usage banner markdown for the given configuration - */ - usageMarkdown() { - if (this.#usageMarkdown) - return this.#usageMarkdown; - const out = []; - let headingLevel = 1; - const first = this.#fields[0]; - let start = first?.type === 'heading' ? 1 : 0; - if (first?.type === 'heading') { - out.push(`# ${normalizeOneLine(first.text)}`); - } - out.push('Usage:'); - if (this.#options.usage) { - out.push(normalizeMarkdown(this.#options.usage, true)); - } - else { - const cmd = (0, node_path_1.basename)(String(process.argv[1])); - const shortFlags = []; - const shorts = []; - const flags = []; - const opts = []; - for (const [field, config] of Object.entries(this.#configSet)) { - if (config.short) { - if (config.type === 'boolean') - shortFlags.push(config.short); - else - shorts.push([config.short, config.hint || field]); - } - else { - if (config.type === 'boolean') - flags.push(field); - else - opts.push([field, config.hint || field]); - } - } - const sf = shortFlags.length ? ' -' + shortFlags.join('') : ''; - const so = shorts.map(([k, v]) => ` --${k}=<${v}>`).join(''); - const lf = flags.map(k => ` --${k}`).join(''); - const lo = opts.map(([k, v]) => ` --${k}=<${v}>`).join(''); - const usage = `${cmd}${sf}${so}${lf}${lo}`.trim(); - out.push(normalizeMarkdown(usage, true)); - } - const maybeDesc = this.#fields[start]; - if (maybeDesc && isDescription(maybeDesc)) { - out.push(normalizeMarkdown(maybeDesc.text, maybeDesc.pre)); - start++; - } - const { rows } = this.#usageRows(start); - // heading level in markdown is number of # ahead of text - for (const row of rows) { - if (row.left) { - out.push('#'.repeat(headingLevel + 1) + - ' ' + - normalizeOneLine(row.left, true)); - if (row.text) - out.push(normalizeMarkdown(row.text)); - } - else if (isHeading(row)) { - const { level } = row; - headingLevel = level; - out.push(`${'#'.repeat(headingLevel)} ${normalizeOneLine(row.text, row.pre)}`); - } - else { - out.push(normalizeMarkdown(row.text, !!row.pre)); - } - } - return (this.#usageMarkdown = out.join('\n\n') + '\n'); - } - #usageRows(start) { - // turn each config type into a row, and figure out the width of the - // left hand indentation for the option descriptions. - let maxMax = Math.max(12, Math.min(26, Math.floor(width / 3))); - let maxWidth = 8; - let prev = undefined; - const rows = []; - for (const field of this.#fields.slice(start)) { - if (field.type !== 'config') { - if (prev?.type === 'config') - prev.skipLine = true; - prev = undefined; - field.text = normalize(field.text, !!field.pre); - rows.push(field); - continue; - } - const { value } = field; - const desc = value.description || ''; - const mult = value.multiple ? 'Can be set multiple times' : ''; - const opts = value.validOptions?.length ? - `Valid options:${value.validOptions.map(v => ` ${JSON.stringify(v)}`)}` - : ''; - const dmDelim = desc.includes('\n') ? '\n\n' : '\n'; - const extra = [opts, mult].join(dmDelim).trim(); - const text = (normalize(desc) + dmDelim + extra).trim(); - const hint = value.hint || - (value.type === 'number' ? 'n' - : value.type === 'string' ? field.name - : undefined); - const short = !value.short ? '' - : value.type === 'boolean' ? `-${value.short} ` - : `-${value.short}<${hint}> `; - const left = value.type === 'boolean' ? - `${short}--${field.name}` - : `${short}--${field.name}=<${hint}>`; - const row = { text, left, type: 'config' }; - if (text.length > width - maxMax) { - row.skipLine = true; - } - if (prev && left.length > maxMax) - prev.skipLine = true; - prev = row; - const len = left.length + 4; - if (len > maxWidth && len < maxMax) { - maxWidth = len; - } - rows.push(row); - } - return { rows, maxWidth }; - } - /** - * Return the configuration options as a plain object - */ - toJSON() { - return Object.fromEntries(Object.entries(this.#configSet).map(([field, def]) => [ - field, - { - type: def.type, - ...(def.multiple ? { multiple: true } : {}), - ...(def.delim ? { delim: def.delim } : {}), - ...(def.short ? { short: def.short } : {}), - ...(def.description ? - { description: normalize(def.description) } - : {}), - ...(def.validate ? { validate: def.validate } : {}), - ...(def.validOptions ? { validOptions: def.validOptions } : {}), - ...(def.default !== undefined ? { default: def.default } : {}), - ...(def.hint ? { hint: def.hint } : {}), - }, - ])); - } - /** - * Custom printer for `util.inspect` - */ - [node_util_1.inspect.custom](_, options) { - return `Jack ${(0, node_util_1.inspect)(this.toJSON(), options)}`; - } -} -exports.Jack = Jack; -// Unwrap and un-indent, so we can wrap description -// strings however makes them look nice in the code. -const normalize = (s, pre = false) => { - if (pre) - // prepend a ZWSP to each line so cliui doesn't strip it. - return s - .split('\n') - .map(l => `\u200b${l}`) - .join('\n'); - return s - .split(/^\s*```\s*$/gm) - .map((s, i) => { - if (i % 2 === 1) { - if (!s.trim()) { - return `\`\`\`\n\`\`\`\n`; - } - // outdent the ``` blocks, but preserve whitespace otherwise. - const split = s.split('\n'); - // throw out the \n at the start and end - split.pop(); - split.shift(); - const si = split.reduce((shortest, l) => { - /* c8 ignore next */ - const ind = l.match(/^\s*/)?.[0] ?? ''; - if (ind.length) - return Math.min(ind.length, shortest); - else - return shortest; - }, Infinity); - /* c8 ignore next */ - const i = isFinite(si) ? si : 0; - return ('\n```\n' + - split.map(s => `\u200b${s.substring(i)}`).join('\n') + - '\n```\n'); - } - return (s - // remove single line breaks, except for lists - .replace(/([^\n])\n[ \t]*([^\n])/g, (_, $1, $2) => !/^[-*]/.test($2) ? `${$1} ${$2}` : `${$1}\n${$2}`) - // normalize mid-line whitespace - .replace(/([^\n])[ \t]+([^\n])/g, '$1 $2') - // two line breaks are enough - .replace(/\n{3,}/g, '\n\n') - // remove any spaces at the start of a line - .replace(/\n[ \t]+/g, '\n') - .trim()); - }) - .join('\n'); -}; -// normalize for markdown printing, remove leading spaces on lines -const normalizeMarkdown = (s, pre = false) => { - const n = normalize(s, pre).replace(/\\/g, '\\\\'); - return pre ? - `\`\`\`\n${n.replace(/\u200b/g, '')}\n\`\`\`` - : n.replace(/\n +/g, '\n').trim(); -}; -const normalizeOneLine = (s, pre = false) => { - const n = normalize(s, pre) - .replace(/[\s\u200b]+/g, ' ') - .trim(); - return pre ? `\`${n}\`` : n; -}; -/** - * Main entry point. Create and return a {@link Jack} object. - */ -const jack = (options = {}) => new Jack(options); -exports.jack = jack; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/jackspeak/dist/commonjs/package.json b/deps/npm/node_modules/node-gyp/node_modules/jackspeak/dist/commonjs/package.json deleted file mode 100644 index 5bbefffbabee39..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/jackspeak/dist/commonjs/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "commonjs" -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/jackspeak/dist/commonjs/parse-args.js b/deps/npm/node_modules/node-gyp/node_modules/jackspeak/dist/commonjs/parse-args.js deleted file mode 100644 index fc918a41fe603d..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/jackspeak/dist/commonjs/parse-args.js +++ /dev/null @@ -1,50 +0,0 @@ -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.parseArgs = void 0; -const util = __importStar(require("util")); -const pv = (typeof process === 'object' && - !!process && - typeof process.version === 'string') ? - process.version - : 'v0.0.0'; -const pvs = pv - .replace(/^v/, '') - .split('.') - .map(s => parseInt(s, 10)); -/* c8 ignore start */ -const [major = 0, minor = 0] = pvs; -/* c8 ignore stop */ -let { parseArgs: pa } = util; -/* c8 ignore start */ -if (!pa || - major < 16 || - (major === 18 && minor < 11) || - (major === 16 && minor < 19)) { - /* c8 ignore stop */ - pa = require('@pkgjs/parseargs').parseArgs; -} -exports.parseArgs = pa; -//# sourceMappingURL=parse-args-cjs.cjs.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/jackspeak/dist/esm/index.js b/deps/npm/node_modules/node-gyp/node_modules/jackspeak/dist/esm/index.js deleted file mode 100644 index 78fdfa8155472a..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/jackspeak/dist/esm/index.js +++ /dev/null @@ -1,1000 +0,0 @@ -import { inspect } from 'node:util'; -import { parseArgs } from './parse-args.js'; -// it's a tiny API, just cast it inline, it's fine -//@ts-ignore -import cliui from '@isaacs/cliui'; -import { basename } from 'node:path'; -const width = Math.min((process && process.stdout && process.stdout.columns) || 80, 80); -// indentation spaces from heading level -const indent = (n) => (n - 1) * 2; -const toEnvKey = (pref, key) => { - return [pref, key.replace(/[^a-zA-Z0-9]+/g, ' ')] - .join(' ') - .trim() - .toUpperCase() - .replace(/ /g, '_'); -}; -const toEnvVal = (value, delim = '\n') => { - const str = typeof value === 'string' ? value - : typeof value === 'boolean' ? - value ? '1' - : '0' - : typeof value === 'number' ? String(value) - : Array.isArray(value) ? - value.map((v) => toEnvVal(v)).join(delim) - : /* c8 ignore start */ undefined; - if (typeof str !== 'string') { - throw new Error(`could not serialize value to environment: ${JSON.stringify(value)}`); - } - /* c8 ignore stop */ - return str; -}; -const fromEnvVal = (env, type, multiple, delim = '\n') => (multiple ? - env ? env.split(delim).map(v => fromEnvVal(v, type, false)) - : [] - : type === 'string' ? env - : type === 'boolean' ? env === '1' - : +env.trim()); -export const isConfigType = (t) => typeof t === 'string' && - (t === 'string' || t === 'number' || t === 'boolean'); -const undefOrType = (v, t) => v === undefined || typeof v === t; -const undefOrTypeArray = (v, t) => v === undefined || (Array.isArray(v) && v.every(x => typeof x === t)); -const isValidOption = (v, vo) => Array.isArray(v) ? v.every(x => isValidOption(x, vo)) : vo.includes(v); -// print the value type, for error message reporting -const valueType = (v) => typeof v === 'string' ? 'string' - : typeof v === 'boolean' ? 'boolean' - : typeof v === 'number' ? 'number' - : Array.isArray(v) ? - joinTypes([...new Set(v.map(v => valueType(v)))]) + '[]' - : `${v.type}${v.multiple ? '[]' : ''}`; -const joinTypes = (types) => types.length === 1 && typeof types[0] === 'string' ? - types[0] - : `(${types.join('|')})`; -const isValidValue = (v, type, multi) => { - if (multi) { - if (!Array.isArray(v)) - return false; - return !v.some((v) => !isValidValue(v, type, false)); - } - if (Array.isArray(v)) - return false; - return typeof v === type; -}; -export const isConfigOption = (o, type, multi) => !!o && - typeof o === 'object' && - isConfigType(o.type) && - o.type === type && - undefOrType(o.short, 'string') && - undefOrType(o.description, 'string') && - undefOrType(o.hint, 'string') && - undefOrType(o.validate, 'function') && - (o.type === 'boolean' ? - o.validOptions === undefined - : undefOrTypeArray(o.validOptions, o.type)) && - (o.default === undefined || isValidValue(o.default, type, multi)) && - !!o.multiple === multi; -function num(o = {}) { - const { default: def, validate: val, validOptions, ...rest } = o; - if (def !== undefined && !isValidValue(def, 'number', false)) { - throw new TypeError('invalid default value', { - cause: { - found: def, - wanted: 'number', - }, - }); - } - if (!undefOrTypeArray(validOptions, 'number')) { - throw new TypeError('invalid validOptions', { - cause: { - found: validOptions, - wanted: 'number[]', - }, - }); - } - const validate = val ? - val - : undefined; - return { - ...rest, - default: def, - validate, - validOptions, - type: 'number', - multiple: false, - }; -} -function numList(o = {}) { - const { default: def, validate: val, validOptions, ...rest } = o; - if (def !== undefined && !isValidValue(def, 'number', true)) { - throw new TypeError('invalid default value', { - cause: { - found: def, - wanted: 'number[]', - }, - }); - } - if (!undefOrTypeArray(validOptions, 'number')) { - throw new TypeError('invalid validOptions', { - cause: { - found: validOptions, - wanted: 'number[]', - }, - }); - } - const validate = val ? - val - : undefined; - return { - ...rest, - default: def, - validate, - validOptions, - type: 'number', - multiple: true, - }; -} -function opt(o = {}) { - const { default: def, validate: val, validOptions, ...rest } = o; - if (def !== undefined && !isValidValue(def, 'string', false)) { - throw new TypeError('invalid default value', { - cause: { - found: def, - wanted: 'string', - }, - }); - } - if (!undefOrTypeArray(validOptions, 'string')) { - throw new TypeError('invalid validOptions', { - cause: { - found: validOptions, - wanted: 'string[]', - }, - }); - } - const validate = val ? - val - : undefined; - return { - ...rest, - default: def, - validate, - validOptions, - type: 'string', - multiple: false, - }; -} -function optList(o = {}) { - const { default: def, validate: val, validOptions, ...rest } = o; - if (def !== undefined && !isValidValue(def, 'string', true)) { - throw new TypeError('invalid default value', { - cause: { - found: def, - wanted: 'string[]', - }, - }); - } - if (!undefOrTypeArray(validOptions, 'string')) { - throw new TypeError('invalid validOptions', { - cause: { - found: validOptions, - wanted: 'string[]', - }, - }); - } - const validate = val ? - val - : undefined; - return { - ...rest, - default: def, - validate, - validOptions, - type: 'string', - multiple: true, - }; -} -function flag(o = {}) { - const { hint, default: def, validate: val, ...rest } = o; - delete rest.validOptions; - if (def !== undefined && !isValidValue(def, 'boolean', false)) { - throw new TypeError('invalid default value'); - } - const validate = val ? - val - : undefined; - if (hint !== undefined) { - throw new TypeError('cannot provide hint for flag'); - } - return { - ...rest, - default: def, - validate, - type: 'boolean', - multiple: false, - }; -} -function flagList(o = {}) { - const { hint, default: def, validate: val, ...rest } = o; - delete rest.validOptions; - if (def !== undefined && !isValidValue(def, 'boolean', true)) { - throw new TypeError('invalid default value'); - } - const validate = val ? - val - : undefined; - if (hint !== undefined) { - throw new TypeError('cannot provide hint for flag list'); - } - return { - ...rest, - default: def, - validate, - type: 'boolean', - multiple: true, - }; -} -const toParseArgsOptionsConfig = (options) => { - const c = {}; - for (const longOption in options) { - const config = options[longOption]; - /* c8 ignore start */ - if (!config) { - throw new Error('config must be an object: ' + longOption); - } - /* c8 ignore start */ - if (isConfigOption(config, 'number', true)) { - c[longOption] = { - type: 'string', - multiple: true, - default: config.default?.map(c => String(c)), - }; - } - else if (isConfigOption(config, 'number', false)) { - c[longOption] = { - type: 'string', - multiple: false, - default: config.default === undefined ? - undefined - : String(config.default), - }; - } - else { - const conf = config; - c[longOption] = { - type: conf.type, - multiple: !!conf.multiple, - default: conf.default, - }; - } - const clo = c[longOption]; - if (typeof config.short === 'string') { - clo.short = config.short; - } - if (config.type === 'boolean' && - !longOption.startsWith('no-') && - !options[`no-${longOption}`]) { - c[`no-${longOption}`] = { - type: 'boolean', - multiple: config.multiple, - }; - } - } - return c; -}; -const isHeading = (r) => r.type === 'heading'; -const isDescription = (r) => r.type === 'description'; -/** - * Class returned by the {@link jack} function and all configuration - * definition methods. This is what gets chained together. - */ -export class Jack { - #configSet; - #shorts; - #options; - #fields = []; - #env; - #envPrefix; - #allowPositionals; - #usage; - #usageMarkdown; - constructor(options = {}) { - this.#options = options; - this.#allowPositionals = options.allowPositionals !== false; - this.#env = - this.#options.env === undefined ? process.env : this.#options.env; - this.#envPrefix = options.envPrefix; - // We need to fib a little, because it's always the same object, but it - // starts out as having an empty config set. Then each method that adds - // fields returns `this as Jack` - this.#configSet = Object.create(null); - this.#shorts = Object.create(null); - } - /** - * Set the default value (which will still be overridden by env or cli) - * as if from a parsed config file. The optional `source` param, if - * provided, will be included in error messages if a value is invalid or - * unknown. - */ - setConfigValues(values, source = '') { - try { - this.validate(values); - } - catch (er) { - const e = er; - if (source && e && typeof e === 'object') { - if (e.cause && typeof e.cause === 'object') { - Object.assign(e.cause, { path: source }); - } - else { - e.cause = { path: source }; - } - } - throw e; - } - for (const [field, value] of Object.entries(values)) { - const my = this.#configSet[field]; - // already validated, just for TS's benefit - /* c8 ignore start */ - if (!my) { - throw new Error('unexpected field in config set: ' + field, { - cause: { found: field }, - }); - } - /* c8 ignore stop */ - my.default = value; - } - return this; - } - /** - * Parse a string of arguments, and return the resulting - * `{ values, positionals }` object. - * - * If an {@link JackOptions#envPrefix} is set, then it will read default - * values from the environment, and write the resulting values back - * to the environment as well. - * - * Environment values always take precedence over any other value, except - * an explicit CLI setting. - */ - parse(args = process.argv) { - this.loadEnvDefaults(); - const p = this.parseRaw(args); - this.applyDefaults(p); - this.writeEnv(p); - return p; - } - loadEnvDefaults() { - if (this.#envPrefix) { - for (const [field, my] of Object.entries(this.#configSet)) { - const ek = toEnvKey(this.#envPrefix, field); - const env = this.#env[ek]; - if (env !== undefined) { - my.default = fromEnvVal(env, my.type, !!my.multiple, my.delim); - } - } - } - } - applyDefaults(p) { - for (const [field, c] of Object.entries(this.#configSet)) { - if (c.default !== undefined && !(field in p.values)) { - //@ts-ignore - p.values[field] = c.default; - } - } - } - /** - * Only parse the command line arguments passed in. - * Does not strip off the `node script.js` bits, so it must be just the - * arguments you wish to have parsed. - * Does not read from or write to the environment, or set defaults. - */ - parseRaw(args) { - if (args === process.argv) { - args = args.slice(process._eval !== undefined ? 1 : 2); - } - const options = toParseArgsOptionsConfig(this.#configSet); - const result = parseArgs({ - args, - options, - // always strict, but using our own logic - strict: false, - allowPositionals: this.#allowPositionals, - tokens: true, - }); - const p = { - values: {}, - positionals: [], - }; - for (const token of result.tokens) { - if (token.kind === 'positional') { - p.positionals.push(token.value); - if (this.#options.stopAtPositional || - this.#options.stopAtPositionalTest?.(token.value)) { - p.positionals.push(...args.slice(token.index + 1)); - break; - } - } - else if (token.kind === 'option') { - let value = undefined; - if (token.name.startsWith('no-')) { - const my = this.#configSet[token.name]; - const pname = token.name.substring('no-'.length); - const pos = this.#configSet[pname]; - if (pos && - pos.type === 'boolean' && - (!my || - (my.type === 'boolean' && !!my.multiple === !!pos.multiple))) { - value = false; - token.name = pname; - } - } - const my = this.#configSet[token.name]; - if (!my) { - throw new Error(`Unknown option '${token.rawName}'. ` + - `To specify a positional argument starting with a '-', ` + - `place it at the end of the command after '--', as in ` + - `'-- ${token.rawName}'`, { - cause: { - found: token.rawName + (token.value ? `=${token.value}` : ''), - }, - }); - } - if (value === undefined) { - if (token.value === undefined) { - if (my.type !== 'boolean') { - throw new Error(`No value provided for ${token.rawName}, expected ${my.type}`, { - cause: { - name: token.rawName, - wanted: valueType(my), - }, - }); - } - value = true; - } - else { - if (my.type === 'boolean') { - throw new Error(`Flag ${token.rawName} does not take a value, received '${token.value}'`, { cause: { found: token } }); - } - if (my.type === 'string') { - value = token.value; - } - else { - value = +token.value; - if (value !== value) { - throw new Error(`Invalid value '${token.value}' provided for ` + - `'${token.rawName}' option, expected number`, { - cause: { - name: token.rawName, - found: token.value, - wanted: 'number', - }, - }); - } - } - } - } - if (my.multiple) { - const pv = p.values; - const tn = pv[token.name] ?? []; - pv[token.name] = tn; - tn.push(value); - } - else { - const pv = p.values; - pv[token.name] = value; - } - } - } - for (const [field, value] of Object.entries(p.values)) { - const valid = this.#configSet[field]?.validate; - const validOptions = this.#configSet[field]?.validOptions; - let cause; - if (validOptions && !isValidOption(value, validOptions)) { - cause = { name: field, found: value, validOptions: validOptions }; - } - if (valid && !valid(value)) { - cause = cause || { name: field, found: value }; - } - if (cause) { - throw new Error(`Invalid value provided for --${field}: ${JSON.stringify(value)}`, { cause }); - } - } - return p; - } - /** - * do not set fields as 'no-foo' if 'foo' exists and both are bools - * just set foo. - */ - #noNoFields(f, val, s = f) { - if (!f.startsWith('no-') || typeof val !== 'boolean') - return; - const yes = f.substring('no-'.length); - // recurse so we get the core config key we care about. - this.#noNoFields(yes, val, s); - if (this.#configSet[yes]?.type === 'boolean') { - throw new Error(`do not set '${s}', instead set '${yes}' as desired.`, { cause: { found: s, wanted: yes } }); - } - } - /** - * Validate that any arbitrary object is a valid configuration `values` - * object. Useful when loading config files or other sources. - */ - validate(o) { - if (!o || typeof o !== 'object') { - throw new Error('Invalid config: not an object', { - cause: { found: o }, - }); - } - const opts = o; - for (const field in o) { - const value = opts[field]; - /* c8 ignore next - for TS */ - if (value === undefined) - continue; - this.#noNoFields(field, value); - const config = this.#configSet[field]; - if (!config) { - throw new Error(`Unknown config option: ${field}`, { - cause: { found: field }, - }); - } - if (!isValidValue(value, config.type, !!config.multiple)) { - throw new Error(`Invalid value ${valueType(value)} for ${field}, expected ${valueType(config)}`, { - cause: { - name: field, - found: value, - wanted: valueType(config), - }, - }); - } - let cause; - if (config.validOptions && - !isValidOption(value, config.validOptions)) { - cause = { - name: field, - found: value, - validOptions: config.validOptions, - }; - } - if (config.validate && !config.validate(value)) { - cause = cause || { name: field, found: value }; - } - if (cause) { - throw new Error(`Invalid config value for ${field}: ${value}`, { - cause, - }); - } - } - } - writeEnv(p) { - if (!this.#env || !this.#envPrefix) - return; - for (const [field, value] of Object.entries(p.values)) { - const my = this.#configSet[field]; - this.#env[toEnvKey(this.#envPrefix, field)] = toEnvVal(value, my?.delim); - } - } - /** - * Add a heading to the usage output banner - */ - heading(text, level, { pre = false } = {}) { - if (level === undefined) { - level = this.#fields.some(r => isHeading(r)) ? 2 : 1; - } - this.#fields.push({ type: 'heading', text, level, pre }); - return this; - } - /** - * Add a long-form description to the usage output at this position. - */ - description(text, { pre } = {}) { - this.#fields.push({ type: 'description', text, pre }); - return this; - } - /** - * Add one or more number fields. - */ - num(fields) { - return this.#addFields(fields, num); - } - /** - * Add one or more multiple number fields. - */ - numList(fields) { - return this.#addFields(fields, numList); - } - /** - * Add one or more string option fields. - */ - opt(fields) { - return this.#addFields(fields, opt); - } - /** - * Add one or more multiple string option fields. - */ - optList(fields) { - return this.#addFields(fields, optList); - } - /** - * Add one or more flag fields. - */ - flag(fields) { - return this.#addFields(fields, flag); - } - /** - * Add one or more multiple flag fields. - */ - flagList(fields) { - return this.#addFields(fields, flagList); - } - /** - * Generic field definition method. Similar to flag/flagList/number/etc, - * but you must specify the `type` (and optionally `multiple` and `delim`) - * fields on each one, or Jack won't know how to define them. - */ - addFields(fields) { - const next = this; - for (const [name, field] of Object.entries(fields)) { - this.#validateName(name, field); - next.#fields.push({ - type: 'config', - name, - value: field, - }); - } - Object.assign(next.#configSet, fields); - return next; - } - #addFields(fields, fn) { - const next = this; - Object.assign(next.#configSet, Object.fromEntries(Object.entries(fields).map(([name, field]) => { - this.#validateName(name, field); - const option = fn(field); - next.#fields.push({ - type: 'config', - name, - value: option, - }); - return [name, option]; - }))); - return next; - } - #validateName(name, field) { - if (!/^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?$/.test(name)) { - throw new TypeError(`Invalid option name: ${name}, ` + - `must be '-' delimited ASCII alphanumeric`); - } - if (this.#configSet[name]) { - throw new TypeError(`Cannot redefine option ${field}`); - } - if (this.#shorts[name]) { - throw new TypeError(`Cannot redefine option ${name}, already ` + - `in use for ${this.#shorts[name]}`); - } - if (field.short) { - if (!/^[a-zA-Z0-9]$/.test(field.short)) { - throw new TypeError(`Invalid ${name} short option: ${field.short}, ` + - 'must be 1 ASCII alphanumeric character'); - } - if (this.#shorts[field.short]) { - throw new TypeError(`Invalid ${name} short option: ${field.short}, ` + - `already in use for ${this.#shorts[field.short]}`); - } - this.#shorts[field.short] = name; - this.#shorts[name] = name; - } - } - /** - * Return the usage banner for the given configuration - */ - usage() { - if (this.#usage) - return this.#usage; - let headingLevel = 1; - const ui = cliui({ width }); - const first = this.#fields[0]; - let start = first?.type === 'heading' ? 1 : 0; - if (first?.type === 'heading') { - ui.div({ - padding: [0, 0, 0, 0], - text: normalize(first.text), - }); - } - ui.div({ padding: [0, 0, 0, 0], text: 'Usage:' }); - if (this.#options.usage) { - ui.div({ - text: this.#options.usage, - padding: [0, 0, 0, 2], - }); - } - else { - const cmd = basename(String(process.argv[1])); - const shortFlags = []; - const shorts = []; - const flags = []; - const opts = []; - for (const [field, config] of Object.entries(this.#configSet)) { - if (config.short) { - if (config.type === 'boolean') - shortFlags.push(config.short); - else - shorts.push([config.short, config.hint || field]); - } - else { - if (config.type === 'boolean') - flags.push(field); - else - opts.push([field, config.hint || field]); - } - } - const sf = shortFlags.length ? ' -' + shortFlags.join('') : ''; - const so = shorts.map(([k, v]) => ` --${k}=<${v}>`).join(''); - const lf = flags.map(k => ` --${k}`).join(''); - const lo = opts.map(([k, v]) => ` --${k}=<${v}>`).join(''); - const usage = `${cmd}${sf}${so}${lf}${lo}`.trim(); - ui.div({ - text: usage, - padding: [0, 0, 0, 2], - }); - } - ui.div({ padding: [0, 0, 0, 0], text: '' }); - const maybeDesc = this.#fields[start]; - if (maybeDesc && isDescription(maybeDesc)) { - const print = normalize(maybeDesc.text, maybeDesc.pre); - start++; - ui.div({ padding: [0, 0, 0, 0], text: print }); - ui.div({ padding: [0, 0, 0, 0], text: '' }); - } - const { rows, maxWidth } = this.#usageRows(start); - // every heading/description after the first gets indented by 2 - // extra spaces. - for (const row of rows) { - if (row.left) { - // If the row is too long, don't wrap it - // Bump the right-hand side down a line to make room - const configIndent = indent(Math.max(headingLevel, 2)); - if (row.left.length > maxWidth - 3) { - ui.div({ text: row.left, padding: [0, 0, 0, configIndent] }); - ui.div({ text: row.text, padding: [0, 0, 0, maxWidth] }); - } - else { - ui.div({ - text: row.left, - padding: [0, 1, 0, configIndent], - width: maxWidth, - }, { padding: [0, 0, 0, 0], text: row.text }); - } - if (row.skipLine) { - ui.div({ padding: [0, 0, 0, 0], text: '' }); - } - } - else { - if (isHeading(row)) { - const { level } = row; - headingLevel = level; - // only h1 and h2 have bottom padding - // h3-h6 do not - const b = level <= 2 ? 1 : 0; - ui.div({ ...row, padding: [0, 0, b, indent(level)] }); - } - else { - ui.div({ ...row, padding: [0, 0, 1, indent(headingLevel + 1)] }); - } - } - } - return (this.#usage = ui.toString()); - } - /** - * Return the usage banner markdown for the given configuration - */ - usageMarkdown() { - if (this.#usageMarkdown) - return this.#usageMarkdown; - const out = []; - let headingLevel = 1; - const first = this.#fields[0]; - let start = first?.type === 'heading' ? 1 : 0; - if (first?.type === 'heading') { - out.push(`# ${normalizeOneLine(first.text)}`); - } - out.push('Usage:'); - if (this.#options.usage) { - out.push(normalizeMarkdown(this.#options.usage, true)); - } - else { - const cmd = basename(String(process.argv[1])); - const shortFlags = []; - const shorts = []; - const flags = []; - const opts = []; - for (const [field, config] of Object.entries(this.#configSet)) { - if (config.short) { - if (config.type === 'boolean') - shortFlags.push(config.short); - else - shorts.push([config.short, config.hint || field]); - } - else { - if (config.type === 'boolean') - flags.push(field); - else - opts.push([field, config.hint || field]); - } - } - const sf = shortFlags.length ? ' -' + shortFlags.join('') : ''; - const so = shorts.map(([k, v]) => ` --${k}=<${v}>`).join(''); - const lf = flags.map(k => ` --${k}`).join(''); - const lo = opts.map(([k, v]) => ` --${k}=<${v}>`).join(''); - const usage = `${cmd}${sf}${so}${lf}${lo}`.trim(); - out.push(normalizeMarkdown(usage, true)); - } - const maybeDesc = this.#fields[start]; - if (maybeDesc && isDescription(maybeDesc)) { - out.push(normalizeMarkdown(maybeDesc.text, maybeDesc.pre)); - start++; - } - const { rows } = this.#usageRows(start); - // heading level in markdown is number of # ahead of text - for (const row of rows) { - if (row.left) { - out.push('#'.repeat(headingLevel + 1) + - ' ' + - normalizeOneLine(row.left, true)); - if (row.text) - out.push(normalizeMarkdown(row.text)); - } - else if (isHeading(row)) { - const { level } = row; - headingLevel = level; - out.push(`${'#'.repeat(headingLevel)} ${normalizeOneLine(row.text, row.pre)}`); - } - else { - out.push(normalizeMarkdown(row.text, !!row.pre)); - } - } - return (this.#usageMarkdown = out.join('\n\n') + '\n'); - } - #usageRows(start) { - // turn each config type into a row, and figure out the width of the - // left hand indentation for the option descriptions. - let maxMax = Math.max(12, Math.min(26, Math.floor(width / 3))); - let maxWidth = 8; - let prev = undefined; - const rows = []; - for (const field of this.#fields.slice(start)) { - if (field.type !== 'config') { - if (prev?.type === 'config') - prev.skipLine = true; - prev = undefined; - field.text = normalize(field.text, !!field.pre); - rows.push(field); - continue; - } - const { value } = field; - const desc = value.description || ''; - const mult = value.multiple ? 'Can be set multiple times' : ''; - const opts = value.validOptions?.length ? - `Valid options:${value.validOptions.map(v => ` ${JSON.stringify(v)}`)}` - : ''; - const dmDelim = desc.includes('\n') ? '\n\n' : '\n'; - const extra = [opts, mult].join(dmDelim).trim(); - const text = (normalize(desc) + dmDelim + extra).trim(); - const hint = value.hint || - (value.type === 'number' ? 'n' - : value.type === 'string' ? field.name - : undefined); - const short = !value.short ? '' - : value.type === 'boolean' ? `-${value.short} ` - : `-${value.short}<${hint}> `; - const left = value.type === 'boolean' ? - `${short}--${field.name}` - : `${short}--${field.name}=<${hint}>`; - const row = { text, left, type: 'config' }; - if (text.length > width - maxMax) { - row.skipLine = true; - } - if (prev && left.length > maxMax) - prev.skipLine = true; - prev = row; - const len = left.length + 4; - if (len > maxWidth && len < maxMax) { - maxWidth = len; - } - rows.push(row); - } - return { rows, maxWidth }; - } - /** - * Return the configuration options as a plain object - */ - toJSON() { - return Object.fromEntries(Object.entries(this.#configSet).map(([field, def]) => [ - field, - { - type: def.type, - ...(def.multiple ? { multiple: true } : {}), - ...(def.delim ? { delim: def.delim } : {}), - ...(def.short ? { short: def.short } : {}), - ...(def.description ? - { description: normalize(def.description) } - : {}), - ...(def.validate ? { validate: def.validate } : {}), - ...(def.validOptions ? { validOptions: def.validOptions } : {}), - ...(def.default !== undefined ? { default: def.default } : {}), - ...(def.hint ? { hint: def.hint } : {}), - }, - ])); - } - /** - * Custom printer for `util.inspect` - */ - [inspect.custom](_, options) { - return `Jack ${inspect(this.toJSON(), options)}`; - } -} -// Unwrap and un-indent, so we can wrap description -// strings however makes them look nice in the code. -const normalize = (s, pre = false) => { - if (pre) - // prepend a ZWSP to each line so cliui doesn't strip it. - return s - .split('\n') - .map(l => `\u200b${l}`) - .join('\n'); - return s - .split(/^\s*```\s*$/gm) - .map((s, i) => { - if (i % 2 === 1) { - if (!s.trim()) { - return `\`\`\`\n\`\`\`\n`; - } - // outdent the ``` blocks, but preserve whitespace otherwise. - const split = s.split('\n'); - // throw out the \n at the start and end - split.pop(); - split.shift(); - const si = split.reduce((shortest, l) => { - /* c8 ignore next */ - const ind = l.match(/^\s*/)?.[0] ?? ''; - if (ind.length) - return Math.min(ind.length, shortest); - else - return shortest; - }, Infinity); - /* c8 ignore next */ - const i = isFinite(si) ? si : 0; - return ('\n```\n' + - split.map(s => `\u200b${s.substring(i)}`).join('\n') + - '\n```\n'); - } - return (s - // remove single line breaks, except for lists - .replace(/([^\n])\n[ \t]*([^\n])/g, (_, $1, $2) => !/^[-*]/.test($2) ? `${$1} ${$2}` : `${$1}\n${$2}`) - // normalize mid-line whitespace - .replace(/([^\n])[ \t]+([^\n])/g, '$1 $2') - // two line breaks are enough - .replace(/\n{3,}/g, '\n\n') - // remove any spaces at the start of a line - .replace(/\n[ \t]+/g, '\n') - .trim()); - }) - .join('\n'); -}; -// normalize for markdown printing, remove leading spaces on lines -const normalizeMarkdown = (s, pre = false) => { - const n = normalize(s, pre).replace(/\\/g, '\\\\'); - return pre ? - `\`\`\`\n${n.replace(/\u200b/g, '')}\n\`\`\`` - : n.replace(/\n +/g, '\n').trim(); -}; -const normalizeOneLine = (s, pre = false) => { - const n = normalize(s, pre) - .replace(/[\s\u200b]+/g, ' ') - .trim(); - return pre ? `\`${n}\`` : n; -}; -/** - * Main entry point. Create and return a {@link Jack} object. - */ -export const jack = (options = {}) => new Jack(options); -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/jackspeak/dist/esm/package.json b/deps/npm/node_modules/node-gyp/node_modules/jackspeak/dist/esm/package.json deleted file mode 100644 index 3dbc1ca591c055..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/jackspeak/dist/esm/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "module" -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/jackspeak/dist/esm/parse-args.js b/deps/npm/node_modules/node-gyp/node_modules/jackspeak/dist/esm/parse-args.js deleted file mode 100644 index a4be7153de1f17..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/jackspeak/dist/esm/parse-args.js +++ /dev/null @@ -1,26 +0,0 @@ -import * as util from 'util'; -const pv = (typeof process === 'object' && - !!process && - typeof process.version === 'string') ? - process.version - : 'v0.0.0'; -const pvs = pv - .replace(/^v/, '') - .split('.') - .map(s => parseInt(s, 10)); -/* c8 ignore start */ -const [major = 0, minor = 0] = pvs; -/* c8 ignore stop */ -let { parseArgs: pa, } = util; -/* c8 ignore start - version specific */ -if (!pa || - major < 16 || - (major === 18 && minor < 11) || - (major === 16 && minor < 19)) { - // Ignore because we will clobber it for commonjs - //@ts-ignore - pa = (await import('@pkgjs/parseargs')).parseArgs; -} -/* c8 ignore stop */ -export const parseArgs = pa; -//# sourceMappingURL=parse-args.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/jackspeak/package.json b/deps/npm/node_modules/node-gyp/node_modules/jackspeak/package.json deleted file mode 100644 index 51eaabdf354691..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/jackspeak/package.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "name": "jackspeak", - "publishConfig": { - "tag": "v3-legacy" - }, - "version": "3.4.3", - "description": "A very strict and proper argument parser.", - "tshy": { - "main": true, - "exports": { - "./package.json": "./package.json", - ".": "./src/index.js" - } - }, - "main": "./dist/commonjs/index.js", - "types": "./dist/commonjs/index.d.ts", - "type": "module", - "exports": { - "./package.json": "./package.json", - ".": { - "import": { - "types": "./dist/esm/index.d.ts", - "default": "./dist/esm/index.js" - }, - "require": { - "types": "./dist/commonjs/index.d.ts", - "default": "./dist/commonjs/index.js" - } - } - }, - "files": [ - "dist" - ], - "scripts": { - "build-examples": "for i in examples/*.js ; do node $i -h > ${i/.js/.txt}; done", - "preversion": "npm test", - "postversion": "npm publish", - "prepublishOnly": "git push origin --follow-tags", - "prepare": "tshy", - "pretest": "npm run prepare", - "presnap": "npm run prepare", - "test": "tap", - "snap": "tap", - "format": "prettier --write . --log-level warn", - "typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts" - }, - "license": "BlueOak-1.0.0", - "prettier": { - "experimentalTernaries": true, - "semi": false, - "printWidth": 75, - "tabWidth": 2, - "useTabs": false, - "singleQuote": true, - "jsxSingleQuote": false, - "bracketSameLine": true, - "arrowParens": "avoid", - "endOfLine": "lf" - }, - "devDependencies": { - "@types/node": "^20.7.0", - "@types/pkgjs__parseargs": "^0.10.1", - "prettier": "^3.2.5", - "tap": "^18.8.0", - "tshy": "^1.14.0", - "typedoc": "^0.25.1", - "typescript": "^5.2.2" - }, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/isaacs/jackspeak.git" - }, - "keywords": [ - "argument", - "parser", - "args", - "option", - "flag", - "cli", - "command", - "line", - "parse", - "parsing" - ], - "author": "Isaac Z. Schlueter ", - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/lru-cache/dist/commonjs/index.js b/deps/npm/node_modules/node-gyp/node_modules/lru-cache/dist/commonjs/index.js deleted file mode 100644 index 9df0f71fcfb65f..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/lru-cache/dist/commonjs/index.js +++ /dev/null @@ -1,1546 +0,0 @@ -"use strict"; -/** - * @module LRUCache - */ -Object.defineProperty(exports, "__esModule", { value: true }); -exports.LRUCache = void 0; -const perf = typeof performance === 'object' && - performance && - typeof performance.now === 'function' - ? performance - : Date; -const warned = new Set(); -/* c8 ignore start */ -const PROCESS = (typeof process === 'object' && !!process ? process : {}); -/* c8 ignore start */ -const emitWarning = (msg, type, code, fn) => { - typeof PROCESS.emitWarning === 'function' - ? PROCESS.emitWarning(msg, type, code, fn) - : console.error(`[${code}] ${type}: ${msg}`); -}; -let AC = globalThis.AbortController; -let AS = globalThis.AbortSignal; -/* c8 ignore start */ -if (typeof AC === 'undefined') { - //@ts-ignore - AS = class AbortSignal { - onabort; - _onabort = []; - reason; - aborted = false; - addEventListener(_, fn) { - this._onabort.push(fn); - } - }; - //@ts-ignore - AC = class AbortController { - constructor() { - warnACPolyfill(); - } - signal = new AS(); - abort(reason) { - if (this.signal.aborted) - return; - //@ts-ignore - this.signal.reason = reason; - //@ts-ignore - this.signal.aborted = true; - //@ts-ignore - for (const fn of this.signal._onabort) { - fn(reason); - } - this.signal.onabort?.(reason); - } - }; - let printACPolyfillWarning = PROCESS.env?.LRU_CACHE_IGNORE_AC_WARNING !== '1'; - const warnACPolyfill = () => { - if (!printACPolyfillWarning) - return; - printACPolyfillWarning = false; - emitWarning('AbortController is not defined. If using lru-cache in ' + - 'node 14, load an AbortController polyfill from the ' + - '`node-abort-controller` package. A minimal polyfill is ' + - 'provided for use by LRUCache.fetch(), but it should not be ' + - 'relied upon in other contexts (eg, passing it to other APIs that ' + - 'use AbortController/AbortSignal might have undesirable effects). ' + - 'You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.', 'NO_ABORT_CONTROLLER', 'ENOTSUP', warnACPolyfill); - }; -} -/* c8 ignore stop */ -const shouldWarn = (code) => !warned.has(code); -const TYPE = Symbol('type'); -const isPosInt = (n) => n && n === Math.floor(n) && n > 0 && isFinite(n); -/* c8 ignore start */ -// This is a little bit ridiculous, tbh. -// The maximum array length is 2^32-1 or thereabouts on most JS impls. -// And well before that point, you're caching the entire world, I mean, -// that's ~32GB of just integers for the next/prev links, plus whatever -// else to hold that many keys and values. Just filling the memory with -// zeroes at init time is brutal when you get that big. -// But why not be complete? -// Maybe in the future, these limits will have expanded. -const getUintArray = (max) => !isPosInt(max) - ? null - : max <= Math.pow(2, 8) - ? Uint8Array - : max <= Math.pow(2, 16) - ? Uint16Array - : max <= Math.pow(2, 32) - ? Uint32Array - : max <= Number.MAX_SAFE_INTEGER - ? ZeroArray - : null; -/* c8 ignore stop */ -class ZeroArray extends Array { - constructor(size) { - super(size); - this.fill(0); - } -} -class Stack { - heap; - length; - // private constructor - static #constructing = false; - static create(max) { - const HeapCls = getUintArray(max); - if (!HeapCls) - return []; - Stack.#constructing = true; - const s = new Stack(max, HeapCls); - Stack.#constructing = false; - return s; - } - constructor(max, HeapCls) { - /* c8 ignore start */ - if (!Stack.#constructing) { - throw new TypeError('instantiate Stack using Stack.create(n)'); - } - /* c8 ignore stop */ - this.heap = new HeapCls(max); - this.length = 0; - } - push(n) { - this.heap[this.length++] = n; - } - pop() { - return this.heap[--this.length]; - } -} -/** - * Default export, the thing you're using this module to get. - * - * The `K` and `V` types define the key and value types, respectively. The - * optional `FC` type defines the type of the `context` object passed to - * `cache.fetch()` and `cache.memo()`. - * - * Keys and values **must not** be `null` or `undefined`. - * - * All properties from the options object (with the exception of `max`, - * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are - * added as normal public members. (The listed options are read-only getters.) - * - * Changing any of these will alter the defaults for subsequent method calls. - */ -class LRUCache { - // options that cannot be changed without disaster - #max; - #maxSize; - #dispose; - #disposeAfter; - #fetchMethod; - #memoMethod; - /** - * {@link LRUCache.OptionsBase.ttl} - */ - ttl; - /** - * {@link LRUCache.OptionsBase.ttlResolution} - */ - ttlResolution; - /** - * {@link LRUCache.OptionsBase.ttlAutopurge} - */ - ttlAutopurge; - /** - * {@link LRUCache.OptionsBase.updateAgeOnGet} - */ - updateAgeOnGet; - /** - * {@link LRUCache.OptionsBase.updateAgeOnHas} - */ - updateAgeOnHas; - /** - * {@link LRUCache.OptionsBase.allowStale} - */ - allowStale; - /** - * {@link LRUCache.OptionsBase.noDisposeOnSet} - */ - noDisposeOnSet; - /** - * {@link LRUCache.OptionsBase.noUpdateTTL} - */ - noUpdateTTL; - /** - * {@link LRUCache.OptionsBase.maxEntrySize} - */ - maxEntrySize; - /** - * {@link LRUCache.OptionsBase.sizeCalculation} - */ - sizeCalculation; - /** - * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection} - */ - noDeleteOnFetchRejection; - /** - * {@link LRUCache.OptionsBase.noDeleteOnStaleGet} - */ - noDeleteOnStaleGet; - /** - * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort} - */ - allowStaleOnFetchAbort; - /** - * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} - */ - allowStaleOnFetchRejection; - /** - * {@link LRUCache.OptionsBase.ignoreFetchAbort} - */ - ignoreFetchAbort; - // computed properties - #size; - #calculatedSize; - #keyMap; - #keyList; - #valList; - #next; - #prev; - #head; - #tail; - #free; - #disposed; - #sizes; - #starts; - #ttls; - #hasDispose; - #hasFetchMethod; - #hasDisposeAfter; - /** - * Do not call this method unless you need to inspect the - * inner workings of the cache. If anything returned by this - * object is modified in any way, strange breakage may occur. - * - * These fields are private for a reason! - * - * @internal - */ - static unsafeExposeInternals(c) { - return { - // properties - starts: c.#starts, - ttls: c.#ttls, - sizes: c.#sizes, - keyMap: c.#keyMap, - keyList: c.#keyList, - valList: c.#valList, - next: c.#next, - prev: c.#prev, - get head() { - return c.#head; - }, - get tail() { - return c.#tail; - }, - free: c.#free, - // methods - isBackgroundFetch: (p) => c.#isBackgroundFetch(p), - backgroundFetch: (k, index, options, context) => c.#backgroundFetch(k, index, options, context), - moveToTail: (index) => c.#moveToTail(index), - indexes: (options) => c.#indexes(options), - rindexes: (options) => c.#rindexes(options), - isStale: (index) => c.#isStale(index), - }; - } - // Protected read-only members - /** - * {@link LRUCache.OptionsBase.max} (read-only) - */ - get max() { - return this.#max; - } - /** - * {@link LRUCache.OptionsBase.maxSize} (read-only) - */ - get maxSize() { - return this.#maxSize; - } - /** - * The total computed size of items in the cache (read-only) - */ - get calculatedSize() { - return this.#calculatedSize; - } - /** - * The number of items stored in the cache (read-only) - */ - get size() { - return this.#size; - } - /** - * {@link LRUCache.OptionsBase.fetchMethod} (read-only) - */ - get fetchMethod() { - return this.#fetchMethod; - } - get memoMethod() { - return this.#memoMethod; - } - /** - * {@link LRUCache.OptionsBase.dispose} (read-only) - */ - get dispose() { - return this.#dispose; - } - /** - * {@link LRUCache.OptionsBase.disposeAfter} (read-only) - */ - get disposeAfter() { - return this.#disposeAfter; - } - constructor(options) { - const { max = 0, ttl, ttlResolution = 1, ttlAutopurge, updateAgeOnGet, updateAgeOnHas, allowStale, dispose, disposeAfter, noDisposeOnSet, noUpdateTTL, maxSize = 0, maxEntrySize = 0, sizeCalculation, fetchMethod, memoMethod, noDeleteOnFetchRejection, noDeleteOnStaleGet, allowStaleOnFetchRejection, allowStaleOnFetchAbort, ignoreFetchAbort, } = options; - if (max !== 0 && !isPosInt(max)) { - throw new TypeError('max option must be a nonnegative integer'); - } - const UintArray = max ? getUintArray(max) : Array; - if (!UintArray) { - throw new Error('invalid max value: ' + max); - } - this.#max = max; - this.#maxSize = maxSize; - this.maxEntrySize = maxEntrySize || this.#maxSize; - this.sizeCalculation = sizeCalculation; - if (this.sizeCalculation) { - if (!this.#maxSize && !this.maxEntrySize) { - throw new TypeError('cannot set sizeCalculation without setting maxSize or maxEntrySize'); - } - if (typeof this.sizeCalculation !== 'function') { - throw new TypeError('sizeCalculation set to non-function'); - } - } - if (memoMethod !== undefined && - typeof memoMethod !== 'function') { - throw new TypeError('memoMethod must be a function if defined'); - } - this.#memoMethod = memoMethod; - if (fetchMethod !== undefined && - typeof fetchMethod !== 'function') { - throw new TypeError('fetchMethod must be a function if specified'); - } - this.#fetchMethod = fetchMethod; - this.#hasFetchMethod = !!fetchMethod; - this.#keyMap = new Map(); - this.#keyList = new Array(max).fill(undefined); - this.#valList = new Array(max).fill(undefined); - this.#next = new UintArray(max); - this.#prev = new UintArray(max); - this.#head = 0; - this.#tail = 0; - this.#free = Stack.create(max); - this.#size = 0; - this.#calculatedSize = 0; - if (typeof dispose === 'function') { - this.#dispose = dispose; - } - if (typeof disposeAfter === 'function') { - this.#disposeAfter = disposeAfter; - this.#disposed = []; - } - else { - this.#disposeAfter = undefined; - this.#disposed = undefined; - } - this.#hasDispose = !!this.#dispose; - this.#hasDisposeAfter = !!this.#disposeAfter; - this.noDisposeOnSet = !!noDisposeOnSet; - this.noUpdateTTL = !!noUpdateTTL; - this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection; - this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection; - this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort; - this.ignoreFetchAbort = !!ignoreFetchAbort; - // NB: maxEntrySize is set to maxSize if it's set - if (this.maxEntrySize !== 0) { - if (this.#maxSize !== 0) { - if (!isPosInt(this.#maxSize)) { - throw new TypeError('maxSize must be a positive integer if specified'); - } - } - if (!isPosInt(this.maxEntrySize)) { - throw new TypeError('maxEntrySize must be a positive integer if specified'); - } - this.#initializeSizeTracking(); - } - this.allowStale = !!allowStale; - this.noDeleteOnStaleGet = !!noDeleteOnStaleGet; - this.updateAgeOnGet = !!updateAgeOnGet; - this.updateAgeOnHas = !!updateAgeOnHas; - this.ttlResolution = - isPosInt(ttlResolution) || ttlResolution === 0 - ? ttlResolution - : 1; - this.ttlAutopurge = !!ttlAutopurge; - this.ttl = ttl || 0; - if (this.ttl) { - if (!isPosInt(this.ttl)) { - throw new TypeError('ttl must be a positive integer if specified'); - } - this.#initializeTTLTracking(); - } - // do not allow completely unbounded caches - if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) { - throw new TypeError('At least one of max, maxSize, or ttl is required'); - } - if (!this.ttlAutopurge && !this.#max && !this.#maxSize) { - const code = 'LRU_CACHE_UNBOUNDED'; - if (shouldWarn(code)) { - warned.add(code); - const msg = 'TTL caching without ttlAutopurge, max, or maxSize can ' + - 'result in unbounded memory consumption.'; - emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache); - } - } - } - /** - * Return the number of ms left in the item's TTL. If item is not in cache, - * returns `0`. Returns `Infinity` if item is in cache without a defined TTL. - */ - getRemainingTTL(key) { - return this.#keyMap.has(key) ? Infinity : 0; - } - #initializeTTLTracking() { - const ttls = new ZeroArray(this.#max); - const starts = new ZeroArray(this.#max); - this.#ttls = ttls; - this.#starts = starts; - this.#setItemTTL = (index, ttl, start = perf.now()) => { - starts[index] = ttl !== 0 ? start : 0; - ttls[index] = ttl; - if (ttl !== 0 && this.ttlAutopurge) { - const t = setTimeout(() => { - if (this.#isStale(index)) { - this.#delete(this.#keyList[index], 'expire'); - } - }, ttl + 1); - // unref() not supported on all platforms - /* c8 ignore start */ - if (t.unref) { - t.unref(); - } - /* c8 ignore stop */ - } - }; - this.#updateItemAge = index => { - starts[index] = ttls[index] !== 0 ? perf.now() : 0; - }; - this.#statusTTL = (status, index) => { - if (ttls[index]) { - const ttl = ttls[index]; - const start = starts[index]; - /* c8 ignore next */ - if (!ttl || !start) - return; - status.ttl = ttl; - status.start = start; - status.now = cachedNow || getNow(); - const age = status.now - start; - status.remainingTTL = ttl - age; - } - }; - // debounce calls to perf.now() to 1s so we're not hitting - // that costly call repeatedly. - let cachedNow = 0; - const getNow = () => { - const n = perf.now(); - if (this.ttlResolution > 0) { - cachedNow = n; - const t = setTimeout(() => (cachedNow = 0), this.ttlResolution); - // not available on all platforms - /* c8 ignore start */ - if (t.unref) { - t.unref(); - } - /* c8 ignore stop */ - } - return n; - }; - this.getRemainingTTL = key => { - const index = this.#keyMap.get(key); - if (index === undefined) { - return 0; - } - const ttl = ttls[index]; - const start = starts[index]; - if (!ttl || !start) { - return Infinity; - } - const age = (cachedNow || getNow()) - start; - return ttl - age; - }; - this.#isStale = index => { - const s = starts[index]; - const t = ttls[index]; - return !!t && !!s && (cachedNow || getNow()) - s > t; - }; - } - // conditionally set private methods related to TTL - #updateItemAge = () => { }; - #statusTTL = () => { }; - #setItemTTL = () => { }; - /* c8 ignore stop */ - #isStale = () => false; - #initializeSizeTracking() { - const sizes = new ZeroArray(this.#max); - this.#calculatedSize = 0; - this.#sizes = sizes; - this.#removeItemSize = index => { - this.#calculatedSize -= sizes[index]; - sizes[index] = 0; - }; - this.#requireSize = (k, v, size, sizeCalculation) => { - // provisionally accept background fetches. - // actual value size will be checked when they return. - if (this.#isBackgroundFetch(v)) { - return 0; - } - if (!isPosInt(size)) { - if (sizeCalculation) { - if (typeof sizeCalculation !== 'function') { - throw new TypeError('sizeCalculation must be a function'); - } - size = sizeCalculation(v, k); - if (!isPosInt(size)) { - throw new TypeError('sizeCalculation return invalid (expect positive integer)'); - } - } - else { - throw new TypeError('invalid size value (must be positive integer). ' + - 'When maxSize or maxEntrySize is used, sizeCalculation ' + - 'or size must be set.'); - } - } - return size; - }; - this.#addItemSize = (index, size, status) => { - sizes[index] = size; - if (this.#maxSize) { - const maxSize = this.#maxSize - sizes[index]; - while (this.#calculatedSize > maxSize) { - this.#evict(true); - } - } - this.#calculatedSize += sizes[index]; - if (status) { - status.entrySize = size; - status.totalCalculatedSize = this.#calculatedSize; - } - }; - } - #removeItemSize = _i => { }; - #addItemSize = (_i, _s, _st) => { }; - #requireSize = (_k, _v, size, sizeCalculation) => { - if (size || sizeCalculation) { - throw new TypeError('cannot set size without setting maxSize or maxEntrySize on cache'); - } - return 0; - }; - *#indexes({ allowStale = this.allowStale } = {}) { - if (this.#size) { - for (let i = this.#tail; true;) { - if (!this.#isValidIndex(i)) { - break; - } - if (allowStale || !this.#isStale(i)) { - yield i; - } - if (i === this.#head) { - break; - } - else { - i = this.#prev[i]; - } - } - } - } - *#rindexes({ allowStale = this.allowStale } = {}) { - if (this.#size) { - for (let i = this.#head; true;) { - if (!this.#isValidIndex(i)) { - break; - } - if (allowStale || !this.#isStale(i)) { - yield i; - } - if (i === this.#tail) { - break; - } - else { - i = this.#next[i]; - } - } - } - } - #isValidIndex(index) { - return (index !== undefined && - this.#keyMap.get(this.#keyList[index]) === index); - } - /** - * Return a generator yielding `[key, value]` pairs, - * in order from most recently used to least recently used. - */ - *entries() { - for (const i of this.#indexes()) { - if (this.#valList[i] !== undefined && - this.#keyList[i] !== undefined && - !this.#isBackgroundFetch(this.#valList[i])) { - yield [this.#keyList[i], this.#valList[i]]; - } - } - } - /** - * Inverse order version of {@link LRUCache.entries} - * - * Return a generator yielding `[key, value]` pairs, - * in order from least recently used to most recently used. - */ - *rentries() { - for (const i of this.#rindexes()) { - if (this.#valList[i] !== undefined && - this.#keyList[i] !== undefined && - !this.#isBackgroundFetch(this.#valList[i])) { - yield [this.#keyList[i], this.#valList[i]]; - } - } - } - /** - * Return a generator yielding the keys in the cache, - * in order from most recently used to least recently used. - */ - *keys() { - for (const i of this.#indexes()) { - const k = this.#keyList[i]; - if (k !== undefined && - !this.#isBackgroundFetch(this.#valList[i])) { - yield k; - } - } - } - /** - * Inverse order version of {@link LRUCache.keys} - * - * Return a generator yielding the keys in the cache, - * in order from least recently used to most recently used. - */ - *rkeys() { - for (const i of this.#rindexes()) { - const k = this.#keyList[i]; - if (k !== undefined && - !this.#isBackgroundFetch(this.#valList[i])) { - yield k; - } - } - } - /** - * Return a generator yielding the values in the cache, - * in order from most recently used to least recently used. - */ - *values() { - for (const i of this.#indexes()) { - const v = this.#valList[i]; - if (v !== undefined && - !this.#isBackgroundFetch(this.#valList[i])) { - yield this.#valList[i]; - } - } - } - /** - * Inverse order version of {@link LRUCache.values} - * - * Return a generator yielding the values in the cache, - * in order from least recently used to most recently used. - */ - *rvalues() { - for (const i of this.#rindexes()) { - const v = this.#valList[i]; - if (v !== undefined && - !this.#isBackgroundFetch(this.#valList[i])) { - yield this.#valList[i]; - } - } - } - /** - * Iterating over the cache itself yields the same results as - * {@link LRUCache.entries} - */ - [Symbol.iterator]() { - return this.entries(); - } - /** - * A String value that is used in the creation of the default string - * description of an object. Called by the built-in method - * `Object.prototype.toString`. - */ - [Symbol.toStringTag] = 'LRUCache'; - /** - * Find a value for which the supplied fn method returns a truthy value, - * similar to `Array.find()`. fn is called as `fn(value, key, cache)`. - */ - find(fn, getOptions = {}) { - for (const i of this.#indexes()) { - const v = this.#valList[i]; - const value = this.#isBackgroundFetch(v) - ? v.__staleWhileFetching - : v; - if (value === undefined) - continue; - if (fn(value, this.#keyList[i], this)) { - return this.get(this.#keyList[i], getOptions); - } - } - } - /** - * Call the supplied function on each item in the cache, in order from most - * recently used to least recently used. - * - * `fn` is called as `fn(value, key, cache)`. - * - * If `thisp` is provided, function will be called in the `this`-context of - * the provided object, or the cache if no `thisp` object is provided. - * - * Does not update age or recenty of use, or iterate over stale values. - */ - forEach(fn, thisp = this) { - for (const i of this.#indexes()) { - const v = this.#valList[i]; - const value = this.#isBackgroundFetch(v) - ? v.__staleWhileFetching - : v; - if (value === undefined) - continue; - fn.call(thisp, value, this.#keyList[i], this); - } - } - /** - * The same as {@link LRUCache.forEach} but items are iterated over in - * reverse order. (ie, less recently used items are iterated over first.) - */ - rforEach(fn, thisp = this) { - for (const i of this.#rindexes()) { - const v = this.#valList[i]; - const value = this.#isBackgroundFetch(v) - ? v.__staleWhileFetching - : v; - if (value === undefined) - continue; - fn.call(thisp, value, this.#keyList[i], this); - } - } - /** - * Delete any stale entries. Returns true if anything was removed, - * false otherwise. - */ - purgeStale() { - let deleted = false; - for (const i of this.#rindexes({ allowStale: true })) { - if (this.#isStale(i)) { - this.#delete(this.#keyList[i], 'expire'); - deleted = true; - } - } - return deleted; - } - /** - * Get the extended info about a given entry, to get its value, size, and - * TTL info simultaneously. Returns `undefined` if the key is not present. - * - * Unlike {@link LRUCache#dump}, which is designed to be portable and survive - * serialization, the `start` value is always the current timestamp, and the - * `ttl` is a calculated remaining time to live (negative if expired). - * - * Always returns stale values, if their info is found in the cache, so be - * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl}) - * if relevant. - */ - info(key) { - const i = this.#keyMap.get(key); - if (i === undefined) - return undefined; - const v = this.#valList[i]; - const value = this.#isBackgroundFetch(v) - ? v.__staleWhileFetching - : v; - if (value === undefined) - return undefined; - const entry = { value }; - if (this.#ttls && this.#starts) { - const ttl = this.#ttls[i]; - const start = this.#starts[i]; - if (ttl && start) { - const remain = ttl - (perf.now() - start); - entry.ttl = remain; - entry.start = Date.now(); - } - } - if (this.#sizes) { - entry.size = this.#sizes[i]; - } - return entry; - } - /** - * Return an array of [key, {@link LRUCache.Entry}] tuples which can be - * passed to {@link LRLUCache#load}. - * - * The `start` fields are calculated relative to a portable `Date.now()` - * timestamp, even if `performance.now()` is available. - * - * Stale entries are always included in the `dump`, even if - * {@link LRUCache.OptionsBase.allowStale} is false. - * - * Note: this returns an actual array, not a generator, so it can be more - * easily passed around. - */ - dump() { - const arr = []; - for (const i of this.#indexes({ allowStale: true })) { - const key = this.#keyList[i]; - const v = this.#valList[i]; - const value = this.#isBackgroundFetch(v) - ? v.__staleWhileFetching - : v; - if (value === undefined || key === undefined) - continue; - const entry = { value }; - if (this.#ttls && this.#starts) { - entry.ttl = this.#ttls[i]; - // always dump the start relative to a portable timestamp - // it's ok for this to be a bit slow, it's a rare operation. - const age = perf.now() - this.#starts[i]; - entry.start = Math.floor(Date.now() - age); - } - if (this.#sizes) { - entry.size = this.#sizes[i]; - } - arr.unshift([key, entry]); - } - return arr; - } - /** - * Reset the cache and load in the items in entries in the order listed. - * - * The shape of the resulting cache may be different if the same options are - * not used in both caches. - * - * The `start` fields are assumed to be calculated relative to a portable - * `Date.now()` timestamp, even if `performance.now()` is available. - */ - load(arr) { - this.clear(); - for (const [key, entry] of arr) { - if (entry.start) { - // entry.start is a portable timestamp, but we may be using - // node's performance.now(), so calculate the offset, so that - // we get the intended remaining TTL, no matter how long it's - // been on ice. - // - // it's ok for this to be a bit slow, it's a rare operation. - const age = Date.now() - entry.start; - entry.start = perf.now() - age; - } - this.set(key, entry.value, entry); - } - } - /** - * Add a value to the cache. - * - * Note: if `undefined` is specified as a value, this is an alias for - * {@link LRUCache#delete} - * - * Fields on the {@link LRUCache.SetOptions} options param will override - * their corresponding values in the constructor options for the scope - * of this single `set()` operation. - * - * If `start` is provided, then that will set the effective start - * time for the TTL calculation. Note that this must be a previous - * value of `performance.now()` if supported, or a previous value of - * `Date.now()` if not. - * - * Options object may also include `size`, which will prevent - * calling the `sizeCalculation` function and just use the specified - * number if it is a positive integer, and `noDisposeOnSet` which - * will prevent calling a `dispose` function in the case of - * overwrites. - * - * If the `size` (or return value of `sizeCalculation`) for a given - * entry is greater than `maxEntrySize`, then the item will not be - * added to the cache. - * - * Will update the recency of the entry. - * - * If the value is `undefined`, then this is an alias for - * `cache.delete(key)`. `undefined` is never stored in the cache. - */ - set(k, v, setOptions = {}) { - if (v === undefined) { - this.delete(k); - return this; - } - const { ttl = this.ttl, start, noDisposeOnSet = this.noDisposeOnSet, sizeCalculation = this.sizeCalculation, status, } = setOptions; - let { noUpdateTTL = this.noUpdateTTL } = setOptions; - const size = this.#requireSize(k, v, setOptions.size || 0, sizeCalculation); - // if the item doesn't fit, don't do anything - // NB: maxEntrySize set to maxSize by default - if (this.maxEntrySize && size > this.maxEntrySize) { - if (status) { - status.set = 'miss'; - status.maxEntrySizeExceeded = true; - } - // have to delete, in case something is there already. - this.#delete(k, 'set'); - return this; - } - let index = this.#size === 0 ? undefined : this.#keyMap.get(k); - if (index === undefined) { - // addition - index = (this.#size === 0 - ? this.#tail - : this.#free.length !== 0 - ? this.#free.pop() - : this.#size === this.#max - ? this.#evict(false) - : this.#size); - this.#keyList[index] = k; - this.#valList[index] = v; - this.#keyMap.set(k, index); - this.#next[this.#tail] = index; - this.#prev[index] = this.#tail; - this.#tail = index; - this.#size++; - this.#addItemSize(index, size, status); - if (status) - status.set = 'add'; - noUpdateTTL = false; - } - else { - // update - this.#moveToTail(index); - const oldVal = this.#valList[index]; - if (v !== oldVal) { - if (this.#hasFetchMethod && this.#isBackgroundFetch(oldVal)) { - oldVal.__abortController.abort(new Error('replaced')); - const { __staleWhileFetching: s } = oldVal; - if (s !== undefined && !noDisposeOnSet) { - if (this.#hasDispose) { - this.#dispose?.(s, k, 'set'); - } - if (this.#hasDisposeAfter) { - this.#disposed?.push([s, k, 'set']); - } - } - } - else if (!noDisposeOnSet) { - if (this.#hasDispose) { - this.#dispose?.(oldVal, k, 'set'); - } - if (this.#hasDisposeAfter) { - this.#disposed?.push([oldVal, k, 'set']); - } - } - this.#removeItemSize(index); - this.#addItemSize(index, size, status); - this.#valList[index] = v; - if (status) { - status.set = 'replace'; - const oldValue = oldVal && this.#isBackgroundFetch(oldVal) - ? oldVal.__staleWhileFetching - : oldVal; - if (oldValue !== undefined) - status.oldValue = oldValue; - } - } - else if (status) { - status.set = 'update'; - } - } - if (ttl !== 0 && !this.#ttls) { - this.#initializeTTLTracking(); - } - if (this.#ttls) { - if (!noUpdateTTL) { - this.#setItemTTL(index, ttl, start); - } - if (status) - this.#statusTTL(status, index); - } - if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) { - const dt = this.#disposed; - let task; - while ((task = dt?.shift())) { - this.#disposeAfter?.(...task); - } - } - return this; - } - /** - * Evict the least recently used item, returning its value or - * `undefined` if cache is empty. - */ - pop() { - try { - while (this.#size) { - const val = this.#valList[this.#head]; - this.#evict(true); - if (this.#isBackgroundFetch(val)) { - if (val.__staleWhileFetching) { - return val.__staleWhileFetching; - } - } - else if (val !== undefined) { - return val; - } - } - } - finally { - if (this.#hasDisposeAfter && this.#disposed) { - const dt = this.#disposed; - let task; - while ((task = dt?.shift())) { - this.#disposeAfter?.(...task); - } - } - } - } - #evict(free) { - const head = this.#head; - const k = this.#keyList[head]; - const v = this.#valList[head]; - if (this.#hasFetchMethod && this.#isBackgroundFetch(v)) { - v.__abortController.abort(new Error('evicted')); - } - else if (this.#hasDispose || this.#hasDisposeAfter) { - if (this.#hasDispose) { - this.#dispose?.(v, k, 'evict'); - } - if (this.#hasDisposeAfter) { - this.#disposed?.push([v, k, 'evict']); - } - } - this.#removeItemSize(head); - // if we aren't about to use the index, then null these out - if (free) { - this.#keyList[head] = undefined; - this.#valList[head] = undefined; - this.#free.push(head); - } - if (this.#size === 1) { - this.#head = this.#tail = 0; - this.#free.length = 0; - } - else { - this.#head = this.#next[head]; - } - this.#keyMap.delete(k); - this.#size--; - return head; - } - /** - * Check if a key is in the cache, without updating the recency of use. - * Will return false if the item is stale, even though it is technically - * in the cache. - * - * Check if a key is in the cache, without updating the recency of - * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set - * to `true` in either the options or the constructor. - * - * Will return `false` if the item is stale, even though it is technically in - * the cache. The difference can be determined (if it matters) by using a - * `status` argument, and inspecting the `has` field. - * - * Will not update item age unless - * {@link LRUCache.OptionsBase.updateAgeOnHas} is set. - */ - has(k, hasOptions = {}) { - const { updateAgeOnHas = this.updateAgeOnHas, status } = hasOptions; - const index = this.#keyMap.get(k); - if (index !== undefined) { - const v = this.#valList[index]; - if (this.#isBackgroundFetch(v) && - v.__staleWhileFetching === undefined) { - return false; - } - if (!this.#isStale(index)) { - if (updateAgeOnHas) { - this.#updateItemAge(index); - } - if (status) { - status.has = 'hit'; - this.#statusTTL(status, index); - } - return true; - } - else if (status) { - status.has = 'stale'; - this.#statusTTL(status, index); - } - } - else if (status) { - status.has = 'miss'; - } - return false; - } - /** - * Like {@link LRUCache#get} but doesn't update recency or delete stale - * items. - * - * Returns `undefined` if the item is stale, unless - * {@link LRUCache.OptionsBase.allowStale} is set. - */ - peek(k, peekOptions = {}) { - const { allowStale = this.allowStale } = peekOptions; - const index = this.#keyMap.get(k); - if (index === undefined || - (!allowStale && this.#isStale(index))) { - return; - } - const v = this.#valList[index]; - // either stale and allowed, or forcing a refresh of non-stale value - return this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; - } - #backgroundFetch(k, index, options, context) { - const v = index === undefined ? undefined : this.#valList[index]; - if (this.#isBackgroundFetch(v)) { - return v; - } - const ac = new AC(); - const { signal } = options; - // when/if our AC signals, then stop listening to theirs. - signal?.addEventListener('abort', () => ac.abort(signal.reason), { - signal: ac.signal, - }); - const fetchOpts = { - signal: ac.signal, - options, - context, - }; - const cb = (v, updateCache = false) => { - const { aborted } = ac.signal; - const ignoreAbort = options.ignoreFetchAbort && v !== undefined; - if (options.status) { - if (aborted && !updateCache) { - options.status.fetchAborted = true; - options.status.fetchError = ac.signal.reason; - if (ignoreAbort) - options.status.fetchAbortIgnored = true; - } - else { - options.status.fetchResolved = true; - } - } - if (aborted && !ignoreAbort && !updateCache) { - return fetchFail(ac.signal.reason); - } - // either we didn't abort, and are still here, or we did, and ignored - const bf = p; - if (this.#valList[index] === p) { - if (v === undefined) { - if (bf.__staleWhileFetching) { - this.#valList[index] = bf.__staleWhileFetching; - } - else { - this.#delete(k, 'fetch'); - } - } - else { - if (options.status) - options.status.fetchUpdated = true; - this.set(k, v, fetchOpts.options); - } - } - return v; - }; - const eb = (er) => { - if (options.status) { - options.status.fetchRejected = true; - options.status.fetchError = er; - } - return fetchFail(er); - }; - const fetchFail = (er) => { - const { aborted } = ac.signal; - const allowStaleAborted = aborted && options.allowStaleOnFetchAbort; - const allowStale = allowStaleAborted || options.allowStaleOnFetchRejection; - const noDelete = allowStale || options.noDeleteOnFetchRejection; - const bf = p; - if (this.#valList[index] === p) { - // if we allow stale on fetch rejections, then we need to ensure that - // the stale value is not removed from the cache when the fetch fails. - const del = !noDelete || bf.__staleWhileFetching === undefined; - if (del) { - this.#delete(k, 'fetch'); - } - else if (!allowStaleAborted) { - // still replace the *promise* with the stale value, - // since we are done with the promise at this point. - // leave it untouched if we're still waiting for an - // aborted background fetch that hasn't yet returned. - this.#valList[index] = bf.__staleWhileFetching; - } - } - if (allowStale) { - if (options.status && bf.__staleWhileFetching !== undefined) { - options.status.returnedStale = true; - } - return bf.__staleWhileFetching; - } - else if (bf.__returned === bf) { - throw er; - } - }; - const pcall = (res, rej) => { - const fmp = this.#fetchMethod?.(k, v, fetchOpts); - if (fmp && fmp instanceof Promise) { - fmp.then(v => res(v === undefined ? undefined : v), rej); - } - // ignored, we go until we finish, regardless. - // defer check until we are actually aborting, - // so fetchMethod can override. - ac.signal.addEventListener('abort', () => { - if (!options.ignoreFetchAbort || - options.allowStaleOnFetchAbort) { - res(undefined); - // when it eventually resolves, update the cache. - if (options.allowStaleOnFetchAbort) { - res = v => cb(v, true); - } - } - }); - }; - if (options.status) - options.status.fetchDispatched = true; - const p = new Promise(pcall).then(cb, eb); - const bf = Object.assign(p, { - __abortController: ac, - __staleWhileFetching: v, - __returned: undefined, - }); - if (index === undefined) { - // internal, don't expose status. - this.set(k, bf, { ...fetchOpts.options, status: undefined }); - index = this.#keyMap.get(k); - } - else { - this.#valList[index] = bf; - } - return bf; - } - #isBackgroundFetch(p) { - if (!this.#hasFetchMethod) - return false; - const b = p; - return (!!b && - b instanceof Promise && - b.hasOwnProperty('__staleWhileFetching') && - b.__abortController instanceof AC); - } - async fetch(k, fetchOptions = {}) { - const { - // get options - allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, - // set options - ttl = this.ttl, noDisposeOnSet = this.noDisposeOnSet, size = 0, sizeCalculation = this.sizeCalculation, noUpdateTTL = this.noUpdateTTL, - // fetch exclusive options - noDeleteOnFetchRejection = this.noDeleteOnFetchRejection, allowStaleOnFetchRejection = this.allowStaleOnFetchRejection, ignoreFetchAbort = this.ignoreFetchAbort, allowStaleOnFetchAbort = this.allowStaleOnFetchAbort, context, forceRefresh = false, status, signal, } = fetchOptions; - if (!this.#hasFetchMethod) { - if (status) - status.fetch = 'get'; - return this.get(k, { - allowStale, - updateAgeOnGet, - noDeleteOnStaleGet, - status, - }); - } - const options = { - allowStale, - updateAgeOnGet, - noDeleteOnStaleGet, - ttl, - noDisposeOnSet, - size, - sizeCalculation, - noUpdateTTL, - noDeleteOnFetchRejection, - allowStaleOnFetchRejection, - allowStaleOnFetchAbort, - ignoreFetchAbort, - status, - signal, - }; - let index = this.#keyMap.get(k); - if (index === undefined) { - if (status) - status.fetch = 'miss'; - const p = this.#backgroundFetch(k, index, options, context); - return (p.__returned = p); - } - else { - // in cache, maybe already fetching - const v = this.#valList[index]; - if (this.#isBackgroundFetch(v)) { - const stale = allowStale && v.__staleWhileFetching !== undefined; - if (status) { - status.fetch = 'inflight'; - if (stale) - status.returnedStale = true; - } - return stale ? v.__staleWhileFetching : (v.__returned = v); - } - // if we force a refresh, that means do NOT serve the cached value, - // unless we are already in the process of refreshing the cache. - const isStale = this.#isStale(index); - if (!forceRefresh && !isStale) { - if (status) - status.fetch = 'hit'; - this.#moveToTail(index); - if (updateAgeOnGet) { - this.#updateItemAge(index); - } - if (status) - this.#statusTTL(status, index); - return v; - } - // ok, it is stale or a forced refresh, and not already fetching. - // refresh the cache. - const p = this.#backgroundFetch(k, index, options, context); - const hasStale = p.__staleWhileFetching !== undefined; - const staleVal = hasStale && allowStale; - if (status) { - status.fetch = isStale ? 'stale' : 'refresh'; - if (staleVal && isStale) - status.returnedStale = true; - } - return staleVal ? p.__staleWhileFetching : (p.__returned = p); - } - } - async forceFetch(k, fetchOptions = {}) { - const v = await this.fetch(k, fetchOptions); - if (v === undefined) - throw new Error('fetch() returned undefined'); - return v; - } - memo(k, memoOptions = {}) { - const memoMethod = this.#memoMethod; - if (!memoMethod) { - throw new Error('no memoMethod provided to constructor'); - } - const { context, forceRefresh, ...options } = memoOptions; - const v = this.get(k, options); - if (!forceRefresh && v !== undefined) - return v; - const vv = memoMethod(k, v, { - options, - context, - }); - this.set(k, vv, options); - return vv; - } - /** - * Return a value from the cache. Will update the recency of the cache - * entry found. - * - * If the key is not found, get() will return `undefined`. - */ - get(k, getOptions = {}) { - const { allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, status, } = getOptions; - const index = this.#keyMap.get(k); - if (index !== undefined) { - const value = this.#valList[index]; - const fetching = this.#isBackgroundFetch(value); - if (status) - this.#statusTTL(status, index); - if (this.#isStale(index)) { - if (status) - status.get = 'stale'; - // delete only if not an in-flight background fetch - if (!fetching) { - if (!noDeleteOnStaleGet) { - this.#delete(k, 'expire'); - } - if (status && allowStale) - status.returnedStale = true; - return allowStale ? value : undefined; - } - else { - if (status && - allowStale && - value.__staleWhileFetching !== undefined) { - status.returnedStale = true; - } - return allowStale ? value.__staleWhileFetching : undefined; - } - } - else { - if (status) - status.get = 'hit'; - // if we're currently fetching it, we don't actually have it yet - // it's not stale, which means this isn't a staleWhileRefetching. - // If it's not stale, and fetching, AND has a __staleWhileFetching - // value, then that means the user fetched with {forceRefresh:true}, - // so it's safe to return that value. - if (fetching) { - return value.__staleWhileFetching; - } - this.#moveToTail(index); - if (updateAgeOnGet) { - this.#updateItemAge(index); - } - return value; - } - } - else if (status) { - status.get = 'miss'; - } - } - #connect(p, n) { - this.#prev[n] = p; - this.#next[p] = n; - } - #moveToTail(index) { - // if tail already, nothing to do - // if head, move head to next[index] - // else - // move next[prev[index]] to next[index] (head has no prev) - // move prev[next[index]] to prev[index] - // prev[index] = tail - // next[tail] = index - // tail = index - if (index !== this.#tail) { - if (index === this.#head) { - this.#head = this.#next[index]; - } - else { - this.#connect(this.#prev[index], this.#next[index]); - } - this.#connect(this.#tail, index); - this.#tail = index; - } - } - /** - * Deletes a key out of the cache. - * - * Returns true if the key was deleted, false otherwise. - */ - delete(k) { - return this.#delete(k, 'delete'); - } - #delete(k, reason) { - let deleted = false; - if (this.#size !== 0) { - const index = this.#keyMap.get(k); - if (index !== undefined) { - deleted = true; - if (this.#size === 1) { - this.#clear(reason); - } - else { - this.#removeItemSize(index); - const v = this.#valList[index]; - if (this.#isBackgroundFetch(v)) { - v.__abortController.abort(new Error('deleted')); - } - else if (this.#hasDispose || this.#hasDisposeAfter) { - if (this.#hasDispose) { - this.#dispose?.(v, k, reason); - } - if (this.#hasDisposeAfter) { - this.#disposed?.push([v, k, reason]); - } - } - this.#keyMap.delete(k); - this.#keyList[index] = undefined; - this.#valList[index] = undefined; - if (index === this.#tail) { - this.#tail = this.#prev[index]; - } - else if (index === this.#head) { - this.#head = this.#next[index]; - } - else { - const pi = this.#prev[index]; - this.#next[pi] = this.#next[index]; - const ni = this.#next[index]; - this.#prev[ni] = this.#prev[index]; - } - this.#size--; - this.#free.push(index); - } - } - } - if (this.#hasDisposeAfter && this.#disposed?.length) { - const dt = this.#disposed; - let task; - while ((task = dt?.shift())) { - this.#disposeAfter?.(...task); - } - } - return deleted; - } - /** - * Clear the cache entirely, throwing away all values. - */ - clear() { - return this.#clear('delete'); - } - #clear(reason) { - for (const index of this.#rindexes({ allowStale: true })) { - const v = this.#valList[index]; - if (this.#isBackgroundFetch(v)) { - v.__abortController.abort(new Error('deleted')); - } - else { - const k = this.#keyList[index]; - if (this.#hasDispose) { - this.#dispose?.(v, k, reason); - } - if (this.#hasDisposeAfter) { - this.#disposed?.push([v, k, reason]); - } - } - } - this.#keyMap.clear(); - this.#valList.fill(undefined); - this.#keyList.fill(undefined); - if (this.#ttls && this.#starts) { - this.#ttls.fill(0); - this.#starts.fill(0); - } - if (this.#sizes) { - this.#sizes.fill(0); - } - this.#head = 0; - this.#tail = 0; - this.#free.length = 0; - this.#calculatedSize = 0; - this.#size = 0; - if (this.#hasDisposeAfter && this.#disposed) { - const dt = this.#disposed; - let task; - while ((task = dt?.shift())) { - this.#disposeAfter?.(...task); - } - } - } -} -exports.LRUCache = LRUCache; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/lru-cache/dist/commonjs/index.min.js b/deps/npm/node_modules/node-gyp/node_modules/lru-cache/dist/commonjs/index.min.js deleted file mode 100644 index ad643b0badc90f..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/lru-cache/dist/commonjs/index.min.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";var G=(l,t,e)=>{if(!t.has(l))throw TypeError("Cannot "+e)};var j=(l,t,e)=>(G(l,t,"read from private field"),e?e.call(l):t.get(l)),I=(l,t,e)=>{if(t.has(l))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(l):t.set(l,e)},x=(l,t,e,i)=>(G(l,t,"write to private field"),i?i.call(l,e):t.set(l,e),e);Object.defineProperty(exports,"__esModule",{value:!0});exports.LRUCache=void 0;var T=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date,P=new Set,U=typeof process=="object"&&process?process:{},H=(l,t,e,i)=>{typeof U.emitWarning=="function"?U.emitWarning(l,t,e,i):console.error(`[${e}] ${t}: ${l}`)},D=globalThis.AbortController,N=globalThis.AbortSignal;if(typeof D>"u"){N=class{onabort;_onabort=[];reason;aborted=!1;addEventListener(i,s){this._onabort.push(s)}},D=class{constructor(){t()}signal=new N;abort(i){if(!this.signal.aborted){this.signal.reason=i,this.signal.aborted=!0;for(let s of this.signal._onabort)s(i);this.signal.onabort?.(i)}}};let l=U.env?.LRU_CACHE_IGNORE_AC_WARNING!=="1",t=()=>{l&&(l=!1,H("AbortController is not defined. If using lru-cache in node 14, load an AbortController polyfill from the `node-abort-controller` package. A minimal polyfill is provided for use by LRUCache.fetch(), but it should not be relied upon in other contexts (eg, passing it to other APIs that use AbortController/AbortSignal might have undesirable effects). You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.","NO_ABORT_CONTROLLER","ENOTSUP",t))}}var V=l=>!P.has(l),Y=Symbol("type"),A=l=>l&&l===Math.floor(l)&&l>0&&isFinite(l),k=l=>A(l)?l<=Math.pow(2,8)?Uint8Array:l<=Math.pow(2,16)?Uint16Array:l<=Math.pow(2,32)?Uint32Array:l<=Number.MAX_SAFE_INTEGER?E:null:null,E=class extends Array{constructor(t){super(t),this.fill(0)}},v,O=class{heap;length;static create(t){let e=k(t);if(!e)return[];x(O,v,!0);let i=new O(t,e);return x(O,v,!1),i}constructor(t,e){if(!j(O,v))throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new e(t),this.length=0}push(t){this.heap[this.length++]=t}pop(){return this.heap[--this.length]}},W=O;v=new WeakMap,I(W,v,!1);var C=class{#g;#f;#p;#w;#R;#W;ttl;ttlResolution;ttlAutopurge;updateAgeOnGet;updateAgeOnHas;allowStale;noDisposeOnSet;noUpdateTTL;maxEntrySize;sizeCalculation;noDeleteOnFetchRejection;noDeleteOnStaleGet;allowStaleOnFetchAbort;allowStaleOnFetchRejection;ignoreFetchAbort;#n;#S;#s;#i;#t;#l;#c;#o;#h;#_;#r;#b;#m;#u;#y;#E;#a;static unsafeExposeInternals(t){return{starts:t.#m,ttls:t.#u,sizes:t.#b,keyMap:t.#s,keyList:t.#i,valList:t.#t,next:t.#l,prev:t.#c,get head(){return t.#o},get tail(){return t.#h},free:t.#_,isBackgroundFetch:e=>t.#e(e),backgroundFetch:(e,i,s,n)=>t.#x(e,i,s,n),moveToTail:e=>t.#C(e),indexes:e=>t.#A(e),rindexes:e=>t.#F(e),isStale:e=>t.#d(e)}}get max(){return this.#g}get maxSize(){return this.#f}get calculatedSize(){return this.#S}get size(){return this.#n}get fetchMethod(){return this.#R}get memoMethod(){return this.#W}get dispose(){return this.#p}get disposeAfter(){return this.#w}constructor(t){let{max:e=0,ttl:i,ttlResolution:s=1,ttlAutopurge:n,updateAgeOnGet:h,updateAgeOnHas:o,allowStale:r,dispose:g,disposeAfter:b,noDisposeOnSet:f,noUpdateTTL:u,maxSize:c=0,maxEntrySize:F=0,sizeCalculation:d,fetchMethod:S,memoMethod:a,noDeleteOnFetchRejection:w,noDeleteOnStaleGet:m,allowStaleOnFetchRejection:p,allowStaleOnFetchAbort:_,ignoreFetchAbort:z}=t;if(e!==0&&!A(e))throw new TypeError("max option must be a nonnegative integer");let y=e?k(e):Array;if(!y)throw new Error("invalid max value: "+e);if(this.#g=e,this.#f=c,this.maxEntrySize=F||this.#f,this.sizeCalculation=d,this.sizeCalculation){if(!this.#f&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if(typeof this.sizeCalculation!="function")throw new TypeError("sizeCalculation set to non-function")}if(a!==void 0&&typeof a!="function")throw new TypeError("memoMethod must be a function if defined");if(this.#W=a,S!==void 0&&typeof S!="function")throw new TypeError("fetchMethod must be a function if specified");if(this.#R=S,this.#E=!!S,this.#s=new Map,this.#i=new Array(e).fill(void 0),this.#t=new Array(e).fill(void 0),this.#l=new y(e),this.#c=new y(e),this.#o=0,this.#h=0,this.#_=W.create(e),this.#n=0,this.#S=0,typeof g=="function"&&(this.#p=g),typeof b=="function"?(this.#w=b,this.#r=[]):(this.#w=void 0,this.#r=void 0),this.#y=!!this.#p,this.#a=!!this.#w,this.noDisposeOnSet=!!f,this.noUpdateTTL=!!u,this.noDeleteOnFetchRejection=!!w,this.allowStaleOnFetchRejection=!!p,this.allowStaleOnFetchAbort=!!_,this.ignoreFetchAbort=!!z,this.maxEntrySize!==0){if(this.#f!==0&&!A(this.#f))throw new TypeError("maxSize must be a positive integer if specified");if(!A(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");this.#P()}if(this.allowStale=!!r,this.noDeleteOnStaleGet=!!m,this.updateAgeOnGet=!!h,this.updateAgeOnHas=!!o,this.ttlResolution=A(s)||s===0?s:1,this.ttlAutopurge=!!n,this.ttl=i||0,this.ttl){if(!A(this.ttl))throw new TypeError("ttl must be a positive integer if specified");this.#U()}if(this.#g===0&&this.ttl===0&&this.#f===0)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!this.#g&&!this.#f){let R="LRU_CACHE_UNBOUNDED";V(R)&&(P.add(R),H("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",R,C))}}getRemainingTTL(t){return this.#s.has(t)?1/0:0}#U(){let t=new E(this.#g),e=new E(this.#g);this.#u=t,this.#m=e,this.#M=(n,h,o=T.now())=>{if(e[n]=h!==0?o:0,t[n]=h,h!==0&&this.ttlAutopurge){let r=setTimeout(()=>{this.#d(n)&&this.#T(this.#i[n],"expire")},h+1);r.unref&&r.unref()}},this.#v=n=>{e[n]=t[n]!==0?T.now():0},this.#O=(n,h)=>{if(t[h]){let o=t[h],r=e[h];if(!o||!r)return;n.ttl=o,n.start=r,n.now=i||s();let g=n.now-r;n.remainingTTL=o-g}};let i=0,s=()=>{let n=T.now();if(this.ttlResolution>0){i=n;let h=setTimeout(()=>i=0,this.ttlResolution);h.unref&&h.unref()}return n};this.getRemainingTTL=n=>{let h=this.#s.get(n);if(h===void 0)return 0;let o=t[h],r=e[h];if(!o||!r)return 1/0;let g=(i||s())-r;return o-g},this.#d=n=>{let h=e[n],o=t[n];return!!o&&!!h&&(i||s())-h>o}}#v=()=>{};#O=()=>{};#M=()=>{};#d=()=>!1;#P(){let t=new E(this.#g);this.#S=0,this.#b=t,this.#z=e=>{this.#S-=t[e],t[e]=0},this.#G=(e,i,s,n)=>{if(this.#e(i))return 0;if(!A(s))if(n){if(typeof n!="function")throw new TypeError("sizeCalculation must be a function");if(s=n(i,e),!A(s))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}else throw new TypeError("invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.");return s},this.#D=(e,i,s)=>{if(t[e]=i,this.#f){let n=this.#f-t[e];for(;this.#S>n;)this.#L(!0)}this.#S+=t[e],s&&(s.entrySize=i,s.totalCalculatedSize=this.#S)}}#z=t=>{};#D=(t,e,i)=>{};#G=(t,e,i,s)=>{if(i||s)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0};*#A({allowStale:t=this.allowStale}={}){if(this.#n)for(let e=this.#h;!(!this.#j(e)||((t||!this.#d(e))&&(yield e),e===this.#o));)e=this.#c[e]}*#F({allowStale:t=this.allowStale}={}){if(this.#n)for(let e=this.#o;!(!this.#j(e)||((t||!this.#d(e))&&(yield e),e===this.#h));)e=this.#l[e]}#j(t){return t!==void 0&&this.#s.get(this.#i[t])===t}*entries(){for(let t of this.#A())this.#t[t]!==void 0&&this.#i[t]!==void 0&&!this.#e(this.#t[t])&&(yield[this.#i[t],this.#t[t]])}*rentries(){for(let t of this.#F())this.#t[t]!==void 0&&this.#i[t]!==void 0&&!this.#e(this.#t[t])&&(yield[this.#i[t],this.#t[t]])}*keys(){for(let t of this.#A()){let e=this.#i[t];e!==void 0&&!this.#e(this.#t[t])&&(yield e)}}*rkeys(){for(let t of this.#F()){let e=this.#i[t];e!==void 0&&!this.#e(this.#t[t])&&(yield e)}}*values(){for(let t of this.#A())this.#t[t]!==void 0&&!this.#e(this.#t[t])&&(yield this.#t[t])}*rvalues(){for(let t of this.#F())this.#t[t]!==void 0&&!this.#e(this.#t[t])&&(yield this.#t[t])}[Symbol.iterator](){return this.entries()}[Symbol.toStringTag]="LRUCache";find(t,e={}){for(let i of this.#A()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;if(n!==void 0&&t(n,this.#i[i],this))return this.get(this.#i[i],e)}}forEach(t,e=this){for(let i of this.#A()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;n!==void 0&&t.call(e,n,this.#i[i],this)}}rforEach(t,e=this){for(let i of this.#F()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;n!==void 0&&t.call(e,n,this.#i[i],this)}}purgeStale(){let t=!1;for(let e of this.#F({allowStale:!0}))this.#d(e)&&(this.#T(this.#i[e],"expire"),t=!0);return t}info(t){let e=this.#s.get(t);if(e===void 0)return;let i=this.#t[e],s=this.#e(i)?i.__staleWhileFetching:i;if(s===void 0)return;let n={value:s};if(this.#u&&this.#m){let h=this.#u[e],o=this.#m[e];if(h&&o){let r=h-(T.now()-o);n.ttl=r,n.start=Date.now()}}return this.#b&&(n.size=this.#b[e]),n}dump(){let t=[];for(let e of this.#A({allowStale:!0})){let i=this.#i[e],s=this.#t[e],n=this.#e(s)?s.__staleWhileFetching:s;if(n===void 0||i===void 0)continue;let h={value:n};if(this.#u&&this.#m){h.ttl=this.#u[e];let o=T.now()-this.#m[e];h.start=Math.floor(Date.now()-o)}this.#b&&(h.size=this.#b[e]),t.unshift([i,h])}return t}load(t){this.clear();for(let[e,i]of t){if(i.start){let s=Date.now()-i.start;i.start=T.now()-s}this.set(e,i.value,i)}}set(t,e,i={}){if(e===void 0)return this.delete(t),this;let{ttl:s=this.ttl,start:n,noDisposeOnSet:h=this.noDisposeOnSet,sizeCalculation:o=this.sizeCalculation,status:r}=i,{noUpdateTTL:g=this.noUpdateTTL}=i,b=this.#G(t,e,i.size||0,o);if(this.maxEntrySize&&b>this.maxEntrySize)return r&&(r.set="miss",r.maxEntrySizeExceeded=!0),this.#T(t,"set"),this;let f=this.#n===0?void 0:this.#s.get(t);if(f===void 0)f=this.#n===0?this.#h:this.#_.length!==0?this.#_.pop():this.#n===this.#g?this.#L(!1):this.#n,this.#i[f]=t,this.#t[f]=e,this.#s.set(t,f),this.#l[this.#h]=f,this.#c[f]=this.#h,this.#h=f,this.#n++,this.#D(f,b,r),r&&(r.set="add"),g=!1;else{this.#C(f);let u=this.#t[f];if(e!==u){if(this.#E&&this.#e(u)){u.__abortController.abort(new Error("replaced"));let{__staleWhileFetching:c}=u;c!==void 0&&!h&&(this.#y&&this.#p?.(c,t,"set"),this.#a&&this.#r?.push([c,t,"set"]))}else h||(this.#y&&this.#p?.(u,t,"set"),this.#a&&this.#r?.push([u,t,"set"]));if(this.#z(f),this.#D(f,b,r),this.#t[f]=e,r){r.set="replace";let c=u&&this.#e(u)?u.__staleWhileFetching:u;c!==void 0&&(r.oldValue=c)}}else r&&(r.set="update")}if(s!==0&&!this.#u&&this.#U(),this.#u&&(g||this.#M(f,s,n),r&&this.#O(r,f)),!h&&this.#a&&this.#r){let u=this.#r,c;for(;c=u?.shift();)this.#w?.(...c)}return this}pop(){try{for(;this.#n;){let t=this.#t[this.#o];if(this.#L(!0),this.#e(t)){if(t.__staleWhileFetching)return t.__staleWhileFetching}else if(t!==void 0)return t}}finally{if(this.#a&&this.#r){let t=this.#r,e;for(;e=t?.shift();)this.#w?.(...e)}}}#L(t){let e=this.#o,i=this.#i[e],s=this.#t[e];return this.#E&&this.#e(s)?s.__abortController.abort(new Error("evicted")):(this.#y||this.#a)&&(this.#y&&this.#p?.(s,i,"evict"),this.#a&&this.#r?.push([s,i,"evict"])),this.#z(e),t&&(this.#i[e]=void 0,this.#t[e]=void 0,this.#_.push(e)),this.#n===1?(this.#o=this.#h=0,this.#_.length=0):this.#o=this.#l[e],this.#s.delete(i),this.#n--,e}has(t,e={}){let{updateAgeOnHas:i=this.updateAgeOnHas,status:s}=e,n=this.#s.get(t);if(n!==void 0){let h=this.#t[n];if(this.#e(h)&&h.__staleWhileFetching===void 0)return!1;if(this.#d(n))s&&(s.has="stale",this.#O(s,n));else return i&&this.#v(n),s&&(s.has="hit",this.#O(s,n)),!0}else s&&(s.has="miss");return!1}peek(t,e={}){let{allowStale:i=this.allowStale}=e,s=this.#s.get(t);if(s===void 0||!i&&this.#d(s))return;let n=this.#t[s];return this.#e(n)?n.__staleWhileFetching:n}#x(t,e,i,s){let n=e===void 0?void 0:this.#t[e];if(this.#e(n))return n;let h=new D,{signal:o}=i;o?.addEventListener("abort",()=>h.abort(o.reason),{signal:h.signal});let r={signal:h.signal,options:i,context:s},g=(d,S=!1)=>{let{aborted:a}=h.signal,w=i.ignoreFetchAbort&&d!==void 0;if(i.status&&(a&&!S?(i.status.fetchAborted=!0,i.status.fetchError=h.signal.reason,w&&(i.status.fetchAbortIgnored=!0)):i.status.fetchResolved=!0),a&&!w&&!S)return f(h.signal.reason);let m=c;return this.#t[e]===c&&(d===void 0?m.__staleWhileFetching?this.#t[e]=m.__staleWhileFetching:this.#T(t,"fetch"):(i.status&&(i.status.fetchUpdated=!0),this.set(t,d,r.options))),d},b=d=>(i.status&&(i.status.fetchRejected=!0,i.status.fetchError=d),f(d)),f=d=>{let{aborted:S}=h.signal,a=S&&i.allowStaleOnFetchAbort,w=a||i.allowStaleOnFetchRejection,m=w||i.noDeleteOnFetchRejection,p=c;if(this.#t[e]===c&&(!m||p.__staleWhileFetching===void 0?this.#T(t,"fetch"):a||(this.#t[e]=p.__staleWhileFetching)),w)return i.status&&p.__staleWhileFetching!==void 0&&(i.status.returnedStale=!0),p.__staleWhileFetching;if(p.__returned===p)throw d},u=(d,S)=>{let a=this.#R?.(t,n,r);a&&a instanceof Promise&&a.then(w=>d(w===void 0?void 0:w),S),h.signal.addEventListener("abort",()=>{(!i.ignoreFetchAbort||i.allowStaleOnFetchAbort)&&(d(void 0),i.allowStaleOnFetchAbort&&(d=w=>g(w,!0)))})};i.status&&(i.status.fetchDispatched=!0);let c=new Promise(u).then(g,b),F=Object.assign(c,{__abortController:h,__staleWhileFetching:n,__returned:void 0});return e===void 0?(this.set(t,F,{...r.options,status:void 0}),e=this.#s.get(t)):this.#t[e]=F,F}#e(t){if(!this.#E)return!1;let e=t;return!!e&&e instanceof Promise&&e.hasOwnProperty("__staleWhileFetching")&&e.__abortController instanceof D}async fetch(t,e={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet,ttl:h=this.ttl,noDisposeOnSet:o=this.noDisposeOnSet,size:r=0,sizeCalculation:g=this.sizeCalculation,noUpdateTTL:b=this.noUpdateTTL,noDeleteOnFetchRejection:f=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:u=this.allowStaleOnFetchRejection,ignoreFetchAbort:c=this.ignoreFetchAbort,allowStaleOnFetchAbort:F=this.allowStaleOnFetchAbort,context:d,forceRefresh:S=!1,status:a,signal:w}=e;if(!this.#E)return a&&(a.fetch="get"),this.get(t,{allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:n,status:a});let m={allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:n,ttl:h,noDisposeOnSet:o,size:r,sizeCalculation:g,noUpdateTTL:b,noDeleteOnFetchRejection:f,allowStaleOnFetchRejection:u,allowStaleOnFetchAbort:F,ignoreFetchAbort:c,status:a,signal:w},p=this.#s.get(t);if(p===void 0){a&&(a.fetch="miss");let _=this.#x(t,p,m,d);return _.__returned=_}else{let _=this.#t[p];if(this.#e(_)){let M=i&&_.__staleWhileFetching!==void 0;return a&&(a.fetch="inflight",M&&(a.returnedStale=!0)),M?_.__staleWhileFetching:_.__returned=_}let z=this.#d(p);if(!S&&!z)return a&&(a.fetch="hit"),this.#C(p),s&&this.#v(p),a&&this.#O(a,p),_;let y=this.#x(t,p,m,d),L=y.__staleWhileFetching!==void 0&&i;return a&&(a.fetch=z?"stale":"refresh",L&&z&&(a.returnedStale=!0)),L?y.__staleWhileFetching:y.__returned=y}}async forceFetch(t,e={}){let i=await this.fetch(t,e);if(i===void 0)throw new Error("fetch() returned undefined");return i}memo(t,e={}){let i=this.#W;if(!i)throw new Error("no memoMethod provided to constructor");let{context:s,forceRefresh:n,...h}=e,o=this.get(t,h);if(!n&&o!==void 0)return o;let r=i(t,o,{options:h,context:s});return this.set(t,r,h),r}get(t,e={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet,status:h}=e,o=this.#s.get(t);if(o!==void 0){let r=this.#t[o],g=this.#e(r);return h&&this.#O(h,o),this.#d(o)?(h&&(h.get="stale"),g?(h&&i&&r.__staleWhileFetching!==void 0&&(h.returnedStale=!0),i?r.__staleWhileFetching:void 0):(n||this.#T(t,"expire"),h&&i&&(h.returnedStale=!0),i?r:void 0)):(h&&(h.get="hit"),g?r.__staleWhileFetching:(this.#C(o),s&&this.#v(o),r))}else h&&(h.get="miss")}#I(t,e){this.#c[e]=t,this.#l[t]=e}#C(t){t!==this.#h&&(t===this.#o?this.#o=this.#l[t]:this.#I(this.#c[t],this.#l[t]),this.#I(this.#h,t),this.#h=t)}delete(t){return this.#T(t,"delete")}#T(t,e){let i=!1;if(this.#n!==0){let s=this.#s.get(t);if(s!==void 0)if(i=!0,this.#n===1)this.#N(e);else{this.#z(s);let n=this.#t[s];if(this.#e(n)?n.__abortController.abort(new Error("deleted")):(this.#y||this.#a)&&(this.#y&&this.#p?.(n,t,e),this.#a&&this.#r?.push([n,t,e])),this.#s.delete(t),this.#i[s]=void 0,this.#t[s]=void 0,s===this.#h)this.#h=this.#c[s];else if(s===this.#o)this.#o=this.#l[s];else{let h=this.#c[s];this.#l[h]=this.#l[s];let o=this.#l[s];this.#c[o]=this.#c[s]}this.#n--,this.#_.push(s)}}if(this.#a&&this.#r?.length){let s=this.#r,n;for(;n=s?.shift();)this.#w?.(...n)}return i}clear(){return this.#N("delete")}#N(t){for(let e of this.#F({allowStale:!0})){let i=this.#t[e];if(this.#e(i))i.__abortController.abort(new Error("deleted"));else{let s=this.#i[e];this.#y&&this.#p?.(i,s,t),this.#a&&this.#r?.push([i,s,t])}}if(this.#s.clear(),this.#t.fill(void 0),this.#i.fill(void 0),this.#u&&this.#m&&(this.#u.fill(0),this.#m.fill(0)),this.#b&&this.#b.fill(0),this.#o=0,this.#h=0,this.#_.length=0,this.#S=0,this.#n=0,this.#a&&this.#r){let e=this.#r,i;for(;i=e?.shift();)this.#w?.(...i)}}};exports.LRUCache=C; -//# sourceMappingURL=index.min.js.map diff --git a/deps/npm/node_modules/node-gyp/node_modules/lru-cache/dist/commonjs/package.json b/deps/npm/node_modules/node-gyp/node_modules/lru-cache/dist/commonjs/package.json deleted file mode 100644 index 5bbefffbabee39..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/lru-cache/dist/commonjs/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "commonjs" -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/lru-cache/dist/esm/index.js b/deps/npm/node_modules/node-gyp/node_modules/lru-cache/dist/esm/index.js deleted file mode 100644 index 649304a949228c..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/lru-cache/dist/esm/index.js +++ /dev/null @@ -1,1542 +0,0 @@ -/** - * @module LRUCache - */ -const perf = typeof performance === 'object' && - performance && - typeof performance.now === 'function' - ? performance - : Date; -const warned = new Set(); -/* c8 ignore start */ -const PROCESS = (typeof process === 'object' && !!process ? process : {}); -/* c8 ignore start */ -const emitWarning = (msg, type, code, fn) => { - typeof PROCESS.emitWarning === 'function' - ? PROCESS.emitWarning(msg, type, code, fn) - : console.error(`[${code}] ${type}: ${msg}`); -}; -let AC = globalThis.AbortController; -let AS = globalThis.AbortSignal; -/* c8 ignore start */ -if (typeof AC === 'undefined') { - //@ts-ignore - AS = class AbortSignal { - onabort; - _onabort = []; - reason; - aborted = false; - addEventListener(_, fn) { - this._onabort.push(fn); - } - }; - //@ts-ignore - AC = class AbortController { - constructor() { - warnACPolyfill(); - } - signal = new AS(); - abort(reason) { - if (this.signal.aborted) - return; - //@ts-ignore - this.signal.reason = reason; - //@ts-ignore - this.signal.aborted = true; - //@ts-ignore - for (const fn of this.signal._onabort) { - fn(reason); - } - this.signal.onabort?.(reason); - } - }; - let printACPolyfillWarning = PROCESS.env?.LRU_CACHE_IGNORE_AC_WARNING !== '1'; - const warnACPolyfill = () => { - if (!printACPolyfillWarning) - return; - printACPolyfillWarning = false; - emitWarning('AbortController is not defined. If using lru-cache in ' + - 'node 14, load an AbortController polyfill from the ' + - '`node-abort-controller` package. A minimal polyfill is ' + - 'provided for use by LRUCache.fetch(), but it should not be ' + - 'relied upon in other contexts (eg, passing it to other APIs that ' + - 'use AbortController/AbortSignal might have undesirable effects). ' + - 'You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.', 'NO_ABORT_CONTROLLER', 'ENOTSUP', warnACPolyfill); - }; -} -/* c8 ignore stop */ -const shouldWarn = (code) => !warned.has(code); -const TYPE = Symbol('type'); -const isPosInt = (n) => n && n === Math.floor(n) && n > 0 && isFinite(n); -/* c8 ignore start */ -// This is a little bit ridiculous, tbh. -// The maximum array length is 2^32-1 or thereabouts on most JS impls. -// And well before that point, you're caching the entire world, I mean, -// that's ~32GB of just integers for the next/prev links, plus whatever -// else to hold that many keys and values. Just filling the memory with -// zeroes at init time is brutal when you get that big. -// But why not be complete? -// Maybe in the future, these limits will have expanded. -const getUintArray = (max) => !isPosInt(max) - ? null - : max <= Math.pow(2, 8) - ? Uint8Array - : max <= Math.pow(2, 16) - ? Uint16Array - : max <= Math.pow(2, 32) - ? Uint32Array - : max <= Number.MAX_SAFE_INTEGER - ? ZeroArray - : null; -/* c8 ignore stop */ -class ZeroArray extends Array { - constructor(size) { - super(size); - this.fill(0); - } -} -class Stack { - heap; - length; - // private constructor - static #constructing = false; - static create(max) { - const HeapCls = getUintArray(max); - if (!HeapCls) - return []; - Stack.#constructing = true; - const s = new Stack(max, HeapCls); - Stack.#constructing = false; - return s; - } - constructor(max, HeapCls) { - /* c8 ignore start */ - if (!Stack.#constructing) { - throw new TypeError('instantiate Stack using Stack.create(n)'); - } - /* c8 ignore stop */ - this.heap = new HeapCls(max); - this.length = 0; - } - push(n) { - this.heap[this.length++] = n; - } - pop() { - return this.heap[--this.length]; - } -} -/** - * Default export, the thing you're using this module to get. - * - * The `K` and `V` types define the key and value types, respectively. The - * optional `FC` type defines the type of the `context` object passed to - * `cache.fetch()` and `cache.memo()`. - * - * Keys and values **must not** be `null` or `undefined`. - * - * All properties from the options object (with the exception of `max`, - * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are - * added as normal public members. (The listed options are read-only getters.) - * - * Changing any of these will alter the defaults for subsequent method calls. - */ -export class LRUCache { - // options that cannot be changed without disaster - #max; - #maxSize; - #dispose; - #disposeAfter; - #fetchMethod; - #memoMethod; - /** - * {@link LRUCache.OptionsBase.ttl} - */ - ttl; - /** - * {@link LRUCache.OptionsBase.ttlResolution} - */ - ttlResolution; - /** - * {@link LRUCache.OptionsBase.ttlAutopurge} - */ - ttlAutopurge; - /** - * {@link LRUCache.OptionsBase.updateAgeOnGet} - */ - updateAgeOnGet; - /** - * {@link LRUCache.OptionsBase.updateAgeOnHas} - */ - updateAgeOnHas; - /** - * {@link LRUCache.OptionsBase.allowStale} - */ - allowStale; - /** - * {@link LRUCache.OptionsBase.noDisposeOnSet} - */ - noDisposeOnSet; - /** - * {@link LRUCache.OptionsBase.noUpdateTTL} - */ - noUpdateTTL; - /** - * {@link LRUCache.OptionsBase.maxEntrySize} - */ - maxEntrySize; - /** - * {@link LRUCache.OptionsBase.sizeCalculation} - */ - sizeCalculation; - /** - * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection} - */ - noDeleteOnFetchRejection; - /** - * {@link LRUCache.OptionsBase.noDeleteOnStaleGet} - */ - noDeleteOnStaleGet; - /** - * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort} - */ - allowStaleOnFetchAbort; - /** - * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} - */ - allowStaleOnFetchRejection; - /** - * {@link LRUCache.OptionsBase.ignoreFetchAbort} - */ - ignoreFetchAbort; - // computed properties - #size; - #calculatedSize; - #keyMap; - #keyList; - #valList; - #next; - #prev; - #head; - #tail; - #free; - #disposed; - #sizes; - #starts; - #ttls; - #hasDispose; - #hasFetchMethod; - #hasDisposeAfter; - /** - * Do not call this method unless you need to inspect the - * inner workings of the cache. If anything returned by this - * object is modified in any way, strange breakage may occur. - * - * These fields are private for a reason! - * - * @internal - */ - static unsafeExposeInternals(c) { - return { - // properties - starts: c.#starts, - ttls: c.#ttls, - sizes: c.#sizes, - keyMap: c.#keyMap, - keyList: c.#keyList, - valList: c.#valList, - next: c.#next, - prev: c.#prev, - get head() { - return c.#head; - }, - get tail() { - return c.#tail; - }, - free: c.#free, - // methods - isBackgroundFetch: (p) => c.#isBackgroundFetch(p), - backgroundFetch: (k, index, options, context) => c.#backgroundFetch(k, index, options, context), - moveToTail: (index) => c.#moveToTail(index), - indexes: (options) => c.#indexes(options), - rindexes: (options) => c.#rindexes(options), - isStale: (index) => c.#isStale(index), - }; - } - // Protected read-only members - /** - * {@link LRUCache.OptionsBase.max} (read-only) - */ - get max() { - return this.#max; - } - /** - * {@link LRUCache.OptionsBase.maxSize} (read-only) - */ - get maxSize() { - return this.#maxSize; - } - /** - * The total computed size of items in the cache (read-only) - */ - get calculatedSize() { - return this.#calculatedSize; - } - /** - * The number of items stored in the cache (read-only) - */ - get size() { - return this.#size; - } - /** - * {@link LRUCache.OptionsBase.fetchMethod} (read-only) - */ - get fetchMethod() { - return this.#fetchMethod; - } - get memoMethod() { - return this.#memoMethod; - } - /** - * {@link LRUCache.OptionsBase.dispose} (read-only) - */ - get dispose() { - return this.#dispose; - } - /** - * {@link LRUCache.OptionsBase.disposeAfter} (read-only) - */ - get disposeAfter() { - return this.#disposeAfter; - } - constructor(options) { - const { max = 0, ttl, ttlResolution = 1, ttlAutopurge, updateAgeOnGet, updateAgeOnHas, allowStale, dispose, disposeAfter, noDisposeOnSet, noUpdateTTL, maxSize = 0, maxEntrySize = 0, sizeCalculation, fetchMethod, memoMethod, noDeleteOnFetchRejection, noDeleteOnStaleGet, allowStaleOnFetchRejection, allowStaleOnFetchAbort, ignoreFetchAbort, } = options; - if (max !== 0 && !isPosInt(max)) { - throw new TypeError('max option must be a nonnegative integer'); - } - const UintArray = max ? getUintArray(max) : Array; - if (!UintArray) { - throw new Error('invalid max value: ' + max); - } - this.#max = max; - this.#maxSize = maxSize; - this.maxEntrySize = maxEntrySize || this.#maxSize; - this.sizeCalculation = sizeCalculation; - if (this.sizeCalculation) { - if (!this.#maxSize && !this.maxEntrySize) { - throw new TypeError('cannot set sizeCalculation without setting maxSize or maxEntrySize'); - } - if (typeof this.sizeCalculation !== 'function') { - throw new TypeError('sizeCalculation set to non-function'); - } - } - if (memoMethod !== undefined && - typeof memoMethod !== 'function') { - throw new TypeError('memoMethod must be a function if defined'); - } - this.#memoMethod = memoMethod; - if (fetchMethod !== undefined && - typeof fetchMethod !== 'function') { - throw new TypeError('fetchMethod must be a function if specified'); - } - this.#fetchMethod = fetchMethod; - this.#hasFetchMethod = !!fetchMethod; - this.#keyMap = new Map(); - this.#keyList = new Array(max).fill(undefined); - this.#valList = new Array(max).fill(undefined); - this.#next = new UintArray(max); - this.#prev = new UintArray(max); - this.#head = 0; - this.#tail = 0; - this.#free = Stack.create(max); - this.#size = 0; - this.#calculatedSize = 0; - if (typeof dispose === 'function') { - this.#dispose = dispose; - } - if (typeof disposeAfter === 'function') { - this.#disposeAfter = disposeAfter; - this.#disposed = []; - } - else { - this.#disposeAfter = undefined; - this.#disposed = undefined; - } - this.#hasDispose = !!this.#dispose; - this.#hasDisposeAfter = !!this.#disposeAfter; - this.noDisposeOnSet = !!noDisposeOnSet; - this.noUpdateTTL = !!noUpdateTTL; - this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection; - this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection; - this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort; - this.ignoreFetchAbort = !!ignoreFetchAbort; - // NB: maxEntrySize is set to maxSize if it's set - if (this.maxEntrySize !== 0) { - if (this.#maxSize !== 0) { - if (!isPosInt(this.#maxSize)) { - throw new TypeError('maxSize must be a positive integer if specified'); - } - } - if (!isPosInt(this.maxEntrySize)) { - throw new TypeError('maxEntrySize must be a positive integer if specified'); - } - this.#initializeSizeTracking(); - } - this.allowStale = !!allowStale; - this.noDeleteOnStaleGet = !!noDeleteOnStaleGet; - this.updateAgeOnGet = !!updateAgeOnGet; - this.updateAgeOnHas = !!updateAgeOnHas; - this.ttlResolution = - isPosInt(ttlResolution) || ttlResolution === 0 - ? ttlResolution - : 1; - this.ttlAutopurge = !!ttlAutopurge; - this.ttl = ttl || 0; - if (this.ttl) { - if (!isPosInt(this.ttl)) { - throw new TypeError('ttl must be a positive integer if specified'); - } - this.#initializeTTLTracking(); - } - // do not allow completely unbounded caches - if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) { - throw new TypeError('At least one of max, maxSize, or ttl is required'); - } - if (!this.ttlAutopurge && !this.#max && !this.#maxSize) { - const code = 'LRU_CACHE_UNBOUNDED'; - if (shouldWarn(code)) { - warned.add(code); - const msg = 'TTL caching without ttlAutopurge, max, or maxSize can ' + - 'result in unbounded memory consumption.'; - emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache); - } - } - } - /** - * Return the number of ms left in the item's TTL. If item is not in cache, - * returns `0`. Returns `Infinity` if item is in cache without a defined TTL. - */ - getRemainingTTL(key) { - return this.#keyMap.has(key) ? Infinity : 0; - } - #initializeTTLTracking() { - const ttls = new ZeroArray(this.#max); - const starts = new ZeroArray(this.#max); - this.#ttls = ttls; - this.#starts = starts; - this.#setItemTTL = (index, ttl, start = perf.now()) => { - starts[index] = ttl !== 0 ? start : 0; - ttls[index] = ttl; - if (ttl !== 0 && this.ttlAutopurge) { - const t = setTimeout(() => { - if (this.#isStale(index)) { - this.#delete(this.#keyList[index], 'expire'); - } - }, ttl + 1); - // unref() not supported on all platforms - /* c8 ignore start */ - if (t.unref) { - t.unref(); - } - /* c8 ignore stop */ - } - }; - this.#updateItemAge = index => { - starts[index] = ttls[index] !== 0 ? perf.now() : 0; - }; - this.#statusTTL = (status, index) => { - if (ttls[index]) { - const ttl = ttls[index]; - const start = starts[index]; - /* c8 ignore next */ - if (!ttl || !start) - return; - status.ttl = ttl; - status.start = start; - status.now = cachedNow || getNow(); - const age = status.now - start; - status.remainingTTL = ttl - age; - } - }; - // debounce calls to perf.now() to 1s so we're not hitting - // that costly call repeatedly. - let cachedNow = 0; - const getNow = () => { - const n = perf.now(); - if (this.ttlResolution > 0) { - cachedNow = n; - const t = setTimeout(() => (cachedNow = 0), this.ttlResolution); - // not available on all platforms - /* c8 ignore start */ - if (t.unref) { - t.unref(); - } - /* c8 ignore stop */ - } - return n; - }; - this.getRemainingTTL = key => { - const index = this.#keyMap.get(key); - if (index === undefined) { - return 0; - } - const ttl = ttls[index]; - const start = starts[index]; - if (!ttl || !start) { - return Infinity; - } - const age = (cachedNow || getNow()) - start; - return ttl - age; - }; - this.#isStale = index => { - const s = starts[index]; - const t = ttls[index]; - return !!t && !!s && (cachedNow || getNow()) - s > t; - }; - } - // conditionally set private methods related to TTL - #updateItemAge = () => { }; - #statusTTL = () => { }; - #setItemTTL = () => { }; - /* c8 ignore stop */ - #isStale = () => false; - #initializeSizeTracking() { - const sizes = new ZeroArray(this.#max); - this.#calculatedSize = 0; - this.#sizes = sizes; - this.#removeItemSize = index => { - this.#calculatedSize -= sizes[index]; - sizes[index] = 0; - }; - this.#requireSize = (k, v, size, sizeCalculation) => { - // provisionally accept background fetches. - // actual value size will be checked when they return. - if (this.#isBackgroundFetch(v)) { - return 0; - } - if (!isPosInt(size)) { - if (sizeCalculation) { - if (typeof sizeCalculation !== 'function') { - throw new TypeError('sizeCalculation must be a function'); - } - size = sizeCalculation(v, k); - if (!isPosInt(size)) { - throw new TypeError('sizeCalculation return invalid (expect positive integer)'); - } - } - else { - throw new TypeError('invalid size value (must be positive integer). ' + - 'When maxSize or maxEntrySize is used, sizeCalculation ' + - 'or size must be set.'); - } - } - return size; - }; - this.#addItemSize = (index, size, status) => { - sizes[index] = size; - if (this.#maxSize) { - const maxSize = this.#maxSize - sizes[index]; - while (this.#calculatedSize > maxSize) { - this.#evict(true); - } - } - this.#calculatedSize += sizes[index]; - if (status) { - status.entrySize = size; - status.totalCalculatedSize = this.#calculatedSize; - } - }; - } - #removeItemSize = _i => { }; - #addItemSize = (_i, _s, _st) => { }; - #requireSize = (_k, _v, size, sizeCalculation) => { - if (size || sizeCalculation) { - throw new TypeError('cannot set size without setting maxSize or maxEntrySize on cache'); - } - return 0; - }; - *#indexes({ allowStale = this.allowStale } = {}) { - if (this.#size) { - for (let i = this.#tail; true;) { - if (!this.#isValidIndex(i)) { - break; - } - if (allowStale || !this.#isStale(i)) { - yield i; - } - if (i === this.#head) { - break; - } - else { - i = this.#prev[i]; - } - } - } - } - *#rindexes({ allowStale = this.allowStale } = {}) { - if (this.#size) { - for (let i = this.#head; true;) { - if (!this.#isValidIndex(i)) { - break; - } - if (allowStale || !this.#isStale(i)) { - yield i; - } - if (i === this.#tail) { - break; - } - else { - i = this.#next[i]; - } - } - } - } - #isValidIndex(index) { - return (index !== undefined && - this.#keyMap.get(this.#keyList[index]) === index); - } - /** - * Return a generator yielding `[key, value]` pairs, - * in order from most recently used to least recently used. - */ - *entries() { - for (const i of this.#indexes()) { - if (this.#valList[i] !== undefined && - this.#keyList[i] !== undefined && - !this.#isBackgroundFetch(this.#valList[i])) { - yield [this.#keyList[i], this.#valList[i]]; - } - } - } - /** - * Inverse order version of {@link LRUCache.entries} - * - * Return a generator yielding `[key, value]` pairs, - * in order from least recently used to most recently used. - */ - *rentries() { - for (const i of this.#rindexes()) { - if (this.#valList[i] !== undefined && - this.#keyList[i] !== undefined && - !this.#isBackgroundFetch(this.#valList[i])) { - yield [this.#keyList[i], this.#valList[i]]; - } - } - } - /** - * Return a generator yielding the keys in the cache, - * in order from most recently used to least recently used. - */ - *keys() { - for (const i of this.#indexes()) { - const k = this.#keyList[i]; - if (k !== undefined && - !this.#isBackgroundFetch(this.#valList[i])) { - yield k; - } - } - } - /** - * Inverse order version of {@link LRUCache.keys} - * - * Return a generator yielding the keys in the cache, - * in order from least recently used to most recently used. - */ - *rkeys() { - for (const i of this.#rindexes()) { - const k = this.#keyList[i]; - if (k !== undefined && - !this.#isBackgroundFetch(this.#valList[i])) { - yield k; - } - } - } - /** - * Return a generator yielding the values in the cache, - * in order from most recently used to least recently used. - */ - *values() { - for (const i of this.#indexes()) { - const v = this.#valList[i]; - if (v !== undefined && - !this.#isBackgroundFetch(this.#valList[i])) { - yield this.#valList[i]; - } - } - } - /** - * Inverse order version of {@link LRUCache.values} - * - * Return a generator yielding the values in the cache, - * in order from least recently used to most recently used. - */ - *rvalues() { - for (const i of this.#rindexes()) { - const v = this.#valList[i]; - if (v !== undefined && - !this.#isBackgroundFetch(this.#valList[i])) { - yield this.#valList[i]; - } - } - } - /** - * Iterating over the cache itself yields the same results as - * {@link LRUCache.entries} - */ - [Symbol.iterator]() { - return this.entries(); - } - /** - * A String value that is used in the creation of the default string - * description of an object. Called by the built-in method - * `Object.prototype.toString`. - */ - [Symbol.toStringTag] = 'LRUCache'; - /** - * Find a value for which the supplied fn method returns a truthy value, - * similar to `Array.find()`. fn is called as `fn(value, key, cache)`. - */ - find(fn, getOptions = {}) { - for (const i of this.#indexes()) { - const v = this.#valList[i]; - const value = this.#isBackgroundFetch(v) - ? v.__staleWhileFetching - : v; - if (value === undefined) - continue; - if (fn(value, this.#keyList[i], this)) { - return this.get(this.#keyList[i], getOptions); - } - } - } - /** - * Call the supplied function on each item in the cache, in order from most - * recently used to least recently used. - * - * `fn` is called as `fn(value, key, cache)`. - * - * If `thisp` is provided, function will be called in the `this`-context of - * the provided object, or the cache if no `thisp` object is provided. - * - * Does not update age or recenty of use, or iterate over stale values. - */ - forEach(fn, thisp = this) { - for (const i of this.#indexes()) { - const v = this.#valList[i]; - const value = this.#isBackgroundFetch(v) - ? v.__staleWhileFetching - : v; - if (value === undefined) - continue; - fn.call(thisp, value, this.#keyList[i], this); - } - } - /** - * The same as {@link LRUCache.forEach} but items are iterated over in - * reverse order. (ie, less recently used items are iterated over first.) - */ - rforEach(fn, thisp = this) { - for (const i of this.#rindexes()) { - const v = this.#valList[i]; - const value = this.#isBackgroundFetch(v) - ? v.__staleWhileFetching - : v; - if (value === undefined) - continue; - fn.call(thisp, value, this.#keyList[i], this); - } - } - /** - * Delete any stale entries. Returns true if anything was removed, - * false otherwise. - */ - purgeStale() { - let deleted = false; - for (const i of this.#rindexes({ allowStale: true })) { - if (this.#isStale(i)) { - this.#delete(this.#keyList[i], 'expire'); - deleted = true; - } - } - return deleted; - } - /** - * Get the extended info about a given entry, to get its value, size, and - * TTL info simultaneously. Returns `undefined` if the key is not present. - * - * Unlike {@link LRUCache#dump}, which is designed to be portable and survive - * serialization, the `start` value is always the current timestamp, and the - * `ttl` is a calculated remaining time to live (negative if expired). - * - * Always returns stale values, if their info is found in the cache, so be - * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl}) - * if relevant. - */ - info(key) { - const i = this.#keyMap.get(key); - if (i === undefined) - return undefined; - const v = this.#valList[i]; - const value = this.#isBackgroundFetch(v) - ? v.__staleWhileFetching - : v; - if (value === undefined) - return undefined; - const entry = { value }; - if (this.#ttls && this.#starts) { - const ttl = this.#ttls[i]; - const start = this.#starts[i]; - if (ttl && start) { - const remain = ttl - (perf.now() - start); - entry.ttl = remain; - entry.start = Date.now(); - } - } - if (this.#sizes) { - entry.size = this.#sizes[i]; - } - return entry; - } - /** - * Return an array of [key, {@link LRUCache.Entry}] tuples which can be - * passed to {@link LRLUCache#load}. - * - * The `start` fields are calculated relative to a portable `Date.now()` - * timestamp, even if `performance.now()` is available. - * - * Stale entries are always included in the `dump`, even if - * {@link LRUCache.OptionsBase.allowStale} is false. - * - * Note: this returns an actual array, not a generator, so it can be more - * easily passed around. - */ - dump() { - const arr = []; - for (const i of this.#indexes({ allowStale: true })) { - const key = this.#keyList[i]; - const v = this.#valList[i]; - const value = this.#isBackgroundFetch(v) - ? v.__staleWhileFetching - : v; - if (value === undefined || key === undefined) - continue; - const entry = { value }; - if (this.#ttls && this.#starts) { - entry.ttl = this.#ttls[i]; - // always dump the start relative to a portable timestamp - // it's ok for this to be a bit slow, it's a rare operation. - const age = perf.now() - this.#starts[i]; - entry.start = Math.floor(Date.now() - age); - } - if (this.#sizes) { - entry.size = this.#sizes[i]; - } - arr.unshift([key, entry]); - } - return arr; - } - /** - * Reset the cache and load in the items in entries in the order listed. - * - * The shape of the resulting cache may be different if the same options are - * not used in both caches. - * - * The `start` fields are assumed to be calculated relative to a portable - * `Date.now()` timestamp, even if `performance.now()` is available. - */ - load(arr) { - this.clear(); - for (const [key, entry] of arr) { - if (entry.start) { - // entry.start is a portable timestamp, but we may be using - // node's performance.now(), so calculate the offset, so that - // we get the intended remaining TTL, no matter how long it's - // been on ice. - // - // it's ok for this to be a bit slow, it's a rare operation. - const age = Date.now() - entry.start; - entry.start = perf.now() - age; - } - this.set(key, entry.value, entry); - } - } - /** - * Add a value to the cache. - * - * Note: if `undefined` is specified as a value, this is an alias for - * {@link LRUCache#delete} - * - * Fields on the {@link LRUCache.SetOptions} options param will override - * their corresponding values in the constructor options for the scope - * of this single `set()` operation. - * - * If `start` is provided, then that will set the effective start - * time for the TTL calculation. Note that this must be a previous - * value of `performance.now()` if supported, or a previous value of - * `Date.now()` if not. - * - * Options object may also include `size`, which will prevent - * calling the `sizeCalculation` function and just use the specified - * number if it is a positive integer, and `noDisposeOnSet` which - * will prevent calling a `dispose` function in the case of - * overwrites. - * - * If the `size` (or return value of `sizeCalculation`) for a given - * entry is greater than `maxEntrySize`, then the item will not be - * added to the cache. - * - * Will update the recency of the entry. - * - * If the value is `undefined`, then this is an alias for - * `cache.delete(key)`. `undefined` is never stored in the cache. - */ - set(k, v, setOptions = {}) { - if (v === undefined) { - this.delete(k); - return this; - } - const { ttl = this.ttl, start, noDisposeOnSet = this.noDisposeOnSet, sizeCalculation = this.sizeCalculation, status, } = setOptions; - let { noUpdateTTL = this.noUpdateTTL } = setOptions; - const size = this.#requireSize(k, v, setOptions.size || 0, sizeCalculation); - // if the item doesn't fit, don't do anything - // NB: maxEntrySize set to maxSize by default - if (this.maxEntrySize && size > this.maxEntrySize) { - if (status) { - status.set = 'miss'; - status.maxEntrySizeExceeded = true; - } - // have to delete, in case something is there already. - this.#delete(k, 'set'); - return this; - } - let index = this.#size === 0 ? undefined : this.#keyMap.get(k); - if (index === undefined) { - // addition - index = (this.#size === 0 - ? this.#tail - : this.#free.length !== 0 - ? this.#free.pop() - : this.#size === this.#max - ? this.#evict(false) - : this.#size); - this.#keyList[index] = k; - this.#valList[index] = v; - this.#keyMap.set(k, index); - this.#next[this.#tail] = index; - this.#prev[index] = this.#tail; - this.#tail = index; - this.#size++; - this.#addItemSize(index, size, status); - if (status) - status.set = 'add'; - noUpdateTTL = false; - } - else { - // update - this.#moveToTail(index); - const oldVal = this.#valList[index]; - if (v !== oldVal) { - if (this.#hasFetchMethod && this.#isBackgroundFetch(oldVal)) { - oldVal.__abortController.abort(new Error('replaced')); - const { __staleWhileFetching: s } = oldVal; - if (s !== undefined && !noDisposeOnSet) { - if (this.#hasDispose) { - this.#dispose?.(s, k, 'set'); - } - if (this.#hasDisposeAfter) { - this.#disposed?.push([s, k, 'set']); - } - } - } - else if (!noDisposeOnSet) { - if (this.#hasDispose) { - this.#dispose?.(oldVal, k, 'set'); - } - if (this.#hasDisposeAfter) { - this.#disposed?.push([oldVal, k, 'set']); - } - } - this.#removeItemSize(index); - this.#addItemSize(index, size, status); - this.#valList[index] = v; - if (status) { - status.set = 'replace'; - const oldValue = oldVal && this.#isBackgroundFetch(oldVal) - ? oldVal.__staleWhileFetching - : oldVal; - if (oldValue !== undefined) - status.oldValue = oldValue; - } - } - else if (status) { - status.set = 'update'; - } - } - if (ttl !== 0 && !this.#ttls) { - this.#initializeTTLTracking(); - } - if (this.#ttls) { - if (!noUpdateTTL) { - this.#setItemTTL(index, ttl, start); - } - if (status) - this.#statusTTL(status, index); - } - if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) { - const dt = this.#disposed; - let task; - while ((task = dt?.shift())) { - this.#disposeAfter?.(...task); - } - } - return this; - } - /** - * Evict the least recently used item, returning its value or - * `undefined` if cache is empty. - */ - pop() { - try { - while (this.#size) { - const val = this.#valList[this.#head]; - this.#evict(true); - if (this.#isBackgroundFetch(val)) { - if (val.__staleWhileFetching) { - return val.__staleWhileFetching; - } - } - else if (val !== undefined) { - return val; - } - } - } - finally { - if (this.#hasDisposeAfter && this.#disposed) { - const dt = this.#disposed; - let task; - while ((task = dt?.shift())) { - this.#disposeAfter?.(...task); - } - } - } - } - #evict(free) { - const head = this.#head; - const k = this.#keyList[head]; - const v = this.#valList[head]; - if (this.#hasFetchMethod && this.#isBackgroundFetch(v)) { - v.__abortController.abort(new Error('evicted')); - } - else if (this.#hasDispose || this.#hasDisposeAfter) { - if (this.#hasDispose) { - this.#dispose?.(v, k, 'evict'); - } - if (this.#hasDisposeAfter) { - this.#disposed?.push([v, k, 'evict']); - } - } - this.#removeItemSize(head); - // if we aren't about to use the index, then null these out - if (free) { - this.#keyList[head] = undefined; - this.#valList[head] = undefined; - this.#free.push(head); - } - if (this.#size === 1) { - this.#head = this.#tail = 0; - this.#free.length = 0; - } - else { - this.#head = this.#next[head]; - } - this.#keyMap.delete(k); - this.#size--; - return head; - } - /** - * Check if a key is in the cache, without updating the recency of use. - * Will return false if the item is stale, even though it is technically - * in the cache. - * - * Check if a key is in the cache, without updating the recency of - * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set - * to `true` in either the options or the constructor. - * - * Will return `false` if the item is stale, even though it is technically in - * the cache. The difference can be determined (if it matters) by using a - * `status` argument, and inspecting the `has` field. - * - * Will not update item age unless - * {@link LRUCache.OptionsBase.updateAgeOnHas} is set. - */ - has(k, hasOptions = {}) { - const { updateAgeOnHas = this.updateAgeOnHas, status } = hasOptions; - const index = this.#keyMap.get(k); - if (index !== undefined) { - const v = this.#valList[index]; - if (this.#isBackgroundFetch(v) && - v.__staleWhileFetching === undefined) { - return false; - } - if (!this.#isStale(index)) { - if (updateAgeOnHas) { - this.#updateItemAge(index); - } - if (status) { - status.has = 'hit'; - this.#statusTTL(status, index); - } - return true; - } - else if (status) { - status.has = 'stale'; - this.#statusTTL(status, index); - } - } - else if (status) { - status.has = 'miss'; - } - return false; - } - /** - * Like {@link LRUCache#get} but doesn't update recency or delete stale - * items. - * - * Returns `undefined` if the item is stale, unless - * {@link LRUCache.OptionsBase.allowStale} is set. - */ - peek(k, peekOptions = {}) { - const { allowStale = this.allowStale } = peekOptions; - const index = this.#keyMap.get(k); - if (index === undefined || - (!allowStale && this.#isStale(index))) { - return; - } - const v = this.#valList[index]; - // either stale and allowed, or forcing a refresh of non-stale value - return this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; - } - #backgroundFetch(k, index, options, context) { - const v = index === undefined ? undefined : this.#valList[index]; - if (this.#isBackgroundFetch(v)) { - return v; - } - const ac = new AC(); - const { signal } = options; - // when/if our AC signals, then stop listening to theirs. - signal?.addEventListener('abort', () => ac.abort(signal.reason), { - signal: ac.signal, - }); - const fetchOpts = { - signal: ac.signal, - options, - context, - }; - const cb = (v, updateCache = false) => { - const { aborted } = ac.signal; - const ignoreAbort = options.ignoreFetchAbort && v !== undefined; - if (options.status) { - if (aborted && !updateCache) { - options.status.fetchAborted = true; - options.status.fetchError = ac.signal.reason; - if (ignoreAbort) - options.status.fetchAbortIgnored = true; - } - else { - options.status.fetchResolved = true; - } - } - if (aborted && !ignoreAbort && !updateCache) { - return fetchFail(ac.signal.reason); - } - // either we didn't abort, and are still here, or we did, and ignored - const bf = p; - if (this.#valList[index] === p) { - if (v === undefined) { - if (bf.__staleWhileFetching) { - this.#valList[index] = bf.__staleWhileFetching; - } - else { - this.#delete(k, 'fetch'); - } - } - else { - if (options.status) - options.status.fetchUpdated = true; - this.set(k, v, fetchOpts.options); - } - } - return v; - }; - const eb = (er) => { - if (options.status) { - options.status.fetchRejected = true; - options.status.fetchError = er; - } - return fetchFail(er); - }; - const fetchFail = (er) => { - const { aborted } = ac.signal; - const allowStaleAborted = aborted && options.allowStaleOnFetchAbort; - const allowStale = allowStaleAborted || options.allowStaleOnFetchRejection; - const noDelete = allowStale || options.noDeleteOnFetchRejection; - const bf = p; - if (this.#valList[index] === p) { - // if we allow stale on fetch rejections, then we need to ensure that - // the stale value is not removed from the cache when the fetch fails. - const del = !noDelete || bf.__staleWhileFetching === undefined; - if (del) { - this.#delete(k, 'fetch'); - } - else if (!allowStaleAborted) { - // still replace the *promise* with the stale value, - // since we are done with the promise at this point. - // leave it untouched if we're still waiting for an - // aborted background fetch that hasn't yet returned. - this.#valList[index] = bf.__staleWhileFetching; - } - } - if (allowStale) { - if (options.status && bf.__staleWhileFetching !== undefined) { - options.status.returnedStale = true; - } - return bf.__staleWhileFetching; - } - else if (bf.__returned === bf) { - throw er; - } - }; - const pcall = (res, rej) => { - const fmp = this.#fetchMethod?.(k, v, fetchOpts); - if (fmp && fmp instanceof Promise) { - fmp.then(v => res(v === undefined ? undefined : v), rej); - } - // ignored, we go until we finish, regardless. - // defer check until we are actually aborting, - // so fetchMethod can override. - ac.signal.addEventListener('abort', () => { - if (!options.ignoreFetchAbort || - options.allowStaleOnFetchAbort) { - res(undefined); - // when it eventually resolves, update the cache. - if (options.allowStaleOnFetchAbort) { - res = v => cb(v, true); - } - } - }); - }; - if (options.status) - options.status.fetchDispatched = true; - const p = new Promise(pcall).then(cb, eb); - const bf = Object.assign(p, { - __abortController: ac, - __staleWhileFetching: v, - __returned: undefined, - }); - if (index === undefined) { - // internal, don't expose status. - this.set(k, bf, { ...fetchOpts.options, status: undefined }); - index = this.#keyMap.get(k); - } - else { - this.#valList[index] = bf; - } - return bf; - } - #isBackgroundFetch(p) { - if (!this.#hasFetchMethod) - return false; - const b = p; - return (!!b && - b instanceof Promise && - b.hasOwnProperty('__staleWhileFetching') && - b.__abortController instanceof AC); - } - async fetch(k, fetchOptions = {}) { - const { - // get options - allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, - // set options - ttl = this.ttl, noDisposeOnSet = this.noDisposeOnSet, size = 0, sizeCalculation = this.sizeCalculation, noUpdateTTL = this.noUpdateTTL, - // fetch exclusive options - noDeleteOnFetchRejection = this.noDeleteOnFetchRejection, allowStaleOnFetchRejection = this.allowStaleOnFetchRejection, ignoreFetchAbort = this.ignoreFetchAbort, allowStaleOnFetchAbort = this.allowStaleOnFetchAbort, context, forceRefresh = false, status, signal, } = fetchOptions; - if (!this.#hasFetchMethod) { - if (status) - status.fetch = 'get'; - return this.get(k, { - allowStale, - updateAgeOnGet, - noDeleteOnStaleGet, - status, - }); - } - const options = { - allowStale, - updateAgeOnGet, - noDeleteOnStaleGet, - ttl, - noDisposeOnSet, - size, - sizeCalculation, - noUpdateTTL, - noDeleteOnFetchRejection, - allowStaleOnFetchRejection, - allowStaleOnFetchAbort, - ignoreFetchAbort, - status, - signal, - }; - let index = this.#keyMap.get(k); - if (index === undefined) { - if (status) - status.fetch = 'miss'; - const p = this.#backgroundFetch(k, index, options, context); - return (p.__returned = p); - } - else { - // in cache, maybe already fetching - const v = this.#valList[index]; - if (this.#isBackgroundFetch(v)) { - const stale = allowStale && v.__staleWhileFetching !== undefined; - if (status) { - status.fetch = 'inflight'; - if (stale) - status.returnedStale = true; - } - return stale ? v.__staleWhileFetching : (v.__returned = v); - } - // if we force a refresh, that means do NOT serve the cached value, - // unless we are already in the process of refreshing the cache. - const isStale = this.#isStale(index); - if (!forceRefresh && !isStale) { - if (status) - status.fetch = 'hit'; - this.#moveToTail(index); - if (updateAgeOnGet) { - this.#updateItemAge(index); - } - if (status) - this.#statusTTL(status, index); - return v; - } - // ok, it is stale or a forced refresh, and not already fetching. - // refresh the cache. - const p = this.#backgroundFetch(k, index, options, context); - const hasStale = p.__staleWhileFetching !== undefined; - const staleVal = hasStale && allowStale; - if (status) { - status.fetch = isStale ? 'stale' : 'refresh'; - if (staleVal && isStale) - status.returnedStale = true; - } - return staleVal ? p.__staleWhileFetching : (p.__returned = p); - } - } - async forceFetch(k, fetchOptions = {}) { - const v = await this.fetch(k, fetchOptions); - if (v === undefined) - throw new Error('fetch() returned undefined'); - return v; - } - memo(k, memoOptions = {}) { - const memoMethod = this.#memoMethod; - if (!memoMethod) { - throw new Error('no memoMethod provided to constructor'); - } - const { context, forceRefresh, ...options } = memoOptions; - const v = this.get(k, options); - if (!forceRefresh && v !== undefined) - return v; - const vv = memoMethod(k, v, { - options, - context, - }); - this.set(k, vv, options); - return vv; - } - /** - * Return a value from the cache. Will update the recency of the cache - * entry found. - * - * If the key is not found, get() will return `undefined`. - */ - get(k, getOptions = {}) { - const { allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, status, } = getOptions; - const index = this.#keyMap.get(k); - if (index !== undefined) { - const value = this.#valList[index]; - const fetching = this.#isBackgroundFetch(value); - if (status) - this.#statusTTL(status, index); - if (this.#isStale(index)) { - if (status) - status.get = 'stale'; - // delete only if not an in-flight background fetch - if (!fetching) { - if (!noDeleteOnStaleGet) { - this.#delete(k, 'expire'); - } - if (status && allowStale) - status.returnedStale = true; - return allowStale ? value : undefined; - } - else { - if (status && - allowStale && - value.__staleWhileFetching !== undefined) { - status.returnedStale = true; - } - return allowStale ? value.__staleWhileFetching : undefined; - } - } - else { - if (status) - status.get = 'hit'; - // if we're currently fetching it, we don't actually have it yet - // it's not stale, which means this isn't a staleWhileRefetching. - // If it's not stale, and fetching, AND has a __staleWhileFetching - // value, then that means the user fetched with {forceRefresh:true}, - // so it's safe to return that value. - if (fetching) { - return value.__staleWhileFetching; - } - this.#moveToTail(index); - if (updateAgeOnGet) { - this.#updateItemAge(index); - } - return value; - } - } - else if (status) { - status.get = 'miss'; - } - } - #connect(p, n) { - this.#prev[n] = p; - this.#next[p] = n; - } - #moveToTail(index) { - // if tail already, nothing to do - // if head, move head to next[index] - // else - // move next[prev[index]] to next[index] (head has no prev) - // move prev[next[index]] to prev[index] - // prev[index] = tail - // next[tail] = index - // tail = index - if (index !== this.#tail) { - if (index === this.#head) { - this.#head = this.#next[index]; - } - else { - this.#connect(this.#prev[index], this.#next[index]); - } - this.#connect(this.#tail, index); - this.#tail = index; - } - } - /** - * Deletes a key out of the cache. - * - * Returns true if the key was deleted, false otherwise. - */ - delete(k) { - return this.#delete(k, 'delete'); - } - #delete(k, reason) { - let deleted = false; - if (this.#size !== 0) { - const index = this.#keyMap.get(k); - if (index !== undefined) { - deleted = true; - if (this.#size === 1) { - this.#clear(reason); - } - else { - this.#removeItemSize(index); - const v = this.#valList[index]; - if (this.#isBackgroundFetch(v)) { - v.__abortController.abort(new Error('deleted')); - } - else if (this.#hasDispose || this.#hasDisposeAfter) { - if (this.#hasDispose) { - this.#dispose?.(v, k, reason); - } - if (this.#hasDisposeAfter) { - this.#disposed?.push([v, k, reason]); - } - } - this.#keyMap.delete(k); - this.#keyList[index] = undefined; - this.#valList[index] = undefined; - if (index === this.#tail) { - this.#tail = this.#prev[index]; - } - else if (index === this.#head) { - this.#head = this.#next[index]; - } - else { - const pi = this.#prev[index]; - this.#next[pi] = this.#next[index]; - const ni = this.#next[index]; - this.#prev[ni] = this.#prev[index]; - } - this.#size--; - this.#free.push(index); - } - } - } - if (this.#hasDisposeAfter && this.#disposed?.length) { - const dt = this.#disposed; - let task; - while ((task = dt?.shift())) { - this.#disposeAfter?.(...task); - } - } - return deleted; - } - /** - * Clear the cache entirely, throwing away all values. - */ - clear() { - return this.#clear('delete'); - } - #clear(reason) { - for (const index of this.#rindexes({ allowStale: true })) { - const v = this.#valList[index]; - if (this.#isBackgroundFetch(v)) { - v.__abortController.abort(new Error('deleted')); - } - else { - const k = this.#keyList[index]; - if (this.#hasDispose) { - this.#dispose?.(v, k, reason); - } - if (this.#hasDisposeAfter) { - this.#disposed?.push([v, k, reason]); - } - } - } - this.#keyMap.clear(); - this.#valList.fill(undefined); - this.#keyList.fill(undefined); - if (this.#ttls && this.#starts) { - this.#ttls.fill(0); - this.#starts.fill(0); - } - if (this.#sizes) { - this.#sizes.fill(0); - } - this.#head = 0; - this.#tail = 0; - this.#free.length = 0; - this.#calculatedSize = 0; - this.#size = 0; - if (this.#hasDisposeAfter && this.#disposed) { - const dt = this.#disposed; - let task; - while ((task = dt?.shift())) { - this.#disposeAfter?.(...task); - } - } - } -} -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/lru-cache/dist/esm/index.min.js b/deps/npm/node_modules/node-gyp/node_modules/lru-cache/dist/esm/index.min.js deleted file mode 100644 index 4571d0254e27d7..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/lru-cache/dist/esm/index.min.js +++ /dev/null @@ -1,2 +0,0 @@ -var G=(l,t,e)=>{if(!t.has(l))throw TypeError("Cannot "+e)};var I=(l,t,e)=>(G(l,t,"read from private field"),e?e.call(l):t.get(l)),j=(l,t,e)=>{if(t.has(l))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(l):t.set(l,e)},x=(l,t,e,i)=>(G(l,t,"write to private field"),i?i.call(l,e):t.set(l,e),e);var T=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date,P=new Set,M=typeof process=="object"&&process?process:{},H=(l,t,e,i)=>{typeof M.emitWarning=="function"?M.emitWarning(l,t,e,i):console.error(`[${e}] ${t}: ${l}`)},W=globalThis.AbortController,N=globalThis.AbortSignal;if(typeof W>"u"){N=class{onabort;_onabort=[];reason;aborted=!1;addEventListener(i,s){this._onabort.push(s)}},W=class{constructor(){t()}signal=new N;abort(i){if(!this.signal.aborted){this.signal.reason=i,this.signal.aborted=!0;for(let s of this.signal._onabort)s(i);this.signal.onabort?.(i)}}};let l=M.env?.LRU_CACHE_IGNORE_AC_WARNING!=="1",t=()=>{l&&(l=!1,H("AbortController is not defined. If using lru-cache in node 14, load an AbortController polyfill from the `node-abort-controller` package. A minimal polyfill is provided for use by LRUCache.fetch(), but it should not be relied upon in other contexts (eg, passing it to other APIs that use AbortController/AbortSignal might have undesirable effects). You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.","NO_ABORT_CONTROLLER","ENOTSUP",t))}}var V=l=>!P.has(l),Y=Symbol("type"),A=l=>l&&l===Math.floor(l)&&l>0&&isFinite(l),k=l=>A(l)?l<=Math.pow(2,8)?Uint8Array:l<=Math.pow(2,16)?Uint16Array:l<=Math.pow(2,32)?Uint32Array:l<=Number.MAX_SAFE_INTEGER?O:null:null,O=class extends Array{constructor(t){super(t),this.fill(0)}},z,E=class{heap;length;static create(t){let e=k(t);if(!e)return[];x(E,z,!0);let i=new E(t,e);return x(E,z,!1),i}constructor(t,e){if(!I(E,z))throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new e(t),this.length=0}push(t){this.heap[this.length++]=t}pop(){return this.heap[--this.length]}},R=E;z=new WeakMap,j(R,z,!1);var D=class{#g;#f;#p;#w;#R;#W;ttl;ttlResolution;ttlAutopurge;updateAgeOnGet;updateAgeOnHas;allowStale;noDisposeOnSet;noUpdateTTL;maxEntrySize;sizeCalculation;noDeleteOnFetchRejection;noDeleteOnStaleGet;allowStaleOnFetchAbort;allowStaleOnFetchRejection;ignoreFetchAbort;#n;#S;#s;#i;#t;#l;#c;#o;#h;#_;#r;#m;#b;#u;#y;#O;#a;static unsafeExposeInternals(t){return{starts:t.#b,ttls:t.#u,sizes:t.#m,keyMap:t.#s,keyList:t.#i,valList:t.#t,next:t.#l,prev:t.#c,get head(){return t.#o},get tail(){return t.#h},free:t.#_,isBackgroundFetch:e=>t.#e(e),backgroundFetch:(e,i,s,n)=>t.#x(e,i,s,n),moveToTail:e=>t.#C(e),indexes:e=>t.#A(e),rindexes:e=>t.#F(e),isStale:e=>t.#d(e)}}get max(){return this.#g}get maxSize(){return this.#f}get calculatedSize(){return this.#S}get size(){return this.#n}get fetchMethod(){return this.#R}get memoMethod(){return this.#W}get dispose(){return this.#p}get disposeAfter(){return this.#w}constructor(t){let{max:e=0,ttl:i,ttlResolution:s=1,ttlAutopurge:n,updateAgeOnGet:h,updateAgeOnHas:o,allowStale:r,dispose:g,disposeAfter:m,noDisposeOnSet:f,noUpdateTTL:u,maxSize:c=0,maxEntrySize:F=0,sizeCalculation:d,fetchMethod:S,memoMethod:a,noDeleteOnFetchRejection:w,noDeleteOnStaleGet:b,allowStaleOnFetchRejection:p,allowStaleOnFetchAbort:_,ignoreFetchAbort:v}=t;if(e!==0&&!A(e))throw new TypeError("max option must be a nonnegative integer");let y=e?k(e):Array;if(!y)throw new Error("invalid max value: "+e);if(this.#g=e,this.#f=c,this.maxEntrySize=F||this.#f,this.sizeCalculation=d,this.sizeCalculation){if(!this.#f&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if(typeof this.sizeCalculation!="function")throw new TypeError("sizeCalculation set to non-function")}if(a!==void 0&&typeof a!="function")throw new TypeError("memoMethod must be a function if defined");if(this.#W=a,S!==void 0&&typeof S!="function")throw new TypeError("fetchMethod must be a function if specified");if(this.#R=S,this.#O=!!S,this.#s=new Map,this.#i=new Array(e).fill(void 0),this.#t=new Array(e).fill(void 0),this.#l=new y(e),this.#c=new y(e),this.#o=0,this.#h=0,this.#_=R.create(e),this.#n=0,this.#S=0,typeof g=="function"&&(this.#p=g),typeof m=="function"?(this.#w=m,this.#r=[]):(this.#w=void 0,this.#r=void 0),this.#y=!!this.#p,this.#a=!!this.#w,this.noDisposeOnSet=!!f,this.noUpdateTTL=!!u,this.noDeleteOnFetchRejection=!!w,this.allowStaleOnFetchRejection=!!p,this.allowStaleOnFetchAbort=!!_,this.ignoreFetchAbort=!!v,this.maxEntrySize!==0){if(this.#f!==0&&!A(this.#f))throw new TypeError("maxSize must be a positive integer if specified");if(!A(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");this.#P()}if(this.allowStale=!!r,this.noDeleteOnStaleGet=!!b,this.updateAgeOnGet=!!h,this.updateAgeOnHas=!!o,this.ttlResolution=A(s)||s===0?s:1,this.ttlAutopurge=!!n,this.ttl=i||0,this.ttl){if(!A(this.ttl))throw new TypeError("ttl must be a positive integer if specified");this.#M()}if(this.#g===0&&this.ttl===0&&this.#f===0)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!this.#g&&!this.#f){let C="LRU_CACHE_UNBOUNDED";V(C)&&(P.add(C),H("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",C,D))}}getRemainingTTL(t){return this.#s.has(t)?1/0:0}#M(){let t=new O(this.#g),e=new O(this.#g);this.#u=t,this.#b=e,this.#U=(n,h,o=T.now())=>{if(e[n]=h!==0?o:0,t[n]=h,h!==0&&this.ttlAutopurge){let r=setTimeout(()=>{this.#d(n)&&this.#T(this.#i[n],"expire")},h+1);r.unref&&r.unref()}},this.#z=n=>{e[n]=t[n]!==0?T.now():0},this.#E=(n,h)=>{if(t[h]){let o=t[h],r=e[h];if(!o||!r)return;n.ttl=o,n.start=r,n.now=i||s();let g=n.now-r;n.remainingTTL=o-g}};let i=0,s=()=>{let n=T.now();if(this.ttlResolution>0){i=n;let h=setTimeout(()=>i=0,this.ttlResolution);h.unref&&h.unref()}return n};this.getRemainingTTL=n=>{let h=this.#s.get(n);if(h===void 0)return 0;let o=t[h],r=e[h];if(!o||!r)return 1/0;let g=(i||s())-r;return o-g},this.#d=n=>{let h=e[n],o=t[n];return!!o&&!!h&&(i||s())-h>o}}#z=()=>{};#E=()=>{};#U=()=>{};#d=()=>!1;#P(){let t=new O(this.#g);this.#S=0,this.#m=t,this.#v=e=>{this.#S-=t[e],t[e]=0},this.#G=(e,i,s,n)=>{if(this.#e(i))return 0;if(!A(s))if(n){if(typeof n!="function")throw new TypeError("sizeCalculation must be a function");if(s=n(i,e),!A(s))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}else throw new TypeError("invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.");return s},this.#D=(e,i,s)=>{if(t[e]=i,this.#f){let n=this.#f-t[e];for(;this.#S>n;)this.#L(!0)}this.#S+=t[e],s&&(s.entrySize=i,s.totalCalculatedSize=this.#S)}}#v=t=>{};#D=(t,e,i)=>{};#G=(t,e,i,s)=>{if(i||s)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0};*#A({allowStale:t=this.allowStale}={}){if(this.#n)for(let e=this.#h;!(!this.#I(e)||((t||!this.#d(e))&&(yield e),e===this.#o));)e=this.#c[e]}*#F({allowStale:t=this.allowStale}={}){if(this.#n)for(let e=this.#o;!(!this.#I(e)||((t||!this.#d(e))&&(yield e),e===this.#h));)e=this.#l[e]}#I(t){return t!==void 0&&this.#s.get(this.#i[t])===t}*entries(){for(let t of this.#A())this.#t[t]!==void 0&&this.#i[t]!==void 0&&!this.#e(this.#t[t])&&(yield[this.#i[t],this.#t[t]])}*rentries(){for(let t of this.#F())this.#t[t]!==void 0&&this.#i[t]!==void 0&&!this.#e(this.#t[t])&&(yield[this.#i[t],this.#t[t]])}*keys(){for(let t of this.#A()){let e=this.#i[t];e!==void 0&&!this.#e(this.#t[t])&&(yield e)}}*rkeys(){for(let t of this.#F()){let e=this.#i[t];e!==void 0&&!this.#e(this.#t[t])&&(yield e)}}*values(){for(let t of this.#A())this.#t[t]!==void 0&&!this.#e(this.#t[t])&&(yield this.#t[t])}*rvalues(){for(let t of this.#F())this.#t[t]!==void 0&&!this.#e(this.#t[t])&&(yield this.#t[t])}[Symbol.iterator](){return this.entries()}[Symbol.toStringTag]="LRUCache";find(t,e={}){for(let i of this.#A()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;if(n!==void 0&&t(n,this.#i[i],this))return this.get(this.#i[i],e)}}forEach(t,e=this){for(let i of this.#A()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;n!==void 0&&t.call(e,n,this.#i[i],this)}}rforEach(t,e=this){for(let i of this.#F()){let s=this.#t[i],n=this.#e(s)?s.__staleWhileFetching:s;n!==void 0&&t.call(e,n,this.#i[i],this)}}purgeStale(){let t=!1;for(let e of this.#F({allowStale:!0}))this.#d(e)&&(this.#T(this.#i[e],"expire"),t=!0);return t}info(t){let e=this.#s.get(t);if(e===void 0)return;let i=this.#t[e],s=this.#e(i)?i.__staleWhileFetching:i;if(s===void 0)return;let n={value:s};if(this.#u&&this.#b){let h=this.#u[e],o=this.#b[e];if(h&&o){let r=h-(T.now()-o);n.ttl=r,n.start=Date.now()}}return this.#m&&(n.size=this.#m[e]),n}dump(){let t=[];for(let e of this.#A({allowStale:!0})){let i=this.#i[e],s=this.#t[e],n=this.#e(s)?s.__staleWhileFetching:s;if(n===void 0||i===void 0)continue;let h={value:n};if(this.#u&&this.#b){h.ttl=this.#u[e];let o=T.now()-this.#b[e];h.start=Math.floor(Date.now()-o)}this.#m&&(h.size=this.#m[e]),t.unshift([i,h])}return t}load(t){this.clear();for(let[e,i]of t){if(i.start){let s=Date.now()-i.start;i.start=T.now()-s}this.set(e,i.value,i)}}set(t,e,i={}){if(e===void 0)return this.delete(t),this;let{ttl:s=this.ttl,start:n,noDisposeOnSet:h=this.noDisposeOnSet,sizeCalculation:o=this.sizeCalculation,status:r}=i,{noUpdateTTL:g=this.noUpdateTTL}=i,m=this.#G(t,e,i.size||0,o);if(this.maxEntrySize&&m>this.maxEntrySize)return r&&(r.set="miss",r.maxEntrySizeExceeded=!0),this.#T(t,"set"),this;let f=this.#n===0?void 0:this.#s.get(t);if(f===void 0)f=this.#n===0?this.#h:this.#_.length!==0?this.#_.pop():this.#n===this.#g?this.#L(!1):this.#n,this.#i[f]=t,this.#t[f]=e,this.#s.set(t,f),this.#l[this.#h]=f,this.#c[f]=this.#h,this.#h=f,this.#n++,this.#D(f,m,r),r&&(r.set="add"),g=!1;else{this.#C(f);let u=this.#t[f];if(e!==u){if(this.#O&&this.#e(u)){u.__abortController.abort(new Error("replaced"));let{__staleWhileFetching:c}=u;c!==void 0&&!h&&(this.#y&&this.#p?.(c,t,"set"),this.#a&&this.#r?.push([c,t,"set"]))}else h||(this.#y&&this.#p?.(u,t,"set"),this.#a&&this.#r?.push([u,t,"set"]));if(this.#v(f),this.#D(f,m,r),this.#t[f]=e,r){r.set="replace";let c=u&&this.#e(u)?u.__staleWhileFetching:u;c!==void 0&&(r.oldValue=c)}}else r&&(r.set="update")}if(s!==0&&!this.#u&&this.#M(),this.#u&&(g||this.#U(f,s,n),r&&this.#E(r,f)),!h&&this.#a&&this.#r){let u=this.#r,c;for(;c=u?.shift();)this.#w?.(...c)}return this}pop(){try{for(;this.#n;){let t=this.#t[this.#o];if(this.#L(!0),this.#e(t)){if(t.__staleWhileFetching)return t.__staleWhileFetching}else if(t!==void 0)return t}}finally{if(this.#a&&this.#r){let t=this.#r,e;for(;e=t?.shift();)this.#w?.(...e)}}}#L(t){let e=this.#o,i=this.#i[e],s=this.#t[e];return this.#O&&this.#e(s)?s.__abortController.abort(new Error("evicted")):(this.#y||this.#a)&&(this.#y&&this.#p?.(s,i,"evict"),this.#a&&this.#r?.push([s,i,"evict"])),this.#v(e),t&&(this.#i[e]=void 0,this.#t[e]=void 0,this.#_.push(e)),this.#n===1?(this.#o=this.#h=0,this.#_.length=0):this.#o=this.#l[e],this.#s.delete(i),this.#n--,e}has(t,e={}){let{updateAgeOnHas:i=this.updateAgeOnHas,status:s}=e,n=this.#s.get(t);if(n!==void 0){let h=this.#t[n];if(this.#e(h)&&h.__staleWhileFetching===void 0)return!1;if(this.#d(n))s&&(s.has="stale",this.#E(s,n));else return i&&this.#z(n),s&&(s.has="hit",this.#E(s,n)),!0}else s&&(s.has="miss");return!1}peek(t,e={}){let{allowStale:i=this.allowStale}=e,s=this.#s.get(t);if(s===void 0||!i&&this.#d(s))return;let n=this.#t[s];return this.#e(n)?n.__staleWhileFetching:n}#x(t,e,i,s){let n=e===void 0?void 0:this.#t[e];if(this.#e(n))return n;let h=new W,{signal:o}=i;o?.addEventListener("abort",()=>h.abort(o.reason),{signal:h.signal});let r={signal:h.signal,options:i,context:s},g=(d,S=!1)=>{let{aborted:a}=h.signal,w=i.ignoreFetchAbort&&d!==void 0;if(i.status&&(a&&!S?(i.status.fetchAborted=!0,i.status.fetchError=h.signal.reason,w&&(i.status.fetchAbortIgnored=!0)):i.status.fetchResolved=!0),a&&!w&&!S)return f(h.signal.reason);let b=c;return this.#t[e]===c&&(d===void 0?b.__staleWhileFetching?this.#t[e]=b.__staleWhileFetching:this.#T(t,"fetch"):(i.status&&(i.status.fetchUpdated=!0),this.set(t,d,r.options))),d},m=d=>(i.status&&(i.status.fetchRejected=!0,i.status.fetchError=d),f(d)),f=d=>{let{aborted:S}=h.signal,a=S&&i.allowStaleOnFetchAbort,w=a||i.allowStaleOnFetchRejection,b=w||i.noDeleteOnFetchRejection,p=c;if(this.#t[e]===c&&(!b||p.__staleWhileFetching===void 0?this.#T(t,"fetch"):a||(this.#t[e]=p.__staleWhileFetching)),w)return i.status&&p.__staleWhileFetching!==void 0&&(i.status.returnedStale=!0),p.__staleWhileFetching;if(p.__returned===p)throw d},u=(d,S)=>{let a=this.#R?.(t,n,r);a&&a instanceof Promise&&a.then(w=>d(w===void 0?void 0:w),S),h.signal.addEventListener("abort",()=>{(!i.ignoreFetchAbort||i.allowStaleOnFetchAbort)&&(d(void 0),i.allowStaleOnFetchAbort&&(d=w=>g(w,!0)))})};i.status&&(i.status.fetchDispatched=!0);let c=new Promise(u).then(g,m),F=Object.assign(c,{__abortController:h,__staleWhileFetching:n,__returned:void 0});return e===void 0?(this.set(t,F,{...r.options,status:void 0}),e=this.#s.get(t)):this.#t[e]=F,F}#e(t){if(!this.#O)return!1;let e=t;return!!e&&e instanceof Promise&&e.hasOwnProperty("__staleWhileFetching")&&e.__abortController instanceof W}async fetch(t,e={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet,ttl:h=this.ttl,noDisposeOnSet:o=this.noDisposeOnSet,size:r=0,sizeCalculation:g=this.sizeCalculation,noUpdateTTL:m=this.noUpdateTTL,noDeleteOnFetchRejection:f=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:u=this.allowStaleOnFetchRejection,ignoreFetchAbort:c=this.ignoreFetchAbort,allowStaleOnFetchAbort:F=this.allowStaleOnFetchAbort,context:d,forceRefresh:S=!1,status:a,signal:w}=e;if(!this.#O)return a&&(a.fetch="get"),this.get(t,{allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:n,status:a});let b={allowStale:i,updateAgeOnGet:s,noDeleteOnStaleGet:n,ttl:h,noDisposeOnSet:o,size:r,sizeCalculation:g,noUpdateTTL:m,noDeleteOnFetchRejection:f,allowStaleOnFetchRejection:u,allowStaleOnFetchAbort:F,ignoreFetchAbort:c,status:a,signal:w},p=this.#s.get(t);if(p===void 0){a&&(a.fetch="miss");let _=this.#x(t,p,b,d);return _.__returned=_}else{let _=this.#t[p];if(this.#e(_)){let U=i&&_.__staleWhileFetching!==void 0;return a&&(a.fetch="inflight",U&&(a.returnedStale=!0)),U?_.__staleWhileFetching:_.__returned=_}let v=this.#d(p);if(!S&&!v)return a&&(a.fetch="hit"),this.#C(p),s&&this.#z(p),a&&this.#E(a,p),_;let y=this.#x(t,p,b,d),L=y.__staleWhileFetching!==void 0&&i;return a&&(a.fetch=v?"stale":"refresh",L&&v&&(a.returnedStale=!0)),L?y.__staleWhileFetching:y.__returned=y}}async forceFetch(t,e={}){let i=await this.fetch(t,e);if(i===void 0)throw new Error("fetch() returned undefined");return i}memo(t,e={}){let i=this.#W;if(!i)throw new Error("no memoMethod provided to constructor");let{context:s,forceRefresh:n,...h}=e,o=this.get(t,h);if(!n&&o!==void 0)return o;let r=i(t,o,{options:h,context:s});return this.set(t,r,h),r}get(t,e={}){let{allowStale:i=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet,status:h}=e,o=this.#s.get(t);if(o!==void 0){let r=this.#t[o],g=this.#e(r);return h&&this.#E(h,o),this.#d(o)?(h&&(h.get="stale"),g?(h&&i&&r.__staleWhileFetching!==void 0&&(h.returnedStale=!0),i?r.__staleWhileFetching:void 0):(n||this.#T(t,"expire"),h&&i&&(h.returnedStale=!0),i?r:void 0)):(h&&(h.get="hit"),g?r.__staleWhileFetching:(this.#C(o),s&&this.#z(o),r))}else h&&(h.get="miss")}#j(t,e){this.#c[e]=t,this.#l[t]=e}#C(t){t!==this.#h&&(t===this.#o?this.#o=this.#l[t]:this.#j(this.#c[t],this.#l[t]),this.#j(this.#h,t),this.#h=t)}delete(t){return this.#T(t,"delete")}#T(t,e){let i=!1;if(this.#n!==0){let s=this.#s.get(t);if(s!==void 0)if(i=!0,this.#n===1)this.#N(e);else{this.#v(s);let n=this.#t[s];if(this.#e(n)?n.__abortController.abort(new Error("deleted")):(this.#y||this.#a)&&(this.#y&&this.#p?.(n,t,e),this.#a&&this.#r?.push([n,t,e])),this.#s.delete(t),this.#i[s]=void 0,this.#t[s]=void 0,s===this.#h)this.#h=this.#c[s];else if(s===this.#o)this.#o=this.#l[s];else{let h=this.#c[s];this.#l[h]=this.#l[s];let o=this.#l[s];this.#c[o]=this.#c[s]}this.#n--,this.#_.push(s)}}if(this.#a&&this.#r?.length){let s=this.#r,n;for(;n=s?.shift();)this.#w?.(...n)}return i}clear(){return this.#N("delete")}#N(t){for(let e of this.#F({allowStale:!0})){let i=this.#t[e];if(this.#e(i))i.__abortController.abort(new Error("deleted"));else{let s=this.#i[e];this.#y&&this.#p?.(i,s,t),this.#a&&this.#r?.push([i,s,t])}}if(this.#s.clear(),this.#t.fill(void 0),this.#i.fill(void 0),this.#u&&this.#b&&(this.#u.fill(0),this.#b.fill(0)),this.#m&&this.#m.fill(0),this.#o=0,this.#h=0,this.#_.length=0,this.#S=0,this.#n=0,this.#a&&this.#r){let e=this.#r,i;for(;i=e?.shift();)this.#w?.(...i)}}};export{D as LRUCache}; -//# sourceMappingURL=index.min.js.map diff --git a/deps/npm/node_modules/node-gyp/node_modules/lru-cache/dist/esm/package.json b/deps/npm/node_modules/node-gyp/node_modules/lru-cache/dist/esm/package.json deleted file mode 100644 index 3dbc1ca591c055..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/lru-cache/dist/esm/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "module" -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/lru-cache/package.json b/deps/npm/node_modules/node-gyp/node_modules/lru-cache/package.json deleted file mode 100644 index f3cd4c0cc53f7e..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/lru-cache/package.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "name": "lru-cache", - "publishConfig": { - "tag": "legacy-v10" - }, - "description": "A cache object that deletes the least-recently-used items.", - "version": "10.4.3", - "author": "Isaac Z. Schlueter ", - "keywords": [ - "mru", - "lru", - "cache" - ], - "sideEffects": false, - "scripts": { - "build": "npm run prepare", - "prepare": "tshy && bash fixup.sh", - "pretest": "npm run prepare", - "presnap": "npm run prepare", - "test": "tap", - "snap": "tap", - "preversion": "npm test", - "postversion": "npm publish", - "prepublishOnly": "git push origin --follow-tags", - "format": "prettier --write .", - "typedoc": "typedoc --tsconfig ./.tshy/esm.json ./src/*.ts", - "benchmark-results-typedoc": "bash scripts/benchmark-results-typedoc.sh", - "prebenchmark": "npm run prepare", - "benchmark": "make -C benchmark", - "preprofile": "npm run prepare", - "profile": "make -C benchmark profile" - }, - "main": "./dist/commonjs/index.js", - "types": "./dist/commonjs/index.d.ts", - "tshy": { - "exports": { - ".": "./src/index.ts", - "./min": { - "import": { - "types": "./dist/esm/index.d.ts", - "default": "./dist/esm/index.min.js" - }, - "require": { - "types": "./dist/commonjs/index.d.ts", - "default": "./dist/commonjs/index.min.js" - } - } - } - }, - "repository": { - "type": "git", - "url": "git://github.com/isaacs/node-lru-cache.git" - }, - "devDependencies": { - "@types/node": "^20.2.5", - "@types/tap": "^15.0.6", - "benchmark": "^2.1.4", - "esbuild": "^0.17.11", - "eslint-config-prettier": "^8.5.0", - "marked": "^4.2.12", - "mkdirp": "^2.1.5", - "prettier": "^2.6.2", - "tap": "^20.0.3", - "tshy": "^2.0.0", - "tslib": "^2.4.0", - "typedoc": "^0.25.3", - "typescript": "^5.2.2" - }, - "license": "ISC", - "files": [ - "dist" - ], - "prettier": { - "semi": false, - "printWidth": 70, - "tabWidth": 2, - "useTabs": false, - "singleQuote": true, - "jsxSingleQuote": false, - "bracketSameLine": true, - "arrowParens": "avoid", - "endOfLine": "lf" - }, - "tap": { - "node-arg": [ - "--expose-gc" - ], - "plugin": [ - "@tapjs/clock" - ] - }, - "exports": { - ".": { - "import": { - "types": "./dist/esm/index.d.ts", - "default": "./dist/esm/index.js" - }, - "require": { - "types": "./dist/commonjs/index.d.ts", - "default": "./dist/commonjs/index.js" - } - }, - "./min": { - "import": { - "types": "./dist/esm/index.d.ts", - "default": "./dist/esm/index.min.js" - }, - "require": { - "types": "./dist/commonjs/index.d.ts", - "default": "./dist/commonjs/index.min.js" - } - } - }, - "type": "module", - "module": "./dist/esm/index.js" -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/LICENSE b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/LICENSE deleted file mode 100644 index 1808eb2844231c..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/LICENSE +++ /dev/null @@ -1,16 +0,0 @@ -ISC License - -Copyright 2017-2022 (c) npm, Inc. - -Permission to use, copy, modify, and/or distribute this software for -any purpose with or without fee is hereby granted, provided that the -above copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE COPYRIGHT HOLDER DISCLAIMS -ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR -CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE -USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/entry.js b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/entry.js deleted file mode 100644 index bfcfacbcc95e18..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/entry.js +++ /dev/null @@ -1,471 +0,0 @@ -const { Request, Response } = require('minipass-fetch') -const { Minipass } = require('minipass') -const MinipassFlush = require('minipass-flush') -const cacache = require('cacache') -const url = require('url') - -const CachingMinipassPipeline = require('../pipeline.js') -const CachePolicy = require('./policy.js') -const cacheKey = require('./key.js') -const remote = require('../remote.js') - -const hasOwnProperty = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop) - -// allow list for request headers that will be written to the cache index -// note: we will also store any request headers -// that are named in a response's vary header -const KEEP_REQUEST_HEADERS = [ - 'accept-charset', - 'accept-encoding', - 'accept-language', - 'accept', - 'cache-control', -] - -// allow list for response headers that will be written to the cache index -// note: we must not store the real response's age header, or when we load -// a cache policy based on the metadata it will think the cached response -// is always stale -const KEEP_RESPONSE_HEADERS = [ - 'cache-control', - 'content-encoding', - 'content-language', - 'content-type', - 'date', - 'etag', - 'expires', - 'last-modified', - 'link', - 'location', - 'pragma', - 'vary', -] - -// return an object containing all metadata to be written to the index -const getMetadata = (request, response, options) => { - const metadata = { - time: Date.now(), - url: request.url, - reqHeaders: {}, - resHeaders: {}, - - // options on which we must match the request and vary the response - options: { - compress: options.compress != null ? options.compress : request.compress, - }, - } - - // only save the status if it's not a 200 or 304 - if (response.status !== 200 && response.status !== 304) { - metadata.status = response.status - } - - for (const name of KEEP_REQUEST_HEADERS) { - if (request.headers.has(name)) { - metadata.reqHeaders[name] = request.headers.get(name) - } - } - - // if the request's host header differs from the host in the url - // we need to keep it, otherwise it's just noise and we ignore it - const host = request.headers.get('host') - const parsedUrl = new url.URL(request.url) - if (host && parsedUrl.host !== host) { - metadata.reqHeaders.host = host - } - - // if the response has a vary header, make sure - // we store the relevant request headers too - if (response.headers.has('vary')) { - const vary = response.headers.get('vary') - // a vary of "*" means every header causes a different response. - // in that scenario, we do not include any additional headers - // as the freshness check will always fail anyway and we don't - // want to bloat the cache indexes - if (vary !== '*') { - // copy any other request headers that will vary the response - const varyHeaders = vary.trim().toLowerCase().split(/\s*,\s*/) - for (const name of varyHeaders) { - if (request.headers.has(name)) { - metadata.reqHeaders[name] = request.headers.get(name) - } - } - } - } - - for (const name of KEEP_RESPONSE_HEADERS) { - if (response.headers.has(name)) { - metadata.resHeaders[name] = response.headers.get(name) - } - } - - for (const name of options.cacheAdditionalHeaders) { - if (response.headers.has(name)) { - metadata.resHeaders[name] = response.headers.get(name) - } - } - - return metadata -} - -// symbols used to hide objects that may be lazily evaluated in a getter -const _request = Symbol('request') -const _response = Symbol('response') -const _policy = Symbol('policy') - -class CacheEntry { - constructor ({ entry, request, response, options }) { - if (entry) { - this.key = entry.key - this.entry = entry - // previous versions of this module didn't write an explicit timestamp in - // the metadata, so fall back to the entry's timestamp. we can't use the - // entry timestamp to determine staleness because cacache will update it - // when it verifies its data - this.entry.metadata.time = this.entry.metadata.time || this.entry.time - } else { - this.key = cacheKey(request) - } - - this.options = options - - // these properties are behind getters that lazily evaluate - this[_request] = request - this[_response] = response - this[_policy] = null - } - - // returns a CacheEntry instance that satisfies the given request - // or undefined if no existing entry satisfies - static async find (request, options) { - try { - // compacts the index and returns an array of unique entries - var matches = await cacache.index.compact(options.cachePath, cacheKey(request), (A, B) => { - const entryA = new CacheEntry({ entry: A, options }) - const entryB = new CacheEntry({ entry: B, options }) - return entryA.policy.satisfies(entryB.request) - }, { - validateEntry: (entry) => { - // clean out entries with a buggy content-encoding value - if (entry.metadata && - entry.metadata.resHeaders && - entry.metadata.resHeaders['content-encoding'] === null) { - return false - } - - // if an integrity is null, it needs to have a status specified - if (entry.integrity === null) { - return !!(entry.metadata && entry.metadata.status) - } - - return true - }, - }) - } catch (err) { - // if the compact request fails, ignore the error and return - return - } - - // a cache mode of 'reload' means to behave as though we have no cache - // on the way to the network. return undefined to allow cacheFetch to - // create a brand new request no matter what. - if (options.cache === 'reload') { - return - } - - // find the specific entry that satisfies the request - let match - for (const entry of matches) { - const _entry = new CacheEntry({ - entry, - options, - }) - - if (_entry.policy.satisfies(request)) { - match = _entry - break - } - } - - return match - } - - // if the user made a PUT/POST/PATCH then we invalidate our - // cache for the same url by deleting the index entirely - static async invalidate (request, options) { - const key = cacheKey(request) - try { - await cacache.rm.entry(options.cachePath, key, { removeFully: true }) - } catch (err) { - // ignore errors - } - } - - get request () { - if (!this[_request]) { - this[_request] = new Request(this.entry.metadata.url, { - method: 'GET', - headers: this.entry.metadata.reqHeaders, - ...this.entry.metadata.options, - }) - } - - return this[_request] - } - - get response () { - if (!this[_response]) { - this[_response] = new Response(null, { - url: this.entry.metadata.url, - counter: this.options.counter, - status: this.entry.metadata.status || 200, - headers: { - ...this.entry.metadata.resHeaders, - 'content-length': this.entry.size, - }, - }) - } - - return this[_response] - } - - get policy () { - if (!this[_policy]) { - this[_policy] = new CachePolicy({ - entry: this.entry, - request: this.request, - response: this.response, - options: this.options, - }) - } - - return this[_policy] - } - - // wraps the response in a pipeline that stores the data - // in the cache while the user consumes it - async store (status) { - // if we got a status other than 200, 301, or 308, - // or the CachePolicy forbid storage, append the - // cache status header and return it untouched - if ( - this.request.method !== 'GET' || - ![200, 301, 308].includes(this.response.status) || - !this.policy.storable() - ) { - this.response.headers.set('x-local-cache-status', 'skip') - return this.response - } - - const size = this.response.headers.get('content-length') - const cacheOpts = { - algorithms: this.options.algorithms, - metadata: getMetadata(this.request, this.response, this.options), - size, - integrity: this.options.integrity, - integrityEmitter: this.response.body.hasIntegrityEmitter && this.response.body, - } - - let body = null - // we only set a body if the status is a 200, redirects are - // stored as metadata only - if (this.response.status === 200) { - let cacheWriteResolve, cacheWriteReject - const cacheWritePromise = new Promise((resolve, reject) => { - cacheWriteResolve = resolve - cacheWriteReject = reject - }).catch((err) => { - body.emit('error', err) - }) - - body = new CachingMinipassPipeline({ events: ['integrity', 'size'] }, new MinipassFlush({ - flush () { - return cacheWritePromise - }, - })) - // this is always true since if we aren't reusing the one from the remote fetch, we - // are using the one from cacache - body.hasIntegrityEmitter = true - - const onResume = () => { - const tee = new Minipass() - const cacheStream = cacache.put.stream(this.options.cachePath, this.key, cacheOpts) - // re-emit the integrity and size events on our new response body so they can be reused - cacheStream.on('integrity', i => body.emit('integrity', i)) - cacheStream.on('size', s => body.emit('size', s)) - // stick a flag on here so downstream users will know if they can expect integrity events - tee.pipe(cacheStream) - // TODO if the cache write fails, log a warning but return the response anyway - // eslint-disable-next-line promise/catch-or-return - cacheStream.promise().then(cacheWriteResolve, cacheWriteReject) - body.unshift(tee) - body.unshift(this.response.body) - } - - body.once('resume', onResume) - body.once('end', () => body.removeListener('resume', onResume)) - } else { - await cacache.index.insert(this.options.cachePath, this.key, null, cacheOpts) - } - - // note: we do not set the x-local-cache-hash header because we do not know - // the hash value until after the write to the cache completes, which doesn't - // happen until after the response has been sent and it's too late to write - // the header anyway - this.response.headers.set('x-local-cache', encodeURIComponent(this.options.cachePath)) - this.response.headers.set('x-local-cache-key', encodeURIComponent(this.key)) - this.response.headers.set('x-local-cache-mode', 'stream') - this.response.headers.set('x-local-cache-status', status) - this.response.headers.set('x-local-cache-time', new Date().toISOString()) - const newResponse = new Response(body, { - url: this.response.url, - status: this.response.status, - headers: this.response.headers, - counter: this.options.counter, - }) - return newResponse - } - - // use the cached data to create a response and return it - async respond (method, options, status) { - let response - if (method === 'HEAD' || [301, 308].includes(this.response.status)) { - // if the request is a HEAD, or the response is a redirect, - // then the metadata in the entry already includes everything - // we need to build a response - response = this.response - } else { - // we're responding with a full cached response, so create a body - // that reads from cacache and attach it to a new Response - const body = new Minipass() - const headers = { ...this.policy.responseHeaders() } - - const onResume = () => { - const cacheStream = cacache.get.stream.byDigest( - this.options.cachePath, this.entry.integrity, { memoize: this.options.memoize } - ) - cacheStream.on('error', async (err) => { - cacheStream.pause() - if (err.code === 'EINTEGRITY') { - await cacache.rm.content( - this.options.cachePath, this.entry.integrity, { memoize: this.options.memoize } - ) - } - if (err.code === 'ENOENT' || err.code === 'EINTEGRITY') { - await CacheEntry.invalidate(this.request, this.options) - } - body.emit('error', err) - cacheStream.resume() - }) - // emit the integrity and size events based on our metadata so we're consistent - body.emit('integrity', this.entry.integrity) - body.emit('size', Number(headers['content-length'])) - cacheStream.pipe(body) - } - - body.once('resume', onResume) - body.once('end', () => body.removeListener('resume', onResume)) - response = new Response(body, { - url: this.entry.metadata.url, - counter: options.counter, - status: 200, - headers, - }) - } - - response.headers.set('x-local-cache', encodeURIComponent(this.options.cachePath)) - response.headers.set('x-local-cache-hash', encodeURIComponent(this.entry.integrity)) - response.headers.set('x-local-cache-key', encodeURIComponent(this.key)) - response.headers.set('x-local-cache-mode', 'stream') - response.headers.set('x-local-cache-status', status) - response.headers.set('x-local-cache-time', new Date(this.entry.metadata.time).toUTCString()) - return response - } - - // use the provided request along with this cache entry to - // revalidate the stored response. returns a response, either - // from the cache or from the update - async revalidate (request, options) { - const revalidateRequest = new Request(request, { - headers: this.policy.revalidationHeaders(request), - }) - - try { - // NOTE: be sure to remove the headers property from the - // user supplied options, since we have already defined - // them on the new request object. if they're still in the - // options then those will overwrite the ones from the policy - var response = await remote(revalidateRequest, { - ...options, - headers: undefined, - }) - } catch (err) { - // if the network fetch fails, return the stale - // cached response unless it has a cache-control - // of 'must-revalidate' - if (!this.policy.mustRevalidate) { - return this.respond(request.method, options, 'stale') - } - - throw err - } - - if (this.policy.revalidated(revalidateRequest, response)) { - // we got a 304, write a new index to the cache and respond from cache - const metadata = getMetadata(request, response, options) - // 304 responses do not include headers that are specific to the response data - // since they do not include a body, so we copy values for headers that were - // in the old cache entry to the new one, if the new metadata does not already - // include that header - for (const name of KEEP_RESPONSE_HEADERS) { - if ( - !hasOwnProperty(metadata.resHeaders, name) && - hasOwnProperty(this.entry.metadata.resHeaders, name) - ) { - metadata.resHeaders[name] = this.entry.metadata.resHeaders[name] - } - } - - for (const name of options.cacheAdditionalHeaders) { - const inMeta = hasOwnProperty(metadata.resHeaders, name) - const inEntry = hasOwnProperty(this.entry.metadata.resHeaders, name) - const inPolicy = hasOwnProperty(this.policy.response.headers, name) - - // if the header is in the existing entry, but it is not in the metadata - // then we need to write it to the metadata as this will refresh the on-disk cache - if (!inMeta && inEntry) { - metadata.resHeaders[name] = this.entry.metadata.resHeaders[name] - } - // if the header is in the metadata, but not in the policy, then we need to set - // it in the policy so that it's included in the immediate response. future - // responses will load a new cache entry, so we don't need to change that - if (!inPolicy && inMeta) { - this.policy.response.headers[name] = metadata.resHeaders[name] - } - } - - try { - await cacache.index.insert(options.cachePath, this.key, this.entry.integrity, { - size: this.entry.size, - metadata, - }) - } catch (err) { - // if updating the cache index fails, we ignore it and - // respond anyway - } - return this.respond(request.method, options, 'revalidated') - } - - // if we got a modified response, create a new entry based on it - const newEntry = new CacheEntry({ - request, - response, - options, - }) - - // respond with the new entry while writing it to the cache - return newEntry.store('updated') - } -} - -module.exports = CacheEntry diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/errors.js b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/errors.js deleted file mode 100644 index 67a66573bebe66..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/errors.js +++ /dev/null @@ -1,11 +0,0 @@ -class NotCachedError extends Error { - constructor (url) { - /* eslint-disable-next-line max-len */ - super(`request to ${url} failed: cache mode is 'only-if-cached' but no cached response is available.`) - this.code = 'ENOTCACHED' - } -} - -module.exports = { - NotCachedError, -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/index.js b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/index.js deleted file mode 100644 index 0de49d23fb9336..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/index.js +++ /dev/null @@ -1,49 +0,0 @@ -const { NotCachedError } = require('./errors.js') -const CacheEntry = require('./entry.js') -const remote = require('../remote.js') - -// do whatever is necessary to get a Response and return it -const cacheFetch = async (request, options) => { - // try to find a cached entry that satisfies this request - const entry = await CacheEntry.find(request, options) - if (!entry) { - // no cached result, if the cache mode is 'only-if-cached' that's a failure - if (options.cache === 'only-if-cached') { - throw new NotCachedError(request.url) - } - - // otherwise, we make a request, store it and return it - const response = await remote(request, options) - const newEntry = new CacheEntry({ request, response, options }) - return newEntry.store('miss') - } - - // we have a cached response that satisfies this request, however if the cache - // mode is 'no-cache' then we send the revalidation request no matter what - if (options.cache === 'no-cache') { - return entry.revalidate(request, options) - } - - // if the cached entry is not stale, or if the cache mode is 'force-cache' or - // 'only-if-cached' we can respond with the cached entry. set the status - // based on the result of needsRevalidation and respond - const _needsRevalidation = entry.policy.needsRevalidation(request) - if (options.cache === 'force-cache' || - options.cache === 'only-if-cached' || - !_needsRevalidation) { - return entry.respond(request.method, options, _needsRevalidation ? 'stale' : 'hit') - } - - // if we got here, the cache entry is stale so revalidate it - return entry.revalidate(request, options) -} - -cacheFetch.invalidate = async (request, options) => { - if (!options.cachePath) { - return - } - - return CacheEntry.invalidate(request, options) -} - -module.exports = cacheFetch diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/key.js b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/key.js deleted file mode 100644 index f7684d562b7fae..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/key.js +++ /dev/null @@ -1,17 +0,0 @@ -const { URL, format } = require('url') - -// options passed to url.format() when generating a key -const formatOptions = { - auth: false, - fragment: false, - search: true, - unicode: false, -} - -// returns a string to be used as the cache key for the Request -const cacheKey = (request) => { - const parsed = new URL(request.url) - return `make-fetch-happen:request-cache:${format(parsed, formatOptions)}` -} - -module.exports = cacheKey diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/policy.js b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/policy.js deleted file mode 100644 index ada3c8600dae92..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/policy.js +++ /dev/null @@ -1,161 +0,0 @@ -const CacheSemantics = require('http-cache-semantics') -const Negotiator = require('negotiator') -const ssri = require('ssri') - -// options passed to http-cache-semantics constructor -const policyOptions = { - shared: false, - ignoreCargoCult: true, -} - -// a fake empty response, used when only testing the -// request for storability -const emptyResponse = { status: 200, headers: {} } - -// returns a plain object representation of the Request -const requestObject = (request) => { - const _obj = { - method: request.method, - url: request.url, - headers: {}, - compress: request.compress, - } - - request.headers.forEach((value, key) => { - _obj.headers[key] = value - }) - - return _obj -} - -// returns a plain object representation of the Response -const responseObject = (response) => { - const _obj = { - status: response.status, - headers: {}, - } - - response.headers.forEach((value, key) => { - _obj.headers[key] = value - }) - - return _obj -} - -class CachePolicy { - constructor ({ entry, request, response, options }) { - this.entry = entry - this.request = requestObject(request) - this.response = responseObject(response) - this.options = options - this.policy = new CacheSemantics(this.request, this.response, policyOptions) - - if (this.entry) { - // if we have an entry, copy the timestamp to the _responseTime - // this is necessary because the CacheSemantics constructor forces - // the value to Date.now() which means a policy created from a - // cache entry is likely to always identify itself as stale - this.policy._responseTime = this.entry.metadata.time - } - } - - // static method to quickly determine if a request alone is storable - static storable (request, options) { - // no cachePath means no caching - if (!options.cachePath) { - return false - } - - // user explicitly asked not to cache - if (options.cache === 'no-store') { - return false - } - - // we only cache GET and HEAD requests - if (!['GET', 'HEAD'].includes(request.method)) { - return false - } - - // otherwise, let http-cache-semantics make the decision - // based on the request's headers - const policy = new CacheSemantics(requestObject(request), emptyResponse, policyOptions) - return policy.storable() - } - - // returns true if the policy satisfies the request - satisfies (request) { - const _req = requestObject(request) - if (this.request.headers.host !== _req.headers.host) { - return false - } - - if (this.request.compress !== _req.compress) { - return false - } - - const negotiatorA = new Negotiator(this.request) - const negotiatorB = new Negotiator(_req) - - if (JSON.stringify(negotiatorA.mediaTypes()) !== JSON.stringify(negotiatorB.mediaTypes())) { - return false - } - - if (JSON.stringify(negotiatorA.languages()) !== JSON.stringify(negotiatorB.languages())) { - return false - } - - if (JSON.stringify(negotiatorA.encodings()) !== JSON.stringify(negotiatorB.encodings())) { - return false - } - - if (this.options.integrity) { - return ssri.parse(this.options.integrity).match(this.entry.integrity) - } - - return true - } - - // returns true if the request and response allow caching - storable () { - return this.policy.storable() - } - - // NOTE: this is a hack to avoid parsing the cache-control - // header ourselves, it returns true if the response's - // cache-control contains must-revalidate - get mustRevalidate () { - return !!this.policy._rescc['must-revalidate'] - } - - // returns true if the cached response requires revalidation - // for the given request - needsRevalidation (request) { - const _req = requestObject(request) - // force method to GET because we only cache GETs - // but can serve a HEAD from a cached GET - _req.method = 'GET' - return !this.policy.satisfiesWithoutRevalidation(_req) - } - - responseHeaders () { - return this.policy.responseHeaders() - } - - // returns a new object containing the appropriate headers - // to send a revalidation request - revalidationHeaders (request) { - const _req = requestObject(request) - return this.policy.revalidationHeaders(_req) - } - - // returns true if the request/response was revalidated - // successfully. returns false if a new response was received - revalidated (request, response) { - const _req = requestObject(request) - const _res = responseObject(response) - const policy = this.policy.revalidatedPolicy(_req, _res) - return !policy.modified - } -} - -module.exports = CachePolicy diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/fetch.js b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/fetch.js deleted file mode 100644 index 233ba67e165502..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/fetch.js +++ /dev/null @@ -1,118 +0,0 @@ -'use strict' - -const { FetchError, Request, isRedirect } = require('minipass-fetch') -const url = require('url') - -const CachePolicy = require('./cache/policy.js') -const cache = require('./cache/index.js') -const remote = require('./remote.js') - -// given a Request, a Response and user options -// return true if the response is a redirect that -// can be followed. we throw errors that will result -// in the fetch being rejected if the redirect is -// possible but invalid for some reason -const canFollowRedirect = (request, response, options) => { - if (!isRedirect(response.status)) { - return false - } - - if (options.redirect === 'manual') { - return false - } - - if (options.redirect === 'error') { - throw new FetchError(`redirect mode is set to error: ${request.url}`, - 'no-redirect', { code: 'ENOREDIRECT' }) - } - - if (!response.headers.has('location')) { - throw new FetchError(`redirect location header missing for: ${request.url}`, - 'no-location', { code: 'EINVALIDREDIRECT' }) - } - - if (request.counter >= request.follow) { - throw new FetchError(`maximum redirect reached at: ${request.url}`, - 'max-redirect', { code: 'EMAXREDIRECT' }) - } - - return true -} - -// given a Request, a Response, and the user's options return an object -// with a new Request and a new options object that will be used for -// following the redirect -const getRedirect = (request, response, options) => { - const _opts = { ...options } - const location = response.headers.get('location') - const redirectUrl = new url.URL(location, /^https?:/.test(location) ? undefined : request.url) - // Comment below is used under the following license: - /** - * @license - * Copyright (c) 2010-2012 Mikeal Rogers - * 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. - */ - - // Remove authorization if changing hostnames (but not if just - // changing ports or protocols). This matches the behavior of request: - // https://github.com/request/request/blob/b12a6245/lib/redirect.js#L134-L138 - if (new url.URL(request.url).hostname !== redirectUrl.hostname) { - request.headers.delete('authorization') - request.headers.delete('cookie') - } - - // for POST request with 301/302 response, or any request with 303 response, - // use GET when following redirect - if ( - response.status === 303 || - (request.method === 'POST' && [301, 302].includes(response.status)) - ) { - _opts.method = 'GET' - _opts.body = null - request.headers.delete('content-length') - } - - _opts.headers = {} - request.headers.forEach((value, key) => { - _opts.headers[key] = value - }) - - _opts.counter = ++request.counter - const redirectReq = new Request(url.format(redirectUrl), _opts) - return { - request: redirectReq, - options: _opts, - } -} - -const fetch = async (request, options) => { - const response = CachePolicy.storable(request, options) - ? await cache(request, options) - : await remote(request, options) - - // if the request wasn't a GET or HEAD, and the response - // status is between 200 and 399 inclusive, invalidate the - // request url - if (!['GET', 'HEAD'].includes(request.method) && - response.status >= 200 && - response.status <= 399) { - await cache.invalidate(request, options) - } - - if (!canFollowRedirect(request, response, options)) { - return response - } - - const redirect = getRedirect(request, response, options) - return fetch(redirect.request, redirect.options) -} - -module.exports = fetch diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/index.js b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/index.js deleted file mode 100644 index 2f12e8e1b61131..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/index.js +++ /dev/null @@ -1,41 +0,0 @@ -const { FetchError, Headers, Request, Response } = require('minipass-fetch') - -const configureOptions = require('./options.js') -const fetch = require('./fetch.js') - -const makeFetchHappen = (url, opts) => { - const options = configureOptions(opts) - - const request = new Request(url, options) - return fetch(request, options) -} - -makeFetchHappen.defaults = (defaultUrl, defaultOptions = {}, wrappedFetch = makeFetchHappen) => { - if (typeof defaultUrl === 'object') { - defaultOptions = defaultUrl - defaultUrl = null - } - - const defaultedFetch = (url, options = {}) => { - const finalUrl = url || defaultUrl - const finalOptions = { - ...defaultOptions, - ...options, - headers: { - ...defaultOptions.headers, - ...options.headers, - }, - } - return wrappedFetch(finalUrl, finalOptions) - } - - defaultedFetch.defaults = (defaultUrl1, defaultOptions1 = {}) => - makeFetchHappen.defaults(defaultUrl1, defaultOptions1, defaultedFetch) - return defaultedFetch -} - -module.exports = makeFetchHappen -module.exports.FetchError = FetchError -module.exports.Headers = Headers -module.exports.Request = Request -module.exports.Response = Response diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/options.js b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/options.js deleted file mode 100644 index db51cc63248176..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/options.js +++ /dev/null @@ -1,59 +0,0 @@ -const dns = require('dns') - -const conditionalHeaders = [ - 'if-modified-since', - 'if-none-match', - 'if-unmodified-since', - 'if-match', - 'if-range', -] - -const configureOptions = (opts) => { - const { strictSSL, ...options } = { ...opts } - options.method = options.method ? options.method.toUpperCase() : 'GET' - - if (strictSSL === undefined || strictSSL === null) { - options.rejectUnauthorized = process.env.NODE_TLS_REJECT_UNAUTHORIZED !== '0' - } else { - options.rejectUnauthorized = strictSSL !== false - } - - if (!options.retry) { - options.retry = { retries: 0 } - } else if (typeof options.retry === 'string') { - const retries = parseInt(options.retry, 10) - if (isFinite(retries)) { - options.retry = { retries } - } else { - options.retry = { retries: 0 } - } - } else if (typeof options.retry === 'number') { - options.retry = { retries: options.retry } - } else { - options.retry = { retries: 0, ...options.retry } - } - - options.dns = { ttl: 5 * 60 * 1000, lookup: dns.lookup, ...options.dns } - - options.cache = options.cache || 'default' - if (options.cache === 'default') { - const hasConditionalHeader = Object.keys(options.headers || {}).some((name) => { - return conditionalHeaders.includes(name.toLowerCase()) - }) - if (hasConditionalHeader) { - options.cache = 'no-store' - } - } - - options.cacheAdditionalHeaders = options.cacheAdditionalHeaders || [] - - // cacheManager is deprecated, but if it's set and - // cachePath is not we should copy it to the new field - if (options.cacheManager && !options.cachePath) { - options.cachePath = options.cacheManager - } - - return options -} - -module.exports = configureOptions diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/pipeline.js b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/pipeline.js deleted file mode 100644 index b1d221b2d0ce31..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/pipeline.js +++ /dev/null @@ -1,41 +0,0 @@ -'use strict' - -const MinipassPipeline = require('minipass-pipeline') - -class CachingMinipassPipeline extends MinipassPipeline { - #events = [] - #data = new Map() - - constructor (opts, ...streams) { - // CRITICAL: do NOT pass the streams to the call to super(), this will start - // the flow of data and potentially cause the events we need to catch to emit - // before we've finished our own setup. instead we call super() with no args, - // finish our setup, and then push the streams into ourselves to start the - // data flow - super() - this.#events = opts.events - - /* istanbul ignore next - coverage disabled because this is pointless to test here */ - if (streams.length) { - this.push(...streams) - } - } - - on (event, handler) { - if (this.#events.includes(event) && this.#data.has(event)) { - return handler(...this.#data.get(event)) - } - - return super.on(event, handler) - } - - emit (event, ...data) { - if (this.#events.includes(event)) { - this.#data.set(event, data) - } - - return super.emit(event, ...data) - } -} - -module.exports = CachingMinipassPipeline diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/remote.js b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/remote.js deleted file mode 100644 index 1d640e5380baaf..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/remote.js +++ /dev/null @@ -1,132 +0,0 @@ -const { Minipass } = require('minipass') -const fetch = require('minipass-fetch') -const promiseRetry = require('promise-retry') -const ssri = require('ssri') -const { log } = require('proc-log') - -const CachingMinipassPipeline = require('./pipeline.js') -const { getAgent } = require('@npmcli/agent') -const pkg = require('../package.json') - -const USER_AGENT = `${pkg.name}/${pkg.version} (+https://npm.im/${pkg.name})` - -const RETRY_ERRORS = [ - 'ECONNRESET', // remote socket closed on us - 'ECONNREFUSED', // remote host refused to open connection - 'EADDRINUSE', // failed to bind to a local port (proxy?) - 'ETIMEDOUT', // someone in the transaction is WAY TOO SLOW - // from @npmcli/agent - 'ECONNECTIONTIMEOUT', - 'EIDLETIMEOUT', - 'ERESPONSETIMEOUT', - 'ETRANSFERTIMEOUT', - // Known codes we do NOT retry on: - // ENOTFOUND (getaddrinfo failure. Either bad hostname, or offline) - // EINVALIDPROXY // invalid protocol from @npmcli/agent - // EINVALIDRESPONSE // invalid status code from @npmcli/agent -] - -const RETRY_TYPES = [ - 'request-timeout', -] - -// make a request directly to the remote source, -// retrying certain classes of errors as well as -// following redirects (through the cache if necessary) -// and verifying response integrity -const remoteFetch = (request, options) => { - // options.signal is intended for the fetch itself, not the agent. Attaching it to the agent will re-use that signal across multiple requests, which prevents any connections beyond the first one. - const agent = getAgent(request.url, { ...options, signal: undefined }) - if (!request.headers.has('connection')) { - request.headers.set('connection', agent ? 'keep-alive' : 'close') - } - - if (!request.headers.has('user-agent')) { - request.headers.set('user-agent', USER_AGENT) - } - - // keep our own options since we're overriding the agent - // and the redirect mode - const _opts = { - ...options, - agent, - redirect: 'manual', - } - - return promiseRetry(async (retryHandler, attemptNum) => { - const req = new fetch.Request(request, _opts) - try { - let res = await fetch(req, _opts) - if (_opts.integrity && res.status === 200) { - // we got a 200 response and the user has specified an expected - // integrity value, so wrap the response in an ssri stream to verify it - const integrityStream = ssri.integrityStream({ - algorithms: _opts.algorithms, - integrity: _opts.integrity, - size: _opts.size, - }) - const pipeline = new CachingMinipassPipeline({ - events: ['integrity', 'size'], - }, res.body, integrityStream) - // we also propagate the integrity and size events out to the pipeline so we can use - // this new response body as an integrityEmitter for cacache - integrityStream.on('integrity', i => pipeline.emit('integrity', i)) - integrityStream.on('size', s => pipeline.emit('size', s)) - res = new fetch.Response(pipeline, res) - // set an explicit flag so we know if our response body will emit integrity and size - res.body.hasIntegrityEmitter = true - } - - res.headers.set('x-fetch-attempts', attemptNum) - - // do not retry POST requests, or requests with a streaming body - // do retry requests with a 408, 420, 429 or 500+ status in the response - const isStream = Minipass.isStream(req.body) - const isRetriable = req.method !== 'POST' && - !isStream && - ([408, 420, 429].includes(res.status) || res.status >= 500) - - if (isRetriable) { - if (typeof options.onRetry === 'function') { - options.onRetry(res) - } - - /* eslint-disable-next-line max-len */ - log.http('fetch', `${req.method} ${req.url} attempt ${attemptNum} failed with ${res.status}`) - return retryHandler(res) - } - - return res - } catch (err) { - const code = (err.code === 'EPROMISERETRY') - ? err.retried.code - : err.code - - // err.retried will be the thing that was thrown from above - // if it's a response, we just got a bad status code and we - // can re-throw to allow the retry - const isRetryError = err.retried instanceof fetch.Response || - (RETRY_ERRORS.includes(code) && RETRY_TYPES.includes(err.type)) - - if (req.method === 'POST' || isRetryError) { - throw err - } - - if (typeof options.onRetry === 'function') { - options.onRetry(err) - } - - log.http('fetch', `${req.method} ${req.url} attempt ${attemptNum} failed with ${err.code}`) - return retryHandler(err) - } - }, options.retry).catch((err) => { - // don't reject for http errors, just return them - if (err.status >= 400 && err.type !== 'system') { - return err - } - - throw err - }) -} - -module.exports = remoteFetch diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/package.json b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/package.json deleted file mode 100644 index 054fe841f13b73..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/package.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "name": "make-fetch-happen", - "version": "14.0.3", - "description": "Opinionated, caching, retrying fetch client", - "main": "lib/index.js", - "files": [ - "bin/", - "lib/" - ], - "scripts": { - "test": "tap", - "posttest": "npm run lint", - "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", - "lint": "npm run eslint", - "lintfix": "npm run eslint -- --fix", - "postlint": "template-oss-check", - "snap": "tap", - "template-oss-apply": "template-oss-apply --force" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/npm/make-fetch-happen.git" - }, - "keywords": [ - "http", - "request", - "fetch", - "mean girls", - "caching", - "cache", - "subresource integrity" - ], - "author": "GitHub Inc.", - "license": "ISC", - "dependencies": { - "@npmcli/agent": "^3.0.0", - "cacache": "^19.0.1", - "http-cache-semantics": "^4.1.1", - "minipass": "^7.0.2", - "minipass-fetch": "^4.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^1.0.0", - "proc-log": "^5.0.0", - "promise-retry": "^2.0.1", - "ssri": "^12.0.0" - }, - "devDependencies": { - "@npmcli/eslint-config": "^5.0.0", - "@npmcli/template-oss": "4.23.4", - "nock": "^13.2.4", - "safe-buffer": "^5.2.1", - "standard-version": "^9.3.2", - "tap": "^16.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - }, - "tap": { - "color": 1, - "files": "test/*.js", - "check-coverage": true, - "timeout": 60, - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.23.4", - "publish": "true" - } -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js b/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js deleted file mode 100644 index 5fc86bbd0116c9..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js +++ /dev/null @@ -1,14 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.assertValidPattern = void 0; -const MAX_PATTERN_LENGTH = 1024 * 64; -const assertValidPattern = (pattern) => { - if (typeof pattern !== 'string') { - throw new TypeError('invalid pattern'); - } - if (pattern.length > MAX_PATTERN_LENGTH) { - throw new TypeError('pattern is too long'); - } -}; -exports.assertValidPattern = assertValidPattern; -//# sourceMappingURL=assert-valid-pattern.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/commonjs/ast.js b/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/commonjs/ast.js deleted file mode 100644 index 9e1f9e765c597e..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/commonjs/ast.js +++ /dev/null @@ -1,592 +0,0 @@ -"use strict"; -// parse a single path portion -Object.defineProperty(exports, "__esModule", { value: true }); -exports.AST = void 0; -const brace_expressions_js_1 = require("./brace-expressions.js"); -const unescape_js_1 = require("./unescape.js"); -const types = new Set(['!', '?', '+', '*', '@']); -const isExtglobType = (c) => types.has(c); -// Patterns that get prepended to bind to the start of either the -// entire string, or just a single path portion, to prevent dots -// and/or traversal patterns, when needed. -// Exts don't need the ^ or / bit, because the root binds that already. -const startNoTraversal = '(?!(?:^|/)\\.\\.?(?:$|/))'; -const startNoDot = '(?!\\.)'; -// characters that indicate a start of pattern needs the "no dots" bit, -// because a dot *might* be matched. ( is not in the list, because in -// the case of a child extglob, it will handle the prevention itself. -const addPatternStart = new Set(['[', '.']); -// cases where traversal is A-OK, no dot prevention needed -const justDots = new Set(['..', '.']); -const reSpecials = new Set('().*{}+?[]^$\\!'); -const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); -// any single thing other than / -const qmark = '[^/]'; -// * => any number of characters -const star = qmark + '*?'; -// use + when we need to ensure that *something* matches, because the * is -// the only thing in the path portion. -const starNoEmpty = qmark + '+?'; -// remove the \ chars that we added if we end up doing a nonmagic compare -// const deslash = (s: string) => s.replace(/\\(.)/g, '$1') -class AST { - type; - #root; - #hasMagic; - #uflag = false; - #parts = []; - #parent; - #parentIndex; - #negs; - #filledNegs = false; - #options; - #toString; - // set to true if it's an extglob with no children - // (which really means one child of '') - #emptyExt = false; - constructor(type, parent, options = {}) { - this.type = type; - // extglobs are inherently magical - if (type) - this.#hasMagic = true; - this.#parent = parent; - this.#root = this.#parent ? this.#parent.#root : this; - this.#options = this.#root === this ? options : this.#root.#options; - this.#negs = this.#root === this ? [] : this.#root.#negs; - if (type === '!' && !this.#root.#filledNegs) - this.#negs.push(this); - this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0; - } - get hasMagic() { - /* c8 ignore start */ - if (this.#hasMagic !== undefined) - return this.#hasMagic; - /* c8 ignore stop */ - for (const p of this.#parts) { - if (typeof p === 'string') - continue; - if (p.type || p.hasMagic) - return (this.#hasMagic = true); - } - // note: will be undefined until we generate the regexp src and find out - return this.#hasMagic; - } - // reconstructs the pattern - toString() { - if (this.#toString !== undefined) - return this.#toString; - if (!this.type) { - return (this.#toString = this.#parts.map(p => String(p)).join('')); - } - else { - return (this.#toString = - this.type + '(' + this.#parts.map(p => String(p)).join('|') + ')'); - } - } - #fillNegs() { - /* c8 ignore start */ - if (this !== this.#root) - throw new Error('should only call on root'); - if (this.#filledNegs) - return this; - /* c8 ignore stop */ - // call toString() once to fill this out - this.toString(); - this.#filledNegs = true; - let n; - while ((n = this.#negs.pop())) { - if (n.type !== '!') - continue; - // walk up the tree, appending everthing that comes AFTER parentIndex - let p = n; - let pp = p.#parent; - while (pp) { - for (let i = p.#parentIndex + 1; !pp.type && i < pp.#parts.length; i++) { - for (const part of n.#parts) { - /* c8 ignore start */ - if (typeof part === 'string') { - throw new Error('string part in extglob AST??'); - } - /* c8 ignore stop */ - part.copyIn(pp.#parts[i]); - } - } - p = pp; - pp = p.#parent; - } - } - return this; - } - push(...parts) { - for (const p of parts) { - if (p === '') - continue; - /* c8 ignore start */ - if (typeof p !== 'string' && !(p instanceof AST && p.#parent === this)) { - throw new Error('invalid part: ' + p); - } - /* c8 ignore stop */ - this.#parts.push(p); - } - } - toJSON() { - const ret = this.type === null - ? this.#parts.slice().map(p => (typeof p === 'string' ? p : p.toJSON())) - : [this.type, ...this.#parts.map(p => p.toJSON())]; - if (this.isStart() && !this.type) - ret.unshift([]); - if (this.isEnd() && - (this === this.#root || - (this.#root.#filledNegs && this.#parent?.type === '!'))) { - ret.push({}); - } - return ret; - } - isStart() { - if (this.#root === this) - return true; - // if (this.type) return !!this.#parent?.isStart() - if (!this.#parent?.isStart()) - return false; - if (this.#parentIndex === 0) - return true; - // if everything AHEAD of this is a negation, then it's still the "start" - const p = this.#parent; - for (let i = 0; i < this.#parentIndex; i++) { - const pp = p.#parts[i]; - if (!(pp instanceof AST && pp.type === '!')) { - return false; - } - } - return true; - } - isEnd() { - if (this.#root === this) - return true; - if (this.#parent?.type === '!') - return true; - if (!this.#parent?.isEnd()) - return false; - if (!this.type) - return this.#parent?.isEnd(); - // if not root, it'll always have a parent - /* c8 ignore start */ - const pl = this.#parent ? this.#parent.#parts.length : 0; - /* c8 ignore stop */ - return this.#parentIndex === pl - 1; - } - copyIn(part) { - if (typeof part === 'string') - this.push(part); - else - this.push(part.clone(this)); - } - clone(parent) { - const c = new AST(this.type, parent); - for (const p of this.#parts) { - c.copyIn(p); - } - return c; - } - static #parseAST(str, ast, pos, opt) { - let escaping = false; - let inBrace = false; - let braceStart = -1; - let braceNeg = false; - if (ast.type === null) { - // outside of a extglob, append until we find a start - let i = pos; - let acc = ''; - while (i < str.length) { - const c = str.charAt(i++); - // still accumulate escapes at this point, but we do ignore - // starts that are escaped - if (escaping || c === '\\') { - escaping = !escaping; - acc += c; - continue; - } - if (inBrace) { - if (i === braceStart + 1) { - if (c === '^' || c === '!') { - braceNeg = true; - } - } - else if (c === ']' && !(i === braceStart + 2 && braceNeg)) { - inBrace = false; - } - acc += c; - continue; - } - else if (c === '[') { - inBrace = true; - braceStart = i; - braceNeg = false; - acc += c; - continue; - } - if (!opt.noext && isExtglobType(c) && str.charAt(i) === '(') { - ast.push(acc); - acc = ''; - const ext = new AST(c, ast); - i = AST.#parseAST(str, ext, i, opt); - ast.push(ext); - continue; - } - acc += c; - } - ast.push(acc); - return i; - } - // some kind of extglob, pos is at the ( - // find the next | or ) - let i = pos + 1; - let part = new AST(null, ast); - const parts = []; - let acc = ''; - while (i < str.length) { - const c = str.charAt(i++); - // still accumulate escapes at this point, but we do ignore - // starts that are escaped - if (escaping || c === '\\') { - escaping = !escaping; - acc += c; - continue; - } - if (inBrace) { - if (i === braceStart + 1) { - if (c === '^' || c === '!') { - braceNeg = true; - } - } - else if (c === ']' && !(i === braceStart + 2 && braceNeg)) { - inBrace = false; - } - acc += c; - continue; - } - else if (c === '[') { - inBrace = true; - braceStart = i; - braceNeg = false; - acc += c; - continue; - } - if (isExtglobType(c) && str.charAt(i) === '(') { - part.push(acc); - acc = ''; - const ext = new AST(c, part); - part.push(ext); - i = AST.#parseAST(str, ext, i, opt); - continue; - } - if (c === '|') { - part.push(acc); - acc = ''; - parts.push(part); - part = new AST(null, ast); - continue; - } - if (c === ')') { - if (acc === '' && ast.#parts.length === 0) { - ast.#emptyExt = true; - } - part.push(acc); - acc = ''; - ast.push(...parts, part); - return i; - } - acc += c; - } - // unfinished extglob - // if we got here, it was a malformed extglob! not an extglob, but - // maybe something else in there. - ast.type = null; - ast.#hasMagic = undefined; - ast.#parts = [str.substring(pos - 1)]; - return i; - } - static fromGlob(pattern, options = {}) { - const ast = new AST(null, undefined, options); - AST.#parseAST(pattern, ast, 0, options); - return ast; - } - // returns the regular expression if there's magic, or the unescaped - // string if not. - toMMPattern() { - // should only be called on root - /* c8 ignore start */ - if (this !== this.#root) - return this.#root.toMMPattern(); - /* c8 ignore stop */ - const glob = this.toString(); - const [re, body, hasMagic, uflag] = this.toRegExpSource(); - // if we're in nocase mode, and not nocaseMagicOnly, then we do - // still need a regular expression if we have to case-insensitively - // match capital/lowercase characters. - const anyMagic = hasMagic || - this.#hasMagic || - (this.#options.nocase && - !this.#options.nocaseMagicOnly && - glob.toUpperCase() !== glob.toLowerCase()); - if (!anyMagic) { - return body; - } - const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : ''); - return Object.assign(new RegExp(`^${re}$`, flags), { - _src: re, - _glob: glob, - }); - } - get options() { - return this.#options; - } - // returns the string match, the regexp source, whether there's magic - // in the regexp (so a regular expression is required) and whether or - // not the uflag is needed for the regular expression (for posix classes) - // TODO: instead of injecting the start/end at this point, just return - // the BODY of the regexp, along with the start/end portions suitable - // for binding the start/end in either a joined full-path makeRe context - // (where we bind to (^|/), or a standalone matchPart context (where - // we bind to ^, and not /). Otherwise slashes get duped! - // - // In part-matching mode, the start is: - // - if not isStart: nothing - // - if traversal possible, but not allowed: ^(?!\.\.?$) - // - if dots allowed or not possible: ^ - // - if dots possible and not allowed: ^(?!\.) - // end is: - // - if not isEnd(): nothing - // - else: $ - // - // In full-path matching mode, we put the slash at the START of the - // pattern, so start is: - // - if first pattern: same as part-matching mode - // - if not isStart(): nothing - // - if traversal possible, but not allowed: /(?!\.\.?(?:$|/)) - // - if dots allowed or not possible: / - // - if dots possible and not allowed: /(?!\.) - // end is: - // - if last pattern, same as part-matching mode - // - else nothing - // - // Always put the (?:$|/) on negated tails, though, because that has to be - // there to bind the end of the negated pattern portion, and it's easier to - // just stick it in now rather than try to inject it later in the middle of - // the pattern. - // - // We can just always return the same end, and leave it up to the caller - // to know whether it's going to be used joined or in parts. - // And, if the start is adjusted slightly, can do the same there: - // - if not isStart: nothing - // - if traversal possible, but not allowed: (?:/|^)(?!\.\.?$) - // - if dots allowed or not possible: (?:/|^) - // - if dots possible and not allowed: (?:/|^)(?!\.) - // - // But it's better to have a simpler binding without a conditional, for - // performance, so probably better to return both start options. - // - // Then the caller just ignores the end if it's not the first pattern, - // and the start always gets applied. - // - // But that's always going to be $ if it's the ending pattern, or nothing, - // so the caller can just attach $ at the end of the pattern when building. - // - // So the todo is: - // - better detect what kind of start is needed - // - return both flavors of starting pattern - // - attach $ at the end of the pattern when creating the actual RegExp - // - // Ah, but wait, no, that all only applies to the root when the first pattern - // is not an extglob. If the first pattern IS an extglob, then we need all - // that dot prevention biz to live in the extglob portions, because eg - // +(*|.x*) can match .xy but not .yx. - // - // So, return the two flavors if it's #root and the first child is not an - // AST, otherwise leave it to the child AST to handle it, and there, - // use the (?:^|/) style of start binding. - // - // Even simplified further: - // - Since the start for a join is eg /(?!\.) and the start for a part - // is ^(?!\.), we can just prepend (?!\.) to the pattern (either root - // or start or whatever) and prepend ^ or / at the Regexp construction. - toRegExpSource(allowDot) { - const dot = allowDot ?? !!this.#options.dot; - if (this.#root === this) - this.#fillNegs(); - if (!this.type) { - const noEmpty = this.isStart() && this.isEnd(); - const src = this.#parts - .map(p => { - const [re, _, hasMagic, uflag] = typeof p === 'string' - ? AST.#parseGlob(p, this.#hasMagic, noEmpty) - : p.toRegExpSource(allowDot); - this.#hasMagic = this.#hasMagic || hasMagic; - this.#uflag = this.#uflag || uflag; - return re; - }) - .join(''); - let start = ''; - if (this.isStart()) { - if (typeof this.#parts[0] === 'string') { - // this is the string that will match the start of the pattern, - // so we need to protect against dots and such. - // '.' and '..' cannot match unless the pattern is that exactly, - // even if it starts with . or dot:true is set. - const dotTravAllowed = this.#parts.length === 1 && justDots.has(this.#parts[0]); - if (!dotTravAllowed) { - const aps = addPatternStart; - // check if we have a possibility of matching . or .., - // and prevent that. - const needNoTrav = - // dots are allowed, and the pattern starts with [ or . - (dot && aps.has(src.charAt(0))) || - // the pattern starts with \., and then [ or . - (src.startsWith('\\.') && aps.has(src.charAt(2))) || - // the pattern starts with \.\., and then [ or . - (src.startsWith('\\.\\.') && aps.has(src.charAt(4))); - // no need to prevent dots if it can't match a dot, or if a - // sub-pattern will be preventing it anyway. - const needNoDot = !dot && !allowDot && aps.has(src.charAt(0)); - start = needNoTrav ? startNoTraversal : needNoDot ? startNoDot : ''; - } - } - } - // append the "end of path portion" pattern to negation tails - let end = ''; - if (this.isEnd() && - this.#root.#filledNegs && - this.#parent?.type === '!') { - end = '(?:$|\\/)'; - } - const final = start + src + end; - return [ - final, - (0, unescape_js_1.unescape)(src), - (this.#hasMagic = !!this.#hasMagic), - this.#uflag, - ]; - } - // We need to calculate the body *twice* if it's a repeat pattern - // at the start, once in nodot mode, then again in dot mode, so a - // pattern like *(?) can match 'x.y' - const repeated = this.type === '*' || this.type === '+'; - // some kind of extglob - const start = this.type === '!' ? '(?:(?!(?:' : '(?:'; - let body = this.#partsToRegExp(dot); - if (this.isStart() && this.isEnd() && !body && this.type !== '!') { - // invalid extglob, has to at least be *something* present, if it's - // the entire path portion. - const s = this.toString(); - this.#parts = [s]; - this.type = null; - this.#hasMagic = undefined; - return [s, (0, unescape_js_1.unescape)(this.toString()), false, false]; - } - // XXX abstract out this map method - let bodyDotAllowed = !repeated || allowDot || dot || !startNoDot - ? '' - : this.#partsToRegExp(true); - if (bodyDotAllowed === body) { - bodyDotAllowed = ''; - } - if (bodyDotAllowed) { - body = `(?:${body})(?:${bodyDotAllowed})*?`; - } - // an empty !() is exactly equivalent to a starNoEmpty - let final = ''; - if (this.type === '!' && this.#emptyExt) { - final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty; - } - else { - const close = this.type === '!' - ? // !() must match something,but !(x) can match '' - '))' + - (this.isStart() && !dot && !allowDot ? startNoDot : '') + - star + - ')' - : this.type === '@' - ? ')' - : this.type === '?' - ? ')?' - : this.type === '+' && bodyDotAllowed - ? ')' - : this.type === '*' && bodyDotAllowed - ? `)?` - : `)${this.type}`; - final = start + body + close; - } - return [ - final, - (0, unescape_js_1.unescape)(body), - (this.#hasMagic = !!this.#hasMagic), - this.#uflag, - ]; - } - #partsToRegExp(dot) { - return this.#parts - .map(p => { - // extglob ASTs should only contain parent ASTs - /* c8 ignore start */ - if (typeof p === 'string') { - throw new Error('string type in extglob ast??'); - } - /* c8 ignore stop */ - // can ignore hasMagic, because extglobs are already always magic - const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot); - this.#uflag = this.#uflag || uflag; - return re; - }) - .filter(p => !(this.isStart() && this.isEnd()) || !!p) - .join('|'); - } - static #parseGlob(glob, hasMagic, noEmpty = false) { - let escaping = false; - let re = ''; - let uflag = false; - for (let i = 0; i < glob.length; i++) { - const c = glob.charAt(i); - if (escaping) { - escaping = false; - re += (reSpecials.has(c) ? '\\' : '') + c; - continue; - } - if (c === '\\') { - if (i === glob.length - 1) { - re += '\\\\'; - } - else { - escaping = true; - } - continue; - } - if (c === '[') { - const [src, needUflag, consumed, magic] = (0, brace_expressions_js_1.parseClass)(glob, i); - if (consumed) { - re += src; - uflag = uflag || needUflag; - i += consumed - 1; - hasMagic = hasMagic || magic; - continue; - } - } - if (c === '*') { - if (noEmpty && glob === '*') - re += starNoEmpty; - else - re += star; - hasMagic = true; - continue; - } - if (c === '?') { - re += qmark; - hasMagic = true; - continue; - } - re += regExpEscape(c); - } - return [re, (0, unescape_js_1.unescape)(glob), !!hasMagic, uflag]; - } -} -exports.AST = AST; -//# sourceMappingURL=ast.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/commonjs/brace-expressions.js b/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/commonjs/brace-expressions.js deleted file mode 100644 index 0e13eefc4cfee2..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/commonjs/brace-expressions.js +++ /dev/null @@ -1,152 +0,0 @@ -"use strict"; -// translate the various posix character classes into unicode properties -// this works across all unicode locales -Object.defineProperty(exports, "__esModule", { value: true }); -exports.parseClass = void 0; -// { : [, /u flag required, negated] -const posixClasses = { - '[:alnum:]': ['\\p{L}\\p{Nl}\\p{Nd}', true], - '[:alpha:]': ['\\p{L}\\p{Nl}', true], - '[:ascii:]': ['\\x' + '00-\\x' + '7f', false], - '[:blank:]': ['\\p{Zs}\\t', true], - '[:cntrl:]': ['\\p{Cc}', true], - '[:digit:]': ['\\p{Nd}', true], - '[:graph:]': ['\\p{Z}\\p{C}', true, true], - '[:lower:]': ['\\p{Ll}', true], - '[:print:]': ['\\p{C}', true], - '[:punct:]': ['\\p{P}', true], - '[:space:]': ['\\p{Z}\\t\\r\\n\\v\\f', true], - '[:upper:]': ['\\p{Lu}', true], - '[:word:]': ['\\p{L}\\p{Nl}\\p{Nd}\\p{Pc}', true], - '[:xdigit:]': ['A-Fa-f0-9', false], -}; -// only need to escape a few things inside of brace expressions -// escapes: [ \ ] - -const braceEscape = (s) => s.replace(/[[\]\\-]/g, '\\$&'); -// escape all regexp magic characters -const regexpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); -// everything has already been escaped, we just have to join -const rangesToString = (ranges) => ranges.join(''); -// takes a glob string at a posix brace expression, and returns -// an equivalent regular expression source, and boolean indicating -// whether the /u flag needs to be applied, and the number of chars -// consumed to parse the character class. -// This also removes out of order ranges, and returns ($.) if the -// entire class just no good. -const parseClass = (glob, position) => { - const pos = position; - /* c8 ignore start */ - if (glob.charAt(pos) !== '[') { - throw new Error('not in a brace expression'); - } - /* c8 ignore stop */ - const ranges = []; - const negs = []; - let i = pos + 1; - let sawStart = false; - let uflag = false; - let escaping = false; - let negate = false; - let endPos = pos; - let rangeStart = ''; - WHILE: while (i < glob.length) { - const c = glob.charAt(i); - if ((c === '!' || c === '^') && i === pos + 1) { - negate = true; - i++; - continue; - } - if (c === ']' && sawStart && !escaping) { - endPos = i + 1; - break; - } - sawStart = true; - if (c === '\\') { - if (!escaping) { - escaping = true; - i++; - continue; - } - // escaped \ char, fall through and treat like normal char - } - if (c === '[' && !escaping) { - // either a posix class, a collation equivalent, or just a [ - for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) { - if (glob.startsWith(cls, i)) { - // invalid, [a-[] is fine, but not [a-[:alpha]] - if (rangeStart) { - return ['$.', false, glob.length - pos, true]; - } - i += cls.length; - if (neg) - negs.push(unip); - else - ranges.push(unip); - uflag = uflag || u; - continue WHILE; - } - } - } - // now it's just a normal character, effectively - escaping = false; - if (rangeStart) { - // throw this range away if it's not valid, but others - // can still match. - if (c > rangeStart) { - ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c)); - } - else if (c === rangeStart) { - ranges.push(braceEscape(c)); - } - rangeStart = ''; - i++; - continue; - } - // now might be the start of a range. - // can be either c-d or c-] or c] or c] at this point - if (glob.startsWith('-]', i + 1)) { - ranges.push(braceEscape(c + '-')); - i += 2; - continue; - } - if (glob.startsWith('-', i + 1)) { - rangeStart = c; - i += 2; - continue; - } - // not the start of a range, just a single character - ranges.push(braceEscape(c)); - i++; - } - if (endPos < i) { - // didn't see the end of the class, not a valid class, - // but might still be valid as a literal match. - return ['', false, 0, false]; - } - // if we got no ranges and no negates, then we have a range that - // cannot possibly match anything, and that poisons the whole glob - if (!ranges.length && !negs.length) { - return ['$.', false, glob.length - pos, true]; - } - // if we got one positive range, and it's a single character, then that's - // not actually a magic pattern, it's just that one literal character. - // we should not treat that as "magic", we should just return the literal - // character. [_] is a perfectly valid way to escape glob magic chars. - if (negs.length === 0 && - ranges.length === 1 && - /^\\?.$/.test(ranges[0]) && - !negate) { - const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0]; - return [regexpEscape(r), false, endPos - pos, false]; - } - const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']'; - const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']'; - const comb = ranges.length && negs.length - ? '(' + sranges + '|' + snegs + ')' - : ranges.length - ? sranges - : snegs; - return [comb, uflag, endPos - pos, true]; -}; -exports.parseClass = parseClass; -//# sourceMappingURL=brace-expressions.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/commonjs/escape.js b/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/commonjs/escape.js deleted file mode 100644 index 02a4f8a8e0a588..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/commonjs/escape.js +++ /dev/null @@ -1,22 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.escape = void 0; -/** - * Escape all magic characters in a glob pattern. - * - * If the {@link windowsPathsNoEscape | GlobOptions.windowsPathsNoEscape} - * option is used, then characters are escaped by wrapping in `[]`, because - * a magic character wrapped in a character class can only be satisfied by - * that exact character. In this mode, `\` is _not_ escaped, because it is - * not interpreted as a magic character, but instead as a path separator. - */ -const escape = (s, { windowsPathsNoEscape = false, } = {}) => { - // don't need to escape +@! because we escape the parens - // that make those magic, and escaping ! as [!] isn't valid, - // because [!]] is a valid glob class meaning not ']'. - return windowsPathsNoEscape - ? s.replace(/[?*()[\]]/g, '[$&]') - : s.replace(/[?*()[\]\\]/g, '\\$&'); -}; -exports.escape = escape; -//# sourceMappingURL=escape.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/commonjs/index.js b/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/commonjs/index.js deleted file mode 100644 index 64a0f1f833222e..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/commonjs/index.js +++ /dev/null @@ -1,1017 +0,0 @@ -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.unescape = exports.escape = exports.AST = exports.Minimatch = exports.match = exports.makeRe = exports.braceExpand = exports.defaults = exports.filter = exports.GLOBSTAR = exports.sep = exports.minimatch = void 0; -const brace_expansion_1 = __importDefault(require("brace-expansion")); -const assert_valid_pattern_js_1 = require("./assert-valid-pattern.js"); -const ast_js_1 = require("./ast.js"); -const escape_js_1 = require("./escape.js"); -const unescape_js_1 = require("./unescape.js"); -const minimatch = (p, pattern, options = {}) => { - (0, assert_valid_pattern_js_1.assertValidPattern)(pattern); - // shortcut: comments match nothing. - if (!options.nocomment && pattern.charAt(0) === '#') { - return false; - } - return new Minimatch(pattern, options).match(p); -}; -exports.minimatch = minimatch; -// Optimized checking for the most common glob patterns. -const starDotExtRE = /^\*+([^+@!?\*\[\(]*)$/; -const starDotExtTest = (ext) => (f) => !f.startsWith('.') && f.endsWith(ext); -const starDotExtTestDot = (ext) => (f) => f.endsWith(ext); -const starDotExtTestNocase = (ext) => { - ext = ext.toLowerCase(); - return (f) => !f.startsWith('.') && f.toLowerCase().endsWith(ext); -}; -const starDotExtTestNocaseDot = (ext) => { - ext = ext.toLowerCase(); - return (f) => f.toLowerCase().endsWith(ext); -}; -const starDotStarRE = /^\*+\.\*+$/; -const starDotStarTest = (f) => !f.startsWith('.') && f.includes('.'); -const starDotStarTestDot = (f) => f !== '.' && f !== '..' && f.includes('.'); -const dotStarRE = /^\.\*+$/; -const dotStarTest = (f) => f !== '.' && f !== '..' && f.startsWith('.'); -const starRE = /^\*+$/; -const starTest = (f) => f.length !== 0 && !f.startsWith('.'); -const starTestDot = (f) => f.length !== 0 && f !== '.' && f !== '..'; -const qmarksRE = /^\?+([^+@!?\*\[\(]*)?$/; -const qmarksTestNocase = ([$0, ext = '']) => { - const noext = qmarksTestNoExt([$0]); - if (!ext) - return noext; - ext = ext.toLowerCase(); - return (f) => noext(f) && f.toLowerCase().endsWith(ext); -}; -const qmarksTestNocaseDot = ([$0, ext = '']) => { - const noext = qmarksTestNoExtDot([$0]); - if (!ext) - return noext; - ext = ext.toLowerCase(); - return (f) => noext(f) && f.toLowerCase().endsWith(ext); -}; -const qmarksTestDot = ([$0, ext = '']) => { - const noext = qmarksTestNoExtDot([$0]); - return !ext ? noext : (f) => noext(f) && f.endsWith(ext); -}; -const qmarksTest = ([$0, ext = '']) => { - const noext = qmarksTestNoExt([$0]); - return !ext ? noext : (f) => noext(f) && f.endsWith(ext); -}; -const qmarksTestNoExt = ([$0]) => { - const len = $0.length; - return (f) => f.length === len && !f.startsWith('.'); -}; -const qmarksTestNoExtDot = ([$0]) => { - const len = $0.length; - return (f) => f.length === len && f !== '.' && f !== '..'; -}; -/* c8 ignore start */ -const defaultPlatform = (typeof process === 'object' && process - ? (typeof process.env === 'object' && - process.env && - process.env.__MINIMATCH_TESTING_PLATFORM__) || - process.platform - : 'posix'); -const path = { - win32: { sep: '\\' }, - posix: { sep: '/' }, -}; -/* c8 ignore stop */ -exports.sep = defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep; -exports.minimatch.sep = exports.sep; -exports.GLOBSTAR = Symbol('globstar **'); -exports.minimatch.GLOBSTAR = exports.GLOBSTAR; -// any single thing other than / -// don't need to escape / when using new RegExp() -const qmark = '[^/]'; -// * => any number of characters -const star = qmark + '*?'; -// ** when dots are allowed. Anything goes, except .. and . -// not (^ or / followed by one or two dots followed by $ or /), -// followed by anything, any number of times. -const twoStarDot = '(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?'; -// not a ^ or / followed by a dot, -// followed by anything, any number of times. -const twoStarNoDot = '(?:(?!(?:\\/|^)\\.).)*?'; -const filter = (pattern, options = {}) => (p) => (0, exports.minimatch)(p, pattern, options); -exports.filter = filter; -exports.minimatch.filter = exports.filter; -const ext = (a, b = {}) => Object.assign({}, a, b); -const defaults = (def) => { - if (!def || typeof def !== 'object' || !Object.keys(def).length) { - return exports.minimatch; - } - const orig = exports.minimatch; - const m = (p, pattern, options = {}) => orig(p, pattern, ext(def, options)); - return Object.assign(m, { - Minimatch: class Minimatch extends orig.Minimatch { - constructor(pattern, options = {}) { - super(pattern, ext(def, options)); - } - static defaults(options) { - return orig.defaults(ext(def, options)).Minimatch; - } - }, - AST: class AST extends orig.AST { - /* c8 ignore start */ - constructor(type, parent, options = {}) { - super(type, parent, ext(def, options)); - } - /* c8 ignore stop */ - static fromGlob(pattern, options = {}) { - return orig.AST.fromGlob(pattern, ext(def, options)); - } - }, - unescape: (s, options = {}) => orig.unescape(s, ext(def, options)), - escape: (s, options = {}) => orig.escape(s, ext(def, options)), - filter: (pattern, options = {}) => orig.filter(pattern, ext(def, options)), - defaults: (options) => orig.defaults(ext(def, options)), - makeRe: (pattern, options = {}) => orig.makeRe(pattern, ext(def, options)), - braceExpand: (pattern, options = {}) => orig.braceExpand(pattern, ext(def, options)), - match: (list, pattern, options = {}) => orig.match(list, pattern, ext(def, options)), - sep: orig.sep, - GLOBSTAR: exports.GLOBSTAR, - }); -}; -exports.defaults = defaults; -exports.minimatch.defaults = exports.defaults; -// Brace expansion: -// a{b,c}d -> abd acd -// a{b,}c -> abc ac -// a{0..3}d -> a0d a1d a2d a3d -// a{b,c{d,e}f}g -> abg acdfg acefg -// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg -// -// Invalid sets are not expanded. -// a{2..}b -> a{2..}b -// a{b}c -> a{b}c -const braceExpand = (pattern, options = {}) => { - (0, assert_valid_pattern_js_1.assertValidPattern)(pattern); - // Thanks to Yeting Li for - // improving this regexp to avoid a ReDOS vulnerability. - if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) { - // shortcut. no need to expand. - return [pattern]; - } - return (0, brace_expansion_1.default)(pattern); -}; -exports.braceExpand = braceExpand; -exports.minimatch.braceExpand = exports.braceExpand; -// parse a component of the expanded set. -// At this point, no pattern may contain "/" in it -// so we're going to return a 2d array, where each entry is the full -// pattern, split on '/', and then turned into a regular expression. -// A regexp is made at the end which joins each array with an -// escaped /, and another full one which joins each regexp with |. -// -// Following the lead of Bash 4.1, note that "**" only has special meaning -// when it is the *only* thing in a path portion. Otherwise, any series -// of * is equivalent to a single *. Globstar behavior is enabled by -// default, and can be disabled by setting options.noglobstar. -const makeRe = (pattern, options = {}) => new Minimatch(pattern, options).makeRe(); -exports.makeRe = makeRe; -exports.minimatch.makeRe = exports.makeRe; -const match = (list, pattern, options = {}) => { - const mm = new Minimatch(pattern, options); - list = list.filter(f => mm.match(f)); - if (mm.options.nonull && !list.length) { - list.push(pattern); - } - return list; -}; -exports.match = match; -exports.minimatch.match = exports.match; -// replace stuff like \* with * -const globMagic = /[?*]|[+@!]\(.*?\)|\[|\]/; -const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); -class Minimatch { - options; - set; - pattern; - windowsPathsNoEscape; - nonegate; - negate; - comment; - empty; - preserveMultipleSlashes; - partial; - globSet; - globParts; - nocase; - isWindows; - platform; - windowsNoMagicRoot; - regexp; - constructor(pattern, options = {}) { - (0, assert_valid_pattern_js_1.assertValidPattern)(pattern); - options = options || {}; - this.options = options; - this.pattern = pattern; - this.platform = options.platform || defaultPlatform; - this.isWindows = this.platform === 'win32'; - this.windowsPathsNoEscape = - !!options.windowsPathsNoEscape || options.allowWindowsEscape === false; - if (this.windowsPathsNoEscape) { - this.pattern = this.pattern.replace(/\\/g, '/'); - } - this.preserveMultipleSlashes = !!options.preserveMultipleSlashes; - this.regexp = null; - this.negate = false; - this.nonegate = !!options.nonegate; - this.comment = false; - this.empty = false; - this.partial = !!options.partial; - this.nocase = !!this.options.nocase; - this.windowsNoMagicRoot = - options.windowsNoMagicRoot !== undefined - ? options.windowsNoMagicRoot - : !!(this.isWindows && this.nocase); - this.globSet = []; - this.globParts = []; - this.set = []; - // make the set of regexps etc. - this.make(); - } - hasMagic() { - if (this.options.magicalBraces && this.set.length > 1) { - return true; - } - for (const pattern of this.set) { - for (const part of pattern) { - if (typeof part !== 'string') - return true; - } - } - return false; - } - debug(..._) { } - make() { - const pattern = this.pattern; - const options = this.options; - // empty patterns and comments match nothing. - if (!options.nocomment && pattern.charAt(0) === '#') { - this.comment = true; - return; - } - if (!pattern) { - this.empty = true; - return; - } - // step 1: figure out negation, etc. - this.parseNegate(); - // step 2: expand braces - this.globSet = [...new Set(this.braceExpand())]; - if (options.debug) { - this.debug = (...args) => console.error(...args); - } - this.debug(this.pattern, this.globSet); - // step 3: now we have a set, so turn each one into a series of - // path-portion matching patterns. - // These will be regexps, except in the case of "**", which is - // set to the GLOBSTAR object for globstar behavior, - // and will not contain any / characters - // - // First, we preprocess to make the glob pattern sets a bit simpler - // and deduped. There are some perf-killing patterns that can cause - // problems with a glob walk, but we can simplify them down a bit. - const rawGlobParts = this.globSet.map(s => this.slashSplit(s)); - this.globParts = this.preprocess(rawGlobParts); - this.debug(this.pattern, this.globParts); - // glob --> regexps - let set = this.globParts.map((s, _, __) => { - if (this.isWindows && this.windowsNoMagicRoot) { - // check if it's a drive or unc path. - const isUNC = s[0] === '' && - s[1] === '' && - (s[2] === '?' || !globMagic.test(s[2])) && - !globMagic.test(s[3]); - const isDrive = /^[a-z]:/i.test(s[0]); - if (isUNC) { - return [...s.slice(0, 4), ...s.slice(4).map(ss => this.parse(ss))]; - } - else if (isDrive) { - return [s[0], ...s.slice(1).map(ss => this.parse(ss))]; - } - } - return s.map(ss => this.parse(ss)); - }); - this.debug(this.pattern, set); - // filter out everything that didn't compile properly. - this.set = set.filter(s => s.indexOf(false) === -1); - // do not treat the ? in UNC paths as magic - if (this.isWindows) { - for (let i = 0; i < this.set.length; i++) { - const p = this.set[i]; - if (p[0] === '' && - p[1] === '' && - this.globParts[i][2] === '?' && - typeof p[3] === 'string' && - /^[a-z]:$/i.test(p[3])) { - p[2] = '?'; - } - } - } - this.debug(this.pattern, this.set); - } - // various transforms to equivalent pattern sets that are - // faster to process in a filesystem walk. The goal is to - // eliminate what we can, and push all ** patterns as far - // to the right as possible, even if it increases the number - // of patterns that we have to process. - preprocess(globParts) { - // if we're not in globstar mode, then turn all ** into * - if (this.options.noglobstar) { - for (let i = 0; i < globParts.length; i++) { - for (let j = 0; j < globParts[i].length; j++) { - if (globParts[i][j] === '**') { - globParts[i][j] = '*'; - } - } - } - } - const { optimizationLevel = 1 } = this.options; - if (optimizationLevel >= 2) { - // aggressive optimization for the purpose of fs walking - globParts = this.firstPhasePreProcess(globParts); - globParts = this.secondPhasePreProcess(globParts); - } - else if (optimizationLevel >= 1) { - // just basic optimizations to remove some .. parts - globParts = this.levelOneOptimize(globParts); - } - else { - // just collapse multiple ** portions into one - globParts = this.adjascentGlobstarOptimize(globParts); - } - return globParts; - } - // just get rid of adjascent ** portions - adjascentGlobstarOptimize(globParts) { - return globParts.map(parts => { - let gs = -1; - while (-1 !== (gs = parts.indexOf('**', gs + 1))) { - let i = gs; - while (parts[i + 1] === '**') { - i++; - } - if (i !== gs) { - parts.splice(gs, i - gs); - } - } - return parts; - }); - } - // get rid of adjascent ** and resolve .. portions - levelOneOptimize(globParts) { - return globParts.map(parts => { - parts = parts.reduce((set, part) => { - const prev = set[set.length - 1]; - if (part === '**' && prev === '**') { - return set; - } - if (part === '..') { - if (prev && prev !== '..' && prev !== '.' && prev !== '**') { - set.pop(); - return set; - } - } - set.push(part); - return set; - }, []); - return parts.length === 0 ? [''] : parts; - }); - } - levelTwoFileOptimize(parts) { - if (!Array.isArray(parts)) { - parts = this.slashSplit(parts); - } - let didSomething = false; - do { - didSomething = false; - //
    // -> 
    /
    -            if (!this.preserveMultipleSlashes) {
    -                for (let i = 1; i < parts.length - 1; i++) {
    -                    const p = parts[i];
    -                    // don't squeeze out UNC patterns
    -                    if (i === 1 && p === '' && parts[0] === '')
    -                        continue;
    -                    if (p === '.' || p === '') {
    -                        didSomething = true;
    -                        parts.splice(i, 1);
    -                        i--;
    -                    }
    -                }
    -                if (parts[0] === '.' &&
    -                    parts.length === 2 &&
    -                    (parts[1] === '.' || parts[1] === '')) {
    -                    didSomething = true;
    -                    parts.pop();
    -                }
    -            }
    -            // 
    /

    /../ ->

    /
    -            let dd = 0;
    -            while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
    -                const p = parts[dd - 1];
    -                if (p && p !== '.' && p !== '..' && p !== '**') {
    -                    didSomething = true;
    -                    parts.splice(dd - 1, 2);
    -                    dd -= 2;
    -                }
    -            }
    -        } while (didSomething);
    -        return parts.length === 0 ? [''] : parts;
    -    }
    -    // First phase: single-pattern processing
    -    // 
     is 1 or more portions
    -    //  is 1 or more portions
    -    // 

    is any portion other than ., .., '', or ** - // is . or '' - // - // **/.. is *brutal* for filesystem walking performance, because - // it effectively resets the recursive walk each time it occurs, - // and ** cannot be reduced out by a .. pattern part like a regexp - // or most strings (other than .., ., and '') can be. - // - //

    /**/../

    /

    / -> {

    /../

    /

    /,

    /**/

    /

    /} - //

    // -> 
    /
    -    // 
    /

    /../ ->

    /
    -    // **/**/ -> **/
    -    //
    -    // **/*/ -> */**/ <== not valid because ** doesn't follow
    -    // this WOULD be allowed if ** did follow symlinks, or * didn't
    -    firstPhasePreProcess(globParts) {
    -        let didSomething = false;
    -        do {
    -            didSomething = false;
    -            // 
    /**/../

    /

    / -> {

    /../

    /

    /,

    /**/

    /

    /} - for (let parts of globParts) { - let gs = -1; - while (-1 !== (gs = parts.indexOf('**', gs + 1))) { - let gss = gs; - while (parts[gss + 1] === '**') { - //

    /**/**/ -> 
    /**/
    -                        gss++;
    -                    }
    -                    // eg, if gs is 2 and gss is 4, that means we have 3 **
    -                    // parts, and can remove 2 of them.
    -                    if (gss > gs) {
    -                        parts.splice(gs + 1, gss - gs);
    -                    }
    -                    let next = parts[gs + 1];
    -                    const p = parts[gs + 2];
    -                    const p2 = parts[gs + 3];
    -                    if (next !== '..')
    -                        continue;
    -                    if (!p ||
    -                        p === '.' ||
    -                        p === '..' ||
    -                        !p2 ||
    -                        p2 === '.' ||
    -                        p2 === '..') {
    -                        continue;
    -                    }
    -                    didSomething = true;
    -                    // edit parts in place, and push the new one
    -                    parts.splice(gs, 1);
    -                    const other = parts.slice(0);
    -                    other[gs] = '**';
    -                    globParts.push(other);
    -                    gs--;
    -                }
    -                // 
    // -> 
    /
    -                if (!this.preserveMultipleSlashes) {
    -                    for (let i = 1; i < parts.length - 1; i++) {
    -                        const p = parts[i];
    -                        // don't squeeze out UNC patterns
    -                        if (i === 1 && p === '' && parts[0] === '')
    -                            continue;
    -                        if (p === '.' || p === '') {
    -                            didSomething = true;
    -                            parts.splice(i, 1);
    -                            i--;
    -                        }
    -                    }
    -                    if (parts[0] === '.' &&
    -                        parts.length === 2 &&
    -                        (parts[1] === '.' || parts[1] === '')) {
    -                        didSomething = true;
    -                        parts.pop();
    -                    }
    -                }
    -                // 
    /

    /../ ->

    /
    -                let dd = 0;
    -                while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
    -                    const p = parts[dd - 1];
    -                    if (p && p !== '.' && p !== '..' && p !== '**') {
    -                        didSomething = true;
    -                        const needDot = dd === 1 && parts[dd + 1] === '**';
    -                        const splin = needDot ? ['.'] : [];
    -                        parts.splice(dd - 1, 2, ...splin);
    -                        if (parts.length === 0)
    -                            parts.push('');
    -                        dd -= 2;
    -                    }
    -                }
    -            }
    -        } while (didSomething);
    -        return globParts;
    -    }
    -    // second phase: multi-pattern dedupes
    -    // {
    /*/,
    /

    /} ->

    /*/
    -    // {
    /,
    /} -> 
    /
    -    // {
    /**/,
    /} -> 
    /**/
    -    //
    -    // {
    /**/,
    /**/

    /} ->

    /**/
    -    // ^-- not valid because ** doens't follow symlinks
    -    secondPhasePreProcess(globParts) {
    -        for (let i = 0; i < globParts.length - 1; i++) {
    -            for (let j = i + 1; j < globParts.length; j++) {
    -                const matched = this.partsMatch(globParts[i], globParts[j], !this.preserveMultipleSlashes);
    -                if (matched) {
    -                    globParts[i] = [];
    -                    globParts[j] = matched;
    -                    break;
    -                }
    -            }
    -        }
    -        return globParts.filter(gs => gs.length);
    -    }
    -    partsMatch(a, b, emptyGSMatch = false) {
    -        let ai = 0;
    -        let bi = 0;
    -        let result = [];
    -        let which = '';
    -        while (ai < a.length && bi < b.length) {
    -            if (a[ai] === b[bi]) {
    -                result.push(which === 'b' ? b[bi] : a[ai]);
    -                ai++;
    -                bi++;
    -            }
    -            else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {
    -                result.push(a[ai]);
    -                ai++;
    -            }
    -            else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {
    -                result.push(b[bi]);
    -                bi++;
    -            }
    -            else if (a[ai] === '*' &&
    -                b[bi] &&
    -                (this.options.dot || !b[bi].startsWith('.')) &&
    -                b[bi] !== '**') {
    -                if (which === 'b')
    -                    return false;
    -                which = 'a';
    -                result.push(a[ai]);
    -                ai++;
    -                bi++;
    -            }
    -            else if (b[bi] === '*' &&
    -                a[ai] &&
    -                (this.options.dot || !a[ai].startsWith('.')) &&
    -                a[ai] !== '**') {
    -                if (which === 'a')
    -                    return false;
    -                which = 'b';
    -                result.push(b[bi]);
    -                ai++;
    -                bi++;
    -            }
    -            else {
    -                return false;
    -            }
    -        }
    -        // if we fall out of the loop, it means they two are identical
    -        // as long as their lengths match
    -        return a.length === b.length && result;
    -    }
    -    parseNegate() {
    -        if (this.nonegate)
    -            return;
    -        const pattern = this.pattern;
    -        let negate = false;
    -        let negateOffset = 0;
    -        for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {
    -            negate = !negate;
    -            negateOffset++;
    -        }
    -        if (negateOffset)
    -            this.pattern = pattern.slice(negateOffset);
    -        this.negate = negate;
    -    }
    -    // set partial to true to test if, for example,
    -    // "/a/b" matches the start of "/*/b/*/d"
    -    // Partial means, if you run out of file before you run
    -    // out of pattern, then that's fine, as long as all
    -    // the parts match.
    -    matchOne(file, pattern, partial = false) {
    -        const options = this.options;
    -        // UNC paths like //?/X:/... can match X:/... and vice versa
    -        // Drive letters in absolute drive or unc paths are always compared
    -        // case-insensitively.
    -        if (this.isWindows) {
    -            const fileDrive = typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0]);
    -            const fileUNC = !fileDrive &&
    -                file[0] === '' &&
    -                file[1] === '' &&
    -                file[2] === '?' &&
    -                /^[a-z]:$/i.test(file[3]);
    -            const patternDrive = typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0]);
    -            const patternUNC = !patternDrive &&
    -                pattern[0] === '' &&
    -                pattern[1] === '' &&
    -                pattern[2] === '?' &&
    -                typeof pattern[3] === 'string' &&
    -                /^[a-z]:$/i.test(pattern[3]);
    -            const fdi = fileUNC ? 3 : fileDrive ? 0 : undefined;
    -            const pdi = patternUNC ? 3 : patternDrive ? 0 : undefined;
    -            if (typeof fdi === 'number' && typeof pdi === 'number') {
    -                const [fd, pd] = [file[fdi], pattern[pdi]];
    -                if (fd.toLowerCase() === pd.toLowerCase()) {
    -                    pattern[pdi] = fd;
    -                    if (pdi > fdi) {
    -                        pattern = pattern.slice(pdi);
    -                    }
    -                    else if (fdi > pdi) {
    -                        file = file.slice(fdi);
    -                    }
    -                }
    -            }
    -        }
    -        // resolve and reduce . and .. portions in the file as well.
    -        // dont' need to do the second phase, because it's only one string[]
    -        const { optimizationLevel = 1 } = this.options;
    -        if (optimizationLevel >= 2) {
    -            file = this.levelTwoFileOptimize(file);
    -        }
    -        this.debug('matchOne', this, { file, pattern });
    -        this.debug('matchOne', file.length, pattern.length);
    -        for (var fi = 0, pi = 0, fl = file.length, pl = pattern.length; fi < fl && pi < pl; fi++, pi++) {
    -            this.debug('matchOne loop');
    -            var p = pattern[pi];
    -            var f = file[fi];
    -            this.debug(pattern, p, f);
    -            // should be impossible.
    -            // some invalid regexp stuff in the set.
    -            /* c8 ignore start */
    -            if (p === false) {
    -                return false;
    -            }
    -            /* c8 ignore stop */
    -            if (p === exports.GLOBSTAR) {
    -                this.debug('GLOBSTAR', [pattern, p, f]);
    -                // "**"
    -                // a/**/b/**/c would match the following:
    -                // a/b/x/y/z/c
    -                // a/x/y/z/b/c
    -                // a/b/x/b/x/c
    -                // a/b/c
    -                // To do this, take the rest of the pattern after
    -                // the **, and see if it would match the file remainder.
    -                // If so, return success.
    -                // If not, the ** "swallows" a segment, and try again.
    -                // This is recursively awful.
    -                //
    -                // a/**/b/**/c matching a/b/x/y/z/c
    -                // - a matches a
    -                // - doublestar
    -                //   - matchOne(b/x/y/z/c, b/**/c)
    -                //     - b matches b
    -                //     - doublestar
    -                //       - matchOne(x/y/z/c, c) -> no
    -                //       - matchOne(y/z/c, c) -> no
    -                //       - matchOne(z/c, c) -> no
    -                //       - matchOne(c, c) yes, hit
    -                var fr = fi;
    -                var pr = pi + 1;
    -                if (pr === pl) {
    -                    this.debug('** at the end');
    -                    // a ** at the end will just swallow the rest.
    -                    // We have found a match.
    -                    // however, it will not swallow /.x, unless
    -                    // options.dot is set.
    -                    // . and .. are *never* matched by **, for explosively
    -                    // exponential reasons.
    -                    for (; fi < fl; fi++) {
    -                        if (file[fi] === '.' ||
    -                            file[fi] === '..' ||
    -                            (!options.dot && file[fi].charAt(0) === '.'))
    -                            return false;
    -                    }
    -                    return true;
    -                }
    -                // ok, let's see if we can swallow whatever we can.
    -                while (fr < fl) {
    -                    var swallowee = file[fr];
    -                    this.debug('\nglobstar while', file, fr, pattern, pr, swallowee);
    -                    // XXX remove this slice.  Just pass the start index.
    -                    if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
    -                        this.debug('globstar found match!', fr, fl, swallowee);
    -                        // found a match.
    -                        return true;
    -                    }
    -                    else {
    -                        // can't swallow "." or ".." ever.
    -                        // can only swallow ".foo" when explicitly asked.
    -                        if (swallowee === '.' ||
    -                            swallowee === '..' ||
    -                            (!options.dot && swallowee.charAt(0) === '.')) {
    -                            this.debug('dot detected!', file, fr, pattern, pr);
    -                            break;
    -                        }
    -                        // ** swallows a segment, and continue.
    -                        this.debug('globstar swallow a segment, and continue');
    -                        fr++;
    -                    }
    -                }
    -                // no match was found.
    -                // However, in partial mode, we can't say this is necessarily over.
    -                /* c8 ignore start */
    -                if (partial) {
    -                    // ran out of file
    -                    this.debug('\n>>> no match, partial?', file, fr, pattern, pr);
    -                    if (fr === fl) {
    -                        return true;
    -                    }
    -                }
    -                /* c8 ignore stop */
    -                return false;
    -            }
    -            // something other than **
    -            // non-magic patterns just have to match exactly
    -            // patterns with magic have been turned into regexps.
    -            let hit;
    -            if (typeof p === 'string') {
    -                hit = f === p;
    -                this.debug('string match', p, f, hit);
    -            }
    -            else {
    -                hit = p.test(f);
    -                this.debug('pattern match', p, f, hit);
    -            }
    -            if (!hit)
    -                return false;
    -        }
    -        // Note: ending in / means that we'll get a final ""
    -        // at the end of the pattern.  This can only match a
    -        // corresponding "" at the end of the file.
    -        // If the file ends in /, then it can only match a
    -        // a pattern that ends in /, unless the pattern just
    -        // doesn't have any more for it. But, a/b/ should *not*
    -        // match "a/b/*", even though "" matches against the
    -        // [^/]*? pattern, except in partial mode, where it might
    -        // simply not be reached yet.
    -        // However, a/b/ should still satisfy a/*
    -        // now either we fell off the end of the pattern, or we're done.
    -        if (fi === fl && pi === pl) {
    -            // ran out of pattern and filename at the same time.
    -            // an exact hit!
    -            return true;
    -        }
    -        else if (fi === fl) {
    -            // ran out of file, but still had pattern left.
    -            // this is ok if we're doing the match as part of
    -            // a glob fs traversal.
    -            return partial;
    -        }
    -        else if (pi === pl) {
    -            // ran out of pattern, still have file left.
    -            // this is only acceptable if we're on the very last
    -            // empty segment of a file with a trailing slash.
    -            // a/* should match a/b/
    -            return fi === fl - 1 && file[fi] === '';
    -            /* c8 ignore start */
    -        }
    -        else {
    -            // should be unreachable.
    -            throw new Error('wtf?');
    -        }
    -        /* c8 ignore stop */
    -    }
    -    braceExpand() {
    -        return (0, exports.braceExpand)(this.pattern, this.options);
    -    }
    -    parse(pattern) {
    -        (0, assert_valid_pattern_js_1.assertValidPattern)(pattern);
    -        const options = this.options;
    -        // shortcuts
    -        if (pattern === '**')
    -            return exports.GLOBSTAR;
    -        if (pattern === '')
    -            return '';
    -        // far and away, the most common glob pattern parts are
    -        // *, *.*, and *.  Add a fast check method for those.
    -        let m;
    -        let fastTest = null;
    -        if ((m = pattern.match(starRE))) {
    -            fastTest = options.dot ? starTestDot : starTest;
    -        }
    -        else if ((m = pattern.match(starDotExtRE))) {
    -            fastTest = (options.nocase
    -                ? options.dot
    -                    ? starDotExtTestNocaseDot
    -                    : starDotExtTestNocase
    -                : options.dot
    -                    ? starDotExtTestDot
    -                    : starDotExtTest)(m[1]);
    -        }
    -        else if ((m = pattern.match(qmarksRE))) {
    -            fastTest = (options.nocase
    -                ? options.dot
    -                    ? qmarksTestNocaseDot
    -                    : qmarksTestNocase
    -                : options.dot
    -                    ? qmarksTestDot
    -                    : qmarksTest)(m);
    -        }
    -        else if ((m = pattern.match(starDotStarRE))) {
    -            fastTest = options.dot ? starDotStarTestDot : starDotStarTest;
    -        }
    -        else if ((m = pattern.match(dotStarRE))) {
    -            fastTest = dotStarTest;
    -        }
    -        const re = ast_js_1.AST.fromGlob(pattern, this.options).toMMPattern();
    -        if (fastTest && typeof re === 'object') {
    -            // Avoids overriding in frozen environments
    -            Reflect.defineProperty(re, 'test', { value: fastTest });
    -        }
    -        return re;
    -    }
    -    makeRe() {
    -        if (this.regexp || this.regexp === false)
    -            return this.regexp;
    -        // at this point, this.set is a 2d array of partial
    -        // pattern strings, or "**".
    -        //
    -        // It's better to use .match().  This function shouldn't
    -        // be used, really, but it's pretty convenient sometimes,
    -        // when you just want to work with a regex.
    -        const set = this.set;
    -        if (!set.length) {
    -            this.regexp = false;
    -            return this.regexp;
    -        }
    -        const options = this.options;
    -        const twoStar = options.noglobstar
    -            ? star
    -            : options.dot
    -                ? twoStarDot
    -                : twoStarNoDot;
    -        const flags = new Set(options.nocase ? ['i'] : []);
    -        // regexpify non-globstar patterns
    -        // if ** is only item, then we just do one twoStar
    -        // if ** is first, and there are more, prepend (\/|twoStar\/)? to next
    -        // if ** is last, append (\/twoStar|) to previous
    -        // if ** is in the middle, append (\/|\/twoStar\/) to previous
    -        // then filter out GLOBSTAR symbols
    -        let re = set
    -            .map(pattern => {
    -            const pp = pattern.map(p => {
    -                if (p instanceof RegExp) {
    -                    for (const f of p.flags.split(''))
    -                        flags.add(f);
    -                }
    -                return typeof p === 'string'
    -                    ? regExpEscape(p)
    -                    : p === exports.GLOBSTAR
    -                        ? exports.GLOBSTAR
    -                        : p._src;
    -            });
    -            pp.forEach((p, i) => {
    -                const next = pp[i + 1];
    -                const prev = pp[i - 1];
    -                if (p !== exports.GLOBSTAR || prev === exports.GLOBSTAR) {
    -                    return;
    -                }
    -                if (prev === undefined) {
    -                    if (next !== undefined && next !== exports.GLOBSTAR) {
    -                        pp[i + 1] = '(?:\\/|' + twoStar + '\\/)?' + next;
    -                    }
    -                    else {
    -                        pp[i] = twoStar;
    -                    }
    -                }
    -                else if (next === undefined) {
    -                    pp[i - 1] = prev + '(?:\\/|' + twoStar + ')?';
    -                }
    -                else if (next !== exports.GLOBSTAR) {
    -                    pp[i - 1] = prev + '(?:\\/|\\/' + twoStar + '\\/)' + next;
    -                    pp[i + 1] = exports.GLOBSTAR;
    -                }
    -            });
    -            return pp.filter(p => p !== exports.GLOBSTAR).join('/');
    -        })
    -            .join('|');
    -        // need to wrap in parens if we had more than one thing with |,
    -        // otherwise only the first will be anchored to ^ and the last to $
    -        const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', ''];
    -        // must match entire pattern
    -        // ending in a * or ** will make it less strict.
    -        re = '^' + open + re + close + '$';
    -        // can match anything, as long as it's not this.
    -        if (this.negate)
    -            re = '^(?!' + re + ').+$';
    -        try {
    -            this.regexp = new RegExp(re, [...flags].join(''));
    -            /* c8 ignore start */
    -        }
    -        catch (ex) {
    -            // should be impossible
    -            this.regexp = false;
    -        }
    -        /* c8 ignore stop */
    -        return this.regexp;
    -    }
    -    slashSplit(p) {
    -        // if p starts with // on windows, we preserve that
    -        // so that UNC paths aren't broken.  Otherwise, any number of
    -        // / characters are coalesced into one, unless
    -        // preserveMultipleSlashes is set to true.
    -        if (this.preserveMultipleSlashes) {
    -            return p.split('/');
    -        }
    -        else if (this.isWindows && /^\/\/[^\/]+/.test(p)) {
    -            // add an extra '' for the one we lose
    -            return ['', ...p.split(/\/+/)];
    -        }
    -        else {
    -            return p.split(/\/+/);
    -        }
    -    }
    -    match(f, partial = this.partial) {
    -        this.debug('match', f, this.pattern);
    -        // short-circuit in the case of busted things.
    -        // comments, etc.
    -        if (this.comment) {
    -            return false;
    -        }
    -        if (this.empty) {
    -            return f === '';
    -        }
    -        if (f === '/' && partial) {
    -            return true;
    -        }
    -        const options = this.options;
    -        // windows: need to use /, not \
    -        if (this.isWindows) {
    -            f = f.split('\\').join('/');
    -        }
    -        // treat the test path as a set of pathparts.
    -        const ff = this.slashSplit(f);
    -        this.debug(this.pattern, 'split', ff);
    -        // just ONE of the pattern sets in this.set needs to match
    -        // in order for it to be valid.  If negating, then just one
    -        // match means that we have failed.
    -        // Either way, return on the first hit.
    -        const set = this.set;
    -        this.debug(this.pattern, 'set', set);
    -        // Find the basename of the path by looking for the last non-empty segment
    -        let filename = ff[ff.length - 1];
    -        if (!filename) {
    -            for (let i = ff.length - 2; !filename && i >= 0; i--) {
    -                filename = ff[i];
    -            }
    -        }
    -        for (let i = 0; i < set.length; i++) {
    -            const pattern = set[i];
    -            let file = ff;
    -            if (options.matchBase && pattern.length === 1) {
    -                file = [filename];
    -            }
    -            const hit = this.matchOne(file, pattern, partial);
    -            if (hit) {
    -                if (options.flipNegate) {
    -                    return true;
    -                }
    -                return !this.negate;
    -            }
    -        }
    -        // didn't get any hits.  this is success if it's a negative
    -        // pattern, failure otherwise.
    -        if (options.flipNegate) {
    -            return false;
    -        }
    -        return this.negate;
    -    }
    -    static defaults(def) {
    -        return exports.minimatch.defaults(def).Minimatch;
    -    }
    -}
    -exports.Minimatch = Minimatch;
    -/* c8 ignore start */
    -var ast_js_2 = require("./ast.js");
    -Object.defineProperty(exports, "AST", { enumerable: true, get: function () { return ast_js_2.AST; } });
    -var escape_js_2 = require("./escape.js");
    -Object.defineProperty(exports, "escape", { enumerable: true, get: function () { return escape_js_2.escape; } });
    -var unescape_js_2 = require("./unescape.js");
    -Object.defineProperty(exports, "unescape", { enumerable: true, get: function () { return unescape_js_2.unescape; } });
    -/* c8 ignore stop */
    -exports.minimatch.AST = ast_js_1.AST;
    -exports.minimatch.Minimatch = Minimatch;
    -exports.minimatch.escape = escape_js_1.escape;
    -exports.minimatch.unescape = unescape_js_1.unescape;
    -//# sourceMappingURL=index.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/commonjs/package.json b/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/commonjs/package.json
    deleted file mode 100644
    index 5bbefffbabee39..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/commonjs/package.json
    +++ /dev/null
    @@ -1,3 +0,0 @@
    -{
    -  "type": "commonjs"
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/commonjs/unescape.js b/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/commonjs/unescape.js
    deleted file mode 100644
    index 47c36bcee5a02a..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/commonjs/unescape.js
    +++ /dev/null
    @@ -1,24 +0,0 @@
    -"use strict";
    -Object.defineProperty(exports, "__esModule", { value: true });
    -exports.unescape = void 0;
    -/**
    - * Un-escape a string that has been escaped with {@link escape}.
    - *
    - * If the {@link windowsPathsNoEscape} option is used, then square-brace
    - * escapes are removed, but not backslash escapes.  For example, it will turn
    - * the string `'[*]'` into `*`, but it will not turn `'\\*'` into `'*'`,
    - * becuase `\` is a path separator in `windowsPathsNoEscape` mode.
    - *
    - * When `windowsPathsNoEscape` is not set, then both brace escapes and
    - * backslash escapes are removed.
    - *
    - * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped
    - * or unescaped.
    - */
    -const unescape = (s, { windowsPathsNoEscape = false, } = {}) => {
    -    return windowsPathsNoEscape
    -        ? s.replace(/\[([^\/\\])\]/g, '$1')
    -        : s.replace(/((?!\\).|^)\[([^\/\\])\]/g, '$1$2').replace(/\\([^\/])/g, '$1');
    -};
    -exports.unescape = unescape;
    -//# sourceMappingURL=unescape.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/esm/assert-valid-pattern.js b/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/esm/assert-valid-pattern.js
    deleted file mode 100644
    index 7b534fc30200bb..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/esm/assert-valid-pattern.js
    +++ /dev/null
    @@ -1,10 +0,0 @@
    -const MAX_PATTERN_LENGTH = 1024 * 64;
    -export const assertValidPattern = (pattern) => {
    -    if (typeof pattern !== 'string') {
    -        throw new TypeError('invalid pattern');
    -    }
    -    if (pattern.length > MAX_PATTERN_LENGTH) {
    -        throw new TypeError('pattern is too long');
    -    }
    -};
    -//# sourceMappingURL=assert-valid-pattern.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/esm/ast.js b/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/esm/ast.js
    deleted file mode 100644
    index 02c6bda68427fc..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/esm/ast.js
    +++ /dev/null
    @@ -1,588 +0,0 @@
    -// parse a single path portion
    -import { parseClass } from './brace-expressions.js';
    -import { unescape } from './unescape.js';
    -const types = new Set(['!', '?', '+', '*', '@']);
    -const isExtglobType = (c) => types.has(c);
    -// Patterns that get prepended to bind to the start of either the
    -// entire string, or just a single path portion, to prevent dots
    -// and/or traversal patterns, when needed.
    -// Exts don't need the ^ or / bit, because the root binds that already.
    -const startNoTraversal = '(?!(?:^|/)\\.\\.?(?:$|/))';
    -const startNoDot = '(?!\\.)';
    -// characters that indicate a start of pattern needs the "no dots" bit,
    -// because a dot *might* be matched. ( is not in the list, because in
    -// the case of a child extglob, it will handle the prevention itself.
    -const addPatternStart = new Set(['[', '.']);
    -// cases where traversal is A-OK, no dot prevention needed
    -const justDots = new Set(['..', '.']);
    -const reSpecials = new Set('().*{}+?[]^$\\!');
    -const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
    -// any single thing other than /
    -const qmark = '[^/]';
    -// * => any number of characters
    -const star = qmark + '*?';
    -// use + when we need to ensure that *something* matches, because the * is
    -// the only thing in the path portion.
    -const starNoEmpty = qmark + '+?';
    -// remove the \ chars that we added if we end up doing a nonmagic compare
    -// const deslash = (s: string) => s.replace(/\\(.)/g, '$1')
    -export class AST {
    -    type;
    -    #root;
    -    #hasMagic;
    -    #uflag = false;
    -    #parts = [];
    -    #parent;
    -    #parentIndex;
    -    #negs;
    -    #filledNegs = false;
    -    #options;
    -    #toString;
    -    // set to true if it's an extglob with no children
    -    // (which really means one child of '')
    -    #emptyExt = false;
    -    constructor(type, parent, options = {}) {
    -        this.type = type;
    -        // extglobs are inherently magical
    -        if (type)
    -            this.#hasMagic = true;
    -        this.#parent = parent;
    -        this.#root = this.#parent ? this.#parent.#root : this;
    -        this.#options = this.#root === this ? options : this.#root.#options;
    -        this.#negs = this.#root === this ? [] : this.#root.#negs;
    -        if (type === '!' && !this.#root.#filledNegs)
    -            this.#negs.push(this);
    -        this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0;
    -    }
    -    get hasMagic() {
    -        /* c8 ignore start */
    -        if (this.#hasMagic !== undefined)
    -            return this.#hasMagic;
    -        /* c8 ignore stop */
    -        for (const p of this.#parts) {
    -            if (typeof p === 'string')
    -                continue;
    -            if (p.type || p.hasMagic)
    -                return (this.#hasMagic = true);
    -        }
    -        // note: will be undefined until we generate the regexp src and find out
    -        return this.#hasMagic;
    -    }
    -    // reconstructs the pattern
    -    toString() {
    -        if (this.#toString !== undefined)
    -            return this.#toString;
    -        if (!this.type) {
    -            return (this.#toString = this.#parts.map(p => String(p)).join(''));
    -        }
    -        else {
    -            return (this.#toString =
    -                this.type + '(' + this.#parts.map(p => String(p)).join('|') + ')');
    -        }
    -    }
    -    #fillNegs() {
    -        /* c8 ignore start */
    -        if (this !== this.#root)
    -            throw new Error('should only call on root');
    -        if (this.#filledNegs)
    -            return this;
    -        /* c8 ignore stop */
    -        // call toString() once to fill this out
    -        this.toString();
    -        this.#filledNegs = true;
    -        let n;
    -        while ((n = this.#negs.pop())) {
    -            if (n.type !== '!')
    -                continue;
    -            // walk up the tree, appending everthing that comes AFTER parentIndex
    -            let p = n;
    -            let pp = p.#parent;
    -            while (pp) {
    -                for (let i = p.#parentIndex + 1; !pp.type && i < pp.#parts.length; i++) {
    -                    for (const part of n.#parts) {
    -                        /* c8 ignore start */
    -                        if (typeof part === 'string') {
    -                            throw new Error('string part in extglob AST??');
    -                        }
    -                        /* c8 ignore stop */
    -                        part.copyIn(pp.#parts[i]);
    -                    }
    -                }
    -                p = pp;
    -                pp = p.#parent;
    -            }
    -        }
    -        return this;
    -    }
    -    push(...parts) {
    -        for (const p of parts) {
    -            if (p === '')
    -                continue;
    -            /* c8 ignore start */
    -            if (typeof p !== 'string' && !(p instanceof AST && p.#parent === this)) {
    -                throw new Error('invalid part: ' + p);
    -            }
    -            /* c8 ignore stop */
    -            this.#parts.push(p);
    -        }
    -    }
    -    toJSON() {
    -        const ret = this.type === null
    -            ? this.#parts.slice().map(p => (typeof p === 'string' ? p : p.toJSON()))
    -            : [this.type, ...this.#parts.map(p => p.toJSON())];
    -        if (this.isStart() && !this.type)
    -            ret.unshift([]);
    -        if (this.isEnd() &&
    -            (this === this.#root ||
    -                (this.#root.#filledNegs && this.#parent?.type === '!'))) {
    -            ret.push({});
    -        }
    -        return ret;
    -    }
    -    isStart() {
    -        if (this.#root === this)
    -            return true;
    -        // if (this.type) return !!this.#parent?.isStart()
    -        if (!this.#parent?.isStart())
    -            return false;
    -        if (this.#parentIndex === 0)
    -            return true;
    -        // if everything AHEAD of this is a negation, then it's still the "start"
    -        const p = this.#parent;
    -        for (let i = 0; i < this.#parentIndex; i++) {
    -            const pp = p.#parts[i];
    -            if (!(pp instanceof AST && pp.type === '!')) {
    -                return false;
    -            }
    -        }
    -        return true;
    -    }
    -    isEnd() {
    -        if (this.#root === this)
    -            return true;
    -        if (this.#parent?.type === '!')
    -            return true;
    -        if (!this.#parent?.isEnd())
    -            return false;
    -        if (!this.type)
    -            return this.#parent?.isEnd();
    -        // if not root, it'll always have a parent
    -        /* c8 ignore start */
    -        const pl = this.#parent ? this.#parent.#parts.length : 0;
    -        /* c8 ignore stop */
    -        return this.#parentIndex === pl - 1;
    -    }
    -    copyIn(part) {
    -        if (typeof part === 'string')
    -            this.push(part);
    -        else
    -            this.push(part.clone(this));
    -    }
    -    clone(parent) {
    -        const c = new AST(this.type, parent);
    -        for (const p of this.#parts) {
    -            c.copyIn(p);
    -        }
    -        return c;
    -    }
    -    static #parseAST(str, ast, pos, opt) {
    -        let escaping = false;
    -        let inBrace = false;
    -        let braceStart = -1;
    -        let braceNeg = false;
    -        if (ast.type === null) {
    -            // outside of a extglob, append until we find a start
    -            let i = pos;
    -            let acc = '';
    -            while (i < str.length) {
    -                const c = str.charAt(i++);
    -                // still accumulate escapes at this point, but we do ignore
    -                // starts that are escaped
    -                if (escaping || c === '\\') {
    -                    escaping = !escaping;
    -                    acc += c;
    -                    continue;
    -                }
    -                if (inBrace) {
    -                    if (i === braceStart + 1) {
    -                        if (c === '^' || c === '!') {
    -                            braceNeg = true;
    -                        }
    -                    }
    -                    else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {
    -                        inBrace = false;
    -                    }
    -                    acc += c;
    -                    continue;
    -                }
    -                else if (c === '[') {
    -                    inBrace = true;
    -                    braceStart = i;
    -                    braceNeg = false;
    -                    acc += c;
    -                    continue;
    -                }
    -                if (!opt.noext && isExtglobType(c) && str.charAt(i) === '(') {
    -                    ast.push(acc);
    -                    acc = '';
    -                    const ext = new AST(c, ast);
    -                    i = AST.#parseAST(str, ext, i, opt);
    -                    ast.push(ext);
    -                    continue;
    -                }
    -                acc += c;
    -            }
    -            ast.push(acc);
    -            return i;
    -        }
    -        // some kind of extglob, pos is at the (
    -        // find the next | or )
    -        let i = pos + 1;
    -        let part = new AST(null, ast);
    -        const parts = [];
    -        let acc = '';
    -        while (i < str.length) {
    -            const c = str.charAt(i++);
    -            // still accumulate escapes at this point, but we do ignore
    -            // starts that are escaped
    -            if (escaping || c === '\\') {
    -                escaping = !escaping;
    -                acc += c;
    -                continue;
    -            }
    -            if (inBrace) {
    -                if (i === braceStart + 1) {
    -                    if (c === '^' || c === '!') {
    -                        braceNeg = true;
    -                    }
    -                }
    -                else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {
    -                    inBrace = false;
    -                }
    -                acc += c;
    -                continue;
    -            }
    -            else if (c === '[') {
    -                inBrace = true;
    -                braceStart = i;
    -                braceNeg = false;
    -                acc += c;
    -                continue;
    -            }
    -            if (isExtglobType(c) && str.charAt(i) === '(') {
    -                part.push(acc);
    -                acc = '';
    -                const ext = new AST(c, part);
    -                part.push(ext);
    -                i = AST.#parseAST(str, ext, i, opt);
    -                continue;
    -            }
    -            if (c === '|') {
    -                part.push(acc);
    -                acc = '';
    -                parts.push(part);
    -                part = new AST(null, ast);
    -                continue;
    -            }
    -            if (c === ')') {
    -                if (acc === '' && ast.#parts.length === 0) {
    -                    ast.#emptyExt = true;
    -                }
    -                part.push(acc);
    -                acc = '';
    -                ast.push(...parts, part);
    -                return i;
    -            }
    -            acc += c;
    -        }
    -        // unfinished extglob
    -        // if we got here, it was a malformed extglob! not an extglob, but
    -        // maybe something else in there.
    -        ast.type = null;
    -        ast.#hasMagic = undefined;
    -        ast.#parts = [str.substring(pos - 1)];
    -        return i;
    -    }
    -    static fromGlob(pattern, options = {}) {
    -        const ast = new AST(null, undefined, options);
    -        AST.#parseAST(pattern, ast, 0, options);
    -        return ast;
    -    }
    -    // returns the regular expression if there's magic, or the unescaped
    -    // string if not.
    -    toMMPattern() {
    -        // should only be called on root
    -        /* c8 ignore start */
    -        if (this !== this.#root)
    -            return this.#root.toMMPattern();
    -        /* c8 ignore stop */
    -        const glob = this.toString();
    -        const [re, body, hasMagic, uflag] = this.toRegExpSource();
    -        // if we're in nocase mode, and not nocaseMagicOnly, then we do
    -        // still need a regular expression if we have to case-insensitively
    -        // match capital/lowercase characters.
    -        const anyMagic = hasMagic ||
    -            this.#hasMagic ||
    -            (this.#options.nocase &&
    -                !this.#options.nocaseMagicOnly &&
    -                glob.toUpperCase() !== glob.toLowerCase());
    -        if (!anyMagic) {
    -            return body;
    -        }
    -        const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : '');
    -        return Object.assign(new RegExp(`^${re}$`, flags), {
    -            _src: re,
    -            _glob: glob,
    -        });
    -    }
    -    get options() {
    -        return this.#options;
    -    }
    -    // returns the string match, the regexp source, whether there's magic
    -    // in the regexp (so a regular expression is required) and whether or
    -    // not the uflag is needed for the regular expression (for posix classes)
    -    // TODO: instead of injecting the start/end at this point, just return
    -    // the BODY of the regexp, along with the start/end portions suitable
    -    // for binding the start/end in either a joined full-path makeRe context
    -    // (where we bind to (^|/), or a standalone matchPart context (where
    -    // we bind to ^, and not /).  Otherwise slashes get duped!
    -    //
    -    // In part-matching mode, the start is:
    -    // - if not isStart: nothing
    -    // - if traversal possible, but not allowed: ^(?!\.\.?$)
    -    // - if dots allowed or not possible: ^
    -    // - if dots possible and not allowed: ^(?!\.)
    -    // end is:
    -    // - if not isEnd(): nothing
    -    // - else: $
    -    //
    -    // In full-path matching mode, we put the slash at the START of the
    -    // pattern, so start is:
    -    // - if first pattern: same as part-matching mode
    -    // - if not isStart(): nothing
    -    // - if traversal possible, but not allowed: /(?!\.\.?(?:$|/))
    -    // - if dots allowed or not possible: /
    -    // - if dots possible and not allowed: /(?!\.)
    -    // end is:
    -    // - if last pattern, same as part-matching mode
    -    // - else nothing
    -    //
    -    // Always put the (?:$|/) on negated tails, though, because that has to be
    -    // there to bind the end of the negated pattern portion, and it's easier to
    -    // just stick it in now rather than try to inject it later in the middle of
    -    // the pattern.
    -    //
    -    // We can just always return the same end, and leave it up to the caller
    -    // to know whether it's going to be used joined or in parts.
    -    // And, if the start is adjusted slightly, can do the same there:
    -    // - if not isStart: nothing
    -    // - if traversal possible, but not allowed: (?:/|^)(?!\.\.?$)
    -    // - if dots allowed or not possible: (?:/|^)
    -    // - if dots possible and not allowed: (?:/|^)(?!\.)
    -    //
    -    // But it's better to have a simpler binding without a conditional, for
    -    // performance, so probably better to return both start options.
    -    //
    -    // Then the caller just ignores the end if it's not the first pattern,
    -    // and the start always gets applied.
    -    //
    -    // But that's always going to be $ if it's the ending pattern, or nothing,
    -    // so the caller can just attach $ at the end of the pattern when building.
    -    //
    -    // So the todo is:
    -    // - better detect what kind of start is needed
    -    // - return both flavors of starting pattern
    -    // - attach $ at the end of the pattern when creating the actual RegExp
    -    //
    -    // Ah, but wait, no, that all only applies to the root when the first pattern
    -    // is not an extglob. If the first pattern IS an extglob, then we need all
    -    // that dot prevention biz to live in the extglob portions, because eg
    -    // +(*|.x*) can match .xy but not .yx.
    -    //
    -    // So, return the two flavors if it's #root and the first child is not an
    -    // AST, otherwise leave it to the child AST to handle it, and there,
    -    // use the (?:^|/) style of start binding.
    -    //
    -    // Even simplified further:
    -    // - Since the start for a join is eg /(?!\.) and the start for a part
    -    // is ^(?!\.), we can just prepend (?!\.) to the pattern (either root
    -    // or start or whatever) and prepend ^ or / at the Regexp construction.
    -    toRegExpSource(allowDot) {
    -        const dot = allowDot ?? !!this.#options.dot;
    -        if (this.#root === this)
    -            this.#fillNegs();
    -        if (!this.type) {
    -            const noEmpty = this.isStart() && this.isEnd();
    -            const src = this.#parts
    -                .map(p => {
    -                const [re, _, hasMagic, uflag] = typeof p === 'string'
    -                    ? AST.#parseGlob(p, this.#hasMagic, noEmpty)
    -                    : p.toRegExpSource(allowDot);
    -                this.#hasMagic = this.#hasMagic || hasMagic;
    -                this.#uflag = this.#uflag || uflag;
    -                return re;
    -            })
    -                .join('');
    -            let start = '';
    -            if (this.isStart()) {
    -                if (typeof this.#parts[0] === 'string') {
    -                    // this is the string that will match the start of the pattern,
    -                    // so we need to protect against dots and such.
    -                    // '.' and '..' cannot match unless the pattern is that exactly,
    -                    // even if it starts with . or dot:true is set.
    -                    const dotTravAllowed = this.#parts.length === 1 && justDots.has(this.#parts[0]);
    -                    if (!dotTravAllowed) {
    -                        const aps = addPatternStart;
    -                        // check if we have a possibility of matching . or ..,
    -                        // and prevent that.
    -                        const needNoTrav =
    -                        // dots are allowed, and the pattern starts with [ or .
    -                        (dot && aps.has(src.charAt(0))) ||
    -                            // the pattern starts with \., and then [ or .
    -                            (src.startsWith('\\.') && aps.has(src.charAt(2))) ||
    -                            // the pattern starts with \.\., and then [ or .
    -                            (src.startsWith('\\.\\.') && aps.has(src.charAt(4)));
    -                        // no need to prevent dots if it can't match a dot, or if a
    -                        // sub-pattern will be preventing it anyway.
    -                        const needNoDot = !dot && !allowDot && aps.has(src.charAt(0));
    -                        start = needNoTrav ? startNoTraversal : needNoDot ? startNoDot : '';
    -                    }
    -                }
    -            }
    -            // append the "end of path portion" pattern to negation tails
    -            let end = '';
    -            if (this.isEnd() &&
    -                this.#root.#filledNegs &&
    -                this.#parent?.type === '!') {
    -                end = '(?:$|\\/)';
    -            }
    -            const final = start + src + end;
    -            return [
    -                final,
    -                unescape(src),
    -                (this.#hasMagic = !!this.#hasMagic),
    -                this.#uflag,
    -            ];
    -        }
    -        // We need to calculate the body *twice* if it's a repeat pattern
    -        // at the start, once in nodot mode, then again in dot mode, so a
    -        // pattern like *(?) can match 'x.y'
    -        const repeated = this.type === '*' || this.type === '+';
    -        // some kind of extglob
    -        const start = this.type === '!' ? '(?:(?!(?:' : '(?:';
    -        let body = this.#partsToRegExp(dot);
    -        if (this.isStart() && this.isEnd() && !body && this.type !== '!') {
    -            // invalid extglob, has to at least be *something* present, if it's
    -            // the entire path portion.
    -            const s = this.toString();
    -            this.#parts = [s];
    -            this.type = null;
    -            this.#hasMagic = undefined;
    -            return [s, unescape(this.toString()), false, false];
    -        }
    -        // XXX abstract out this map method
    -        let bodyDotAllowed = !repeated || allowDot || dot || !startNoDot
    -            ? ''
    -            : this.#partsToRegExp(true);
    -        if (bodyDotAllowed === body) {
    -            bodyDotAllowed = '';
    -        }
    -        if (bodyDotAllowed) {
    -            body = `(?:${body})(?:${bodyDotAllowed})*?`;
    -        }
    -        // an empty !() is exactly equivalent to a starNoEmpty
    -        let final = '';
    -        if (this.type === '!' && this.#emptyExt) {
    -            final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty;
    -        }
    -        else {
    -            const close = this.type === '!'
    -                ? // !() must match something,but !(x) can match ''
    -                    '))' +
    -                        (this.isStart() && !dot && !allowDot ? startNoDot : '') +
    -                        star +
    -                        ')'
    -                : this.type === '@'
    -                    ? ')'
    -                    : this.type === '?'
    -                        ? ')?'
    -                        : this.type === '+' && bodyDotAllowed
    -                            ? ')'
    -                            : this.type === '*' && bodyDotAllowed
    -                                ? `)?`
    -                                : `)${this.type}`;
    -            final = start + body + close;
    -        }
    -        return [
    -            final,
    -            unescape(body),
    -            (this.#hasMagic = !!this.#hasMagic),
    -            this.#uflag,
    -        ];
    -    }
    -    #partsToRegExp(dot) {
    -        return this.#parts
    -            .map(p => {
    -            // extglob ASTs should only contain parent ASTs
    -            /* c8 ignore start */
    -            if (typeof p === 'string') {
    -                throw new Error('string type in extglob ast??');
    -            }
    -            /* c8 ignore stop */
    -            // can ignore hasMagic, because extglobs are already always magic
    -            const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot);
    -            this.#uflag = this.#uflag || uflag;
    -            return re;
    -        })
    -            .filter(p => !(this.isStart() && this.isEnd()) || !!p)
    -            .join('|');
    -    }
    -    static #parseGlob(glob, hasMagic, noEmpty = false) {
    -        let escaping = false;
    -        let re = '';
    -        let uflag = false;
    -        for (let i = 0; i < glob.length; i++) {
    -            const c = glob.charAt(i);
    -            if (escaping) {
    -                escaping = false;
    -                re += (reSpecials.has(c) ? '\\' : '') + c;
    -                continue;
    -            }
    -            if (c === '\\') {
    -                if (i === glob.length - 1) {
    -                    re += '\\\\';
    -                }
    -                else {
    -                    escaping = true;
    -                }
    -                continue;
    -            }
    -            if (c === '[') {
    -                const [src, needUflag, consumed, magic] = parseClass(glob, i);
    -                if (consumed) {
    -                    re += src;
    -                    uflag = uflag || needUflag;
    -                    i += consumed - 1;
    -                    hasMagic = hasMagic || magic;
    -                    continue;
    -                }
    -            }
    -            if (c === '*') {
    -                if (noEmpty && glob === '*')
    -                    re += starNoEmpty;
    -                else
    -                    re += star;
    -                hasMagic = true;
    -                continue;
    -            }
    -            if (c === '?') {
    -                re += qmark;
    -                hasMagic = true;
    -                continue;
    -            }
    -            re += regExpEscape(c);
    -        }
    -        return [re, unescape(glob), !!hasMagic, uflag];
    -    }
    -}
    -//# sourceMappingURL=ast.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/esm/brace-expressions.js b/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/esm/brace-expressions.js
    deleted file mode 100644
    index c629d6ae816e27..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/esm/brace-expressions.js
    +++ /dev/null
    @@ -1,148 +0,0 @@
    -// translate the various posix character classes into unicode properties
    -// this works across all unicode locales
    -// { : [, /u flag required, negated]
    -const posixClasses = {
    -    '[:alnum:]': ['\\p{L}\\p{Nl}\\p{Nd}', true],
    -    '[:alpha:]': ['\\p{L}\\p{Nl}', true],
    -    '[:ascii:]': ['\\x' + '00-\\x' + '7f', false],
    -    '[:blank:]': ['\\p{Zs}\\t', true],
    -    '[:cntrl:]': ['\\p{Cc}', true],
    -    '[:digit:]': ['\\p{Nd}', true],
    -    '[:graph:]': ['\\p{Z}\\p{C}', true, true],
    -    '[:lower:]': ['\\p{Ll}', true],
    -    '[:print:]': ['\\p{C}', true],
    -    '[:punct:]': ['\\p{P}', true],
    -    '[:space:]': ['\\p{Z}\\t\\r\\n\\v\\f', true],
    -    '[:upper:]': ['\\p{Lu}', true],
    -    '[:word:]': ['\\p{L}\\p{Nl}\\p{Nd}\\p{Pc}', true],
    -    '[:xdigit:]': ['A-Fa-f0-9', false],
    -};
    -// only need to escape a few things inside of brace expressions
    -// escapes: [ \ ] -
    -const braceEscape = (s) => s.replace(/[[\]\\-]/g, '\\$&');
    -// escape all regexp magic characters
    -const regexpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
    -// everything has already been escaped, we just have to join
    -const rangesToString = (ranges) => ranges.join('');
    -// takes a glob string at a posix brace expression, and returns
    -// an equivalent regular expression source, and boolean indicating
    -// whether the /u flag needs to be applied, and the number of chars
    -// consumed to parse the character class.
    -// This also removes out of order ranges, and returns ($.) if the
    -// entire class just no good.
    -export const parseClass = (glob, position) => {
    -    const pos = position;
    -    /* c8 ignore start */
    -    if (glob.charAt(pos) !== '[') {
    -        throw new Error('not in a brace expression');
    -    }
    -    /* c8 ignore stop */
    -    const ranges = [];
    -    const negs = [];
    -    let i = pos + 1;
    -    let sawStart = false;
    -    let uflag = false;
    -    let escaping = false;
    -    let negate = false;
    -    let endPos = pos;
    -    let rangeStart = '';
    -    WHILE: while (i < glob.length) {
    -        const c = glob.charAt(i);
    -        if ((c === '!' || c === '^') && i === pos + 1) {
    -            negate = true;
    -            i++;
    -            continue;
    -        }
    -        if (c === ']' && sawStart && !escaping) {
    -            endPos = i + 1;
    -            break;
    -        }
    -        sawStart = true;
    -        if (c === '\\') {
    -            if (!escaping) {
    -                escaping = true;
    -                i++;
    -                continue;
    -            }
    -            // escaped \ char, fall through and treat like normal char
    -        }
    -        if (c === '[' && !escaping) {
    -            // either a posix class, a collation equivalent, or just a [
    -            for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) {
    -                if (glob.startsWith(cls, i)) {
    -                    // invalid, [a-[] is fine, but not [a-[:alpha]]
    -                    if (rangeStart) {
    -                        return ['$.', false, glob.length - pos, true];
    -                    }
    -                    i += cls.length;
    -                    if (neg)
    -                        negs.push(unip);
    -                    else
    -                        ranges.push(unip);
    -                    uflag = uflag || u;
    -                    continue WHILE;
    -                }
    -            }
    -        }
    -        // now it's just a normal character, effectively
    -        escaping = false;
    -        if (rangeStart) {
    -            // throw this range away if it's not valid, but others
    -            // can still match.
    -            if (c > rangeStart) {
    -                ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c));
    -            }
    -            else if (c === rangeStart) {
    -                ranges.push(braceEscape(c));
    -            }
    -            rangeStart = '';
    -            i++;
    -            continue;
    -        }
    -        // now might be the start of a range.
    -        // can be either c-d or c-] or c] or c] at this point
    -        if (glob.startsWith('-]', i + 1)) {
    -            ranges.push(braceEscape(c + '-'));
    -            i += 2;
    -            continue;
    -        }
    -        if (glob.startsWith('-', i + 1)) {
    -            rangeStart = c;
    -            i += 2;
    -            continue;
    -        }
    -        // not the start of a range, just a single character
    -        ranges.push(braceEscape(c));
    -        i++;
    -    }
    -    if (endPos < i) {
    -        // didn't see the end of the class, not a valid class,
    -        // but might still be valid as a literal match.
    -        return ['', false, 0, false];
    -    }
    -    // if we got no ranges and no negates, then we have a range that
    -    // cannot possibly match anything, and that poisons the whole glob
    -    if (!ranges.length && !negs.length) {
    -        return ['$.', false, glob.length - pos, true];
    -    }
    -    // if we got one positive range, and it's a single character, then that's
    -    // not actually a magic pattern, it's just that one literal character.
    -    // we should not treat that as "magic", we should just return the literal
    -    // character. [_] is a perfectly valid way to escape glob magic chars.
    -    if (negs.length === 0 &&
    -        ranges.length === 1 &&
    -        /^\\?.$/.test(ranges[0]) &&
    -        !negate) {
    -        const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0];
    -        return [regexpEscape(r), false, endPos - pos, false];
    -    }
    -    const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']';
    -    const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']';
    -    const comb = ranges.length && negs.length
    -        ? '(' + sranges + '|' + snegs + ')'
    -        : ranges.length
    -            ? sranges
    -            : snegs;
    -    return [comb, uflag, endPos - pos, true];
    -};
    -//# sourceMappingURL=brace-expressions.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/esm/escape.js b/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/esm/escape.js
    deleted file mode 100644
    index 16f7c8c7bdc646..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/esm/escape.js
    +++ /dev/null
    @@ -1,18 +0,0 @@
    -/**
    - * Escape all magic characters in a glob pattern.
    - *
    - * If the {@link windowsPathsNoEscape | GlobOptions.windowsPathsNoEscape}
    - * option is used, then characters are escaped by wrapping in `[]`, because
    - * a magic character wrapped in a character class can only be satisfied by
    - * that exact character.  In this mode, `\` is _not_ escaped, because it is
    - * not interpreted as a magic character, but instead as a path separator.
    - */
    -export const escape = (s, { windowsPathsNoEscape = false, } = {}) => {
    -    // don't need to escape +@! because we escape the parens
    -    // that make those magic, and escaping ! as [!] isn't valid,
    -    // because [!]] is a valid glob class meaning not ']'.
    -    return windowsPathsNoEscape
    -        ? s.replace(/[?*()[\]]/g, '[$&]')
    -        : s.replace(/[?*()[\]\\]/g, '\\$&');
    -};
    -//# sourceMappingURL=escape.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/esm/index.js b/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/esm/index.js
    deleted file mode 100644
    index 84b577b0472cb6..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/esm/index.js
    +++ /dev/null
    @@ -1,1001 +0,0 @@
    -import expand from 'brace-expansion';
    -import { assertValidPattern } from './assert-valid-pattern.js';
    -import { AST } from './ast.js';
    -import { escape } from './escape.js';
    -import { unescape } from './unescape.js';
    -export const minimatch = (p, pattern, options = {}) => {
    -    assertValidPattern(pattern);
    -    // shortcut: comments match nothing.
    -    if (!options.nocomment && pattern.charAt(0) === '#') {
    -        return false;
    -    }
    -    return new Minimatch(pattern, options).match(p);
    -};
    -// Optimized checking for the most common glob patterns.
    -const starDotExtRE = /^\*+([^+@!?\*\[\(]*)$/;
    -const starDotExtTest = (ext) => (f) => !f.startsWith('.') && f.endsWith(ext);
    -const starDotExtTestDot = (ext) => (f) => f.endsWith(ext);
    -const starDotExtTestNocase = (ext) => {
    -    ext = ext.toLowerCase();
    -    return (f) => !f.startsWith('.') && f.toLowerCase().endsWith(ext);
    -};
    -const starDotExtTestNocaseDot = (ext) => {
    -    ext = ext.toLowerCase();
    -    return (f) => f.toLowerCase().endsWith(ext);
    -};
    -const starDotStarRE = /^\*+\.\*+$/;
    -const starDotStarTest = (f) => !f.startsWith('.') && f.includes('.');
    -const starDotStarTestDot = (f) => f !== '.' && f !== '..' && f.includes('.');
    -const dotStarRE = /^\.\*+$/;
    -const dotStarTest = (f) => f !== '.' && f !== '..' && f.startsWith('.');
    -const starRE = /^\*+$/;
    -const starTest = (f) => f.length !== 0 && !f.startsWith('.');
    -const starTestDot = (f) => f.length !== 0 && f !== '.' && f !== '..';
    -const qmarksRE = /^\?+([^+@!?\*\[\(]*)?$/;
    -const qmarksTestNocase = ([$0, ext = '']) => {
    -    const noext = qmarksTestNoExt([$0]);
    -    if (!ext)
    -        return noext;
    -    ext = ext.toLowerCase();
    -    return (f) => noext(f) && f.toLowerCase().endsWith(ext);
    -};
    -const qmarksTestNocaseDot = ([$0, ext = '']) => {
    -    const noext = qmarksTestNoExtDot([$0]);
    -    if (!ext)
    -        return noext;
    -    ext = ext.toLowerCase();
    -    return (f) => noext(f) && f.toLowerCase().endsWith(ext);
    -};
    -const qmarksTestDot = ([$0, ext = '']) => {
    -    const noext = qmarksTestNoExtDot([$0]);
    -    return !ext ? noext : (f) => noext(f) && f.endsWith(ext);
    -};
    -const qmarksTest = ([$0, ext = '']) => {
    -    const noext = qmarksTestNoExt([$0]);
    -    return !ext ? noext : (f) => noext(f) && f.endsWith(ext);
    -};
    -const qmarksTestNoExt = ([$0]) => {
    -    const len = $0.length;
    -    return (f) => f.length === len && !f.startsWith('.');
    -};
    -const qmarksTestNoExtDot = ([$0]) => {
    -    const len = $0.length;
    -    return (f) => f.length === len && f !== '.' && f !== '..';
    -};
    -/* c8 ignore start */
    -const defaultPlatform = (typeof process === 'object' && process
    -    ? (typeof process.env === 'object' &&
    -        process.env &&
    -        process.env.__MINIMATCH_TESTING_PLATFORM__) ||
    -        process.platform
    -    : 'posix');
    -const path = {
    -    win32: { sep: '\\' },
    -    posix: { sep: '/' },
    -};
    -/* c8 ignore stop */
    -export const sep = defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep;
    -minimatch.sep = sep;
    -export const GLOBSTAR = Symbol('globstar **');
    -minimatch.GLOBSTAR = GLOBSTAR;
    -// any single thing other than /
    -// don't need to escape / when using new RegExp()
    -const qmark = '[^/]';
    -// * => any number of characters
    -const star = qmark + '*?';
    -// ** when dots are allowed.  Anything goes, except .. and .
    -// not (^ or / followed by one or two dots followed by $ or /),
    -// followed by anything, any number of times.
    -const twoStarDot = '(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?';
    -// not a ^ or / followed by a dot,
    -// followed by anything, any number of times.
    -const twoStarNoDot = '(?:(?!(?:\\/|^)\\.).)*?';
    -export const filter = (pattern, options = {}) => (p) => minimatch(p, pattern, options);
    -minimatch.filter = filter;
    -const ext = (a, b = {}) => Object.assign({}, a, b);
    -export const defaults = (def) => {
    -    if (!def || typeof def !== 'object' || !Object.keys(def).length) {
    -        return minimatch;
    -    }
    -    const orig = minimatch;
    -    const m = (p, pattern, options = {}) => orig(p, pattern, ext(def, options));
    -    return Object.assign(m, {
    -        Minimatch: class Minimatch extends orig.Minimatch {
    -            constructor(pattern, options = {}) {
    -                super(pattern, ext(def, options));
    -            }
    -            static defaults(options) {
    -                return orig.defaults(ext(def, options)).Minimatch;
    -            }
    -        },
    -        AST: class AST extends orig.AST {
    -            /* c8 ignore start */
    -            constructor(type, parent, options = {}) {
    -                super(type, parent, ext(def, options));
    -            }
    -            /* c8 ignore stop */
    -            static fromGlob(pattern, options = {}) {
    -                return orig.AST.fromGlob(pattern, ext(def, options));
    -            }
    -        },
    -        unescape: (s, options = {}) => orig.unescape(s, ext(def, options)),
    -        escape: (s, options = {}) => orig.escape(s, ext(def, options)),
    -        filter: (pattern, options = {}) => orig.filter(pattern, ext(def, options)),
    -        defaults: (options) => orig.defaults(ext(def, options)),
    -        makeRe: (pattern, options = {}) => orig.makeRe(pattern, ext(def, options)),
    -        braceExpand: (pattern, options = {}) => orig.braceExpand(pattern, ext(def, options)),
    -        match: (list, pattern, options = {}) => orig.match(list, pattern, ext(def, options)),
    -        sep: orig.sep,
    -        GLOBSTAR: GLOBSTAR,
    -    });
    -};
    -minimatch.defaults = defaults;
    -// Brace expansion:
    -// a{b,c}d -> abd acd
    -// a{b,}c -> abc ac
    -// a{0..3}d -> a0d a1d a2d a3d
    -// a{b,c{d,e}f}g -> abg acdfg acefg
    -// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
    -//
    -// Invalid sets are not expanded.
    -// a{2..}b -> a{2..}b
    -// a{b}c -> a{b}c
    -export const braceExpand = (pattern, options = {}) => {
    -    assertValidPattern(pattern);
    -    // Thanks to Yeting Li  for
    -    // improving this regexp to avoid a ReDOS vulnerability.
    -    if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) {
    -        // shortcut. no need to expand.
    -        return [pattern];
    -    }
    -    return expand(pattern);
    -};
    -minimatch.braceExpand = braceExpand;
    -// parse a component of the expanded set.
    -// At this point, no pattern may contain "/" in it
    -// so we're going to return a 2d array, where each entry is the full
    -// pattern, split on '/', and then turned into a regular expression.
    -// A regexp is made at the end which joins each array with an
    -// escaped /, and another full one which joins each regexp with |.
    -//
    -// Following the lead of Bash 4.1, note that "**" only has special meaning
    -// when it is the *only* thing in a path portion.  Otherwise, any series
    -// of * is equivalent to a single *.  Globstar behavior is enabled by
    -// default, and can be disabled by setting options.noglobstar.
    -export const makeRe = (pattern, options = {}) => new Minimatch(pattern, options).makeRe();
    -minimatch.makeRe = makeRe;
    -export const match = (list, pattern, options = {}) => {
    -    const mm = new Minimatch(pattern, options);
    -    list = list.filter(f => mm.match(f));
    -    if (mm.options.nonull && !list.length) {
    -        list.push(pattern);
    -    }
    -    return list;
    -};
    -minimatch.match = match;
    -// replace stuff like \* with *
    -const globMagic = /[?*]|[+@!]\(.*?\)|\[|\]/;
    -const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
    -export class Minimatch {
    -    options;
    -    set;
    -    pattern;
    -    windowsPathsNoEscape;
    -    nonegate;
    -    negate;
    -    comment;
    -    empty;
    -    preserveMultipleSlashes;
    -    partial;
    -    globSet;
    -    globParts;
    -    nocase;
    -    isWindows;
    -    platform;
    -    windowsNoMagicRoot;
    -    regexp;
    -    constructor(pattern, options = {}) {
    -        assertValidPattern(pattern);
    -        options = options || {};
    -        this.options = options;
    -        this.pattern = pattern;
    -        this.platform = options.platform || defaultPlatform;
    -        this.isWindows = this.platform === 'win32';
    -        this.windowsPathsNoEscape =
    -            !!options.windowsPathsNoEscape || options.allowWindowsEscape === false;
    -        if (this.windowsPathsNoEscape) {
    -            this.pattern = this.pattern.replace(/\\/g, '/');
    -        }
    -        this.preserveMultipleSlashes = !!options.preserveMultipleSlashes;
    -        this.regexp = null;
    -        this.negate = false;
    -        this.nonegate = !!options.nonegate;
    -        this.comment = false;
    -        this.empty = false;
    -        this.partial = !!options.partial;
    -        this.nocase = !!this.options.nocase;
    -        this.windowsNoMagicRoot =
    -            options.windowsNoMagicRoot !== undefined
    -                ? options.windowsNoMagicRoot
    -                : !!(this.isWindows && this.nocase);
    -        this.globSet = [];
    -        this.globParts = [];
    -        this.set = [];
    -        // make the set of regexps etc.
    -        this.make();
    -    }
    -    hasMagic() {
    -        if (this.options.magicalBraces && this.set.length > 1) {
    -            return true;
    -        }
    -        for (const pattern of this.set) {
    -            for (const part of pattern) {
    -                if (typeof part !== 'string')
    -                    return true;
    -            }
    -        }
    -        return false;
    -    }
    -    debug(..._) { }
    -    make() {
    -        const pattern = this.pattern;
    -        const options = this.options;
    -        // empty patterns and comments match nothing.
    -        if (!options.nocomment && pattern.charAt(0) === '#') {
    -            this.comment = true;
    -            return;
    -        }
    -        if (!pattern) {
    -            this.empty = true;
    -            return;
    -        }
    -        // step 1: figure out negation, etc.
    -        this.parseNegate();
    -        // step 2: expand braces
    -        this.globSet = [...new Set(this.braceExpand())];
    -        if (options.debug) {
    -            this.debug = (...args) => console.error(...args);
    -        }
    -        this.debug(this.pattern, this.globSet);
    -        // step 3: now we have a set, so turn each one into a series of
    -        // path-portion matching patterns.
    -        // These will be regexps, except in the case of "**", which is
    -        // set to the GLOBSTAR object for globstar behavior,
    -        // and will not contain any / characters
    -        //
    -        // First, we preprocess to make the glob pattern sets a bit simpler
    -        // and deduped.  There are some perf-killing patterns that can cause
    -        // problems with a glob walk, but we can simplify them down a bit.
    -        const rawGlobParts = this.globSet.map(s => this.slashSplit(s));
    -        this.globParts = this.preprocess(rawGlobParts);
    -        this.debug(this.pattern, this.globParts);
    -        // glob --> regexps
    -        let set = this.globParts.map((s, _, __) => {
    -            if (this.isWindows && this.windowsNoMagicRoot) {
    -                // check if it's a drive or unc path.
    -                const isUNC = s[0] === '' &&
    -                    s[1] === '' &&
    -                    (s[2] === '?' || !globMagic.test(s[2])) &&
    -                    !globMagic.test(s[3]);
    -                const isDrive = /^[a-z]:/i.test(s[0]);
    -                if (isUNC) {
    -                    return [...s.slice(0, 4), ...s.slice(4).map(ss => this.parse(ss))];
    -                }
    -                else if (isDrive) {
    -                    return [s[0], ...s.slice(1).map(ss => this.parse(ss))];
    -                }
    -            }
    -            return s.map(ss => this.parse(ss));
    -        });
    -        this.debug(this.pattern, set);
    -        // filter out everything that didn't compile properly.
    -        this.set = set.filter(s => s.indexOf(false) === -1);
    -        // do not treat the ? in UNC paths as magic
    -        if (this.isWindows) {
    -            for (let i = 0; i < this.set.length; i++) {
    -                const p = this.set[i];
    -                if (p[0] === '' &&
    -                    p[1] === '' &&
    -                    this.globParts[i][2] === '?' &&
    -                    typeof p[3] === 'string' &&
    -                    /^[a-z]:$/i.test(p[3])) {
    -                    p[2] = '?';
    -                }
    -            }
    -        }
    -        this.debug(this.pattern, this.set);
    -    }
    -    // various transforms to equivalent pattern sets that are
    -    // faster to process in a filesystem walk.  The goal is to
    -    // eliminate what we can, and push all ** patterns as far
    -    // to the right as possible, even if it increases the number
    -    // of patterns that we have to process.
    -    preprocess(globParts) {
    -        // if we're not in globstar mode, then turn all ** into *
    -        if (this.options.noglobstar) {
    -            for (let i = 0; i < globParts.length; i++) {
    -                for (let j = 0; j < globParts[i].length; j++) {
    -                    if (globParts[i][j] === '**') {
    -                        globParts[i][j] = '*';
    -                    }
    -                }
    -            }
    -        }
    -        const { optimizationLevel = 1 } = this.options;
    -        if (optimizationLevel >= 2) {
    -            // aggressive optimization for the purpose of fs walking
    -            globParts = this.firstPhasePreProcess(globParts);
    -            globParts = this.secondPhasePreProcess(globParts);
    -        }
    -        else if (optimizationLevel >= 1) {
    -            // just basic optimizations to remove some .. parts
    -            globParts = this.levelOneOptimize(globParts);
    -        }
    -        else {
    -            // just collapse multiple ** portions into one
    -            globParts = this.adjascentGlobstarOptimize(globParts);
    -        }
    -        return globParts;
    -    }
    -    // just get rid of adjascent ** portions
    -    adjascentGlobstarOptimize(globParts) {
    -        return globParts.map(parts => {
    -            let gs = -1;
    -            while (-1 !== (gs = parts.indexOf('**', gs + 1))) {
    -                let i = gs;
    -                while (parts[i + 1] === '**') {
    -                    i++;
    -                }
    -                if (i !== gs) {
    -                    parts.splice(gs, i - gs);
    -                }
    -            }
    -            return parts;
    -        });
    -    }
    -    // get rid of adjascent ** and resolve .. portions
    -    levelOneOptimize(globParts) {
    -        return globParts.map(parts => {
    -            parts = parts.reduce((set, part) => {
    -                const prev = set[set.length - 1];
    -                if (part === '**' && prev === '**') {
    -                    return set;
    -                }
    -                if (part === '..') {
    -                    if (prev && prev !== '..' && prev !== '.' && prev !== '**') {
    -                        set.pop();
    -                        return set;
    -                    }
    -                }
    -                set.push(part);
    -                return set;
    -            }, []);
    -            return parts.length === 0 ? [''] : parts;
    -        });
    -    }
    -    levelTwoFileOptimize(parts) {
    -        if (!Array.isArray(parts)) {
    -            parts = this.slashSplit(parts);
    -        }
    -        let didSomething = false;
    -        do {
    -            didSomething = false;
    -            // 
    // -> 
    /
    -            if (!this.preserveMultipleSlashes) {
    -                for (let i = 1; i < parts.length - 1; i++) {
    -                    const p = parts[i];
    -                    // don't squeeze out UNC patterns
    -                    if (i === 1 && p === '' && parts[0] === '')
    -                        continue;
    -                    if (p === '.' || p === '') {
    -                        didSomething = true;
    -                        parts.splice(i, 1);
    -                        i--;
    -                    }
    -                }
    -                if (parts[0] === '.' &&
    -                    parts.length === 2 &&
    -                    (parts[1] === '.' || parts[1] === '')) {
    -                    didSomething = true;
    -                    parts.pop();
    -                }
    -            }
    -            // 
    /

    /../ ->

    /
    -            let dd = 0;
    -            while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
    -                const p = parts[dd - 1];
    -                if (p && p !== '.' && p !== '..' && p !== '**') {
    -                    didSomething = true;
    -                    parts.splice(dd - 1, 2);
    -                    dd -= 2;
    -                }
    -            }
    -        } while (didSomething);
    -        return parts.length === 0 ? [''] : parts;
    -    }
    -    // First phase: single-pattern processing
    -    // 
     is 1 or more portions
    -    //  is 1 or more portions
    -    // 

    is any portion other than ., .., '', or ** - // is . or '' - // - // **/.. is *brutal* for filesystem walking performance, because - // it effectively resets the recursive walk each time it occurs, - // and ** cannot be reduced out by a .. pattern part like a regexp - // or most strings (other than .., ., and '') can be. - // - //

    /**/../

    /

    / -> {

    /../

    /

    /,

    /**/

    /

    /} - //

    // -> 
    /
    -    // 
    /

    /../ ->

    /
    -    // **/**/ -> **/
    -    //
    -    // **/*/ -> */**/ <== not valid because ** doesn't follow
    -    // this WOULD be allowed if ** did follow symlinks, or * didn't
    -    firstPhasePreProcess(globParts) {
    -        let didSomething = false;
    -        do {
    -            didSomething = false;
    -            // 
    /**/../

    /

    / -> {

    /../

    /

    /,

    /**/

    /

    /} - for (let parts of globParts) { - let gs = -1; - while (-1 !== (gs = parts.indexOf('**', gs + 1))) { - let gss = gs; - while (parts[gss + 1] === '**') { - //

    /**/**/ -> 
    /**/
    -                        gss++;
    -                    }
    -                    // eg, if gs is 2 and gss is 4, that means we have 3 **
    -                    // parts, and can remove 2 of them.
    -                    if (gss > gs) {
    -                        parts.splice(gs + 1, gss - gs);
    -                    }
    -                    let next = parts[gs + 1];
    -                    const p = parts[gs + 2];
    -                    const p2 = parts[gs + 3];
    -                    if (next !== '..')
    -                        continue;
    -                    if (!p ||
    -                        p === '.' ||
    -                        p === '..' ||
    -                        !p2 ||
    -                        p2 === '.' ||
    -                        p2 === '..') {
    -                        continue;
    -                    }
    -                    didSomething = true;
    -                    // edit parts in place, and push the new one
    -                    parts.splice(gs, 1);
    -                    const other = parts.slice(0);
    -                    other[gs] = '**';
    -                    globParts.push(other);
    -                    gs--;
    -                }
    -                // 
    // -> 
    /
    -                if (!this.preserveMultipleSlashes) {
    -                    for (let i = 1; i < parts.length - 1; i++) {
    -                        const p = parts[i];
    -                        // don't squeeze out UNC patterns
    -                        if (i === 1 && p === '' && parts[0] === '')
    -                            continue;
    -                        if (p === '.' || p === '') {
    -                            didSomething = true;
    -                            parts.splice(i, 1);
    -                            i--;
    -                        }
    -                    }
    -                    if (parts[0] === '.' &&
    -                        parts.length === 2 &&
    -                        (parts[1] === '.' || parts[1] === '')) {
    -                        didSomething = true;
    -                        parts.pop();
    -                    }
    -                }
    -                // 
    /

    /../ ->

    /
    -                let dd = 0;
    -                while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
    -                    const p = parts[dd - 1];
    -                    if (p && p !== '.' && p !== '..' && p !== '**') {
    -                        didSomething = true;
    -                        const needDot = dd === 1 && parts[dd + 1] === '**';
    -                        const splin = needDot ? ['.'] : [];
    -                        parts.splice(dd - 1, 2, ...splin);
    -                        if (parts.length === 0)
    -                            parts.push('');
    -                        dd -= 2;
    -                    }
    -                }
    -            }
    -        } while (didSomething);
    -        return globParts;
    -    }
    -    // second phase: multi-pattern dedupes
    -    // {
    /*/,
    /

    /} ->

    /*/
    -    // {
    /,
    /} -> 
    /
    -    // {
    /**/,
    /} -> 
    /**/
    -    //
    -    // {
    /**/,
    /**/

    /} ->

    /**/
    -    // ^-- not valid because ** doens't follow symlinks
    -    secondPhasePreProcess(globParts) {
    -        for (let i = 0; i < globParts.length - 1; i++) {
    -            for (let j = i + 1; j < globParts.length; j++) {
    -                const matched = this.partsMatch(globParts[i], globParts[j], !this.preserveMultipleSlashes);
    -                if (matched) {
    -                    globParts[i] = [];
    -                    globParts[j] = matched;
    -                    break;
    -                }
    -            }
    -        }
    -        return globParts.filter(gs => gs.length);
    -    }
    -    partsMatch(a, b, emptyGSMatch = false) {
    -        let ai = 0;
    -        let bi = 0;
    -        let result = [];
    -        let which = '';
    -        while (ai < a.length && bi < b.length) {
    -            if (a[ai] === b[bi]) {
    -                result.push(which === 'b' ? b[bi] : a[ai]);
    -                ai++;
    -                bi++;
    -            }
    -            else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {
    -                result.push(a[ai]);
    -                ai++;
    -            }
    -            else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {
    -                result.push(b[bi]);
    -                bi++;
    -            }
    -            else if (a[ai] === '*' &&
    -                b[bi] &&
    -                (this.options.dot || !b[bi].startsWith('.')) &&
    -                b[bi] !== '**') {
    -                if (which === 'b')
    -                    return false;
    -                which = 'a';
    -                result.push(a[ai]);
    -                ai++;
    -                bi++;
    -            }
    -            else if (b[bi] === '*' &&
    -                a[ai] &&
    -                (this.options.dot || !a[ai].startsWith('.')) &&
    -                a[ai] !== '**') {
    -                if (which === 'a')
    -                    return false;
    -                which = 'b';
    -                result.push(b[bi]);
    -                ai++;
    -                bi++;
    -            }
    -            else {
    -                return false;
    -            }
    -        }
    -        // if we fall out of the loop, it means they two are identical
    -        // as long as their lengths match
    -        return a.length === b.length && result;
    -    }
    -    parseNegate() {
    -        if (this.nonegate)
    -            return;
    -        const pattern = this.pattern;
    -        let negate = false;
    -        let negateOffset = 0;
    -        for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {
    -            negate = !negate;
    -            negateOffset++;
    -        }
    -        if (negateOffset)
    -            this.pattern = pattern.slice(negateOffset);
    -        this.negate = negate;
    -    }
    -    // set partial to true to test if, for example,
    -    // "/a/b" matches the start of "/*/b/*/d"
    -    // Partial means, if you run out of file before you run
    -    // out of pattern, then that's fine, as long as all
    -    // the parts match.
    -    matchOne(file, pattern, partial = false) {
    -        const options = this.options;
    -        // UNC paths like //?/X:/... can match X:/... and vice versa
    -        // Drive letters in absolute drive or unc paths are always compared
    -        // case-insensitively.
    -        if (this.isWindows) {
    -            const fileDrive = typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0]);
    -            const fileUNC = !fileDrive &&
    -                file[0] === '' &&
    -                file[1] === '' &&
    -                file[2] === '?' &&
    -                /^[a-z]:$/i.test(file[3]);
    -            const patternDrive = typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0]);
    -            const patternUNC = !patternDrive &&
    -                pattern[0] === '' &&
    -                pattern[1] === '' &&
    -                pattern[2] === '?' &&
    -                typeof pattern[3] === 'string' &&
    -                /^[a-z]:$/i.test(pattern[3]);
    -            const fdi = fileUNC ? 3 : fileDrive ? 0 : undefined;
    -            const pdi = patternUNC ? 3 : patternDrive ? 0 : undefined;
    -            if (typeof fdi === 'number' && typeof pdi === 'number') {
    -                const [fd, pd] = [file[fdi], pattern[pdi]];
    -                if (fd.toLowerCase() === pd.toLowerCase()) {
    -                    pattern[pdi] = fd;
    -                    if (pdi > fdi) {
    -                        pattern = pattern.slice(pdi);
    -                    }
    -                    else if (fdi > pdi) {
    -                        file = file.slice(fdi);
    -                    }
    -                }
    -            }
    -        }
    -        // resolve and reduce . and .. portions in the file as well.
    -        // dont' need to do the second phase, because it's only one string[]
    -        const { optimizationLevel = 1 } = this.options;
    -        if (optimizationLevel >= 2) {
    -            file = this.levelTwoFileOptimize(file);
    -        }
    -        this.debug('matchOne', this, { file, pattern });
    -        this.debug('matchOne', file.length, pattern.length);
    -        for (var fi = 0, pi = 0, fl = file.length, pl = pattern.length; fi < fl && pi < pl; fi++, pi++) {
    -            this.debug('matchOne loop');
    -            var p = pattern[pi];
    -            var f = file[fi];
    -            this.debug(pattern, p, f);
    -            // should be impossible.
    -            // some invalid regexp stuff in the set.
    -            /* c8 ignore start */
    -            if (p === false) {
    -                return false;
    -            }
    -            /* c8 ignore stop */
    -            if (p === GLOBSTAR) {
    -                this.debug('GLOBSTAR', [pattern, p, f]);
    -                // "**"
    -                // a/**/b/**/c would match the following:
    -                // a/b/x/y/z/c
    -                // a/x/y/z/b/c
    -                // a/b/x/b/x/c
    -                // a/b/c
    -                // To do this, take the rest of the pattern after
    -                // the **, and see if it would match the file remainder.
    -                // If so, return success.
    -                // If not, the ** "swallows" a segment, and try again.
    -                // This is recursively awful.
    -                //
    -                // a/**/b/**/c matching a/b/x/y/z/c
    -                // - a matches a
    -                // - doublestar
    -                //   - matchOne(b/x/y/z/c, b/**/c)
    -                //     - b matches b
    -                //     - doublestar
    -                //       - matchOne(x/y/z/c, c) -> no
    -                //       - matchOne(y/z/c, c) -> no
    -                //       - matchOne(z/c, c) -> no
    -                //       - matchOne(c, c) yes, hit
    -                var fr = fi;
    -                var pr = pi + 1;
    -                if (pr === pl) {
    -                    this.debug('** at the end');
    -                    // a ** at the end will just swallow the rest.
    -                    // We have found a match.
    -                    // however, it will not swallow /.x, unless
    -                    // options.dot is set.
    -                    // . and .. are *never* matched by **, for explosively
    -                    // exponential reasons.
    -                    for (; fi < fl; fi++) {
    -                        if (file[fi] === '.' ||
    -                            file[fi] === '..' ||
    -                            (!options.dot && file[fi].charAt(0) === '.'))
    -                            return false;
    -                    }
    -                    return true;
    -                }
    -                // ok, let's see if we can swallow whatever we can.
    -                while (fr < fl) {
    -                    var swallowee = file[fr];
    -                    this.debug('\nglobstar while', file, fr, pattern, pr, swallowee);
    -                    // XXX remove this slice.  Just pass the start index.
    -                    if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
    -                        this.debug('globstar found match!', fr, fl, swallowee);
    -                        // found a match.
    -                        return true;
    -                    }
    -                    else {
    -                        // can't swallow "." or ".." ever.
    -                        // can only swallow ".foo" when explicitly asked.
    -                        if (swallowee === '.' ||
    -                            swallowee === '..' ||
    -                            (!options.dot && swallowee.charAt(0) === '.')) {
    -                            this.debug('dot detected!', file, fr, pattern, pr);
    -                            break;
    -                        }
    -                        // ** swallows a segment, and continue.
    -                        this.debug('globstar swallow a segment, and continue');
    -                        fr++;
    -                    }
    -                }
    -                // no match was found.
    -                // However, in partial mode, we can't say this is necessarily over.
    -                /* c8 ignore start */
    -                if (partial) {
    -                    // ran out of file
    -                    this.debug('\n>>> no match, partial?', file, fr, pattern, pr);
    -                    if (fr === fl) {
    -                        return true;
    -                    }
    -                }
    -                /* c8 ignore stop */
    -                return false;
    -            }
    -            // something other than **
    -            // non-magic patterns just have to match exactly
    -            // patterns with magic have been turned into regexps.
    -            let hit;
    -            if (typeof p === 'string') {
    -                hit = f === p;
    -                this.debug('string match', p, f, hit);
    -            }
    -            else {
    -                hit = p.test(f);
    -                this.debug('pattern match', p, f, hit);
    -            }
    -            if (!hit)
    -                return false;
    -        }
    -        // Note: ending in / means that we'll get a final ""
    -        // at the end of the pattern.  This can only match a
    -        // corresponding "" at the end of the file.
    -        // If the file ends in /, then it can only match a
    -        // a pattern that ends in /, unless the pattern just
    -        // doesn't have any more for it. But, a/b/ should *not*
    -        // match "a/b/*", even though "" matches against the
    -        // [^/]*? pattern, except in partial mode, where it might
    -        // simply not be reached yet.
    -        // However, a/b/ should still satisfy a/*
    -        // now either we fell off the end of the pattern, or we're done.
    -        if (fi === fl && pi === pl) {
    -            // ran out of pattern and filename at the same time.
    -            // an exact hit!
    -            return true;
    -        }
    -        else if (fi === fl) {
    -            // ran out of file, but still had pattern left.
    -            // this is ok if we're doing the match as part of
    -            // a glob fs traversal.
    -            return partial;
    -        }
    -        else if (pi === pl) {
    -            // ran out of pattern, still have file left.
    -            // this is only acceptable if we're on the very last
    -            // empty segment of a file with a trailing slash.
    -            // a/* should match a/b/
    -            return fi === fl - 1 && file[fi] === '';
    -            /* c8 ignore start */
    -        }
    -        else {
    -            // should be unreachable.
    -            throw new Error('wtf?');
    -        }
    -        /* c8 ignore stop */
    -    }
    -    braceExpand() {
    -        return braceExpand(this.pattern, this.options);
    -    }
    -    parse(pattern) {
    -        assertValidPattern(pattern);
    -        const options = this.options;
    -        // shortcuts
    -        if (pattern === '**')
    -            return GLOBSTAR;
    -        if (pattern === '')
    -            return '';
    -        // far and away, the most common glob pattern parts are
    -        // *, *.*, and *.  Add a fast check method for those.
    -        let m;
    -        let fastTest = null;
    -        if ((m = pattern.match(starRE))) {
    -            fastTest = options.dot ? starTestDot : starTest;
    -        }
    -        else if ((m = pattern.match(starDotExtRE))) {
    -            fastTest = (options.nocase
    -                ? options.dot
    -                    ? starDotExtTestNocaseDot
    -                    : starDotExtTestNocase
    -                : options.dot
    -                    ? starDotExtTestDot
    -                    : starDotExtTest)(m[1]);
    -        }
    -        else if ((m = pattern.match(qmarksRE))) {
    -            fastTest = (options.nocase
    -                ? options.dot
    -                    ? qmarksTestNocaseDot
    -                    : qmarksTestNocase
    -                : options.dot
    -                    ? qmarksTestDot
    -                    : qmarksTest)(m);
    -        }
    -        else if ((m = pattern.match(starDotStarRE))) {
    -            fastTest = options.dot ? starDotStarTestDot : starDotStarTest;
    -        }
    -        else if ((m = pattern.match(dotStarRE))) {
    -            fastTest = dotStarTest;
    -        }
    -        const re = AST.fromGlob(pattern, this.options).toMMPattern();
    -        if (fastTest && typeof re === 'object') {
    -            // Avoids overriding in frozen environments
    -            Reflect.defineProperty(re, 'test', { value: fastTest });
    -        }
    -        return re;
    -    }
    -    makeRe() {
    -        if (this.regexp || this.regexp === false)
    -            return this.regexp;
    -        // at this point, this.set is a 2d array of partial
    -        // pattern strings, or "**".
    -        //
    -        // It's better to use .match().  This function shouldn't
    -        // be used, really, but it's pretty convenient sometimes,
    -        // when you just want to work with a regex.
    -        const set = this.set;
    -        if (!set.length) {
    -            this.regexp = false;
    -            return this.regexp;
    -        }
    -        const options = this.options;
    -        const twoStar = options.noglobstar
    -            ? star
    -            : options.dot
    -                ? twoStarDot
    -                : twoStarNoDot;
    -        const flags = new Set(options.nocase ? ['i'] : []);
    -        // regexpify non-globstar patterns
    -        // if ** is only item, then we just do one twoStar
    -        // if ** is first, and there are more, prepend (\/|twoStar\/)? to next
    -        // if ** is last, append (\/twoStar|) to previous
    -        // if ** is in the middle, append (\/|\/twoStar\/) to previous
    -        // then filter out GLOBSTAR symbols
    -        let re = set
    -            .map(pattern => {
    -            const pp = pattern.map(p => {
    -                if (p instanceof RegExp) {
    -                    for (const f of p.flags.split(''))
    -                        flags.add(f);
    -                }
    -                return typeof p === 'string'
    -                    ? regExpEscape(p)
    -                    : p === GLOBSTAR
    -                        ? GLOBSTAR
    -                        : p._src;
    -            });
    -            pp.forEach((p, i) => {
    -                const next = pp[i + 1];
    -                const prev = pp[i - 1];
    -                if (p !== GLOBSTAR || prev === GLOBSTAR) {
    -                    return;
    -                }
    -                if (prev === undefined) {
    -                    if (next !== undefined && next !== GLOBSTAR) {
    -                        pp[i + 1] = '(?:\\/|' + twoStar + '\\/)?' + next;
    -                    }
    -                    else {
    -                        pp[i] = twoStar;
    -                    }
    -                }
    -                else if (next === undefined) {
    -                    pp[i - 1] = prev + '(?:\\/|' + twoStar + ')?';
    -                }
    -                else if (next !== GLOBSTAR) {
    -                    pp[i - 1] = prev + '(?:\\/|\\/' + twoStar + '\\/)' + next;
    -                    pp[i + 1] = GLOBSTAR;
    -                }
    -            });
    -            return pp.filter(p => p !== GLOBSTAR).join('/');
    -        })
    -            .join('|');
    -        // need to wrap in parens if we had more than one thing with |,
    -        // otherwise only the first will be anchored to ^ and the last to $
    -        const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', ''];
    -        // must match entire pattern
    -        // ending in a * or ** will make it less strict.
    -        re = '^' + open + re + close + '$';
    -        // can match anything, as long as it's not this.
    -        if (this.negate)
    -            re = '^(?!' + re + ').+$';
    -        try {
    -            this.regexp = new RegExp(re, [...flags].join(''));
    -            /* c8 ignore start */
    -        }
    -        catch (ex) {
    -            // should be impossible
    -            this.regexp = false;
    -        }
    -        /* c8 ignore stop */
    -        return this.regexp;
    -    }
    -    slashSplit(p) {
    -        // if p starts with // on windows, we preserve that
    -        // so that UNC paths aren't broken.  Otherwise, any number of
    -        // / characters are coalesced into one, unless
    -        // preserveMultipleSlashes is set to true.
    -        if (this.preserveMultipleSlashes) {
    -            return p.split('/');
    -        }
    -        else if (this.isWindows && /^\/\/[^\/]+/.test(p)) {
    -            // add an extra '' for the one we lose
    -            return ['', ...p.split(/\/+/)];
    -        }
    -        else {
    -            return p.split(/\/+/);
    -        }
    -    }
    -    match(f, partial = this.partial) {
    -        this.debug('match', f, this.pattern);
    -        // short-circuit in the case of busted things.
    -        // comments, etc.
    -        if (this.comment) {
    -            return false;
    -        }
    -        if (this.empty) {
    -            return f === '';
    -        }
    -        if (f === '/' && partial) {
    -            return true;
    -        }
    -        const options = this.options;
    -        // windows: need to use /, not \
    -        if (this.isWindows) {
    -            f = f.split('\\').join('/');
    -        }
    -        // treat the test path as a set of pathparts.
    -        const ff = this.slashSplit(f);
    -        this.debug(this.pattern, 'split', ff);
    -        // just ONE of the pattern sets in this.set needs to match
    -        // in order for it to be valid.  If negating, then just one
    -        // match means that we have failed.
    -        // Either way, return on the first hit.
    -        const set = this.set;
    -        this.debug(this.pattern, 'set', set);
    -        // Find the basename of the path by looking for the last non-empty segment
    -        let filename = ff[ff.length - 1];
    -        if (!filename) {
    -            for (let i = ff.length - 2; !filename && i >= 0; i--) {
    -                filename = ff[i];
    -            }
    -        }
    -        for (let i = 0; i < set.length; i++) {
    -            const pattern = set[i];
    -            let file = ff;
    -            if (options.matchBase && pattern.length === 1) {
    -                file = [filename];
    -            }
    -            const hit = this.matchOne(file, pattern, partial);
    -            if (hit) {
    -                if (options.flipNegate) {
    -                    return true;
    -                }
    -                return !this.negate;
    -            }
    -        }
    -        // didn't get any hits.  this is success if it's a negative
    -        // pattern, failure otherwise.
    -        if (options.flipNegate) {
    -            return false;
    -        }
    -        return this.negate;
    -    }
    -    static defaults(def) {
    -        return minimatch.defaults(def).Minimatch;
    -    }
    -}
    -/* c8 ignore start */
    -export { AST } from './ast.js';
    -export { escape } from './escape.js';
    -export { unescape } from './unescape.js';
    -/* c8 ignore stop */
    -minimatch.AST = AST;
    -minimatch.Minimatch = Minimatch;
    -minimatch.escape = escape;
    -minimatch.unescape = unescape;
    -//# sourceMappingURL=index.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/esm/package.json b/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/esm/package.json
    deleted file mode 100644
    index 3dbc1ca591c055..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/esm/package.json
    +++ /dev/null
    @@ -1,3 +0,0 @@
    -{
    -  "type": "module"
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/esm/unescape.js b/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/esm/unescape.js
    deleted file mode 100644
    index 0faf9a2b7306f7..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/minimatch/dist/esm/unescape.js
    +++ /dev/null
    @@ -1,20 +0,0 @@
    -/**
    - * Un-escape a string that has been escaped with {@link escape}.
    - *
    - * If the {@link windowsPathsNoEscape} option is used, then square-brace
    - * escapes are removed, but not backslash escapes.  For example, it will turn
    - * the string `'[*]'` into `*`, but it will not turn `'\\*'` into `'*'`,
    - * becuase `\` is a path separator in `windowsPathsNoEscape` mode.
    - *
    - * When `windowsPathsNoEscape` is not set, then both brace escapes and
    - * backslash escapes are removed.
    - *
    - * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped
    - * or unescaped.
    - */
    -export const unescape = (s, { windowsPathsNoEscape = false, } = {}) => {
    -    return windowsPathsNoEscape
    -        ? s.replace(/\[([^\/\\])\]/g, '$1')
    -        : s.replace(/((?!\\).|^)\[([^\/\\])\]/g, '$1$2').replace(/\\([^\/])/g, '$1');
    -};
    -//# sourceMappingURL=unescape.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/minimatch/package.json b/deps/npm/node_modules/node-gyp/node_modules/minimatch/package.json
    deleted file mode 100644
    index 01fc48ecfd6a9f..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/minimatch/package.json
    +++ /dev/null
    @@ -1,82 +0,0 @@
    -{
    -  "author": "Isaac Z. Schlueter  (http://blog.izs.me)",
    -  "name": "minimatch",
    -  "description": "a glob matcher in javascript",
    -  "version": "9.0.5",
    -  "repository": {
    -    "type": "git",
    -    "url": "git://github.com/isaacs/minimatch.git"
    -  },
    -  "main": "./dist/commonjs/index.js",
    -  "types": "./dist/commonjs/index.d.ts",
    -  "exports": {
    -    "./package.json": "./package.json",
    -    ".": {
    -      "import": {
    -        "types": "./dist/esm/index.d.ts",
    -        "default": "./dist/esm/index.js"
    -      },
    -      "require": {
    -        "types": "./dist/commonjs/index.d.ts",
    -        "default": "./dist/commonjs/index.js"
    -      }
    -    }
    -  },
    -  "files": [
    -    "dist"
    -  ],
    -  "scripts": {
    -    "preversion": "npm test",
    -    "postversion": "npm publish",
    -    "prepublishOnly": "git push origin --follow-tags",
    -    "prepare": "tshy",
    -    "pretest": "npm run prepare",
    -    "presnap": "npm run prepare",
    -    "test": "tap",
    -    "snap": "tap",
    -    "format": "prettier --write . --loglevel warn",
    -    "benchmark": "node benchmark/index.js",
    -    "typedoc": "typedoc --tsconfig tsconfig-esm.json ./src/*.ts"
    -  },
    -  "prettier": {
    -    "semi": false,
    -    "printWidth": 80,
    -    "tabWidth": 2,
    -    "useTabs": false,
    -    "singleQuote": true,
    -    "jsxSingleQuote": false,
    -    "bracketSameLine": true,
    -    "arrowParens": "avoid",
    -    "endOfLine": "lf"
    -  },
    -  "engines": {
    -    "node": ">=16 || 14 >=14.17"
    -  },
    -  "dependencies": {
    -    "brace-expansion": "^2.0.1"
    -  },
    -  "devDependencies": {
    -    "@types/brace-expansion": "^1.1.0",
    -    "@types/node": "^18.15.11",
    -    "@types/tap": "^15.0.8",
    -    "eslint-config-prettier": "^8.6.0",
    -    "mkdirp": "1",
    -    "prettier": "^2.8.2",
    -    "tap": "^18.7.2",
    -    "ts-node": "^10.9.1",
    -    "tshy": "^1.12.0",
    -    "typedoc": "^0.23.21",
    -    "typescript": "^4.9.3"
    -  },
    -  "funding": {
    -    "url": "https://github.com/sponsors/isaacs"
    -  },
    -  "license": "ISC",
    -  "tshy": {
    -    "exports": {
    -      "./package.json": "./package.json",
    -      ".": "./src/index.ts"
    -    }
    -  },
    -  "type": "module"
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/path-scurry/dist/commonjs/index.js b/deps/npm/node_modules/node-gyp/node_modules/path-scurry/dist/commonjs/index.js
    deleted file mode 100644
    index 555de62f04c90e..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/path-scurry/dist/commonjs/index.js
    +++ /dev/null
    @@ -1,2014 +0,0 @@
    -"use strict";
    -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    -    if (k2 === undefined) k2 = k;
    -    var desc = Object.getOwnPropertyDescriptor(m, k);
    -    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
    -      desc = { enumerable: true, get: function() { return m[k]; } };
    -    }
    -    Object.defineProperty(o, k2, desc);
    -}) : (function(o, m, k, k2) {
    -    if (k2 === undefined) k2 = k;
    -    o[k2] = m[k];
    -}));
    -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    -    Object.defineProperty(o, "default", { enumerable: true, value: v });
    -}) : function(o, v) {
    -    o["default"] = v;
    -});
    -var __importStar = (this && this.__importStar) || function (mod) {
    -    if (mod && mod.__esModule) return mod;
    -    var result = {};
    -    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    -    __setModuleDefault(result, mod);
    -    return result;
    -};
    -Object.defineProperty(exports, "__esModule", { value: true });
    -exports.PathScurry = exports.Path = exports.PathScurryDarwin = exports.PathScurryPosix = exports.PathScurryWin32 = exports.PathScurryBase = exports.PathPosix = exports.PathWin32 = exports.PathBase = exports.ChildrenCache = exports.ResolveCache = void 0;
    -const lru_cache_1 = require("lru-cache");
    -const node_path_1 = require("node:path");
    -const node_url_1 = require("node:url");
    -const fs_1 = require("fs");
    -const actualFS = __importStar(require("node:fs"));
    -const realpathSync = fs_1.realpathSync.native;
    -// TODO: test perf of fs/promises realpath vs realpathCB,
    -// since the promises one uses realpath.native
    -const promises_1 = require("node:fs/promises");
    -const minipass_1 = require("minipass");
    -const defaultFS = {
    -    lstatSync: fs_1.lstatSync,
    -    readdir: fs_1.readdir,
    -    readdirSync: fs_1.readdirSync,
    -    readlinkSync: fs_1.readlinkSync,
    -    realpathSync,
    -    promises: {
    -        lstat: promises_1.lstat,
    -        readdir: promises_1.readdir,
    -        readlink: promises_1.readlink,
    -        realpath: promises_1.realpath,
    -    },
    -};
    -// if they just gave us require('fs') then use our default
    -const fsFromOption = (fsOption) => !fsOption || fsOption === defaultFS || fsOption === actualFS ?
    -    defaultFS
    -    : {
    -        ...defaultFS,
    -        ...fsOption,
    -        promises: {
    -            ...defaultFS.promises,
    -            ...(fsOption.promises || {}),
    -        },
    -    };
    -// turn something like //?/c:/ into c:\
    -const uncDriveRegexp = /^\\\\\?\\([a-z]:)\\?$/i;
    -const uncToDrive = (rootPath) => rootPath.replace(/\//g, '\\').replace(uncDriveRegexp, '$1\\');
    -// windows paths are separated by either / or \
    -const eitherSep = /[\\\/]/;
    -const UNKNOWN = 0; // may not even exist, for all we know
    -const IFIFO = 0b0001;
    -const IFCHR = 0b0010;
    -const IFDIR = 0b0100;
    -const IFBLK = 0b0110;
    -const IFREG = 0b1000;
    -const IFLNK = 0b1010;
    -const IFSOCK = 0b1100;
    -const IFMT = 0b1111;
    -// mask to unset low 4 bits
    -const IFMT_UNKNOWN = ~IFMT;
    -// set after successfully calling readdir() and getting entries.
    -const READDIR_CALLED = 0b0000_0001_0000;
    -// set after a successful lstat()
    -const LSTAT_CALLED = 0b0000_0010_0000;
    -// set if an entry (or one of its parents) is definitely not a dir
    -const ENOTDIR = 0b0000_0100_0000;
    -// set if an entry (or one of its parents) does not exist
    -// (can also be set on lstat errors like EACCES or ENAMETOOLONG)
    -const ENOENT = 0b0000_1000_0000;
    -// cannot have child entries -- also verify &IFMT is either IFDIR or IFLNK
    -// set if we fail to readlink
    -const ENOREADLINK = 0b0001_0000_0000;
    -// set if we know realpath() will fail
    -const ENOREALPATH = 0b0010_0000_0000;
    -const ENOCHILD = ENOTDIR | ENOENT | ENOREALPATH;
    -const TYPEMASK = 0b0011_1111_1111;
    -const entToType = (s) => s.isFile() ? IFREG
    -    : s.isDirectory() ? IFDIR
    -        : s.isSymbolicLink() ? IFLNK
    -            : s.isCharacterDevice() ? IFCHR
    -                : s.isBlockDevice() ? IFBLK
    -                    : s.isSocket() ? IFSOCK
    -                        : s.isFIFO() ? IFIFO
    -                            : UNKNOWN;
    -// normalize unicode path names
    -const normalizeCache = new Map();
    -const normalize = (s) => {
    -    const c = normalizeCache.get(s);
    -    if (c)
    -        return c;
    -    const n = s.normalize('NFKD');
    -    normalizeCache.set(s, n);
    -    return n;
    -};
    -const normalizeNocaseCache = new Map();
    -const normalizeNocase = (s) => {
    -    const c = normalizeNocaseCache.get(s);
    -    if (c)
    -        return c;
    -    const n = normalize(s.toLowerCase());
    -    normalizeNocaseCache.set(s, n);
    -    return n;
    -};
    -/**
    - * An LRUCache for storing resolved path strings or Path objects.
    - * @internal
    - */
    -class ResolveCache extends lru_cache_1.LRUCache {
    -    constructor() {
    -        super({ max: 256 });
    -    }
    -}
    -exports.ResolveCache = ResolveCache;
    -// In order to prevent blowing out the js heap by allocating hundreds of
    -// thousands of Path entries when walking extremely large trees, the "children"
    -// in this tree are represented by storing an array of Path entries in an
    -// LRUCache, indexed by the parent.  At any time, Path.children() may return an
    -// empty array, indicating that it doesn't know about any of its children, and
    -// thus has to rebuild that cache.  This is fine, it just means that we don't
    -// benefit as much from having the cached entries, but huge directory walks
    -// don't blow out the stack, and smaller ones are still as fast as possible.
    -//
    -//It does impose some complexity when building up the readdir data, because we
    -//need to pass a reference to the children array that we started with.
    -/**
    - * an LRUCache for storing child entries.
    - * @internal
    - */
    -class ChildrenCache extends lru_cache_1.LRUCache {
    -    constructor(maxSize = 16 * 1024) {
    -        super({
    -            maxSize,
    -            // parent + children
    -            sizeCalculation: a => a.length + 1,
    -        });
    -    }
    -}
    -exports.ChildrenCache = ChildrenCache;
    -const setAsCwd = Symbol('PathScurry setAsCwd');
    -/**
    - * Path objects are sort of like a super-powered
    - * {@link https://nodejs.org/docs/latest/api/fs.html#class-fsdirent fs.Dirent}
    - *
    - * Each one represents a single filesystem entry on disk, which may or may not
    - * exist. It includes methods for reading various types of information via
    - * lstat, readlink, and readdir, and caches all information to the greatest
    - * degree possible.
    - *
    - * Note that fs operations that would normally throw will instead return an
    - * "empty" value. This is in order to prevent excessive overhead from error
    - * stack traces.
    - */
    -class PathBase {
    -    /**
    -     * the basename of this path
    -     *
    -     * **Important**: *always* test the path name against any test string
    -     * usingthe {@link isNamed} method, and not by directly comparing this
    -     * string. Otherwise, unicode path strings that the system sees as identical
    -     * will not be properly treated as the same path, leading to incorrect
    -     * behavior and possible security issues.
    -     */
    -    name;
    -    /**
    -     * the Path entry corresponding to the path root.
    -     *
    -     * @internal
    -     */
    -    root;
    -    /**
    -     * All roots found within the current PathScurry family
    -     *
    -     * @internal
    -     */
    -    roots;
    -    /**
    -     * a reference to the parent path, or undefined in the case of root entries
    -     *
    -     * @internal
    -     */
    -    parent;
    -    /**
    -     * boolean indicating whether paths are compared case-insensitively
    -     * @internal
    -     */
    -    nocase;
    -    /**
    -     * boolean indicating that this path is the current working directory
    -     * of the PathScurry collection that contains it.
    -     */
    -    isCWD = false;
    -    // potential default fs override
    -    #fs;
    -    // Stats fields
    -    #dev;
    -    get dev() {
    -        return this.#dev;
    -    }
    -    #mode;
    -    get mode() {
    -        return this.#mode;
    -    }
    -    #nlink;
    -    get nlink() {
    -        return this.#nlink;
    -    }
    -    #uid;
    -    get uid() {
    -        return this.#uid;
    -    }
    -    #gid;
    -    get gid() {
    -        return this.#gid;
    -    }
    -    #rdev;
    -    get rdev() {
    -        return this.#rdev;
    -    }
    -    #blksize;
    -    get blksize() {
    -        return this.#blksize;
    -    }
    -    #ino;
    -    get ino() {
    -        return this.#ino;
    -    }
    -    #size;
    -    get size() {
    -        return this.#size;
    -    }
    -    #blocks;
    -    get blocks() {
    -        return this.#blocks;
    -    }
    -    #atimeMs;
    -    get atimeMs() {
    -        return this.#atimeMs;
    -    }
    -    #mtimeMs;
    -    get mtimeMs() {
    -        return this.#mtimeMs;
    -    }
    -    #ctimeMs;
    -    get ctimeMs() {
    -        return this.#ctimeMs;
    -    }
    -    #birthtimeMs;
    -    get birthtimeMs() {
    -        return this.#birthtimeMs;
    -    }
    -    #atime;
    -    get atime() {
    -        return this.#atime;
    -    }
    -    #mtime;
    -    get mtime() {
    -        return this.#mtime;
    -    }
    -    #ctime;
    -    get ctime() {
    -        return this.#ctime;
    -    }
    -    #birthtime;
    -    get birthtime() {
    -        return this.#birthtime;
    -    }
    -    #matchName;
    -    #depth;
    -    #fullpath;
    -    #fullpathPosix;
    -    #relative;
    -    #relativePosix;
    -    #type;
    -    #children;
    -    #linkTarget;
    -    #realpath;
    -    /**
    -     * This property is for compatibility with the Dirent class as of
    -     * Node v20, where Dirent['parentPath'] refers to the path of the
    -     * directory that was passed to readdir. For root entries, it's the path
    -     * to the entry itself.
    -     */
    -    get parentPath() {
    -        return (this.parent || this).fullpath();
    -    }
    -    /**
    -     * Deprecated alias for Dirent['parentPath'] Somewhat counterintuitively,
    -     * this property refers to the *parent* path, not the path object itself.
    -     */
    -    get path() {
    -        return this.parentPath;
    -    }
    -    /**
    -     * Do not create new Path objects directly.  They should always be accessed
    -     * via the PathScurry class or other methods on the Path class.
    -     *
    -     * @internal
    -     */
    -    constructor(name, type = UNKNOWN, root, roots, nocase, children, opts) {
    -        this.name = name;
    -        this.#matchName = nocase ? normalizeNocase(name) : normalize(name);
    -        this.#type = type & TYPEMASK;
    -        this.nocase = nocase;
    -        this.roots = roots;
    -        this.root = root || this;
    -        this.#children = children;
    -        this.#fullpath = opts.fullpath;
    -        this.#relative = opts.relative;
    -        this.#relativePosix = opts.relativePosix;
    -        this.parent = opts.parent;
    -        if (this.parent) {
    -            this.#fs = this.parent.#fs;
    -        }
    -        else {
    -            this.#fs = fsFromOption(opts.fs);
    -        }
    -    }
    -    /**
    -     * Returns the depth of the Path object from its root.
    -     *
    -     * For example, a path at `/foo/bar` would have a depth of 2.
    -     */
    -    depth() {
    -        if (this.#depth !== undefined)
    -            return this.#depth;
    -        if (!this.parent)
    -            return (this.#depth = 0);
    -        return (this.#depth = this.parent.depth() + 1);
    -    }
    -    /**
    -     * @internal
    -     */
    -    childrenCache() {
    -        return this.#children;
    -    }
    -    /**
    -     * Get the Path object referenced by the string path, resolved from this Path
    -     */
    -    resolve(path) {
    -        if (!path) {
    -            return this;
    -        }
    -        const rootPath = this.getRootString(path);
    -        const dir = path.substring(rootPath.length);
    -        const dirParts = dir.split(this.splitSep);
    -        const result = rootPath ?
    -            this.getRoot(rootPath).#resolveParts(dirParts)
    -            : this.#resolveParts(dirParts);
    -        return result;
    -    }
    -    #resolveParts(dirParts) {
    -        let p = this;
    -        for (const part of dirParts) {
    -            p = p.child(part);
    -        }
    -        return p;
    -    }
    -    /**
    -     * Returns the cached children Path objects, if still available.  If they
    -     * have fallen out of the cache, then returns an empty array, and resets the
    -     * READDIR_CALLED bit, so that future calls to readdir() will require an fs
    -     * lookup.
    -     *
    -     * @internal
    -     */
    -    children() {
    -        const cached = this.#children.get(this);
    -        if (cached) {
    -            return cached;
    -        }
    -        const children = Object.assign([], { provisional: 0 });
    -        this.#children.set(this, children);
    -        this.#type &= ~READDIR_CALLED;
    -        return children;
    -    }
    -    /**
    -     * Resolves a path portion and returns or creates the child Path.
    -     *
    -     * Returns `this` if pathPart is `''` or `'.'`, or `parent` if pathPart is
    -     * `'..'`.
    -     *
    -     * This should not be called directly.  If `pathPart` contains any path
    -     * separators, it will lead to unsafe undefined behavior.
    -     *
    -     * Use `Path.resolve()` instead.
    -     *
    -     * @internal
    -     */
    -    child(pathPart, opts) {
    -        if (pathPart === '' || pathPart === '.') {
    -            return this;
    -        }
    -        if (pathPart === '..') {
    -            return this.parent || this;
    -        }
    -        // find the child
    -        const children = this.children();
    -        const name = this.nocase ? normalizeNocase(pathPart) : normalize(pathPart);
    -        for (const p of children) {
    -            if (p.#matchName === name) {
    -                return p;
    -            }
    -        }
    -        // didn't find it, create provisional child, since it might not
    -        // actually exist.  If we know the parent isn't a dir, then
    -        // in fact it CAN'T exist.
    -        const s = this.parent ? this.sep : '';
    -        const fullpath = this.#fullpath ? this.#fullpath + s + pathPart : undefined;
    -        const pchild = this.newChild(pathPart, UNKNOWN, {
    -            ...opts,
    -            parent: this,
    -            fullpath,
    -        });
    -        if (!this.canReaddir()) {
    -            pchild.#type |= ENOENT;
    -        }
    -        // don't have to update provisional, because if we have real children,
    -        // then provisional is set to children.length, otherwise a lower number
    -        children.push(pchild);
    -        return pchild;
    -    }
    -    /**
    -     * The relative path from the cwd. If it does not share an ancestor with
    -     * the cwd, then this ends up being equivalent to the fullpath()
    -     */
    -    relative() {
    -        if (this.isCWD)
    -            return '';
    -        if (this.#relative !== undefined) {
    -            return this.#relative;
    -        }
    -        const name = this.name;
    -        const p = this.parent;
    -        if (!p) {
    -            return (this.#relative = this.name);
    -        }
    -        const pv = p.relative();
    -        return pv + (!pv || !p.parent ? '' : this.sep) + name;
    -    }
    -    /**
    -     * The relative path from the cwd, using / as the path separator.
    -     * If it does not share an ancestor with
    -     * the cwd, then this ends up being equivalent to the fullpathPosix()
    -     * On posix systems, this is identical to relative().
    -     */
    -    relativePosix() {
    -        if (this.sep === '/')
    -            return this.relative();
    -        if (this.isCWD)
    -            return '';
    -        if (this.#relativePosix !== undefined)
    -            return this.#relativePosix;
    -        const name = this.name;
    -        const p = this.parent;
    -        if (!p) {
    -            return (this.#relativePosix = this.fullpathPosix());
    -        }
    -        const pv = p.relativePosix();
    -        return pv + (!pv || !p.parent ? '' : '/') + name;
    -    }
    -    /**
    -     * The fully resolved path string for this Path entry
    -     */
    -    fullpath() {
    -        if (this.#fullpath !== undefined) {
    -            return this.#fullpath;
    -        }
    -        const name = this.name;
    -        const p = this.parent;
    -        if (!p) {
    -            return (this.#fullpath = this.name);
    -        }
    -        const pv = p.fullpath();
    -        const fp = pv + (!p.parent ? '' : this.sep) + name;
    -        return (this.#fullpath = fp);
    -    }
    -    /**
    -     * On platforms other than windows, this is identical to fullpath.
    -     *
    -     * On windows, this is overridden to return the forward-slash form of the
    -     * full UNC path.
    -     */
    -    fullpathPosix() {
    -        if (this.#fullpathPosix !== undefined)
    -            return this.#fullpathPosix;
    -        if (this.sep === '/')
    -            return (this.#fullpathPosix = this.fullpath());
    -        if (!this.parent) {
    -            const p = this.fullpath().replace(/\\/g, '/');
    -            if (/^[a-z]:\//i.test(p)) {
    -                return (this.#fullpathPosix = `//?/${p}`);
    -            }
    -            else {
    -                return (this.#fullpathPosix = p);
    -            }
    -        }
    -        const p = this.parent;
    -        const pfpp = p.fullpathPosix();
    -        const fpp = pfpp + (!pfpp || !p.parent ? '' : '/') + this.name;
    -        return (this.#fullpathPosix = fpp);
    -    }
    -    /**
    -     * Is the Path of an unknown type?
    -     *
    -     * Note that we might know *something* about it if there has been a previous
    -     * filesystem operation, for example that it does not exist, or is not a
    -     * link, or whether it has child entries.
    -     */
    -    isUnknown() {
    -        return (this.#type & IFMT) === UNKNOWN;
    -    }
    -    isType(type) {
    -        return this[`is${type}`]();
    -    }
    -    getType() {
    -        return (this.isUnknown() ? 'Unknown'
    -            : this.isDirectory() ? 'Directory'
    -                : this.isFile() ? 'File'
    -                    : this.isSymbolicLink() ? 'SymbolicLink'
    -                        : this.isFIFO() ? 'FIFO'
    -                            : this.isCharacterDevice() ? 'CharacterDevice'
    -                                : this.isBlockDevice() ? 'BlockDevice'
    -                                    : /* c8 ignore start */ this.isSocket() ? 'Socket'
    -                                        : 'Unknown');
    -        /* c8 ignore stop */
    -    }
    -    /**
    -     * Is the Path a regular file?
    -     */
    -    isFile() {
    -        return (this.#type & IFMT) === IFREG;
    -    }
    -    /**
    -     * Is the Path a directory?
    -     */
    -    isDirectory() {
    -        return (this.#type & IFMT) === IFDIR;
    -    }
    -    /**
    -     * Is the path a character device?
    -     */
    -    isCharacterDevice() {
    -        return (this.#type & IFMT) === IFCHR;
    -    }
    -    /**
    -     * Is the path a block device?
    -     */
    -    isBlockDevice() {
    -        return (this.#type & IFMT) === IFBLK;
    -    }
    -    /**
    -     * Is the path a FIFO pipe?
    -     */
    -    isFIFO() {
    -        return (this.#type & IFMT) === IFIFO;
    -    }
    -    /**
    -     * Is the path a socket?
    -     */
    -    isSocket() {
    -        return (this.#type & IFMT) === IFSOCK;
    -    }
    -    /**
    -     * Is the path a symbolic link?
    -     */
    -    isSymbolicLink() {
    -        return (this.#type & IFLNK) === IFLNK;
    -    }
    -    /**
    -     * Return the entry if it has been subject of a successful lstat, or
    -     * undefined otherwise.
    -     *
    -     * Does not read the filesystem, so an undefined result *could* simply
    -     * mean that we haven't called lstat on it.
    -     */
    -    lstatCached() {
    -        return this.#type & LSTAT_CALLED ? this : undefined;
    -    }
    -    /**
    -     * Return the cached link target if the entry has been the subject of a
    -     * successful readlink, or undefined otherwise.
    -     *
    -     * Does not read the filesystem, so an undefined result *could* just mean we
    -     * don't have any cached data. Only use it if you are very sure that a
    -     * readlink() has been called at some point.
    -     */
    -    readlinkCached() {
    -        return this.#linkTarget;
    -    }
    -    /**
    -     * Returns the cached realpath target if the entry has been the subject
    -     * of a successful realpath, or undefined otherwise.
    -     *
    -     * Does not read the filesystem, so an undefined result *could* just mean we
    -     * don't have any cached data. Only use it if you are very sure that a
    -     * realpath() has been called at some point.
    -     */
    -    realpathCached() {
    -        return this.#realpath;
    -    }
    -    /**
    -     * Returns the cached child Path entries array if the entry has been the
    -     * subject of a successful readdir(), or [] otherwise.
    -     *
    -     * Does not read the filesystem, so an empty array *could* just mean we
    -     * don't have any cached data. Only use it if you are very sure that a
    -     * readdir() has been called recently enough to still be valid.
    -     */
    -    readdirCached() {
    -        const children = this.children();
    -        return children.slice(0, children.provisional);
    -    }
    -    /**
    -     * Return true if it's worth trying to readlink.  Ie, we don't (yet) have
    -     * any indication that readlink will definitely fail.
    -     *
    -     * Returns false if the path is known to not be a symlink, if a previous
    -     * readlink failed, or if the entry does not exist.
    -     */
    -    canReadlink() {
    -        if (this.#linkTarget)
    -            return true;
    -        if (!this.parent)
    -            return false;
    -        // cases where it cannot possibly succeed
    -        const ifmt = this.#type & IFMT;
    -        return !((ifmt !== UNKNOWN && ifmt !== IFLNK) ||
    -            this.#type & ENOREADLINK ||
    -            this.#type & ENOENT);
    -    }
    -    /**
    -     * Return true if readdir has previously been successfully called on this
    -     * path, indicating that cachedReaddir() is likely valid.
    -     */
    -    calledReaddir() {
    -        return !!(this.#type & READDIR_CALLED);
    -    }
    -    /**
    -     * Returns true if the path is known to not exist. That is, a previous lstat
    -     * or readdir failed to verify its existence when that would have been
    -     * expected, or a parent entry was marked either enoent or enotdir.
    -     */
    -    isENOENT() {
    -        return !!(this.#type & ENOENT);
    -    }
    -    /**
    -     * Return true if the path is a match for the given path name.  This handles
    -     * case sensitivity and unicode normalization.
    -     *
    -     * Note: even on case-sensitive systems, it is **not** safe to test the
    -     * equality of the `.name` property to determine whether a given pathname
    -     * matches, due to unicode normalization mismatches.
    -     *
    -     * Always use this method instead of testing the `path.name` property
    -     * directly.
    -     */
    -    isNamed(n) {
    -        return !this.nocase ?
    -            this.#matchName === normalize(n)
    -            : this.#matchName === normalizeNocase(n);
    -    }
    -    /**
    -     * Return the Path object corresponding to the target of a symbolic link.
    -     *
    -     * If the Path is not a symbolic link, or if the readlink call fails for any
    -     * reason, `undefined` is returned.
    -     *
    -     * Result is cached, and thus may be outdated if the filesystem is mutated.
    -     */
    -    async readlink() {
    -        const target = this.#linkTarget;
    -        if (target) {
    -            return target;
    -        }
    -        if (!this.canReadlink()) {
    -            return undefined;
    -        }
    -        /* c8 ignore start */
    -        // already covered by the canReadlink test, here for ts grumples
    -        if (!this.parent) {
    -            return undefined;
    -        }
    -        /* c8 ignore stop */
    -        try {
    -            const read = await this.#fs.promises.readlink(this.fullpath());
    -            const linkTarget = (await this.parent.realpath())?.resolve(read);
    -            if (linkTarget) {
    -                return (this.#linkTarget = linkTarget);
    -            }
    -        }
    -        catch (er) {
    -            this.#readlinkFail(er.code);
    -            return undefined;
    -        }
    -    }
    -    /**
    -     * Synchronous {@link PathBase.readlink}
    -     */
    -    readlinkSync() {
    -        const target = this.#linkTarget;
    -        if (target) {
    -            return target;
    -        }
    -        if (!this.canReadlink()) {
    -            return undefined;
    -        }
    -        /* c8 ignore start */
    -        // already covered by the canReadlink test, here for ts grumples
    -        if (!this.parent) {
    -            return undefined;
    -        }
    -        /* c8 ignore stop */
    -        try {
    -            const read = this.#fs.readlinkSync(this.fullpath());
    -            const linkTarget = this.parent.realpathSync()?.resolve(read);
    -            if (linkTarget) {
    -                return (this.#linkTarget = linkTarget);
    -            }
    -        }
    -        catch (er) {
    -            this.#readlinkFail(er.code);
    -            return undefined;
    -        }
    -    }
    -    #readdirSuccess(children) {
    -        // succeeded, mark readdir called bit
    -        this.#type |= READDIR_CALLED;
    -        // mark all remaining provisional children as ENOENT
    -        for (let p = children.provisional; p < children.length; p++) {
    -            const c = children[p];
    -            if (c)
    -                c.#markENOENT();
    -        }
    -    }
    -    #markENOENT() {
    -        // mark as UNKNOWN and ENOENT
    -        if (this.#type & ENOENT)
    -            return;
    -        this.#type = (this.#type | ENOENT) & IFMT_UNKNOWN;
    -        this.#markChildrenENOENT();
    -    }
    -    #markChildrenENOENT() {
    -        // all children are provisional and do not exist
    -        const children = this.children();
    -        children.provisional = 0;
    -        for (const p of children) {
    -            p.#markENOENT();
    -        }
    -    }
    -    #markENOREALPATH() {
    -        this.#type |= ENOREALPATH;
    -        this.#markENOTDIR();
    -    }
    -    // save the information when we know the entry is not a dir
    -    #markENOTDIR() {
    -        // entry is not a directory, so any children can't exist.
    -        // this *should* be impossible, since any children created
    -        // after it's been marked ENOTDIR should be marked ENOENT,
    -        // so it won't even get to this point.
    -        /* c8 ignore start */
    -        if (this.#type & ENOTDIR)
    -            return;
    -        /* c8 ignore stop */
    -        let t = this.#type;
    -        // this could happen if we stat a dir, then delete it,
    -        // then try to read it or one of its children.
    -        if ((t & IFMT) === IFDIR)
    -            t &= IFMT_UNKNOWN;
    -        this.#type = t | ENOTDIR;
    -        this.#markChildrenENOENT();
    -    }
    -    #readdirFail(code = '') {
    -        // markENOTDIR and markENOENT also set provisional=0
    -        if (code === 'ENOTDIR' || code === 'EPERM') {
    -            this.#markENOTDIR();
    -        }
    -        else if (code === 'ENOENT') {
    -            this.#markENOENT();
    -        }
    -        else {
    -            this.children().provisional = 0;
    -        }
    -    }
    -    #lstatFail(code = '') {
    -        // Windows just raises ENOENT in this case, disable for win CI
    -        /* c8 ignore start */
    -        if (code === 'ENOTDIR') {
    -            // already know it has a parent by this point
    -            const p = this.parent;
    -            p.#markENOTDIR();
    -        }
    -        else if (code === 'ENOENT') {
    -            /* c8 ignore stop */
    -            this.#markENOENT();
    -        }
    -    }
    -    #readlinkFail(code = '') {
    -        let ter = this.#type;
    -        ter |= ENOREADLINK;
    -        if (code === 'ENOENT')
    -            ter |= ENOENT;
    -        // windows gets a weird error when you try to readlink a file
    -        if (code === 'EINVAL' || code === 'UNKNOWN') {
    -            // exists, but not a symlink, we don't know WHAT it is, so remove
    -            // all IFMT bits.
    -            ter &= IFMT_UNKNOWN;
    -        }
    -        this.#type = ter;
    -        // windows just gets ENOENT in this case.  We do cover the case,
    -        // just disabled because it's impossible on Windows CI
    -        /* c8 ignore start */
    -        if (code === 'ENOTDIR' && this.parent) {
    -            this.parent.#markENOTDIR();
    -        }
    -        /* c8 ignore stop */
    -    }
    -    #readdirAddChild(e, c) {
    -        return (this.#readdirMaybePromoteChild(e, c) ||
    -            this.#readdirAddNewChild(e, c));
    -    }
    -    #readdirAddNewChild(e, c) {
    -        // alloc new entry at head, so it's never provisional
    -        const type = entToType(e);
    -        const child = this.newChild(e.name, type, { parent: this });
    -        const ifmt = child.#type & IFMT;
    -        if (ifmt !== IFDIR && ifmt !== IFLNK && ifmt !== UNKNOWN) {
    -            child.#type |= ENOTDIR;
    -        }
    -        c.unshift(child);
    -        c.provisional++;
    -        return child;
    -    }
    -    #readdirMaybePromoteChild(e, c) {
    -        for (let p = c.provisional; p < c.length; p++) {
    -            const pchild = c[p];
    -            const name = this.nocase ? normalizeNocase(e.name) : normalize(e.name);
    -            if (name !== pchild.#matchName) {
    -                continue;
    -            }
    -            return this.#readdirPromoteChild(e, pchild, p, c);
    -        }
    -    }
    -    #readdirPromoteChild(e, p, index, c) {
    -        const v = p.name;
    -        // retain any other flags, but set ifmt from dirent
    -        p.#type = (p.#type & IFMT_UNKNOWN) | entToType(e);
    -        // case sensitivity fixing when we learn the true name.
    -        if (v !== e.name)
    -            p.name = e.name;
    -        // just advance provisional index (potentially off the list),
    -        // otherwise we have to splice/pop it out and re-insert at head
    -        if (index !== c.provisional) {
    -            if (index === c.length - 1)
    -                c.pop();
    -            else
    -                c.splice(index, 1);
    -            c.unshift(p);
    -        }
    -        c.provisional++;
    -        return p;
    -    }
    -    /**
    -     * Call lstat() on this Path, and update all known information that can be
    -     * determined.
    -     *
    -     * Note that unlike `fs.lstat()`, the returned value does not contain some
    -     * information, such as `mode`, `dev`, `nlink`, and `ino`.  If that
    -     * information is required, you will need to call `fs.lstat` yourself.
    -     *
    -     * If the Path refers to a nonexistent file, or if the lstat call fails for
    -     * any reason, `undefined` is returned.  Otherwise the updated Path object is
    -     * returned.
    -     *
    -     * Results are cached, and thus may be out of date if the filesystem is
    -     * mutated.
    -     */
    -    async lstat() {
    -        if ((this.#type & ENOENT) === 0) {
    -            try {
    -                this.#applyStat(await this.#fs.promises.lstat(this.fullpath()));
    -                return this;
    -            }
    -            catch (er) {
    -                this.#lstatFail(er.code);
    -            }
    -        }
    -    }
    -    /**
    -     * synchronous {@link PathBase.lstat}
    -     */
    -    lstatSync() {
    -        if ((this.#type & ENOENT) === 0) {
    -            try {
    -                this.#applyStat(this.#fs.lstatSync(this.fullpath()));
    -                return this;
    -            }
    -            catch (er) {
    -                this.#lstatFail(er.code);
    -            }
    -        }
    -    }
    -    #applyStat(st) {
    -        const { atime, atimeMs, birthtime, birthtimeMs, blksize, blocks, ctime, ctimeMs, dev, gid, ino, mode, mtime, mtimeMs, nlink, rdev, size, uid, } = st;
    -        this.#atime = atime;
    -        this.#atimeMs = atimeMs;
    -        this.#birthtime = birthtime;
    -        this.#birthtimeMs = birthtimeMs;
    -        this.#blksize = blksize;
    -        this.#blocks = blocks;
    -        this.#ctime = ctime;
    -        this.#ctimeMs = ctimeMs;
    -        this.#dev = dev;
    -        this.#gid = gid;
    -        this.#ino = ino;
    -        this.#mode = mode;
    -        this.#mtime = mtime;
    -        this.#mtimeMs = mtimeMs;
    -        this.#nlink = nlink;
    -        this.#rdev = rdev;
    -        this.#size = size;
    -        this.#uid = uid;
    -        const ifmt = entToType(st);
    -        // retain any other flags, but set the ifmt
    -        this.#type = (this.#type & IFMT_UNKNOWN) | ifmt | LSTAT_CALLED;
    -        if (ifmt !== UNKNOWN && ifmt !== IFDIR && ifmt !== IFLNK) {
    -            this.#type |= ENOTDIR;
    -        }
    -    }
    -    #onReaddirCB = [];
    -    #readdirCBInFlight = false;
    -    #callOnReaddirCB(children) {
    -        this.#readdirCBInFlight = false;
    -        const cbs = this.#onReaddirCB.slice();
    -        this.#onReaddirCB.length = 0;
    -        cbs.forEach(cb => cb(null, children));
    -    }
    -    /**
    -     * Standard node-style callback interface to get list of directory entries.
    -     *
    -     * If the Path cannot or does not contain any children, then an empty array
    -     * is returned.
    -     *
    -     * Results are cached, and thus may be out of date if the filesystem is
    -     * mutated.
    -     *
    -     * @param cb The callback called with (er, entries).  Note that the `er`
    -     * param is somewhat extraneous, as all readdir() errors are handled and
    -     * simply result in an empty set of entries being returned.
    -     * @param allowZalgo Boolean indicating that immediately known results should
    -     * *not* be deferred with `queueMicrotask`. Defaults to `false`. Release
    -     * zalgo at your peril, the dark pony lord is devious and unforgiving.
    -     */
    -    readdirCB(cb, allowZalgo = false) {
    -        if (!this.canReaddir()) {
    -            if (allowZalgo)
    -                cb(null, []);
    -            else
    -                queueMicrotask(() => cb(null, []));
    -            return;
    -        }
    -        const children = this.children();
    -        if (this.calledReaddir()) {
    -            const c = children.slice(0, children.provisional);
    -            if (allowZalgo)
    -                cb(null, c);
    -            else
    -                queueMicrotask(() => cb(null, c));
    -            return;
    -        }
    -        // don't have to worry about zalgo at this point.
    -        this.#onReaddirCB.push(cb);
    -        if (this.#readdirCBInFlight) {
    -            return;
    -        }
    -        this.#readdirCBInFlight = true;
    -        // else read the directory, fill up children
    -        // de-provisionalize any provisional children.
    -        const fullpath = this.fullpath();
    -        this.#fs.readdir(fullpath, { withFileTypes: true }, (er, entries) => {
    -            if (er) {
    -                this.#readdirFail(er.code);
    -                children.provisional = 0;
    -            }
    -            else {
    -                // if we didn't get an error, we always get entries.
    -                //@ts-ignore
    -                for (const e of entries) {
    -                    this.#readdirAddChild(e, children);
    -                }
    -                this.#readdirSuccess(children);
    -            }
    -            this.#callOnReaddirCB(children.slice(0, children.provisional));
    -            return;
    -        });
    -    }
    -    #asyncReaddirInFlight;
    -    /**
    -     * Return an array of known child entries.
    -     *
    -     * If the Path cannot or does not contain any children, then an empty array
    -     * is returned.
    -     *
    -     * Results are cached, and thus may be out of date if the filesystem is
    -     * mutated.
    -     */
    -    async readdir() {
    -        if (!this.canReaddir()) {
    -            return [];
    -        }
    -        const children = this.children();
    -        if (this.calledReaddir()) {
    -            return children.slice(0, children.provisional);
    -        }
    -        // else read the directory, fill up children
    -        // de-provisionalize any provisional children.
    -        const fullpath = this.fullpath();
    -        if (this.#asyncReaddirInFlight) {
    -            await this.#asyncReaddirInFlight;
    -        }
    -        else {
    -            /* c8 ignore start */
    -            let resolve = () => { };
    -            /* c8 ignore stop */
    -            this.#asyncReaddirInFlight = new Promise(res => (resolve = res));
    -            try {
    -                for (const e of await this.#fs.promises.readdir(fullpath, {
    -                    withFileTypes: true,
    -                })) {
    -                    this.#readdirAddChild(e, children);
    -                }
    -                this.#readdirSuccess(children);
    -            }
    -            catch (er) {
    -                this.#readdirFail(er.code);
    -                children.provisional = 0;
    -            }
    -            this.#asyncReaddirInFlight = undefined;
    -            resolve();
    -        }
    -        return children.slice(0, children.provisional);
    -    }
    -    /**
    -     * synchronous {@link PathBase.readdir}
    -     */
    -    readdirSync() {
    -        if (!this.canReaddir()) {
    -            return [];
    -        }
    -        const children = this.children();
    -        if (this.calledReaddir()) {
    -            return children.slice(0, children.provisional);
    -        }
    -        // else read the directory, fill up children
    -        // de-provisionalize any provisional children.
    -        const fullpath = this.fullpath();
    -        try {
    -            for (const e of this.#fs.readdirSync(fullpath, {
    -                withFileTypes: true,
    -            })) {
    -                this.#readdirAddChild(e, children);
    -            }
    -            this.#readdirSuccess(children);
    -        }
    -        catch (er) {
    -            this.#readdirFail(er.code);
    -            children.provisional = 0;
    -        }
    -        return children.slice(0, children.provisional);
    -    }
    -    canReaddir() {
    -        if (this.#type & ENOCHILD)
    -            return false;
    -        const ifmt = IFMT & this.#type;
    -        // we always set ENOTDIR when setting IFMT, so should be impossible
    -        /* c8 ignore start */
    -        if (!(ifmt === UNKNOWN || ifmt === IFDIR || ifmt === IFLNK)) {
    -            return false;
    -        }
    -        /* c8 ignore stop */
    -        return true;
    -    }
    -    shouldWalk(dirs, walkFilter) {
    -        return ((this.#type & IFDIR) === IFDIR &&
    -            !(this.#type & ENOCHILD) &&
    -            !dirs.has(this) &&
    -            (!walkFilter || walkFilter(this)));
    -    }
    -    /**
    -     * Return the Path object corresponding to path as resolved
    -     * by realpath(3).
    -     *
    -     * If the realpath call fails for any reason, `undefined` is returned.
    -     *
    -     * Result is cached, and thus may be outdated if the filesystem is mutated.
    -     * On success, returns a Path object.
    -     */
    -    async realpath() {
    -        if (this.#realpath)
    -            return this.#realpath;
    -        if ((ENOREALPATH | ENOREADLINK | ENOENT) & this.#type)
    -            return undefined;
    -        try {
    -            const rp = await this.#fs.promises.realpath(this.fullpath());
    -            return (this.#realpath = this.resolve(rp));
    -        }
    -        catch (_) {
    -            this.#markENOREALPATH();
    -        }
    -    }
    -    /**
    -     * Synchronous {@link realpath}
    -     */
    -    realpathSync() {
    -        if (this.#realpath)
    -            return this.#realpath;
    -        if ((ENOREALPATH | ENOREADLINK | ENOENT) & this.#type)
    -            return undefined;
    -        try {
    -            const rp = this.#fs.realpathSync(this.fullpath());
    -            return (this.#realpath = this.resolve(rp));
    -        }
    -        catch (_) {
    -            this.#markENOREALPATH();
    -        }
    -    }
    -    /**
    -     * Internal method to mark this Path object as the scurry cwd,
    -     * called by {@link PathScurry#chdir}
    -     *
    -     * @internal
    -     */
    -    [setAsCwd](oldCwd) {
    -        if (oldCwd === this)
    -            return;
    -        oldCwd.isCWD = false;
    -        this.isCWD = true;
    -        const changed = new Set([]);
    -        let rp = [];
    -        let p = this;
    -        while (p && p.parent) {
    -            changed.add(p);
    -            p.#relative = rp.join(this.sep);
    -            p.#relativePosix = rp.join('/');
    -            p = p.parent;
    -            rp.push('..');
    -        }
    -        // now un-memoize parents of old cwd
    -        p = oldCwd;
    -        while (p && p.parent && !changed.has(p)) {
    -            p.#relative = undefined;
    -            p.#relativePosix = undefined;
    -            p = p.parent;
    -        }
    -    }
    -}
    -exports.PathBase = PathBase;
    -/**
    - * Path class used on win32 systems
    - *
    - * Uses `'\\'` as the path separator for returned paths, either `'\\'` or `'/'`
    - * as the path separator for parsing paths.
    - */
    -class PathWin32 extends PathBase {
    -    /**
    -     * Separator for generating path strings.
    -     */
    -    sep = '\\';
    -    /**
    -     * Separator for parsing path strings.
    -     */
    -    splitSep = eitherSep;
    -    /**
    -     * Do not create new Path objects directly.  They should always be accessed
    -     * via the PathScurry class or other methods on the Path class.
    -     *
    -     * @internal
    -     */
    -    constructor(name, type = UNKNOWN, root, roots, nocase, children, opts) {
    -        super(name, type, root, roots, nocase, children, opts);
    -    }
    -    /**
    -     * @internal
    -     */
    -    newChild(name, type = UNKNOWN, opts = {}) {
    -        return new PathWin32(name, type, this.root, this.roots, this.nocase, this.childrenCache(), opts);
    -    }
    -    /**
    -     * @internal
    -     */
    -    getRootString(path) {
    -        return node_path_1.win32.parse(path).root;
    -    }
    -    /**
    -     * @internal
    -     */
    -    getRoot(rootPath) {
    -        rootPath = uncToDrive(rootPath.toUpperCase());
    -        if (rootPath === this.root.name) {
    -            return this.root;
    -        }
    -        // ok, not that one, check if it matches another we know about
    -        for (const [compare, root] of Object.entries(this.roots)) {
    -            if (this.sameRoot(rootPath, compare)) {
    -                return (this.roots[rootPath] = root);
    -            }
    -        }
    -        // otherwise, have to create a new one.
    -        return (this.roots[rootPath] = new PathScurryWin32(rootPath, this).root);
    -    }
    -    /**
    -     * @internal
    -     */
    -    sameRoot(rootPath, compare = this.root.name) {
    -        // windows can (rarely) have case-sensitive filesystem, but
    -        // UNC and drive letters are always case-insensitive, and canonically
    -        // represented uppercase.
    -        rootPath = rootPath
    -            .toUpperCase()
    -            .replace(/\//g, '\\')
    -            .replace(uncDriveRegexp, '$1\\');
    -        return rootPath === compare;
    -    }
    -}
    -exports.PathWin32 = PathWin32;
    -/**
    - * Path class used on all posix systems.
    - *
    - * Uses `'/'` as the path separator.
    - */
    -class PathPosix extends PathBase {
    -    /**
    -     * separator for parsing path strings
    -     */
    -    splitSep = '/';
    -    /**
    -     * separator for generating path strings
    -     */
    -    sep = '/';
    -    /**
    -     * Do not create new Path objects directly.  They should always be accessed
    -     * via the PathScurry class or other methods on the Path class.
    -     *
    -     * @internal
    -     */
    -    constructor(name, type = UNKNOWN, root, roots, nocase, children, opts) {
    -        super(name, type, root, roots, nocase, children, opts);
    -    }
    -    /**
    -     * @internal
    -     */
    -    getRootString(path) {
    -        return path.startsWith('/') ? '/' : '';
    -    }
    -    /**
    -     * @internal
    -     */
    -    getRoot(_rootPath) {
    -        return this.root;
    -    }
    -    /**
    -     * @internal
    -     */
    -    newChild(name, type = UNKNOWN, opts = {}) {
    -        return new PathPosix(name, type, this.root, this.roots, this.nocase, this.childrenCache(), opts);
    -    }
    -}
    -exports.PathPosix = PathPosix;
    -/**
    - * The base class for all PathScurry classes, providing the interface for path
    - * resolution and filesystem operations.
    - *
    - * Typically, you should *not* instantiate this class directly, but rather one
    - * of the platform-specific classes, or the exported {@link PathScurry} which
    - * defaults to the current platform.
    - */
    -class PathScurryBase {
    -    /**
    -     * The root Path entry for the current working directory of this Scurry
    -     */
    -    root;
    -    /**
    -     * The string path for the root of this Scurry's current working directory
    -     */
    -    rootPath;
    -    /**
    -     * A collection of all roots encountered, referenced by rootPath
    -     */
    -    roots;
    -    /**
    -     * The Path entry corresponding to this PathScurry's current working directory.
    -     */
    -    cwd;
    -    #resolveCache;
    -    #resolvePosixCache;
    -    #children;
    -    /**
    -     * Perform path comparisons case-insensitively.
    -     *
    -     * Defaults true on Darwin and Windows systems, false elsewhere.
    -     */
    -    nocase;
    -    #fs;
    -    /**
    -     * This class should not be instantiated directly.
    -     *
    -     * Use PathScurryWin32, PathScurryDarwin, PathScurryPosix, or PathScurry
    -     *
    -     * @internal
    -     */
    -    constructor(cwd = process.cwd(), pathImpl, sep, { nocase, childrenCacheSize = 16 * 1024, fs = defaultFS, } = {}) {
    -        this.#fs = fsFromOption(fs);
    -        if (cwd instanceof URL || cwd.startsWith('file://')) {
    -            cwd = (0, node_url_1.fileURLToPath)(cwd);
    -        }
    -        // resolve and split root, and then add to the store.
    -        // this is the only time we call path.resolve()
    -        const cwdPath = pathImpl.resolve(cwd);
    -        this.roots = Object.create(null);
    -        this.rootPath = this.parseRootPath(cwdPath);
    -        this.#resolveCache = new ResolveCache();
    -        this.#resolvePosixCache = new ResolveCache();
    -        this.#children = new ChildrenCache(childrenCacheSize);
    -        const split = cwdPath.substring(this.rootPath.length).split(sep);
    -        // resolve('/') leaves '', splits to [''], we don't want that.
    -        if (split.length === 1 && !split[0]) {
    -            split.pop();
    -        }
    -        /* c8 ignore start */
    -        if (nocase === undefined) {
    -            throw new TypeError('must provide nocase setting to PathScurryBase ctor');
    -        }
    -        /* c8 ignore stop */
    -        this.nocase = nocase;
    -        this.root = this.newRoot(this.#fs);
    -        this.roots[this.rootPath] = this.root;
    -        let prev = this.root;
    -        let len = split.length - 1;
    -        const joinSep = pathImpl.sep;
    -        let abs = this.rootPath;
    -        let sawFirst = false;
    -        for (const part of split) {
    -            const l = len--;
    -            prev = prev.child(part, {
    -                relative: new Array(l).fill('..').join(joinSep),
    -                relativePosix: new Array(l).fill('..').join('/'),
    -                fullpath: (abs += (sawFirst ? '' : joinSep) + part),
    -            });
    -            sawFirst = true;
    -        }
    -        this.cwd = prev;
    -    }
    -    /**
    -     * Get the depth of a provided path, string, or the cwd
    -     */
    -    depth(path = this.cwd) {
    -        if (typeof path === 'string') {
    -            path = this.cwd.resolve(path);
    -        }
    -        return path.depth();
    -    }
    -    /**
    -     * Return the cache of child entries.  Exposed so subclasses can create
    -     * child Path objects in a platform-specific way.
    -     *
    -     * @internal
    -     */
    -    childrenCache() {
    -        return this.#children;
    -    }
    -    /**
    -     * Resolve one or more path strings to a resolved string
    -     *
    -     * Same interface as require('path').resolve.
    -     *
    -     * Much faster than path.resolve() when called multiple times for the same
    -     * path, because the resolved Path objects are cached.  Much slower
    -     * otherwise.
    -     */
    -    resolve(...paths) {
    -        // first figure out the minimum number of paths we have to test
    -        // we always start at cwd, but any absolutes will bump the start
    -        let r = '';
    -        for (let i = paths.length - 1; i >= 0; i--) {
    -            const p = paths[i];
    -            if (!p || p === '.')
    -                continue;
    -            r = r ? `${p}/${r}` : p;
    -            if (this.isAbsolute(p)) {
    -                break;
    -            }
    -        }
    -        const cached = this.#resolveCache.get(r);
    -        if (cached !== undefined) {
    -            return cached;
    -        }
    -        const result = this.cwd.resolve(r).fullpath();
    -        this.#resolveCache.set(r, result);
    -        return result;
    -    }
    -    /**
    -     * Resolve one or more path strings to a resolved string, returning
    -     * the posix path.  Identical to .resolve() on posix systems, but on
    -     * windows will return a forward-slash separated UNC path.
    -     *
    -     * Same interface as require('path').resolve.
    -     *
    -     * Much faster than path.resolve() when called multiple times for the same
    -     * path, because the resolved Path objects are cached.  Much slower
    -     * otherwise.
    -     */
    -    resolvePosix(...paths) {
    -        // first figure out the minimum number of paths we have to test
    -        // we always start at cwd, but any absolutes will bump the start
    -        let r = '';
    -        for (let i = paths.length - 1; i >= 0; i--) {
    -            const p = paths[i];
    -            if (!p || p === '.')
    -                continue;
    -            r = r ? `${p}/${r}` : p;
    -            if (this.isAbsolute(p)) {
    -                break;
    -            }
    -        }
    -        const cached = this.#resolvePosixCache.get(r);
    -        if (cached !== undefined) {
    -            return cached;
    -        }
    -        const result = this.cwd.resolve(r).fullpathPosix();
    -        this.#resolvePosixCache.set(r, result);
    -        return result;
    -    }
    -    /**
    -     * find the relative path from the cwd to the supplied path string or entry
    -     */
    -    relative(entry = this.cwd) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        return entry.relative();
    -    }
    -    /**
    -     * find the relative path from the cwd to the supplied path string or
    -     * entry, using / as the path delimiter, even on Windows.
    -     */
    -    relativePosix(entry = this.cwd) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        return entry.relativePosix();
    -    }
    -    /**
    -     * Return the basename for the provided string or Path object
    -     */
    -    basename(entry = this.cwd) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        return entry.name;
    -    }
    -    /**
    -     * Return the dirname for the provided string or Path object
    -     */
    -    dirname(entry = this.cwd) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        return (entry.parent || entry).fullpath();
    -    }
    -    async readdir(entry = this.cwd, opts = {
    -        withFileTypes: true,
    -    }) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        else if (!(entry instanceof PathBase)) {
    -            opts = entry;
    -            entry = this.cwd;
    -        }
    -        const { withFileTypes } = opts;
    -        if (!entry.canReaddir()) {
    -            return [];
    -        }
    -        else {
    -            const p = await entry.readdir();
    -            return withFileTypes ? p : p.map(e => e.name);
    -        }
    -    }
    -    readdirSync(entry = this.cwd, opts = {
    -        withFileTypes: true,
    -    }) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        else if (!(entry instanceof PathBase)) {
    -            opts = entry;
    -            entry = this.cwd;
    -        }
    -        const { withFileTypes = true } = opts;
    -        if (!entry.canReaddir()) {
    -            return [];
    -        }
    -        else if (withFileTypes) {
    -            return entry.readdirSync();
    -        }
    -        else {
    -            return entry.readdirSync().map(e => e.name);
    -        }
    -    }
    -    /**
    -     * Call lstat() on the string or Path object, and update all known
    -     * information that can be determined.
    -     *
    -     * Note that unlike `fs.lstat()`, the returned value does not contain some
    -     * information, such as `mode`, `dev`, `nlink`, and `ino`.  If that
    -     * information is required, you will need to call `fs.lstat` yourself.
    -     *
    -     * If the Path refers to a nonexistent file, or if the lstat call fails for
    -     * any reason, `undefined` is returned.  Otherwise the updated Path object is
    -     * returned.
    -     *
    -     * Results are cached, and thus may be out of date if the filesystem is
    -     * mutated.
    -     */
    -    async lstat(entry = this.cwd) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        return entry.lstat();
    -    }
    -    /**
    -     * synchronous {@link PathScurryBase.lstat}
    -     */
    -    lstatSync(entry = this.cwd) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        return entry.lstatSync();
    -    }
    -    async readlink(entry = this.cwd, { withFileTypes } = {
    -        withFileTypes: false,
    -    }) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        else if (!(entry instanceof PathBase)) {
    -            withFileTypes = entry.withFileTypes;
    -            entry = this.cwd;
    -        }
    -        const e = await entry.readlink();
    -        return withFileTypes ? e : e?.fullpath();
    -    }
    -    readlinkSync(entry = this.cwd, { withFileTypes } = {
    -        withFileTypes: false,
    -    }) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        else if (!(entry instanceof PathBase)) {
    -            withFileTypes = entry.withFileTypes;
    -            entry = this.cwd;
    -        }
    -        const e = entry.readlinkSync();
    -        return withFileTypes ? e : e?.fullpath();
    -    }
    -    async realpath(entry = this.cwd, { withFileTypes } = {
    -        withFileTypes: false,
    -    }) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        else if (!(entry instanceof PathBase)) {
    -            withFileTypes = entry.withFileTypes;
    -            entry = this.cwd;
    -        }
    -        const e = await entry.realpath();
    -        return withFileTypes ? e : e?.fullpath();
    -    }
    -    realpathSync(entry = this.cwd, { withFileTypes } = {
    -        withFileTypes: false,
    -    }) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        else if (!(entry instanceof PathBase)) {
    -            withFileTypes = entry.withFileTypes;
    -            entry = this.cwd;
    -        }
    -        const e = entry.realpathSync();
    -        return withFileTypes ? e : e?.fullpath();
    -    }
    -    async walk(entry = this.cwd, opts = {}) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        else if (!(entry instanceof PathBase)) {
    -            opts = entry;
    -            entry = this.cwd;
    -        }
    -        const { withFileTypes = true, follow = false, filter, walkFilter, } = opts;
    -        const results = [];
    -        if (!filter || filter(entry)) {
    -            results.push(withFileTypes ? entry : entry.fullpath());
    -        }
    -        const dirs = new Set();
    -        const walk = (dir, cb) => {
    -            dirs.add(dir);
    -            dir.readdirCB((er, entries) => {
    -                /* c8 ignore start */
    -                if (er) {
    -                    return cb(er);
    -                }
    -                /* c8 ignore stop */
    -                let len = entries.length;
    -                if (!len)
    -                    return cb();
    -                const next = () => {
    -                    if (--len === 0) {
    -                        cb();
    -                    }
    -                };
    -                for (const e of entries) {
    -                    if (!filter || filter(e)) {
    -                        results.push(withFileTypes ? e : e.fullpath());
    -                    }
    -                    if (follow && e.isSymbolicLink()) {
    -                        e.realpath()
    -                            .then(r => (r?.isUnknown() ? r.lstat() : r))
    -                            .then(r => r?.shouldWalk(dirs, walkFilter) ? walk(r, next) : next());
    -                    }
    -                    else {
    -                        if (e.shouldWalk(dirs, walkFilter)) {
    -                            walk(e, next);
    -                        }
    -                        else {
    -                            next();
    -                        }
    -                    }
    -                }
    -            }, true); // zalgooooooo
    -        };
    -        const start = entry;
    -        return new Promise((res, rej) => {
    -            walk(start, er => {
    -                /* c8 ignore start */
    -                if (er)
    -                    return rej(er);
    -                /* c8 ignore stop */
    -                res(results);
    -            });
    -        });
    -    }
    -    walkSync(entry = this.cwd, opts = {}) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        else if (!(entry instanceof PathBase)) {
    -            opts = entry;
    -            entry = this.cwd;
    -        }
    -        const { withFileTypes = true, follow = false, filter, walkFilter, } = opts;
    -        const results = [];
    -        if (!filter || filter(entry)) {
    -            results.push(withFileTypes ? entry : entry.fullpath());
    -        }
    -        const dirs = new Set([entry]);
    -        for (const dir of dirs) {
    -            const entries = dir.readdirSync();
    -            for (const e of entries) {
    -                if (!filter || filter(e)) {
    -                    results.push(withFileTypes ? e : e.fullpath());
    -                }
    -                let r = e;
    -                if (e.isSymbolicLink()) {
    -                    if (!(follow && (r = e.realpathSync())))
    -                        continue;
    -                    if (r.isUnknown())
    -                        r.lstatSync();
    -                }
    -                if (r.shouldWalk(dirs, walkFilter)) {
    -                    dirs.add(r);
    -                }
    -            }
    -        }
    -        return results;
    -    }
    -    /**
    -     * Support for `for await`
    -     *
    -     * Alias for {@link PathScurryBase.iterate}
    -     *
    -     * Note: As of Node 19, this is very slow, compared to other methods of
    -     * walking.  Consider using {@link PathScurryBase.stream} if memory overhead
    -     * and backpressure are concerns, or {@link PathScurryBase.walk} if not.
    -     */
    -    [Symbol.asyncIterator]() {
    -        return this.iterate();
    -    }
    -    iterate(entry = this.cwd, options = {}) {
    -        // iterating async over the stream is significantly more performant,
    -        // especially in the warm-cache scenario, because it buffers up directory
    -        // entries in the background instead of waiting for a yield for each one.
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        else if (!(entry instanceof PathBase)) {
    -            options = entry;
    -            entry = this.cwd;
    -        }
    -        return this.stream(entry, options)[Symbol.asyncIterator]();
    -    }
    -    /**
    -     * Iterating over a PathScurry performs a synchronous walk.
    -     *
    -     * Alias for {@link PathScurryBase.iterateSync}
    -     */
    -    [Symbol.iterator]() {
    -        return this.iterateSync();
    -    }
    -    *iterateSync(entry = this.cwd, opts = {}) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        else if (!(entry instanceof PathBase)) {
    -            opts = entry;
    -            entry = this.cwd;
    -        }
    -        const { withFileTypes = true, follow = false, filter, walkFilter, } = opts;
    -        if (!filter || filter(entry)) {
    -            yield withFileTypes ? entry : entry.fullpath();
    -        }
    -        const dirs = new Set([entry]);
    -        for (const dir of dirs) {
    -            const entries = dir.readdirSync();
    -            for (const e of entries) {
    -                if (!filter || filter(e)) {
    -                    yield withFileTypes ? e : e.fullpath();
    -                }
    -                let r = e;
    -                if (e.isSymbolicLink()) {
    -                    if (!(follow && (r = e.realpathSync())))
    -                        continue;
    -                    if (r.isUnknown())
    -                        r.lstatSync();
    -                }
    -                if (r.shouldWalk(dirs, walkFilter)) {
    -                    dirs.add(r);
    -                }
    -            }
    -        }
    -    }
    -    stream(entry = this.cwd, opts = {}) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        else if (!(entry instanceof PathBase)) {
    -            opts = entry;
    -            entry = this.cwd;
    -        }
    -        const { withFileTypes = true, follow = false, filter, walkFilter, } = opts;
    -        const results = new minipass_1.Minipass({ objectMode: true });
    -        if (!filter || filter(entry)) {
    -            results.write(withFileTypes ? entry : entry.fullpath());
    -        }
    -        const dirs = new Set();
    -        const queue = [entry];
    -        let processing = 0;
    -        const process = () => {
    -            let paused = false;
    -            while (!paused) {
    -                const dir = queue.shift();
    -                if (!dir) {
    -                    if (processing === 0)
    -                        results.end();
    -                    return;
    -                }
    -                processing++;
    -                dirs.add(dir);
    -                const onReaddir = (er, entries, didRealpaths = false) => {
    -                    /* c8 ignore start */
    -                    if (er)
    -                        return results.emit('error', er);
    -                    /* c8 ignore stop */
    -                    if (follow && !didRealpaths) {
    -                        const promises = [];
    -                        for (const e of entries) {
    -                            if (e.isSymbolicLink()) {
    -                                promises.push(e
    -                                    .realpath()
    -                                    .then((r) => r?.isUnknown() ? r.lstat() : r));
    -                            }
    -                        }
    -                        if (promises.length) {
    -                            Promise.all(promises).then(() => onReaddir(null, entries, true));
    -                            return;
    -                        }
    -                    }
    -                    for (const e of entries) {
    -                        if (e && (!filter || filter(e))) {
    -                            if (!results.write(withFileTypes ? e : e.fullpath())) {
    -                                paused = true;
    -                            }
    -                        }
    -                    }
    -                    processing--;
    -                    for (const e of entries) {
    -                        const r = e.realpathCached() || e;
    -                        if (r.shouldWalk(dirs, walkFilter)) {
    -                            queue.push(r);
    -                        }
    -                    }
    -                    if (paused && !results.flowing) {
    -                        results.once('drain', process);
    -                    }
    -                    else if (!sync) {
    -                        process();
    -                    }
    -                };
    -                // zalgo containment
    -                let sync = true;
    -                dir.readdirCB(onReaddir, true);
    -                sync = false;
    -            }
    -        };
    -        process();
    -        return results;
    -    }
    -    streamSync(entry = this.cwd, opts = {}) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        else if (!(entry instanceof PathBase)) {
    -            opts = entry;
    -            entry = this.cwd;
    -        }
    -        const { withFileTypes = true, follow = false, filter, walkFilter, } = opts;
    -        const results = new minipass_1.Minipass({ objectMode: true });
    -        const dirs = new Set();
    -        if (!filter || filter(entry)) {
    -            results.write(withFileTypes ? entry : entry.fullpath());
    -        }
    -        const queue = [entry];
    -        let processing = 0;
    -        const process = () => {
    -            let paused = false;
    -            while (!paused) {
    -                const dir = queue.shift();
    -                if (!dir) {
    -                    if (processing === 0)
    -                        results.end();
    -                    return;
    -                }
    -                processing++;
    -                dirs.add(dir);
    -                const entries = dir.readdirSync();
    -                for (const e of entries) {
    -                    if (!filter || filter(e)) {
    -                        if (!results.write(withFileTypes ? e : e.fullpath())) {
    -                            paused = true;
    -                        }
    -                    }
    -                }
    -                processing--;
    -                for (const e of entries) {
    -                    let r = e;
    -                    if (e.isSymbolicLink()) {
    -                        if (!(follow && (r = e.realpathSync())))
    -                            continue;
    -                        if (r.isUnknown())
    -                            r.lstatSync();
    -                    }
    -                    if (r.shouldWalk(dirs, walkFilter)) {
    -                        queue.push(r);
    -                    }
    -                }
    -            }
    -            if (paused && !results.flowing)
    -                results.once('drain', process);
    -        };
    -        process();
    -        return results;
    -    }
    -    chdir(path = this.cwd) {
    -        const oldCwd = this.cwd;
    -        this.cwd = typeof path === 'string' ? this.cwd.resolve(path) : path;
    -        this.cwd[setAsCwd](oldCwd);
    -    }
    -}
    -exports.PathScurryBase = PathScurryBase;
    -/**
    - * Windows implementation of {@link PathScurryBase}
    - *
    - * Defaults to case insensitve, uses `'\\'` to generate path strings.  Uses
    - * {@link PathWin32} for Path objects.
    - */
    -class PathScurryWin32 extends PathScurryBase {
    -    /**
    -     * separator for generating path strings
    -     */
    -    sep = '\\';
    -    constructor(cwd = process.cwd(), opts = {}) {
    -        const { nocase = true } = opts;
    -        super(cwd, node_path_1.win32, '\\', { ...opts, nocase });
    -        this.nocase = nocase;
    -        for (let p = this.cwd; p; p = p.parent) {
    -            p.nocase = this.nocase;
    -        }
    -    }
    -    /**
    -     * @internal
    -     */
    -    parseRootPath(dir) {
    -        // if the path starts with a single separator, it's not a UNC, and we'll
    -        // just get separator as the root, and driveFromUNC will return \
    -        // In that case, mount \ on the root from the cwd.
    -        return node_path_1.win32.parse(dir).root.toUpperCase();
    -    }
    -    /**
    -     * @internal
    -     */
    -    newRoot(fs) {
    -        return new PathWin32(this.rootPath, IFDIR, undefined, this.roots, this.nocase, this.childrenCache(), { fs });
    -    }
    -    /**
    -     * Return true if the provided path string is an absolute path
    -     */
    -    isAbsolute(p) {
    -        return (p.startsWith('/') || p.startsWith('\\') || /^[a-z]:(\/|\\)/i.test(p));
    -    }
    -}
    -exports.PathScurryWin32 = PathScurryWin32;
    -/**
    - * {@link PathScurryBase} implementation for all posix systems other than Darwin.
    - *
    - * Defaults to case-sensitive matching, uses `'/'` to generate path strings.
    - *
    - * Uses {@link PathPosix} for Path objects.
    - */
    -class PathScurryPosix extends PathScurryBase {
    -    /**
    -     * separator for generating path strings
    -     */
    -    sep = '/';
    -    constructor(cwd = process.cwd(), opts = {}) {
    -        const { nocase = false } = opts;
    -        super(cwd, node_path_1.posix, '/', { ...opts, nocase });
    -        this.nocase = nocase;
    -    }
    -    /**
    -     * @internal
    -     */
    -    parseRootPath(_dir) {
    -        return '/';
    -    }
    -    /**
    -     * @internal
    -     */
    -    newRoot(fs) {
    -        return new PathPosix(this.rootPath, IFDIR, undefined, this.roots, this.nocase, this.childrenCache(), { fs });
    -    }
    -    /**
    -     * Return true if the provided path string is an absolute path
    -     */
    -    isAbsolute(p) {
    -        return p.startsWith('/');
    -    }
    -}
    -exports.PathScurryPosix = PathScurryPosix;
    -/**
    - * {@link PathScurryBase} implementation for Darwin (macOS) systems.
    - *
    - * Defaults to case-insensitive matching, uses `'/'` for generating path
    - * strings.
    - *
    - * Uses {@link PathPosix} for Path objects.
    - */
    -class PathScurryDarwin extends PathScurryPosix {
    -    constructor(cwd = process.cwd(), opts = {}) {
    -        const { nocase = true } = opts;
    -        super(cwd, { ...opts, nocase });
    -    }
    -}
    -exports.PathScurryDarwin = PathScurryDarwin;
    -/**
    - * Default {@link PathBase} implementation for the current platform.
    - *
    - * {@link PathWin32} on Windows systems, {@link PathPosix} on all others.
    - */
    -exports.Path = process.platform === 'win32' ? PathWin32 : PathPosix;
    -/**
    - * Default {@link PathScurryBase} implementation for the current platform.
    - *
    - * {@link PathScurryWin32} on Windows systems, {@link PathScurryDarwin} on
    - * Darwin (macOS) systems, {@link PathScurryPosix} on all others.
    - */
    -exports.PathScurry = process.platform === 'win32' ? PathScurryWin32
    -    : process.platform === 'darwin' ? PathScurryDarwin
    -        : PathScurryPosix;
    -//# sourceMappingURL=index.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/path-scurry/dist/commonjs/package.json b/deps/npm/node_modules/node-gyp/node_modules/path-scurry/dist/commonjs/package.json
    deleted file mode 100644
    index 5bbefffbabee39..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/path-scurry/dist/commonjs/package.json
    +++ /dev/null
    @@ -1,3 +0,0 @@
    -{
    -  "type": "commonjs"
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/path-scurry/dist/esm/index.js b/deps/npm/node_modules/node-gyp/node_modules/path-scurry/dist/esm/index.js
    deleted file mode 100644
    index 3b11b819faece5..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/path-scurry/dist/esm/index.js
    +++ /dev/null
    @@ -1,1979 +0,0 @@
    -import { LRUCache } from 'lru-cache';
    -import { posix, win32 } from 'node:path';
    -import { fileURLToPath } from 'node:url';
    -import { lstatSync, readdir as readdirCB, readdirSync, readlinkSync, realpathSync as rps, } from 'fs';
    -import * as actualFS from 'node:fs';
    -const realpathSync = rps.native;
    -// TODO: test perf of fs/promises realpath vs realpathCB,
    -// since the promises one uses realpath.native
    -import { lstat, readdir, readlink, realpath } from 'node:fs/promises';
    -import { Minipass } from 'minipass';
    -const defaultFS = {
    -    lstatSync,
    -    readdir: readdirCB,
    -    readdirSync,
    -    readlinkSync,
    -    realpathSync,
    -    promises: {
    -        lstat,
    -        readdir,
    -        readlink,
    -        realpath,
    -    },
    -};
    -// if they just gave us require('fs') then use our default
    -const fsFromOption = (fsOption) => !fsOption || fsOption === defaultFS || fsOption === actualFS ?
    -    defaultFS
    -    : {
    -        ...defaultFS,
    -        ...fsOption,
    -        promises: {
    -            ...defaultFS.promises,
    -            ...(fsOption.promises || {}),
    -        },
    -    };
    -// turn something like //?/c:/ into c:\
    -const uncDriveRegexp = /^\\\\\?\\([a-z]:)\\?$/i;
    -const uncToDrive = (rootPath) => rootPath.replace(/\//g, '\\').replace(uncDriveRegexp, '$1\\');
    -// windows paths are separated by either / or \
    -const eitherSep = /[\\\/]/;
    -const UNKNOWN = 0; // may not even exist, for all we know
    -const IFIFO = 0b0001;
    -const IFCHR = 0b0010;
    -const IFDIR = 0b0100;
    -const IFBLK = 0b0110;
    -const IFREG = 0b1000;
    -const IFLNK = 0b1010;
    -const IFSOCK = 0b1100;
    -const IFMT = 0b1111;
    -// mask to unset low 4 bits
    -const IFMT_UNKNOWN = ~IFMT;
    -// set after successfully calling readdir() and getting entries.
    -const READDIR_CALLED = 0b0000_0001_0000;
    -// set after a successful lstat()
    -const LSTAT_CALLED = 0b0000_0010_0000;
    -// set if an entry (or one of its parents) is definitely not a dir
    -const ENOTDIR = 0b0000_0100_0000;
    -// set if an entry (or one of its parents) does not exist
    -// (can also be set on lstat errors like EACCES or ENAMETOOLONG)
    -const ENOENT = 0b0000_1000_0000;
    -// cannot have child entries -- also verify &IFMT is either IFDIR or IFLNK
    -// set if we fail to readlink
    -const ENOREADLINK = 0b0001_0000_0000;
    -// set if we know realpath() will fail
    -const ENOREALPATH = 0b0010_0000_0000;
    -const ENOCHILD = ENOTDIR | ENOENT | ENOREALPATH;
    -const TYPEMASK = 0b0011_1111_1111;
    -const entToType = (s) => s.isFile() ? IFREG
    -    : s.isDirectory() ? IFDIR
    -        : s.isSymbolicLink() ? IFLNK
    -            : s.isCharacterDevice() ? IFCHR
    -                : s.isBlockDevice() ? IFBLK
    -                    : s.isSocket() ? IFSOCK
    -                        : s.isFIFO() ? IFIFO
    -                            : UNKNOWN;
    -// normalize unicode path names
    -const normalizeCache = new Map();
    -const normalize = (s) => {
    -    const c = normalizeCache.get(s);
    -    if (c)
    -        return c;
    -    const n = s.normalize('NFKD');
    -    normalizeCache.set(s, n);
    -    return n;
    -};
    -const normalizeNocaseCache = new Map();
    -const normalizeNocase = (s) => {
    -    const c = normalizeNocaseCache.get(s);
    -    if (c)
    -        return c;
    -    const n = normalize(s.toLowerCase());
    -    normalizeNocaseCache.set(s, n);
    -    return n;
    -};
    -/**
    - * An LRUCache for storing resolved path strings or Path objects.
    - * @internal
    - */
    -export class ResolveCache extends LRUCache {
    -    constructor() {
    -        super({ max: 256 });
    -    }
    -}
    -// In order to prevent blowing out the js heap by allocating hundreds of
    -// thousands of Path entries when walking extremely large trees, the "children"
    -// in this tree are represented by storing an array of Path entries in an
    -// LRUCache, indexed by the parent.  At any time, Path.children() may return an
    -// empty array, indicating that it doesn't know about any of its children, and
    -// thus has to rebuild that cache.  This is fine, it just means that we don't
    -// benefit as much from having the cached entries, but huge directory walks
    -// don't blow out the stack, and smaller ones are still as fast as possible.
    -//
    -//It does impose some complexity when building up the readdir data, because we
    -//need to pass a reference to the children array that we started with.
    -/**
    - * an LRUCache for storing child entries.
    - * @internal
    - */
    -export class ChildrenCache extends LRUCache {
    -    constructor(maxSize = 16 * 1024) {
    -        super({
    -            maxSize,
    -            // parent + children
    -            sizeCalculation: a => a.length + 1,
    -        });
    -    }
    -}
    -const setAsCwd = Symbol('PathScurry setAsCwd');
    -/**
    - * Path objects are sort of like a super-powered
    - * {@link https://nodejs.org/docs/latest/api/fs.html#class-fsdirent fs.Dirent}
    - *
    - * Each one represents a single filesystem entry on disk, which may or may not
    - * exist. It includes methods for reading various types of information via
    - * lstat, readlink, and readdir, and caches all information to the greatest
    - * degree possible.
    - *
    - * Note that fs operations that would normally throw will instead return an
    - * "empty" value. This is in order to prevent excessive overhead from error
    - * stack traces.
    - */
    -export class PathBase {
    -    /**
    -     * the basename of this path
    -     *
    -     * **Important**: *always* test the path name against any test string
    -     * usingthe {@link isNamed} method, and not by directly comparing this
    -     * string. Otherwise, unicode path strings that the system sees as identical
    -     * will not be properly treated as the same path, leading to incorrect
    -     * behavior and possible security issues.
    -     */
    -    name;
    -    /**
    -     * the Path entry corresponding to the path root.
    -     *
    -     * @internal
    -     */
    -    root;
    -    /**
    -     * All roots found within the current PathScurry family
    -     *
    -     * @internal
    -     */
    -    roots;
    -    /**
    -     * a reference to the parent path, or undefined in the case of root entries
    -     *
    -     * @internal
    -     */
    -    parent;
    -    /**
    -     * boolean indicating whether paths are compared case-insensitively
    -     * @internal
    -     */
    -    nocase;
    -    /**
    -     * boolean indicating that this path is the current working directory
    -     * of the PathScurry collection that contains it.
    -     */
    -    isCWD = false;
    -    // potential default fs override
    -    #fs;
    -    // Stats fields
    -    #dev;
    -    get dev() {
    -        return this.#dev;
    -    }
    -    #mode;
    -    get mode() {
    -        return this.#mode;
    -    }
    -    #nlink;
    -    get nlink() {
    -        return this.#nlink;
    -    }
    -    #uid;
    -    get uid() {
    -        return this.#uid;
    -    }
    -    #gid;
    -    get gid() {
    -        return this.#gid;
    -    }
    -    #rdev;
    -    get rdev() {
    -        return this.#rdev;
    -    }
    -    #blksize;
    -    get blksize() {
    -        return this.#blksize;
    -    }
    -    #ino;
    -    get ino() {
    -        return this.#ino;
    -    }
    -    #size;
    -    get size() {
    -        return this.#size;
    -    }
    -    #blocks;
    -    get blocks() {
    -        return this.#blocks;
    -    }
    -    #atimeMs;
    -    get atimeMs() {
    -        return this.#atimeMs;
    -    }
    -    #mtimeMs;
    -    get mtimeMs() {
    -        return this.#mtimeMs;
    -    }
    -    #ctimeMs;
    -    get ctimeMs() {
    -        return this.#ctimeMs;
    -    }
    -    #birthtimeMs;
    -    get birthtimeMs() {
    -        return this.#birthtimeMs;
    -    }
    -    #atime;
    -    get atime() {
    -        return this.#atime;
    -    }
    -    #mtime;
    -    get mtime() {
    -        return this.#mtime;
    -    }
    -    #ctime;
    -    get ctime() {
    -        return this.#ctime;
    -    }
    -    #birthtime;
    -    get birthtime() {
    -        return this.#birthtime;
    -    }
    -    #matchName;
    -    #depth;
    -    #fullpath;
    -    #fullpathPosix;
    -    #relative;
    -    #relativePosix;
    -    #type;
    -    #children;
    -    #linkTarget;
    -    #realpath;
    -    /**
    -     * This property is for compatibility with the Dirent class as of
    -     * Node v20, where Dirent['parentPath'] refers to the path of the
    -     * directory that was passed to readdir. For root entries, it's the path
    -     * to the entry itself.
    -     */
    -    get parentPath() {
    -        return (this.parent || this).fullpath();
    -    }
    -    /**
    -     * Deprecated alias for Dirent['parentPath'] Somewhat counterintuitively,
    -     * this property refers to the *parent* path, not the path object itself.
    -     */
    -    get path() {
    -        return this.parentPath;
    -    }
    -    /**
    -     * Do not create new Path objects directly.  They should always be accessed
    -     * via the PathScurry class or other methods on the Path class.
    -     *
    -     * @internal
    -     */
    -    constructor(name, type = UNKNOWN, root, roots, nocase, children, opts) {
    -        this.name = name;
    -        this.#matchName = nocase ? normalizeNocase(name) : normalize(name);
    -        this.#type = type & TYPEMASK;
    -        this.nocase = nocase;
    -        this.roots = roots;
    -        this.root = root || this;
    -        this.#children = children;
    -        this.#fullpath = opts.fullpath;
    -        this.#relative = opts.relative;
    -        this.#relativePosix = opts.relativePosix;
    -        this.parent = opts.parent;
    -        if (this.parent) {
    -            this.#fs = this.parent.#fs;
    -        }
    -        else {
    -            this.#fs = fsFromOption(opts.fs);
    -        }
    -    }
    -    /**
    -     * Returns the depth of the Path object from its root.
    -     *
    -     * For example, a path at `/foo/bar` would have a depth of 2.
    -     */
    -    depth() {
    -        if (this.#depth !== undefined)
    -            return this.#depth;
    -        if (!this.parent)
    -            return (this.#depth = 0);
    -        return (this.#depth = this.parent.depth() + 1);
    -    }
    -    /**
    -     * @internal
    -     */
    -    childrenCache() {
    -        return this.#children;
    -    }
    -    /**
    -     * Get the Path object referenced by the string path, resolved from this Path
    -     */
    -    resolve(path) {
    -        if (!path) {
    -            return this;
    -        }
    -        const rootPath = this.getRootString(path);
    -        const dir = path.substring(rootPath.length);
    -        const dirParts = dir.split(this.splitSep);
    -        const result = rootPath ?
    -            this.getRoot(rootPath).#resolveParts(dirParts)
    -            : this.#resolveParts(dirParts);
    -        return result;
    -    }
    -    #resolveParts(dirParts) {
    -        let p = this;
    -        for (const part of dirParts) {
    -            p = p.child(part);
    -        }
    -        return p;
    -    }
    -    /**
    -     * Returns the cached children Path objects, if still available.  If they
    -     * have fallen out of the cache, then returns an empty array, and resets the
    -     * READDIR_CALLED bit, so that future calls to readdir() will require an fs
    -     * lookup.
    -     *
    -     * @internal
    -     */
    -    children() {
    -        const cached = this.#children.get(this);
    -        if (cached) {
    -            return cached;
    -        }
    -        const children = Object.assign([], { provisional: 0 });
    -        this.#children.set(this, children);
    -        this.#type &= ~READDIR_CALLED;
    -        return children;
    -    }
    -    /**
    -     * Resolves a path portion and returns or creates the child Path.
    -     *
    -     * Returns `this` if pathPart is `''` or `'.'`, or `parent` if pathPart is
    -     * `'..'`.
    -     *
    -     * This should not be called directly.  If `pathPart` contains any path
    -     * separators, it will lead to unsafe undefined behavior.
    -     *
    -     * Use `Path.resolve()` instead.
    -     *
    -     * @internal
    -     */
    -    child(pathPart, opts) {
    -        if (pathPart === '' || pathPart === '.') {
    -            return this;
    -        }
    -        if (pathPart === '..') {
    -            return this.parent || this;
    -        }
    -        // find the child
    -        const children = this.children();
    -        const name = this.nocase ? normalizeNocase(pathPart) : normalize(pathPart);
    -        for (const p of children) {
    -            if (p.#matchName === name) {
    -                return p;
    -            }
    -        }
    -        // didn't find it, create provisional child, since it might not
    -        // actually exist.  If we know the parent isn't a dir, then
    -        // in fact it CAN'T exist.
    -        const s = this.parent ? this.sep : '';
    -        const fullpath = this.#fullpath ? this.#fullpath + s + pathPart : undefined;
    -        const pchild = this.newChild(pathPart, UNKNOWN, {
    -            ...opts,
    -            parent: this,
    -            fullpath,
    -        });
    -        if (!this.canReaddir()) {
    -            pchild.#type |= ENOENT;
    -        }
    -        // don't have to update provisional, because if we have real children,
    -        // then provisional is set to children.length, otherwise a lower number
    -        children.push(pchild);
    -        return pchild;
    -    }
    -    /**
    -     * The relative path from the cwd. If it does not share an ancestor with
    -     * the cwd, then this ends up being equivalent to the fullpath()
    -     */
    -    relative() {
    -        if (this.isCWD)
    -            return '';
    -        if (this.#relative !== undefined) {
    -            return this.#relative;
    -        }
    -        const name = this.name;
    -        const p = this.parent;
    -        if (!p) {
    -            return (this.#relative = this.name);
    -        }
    -        const pv = p.relative();
    -        return pv + (!pv || !p.parent ? '' : this.sep) + name;
    -    }
    -    /**
    -     * The relative path from the cwd, using / as the path separator.
    -     * If it does not share an ancestor with
    -     * the cwd, then this ends up being equivalent to the fullpathPosix()
    -     * On posix systems, this is identical to relative().
    -     */
    -    relativePosix() {
    -        if (this.sep === '/')
    -            return this.relative();
    -        if (this.isCWD)
    -            return '';
    -        if (this.#relativePosix !== undefined)
    -            return this.#relativePosix;
    -        const name = this.name;
    -        const p = this.parent;
    -        if (!p) {
    -            return (this.#relativePosix = this.fullpathPosix());
    -        }
    -        const pv = p.relativePosix();
    -        return pv + (!pv || !p.parent ? '' : '/') + name;
    -    }
    -    /**
    -     * The fully resolved path string for this Path entry
    -     */
    -    fullpath() {
    -        if (this.#fullpath !== undefined) {
    -            return this.#fullpath;
    -        }
    -        const name = this.name;
    -        const p = this.parent;
    -        if (!p) {
    -            return (this.#fullpath = this.name);
    -        }
    -        const pv = p.fullpath();
    -        const fp = pv + (!p.parent ? '' : this.sep) + name;
    -        return (this.#fullpath = fp);
    -    }
    -    /**
    -     * On platforms other than windows, this is identical to fullpath.
    -     *
    -     * On windows, this is overridden to return the forward-slash form of the
    -     * full UNC path.
    -     */
    -    fullpathPosix() {
    -        if (this.#fullpathPosix !== undefined)
    -            return this.#fullpathPosix;
    -        if (this.sep === '/')
    -            return (this.#fullpathPosix = this.fullpath());
    -        if (!this.parent) {
    -            const p = this.fullpath().replace(/\\/g, '/');
    -            if (/^[a-z]:\//i.test(p)) {
    -                return (this.#fullpathPosix = `//?/${p}`);
    -            }
    -            else {
    -                return (this.#fullpathPosix = p);
    -            }
    -        }
    -        const p = this.parent;
    -        const pfpp = p.fullpathPosix();
    -        const fpp = pfpp + (!pfpp || !p.parent ? '' : '/') + this.name;
    -        return (this.#fullpathPosix = fpp);
    -    }
    -    /**
    -     * Is the Path of an unknown type?
    -     *
    -     * Note that we might know *something* about it if there has been a previous
    -     * filesystem operation, for example that it does not exist, or is not a
    -     * link, or whether it has child entries.
    -     */
    -    isUnknown() {
    -        return (this.#type & IFMT) === UNKNOWN;
    -    }
    -    isType(type) {
    -        return this[`is${type}`]();
    -    }
    -    getType() {
    -        return (this.isUnknown() ? 'Unknown'
    -            : this.isDirectory() ? 'Directory'
    -                : this.isFile() ? 'File'
    -                    : this.isSymbolicLink() ? 'SymbolicLink'
    -                        : this.isFIFO() ? 'FIFO'
    -                            : this.isCharacterDevice() ? 'CharacterDevice'
    -                                : this.isBlockDevice() ? 'BlockDevice'
    -                                    : /* c8 ignore start */ this.isSocket() ? 'Socket'
    -                                        : 'Unknown');
    -        /* c8 ignore stop */
    -    }
    -    /**
    -     * Is the Path a regular file?
    -     */
    -    isFile() {
    -        return (this.#type & IFMT) === IFREG;
    -    }
    -    /**
    -     * Is the Path a directory?
    -     */
    -    isDirectory() {
    -        return (this.#type & IFMT) === IFDIR;
    -    }
    -    /**
    -     * Is the path a character device?
    -     */
    -    isCharacterDevice() {
    -        return (this.#type & IFMT) === IFCHR;
    -    }
    -    /**
    -     * Is the path a block device?
    -     */
    -    isBlockDevice() {
    -        return (this.#type & IFMT) === IFBLK;
    -    }
    -    /**
    -     * Is the path a FIFO pipe?
    -     */
    -    isFIFO() {
    -        return (this.#type & IFMT) === IFIFO;
    -    }
    -    /**
    -     * Is the path a socket?
    -     */
    -    isSocket() {
    -        return (this.#type & IFMT) === IFSOCK;
    -    }
    -    /**
    -     * Is the path a symbolic link?
    -     */
    -    isSymbolicLink() {
    -        return (this.#type & IFLNK) === IFLNK;
    -    }
    -    /**
    -     * Return the entry if it has been subject of a successful lstat, or
    -     * undefined otherwise.
    -     *
    -     * Does not read the filesystem, so an undefined result *could* simply
    -     * mean that we haven't called lstat on it.
    -     */
    -    lstatCached() {
    -        return this.#type & LSTAT_CALLED ? this : undefined;
    -    }
    -    /**
    -     * Return the cached link target if the entry has been the subject of a
    -     * successful readlink, or undefined otherwise.
    -     *
    -     * Does not read the filesystem, so an undefined result *could* just mean we
    -     * don't have any cached data. Only use it if you are very sure that a
    -     * readlink() has been called at some point.
    -     */
    -    readlinkCached() {
    -        return this.#linkTarget;
    -    }
    -    /**
    -     * Returns the cached realpath target if the entry has been the subject
    -     * of a successful realpath, or undefined otherwise.
    -     *
    -     * Does not read the filesystem, so an undefined result *could* just mean we
    -     * don't have any cached data. Only use it if you are very sure that a
    -     * realpath() has been called at some point.
    -     */
    -    realpathCached() {
    -        return this.#realpath;
    -    }
    -    /**
    -     * Returns the cached child Path entries array if the entry has been the
    -     * subject of a successful readdir(), or [] otherwise.
    -     *
    -     * Does not read the filesystem, so an empty array *could* just mean we
    -     * don't have any cached data. Only use it if you are very sure that a
    -     * readdir() has been called recently enough to still be valid.
    -     */
    -    readdirCached() {
    -        const children = this.children();
    -        return children.slice(0, children.provisional);
    -    }
    -    /**
    -     * Return true if it's worth trying to readlink.  Ie, we don't (yet) have
    -     * any indication that readlink will definitely fail.
    -     *
    -     * Returns false if the path is known to not be a symlink, if a previous
    -     * readlink failed, or if the entry does not exist.
    -     */
    -    canReadlink() {
    -        if (this.#linkTarget)
    -            return true;
    -        if (!this.parent)
    -            return false;
    -        // cases where it cannot possibly succeed
    -        const ifmt = this.#type & IFMT;
    -        return !((ifmt !== UNKNOWN && ifmt !== IFLNK) ||
    -            this.#type & ENOREADLINK ||
    -            this.#type & ENOENT);
    -    }
    -    /**
    -     * Return true if readdir has previously been successfully called on this
    -     * path, indicating that cachedReaddir() is likely valid.
    -     */
    -    calledReaddir() {
    -        return !!(this.#type & READDIR_CALLED);
    -    }
    -    /**
    -     * Returns true if the path is known to not exist. That is, a previous lstat
    -     * or readdir failed to verify its existence when that would have been
    -     * expected, or a parent entry was marked either enoent or enotdir.
    -     */
    -    isENOENT() {
    -        return !!(this.#type & ENOENT);
    -    }
    -    /**
    -     * Return true if the path is a match for the given path name.  This handles
    -     * case sensitivity and unicode normalization.
    -     *
    -     * Note: even on case-sensitive systems, it is **not** safe to test the
    -     * equality of the `.name` property to determine whether a given pathname
    -     * matches, due to unicode normalization mismatches.
    -     *
    -     * Always use this method instead of testing the `path.name` property
    -     * directly.
    -     */
    -    isNamed(n) {
    -        return !this.nocase ?
    -            this.#matchName === normalize(n)
    -            : this.#matchName === normalizeNocase(n);
    -    }
    -    /**
    -     * Return the Path object corresponding to the target of a symbolic link.
    -     *
    -     * If the Path is not a symbolic link, or if the readlink call fails for any
    -     * reason, `undefined` is returned.
    -     *
    -     * Result is cached, and thus may be outdated if the filesystem is mutated.
    -     */
    -    async readlink() {
    -        const target = this.#linkTarget;
    -        if (target) {
    -            return target;
    -        }
    -        if (!this.canReadlink()) {
    -            return undefined;
    -        }
    -        /* c8 ignore start */
    -        // already covered by the canReadlink test, here for ts grumples
    -        if (!this.parent) {
    -            return undefined;
    -        }
    -        /* c8 ignore stop */
    -        try {
    -            const read = await this.#fs.promises.readlink(this.fullpath());
    -            const linkTarget = (await this.parent.realpath())?.resolve(read);
    -            if (linkTarget) {
    -                return (this.#linkTarget = linkTarget);
    -            }
    -        }
    -        catch (er) {
    -            this.#readlinkFail(er.code);
    -            return undefined;
    -        }
    -    }
    -    /**
    -     * Synchronous {@link PathBase.readlink}
    -     */
    -    readlinkSync() {
    -        const target = this.#linkTarget;
    -        if (target) {
    -            return target;
    -        }
    -        if (!this.canReadlink()) {
    -            return undefined;
    -        }
    -        /* c8 ignore start */
    -        // already covered by the canReadlink test, here for ts grumples
    -        if (!this.parent) {
    -            return undefined;
    -        }
    -        /* c8 ignore stop */
    -        try {
    -            const read = this.#fs.readlinkSync(this.fullpath());
    -            const linkTarget = this.parent.realpathSync()?.resolve(read);
    -            if (linkTarget) {
    -                return (this.#linkTarget = linkTarget);
    -            }
    -        }
    -        catch (er) {
    -            this.#readlinkFail(er.code);
    -            return undefined;
    -        }
    -    }
    -    #readdirSuccess(children) {
    -        // succeeded, mark readdir called bit
    -        this.#type |= READDIR_CALLED;
    -        // mark all remaining provisional children as ENOENT
    -        for (let p = children.provisional; p < children.length; p++) {
    -            const c = children[p];
    -            if (c)
    -                c.#markENOENT();
    -        }
    -    }
    -    #markENOENT() {
    -        // mark as UNKNOWN and ENOENT
    -        if (this.#type & ENOENT)
    -            return;
    -        this.#type = (this.#type | ENOENT) & IFMT_UNKNOWN;
    -        this.#markChildrenENOENT();
    -    }
    -    #markChildrenENOENT() {
    -        // all children are provisional and do not exist
    -        const children = this.children();
    -        children.provisional = 0;
    -        for (const p of children) {
    -            p.#markENOENT();
    -        }
    -    }
    -    #markENOREALPATH() {
    -        this.#type |= ENOREALPATH;
    -        this.#markENOTDIR();
    -    }
    -    // save the information when we know the entry is not a dir
    -    #markENOTDIR() {
    -        // entry is not a directory, so any children can't exist.
    -        // this *should* be impossible, since any children created
    -        // after it's been marked ENOTDIR should be marked ENOENT,
    -        // so it won't even get to this point.
    -        /* c8 ignore start */
    -        if (this.#type & ENOTDIR)
    -            return;
    -        /* c8 ignore stop */
    -        let t = this.#type;
    -        // this could happen if we stat a dir, then delete it,
    -        // then try to read it or one of its children.
    -        if ((t & IFMT) === IFDIR)
    -            t &= IFMT_UNKNOWN;
    -        this.#type = t | ENOTDIR;
    -        this.#markChildrenENOENT();
    -    }
    -    #readdirFail(code = '') {
    -        // markENOTDIR and markENOENT also set provisional=0
    -        if (code === 'ENOTDIR' || code === 'EPERM') {
    -            this.#markENOTDIR();
    -        }
    -        else if (code === 'ENOENT') {
    -            this.#markENOENT();
    -        }
    -        else {
    -            this.children().provisional = 0;
    -        }
    -    }
    -    #lstatFail(code = '') {
    -        // Windows just raises ENOENT in this case, disable for win CI
    -        /* c8 ignore start */
    -        if (code === 'ENOTDIR') {
    -            // already know it has a parent by this point
    -            const p = this.parent;
    -            p.#markENOTDIR();
    -        }
    -        else if (code === 'ENOENT') {
    -            /* c8 ignore stop */
    -            this.#markENOENT();
    -        }
    -    }
    -    #readlinkFail(code = '') {
    -        let ter = this.#type;
    -        ter |= ENOREADLINK;
    -        if (code === 'ENOENT')
    -            ter |= ENOENT;
    -        // windows gets a weird error when you try to readlink a file
    -        if (code === 'EINVAL' || code === 'UNKNOWN') {
    -            // exists, but not a symlink, we don't know WHAT it is, so remove
    -            // all IFMT bits.
    -            ter &= IFMT_UNKNOWN;
    -        }
    -        this.#type = ter;
    -        // windows just gets ENOENT in this case.  We do cover the case,
    -        // just disabled because it's impossible on Windows CI
    -        /* c8 ignore start */
    -        if (code === 'ENOTDIR' && this.parent) {
    -            this.parent.#markENOTDIR();
    -        }
    -        /* c8 ignore stop */
    -    }
    -    #readdirAddChild(e, c) {
    -        return (this.#readdirMaybePromoteChild(e, c) ||
    -            this.#readdirAddNewChild(e, c));
    -    }
    -    #readdirAddNewChild(e, c) {
    -        // alloc new entry at head, so it's never provisional
    -        const type = entToType(e);
    -        const child = this.newChild(e.name, type, { parent: this });
    -        const ifmt = child.#type & IFMT;
    -        if (ifmt !== IFDIR && ifmt !== IFLNK && ifmt !== UNKNOWN) {
    -            child.#type |= ENOTDIR;
    -        }
    -        c.unshift(child);
    -        c.provisional++;
    -        return child;
    -    }
    -    #readdirMaybePromoteChild(e, c) {
    -        for (let p = c.provisional; p < c.length; p++) {
    -            const pchild = c[p];
    -            const name = this.nocase ? normalizeNocase(e.name) : normalize(e.name);
    -            if (name !== pchild.#matchName) {
    -                continue;
    -            }
    -            return this.#readdirPromoteChild(e, pchild, p, c);
    -        }
    -    }
    -    #readdirPromoteChild(e, p, index, c) {
    -        const v = p.name;
    -        // retain any other flags, but set ifmt from dirent
    -        p.#type = (p.#type & IFMT_UNKNOWN) | entToType(e);
    -        // case sensitivity fixing when we learn the true name.
    -        if (v !== e.name)
    -            p.name = e.name;
    -        // just advance provisional index (potentially off the list),
    -        // otherwise we have to splice/pop it out and re-insert at head
    -        if (index !== c.provisional) {
    -            if (index === c.length - 1)
    -                c.pop();
    -            else
    -                c.splice(index, 1);
    -            c.unshift(p);
    -        }
    -        c.provisional++;
    -        return p;
    -    }
    -    /**
    -     * Call lstat() on this Path, and update all known information that can be
    -     * determined.
    -     *
    -     * Note that unlike `fs.lstat()`, the returned value does not contain some
    -     * information, such as `mode`, `dev`, `nlink`, and `ino`.  If that
    -     * information is required, you will need to call `fs.lstat` yourself.
    -     *
    -     * If the Path refers to a nonexistent file, or if the lstat call fails for
    -     * any reason, `undefined` is returned.  Otherwise the updated Path object is
    -     * returned.
    -     *
    -     * Results are cached, and thus may be out of date if the filesystem is
    -     * mutated.
    -     */
    -    async lstat() {
    -        if ((this.#type & ENOENT) === 0) {
    -            try {
    -                this.#applyStat(await this.#fs.promises.lstat(this.fullpath()));
    -                return this;
    -            }
    -            catch (er) {
    -                this.#lstatFail(er.code);
    -            }
    -        }
    -    }
    -    /**
    -     * synchronous {@link PathBase.lstat}
    -     */
    -    lstatSync() {
    -        if ((this.#type & ENOENT) === 0) {
    -            try {
    -                this.#applyStat(this.#fs.lstatSync(this.fullpath()));
    -                return this;
    -            }
    -            catch (er) {
    -                this.#lstatFail(er.code);
    -            }
    -        }
    -    }
    -    #applyStat(st) {
    -        const { atime, atimeMs, birthtime, birthtimeMs, blksize, blocks, ctime, ctimeMs, dev, gid, ino, mode, mtime, mtimeMs, nlink, rdev, size, uid, } = st;
    -        this.#atime = atime;
    -        this.#atimeMs = atimeMs;
    -        this.#birthtime = birthtime;
    -        this.#birthtimeMs = birthtimeMs;
    -        this.#blksize = blksize;
    -        this.#blocks = blocks;
    -        this.#ctime = ctime;
    -        this.#ctimeMs = ctimeMs;
    -        this.#dev = dev;
    -        this.#gid = gid;
    -        this.#ino = ino;
    -        this.#mode = mode;
    -        this.#mtime = mtime;
    -        this.#mtimeMs = mtimeMs;
    -        this.#nlink = nlink;
    -        this.#rdev = rdev;
    -        this.#size = size;
    -        this.#uid = uid;
    -        const ifmt = entToType(st);
    -        // retain any other flags, but set the ifmt
    -        this.#type = (this.#type & IFMT_UNKNOWN) | ifmt | LSTAT_CALLED;
    -        if (ifmt !== UNKNOWN && ifmt !== IFDIR && ifmt !== IFLNK) {
    -            this.#type |= ENOTDIR;
    -        }
    -    }
    -    #onReaddirCB = [];
    -    #readdirCBInFlight = false;
    -    #callOnReaddirCB(children) {
    -        this.#readdirCBInFlight = false;
    -        const cbs = this.#onReaddirCB.slice();
    -        this.#onReaddirCB.length = 0;
    -        cbs.forEach(cb => cb(null, children));
    -    }
    -    /**
    -     * Standard node-style callback interface to get list of directory entries.
    -     *
    -     * If the Path cannot or does not contain any children, then an empty array
    -     * is returned.
    -     *
    -     * Results are cached, and thus may be out of date if the filesystem is
    -     * mutated.
    -     *
    -     * @param cb The callback called with (er, entries).  Note that the `er`
    -     * param is somewhat extraneous, as all readdir() errors are handled and
    -     * simply result in an empty set of entries being returned.
    -     * @param allowZalgo Boolean indicating that immediately known results should
    -     * *not* be deferred with `queueMicrotask`. Defaults to `false`. Release
    -     * zalgo at your peril, the dark pony lord is devious and unforgiving.
    -     */
    -    readdirCB(cb, allowZalgo = false) {
    -        if (!this.canReaddir()) {
    -            if (allowZalgo)
    -                cb(null, []);
    -            else
    -                queueMicrotask(() => cb(null, []));
    -            return;
    -        }
    -        const children = this.children();
    -        if (this.calledReaddir()) {
    -            const c = children.slice(0, children.provisional);
    -            if (allowZalgo)
    -                cb(null, c);
    -            else
    -                queueMicrotask(() => cb(null, c));
    -            return;
    -        }
    -        // don't have to worry about zalgo at this point.
    -        this.#onReaddirCB.push(cb);
    -        if (this.#readdirCBInFlight) {
    -            return;
    -        }
    -        this.#readdirCBInFlight = true;
    -        // else read the directory, fill up children
    -        // de-provisionalize any provisional children.
    -        const fullpath = this.fullpath();
    -        this.#fs.readdir(fullpath, { withFileTypes: true }, (er, entries) => {
    -            if (er) {
    -                this.#readdirFail(er.code);
    -                children.provisional = 0;
    -            }
    -            else {
    -                // if we didn't get an error, we always get entries.
    -                //@ts-ignore
    -                for (const e of entries) {
    -                    this.#readdirAddChild(e, children);
    -                }
    -                this.#readdirSuccess(children);
    -            }
    -            this.#callOnReaddirCB(children.slice(0, children.provisional));
    -            return;
    -        });
    -    }
    -    #asyncReaddirInFlight;
    -    /**
    -     * Return an array of known child entries.
    -     *
    -     * If the Path cannot or does not contain any children, then an empty array
    -     * is returned.
    -     *
    -     * Results are cached, and thus may be out of date if the filesystem is
    -     * mutated.
    -     */
    -    async readdir() {
    -        if (!this.canReaddir()) {
    -            return [];
    -        }
    -        const children = this.children();
    -        if (this.calledReaddir()) {
    -            return children.slice(0, children.provisional);
    -        }
    -        // else read the directory, fill up children
    -        // de-provisionalize any provisional children.
    -        const fullpath = this.fullpath();
    -        if (this.#asyncReaddirInFlight) {
    -            await this.#asyncReaddirInFlight;
    -        }
    -        else {
    -            /* c8 ignore start */
    -            let resolve = () => { };
    -            /* c8 ignore stop */
    -            this.#asyncReaddirInFlight = new Promise(res => (resolve = res));
    -            try {
    -                for (const e of await this.#fs.promises.readdir(fullpath, {
    -                    withFileTypes: true,
    -                })) {
    -                    this.#readdirAddChild(e, children);
    -                }
    -                this.#readdirSuccess(children);
    -            }
    -            catch (er) {
    -                this.#readdirFail(er.code);
    -                children.provisional = 0;
    -            }
    -            this.#asyncReaddirInFlight = undefined;
    -            resolve();
    -        }
    -        return children.slice(0, children.provisional);
    -    }
    -    /**
    -     * synchronous {@link PathBase.readdir}
    -     */
    -    readdirSync() {
    -        if (!this.canReaddir()) {
    -            return [];
    -        }
    -        const children = this.children();
    -        if (this.calledReaddir()) {
    -            return children.slice(0, children.provisional);
    -        }
    -        // else read the directory, fill up children
    -        // de-provisionalize any provisional children.
    -        const fullpath = this.fullpath();
    -        try {
    -            for (const e of this.#fs.readdirSync(fullpath, {
    -                withFileTypes: true,
    -            })) {
    -                this.#readdirAddChild(e, children);
    -            }
    -            this.#readdirSuccess(children);
    -        }
    -        catch (er) {
    -            this.#readdirFail(er.code);
    -            children.provisional = 0;
    -        }
    -        return children.slice(0, children.provisional);
    -    }
    -    canReaddir() {
    -        if (this.#type & ENOCHILD)
    -            return false;
    -        const ifmt = IFMT & this.#type;
    -        // we always set ENOTDIR when setting IFMT, so should be impossible
    -        /* c8 ignore start */
    -        if (!(ifmt === UNKNOWN || ifmt === IFDIR || ifmt === IFLNK)) {
    -            return false;
    -        }
    -        /* c8 ignore stop */
    -        return true;
    -    }
    -    shouldWalk(dirs, walkFilter) {
    -        return ((this.#type & IFDIR) === IFDIR &&
    -            !(this.#type & ENOCHILD) &&
    -            !dirs.has(this) &&
    -            (!walkFilter || walkFilter(this)));
    -    }
    -    /**
    -     * Return the Path object corresponding to path as resolved
    -     * by realpath(3).
    -     *
    -     * If the realpath call fails for any reason, `undefined` is returned.
    -     *
    -     * Result is cached, and thus may be outdated if the filesystem is mutated.
    -     * On success, returns a Path object.
    -     */
    -    async realpath() {
    -        if (this.#realpath)
    -            return this.#realpath;
    -        if ((ENOREALPATH | ENOREADLINK | ENOENT) & this.#type)
    -            return undefined;
    -        try {
    -            const rp = await this.#fs.promises.realpath(this.fullpath());
    -            return (this.#realpath = this.resolve(rp));
    -        }
    -        catch (_) {
    -            this.#markENOREALPATH();
    -        }
    -    }
    -    /**
    -     * Synchronous {@link realpath}
    -     */
    -    realpathSync() {
    -        if (this.#realpath)
    -            return this.#realpath;
    -        if ((ENOREALPATH | ENOREADLINK | ENOENT) & this.#type)
    -            return undefined;
    -        try {
    -            const rp = this.#fs.realpathSync(this.fullpath());
    -            return (this.#realpath = this.resolve(rp));
    -        }
    -        catch (_) {
    -            this.#markENOREALPATH();
    -        }
    -    }
    -    /**
    -     * Internal method to mark this Path object as the scurry cwd,
    -     * called by {@link PathScurry#chdir}
    -     *
    -     * @internal
    -     */
    -    [setAsCwd](oldCwd) {
    -        if (oldCwd === this)
    -            return;
    -        oldCwd.isCWD = false;
    -        this.isCWD = true;
    -        const changed = new Set([]);
    -        let rp = [];
    -        let p = this;
    -        while (p && p.parent) {
    -            changed.add(p);
    -            p.#relative = rp.join(this.sep);
    -            p.#relativePosix = rp.join('/');
    -            p = p.parent;
    -            rp.push('..');
    -        }
    -        // now un-memoize parents of old cwd
    -        p = oldCwd;
    -        while (p && p.parent && !changed.has(p)) {
    -            p.#relative = undefined;
    -            p.#relativePosix = undefined;
    -            p = p.parent;
    -        }
    -    }
    -}
    -/**
    - * Path class used on win32 systems
    - *
    - * Uses `'\\'` as the path separator for returned paths, either `'\\'` or `'/'`
    - * as the path separator for parsing paths.
    - */
    -export class PathWin32 extends PathBase {
    -    /**
    -     * Separator for generating path strings.
    -     */
    -    sep = '\\';
    -    /**
    -     * Separator for parsing path strings.
    -     */
    -    splitSep = eitherSep;
    -    /**
    -     * Do not create new Path objects directly.  They should always be accessed
    -     * via the PathScurry class or other methods on the Path class.
    -     *
    -     * @internal
    -     */
    -    constructor(name, type = UNKNOWN, root, roots, nocase, children, opts) {
    -        super(name, type, root, roots, nocase, children, opts);
    -    }
    -    /**
    -     * @internal
    -     */
    -    newChild(name, type = UNKNOWN, opts = {}) {
    -        return new PathWin32(name, type, this.root, this.roots, this.nocase, this.childrenCache(), opts);
    -    }
    -    /**
    -     * @internal
    -     */
    -    getRootString(path) {
    -        return win32.parse(path).root;
    -    }
    -    /**
    -     * @internal
    -     */
    -    getRoot(rootPath) {
    -        rootPath = uncToDrive(rootPath.toUpperCase());
    -        if (rootPath === this.root.name) {
    -            return this.root;
    -        }
    -        // ok, not that one, check if it matches another we know about
    -        for (const [compare, root] of Object.entries(this.roots)) {
    -            if (this.sameRoot(rootPath, compare)) {
    -                return (this.roots[rootPath] = root);
    -            }
    -        }
    -        // otherwise, have to create a new one.
    -        return (this.roots[rootPath] = new PathScurryWin32(rootPath, this).root);
    -    }
    -    /**
    -     * @internal
    -     */
    -    sameRoot(rootPath, compare = this.root.name) {
    -        // windows can (rarely) have case-sensitive filesystem, but
    -        // UNC and drive letters are always case-insensitive, and canonically
    -        // represented uppercase.
    -        rootPath = rootPath
    -            .toUpperCase()
    -            .replace(/\//g, '\\')
    -            .replace(uncDriveRegexp, '$1\\');
    -        return rootPath === compare;
    -    }
    -}
    -/**
    - * Path class used on all posix systems.
    - *
    - * Uses `'/'` as the path separator.
    - */
    -export class PathPosix extends PathBase {
    -    /**
    -     * separator for parsing path strings
    -     */
    -    splitSep = '/';
    -    /**
    -     * separator for generating path strings
    -     */
    -    sep = '/';
    -    /**
    -     * Do not create new Path objects directly.  They should always be accessed
    -     * via the PathScurry class or other methods on the Path class.
    -     *
    -     * @internal
    -     */
    -    constructor(name, type = UNKNOWN, root, roots, nocase, children, opts) {
    -        super(name, type, root, roots, nocase, children, opts);
    -    }
    -    /**
    -     * @internal
    -     */
    -    getRootString(path) {
    -        return path.startsWith('/') ? '/' : '';
    -    }
    -    /**
    -     * @internal
    -     */
    -    getRoot(_rootPath) {
    -        return this.root;
    -    }
    -    /**
    -     * @internal
    -     */
    -    newChild(name, type = UNKNOWN, opts = {}) {
    -        return new PathPosix(name, type, this.root, this.roots, this.nocase, this.childrenCache(), opts);
    -    }
    -}
    -/**
    - * The base class for all PathScurry classes, providing the interface for path
    - * resolution and filesystem operations.
    - *
    - * Typically, you should *not* instantiate this class directly, but rather one
    - * of the platform-specific classes, or the exported {@link PathScurry} which
    - * defaults to the current platform.
    - */
    -export class PathScurryBase {
    -    /**
    -     * The root Path entry for the current working directory of this Scurry
    -     */
    -    root;
    -    /**
    -     * The string path for the root of this Scurry's current working directory
    -     */
    -    rootPath;
    -    /**
    -     * A collection of all roots encountered, referenced by rootPath
    -     */
    -    roots;
    -    /**
    -     * The Path entry corresponding to this PathScurry's current working directory.
    -     */
    -    cwd;
    -    #resolveCache;
    -    #resolvePosixCache;
    -    #children;
    -    /**
    -     * Perform path comparisons case-insensitively.
    -     *
    -     * Defaults true on Darwin and Windows systems, false elsewhere.
    -     */
    -    nocase;
    -    #fs;
    -    /**
    -     * This class should not be instantiated directly.
    -     *
    -     * Use PathScurryWin32, PathScurryDarwin, PathScurryPosix, or PathScurry
    -     *
    -     * @internal
    -     */
    -    constructor(cwd = process.cwd(), pathImpl, sep, { nocase, childrenCacheSize = 16 * 1024, fs = defaultFS, } = {}) {
    -        this.#fs = fsFromOption(fs);
    -        if (cwd instanceof URL || cwd.startsWith('file://')) {
    -            cwd = fileURLToPath(cwd);
    -        }
    -        // resolve and split root, and then add to the store.
    -        // this is the only time we call path.resolve()
    -        const cwdPath = pathImpl.resolve(cwd);
    -        this.roots = Object.create(null);
    -        this.rootPath = this.parseRootPath(cwdPath);
    -        this.#resolveCache = new ResolveCache();
    -        this.#resolvePosixCache = new ResolveCache();
    -        this.#children = new ChildrenCache(childrenCacheSize);
    -        const split = cwdPath.substring(this.rootPath.length).split(sep);
    -        // resolve('/') leaves '', splits to [''], we don't want that.
    -        if (split.length === 1 && !split[0]) {
    -            split.pop();
    -        }
    -        /* c8 ignore start */
    -        if (nocase === undefined) {
    -            throw new TypeError('must provide nocase setting to PathScurryBase ctor');
    -        }
    -        /* c8 ignore stop */
    -        this.nocase = nocase;
    -        this.root = this.newRoot(this.#fs);
    -        this.roots[this.rootPath] = this.root;
    -        let prev = this.root;
    -        let len = split.length - 1;
    -        const joinSep = pathImpl.sep;
    -        let abs = this.rootPath;
    -        let sawFirst = false;
    -        for (const part of split) {
    -            const l = len--;
    -            prev = prev.child(part, {
    -                relative: new Array(l).fill('..').join(joinSep),
    -                relativePosix: new Array(l).fill('..').join('/'),
    -                fullpath: (abs += (sawFirst ? '' : joinSep) + part),
    -            });
    -            sawFirst = true;
    -        }
    -        this.cwd = prev;
    -    }
    -    /**
    -     * Get the depth of a provided path, string, or the cwd
    -     */
    -    depth(path = this.cwd) {
    -        if (typeof path === 'string') {
    -            path = this.cwd.resolve(path);
    -        }
    -        return path.depth();
    -    }
    -    /**
    -     * Return the cache of child entries.  Exposed so subclasses can create
    -     * child Path objects in a platform-specific way.
    -     *
    -     * @internal
    -     */
    -    childrenCache() {
    -        return this.#children;
    -    }
    -    /**
    -     * Resolve one or more path strings to a resolved string
    -     *
    -     * Same interface as require('path').resolve.
    -     *
    -     * Much faster than path.resolve() when called multiple times for the same
    -     * path, because the resolved Path objects are cached.  Much slower
    -     * otherwise.
    -     */
    -    resolve(...paths) {
    -        // first figure out the minimum number of paths we have to test
    -        // we always start at cwd, but any absolutes will bump the start
    -        let r = '';
    -        for (let i = paths.length - 1; i >= 0; i--) {
    -            const p = paths[i];
    -            if (!p || p === '.')
    -                continue;
    -            r = r ? `${p}/${r}` : p;
    -            if (this.isAbsolute(p)) {
    -                break;
    -            }
    -        }
    -        const cached = this.#resolveCache.get(r);
    -        if (cached !== undefined) {
    -            return cached;
    -        }
    -        const result = this.cwd.resolve(r).fullpath();
    -        this.#resolveCache.set(r, result);
    -        return result;
    -    }
    -    /**
    -     * Resolve one or more path strings to a resolved string, returning
    -     * the posix path.  Identical to .resolve() on posix systems, but on
    -     * windows will return a forward-slash separated UNC path.
    -     *
    -     * Same interface as require('path').resolve.
    -     *
    -     * Much faster than path.resolve() when called multiple times for the same
    -     * path, because the resolved Path objects are cached.  Much slower
    -     * otherwise.
    -     */
    -    resolvePosix(...paths) {
    -        // first figure out the minimum number of paths we have to test
    -        // we always start at cwd, but any absolutes will bump the start
    -        let r = '';
    -        for (let i = paths.length - 1; i >= 0; i--) {
    -            const p = paths[i];
    -            if (!p || p === '.')
    -                continue;
    -            r = r ? `${p}/${r}` : p;
    -            if (this.isAbsolute(p)) {
    -                break;
    -            }
    -        }
    -        const cached = this.#resolvePosixCache.get(r);
    -        if (cached !== undefined) {
    -            return cached;
    -        }
    -        const result = this.cwd.resolve(r).fullpathPosix();
    -        this.#resolvePosixCache.set(r, result);
    -        return result;
    -    }
    -    /**
    -     * find the relative path from the cwd to the supplied path string or entry
    -     */
    -    relative(entry = this.cwd) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        return entry.relative();
    -    }
    -    /**
    -     * find the relative path from the cwd to the supplied path string or
    -     * entry, using / as the path delimiter, even on Windows.
    -     */
    -    relativePosix(entry = this.cwd) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        return entry.relativePosix();
    -    }
    -    /**
    -     * Return the basename for the provided string or Path object
    -     */
    -    basename(entry = this.cwd) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        return entry.name;
    -    }
    -    /**
    -     * Return the dirname for the provided string or Path object
    -     */
    -    dirname(entry = this.cwd) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        return (entry.parent || entry).fullpath();
    -    }
    -    async readdir(entry = this.cwd, opts = {
    -        withFileTypes: true,
    -    }) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        else if (!(entry instanceof PathBase)) {
    -            opts = entry;
    -            entry = this.cwd;
    -        }
    -        const { withFileTypes } = opts;
    -        if (!entry.canReaddir()) {
    -            return [];
    -        }
    -        else {
    -            const p = await entry.readdir();
    -            return withFileTypes ? p : p.map(e => e.name);
    -        }
    -    }
    -    readdirSync(entry = this.cwd, opts = {
    -        withFileTypes: true,
    -    }) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        else if (!(entry instanceof PathBase)) {
    -            opts = entry;
    -            entry = this.cwd;
    -        }
    -        const { withFileTypes = true } = opts;
    -        if (!entry.canReaddir()) {
    -            return [];
    -        }
    -        else if (withFileTypes) {
    -            return entry.readdirSync();
    -        }
    -        else {
    -            return entry.readdirSync().map(e => e.name);
    -        }
    -    }
    -    /**
    -     * Call lstat() on the string or Path object, and update all known
    -     * information that can be determined.
    -     *
    -     * Note that unlike `fs.lstat()`, the returned value does not contain some
    -     * information, such as `mode`, `dev`, `nlink`, and `ino`.  If that
    -     * information is required, you will need to call `fs.lstat` yourself.
    -     *
    -     * If the Path refers to a nonexistent file, or if the lstat call fails for
    -     * any reason, `undefined` is returned.  Otherwise the updated Path object is
    -     * returned.
    -     *
    -     * Results are cached, and thus may be out of date if the filesystem is
    -     * mutated.
    -     */
    -    async lstat(entry = this.cwd) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        return entry.lstat();
    -    }
    -    /**
    -     * synchronous {@link PathScurryBase.lstat}
    -     */
    -    lstatSync(entry = this.cwd) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        return entry.lstatSync();
    -    }
    -    async readlink(entry = this.cwd, { withFileTypes } = {
    -        withFileTypes: false,
    -    }) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        else if (!(entry instanceof PathBase)) {
    -            withFileTypes = entry.withFileTypes;
    -            entry = this.cwd;
    -        }
    -        const e = await entry.readlink();
    -        return withFileTypes ? e : e?.fullpath();
    -    }
    -    readlinkSync(entry = this.cwd, { withFileTypes } = {
    -        withFileTypes: false,
    -    }) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        else if (!(entry instanceof PathBase)) {
    -            withFileTypes = entry.withFileTypes;
    -            entry = this.cwd;
    -        }
    -        const e = entry.readlinkSync();
    -        return withFileTypes ? e : e?.fullpath();
    -    }
    -    async realpath(entry = this.cwd, { withFileTypes } = {
    -        withFileTypes: false,
    -    }) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        else if (!(entry instanceof PathBase)) {
    -            withFileTypes = entry.withFileTypes;
    -            entry = this.cwd;
    -        }
    -        const e = await entry.realpath();
    -        return withFileTypes ? e : e?.fullpath();
    -    }
    -    realpathSync(entry = this.cwd, { withFileTypes } = {
    -        withFileTypes: false,
    -    }) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        else if (!(entry instanceof PathBase)) {
    -            withFileTypes = entry.withFileTypes;
    -            entry = this.cwd;
    -        }
    -        const e = entry.realpathSync();
    -        return withFileTypes ? e : e?.fullpath();
    -    }
    -    async walk(entry = this.cwd, opts = {}) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        else if (!(entry instanceof PathBase)) {
    -            opts = entry;
    -            entry = this.cwd;
    -        }
    -        const { withFileTypes = true, follow = false, filter, walkFilter, } = opts;
    -        const results = [];
    -        if (!filter || filter(entry)) {
    -            results.push(withFileTypes ? entry : entry.fullpath());
    -        }
    -        const dirs = new Set();
    -        const walk = (dir, cb) => {
    -            dirs.add(dir);
    -            dir.readdirCB((er, entries) => {
    -                /* c8 ignore start */
    -                if (er) {
    -                    return cb(er);
    -                }
    -                /* c8 ignore stop */
    -                let len = entries.length;
    -                if (!len)
    -                    return cb();
    -                const next = () => {
    -                    if (--len === 0) {
    -                        cb();
    -                    }
    -                };
    -                for (const e of entries) {
    -                    if (!filter || filter(e)) {
    -                        results.push(withFileTypes ? e : e.fullpath());
    -                    }
    -                    if (follow && e.isSymbolicLink()) {
    -                        e.realpath()
    -                            .then(r => (r?.isUnknown() ? r.lstat() : r))
    -                            .then(r => r?.shouldWalk(dirs, walkFilter) ? walk(r, next) : next());
    -                    }
    -                    else {
    -                        if (e.shouldWalk(dirs, walkFilter)) {
    -                            walk(e, next);
    -                        }
    -                        else {
    -                            next();
    -                        }
    -                    }
    -                }
    -            }, true); // zalgooooooo
    -        };
    -        const start = entry;
    -        return new Promise((res, rej) => {
    -            walk(start, er => {
    -                /* c8 ignore start */
    -                if (er)
    -                    return rej(er);
    -                /* c8 ignore stop */
    -                res(results);
    -            });
    -        });
    -    }
    -    walkSync(entry = this.cwd, opts = {}) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        else if (!(entry instanceof PathBase)) {
    -            opts = entry;
    -            entry = this.cwd;
    -        }
    -        const { withFileTypes = true, follow = false, filter, walkFilter, } = opts;
    -        const results = [];
    -        if (!filter || filter(entry)) {
    -            results.push(withFileTypes ? entry : entry.fullpath());
    -        }
    -        const dirs = new Set([entry]);
    -        for (const dir of dirs) {
    -            const entries = dir.readdirSync();
    -            for (const e of entries) {
    -                if (!filter || filter(e)) {
    -                    results.push(withFileTypes ? e : e.fullpath());
    -                }
    -                let r = e;
    -                if (e.isSymbolicLink()) {
    -                    if (!(follow && (r = e.realpathSync())))
    -                        continue;
    -                    if (r.isUnknown())
    -                        r.lstatSync();
    -                }
    -                if (r.shouldWalk(dirs, walkFilter)) {
    -                    dirs.add(r);
    -                }
    -            }
    -        }
    -        return results;
    -    }
    -    /**
    -     * Support for `for await`
    -     *
    -     * Alias for {@link PathScurryBase.iterate}
    -     *
    -     * Note: As of Node 19, this is very slow, compared to other methods of
    -     * walking.  Consider using {@link PathScurryBase.stream} if memory overhead
    -     * and backpressure are concerns, or {@link PathScurryBase.walk} if not.
    -     */
    -    [Symbol.asyncIterator]() {
    -        return this.iterate();
    -    }
    -    iterate(entry = this.cwd, options = {}) {
    -        // iterating async over the stream is significantly more performant,
    -        // especially in the warm-cache scenario, because it buffers up directory
    -        // entries in the background instead of waiting for a yield for each one.
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        else if (!(entry instanceof PathBase)) {
    -            options = entry;
    -            entry = this.cwd;
    -        }
    -        return this.stream(entry, options)[Symbol.asyncIterator]();
    -    }
    -    /**
    -     * Iterating over a PathScurry performs a synchronous walk.
    -     *
    -     * Alias for {@link PathScurryBase.iterateSync}
    -     */
    -    [Symbol.iterator]() {
    -        return this.iterateSync();
    -    }
    -    *iterateSync(entry = this.cwd, opts = {}) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        else if (!(entry instanceof PathBase)) {
    -            opts = entry;
    -            entry = this.cwd;
    -        }
    -        const { withFileTypes = true, follow = false, filter, walkFilter, } = opts;
    -        if (!filter || filter(entry)) {
    -            yield withFileTypes ? entry : entry.fullpath();
    -        }
    -        const dirs = new Set([entry]);
    -        for (const dir of dirs) {
    -            const entries = dir.readdirSync();
    -            for (const e of entries) {
    -                if (!filter || filter(e)) {
    -                    yield withFileTypes ? e : e.fullpath();
    -                }
    -                let r = e;
    -                if (e.isSymbolicLink()) {
    -                    if (!(follow && (r = e.realpathSync())))
    -                        continue;
    -                    if (r.isUnknown())
    -                        r.lstatSync();
    -                }
    -                if (r.shouldWalk(dirs, walkFilter)) {
    -                    dirs.add(r);
    -                }
    -            }
    -        }
    -    }
    -    stream(entry = this.cwd, opts = {}) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        else if (!(entry instanceof PathBase)) {
    -            opts = entry;
    -            entry = this.cwd;
    -        }
    -        const { withFileTypes = true, follow = false, filter, walkFilter, } = opts;
    -        const results = new Minipass({ objectMode: true });
    -        if (!filter || filter(entry)) {
    -            results.write(withFileTypes ? entry : entry.fullpath());
    -        }
    -        const dirs = new Set();
    -        const queue = [entry];
    -        let processing = 0;
    -        const process = () => {
    -            let paused = false;
    -            while (!paused) {
    -                const dir = queue.shift();
    -                if (!dir) {
    -                    if (processing === 0)
    -                        results.end();
    -                    return;
    -                }
    -                processing++;
    -                dirs.add(dir);
    -                const onReaddir = (er, entries, didRealpaths = false) => {
    -                    /* c8 ignore start */
    -                    if (er)
    -                        return results.emit('error', er);
    -                    /* c8 ignore stop */
    -                    if (follow && !didRealpaths) {
    -                        const promises = [];
    -                        for (const e of entries) {
    -                            if (e.isSymbolicLink()) {
    -                                promises.push(e
    -                                    .realpath()
    -                                    .then((r) => r?.isUnknown() ? r.lstat() : r));
    -                            }
    -                        }
    -                        if (promises.length) {
    -                            Promise.all(promises).then(() => onReaddir(null, entries, true));
    -                            return;
    -                        }
    -                    }
    -                    for (const e of entries) {
    -                        if (e && (!filter || filter(e))) {
    -                            if (!results.write(withFileTypes ? e : e.fullpath())) {
    -                                paused = true;
    -                            }
    -                        }
    -                    }
    -                    processing--;
    -                    for (const e of entries) {
    -                        const r = e.realpathCached() || e;
    -                        if (r.shouldWalk(dirs, walkFilter)) {
    -                            queue.push(r);
    -                        }
    -                    }
    -                    if (paused && !results.flowing) {
    -                        results.once('drain', process);
    -                    }
    -                    else if (!sync) {
    -                        process();
    -                    }
    -                };
    -                // zalgo containment
    -                let sync = true;
    -                dir.readdirCB(onReaddir, true);
    -                sync = false;
    -            }
    -        };
    -        process();
    -        return results;
    -    }
    -    streamSync(entry = this.cwd, opts = {}) {
    -        if (typeof entry === 'string') {
    -            entry = this.cwd.resolve(entry);
    -        }
    -        else if (!(entry instanceof PathBase)) {
    -            opts = entry;
    -            entry = this.cwd;
    -        }
    -        const { withFileTypes = true, follow = false, filter, walkFilter, } = opts;
    -        const results = new Minipass({ objectMode: true });
    -        const dirs = new Set();
    -        if (!filter || filter(entry)) {
    -            results.write(withFileTypes ? entry : entry.fullpath());
    -        }
    -        const queue = [entry];
    -        let processing = 0;
    -        const process = () => {
    -            let paused = false;
    -            while (!paused) {
    -                const dir = queue.shift();
    -                if (!dir) {
    -                    if (processing === 0)
    -                        results.end();
    -                    return;
    -                }
    -                processing++;
    -                dirs.add(dir);
    -                const entries = dir.readdirSync();
    -                for (const e of entries) {
    -                    if (!filter || filter(e)) {
    -                        if (!results.write(withFileTypes ? e : e.fullpath())) {
    -                            paused = true;
    -                        }
    -                    }
    -                }
    -                processing--;
    -                for (const e of entries) {
    -                    let r = e;
    -                    if (e.isSymbolicLink()) {
    -                        if (!(follow && (r = e.realpathSync())))
    -                            continue;
    -                        if (r.isUnknown())
    -                            r.lstatSync();
    -                    }
    -                    if (r.shouldWalk(dirs, walkFilter)) {
    -                        queue.push(r);
    -                    }
    -                }
    -            }
    -            if (paused && !results.flowing)
    -                results.once('drain', process);
    -        };
    -        process();
    -        return results;
    -    }
    -    chdir(path = this.cwd) {
    -        const oldCwd = this.cwd;
    -        this.cwd = typeof path === 'string' ? this.cwd.resolve(path) : path;
    -        this.cwd[setAsCwd](oldCwd);
    -    }
    -}
    -/**
    - * Windows implementation of {@link PathScurryBase}
    - *
    - * Defaults to case insensitve, uses `'\\'` to generate path strings.  Uses
    - * {@link PathWin32} for Path objects.
    - */
    -export class PathScurryWin32 extends PathScurryBase {
    -    /**
    -     * separator for generating path strings
    -     */
    -    sep = '\\';
    -    constructor(cwd = process.cwd(), opts = {}) {
    -        const { nocase = true } = opts;
    -        super(cwd, win32, '\\', { ...opts, nocase });
    -        this.nocase = nocase;
    -        for (let p = this.cwd; p; p = p.parent) {
    -            p.nocase = this.nocase;
    -        }
    -    }
    -    /**
    -     * @internal
    -     */
    -    parseRootPath(dir) {
    -        // if the path starts with a single separator, it's not a UNC, and we'll
    -        // just get separator as the root, and driveFromUNC will return \
    -        // In that case, mount \ on the root from the cwd.
    -        return win32.parse(dir).root.toUpperCase();
    -    }
    -    /**
    -     * @internal
    -     */
    -    newRoot(fs) {
    -        return new PathWin32(this.rootPath, IFDIR, undefined, this.roots, this.nocase, this.childrenCache(), { fs });
    -    }
    -    /**
    -     * Return true if the provided path string is an absolute path
    -     */
    -    isAbsolute(p) {
    -        return (p.startsWith('/') || p.startsWith('\\') || /^[a-z]:(\/|\\)/i.test(p));
    -    }
    -}
    -/**
    - * {@link PathScurryBase} implementation for all posix systems other than Darwin.
    - *
    - * Defaults to case-sensitive matching, uses `'/'` to generate path strings.
    - *
    - * Uses {@link PathPosix} for Path objects.
    - */
    -export class PathScurryPosix extends PathScurryBase {
    -    /**
    -     * separator for generating path strings
    -     */
    -    sep = '/';
    -    constructor(cwd = process.cwd(), opts = {}) {
    -        const { nocase = false } = opts;
    -        super(cwd, posix, '/', { ...opts, nocase });
    -        this.nocase = nocase;
    -    }
    -    /**
    -     * @internal
    -     */
    -    parseRootPath(_dir) {
    -        return '/';
    -    }
    -    /**
    -     * @internal
    -     */
    -    newRoot(fs) {
    -        return new PathPosix(this.rootPath, IFDIR, undefined, this.roots, this.nocase, this.childrenCache(), { fs });
    -    }
    -    /**
    -     * Return true if the provided path string is an absolute path
    -     */
    -    isAbsolute(p) {
    -        return p.startsWith('/');
    -    }
    -}
    -/**
    - * {@link PathScurryBase} implementation for Darwin (macOS) systems.
    - *
    - * Defaults to case-insensitive matching, uses `'/'` for generating path
    - * strings.
    - *
    - * Uses {@link PathPosix} for Path objects.
    - */
    -export class PathScurryDarwin extends PathScurryPosix {
    -    constructor(cwd = process.cwd(), opts = {}) {
    -        const { nocase = true } = opts;
    -        super(cwd, { ...opts, nocase });
    -    }
    -}
    -/**
    - * Default {@link PathBase} implementation for the current platform.
    - *
    - * {@link PathWin32} on Windows systems, {@link PathPosix} on all others.
    - */
    -export const Path = process.platform === 'win32' ? PathWin32 : PathPosix;
    -/**
    - * Default {@link PathScurryBase} implementation for the current platform.
    - *
    - * {@link PathScurryWin32} on Windows systems, {@link PathScurryDarwin} on
    - * Darwin (macOS) systems, {@link PathScurryPosix} on all others.
    - */
    -export const PathScurry = process.platform === 'win32' ? PathScurryWin32
    -    : process.platform === 'darwin' ? PathScurryDarwin
    -        : PathScurryPosix;
    -//# sourceMappingURL=index.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/path-scurry/dist/esm/package.json b/deps/npm/node_modules/node-gyp/node_modules/path-scurry/dist/esm/package.json
    deleted file mode 100644
    index 3dbc1ca591c055..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/path-scurry/dist/esm/package.json
    +++ /dev/null
    @@ -1,3 +0,0 @@
    -{
    -  "type": "module"
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/path-scurry/package.json b/deps/npm/node_modules/node-gyp/node_modules/path-scurry/package.json
    deleted file mode 100644
    index e1766157894c8d..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/path-scurry/package.json
    +++ /dev/null
    @@ -1,89 +0,0 @@
    -{
    -  "name": "path-scurry",
    -  "version": "1.11.1",
    -  "description": "walk paths fast and efficiently",
    -  "author": "Isaac Z. Schlueter  (https://blog.izs.me)",
    -  "main": "./dist/commonjs/index.js",
    -  "type": "module",
    -  "exports": {
    -    "./package.json": "./package.json",
    -    ".": {
    -      "import": {
    -        "types": "./dist/esm/index.d.ts",
    -        "default": "./dist/esm/index.js"
    -      },
    -      "require": {
    -        "types": "./dist/commonjs/index.d.ts",
    -        "default": "./dist/commonjs/index.js"
    -      }
    -    }
    -  },
    -  "files": [
    -    "dist"
    -  ],
    -  "license": "BlueOak-1.0.0",
    -  "scripts": {
    -    "preversion": "npm test",
    -    "postversion": "npm publish",
    -    "prepublishOnly": "git push origin --follow-tags",
    -    "prepare": "tshy",
    -    "pretest": "npm run prepare",
    -    "presnap": "npm run prepare",
    -    "test": "tap",
    -    "snap": "tap",
    -    "format": "prettier --write . --loglevel warn",
    -    "typedoc": "typedoc --tsconfig tsconfig-esm.json ./src/*.ts",
    -    "bench": "bash ./scripts/bench.sh"
    -  },
    -  "prettier": {
    -    "experimentalTernaries": true,
    -    "semi": false,
    -    "printWidth": 75,
    -    "tabWidth": 2,
    -    "useTabs": false,
    -    "singleQuote": true,
    -    "jsxSingleQuote": false,
    -    "bracketSameLine": true,
    -    "arrowParens": "avoid",
    -    "endOfLine": "lf"
    -  },
    -  "devDependencies": {
    -    "@nodelib/fs.walk": "^1.2.8",
    -    "@types/node": "^20.12.11",
    -    "c8": "^7.12.0",
    -    "eslint-config-prettier": "^8.6.0",
    -    "mkdirp": "^3.0.0",
    -    "prettier": "^3.2.5",
    -    "rimraf": "^5.0.1",
    -    "tap": "^18.7.2",
    -    "ts-node": "^10.9.2",
    -    "tshy": "^1.14.0",
    -    "typedoc": "^0.25.12",
    -    "typescript": "^5.4.3"
    -  },
    -  "tap": {
    -    "typecheck": true
    -  },
    -  "engines": {
    -    "node": ">=16 || 14 >=14.18"
    -  },
    -  "funding": {
    -    "url": "https://github.com/sponsors/isaacs"
    -  },
    -  "repository": {
    -    "type": "git",
    -    "url": "git+https://github.com/isaacs/path-scurry"
    -  },
    -  "dependencies": {
    -    "lru-cache": "^10.2.0",
    -    "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
    -  },
    -  "tshy": {
    -    "selfLink": false,
    -    "exports": {
    -      "./package.json": "./package.json",
    -      ".": "./src/index.ts"
    -    }
    -  },
    -  "types": "./dist/commonjs/index.d.ts"
    -}
    diff --git a/deps/npm/node_modules/node-gyp/package.json b/deps/npm/node_modules/node-gyp/package.json
    index 018391bd38c470..ae606878441335 100644
    --- a/deps/npm/node_modules/node-gyp/package.json
    +++ b/deps/npm/node_modules/node-gyp/package.json
    @@ -11,7 +11,7 @@
         "bindings",
         "gyp"
       ],
    -  "version": "11.4.2",
    +  "version": "12.1.0",
       "installVersion": 11,
       "author": "Nathan Rajlich  (http://tootallnate.net)",
       "repository": {
    @@ -25,28 +25,28 @@
         "env-paths": "^2.2.0",
         "exponential-backoff": "^3.1.1",
         "graceful-fs": "^4.2.6",
    -    "make-fetch-happen": "^14.0.3",
    -    "nopt": "^8.0.0",
    -    "proc-log": "^5.0.0",
    +    "make-fetch-happen": "^15.0.0",
    +    "nopt": "^9.0.0",
    +    "proc-log": "^6.0.0",
         "semver": "^7.3.5",
    -    "tar": "^7.4.3",
    +    "tar": "^7.5.2",
         "tinyglobby": "^0.2.12",
    -    "which": "^5.0.0"
    +    "which": "^6.0.0"
       },
       "engines": {
    -    "node": "^18.17.0 || >=20.5.0"
    +    "node": "^20.17.0 || >=22.9.0"
       },
       "devDependencies": {
         "bindings": "^1.5.0",
    -    "cross-env": "^7.0.3",
    -    "eslint": "^9.16.0",
    -    "mocha": "^11.0.1",
    -    "nan": "^2.14.2",
    -    "neostandard": "^0.11.9",
    +    "cross-env": "^10.1.0",
    +    "eslint": "^9.39.1",
    +    "mocha": "^11.7.5",
    +    "nan": "^2.23.1",
    +    "neostandard": "^0.12.2",
         "require-inject": "^1.4.4"
       },
       "scripts": {
         "lint": "eslint \"*/*.js\" \"test/**/*.js\" \".github/**/*.js\"",
    -    "test": "cross-env NODE_GYP_NULL_LOGGER=true mocha --timeout 15000 test/test-download.js test/test-*"
    +    "test": "cross-env NODE_GYP_NULL_LOGGER=true mocha --timeout 30000 test/test-download.js test/test-*"
       }
     }
    diff --git a/deps/npm/node_modules/nopt/package.json b/deps/npm/node_modules/nopt/package.json
    index 0732ada73c1d00..bb91642931009a 100644
    --- a/deps/npm/node_modules/nopt/package.json
    +++ b/deps/npm/node_modules/nopt/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "nopt",
    -  "version": "8.1.0",
    +  "version": "9.0.0",
       "description": "Option parsing for Node, supporting types, shorthands, etc. Used by npm.",
       "author": "GitHub Inc.",
       "main": "lib/nopt.js",
    @@ -23,11 +23,11 @@
       },
       "license": "ISC",
       "dependencies": {
    -    "abbrev": "^3.0.0"
    +    "abbrev": "^4.0.0"
       },
       "devDependencies": {
         "@npmcli/eslint-config": "^5.0.0",
    -    "@npmcli/template-oss": "4.23.6",
    +    "@npmcli/template-oss": "4.27.1",
         "tap": "^16.3.0"
       },
       "tap": {
    @@ -41,12 +41,12 @@
         "lib/"
       ],
       "engines": {
    -    "node": "^18.17.0 || >=20.5.0"
    +    "node": "^20.17.0 || >=22.9.0"
       },
       "templateOSS": {
         "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
         "windowsCI": false,
    -    "version": "4.23.6",
    +    "version": "4.27.1",
         "publish": true
       }
     }
    diff --git a/deps/npm/node_modules/npm-bundled/package.json b/deps/npm/node_modules/npm-bundled/package.json
    index c5daf35dbaa841..1fa4bdc72c593f 100644
    --- a/deps/npm/node_modules/npm-bundled/package.json
    +++ b/deps/npm/node_modules/npm-bundled/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "npm-bundled",
    -  "version": "4.0.0",
    +  "version": "5.0.0",
       "description": "list things in node_modules that are bundledDependencies, or transitive dependencies thereof",
       "main": "lib/index.js",
       "repository": {
    @@ -11,7 +11,7 @@
       "license": "ISC",
       "devDependencies": {
         "@npmcli/eslint-config": "^5.0.0",
    -    "@npmcli/template-oss": "4.23.3",
    +    "@npmcli/template-oss": "4.27.1",
         "mutate-fs": "^2.1.1",
         "tap": "^16.3.0"
       },
    @@ -30,14 +30,14 @@
         "lib/"
       ],
       "dependencies": {
    -    "npm-normalize-package-bin": "^4.0.0"
    +    "npm-normalize-package-bin": "^5.0.0"
       },
       "engines": {
    -    "node": "^18.17.0 || >=20.5.0"
    +    "node": "^20.17.0 || >=22.9.0"
       },
       "templateOSS": {
         "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    -    "version": "4.23.3",
    +    "version": "4.27.1",
         "publish": true
       },
       "tap": {
    diff --git a/deps/npm/node_modules/npm-install-checks/package.json b/deps/npm/node_modules/npm-install-checks/package.json
    index 28a23354bdbfea..aae100c2d4f3c3 100644
    --- a/deps/npm/node_modules/npm-install-checks/package.json
    +++ b/deps/npm/node_modules/npm-install-checks/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "npm-install-checks",
    -  "version": "7.1.2",
    +  "version": "8.0.0",
       "description": "Check the engines and platform fields in package.json",
       "main": "lib/index.js",
       "dependencies": {
    @@ -8,7 +8,7 @@
       },
       "devDependencies": {
         "@npmcli/eslint-config": "^5.0.0",
    -    "@npmcli/template-oss": "4.25.0",
    +    "@npmcli/template-oss": "4.27.1",
         "tap": "^16.0.1"
       },
       "scripts": {
    @@ -35,12 +35,12 @@
         "lib/"
       ],
       "engines": {
    -    "node": "^18.17.0 || >=20.5.0"
    +    "node": "^20.17.0 || >=22.9.0"
       },
       "author": "GitHub Inc.",
       "templateOSS": {
         "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    -    "version": "4.25.0",
    +    "version": "4.27.1",
         "publish": "true"
       },
       "tap": {
    diff --git a/deps/npm/node_modules/npm-normalize-package-bin/package.json b/deps/npm/node_modules/npm-normalize-package-bin/package.json
    index a1aeef0e1e7512..55dc65ad5ee92f 100644
    --- a/deps/npm/node_modules/npm-normalize-package-bin/package.json
    +++ b/deps/npm/node_modules/npm-normalize-package-bin/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "npm-normalize-package-bin",
    -  "version": "4.0.0",
    +  "version": "5.0.0",
       "description": "Turn any flavor of allowable package.json bin into a normalized object",
       "main": "lib/index.js",
       "repository": {
    @@ -21,7 +21,7 @@
       },
       "devDependencies": {
         "@npmcli/eslint-config": "^5.0.0",
    -    "@npmcli/template-oss": "4.23.3",
    +    "@npmcli/template-oss": "4.27.1",
         "tap": "^16.3.0"
       },
       "files": [
    @@ -29,11 +29,11 @@
         "lib/"
       ],
       "engines": {
    -    "node": "^18.17.0 || >=20.5.0"
    +    "node": "^20.17.0 || >=22.9.0"
       },
       "templateOSS": {
         "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    -    "version": "4.23.3",
    +    "version": "4.27.1",
         "publish": "true"
       },
       "tap": {
    diff --git a/deps/npm/node_modules/npm-package-arg/lib/npa.js b/deps/npm/node_modules/npm-package-arg/lib/npa.js
    index 50121b99efbe36..a25c0a5368941f 100644
    --- a/deps/npm/node_modules/npm-package-arg/lib/npa.js
    +++ b/deps/npm/node_modules/npm-package-arg/lib/npa.js
    @@ -66,8 +66,6 @@ function isFileSpec (spec) {
       if (isWindows) {
         return isWindowsFile.test(spec)
       }
    -  // We never hit this in windows tests, obviously
    -  /* istanbul ignore next */
       return isPosixFile.test(spec)
     }
     
    diff --git a/deps/npm/node_modules/npm-package-arg/package.json b/deps/npm/node_modules/npm-package-arg/package.json
    index 2d8f91deaeed2b..2e2d027f05582a 100644
    --- a/deps/npm/node_modules/npm-package-arg/package.json
    +++ b/deps/npm/node_modules/npm-package-arg/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "npm-package-arg",
    -  "version": "13.0.1",
    +  "version": "13.0.2",
       "description": "Parse the things that can be arguments to `npm install`",
       "main": "./lib/npa.js",
       "directories": {
    @@ -12,13 +12,13 @@
       ],
       "dependencies": {
         "hosted-git-info": "^9.0.0",
    -    "proc-log": "^5.0.0",
    +    "proc-log": "^6.0.0",
         "semver": "^7.3.5",
    -    "validate-npm-package-name": "^6.0.0"
    +    "validate-npm-package-name": "^7.0.0"
       },
       "devDependencies": {
    -    "@npmcli/eslint-config": "^5.0.0",
    -    "@npmcli/template-oss": "4.23.5",
    +    "@npmcli/eslint-config": "^6.0.0",
    +    "@npmcli/template-oss": "4.28.0",
         "tap": "^16.0.1"
       },
       "scripts": {
    @@ -47,7 +47,6 @@
         "node": "^20.17.0 || >=22.9.0"
       },
       "tap": {
    -    "branches": 97,
         "nyc-arg": [
           "--exclude",
           "tap-snapshots/**"
    @@ -55,7 +54,7 @@
       },
       "templateOSS": {
         "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    -    "version": "4.23.5",
    +    "version": "4.28.0",
         "publish": true
       }
     }
    diff --git a/deps/npm/node_modules/npm-packlist/package.json b/deps/npm/node_modules/npm-packlist/package.json
    index 1ca942a536dbd7..30cddb4df2e37a 100644
    --- a/deps/npm/node_modules/npm-packlist/package.json
    +++ b/deps/npm/node_modules/npm-packlist/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "npm-packlist",
    -  "version": "10.0.2",
    +  "version": "10.0.3",
       "description": "Get a list of the files to add from a folder into an npm package",
       "directories": {
         "test": "test"
    @@ -8,7 +8,7 @@
       "main": "lib/index.js",
       "dependencies": {
         "ignore-walk": "^8.0.0",
    -    "proc-log": "^5.0.0"
    +    "proc-log": "^6.0.0"
       },
       "author": "GitHub Inc.",
       "license": "ISC",
    @@ -19,7 +19,7 @@
       "devDependencies": {
         "@npmcli/arborist": "^9.0.0",
         "@npmcli/eslint-config": "^5.0.1",
    -    "@npmcli/template-oss": "4.25.1",
    +    "@npmcli/template-oss": "4.27.1",
         "mutate-fs": "^2.1.1",
         "tap": "^16.0.1"
       },
    @@ -56,7 +56,7 @@
       },
       "templateOSS": {
         "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    -    "version": "4.25.1",
    +    "version": "4.27.1",
         "publish": true
       }
     }
    diff --git a/deps/npm/node_modules/npm-pick-manifest/package.json b/deps/npm/node_modules/npm-pick-manifest/package.json
    index f1ca18ed321081..5cfafcfb70885f 100644
    --- a/deps/npm/node_modules/npm-pick-manifest/package.json
    +++ b/deps/npm/node_modules/npm-pick-manifest/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "npm-pick-manifest",
    -  "version": "11.0.1",
    +  "version": "11.0.3",
       "description": "Resolves a matching manifest from a package metadata document according to standard npm semver resolution rules.",
       "main": "./lib",
       "files": [
    @@ -30,14 +30,14 @@
       "author": "GitHub Inc.",
       "license": "ISC",
       "dependencies": {
    -    "npm-install-checks": "^7.1.0",
    -    "npm-normalize-package-bin": "^4.0.0",
    +    "npm-install-checks": "^8.0.0",
    +    "npm-normalize-package-bin": "^5.0.0",
         "npm-package-arg": "^13.0.0",
         "semver": "^7.3.5"
       },
       "devDependencies": {
    -    "@npmcli/eslint-config": "^5.0.0",
    -    "@npmcli/template-oss": "4.25.0",
    +    "@npmcli/eslint-config": "^6.0.0",
    +    "@npmcli/template-oss": "4.27.1",
         "tap": "^16.0.1"
       },
       "tap": {
    @@ -52,7 +52,7 @@
       },
       "templateOSS": {
         "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    -    "version": "4.25.0",
    +    "version": "4.27.1",
         "publish": true
       }
     }
    diff --git a/deps/npm/node_modules/npm-profile/package.json b/deps/npm/node_modules/npm-profile/package.json
    index fb4ce118c9cf27..0f97cc1efa1934 100644
    --- a/deps/npm/node_modules/npm-profile/package.json
    +++ b/deps/npm/node_modules/npm-profile/package.json
    @@ -1,13 +1,13 @@
     {
       "name": "npm-profile",
    -  "version": "12.0.0",
    +  "version": "12.0.1",
       "description": "Library for updating an npmjs.com profile",
       "keywords": [],
       "author": "GitHub Inc.",
       "license": "ISC",
       "dependencies": {
         "npm-registry-fetch": "^19.0.0",
    -    "proc-log": "^5.0.0"
    +    "proc-log": "^6.0.0"
       },
       "main": "./lib/index.js",
       "repository": {
    @@ -20,7 +20,7 @@
       ],
       "devDependencies": {
         "@npmcli/eslint-config": "^5.0.0",
    -    "@npmcli/template-oss": "4.25.0",
    +    "@npmcli/template-oss": "4.27.1",
         "nock": "^13.5.6",
         "tap": "^16.0.1"
       },
    @@ -46,7 +46,7 @@
       },
       "templateOSS": {
         "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    -    "version": "4.25.0",
    +    "version": "4.27.1",
         "publish": true
       }
     }
    diff --git a/deps/npm/node_modules/npm-registry-fetch/lib/index.js b/deps/npm/node_modules/npm-registry-fetch/lib/index.js
    index 898c8125bfe0e1..91d450f245f05b 100644
    --- a/deps/npm/node_modules/npm-registry-fetch/lib/index.js
    +++ b/deps/npm/node_modules/npm-registry-fetch/lib/index.js
    @@ -130,6 +130,7 @@ function regFetch (uri, /* istanbul ignore next */ opts_ = {}) {
           },
           strictSSL: opts.strictSSL,
           timeout: opts.timeout || 30 * 1000,
    +      signal: opts.signal,
         }).then(res => checkResponse({
           method,
           uri,
    diff --git a/deps/npm/node_modules/npm-registry-fetch/package.json b/deps/npm/node_modules/npm-registry-fetch/package.json
    index a8e954cdf3c145..6f43ed70367962 100644
    --- a/deps/npm/node_modules/npm-registry-fetch/package.json
    +++ b/deps/npm/node_modules/npm-registry-fetch/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "npm-registry-fetch",
    -  "version": "19.0.0",
    +  "version": "19.1.1",
       "description": "Fetch-based http client for use with npm registry APIs",
       "main": "lib",
       "files": [
    @@ -31,22 +31,22 @@
       "author": "GitHub Inc.",
       "license": "ISC",
       "dependencies": {
    -    "@npmcli/redact": "^3.0.0",
    +    "@npmcli/redact": "^4.0.0",
         "jsonparse": "^1.3.1",
         "make-fetch-happen": "^15.0.0",
         "minipass": "^7.0.2",
    -    "minipass-fetch": "^4.0.0",
    +    "minipass-fetch": "^5.0.0",
         "minizlib": "^3.0.1",
         "npm-package-arg": "^13.0.0",
    -    "proc-log": "^5.0.0"
    +    "proc-log": "^6.0.0"
       },
       "devDependencies": {
    -    "@npmcli/eslint-config": "^5.0.0",
    -    "@npmcli/template-oss": "4.25.0",
    +    "@npmcli/eslint-config": "^6.0.0",
    +    "@npmcli/template-oss": "4.28.0",
         "cacache": "^20.0.0",
         "nock": "^13.2.4",
         "require-inject": "^1.4.4",
    -    "ssri": "^12.0.0",
    +    "ssri": "^13.0.0",
         "tap": "^16.0.1"
       },
       "tap": {
    @@ -62,7 +62,7 @@
       },
       "templateOSS": {
         "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    -    "version": "4.25.0",
    +    "version": "4.28.0",
         "publish": "true"
       }
     }
    diff --git a/deps/npm/node_modules/pacote/package.json b/deps/npm/node_modules/pacote/package.json
    index 3cc141a1047965..1837cd09ffc9ab 100644
    --- a/deps/npm/node_modules/pacote/package.json
    +++ b/deps/npm/node_modules/pacote/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "pacote",
    -  "version": "21.0.3",
    +  "version": "21.0.4",
       "description": "JavaScript package downloader",
       "author": "GitHub Inc.",
       "bin": {
    @@ -27,8 +27,8 @@
       },
       "devDependencies": {
         "@npmcli/arborist": "^9.0.2",
    -    "@npmcli/eslint-config": "^5.0.0",
    -    "@npmcli/template-oss": "4.23.4",
    +    "@npmcli/eslint-config": "^6.0.0",
    +    "@npmcli/template-oss": "4.28.0",
         "hosted-git-info": "^9.0.0",
         "mutate-fs": "^2.1.1",
         "nock": "^13.2.4",
    @@ -47,9 +47,9 @@
       ],
       "dependencies": {
         "@npmcli/git": "^7.0.0",
    -    "@npmcli/installed-package-contents": "^3.0.0",
    +    "@npmcli/installed-package-contents": "^4.0.0",
         "@npmcli/package-json": "^7.0.0",
    -    "@npmcli/promise-spawn": "^8.0.0",
    +    "@npmcli/promise-spawn": "^9.0.0",
         "@npmcli/run-script": "^10.0.0",
         "cacache": "^20.0.0",
         "fs-minipass": "^3.0.0",
    @@ -58,10 +58,10 @@
         "npm-packlist": "^10.0.1",
         "npm-pick-manifest": "^11.0.1",
         "npm-registry-fetch": "^19.0.0",
    -    "proc-log": "^5.0.0",
    +    "proc-log": "^6.0.0",
         "promise-retry": "^2.0.1",
         "sigstore": "^4.0.0",
    -    "ssri": "^12.0.0",
    +    "ssri": "^13.0.0",
         "tar": "^7.4.3"
       },
       "engines": {
    @@ -73,7 +73,7 @@
       },
       "templateOSS": {
         "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    -    "version": "4.23.4",
    +    "version": "4.28.0",
         "windowsCI": false,
         "publish": "true"
       }
    diff --git a/deps/npm/node_modules/parse-conflict-json/package.json b/deps/npm/node_modules/parse-conflict-json/package.json
    index 824ca8ed2bd145..1d4bc1021695a3 100644
    --- a/deps/npm/node_modules/parse-conflict-json/package.json
    +++ b/deps/npm/node_modules/parse-conflict-json/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "parse-conflict-json",
    -  "version": "4.0.0",
    +  "version": "5.0.1",
       "description": "Parse a JSON string that has git merge conflicts, resolving if possible",
       "author": "GitHub Inc.",
       "license": "ISC",
    @@ -24,11 +24,11 @@
       },
       "devDependencies": {
         "@npmcli/eslint-config": "^5.0.0",
    -    "@npmcli/template-oss": "4.23.3",
    +    "@npmcli/template-oss": "4.27.1",
         "tap": "^16.0.1"
       },
       "dependencies": {
    -    "json-parse-even-better-errors": "^4.0.0",
    +    "json-parse-even-better-errors": "^5.0.0",
         "just-diff": "^6.0.0",
         "just-diff-apply": "^5.2.0"
       },
    @@ -41,11 +41,11 @@
         "lib/"
       ],
       "engines": {
    -    "node": "^18.17.0 || >=20.5.0"
    +    "node": "^20.17.0 || >=22.9.0"
       },
       "templateOSS": {
         "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    -    "version": "4.23.3",
    +    "version": "4.27.1",
         "publish": true
       }
     }
    diff --git a/deps/npm/node_modules/proc-log/package.json b/deps/npm/node_modules/proc-log/package.json
    index 957209d3954e53..afa07dfd9b30d5 100644
    --- a/deps/npm/node_modules/proc-log/package.json
    +++ b/deps/npm/node_modules/proc-log/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "proc-log",
    -  "version": "5.0.0",
    +  "version": "6.0.0",
       "files": [
         "bin/",
         "lib/"
    @@ -26,15 +26,15 @@
       },
       "devDependencies": {
         "@npmcli/eslint-config": "^5.0.0",
    -    "@npmcli/template-oss": "4.23.3",
    +    "@npmcli/template-oss": "4.27.1",
         "tap": "^16.0.1"
       },
       "engines": {
    -    "node": "^18.17.0 || >=20.5.0"
    +    "node": "^20.17.0 || >=22.9.0"
       },
       "templateOSS": {
         "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    -    "version": "4.23.3",
    +    "version": "4.27.1",
         "publish": true
       },
       "tap": {
    diff --git a/deps/npm/node_modules/read-cmd-shim/package.json b/deps/npm/node_modules/read-cmd-shim/package.json
    index 3b16802df3ce21..d3ebc40e311bb7 100644
    --- a/deps/npm/node_modules/read-cmd-shim/package.json
    +++ b/deps/npm/node_modules/read-cmd-shim/package.json
    @@ -1,11 +1,11 @@
     {
       "name": "read-cmd-shim",
    -  "version": "5.0.0",
    +  "version": "6.0.0",
       "description": "Figure out what a cmd-shim is pointing at. This acts as the equivalent of fs.readlink.",
       "main": "lib/index.js",
       "devDependencies": {
         "@npmcli/eslint-config": "^5.0.0",
    -    "@npmcli/template-oss": "4.23.3",
    +    "@npmcli/template-oss": "4.27.1",
         "cmd-shim": "^7.0.0",
         "tap": "^16.0.1"
       },
    @@ -38,11 +38,11 @@
       ],
       "author": "GitHub Inc.",
       "engines": {
    -    "node": "^18.17.0 || >=20.5.0"
    +    "node": "^20.17.0 || >=22.9.0"
       },
       "templateOSS": {
         "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    -    "version": "4.23.3",
    +    "version": "4.27.1",
         "publish": true
       }
     }
    diff --git a/deps/npm/node_modules/ssri/lib/index.js b/deps/npm/node_modules/ssri/lib/index.js
    index 7d749ed480fb98..9acc4322612483 100644
    --- a/deps/npm/node_modules/ssri/lib/index.js
    +++ b/deps/npm/node_modules/ssri/lib/index.js
    @@ -9,7 +9,7 @@ const DEFAULT_ALGORITHMS = ['sha512']
     // TODO: this should really be a hardcoded list of algorithms we support,
     // rather than [a-z0-9].
     const BASE64_REGEX = /^[a-z0-9+/]+(?:=?=?)$/i
    -const SRI_REGEX = /^([a-z0-9]+)-([^?]+)([?\S*]*)$/
    +const SRI_REGEX = /^([a-z0-9]+)-([^?]+)(\?[?\S*]*)?$/
     const STRICT_SRI_REGEX = /^([a-z0-9]+)-([A-Za-z0-9+/=]{44,88})(\?[\x21-\x7E]*)?$/
     const VCHAR_REGEX = /^[\x21-\x7E]+$/
     
    diff --git a/deps/npm/node_modules/ssri/package.json b/deps/npm/node_modules/ssri/package.json
    index 83306cd044ec3c..8781bdf5f80c01 100644
    --- a/deps/npm/node_modules/ssri/package.json
    +++ b/deps/npm/node_modules/ssri/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "ssri",
    -  "version": "12.0.0",
    +  "version": "13.0.0",
       "description": "Standard Subresource Integrity library -- parses, serializes, generates, and verifies integrity metadata according to the SRI spec.",
       "main": "lib/index.js",
       "files": [
    @@ -52,15 +52,15 @@
       },
       "devDependencies": {
         "@npmcli/eslint-config": "^5.0.0",
    -    "@npmcli/template-oss": "4.23.3",
    +    "@npmcli/template-oss": "4.27.1",
         "tap": "^16.0.1"
       },
       "engines": {
    -    "node": "^18.17.0 || >=20.5.0"
    +    "node": "^20.17.0 || >=22.9.0"
       },
       "templateOSS": {
         "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    -    "version": "4.23.3",
    +    "version": "4.27.1",
         "publish": "true"
       }
     }
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/path-scurry/LICENSE.md b/deps/npm/node_modules/tar/LICENSE.md
    similarity index 100%
    rename from deps/npm/node_modules/node-gyp/node_modules/path-scurry/LICENSE.md
    rename to deps/npm/node_modules/tar/LICENSE.md
    diff --git a/deps/npm/node_modules/tar/dist/commonjs/header.js b/deps/npm/node_modules/tar/dist/commonjs/header.js
    index b3a48037b849ab..09d8a3dfa80daf 100644
    --- a/deps/npm/node_modules/tar/dist/commonjs/header.js
    +++ b/deps/npm/node_modules/tar/dist/commonjs/header.js
    @@ -68,12 +68,13 @@ class Header {
             if (!buf || !(buf.length >= off + 512)) {
                 throw new Error('need 512 bytes for header');
             }
    -        this.path = decString(buf, off, 100);
    -        this.mode = decNumber(buf, off + 100, 8);
    -        this.uid = decNumber(buf, off + 108, 8);
    -        this.gid = decNumber(buf, off + 116, 8);
    -        this.size = decNumber(buf, off + 124, 12);
    -        this.mtime = decDate(buf, off + 136, 12);
    +        this.path = ex?.path ?? decString(buf, off, 100);
    +        this.mode = ex?.mode ?? gex?.mode ?? decNumber(buf, off + 100, 8);
    +        this.uid = ex?.uid ?? gex?.uid ?? decNumber(buf, off + 108, 8);
    +        this.gid = ex?.gid ?? gex?.gid ?? decNumber(buf, off + 116, 8);
    +        this.size = ex?.size ?? gex?.size ?? decNumber(buf, off + 124, 12);
    +        this.mtime =
    +            ex?.mtime ?? gex?.mtime ?? decDate(buf, off + 136, 12);
             this.cksum = decNumber(buf, off + 148, 12);
             // if we have extended or global extended headers, apply them now
             // See https://github.com/npm/node-tar/pull/187
    @@ -101,11 +102,15 @@ class Header {
             this.linkpath = decString(buf, off + 157, 100);
             if (buf.subarray(off + 257, off + 265).toString() ===
                 'ustar\u000000') {
    -            this.uname = decString(buf, off + 265, 32);
    -            this.gname = decString(buf, off + 297, 32);
                 /* c8 ignore start */
    -            this.devmaj = decNumber(buf, off + 329, 8) ?? 0;
    -            this.devmin = decNumber(buf, off + 337, 8) ?? 0;
    +            this.uname =
    +                ex?.uname ?? gex?.uname ?? decString(buf, off + 265, 32);
    +            this.gname =
    +                ex?.gname ?? gex?.gname ?? decString(buf, off + 297, 32);
    +            this.devmaj =
    +                ex?.devmaj ?? gex?.devmaj ?? decNumber(buf, off + 329, 8) ?? 0;
    +            this.devmin =
    +                ex?.devmin ?? gex?.devmin ?? decNumber(buf, off + 337, 8) ?? 0;
                 /* c8 ignore stop */
                 if (buf[off + 475] !== 0) {
                     // definitely a prefix, definitely >130 chars.
    @@ -117,8 +122,12 @@ class Header {
                     if (prefix) {
                         this.path = prefix + '/' + this.path;
                     }
    -                this.atime = decDate(buf, off + 476, 12);
    -                this.ctime = decDate(buf, off + 488, 12);
    +                /* c8 ignore start */
    +                this.atime =
    +                    ex?.atime ?? gex?.atime ?? decDate(buf, off + 476, 12);
    +                this.ctime =
    +                    ex?.ctime ?? gex?.ctime ?? decDate(buf, off + 488, 12);
    +                /* c8 ignore stop */
                 }
             }
             let sum = 8 * 0x20;
    diff --git a/deps/npm/node_modules/tar/dist/commonjs/list.js b/deps/npm/node_modules/tar/dist/commonjs/list.js
    index 3bc56453f5ed6c..5efad803a4cf5a 100644
    --- a/deps/npm/node_modules/tar/dist/commonjs/list.js
    +++ b/deps/npm/node_modules/tar/dist/commonjs/list.js
    @@ -82,14 +82,16 @@ const listFileSync = (opt) => {
             const readSize = opt.maxReadSize || 16 * 1024 * 1024;
             if (stat.size < readSize) {
                 const buf = Buffer.allocUnsafe(stat.size);
    -            node_fs_1.default.readSync(fd, buf, 0, stat.size, 0);
    -            p.end(buf);
    +            const read = node_fs_1.default.readSync(fd, buf, 0, stat.size, 0);
    +            p.end(read === buf.byteLength ? buf : buf.subarray(0, read));
             }
             else {
                 let pos = 0;
                 const buf = Buffer.allocUnsafe(readSize);
                 while (pos < stat.size) {
                     const bytesRead = node_fs_1.default.readSync(fd, buf, 0, readSize, pos);
    +                if (bytesRead === 0)
    +                    break;
                     pos += bytesRead;
                     p.write(buf.subarray(0, bytesRead));
                 }
    diff --git a/deps/npm/node_modules/tar/dist/commonjs/pack.js b/deps/npm/node_modules/tar/dist/commonjs/pack.js
    index 07e921ca959bf5..237f368e5d2256 100644
    --- a/deps/npm/node_modules/tar/dist/commonjs/pack.js
    +++ b/deps/npm/node_modules/tar/dist/commonjs/pack.js
    @@ -135,7 +135,10 @@ class Pack extends minipass_1.Minipass {
             }
             this.portable = !!opt.portable;
             if (opt.gzip || opt.brotli || opt.zstd) {
    -            if ((opt.gzip ? 1 : 0) + (opt.brotli ? 1 : 0) + (opt.zstd ? 1 : 0) > 1) {
    +            if ((opt.gzip ? 1 : 0) +
    +                (opt.brotli ? 1 : 0) +
    +                (opt.zstd ? 1 : 0) >
    +                1) {
                     throw new TypeError('gzip, brotli, zstd are mutually exclusive');
                 }
                 if (opt.gzip) {
    diff --git a/deps/npm/node_modules/tar/dist/commonjs/parse.js b/deps/npm/node_modules/tar/dist/commonjs/parse.js
    index 372a917fc0e912..ef88ab35095270 100644
    --- a/deps/npm/node_modules/tar/dist/commonjs/parse.js
    +++ b/deps/npm/node_modules/tar/dist/commonjs/parse.js
    @@ -449,10 +449,8 @@ class Parser extends events_1.EventEmitter {
                     const ended = this[ENDED];
                     this[ENDED] = false;
                     this[UNZIP] =
    -                    this[UNZIP] === undefined ?
    -                        new minizlib_1.Unzip({})
    -                        : isZstd ?
    -                            new minizlib_1.ZstdDecompress({})
    +                    this[UNZIP] === undefined ? new minizlib_1.Unzip({})
    +                        : isZstd ? new minizlib_1.ZstdDecompress({})
                                 : new minizlib_1.BrotliDecompress({});
                     this[UNZIP].on('data', chunk => this[CONSUMECHUNK](chunk));
                     this[UNZIP].on('error', er => this.abort(er));
    diff --git a/deps/npm/node_modules/tar/dist/esm/header.js b/deps/npm/node_modules/tar/dist/esm/header.js
    index e15192b14b16e1..66db54527d838a 100644
    --- a/deps/npm/node_modules/tar/dist/esm/header.js
    +++ b/deps/npm/node_modules/tar/dist/esm/header.js
    @@ -42,12 +42,13 @@ export class Header {
             if (!buf || !(buf.length >= off + 512)) {
                 throw new Error('need 512 bytes for header');
             }
    -        this.path = decString(buf, off, 100);
    -        this.mode = decNumber(buf, off + 100, 8);
    -        this.uid = decNumber(buf, off + 108, 8);
    -        this.gid = decNumber(buf, off + 116, 8);
    -        this.size = decNumber(buf, off + 124, 12);
    -        this.mtime = decDate(buf, off + 136, 12);
    +        this.path = ex?.path ?? decString(buf, off, 100);
    +        this.mode = ex?.mode ?? gex?.mode ?? decNumber(buf, off + 100, 8);
    +        this.uid = ex?.uid ?? gex?.uid ?? decNumber(buf, off + 108, 8);
    +        this.gid = ex?.gid ?? gex?.gid ?? decNumber(buf, off + 116, 8);
    +        this.size = ex?.size ?? gex?.size ?? decNumber(buf, off + 124, 12);
    +        this.mtime =
    +            ex?.mtime ?? gex?.mtime ?? decDate(buf, off + 136, 12);
             this.cksum = decNumber(buf, off + 148, 12);
             // if we have extended or global extended headers, apply them now
             // See https://github.com/npm/node-tar/pull/187
    @@ -75,11 +76,15 @@ export class Header {
             this.linkpath = decString(buf, off + 157, 100);
             if (buf.subarray(off + 257, off + 265).toString() ===
                 'ustar\u000000') {
    -            this.uname = decString(buf, off + 265, 32);
    -            this.gname = decString(buf, off + 297, 32);
                 /* c8 ignore start */
    -            this.devmaj = decNumber(buf, off + 329, 8) ?? 0;
    -            this.devmin = decNumber(buf, off + 337, 8) ?? 0;
    +            this.uname =
    +                ex?.uname ?? gex?.uname ?? decString(buf, off + 265, 32);
    +            this.gname =
    +                ex?.gname ?? gex?.gname ?? decString(buf, off + 297, 32);
    +            this.devmaj =
    +                ex?.devmaj ?? gex?.devmaj ?? decNumber(buf, off + 329, 8) ?? 0;
    +            this.devmin =
    +                ex?.devmin ?? gex?.devmin ?? decNumber(buf, off + 337, 8) ?? 0;
                 /* c8 ignore stop */
                 if (buf[off + 475] !== 0) {
                     // definitely a prefix, definitely >130 chars.
    @@ -91,8 +96,12 @@ export class Header {
                     if (prefix) {
                         this.path = prefix + '/' + this.path;
                     }
    -                this.atime = decDate(buf, off + 476, 12);
    -                this.ctime = decDate(buf, off + 488, 12);
    +                /* c8 ignore start */
    +                this.atime =
    +                    ex?.atime ?? gex?.atime ?? decDate(buf, off + 476, 12);
    +                this.ctime =
    +                    ex?.ctime ?? gex?.ctime ?? decDate(buf, off + 488, 12);
    +                /* c8 ignore stop */
                 }
             }
             let sum = 8 * 0x20;
    diff --git a/deps/npm/node_modules/tar/dist/esm/list.js b/deps/npm/node_modules/tar/dist/esm/list.js
    index 489ece51b9fa30..a63a8841769a33 100644
    --- a/deps/npm/node_modules/tar/dist/esm/list.js
    +++ b/deps/npm/node_modules/tar/dist/esm/list.js
    @@ -52,14 +52,16 @@ const listFileSync = (opt) => {
             const readSize = opt.maxReadSize || 16 * 1024 * 1024;
             if (stat.size < readSize) {
                 const buf = Buffer.allocUnsafe(stat.size);
    -            fs.readSync(fd, buf, 0, stat.size, 0);
    -            p.end(buf);
    +            const read = fs.readSync(fd, buf, 0, stat.size, 0);
    +            p.end(read === buf.byteLength ? buf : buf.subarray(0, read));
             }
             else {
                 let pos = 0;
                 const buf = Buffer.allocUnsafe(readSize);
                 while (pos < stat.size) {
                     const bytesRead = fs.readSync(fd, buf, 0, readSize, pos);
    +                if (bytesRead === 0)
    +                    break;
                     pos += bytesRead;
                     p.write(buf.subarray(0, bytesRead));
                 }
    diff --git a/deps/npm/node_modules/tar/dist/esm/pack.js b/deps/npm/node_modules/tar/dist/esm/pack.js
    index 14661783455d5a..36dc28f8077d44 100644
    --- a/deps/npm/node_modules/tar/dist/esm/pack.js
    +++ b/deps/npm/node_modules/tar/dist/esm/pack.js
    @@ -105,7 +105,10 @@ export class Pack extends Minipass {
             }
             this.portable = !!opt.portable;
             if (opt.gzip || opt.brotli || opt.zstd) {
    -            if ((opt.gzip ? 1 : 0) + (opt.brotli ? 1 : 0) + (opt.zstd ? 1 : 0) > 1) {
    +            if ((opt.gzip ? 1 : 0) +
    +                (opt.brotli ? 1 : 0) +
    +                (opt.zstd ? 1 : 0) >
    +                1) {
                     throw new TypeError('gzip, brotli, zstd are mutually exclusive');
                 }
                 if (opt.gzip) {
    diff --git a/deps/npm/node_modules/tar/dist/esm/parse.js b/deps/npm/node_modules/tar/dist/esm/parse.js
    index a4e94433b09045..da52cd852731b9 100644
    --- a/deps/npm/node_modules/tar/dist/esm/parse.js
    +++ b/deps/npm/node_modules/tar/dist/esm/parse.js
    @@ -446,10 +446,8 @@ export class Parser extends EE {
                     const ended = this[ENDED];
                     this[ENDED] = false;
                     this[UNZIP] =
    -                    this[UNZIP] === undefined ?
    -                        new Unzip({})
    -                        : isZstd ?
    -                            new ZstdDecompress({})
    +                    this[UNZIP] === undefined ? new Unzip({})
    +                        : isZstd ? new ZstdDecompress({})
                                 : new BrotliDecompress({});
                     this[UNZIP].on('data', chunk => this[CONSUMECHUNK](chunk));
                     this[UNZIP].on('error', er => this.abort(er));
    diff --git a/deps/npm/node_modules/tar/package.json b/deps/npm/node_modules/tar/package.json
    index be0f1e8fd8000f..27368e26b25531 100644
    --- a/deps/npm/node_modules/tar/package.json
    +++ b/deps/npm/node_modules/tar/package.json
    @@ -2,7 +2,7 @@
       "author": "Isaac Z. Schlueter",
       "name": "tar",
       "description": "tar for node",
    -  "version": "7.5.1",
    +  "version": "7.5.2",
       "repository": {
         "type": "git",
         "url": "https://github.com/isaacs/node-tar.git"
    @@ -40,7 +40,7 @@
         "tshy": "^1.13.1",
         "typedoc": "^0.25.13"
       },
    -  "license": "ISC",
    +  "license": "BlueOak-1.0.0",
       "engines": {
         "node": ">=18"
       },
    diff --git a/deps/npm/node_modules/validate-npm-package-name/package.json b/deps/npm/node_modules/validate-npm-package-name/package.json
    index e5162f847fe538..87204aaf663982 100644
    --- a/deps/npm/node_modules/validate-npm-package-name/package.json
    +++ b/deps/npm/node_modules/validate-npm-package-name/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "validate-npm-package-name",
    -  "version": "6.0.2",
    +  "version": "7.0.0",
       "description": "Give me a string and I'll tell you if it's a valid npm package name",
       "main": "lib/",
       "directories": {
    @@ -8,7 +8,7 @@
       },
       "devDependencies": {
         "@npmcli/eslint-config": "^5.0.0",
    -    "@npmcli/template-oss": "4.25.0",
    +    "@npmcli/template-oss": "4.27.1",
         "tap": "^16.0.1"
       },
       "scripts": {
    @@ -45,11 +45,11 @@
         "lib/"
       ],
       "engines": {
    -    "node": "^18.17.0 || >=20.5.0"
    +    "node": "^20.17.0 || >=22.9.0"
       },
       "templateOSS": {
         "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    -    "version": "4.25.0",
    +    "version": "4.27.1",
         "publish": true
       },
       "tap": {
    diff --git a/deps/npm/node_modules/which/package.json b/deps/npm/node_modules/which/package.json
    index 94184233c61c4c..915dc4bd27c3a1 100644
    --- a/deps/npm/node_modules/which/package.json
    +++ b/deps/npm/node_modules/which/package.json
    @@ -2,7 +2,7 @@
       "author": "GitHub Inc.",
       "name": "which",
       "description": "Like which(1) unix command. Find the first instance of an executable in the PATH.",
    -  "version": "5.0.0",
    +  "version": "6.0.0",
       "repository": {
         "type": "git",
         "url": "git+https://github.com/npm/node-which.git"
    @@ -17,7 +17,7 @@
       },
       "devDependencies": {
         "@npmcli/eslint-config": "^5.0.0",
    -    "@npmcli/template-oss": "4.23.3",
    +    "@npmcli/template-oss": "4.27.1",
         "tap": "^16.3.0"
       },
       "scripts": {
    @@ -42,11 +42,11 @@
         ]
       },
       "engines": {
    -    "node": "^18.17.0 || >=20.5.0"
    +    "node": "^20.17.0 || >=22.9.0"
       },
       "templateOSS": {
         "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    -    "version": "4.23.3",
    +    "version": "4.27.1",
         "publish": "true"
       }
     }
    diff --git a/deps/npm/node_modules/write-file-atomic/package.json b/deps/npm/node_modules/write-file-atomic/package.json
    index 1e88b5b889ec95..c72d839f0e6611 100644
    --- a/deps/npm/node_modules/write-file-atomic/package.json
    +++ b/deps/npm/node_modules/write-file-atomic/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "write-file-atomic",
    -  "version": "6.0.0",
    +  "version": "7.0.0",
       "description": "Write files in an atomic fashion w/configurable ownership",
       "main": "./lib/index.js",
       "scripts": {
    @@ -33,7 +33,7 @@
       },
       "devDependencies": {
         "@npmcli/eslint-config": "^5.0.0",
    -    "@npmcli/template-oss": "4.23.3",
    +    "@npmcli/template-oss": "4.27.1",
         "tap": "^16.0.1"
       },
       "files": [
    @@ -41,12 +41,12 @@
         "lib/"
       ],
       "engines": {
    -    "node": "^18.17.0 || >=20.5.0"
    +    "node": "^20.17.0 || >=22.9.0"
       },
       "templateOSS": {
         "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
         "windowsCI": false,
    -    "version": "4.23.3",
    +    "version": "4.27.1",
         "publish": "true"
       },
       "tap": {
    diff --git a/deps/npm/package.json b/deps/npm/package.json
    index ba3441726b01cb..5f0d88f4582ad1 100644
    --- a/deps/npm/package.json
    +++ b/deps/npm/package.json
    @@ -1,5 +1,5 @@
     {
    -  "version": "11.6.2",
    +  "version": "11.6.3",
       "name": "npm",
       "description": "a package manager for JavaScript",
       "workspaces": [
    @@ -52,18 +52,19 @@
       },
       "dependencies": {
         "@isaacs/string-locale-compare": "^1.1.0",
    -    "@npmcli/arborist": "^9.1.6",
    -    "@npmcli/config": "^10.4.2",
    +    "@npmcli/arborist": "^9.1.7",
    +    "@npmcli/config": "^10.4.3",
         "@npmcli/fs": "^4.0.0",
    -    "@npmcli/map-workspaces": "^5.0.0",
    -    "@npmcli/package-json": "^7.0.1",
    -    "@npmcli/promise-spawn": "^8.0.3",
    -    "@npmcli/redact": "^3.2.2",
    -    "@npmcli/run-script": "^10.0.0",
    +    "@npmcli/map-workspaces": "^5.0.1",
    +    "@npmcli/metavuln-calculator": "^9.0.3",
    +    "@npmcli/package-json": "^7.0.2",
    +    "@npmcli/promise-spawn": "^9.0.1",
    +    "@npmcli/redact": "^4.0.0",
    +    "@npmcli/run-script": "^10.0.3",
         "@sigstore/tuf": "^4.0.0",
    -    "abbrev": "^3.0.1",
    +    "abbrev": "^4.0.0",
         "archy": "~1.0.0",
    -    "cacache": "^20.0.1",
    +    "cacache": "^20.0.2",
         "chalk": "^5.6.2",
         "ci-info": "^4.3.1",
         "cli-columns": "^4.0.0",
    @@ -72,50 +73,50 @@
         "glob": "^11.0.3",
         "graceful-fs": "^4.2.11",
         "hosted-git-info": "^9.0.2",
    -    "ini": "^5.0.0",
    -    "init-package-json": "^8.2.2",
    +    "ini": "^6.0.0",
    +    "init-package-json": "^8.2.3",
         "is-cidr": "^6.0.1",
    -    "json-parse-even-better-errors": "^4.0.0",
    +    "json-parse-even-better-errors": "^5.0.0",
         "libnpmaccess": "^10.0.3",
    -    "libnpmdiff": "^8.0.9",
    -    "libnpmexec": "^10.1.8",
    -    "libnpmfund": "^7.0.9",
    +    "libnpmdiff": "^8.0.10",
    +    "libnpmexec": "^10.1.9",
    +    "libnpmfund": "^7.0.10",
         "libnpmorg": "^8.0.1",
    -    "libnpmpack": "^9.0.9",
    -    "libnpmpublish": "^11.1.2",
    +    "libnpmpack": "^9.0.10",
    +    "libnpmpublish": "^11.1.3",
         "libnpmsearch": "^9.0.1",
         "libnpmteam": "^8.0.2",
    -    "libnpmversion": "^8.0.2",
    -    "make-fetch-happen": "^15.0.2",
    -    "minimatch": "^10.0.3",
    +    "libnpmversion": "^8.0.3",
    +    "make-fetch-happen": "^15.0.3",
    +    "minimatch": "^10.1.1",
         "minipass": "^7.1.1",
         "minipass-pipeline": "^1.2.4",
         "ms": "^2.1.2",
    -    "node-gyp": "^11.4.2",
    -    "nopt": "^8.1.0",
    +    "node-gyp": "^12.1.0",
    +    "nopt": "^9.0.0",
         "npm-audit-report": "^6.0.0",
    -    "npm-install-checks": "^7.1.2",
    -    "npm-package-arg": "^13.0.1",
    -    "npm-pick-manifest": "^11.0.1",
    -    "npm-profile": "^12.0.0",
    -    "npm-registry-fetch": "^19.0.0",
    +    "npm-install-checks": "^8.0.0",
    +    "npm-package-arg": "^13.0.2",
    +    "npm-pick-manifest": "^11.0.3",
    +    "npm-profile": "^12.0.1",
    +    "npm-registry-fetch": "^19.1.1",
         "npm-user-validate": "^3.0.0",
         "p-map": "^7.0.3",
    -    "pacote": "^21.0.3",
    -    "parse-conflict-json": "^4.0.0",
    -    "proc-log": "^5.0.0",
    +    "pacote": "^21.0.4",
    +    "parse-conflict-json": "^5.0.1",
    +    "proc-log": "^6.0.0",
         "qrcode-terminal": "^0.12.0",
         "read": "^4.1.0",
         "semver": "^7.7.3",
         "spdx-expression-parse": "^4.0.0",
    -    "ssri": "^12.0.0",
    +    "ssri": "^13.0.0",
         "supports-color": "^10.2.2",
    -    "tar": "^7.5.1",
    +    "tar": "^7.5.2",
         "text-table": "~0.2.0",
         "tiny-relative-date": "^2.0.2",
         "treeverse": "^3.0.0",
    -    "validate-npm-package-name": "^6.0.2",
    -    "which": "^5.0.0"
    +    "validate-npm-package-name": "^7.0.0",
    +    "which": "^6.0.0"
       },
       "bundleDependencies": [
         "@isaacs/string-locale-compare",
    @@ -123,6 +124,7 @@
         "@npmcli/config",
         "@npmcli/fs",
         "@npmcli/map-workspaces",
    +    "@npmcli/metavuln-calculator",
         "@npmcli/package-json",
         "@npmcli/promise-spawn",
         "@npmcli/redact",
    @@ -187,7 +189,7 @@
       "devDependencies": {
         "@npmcli/docs": "^1.0.0",
         "@npmcli/eslint-config": "^5.1.0",
    -    "@npmcli/git": "^7.0.0",
    +    "@npmcli/git": "^7.0.1",
         "@npmcli/mock-globals": "^1.0.0",
         "@npmcli/mock-registry": "^1.0.0",
         "@npmcli/template-oss": "4.25.1",
    @@ -198,7 +200,7 @@
         "cli-table3": "^0.6.4",
         "diff": "^8.0.2",
         "nock": "^13.4.0",
    -    "npm-packlist": "^10.0.2",
    +    "npm-packlist": "^10.0.3",
         "remark": "^15.0.1",
         "remark-gfm": "^4.0.1",
         "remark-github": "^12.0.0",
    diff --git a/deps/npm/tap-snapshots/test/lib/commands/config.js.test.cjs b/deps/npm/tap-snapshots/test/lib/commands/config.js.test.cjs
    index bc0f406166a9fe..ca6bf25c81fb01 100644
    --- a/deps/npm/tap-snapshots/test/lib/commands/config.js.test.cjs
    +++ b/deps/npm/tap-snapshots/test/lib/commands/config.js.test.cjs
    @@ -23,6 +23,7 @@ exports[`test/lib/commands/config.js TAP config list --json > output matches sna
       "before": null,
       "bin-links": true,
       "browser": null,
    +  "bypass-2fa": false,
       "ca": null,
       "cache-max": null,
       "cache-min": 0,
    @@ -48,6 +49,7 @@ exports[`test/lib/commands/config.js TAP config list --json > output matches sna
       "engine-strict": false,
       "expect-result-count": null,
       "expect-results": null,
    +  "expires": null,
       "fetch-retries": 2,
       "fetch-retry-factor": 10,
       "fetch-retry-maxtimeout": 60000,
    @@ -97,6 +99,7 @@ exports[`test/lib/commands/config.js TAP config list --json > output matches sna
       "logs-dir": null,
       "logs-max": 10,
       "long": false,
    +  "name": null,
       "maxsockets": 15,
       "message": "%s",
       "node-gyp": "{CWD}/node_modules/node-gyp/bin/node-gyp.js",
    @@ -108,6 +111,7 @@ exports[`test/lib/commands/config.js TAP config list --json > output matches sna
       "omit": [],
       "omit-lockfile-registry-resolved": false,
       "only": null,
    +  "orgs": null,
       "optional": null,
       "os": null,
       "otp": null,
    @@ -115,6 +119,7 @@ exports[`test/lib/commands/config.js TAP config list --json > output matches sna
       "package-lock": true,
       "package-lock-only": false,
       "pack-destination": ".",
    +  "packages": [],
       "parseable": false,
       "prefer-dedupe": false,
       "prefer-offline": false,
    @@ -141,6 +146,11 @@ exports[`test/lib/commands/config.js TAP config list --json > output matches sna
       "sbom-format": null,
       "sbom-type": "library",
       "scope": "",
    +  "scopes": null,
    +  "packages-all": false,
    +  "packages-and-scopes-permission": null,
    +  "orgs-permission": null,
    +  "token-description": null,
       "script-shell": null,
       "searchexclude": "",
       "searchlimit": 20,
    @@ -187,6 +197,7 @@ auth-type = "web"
     before = null
     bin-links = true
     browser = null
    +bypass-2fa = false
     ca = null
     ; cache = "{CACHE}" ; overridden by cli
     cache-max = null
    @@ -214,6 +225,7 @@ editor = "{EDITOR}"
     engine-strict = false
     expect-result-count = null
     expect-results = null
    +expires = null
     fetch-retries = 2
     fetch-retry-factor = 10
     fetch-retry-maxtimeout = 60000
    @@ -266,6 +278,7 @@ logs-max = 10
     ; long = false ; overridden by cli
     maxsockets = 15
     message = "%s"
    +name = null
     node-gyp = "{CWD}/node_modules/node-gyp/bin/node-gyp.js"
     node-options = null
     noproxy = [""]
    @@ -275,13 +288,19 @@ omit = []
     omit-lockfile-registry-resolved = false
     only = null
     optional = null
    +orgs = null
    +orgs-permission = null
     os = null
     otp = null
     pack-destination = "."
     package = []
     package-lock = true
     package-lock-only = false
    +packages = []
    +packages-all = false
    +packages-and-scopes-permission = null
     parseable = false
    +password = (protected)
     prefer-dedupe = false
     prefer-offline = false
     prefer-online = false
    @@ -307,6 +326,7 @@ save-prod = false
     sbom-format = null
     sbom-type = "library"
     scope = ""
    +scopes = null
     script-shell = null
     searchexclude = ""
     searchlimit = 20
    @@ -321,6 +341,7 @@ strict-ssl = true
     tag = "latest"
     tag-version-prefix = "v"
     timing = false
    +token-description = null
     umask = 0
     unicode = false
     update-notifier = true
    diff --git a/deps/npm/tap-snapshots/test/lib/commands/ls.js.test.cjs b/deps/npm/tap-snapshots/test/lib/commands/ls.js.test.cjs
    index 175d85f9c07eec..7381a4d2f2f0bb 100644
    --- a/deps/npm/tap-snapshots/test/lib/commands/ls.js.test.cjs
    +++ b/deps/npm/tap-snapshots/test/lib/commands/ls.js.test.cjs
    @@ -9,7 +9,9 @@ exports[`test/lib/commands/ls.js TAP ignore missing optional deps --json > ls --
     Array [
       "invalid: optional-wrong@3.2.1 {CWD}/prefix/node_modules/optional-wrong",
       "missing: peer-missing@1, required by test-npm-ls-ignore-missing-optional@1.2.3",
    +  "extraneous: peer-optional-ok@1.2.3 {CWD}/prefix/node_modules/peer-optional-ok",
       "invalid: peer-optional-wrong@3.2.1 {CWD}/prefix/node_modules/peer-optional-wrong",
    +  "extraneous: peer-optional-wrong@3.2.1 {CWD}/prefix/node_modules/peer-optional-wrong",
       "invalid: peer-wrong@3.2.1 {CWD}/prefix/node_modules/peer-wrong",
       "missing: prod-missing@1, required by test-npm-ls-ignore-missing-optional@1.2.3",
       "invalid: prod-wrong@3.2.1 {CWD}/prefix/node_modules/prod-wrong",
    @@ -36,8 +38,8 @@ test-npm-ls-ignore-missing-optional@1.2.3 {CWD}/prefix
     +-- UNMET DEPENDENCY peer-missing@1
     +-- peer-ok@1.2.3
     +-- UNMET OPTIONAL DEPENDENCY peer-optional-missing@1
    -+-- peer-optional-ok@1.2.3
    -+-- peer-optional-wrong@3.2.1 invalid: "1" from the root project
    ++-- peer-optional-ok@1.2.3 extraneous
    ++-- peer-optional-wrong@3.2.1 invalid: "1" from the root project extraneous
     +-- peer-wrong@3.2.1 invalid: "1" from the root project
     +-- UNMET DEPENDENCY prod-missing@1
     +-- prod-ok@1.2.3
    diff --git a/deps/npm/tap-snapshots/test/lib/docs.js.test.cjs b/deps/npm/tap-snapshots/test/lib/docs.js.test.cjs
    index 5aa26c15fe95e3..61f87de74e4015 100644
    --- a/deps/npm/tap-snapshots/test/lib/docs.js.test.cjs
    +++ b/deps/npm/tap-snapshots/test/lib/docs.js.test.cjs
    @@ -302,6 +302,17 @@ Set to \`true\` to use default system URL opener.
     
     
     
    +#### \`bypass-2fa\`
    +
    +* Default: false
    +* Type: Boolean
    +
    +When creating a Granular Access Token with \`npm token create\`, setting this
    +to true will allow the token to bypass two-factor authentication. This is
    +useful for automation and CI/CD workflows.
    +
    +
    +
     #### \`ca\`
     
     * Default: null
    @@ -556,6 +567,17 @@ true (expect some results) or false (expect no results).
     
     This config cannot be used with: \`expect-result-count\`
     
    +#### \`expires\`
    +
    +* Default: null
    +* Type: null or Number
    +
    +When creating a Granular Access Token with \`npm token create\`, this sets the
    +expiration in days. If not specified, the server will determine the default
    +expiration.
    +
    +
    +
     #### \`fetch-retries\`
     
     * Default: 2
    @@ -1081,6 +1103,16 @@ Any "%s" in the message will be replaced with the version number.
     
     
     
    +#### \`name\`
    +
    +* Default: null
    +* Type: null or String
    +
    +When creating a Granular Access Token with \`npm token create\`, this sets the
    +name/description for the token.
    +
    +
    +
     #### \`node-gyp\`
     
     * Default: The path to the node-gyp bin that ships with npm
    @@ -1158,6 +1190,28 @@ time.
     
     
     
    +#### \`orgs\`
    +
    +* Default: null
    +* Type: null or String (can be set multiple times)
    +
    +When creating a Granular Access Token with \`npm token create\`, this limits
    +the token access to specific organizations. Provide a comma-separated list
    +of organization names.
    +
    +
    +
    +#### \`orgs-permission\`
    +
    +* Default: null
    +* Type: null, "read-only", "read-write", or "no-access"
    +
    +When creating a Granular Access Token with \`npm token create\`, sets the
    +permission level for organizations. Options are "read-only", "read-write",
    +or "no-access".
    +
    +
    +
     #### \`os\`
     
     * Default: null
    @@ -1225,6 +1279,38 @@ For \`list\` this means the output will be based on the tree described by the
     
     
     
    +#### \`packages\`
    +
    +* Default:
    +* Type: null or String (can be set multiple times)
    +
    +When creating a Granular Access Token with \`npm token create\`, this limits
    +the token access to specific packages. Provide a comma-separated list of
    +package names.
    +
    +
    +
    +#### \`packages-all\`
    +
    +* Default: false
    +* Type: Boolean
    +
    +When creating a Granular Access Token with \`npm token create\`, grants the
    +token access to all packages instead of limiting to specific packages.
    +
    +
    +
    +#### \`packages-and-scopes-permission\`
    +
    +* Default: null
    +* Type: null, "read-only", "read-write", or "no-access"
    +
    +When creating a Granular Access Token with \`npm token create\`, sets the
    +permission level for packages and scopes. Options are "read-only",
    +"read-write", or "no-access".
    +
    +
    +
     #### \`parseable\`
     
     * Default: false
    @@ -1235,6 +1321,16 @@ Output parseable results from commands that write to standard output. For
     
     
     
    +#### \`password\`
    +
    +* Default: null
    +* Type: null or String
    +
    +Password for authentication. Can be provided via command line when creating
    +tokens, though it's generally safer to be prompted for it.
    +
    +
    +
     #### \`prefer-dedupe\`
     
     * Default: false
    @@ -1520,6 +1616,17 @@ npm init --scope=@foo --yes
     
     
     
    +#### \`scopes\`
    +
    +* Default: null
    +* Type: null or String (can be set multiple times)
    +
    +When creating a Granular Access Token with \`npm token create\`, this limits
    +the token access to specific scopes. Provide a comma-separated list of scope
    +names (with or without @ prefix).
    +
    +
    +
     #### \`script-shell\`
     
     * Default: '/bin/sh' on POSIX systems, 'cmd.exe' on Windows
    @@ -1687,6 +1794,15 @@ while still writing the timing file, use \`--silent\`.
     
     
     
    +#### \`token-description\`
    +
    +* Default: null
    +* Type: null or String
    +
    +Description text for the token when using \`npm token create\`.
    +
    +
    +
     #### \`umask\`
     
     * Default: 0
    @@ -2103,6 +2219,7 @@ Array [
       "before",
       "bin-links",
       "browser",
    +  "bypass-2fa",
       "ca",
       "cache",
       "cache-max",
    @@ -2130,6 +2247,7 @@ Array [
       "engine-strict",
       "expect-result-count",
       "expect-results",
    +  "expires",
       "fetch-retries",
       "fetch-retry-factor",
       "fetch-retry-maxtimeout",
    @@ -2180,6 +2298,7 @@ Array [
       "logs-dir",
       "logs-max",
       "long",
    +  "name",
       "maxsockets",
       "message",
       "node-gyp",
    @@ -2189,6 +2308,7 @@ Array [
       "omit",
       "omit-lockfile-registry-resolved",
       "only",
    +  "orgs",
       "optional",
       "os",
       "otp",
    @@ -2196,6 +2316,7 @@ Array [
       "package-lock",
       "package-lock-only",
       "pack-destination",
    +  "packages",
       "parseable",
       "prefer-dedupe",
       "prefer-offline",
    @@ -2222,6 +2343,12 @@ Array [
       "sbom-format",
       "sbom-type",
       "scope",
    +  "scopes",
    +  "packages-all",
    +  "packages-and-scopes-permission",
    +  "orgs-permission",
    +  "password",
    +  "token-description",
       "script-shell",
       "searchexclude",
       "searchlimit",
    @@ -2266,6 +2393,7 @@ Array [
       "before",
       "bin-links",
       "browser",
    +  "bypass-2fa",
       "ca",
       "cache",
       "cache-max",
    @@ -2291,6 +2419,7 @@ Array [
       "dry-run",
       "editor",
       "engine-strict",
    +  "expires",
       "fetch-retries",
       "fetch-retry-factor",
       "fetch-retry-maxtimeout",
    @@ -2324,6 +2453,7 @@ Array [
       "location",
       "lockfile-version",
       "loglevel",
    +  "name",
       "maxsockets",
       "message",
       "node-gyp",
    @@ -2332,6 +2462,7 @@ Array [
       "omit",
       "omit-lockfile-registry-resolved",
       "only",
    +  "orgs",
       "optional",
       "os",
       "otp",
    @@ -2339,6 +2470,7 @@ Array [
       "package-lock",
       "package-lock-only",
       "pack-destination",
    +  "packages",
       "parseable",
       "prefer-dedupe",
       "prefer-offline",
    @@ -2364,6 +2496,12 @@ Array [
       "sbom-format",
       "sbom-type",
       "scope",
    +  "scopes",
    +  "packages-all",
    +  "packages-and-scopes-permission",
    +  "orgs-permission",
    +  "password",
    +  "token-description",
       "script-shell",
       "searchexclude",
       "searchlimit",
    @@ -2433,6 +2571,7 @@ Object {
       "before": null,
       "binLinks": true,
       "browser": null,
    +  "bypass-2fa": false,
       "ca": null,
       "cache": "{CWD}/cache/_cacache",
       "call": "",
    @@ -2454,6 +2593,7 @@ Object {
       "dryRun": false,
       "editor": "{EDITOR}",
       "engineStrict": false,
    +  "expires": null,
       "force": false,
       "foregroundScripts": false,
       "formatPackageLock": true,
    @@ -2481,6 +2621,7 @@ Object {
       "logColor": false,
       "maxSockets": 15,
       "message": "%s",
    +  "name": null,
       "nodeBin": "{NODE}",
       "nodeGyp": "{CWD}/node_modules/node-gyp/bin/node-gyp.js",
       "nodeVersion": "2.2.2",
    @@ -2492,13 +2633,19 @@ Object {
       "offline": false,
       "omit": Array [],
       "omitLockfileRegistryResolved": false,
    +  "orgs": null,
    +  "orgsPermission": null,
       "os": null,
       "otp": null,
       "package": Array [],
       "packageLock": true,
       "packageLockOnly": false,
    +  "packages": Array [],
    +  "packagesAll": false,
    +  "packagesAndScopesPermission": null,
       "packDestination": ".",
       "parseable": false,
    +  "password": null,
       "preferDedupe": false,
       "preferOffline": false,
       "preferOnline": false,
    @@ -2524,6 +2671,7 @@ Object {
       "sbomFormat": null,
       "sbomType": "library",
       "scope": "",
    +  "scopes": null,
       "scriptShell": undefined,
       "search": Object {
         "description": true,
    @@ -2540,6 +2688,7 @@ Object {
       "strictSSL": true,
       "tagVersionPrefix": "v",
       "timeout": 300000,
    +  "tokenDescription": null,
       "tufCache": "{CWD}/cache/_tuf",
       "umask": 0,
       "unicode": false,
    @@ -4308,26 +4457,43 @@ Manage your authentication tokens
     Usage:
     npm token list
     npm token revoke 
    -npm token create [--read-only] [--cidr=list]
    +npm token create --name= [--token-description=] [--packages=] [--packages-all] [--scopes=] [--orgs=] [--packages-and-scopes-permission=] [--orgs-permission=] [--expires=] [--cidr=] [--bypass-2fa] [--password=]
     
     Options:
    -[--read-only] [--cidr  [--cidr  ...]] [--registry ]
    -[--otp ]
    +[--name ] [--token-description ] [--expires ]
    +[--packages  [--packages  ...]] [--packages-all]
    +[--scopes <@scope1,@scope2> [--scopes <@scope1,@scope2> ...]]
    +[--orgs  [--orgs  ...]]
    +[--packages-and-scopes-permission ]
    +[--orgs-permission ]
    +[--cidr  [--cidr  ...]] [--bypass-2fa] [--password ]
    +[--registry ] [--otp ] [--read-only]
     
     Run "npm help token" for more info
     
     \`\`\`bash
     npm token list
     npm token revoke 
    -npm token create [--read-only] [--cidr=list]
    +npm token create --name= [--token-description=] [--packages=] [--packages-all] [--scopes=] [--orgs=] [--packages-and-scopes-permission=] [--orgs-permission=] [--expires=] [--cidr=] [--bypass-2fa] [--password=]
     \`\`\`
     
     Note: This command is unaware of workspaces.
     
    -#### \`read-only\`
    +#### \`name\`
    +#### \`token-description\`
    +#### \`expires\`
    +#### \`packages\`
    +#### \`packages-all\`
    +#### \`scopes\`
    +#### \`orgs\`
    +#### \`packages-and-scopes-permission\`
    +#### \`orgs-permission\`
     #### \`cidr\`
    +#### \`bypass-2fa\`
    +#### \`password\`
     #### \`registry\`
     #### \`otp\`
    +#### \`read-only\`
     `
     
     exports[`test/lib/docs.js TAP usage undeprecate > must match snapshot 1`] = `
    @@ -4486,8 +4652,10 @@ npm version [ | major | minor | patch | premajor | preminor | prepat
     Options:
     [--allow-same-version] [--no-commit-hooks] [--no-git-tag-version] [--json]
     [--preid prerelease-id] [--sign-git-tag]
    +[-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer|--save-bundle]
     [-w|--workspace  [-w|--workspace  ...]]
     [--workspaces] [--no-workspaces-update] [--include-workspace-root]
    +[--ignore-scripts]
     
     alias: verison
     
    @@ -4505,10 +4673,12 @@ alias: verison
     #### \`json\`
     #### \`preid\`
     #### \`sign-git-tag\`
    +#### \`save\`
     #### \`workspace\`
     #### \`workspaces\`
     #### \`workspaces-update\`
     #### \`include-workspace-root\`
    +#### \`ignore-scripts\`
     `
     
     exports[`test/lib/docs.js TAP usage view > must match snapshot 1`] = `
    diff --git a/deps/npm/tap-snapshots/test/lib/utils/error-message.js.test.cjs b/deps/npm/tap-snapshots/test/lib/utils/error-message.js.test.cjs
    index 22c4ba598a86be..b98388c269c7e6 100644
    --- a/deps/npm/tap-snapshots/test/lib/utils/error-message.js.test.cjs
    +++ b/deps/npm/tap-snapshots/test/lib/utils/error-message.js.test.cjs
    @@ -222,7 +222,7 @@ Object {
           String(
             Not compatible with your version of node/npm: some@package
             Required: undefined
    -        Actual:   {"npm":"123.456.789-npm","node":"123.456.789-node"}
    +        Actual:   {"node":"123.456.789-node","npm":"123.456.789-npm"}
           ),
         ],
       ],
    @@ -1202,7 +1202,7 @@ Object {
           String(
             Not compatible with your version of node/npm: some@package
             Required: undefined
    -        Actual:   {"npm":"123.456.789-npm","node":"123.456.789-node"}
    +        Actual:   {"node":"123.456.789-node","npm":"123.456.789-npm"}
           ),
         ],
       ],
    diff --git a/deps/npm/test/lib/commands/token.js b/deps/npm/test/lib/commands/token.js
    index f60a938b5b34b3..76ffc4f7da80eb 100644
    --- a/deps/npm/test/lib/commands/token.js
    +++ b/deps/npm/test/lib/commands/token.js
    @@ -1,11 +1,8 @@
     const t = require('tap')
     const { load: loadMockNpm } = require('../../fixtures/mock-npm.js')
     const MockRegistry = require('@npmcli/mock-registry')
    -const mockGlobals = require('@npmcli/mock-globals')
    -const stream = require('node:stream')
     
     const authToken = 'abcd1234'
    -const password = 'this is not really a password'
     
     const auth = {
       '//registry.npmjs.org/:_authToken': authToken,
    @@ -113,7 +110,7 @@ t.test('token list parseable output', async t => {
       ])
     })
     
    -t.test('token revoke', async t => {
    +t.test('token revoke single', async t => {
       const { npm, joinedOutput } = await loadMockNpm(t, {
         config: { ...auth },
       })
    @@ -124,13 +121,13 @@ t.test('token revoke', async t => {
       })
     
       registry.getTokens(tokens)
    -  registry.nock.delete(`/-/npm/v1/tokens/token/${tokens[0].key}`).reply(200)
    +  registry.revokeToken(tokens[0].key)
       await npm.exec('token', ['rm', tokens[0].key.slice(0, 8)])
     
       t.equal(joinedOutput(), 'Removed 1 token')
     })
     
    -t.test('token revoke multiple tokens', async t => {
    +t.test('token revoke multiple', async t => {
       const { npm, joinedOutput } = await loadMockNpm(t, {
         config: { ...auth },
       })
    @@ -141,8 +138,8 @@ t.test('token revoke multiple tokens', async t => {
       })
     
       registry.getTokens(tokens)
    -  registry.nock.delete(`/-/npm/v1/tokens/token/${tokens[0].key}`).reply(200)
    -  registry.nock.delete(`/-/npm/v1/tokens/token/${tokens[1].key}`).reply(200)
    +  registry.revokeToken(tokens[0].key)
    +  registry.revokeToken(tokens[1].key)
       await npm.exec('token', ['rm', tokens[0].key.slice(0, 8), tokens[1].key.slice(0, 8)])
     
       t.equal(joinedOutput(), 'Removed 2 tokens')
    @@ -162,7 +159,7 @@ t.test('token revoke json output', async t => {
       })
     
       registry.getTokens(tokens)
    -  registry.nock.delete(`/-/npm/v1/tokens/token/${tokens[0].key}`).reply(200)
    +  registry.revokeToken(tokens[0].key)
       await npm.exec('token', ['rm', tokens[0].key.slice(0, 8)])
     
       const parsed = JSON.parse(joinedOutput())
    @@ -183,7 +180,7 @@ t.test('token revoke parseable output', async t => {
       })
     
       registry.getTokens(tokens)
    -  registry.nock.delete(`/-/npm/v1/tokens/token/${tokens[0].key}`).reply(200)
    +  registry.revokeToken(tokens[0].key)
       await npm.exec('token', ['rm', tokens[0].key.slice(0, 8)])
       t.equal(joinedOutput(), tokens[0].key, 'logs the token as a string')
     })
    @@ -198,7 +195,7 @@ t.test('token revoke by token', async t => {
         authorization: authToken,
       })
       registry.getTokens(tokens)
    -  registry.nock.delete(`/-/npm/v1/tokens/token/${tokens[0].token}`).reply(200)
    +  registry.revokeToken(tokens[0].token)
       await npm.exec('token', ['rm', tokens[0].token])
       t.equal(joinedOutput(), 'Removed 1 token')
     })
    @@ -243,39 +240,48 @@ t.test('token revoke unknown token', async t => {
       )
     })
     
    -t.test('token create', async t => {
    -  const cidr = ['10.0.0.0/8', '192.168.1.0/24']
    +t.test('token create defaults', async t => {
       const { npm, outputs } = await loadMockNpm(t, {
         config: {
           ...auth,
    -      cidr,
    +      name: 'test-token',
    +      password: 'test-password',
         },
       })
    +
       const registry = new MockRegistry({
         tap: t,
         registry: npm.config.get('registry'),
         authorization: authToken,
       })
    -  const stdin = new stream.PassThrough()
    -  stdin.write(`${password}\n`)
    -  mockGlobals(t, {
    -    'process.stdin': stdin,
    -    'process.stdout': new stream.PassThrough(), // to quiet readline
    -  }, { replace: true })
    -  registry.createToken({ password, cidr })
    +
    +  registry.createToken({
    +    name: 'test-token',
    +    password: 'test-password',
    +  }, {
    +    access: 'publish',
    +  })
    +
       await npm.exec('token', ['create'])
    -  t.strictSame(outputs, [
    -    '',
    -    'Created publish token n3wt0k3n',
    -    'with IP whitelist: 10.0.0.0/8,192.168.1.0/24',
    -  ])
    +  t.match(outputs, ['Created publish token n3wt0k3n'])
     })
     
    -t.test('token create read only', async t => {
    +t.test('token create extra token attributes', async t => {
       const { npm, outputs } = await loadMockNpm(t, {
         config: {
           ...auth,
    -      'read-only': true,
    +      'bypass-2fa': true,
    +      cidr: ['10.0.0.0/8', '192.168.1.0/24'],
    +      expires: 1000,
    +      name: 'extras-token',
    +      orgs: ['@npmcli'],
    +      'orgs-permission': 'read-write',
    +      packages: ['@npmcli/test-package'],
    +      'packages-and-scopes-permission': 'read-only',
    +      'packages-all': true,
    +      password: 'test-password',
    +      scopes: ['@npmcli'],
    +      'token-description': 'test token',
         },
       })
       const registry = new MockRegistry({
    @@ -283,76 +289,159 @@ t.test('token create read only', async t => {
         registry: npm.config.get('registry'),
         authorization: authToken,
       })
    -  const stdin = new stream.PassThrough()
    -  stdin.write(`${password}\n`)
    -  mockGlobals(t, {
    -    'process.stdin': stdin,
    -    'process.stdout': new stream.PassThrough(), // to quiet readline
    -  }, { replace: true })
    -  registry.createToken({ readonly: true, password })
    +
    +  const expires = new Date()
    +  registry.createToken({
    +    bypass_2fa: true,
    +    cidr_whitelist: ['10.0.0.0/8', '192.168.1.0/24'],
    +    description: 'test token',
    +    expires: 1000,
    +    name: 'extras-token',
    +    orgs_permission: 'read-write',
    +    orgs: ['@npmcli'],
    +    packages_all: true,
    +    packages_and_scopes_permission: 'read-only',
    +    packages: ['@npmcli/test-package'],
    +    password: 'test-password',
    +    scopes: ['@npmcli'],
    +  }, {
    +    cidr_whitelist: ['10.0.0.0/8', '192.168.1.0/24'],
    +    expires,
    +  })
    +
       await npm.exec('token', ['create'])
    -  t.strictSame(outputs, [
    -    '',
    +  t.match(outputs, [
         'Created read only token n3wt0k3n',
    +    'with IP whitelist: 10.0.0.0/8,192.168.1.0/24',
    +    `expires: ${expires.toISOString()}`,
       ])
     })
     
    +t.test('token create access.read-only', async t => {
    +  const { npm, outputs } = await loadMockNpm(t, {
    +    config: {
    +      ...auth,
    +      name: 'test-token',
    +      password: 'test-password',
    +    },
    +  })
    +
    +  const registry = new MockRegistry({
    +    tap: t,
    +    registry: npm.config.get('registry'),
    +    authorization: authToken,
    +  })
    +
    +  registry.createToken({
    +    name: 'test-token',
    +    password: 'test-password',
    +  }, {
    +    access: 'read-only',
    +  })
    +
    +  await npm.exec('token', ['create'])
    +  t.match(outputs, ['Created read only token n3wt0k3n'])
    +})
    +
    +t.test('token create readonly', async t => {
    +  const { npm, outputs } = await loadMockNpm(t, {
    +    config: {
    +      ...auth,
    +      name: 'test-token',
    +      password: 'test-password',
    +    },
    +  }, {
    +    readonly: true,
    +  })
    +
    +  const registry = new MockRegistry({
    +    tap: t,
    +    registry: npm.config.get('registry'),
    +    authorization: authToken,
    +  })
    +
    +  registry.createToken({
    +    name: 'test-token',
    +    password: 'test-password',
    +  }, {
    +    access: 'read-only',
    +  })
    +
    +  await npm.exec('token', ['create'])
    +  t.match(outputs, ['Created read only token n3wt0k3n'])
    +})
    +
     t.test('token create json output', async t => {
    -  const cidr = ['10.0.0.0/8', '192.168.1.0/24']
       const { npm, joinedOutput } = await loadMockNpm(t, {
         config: {
           ...auth,
           json: true,
    -      cidr,
    +      name: 'test-token',
    +      password: 'test-password',
         },
       })
    +
       const registry = new MockRegistry({
         tap: t,
         registry: npm.config.get('registry'),
         authorization: authToken,
       })
    -  const stdin = new stream.PassThrough()
    -  stdin.write(`${password}\n`)
    -  mockGlobals(t, {
    -    'process.stdin': stdin,
    -    'process.stdout': new stream.PassThrough(), // to quiet readline
    -  }, { replace: true })
    -  registry.createToken({ password, cidr })
    +
    +  const created = new Date()
    +  registry.createToken({
    +    name: 'test-token',
    +    password: 'test-password',
    +  }, {
    +    created,
    +    other: 'attr',
    +  })
    +
       await npm.exec('token', ['create'])
    -  const parsed = JSON.parse(joinedOutput())
    -  t.match(
    -    parsed,
    -    { token: 'n3wt0k3n', readonly: false, cidr_whitelist: cidr }
    -  )
    -  t.ok(parsed.created, 'also returns created')
    +  t.match(JSON.parse(joinedOutput()), {
    +    access: 'read-only',
    +    created: created.toISOString(),
    +    id: '0xdeadbeef',
    +    name: 'test-token',
    +    other: 'attr',
    +    password: 'test-password',
    +    token: 'n3wt0k3n',
    +  })
     })
     
     t.test('token create parseable output', async t => {
    -  const cidr = ['10.0.0.0/8', '192.168.1.0/24']
       const { npm, outputs } = await loadMockNpm(t, {
         config: {
           ...auth,
           parseable: true,
    -      cidr,
    +      name: 'test-token',
    +      password: 'test-password',
         },
       })
    +
       const registry = new MockRegistry({
         tap: t,
         registry: npm.config.get('registry'),
         authorization: authToken,
       })
    -  const stdin = new stream.PassThrough()
    -  stdin.write(`${password}\n`)
    -  mockGlobals(t, {
    -    'process.stdin': stdin,
    -    'process.stdout': new stream.PassThrough(), // to quiet readline
    -  }, { replace: true })
    -  registry.createToken({ password, cidr })
    +
    +  const created = new Date()
    +  registry.createToken({
    +    name: 'test-token',
    +    password: 'test-password',
    +  }, {
    +    access: 'publish',
    +    created,
    +  })
    +
       await npm.exec('token', ['create'])
    -  t.equal(outputs[1], 'token\tn3wt0k3n')
    -  t.ok(outputs[2].startsWith('created\t'))
    -  t.equal(outputs[3], 'readonly\tfalse')
    -  t.equal(outputs[4], 'cidr_whitelist\t10.0.0.0/8,192.168.1.0/24')
    +  t.match(outputs, [
    +    'id\t0xdeadbeef',
    +    'token\tn3wt0k3n',
    +    `created\t${created.toISOString()}`,
    +    'access\tpublish',
    +    'name\ttest-token',
    +    'password\ttest-password',
    +  ])
     })
     
     t.test('token create ipv6 cidr', async t => {
    @@ -360,12 +449,14 @@ t.test('token create ipv6 cidr', async t => {
         config: {
           ...auth,
           cidr: '::1/128',
    +      name: 'ipv6-test',
    +      access: 'read-only',
         },
       })
    -  await t.rejects(npm.exec('token', ['create'], {
    +  await t.rejects(npm.exec('token', ['create']), {
         code: 'EINVALIDCIDR',
         message: /CIDR whitelist can only contain IPv4 addresses, ::1\/128 is IPv6/,
    -  }))
    +  })
     })
     
     t.test('token create invalid cidr', async t => {
    @@ -373,10 +464,12 @@ t.test('token create invalid cidr', async t => {
         config: {
           ...auth,
           cidr: 'apple/cider',
    +      name: 'invalid-cidr-test',
    +      access: 'read-only',
         },
       })
    -  await t.rejects(npm.exec('token', ['create'], {
    +  await t.rejects(npm.exec('token', ['create']), {
         code: 'EINVALIDCIDR',
         message: 'CIDR whitelist contains invalid CIDR entry: apple/cider',
    -  }))
    +  })
     })
    diff --git a/deps/npm/test/lib/utils/tar.js b/deps/npm/test/lib/utils/tar.js
    index a0a37a3356eea2..78668a78ea7ee6 100644
    --- a/deps/npm/test/lib/utils/tar.js
    +++ b/deps/npm/test/lib/utils/tar.js
    @@ -1,3 +1,4 @@
    +const path = require('node:path')
     const t = require('tap')
     const tar = require('tar')
     const pack = require('libnpmpack')
    @@ -163,13 +164,14 @@ t.test('should getContents of a tarball with a node_modules directory included',
         },
       })
     
    +  const fileName = path.join(testDir, 'npm-example-v1.tgz')
       await tar.c({
         gzip: true,
    -    file: 'npm-example-v1.tgz',
    +    file: fileName,
         C: testDir,
       }, ['package'])
     
    -  const tarball = await readFile(`npm-example-v1.tgz`)
    +  const tarball = await readFile(fileName)
     
       const tarballContents = await getContents({
         name: 'my-cool-pkg',
    diff --git a/deps/npm/node_modules/tar/LICENSE b/deps/npm/workspaces/arborist/node_modules/nopt/LICENSE
    similarity index 100%
    rename from deps/npm/node_modules/tar/LICENSE
    rename to deps/npm/workspaces/arborist/node_modules/nopt/LICENSE
    diff --git a/deps/npm/workspaces/arborist/node_modules/nopt/README.md b/deps/npm/workspaces/arborist/node_modules/nopt/README.md
    new file mode 100644
    index 00000000000000..19ef097bb2c220
    --- /dev/null
    +++ b/deps/npm/workspaces/arborist/node_modules/nopt/README.md
    @@ -0,0 +1,214 @@
    +If you want to write an option parser, and have it be good, there are
    +two ways to do it.  The Right Way, and the Wrong Way.
    +
    +The Wrong Way is to sit down and write an option parser.  We've all done
    +that.
    +
    +The Right Way is to write some complex configurable program with so many
    +options that you hit the limit of your frustration just trying to
    +manage them all, and defer it with duct-tape solutions until you see
    +exactly to the core of the problem, and finally snap and write an
    +awesome option parser.
    +
    +If you want to write an option parser, don't write an option parser.
    +Write a package manager, or a source control system, or a service
    +restarter, or an operating system.  You probably won't end up with a
    +good one of those, but if you don't give up, and you are relentless and
    +diligent enough in your procrastination, you may just end up with a very
    +nice option parser.
    +
    +## USAGE
    +
    +```javascript
    +// my-program.js
    +var nopt = require("nopt")
    +  , Stream = require("stream").Stream
    +  , path = require("path")
    +  , knownOpts = { "foo" : [String, null]
    +                , "bar" : [Stream, Number]
    +                , "baz" : path
    +                , "bloo" : [ "big", "medium", "small" ]
    +                , "flag" : Boolean
    +                , "pick" : Boolean
    +                , "many1" : [String, Array]
    +                , "many2" : [path, Array]
    +                }
    +  , shortHands = { "foofoo" : ["--foo", "Mr. Foo"]
    +                 , "b7" : ["--bar", "7"]
    +                 , "m" : ["--bloo", "medium"]
    +                 , "p" : ["--pick"]
    +                 , "f" : ["--flag"]
    +                 }
    +             // everything is optional.
    +             // knownOpts and shorthands default to {}
    +             // arg list defaults to process.argv
    +             // slice defaults to 2
    +  , parsed = nopt(knownOpts, shortHands, process.argv, 2)
    +console.log(parsed)
    +```
    +
    +This would give you support for any of the following:
    +
    +```console
    +$ node my-program.js --foo "blerp" --no-flag
    +{ "foo" : "blerp", "flag" : false }
    +
    +$ node my-program.js ---bar 7 --foo "Mr. Hand" --flag
    +{ bar: 7, foo: "Mr. Hand", flag: true }
    +
    +$ node my-program.js --foo "blerp" -f -----p
    +{ foo: "blerp", flag: true, pick: true }
    +
    +$ node my-program.js -fp --foofoo
    +{ foo: "Mr. Foo", flag: true, pick: true }
    +
    +$ node my-program.js --foofoo -- -fp  # -- stops the flag parsing.
    +{ foo: "Mr. Foo", argv: { remain: ["-fp"] } }
    +
    +$ node my-program.js --blatzk -fp # unknown opts are ok.
    +{ blatzk: true, flag: true, pick: true }
    +
    +$ node my-program.js --blatzk=1000 -fp # but you need to use = if they have a value
    +{ blatzk: 1000, flag: true, pick: true }
    +
    +$ node my-program.js --no-blatzk -fp # unless they start with "no-"
    +{ blatzk: false, flag: true, pick: true }
    +
    +$ node my-program.js --baz b/a/z # known paths are resolved.
    +{ baz: "/Users/isaacs/b/a/z" }
    +
    +# if Array is one of the types, then it can take many
    +# values, and will always be an array.  The other types provided
    +# specify what types are allowed in the list.
    +
    +$ node my-program.js --many1 5 --many1 null --many1 foo
    +{ many1: ["5", "null", "foo"] }
    +
    +$ node my-program.js --many2 foo --many2 bar
    +{ many2: ["/path/to/foo", "path/to/bar"] }
    +```
    +
    +Read the tests at the bottom of `lib/nopt.js` for more examples of
    +what this puppy can do.
    +
    +## Types
    +
    +The following types are supported, and defined on `nopt.typeDefs`
    +
    +* String: A normal string.  No parsing is done.
    +* path: A file system path.  Gets resolved against cwd if not absolute.
    +* url: A url.  If it doesn't parse, it isn't accepted.
    +* Number: Must be numeric.
    +* Date: Must parse as a date. If it does, and `Date` is one of the options,
    +  then it will return a Date object, not a string.
    +* Boolean: Must be either `true` or `false`.  If an option is a boolean,
    +  then it does not need a value, and its presence will imply `true` as
    +  the value.  To negate boolean flags, do `--no-whatever` or `--whatever
    +  false`
    +* NaN: Means that the option is strictly not allowed.  Any value will
    +  fail.
    +* Stream: An object matching the "Stream" class in node.  Valuable
    +  for use when validating programmatically.  (npm uses this to let you
    +  supply any WriteStream on the `outfd` and `logfd` config options.)
    +* Array: If `Array` is specified as one of the types, then the value
    +  will be parsed as a list of options.  This means that multiple values
    +  can be specified, and that the value will always be an array.
    +
    +If a type is an array of values not on this list, then those are
    +considered valid values.  For instance, in the example above, the
    +`--bloo` option can only be one of `"big"`, `"medium"`, or `"small"`,
    +and any other value will be rejected.
    +
    +When parsing unknown fields, `"true"`, `"false"`, and `"null"` will be
    +interpreted as their JavaScript equivalents.
    +
    +You can also mix types and values, or multiple types, in a list.  For
    +instance `{ blah: [Number, null] }` would allow a value to be set to
    +either a Number or null.  When types are ordered, this implies a
    +preference, and the first type that can be used to properly interpret
    +the value will be used.
    +
    +To define a new type, add it to `nopt.typeDefs`.  Each item in that
    +hash is an object with a `type` member and a `validate` method.  The
    +`type` member is an object that matches what goes in the type list.  The
    +`validate` method is a function that gets called with `validate(data,
    +key, val)`.  Validate methods should assign `data[key]` to the valid
    +value of `val` if it can be handled properly, or return boolean
    +`false` if it cannot.
    +
    +You can also call `nopt.clean(data, types, typeDefs)` to clean up a
    +config object and remove its invalid properties.
    +
    +## Error Handling
    +
    +By default nopt logs debug messages if `DEBUG_NOPT` or `NOPT_DEBUG` are set in the environment.
    +
    +You can assign the following methods to `nopt` for a more granular notification of invalid, unknown, and expanding options:
    +
    +`nopt.invalidHandler(key, value, type, data)` - Called when a value is invalid for its option.
    +`nopt.unknownHandler(key, next)` - Called when an option is found that has no configuration.  In certain situations the next option on the command line will be parsed on its own instead of as part of the unknown option. In this case `next` will contain that option.
    +`nopt.abbrevHandler(short, long)` - Called when an option is automatically translated via abbreviations.
    +
    +You can also set any of these to `false` to disable the debugging messages that they generate.
    +
    +## Abbreviations
    +
    +Yes, they are supported.  If you define options like this:
    +
    +```javascript
    +{ "foolhardyelephants" : Boolean
    +, "pileofmonkeys" : Boolean }
    +```
    +
    +Then this will work:
    +
    +```bash
    +node program.js --foolhar --pil
    +node program.js --no-f --pileofmon
    +# etc.
    +```
    +
    +## Shorthands
    +
    +Shorthands are a hash of shorter option names to a snippet of args that
    +they expand to.
    +
    +If multiple one-character shorthands are all combined, and the
    +combination does not unambiguously match any other option or shorthand,
    +then they will be broken up into their constituent parts.  For example:
    +
    +```json
    +{ "s" : ["--loglevel", "silent"]
    +, "g" : "--global"
    +, "f" : "--force"
    +, "p" : "--parseable"
    +, "l" : "--long"
    +}
    +```
    +
    +```bash
    +npm ls -sgflp
    +# just like doing this:
    +npm ls --loglevel silent --global --force --long --parseable
    +```
    +
    +## The Rest of the args
    +
    +The config object returned by nopt is given a special member called
    +`argv`, which is an object with the following fields:
    +
    +* `remain`: The remaining args after all the parsing has occurred.
    +* `original`: The args as they originally appeared.
    +* `cooked`: The args after flags and shorthands are expanded.
    +
    +## Slicing
    +
    +Node programs are called with more or less the exact argv as it appears
    +in C land, after the v8 and node-specific options have been plucked off.
    +As such, `argv[0]` is always `node` and `argv[1]` is always the
    +JavaScript program being run.
    +
    +That's usually not very useful to you.  So they're sliced off by
    +default.  If you want them, then you can pass in `0` as the last
    +argument, or any other number that you'd like to slice off the start of
    +the list.
    diff --git a/deps/npm/workspaces/arborist/node_modules/nopt/bin/nopt.js b/deps/npm/workspaces/arborist/node_modules/nopt/bin/nopt.js
    new file mode 100755
    index 00000000000000..6ed2082064b5ea
    --- /dev/null
    +++ b/deps/npm/workspaces/arborist/node_modules/nopt/bin/nopt.js
    @@ -0,0 +1,29 @@
    +#!/usr/bin/env node
    +const nopt = require('../lib/nopt')
    +const path = require('path')
    +console.log('parsed', nopt({
    +  num: Number,
    +  bool: Boolean,
    +  help: Boolean,
    +  list: Array,
    +  'num-list': [Number, Array],
    +  'str-list': [String, Array],
    +  'bool-list': [Boolean, Array],
    +  str: String,
    +  clear: Boolean,
    +  config: Boolean,
    +  length: Number,
    +  file: path,
    +}, {
    +  s: ['--str', 'astring'],
    +  b: ['--bool'],
    +  nb: ['--no-bool'],
    +  tft: ['--bool-list', '--no-bool-list', '--bool-list', 'true'],
    +  '?': ['--help'],
    +  h: ['--help'],
    +  H: ['--help'],
    +  n: ['--num', '125'],
    +  c: ['--config'],
    +  l: ['--length'],
    +  f: ['--file'],
    +}, process.argv, 2))
    diff --git a/deps/npm/workspaces/arborist/node_modules/nopt/lib/debug.js b/deps/npm/workspaces/arborist/node_modules/nopt/lib/debug.js
    new file mode 100644
    index 00000000000000..544ab382ca85c0
    --- /dev/null
    +++ b/deps/npm/workspaces/arborist/node_modules/nopt/lib/debug.js
    @@ -0,0 +1,5 @@
    +/* istanbul ignore next */
    +module.exports = process.env.DEBUG_NOPT || process.env.NOPT_DEBUG
    +  // eslint-disable-next-line no-console
    +  ? (...a) => console.error(...a)
    +  : () => {}
    diff --git a/deps/npm/workspaces/arborist/node_modules/nopt/lib/nopt-lib.js b/deps/npm/workspaces/arborist/node_modules/nopt/lib/nopt-lib.js
    new file mode 100644
    index 00000000000000..441c9cc30377af
    --- /dev/null
    +++ b/deps/npm/workspaces/arborist/node_modules/nopt/lib/nopt-lib.js
    @@ -0,0 +1,514 @@
    +const abbrev = require('abbrev')
    +const debug = require('./debug')
    +const defaultTypeDefs = require('./type-defs')
    +
    +const hasOwn = (o, k) => Object.prototype.hasOwnProperty.call(o, k)
    +
    +const getType = (k, { types, dynamicTypes }) => {
    +  let hasType = hasOwn(types, k)
    +  let type = types[k]
    +  if (!hasType && typeof dynamicTypes === 'function') {
    +    const matchedType = dynamicTypes(k)
    +    if (matchedType !== undefined) {
    +      type = matchedType
    +      hasType = true
    +    }
    +  }
    +  return [hasType, type]
    +}
    +
    +const isTypeDef = (type, def) => def && type === def
    +const hasTypeDef = (type, def) => def && type.indexOf(def) !== -1
    +const doesNotHaveTypeDef = (type, def) => def && !hasTypeDef(type, def)
    +
    +function nopt (args, {
    +  types,
    +  shorthands,
    +  typeDefs,
    +  invalidHandler, // opt is configured but its value does not validate against given type
    +  unknownHandler, // opt is not configured
    +  abbrevHandler, // opt is being expanded via abbrev
    +  typeDefault,
    +  dynamicTypes,
    +} = {}) {
    +  debug(types, shorthands, args, typeDefs)
    +
    +  const data = {}
    +  const argv = {
    +    remain: [],
    +    cooked: args,
    +    original: args.slice(0),
    +  }
    +
    +  parse(args, data, argv.remain, {
    +    typeDefs, types, dynamicTypes, shorthands, unknownHandler, abbrevHandler,
    +  })
    +
    +  // now data is full
    +  clean(data, { types, dynamicTypes, typeDefs, invalidHandler, typeDefault })
    +  data.argv = argv
    +
    +  Object.defineProperty(data.argv, 'toString', {
    +    value: function () {
    +      return this.original.map(JSON.stringify).join(' ')
    +    },
    +    enumerable: false,
    +  })
    +
    +  return data
    +}
    +
    +function clean (data, {
    +  types = {},
    +  typeDefs = {},
    +  dynamicTypes,
    +  invalidHandler,
    +  typeDefault,
    +} = {}) {
    +  const StringType = typeDefs.String?.type
    +  const NumberType = typeDefs.Number?.type
    +  const ArrayType = typeDefs.Array?.type
    +  const BooleanType = typeDefs.Boolean?.type
    +  const DateType = typeDefs.Date?.type
    +
    +  const hasTypeDefault = typeof typeDefault !== 'undefined'
    +  if (!hasTypeDefault) {
    +    typeDefault = [false, true, null]
    +    if (StringType) {
    +      typeDefault.push(StringType)
    +    }
    +    if (ArrayType) {
    +      typeDefault.push(ArrayType)
    +    }
    +  }
    +
    +  const remove = {}
    +
    +  Object.keys(data).forEach((k) => {
    +    if (k === 'argv') {
    +      return
    +    }
    +    let val = data[k]
    +    debug('val=%j', val)
    +    const isArray = Array.isArray(val)
    +    let [hasType, rawType] = getType(k, { types, dynamicTypes })
    +    let type = rawType
    +    if (!isArray) {
    +      val = [val]
    +    }
    +    if (!type) {
    +      type = typeDefault
    +    }
    +    if (isTypeDef(type, ArrayType)) {
    +      type = typeDefault.concat(ArrayType)
    +    }
    +    if (!Array.isArray(type)) {
    +      type = [type]
    +    }
    +
    +    debug('val=%j', val)
    +    debug('types=', type)
    +    val = val.map((v) => {
    +      // if it's an unknown value, then parse false/true/null/numbers/dates
    +      if (typeof v === 'string') {
    +        debug('string %j', v)
    +        v = v.trim()
    +        if ((v === 'null' && ~type.indexOf(null))
    +            || (v === 'true' &&
    +               (~type.indexOf(true) || hasTypeDef(type, BooleanType)))
    +            || (v === 'false' &&
    +               (~type.indexOf(false) || hasTypeDef(type, BooleanType)))) {
    +          v = JSON.parse(v)
    +          debug('jsonable %j', v)
    +        } else if (hasTypeDef(type, NumberType) && !isNaN(v)) {
    +          debug('convert to number', v)
    +          v = +v
    +        } else if (hasTypeDef(type, DateType) && !isNaN(Date.parse(v))) {
    +          debug('convert to date', v)
    +          v = new Date(v)
    +        }
    +      }
    +
    +      if (!hasType) {
    +        if (!hasTypeDefault) {
    +          return v
    +        }
    +        // if the default type has been passed in then we want to validate the
    +        // unknown data key instead of bailing out earlier. we also set the raw
    +        // type which is passed to the invalid handler so that it can be
    +        // determined if during validation if it is unknown vs invalid
    +        rawType = typeDefault
    +      }
    +
    +      // allow `--no-blah` to set 'blah' to null if null is allowed
    +      if (v === false && ~type.indexOf(null) &&
    +          !(~type.indexOf(false) || hasTypeDef(type, BooleanType))) {
    +        v = null
    +      }
    +
    +      const d = {}
    +      d[k] = v
    +      debug('prevalidated val', d, v, rawType)
    +      if (!validate(d, k, v, rawType, { typeDefs })) {
    +        if (invalidHandler) {
    +          invalidHandler(k, v, rawType, data)
    +        } else if (invalidHandler !== false) {
    +          debug('invalid: ' + k + '=' + v, rawType)
    +        }
    +        return remove
    +      }
    +      debug('validated v', d, v, rawType)
    +      return d[k]
    +    }).filter((v) => v !== remove)
    +
    +    // if we allow Array specifically, then an empty array is how we
    +    // express 'no value here', not null.  Allow it.
    +    if (!val.length && doesNotHaveTypeDef(type, ArrayType)) {
    +      debug('VAL HAS NO LENGTH, DELETE IT', val, k, type.indexOf(ArrayType))
    +      delete data[k]
    +    } else if (isArray) {
    +      debug(isArray, data[k], val)
    +      data[k] = val
    +    } else {
    +      data[k] = val[0]
    +    }
    +
    +    debug('k=%s val=%j', k, val, data[k])
    +  })
    +}
    +
    +function validate (data, k, val, type, { typeDefs } = {}) {
    +  const ArrayType = typeDefs?.Array?.type
    +  // arrays are lists of types.
    +  if (Array.isArray(type)) {
    +    for (let i = 0, l = type.length; i < l; i++) {
    +      if (isTypeDef(type[i], ArrayType)) {
    +        continue
    +      }
    +      if (validate(data, k, val, type[i], { typeDefs })) {
    +        return true
    +      }
    +    }
    +    delete data[k]
    +    return false
    +  }
    +
    +  // an array of anything?
    +  if (isTypeDef(type, ArrayType)) {
    +    return true
    +  }
    +
    +  // Original comment:
    +  // NaN is poisonous.  Means that something is not allowed.
    +  // New comment: Changing this to an isNaN check breaks a lot of tests.
    +  // Something is being assumed here that is not actually what happens in
    +  // practice.  Fixing it is outside the scope of getting linting to pass in
    +  // this repo. Leaving as-is for now.
    +  /* eslint-disable-next-line no-self-compare */
    +  if (type !== type) {
    +    debug('Poison NaN', k, val, type)
    +    delete data[k]
    +    return false
    +  }
    +
    +  // explicit list of values
    +  if (val === type) {
    +    debug('Explicitly allowed %j', val)
    +    data[k] = val
    +    return true
    +  }
    +
    +  // now go through the list of typeDefs, validate against each one.
    +  let ok = false
    +  const types = Object.keys(typeDefs)
    +  for (let i = 0, l = types.length; i < l; i++) {
    +    debug('test type %j %j %j', k, val, types[i])
    +    const t = typeDefs[types[i]]
    +    if (t && (
    +      (type && type.name && t.type && t.type.name) ?
    +        (type.name === t.type.name) :
    +        (type === t.type)
    +    )) {
    +      const d = {}
    +      ok = t.validate(d, k, val) !== false
    +      val = d[k]
    +      if (ok) {
    +        data[k] = val
    +        break
    +      }
    +    }
    +  }
    +  debug('OK? %j (%j %j %j)', ok, k, val, types[types.length - 1])
    +
    +  if (!ok) {
    +    delete data[k]
    +  }
    +  return ok
    +}
    +
    +function parse (args, data, remain, {
    +  types = {},
    +  typeDefs = {},
    +  shorthands = {},
    +  dynamicTypes,
    +  unknownHandler,
    +  abbrevHandler,
    +} = {}) {
    +  const StringType = typeDefs.String?.type
    +  const NumberType = typeDefs.Number?.type
    +  const ArrayType = typeDefs.Array?.type
    +  const BooleanType = typeDefs.Boolean?.type
    +
    +  debug('parse', args, data, remain)
    +
    +  const abbrevs = abbrev(Object.keys(types))
    +  debug('abbrevs=%j', abbrevs)
    +  const shortAbbr = abbrev(Object.keys(shorthands))
    +
    +  for (let i = 0; i < args.length; i++) {
    +    let arg = args[i]
    +    debug('arg', arg)
    +
    +    if (arg.match(/^-{2,}$/)) {
    +      // done with keys.
    +      // the rest are args.
    +      remain.push.apply(remain, args.slice(i + 1))
    +      args[i] = '--'
    +      break
    +    }
    +    let hadEq = false
    +    if (arg.charAt(0) === '-' && arg.length > 1) {
    +      const at = arg.indexOf('=')
    +      if (at > -1) {
    +        hadEq = true
    +        const v = arg.slice(at + 1)
    +        arg = arg.slice(0, at)
    +        args.splice(i, 1, arg, v)
    +      }
    +
    +      // see if it's a shorthand
    +      // if so, splice and back up to re-parse it.
    +      const shRes = resolveShort(arg, shortAbbr, abbrevs, { shorthands, abbrevHandler })
    +      debug('arg=%j shRes=%j', arg, shRes)
    +      if (shRes) {
    +        args.splice.apply(args, [i, 1].concat(shRes))
    +        if (arg !== shRes[0]) {
    +          i--
    +          continue
    +        }
    +      }
    +      arg = arg.replace(/^-+/, '')
    +      let no = null
    +      while (arg.toLowerCase().indexOf('no-') === 0) {
    +        no = !no
    +        arg = arg.slice(3)
    +      }
    +
    +      // abbrev includes the original full string in its abbrev list
    +      if (abbrevs[arg] && abbrevs[arg] !== arg) {
    +        if (abbrevHandler) {
    +          abbrevHandler(arg, abbrevs[arg])
    +        } else if (abbrevHandler !== false) {
    +          debug(`abbrev: ${arg} -> ${abbrevs[arg]}`)
    +        }
    +        arg = abbrevs[arg]
    +      }
    +
    +      let [hasType, argType] = getType(arg, { types, dynamicTypes })
    +      let isTypeArray = Array.isArray(argType)
    +      if (isTypeArray && argType.length === 1) {
    +        isTypeArray = false
    +        argType = argType[0]
    +      }
    +
    +      let isArray = isTypeDef(argType, ArrayType) ||
    +        isTypeArray && hasTypeDef(argType, ArrayType)
    +
    +      // allow unknown things to be arrays if specified multiple times.
    +      if (!hasType && hasOwn(data, arg)) {
    +        if (!Array.isArray(data[arg])) {
    +          data[arg] = [data[arg]]
    +        }
    +        isArray = true
    +      }
    +
    +      let val
    +      let la = args[i + 1]
    +
    +      const isBool = typeof no === 'boolean' ||
    +        isTypeDef(argType, BooleanType) ||
    +        isTypeArray && hasTypeDef(argType, BooleanType) ||
    +        (typeof argType === 'undefined' && !hadEq) ||
    +        (la === 'false' &&
    +         (argType === null ||
    +          isTypeArray && ~argType.indexOf(null)))
    +
    +      if (typeof argType === 'undefined') {
    +        // la is going to unexpectedly be parsed outside the context of this arg
    +        const hangingLa = !hadEq && la && !la?.startsWith('-') && !['true', 'false'].includes(la)
    +        if (unknownHandler) {
    +          if (hangingLa) {
    +            unknownHandler(arg, la)
    +          } else {
    +            unknownHandler(arg)
    +          }
    +        } else if (unknownHandler !== false) {
    +          debug(`unknown: ${arg}`)
    +          if (hangingLa) {
    +            debug(`unknown: ${la} parsed as normal opt`)
    +          }
    +        }
    +      }
    +
    +      if (isBool) {
    +        // just set and move along
    +        val = !no
    +        // however, also support --bool true or --bool false
    +        if (la === 'true' || la === 'false') {
    +          val = JSON.parse(la)
    +          la = null
    +          if (no) {
    +            val = !val
    +          }
    +          i++
    +        }
    +
    +        // also support "foo":[Boolean, "bar"] and "--foo bar"
    +        if (isTypeArray && la) {
    +          if (~argType.indexOf(la)) {
    +            // an explicit type
    +            val = la
    +            i++
    +          } else if (la === 'null' && ~argType.indexOf(null)) {
    +            // null allowed
    +            val = null
    +            i++
    +          } else if (!la.match(/^-{2,}[^-]/) &&
    +                      !isNaN(la) &&
    +                      hasTypeDef(argType, NumberType)) {
    +            // number
    +            val = +la
    +            i++
    +          } else if (!la.match(/^-[^-]/) && hasTypeDef(argType, StringType)) {
    +            // string
    +            val = la
    +            i++
    +          }
    +        }
    +
    +        if (isArray) {
    +          (data[arg] = data[arg] || []).push(val)
    +        } else {
    +          data[arg] = val
    +        }
    +
    +        continue
    +      }
    +
    +      if (isTypeDef(argType, StringType)) {
    +        if (la === undefined) {
    +          la = ''
    +        } else if (la.match(/^-{1,2}[^-]+/)) {
    +          la = ''
    +          i--
    +        }
    +      }
    +
    +      if (la && la.match(/^-{2,}$/)) {
    +        la = undefined
    +        i--
    +      }
    +
    +      val = la === undefined ? true : la
    +      if (isArray) {
    +        (data[arg] = data[arg] || []).push(val)
    +      } else {
    +        data[arg] = val
    +      }
    +
    +      i++
    +      continue
    +    }
    +    remain.push(arg)
    +  }
    +}
    +
    +const SINGLES = Symbol('singles')
    +const singleCharacters = (arg, shorthands) => {
    +  let singles = shorthands[SINGLES]
    +  if (!singles) {
    +    singles = Object.keys(shorthands).filter((s) => s.length === 1).reduce((l, r) => {
    +      l[r] = true
    +      return l
    +    }, {})
    +    shorthands[SINGLES] = singles
    +    debug('shorthand singles', singles)
    +  }
    +  const chrs = arg.split('').filter((c) => singles[c])
    +  return chrs.join('') === arg ? chrs : null
    +}
    +
    +function resolveShort (arg, ...rest) {
    +  const { abbrevHandler, types = {}, shorthands = {} } = rest.length ? rest.pop() : {}
    +  const shortAbbr = rest[0] ?? abbrev(Object.keys(shorthands))
    +  const abbrevs = rest[1] ?? abbrev(Object.keys(types))
    +
    +  // handle single-char shorthands glommed together, like
    +  // npm ls -glp, but only if there is one dash, and only if
    +  // all of the chars are single-char shorthands, and it's
    +  // not a match to some other abbrev.
    +  arg = arg.replace(/^-+/, '')
    +
    +  // if it's an exact known option, then don't go any further
    +  if (abbrevs[arg] === arg) {
    +    return null
    +  }
    +
    +  // if it's an exact known shortopt, same deal
    +  if (shorthands[arg]) {
    +    // make it an array, if it's a list of words
    +    if (shorthands[arg] && !Array.isArray(shorthands[arg])) {
    +      shorthands[arg] = shorthands[arg].split(/\s+/)
    +    }
    +
    +    return shorthands[arg]
    +  }
    +
    +  // first check to see if this arg is a set of single-char shorthands
    +  const chrs = singleCharacters(arg, shorthands)
    +  if (chrs) {
    +    return chrs.map((c) => shorthands[c]).reduce((l, r) => l.concat(r), [])
    +  }
    +
    +  // if it's an arg abbrev, and not a literal shorthand, then prefer the arg
    +  if (abbrevs[arg] && !shorthands[arg]) {
    +    return null
    +  }
    +
    +  // if it's an abbr for a shorthand, then use that
    +  // exact match has already happened so we don't need to account for that here
    +  if (shortAbbr[arg]) {
    +    if (abbrevHandler) {
    +      abbrevHandler(arg, shortAbbr[arg])
    +    } else if (abbrevHandler !== false) {
    +      debug(`abbrev: ${arg} -> ${shortAbbr[arg]}`)
    +    }
    +    arg = shortAbbr[arg]
    +  }
    +
    +  // make it an array, if it's a list of words
    +  if (shorthands[arg] && !Array.isArray(shorthands[arg])) {
    +    shorthands[arg] = shorthands[arg].split(/\s+/)
    +  }
    +
    +  return shorthands[arg]
    +}
    +
    +module.exports = {
    +  nopt,
    +  clean,
    +  parse,
    +  validate,
    +  resolveShort,
    +  typeDefs: defaultTypeDefs,
    +}
    diff --git a/deps/npm/workspaces/arborist/node_modules/nopt/lib/nopt.js b/deps/npm/workspaces/arborist/node_modules/nopt/lib/nopt.js
    new file mode 100644
    index 00000000000000..9a24342b374aa0
    --- /dev/null
    +++ b/deps/npm/workspaces/arborist/node_modules/nopt/lib/nopt.js
    @@ -0,0 +1,34 @@
    +const lib = require('./nopt-lib')
    +const defaultTypeDefs = require('./type-defs')
    +
    +// This is the version of nopt's API that requires setting typeDefs and invalidHandler
    +// on the required `nopt` object since it is a singleton. To not do a breaking change
    +// an API that requires all options be passed in is located in `nopt-lib.js` and
    +// exported here as lib.
    +// TODO(breaking): make API only work in non-singleton mode
    +
    +module.exports = exports = nopt
    +exports.clean = clean
    +exports.typeDefs = defaultTypeDefs
    +exports.lib = lib
    +
    +function nopt (types, shorthands, args = process.argv, slice = 2) {
    +  return lib.nopt(args.slice(slice), {
    +    types: types || {},
    +    shorthands: shorthands || {},
    +    typeDefs: exports.typeDefs,
    +    invalidHandler: exports.invalidHandler,
    +    unknownHandler: exports.unknownHandler,
    +    abbrevHandler: exports.abbrevHandler,
    +  })
    +}
    +
    +function clean (data, types, typeDefs = exports.typeDefs) {
    +  return lib.clean(data, {
    +    types: types || {},
    +    typeDefs,
    +    invalidHandler: exports.invalidHandler,
    +    unknownHandler: exports.unknownHandler,
    +    abbrevHandler: exports.abbrevHandler,
    +  })
    +}
    diff --git a/deps/npm/workspaces/arborist/node_modules/nopt/lib/type-defs.js b/deps/npm/workspaces/arborist/node_modules/nopt/lib/type-defs.js
    new file mode 100644
    index 00000000000000..608352ee248cc4
    --- /dev/null
    +++ b/deps/npm/workspaces/arborist/node_modules/nopt/lib/type-defs.js
    @@ -0,0 +1,91 @@
    +const url = require('url')
    +const path = require('path')
    +const Stream = require('stream').Stream
    +const os = require('os')
    +const debug = require('./debug')
    +
    +function validateString (data, k, val) {
    +  data[k] = String(val)
    +}
    +
    +function validatePath (data, k, val) {
    +  if (val === true) {
    +    return false
    +  }
    +  if (val === null) {
    +    return true
    +  }
    +
    +  val = String(val)
    +
    +  const isWin = process.platform === 'win32'
    +  const homePattern = isWin ? /^~(\/|\\)/ : /^~\//
    +  const home = os.homedir()
    +
    +  if (home && val.match(homePattern)) {
    +    data[k] = path.resolve(home, val.slice(2))
    +  } else {
    +    data[k] = path.resolve(val)
    +  }
    +  return true
    +}
    +
    +function validateNumber (data, k, val) {
    +  debug('validate Number %j %j %j', k, val, isNaN(val))
    +  if (isNaN(val)) {
    +    return false
    +  }
    +  data[k] = +val
    +}
    +
    +function validateDate (data, k, val) {
    +  const s = Date.parse(val)
    +  debug('validate Date %j %j %j', k, val, s)
    +  if (isNaN(s)) {
    +    return false
    +  }
    +  data[k] = new Date(val)
    +}
    +
    +function validateBoolean (data, k, val) {
    +  if (typeof val === 'string') {
    +    if (!isNaN(val)) {
    +      val = !!(+val)
    +    } else if (val === 'null' || val === 'false') {
    +      val = false
    +    } else {
    +      val = true
    +    }
    +  } else {
    +    val = !!val
    +  }
    +  data[k] = val
    +}
    +
    +function validateUrl (data, k, val) {
    +  // Changing this would be a breaking change in the npm cli
    +  /* eslint-disable-next-line node/no-deprecated-api */
    +  val = url.parse(String(val))
    +  if (!val.host) {
    +    return false
    +  }
    +  data[k] = val.href
    +}
    +
    +function validateStream (data, k, val) {
    +  if (!(val instanceof Stream)) {
    +    return false
    +  }
    +  data[k] = val
    +}
    +
    +module.exports = {
    +  String: { type: String, validate: validateString },
    +  Boolean: { type: Boolean, validate: validateBoolean },
    +  url: { type: url, validate: validateUrl },
    +  Number: { type: Number, validate: validateNumber },
    +  path: { type: path, validate: validatePath },
    +  Stream: { type: Stream, validate: validateStream },
    +  Date: { type: Date, validate: validateDate },
    +  Array: { type: Array },
    +}
    diff --git a/deps/npm/workspaces/arborist/node_modules/nopt/node_modules/abbrev/LICENSE b/deps/npm/workspaces/arborist/node_modules/nopt/node_modules/abbrev/LICENSE
    new file mode 100644
    index 00000000000000..9bcfa9d7d8d26e
    --- /dev/null
    +++ b/deps/npm/workspaces/arborist/node_modules/nopt/node_modules/abbrev/LICENSE
    @@ -0,0 +1,46 @@
    +This software is dual-licensed under the ISC and MIT licenses.
    +You may use this software under EITHER of the following licenses.
    +
    +----------
    +
    +The ISC License
    +
    +Copyright (c) Isaac Z. Schlueter and Contributors
    +
    +Permission to use, copy, modify, and/or distribute this software for any
    +purpose with or without fee is hereby granted, provided that the above
    +copyright notice and this permission notice appear in all copies.
    +
    +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
    +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
    +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
    +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
    +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
    +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    +
    +----------
    +
    +Copyright Isaac Z. Schlueter and Contributors
    +All rights reserved.
    +
    +Permission is hereby granted, free of charge, to any person
    +obtaining a copy of this software and associated documentation
    +files (the "Software"), to deal in the Software without
    +restriction, including without limitation the rights to use,
    +copy, modify, merge, publish, distribute, sublicense, and/or sell
    +copies of the Software, and to permit persons to whom the
    +Software is furnished to do so, subject to the following
    +conditions:
    +
    +The above copyright notice and this permission notice shall be
    +included in all copies or substantial portions of the Software.
    +
    +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
    +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
    +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
    +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
    +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
    +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
    +OTHER DEALINGS IN THE SOFTWARE.
    diff --git a/deps/npm/workspaces/arborist/node_modules/nopt/node_modules/abbrev/README.md b/deps/npm/workspaces/arborist/node_modules/nopt/node_modules/abbrev/README.md
    new file mode 100644
    index 00000000000000..c6cdd7ea8417c7
    --- /dev/null
    +++ b/deps/npm/workspaces/arborist/node_modules/nopt/node_modules/abbrev/README.md
    @@ -0,0 +1,23 @@
    +# abbrev-js
    +
    +Just like [ruby's Abbrev](http://apidock.com/ruby/Abbrev).
    +
    +Usage:
    +
    +    var abbrev = require("abbrev");
    +    abbrev("foo", "fool", "folding", "flop");
    +
    +    // returns:
    +    { fl: 'flop'
    +    , flo: 'flop'
    +    , flop: 'flop'
    +    , fol: 'folding'
    +    , fold: 'folding'
    +    , foldi: 'folding'
    +    , foldin: 'folding'
    +    , folding: 'folding'
    +    , foo: 'foo'
    +    , fool: 'fool'
    +    }
    +
    +This is handy for command-line scripts, or other cases where you want to be able to accept shorthands.
    diff --git a/deps/npm/workspaces/arborist/node_modules/nopt/node_modules/abbrev/lib/index.js b/deps/npm/workspaces/arborist/node_modules/nopt/node_modules/abbrev/lib/index.js
    new file mode 100644
    index 00000000000000..f7bee0c6fc7ada
    --- /dev/null
    +++ b/deps/npm/workspaces/arborist/node_modules/nopt/node_modules/abbrev/lib/index.js
    @@ -0,0 +1,53 @@
    +module.exports = abbrev
    +
    +function abbrev (...args) {
    +  let list = args
    +  if (args.length === 1 && (Array.isArray(args[0]) || typeof args[0] === 'string')) {
    +    list = [].concat(args[0])
    +  }
    +
    +  for (let i = 0, l = list.length; i < l; i++) {
    +    list[i] = typeof list[i] === 'string' ? list[i] : String(list[i])
    +  }
    +
    +  // sort them lexicographically, so that they're next to their nearest kin
    +  list = list.sort(lexSort)
    +
    +  // walk through each, seeing how much it has in common with the next and previous
    +  const abbrevs = {}
    +  let prev = ''
    +  for (let ii = 0, ll = list.length; ii < ll; ii++) {
    +    const current = list[ii]
    +    const next = list[ii + 1] || ''
    +    let nextMatches = true
    +    let prevMatches = true
    +    if (current === next) {
    +      continue
    +    }
    +    let j = 0
    +    const cl = current.length
    +    for (; j < cl; j++) {
    +      const curChar = current.charAt(j)
    +      nextMatches = nextMatches && curChar === next.charAt(j)
    +      prevMatches = prevMatches && curChar === prev.charAt(j)
    +      if (!nextMatches && !prevMatches) {
    +        j++
    +        break
    +      }
    +    }
    +    prev = current
    +    if (j === cl) {
    +      abbrevs[current] = current
    +      continue
    +    }
    +    for (let a = current.slice(0, j); j <= cl; j++) {
    +      abbrevs[a] = current
    +      a += current.charAt(j)
    +    }
    +  }
    +  return abbrevs
    +}
    +
    +function lexSort (a, b) {
    +  return a === b ? 0 : a > b ? 1 : -1
    +}
    diff --git a/deps/npm/workspaces/arborist/node_modules/nopt/node_modules/abbrev/package.json b/deps/npm/workspaces/arborist/node_modules/nopt/node_modules/abbrev/package.json
    new file mode 100644
    index 00000000000000..077d4bccd0e69e
    --- /dev/null
    +++ b/deps/npm/workspaces/arborist/node_modules/nopt/node_modules/abbrev/package.json
    @@ -0,0 +1,45 @@
    +{
    +  "name": "abbrev",
    +  "version": "3.0.1",
    +  "description": "Like ruby's abbrev module, but in js",
    +  "author": "GitHub Inc.",
    +  "main": "lib/index.js",
    +  "scripts": {
    +    "test": "tap",
    +    "lint": "npm run eslint",
    +    "postlint": "template-oss-check",
    +    "template-oss-apply": "template-oss-apply --force",
    +    "lintfix": "npm run eslint -- --fix",
    +    "snap": "tap",
    +    "posttest": "npm run lint",
    +    "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\""
    +  },
    +  "repository": {
    +    "type": "git",
    +    "url": "git+https://github.com/npm/abbrev-js.git"
    +  },
    +  "license": "ISC",
    +  "devDependencies": {
    +    "@npmcli/eslint-config": "^5.0.0",
    +    "@npmcli/template-oss": "4.24.3",
    +    "tap": "^16.3.0"
    +  },
    +  "tap": {
    +    "nyc-arg": [
    +      "--exclude",
    +      "tap-snapshots/**"
    +    ]
    +  },
    +  "files": [
    +    "bin/",
    +    "lib/"
    +  ],
    +  "engines": {
    +    "node": "^18.17.0 || >=20.5.0"
    +  },
    +  "templateOSS": {
    +    "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    +    "version": "4.24.3",
    +    "publish": true
    +  }
    +}
    diff --git a/deps/npm/workspaces/arborist/node_modules/nopt/package.json b/deps/npm/workspaces/arborist/node_modules/nopt/package.json
    new file mode 100644
    index 00000000000000..0732ada73c1d00
    --- /dev/null
    +++ b/deps/npm/workspaces/arborist/node_modules/nopt/package.json
    @@ -0,0 +1,52 @@
    +{
    +  "name": "nopt",
    +  "version": "8.1.0",
    +  "description": "Option parsing for Node, supporting types, shorthands, etc. Used by npm.",
    +  "author": "GitHub Inc.",
    +  "main": "lib/nopt.js",
    +  "scripts": {
    +    "test": "tap",
    +    "lint": "npm run eslint",
    +    "postlint": "template-oss-check",
    +    "template-oss-apply": "template-oss-apply --force",
    +    "lintfix": "npm run eslint -- --fix",
    +    "snap": "tap",
    +    "posttest": "npm run lint",
    +    "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\""
    +  },
    +  "repository": {
    +    "type": "git",
    +    "url": "git+https://github.com/npm/nopt.git"
    +  },
    +  "bin": {
    +    "nopt": "bin/nopt.js"
    +  },
    +  "license": "ISC",
    +  "dependencies": {
    +    "abbrev": "^3.0.0"
    +  },
    +  "devDependencies": {
    +    "@npmcli/eslint-config": "^5.0.0",
    +    "@npmcli/template-oss": "4.23.6",
    +    "tap": "^16.3.0"
    +  },
    +  "tap": {
    +    "nyc-arg": [
    +      "--exclude",
    +      "tap-snapshots/**"
    +    ]
    +  },
    +  "files": [
    +    "bin/",
    +    "lib/"
    +  ],
    +  "engines": {
    +    "node": "^18.17.0 || >=20.5.0"
    +  },
    +  "templateOSS": {
    +    "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    +    "windowsCI": false,
    +    "version": "4.23.6",
    +    "publish": true
    +  }
    +}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/LICENSE b/deps/npm/workspaces/config/node_modules/nopt/LICENSE
    similarity index 92%
    rename from deps/npm/node_modules/node-gyp/node_modules/glob/LICENSE
    rename to deps/npm/workspaces/config/node_modules/nopt/LICENSE
    index ec7df93329abf3..19129e315fe593 100644
    --- a/deps/npm/node_modules/node-gyp/node_modules/glob/LICENSE
    +++ b/deps/npm/workspaces/config/node_modules/nopt/LICENSE
    @@ -1,6 +1,6 @@
     The ISC License
     
    -Copyright (c) 2009-2023 Isaac Z. Schlueter and Contributors
    +Copyright (c) Isaac Z. Schlueter and Contributors
     
     Permission to use, copy, modify, and/or distribute this software for any
     purpose with or without fee is hereby granted, provided that the above
    diff --git a/deps/npm/workspaces/config/node_modules/nopt/README.md b/deps/npm/workspaces/config/node_modules/nopt/README.md
    new file mode 100644
    index 00000000000000..19ef097bb2c220
    --- /dev/null
    +++ b/deps/npm/workspaces/config/node_modules/nopt/README.md
    @@ -0,0 +1,214 @@
    +If you want to write an option parser, and have it be good, there are
    +two ways to do it.  The Right Way, and the Wrong Way.
    +
    +The Wrong Way is to sit down and write an option parser.  We've all done
    +that.
    +
    +The Right Way is to write some complex configurable program with so many
    +options that you hit the limit of your frustration just trying to
    +manage them all, and defer it with duct-tape solutions until you see
    +exactly to the core of the problem, and finally snap and write an
    +awesome option parser.
    +
    +If you want to write an option parser, don't write an option parser.
    +Write a package manager, or a source control system, or a service
    +restarter, or an operating system.  You probably won't end up with a
    +good one of those, but if you don't give up, and you are relentless and
    +diligent enough in your procrastination, you may just end up with a very
    +nice option parser.
    +
    +## USAGE
    +
    +```javascript
    +// my-program.js
    +var nopt = require("nopt")
    +  , Stream = require("stream").Stream
    +  , path = require("path")
    +  , knownOpts = { "foo" : [String, null]
    +                , "bar" : [Stream, Number]
    +                , "baz" : path
    +                , "bloo" : [ "big", "medium", "small" ]
    +                , "flag" : Boolean
    +                , "pick" : Boolean
    +                , "many1" : [String, Array]
    +                , "many2" : [path, Array]
    +                }
    +  , shortHands = { "foofoo" : ["--foo", "Mr. Foo"]
    +                 , "b7" : ["--bar", "7"]
    +                 , "m" : ["--bloo", "medium"]
    +                 , "p" : ["--pick"]
    +                 , "f" : ["--flag"]
    +                 }
    +             // everything is optional.
    +             // knownOpts and shorthands default to {}
    +             // arg list defaults to process.argv
    +             // slice defaults to 2
    +  , parsed = nopt(knownOpts, shortHands, process.argv, 2)
    +console.log(parsed)
    +```
    +
    +This would give you support for any of the following:
    +
    +```console
    +$ node my-program.js --foo "blerp" --no-flag
    +{ "foo" : "blerp", "flag" : false }
    +
    +$ node my-program.js ---bar 7 --foo "Mr. Hand" --flag
    +{ bar: 7, foo: "Mr. Hand", flag: true }
    +
    +$ node my-program.js --foo "blerp" -f -----p
    +{ foo: "blerp", flag: true, pick: true }
    +
    +$ node my-program.js -fp --foofoo
    +{ foo: "Mr. Foo", flag: true, pick: true }
    +
    +$ node my-program.js --foofoo -- -fp  # -- stops the flag parsing.
    +{ foo: "Mr. Foo", argv: { remain: ["-fp"] } }
    +
    +$ node my-program.js --blatzk -fp # unknown opts are ok.
    +{ blatzk: true, flag: true, pick: true }
    +
    +$ node my-program.js --blatzk=1000 -fp # but you need to use = if they have a value
    +{ blatzk: 1000, flag: true, pick: true }
    +
    +$ node my-program.js --no-blatzk -fp # unless they start with "no-"
    +{ blatzk: false, flag: true, pick: true }
    +
    +$ node my-program.js --baz b/a/z # known paths are resolved.
    +{ baz: "/Users/isaacs/b/a/z" }
    +
    +# if Array is one of the types, then it can take many
    +# values, and will always be an array.  The other types provided
    +# specify what types are allowed in the list.
    +
    +$ node my-program.js --many1 5 --many1 null --many1 foo
    +{ many1: ["5", "null", "foo"] }
    +
    +$ node my-program.js --many2 foo --many2 bar
    +{ many2: ["/path/to/foo", "path/to/bar"] }
    +```
    +
    +Read the tests at the bottom of `lib/nopt.js` for more examples of
    +what this puppy can do.
    +
    +## Types
    +
    +The following types are supported, and defined on `nopt.typeDefs`
    +
    +* String: A normal string.  No parsing is done.
    +* path: A file system path.  Gets resolved against cwd if not absolute.
    +* url: A url.  If it doesn't parse, it isn't accepted.
    +* Number: Must be numeric.
    +* Date: Must parse as a date. If it does, and `Date` is one of the options,
    +  then it will return a Date object, not a string.
    +* Boolean: Must be either `true` or `false`.  If an option is a boolean,
    +  then it does not need a value, and its presence will imply `true` as
    +  the value.  To negate boolean flags, do `--no-whatever` or `--whatever
    +  false`
    +* NaN: Means that the option is strictly not allowed.  Any value will
    +  fail.
    +* Stream: An object matching the "Stream" class in node.  Valuable
    +  for use when validating programmatically.  (npm uses this to let you
    +  supply any WriteStream on the `outfd` and `logfd` config options.)
    +* Array: If `Array` is specified as one of the types, then the value
    +  will be parsed as a list of options.  This means that multiple values
    +  can be specified, and that the value will always be an array.
    +
    +If a type is an array of values not on this list, then those are
    +considered valid values.  For instance, in the example above, the
    +`--bloo` option can only be one of `"big"`, `"medium"`, or `"small"`,
    +and any other value will be rejected.
    +
    +When parsing unknown fields, `"true"`, `"false"`, and `"null"` will be
    +interpreted as their JavaScript equivalents.
    +
    +You can also mix types and values, or multiple types, in a list.  For
    +instance `{ blah: [Number, null] }` would allow a value to be set to
    +either a Number or null.  When types are ordered, this implies a
    +preference, and the first type that can be used to properly interpret
    +the value will be used.
    +
    +To define a new type, add it to `nopt.typeDefs`.  Each item in that
    +hash is an object with a `type` member and a `validate` method.  The
    +`type` member is an object that matches what goes in the type list.  The
    +`validate` method is a function that gets called with `validate(data,
    +key, val)`.  Validate methods should assign `data[key]` to the valid
    +value of `val` if it can be handled properly, or return boolean
    +`false` if it cannot.
    +
    +You can also call `nopt.clean(data, types, typeDefs)` to clean up a
    +config object and remove its invalid properties.
    +
    +## Error Handling
    +
    +By default nopt logs debug messages if `DEBUG_NOPT` or `NOPT_DEBUG` are set in the environment.
    +
    +You can assign the following methods to `nopt` for a more granular notification of invalid, unknown, and expanding options:
    +
    +`nopt.invalidHandler(key, value, type, data)` - Called when a value is invalid for its option.
    +`nopt.unknownHandler(key, next)` - Called when an option is found that has no configuration.  In certain situations the next option on the command line will be parsed on its own instead of as part of the unknown option. In this case `next` will contain that option.
    +`nopt.abbrevHandler(short, long)` - Called when an option is automatically translated via abbreviations.
    +
    +You can also set any of these to `false` to disable the debugging messages that they generate.
    +
    +## Abbreviations
    +
    +Yes, they are supported.  If you define options like this:
    +
    +```javascript
    +{ "foolhardyelephants" : Boolean
    +, "pileofmonkeys" : Boolean }
    +```
    +
    +Then this will work:
    +
    +```bash
    +node program.js --foolhar --pil
    +node program.js --no-f --pileofmon
    +# etc.
    +```
    +
    +## Shorthands
    +
    +Shorthands are a hash of shorter option names to a snippet of args that
    +they expand to.
    +
    +If multiple one-character shorthands are all combined, and the
    +combination does not unambiguously match any other option or shorthand,
    +then they will be broken up into their constituent parts.  For example:
    +
    +```json
    +{ "s" : ["--loglevel", "silent"]
    +, "g" : "--global"
    +, "f" : "--force"
    +, "p" : "--parseable"
    +, "l" : "--long"
    +}
    +```
    +
    +```bash
    +npm ls -sgflp
    +# just like doing this:
    +npm ls --loglevel silent --global --force --long --parseable
    +```
    +
    +## The Rest of the args
    +
    +The config object returned by nopt is given a special member called
    +`argv`, which is an object with the following fields:
    +
    +* `remain`: The remaining args after all the parsing has occurred.
    +* `original`: The args as they originally appeared.
    +* `cooked`: The args after flags and shorthands are expanded.
    +
    +## Slicing
    +
    +Node programs are called with more or less the exact argv as it appears
    +in C land, after the v8 and node-specific options have been plucked off.
    +As such, `argv[0]` is always `node` and `argv[1]` is always the
    +JavaScript program being run.
    +
    +That's usually not very useful to you.  So they're sliced off by
    +default.  If you want them, then you can pass in `0` as the last
    +argument, or any other number that you'd like to slice off the start of
    +the list.
    diff --git a/deps/npm/workspaces/config/node_modules/nopt/bin/nopt.js b/deps/npm/workspaces/config/node_modules/nopt/bin/nopt.js
    new file mode 100755
    index 00000000000000..6ed2082064b5ea
    --- /dev/null
    +++ b/deps/npm/workspaces/config/node_modules/nopt/bin/nopt.js
    @@ -0,0 +1,29 @@
    +#!/usr/bin/env node
    +const nopt = require('../lib/nopt')
    +const path = require('path')
    +console.log('parsed', nopt({
    +  num: Number,
    +  bool: Boolean,
    +  help: Boolean,
    +  list: Array,
    +  'num-list': [Number, Array],
    +  'str-list': [String, Array],
    +  'bool-list': [Boolean, Array],
    +  str: String,
    +  clear: Boolean,
    +  config: Boolean,
    +  length: Number,
    +  file: path,
    +}, {
    +  s: ['--str', 'astring'],
    +  b: ['--bool'],
    +  nb: ['--no-bool'],
    +  tft: ['--bool-list', '--no-bool-list', '--bool-list', 'true'],
    +  '?': ['--help'],
    +  h: ['--help'],
    +  H: ['--help'],
    +  n: ['--num', '125'],
    +  c: ['--config'],
    +  l: ['--length'],
    +  f: ['--file'],
    +}, process.argv, 2))
    diff --git a/deps/npm/workspaces/config/node_modules/nopt/lib/debug.js b/deps/npm/workspaces/config/node_modules/nopt/lib/debug.js
    new file mode 100644
    index 00000000000000..544ab382ca85c0
    --- /dev/null
    +++ b/deps/npm/workspaces/config/node_modules/nopt/lib/debug.js
    @@ -0,0 +1,5 @@
    +/* istanbul ignore next */
    +module.exports = process.env.DEBUG_NOPT || process.env.NOPT_DEBUG
    +  // eslint-disable-next-line no-console
    +  ? (...a) => console.error(...a)
    +  : () => {}
    diff --git a/deps/npm/workspaces/config/node_modules/nopt/lib/nopt-lib.js b/deps/npm/workspaces/config/node_modules/nopt/lib/nopt-lib.js
    new file mode 100644
    index 00000000000000..441c9cc30377af
    --- /dev/null
    +++ b/deps/npm/workspaces/config/node_modules/nopt/lib/nopt-lib.js
    @@ -0,0 +1,514 @@
    +const abbrev = require('abbrev')
    +const debug = require('./debug')
    +const defaultTypeDefs = require('./type-defs')
    +
    +const hasOwn = (o, k) => Object.prototype.hasOwnProperty.call(o, k)
    +
    +const getType = (k, { types, dynamicTypes }) => {
    +  let hasType = hasOwn(types, k)
    +  let type = types[k]
    +  if (!hasType && typeof dynamicTypes === 'function') {
    +    const matchedType = dynamicTypes(k)
    +    if (matchedType !== undefined) {
    +      type = matchedType
    +      hasType = true
    +    }
    +  }
    +  return [hasType, type]
    +}
    +
    +const isTypeDef = (type, def) => def && type === def
    +const hasTypeDef = (type, def) => def && type.indexOf(def) !== -1
    +const doesNotHaveTypeDef = (type, def) => def && !hasTypeDef(type, def)
    +
    +function nopt (args, {
    +  types,
    +  shorthands,
    +  typeDefs,
    +  invalidHandler, // opt is configured but its value does not validate against given type
    +  unknownHandler, // opt is not configured
    +  abbrevHandler, // opt is being expanded via abbrev
    +  typeDefault,
    +  dynamicTypes,
    +} = {}) {
    +  debug(types, shorthands, args, typeDefs)
    +
    +  const data = {}
    +  const argv = {
    +    remain: [],
    +    cooked: args,
    +    original: args.slice(0),
    +  }
    +
    +  parse(args, data, argv.remain, {
    +    typeDefs, types, dynamicTypes, shorthands, unknownHandler, abbrevHandler,
    +  })
    +
    +  // now data is full
    +  clean(data, { types, dynamicTypes, typeDefs, invalidHandler, typeDefault })
    +  data.argv = argv
    +
    +  Object.defineProperty(data.argv, 'toString', {
    +    value: function () {
    +      return this.original.map(JSON.stringify).join(' ')
    +    },
    +    enumerable: false,
    +  })
    +
    +  return data
    +}
    +
    +function clean (data, {
    +  types = {},
    +  typeDefs = {},
    +  dynamicTypes,
    +  invalidHandler,
    +  typeDefault,
    +} = {}) {
    +  const StringType = typeDefs.String?.type
    +  const NumberType = typeDefs.Number?.type
    +  const ArrayType = typeDefs.Array?.type
    +  const BooleanType = typeDefs.Boolean?.type
    +  const DateType = typeDefs.Date?.type
    +
    +  const hasTypeDefault = typeof typeDefault !== 'undefined'
    +  if (!hasTypeDefault) {
    +    typeDefault = [false, true, null]
    +    if (StringType) {
    +      typeDefault.push(StringType)
    +    }
    +    if (ArrayType) {
    +      typeDefault.push(ArrayType)
    +    }
    +  }
    +
    +  const remove = {}
    +
    +  Object.keys(data).forEach((k) => {
    +    if (k === 'argv') {
    +      return
    +    }
    +    let val = data[k]
    +    debug('val=%j', val)
    +    const isArray = Array.isArray(val)
    +    let [hasType, rawType] = getType(k, { types, dynamicTypes })
    +    let type = rawType
    +    if (!isArray) {
    +      val = [val]
    +    }
    +    if (!type) {
    +      type = typeDefault
    +    }
    +    if (isTypeDef(type, ArrayType)) {
    +      type = typeDefault.concat(ArrayType)
    +    }
    +    if (!Array.isArray(type)) {
    +      type = [type]
    +    }
    +
    +    debug('val=%j', val)
    +    debug('types=', type)
    +    val = val.map((v) => {
    +      // if it's an unknown value, then parse false/true/null/numbers/dates
    +      if (typeof v === 'string') {
    +        debug('string %j', v)
    +        v = v.trim()
    +        if ((v === 'null' && ~type.indexOf(null))
    +            || (v === 'true' &&
    +               (~type.indexOf(true) || hasTypeDef(type, BooleanType)))
    +            || (v === 'false' &&
    +               (~type.indexOf(false) || hasTypeDef(type, BooleanType)))) {
    +          v = JSON.parse(v)
    +          debug('jsonable %j', v)
    +        } else if (hasTypeDef(type, NumberType) && !isNaN(v)) {
    +          debug('convert to number', v)
    +          v = +v
    +        } else if (hasTypeDef(type, DateType) && !isNaN(Date.parse(v))) {
    +          debug('convert to date', v)
    +          v = new Date(v)
    +        }
    +      }
    +
    +      if (!hasType) {
    +        if (!hasTypeDefault) {
    +          return v
    +        }
    +        // if the default type has been passed in then we want to validate the
    +        // unknown data key instead of bailing out earlier. we also set the raw
    +        // type which is passed to the invalid handler so that it can be
    +        // determined if during validation if it is unknown vs invalid
    +        rawType = typeDefault
    +      }
    +
    +      // allow `--no-blah` to set 'blah' to null if null is allowed
    +      if (v === false && ~type.indexOf(null) &&
    +          !(~type.indexOf(false) || hasTypeDef(type, BooleanType))) {
    +        v = null
    +      }
    +
    +      const d = {}
    +      d[k] = v
    +      debug('prevalidated val', d, v, rawType)
    +      if (!validate(d, k, v, rawType, { typeDefs })) {
    +        if (invalidHandler) {
    +          invalidHandler(k, v, rawType, data)
    +        } else if (invalidHandler !== false) {
    +          debug('invalid: ' + k + '=' + v, rawType)
    +        }
    +        return remove
    +      }
    +      debug('validated v', d, v, rawType)
    +      return d[k]
    +    }).filter((v) => v !== remove)
    +
    +    // if we allow Array specifically, then an empty array is how we
    +    // express 'no value here', not null.  Allow it.
    +    if (!val.length && doesNotHaveTypeDef(type, ArrayType)) {
    +      debug('VAL HAS NO LENGTH, DELETE IT', val, k, type.indexOf(ArrayType))
    +      delete data[k]
    +    } else if (isArray) {
    +      debug(isArray, data[k], val)
    +      data[k] = val
    +    } else {
    +      data[k] = val[0]
    +    }
    +
    +    debug('k=%s val=%j', k, val, data[k])
    +  })
    +}
    +
    +function validate (data, k, val, type, { typeDefs } = {}) {
    +  const ArrayType = typeDefs?.Array?.type
    +  // arrays are lists of types.
    +  if (Array.isArray(type)) {
    +    for (let i = 0, l = type.length; i < l; i++) {
    +      if (isTypeDef(type[i], ArrayType)) {
    +        continue
    +      }
    +      if (validate(data, k, val, type[i], { typeDefs })) {
    +        return true
    +      }
    +    }
    +    delete data[k]
    +    return false
    +  }
    +
    +  // an array of anything?
    +  if (isTypeDef(type, ArrayType)) {
    +    return true
    +  }
    +
    +  // Original comment:
    +  // NaN is poisonous.  Means that something is not allowed.
    +  // New comment: Changing this to an isNaN check breaks a lot of tests.
    +  // Something is being assumed here that is not actually what happens in
    +  // practice.  Fixing it is outside the scope of getting linting to pass in
    +  // this repo. Leaving as-is for now.
    +  /* eslint-disable-next-line no-self-compare */
    +  if (type !== type) {
    +    debug('Poison NaN', k, val, type)
    +    delete data[k]
    +    return false
    +  }
    +
    +  // explicit list of values
    +  if (val === type) {
    +    debug('Explicitly allowed %j', val)
    +    data[k] = val
    +    return true
    +  }
    +
    +  // now go through the list of typeDefs, validate against each one.
    +  let ok = false
    +  const types = Object.keys(typeDefs)
    +  for (let i = 0, l = types.length; i < l; i++) {
    +    debug('test type %j %j %j', k, val, types[i])
    +    const t = typeDefs[types[i]]
    +    if (t && (
    +      (type && type.name && t.type && t.type.name) ?
    +        (type.name === t.type.name) :
    +        (type === t.type)
    +    )) {
    +      const d = {}
    +      ok = t.validate(d, k, val) !== false
    +      val = d[k]
    +      if (ok) {
    +        data[k] = val
    +        break
    +      }
    +    }
    +  }
    +  debug('OK? %j (%j %j %j)', ok, k, val, types[types.length - 1])
    +
    +  if (!ok) {
    +    delete data[k]
    +  }
    +  return ok
    +}
    +
    +function parse (args, data, remain, {
    +  types = {},
    +  typeDefs = {},
    +  shorthands = {},
    +  dynamicTypes,
    +  unknownHandler,
    +  abbrevHandler,
    +} = {}) {
    +  const StringType = typeDefs.String?.type
    +  const NumberType = typeDefs.Number?.type
    +  const ArrayType = typeDefs.Array?.type
    +  const BooleanType = typeDefs.Boolean?.type
    +
    +  debug('parse', args, data, remain)
    +
    +  const abbrevs = abbrev(Object.keys(types))
    +  debug('abbrevs=%j', abbrevs)
    +  const shortAbbr = abbrev(Object.keys(shorthands))
    +
    +  for (let i = 0; i < args.length; i++) {
    +    let arg = args[i]
    +    debug('arg', arg)
    +
    +    if (arg.match(/^-{2,}$/)) {
    +      // done with keys.
    +      // the rest are args.
    +      remain.push.apply(remain, args.slice(i + 1))
    +      args[i] = '--'
    +      break
    +    }
    +    let hadEq = false
    +    if (arg.charAt(0) === '-' && arg.length > 1) {
    +      const at = arg.indexOf('=')
    +      if (at > -1) {
    +        hadEq = true
    +        const v = arg.slice(at + 1)
    +        arg = arg.slice(0, at)
    +        args.splice(i, 1, arg, v)
    +      }
    +
    +      // see if it's a shorthand
    +      // if so, splice and back up to re-parse it.
    +      const shRes = resolveShort(arg, shortAbbr, abbrevs, { shorthands, abbrevHandler })
    +      debug('arg=%j shRes=%j', arg, shRes)
    +      if (shRes) {
    +        args.splice.apply(args, [i, 1].concat(shRes))
    +        if (arg !== shRes[0]) {
    +          i--
    +          continue
    +        }
    +      }
    +      arg = arg.replace(/^-+/, '')
    +      let no = null
    +      while (arg.toLowerCase().indexOf('no-') === 0) {
    +        no = !no
    +        arg = arg.slice(3)
    +      }
    +
    +      // abbrev includes the original full string in its abbrev list
    +      if (abbrevs[arg] && abbrevs[arg] !== arg) {
    +        if (abbrevHandler) {
    +          abbrevHandler(arg, abbrevs[arg])
    +        } else if (abbrevHandler !== false) {
    +          debug(`abbrev: ${arg} -> ${abbrevs[arg]}`)
    +        }
    +        arg = abbrevs[arg]
    +      }
    +
    +      let [hasType, argType] = getType(arg, { types, dynamicTypes })
    +      let isTypeArray = Array.isArray(argType)
    +      if (isTypeArray && argType.length === 1) {
    +        isTypeArray = false
    +        argType = argType[0]
    +      }
    +
    +      let isArray = isTypeDef(argType, ArrayType) ||
    +        isTypeArray && hasTypeDef(argType, ArrayType)
    +
    +      // allow unknown things to be arrays if specified multiple times.
    +      if (!hasType && hasOwn(data, arg)) {
    +        if (!Array.isArray(data[arg])) {
    +          data[arg] = [data[arg]]
    +        }
    +        isArray = true
    +      }
    +
    +      let val
    +      let la = args[i + 1]
    +
    +      const isBool = typeof no === 'boolean' ||
    +        isTypeDef(argType, BooleanType) ||
    +        isTypeArray && hasTypeDef(argType, BooleanType) ||
    +        (typeof argType === 'undefined' && !hadEq) ||
    +        (la === 'false' &&
    +         (argType === null ||
    +          isTypeArray && ~argType.indexOf(null)))
    +
    +      if (typeof argType === 'undefined') {
    +        // la is going to unexpectedly be parsed outside the context of this arg
    +        const hangingLa = !hadEq && la && !la?.startsWith('-') && !['true', 'false'].includes(la)
    +        if (unknownHandler) {
    +          if (hangingLa) {
    +            unknownHandler(arg, la)
    +          } else {
    +            unknownHandler(arg)
    +          }
    +        } else if (unknownHandler !== false) {
    +          debug(`unknown: ${arg}`)
    +          if (hangingLa) {
    +            debug(`unknown: ${la} parsed as normal opt`)
    +          }
    +        }
    +      }
    +
    +      if (isBool) {
    +        // just set and move along
    +        val = !no
    +        // however, also support --bool true or --bool false
    +        if (la === 'true' || la === 'false') {
    +          val = JSON.parse(la)
    +          la = null
    +          if (no) {
    +            val = !val
    +          }
    +          i++
    +        }
    +
    +        // also support "foo":[Boolean, "bar"] and "--foo bar"
    +        if (isTypeArray && la) {
    +          if (~argType.indexOf(la)) {
    +            // an explicit type
    +            val = la
    +            i++
    +          } else if (la === 'null' && ~argType.indexOf(null)) {
    +            // null allowed
    +            val = null
    +            i++
    +          } else if (!la.match(/^-{2,}[^-]/) &&
    +                      !isNaN(la) &&
    +                      hasTypeDef(argType, NumberType)) {
    +            // number
    +            val = +la
    +            i++
    +          } else if (!la.match(/^-[^-]/) && hasTypeDef(argType, StringType)) {
    +            // string
    +            val = la
    +            i++
    +          }
    +        }
    +
    +        if (isArray) {
    +          (data[arg] = data[arg] || []).push(val)
    +        } else {
    +          data[arg] = val
    +        }
    +
    +        continue
    +      }
    +
    +      if (isTypeDef(argType, StringType)) {
    +        if (la === undefined) {
    +          la = ''
    +        } else if (la.match(/^-{1,2}[^-]+/)) {
    +          la = ''
    +          i--
    +        }
    +      }
    +
    +      if (la && la.match(/^-{2,}$/)) {
    +        la = undefined
    +        i--
    +      }
    +
    +      val = la === undefined ? true : la
    +      if (isArray) {
    +        (data[arg] = data[arg] || []).push(val)
    +      } else {
    +        data[arg] = val
    +      }
    +
    +      i++
    +      continue
    +    }
    +    remain.push(arg)
    +  }
    +}
    +
    +const SINGLES = Symbol('singles')
    +const singleCharacters = (arg, shorthands) => {
    +  let singles = shorthands[SINGLES]
    +  if (!singles) {
    +    singles = Object.keys(shorthands).filter((s) => s.length === 1).reduce((l, r) => {
    +      l[r] = true
    +      return l
    +    }, {})
    +    shorthands[SINGLES] = singles
    +    debug('shorthand singles', singles)
    +  }
    +  const chrs = arg.split('').filter((c) => singles[c])
    +  return chrs.join('') === arg ? chrs : null
    +}
    +
    +function resolveShort (arg, ...rest) {
    +  const { abbrevHandler, types = {}, shorthands = {} } = rest.length ? rest.pop() : {}
    +  const shortAbbr = rest[0] ?? abbrev(Object.keys(shorthands))
    +  const abbrevs = rest[1] ?? abbrev(Object.keys(types))
    +
    +  // handle single-char shorthands glommed together, like
    +  // npm ls -glp, but only if there is one dash, and only if
    +  // all of the chars are single-char shorthands, and it's
    +  // not a match to some other abbrev.
    +  arg = arg.replace(/^-+/, '')
    +
    +  // if it's an exact known option, then don't go any further
    +  if (abbrevs[arg] === arg) {
    +    return null
    +  }
    +
    +  // if it's an exact known shortopt, same deal
    +  if (shorthands[arg]) {
    +    // make it an array, if it's a list of words
    +    if (shorthands[arg] && !Array.isArray(shorthands[arg])) {
    +      shorthands[arg] = shorthands[arg].split(/\s+/)
    +    }
    +
    +    return shorthands[arg]
    +  }
    +
    +  // first check to see if this arg is a set of single-char shorthands
    +  const chrs = singleCharacters(arg, shorthands)
    +  if (chrs) {
    +    return chrs.map((c) => shorthands[c]).reduce((l, r) => l.concat(r), [])
    +  }
    +
    +  // if it's an arg abbrev, and not a literal shorthand, then prefer the arg
    +  if (abbrevs[arg] && !shorthands[arg]) {
    +    return null
    +  }
    +
    +  // if it's an abbr for a shorthand, then use that
    +  // exact match has already happened so we don't need to account for that here
    +  if (shortAbbr[arg]) {
    +    if (abbrevHandler) {
    +      abbrevHandler(arg, shortAbbr[arg])
    +    } else if (abbrevHandler !== false) {
    +      debug(`abbrev: ${arg} -> ${shortAbbr[arg]}`)
    +    }
    +    arg = shortAbbr[arg]
    +  }
    +
    +  // make it an array, if it's a list of words
    +  if (shorthands[arg] && !Array.isArray(shorthands[arg])) {
    +    shorthands[arg] = shorthands[arg].split(/\s+/)
    +  }
    +
    +  return shorthands[arg]
    +}
    +
    +module.exports = {
    +  nopt,
    +  clean,
    +  parse,
    +  validate,
    +  resolveShort,
    +  typeDefs: defaultTypeDefs,
    +}
    diff --git a/deps/npm/workspaces/config/node_modules/nopt/lib/nopt.js b/deps/npm/workspaces/config/node_modules/nopt/lib/nopt.js
    new file mode 100644
    index 00000000000000..9a24342b374aa0
    --- /dev/null
    +++ b/deps/npm/workspaces/config/node_modules/nopt/lib/nopt.js
    @@ -0,0 +1,34 @@
    +const lib = require('./nopt-lib')
    +const defaultTypeDefs = require('./type-defs')
    +
    +// This is the version of nopt's API that requires setting typeDefs and invalidHandler
    +// on the required `nopt` object since it is a singleton. To not do a breaking change
    +// an API that requires all options be passed in is located in `nopt-lib.js` and
    +// exported here as lib.
    +// TODO(breaking): make API only work in non-singleton mode
    +
    +module.exports = exports = nopt
    +exports.clean = clean
    +exports.typeDefs = defaultTypeDefs
    +exports.lib = lib
    +
    +function nopt (types, shorthands, args = process.argv, slice = 2) {
    +  return lib.nopt(args.slice(slice), {
    +    types: types || {},
    +    shorthands: shorthands || {},
    +    typeDefs: exports.typeDefs,
    +    invalidHandler: exports.invalidHandler,
    +    unknownHandler: exports.unknownHandler,
    +    abbrevHandler: exports.abbrevHandler,
    +  })
    +}
    +
    +function clean (data, types, typeDefs = exports.typeDefs) {
    +  return lib.clean(data, {
    +    types: types || {},
    +    typeDefs,
    +    invalidHandler: exports.invalidHandler,
    +    unknownHandler: exports.unknownHandler,
    +    abbrevHandler: exports.abbrevHandler,
    +  })
    +}
    diff --git a/deps/npm/workspaces/config/node_modules/nopt/lib/type-defs.js b/deps/npm/workspaces/config/node_modules/nopt/lib/type-defs.js
    new file mode 100644
    index 00000000000000..608352ee248cc4
    --- /dev/null
    +++ b/deps/npm/workspaces/config/node_modules/nopt/lib/type-defs.js
    @@ -0,0 +1,91 @@
    +const url = require('url')
    +const path = require('path')
    +const Stream = require('stream').Stream
    +const os = require('os')
    +const debug = require('./debug')
    +
    +function validateString (data, k, val) {
    +  data[k] = String(val)
    +}
    +
    +function validatePath (data, k, val) {
    +  if (val === true) {
    +    return false
    +  }
    +  if (val === null) {
    +    return true
    +  }
    +
    +  val = String(val)
    +
    +  const isWin = process.platform === 'win32'
    +  const homePattern = isWin ? /^~(\/|\\)/ : /^~\//
    +  const home = os.homedir()
    +
    +  if (home && val.match(homePattern)) {
    +    data[k] = path.resolve(home, val.slice(2))
    +  } else {
    +    data[k] = path.resolve(val)
    +  }
    +  return true
    +}
    +
    +function validateNumber (data, k, val) {
    +  debug('validate Number %j %j %j', k, val, isNaN(val))
    +  if (isNaN(val)) {
    +    return false
    +  }
    +  data[k] = +val
    +}
    +
    +function validateDate (data, k, val) {
    +  const s = Date.parse(val)
    +  debug('validate Date %j %j %j', k, val, s)
    +  if (isNaN(s)) {
    +    return false
    +  }
    +  data[k] = new Date(val)
    +}
    +
    +function validateBoolean (data, k, val) {
    +  if (typeof val === 'string') {
    +    if (!isNaN(val)) {
    +      val = !!(+val)
    +    } else if (val === 'null' || val === 'false') {
    +      val = false
    +    } else {
    +      val = true
    +    }
    +  } else {
    +    val = !!val
    +  }
    +  data[k] = val
    +}
    +
    +function validateUrl (data, k, val) {
    +  // Changing this would be a breaking change in the npm cli
    +  /* eslint-disable-next-line node/no-deprecated-api */
    +  val = url.parse(String(val))
    +  if (!val.host) {
    +    return false
    +  }
    +  data[k] = val.href
    +}
    +
    +function validateStream (data, k, val) {
    +  if (!(val instanceof Stream)) {
    +    return false
    +  }
    +  data[k] = val
    +}
    +
    +module.exports = {
    +  String: { type: String, validate: validateString },
    +  Boolean: { type: Boolean, validate: validateBoolean },
    +  url: { type: url, validate: validateUrl },
    +  Number: { type: Number, validate: validateNumber },
    +  path: { type: path, validate: validatePath },
    +  Stream: { type: Stream, validate: validateStream },
    +  Date: { type: Date, validate: validateDate },
    +  Array: { type: Array },
    +}
    diff --git a/deps/npm/workspaces/config/node_modules/nopt/node_modules/abbrev/LICENSE b/deps/npm/workspaces/config/node_modules/nopt/node_modules/abbrev/LICENSE
    new file mode 100644
    index 00000000000000..9bcfa9d7d8d26e
    --- /dev/null
    +++ b/deps/npm/workspaces/config/node_modules/nopt/node_modules/abbrev/LICENSE
    @@ -0,0 +1,46 @@
    +This software is dual-licensed under the ISC and MIT licenses.
    +You may use this software under EITHER of the following licenses.
    +
    +----------
    +
    +The ISC License
    +
    +Copyright (c) Isaac Z. Schlueter and Contributors
    +
    +Permission to use, copy, modify, and/or distribute this software for any
    +purpose with or without fee is hereby granted, provided that the above
    +copyright notice and this permission notice appear in all copies.
    +
    +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
    +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
    +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
    +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
    +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
    +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    +
    +----------
    +
    +Copyright Isaac Z. Schlueter and Contributors
    +All rights reserved.
    +
    +Permission is hereby granted, free of charge, to any person
    +obtaining a copy of this software and associated documentation
    +files (the "Software"), to deal in the Software without
    +restriction, including without limitation the rights to use,
    +copy, modify, merge, publish, distribute, sublicense, and/or sell
    +copies of the Software, and to permit persons to whom the
    +Software is furnished to do so, subject to the following
    +conditions:
    +
    +The above copyright notice and this permission notice shall be
    +included in all copies or substantial portions of the Software.
    +
    +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
    +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
    +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
    +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
    +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
    +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
    +OTHER DEALINGS IN THE SOFTWARE.
    diff --git a/deps/npm/workspaces/config/node_modules/nopt/node_modules/abbrev/README.md b/deps/npm/workspaces/config/node_modules/nopt/node_modules/abbrev/README.md
    new file mode 100644
    index 00000000000000..c6cdd7ea8417c7
    --- /dev/null
    +++ b/deps/npm/workspaces/config/node_modules/nopt/node_modules/abbrev/README.md
    @@ -0,0 +1,23 @@
    +# abbrev-js
    +
    +Just like [ruby's Abbrev](http://apidock.com/ruby/Abbrev).
    +
    +Usage:
    +
    +    var abbrev = require("abbrev");
    +    abbrev("foo", "fool", "folding", "flop");
    +
    +    // returns:
    +    { fl: 'flop'
    +    , flo: 'flop'
    +    , flop: 'flop'
    +    , fol: 'folding'
    +    , fold: 'folding'
    +    , foldi: 'folding'
    +    , foldin: 'folding'
    +    , folding: 'folding'
    +    , foo: 'foo'
    +    , fool: 'fool'
    +    }
    +
    +This is handy for command-line scripts, or other cases where you want to be able to accept shorthands.
    diff --git a/deps/npm/workspaces/config/node_modules/nopt/node_modules/abbrev/lib/index.js b/deps/npm/workspaces/config/node_modules/nopt/node_modules/abbrev/lib/index.js
    new file mode 100644
    index 00000000000000..f7bee0c6fc7ada
    --- /dev/null
    +++ b/deps/npm/workspaces/config/node_modules/nopt/node_modules/abbrev/lib/index.js
    @@ -0,0 +1,53 @@
    +module.exports = abbrev
    +
    +function abbrev (...args) {
    +  let list = args
    +  if (args.length === 1 && (Array.isArray(args[0]) || typeof args[0] === 'string')) {
    +    list = [].concat(args[0])
    +  }
    +
    +  for (let i = 0, l = list.length; i < l; i++) {
    +    list[i] = typeof list[i] === 'string' ? list[i] : String(list[i])
    +  }
    +
    +  // sort them lexicographically, so that they're next to their nearest kin
    +  list = list.sort(lexSort)
    +
    +  // walk through each, seeing how much it has in common with the next and previous
    +  const abbrevs = {}
    +  let prev = ''
    +  for (let ii = 0, ll = list.length; ii < ll; ii++) {
    +    const current = list[ii]
    +    const next = list[ii + 1] || ''
    +    let nextMatches = true
    +    let prevMatches = true
    +    if (current === next) {
    +      continue
    +    }
    +    let j = 0
    +    const cl = current.length
    +    for (; j < cl; j++) {
    +      const curChar = current.charAt(j)
    +      nextMatches = nextMatches && curChar === next.charAt(j)
    +      prevMatches = prevMatches && curChar === prev.charAt(j)
    +      if (!nextMatches && !prevMatches) {
    +        j++
    +        break
    +      }
    +    }
    +    prev = current
    +    if (j === cl) {
    +      abbrevs[current] = current
    +      continue
    +    }
    +    for (let a = current.slice(0, j); j <= cl; j++) {
    +      abbrevs[a] = current
    +      a += current.charAt(j)
    +    }
    +  }
    +  return abbrevs
    +}
    +
    +function lexSort (a, b) {
    +  return a === b ? 0 : a > b ? 1 : -1
    +}
    diff --git a/deps/npm/workspaces/config/node_modules/nopt/node_modules/abbrev/package.json b/deps/npm/workspaces/config/node_modules/nopt/node_modules/abbrev/package.json
    new file mode 100644
    index 00000000000000..077d4bccd0e69e
    --- /dev/null
    +++ b/deps/npm/workspaces/config/node_modules/nopt/node_modules/abbrev/package.json
    @@ -0,0 +1,45 @@
    +{
    +  "name": "abbrev",
    +  "version": "3.0.1",
    +  "description": "Like ruby's abbrev module, but in js",
    +  "author": "GitHub Inc.",
    +  "main": "lib/index.js",
    +  "scripts": {
    +    "test": "tap",
    +    "lint": "npm run eslint",
    +    "postlint": "template-oss-check",
    +    "template-oss-apply": "template-oss-apply --force",
    +    "lintfix": "npm run eslint -- --fix",
    +    "snap": "tap",
    +    "posttest": "npm run lint",
    +    "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\""
    +  },
    +  "repository": {
    +    "type": "git",
    +    "url": "git+https://github.com/npm/abbrev-js.git"
    +  },
    +  "license": "ISC",
    +  "devDependencies": {
    +    "@npmcli/eslint-config": "^5.0.0",
    +    "@npmcli/template-oss": "4.24.3",
    +    "tap": "^16.3.0"
    +  },
    +  "tap": {
    +    "nyc-arg": [
    +      "--exclude",
    +      "tap-snapshots/**"
    +    ]
    +  },
    +  "files": [
    +    "bin/",
    +    "lib/"
    +  ],
    +  "engines": {
    +    "node": "^18.17.0 || >=20.5.0"
    +  },
    +  "templateOSS": {
    +    "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    +    "version": "4.24.3",
    +    "publish": true
    +  }
    +}
    diff --git a/deps/npm/workspaces/config/node_modules/nopt/package.json b/deps/npm/workspaces/config/node_modules/nopt/package.json
    new file mode 100644
    index 00000000000000..0732ada73c1d00
    --- /dev/null
    +++ b/deps/npm/workspaces/config/node_modules/nopt/package.json
    @@ -0,0 +1,52 @@
    +{
    +  "name": "nopt",
    +  "version": "8.1.0",
    +  "description": "Option parsing for Node, supporting types, shorthands, etc. Used by npm.",
    +  "author": "GitHub Inc.",
    +  "main": "lib/nopt.js",
    +  "scripts": {
    +    "test": "tap",
    +    "lint": "npm run eslint",
    +    "postlint": "template-oss-check",
    +    "template-oss-apply": "template-oss-apply --force",
    +    "lintfix": "npm run eslint -- --fix",
    +    "snap": "tap",
    +    "posttest": "npm run lint",
    +    "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\""
    +  },
    +  "repository": {
    +    "type": "git",
    +    "url": "git+https://github.com/npm/nopt.git"
    +  },
    +  "bin": {
    +    "nopt": "bin/nopt.js"
    +  },
    +  "license": "ISC",
    +  "dependencies": {
    +    "abbrev": "^3.0.0"
    +  },
    +  "devDependencies": {
    +    "@npmcli/eslint-config": "^5.0.0",
    +    "@npmcli/template-oss": "4.23.6",
    +    "tap": "^16.3.0"
    +  },
    +  "tap": {
    +    "nyc-arg": [
    +      "--exclude",
    +      "tap-snapshots/**"
    +    ]
    +  },
    +  "files": [
    +    "bin/",
    +    "lib/"
    +  ],
    +  "engines": {
    +    "node": "^18.17.0 || >=20.5.0"
    +  },
    +  "templateOSS": {
    +    "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    +    "windowsCI": false,
    +    "version": "4.23.6",
    +    "publish": true
    +  }
    +}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/lru-cache/LICENSE b/deps/npm/workspaces/libnpmdiff/node_modules/@npmcli/installed-package-contents/LICENSE
    similarity index 92%
    rename from deps/npm/node_modules/node-gyp/node_modules/lru-cache/LICENSE
    rename to deps/npm/workspaces/libnpmdiff/node_modules/@npmcli/installed-package-contents/LICENSE
    index f785757cd63f86..19cec97b184683 100644
    --- a/deps/npm/node_modules/node-gyp/node_modules/lru-cache/LICENSE
    +++ b/deps/npm/workspaces/libnpmdiff/node_modules/@npmcli/installed-package-contents/LICENSE
    @@ -1,6 +1,6 @@
     The ISC License
     
    -Copyright (c) 2010-2023 Isaac Z. Schlueter and Contributors
    +Copyright (c) npm, Inc.
     
     Permission to use, copy, modify, and/or distribute this software for any
     purpose with or without fee is hereby granted, provided that the above
    diff --git a/deps/npm/workspaces/libnpmdiff/node_modules/@npmcli/installed-package-contents/README.md b/deps/npm/workspaces/libnpmdiff/node_modules/@npmcli/installed-package-contents/README.md
    new file mode 100644
    index 00000000000000..edd23bd26d64c8
    --- /dev/null
    +++ b/deps/npm/workspaces/libnpmdiff/node_modules/@npmcli/installed-package-contents/README.md
    @@ -0,0 +1,109 @@
    +# @npmcli/installed-package-contents
    +
    +Get the list of files installed in a package in node_modules, including
    +bundled dependencies.
    +
    +This is useful if you want to remove a package node from the tree _without_
    +removing its child nodes, for example to extract a new version of the
    +dependency into place safely.
    +
    +It's sort of the reflection of [npm-packlist](http://npm.im/npm-packlist),
    +but for listing out the _installed_ files rather than the files that _will_
    +be installed.  This is of course a much simpler operation, because we don't
    +have to handle ignore files or package.json `files` lists.
    +
    +## USAGE
    +
    +```js
    +// programmatic usage
    +const pkgContents = require('@npmcli/installed-package-contents')
    +
    +pkgContents({ path: 'node_modules/foo', depth: 1 }).then(files => {
    +  // files is an array of items that need to be passed to
    +  // rimraf or moved out of the way to make the folder empty
    +  // if foo bundled dependencies, those will be included.
    +  // It will not traverse into child directories, because we set
    +  // depth:1 in the options.
    +  // If the folder doesn't exist, this returns an empty array.
    +})
    +
    +pkgContents({ path: 'node_modules/foo', depth: Infinity }).then(files => {
    +  // setting depth:Infinity tells it to keep walking forever
    +  // until it hits something that isn't a directory, so we'll
    +  // just get the list of all files, but not their containing
    +  // directories.
    +})
    +```
    +
    +As a CLI:
    +
    +```bash
    +$ installed-package-contents node_modules/bundle-some -d1
    +node_modules/.bin/some
    +node_modules/bundle-some/package.json
    +node_modules/bundle-some/node_modules/@scope/baz
    +node_modules/bundle-some/node_modules/.bin/foo
    +node_modules/bundle-some/node_modules/foo
    +```
    +
    +CLI options:
    +
    +```
    +Usage:
    +  installed-package-contents  [-d --depth=]
    +
    +Lists the files installed for a package specified by .
    +
    +Options:
    +  -d --depth=   Provide a numeric value ("Infinity" is allowed)
    +                      to specify how deep in the file tree to traverse.
    +                      Default=1
    +  -h --help           Show this usage information
    +```
    +
    +## OPTIONS
    +
    +* `depth` Number, default `1`.  How deep to traverse through folders to get
    +    contents.  Typically you'd want to set this to either `1` (to get the
    +    surface files and folders) or `Infinity` (to get all files), but any
    +    other positive number is supported as well.  If set to `0` or a
    +    negative number, returns the path provided and (if it is a package) its
    +    set of linked bins.
    +* `path` Required.  Path to the package in `node_modules` where traversal
    +    should begin.
    +
    +## RETURN VALUE
    +
    +A Promise that resolves to an array of fully-resolved files and folders
    +matching the criteria.  This includes all bundled dependencies in
    +`node_modules`, and any linked executables in `node_modules/.bin` that the
    +package caused to be installed.
    +
    +An empty or missing package folder will return an empty array.  Empty
    +directories _within_ package contents are listed, even if the `depth`
    +argument would cause them to be traversed into.
    +
    +## CAVEAT
    +
    +If using this module to generate a list of files that should be recursively
    +removed to clear away the package, note that this will leave empty
    +directories behind in certain cases:
    +
    +- If all child packages are bundled dependencies, then the
    +    `node_modules` folder will remain.
    +- If all child packages within a given scope were bundled dependencies,
    +    then the `node_modules/@scope` folder will remain.
    +- If all linked bin scripts were removed, then an empty `node_modules/.bin`
    +    folder will remain.
    +
    +In the interest of speed and algorithmic complexity, this module does _not_
    +do a subsequent readdir to see if it would remove all directory entries,
    +though it would be easier to look at if it returned `node_modules` or
    +`.bin` in that case rather than the contents.  However, if the intent is to
    +pass these arguments to `rimraf`, it hardly makes sense to do _two_
    +`readdir` calls just so that we can have the luxury of having to make a
    +third.
    +
    +Since the primary use case is to delete a package's contents so that they
    +can be re-filled with a new version of that package, this caveat does not
    +pose a problem.  Empty directories are already ignored by both npm and git.
    diff --git a/deps/npm/workspaces/libnpmdiff/node_modules/@npmcli/installed-package-contents/bin/index.js b/deps/npm/workspaces/libnpmdiff/node_modules/@npmcli/installed-package-contents/bin/index.js
    new file mode 100755
    index 00000000000000..7b83b23bf168c0
    --- /dev/null
    +++ b/deps/npm/workspaces/libnpmdiff/node_modules/@npmcli/installed-package-contents/bin/index.js
    @@ -0,0 +1,44 @@
    +#! /usr/bin/env node
    +
    +const { relative } = require('path')
    +const pkgContents = require('../')
    +
    +const usage = `Usage:
    +  installed-package-contents  [-d --depth=]
    +
    +Lists the files installed for a package specified by .
    +
    +Options:
    +  -d --depth=   Provide a numeric value ("Infinity" is allowed)
    +                      to specify how deep in the file tree to traverse.
    +                      Default=1
    +  -h --help           Show this usage information`
    +
    +const options = {}
    +
    +process.argv.slice(2).forEach(arg => {
    +  let match
    +  if ((match = arg.match(/^(?:--depth=|-d)([0-9]+|Infinity)/))) {
    +    options.depth = +match[1]
    +  } else if (arg === '-h' || arg === '--help') {
    +    console.log(usage)
    +    process.exit(0)
    +  } else {
    +    options.path = arg
    +  }
    +})
    +
    +if (!options.path) {
    +  console.error('ERROR: no path provided')
    +  console.error(usage)
    +  process.exit(1)
    +}
    +
    +const cwd = process.cwd()
    +
    +pkgContents(options)
    +  .then(list => list.sort().forEach(p => console.log(relative(cwd, p))))
    +  .catch(/* istanbul ignore next - pretty unusual */ er => {
    +    console.error(er)
    +    process.exit(1)
    +  })
    diff --git a/deps/npm/workspaces/libnpmdiff/node_modules/@npmcli/installed-package-contents/lib/index.js b/deps/npm/workspaces/libnpmdiff/node_modules/@npmcli/installed-package-contents/lib/index.js
    new file mode 100644
    index 00000000000000..ab1486cd01d003
    --- /dev/null
    +++ b/deps/npm/workspaces/libnpmdiff/node_modules/@npmcli/installed-package-contents/lib/index.js
    @@ -0,0 +1,181 @@
    +// to GET CONTENTS for folder at PATH (which may be a PACKAGE):
    +// - if PACKAGE, read path/package.json
    +//   - if bins in ../node_modules/.bin, add those to result
    +// - if depth >= maxDepth, add PATH to result, and finish
    +// - readdir(PATH, with file types)
    +// - add all FILEs in PATH to result
    +// - if PARENT:
    +//   - if depth < maxDepth, add GET CONTENTS of all DIRs in PATH
    +//   - else, add all DIRs in PATH
    +// - if no parent
    +//   - if no bundled deps,
    +//     - if depth < maxDepth, add GET CONTENTS of DIRs in path except
    +//       node_modules
    +//     - else, add all DIRs in path other than node_modules
    +//   - if has bundled deps,
    +//     - get list of bundled deps
    +//     - add GET CONTENTS of bundled deps, PACKAGE=true, depth + 1
    +
    +const bundled = require('npm-bundled')
    +const { readFile, readdir, stat } = require('fs/promises')
    +const { resolve, basename, dirname } = require('path')
    +const normalizePackageBin = require('npm-normalize-package-bin')
    +
    +const readPackage = ({ path, packageJsonCache }) => packageJsonCache.has(path)
    +  ? Promise.resolve(packageJsonCache.get(path))
    +  : readFile(path).then(json => {
    +    const pkg = normalizePackageBin(JSON.parse(json))
    +    packageJsonCache.set(path, pkg)
    +    return pkg
    +  }).catch(() => null)
    +
    +// just normalize bundle deps and bin, that's all we care about here.
    +const normalized = Symbol('package data has been normalized')
    +const rpj = ({ path, packageJsonCache }) => readPackage({ path, packageJsonCache })
    +  .then(pkg => {
    +    if (!pkg || pkg[normalized]) {
    +      return pkg
    +    }
    +    if (pkg.bundledDependencies && !pkg.bundleDependencies) {
    +      pkg.bundleDependencies = pkg.bundledDependencies
    +      delete pkg.bundledDependencies
    +    }
    +    const bd = pkg.bundleDependencies
    +    if (bd === true) {
    +      pkg.bundleDependencies = [
    +        ...Object.keys(pkg.dependencies || {}),
    +        ...Object.keys(pkg.optionalDependencies || {}),
    +      ]
    +    }
    +    if (typeof bd === 'object' && !Array.isArray(bd)) {
    +      pkg.bundleDependencies = Object.keys(bd)
    +    }
    +    pkg[normalized] = true
    +    return pkg
    +  })
    +
    +const pkgContents = async ({
    +  path,
    +  depth = 1,
    +  currentDepth = 0,
    +  pkg = null,
    +  result = null,
    +  packageJsonCache = null,
    +}) => {
    +  if (!result) {
    +    result = new Set()
    +  }
    +
    +  if (!packageJsonCache) {
    +    packageJsonCache = new Map()
    +  }
    +
    +  if (pkg === true) {
    +    return rpj({ path: path + '/package.json', packageJsonCache })
    +      .then(p => pkgContents({
    +        path,
    +        depth,
    +        currentDepth,
    +        pkg: p,
    +        result,
    +        packageJsonCache,
    +      }))
    +  }
    +
    +  if (pkg) {
    +    // add all bins to result if they exist
    +    if (pkg.bin) {
    +      const dir = dirname(path)
    +      const scope = basename(dir)
    +      const nm = /^@.+/.test(scope) ? dirname(dir) : dir
    +
    +      const binFiles = []
    +      Object.keys(pkg.bin).forEach(b => {
    +        const base = resolve(nm, '.bin', b)
    +        binFiles.push(base, base + '.cmd', base + '.ps1')
    +      })
    +
    +      const bins = await Promise.all(
    +        binFiles.map(b => stat(b).then(() => b).catch(() => null))
    +      )
    +      bins.filter(b => b).forEach(b => result.add(b))
    +    }
    +  }
    +
    +  if (currentDepth >= depth) {
    +    result.add(path)
    +    return result
    +  }
    +
    +  // we'll need bundle list later, so get that now in parallel
    +  const [dirEntries, bundleDeps] = await Promise.all([
    +    readdir(path, { withFileTypes: true }),
    +    currentDepth === 0 && pkg && pkg.bundleDependencies
    +      ? bundled({ path, packageJsonCache }) : null,
    +  ]).catch(() => [])
    +
    +  // not a thing, probably a missing folder
    +  if (!dirEntries) {
    +    return result
    +  }
    +
    +  // empty folder, just add the folder itself to the result
    +  if (!dirEntries.length && !bundleDeps && currentDepth !== 0) {
    +    result.add(path)
    +    return result
    +  }
    +
    +  const recursePromises = []
    +
    +  for (const entry of dirEntries) {
    +    const p = resolve(path, entry.name)
    +    if (entry.isDirectory() === false) {
    +      result.add(p)
    +      continue
    +    }
    +
    +    if (currentDepth !== 0 || entry.name !== 'node_modules') {
    +      if (currentDepth < depth - 1) {
    +        recursePromises.push(pkgContents({
    +          path: p,
    +          packageJsonCache,
    +          depth,
    +          currentDepth: currentDepth + 1,
    +          result,
    +        }))
    +      } else {
    +        result.add(p)
    +      }
    +      continue
    +    }
    +  }
    +
    +  if (bundleDeps) {
    +    // bundle deps are all folders
    +    // we always recurse to get pkg bins, but if currentDepth is too high,
    +    // it'll return early before walking their contents.
    +    recursePromises.push(...bundleDeps.map(dep => {
    +      const p = resolve(path, 'node_modules', dep)
    +      return pkgContents({
    +        path: p,
    +        packageJsonCache,
    +        pkg: true,
    +        depth,
    +        currentDepth: currentDepth + 1,
    +        result,
    +      })
    +    }))
    +  }
    +
    +  if (recursePromises.length) {
    +    await Promise.all(recursePromises)
    +  }
    +
    +  return result
    +}
    +
    +module.exports = ({ path, ...opts }) => pkgContents({
    +  path: resolve(path),
    +  ...opts,
    +  pkg: true,
    +}).then(results => [...results])
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/package.json b/deps/npm/workspaces/libnpmdiff/node_modules/@npmcli/installed-package-contents/package.json
    similarity index 58%
    rename from deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/package.json
    rename to deps/npm/workspaces/libnpmdiff/node_modules/@npmcli/installed-package-contents/package.json
    index 4d648fb5dfe052..d5b68a737daf49 100644
    --- a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/package.json
    +++ b/deps/npm/workspaces/libnpmdiff/node_modules/@npmcli/installed-package-contents/package.json
    @@ -1,25 +1,36 @@
     {
    -  "name": "@npmcli/agent",
    +  "name": "@npmcli/installed-package-contents",
       "version": "3.0.0",
    -  "description": "the http/https agent used by the npm cli",
    +  "description": "Get the list of files installed in a package in node_modules, including bundled dependencies",
    +  "author": "GitHub Inc.",
       "main": "lib/index.js",
    +  "bin": {
    +    "installed-package-contents": "bin/index.js"
    +  },
    +  "license": "ISC",
       "scripts": {
    -    "gencerts": "bash scripts/create-cert.sh",
         "test": "tap",
    +    "snap": "tap",
         "lint": "npm run eslint",
         "postlint": "template-oss-check",
         "template-oss-apply": "template-oss-apply --force",
         "lintfix": "npm run eslint -- --fix",
    -    "snap": "tap",
         "posttest": "npm run lint",
         "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\""
       },
    -  "author": "GitHub Inc.",
    -  "license": "ISC",
    -  "bugs": {
    -    "url": "https://github.com/npm/agent/issues"
    +  "devDependencies": {
    +    "@npmcli/eslint-config": "^5.0.0",
    +    "@npmcli/template-oss": "4.23.3",
    +    "tap": "^16.3.0"
    +  },
    +  "dependencies": {
    +    "npm-bundled": "^4.0.0",
    +    "npm-normalize-package-bin": "^4.0.0"
    +  },
    +  "repository": {
    +    "type": "git",
    +    "url": "git+https://github.com/npm/installed-package-contents.git"
       },
    -  "homepage": "https://github.com/npm/agent#readme",
       "files": [
         "bin/",
         "lib/"
    @@ -29,27 +40,8 @@
       },
       "templateOSS": {
         "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    -    "version": "4.23.1",
    -    "publish": "true"
    -  },
    -  "dependencies": {
    -    "agent-base": "^7.1.0",
    -    "http-proxy-agent": "^7.0.0",
    -    "https-proxy-agent": "^7.0.1",
    -    "lru-cache": "^10.0.1",
    -    "socks-proxy-agent": "^8.0.3"
    -  },
    -  "devDependencies": {
    -    "@npmcli/eslint-config": "^5.0.0",
    -    "@npmcli/template-oss": "4.23.1",
    -    "minipass-fetch": "^3.0.3",
    -    "nock": "^13.2.7",
    -    "socksv5": "^0.0.6",
    -    "tap": "^16.3.0"
    -  },
    -  "repository": {
    -    "type": "git",
    -    "url": "git+https://github.com/npm/agent.git"
    +    "version": "4.23.3",
    +    "publish": true
       },
       "tap": {
         "nyc-arg": [
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/minimatch/LICENSE b/deps/npm/workspaces/libnpmdiff/node_modules/npm-bundled/LICENSE
    similarity index 92%
    rename from deps/npm/node_modules/node-gyp/node_modules/minimatch/LICENSE
    rename to deps/npm/workspaces/libnpmdiff/node_modules/npm-bundled/LICENSE
    index 1493534e60dce4..20a47625409237 100644
    --- a/deps/npm/node_modules/node-gyp/node_modules/minimatch/LICENSE
    +++ b/deps/npm/workspaces/libnpmdiff/node_modules/npm-bundled/LICENSE
    @@ -1,6 +1,6 @@
     The ISC License
     
    -Copyright (c) 2011-2023 Isaac Z. Schlueter and Contributors
    +Copyright (c) npm, Inc. and Contributors
     
     Permission to use, copy, modify, and/or distribute this software for any
     purpose with or without fee is hereby granted, provided that the above
    diff --git a/deps/npm/workspaces/libnpmdiff/node_modules/npm-bundled/README.md b/deps/npm/workspaces/libnpmdiff/node_modules/npm-bundled/README.md
    new file mode 100644
    index 00000000000000..df2d8845be1479
    --- /dev/null
    +++ b/deps/npm/workspaces/libnpmdiff/node_modules/npm-bundled/README.md
    @@ -0,0 +1,48 @@
    +# npm-bundled
    +
    +Run this in a node package, and it'll tell you which things in
    +node_modules are bundledDependencies, or transitive dependencies of
    +bundled dependencies.
    +
    +[![Build Status](https://img.shields.io/github/actions/workflow/status/npm/npm-bundled/ci.yml?branch=main)](https://github.com/npm/npm-bundled)
    +
    +## USAGE
    +
    +To get the list of deps at the top level that are bundled (or
    +transitive deps of a bundled dep) run this:
    +
    +```js
    +const bundled = require('npm-bundled')
    +
    +// async version
    +bundled({ path: '/path/to/pkg/defaults/to/cwd'}, (er, list) => {
    +  // er means it had an error, which is _hella_ weird
    +  // list is a list of package names, like `fooblz` or `@corp/blerg`
    +  // the might not all be deps of the top level, because transitives
    +})
    +
    +// async promise version
    +bundled({ path: '/path/to/pkg/defaults/to/cwd'}).then(list => {
    +  // so promisey!
    +  // actually the callback version returns a promise, too, it just
    +  // attaches the supplied callback to the promise
    +})
    +
    +// sync version, throws if there's an error
    +const list = bundled.sync({ path: '/path/to/pkg/defaults/to/cwd'})
    +```
    +
    +That's basically all you need to know.  If you care to dig into it,
    +you can also use the `bundled.Walker` and `bundled.WalkerSync`
    +classes to get fancy.
    +
    +This library does not write anything to the filesystem, but it _may_
    +have undefined behavior if the structure of `node_modules` changes
    +while it's reading deps.
    +
    +All symlinks are followed.  This means that it can lead to surprising
    +results if a symlinked bundled dependency has a missing dependency
    +that is satisfied at the top level.  Since package creation resolves
    +symlinks as well, this is an edge case where package creation and
    +development environment are not going to be aligned, and is best
    +avoided.
    diff --git a/deps/npm/workspaces/libnpmdiff/node_modules/npm-bundled/lib/index.js b/deps/npm/workspaces/libnpmdiff/node_modules/npm-bundled/lib/index.js
    new file mode 100644
    index 00000000000000..f5ee0bb3ea7653
    --- /dev/null
    +++ b/deps/npm/workspaces/libnpmdiff/node_modules/npm-bundled/lib/index.js
    @@ -0,0 +1,254 @@
    +'use strict'
    +
    +// walk the tree of deps starting from the top level list of bundled deps
    +// Any deps at the top level that are depended on by a bundled dep that
    +// does not have that dep in its own node_modules folder are considered
    +// bundled deps as well.  This list of names can be passed to npm-packlist
    +// as the "bundled" argument.  Additionally, packageJsonCache is shared so
    +// packlist doesn't have to re-read files already consumed in this pass
    +
    +const fs = require('fs')
    +const path = require('path')
    +const EE = require('events').EventEmitter
    +// we don't care about the package bins, but we share a pj cache
    +// with other modules that DO care about it, so keep it nice.
    +const normalizePackageBin = require('npm-normalize-package-bin')
    +
    +class BundleWalker extends EE {
    +  constructor (opt) {
    +    opt = opt || {}
    +    super(opt)
    +    this.path = path.resolve(opt.path || process.cwd())
    +
    +    this.parent = opt.parent || null
    +    if (this.parent) {
    +      this.result = this.parent.result
    +      // only collect results in node_modules folders at the top level
    +      // since the node_modules in a bundled dep is included always
    +      if (!this.parent.parent) {
    +        const base = path.basename(this.path)
    +        const scope = path.basename(path.dirname(this.path))
    +        this.result.add(/^@/.test(scope) ? scope + '/' + base : base)
    +      }
    +      this.root = this.parent.root
    +      this.packageJsonCache = this.parent.packageJsonCache
    +    } else {
    +      this.result = new Set()
    +      this.root = this.path
    +      this.packageJsonCache = opt.packageJsonCache || new Map()
    +    }
    +
    +    this.seen = new Set()
    +    this.didDone = false
    +    this.children = 0
    +    this.node_modules = []
    +    this.package = null
    +    this.bundle = null
    +  }
    +
    +  addListener (ev, fn) {
    +    return this.on(ev, fn)
    +  }
    +
    +  on (ev, fn) {
    +    const ret = super.on(ev, fn)
    +    if (ev === 'done' && this.didDone) {
    +      this.emit('done', this.result)
    +    }
    +    return ret
    +  }
    +
    +  done () {
    +    if (!this.didDone) {
    +      this.didDone = true
    +      if (!this.parent) {
    +        const res = Array.from(this.result)
    +        this.result = res
    +        this.emit('done', res)
    +      } else {
    +        this.emit('done')
    +      }
    +    }
    +  }
    +
    +  start () {
    +    const pj = path.resolve(this.path, 'package.json')
    +    if (this.packageJsonCache.has(pj)) {
    +      this.onPackage(this.packageJsonCache.get(pj))
    +    } else {
    +      this.readPackageJson(pj)
    +    }
    +    return this
    +  }
    +
    +  readPackageJson (pj) {
    +    fs.readFile(pj, (er, data) =>
    +      er ? this.done() : this.onPackageJson(pj, data))
    +  }
    +
    +  onPackageJson (pj, data) {
    +    try {
    +      this.package = normalizePackageBin(JSON.parse(data + ''))
    +    } catch (er) {
    +      return this.done()
    +    }
    +    this.packageJsonCache.set(pj, this.package)
    +    this.onPackage(this.package)
    +  }
    +
    +  allDepsBundled (pkg) {
    +    return Object.keys(pkg.dependencies || {}).concat(
    +      Object.keys(pkg.optionalDependencies || {}))
    +  }
    +
    +  onPackage (pkg) {
    +    // all deps are bundled if we got here as a child.
    +    // otherwise, only bundle bundledDeps
    +    // Get a unique-ified array with a short-lived Set
    +    const bdRaw = this.parent ? this.allDepsBundled(pkg)
    +      : pkg.bundleDependencies || pkg.bundledDependencies || []
    +
    +    const bd = Array.from(new Set(
    +      Array.isArray(bdRaw) ? bdRaw
    +      : bdRaw === true ? this.allDepsBundled(pkg)
    +      : Object.keys(bdRaw)))
    +
    +    if (!bd.length) {
    +      return this.done()
    +    }
    +
    +    this.bundle = bd
    +    this.readModules()
    +  }
    +
    +  readModules () {
    +    readdirNodeModules(this.path + '/node_modules', (er, nm) =>
    +      er ? this.onReaddir([]) : this.onReaddir(nm))
    +  }
    +
    +  onReaddir (nm) {
    +    // keep track of what we have, in case children need it
    +    this.node_modules = nm
    +
    +    this.bundle.forEach(dep => this.childDep(dep))
    +    if (this.children === 0) {
    +      this.done()
    +    }
    +  }
    +
    +  childDep (dep) {
    +    if (this.node_modules.indexOf(dep) !== -1) {
    +      if (!this.seen.has(dep)) {
    +        this.seen.add(dep)
    +        this.child(dep)
    +      }
    +    } else if (this.parent) {
    +      this.parent.childDep(dep)
    +    }
    +  }
    +
    +  child (dep) {
    +    const p = this.path + '/node_modules/' + dep
    +    this.children += 1
    +    const child = new BundleWalker({
    +      path: p,
    +      parent: this,
    +    })
    +    child.on('done', () => {
    +      if (--this.children === 0) {
    +        this.done()
    +      }
    +    })
    +    child.start()
    +  }
    +}
    +
    +class BundleWalkerSync extends BundleWalker {
    +  start () {
    +    super.start()
    +    this.done()
    +    return this
    +  }
    +
    +  readPackageJson (pj) {
    +    try {
    +      this.onPackageJson(pj, fs.readFileSync(pj))
    +    } catch {
    +      // empty catch
    +    }
    +    return this
    +  }
    +
    +  readModules () {
    +    try {
    +      this.onReaddir(readdirNodeModulesSync(this.path + '/node_modules'))
    +    } catch {
    +      this.onReaddir([])
    +    }
    +  }
    +
    +  child (dep) {
    +    new BundleWalkerSync({
    +      path: this.path + '/node_modules/' + dep,
    +      parent: this,
    +    }).start()
    +  }
    +}
    +
    +const readdirNodeModules = (nm, cb) => {
    +  fs.readdir(nm, (er, set) => {
    +    if (er) {
    +      cb(er)
    +    } else {
    +      const scopes = set.filter(f => /^@/.test(f))
    +      if (!scopes.length) {
    +        cb(null, set)
    +      } else {
    +        const unscoped = set.filter(f => !/^@/.test(f))
    +        let count = scopes.length
    +        scopes.forEach(scope => {
    +          fs.readdir(nm + '/' + scope, (readdirEr, pkgs) => {
    +            if (readdirEr || !pkgs.length) {
    +              unscoped.push(scope)
    +            } else {
    +              unscoped.push.apply(unscoped, pkgs.map(p => scope + '/' + p))
    +            }
    +            if (--count === 0) {
    +              cb(null, unscoped)
    +            }
    +          })
    +        })
    +      }
    +    }
    +  })
    +}
    +
    +const readdirNodeModulesSync = nm => {
    +  const set = fs.readdirSync(nm)
    +  const unscoped = set.filter(f => !/^@/.test(f))
    +  const scopes = set.filter(f => /^@/.test(f)).map(scope => {
    +    try {
    +      const pkgs = fs.readdirSync(nm + '/' + scope)
    +      return pkgs.length ? pkgs.map(p => scope + '/' + p) : [scope]
    +    } catch (er) {
    +      return [scope]
    +    }
    +  }).reduce((a, b) => a.concat(b), [])
    +  return unscoped.concat(scopes)
    +}
    +
    +const walk = (options, callback) => {
    +  const p = new Promise((resolve, reject) => {
    +    new BundleWalker(options).on('done', resolve).on('error', reject).start()
    +  })
    +  return callback ? p.then(res => callback(null, res), callback) : p
    +}
    +
    +const walkSync = options => {
    +  return new BundleWalkerSync(options).start().result
    +}
    +
    +module.exports = walk
    +walk.sync = walkSync
    +walk.BundleWalker = BundleWalker
    +walk.BundleWalkerSync = BundleWalkerSync
    diff --git a/deps/npm/workspaces/libnpmdiff/node_modules/npm-bundled/package.json b/deps/npm/workspaces/libnpmdiff/node_modules/npm-bundled/package.json
    new file mode 100644
    index 00000000000000..c5daf35dbaa841
    --- /dev/null
    +++ b/deps/npm/workspaces/libnpmdiff/node_modules/npm-bundled/package.json
    @@ -0,0 +1,49 @@
    +{
    +  "name": "npm-bundled",
    +  "version": "4.0.0",
    +  "description": "list things in node_modules that are bundledDependencies, or transitive dependencies thereof",
    +  "main": "lib/index.js",
    +  "repository": {
    +    "type": "git",
    +    "url": "git+https://github.com/npm/npm-bundled.git"
    +  },
    +  "author": "GitHub Inc.",
    +  "license": "ISC",
    +  "devDependencies": {
    +    "@npmcli/eslint-config": "^5.0.0",
    +    "@npmcli/template-oss": "4.23.3",
    +    "mutate-fs": "^2.1.1",
    +    "tap": "^16.3.0"
    +  },
    +  "scripts": {
    +    "test": "tap",
    +    "lint": "npm run eslint",
    +    "postlint": "template-oss-check",
    +    "template-oss-apply": "template-oss-apply --force",
    +    "lintfix": "npm run eslint -- --fix",
    +    "snap": "tap",
    +    "posttest": "npm run lint",
    +    "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\""
    +  },
    +  "files": [
    +    "bin/",
    +    "lib/"
    +  ],
    +  "dependencies": {
    +    "npm-normalize-package-bin": "^4.0.0"
    +  },
    +  "engines": {
    +    "node": "^18.17.0 || >=20.5.0"
    +  },
    +  "templateOSS": {
    +    "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    +    "version": "4.23.3",
    +    "publish": true
    +  },
    +  "tap": {
    +    "nyc-arg": [
    +      "--exclude",
    +      "tap-snapshots/**"
    +    ]
    +  }
    +}
    diff --git a/deps/npm/workspaces/libnpmdiff/node_modules/npm-normalize-package-bin/LICENSE b/deps/npm/workspaces/libnpmdiff/node_modules/npm-normalize-package-bin/LICENSE
    new file mode 100644
    index 00000000000000..19cec97b184683
    --- /dev/null
    +++ b/deps/npm/workspaces/libnpmdiff/node_modules/npm-normalize-package-bin/LICENSE
    @@ -0,0 +1,15 @@
    +The ISC License
    +
    +Copyright (c) npm, Inc.
    +
    +Permission to use, copy, modify, and/or distribute this software for any
    +purpose with or without fee is hereby granted, provided that the above
    +copyright notice and this permission notice appear in all copies.
    +
    +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
    +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
    +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
    +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
    +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
    +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    diff --git a/deps/npm/workspaces/libnpmdiff/node_modules/npm-normalize-package-bin/README.md b/deps/npm/workspaces/libnpmdiff/node_modules/npm-normalize-package-bin/README.md
    new file mode 100644
    index 00000000000000..65ba316a0d97ee
    --- /dev/null
    +++ b/deps/npm/workspaces/libnpmdiff/node_modules/npm-normalize-package-bin/README.md
    @@ -0,0 +1,14 @@
    +# npm-normalize-package-bin
    +
    +Turn any flavor of allowable package.json bin into a normalized object.
    +
    +## API
    +
    +```js
    +const normalize = require('npm-normalize-package-bin')
    +const pkg = {name: 'foo', bin: 'bar'}
    +console.log(normalize(pkg)) // {name:'foo', bin:{foo: 'bar'}}
    +```
    +
    +Also strips out weird dots and slashes to prevent accidental and/or
    +malicious bad behavior when the package is installed.
    diff --git a/deps/npm/workspaces/libnpmdiff/node_modules/npm-normalize-package-bin/lib/index.js b/deps/npm/workspaces/libnpmdiff/node_modules/npm-normalize-package-bin/lib/index.js
    new file mode 100644
    index 00000000000000..3cb8478cf6e2f3
    --- /dev/null
    +++ b/deps/npm/workspaces/libnpmdiff/node_modules/npm-normalize-package-bin/lib/index.js
    @@ -0,0 +1,64 @@
    +// pass in a manifest with a 'bin' field here, and it'll turn it
    +// into a properly santized bin object
    +const { join, basename } = require('path')
    +
    +const normalize = pkg =>
    +  !pkg.bin ? removeBin(pkg)
    +  : typeof pkg.bin === 'string' ? normalizeString(pkg)
    +  : Array.isArray(pkg.bin) ? normalizeArray(pkg)
    +  : typeof pkg.bin === 'object' ? normalizeObject(pkg)
    +  : removeBin(pkg)
    +
    +const normalizeString = pkg => {
    +  if (!pkg.name) {
    +    return removeBin(pkg)
    +  }
    +  pkg.bin = { [pkg.name]: pkg.bin }
    +  return normalizeObject(pkg)
    +}
    +
    +const normalizeArray = pkg => {
    +  pkg.bin = pkg.bin.reduce((acc, k) => {
    +    acc[basename(k)] = k
    +    return acc
    +  }, {})
    +  return normalizeObject(pkg)
    +}
    +
    +const removeBin = pkg => {
    +  delete pkg.bin
    +  return pkg
    +}
    +
    +const normalizeObject = pkg => {
    +  const orig = pkg.bin
    +  const clean = {}
    +  let hasBins = false
    +  Object.keys(orig).forEach(binKey => {
    +    const base = join('/', basename(binKey.replace(/\\|:/g, '/'))).slice(1)
    +
    +    if (typeof orig[binKey] !== 'string' || !base) {
    +      return
    +    }
    +
    +    const binTarget = join('/', orig[binKey].replace(/\\/g, '/'))
    +      .replace(/\\/g, '/').slice(1)
    +
    +    if (!binTarget) {
    +      return
    +    }
    +
    +    clean[base] = binTarget
    +    hasBins = true
    +  })
    +
    +  if (hasBins) {
    +    pkg.bin = clean
    +  } else {
    +    delete pkg.bin
    +  }
    +
    +  return pkg
    +}
    +
    +module.exports = normalize
    diff --git a/deps/npm/workspaces/libnpmdiff/node_modules/npm-normalize-package-bin/package.json b/deps/npm/workspaces/libnpmdiff/node_modules/npm-normalize-package-bin/package.json
    new file mode 100644
    index 00000000000000..a1aeef0e1e7512
    --- /dev/null
    +++ b/deps/npm/workspaces/libnpmdiff/node_modules/npm-normalize-package-bin/package.json
    @@ -0,0 +1,45 @@
    +{
    +  "name": "npm-normalize-package-bin",
    +  "version": "4.0.0",
    +  "description": "Turn any flavor of allowable package.json bin into a normalized object",
    +  "main": "lib/index.js",
    +  "repository": {
    +    "type": "git",
    +    "url": "git+https://github.com/npm/npm-normalize-package-bin.git"
    +  },
    +  "author": "GitHub Inc.",
    +  "license": "ISC",
    +  "scripts": {
    +    "test": "tap",
    +    "snap": "tap",
    +    "lint": "npm run eslint",
    +    "postlint": "template-oss-check",
    +    "template-oss-apply": "template-oss-apply --force",
    +    "lintfix": "npm run eslint -- --fix",
    +    "posttest": "npm run lint",
    +    "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\""
    +  },
    +  "devDependencies": {
    +    "@npmcli/eslint-config": "^5.0.0",
    +    "@npmcli/template-oss": "4.23.3",
    +    "tap": "^16.3.0"
    +  },
    +  "files": [
    +    "bin/",
    +    "lib/"
    +  ],
    +  "engines": {
    +    "node": "^18.17.0 || >=20.5.0"
    +  },
    +  "templateOSS": {
    +    "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    +    "version": "4.23.3",
    +    "publish": "true"
    +  },
    +  "tap": {
    +    "nyc-arg": [
    +      "--exclude",
    +      "tap-snapshots/**"
    +    ]
    +  }
    +}
    
    From fb6b83c9eface51acad916cff365b98aa826f56a Mon Sep 17 00:00:00 2001
    From: =?UTF-8?q?Ren=C3=A9?= 
    Date: Sat, 22 Nov 2025 11:56:28 +0000
    Subject: [PATCH 23/56] tools: lint Temporal global
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    PR-URL: https://github.com/nodejs/node/pull/60793
    Reviewed-By: Michaël Zasso 
    Reviewed-By: Antoine du Hamel 
    Reviewed-By: Ilyas Shabi 
    Reviewed-By: Colin Ihrig 
    Reviewed-By: LiviaMedeiros 
    Reviewed-By: Luigi Pinca 
    Reviewed-By: Chengzhong Wu 
    ---
     lib/eslint.config_partial.mjs | 6 ++++++
     1 file changed, 6 insertions(+)
    
    diff --git a/lib/eslint.config_partial.mjs b/lib/eslint.config_partial.mjs
    index b919708a978ed6..3d638a697d233b 100644
    --- a/lib/eslint.config_partial.mjs
    +++ b/lib/eslint.config_partial.mjs
    @@ -230,6 +230,12 @@ export default [
               name: 'SharedArrayBuffer',
               message: "Use `const { constructSharedArrayBuffer } = require('internal/util');` instead of the global.",
             },
    +        // Temporal is not available in primordials because it can be
    +        // disabled with --no-harmony-temporal CLI flag.
    +        {
    +          name: 'Temporal',
    +          message: 'Use `const { Temporal } = globalThis;` instead of the global.',
    +        },
             {
               name: 'TextDecoder',
               message: "Use `const { TextDecoder } = require('internal/encoding');` instead of the global.",
    
    From 7fd36886b4587b33d570abf6da820889f2131151 Mon Sep 17 00:00:00 2001
    From: Chengzhong Wu 
    Date: Sun, 23 Nov 2025 01:37:32 +0900
    Subject: [PATCH 24/56] tools: dump config.gypi as json
    
    This helps js2c processing the node.gypi correctly when a string
    contains a quote.
    
    PR-URL: https://github.com/nodejs/node/pull/60794
    Refs: https://github.com/nodejs/node/pull/60703
    Reviewed-By: Richard Lau 
    Reviewed-By: Marco Ippolito 
    Reviewed-By: Colin Ihrig 
    ---
     configure.py                         |  3 ++-
     test/parallel/test-process-config.js |  3 +--
     tools/js2c.cc                        | 18 ++++--------------
     3 files changed, 7 insertions(+), 17 deletions(-)
    
    diff --git a/configure.py b/configure.py
    index ccdffa374f8984..8faa8e3893241a 100755
    --- a/configure.py
    +++ b/configure.py
    @@ -2446,8 +2446,9 @@ def make_bin_override():
     
     print_verbose(output)
     
    +# Dump as JSON to allow js2c.cc read it as a simple json file.
     write('config.gypi', do_not_edit +
    -      pprint.pformat(output, indent=2, width=128) + '\n')
    +      json.dumps(output, indent=2) + '\n')
     
     write('config.status', '#!/bin/sh\nset -x\nexec ./configure ' +
           ' '.join([shlex.quote(arg) for arg in original_argv]) + '\n')
    diff --git a/test/parallel/test-process-config.js b/test/parallel/test-process-config.js
    index 20ebc36a996385..3d3c3cc6b8f0e5 100644
    --- a/test/parallel/test-process-config.js
    +++ b/test/parallel/test-process-config.js
    @@ -49,8 +49,7 @@ let config = fs.readFileSync(configPath, 'utf8');
     
     // Clean up comment at the first line.
     config = config.split('\n').slice(1).join('\n');
    -config = config.replace(/"/g, '\\"');
    -config = config.replace(/'/g, '"');
    +// Turn pseudo-booleans strings into booleans.
     config = JSON.parse(config, (key, value) => {
       if (value === 'true') return true;
       if (value === 'false') return false;
    diff --git a/tools/js2c.cc b/tools/js2c.cc
    index 8b0b76643d7a7d..2cb09f8e1d7ba6 100644
    --- a/tools/js2c.cc
    +++ b/tools/js2c.cc
    @@ -796,21 +796,11 @@ std::vector JSONify(const std::vector& code) {
       // 1. Remove string comments
       std::vector stripped = StripComments(code);
     
    -  // 2. join multiline strings
    -  std::vector joined = JoinMultilineString(stripped);
    +  // 2. turn pseudo-booleans strings into Booleans
    +  std::vector result1 = ReplaceAll(stripped, R"("true")", "true");
    +  std::vector result2 = ReplaceAll(result1, R"("false")", "false");
     
    -  // 3. normalize string literals from ' into "
    -  for (size_t i = 0; i < joined.size(); ++i) {
    -    if (joined[i] == '\'') {
    -      joined[i] = '"';
    -    }
    -  }
    -
    -  // 4. turn pseudo-booleans strings into Booleans
    -  std::vector result3 = ReplaceAll(joined, R"("true")", "true");
    -  std::vector result4 = ReplaceAll(result3, R"("false")", "false");
    -
    -  return result4;
    +  return result2;
     }
     
     int AddGypi(const std::string& var,
    
    From 46dc5d7c9f3a0a8bbecd480e8f62122eeeafb850 Mon Sep 17 00:00:00 2001
    From: Livia Medeiros 
    Date: Sun, 23 Nov 2025 16:45:46 +0800
    Subject: [PATCH 25/56] lib: prefer `call()` over `apply()` if argument list is
     not array
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    PR-URL: https://github.com/nodejs/node/pull/60796
    Reviewed-By: René 
    Reviewed-By: Antoine du Hamel 
    Reviewed-By: Colin Ihrig 
    Reviewed-By: Luigi Pinca 
    ---
     lib/assert.js                         |  6 +++---
     lib/dgram.js                          |  3 +--
     lib/fs.js                             |  3 ++-
     lib/internal/child_process.js         |  3 +--
     lib/internal/cluster/child.js         |  5 +++--
     lib/internal/cluster/worker.js        |  3 ++-
     lib/internal/crypto/cipher.js         | 10 +++++-----
     lib/internal/crypto/hash.js           |  6 +++---
     lib/internal/crypto/sig.js            |  5 ++---
     lib/internal/crypto/webcrypto.js      | 25 +++++++++++++------------
     lib/internal/dns/callback_resolver.js |  4 ++--
     lib/internal/dns/promises.js          |  4 ++--
     lib/internal/file.js                  |  4 ++--
     lib/internal/fs/read/context.js       |  4 ++--
     lib/internal/fs/streams.js            |  5 +++--
     lib/internal/fs/sync_write_stream.js  |  4 ++--
     lib/internal/fs/utils.js              |  4 +---
     lib/internal/modules/cjs/loader.js    |  5 ++---
     lib/internal/process/per_thread.js    |  2 +-
     lib/internal/tls/wrap.js              | 10 +++++-----
     lib/internal/vm.js                    | 16 +++++++---------
     lib/internal/vm/module.js             |  8 ++------
     lib/repl.js                           | 18 +++++++++---------
     23 files changed, 75 insertions(+), 82 deletions(-)
    
    diff --git a/lib/assert.js b/lib/assert.js
    index e4be22da54bba5..7c0edfc8f7f94f 100644
    --- a/lib/assert.js
    +++ b/lib/assert.js
    @@ -27,13 +27,13 @@ const {
       ArrayPrototypePush,
       ArrayPrototypeSlice,
       Error,
    +  FunctionPrototypeCall,
       NumberIsNaN,
       ObjectAssign,
       ObjectDefineProperty,
       ObjectIs,
       ObjectKeys,
       ObjectPrototypeIsPrototypeOf,
    -  ReflectApply,
       RegExpPrototypeExec,
       String,
       StringPrototypeIndexOf,
    @@ -544,7 +544,7 @@ function expectedException(actual, expected, message, fn) {
         throwError = true;
       } else {
         // Check validation functions return value.
    -    const res = ReflectApply(expected, {}, [actual]);
    +    const res = FunctionPrototypeCall(expected, {}, actual);
         if (res !== true) {
           if (!message) {
             generatedMessage = true;
    @@ -689,7 +689,7 @@ function hasMatchingError(actual, expected) {
       if (ObjectPrototypeIsPrototypeOf(Error, expected)) {
         return false;
       }
    -  return ReflectApply(expected, {}, [actual]) === true;
    +  return FunctionPrototypeCall(expected, {}, actual) === true;
     }
     
     function expectsNoError(stackStartFn, actual, error, message) {
    diff --git a/lib/dgram.js b/lib/dgram.js
    index 78ad9cf93408f4..19b8300e315be5 100644
    --- a/lib/dgram.js
    +++ b/lib/dgram.js
    @@ -29,7 +29,6 @@ const {
       FunctionPrototypeCall,
       ObjectDefineProperty,
       ObjectSetPrototypeOf,
    -  ReflectApply,
       SymbolAsyncDispose,
       SymbolDispose,
     } = primordials;
    @@ -436,7 +435,7 @@ Socket.prototype.connect = function(port, address, callback) {
         return;
       }
     
    -  ReflectApply(_connect, this, [port, address, callback]);
    +  FunctionPrototypeCall(_connect, this, port, address, callback);
     };
     
     
    diff --git a/lib/fs.js b/lib/fs.js
    index 618e48a2b892be..773445d4a2c689 100644
    --- a/lib/fs.js
    +++ b/lib/fs.js
    @@ -29,6 +29,7 @@ const {
       ArrayPrototypePush,
       BigIntPrototypeToString,
       Boolean,
    +  FunctionPrototypeCall,
       MathMax,
       Number,
       ObjectDefineProperties,
    @@ -366,7 +367,7 @@ function readFile(path, options, callback) {
       }
       if (context.isUserFd) {
         process.nextTick(function tick(context) {
    -      ReflectApply(readFileAfterOpen, { context }, [null, path]);
    +      FunctionPrototypeCall(readFileAfterOpen, { context }, null, path);
         }, context);
         return;
       }
    diff --git a/lib/internal/child_process.js b/lib/internal/child_process.js
    index f110557a9374f7..45ae95614a88b5 100644
    --- a/lib/internal/child_process.js
    +++ b/lib/internal/child_process.js
    @@ -805,8 +805,7 @@ function setupChannel(target, channel, serializationMode) {
           obj = handleConversion[message.type];
     
           // convert TCP object to native handle object
    -      handle = ReflectApply(handleConversion[message.type].send,
    -                            target, [message, handle, options]);
    +      handle = FunctionPrototypeCall(handleConversion[message.type].send, target, message, handle, options);
     
           // If handle was sent twice, or it is impossible to get native handle
           // out of it - just send a text without the handle.
    diff --git a/lib/internal/cluster/child.js b/lib/internal/cluster/child.js
    index 7c132310a81874..b6ea60e660fe97 100644
    --- a/lib/internal/cluster/child.js
    +++ b/lib/internal/cluster/child.js
    @@ -3,6 +3,7 @@
     const {
       ArrayPrototypeJoin,
       FunctionPrototype,
    +  FunctionPrototypeCall,
       ObjectAssign,
       ReflectApply,
       SafeMap,
    @@ -58,7 +59,7 @@ cluster._setupWorker = function() {
         if (message.act === 'newconn')
           onconnection(message, handle);
         else if (message.act === 'disconnect')
    -      ReflectApply(_disconnect, worker, [true]);
    +      FunctionPrototypeCall(_disconnect, worker, true);
       }
     };
     
    @@ -287,7 +288,7 @@ function _disconnect(primaryInitiated) {
     Worker.prototype.disconnect = function() {
       if (this.state !== 'disconnecting' && this.state !== 'destroying') {
         this.state = 'disconnecting';
    -    ReflectApply(_disconnect, this, []);
    +    FunctionPrototypeCall(_disconnect, this);
       }
     
       return this;
    diff --git a/lib/internal/cluster/worker.js b/lib/internal/cluster/worker.js
    index 872c5f89e0ceb3..f85df862952d52 100644
    --- a/lib/internal/cluster/worker.js
    +++ b/lib/internal/cluster/worker.js
    @@ -1,6 +1,7 @@
     'use strict';
     
     const {
    +  FunctionPrototypeCall,
       ObjectSetPrototypeOf,
       ReflectApply,
     } = primordials;
    @@ -16,7 +17,7 @@ function Worker(options) {
       if (!(this instanceof Worker))
         return new Worker(options);
     
    -  ReflectApply(EventEmitter, this, []);
    +  FunctionPrototypeCall(EventEmitter, this);
     
       if (options === null || typeof options !== 'object')
         options = kEmptyObject;
    diff --git a/lib/internal/crypto/cipher.js b/lib/internal/crypto/cipher.js
    index 9c6decbcae4905..d1024fe1f983ff 100644
    --- a/lib/internal/crypto/cipher.js
    +++ b/lib/internal/crypto/cipher.js
    @@ -1,9 +1,9 @@
     'use strict';
     
     const {
    +  FunctionPrototypeCall,
       NumberIsInteger,
       ObjectSetPrototypeOf,
    -  ReflectApply,
     } = primordials;
     
     const {
    @@ -117,7 +117,7 @@ function createCipherBase(cipher, credential, options, isEncrypt, iv) {
       this[kHandle] = new CipherBase(isEncrypt, cipher, credential, iv, authTagLength);
       this._decoder = null;
     
    -  ReflectApply(LazyTransform, this, [options]);
    +  FunctionPrototypeCall(LazyTransform, this, options);
     }
     
     function createCipherWithIV(cipher, key, options, isEncrypt, iv) {
    @@ -125,7 +125,7 @@ function createCipherWithIV(cipher, key, options, isEncrypt, iv) {
       const encoding = getStringOption(options, 'encoding');
       key = prepareSecretKey(key, encoding);
       iv = iv === null ? null : getArrayBufferOrView(iv, 'iv');
    -  ReflectApply(createCipherBase, this, [cipher, key, options, isEncrypt, iv]);
    +  FunctionPrototypeCall(createCipherBase, this, cipher, key, options, isEncrypt, iv);
     }
     
     // The Cipher class is part of the legacy Node.js crypto API. It exposes
    @@ -215,7 +215,7 @@ function Cipheriv(cipher, key, iv, options) {
       if (!(this instanceof Cipheriv))
         return new Cipheriv(cipher, key, iv, options);
     
    -  ReflectApply(createCipherWithIV, this, [cipher, key, options, true, iv]);
    +  FunctionPrototypeCall(createCipherWithIV, this, cipher, key, options, true, iv);
     }
     
     function addCipherPrototypeFunctions(constructor) {
    @@ -244,7 +244,7 @@ function Decipheriv(cipher, key, iv, options) {
       if (!(this instanceof Decipheriv))
         return new Decipheriv(cipher, key, iv, options);
     
    -  ReflectApply(createCipherWithIV, this, [cipher, key, options, false, iv]);
    +  FunctionPrototypeCall(createCipherWithIV, this, cipher, key, options, false, iv);
     }
     
     ObjectSetPrototypeOf(Decipheriv.prototype, LazyTransform.prototype);
    diff --git a/lib/internal/crypto/hash.js b/lib/internal/crypto/hash.js
    index 76129bc989c8f4..3f34468e55e99f 100644
    --- a/lib/internal/crypto/hash.js
    +++ b/lib/internal/crypto/hash.js
    @@ -1,8 +1,8 @@
     'use strict';
     
     const {
    +  FunctionPrototypeCall,
       ObjectSetPrototypeOf,
    -  ReflectApply,
       StringPrototypeReplace,
       StringPrototypeToLowerCase,
       Symbol,
    @@ -105,7 +105,7 @@ function Hash(algorithm, options) {
       if (!isCopy && xofLen === undefined) {
         maybeEmitDeprecationWarning(algorithm);
       }
    -  ReflectApply(LazyTransform, this, [options]);
    +  FunctionPrototypeCall(LazyTransform, this, options);
     }
     
     ObjectSetPrototypeOf(Hash.prototype, LazyTransform.prototype);
    @@ -169,7 +169,7 @@ function Hmac(hmac, key, options) {
       this[kState] = {
         [kFinalized]: false,
       };
    -  ReflectApply(LazyTransform, this, [options]);
    +  FunctionPrototypeCall(LazyTransform, this, options);
     }
     
     ObjectSetPrototypeOf(Hmac.prototype, LazyTransform.prototype);
    diff --git a/lib/internal/crypto/sig.js b/lib/internal/crypto/sig.js
    index a5bdaaf22b5ef0..7d38c0bdf60687 100644
    --- a/lib/internal/crypto/sig.js
    +++ b/lib/internal/crypto/sig.js
    @@ -3,7 +3,6 @@
     const {
       FunctionPrototypeCall,
       ObjectSetPrototypeOf,
    -  ReflectApply,
     } = primordials;
     
     const {
    @@ -59,7 +58,7 @@ function Sign(algorithm, options) {
       this[kHandle] = new _Sign();
       this[kHandle].init(algorithm);
     
    -  ReflectApply(Writable, this, [options]);
    +  FunctionPrototypeCall(Writable, this, options);
     }
     
     ObjectSetPrototypeOf(Sign.prototype, Writable.prototype);
    @@ -219,7 +218,7 @@ function Verify(algorithm, options) {
       this[kHandle] = new _Verify();
       this[kHandle].init(algorithm);
     
    -  ReflectApply(Writable, this, [options]);
    +  FunctionPrototypeCall(Writable, this, options);
     }
     
     ObjectSetPrototypeOf(Verify.prototype, Writable.prototype);
    diff --git a/lib/internal/crypto/webcrypto.js b/lib/internal/crypto/webcrypto.js
    index 869c07ef87fbe6..0fba4e9108c329 100644
    --- a/lib/internal/crypto/webcrypto.js
    +++ b/lib/internal/crypto/webcrypto.js
    @@ -2,6 +2,7 @@
     
     const {
       ArrayPrototypeIncludes,
    +  FunctionPrototypeCall,
       JSONParse,
       JSONStringify,
       ObjectDefineProperties,
    @@ -84,7 +85,7 @@ async function digest(algorithm, data) {
     
       algorithm = normalizeAlgorithm(algorithm, 'digest');
     
    -  return await ReflectApply(asyncDigest, this, [algorithm, data]);
    +  return await FunctionPrototypeCall(asyncDigest, this, algorithm, data);
     }
     
     function randomUUID() {
    @@ -377,10 +378,10 @@ async function deriveKey(
           throw lazyDOMException('Unrecognized algorithm name', 'NotSupportedError');
       }
     
    -  return ReflectApply(
    +  return FunctionPrototypeCall(
         importKeySync,
         this,
    -    ['raw-secret', bits, derivedKeyAlgorithm, extractable, keyUsages],
    +    'raw-secret', bits, derivedKeyAlgorithm, extractable, keyUsages,
       );
     }
     
    @@ -889,10 +890,10 @@ async function importKey(
     
       algorithm = normalizeAlgorithm(algorithm, 'importKey');
     
    -  return ReflectApply(
    +  return FunctionPrototypeCall(
         importKeySync,
         this,
    -    [format, keyData, algorithm, extractable, keyUsages],
    +    format, keyData, algorithm, extractable, keyUsages,
       );
     }
     
    @@ -926,7 +927,7 @@ async function wrapKey(format, key, wrappingKey, algorithm) {
       } catch {
         algorithm = normalizeAlgorithm(algorithm, 'encrypt');
       }
    -  let keyData = await ReflectApply(exportKey, this, [format, key]);
    +  let keyData = await FunctionPrototypeCall(exportKey, this, format, key);
     
       if (format === 'jwk') {
         const ec = new TextEncoder();
    @@ -1023,10 +1024,10 @@ async function unwrapKey(
         }
       }
     
    -  return ReflectApply(
    +  return FunctionPrototypeCall(
         importKeySync,
         this,
    -    [format, keyData, unwrappedKeyAlgo, extractable, keyUsages],
    +    format, keyData, unwrappedKeyAlgo, extractable, keyUsages,
       );
     }
     
    @@ -1349,10 +1350,10 @@ async function encapsulateKey(encapsulationAlgorithm, encapsulationKey, sharedKe
           throw lazyDOMException('Unrecognized algorithm name', 'NotSupportedError');
       }
     
    -  const sharedKey = ReflectApply(
    +  const sharedKey = FunctionPrototypeCall(
         importKeySync,
         this,
    -    ['raw-secret', encapsulateBits.sharedKey, normalizedSharedKeyAlgorithm, extractable, usages],
    +    'raw-secret', encapsulateBits.sharedKey, normalizedSharedKeyAlgorithm, extractable, usages,
       );
     
       const encapsulatedKey = {
    @@ -1469,10 +1470,10 @@ async function decapsulateKey(
           throw lazyDOMException('Unrecognized algorithm name', 'NotSupportedError');
       }
     
    -  return ReflectApply(
    +  return FunctionPrototypeCall(
         importKeySync,
         this,
    -    ['raw-secret', decapsulatedBits, normalizedSharedKeyAlgorithm, extractable, usages],
    +    'raw-secret', decapsulatedBits, normalizedSharedKeyAlgorithm, extractable, usages,
       );
     }
     
    diff --git a/lib/internal/dns/callback_resolver.js b/lib/internal/dns/callback_resolver.js
    index fdafd310ad10a5..e1532a3ee142ab 100644
    --- a/lib/internal/dns/callback_resolver.js
    +++ b/lib/internal/dns/callback_resolver.js
    @@ -2,8 +2,8 @@
     
     const {
       ArrayPrototypeMap,
    +  FunctionPrototypeCall,
       ObjectDefineProperty,
    -  ReflectApply,
       Symbol,
     } = primordials;
     
    @@ -104,7 +104,7 @@ function resolve(hostname, rrtype, callback) {
       }
     
       if (typeof resolver === 'function') {
    -    return ReflectApply(resolver, this, [hostname, callback]);
    +    return FunctionPrototypeCall(resolver, this, hostname, callback);
       }
       throw new ERR_INVALID_ARG_VALUE('rrtype', rrtype);
     }
    diff --git a/lib/internal/dns/promises.js b/lib/internal/dns/promises.js
    index ad44068fa5314d..f7ee8fd25423ca 100644
    --- a/lib/internal/dns/promises.js
    +++ b/lib/internal/dns/promises.js
    @@ -1,9 +1,9 @@
     'use strict';
     const {
       ArrayPrototypeMap,
    +  FunctionPrototypeCall,
       ObjectDefineProperty,
       Promise,
    -  ReflectApply,
       Symbol,
     } = primordials;
     
    @@ -358,7 +358,7 @@ function resolve(hostname, rrtype) {
         resolver = resolveMap.A;
       }
     
    -  return ReflectApply(resolver, this, [hostname]);
    +  return FunctionPrototypeCall(resolver, this, hostname);
     }
     
     // Promise-based resolver.
    diff --git a/lib/internal/file.js b/lib/internal/file.js
    index 46dc96fa1bc6aa..aa05a602975e40 100644
    --- a/lib/internal/file.js
    +++ b/lib/internal/file.js
    @@ -2,7 +2,7 @@
     
     const {
       DateNow,
    -  FunctionPrototypeApply,
    +  FunctionPrototypeCall,
       NumberIsNaN,
       ObjectDefineProperties,
       ObjectSetPrototypeOf,
    @@ -129,7 +129,7 @@ class File extends Blob {
     }
     
     function TransferableFile(handle, length, type = '') {
    -  FunctionPrototypeApply(TransferableBlob, this, [handle, length, type]);
    +  FunctionPrototypeCall(TransferableBlob, this, handle, length, type);
       ObjectSetPrototypeOf(this, File.prototype);
     }
     
    diff --git a/lib/internal/fs/read/context.js b/lib/internal/fs/read/context.js
    index bbbf4f35e4ba40..193251a0516d76 100644
    --- a/lib/internal/fs/read/context.js
    +++ b/lib/internal/fs/read/context.js
    @@ -2,8 +2,8 @@
     
     const {
       ArrayPrototypePush,
    +  FunctionPrototypeCall,
       MathMin,
    -  ReflectApply,
     } = primordials;
     
     const {
    @@ -112,7 +112,7 @@ class ReadFileContext {
       close(err) {
         if (this.isUserFd) {
           process.nextTick(function tick(context) {
    -        ReflectApply(readFileAfterClose, { context }, [null]);
    +        FunctionPrototypeCall(readFileAfterClose, { context }, null);
           }, this);
           return;
         }
    diff --git a/lib/internal/fs/streams.js b/lib/internal/fs/streams.js
    index 5d38085c578d2c..c2e8abc4efdadd 100644
    --- a/lib/internal/fs/streams.js
    +++ b/lib/internal/fs/streams.js
    @@ -3,6 +3,7 @@
     const {
       Array,
       FunctionPrototypeBind,
    +  FunctionPrototypeCall,
       MathMin,
       ObjectDefineProperty,
       ObjectSetPrototypeOf,
    @@ -223,7 +224,7 @@ function ReadStream(path, options) {
         }
       }
     
    -  ReflectApply(Readable, this, [options]);
    +  FunctionPrototypeCall(Readable, this, options);
     }
     ObjectSetPrototypeOf(ReadStream.prototype, Readable.prototype);
     ObjectSetPrototypeOf(ReadStream, Readable);
    @@ -386,7 +387,7 @@ function WriteStream(path, options) {
         this.pos = this.start;
       }
     
    -  ReflectApply(Writable, this, [options]);
    +  FunctionPrototypeCall(Writable, this, options);
     
       if (options.encoding)
         this.setDefaultEncoding(options.encoding);
    diff --git a/lib/internal/fs/sync_write_stream.js b/lib/internal/fs/sync_write_stream.js
    index 5ce4f1883b905d..06d8cde1b52392 100644
    --- a/lib/internal/fs/sync_write_stream.js
    +++ b/lib/internal/fs/sync_write_stream.js
    @@ -1,8 +1,8 @@
     'use strict';
     
     const {
    +  FunctionPrototypeCall,
       ObjectSetPrototypeOf,
    -  ReflectApply,
     } = primordials;
     const { kEmptyObject } = require('internal/util');
     
    @@ -10,7 +10,7 @@ const { Writable } = require('stream');
     const { closeSync, writeSync } = require('fs');
     
     function SyncWriteStream(fd, options) {
    -  ReflectApply(Writable, this, [{ autoDestroy: true }]);
    +  FunctionPrototypeCall(Writable, this, { autoDestroy: true });
     
       options ||= kEmptyObject;
     
    diff --git a/lib/internal/fs/utils.js b/lib/internal/fs/utils.js
    index 0f788ce4dbc3a3..e25242d6061f16 100644
    --- a/lib/internal/fs/utils.js
    +++ b/lib/internal/fs/utils.js
    @@ -16,7 +16,6 @@ const {
       ObjectDefineProperty,
       ObjectIs,
       ObjectSetPrototypeOf,
    -  ReflectApply,
       ReflectOwnKeys,
       RegExpPrototypeSymbolReplace,
       StringPrototypeEndsWith,
    @@ -494,8 +493,7 @@ const lazyDateFields = {
     function BigIntStats(dev, mode, nlink, uid, gid, rdev, blksize,
                          ino, size, blocks,
                          atimeNs, mtimeNs, ctimeNs, birthtimeNs) {
    -  ReflectApply(StatsBase, this, [dev, mode, nlink, uid, gid, rdev, blksize,
    -                                 ino, size, blocks]);
    +  FunctionPrototypeCall(StatsBase, this, dev, mode, nlink, uid, gid, rdev, blksize, ino, size, blocks);
     
       this.atimeMs = atimeNs / kNsPerMsBigInt;
       this.mtimeMs = mtimeNs / kNsPerMsBigInt;
    diff --git a/lib/internal/modules/cjs/loader.js b/lib/internal/modules/cjs/loader.js
    index b8aac380da7974..6409b913e78602 100644
    --- a/lib/internal/modules/cjs/loader.js
    +++ b/lib/internal/modules/cjs/loader.js
    @@ -36,6 +36,7 @@ const {
       ArrayPrototypeUnshiftApply,
       Boolean,
       Error,
    +  FunctionPrototypeCall,
       JSONParse,
       ObjectDefineProperty,
       ObjectFreeze,
    @@ -47,7 +48,6 @@ const {
       ObjectPrototypeHasOwnProperty,
       ObjectSetPrototypeOf,
       Proxy,
    -  ReflectApply,
       ReflectSet,
       RegExpPrototypeExec,
       SafeMap,
    @@ -1757,8 +1757,7 @@ Module.prototype._compile = function(content, filename, format) {
         result = callAndPauseOnStart(compiledWrapper, thisValue, exports,
                                      require, module, filename, dirname);
       } else {
    -    result = ReflectApply(compiledWrapper, thisValue,
    -                          [exports, require, module, filename, dirname]);
    +    result = FunctionPrototypeCall(compiledWrapper, thisValue, exports, require, module, filename, dirname);
       }
       this[kIsExecuting] = false;
       if (requireDepth === 0) { statCache = null; }
    diff --git a/lib/internal/process/per_thread.js b/lib/internal/process/per_thread.js
    index da2ba93e7e93ae..86a5e808097449 100644
    --- a/lib/internal/process/per_thread.js
    +++ b/lib/internal/process/per_thread.js
    @@ -478,7 +478,7 @@ function buildAllowedFlags() {
         forEach(callback, thisArg = undefined) {
           ArrayPrototypeForEach(
             this[kInternal].array,
    -        (v) => ReflectApply(callback, thisArg, [v, v, this]),
    +        (v) => FunctionPrototypeCall(callback, thisArg, v, v, this),
           );
         }
     
    diff --git a/lib/internal/tls/wrap.js b/lib/internal/tls/wrap.js
    index ceb770ab336646..82cf6832c3efa8 100644
    --- a/lib/internal/tls/wrap.js
    +++ b/lib/internal/tls/wrap.js
    @@ -22,6 +22,7 @@
     'use strict';
     
     const {
    +  FunctionPrototypeCall,
       ObjectAssign,
       ObjectDefineProperty,
       ObjectSetPrototypeOf,
    @@ -564,7 +565,7 @@ function TLSSocket(socket, opts) {
       // distinguishable from regular ones.
       this.encrypted = true;
     
    -  ReflectApply(net.Socket, this, [{
    +  FunctionPrototypeCall(net.Socket, this, {
         handle: this._wrapHandle(wrap, handle, wrapHasActiveWriteFromPrevOwner),
         allowHalfOpen: socket ? socket.allowHalfOpen : tlsOptions.allowHalfOpen,
         pauseOnCreate: tlsOptions.pauseOnConnect,
    @@ -572,7 +573,7 @@ function TLSSocket(socket, opts) {
         highWaterMark: tlsOptions.highWaterMark,
         onread: !socket ? tlsOptions.onread : null,
         signal: tlsOptions.signal,
    -  }]);
    +  });
     
       // Proxy for API compatibility
       this.ssl = this._handle;  // C++ TLSWrap object
    @@ -1371,7 +1372,7 @@ function Server(options, listener) {
       }
     
       // constructor call
    -  ReflectApply(net.Server, this, [options, tlsConnectionListener]);
    +  FunctionPrototypeCall(net.Server, this, options, tlsConnectionListener);
     
       if (listener) {
         this.on('secureConnection', listener);
    @@ -1560,8 +1561,7 @@ Server.prototype[EE.captureRejectionSymbol] = function(
           sock.destroy(err);
           break;
         default:
    -      ReflectApply(net.Server.prototype[SymbolFor('nodejs.rejection')], this,
    -                   [err, event, sock]);
    +      FunctionPrototypeCall(net.Server.prototype[SymbolFor('nodejs.rejection')], this, err, event, sock);
       }
     };
     
    diff --git a/lib/internal/vm.js b/lib/internal/vm.js
    index 42060d7a8c38dc..9f1c33b0ccfe75 100644
    --- a/lib/internal/vm.js
    +++ b/lib/internal/vm.js
    @@ -1,7 +1,7 @@
     'use strict';
     
     const {
    -  ReflectApply,
    +  FunctionPrototypeCall,
       Symbol,
     } = primordials;
     
    @@ -216,16 +216,14 @@ function makeContextifyScript(code,
      * @returns {any}
      */
     function runScriptInThisContext(script, displayErrors, breakOnFirstLine) {
    -  return ReflectApply(
    +  return FunctionPrototypeCall(
         runInContext,
         script,
    -    [
    -      null,                // sandbox - use current context
    -      -1,                  // timeout
    -      displayErrors,       // displayErrors
    -      false,               // breakOnSigint
    -      breakOnFirstLine,    // breakOnFirstLine
    -    ],
    +    null,                // sandbox - use current context
    +    -1,                  // timeout
    +    displayErrors,       // displayErrors
    +    false,               // breakOnSigint
    +    breakOnFirstLine,    // breakOnFirstLine
       );
     }
     
    diff --git a/lib/internal/vm/module.js b/lib/internal/vm/module.js
    index 6403a1f76710f9..ce2350f6cd16cb 100644
    --- a/lib/internal/vm/module.js
    +++ b/lib/internal/vm/module.js
    @@ -7,6 +7,7 @@ const {
       ArrayPrototypeIndexOf,
       ArrayPrototypeMap,
       ArrayPrototypeSome,
    +  FunctionPrototypeCall,
       ObjectDefineProperty,
       ObjectFreeze,
       ObjectGetPrototypeOf,
    @@ -15,7 +16,6 @@ const {
       PromisePrototypeThen,
       PromiseReject,
       PromiseResolve,
    -  ReflectApply,
       SafePromiseAllReturnArrayLike,
       Symbol,
       SymbolToStringTag,
    @@ -522,11 +522,7 @@ class SyntheticModule extends Module {
     function importModuleDynamicallyWrap(importModuleDynamically) {
       const importModuleDynamicallyWrapper = async (specifier, referrer, attributes, phase) => {
         const phaseName = phaseEnumToPhaseName(phase);
    -    const m = await ReflectApply(
    -      importModuleDynamically,
    -      this,
    -      [specifier, referrer, attributes, phaseName],
    -    );
    +    const m = await FunctionPrototypeCall(importModuleDynamically, this, specifier, referrer, attributes, phaseName);
         if (isModuleNamespaceObject(m)) {
           if (phase === kSourcePhase) throw new ERR_VM_MODULE_NOT_MODULE();
           return m;
    diff --git a/lib/repl.js b/lib/repl.js
    index bd9bfdb3fa4183..5ad9e4fbb1506f 100644
    --- a/lib/repl.js
    +++ b/lib/repl.js
    @@ -57,6 +57,7 @@ const {
       Boolean,
       Error: MainContextError,
       FunctionPrototypeBind,
    +  FunctionPrototypeCall,
       JSONStringify,
       MathMaxApply,
       NumberIsNaN,
    @@ -559,9 +560,9 @@ class REPLServer extends Interface {
                 };
     
                 if (self.useGlobal) {
    -              result = ReflectApply(runInThisContext, script, [scriptOptions]);
    +              result = FunctionPrototypeCall(runInThisContext, script, scriptOptions);
                 } else {
    -              result = ReflectApply(runInContext, script, [context, scriptOptions]);
    +              result = FunctionPrototypeCall(runInContext, script, context, scriptOptions);
                 }
               } finally {
                 if (self.breakEvalOnSigint) {
    @@ -752,8 +753,7 @@ class REPLServer extends Interface {
         self.clearBufferedCommand();
     
         function completer(text, cb) {
    -      ReflectApply(complete, self,
    -                   [text, self.editorMode ? self.completeOnEditorMode(cb) : cb]);
    +      FunctionPrototypeCall(complete, self, text, self.editorMode ? self.completeOnEditorMode(cb) : cb);
         }
     
         self.resetContext();
    @@ -787,7 +787,7 @@ class REPLServer extends Interface {
         function _parseREPLKeyword(keyword, rest) {
           const cmd = this.commands[keyword];
           if (cmd) {
    -        ReflectApply(cmd.action, this, [rest]);
    +        FunctionPrototypeCall(cmd.action, this, rest);
             return true;
           }
           return false;
    @@ -853,7 +853,7 @@ class REPLServer extends Interface {
               self.line = prefix;
               self.cursor = prefix.length;
             }
    -        ReflectApply(_memory, self, [cmd]);
    +        FunctionPrototypeCall(_memory, self, cmd);
             return;
           }
     
    @@ -869,7 +869,7 @@ class REPLServer extends Interface {
               const matches = RegExpPrototypeExec(/^\.([^\s]+)\s*(.*)$/, trimmedCmd);
               const keyword = matches?.[1];
               const rest = matches?.[2];
    -          if (ReflectApply(_parseREPLKeyword, self, [keyword, rest]) === true) {
    +          if (FunctionPrototypeCall(_parseREPLKeyword, self, keyword, rest) === true) {
                 return;
               }
               if (!self[kBufferedCommandSymbol]) {
    @@ -887,7 +887,7 @@ class REPLServer extends Interface {
     
           function finish(e, ret) {
             debug('finish', e, ret);
    -        ReflectApply(_memory, self, [cmd]);
    +        FunctionPrototypeCall(_memory, self, cmd);
     
             if (e && !self[kBufferedCommandSymbol] &&
               StringPrototypeStartsWith(StringPrototypeTrim(cmd), 'npm ') &&
    @@ -1262,7 +1262,7 @@ function _memory(cmd) {
     
     function _turnOnEditorMode(repl) {
       repl.editorMode = true;
    -  ReflectApply(Interface.prototype.setPrompt, repl, ['']);
    +  FunctionPrototypeCall(Interface.prototype.setPrompt, repl, '');
     }
     
     function _turnOffEditorMode(repl) {
    
    From 8b769cff609b390912cfd9e19ddc89e0d067fd9b Mon Sep 17 00:00:00 2001
    From: Marco Ippolito 
    Date: Fri, 21 Nov 2025 08:29:35 +0100
    Subject: [PATCH 26/56] src: rename config file testRunner to test
    
    PR-URL: https://github.com/nodejs/node/pull/60798
    Reviewed-By: Jacob Smith 
    Reviewed-By: Rafael Gonzaga 
    ---
     doc/api/cli.md                                |  4 +--
     doc/node-config-schema.json                   |  2 +-
     src/node_config_file.cc                       | 14 +++++++++-
     src/node_options.h                            |  2 +-
     .../options-as-flags/test-config.json         |  2 +-
     .../rc/deprecated-testrunner-namespace.json   |  5 ++++
     .../node.config.json                          |  2 +-
     test/fixtures/rc/empty-valid-namespace.json   |  2 +-
     test/fixtures/rc/namespace-with-array.json    |  2 +-
     .../rc/namespace-with-disallowed-envvar.json  |  2 +-
     test/fixtures/rc/namespaced/node.config.json  |  2 +-
     test/fixtures/rc/override-namespace.json      |  2 +-
     .../override-node-option-with-namespace.json  |  2 +-
     test/fixtures/rc/unknown-flag-namespace.json  |  2 +-
     .../options-propagation/node.config.json      |  2 +-
     test/parallel/test-config-file.js             | 14 +++++++++-
     test/parallel/test-runner-flag-propagation.js | 26 +++++++++----------
     17 files changed, 58 insertions(+), 29 deletions(-)
     create mode 100644 test/fixtures/rc/deprecated-testrunner-namespace.json
    
    diff --git a/doc/api/cli.md b/doc/api/cli.md
    index 79fe3094ba2301..67685462b244df 100644
    --- a/doc/api/cli.md
    +++ b/doc/api/cli.md
    @@ -1016,7 +1016,7 @@ in the `$schema` must be replaced with the version of Node.js you are using.
         "watch-path": "src",
         "watch-preserve-output": true
       },
    -  "testRunner": {
    +  "test": {
         "test-isolation": "process"
       },
       "watch": {
    @@ -1029,7 +1029,7 @@ The configuration file supports namespace-specific options:
     
     * The `nodeOptions` field contains CLI flags that are allowed in [`NODE_OPTIONS`][].
     
    -* Namespace fields like `testRunner` contain configuration specific to that subsystem.
    +* Namespace fields like `test` contain configuration specific to that subsystem.
     
     No-op flags are not supported.
     Not all V8 flags are currently supported.
    diff --git a/doc/node-config-schema.json b/doc/node-config-schema.json
    index 916bc1c4f62002..c773f3fbd2aae0 100644
    --- a/doc/node-config-schema.json
    +++ b/doc/node-config-schema.json
    @@ -655,7 +655,7 @@
             }
           }
         },
    -    "testRunner": {
    +    "test": {
           "type": "object",
           "additionalProperties": false,
           "properties": {
    diff --git a/src/node_config_file.cc b/src/node_config_file.cc
    index e6c049b4d14f10..58dfdc35829f83 100644
    --- a/src/node_config_file.cc
    +++ b/src/node_config_file.cc
    @@ -262,8 +262,20 @@ ParseResult ConfigReader::ParseConfig(const std::string_view& config_path) {
           return ParseResult::InvalidContent;
         }
     
    -    // Check if this field is a valid namespace
         std::string namespace_name(field_name);
    +
    +    // TODO(@marco-ippolito): Remove warning for testRunner namespace
    +    if (namespace_name == "testRunner") {
    +      FPrintF(stderr,
    +              "the \"testRunner\" namespace has been removed. "
    +              "Use \"test\" instead.\n");
    +      // Better to throw an error than to ignore it
    +      // Otherwise users might think their test suite is green
    +      // when it's not running
    +      return ParseResult::InvalidContent;
    +    }
    +
    +    // Check if this field is a valid namespace
         if (!valid_namespaces.contains(namespace_name)) {
           // If not, skip it
           continue;
    diff --git a/src/node_options.h b/src/node_options.h
    index 9afdeb983d6b26..dd782b460aef79 100644
    --- a/src/node_options.h
    +++ b/src/node_options.h
    @@ -415,7 +415,7 @@ std::vector MapAvailableNamespaces();
     // Define all namespace entries
     #define OPTION_NAMESPACE_LIST(V)                                               \
       V(kNoNamespace, "")                                                          \
    -  V(kTestRunnerNamespace, "testRunner")                                        \
    +  V(kTestRunnerNamespace, "test")                                              \
       V(kWatchNamespace, "watch")                                                  \
       V(kPermissionNamespace, "permission")
     
    diff --git a/test/fixtures/options-as-flags/test-config.json b/test/fixtures/options-as-flags/test-config.json
    index c80ffa4069fbf5..aa6355c37a1681 100644
    --- a/test/fixtures/options-as-flags/test-config.json
    +++ b/test/fixtures/options-as-flags/test-config.json
    @@ -3,7 +3,7 @@
         "experimental-transform-types": true,
         "max-http-header-size": 8192
       },
    -  "testRunner": {
    +  "test": {
         "test-isolation": "none"
       }
     }
    diff --git a/test/fixtures/rc/deprecated-testrunner-namespace.json b/test/fixtures/rc/deprecated-testrunner-namespace.json
    new file mode 100644
    index 00000000000000..d8a01949418cf7
    --- /dev/null
    +++ b/test/fixtures/rc/deprecated-testrunner-namespace.json
    @@ -0,0 +1,5 @@
    +{
    +  "testRunner": {
    +    "test-isolation": "none"
    +  }
    +}
    diff --git a/test/fixtures/rc/duplicate-namespace-option/node.config.json b/test/fixtures/rc/duplicate-namespace-option/node.config.json
    index 4d948fbd33961d..948dc4e6c5570b 100644
    --- a/test/fixtures/rc/duplicate-namespace-option/node.config.json
    +++ b/test/fixtures/rc/duplicate-namespace-option/node.config.json
    @@ -1,5 +1,5 @@
     {
    -    "testRunner": {
    +    "test": {
             "test-name-pattern": "first-pattern",
             "test-name-pattern": "second-pattern"
         }
    diff --git a/test/fixtures/rc/empty-valid-namespace.json b/test/fixtures/rc/empty-valid-namespace.json
    index dbeb33d7aa8b59..c267aa9bde2918 100644
    --- a/test/fixtures/rc/empty-valid-namespace.json
    +++ b/test/fixtures/rc/empty-valid-namespace.json
    @@ -1,3 +1,3 @@
     {
    -    "testRunner": {}
    +    "test": {}
     }
    diff --git a/test/fixtures/rc/namespace-with-array.json b/test/fixtures/rc/namespace-with-array.json
    index 056a4291e9b666..1cddcdfd6c4ccd 100644
    --- a/test/fixtures/rc/namespace-with-array.json
    +++ b/test/fixtures/rc/namespace-with-array.json
    @@ -1,5 +1,5 @@
     {
    -    "testRunner": {
    +    "test": {
             "test-coverage-exclude": ["config-pattern1", "config-pattern2"]
         }
     }
    diff --git a/test/fixtures/rc/namespace-with-disallowed-envvar.json b/test/fixtures/rc/namespace-with-disallowed-envvar.json
    index 6152684e0583f4..f545f0ff62781f 100644
    --- a/test/fixtures/rc/namespace-with-disallowed-envvar.json
    +++ b/test/fixtures/rc/namespace-with-disallowed-envvar.json
    @@ -1,5 +1,5 @@
     {
    -    "testRunner": {
    +    "test": {
            "test-concurrency": 1,
            "experimental-test-coverage": true
         }
    diff --git a/test/fixtures/rc/namespaced/node.config.json b/test/fixtures/rc/namespaced/node.config.json
    index df929d25c10b52..0870c4c86033b2 100644
    --- a/test/fixtures/rc/namespaced/node.config.json
    +++ b/test/fixtures/rc/namespaced/node.config.json
    @@ -1,5 +1,5 @@
     {
    -    "testRunner": {
    +    "test": {
             "test-isolation": "none"
         }
     }
    diff --git a/test/fixtures/rc/override-namespace.json b/test/fixtures/rc/override-namespace.json
    index acb37b2eec485c..be79cf5d4415b5 100644
    --- a/test/fixtures/rc/override-namespace.json
    +++ b/test/fixtures/rc/override-namespace.json
    @@ -1,5 +1,5 @@
     {
    -    "testRunner": {
    +    "test": {
             "test-isolation": "process"
         },
         "nodeOptions": {
    diff --git a/test/fixtures/rc/override-node-option-with-namespace.json b/test/fixtures/rc/override-node-option-with-namespace.json
    index 2db9e1a47f07ea..e5912da99590b4 100644
    --- a/test/fixtures/rc/override-node-option-with-namespace.json
    +++ b/test/fixtures/rc/override-node-option-with-namespace.json
    @@ -2,7 +2,7 @@
         "nodeOptions": {
             "test-isolation": "none"
         },
    -    "testRunner": {
    +    "test": {
             "test-isolation": "process"
         }
     }
    diff --git a/test/fixtures/rc/unknown-flag-namespace.json b/test/fixtures/rc/unknown-flag-namespace.json
    index b5d87ad8dd3acd..01dd62824cf2b9 100644
    --- a/test/fixtures/rc/unknown-flag-namespace.json
    +++ b/test/fixtures/rc/unknown-flag-namespace.json
    @@ -1,5 +1,5 @@
     {
    -    "testRunner": {
    +    "test": {
             "unknown-flag": true
         }
     }
    diff --git a/test/fixtures/test-runner/options-propagation/node.config.json b/test/fixtures/test-runner/options-propagation/node.config.json
    index 98a35b7d3eebd2..7bb3d5c80fe0e5 100644
    --- a/test/fixtures/test-runner/options-propagation/node.config.json
    +++ b/test/fixtures/test-runner/options-propagation/node.config.json
    @@ -1,5 +1,5 @@
     {
    -    "testRunner": {
    +    "test": {
             "experimental-test-coverage": true
         }
     }
    diff --git a/test/parallel/test-config-file.js b/test/parallel/test-config-file.js
    index 4f4e6703f88702..ca4c89200fd5b0 100644
    --- a/test/parallel/test-config-file.js
    +++ b/test/parallel/test-config-file.js
    @@ -421,7 +421,7 @@ describe('namespace-scoped options', () => {
           fixtures.path('rc/unknown-flag-namespace.json'),
           '-p', '"Hello, World!"',
         ]);
    -    assert.match(result.stderr, /Unknown or not allowed option unknown-flag for namespace testRunner/);
    +    assert.match(result.stderr, /Unknown or not allowed option unknown-flag for namespace test/);
         assert.strictEqual(result.stdout, '');
         assert.strictEqual(result.code, 9);
       });
    @@ -542,4 +542,16 @@ describe('namespace-scoped options', () => {
         assert.strictEqual(result.stdout, '2\n');
         assert.strictEqual(result.code, 0);
       });
    +
    +  it('should throw an error for removed "testRunner" namespace', async () => {
    +    const result = await spawnPromisified(process.execPath, [
    +      '--no-warnings',
    +      '--experimental-config-file',
    +      fixtures.path('rc/deprecated-testrunner-namespace.json'),
    +      '-p', '"Hello, World!"',
    +    ]);
    +    assert.match(result.stderr, /the "testRunner" namespace has been removed\. Use "test" instead\./);
    +    assert.strictEqual(result.stdout, '');
    +    assert.strictEqual(result.code, 9);
    +  });
     });
    diff --git a/test/parallel/test-runner-flag-propagation.js b/test/parallel/test-runner-flag-propagation.js
    index d5190251ef8db7..3248b91bcef24d 100644
    --- a/test/parallel/test-runner-flag-propagation.js
    +++ b/test/parallel/test-runner-flag-propagation.js
    @@ -68,19 +68,19 @@ describe('test runner flag propagation', () => {
     
       describe('via config file', () => {
         const configFilePropagationTests = [
    -      ['--test-concurrency', 2, 2, 'testRunner'],
    -      ['--test-timeout', 5000, 5000, 'testRunner'],
    -      ['--test-coverage-branches', 100, 100, 'testRunner'],
    -      ['--test-coverage-functions', 100, 100, 'testRunner'],
    -      ['--test-coverage-lines', 100, 100, 'testRunner'],
    -      ['--experimental-test-coverage', true, false, 'testRunner'],
    -      ['--test-coverage-exclude', 'test/**', 'test/**', 'testRunner'],
    -      ['--test-coverage-include', 'src/**', 'src/**', 'testRunner'],
    -      ['--test-update-snapshots', true, true, 'testRunner'],
    -      ['--test-concurrency', 3, 3, 'testRunner'],
    -      ['--test-timeout', 2500, 2500, 'testRunner'],
    -      ['--test-coverage-branches', 90, 90, 'testRunner'],
    -      ['--test-coverage-functions', 85, 85, 'testRunner'],
    +      ['--test-concurrency', 2, 2, 'test'],
    +      ['--test-timeout', 5000, 5000, 'test'],
    +      ['--test-coverage-branches', 100, 100, 'test'],
    +      ['--test-coverage-functions', 100, 100, 'test'],
    +      ['--test-coverage-lines', 100, 100, 'test'],
    +      ['--experimental-test-coverage', true, false, 'test'],
    +      ['--test-coverage-exclude', 'test/**', 'test/**', 'test'],
    +      ['--test-coverage-include', 'src/**', 'src/**', 'test'],
    +      ['--test-update-snapshots', true, true, 'test'],
    +      ['--test-concurrency', 3, 3, 'test'],
    +      ['--test-timeout', 2500, 2500, 'test'],
    +      ['--test-coverage-branches', 90, 90, 'test'],
    +      ['--test-coverage-functions', 85, 85, 'test'],
         ];
     
         for (const [flagName, configValue, expectedValue, namespace] of configFilePropagationTests) {
    
    From dbe47043dd77fb882ab368576e3878a3037c2179 Mon Sep 17 00:00:00 2001
    From: Marco Ippolito 
    Date: Fri, 21 Nov 2025 08:49:24 +0100
    Subject: [PATCH 27/56] src: add test flag to config file
    
    PR-URL: https://github.com/nodejs/node/pull/60798
    Reviewed-By: Jacob Smith 
    Reviewed-By: Rafael Gonzaga 
    ---
     doc/node-config-schema.json | 3 +++
     src/node_options.cc         | 4 +++-
     2 files changed, 6 insertions(+), 1 deletion(-)
    
    diff --git a/doc/node-config-schema.json b/doc/node-config-schema.json
    index c773f3fbd2aae0..140f23de84ff1d 100644
    --- a/doc/node-config-schema.json
    +++ b/doc/node-config-schema.json
    @@ -665,6 +665,9 @@
             "experimental-test-module-mocks": {
               "type": "boolean"
             },
    +        "test": {
    +          "type": "boolean"
    +        },
             "test-concurrency": {
               "type": "number"
             },
    diff --git a/src/node_options.cc b/src/node_options.cc
    index 959a5df163b609..b37296f76faab6 100644
    --- a/src/node_options.cc
    +++ b/src/node_options.cc
    @@ -839,7 +839,9 @@ EnvironmentOptionsParser::EnvironmentOptionsParser() {
       AddOption("--test",
                 "launch test runner on startup",
                 &EnvironmentOptions::test_runner,
    -            kDisallowedInEnvvar);
    +            kDisallowedInEnvvar,
    +            false,
    +            OptionNamespaces::kTestRunnerNamespace);
       AddOption("--test-concurrency",
                 "specify test runner concurrency",
                 &EnvironmentOptions::test_runner_concurrency,
    
    From 72dd0fa5cd1fa8b42e14cd69c15955145617fc30 Mon Sep 17 00:00:00 2001
    From: Marco Ippolito 
    Date: Fri, 21 Nov 2025 08:50:55 +0100
    Subject: [PATCH 28/56] src: add permission flag to config file
    
    PR-URL: https://github.com/nodejs/node/pull/60798
    Reviewed-By: Jacob Smith 
    Reviewed-By: Rafael Gonzaga 
    ---
     doc/node-config-schema.json | 3 +++
     src/node_options.cc         | 3 ++-
     2 files changed, 5 insertions(+), 1 deletion(-)
    
    diff --git a/doc/node-config-schema.json b/doc/node-config-schema.json
    index 140f23de84ff1d..6bf7ffd8e74228 100644
    --- a/doc/node-config-schema.json
    +++ b/doc/node-config-schema.json
    @@ -652,6 +652,9 @@
             },
             "allow-worker": {
               "type": "boolean"
    +        },
    +        "permission": {
    +          "type": "boolean"
             }
           }
         },
    diff --git a/src/node_options.cc b/src/node_options.cc
    index b37296f76faab6..baa3936075cd05 100644
    --- a/src/node_options.cc
    +++ b/src/node_options.cc
    @@ -599,7 +599,8 @@ EnvironmentOptionsParser::EnvironmentOptionsParser() {
                 "enable the permission system",
                 &EnvironmentOptions::permission,
                 kAllowedInEnvvar,
    -            false);
    +            false,
    +            OptionNamespaces::kPermissionNamespace);
       AddOption("--allow-fs-read",
                 "allow permissions to read the filesystem",
                 &EnvironmentOptions::allow_fs_read,
    
    From 49e56bfc55c9e77a77d232ec8a6ee84a432fa2d3 Mon Sep 17 00:00:00 2001
    From: Marco Ippolito 
    Date: Fri, 21 Nov 2025 09:09:25 +0100
    Subject: [PATCH 29/56] doc: fix webstorage config file property
    
    PR-URL: https://github.com/nodejs/node/pull/60798
    Reviewed-By: Jacob Smith 
    Reviewed-By: Rafael Gonzaga 
    ---
     doc/node-config-schema.json | 6 +++---
     1 file changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/doc/node-config-schema.json b/doc/node-config-schema.json
    index 6bf7ffd8e74228..22f52952af54d4 100644
    --- a/doc/node-config-schema.json
    +++ b/doc/node-config-schema.json
    @@ -186,6 +186,9 @@
             "experimental-websocket": {
               "type": "boolean"
             },
    +        "experimental-webstorage": {
    +          "type": "boolean"
    +        },
             "extra-info-on-fatal-exception": {
               "type": "boolean"
             },
    @@ -594,9 +597,6 @@
             "watch-preserve-output": {
               "type": "boolean"
             },
    -        "webstorage": {
    -          "type": "boolean"
    -        },
             "zero-fill-buffers": {
               "type": "boolean"
             }
    
    From 1758b74829709cafe3bed7fbf8359a6dcd706ef1 Mon Sep 17 00:00:00 2001
    From: Marco Ippolito 
    Date: Fri, 21 Nov 2025 10:02:54 +0100
    Subject: [PATCH 30/56] src: implicitly enable namespace in config
    
    PR-URL: https://github.com/nodejs/node/pull/60798
    Reviewed-By: Jacob Smith 
    Reviewed-By: Rafael Gonzaga 
    ---
     doc/api/cli.md                                | 35 +++++++++++++++-
     doc/api/permissions.md                        |  5 ++-
     src/node_config_file.cc                       | 23 ++++++++++
     .../options-as-flags/test-config.json         |  1 +
     test/fixtures/rc/empty-valid-namespace.json   |  2 +-
     test/fixtures/rc/permission-namespace.json    |  5 +++
     .../rc/test-namespace-explicit-false.json     |  6 +++
     test/fixtures/rc/watch-namespace.json         |  5 +++
     test/parallel/test-config-file.js             | 42 +++++++++++++++++++
     9 files changed, 120 insertions(+), 4 deletions(-)
     create mode 100644 test/fixtures/rc/permission-namespace.json
     create mode 100644 test/fixtures/rc/test-namespace-explicit-false.json
     create mode 100644 test/fixtures/rc/watch-namespace.json
    
    diff --git a/doc/api/cli.md b/doc/api/cli.md
    index 67685462b244df..aeb901973c2af6 100644
    --- a/doc/api/cli.md
    +++ b/doc/api/cli.md
    @@ -1029,7 +1029,40 @@ The configuration file supports namespace-specific options:
     
     * The `nodeOptions` field contains CLI flags that are allowed in [`NODE_OPTIONS`][].
     
    -* Namespace fields like `test` contain configuration specific to that subsystem.
    +* Namespace fields like `test`, `watch`, and `permission` contain configuration specific to that subsystem.
    +
    +When a namespace is present in the
    +configuration file, Node.js automatically enables the corresponding flag
    +(e.g., `--test`, `--watch`, `--permission`). This allows you to configure
    +subsystem-specific options without explicitly passing the flag on the command line.
    +
    +For example:
    +
    +```json
    +{
    +  "test": {
    +    "test-isolation": "process"
    +  }
    +}
    +```
    +
    +is equivalent to:
    +
    +```bash
    +node --test --test-isolation=process
    +```
    +
    +To disable the automatic flag while still using namespace options, you can
    +explicitly set the flag to `false` within the namespace:
    +
    +```json
    +{
    +  "test": {
    +    "test": false,
    +    "test-isolation": "process"
    +  }
    +}
    +```
     
     No-op flags are not supported.
     Not all V8 flags are currently supported.
    diff --git a/doc/api/permissions.md b/doc/api/permissions.md
    index dedb314f43e7eb..d36590ec3ae9cd 100644
    --- a/doc/api/permissions.md
    +++ b/doc/api/permissions.md
    @@ -175,10 +175,11 @@ Example `node.config.json`:
     }
     ```
     
    -Run with the configuration file:
    +When the `permission` namespace is present in the configuration file, Node.js
    +automatically enables the `--permission` flag. Run with:
     
     ```console
    -$ node --permission --experimental-default-config-file app.js
    +$ node --experimental-default-config-file app.js
     ```
     
     #### Using the Permission Model with `npx`
    diff --git a/src/node_config_file.cc b/src/node_config_file.cc
    index 58dfdc35829f83..39ea8f3a0634fd 100644
    --- a/src/node_config_file.cc
    +++ b/src/node_config_file.cc
    @@ -255,6 +255,9 @@ ParseResult ConfigReader::ParseConfig(const std::string_view& config_path) {
                                                        available_namespaces.end());
       // Create a set to track unique options
       std::unordered_set unique_options;
    +  // Namespaces in OPTION_NAMESPACE_LIST
    +  std::unordered_set namespaces_with_implicit_flags;
    +
       // Iterate through the main object to find all namespaces
       for (auto field : main_object) {
         std::string_view field_name;
    @@ -281,6 +284,15 @@ ParseResult ConfigReader::ParseConfig(const std::string_view& config_path) {
           continue;
         }
     
    +    // List of implicit namespace flags
    +    for (auto ns_enum : options_parser::AllNamespaces()) {
    +      std::string ns_str = options_parser::NamespaceEnumToString(ns_enum);
    +      if (!ns_str.empty() && namespace_name == ns_str) {
    +        namespaces_with_implicit_flags.insert(namespace_name);
    +        break;
    +      }
    +    }
    +
         // Get the namespace object
         simdjson::ondemand::object namespace_object;
         auto field_error = field.value().get_object().get(namespace_object);
    @@ -302,6 +314,17 @@ ParseResult ConfigReader::ParseConfig(const std::string_view& config_path) {
         }
       }
     
    +  // Add implicit flags for namespaces (--test, --permission, --watch)
    +  // These flags are automatically enabled when their namespace is present
    +  for (const auto& ns : namespaces_with_implicit_flags) {
    +    std::string flag = "--" + ns;
    +    std::string no_flag = "--no-" + ns;
    +    // We skip if the user has already set the flag or its negation
    +    if (!unique_options.contains(flag) && !unique_options.contains(no_flag)) {
    +      namespace_options_.push_back(flag);
    +    }
    +  }
    +
       return ParseResult::Valid;
     }
     
    diff --git a/test/fixtures/options-as-flags/test-config.json b/test/fixtures/options-as-flags/test-config.json
    index aa6355c37a1681..c956eb6d274785 100644
    --- a/test/fixtures/options-as-flags/test-config.json
    +++ b/test/fixtures/options-as-flags/test-config.json
    @@ -4,6 +4,7 @@
         "max-http-header-size": 8192
       },
       "test": {
    +    "test": false,
         "test-isolation": "none"
       }
     }
    diff --git a/test/fixtures/rc/empty-valid-namespace.json b/test/fixtures/rc/empty-valid-namespace.json
    index c267aa9bde2918..9f6cb4b89f91be 100644
    --- a/test/fixtures/rc/empty-valid-namespace.json
    +++ b/test/fixtures/rc/empty-valid-namespace.json
    @@ -1,3 +1,3 @@
     {
    -    "test": {}
    +    "permission": {}
     }
    diff --git a/test/fixtures/rc/permission-namespace.json b/test/fixtures/rc/permission-namespace.json
    new file mode 100644
    index 00000000000000..72167d77dd18ec
    --- /dev/null
    +++ b/test/fixtures/rc/permission-namespace.json
    @@ -0,0 +1,5 @@
    +{
    +  "permission": {
    +    "allow-fs-read": "*"
    +  }
    +}
    diff --git a/test/fixtures/rc/test-namespace-explicit-false.json b/test/fixtures/rc/test-namespace-explicit-false.json
    new file mode 100644
    index 00000000000000..42e68aa6a43f59
    --- /dev/null
    +++ b/test/fixtures/rc/test-namespace-explicit-false.json
    @@ -0,0 +1,6 @@
    +{
    +  "test": {
    +    "test": false,
    +    "test-isolation": "none"
    +  }
    +}
    diff --git a/test/fixtures/rc/watch-namespace.json b/test/fixtures/rc/watch-namespace.json
    new file mode 100644
    index 00000000000000..11aad97fffd315
    --- /dev/null
    +++ b/test/fixtures/rc/watch-namespace.json
    @@ -0,0 +1,5 @@
    +{
    +  "watch": {
    +    "watch-preserve-output": true
    +  }
    +}
    diff --git a/test/parallel/test-config-file.js b/test/parallel/test-config-file.js
    index ca4c89200fd5b0..438a138f6ba227 100644
    --- a/test/parallel/test-config-file.js
    +++ b/test/parallel/test-config-file.js
    @@ -407,6 +407,7 @@ describe('namespace-scoped options', () => {
           '--expose-internals',
           '--experimental-config-file',
           fixtures.path('rc/namespaced/node.config.json'),
    +      '--no-test',
           '-p', 'require("internal/options").getOptionValue("--test-isolation")',
         ]);
         assert.strictEqual(result.stderr, '');
    @@ -483,6 +484,7 @@ describe('namespace-scoped options', () => {
           '--test-isolation', 'process',
           '--experimental-config-file',
           fixtures.path('rc/namespaced/node.config.json'),
    +      '--no-test',
           '-p', 'require("internal/options").getOptionValue("--test-isolation")',
         ]);
         assert.strictEqual(result.stderr, '');
    @@ -498,6 +500,7 @@ describe('namespace-scoped options', () => {
           '--test-coverage-exclude', 'cli-pattern2',
           '--experimental-config-file',
           fixtures.path('rc/namespace-with-array.json'),
    +      '--no-test',
           '-p', 'JSON.stringify(require("internal/options").getOptionValue("--test-coverage-exclude"))',
         ]);
         assert.strictEqual(result.stderr, '');
    @@ -520,6 +523,7 @@ describe('namespace-scoped options', () => {
           '--expose-internals',
           '--experimental-config-file',
           fixtures.path('rc/namespace-with-disallowed-envvar.json'),
    +      '--no-test',
           '-p', 'require("internal/options").getOptionValue("--test-concurrency")',
         ]);
         assert.strictEqual(result.stderr, '');
    @@ -536,6 +540,7 @@ describe('namespace-scoped options', () => {
           '--test-concurrency', '2',
           '--experimental-config-file',
           fixtures.path('rc/namespace-with-disallowed-envvar.json'),
    +      '--no-test',
           '-p', 'require("internal/options").getOptionValue("--test-concurrency")',
         ]);
         assert.strictEqual(result.stderr, '');
    @@ -554,4 +559,41 @@ describe('namespace-scoped options', () => {
         assert.strictEqual(result.stdout, '');
         assert.strictEqual(result.code, 9);
       });
    +
    +  it('should automatically enable --test flag when test namespace is present', async () => {
    +    const result = await spawnPromisified(process.execPath, [
    +      '--no-warnings',
    +      '--experimental-config-file',
    +      fixtures.path('rc/namespaced/node.config.json'),
    +      fixtures.path('rc/test.js'),
    +    ]);
    +    assert.strictEqual(result.code, 0);
    +    assert.match(result.stdout, /tests 1/);
    +  });
    +
    +  it('should automatically enable --permission flag when permission namespace is present', async () => {
    +    const result = await spawnPromisified(process.execPath, [
    +      '--no-warnings',
    +      '--expose-internals',
    +      '--experimental-config-file',
    +      fixtures.path('rc/permission-namespace.json'),
    +      '-p', 'require("internal/options").getOptionValue("--permission")',
    +    ]);
    +    assert.strictEqual(result.stderr, '');
    +    assert.strictEqual(result.stdout, 'true\n');
    +    assert.strictEqual(result.code, 0);
    +  });
    +
    +  it('should respect explicit test: false in test namespace', async () => {
    +    const result = await spawnPromisified(process.execPath, [
    +      '--no-warnings',
    +      '--expose-internals',
    +      '--experimental-config-file',
    +      fixtures.path('rc/test-namespace-explicit-false.json'),
    +      '-p', 'require("internal/options").getOptionValue("--test")',
    +    ]);
    +    assert.strictEqual(result.stderr, '');
    +    assert.strictEqual(result.stdout, 'false\n');
    +    assert.strictEqual(result.code, 0);
    +  });
     });
    
    From aa948fdbd0120fdac704f2a38342dca4037f7cd8 Mon Sep 17 00:00:00 2001
    From: Botato <51982229+Botato300@users.noreply.github.com>
    Date: Sun, 23 Nov 2025 13:20:07 +0000
    Subject: [PATCH 31/56] doc: keep sidebar module visible when navigating docs
    
    PR-URL: https://github.com/nodejs/node/pull/60410
    Reviewed-By: Antoine du Hamel 
    ---
     doc/api_assets/api.js | 16 ++++++++++++++++
     1 file changed, 16 insertions(+)
    
    diff --git a/doc/api_assets/api.js b/doc/api_assets/api.js
    index e86f110e0346bf..a3e479ed9569c3 100644
    --- a/doc/api_assets/api.js
    +++ b/doc/api_assets/api.js
    @@ -187,6 +187,20 @@
         });
       }
     
    +  function setupSidebarScroll() {
    +    const sidebarLinks = document.querySelectorAll('#column2 a');
    +
    +    let link;
    +    for (link of sidebarLinks) {
    +      if (link.pathname === window.location.pathname) break;
    +    }
    +
    +    if (!link) return;
    +
    +    link.scrollIntoView({ block: 'center' });
    +  }
    +
    +
       function bootstrap() {
         // Check if we have JavaScript support.
         document.documentElement.classList.add('has-js');
    @@ -206,6 +220,8 @@
         setupFlavorToggles();
     
         setupCopyButton();
    +
    +    setupSidebarScroll();
       }
     
       if (document.readyState === 'loading') {
    
    From 189a0a71de7ff3fdfdc670217c39d5b5fe8d5a98 Mon Sep 17 00:00:00 2001
    From: "Node.js GitHub Bot" 
    Date: Sun, 23 Nov 2025 13:26:54 +0000
    Subject: [PATCH 32/56] deps: update sqlite to 3.51.0
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    PR-URL: https://github.com/nodejs/node/pull/60614
    Reviewed-By: Colin Ihrig 
    Reviewed-By: Michaël Zasso 
    Reviewed-By: Antoine du Hamel 
    ---
     deps/sqlite/sqlite3.c    | 5511 +++++++++++++++++++++++++++++---------
     deps/sqlite/sqlite3.h    |  413 ++-
     deps/sqlite/sqlite3ext.h |    7 +
     3 files changed, 4554 insertions(+), 1377 deletions(-)
    
    diff --git a/deps/sqlite/sqlite3.c b/deps/sqlite/sqlite3.c
    index 26a7a43d8658be..03d65b62820f08 100644
    --- a/deps/sqlite/sqlite3.c
    +++ b/deps/sqlite/sqlite3.c
    @@ -1,6 +1,6 @@
     /******************************************************************************
     ** This file is an amalgamation of many separate C source files from SQLite
    -** version 3.50.4.  By combining all the individual C code files into this
    +** version 3.51.0.  By combining all the individual C code files into this
     ** single large file, the entire code can be compiled as a single translation
     ** unit.  This allows many compilers to do optimizations that would not be
     ** possible if the files were compiled separately.  Performance improvements
    @@ -18,7 +18,7 @@
     ** separate file. This file contains only code for the core SQLite library.
     **
     ** The content in this amalgamation comes from Fossil check-in
    -** 4d8adfb30e03f9cf27f800a2c1ba3c48fb4c with changes in files:
    +** fb2c931ae597f8d00a37574ff67aeed3eced with changes in files:
     **
     **    
     */
    @@ -170,7 +170,9 @@
     #define HAVE_UTIME 1
     #else
     /* This is not VxWorks. */
    -#define OS_VXWORKS 0
    +#ifndef OS_VXWORKS
    +#  define OS_VXWORKS 0
    +#endif
     #define HAVE_FCHOWN 1
     #define HAVE_READLINK 1
     #define HAVE_LSTAT 1
    @@ -465,9 +467,12 @@ extern "C" {
     ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
     ** [sqlite_version()] and [sqlite_source_id()].
     */
    -#define SQLITE_VERSION        "3.50.4"
    -#define SQLITE_VERSION_NUMBER 3050004
    -#define SQLITE_SOURCE_ID      "2025-07-30 19:33:53 4d8adfb30e03f9cf27f800a2c1ba3c48fb4ca1b08b0f5ed59a4d5ecbf45e20a3"
    +#define SQLITE_VERSION        "3.51.0"
    +#define SQLITE_VERSION_NUMBER 3051000
    +#define SQLITE_SOURCE_ID      "2025-11-04 19:38:17 fb2c931ae597f8d00a37574ff67aeed3eced4e5547f9120744ae4bfa8e74527b"
    +#define SQLITE_SCM_BRANCH     "trunk"
    +#define SQLITE_SCM_TAGS       "release major-release version-3.51.0"
    +#define SQLITE_SCM_DATETIME   "2025-11-04T19:38:17.314Z"
     
     /*
     ** CAPI3REF: Run-Time Library Version Numbers
    @@ -487,9 +492,9 @@ extern "C" {
     ** assert( strcmp(sqlite3_libversion(),SQLITE_VERSION)==0 );
     ** 
    )^ ** -** ^The sqlite3_version[] string constant contains the text of [SQLITE_VERSION] -** macro. ^The sqlite3_libversion() function returns a pointer to the -** to the sqlite3_version[] string constant. The sqlite3_libversion() +** ^The sqlite3_version[] string constant contains the text of the +** [SQLITE_VERSION] macro. ^The sqlite3_libversion() function returns a +** pointer to the sqlite3_version[] string constant. The sqlite3_libversion() ** function is provided for use in DLLs since DLL users usually do not have ** direct access to string constants within the DLL. ^The ** sqlite3_libversion_number() function returns an integer equal to @@ -689,7 +694,7 @@ typedef int (*sqlite3_callback)(void*,int,char**, char**); ** without having to use a lot of C code. ** ** ^The sqlite3_exec() interface runs zero or more UTF-8 encoded, -** semicolon-separate SQL statements passed into its 2nd argument, +** semicolon-separated SQL statements passed into its 2nd argument, ** in the context of the [database connection] passed in as its 1st ** argument. ^If the callback function of the 3rd argument to ** sqlite3_exec() is not NULL, then it is invoked for each result row @@ -722,7 +727,7 @@ typedef int (*sqlite3_callback)(void*,int,char**, char**); ** result row is NULL then the corresponding string pointer for the ** sqlite3_exec() callback is a NULL pointer. ^The 4th argument to the ** sqlite3_exec() callback is an array of pointers to strings where each -** entry represents the name of corresponding result column as obtained +** entry represents the name of a corresponding result column as obtained ** from [sqlite3_column_name()]. ** ** ^If the 2nd parameter to sqlite3_exec() is a NULL pointer, a pointer @@ -816,6 +821,9 @@ SQLITE_API int sqlite3_exec( #define SQLITE_ERROR_MISSING_COLLSEQ (SQLITE_ERROR | (1<<8)) #define SQLITE_ERROR_RETRY (SQLITE_ERROR | (2<<8)) #define SQLITE_ERROR_SNAPSHOT (SQLITE_ERROR | (3<<8)) +#define SQLITE_ERROR_RESERVESIZE (SQLITE_ERROR | (4<<8)) +#define SQLITE_ERROR_KEY (SQLITE_ERROR | (5<<8)) +#define SQLITE_ERROR_UNABLE (SQLITE_ERROR | (6<<8)) #define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8)) #define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8)) #define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8)) @@ -850,6 +858,8 @@ SQLITE_API int sqlite3_exec( #define SQLITE_IOERR_DATA (SQLITE_IOERR | (32<<8)) #define SQLITE_IOERR_CORRUPTFS (SQLITE_IOERR | (33<<8)) #define SQLITE_IOERR_IN_PAGE (SQLITE_IOERR | (34<<8)) +#define SQLITE_IOERR_BADKEY (SQLITE_IOERR | (35<<8)) +#define SQLITE_IOERR_CODEC (SQLITE_IOERR | (36<<8)) #define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8)) #define SQLITE_LOCKED_VTAB (SQLITE_LOCKED | (2<<8)) #define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8)) @@ -908,7 +918,7 @@ SQLITE_API int sqlite3_exec( ** Note in particular that passing the SQLITE_OPEN_EXCLUSIVE flag into ** [sqlite3_open_v2()] does *not* cause the underlying database file ** to be opened using O_EXCL. Passing SQLITE_OPEN_EXCLUSIVE into -** [sqlite3_open_v2()] has historically be a no-op and might become an +** [sqlite3_open_v2()] has historically been a no-op and might become an ** error in future versions of SQLite. */ #define SQLITE_OPEN_READONLY 0x00000001 /* Ok for sqlite3_open_v2() */ @@ -1002,7 +1012,7 @@ SQLITE_API int sqlite3_exec( ** SQLite uses one of these integer values as the second ** argument to calls it makes to the xLock() and xUnlock() methods ** of an [sqlite3_io_methods] object. These values are ordered from -** lest restrictive to most restrictive. +** least restrictive to most restrictive. ** ** The argument to xLock() is always SHARED or higher. The argument to ** xUnlock is either SHARED or NONE. @@ -1243,7 +1253,7 @@ struct sqlite3_io_methods { ** connection. See also [SQLITE_FCNTL_FILE_POINTER]. ** **
  • [[SQLITE_FCNTL_SYNC_OMITTED]] -** No longer in use. +** The SQLITE_FCNTL_SYNC_OMITTED file-control is no longer used. ** **
  • [[SQLITE_FCNTL_SYNC]] ** The [SQLITE_FCNTL_SYNC] opcode is generated internally by SQLite and @@ -1318,7 +1328,7 @@ struct sqlite3_io_methods { ** **
  • [[SQLITE_FCNTL_VFSNAME]] ** ^The [SQLITE_FCNTL_VFSNAME] opcode can be used to obtain the names of -** all [VFSes] in the VFS stack. The names are of all VFS shims and the +** all [VFSes] in the VFS stack. The names of all VFS shims and the ** final bottom-level VFS are written into memory obtained from ** [sqlite3_malloc()] and the result is stored in the char* variable ** that the fourth parameter of [sqlite3_file_control()] points to. @@ -1332,7 +1342,7 @@ struct sqlite3_io_methods { ** ^The [SQLITE_FCNTL_VFS_POINTER] opcode finds a pointer to the top-level ** [VFSes] currently in use. ^(The argument X in ** sqlite3_file_control(db,SQLITE_FCNTL_VFS_POINTER,X) must be -** of type "[sqlite3_vfs] **". This opcodes will set *X +** of type "[sqlite3_vfs] **". This opcode will set *X ** to a pointer to the top-level VFS.)^ ** ^When there are multiple VFS shims in the stack, this opcode finds the ** upper-most shim only. @@ -1522,7 +1532,7 @@ struct sqlite3_io_methods { **
  • [[SQLITE_FCNTL_EXTERNAL_READER]] ** The EXPERIMENTAL [SQLITE_FCNTL_EXTERNAL_READER] opcode is used to detect ** whether or not there is a database client in another process with a wal-mode -** transaction open on the database or not. It is only available on unix.The +** transaction open on the database or not. It is only available on unix. The ** (void*) argument passed with this file-control should be a pointer to a ** value of type (int). The integer value is set to 1 if the database is a wal ** mode database and there exists at least one client in another process that @@ -1540,6 +1550,15 @@ struct sqlite3_io_methods { ** database is not a temp db, then the [SQLITE_FCNTL_RESET_CACHE] file-control ** purges the contents of the in-memory page cache. If there is an open ** transaction, or if the db is a temp-db, this opcode is a no-op, not an error. +** +**
  • [[SQLITE_FCNTL_FILESTAT]] +** The [SQLITE_FCNTL_FILESTAT] opcode returns low-level diagnostic information +** about the [sqlite3_file] objects used access the database and journal files +** for the given schema. The fourth parameter to [sqlite3_file_control()] +** should be an initialized [sqlite3_str] pointer. JSON text describing +** various aspects of the sqlite3_file object is appended to the sqlite3_str. +** The SQLITE_FCNTL_FILESTAT opcode is usually a no-op, unless compile-time +** options are used to enable it. ** */ #define SQLITE_FCNTL_LOCKSTATE 1 @@ -1585,6 +1604,7 @@ struct sqlite3_io_methods { #define SQLITE_FCNTL_RESET_CACHE 42 #define SQLITE_FCNTL_NULL_IO 43 #define SQLITE_FCNTL_BLOCK_ON_CONNECT 44 +#define SQLITE_FCNTL_FILESTAT 45 /* deprecated names */ #define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE @@ -1947,7 +1967,7 @@ struct sqlite3_vfs { ** SQLite interfaces so that an application usually does not need to ** invoke sqlite3_initialize() directly. For example, [sqlite3_open()] ** calls sqlite3_initialize() so the SQLite library will be automatically -** initialized when [sqlite3_open()] is called if it has not be initialized +** initialized when [sqlite3_open()] is called if it has not been initialized ** already. ^However, if SQLite is compiled with the [SQLITE_OMIT_AUTOINIT] ** compile-time option, then the automatic calls to sqlite3_initialize() ** are omitted and the application must call sqlite3_initialize() directly @@ -2204,21 +2224,21 @@ struct sqlite3_mem_methods { ** The [sqlite3_mem_methods] ** structure is filled with the currently defined memory allocation routines.)^ ** This option can be used to overload the default memory allocation -** routines with a wrapper that simulations memory allocation failure or +** routines with a wrapper that simulates memory allocation failure or ** tracks memory usage, for example. ** ** [[SQLITE_CONFIG_SMALL_MALLOC]]
    SQLITE_CONFIG_SMALL_MALLOC
    -**
    ^The SQLITE_CONFIG_SMALL_MALLOC option takes single argument of +**
    ^The SQLITE_CONFIG_SMALL_MALLOC option takes a single argument of ** type int, interpreted as a boolean, which if true provides a hint to ** SQLite that it should avoid large memory allocations if possible. ** SQLite will run faster if it is free to make large memory allocations, -** but some application might prefer to run slower in exchange for +** but some applications might prefer to run slower in exchange for ** guarantees about memory fragmentation that are possible if large ** allocations are avoided. This hint is normally off. **
    ** ** [[SQLITE_CONFIG_MEMSTATUS]]
    SQLITE_CONFIG_MEMSTATUS
    -**
    ^The SQLITE_CONFIG_MEMSTATUS option takes single argument of type int, +**
    ^The SQLITE_CONFIG_MEMSTATUS option takes a single argument of type int, ** interpreted as a boolean, which enables or disables the collection of ** memory allocation statistics. ^(When memory allocation statistics are ** disabled, the following SQLite interfaces become non-operational: @@ -2263,7 +2283,7 @@ struct sqlite3_mem_methods { ** ^If pMem is NULL and N is non-zero, then each database connection ** does an initial bulk allocation for page cache memory ** from [sqlite3_malloc()] sufficient for N cache lines if N is positive or -** of -1024*N bytes if N is negative, . ^If additional +** of -1024*N bytes if N is negative. ^If additional ** page cache memory is needed beyond what is provided by the initial ** allocation, then SQLite goes to [sqlite3_malloc()] separately for each ** additional cache line.
    @@ -2292,7 +2312,7 @@ struct sqlite3_mem_methods { **
    ^(The SQLITE_CONFIG_MUTEX option takes a single argument which is a ** pointer to an instance of the [sqlite3_mutex_methods] structure. ** The argument specifies alternative low-level mutex routines to be used -** in place the mutex routines built into SQLite.)^ ^SQLite makes a copy of +** in place of the mutex routines built into SQLite.)^ ^SQLite makes a copy of ** the content of the [sqlite3_mutex_methods] structure before the call to ** [sqlite3_config()] returns. ^If SQLite is compiled with ** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then @@ -2334,7 +2354,7 @@ struct sqlite3_mem_methods { ** ** [[SQLITE_CONFIG_GETPCACHE2]]
    SQLITE_CONFIG_GETPCACHE2
    **
    ^(The SQLITE_CONFIG_GETPCACHE2 option takes a single argument which -** is a pointer to an [sqlite3_pcache_methods2] object. SQLite copies of +** is a pointer to an [sqlite3_pcache_methods2] object. SQLite copies off ** the current page cache implementation into that object.)^
    ** ** [[SQLITE_CONFIG_LOG]]
    SQLITE_CONFIG_LOG
    @@ -2351,7 +2371,7 @@ struct sqlite3_mem_methods { ** the logger function is a copy of the first parameter to the corresponding ** [sqlite3_log()] call and is intended to be a [result code] or an ** [extended result code]. ^The third parameter passed to the logger is -** log message after formatting via [sqlite3_snprintf()]. +** a log message after formatting via [sqlite3_snprintf()]. ** The SQLite logging interface is not reentrant; the logger function ** supplied by the application must not invoke any SQLite interface. ** In a multi-threaded application, the application-defined logger @@ -2542,7 +2562,7 @@ struct sqlite3_mem_methods { ** These constants are the available integer configuration options that ** can be passed as the second parameter to the [sqlite3_db_config()] interface. ** -** The [sqlite3_db_config()] interface is a var-args functions. It takes a +** The [sqlite3_db_config()] interface is a var-args function. It takes a ** variable number of parameters, though always at least two. The number of ** parameters passed into sqlite3_db_config() depends on which of these ** constants is given as the second parameter. This documentation page @@ -2654,17 +2674,20 @@ struct sqlite3_mem_methods { ** ** [[SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER]] **
    SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER
    -**
    ^This option is used to enable or disable the -** [fts3_tokenizer()] function which is part of the -** [FTS3] full-text search engine extension. -** There must be two additional arguments. -** The first argument is an integer which is 0 to disable fts3_tokenizer() or -** positive to enable fts3_tokenizer() or negative to leave the setting -** unchanged. -** The second parameter is a pointer to an integer into which -** is written 0 or 1 to indicate whether fts3_tokenizer is disabled or enabled -** following this call. The second parameter may be a NULL pointer, in -** which case the new setting is not reported back.
    +**
    ^This option is used to enable or disable using the +** [fts3_tokenizer()] function - part of the [FTS3] full-text search engine +** extension - without using bound parameters as the parameters. Doing so +** is disabled by default. There must be two additional arguments. The first +** argument is an integer. If it is passed 0, then using fts3_tokenizer() +** without bound parameters is disabled. If it is passed a positive value, +** then calling fts3_tokenizer without bound parameters is enabled. If it +** is passed a negative value, this setting is not modified - this can be +** used to query for the current setting. The second parameter is a pointer +** to an integer into which is written 0 or 1 to indicate the current value +** of this setting (after it is modified, if applicable). The second +** parameter may be a NULL pointer, in which case the value of the setting +** is not reported back. Refer to [FTS3] documentation for further details. +**
    ** ** [[SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION]] **
    SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION
    @@ -2676,8 +2699,8 @@ struct sqlite3_mem_methods { ** When the first argument to this interface is 1, then only the C-API is ** enabled and the SQL function remains disabled. If the first argument to ** this interface is 0, then both the C-API and the SQL function are disabled. -** If the first argument is -1, then no changes are made to state of either the -** C-API or the SQL function. +** If the first argument is -1, then no changes are made to the state of either +** the C-API or the SQL function. ** The second parameter is a pointer to an integer into which ** is written 0 or 1 to indicate whether [sqlite3_load_extension()] interface ** is disabled or enabled following this call. The second parameter may @@ -2795,7 +2818,7 @@ struct sqlite3_mem_methods { ** [[SQLITE_DBCONFIG_LEGACY_ALTER_TABLE]] **
    SQLITE_DBCONFIG_LEGACY_ALTER_TABLE
    **
    The SQLITE_DBCONFIG_LEGACY_ALTER_TABLE option activates or deactivates -** the legacy behavior of the [ALTER TABLE RENAME] command such it +** the legacy behavior of the [ALTER TABLE RENAME] command such that it ** behaves as it did prior to [version 3.24.0] (2018-06-04). See the ** "Compatibility Notice" on the [ALTER TABLE RENAME documentation] for ** additional information. This feature can also be turned on and off @@ -2844,7 +2867,7 @@ struct sqlite3_mem_methods { **
    SQLITE_DBCONFIG_LEGACY_FILE_FORMAT
    **
    The SQLITE_DBCONFIG_LEGACY_FILE_FORMAT option activates or deactivates ** the legacy file format flag. When activated, this flag causes all newly -** created database file to have a schema format version number (the 4-byte +** created database files to have a schema format version number (the 4-byte ** integer found at offset 44 into the database header) of 1. This in turn ** means that the resulting database file will be readable and writable by ** any SQLite version back to 3.0.0 ([dateof:3.0.0]). Without this setting, @@ -2871,7 +2894,7 @@ struct sqlite3_mem_methods { ** the database handle both when the SQL statement is prepared and when it ** is stepped. The flag is set (collection of statistics is enabled) ** by default.

    This option takes two arguments: an integer and a pointer to -** an integer.. The first argument is 1, 0, or -1 to enable, disable, or +** an integer. The first argument is 1, 0, or -1 to enable, disable, or ** leave unchanged the statement scanstatus option. If the second argument ** is not NULL, then the value of the statement scanstatus setting after ** processing the first argument is written into the integer that the second @@ -2914,8 +2937,8 @@ struct sqlite3_mem_methods { **

    The SQLITE_DBCONFIG_ENABLE_ATTACH_WRITE option enables or disables the ** ability of the [ATTACH DATABASE] SQL command to open a database for writing. ** This capability is enabled by default. Applications can disable or -** reenable this capability using the current DBCONFIG option. If the -** the this capability is disabled, the [ATTACH] command will still work, +** reenable this capability using the current DBCONFIG option. If +** this capability is disabled, the [ATTACH] command will still work, ** but the database will be opened read-only. If this option is disabled, ** then the ability to create a new database using [ATTACH] is also disabled, ** regardless of the value of the [SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE] @@ -2949,7 +2972,7 @@ struct sqlite3_mem_methods { ** **

    Most of the SQLITE_DBCONFIG options take two arguments, so that the ** overall call to [sqlite3_db_config()] has a total of four parameters. -** The first argument (the third parameter to sqlite3_db_config()) is a integer. +** The first argument (the third parameter to sqlite3_db_config()) is an integer. ** The second argument is a pointer to an integer. If the first argument is 1, ** then the option becomes enabled. If the first integer argument is 0, then the ** option is disabled. If the first argument is -1, then the option setting @@ -3239,7 +3262,7 @@ SQLITE_API int sqlite3_is_interrupted(sqlite3*); ** ^These routines return 0 if the statement is incomplete. ^If a ** memory allocation fails, then SQLITE_NOMEM is returned. ** -** ^These routines do not parse the SQL statements thus +** ^These routines do not parse the SQL statements and thus ** will not detect syntactically incorrect SQL. ** ** ^(If SQLite has not been initialized using [sqlite3_initialize()] prior @@ -3356,7 +3379,7 @@ SQLITE_API int sqlite3_busy_timeout(sqlite3*, int ms); ** indefinitely if possible. The results of passing any other negative value ** are undefined. ** -** Internally, each SQLite database handle store two timeout values - the +** Internally, each SQLite database handle stores two timeout values - the ** busy-timeout (used for rollback mode databases, or if the VFS does not ** support blocking locks) and the setlk-timeout (used for blocking locks ** on wal-mode databases). The sqlite3_busy_timeout() method sets both @@ -3386,7 +3409,7 @@ SQLITE_API int sqlite3_setlk_timeout(sqlite3*, int ms, int flags); ** This is a legacy interface that is preserved for backwards compatibility. ** Use of this interface is not recommended. ** -** Definition: A result table is memory data structure created by the +** Definition: A result table is a memory data structure created by the ** [sqlite3_get_table()] interface. A result table records the ** complete query results from one or more queries. ** @@ -3529,7 +3552,7 @@ SQLITE_API char *sqlite3_vsnprintf(int,char*,const char*, va_list); ** ^Calling sqlite3_free() with a pointer previously returned ** by sqlite3_malloc() or sqlite3_realloc() releases that memory so ** that it might be reused. ^The sqlite3_free() routine is -** a no-op if is called with a NULL pointer. Passing a NULL pointer +** a no-op if it is called with a NULL pointer. Passing a NULL pointer ** to sqlite3_free() is harmless. After being freed, memory ** should neither be read nor written. Even reading previously freed ** memory might result in a segmentation fault or other severe error. @@ -3547,13 +3570,13 @@ SQLITE_API char *sqlite3_vsnprintf(int,char*,const char*, va_list); ** sqlite3_free(X). ** ^sqlite3_realloc(X,N) returns a pointer to a memory allocation ** of at least N bytes in size or NULL if insufficient memory is available. -** ^If M is the size of the prior allocation, then min(N,M) bytes -** of the prior allocation are copied into the beginning of buffer returned +** ^If M is the size of the prior allocation, then min(N,M) bytes of the +** prior allocation are copied into the beginning of the buffer returned ** by sqlite3_realloc(X,N) and the prior allocation is freed. ** ^If sqlite3_realloc(X,N) returns NULL and N is positive, then the ** prior allocation is not freed. ** -** ^The sqlite3_realloc64(X,N) interfaces works the same as +** ^The sqlite3_realloc64(X,N) interface works the same as ** sqlite3_realloc(X,N) except that N is a 64-bit unsigned integer instead ** of a 32-bit signed integer. ** @@ -3603,7 +3626,7 @@ SQLITE_API sqlite3_uint64 sqlite3_msize(void*); ** was last reset. ^The values returned by [sqlite3_memory_used()] and ** [sqlite3_memory_highwater()] include any overhead ** added by SQLite in its implementation of [sqlite3_malloc()], -** but not overhead added by the any underlying system library +** but not overhead added by any underlying system library ** routines that [sqlite3_malloc()] may call. ** ** ^The memory high-water mark is reset to the current value of @@ -4055,7 +4078,7 @@ SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); ** there is no harm in trying.) ** ** ^(

    [SQLITE_OPEN_SHAREDCACHE]
    -**
    The database is opened [shared cache] enabled, overriding +**
    The database is opened with [shared cache] enabled, overriding ** the default shared cache setting provided by ** [sqlite3_enable_shared_cache()].)^ ** The [use of shared cache mode is discouraged] and hence shared cache @@ -4063,7 +4086,7 @@ SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); ** this option is a no-op. ** ** ^(
    [SQLITE_OPEN_PRIVATECACHE]
    -**
    The database is opened [shared cache] disabled, overriding +**
    The database is opened with [shared cache] disabled, overriding ** the default shared cache setting provided by ** [sqlite3_enable_shared_cache()].)^ ** @@ -4481,7 +4504,7 @@ SQLITE_API void sqlite3_free_filename(sqlite3_filename); ** subsequent calls to other SQLite interface functions.)^ ** ** ^The sqlite3_errstr(E) interface returns the English-language text -** that describes the [result code] E, as UTF-8, or NULL if E is not an +** that describes the [result code] E, as UTF-8, or NULL if E is not a ** result code for which a text error message is available. ** ^(Memory to hold the error message string is managed internally ** and must not be freed by the application)^. @@ -4489,7 +4512,7 @@ SQLITE_API void sqlite3_free_filename(sqlite3_filename); ** ^If the most recent error references a specific token in the input ** SQL, the sqlite3_error_offset() interface returns the byte offset ** of the start of that token. ^The byte offset returned by -** sqlite3_error_offset() assumes that the input SQL is UTF8. +** sqlite3_error_offset() assumes that the input SQL is UTF-8. ** ^If the most recent error does not reference a specific token in the input ** SQL, then the sqlite3_error_offset() function returns -1. ** @@ -4514,6 +4537,34 @@ SQLITE_API const void *sqlite3_errmsg16(sqlite3*); SQLITE_API const char *sqlite3_errstr(int); SQLITE_API int sqlite3_error_offset(sqlite3 *db); +/* +** CAPI3REF: Set Error Codes And Message +** METHOD: sqlite3 +** +** Set the error code of the database handle passed as the first argument +** to errcode, and the error message to a copy of nul-terminated string +** zErrMsg. If zErrMsg is passed NULL, then the error message is set to +** the default message associated with the supplied error code. Subsequent +** calls to [sqlite3_errcode()] and [sqlite3_errmsg()] and similar will +** return the values set by this routine in place of what was previously +** set by SQLite itself. +** +** This function returns SQLITE_OK if the error code and error message are +** successfully set, SQLITE_NOMEM if an OOM occurs, and SQLITE_MISUSE if +** the database handle is NULL or invalid. +** +** The error code and message set by this routine remains in effect until +** they are changed, either by another call to this routine or until they are +** changed to by SQLite itself to reflect the result of some subsquent +** API call. +** +** This function is intended for use by SQLite extensions or wrappers. The +** idea is that an extension or wrapper can use this routine to set error +** messages and error codes and thus behave more like a core SQLite +** feature from the point of view of an application. +*/ +SQLITE_API int sqlite3_set_errmsg(sqlite3 *db, int errcode, const char *zErrMsg); + /* ** CAPI3REF: Prepared Statement Object ** KEYWORDS: {prepared statement} {prepared statements} @@ -4588,8 +4639,8 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); ** ** These constants define various performance limits ** that can be lowered at run-time using [sqlite3_limit()]. -** The synopsis of the meanings of the various limits is shown below. -** Additional information is available at [limits | Limits in SQLite]. +** A concise description of these limits follows, and additional information +** is available at [limits | Limits in SQLite]. ** **
    ** [[SQLITE_LIMIT_LENGTH]] ^(
    SQLITE_LIMIT_LENGTH
    @@ -4654,7 +4705,7 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); /* ** CAPI3REF: Prepare Flags ** -** These constants define various flags that can be passed into +** These constants define various flags that can be passed into the ** "prepFlags" parameter of the [sqlite3_prepare_v3()] and ** [sqlite3_prepare16_v3()] interfaces. ** @@ -4741,7 +4792,7 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); ** there is a small performance advantage to passing an nByte parameter that ** is the number of bytes in the input string including ** the nul-terminator. -** Note that nByte measure the length of the input in bytes, not +** Note that nByte measures the length of the input in bytes, not ** characters, even for the UTF-16 interfaces. ** ** ^If pzTail is not NULL then *pzTail is made to point to the first byte @@ -4875,7 +4926,7 @@ SQLITE_API int sqlite3_prepare16_v3( ** ** ^The sqlite3_expanded_sql() interface returns NULL if insufficient memory ** is available to hold the result, or if the result would exceed the -** the maximum string length determined by the [SQLITE_LIMIT_LENGTH]. +** maximum string length determined by the [SQLITE_LIMIT_LENGTH]. ** ** ^The [SQLITE_TRACE_SIZE_LIMIT] compile-time option limits the size of ** bound parameter expansions. ^The [SQLITE_OMIT_TRACE] compile-time @@ -5063,7 +5114,7 @@ typedef struct sqlite3_value sqlite3_value; ** ** The context in which an SQL function executes is stored in an ** sqlite3_context object. ^A pointer to an sqlite3_context object -** is always first parameter to [application-defined SQL functions]. +** is always the first parameter to [application-defined SQL functions]. ** The application-defined SQL function implementation will pass this ** pointer through into calls to [sqlite3_result_int | sqlite3_result()], ** [sqlite3_aggregate_context()], [sqlite3_user_data()], @@ -5187,9 +5238,11 @@ typedef struct sqlite3_context sqlite3_context; ** associated with the pointer P of type T. ^D is either a NULL pointer or ** a pointer to a destructor function for P. ^SQLite will invoke the ** destructor D with a single argument of P when it is finished using -** P. The T parameter should be a static string, preferably a string -** literal. The sqlite3_bind_pointer() routine is part of the -** [pointer passing interface] added for SQLite 3.20.0. +** P, even if the call to sqlite3_bind_pointer() fails. Due to a +** historical design quirk, results are undefined if D is +** SQLITE_TRANSIENT. The T parameter should be a static string, +** preferably a string literal. The sqlite3_bind_pointer() routine is +** part of the [pointer passing interface] added for SQLite 3.20.0. ** ** ^If any of the sqlite3_bind_*() routines are called with a NULL pointer ** for the [prepared statement] or with a prepared statement for which @@ -5800,7 +5853,7 @@ SQLITE_API int sqlite3_column_type(sqlite3_stmt*, int iCol); ** ** ^The sqlite3_finalize() function is called to delete a [prepared statement]. ** ^If the most recent evaluation of the statement encountered no errors -** or if the statement is never been evaluated, then sqlite3_finalize() returns +** or if the statement has never been evaluated, then sqlite3_finalize() returns ** SQLITE_OK. ^If the most recent evaluation of statement S failed, then ** sqlite3_finalize(S) returns the appropriate [error code] or ** [extended error code]. @@ -6032,7 +6085,7 @@ SQLITE_API int sqlite3_create_window_function( /* ** CAPI3REF: Text Encodings ** -** These constant define integer codes that represent the various +** These constants define integer codes that represent the various ** text encodings supported by SQLite. */ #define SQLITE_UTF8 1 /* IMP: R-37514-35566 */ @@ -6124,7 +6177,7 @@ SQLITE_API int sqlite3_create_window_function( ** result. ** Every function that invokes [sqlite3_result_subtype()] should have this ** property. If it does not, then the call to [sqlite3_result_subtype()] -** might become a no-op if the function is used as term in an +** might become a no-op if the function is used as a term in an ** [expression index]. On the other hand, SQL functions that never invoke ** [sqlite3_result_subtype()] should avoid setting this property, as the ** purpose of this property is to disable certain optimizations that are @@ -6251,7 +6304,7 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6 ** sqlite3_value_nochange(X) interface returns true if and only if ** the column corresponding to X is unchanged by the UPDATE operation ** that the xUpdate method call was invoked to implement and if -** and the prior [xColumn] method call that was invoked to extracted +** the prior [xColumn] method call that was invoked to extract ** the value for that column returned without setting a result (probably ** because it queried [sqlite3_vtab_nochange()] and found that the column ** was unchanging). ^Within an [xUpdate] method, any value for which @@ -6524,6 +6577,7 @@ SQLITE_API void sqlite3_set_auxdata(sqlite3_context*, int N, void*, void (*)(voi ** or a NULL pointer if there were no prior calls to ** sqlite3_set_clientdata() with the same values of D and N. ** Names are compared using strcmp() and are thus case sensitive. +** It returns 0 on success and SQLITE_NOMEM on allocation failure. ** ** If P and X are both non-NULL, then the destructor X is invoked with ** argument P on the first of the following occurrences: @@ -9200,9 +9254,18 @@ SQLITE_API int sqlite3_status64( ** ^The sqlite3_db_status() routine returns SQLITE_OK on success and a ** non-zero [error code] on failure. ** +** ^The sqlite3_db_status64(D,O,C,H,R) routine works exactly the same +** way as sqlite3_db_status(D,O,C,H,R) routine except that the C and H +** parameters are pointer to 64-bit integers (type: sqlite3_int64) instead +** of pointers to 32-bit integers, which allows larger status values +** to be returned. If a status value exceeds 2,147,483,647 then +** sqlite3_db_status() will truncate the value whereas sqlite3_db_status64() +** will return the full value. +** ** See also: [sqlite3_status()] and [sqlite3_stmt_status()]. */ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int resetFlg); +SQLITE_API int sqlite3_db_status64(sqlite3*,int,sqlite3_int64*,sqlite3_int64*,int); /* ** CAPI3REF: Status Parameters for database connections @@ -9299,6 +9362,10 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r ** If an IO or other error occurs while writing a page to disk, the effect ** on subsequent SQLITE_DBSTATUS_CACHE_WRITE requests is undefined.)^ ^The ** highwater mark associated with SQLITE_DBSTATUS_CACHE_WRITE is always 0. +**

    +** ^(There is overlap between the quantities measured by this parameter +** (SQLITE_DBSTATUS_CACHE_WRITE) and SQLITE_DBSTATUS_TEMPBUF_SPILL. +** Resetting one will reduce the other.)^ **

    ** ** [[SQLITE_DBSTATUS_CACHE_SPILL]] ^(
    SQLITE_DBSTATUS_CACHE_SPILL
    @@ -9314,6 +9381,18 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r **
    This parameter returns zero for the current value if and only if ** all foreign key constraints (deferred or immediate) have been ** resolved.)^ ^The highwater mark is always 0. +** +** [[SQLITE_DBSTATUS_TEMPBUF_SPILL] ^(
    SQLITE_DBSTATUS_TEMPBUF_SPILL
    +**
    ^(This parameter returns the number of bytes written to temporary +** files on disk that could have been kept in memory had sufficient memory +** been available. This value includes writes to intermediate tables that +** are part of complex queries, external sorts that spill to disk, and +** writes to TEMP tables.)^ +** ^The highwater mark is always 0. +**

    +** ^(There is overlap between the quantities measured by this parameter +** (SQLITE_DBSTATUS_TEMPBUF_SPILL) and SQLITE_DBSTATUS_CACHE_WRITE. +** Resetting one will reduce the other.)^ **

    ** */ @@ -9330,7 +9409,8 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r #define SQLITE_DBSTATUS_DEFERRED_FKS 10 #define SQLITE_DBSTATUS_CACHE_USED_SHARED 11 #define SQLITE_DBSTATUS_CACHE_SPILL 12 -#define SQLITE_DBSTATUS_MAX 12 /* Largest defined DBSTATUS */ +#define SQLITE_DBSTATUS_TEMPBUF_SPILL 13 +#define SQLITE_DBSTATUS_MAX 13 /* Largest defined DBSTATUS */ /* @@ -10095,7 +10175,7 @@ SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...); ** is the number of pages currently in the write-ahead log file, ** including those that were just committed. ** -** The callback function should normally return [SQLITE_OK]. ^If an error +** ^The callback function should normally return [SQLITE_OK]. ^If an error ** code is returned, that error will propagate back up through the ** SQLite code base to cause the statement that provoked the callback ** to report an error, though the commit will have still occurred. If the @@ -10103,13 +10183,26 @@ SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...); ** that does not correspond to any valid SQLite error code, the results ** are undefined. ** -** A single database handle may have at most a single write-ahead log callback -** registered at one time. ^Calling [sqlite3_wal_hook()] replaces any -** previously registered write-ahead log callback. ^The return value is -** a copy of the third parameter from the previous call, if any, or 0. -** ^Note that the [sqlite3_wal_autocheckpoint()] interface and the -** [wal_autocheckpoint pragma] both invoke [sqlite3_wal_hook()] and will -** overwrite any prior [sqlite3_wal_hook()] settings. +** ^A single database handle may have at most a single write-ahead log +** callback registered at one time. ^Calling [sqlite3_wal_hook()] +** replaces the default behavior or previously registered write-ahead +** log callback. +** +** ^The return value is a copy of the third parameter from the +** previous call, if any, or 0. +** +** ^The [sqlite3_wal_autocheckpoint()] interface and the +** [wal_autocheckpoint pragma] both invoke [sqlite3_wal_hook()] and +** will overwrite any prior [sqlite3_wal_hook()] settings. +** +** ^If a write-ahead log callback is set using this function then +** [sqlite3_wal_checkpoint_v2()] or [PRAGMA wal_checkpoint] +** should be invoked periodically to keep the write-ahead log file +** from growing without bound. +** +** ^Passing a NULL pointer for the callback disables automatic +** checkpointing entirely. To re-enable the default behavior, call +** sqlite3_wal_autocheckpoint(db,1000) or use [PRAGMA wal_checkpoint]. */ SQLITE_API void *sqlite3_wal_hook( sqlite3*, @@ -10126,7 +10219,7 @@ SQLITE_API void *sqlite3_wal_hook( ** to automatically [checkpoint] ** after committing a transaction if there are N or ** more frames in the [write-ahead log] file. ^Passing zero or -** a negative value as the nFrame parameter disables automatic +** a negative value as the N parameter disables automatic ** checkpoints entirely. ** ** ^The callback registered by this function replaces any existing callback @@ -10142,9 +10235,10 @@ SQLITE_API void *sqlite3_wal_hook( ** ** ^Every new [database connection] defaults to having the auto-checkpoint ** enabled with a threshold of 1000 or [SQLITE_DEFAULT_WAL_AUTOCHECKPOINT] -** pages. The use of this interface -** is only necessary if the default setting is found to be suboptimal -** for a particular application. +** pages. +** +** ^The use of this interface is only necessary if the default setting +** is found to be suboptimal for a particular application. */ SQLITE_API int sqlite3_wal_autocheckpoint(sqlite3 *db, int N); @@ -10209,6 +10303,11 @@ SQLITE_API int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb); ** ^This mode works the same way as SQLITE_CHECKPOINT_RESTART with the ** addition that it also truncates the log file to zero bytes just prior ** to a successful return. +** +**
    SQLITE_CHECKPOINT_NOOP
    +** ^This mode always checkpoints zero frames. The only reason to invoke +** a NOOP checkpoint is to access the values returned by +** sqlite3_wal_checkpoint_v2() via output parameters *pnLog and *pnCkpt. ** ** ** ^If pnLog is not NULL, then *pnLog is set to the total number of frames in @@ -10279,6 +10378,7 @@ SQLITE_API int sqlite3_wal_checkpoint_v2( ** See the [sqlite3_wal_checkpoint_v2()] documentation for details on the ** meaning of each of these checkpoint modes. */ +#define SQLITE_CHECKPOINT_NOOP -1 /* Do no work at all */ #define SQLITE_CHECKPOINT_PASSIVE 0 /* Do as much as possible w/o blocking */ #define SQLITE_CHECKPOINT_FULL 1 /* Wait for writers, then checkpoint */ #define SQLITE_CHECKPOINT_RESTART 2 /* Like FULL but wait for readers */ @@ -11106,7 +11206,7 @@ typedef struct sqlite3_snapshot { ** The [sqlite3_snapshot_get()] interface is only available when the ** [SQLITE_ENABLE_SNAPSHOT] compile-time option is used. */ -SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_get( +SQLITE_API int sqlite3_snapshot_get( sqlite3 *db, const char *zSchema, sqlite3_snapshot **ppSnapshot @@ -11155,7 +11255,7 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_get( ** The [sqlite3_snapshot_open()] interface is only available when the ** [SQLITE_ENABLE_SNAPSHOT] compile-time option is used. */ -SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_open( +SQLITE_API int sqlite3_snapshot_open( sqlite3 *db, const char *zSchema, sqlite3_snapshot *pSnapshot @@ -11172,7 +11272,7 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_open( ** The [sqlite3_snapshot_free()] interface is only available when the ** [SQLITE_ENABLE_SNAPSHOT] compile-time option is used. */ -SQLITE_API SQLITE_EXPERIMENTAL void sqlite3_snapshot_free(sqlite3_snapshot*); +SQLITE_API void sqlite3_snapshot_free(sqlite3_snapshot*); /* ** CAPI3REF: Compare the ages of two snapshot handles. @@ -11199,7 +11299,7 @@ SQLITE_API SQLITE_EXPERIMENTAL void sqlite3_snapshot_free(sqlite3_snapshot*); ** This interface is only available if SQLite is compiled with the ** [SQLITE_ENABLE_SNAPSHOT] option. */ -SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_cmp( +SQLITE_API int sqlite3_snapshot_cmp( sqlite3_snapshot *p1, sqlite3_snapshot *p2 ); @@ -11227,7 +11327,7 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_cmp( ** This interface is only available if SQLite is compiled with the ** [SQLITE_ENABLE_SNAPSHOT] option. */ -SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_recover(sqlite3 *db, const char *zDb); +SQLITE_API int sqlite3_snapshot_recover(sqlite3 *db, const char *zDb); /* ** CAPI3REF: Serialize a database @@ -11301,12 +11401,13 @@ SQLITE_API unsigned char *sqlite3_serialize( ** ** The sqlite3_deserialize(D,S,P,N,M,F) interface causes the ** [database connection] D to disconnect from database S and then -** reopen S as an in-memory database based on the serialization contained -** in P. The serialized database P is N bytes in size. M is the size of -** the buffer P, which might be larger than N. If M is larger than N, and -** the SQLITE_DESERIALIZE_READONLY bit is not set in F, then SQLite is -** permitted to add content to the in-memory database as long as the total -** size does not exceed M bytes. +** reopen S as an in-memory database based on the serialization +** contained in P. If S is a NULL pointer, the main database is +** used. The serialized database P is N bytes in size. M is the size +** of the buffer P, which might be larger than N. If M is larger than +** N, and the SQLITE_DESERIALIZE_READONLY bit is not set in F, then +** SQLite is permitted to add content to the in-memory database as +** long as the total size does not exceed M bytes. ** ** If the SQLITE_DESERIALIZE_FREEONCLOSE bit is set in F, then SQLite will ** invoke sqlite3_free() on the serialization buffer when the database @@ -11373,6 +11474,54 @@ SQLITE_API int sqlite3_deserialize( #define SQLITE_DESERIALIZE_RESIZEABLE 2 /* Resize using sqlite3_realloc64() */ #define SQLITE_DESERIALIZE_READONLY 4 /* Database is read-only */ +/* +** CAPI3REF: Bind array values to the CARRAY table-valued function +** +** The sqlite3_carray_bind(S,I,P,N,F,X) interface binds an array value to +** one of the first argument of the [carray() table-valued function]. The +** S parameter is a pointer to the [prepared statement] that uses the carray() +** functions. I is the parameter index to be bound. P is a pointer to the +** array to be bound, and N is the number of eements in the array. The +** F argument is one of constants [SQLITE_CARRAY_INT32], [SQLITE_CARRAY_INT64], +** [SQLITE_CARRAY_DOUBLE], [SQLITE_CARRAY_TEXT], or [SQLITE_CARRAY_BLOB] to +** indicate the datatype of the array being bound. The X argument is not a +** NULL pointer, then SQLite will invoke the function X on the P parameter +** after it has finished using P, even if the call to +** sqlite3_carray_bind() fails. The special-case finalizer +** SQLITE_TRANSIENT has no effect here. +*/ +SQLITE_API int sqlite3_carray_bind( + sqlite3_stmt *pStmt, /* Statement to be bound */ + int i, /* Parameter index */ + void *aData, /* Pointer to array data */ + int nData, /* Number of data elements */ + int mFlags, /* CARRAY flags */ + void (*xDel)(void*) /* Destructor for aData */ +); + +/* +** CAPI3REF: Datatypes for the CARRAY table-valued function +** +** The fifth argument to the [sqlite3_carray_bind()] interface musts be +** one of the following constants, to specify the datatype of the array +** that is being bound into the [carray table-valued function]. +*/ +#define SQLITE_CARRAY_INT32 0 /* Data is 32-bit signed integers */ +#define SQLITE_CARRAY_INT64 1 /* Data is 64-bit signed integers */ +#define SQLITE_CARRAY_DOUBLE 2 /* Data is doubles */ +#define SQLITE_CARRAY_TEXT 3 /* Data is char* */ +#define SQLITE_CARRAY_BLOB 4 /* Data is struct iovec */ + +/* +** Versions of the above #defines that omit the initial SQLITE_, for +** legacy compatibility. +*/ +#define CARRAY_INT32 0 /* Data is 32-bit signed integers */ +#define CARRAY_INT64 1 /* Data is 64-bit signed integers */ +#define CARRAY_DOUBLE 2 /* Data is doubles */ +#define CARRAY_TEXT 3 /* Data is char* */ +#define CARRAY_BLOB 4 /* Data is struct iovec */ + /* ** Undo the hack that converts floating point types to integer for ** builds on processors without floating point support. @@ -12632,14 +12781,32 @@ SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*); ** update the "main" database attached to handle db with the changes found in ** the changeset passed via the second and third arguments. ** +** All changes made by these functions are enclosed in a savepoint transaction. +** If any other error (aside from a constraint failure when attempting to +** write to the target database) occurs, then the savepoint transaction is +** rolled back, restoring the target database to its original state, and an +** SQLite error code returned. Additionally, starting with version 3.51.0, +** an error code and error message that may be accessed using the +** [sqlite3_errcode()] and [sqlite3_errmsg()] APIs are left in the database +** handle. +** ** The fourth argument (xFilter) passed to these functions is the "filter -** callback". If it is not NULL, then for each table affected by at least one -** change in the changeset, the filter callback is invoked with -** the table name as the second argument, and a copy of the context pointer -** passed as the sixth argument as the first. If the "filter callback" -** returns zero, then no attempt is made to apply any changes to the table. -** Otherwise, if the return value is non-zero or the xFilter argument to -** is NULL, all changes related to the table are attempted. +** callback". This may be passed NULL, in which case all changes in the +** changeset are applied to the database. For sqlite3changeset_apply() and +** sqlite3_changeset_apply_v2(), if it is not NULL, then it is invoked once +** for each table affected by at least one change in the changeset. In this +** case the table name is passed as the second argument, and a copy of +** the context pointer passed as the sixth argument to apply() or apply_v2() +** as the first. If the "filter callback" returns zero, then no attempt is +** made to apply any changes to the table. Otherwise, if the return value is +** non-zero, all changes related to the table are attempted. +** +** For sqlite3_changeset_apply_v3(), the xFilter callback is invoked once +** per change. The second argument in this case is an sqlite3_changeset_iter +** that may be queried using the usual APIs for the details of the current +** change. If the "filter callback" returns zero in this case, then no attempt +** is made to apply the current change. If it returns non-zero, the change +** is applied. ** ** For each table that is not excluded by the filter callback, this function ** tests that the target database contains a compatible table. A table is @@ -12660,11 +12827,11 @@ SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*); ** one such warning is issued for each table in the changeset. ** ** For each change for which there is a compatible table, an attempt is made -** to modify the table contents according to the UPDATE, INSERT or DELETE -** change. If a change cannot be applied cleanly, the conflict handler -** function passed as the fifth argument to sqlite3changeset_apply() may be -** invoked. A description of exactly when the conflict handler is invoked for -** each type of change is below. +** to modify the table contents according to each UPDATE, INSERT or DELETE +** change that is not excluded by a filter callback. If a change cannot be +** applied cleanly, the conflict handler function passed as the fifth argument +** to sqlite3changeset_apply() may be invoked. A description of exactly when +** the conflict handler is invoked for each type of change is below. ** ** Unlike the xFilter argument, xConflict may not be passed NULL. The results ** of passing anything other than a valid function pointer as the xConflict @@ -12760,12 +12927,6 @@ SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*); ** This can be used to further customize the application's conflict ** resolution strategy. ** -** All changes made by these functions are enclosed in a savepoint transaction. -** If any other error (aside from a constraint failure when attempting to -** write to the target database) occurs, then the savepoint transaction is -** rolled back, restoring the target database to its original state, and an -** SQLite error code returned. -** ** If the output parameters (ppRebase) and (pnRebase) are non-NULL and ** the input is a changeset (not a patchset), then sqlite3changeset_apply_v2() ** may set (*ppRebase) to point to a "rebase" that may be used with the @@ -12815,6 +12976,23 @@ SQLITE_API int sqlite3changeset_apply_v2( void **ppRebase, int *pnRebase, /* OUT: Rebase data */ int flags /* SESSION_CHANGESETAPPLY_* flags */ ); +SQLITE_API int sqlite3changeset_apply_v3( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int nChangeset, /* Size of changeset in bytes */ + void *pChangeset, /* Changeset blob */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + sqlite3_changeset_iter *p /* Handle describing change */ + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx, /* First argument passed to xConflict */ + void **ppRebase, int *pnRebase, /* OUT: Rebase data */ + int flags /* SESSION_CHANGESETAPPLY_* flags */ +); /* ** CAPI3REF: Flags for sqlite3changeset_apply_v2 @@ -13234,6 +13412,23 @@ SQLITE_API int sqlite3changeset_apply_v2_strm( void **ppRebase, int *pnRebase, int flags ); +SQLITE_API int sqlite3changeset_apply_v3_strm( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int (*xInput)(void *pIn, void *pData, int *pnData), /* Input function */ + void *pIn, /* First arg for xInput */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + sqlite3_changeset_iter *p + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx, /* First argument passed to xConflict */ + void **ppRebase, int *pnRebase, + int flags +); SQLITE_API int sqlite3changeset_concat_strm( int (*xInputA)(void *pIn, void *pData, int *pnData), void *pInA, @@ -14310,7 +14505,7 @@ struct fts5_api { ** Maximum number of pages in one database file. ** ** This is really just the default value for the max_page_count pragma. -** This value can be lowered (or raised) at run-time using that the +** This value can be lowered (or raised) at run-time using the ** max_page_count macro. */ #ifndef SQLITE_MAX_PAGE_COUNT @@ -15178,7 +15373,7 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*); ** ourselves. */ #ifndef offsetof -#define offsetof(STRUCTURE,FIELD) ((size_t)((char*)&((STRUCTURE*)0)->FIELD)) +# define offsetof(ST,M) ((size_t)((char*)&((ST*)0)->M - (char*)0)) #endif /* @@ -15566,6 +15761,8 @@ SQLITE_PRIVATE u32 sqlite3TreeTrace; ** 0x00020000 Transform DISTINCT into GROUP BY ** 0x00040000 SELECT tree dump after all code has been generated ** 0x00080000 NOT NULL strength reduction +** 0x00100000 Pointers are all shown as zero +** 0x00200000 EXISTS-to-JOIN optimization */ /* @@ -15610,6 +15807,7 @@ SQLITE_PRIVATE u32 sqlite3WhereTrace; ** 0x00020000 Show WHERE terms returned from whereScanNext() ** 0x00040000 Solver overview messages ** 0x00080000 Star-query heuristic +** 0x00100000 Pointers are all shown as zero */ @@ -15682,7 +15880,7 @@ struct BusyHandler { ** pointer will work here as long as it is distinct from SQLITE_STATIC ** and SQLITE_TRANSIENT. */ -#define SQLITE_DYNAMIC ((sqlite3_destructor_type)sqlite3OomClear) +#define SQLITE_DYNAMIC ((sqlite3_destructor_type)sqlite3RowSetClear) /* ** When SQLITE_OMIT_WSD is defined, it means that the target platform does @@ -15903,8 +16101,8 @@ typedef int VList; ** must provide its own VFS implementation together with sqlite3_os_init() ** and sqlite3_os_end() routines. */ -#if !defined(SQLITE_OS_KV) && !defined(SQLITE_OS_OTHER) && \ - !defined(SQLITE_OS_UNIX) && !defined(SQLITE_OS_WIN) +#if SQLITE_OS_KV+1<=1 && SQLITE_OS_OTHER+1<=1 && \ + SQLITE_OS_WIN+1<=1 && SQLITE_OS_UNIX+1<=1 # if defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) || \ defined(__MINGW32__) || defined(__BORLANDC__) # define SQLITE_OS_WIN 1 @@ -16750,6 +16948,7 @@ struct BtreePayload { SQLITE_PRIVATE int sqlite3BtreeInsert(BtCursor*, const BtreePayload *pPayload, int flags, int seekResult); SQLITE_PRIVATE int sqlite3BtreeFirst(BtCursor*, int *pRes); +SQLITE_PRIVATE int sqlite3BtreeIsEmpty(BtCursor *pCur, int *pRes); SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor*, int *pRes); SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor*, int flags); SQLITE_PRIVATE int sqlite3BtreeEof(BtCursor*); @@ -17083,20 +17282,20 @@ typedef struct VdbeOpList VdbeOpList; #define OP_SorterSort 34 /* jump */ #define OP_Sort 35 /* jump */ #define OP_Rewind 36 /* jump0 */ -#define OP_SorterNext 37 /* jump */ -#define OP_Prev 38 /* jump */ -#define OP_Next 39 /* jump */ -#define OP_IdxLE 40 /* jump, synopsis: key=r[P3@P4] */ -#define OP_IdxGT 41 /* jump, synopsis: key=r[P3@P4] */ -#define OP_IdxLT 42 /* jump, synopsis: key=r[P3@P4] */ +#define OP_IfEmpty 37 /* jump, synopsis: if( empty(P1) ) goto P2 */ +#define OP_SorterNext 38 /* jump */ +#define OP_Prev 39 /* jump */ +#define OP_Next 40 /* jump */ +#define OP_IdxLE 41 /* jump, synopsis: key=r[P3@P4] */ +#define OP_IdxGT 42 /* jump, synopsis: key=r[P3@P4] */ #define OP_Or 43 /* same as TK_OR, synopsis: r[P3]=(r[P1] || r[P2]) */ #define OP_And 44 /* same as TK_AND, synopsis: r[P3]=(r[P1] && r[P2]) */ -#define OP_IdxGE 45 /* jump, synopsis: key=r[P3@P4] */ -#define OP_RowSetRead 46 /* jump, synopsis: r[P3]=rowset(P1) */ -#define OP_RowSetTest 47 /* jump, synopsis: if r[P3] in rowset(P1) goto P2 */ -#define OP_Program 48 /* jump0 */ -#define OP_FkIfZero 49 /* jump, synopsis: if fkctr[P1]==0 goto P2 */ -#define OP_IfPos 50 /* jump, synopsis: if r[P1]>0 then r[P1]-=P3, goto P2 */ +#define OP_IdxLT 45 /* jump, synopsis: key=r[P3@P4] */ +#define OP_IdxGE 46 /* jump, synopsis: key=r[P3@P4] */ +#define OP_RowSetRead 47 /* jump, synopsis: r[P3]=rowset(P1) */ +#define OP_RowSetTest 48 /* jump, synopsis: if r[P3] in rowset(P1) goto P2 */ +#define OP_Program 49 /* jump0 */ +#define OP_FkIfZero 50 /* jump, synopsis: if fkctr[P1]==0 goto P2 */ #define OP_IsNull 51 /* jump, same as TK_ISNULL, synopsis: if r[P1]==NULL goto P2 */ #define OP_NotNull 52 /* jump, same as TK_NOTNULL, synopsis: if r[P1]!=NULL goto P2 */ #define OP_Ne 53 /* jump, same as TK_NE, synopsis: IF r[P3]!=r[P1] */ @@ -17106,49 +17305,49 @@ typedef struct VdbeOpList VdbeOpList; #define OP_Lt 57 /* jump, same as TK_LT, synopsis: IF r[P3]=r[P1] */ #define OP_ElseEq 59 /* jump, same as TK_ESCAPE */ -#define OP_IfNotZero 60 /* jump, synopsis: if r[P1]!=0 then r[P1]--, goto P2 */ -#define OP_DecrJumpZero 61 /* jump, synopsis: if (--r[P1])==0 goto P2 */ -#define OP_IncrVacuum 62 /* jump */ -#define OP_VNext 63 /* jump */ -#define OP_Filter 64 /* jump, synopsis: if key(P3@P4) not in filter(P1) goto P2 */ -#define OP_PureFunc 65 /* synopsis: r[P3]=func(r[P2@NP]) */ -#define OP_Function 66 /* synopsis: r[P3]=func(r[P2@NP]) */ -#define OP_Return 67 -#define OP_EndCoroutine 68 -#define OP_HaltIfNull 69 /* synopsis: if r[P3]=null halt */ -#define OP_Halt 70 -#define OP_Integer 71 /* synopsis: r[P2]=P1 */ -#define OP_Int64 72 /* synopsis: r[P2]=P4 */ -#define OP_String 73 /* synopsis: r[P2]='P4' (len=P1) */ -#define OP_BeginSubrtn 74 /* synopsis: r[P2]=NULL */ -#define OP_Null 75 /* synopsis: r[P2..P3]=NULL */ -#define OP_SoftNull 76 /* synopsis: r[P1]=NULL */ -#define OP_Blob 77 /* synopsis: r[P2]=P4 (len=P1) */ -#define OP_Variable 78 /* synopsis: r[P2]=parameter(P1) */ -#define OP_Move 79 /* synopsis: r[P2@P3]=r[P1@P3] */ -#define OP_Copy 80 /* synopsis: r[P2@P3+1]=r[P1@P3+1] */ -#define OP_SCopy 81 /* synopsis: r[P2]=r[P1] */ -#define OP_IntCopy 82 /* synopsis: r[P2]=r[P1] */ -#define OP_FkCheck 83 -#define OP_ResultRow 84 /* synopsis: output=r[P1@P2] */ -#define OP_CollSeq 85 -#define OP_AddImm 86 /* synopsis: r[P1]=r[P1]+P2 */ -#define OP_RealAffinity 87 -#define OP_Cast 88 /* synopsis: affinity(r[P1]) */ -#define OP_Permutation 89 -#define OP_Compare 90 /* synopsis: r[P1@P3] <-> r[P2@P3] */ -#define OP_IsTrue 91 /* synopsis: r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4 */ -#define OP_ZeroOrNull 92 /* synopsis: r[P2] = 0 OR NULL */ -#define OP_Offset 93 /* synopsis: r[P3] = sqlite_offset(P1) */ -#define OP_Column 94 /* synopsis: r[P3]=PX cursor P1 column P2 */ -#define OP_TypeCheck 95 /* synopsis: typecheck(r[P1@P2]) */ -#define OP_Affinity 96 /* synopsis: affinity(r[P1@P2]) */ -#define OP_MakeRecord 97 /* synopsis: r[P3]=mkrec(r[P1@P2]) */ -#define OP_Count 98 /* synopsis: r[P2]=count() */ -#define OP_ReadCookie 99 -#define OP_SetCookie 100 -#define OP_ReopenIdx 101 /* synopsis: root=P2 iDb=P3 */ -#define OP_OpenRead 102 /* synopsis: root=P2 iDb=P3 */ +#define OP_IfPos 60 /* jump, synopsis: if r[P1]>0 then r[P1]-=P3, goto P2 */ +#define OP_IfNotZero 61 /* jump, synopsis: if r[P1]!=0 then r[P1]--, goto P2 */ +#define OP_DecrJumpZero 62 /* jump, synopsis: if (--r[P1])==0 goto P2 */ +#define OP_IncrVacuum 63 /* jump */ +#define OP_VNext 64 /* jump */ +#define OP_Filter 65 /* jump, synopsis: if key(P3@P4) not in filter(P1) goto P2 */ +#define OP_PureFunc 66 /* synopsis: r[P3]=func(r[P2@NP]) */ +#define OP_Function 67 /* synopsis: r[P3]=func(r[P2@NP]) */ +#define OP_Return 68 +#define OP_EndCoroutine 69 +#define OP_HaltIfNull 70 /* synopsis: if r[P3]=null halt */ +#define OP_Halt 71 +#define OP_Integer 72 /* synopsis: r[P2]=P1 */ +#define OP_Int64 73 /* synopsis: r[P2]=P4 */ +#define OP_String 74 /* synopsis: r[P2]='P4' (len=P1) */ +#define OP_BeginSubrtn 75 /* synopsis: r[P2]=NULL */ +#define OP_Null 76 /* synopsis: r[P2..P3]=NULL */ +#define OP_SoftNull 77 /* synopsis: r[P1]=NULL */ +#define OP_Blob 78 /* synopsis: r[P2]=P4 (len=P1) */ +#define OP_Variable 79 /* synopsis: r[P2]=parameter(P1) */ +#define OP_Move 80 /* synopsis: r[P2@P3]=r[P1@P3] */ +#define OP_Copy 81 /* synopsis: r[P2@P3+1]=r[P1@P3+1] */ +#define OP_SCopy 82 /* synopsis: r[P2]=r[P1] */ +#define OP_IntCopy 83 /* synopsis: r[P2]=r[P1] */ +#define OP_FkCheck 84 +#define OP_ResultRow 85 /* synopsis: output=r[P1@P2] */ +#define OP_CollSeq 86 +#define OP_AddImm 87 /* synopsis: r[P1]=r[P1]+P2 */ +#define OP_RealAffinity 88 +#define OP_Cast 89 /* synopsis: affinity(r[P1]) */ +#define OP_Permutation 90 +#define OP_Compare 91 /* synopsis: r[P1@P3] <-> r[P2@P3] */ +#define OP_IsTrue 92 /* synopsis: r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4 */ +#define OP_ZeroOrNull 93 /* synopsis: r[P2] = 0 OR NULL */ +#define OP_Offset 94 /* synopsis: r[P3] = sqlite_offset(P1) */ +#define OP_Column 95 /* synopsis: r[P3]=PX cursor P1 column P2 */ +#define OP_TypeCheck 96 /* synopsis: typecheck(r[P1@P2]) */ +#define OP_Affinity 97 /* synopsis: affinity(r[P1@P2]) */ +#define OP_MakeRecord 98 /* synopsis: r[P3]=mkrec(r[P1@P2]) */ +#define OP_Count 99 /* synopsis: r[P2]=count() */ +#define OP_ReadCookie 100 +#define OP_SetCookie 101 +#define OP_ReopenIdx 102 /* synopsis: root=P2 iDb=P3 */ #define OP_BitAnd 103 /* same as TK_BITAND, synopsis: r[P3]=r[P1]&r[P2] */ #define OP_BitOr 104 /* same as TK_BITOR, synopsis: r[P3]=r[P1]|r[P2] */ #define OP_ShiftLeft 105 /* same as TK_LSHIFT, synopsis: r[P3]=r[P2]<0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1) */ -#define OP_AggInverse 161 /* synopsis: accum=r[P3] inverse(r[P2@P5]) */ -#define OP_AggStep 162 /* synopsis: accum=r[P3] step(r[P2@P5]) */ -#define OP_AggStep1 163 /* synopsis: accum=r[P3] step(r[P2@P5]) */ -#define OP_AggValue 164 /* synopsis: r[P3]=value N=P2 */ -#define OP_AggFinal 165 /* synopsis: accum=r[P1] N=P2 */ -#define OP_Expire 166 -#define OP_CursorLock 167 -#define OP_CursorUnlock 168 -#define OP_TableLock 169 /* synopsis: iDb=P1 root=P2 write=P3 */ -#define OP_VBegin 170 -#define OP_VCreate 171 -#define OP_VDestroy 172 -#define OP_VOpen 173 -#define OP_VCheck 174 -#define OP_VInitIn 175 /* synopsis: r[P2]=ValueList(P1,P3) */ -#define OP_VColumn 176 /* synopsis: r[P3]=vcolumn(P2) */ -#define OP_VRename 177 -#define OP_Pagecount 178 -#define OP_MaxPgcnt 179 -#define OP_ClrSubtype 180 /* synopsis: r[P1].subtype = 0 */ -#define OP_GetSubtype 181 /* synopsis: r[P2] = r[P1].subtype */ -#define OP_SetSubtype 182 /* synopsis: r[P2].subtype = r[P1] */ -#define OP_FilterAdd 183 /* synopsis: filter(P1) += key(P3@P4) */ -#define OP_Trace 184 -#define OP_CursorHint 185 -#define OP_ReleaseReg 186 /* synopsis: release r[P1@P2] mask P3 */ -#define OP_Noop 187 -#define OP_Explain 188 -#define OP_Abortable 189 +#define OP_DropTrigger 155 +#define OP_IntegrityCk 156 +#define OP_RowSetAdd 157 /* synopsis: rowset(P1)=r[P2] */ +#define OP_Param 158 +#define OP_FkCounter 159 /* synopsis: fkctr[P1]+=P2 */ +#define OP_MemMax 160 /* synopsis: r[P1]=max(r[P1],r[P2]) */ +#define OP_OffsetLimit 161 /* synopsis: if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1) */ +#define OP_AggInverse 162 /* synopsis: accum=r[P3] inverse(r[P2@P5]) */ +#define OP_AggStep 163 /* synopsis: accum=r[P3] step(r[P2@P5]) */ +#define OP_AggStep1 164 /* synopsis: accum=r[P3] step(r[P2@P5]) */ +#define OP_AggValue 165 /* synopsis: r[P3]=value N=P2 */ +#define OP_AggFinal 166 /* synopsis: accum=r[P1] N=P2 */ +#define OP_Expire 167 +#define OP_CursorLock 168 +#define OP_CursorUnlock 169 +#define OP_TableLock 170 /* synopsis: iDb=P1 root=P2 write=P3 */ +#define OP_VBegin 171 +#define OP_VCreate 172 +#define OP_VDestroy 173 +#define OP_VOpen 174 +#define OP_VCheck 175 +#define OP_VInitIn 176 /* synopsis: r[P2]=ValueList(P1,P3) */ +#define OP_VColumn 177 /* synopsis: r[P3]=vcolumn(P2) */ +#define OP_VRename 178 +#define OP_Pagecount 179 +#define OP_MaxPgcnt 180 +#define OP_ClrSubtype 181 /* synopsis: r[P1].subtype = 0 */ +#define OP_GetSubtype 182 /* synopsis: r[P2] = r[P1].subtype */ +#define OP_SetSubtype 183 /* synopsis: r[P2].subtype = r[P1] */ +#define OP_FilterAdd 184 /* synopsis: filter(P1) += key(P3@P4) */ +#define OP_Trace 185 +#define OP_CursorHint 186 +#define OP_ReleaseReg 187 /* synopsis: release r[P1@P2] mask P3 */ +#define OP_Noop 188 +#define OP_Explain 189 +#define OP_Abortable 190 /* Properties such as "out2" or "jump" that are specified in ** comments following the "case" for each opcode in the vdbe.c @@ -17254,26 +17454,26 @@ typedef struct VdbeOpList VdbeOpList; /* 8 */ 0x81, 0x01, 0x01, 0x81, 0x83, 0x83, 0x01, 0x01,\ /* 16 */ 0x03, 0x03, 0x01, 0x12, 0x01, 0xc9, 0xc9, 0xc9,\ /* 24 */ 0xc9, 0x01, 0x49, 0x49, 0x49, 0x49, 0xc9, 0x49,\ -/* 32 */ 0xc1, 0x01, 0x41, 0x41, 0xc1, 0x01, 0x41, 0x41,\ -/* 40 */ 0x41, 0x41, 0x41, 0x26, 0x26, 0x41, 0x23, 0x0b,\ -/* 48 */ 0x81, 0x01, 0x03, 0x03, 0x03, 0x0b, 0x0b, 0x0b,\ -/* 56 */ 0x0b, 0x0b, 0x0b, 0x01, 0x03, 0x03, 0x01, 0x41,\ -/* 64 */ 0x01, 0x00, 0x00, 0x02, 0x02, 0x08, 0x00, 0x10,\ -/* 72 */ 0x10, 0x10, 0x00, 0x10, 0x00, 0x10, 0x10, 0x00,\ -/* 80 */ 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x02, 0x02,\ -/* 88 */ 0x02, 0x00, 0x00, 0x12, 0x1e, 0x20, 0x40, 0x00,\ -/* 96 */ 0x00, 0x00, 0x10, 0x10, 0x00, 0x40, 0x40, 0x26,\ +/* 32 */ 0xc1, 0x01, 0x41, 0x41, 0xc1, 0x01, 0x01, 0x41,\ +/* 40 */ 0x41, 0x41, 0x41, 0x26, 0x26, 0x41, 0x41, 0x23,\ +/* 48 */ 0x0b, 0x81, 0x01, 0x03, 0x03, 0x0b, 0x0b, 0x0b,\ +/* 56 */ 0x0b, 0x0b, 0x0b, 0x01, 0x03, 0x03, 0x03, 0x01,\ +/* 64 */ 0x41, 0x01, 0x00, 0x00, 0x02, 0x02, 0x08, 0x00,\ +/* 72 */ 0x10, 0x10, 0x10, 0x00, 0x10, 0x00, 0x10, 0x10,\ +/* 80 */ 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x02,\ +/* 88 */ 0x02, 0x02, 0x00, 0x00, 0x12, 0x1e, 0x20, 0x40,\ +/* 96 */ 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x40, 0x26,\ /* 104 */ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26,\ -/* 112 */ 0x26, 0x00, 0x40, 0x12, 0x40, 0x40, 0x10, 0x00,\ -/* 120 */ 0x00, 0x00, 0x40, 0x00, 0x40, 0x40, 0x10, 0x10,\ -/* 128 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x50,\ -/* 136 */ 0x00, 0x40, 0x04, 0x04, 0x00, 0x40, 0x50, 0x40,\ -/* 144 */ 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,\ -/* 152 */ 0x00, 0x00, 0x10, 0x00, 0x06, 0x10, 0x00, 0x04,\ -/* 160 */ 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ -/* 168 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0x50,\ -/* 176 */ 0x40, 0x00, 0x10, 0x10, 0x02, 0x12, 0x12, 0x00,\ -/* 184 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,} +/* 112 */ 0x26, 0x40, 0x00, 0x12, 0x40, 0x40, 0x10, 0x40,\ +/* 120 */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x40, 0x10,\ +/* 128 */ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,\ +/* 136 */ 0x50, 0x00, 0x40, 0x04, 0x04, 0x00, 0x40, 0x50,\ +/* 144 */ 0x40, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,\ +/* 152 */ 0x00, 0x00, 0x10, 0x00, 0x00, 0x06, 0x10, 0x00,\ +/* 160 */ 0x04, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ +/* 168 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x10,\ +/* 176 */ 0x50, 0x40, 0x00, 0x10, 0x10, 0x02, 0x12, 0x12,\ +/* 184 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,} /* The resolve3P2Values() routine is able to run faster if it knows ** the value of the largest JUMP opcode. The smaller the maximum @@ -17281,7 +17481,7 @@ typedef struct VdbeOpList VdbeOpList; ** generated this include file strives to group all JUMP opcodes ** together near the beginning of the list. */ -#define SQLITE_MX_JUMP_OPCODE 64 /* Maximum JUMP opcode */ +#define SQLITE_MX_JUMP_OPCODE 65 /* Maximum JUMP opcode */ /************** End of opcodes.h *********************************************/ /************** Continuing where we left off in vdbe.h ***********************/ @@ -17404,8 +17604,11 @@ SQLITE_PRIVATE char *sqlite3VdbeExpandSql(Vdbe*, const char*); #endif SQLITE_PRIVATE int sqlite3MemCompare(const Mem*, const Mem*, const CollSeq*); SQLITE_PRIVATE int sqlite3BlobCompare(const Mem*, const Mem*); +#ifdef SQLITE_ENABLE_PERCENTILE +SQLITE_PRIVATE const char *sqlite3VdbeFuncName(const sqlite3_context*); +#endif -SQLITE_PRIVATE void sqlite3VdbeRecordUnpack(KeyInfo*,int,const void*,UnpackedRecord*); +SQLITE_PRIVATE void sqlite3VdbeRecordUnpack(int,const void*,UnpackedRecord*); SQLITE_PRIVATE int sqlite3VdbeRecordCompare(int,const void*,UnpackedRecord*); SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip(int, const void *, UnpackedRecord *, int); SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeAllocUnpackedRecord(KeyInfo*); @@ -17418,7 +17621,9 @@ SQLITE_PRIVATE int sqlite3VdbeHasSubProgram(Vdbe*); SQLITE_PRIVATE void sqlite3MemSetArrayInt64(sqlite3_value *aMem, int iIdx, i64 val); +#ifndef SQLITE_OMIT_DATETIME_FUNCS SQLITE_PRIVATE int sqlite3NotPureFunc(sqlite3_context*); +#endif #ifdef SQLITE_ENABLE_BYTECODE_VTAB SQLITE_PRIVATE int sqlite3VdbeBytecodeVtabInit(sqlite3*); #endif @@ -18074,7 +18279,7 @@ struct sqlite3 { u8 iDb; /* Which db file is being initialized */ u8 busy; /* TRUE if currently initializing */ unsigned orphanTrigger : 1; /* Last statement is orphaned TEMP trigger */ - unsigned imposterTable : 1; /* Building an imposter table */ + unsigned imposterTable : 2; /* Building an imposter table */ unsigned reopenMemdb : 1; /* ATTACH is really a reopen using MemDB */ const char **azInit; /* "type", "name", and "tbl_name" columns */ } init; @@ -18157,6 +18362,7 @@ struct sqlite3 { i64 nDeferredImmCons; /* Net deferred immediate constraints */ int *pnBytesFreed; /* If not NULL, increment this in DbFree() */ DbClientData *pDbData; /* sqlite3_set_clientdata() content */ + u64 nSpill; /* TEMP content spilled to disk */ #ifdef SQLITE_ENABLE_UNLOCK_NOTIFY /* The following variables are all protected by the STATIC_MAIN ** mutex, not by sqlite3.mutex. They are used by code in notify.c. @@ -18300,6 +18506,7 @@ struct sqlite3 { #define SQLITE_OnePass 0x08000000 /* Single-pass DELETE and UPDATE */ #define SQLITE_OrderBySubq 0x10000000 /* ORDER BY in subquery helps outer */ #define SQLITE_StarQuery 0x20000000 /* Heurists for star queries */ +#define SQLITE_ExistsToJoin 0x40000000 /* The EXISTS-to-JOIN optimization */ #define SQLITE_AllOpts 0xffffffff /* All optimizations */ /* @@ -18538,7 +18745,7 @@ struct FuncDestructor { #define STR_FUNCTION(zName, nArg, pArg, bNC, xFunc) \ {nArg, SQLITE_FUNC_BUILTIN|\ SQLITE_FUNC_SLOCHNG|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \ - pArg, 0, xFunc, 0, 0, 0, #zName, } + pArg, 0, xFunc, 0, 0, 0, #zName, {0} } #define LIKEFUNC(zName, nArg, arg, flags) \ {nArg, SQLITE_FUNC_BUILTIN|SQLITE_FUNC_CONSTANT|SQLITE_UTF8|flags, \ (void *)arg, 0, likeFunc, 0, 0, 0, #zName, {0} } @@ -18866,6 +19073,7 @@ struct Table { #define TF_Ephemeral 0x00004000 /* An ephemeral table */ #define TF_Eponymous 0x00008000 /* An eponymous virtual table */ #define TF_Strict 0x00010000 /* STRICT mode */ +#define TF_Imposter 0x00020000 /* An imposter table */ /* ** Allowed values for Table.eTabType @@ -19021,9 +19229,15 @@ struct FKey { ** argument to sqlite3VdbeKeyCompare and is used to control the ** comparison of the two index keys. ** -** Note that aSortOrder[] and aColl[] have nField+1 slots. There -** are nField slots for the columns of an index then one extra slot -** for the rowid at the end. +** The aSortOrder[] and aColl[] arrays have nAllField slots each. There +** are nKeyField slots for the columns of an index then extra slots +** for the rowid or key at the end. The aSortOrder array is located after +** the aColl[] array. +** +** If SQLITE_ENABLE_PREUPDATE_HOOK is defined, then aSortFlags might be NULL +** to indicate that this object is for use by a preupdate hook. When aSortFlags +** is NULL, then nAllField is uninitialized and no space is allocated for +** aColl[], so those fields may not be used. */ struct KeyInfo { u32 nRef; /* Number of references to this KeyInfo object */ @@ -19035,9 +19249,18 @@ struct KeyInfo { CollSeq *aColl[FLEXARRAY]; /* Collating sequence for each term of the key */ }; -/* The size (in bytes) of a KeyInfo object with up to N fields */ +/* The size (in bytes) of a KeyInfo object with up to N fields. This includes +** the main body of the KeyInfo object and the aColl[] array of N elements, +** but does not count the memory used to hold aSortFlags[]. */ #define SZ_KEYINFO(N) (offsetof(KeyInfo,aColl) + (N)*sizeof(CollSeq*)) +/* The size of a bare KeyInfo with no aColl[] entries */ +#if FLEXARRAY+1 > 1 +# define SZ_KEYINFO_0 offsetof(KeyInfo,aColl) +#else +# define SZ_KEYINFO_0 sizeof(KeyInfo) +#endif + /* ** Allowed bit values for entries in the KeyInfo.aSortFlags[] array. */ @@ -19056,9 +19279,8 @@ struct KeyInfo { ** ** An instance of this object serves as a "key" for doing a search on ** an index b+tree. The goal of the search is to find the entry that -** is closed to the key described by this object. This object might hold -** just a prefix of the key. The number of fields is given by -** pKeyInfo->nField. +** is closest to the key described by this object. This object might hold +** just a prefix of the key. The number of fields is given by nField. ** ** The r1 and r2 fields are the values to return if this key is less than ** or greater than a key in the btree, respectively. These are normally @@ -19068,7 +19290,7 @@ struct KeyInfo { ** The key comparison functions actually return default_rc when they find ** an equals comparison. default_rc can be -1, 0, or +1. If there are ** multiple entries in the b-tree with the same key (when only looking -** at the first pKeyInfo->nFields,) then default_rc can be set to -1 to +** at the first nField elements) then default_rc can be set to -1 to ** cause the search to find the last match, or +1 to cause the search to ** find the first match. ** @@ -19080,8 +19302,8 @@ struct KeyInfo { ** b-tree. */ struct UnpackedRecord { - KeyInfo *pKeyInfo; /* Collation and sort-order information */ - Mem *aMem; /* Values */ + KeyInfo *pKeyInfo; /* Comparison info for the index that is unpacked */ + Mem *aMem; /* Values for columns of the index */ union { char *z; /* Cache of aMem[0].z for vdbeRecordCompareString() */ i64 i; /* Cache of aMem[0].u.i for vdbeRecordCompareInt() */ @@ -19730,6 +19952,7 @@ struct SrcItem { unsigned rowidUsed :1; /* The ROWID of this table is referenced */ unsigned fixedSchema :1; /* Uses u4.pSchema, not u4.zDatabase */ unsigned hadSchema :1; /* Had u4.zDatabase before u4.pSchema */ + unsigned fromExists :1; /* Comes from WHERE EXISTS(...) */ } fg; int iCursor; /* The VDBE cursor number used to access this table */ Bitmask colUsed; /* Bit N set if column N used. Details above for N>62 */ @@ -20017,6 +20240,7 @@ struct Select { #define SF_OrderByReqd 0x8000000 /* The ORDER BY clause may not be omitted */ #define SF_UpdateFrom 0x10000000 /* Query originates with UPDATE FROM */ #define SF_Correlated 0x20000000 /* True if references the outer context */ +#define SF_OnToWhere 0x40000000 /* One or more ON clauses moved to WHERE */ /* True if SrcItem X is a subquery that has SF_NestedFrom */ #define IsNestedFrom(X) \ @@ -20260,6 +20484,7 @@ struct Parse { u8 disableLookaside; /* Number of times lookaside has been disabled */ u8 prepFlags; /* SQLITE_PREPARE_* flags */ u8 withinRJSubrtn; /* Nesting level for RIGHT JOIN body subroutines */ + u8 bHasExists; /* Has a correlated "EXISTS (SELECT ....)" expression */ u8 mSubrtnSig; /* mini Bloom filter on available SubrtnSig.selId */ u8 eTriggerOp; /* TK_UPDATE, TK_INSERT or TK_DELETE */ u8 bReturning; /* Coding a RETURNING trigger */ @@ -20769,6 +20994,7 @@ struct Walker { SrcItem *pSrcItem; /* A single FROM clause item */ DbFixer *pFix; /* See sqlite3FixSelect() */ Mem *aMem; /* See sqlite3BtreeCursorHint() */ + struct CheckOnCtx *pCheckOnCtx; /* See selectCheckOnClauses() */ } u; }; @@ -21256,6 +21482,7 @@ SQLITE_PRIVATE void sqlite3ShowTriggerList(const Trigger*); SQLITE_PRIVATE void sqlite3ShowWindow(const Window*); SQLITE_PRIVATE void sqlite3ShowWinFunc(const Window*); #endif +SQLITE_PRIVATE void sqlite3ShowBitvec(Bitvec*); #endif SQLITE_PRIVATE void sqlite3SetString(char **, sqlite3*, const char*); @@ -21572,13 +21799,17 @@ SQLITE_PRIVATE void sqlite3RegisterDateTimeFunctions(void); SQLITE_PRIVATE void sqlite3RegisterJsonFunctions(void); SQLITE_PRIVATE void sqlite3RegisterPerConnectionBuiltinFunctions(sqlite3*); #if !defined(SQLITE_OMIT_VIRTUALTABLE) && !defined(SQLITE_OMIT_JSON) -SQLITE_PRIVATE int sqlite3JsonTableFunctions(sqlite3*); +SQLITE_PRIVATE Module *sqlite3JsonVtabRegister(sqlite3*,const char*); #endif SQLITE_PRIVATE int sqlite3SafetyCheckOk(sqlite3*); SQLITE_PRIVATE int sqlite3SafetyCheckSickOrOk(sqlite3*); SQLITE_PRIVATE void sqlite3ChangeCookie(Parse*, int); SQLITE_PRIVATE With *sqlite3WithDup(sqlite3 *db, With *p); +#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_CARRAY) +SQLITE_PRIVATE Module *sqlite3CarrayRegister(sqlite3*); +#endif + #if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER) SQLITE_PRIVATE void sqlite3MaterializeView(Parse*, Table*, Expr*, ExprList*,Expr*,int); #endif @@ -21799,7 +22030,7 @@ SQLITE_PRIVATE void sqlite3Reindex(Parse*, Token*, Token*); SQLITE_PRIVATE void sqlite3AlterFunctions(void); SQLITE_PRIVATE void sqlite3AlterRenameTable(Parse*, SrcList*, Token*); SQLITE_PRIVATE void sqlite3AlterRenameColumn(Parse*, SrcList*, Token*, Token*); -SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *, int *); +SQLITE_PRIVATE i64 sqlite3GetToken(const unsigned char *, int *); SQLITE_PRIVATE void sqlite3NestedParse(Parse*, const char*, ...); SQLITE_PRIVATE void sqlite3ExpirePreparedStatements(sqlite3*, int); SQLITE_PRIVATE void sqlite3CodeRhsOfIN(Parse*, Expr*, int); @@ -22565,6 +22796,9 @@ static const char * const sqlite3azCompileOpt[] = { #ifdef SQLITE_ENABLE_BYTECODE_VTAB "ENABLE_BYTECODE_VTAB", #endif +#ifdef SQLITE_ENABLE_CARRAY + "ENABLE_CARRAY", +#endif #ifdef SQLITE_ENABLE_CEROD "ENABLE_CEROD=" CTIMEOPT_VAL(SQLITE_ENABLE_CEROD), #endif @@ -22655,6 +22889,9 @@ static const char * const sqlite3azCompileOpt[] = { #ifdef SQLITE_ENABLE_OVERSIZE_CELL_CHECK "ENABLE_OVERSIZE_CELL_CHECK", #endif +#ifdef SQLITE_ENABLE_PERCENTILE + "ENABLE_PERCENTILE", +#endif #ifdef SQLITE_ENABLE_PREUPDATE_HOOK "ENABLE_PREUPDATE_HOOK", #endif @@ -23869,7 +24106,7 @@ struct sqlite3_value { ** MEM_Int, MEM_Real, and MEM_IntReal. ** ** * MEM_Blob|MEM_Zero A blob in Mem.z of length Mem.n plus -** MEM.u.i extra 0x00 bytes at the end. +** Mem.u.nZero extra 0x00 bytes at the end. ** ** * MEM_Int Integer stored in Mem.u.i. ** @@ -24138,7 +24375,9 @@ struct PreUpdate { Table *pTab; /* Schema object being updated */ Index *pPk; /* PK index if pTab is WITHOUT ROWID */ sqlite3_value **apDflt; /* Array of default values, if required */ - u8 keyinfoSpace[SZ_KEYINFO(0)]; /* Space to hold pKeyinfo[0] content */ + struct { + u8 keyinfoSpace[SZ_KEYINFO_0]; /* Space to hold pKeyinfo[0] content */ + } uKey; }; /* @@ -24302,9 +24541,11 @@ SQLITE_PRIVATE int sqlite3VdbeCheckMemInvariants(Mem*); #endif #ifndef SQLITE_OMIT_FOREIGN_KEY -SQLITE_PRIVATE int sqlite3VdbeCheckFk(Vdbe *, int); +SQLITE_PRIVATE int sqlite3VdbeCheckFkImmediate(Vdbe*); +SQLITE_PRIVATE int sqlite3VdbeCheckFkDeferred(Vdbe*); #else -# define sqlite3VdbeCheckFk(p,i) 0 +# define sqlite3VdbeCheckFkImmediate(p) 0 +# define sqlite3VdbeCheckFkDeferred(p) 0 #endif #ifdef SQLITE_DEBUG @@ -24513,23 +24754,25 @@ SQLITE_PRIVATE int sqlite3LookasideUsed(sqlite3 *db, int *pHighwater){ /* ** Query status information for a single database connection */ -SQLITE_API int sqlite3_db_status( - sqlite3 *db, /* The database connection whose status is desired */ - int op, /* Status verb */ - int *pCurrent, /* Write current value here */ - int *pHighwater, /* Write high-water mark here */ - int resetFlag /* Reset high-water mark if true */ +SQLITE_API int sqlite3_db_status64( + sqlite3 *db, /* The database connection whose status is desired */ + int op, /* Status verb */ + sqlite3_int64 *pCurrent, /* Write current value here */ + sqlite3_int64 *pHighwtr, /* Write high-water mark here */ + int resetFlag /* Reset high-water mark if true */ ){ int rc = SQLITE_OK; /* Return code */ #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) || pCurrent==0|| pHighwater==0 ){ + if( !sqlite3SafetyCheckOk(db) || pCurrent==0|| pHighwtr==0 ){ return SQLITE_MISUSE_BKPT; } #endif sqlite3_mutex_enter(db->mutex); switch( op ){ case SQLITE_DBSTATUS_LOOKASIDE_USED: { - *pCurrent = sqlite3LookasideUsed(db, pHighwater); + int H = 0; + *pCurrent = sqlite3LookasideUsed(db, &H); + *pHighwtr = H; if( resetFlag ){ LookasideSlot *p = db->lookaside.pFree; if( p ){ @@ -24560,7 +24803,7 @@ SQLITE_API int sqlite3_db_status( assert( (op-SQLITE_DBSTATUS_LOOKASIDE_HIT)>=0 ); assert( (op-SQLITE_DBSTATUS_LOOKASIDE_HIT)<3 ); *pCurrent = 0; - *pHighwater = (int)db->lookaside.anStat[op-SQLITE_DBSTATUS_LOOKASIDE_HIT]; + *pHighwtr = db->lookaside.anStat[op-SQLITE_DBSTATUS_LOOKASIDE_HIT]; if( resetFlag ){ db->lookaside.anStat[op - SQLITE_DBSTATUS_LOOKASIDE_HIT] = 0; } @@ -24574,7 +24817,7 @@ SQLITE_API int sqlite3_db_status( */ case SQLITE_DBSTATUS_CACHE_USED_SHARED: case SQLITE_DBSTATUS_CACHE_USED: { - int totalUsed = 0; + sqlite3_int64 totalUsed = 0; int i; sqlite3BtreeEnterAll(db); for(i=0; inDb; i++){ @@ -24590,18 +24833,18 @@ SQLITE_API int sqlite3_db_status( } sqlite3BtreeLeaveAll(db); *pCurrent = totalUsed; - *pHighwater = 0; + *pHighwtr = 0; break; } /* ** *pCurrent gets an accurate estimate of the amount of memory used ** to store the schema for all databases (main, temp, and any ATTACHed - ** databases. *pHighwater is set to zero. + ** databases. *pHighwtr is set to zero. */ case SQLITE_DBSTATUS_SCHEMA_USED: { - int i; /* Used to iterate through schemas */ - int nByte = 0; /* Used to accumulate return value */ + int i; /* Used to iterate through schemas */ + int nByte = 0; /* Used to accumulate return value */ sqlite3BtreeEnterAll(db); db->pnBytesFreed = &nByte; @@ -24635,7 +24878,7 @@ SQLITE_API int sqlite3_db_status( db->lookaside.pEnd = db->lookaside.pTrueEnd; sqlite3BtreeLeaveAll(db); - *pHighwater = 0; + *pHighwtr = 0; *pCurrent = nByte; break; } @@ -24643,7 +24886,7 @@ SQLITE_API int sqlite3_db_status( /* ** *pCurrent gets an accurate estimate of the amount of memory used ** to store all prepared statements. - ** *pHighwater is set to zero. + ** *pHighwtr is set to zero. */ case SQLITE_DBSTATUS_STMT_USED: { struct Vdbe *pVdbe; /* Used to iterate through VMs */ @@ -24658,7 +24901,7 @@ SQLITE_API int sqlite3_db_status( db->lookaside.pEnd = db->lookaside.pTrueEnd; db->pnBytesFreed = 0; - *pHighwater = 0; /* IMP: R-64479-57858 */ + *pHighwtr = 0; /* IMP: R-64479-57858 */ *pCurrent = nByte; break; @@ -24666,7 +24909,7 @@ SQLITE_API int sqlite3_db_status( /* ** Set *pCurrent to the total cache hits or misses encountered by all - ** pagers the database handle is connected to. *pHighwater is always set + ** pagers the database handle is connected to. *pHighwtr is always set ** to zero. */ case SQLITE_DBSTATUS_CACHE_SPILL: @@ -24686,19 +24929,39 @@ SQLITE_API int sqlite3_db_status( sqlite3PagerCacheStat(pPager, op, resetFlag, &nRet); } } - *pHighwater = 0; /* IMP: R-42420-56072 */ + *pHighwtr = 0; /* IMP: R-42420-56072 */ /* IMP: R-54100-20147 */ /* IMP: R-29431-39229 */ - *pCurrent = (int)nRet & 0x7fffffff; + *pCurrent = nRet; + break; + } + + /* Set *pCurrent to the number of bytes that the db database connection + ** has spilled to the filesystem in temporary files that could have been + ** stored in memory, had sufficient memory been available. + ** The *pHighwater is always set to zero. + */ + case SQLITE_DBSTATUS_TEMPBUF_SPILL: { + u64 nRet = 0; + if( db->aDb[1].pBt ){ + Pager *pPager = sqlite3BtreePager(db->aDb[1].pBt); + sqlite3PagerCacheStat(pPager, SQLITE_DBSTATUS_CACHE_WRITE, + resetFlag, &nRet); + nRet *= sqlite3BtreeGetPageSize(db->aDb[1].pBt); + } + nRet += db->nSpill; + if( resetFlag ) db->nSpill = 0; + *pHighwtr = 0; + *pCurrent = nRet; break; } /* Set *pCurrent to non-zero if there are unresolved deferred foreign ** key constraints. Set *pCurrent to zero if all foreign key constraints - ** have been satisfied. The *pHighwater is always set to zero. + ** have been satisfied. The *pHighwtr is always set to zero. */ case SQLITE_DBSTATUS_DEFERRED_FKS: { - *pHighwater = 0; /* IMP: R-11967-56545 */ + *pHighwtr = 0; /* IMP: R-11967-56545 */ *pCurrent = db->nDeferredImmCons>0 || db->nDeferredCons>0; break; } @@ -24711,6 +24974,31 @@ SQLITE_API int sqlite3_db_status( return rc; } +/* +** 32-bit variant of sqlite3_db_status64() +*/ +SQLITE_API int sqlite3_db_status( + sqlite3 *db, /* The database connection whose status is desired */ + int op, /* Status verb */ + int *pCurrent, /* Write current value here */ + int *pHighwtr, /* Write high-water mark here */ + int resetFlag /* Reset high-water mark if true */ +){ + sqlite3_int64 C = 0, H = 0; + int rc; +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || pCurrent==0|| pHighwtr==0 ){ + return SQLITE_MISUSE_BKPT; + } +#endif + rc = sqlite3_db_status64(db, op, &C, &H, resetFlag); + if( rc==0 ){ + *pCurrent = C & 0x7fffffff; + *pHighwtr = H & 0x7fffffff; + } + return rc; +} + /************** End of status.c **********************************************/ /************** Begin file date.c ********************************************/ /* @@ -24903,6 +25191,10 @@ static int parseTimezone(const char *zDate, DateTime *p){ } zDate += 5; p->tz = sgn*(nMn + nHr*60); + if( p->tz==0 ){ /* Forum post 2025-09-17T10:12:14z */ + p->isLocal = 0; + p->isUtc = 1; + } zulu_time: while( sqlite3Isspace(*zDate) ){ zDate++; } return *zDate!=0; @@ -26098,8 +26390,8 @@ static int daysAfterSunday(DateTime *pDate){ ** %l hour 1-12 (leading zero converted to space) ** %m month 01-12 ** %M minute 00-59 -** %p "am" or "pm" -** %P "AM" or "PM" +** %p "AM" or "PM" +** %P "am" or "pm" ** %R time as HH:MM ** %s seconds since 1970-01-01 ** %S seconds 00-59 @@ -31706,6 +31998,7 @@ typedef struct et_info { /* Information about each format field */ etByte type; /* Conversion paradigm */ etByte charset; /* Offset into aDigits[] of the digits string */ etByte prefix; /* Offset into aPrefix[] of the prefix string */ + char iNxt; /* Next with same hash, or 0 for end of chain */ } et_info; /* @@ -31714,44 +32007,61 @@ typedef struct et_info { /* Information about each format field */ #define FLAG_SIGNED 1 /* True if the value to convert is signed */ #define FLAG_STRING 4 /* Allow infinite precision */ - /* -** The following table is searched linearly, so it is good to put the -** most frequently used conversion types first. +** The table is searched by hash. In the case of %C where C is the character +** and that character has ASCII value j, then the hash is j%23. +** +** The order of the entries in fmtinfo[] and the hash chain was entered +** manually, but based on the output of the following TCL script: */ +#if 0 /***** Beginning of script ******/ +foreach c {d s g z q Q w c o u x X f e E G i n % p T S r} { + scan $c %c x + set n($c) $x +} +set mx [llength [array names n]] +puts "count: $mx" + +set mx 27 +puts "*********** mx=$mx ************" +for {set r 0} {$r<$mx} {incr r} { + puts -nonewline [format %2d: $r] + foreach c [array names n] { + if {($n($c))%$mx==$r} {puts -nonewline " $c"} + } + puts "" +} +#endif /***** End of script ********/ + static const char aDigits[] = "0123456789ABCDEF0123456789abcdef"; static const char aPrefix[] = "-x0\000X0"; -static const et_info fmtinfo[] = { - { 'd', 10, 1, etDECIMAL, 0, 0 }, - { 's', 0, 4, etSTRING, 0, 0 }, - { 'g', 0, 1, etGENERIC, 30, 0 }, - { 'z', 0, 4, etDYNSTRING, 0, 0 }, - { 'q', 0, 4, etESCAPE_q, 0, 0 }, - { 'Q', 0, 4, etESCAPE_Q, 0, 0 }, - { 'w', 0, 4, etESCAPE_w, 0, 0 }, - { 'c', 0, 0, etCHARX, 0, 0 }, - { 'o', 8, 0, etRADIX, 0, 2 }, - { 'u', 10, 0, etDECIMAL, 0, 0 }, - { 'x', 16, 0, etRADIX, 16, 1 }, - { 'X', 16, 0, etRADIX, 0, 4 }, -#ifndef SQLITE_OMIT_FLOATING_POINT - { 'f', 0, 1, etFLOAT, 0, 0 }, - { 'e', 0, 1, etEXP, 30, 0 }, - { 'E', 0, 1, etEXP, 14, 0 }, - { 'G', 0, 1, etGENERIC, 14, 0 }, -#endif - { 'i', 10, 1, etDECIMAL, 0, 0 }, - { 'n', 0, 0, etSIZE, 0, 0 }, - { '%', 0, 0, etPERCENT, 0, 0 }, - { 'p', 16, 0, etPOINTER, 0, 1 }, - - /* All the rest are undocumented and are for internal use only */ - { 'T', 0, 0, etTOKEN, 0, 0 }, - { 'S', 0, 0, etSRCITEM, 0, 0 }, - { 'r', 10, 1, etORDINAL, 0, 0 }, +static const et_info fmtinfo[23] = { + /* 0 */ { 's', 0, 4, etSTRING, 0, 0, 1 }, + /* 1 */ { 'E', 0, 1, etEXP, 14, 0, 0 }, /* Hash: 0 */ + /* 2 */ { 'u', 10, 0, etDECIMAL, 0, 0, 3 }, + /* 3 */ { 'G', 0, 1, etGENERIC, 14, 0, 0 }, /* Hash: 2 */ + /* 4 */ { 'w', 0, 4, etESCAPE_w, 0, 0, 0 }, + /* 5 */ { 'x', 16, 0, etRADIX, 16, 1, 0 }, + /* 6 */ { 'c', 0, 0, etCHARX, 0, 0, 0 }, /* Hash: 7 */ + /* 7 */ { 'z', 0, 4, etDYNSTRING, 0, 0, 6 }, + /* 8 */ { 'd', 10, 1, etDECIMAL, 0, 0, 0 }, + /* 9 */ { 'e', 0, 1, etEXP, 30, 0, 0 }, + /* 10 */ { 'f', 0, 1, etFLOAT, 0, 0, 0 }, + /* 11 */ { 'g', 0, 1, etGENERIC, 30, 0, 0 }, + /* 12 */ { 'Q', 0, 4, etESCAPE_Q, 0, 0, 0 }, + /* 13 */ { 'i', 10, 1, etDECIMAL, 0, 0, 0 }, + /* 14 */ { '%', 0, 0, etPERCENT, 0, 0, 16 }, + /* 15 */ { 'T', 0, 0, etTOKEN, 0, 0, 0 }, + /* 16 */ { 'S', 0, 0, etSRCITEM, 0, 0, 0 }, /* Hash: 14 */ + /* 17 */ { 'X', 16, 0, etRADIX, 0, 4, 0 }, /* Hash: 19 */ + /* 18 */ { 'n', 0, 0, etSIZE, 0, 0, 0 }, + /* 19 */ { 'o', 8, 0, etRADIX, 0, 2, 17 }, + /* 20 */ { 'p', 16, 0, etPOINTER, 0, 1, 0 }, + /* 21 */ { 'q', 0, 4, etESCAPE_q, 0, 0, 0 }, + /* 22 */ { 'r', 10, 1, etORDINAL, 0, 0, 0 } }; -/* Notes: +/* Additional Notes: ** ** %S Takes a pointer to SrcItem. Shows name or database.name ** %!S Like %S but prefer the zName over the zAlias @@ -31878,7 +32188,10 @@ SQLITE_API void sqlite3_str_vappendf( #if HAVE_STRCHRNUL fmt = strchrnul(fmt, '%'); #else - do{ fmt++; }while( *fmt && *fmt != '%' ); + fmt = strchr(fmt, '%'); + if( fmt==0 ){ + fmt = bufpt + strlen(bufpt); + } #endif sqlite3_str_append(pAccum, bufpt, (int)(fmt - bufpt)); if( *fmt==0 ) break; @@ -31992,6 +32305,9 @@ SQLITE_API void sqlite3_str_vappendf( }while( !done && (c=(*++fmt))!=0 ); /* Fetch the info entry for the field */ +#ifdef SQLITE_EBCDIC + /* The hash table only works for ASCII. For EBCDIC, we need to do + ** a linear search of the table */ infop = &fmtinfo[0]; xtype = etINVALID; for(idx=0; idxtype; + }else{ + infop = &fmtinfo[0]; + xtype = etINVALID; + } +#endif /* ** At this point, variables are initialized as follows: @@ -32068,6 +32398,14 @@ SQLITE_API void sqlite3_str_vappendf( } prefix = 0; } + +#if WHERETRACE_ENABLED + if( xtype==etPOINTER && sqlite3WhereTrace & 0x100000 ) longvalue = 0; +#endif +#if TREETRACE_ENABLED + if( xtype==etPOINTER && sqlite3TreeTrace & 0x100000 ) longvalue = 0; +#endif + if( longvalue==0 ) flag_alternateform = 0; if( flag_zeropad && precisionfg.isSubquery ) n++; if( pItem->fg.isTabFunc ) n++; - if( pItem->fg.isUsing ) n++; + if( pItem->fg.isUsing || pItem->u3.pOn!=0 ) n++; if( pItem->fg.isUsing ){ sqlite3TreeViewIdList(pView, pItem->u3.pUsing, (--n)>0, "USING"); + }else if( pItem->u3.pOn!=0 ){ + sqlite3TreeViewItem(pView, "ON", (--n)>0); + sqlite3TreeViewExpr(pView, pItem->u3.pOn, 0); + sqlite3TreeViewPop(&pView); } if( pItem->fg.isSubquery ){ assert( n==1 ); @@ -37699,20 +38055,20 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ /* 34 */ "SorterSort" OpHelp(""), /* 35 */ "Sort" OpHelp(""), /* 36 */ "Rewind" OpHelp(""), - /* 37 */ "SorterNext" OpHelp(""), - /* 38 */ "Prev" OpHelp(""), - /* 39 */ "Next" OpHelp(""), - /* 40 */ "IdxLE" OpHelp("key=r[P3@P4]"), - /* 41 */ "IdxGT" OpHelp("key=r[P3@P4]"), - /* 42 */ "IdxLT" OpHelp("key=r[P3@P4]"), + /* 37 */ "IfEmpty" OpHelp("if( empty(P1) ) goto P2"), + /* 38 */ "SorterNext" OpHelp(""), + /* 39 */ "Prev" OpHelp(""), + /* 40 */ "Next" OpHelp(""), + /* 41 */ "IdxLE" OpHelp("key=r[P3@P4]"), + /* 42 */ "IdxGT" OpHelp("key=r[P3@P4]"), /* 43 */ "Or" OpHelp("r[P3]=(r[P1] || r[P2])"), /* 44 */ "And" OpHelp("r[P3]=(r[P1] && r[P2])"), - /* 45 */ "IdxGE" OpHelp("key=r[P3@P4]"), - /* 46 */ "RowSetRead" OpHelp("r[P3]=rowset(P1)"), - /* 47 */ "RowSetTest" OpHelp("if r[P3] in rowset(P1) goto P2"), - /* 48 */ "Program" OpHelp(""), - /* 49 */ "FkIfZero" OpHelp("if fkctr[P1]==0 goto P2"), - /* 50 */ "IfPos" OpHelp("if r[P1]>0 then r[P1]-=P3, goto P2"), + /* 45 */ "IdxLT" OpHelp("key=r[P3@P4]"), + /* 46 */ "IdxGE" OpHelp("key=r[P3@P4]"), + /* 47 */ "RowSetRead" OpHelp("r[P3]=rowset(P1)"), + /* 48 */ "RowSetTest" OpHelp("if r[P3] in rowset(P1) goto P2"), + /* 49 */ "Program" OpHelp(""), + /* 50 */ "FkIfZero" OpHelp("if fkctr[P1]==0 goto P2"), /* 51 */ "IsNull" OpHelp("if r[P1]==NULL goto P2"), /* 52 */ "NotNull" OpHelp("if r[P1]!=NULL goto P2"), /* 53 */ "Ne" OpHelp("IF r[P3]!=r[P1]"), @@ -37722,49 +38078,49 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ /* 57 */ "Lt" OpHelp("IF r[P3]=r[P1]"), /* 59 */ "ElseEq" OpHelp(""), - /* 60 */ "IfNotZero" OpHelp("if r[P1]!=0 then r[P1]--, goto P2"), - /* 61 */ "DecrJumpZero" OpHelp("if (--r[P1])==0 goto P2"), - /* 62 */ "IncrVacuum" OpHelp(""), - /* 63 */ "VNext" OpHelp(""), - /* 64 */ "Filter" OpHelp("if key(P3@P4) not in filter(P1) goto P2"), - /* 65 */ "PureFunc" OpHelp("r[P3]=func(r[P2@NP])"), - /* 66 */ "Function" OpHelp("r[P3]=func(r[P2@NP])"), - /* 67 */ "Return" OpHelp(""), - /* 68 */ "EndCoroutine" OpHelp(""), - /* 69 */ "HaltIfNull" OpHelp("if r[P3]=null halt"), - /* 70 */ "Halt" OpHelp(""), - /* 71 */ "Integer" OpHelp("r[P2]=P1"), - /* 72 */ "Int64" OpHelp("r[P2]=P4"), - /* 73 */ "String" OpHelp("r[P2]='P4' (len=P1)"), - /* 74 */ "BeginSubrtn" OpHelp("r[P2]=NULL"), - /* 75 */ "Null" OpHelp("r[P2..P3]=NULL"), - /* 76 */ "SoftNull" OpHelp("r[P1]=NULL"), - /* 77 */ "Blob" OpHelp("r[P2]=P4 (len=P1)"), - /* 78 */ "Variable" OpHelp("r[P2]=parameter(P1)"), - /* 79 */ "Move" OpHelp("r[P2@P3]=r[P1@P3]"), - /* 80 */ "Copy" OpHelp("r[P2@P3+1]=r[P1@P3+1]"), - /* 81 */ "SCopy" OpHelp("r[P2]=r[P1]"), - /* 82 */ "IntCopy" OpHelp("r[P2]=r[P1]"), - /* 83 */ "FkCheck" OpHelp(""), - /* 84 */ "ResultRow" OpHelp("output=r[P1@P2]"), - /* 85 */ "CollSeq" OpHelp(""), - /* 86 */ "AddImm" OpHelp("r[P1]=r[P1]+P2"), - /* 87 */ "RealAffinity" OpHelp(""), - /* 88 */ "Cast" OpHelp("affinity(r[P1])"), - /* 89 */ "Permutation" OpHelp(""), - /* 90 */ "Compare" OpHelp("r[P1@P3] <-> r[P2@P3]"), - /* 91 */ "IsTrue" OpHelp("r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4"), - /* 92 */ "ZeroOrNull" OpHelp("r[P2] = 0 OR NULL"), - /* 93 */ "Offset" OpHelp("r[P3] = sqlite_offset(P1)"), - /* 94 */ "Column" OpHelp("r[P3]=PX cursor P1 column P2"), - /* 95 */ "TypeCheck" OpHelp("typecheck(r[P1@P2])"), - /* 96 */ "Affinity" OpHelp("affinity(r[P1@P2])"), - /* 97 */ "MakeRecord" OpHelp("r[P3]=mkrec(r[P1@P2])"), - /* 98 */ "Count" OpHelp("r[P2]=count()"), - /* 99 */ "ReadCookie" OpHelp(""), - /* 100 */ "SetCookie" OpHelp(""), - /* 101 */ "ReopenIdx" OpHelp("root=P2 iDb=P3"), - /* 102 */ "OpenRead" OpHelp("root=P2 iDb=P3"), + /* 60 */ "IfPos" OpHelp("if r[P1]>0 then r[P1]-=P3, goto P2"), + /* 61 */ "IfNotZero" OpHelp("if r[P1]!=0 then r[P1]--, goto P2"), + /* 62 */ "DecrJumpZero" OpHelp("if (--r[P1])==0 goto P2"), + /* 63 */ "IncrVacuum" OpHelp(""), + /* 64 */ "VNext" OpHelp(""), + /* 65 */ "Filter" OpHelp("if key(P3@P4) not in filter(P1) goto P2"), + /* 66 */ "PureFunc" OpHelp("r[P3]=func(r[P2@NP])"), + /* 67 */ "Function" OpHelp("r[P3]=func(r[P2@NP])"), + /* 68 */ "Return" OpHelp(""), + /* 69 */ "EndCoroutine" OpHelp(""), + /* 70 */ "HaltIfNull" OpHelp("if r[P3]=null halt"), + /* 71 */ "Halt" OpHelp(""), + /* 72 */ "Integer" OpHelp("r[P2]=P1"), + /* 73 */ "Int64" OpHelp("r[P2]=P4"), + /* 74 */ "String" OpHelp("r[P2]='P4' (len=P1)"), + /* 75 */ "BeginSubrtn" OpHelp("r[P2]=NULL"), + /* 76 */ "Null" OpHelp("r[P2..P3]=NULL"), + /* 77 */ "SoftNull" OpHelp("r[P1]=NULL"), + /* 78 */ "Blob" OpHelp("r[P2]=P4 (len=P1)"), + /* 79 */ "Variable" OpHelp("r[P2]=parameter(P1)"), + /* 80 */ "Move" OpHelp("r[P2@P3]=r[P1@P3]"), + /* 81 */ "Copy" OpHelp("r[P2@P3+1]=r[P1@P3+1]"), + /* 82 */ "SCopy" OpHelp("r[P2]=r[P1]"), + /* 83 */ "IntCopy" OpHelp("r[P2]=r[P1]"), + /* 84 */ "FkCheck" OpHelp(""), + /* 85 */ "ResultRow" OpHelp("output=r[P1@P2]"), + /* 86 */ "CollSeq" OpHelp(""), + /* 87 */ "AddImm" OpHelp("r[P1]=r[P1]+P2"), + /* 88 */ "RealAffinity" OpHelp(""), + /* 89 */ "Cast" OpHelp("affinity(r[P1])"), + /* 90 */ "Permutation" OpHelp(""), + /* 91 */ "Compare" OpHelp("r[P1@P3] <-> r[P2@P3]"), + /* 92 */ "IsTrue" OpHelp("r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4"), + /* 93 */ "ZeroOrNull" OpHelp("r[P2] = 0 OR NULL"), + /* 94 */ "Offset" OpHelp("r[P3] = sqlite_offset(P1)"), + /* 95 */ "Column" OpHelp("r[P3]=PX cursor P1 column P2"), + /* 96 */ "TypeCheck" OpHelp("typecheck(r[P1@P2])"), + /* 97 */ "Affinity" OpHelp("affinity(r[P1@P2])"), + /* 98 */ "MakeRecord" OpHelp("r[P3]=mkrec(r[P1@P2])"), + /* 99 */ "Count" OpHelp("r[P2]=count()"), + /* 100 */ "ReadCookie" OpHelp(""), + /* 101 */ "SetCookie" OpHelp(""), + /* 102 */ "ReopenIdx" OpHelp("root=P2 iDb=P3"), /* 103 */ "BitAnd" OpHelp("r[P3]=r[P1]&r[P2]"), /* 104 */ "BitOr" OpHelp("r[P3]=r[P1]|r[P2]"), /* 105 */ "ShiftLeft" OpHelp("r[P3]=r[P2]<0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1)"), - /* 161 */ "AggInverse" OpHelp("accum=r[P3] inverse(r[P2@P5])"), - /* 162 */ "AggStep" OpHelp("accum=r[P3] step(r[P2@P5])"), - /* 163 */ "AggStep1" OpHelp("accum=r[P3] step(r[P2@P5])"), - /* 164 */ "AggValue" OpHelp("r[P3]=value N=P2"), - /* 165 */ "AggFinal" OpHelp("accum=r[P1] N=P2"), - /* 166 */ "Expire" OpHelp(""), - /* 167 */ "CursorLock" OpHelp(""), - /* 168 */ "CursorUnlock" OpHelp(""), - /* 169 */ "TableLock" OpHelp("iDb=P1 root=P2 write=P3"), - /* 170 */ "VBegin" OpHelp(""), - /* 171 */ "VCreate" OpHelp(""), - /* 172 */ "VDestroy" OpHelp(""), - /* 173 */ "VOpen" OpHelp(""), - /* 174 */ "VCheck" OpHelp(""), - /* 175 */ "VInitIn" OpHelp("r[P2]=ValueList(P1,P3)"), - /* 176 */ "VColumn" OpHelp("r[P3]=vcolumn(P2)"), - /* 177 */ "VRename" OpHelp(""), - /* 178 */ "Pagecount" OpHelp(""), - /* 179 */ "MaxPgcnt" OpHelp(""), - /* 180 */ "ClrSubtype" OpHelp("r[P1].subtype = 0"), - /* 181 */ "GetSubtype" OpHelp("r[P2] = r[P1].subtype"), - /* 182 */ "SetSubtype" OpHelp("r[P2].subtype = r[P1]"), - /* 183 */ "FilterAdd" OpHelp("filter(P1) += key(P3@P4)"), - /* 184 */ "Trace" OpHelp(""), - /* 185 */ "CursorHint" OpHelp(""), - /* 186 */ "ReleaseReg" OpHelp("release r[P1@P2] mask P3"), - /* 187 */ "Noop" OpHelp(""), - /* 188 */ "Explain" OpHelp(""), - /* 189 */ "Abortable" OpHelp(""), + /* 155 */ "DropTrigger" OpHelp(""), + /* 156 */ "IntegrityCk" OpHelp(""), + /* 157 */ "RowSetAdd" OpHelp("rowset(P1)=r[P2]"), + /* 158 */ "Param" OpHelp(""), + /* 159 */ "FkCounter" OpHelp("fkctr[P1]+=P2"), + /* 160 */ "MemMax" OpHelp("r[P1]=max(r[P1],r[P2])"), + /* 161 */ "OffsetLimit" OpHelp("if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1)"), + /* 162 */ "AggInverse" OpHelp("accum=r[P3] inverse(r[P2@P5])"), + /* 163 */ "AggStep" OpHelp("accum=r[P3] step(r[P2@P5])"), + /* 164 */ "AggStep1" OpHelp("accum=r[P3] step(r[P2@P5])"), + /* 165 */ "AggValue" OpHelp("r[P3]=value N=P2"), + /* 166 */ "AggFinal" OpHelp("accum=r[P1] N=P2"), + /* 167 */ "Expire" OpHelp(""), + /* 168 */ "CursorLock" OpHelp(""), + /* 169 */ "CursorUnlock" OpHelp(""), + /* 170 */ "TableLock" OpHelp("iDb=P1 root=P2 write=P3"), + /* 171 */ "VBegin" OpHelp(""), + /* 172 */ "VCreate" OpHelp(""), + /* 173 */ "VDestroy" OpHelp(""), + /* 174 */ "VOpen" OpHelp(""), + /* 175 */ "VCheck" OpHelp(""), + /* 176 */ "VInitIn" OpHelp("r[P2]=ValueList(P1,P3)"), + /* 177 */ "VColumn" OpHelp("r[P3]=vcolumn(P2)"), + /* 178 */ "VRename" OpHelp(""), + /* 179 */ "Pagecount" OpHelp(""), + /* 180 */ "MaxPgcnt" OpHelp(""), + /* 181 */ "ClrSubtype" OpHelp("r[P1].subtype = 0"), + /* 182 */ "GetSubtype" OpHelp("r[P2] = r[P1].subtype"), + /* 183 */ "SetSubtype" OpHelp("r[P2].subtype = r[P1]"), + /* 184 */ "FilterAdd" OpHelp("filter(P1) += key(P3@P4)"), + /* 185 */ "Trace" OpHelp(""), + /* 186 */ "CursorHint" OpHelp(""), + /* 187 */ "ReleaseReg" OpHelp("release r[P1@P2] mask P3"), + /* 188 */ "Noop" OpHelp(""), + /* 189 */ "Explain" OpHelp(""), + /* 190 */ "Abortable" OpHelp(""), }; return azName[i]; } @@ -38035,7 +38392,7 @@ static int kvstorageRead(const char*, const char *zKey, char *zBuf, int nBuf); #define KVSTORAGE_KEY_SZ 32 /* Expand the key name with an appropriate prefix and put the result -** zKeyOut[]. The zKeyOut[] buffer is assumed to hold at least +** in zKeyOut[]. The zKeyOut[] buffer is assumed to hold at least ** KVSTORAGE_KEY_SZ bytes. */ static void kvstorageMakeKey( @@ -38094,10 +38451,12 @@ static int kvstorageDelete(const char *zClass, const char *zKey){ ** ** Return the total number of bytes in the data, without truncation, and ** not counting the final zero terminator. Return -1 if the key does -** not exist. +** not exist or its key cannot be read. ** -** If nBuf<=0 then this routine simply returns the size of the data without -** actually reading it. +** If nBuf<=0 then this routine simply returns the size of the data +** without actually reading it. Similarly, if nBuf==1 then it +** zero-terminates zBuf at zBuf[0] and returns the size of the data +** without reading it. */ static int kvstorageRead( const char *zClass, @@ -38146,11 +38505,9 @@ static int kvstorageRead( ** kvvfs i/o methods with JavaScript implementations in WASM builds. ** Maintenance reminder: if this struct changes in any way, the JSON ** rendering of its structure must be updated in -** sqlite3_wasm_enum_json(). There are no binary compatibility -** concerns, so it does not need an iVersion member. This file is -** necessarily always compiled together with sqlite3_wasm_enum_json(), -** and JS code dynamically creates the mapping of members based on -** that JSON description. +** sqlite3-wasm.c:sqlite3__wasm_enum_json(). There are no binary +** compatibility concerns, so it does not need an iVersion +** member. */ typedef struct sqlite3_kvvfs_methods sqlite3_kvvfs_methods; struct sqlite3_kvvfs_methods { @@ -38167,8 +38524,8 @@ struct sqlite3_kvvfs_methods { ** the compiler can hopefully optimize this level of indirection out. ** That said, kvvfs is intended primarily for use in WASM builds. ** -** Note that this is not explicitly flagged as static because the -** amalgamation build will tag it with SQLITE_PRIVATE. +** This is not explicitly flagged as static because the amalgamation +** build will tag it with SQLITE_PRIVATE. */ #ifndef SQLITE_WASM const @@ -39341,10 +39698,11 @@ static struct unix_syscall { #if defined(HAVE_FCHMOD) { "fchmod", (sqlite3_syscall_ptr)fchmod, 0 }, +#define osFchmod ((int(*)(int,mode_t))aSyscall[14].pCurrent) #else { "fchmod", (sqlite3_syscall_ptr)0, 0 }, +#define osFchmod(FID,MODE) 0 #endif -#define osFchmod ((int(*)(int,mode_t))aSyscall[14].pCurrent) #if defined(HAVE_POSIX_FALLOCATE) && HAVE_POSIX_FALLOCATE { "fallocate", (sqlite3_syscall_ptr)posix_fallocate, 0 }, @@ -39438,6 +39796,119 @@ static struct unix_syscall { }; /* End of the overrideable system calls */ +#if defined(SQLITE_DEBUG) || defined(SQLITE_ENABLE_FILESTAT) +/* +** Extract Posix Advisory Locking information about file description fd +** from the /proc/PID/fdinfo/FD pseudo-file. Fill the string buffer a[16] +** with characters to indicate which SQLite-relevant locks are held. +** a[16] will be a 15-character zero-terminated string with the following +** schema: +** +** AAA/B.DDD.DDDDD +** +** Each of character A-D will be "w" or "r" or "-" to indicate either a +** write-lock, a read-lock, or no-lock, respectively. The "." and "/" +** characters are delimiters intended to make the string more easily +** readable by humans. Here are the meaning of the specific letters: +** +** AAA -> The main database locks. PENDING_BYTE, RESERVED_BYTE, +** and SHARED_FIRST, respectively. +** +** B -> The deadman switch lock. Offset 128 of the -shm file. +** +** CCC -> WAL locks: WRITE, CKPT, RECOVER +** +** DDDDD -> WAL read-locks 0 through 5 +** +** Note that elements before the "/" apply to the main database file and +** elements after the "/" apply to the -shm file in WAL mode. +** +** Here is another way of thinking about the meaning of the result string: +** +** AAA/B.CCC.DDDDD +** ||| | ||| \___/ +** PENDING--'|| | ||| `----- READ 0-5 +** RESERVED--'| | ||`---- RECOVER +** SHARED ----' | |`----- CKPT +** DMS ------' `------ WRITE +** +** Return SQLITE_OK on success and SQLITE_ERROR_UNABLE if the /proc +** pseudo-filesystem is unavailable. +*/ +static int unixPosixAdvisoryLocks( + int fd, /* The file descriptor to analyze */ + char a[16] /* Write a text description of PALs here */ +){ + int in; + ssize_t n; + char *p, *pNext, *x; + char z[2000]; + + /* 1 */ + /* 012 4 678 01234 */ + memcpy(a, "---/-.---.-----", 16); + sqlite3_snprintf(sizeof(z), z, "/proc/%d/fdinfo/%d", getpid(), fd); + in = osOpen(z, O_RDONLY, 0); + if( in<0 ){ + return SQLITE_ERROR_UNABLE; + } + n = osRead(in, z, sizeof(z)-1); + osClose(in); + if( n<=0 ) return SQLITE_ERROR_UNABLE; + z[n] = 0; + + /* We are looking for lines that begin with "lock:\t". Examples: + ** + ** lock: 1: POSIX ADVISORY READ 494716 08:02:5277597 1073741826 1073742335 + ** lock: 1: POSIX ADVISORY WRITE 494716 08:02:5282282 120 120 + ** lock: 2: POSIX ADVISORY READ 494716 08:02:5282282 123 123 + ** lock: 3: POSIX ADVISORY READ 494716 08:02:5282282 128 128 + */ + pNext = strstr(z, "lock:\t"); + while( pNext ){ + char cType = 0; + sqlite3_int64 iFirst, iLast; + p = pNext+6; + pNext = strstr(p, "lock:\t"); + if( pNext ) pNext[-1] = 0; + if( (x = strstr(p, " READ "))!=0 ){ + cType = 'r'; + x += 6; + }else if( (x = strstr(p, " WRITE "))!=0 ){ + cType = 'w'; + x += 7; + }else{ + continue; + } + x = strrchr(x, ' '); + if( x==0 ) continue; + iLast = strtoll(x+1, 0, 10); + *x = 0; + x = strrchr(p, ' '); + if( x==0 ) continue; + iFirst = strtoll(x+1, 0, 10); + if( iLast>=PENDING_BYTE ){ + if( iFirst<=PENDING_BYTE && iLast>=PENDING_BYTE ) a[0] = cType; + if( iFirst<=PENDING_BYTE+1 && iLast>=PENDING_BYTE+1 ) a[1] = cType; + if( iFirst<=PENDING_BYTE+2 && iLast>=PENDING_BYTE+510 ) a[2] = cType; + }else if( iLast<=128 ){ + if( iFirst<=128 && iLast>=128 ) a[4] = cType; + if( iFirst<=120 && iLast>=120 ) a[6] = cType; + if( iFirst<=121 && iLast>=121 ) a[7] = cType; + if( iFirst<=122 && iLast>=122 ) a[8] = cType; + if( iFirst<=123 && iLast>=123 ) a[10] = cType; + if( iFirst<=124 && iLast>=124 ) a[11] = cType; + if( iFirst<=125 && iLast>=125 ) a[12] = cType; + if( iFirst<=126 && iLast>=126 ) a[13] = cType; + if( iFirst<=127 && iLast>=127 ) a[14] = cType; + } + } + return SQLITE_OK; +} +#else +# define unixPosixAdvisoryLocks(A,B) SQLITE_ERROR_UNABLE +#endif /* SQLITE_DEBUG || SQLITE_ENABLE_FILESTAT */ + /* ** On some systems, calls to fchown() will trigger a message in a security ** log if they come from non-root processes. So avoid calling fchown() if @@ -39602,9 +40073,8 @@ static int robust_open(const char *z, int f, mode_t m){ /* ** Helper functions to obtain and relinquish the global mutex. The -** global mutex is used to protect the unixInodeInfo and -** vxworksFileId objects used by this file, all of which may be -** shared by multiple threads. +** global mutex is used to protect the unixInodeInfo objects used by +** this file, all of which may be shared by multiple threads. ** ** Function unixMutexHeld() is used to assert() that the global mutex ** is held when required. This function is only used as part of assert() @@ -39806,6 +40276,7 @@ struct vxworksFileId { ** variable: */ static struct vxworksFileId *vxworksFileList = 0; +static sqlite3_mutex *vxworksMutex = 0; /* ** Simplify a filename into its canonical form @@ -39871,14 +40342,14 @@ static struct vxworksFileId *vxworksFindFileId(const char *zAbsoluteName){ ** If found, increment the reference count and return a pointer to ** the existing file ID. */ - unixEnterMutex(); + sqlite3_mutex_enter(vxworksMutex); for(pCandidate=vxworksFileList; pCandidate; pCandidate=pCandidate->pNext){ if( pCandidate->nName==n && memcmp(pCandidate->zCanonicalName, pNew->zCanonicalName, n)==0 ){ sqlite3_free(pNew); pCandidate->nRef++; - unixLeaveMutex(); + sqlite3_mutex_leave(vxworksMutex); return pCandidate; } } @@ -39888,7 +40359,7 @@ static struct vxworksFileId *vxworksFindFileId(const char *zAbsoluteName){ pNew->nName = n; pNew->pNext = vxworksFileList; vxworksFileList = pNew; - unixLeaveMutex(); + sqlite3_mutex_leave(vxworksMutex); return pNew; } @@ -39897,7 +40368,7 @@ static struct vxworksFileId *vxworksFindFileId(const char *zAbsoluteName){ ** the object when the reference count reaches zero. */ static void vxworksReleaseFileId(struct vxworksFileId *pId){ - unixEnterMutex(); + sqlite3_mutex_enter(vxworksMutex); assert( pId->nRef>0 ); pId->nRef--; if( pId->nRef==0 ){ @@ -39907,7 +40378,7 @@ static void vxworksReleaseFileId(struct vxworksFileId *pId){ *pp = pId->pNext; sqlite3_free(pId); } - unixLeaveMutex(); + sqlite3_mutex_leave(vxworksMutex); } #endif /* OS_VXWORKS */ /*************** End of Unique File ID Utility Used By VxWorks **************** @@ -40295,6 +40766,10 @@ static int findInodeInfo( storeLastErrno(pFile, errno); return SQLITE_IOERR; } + if( fsync(fd) ){ + storeLastErrno(pFile, errno); + return SQLITE_IOERR_FSYNC; + } rc = osFstat(fd, &statbuf); if( rc!=0 ){ storeLastErrno(pFile, errno); @@ -40464,18 +40939,42 @@ static int osSetPosixAdvisoryLock( struct flock *pLock, /* The description of the lock */ unixFile *pFile /* Structure holding timeout value */ ){ - int tm = pFile->iBusyTimeout; - int rc = osFcntl(h,F_SETLK,pLock); - while( rc<0 && tm>0 ){ - /* On systems that support some kind of blocking file lock with a timeout, - ** make appropriate changes here to invoke that blocking file lock. On - ** generic posix, however, there is no such API. So we simply try the - ** lock once every millisecond until either the timeout expires, or until - ** the lock is obtained. */ - unixSleep(0,1000); + int rc = 0; + + if( pFile->iBusyTimeout==0 ){ + /* unixFile->iBusyTimeout is set to 0. In this case, attempt a + ** non-blocking lock. */ + rc = osFcntl(h,F_SETLK,pLock); + }else{ + /* unixFile->iBusyTimeout is set to greater than zero. In this case, + ** attempt a blocking-lock with a unixFile->iBusyTimeout ms timeout. + ** + ** On systems that support some kind of blocking file lock operation, + ** this block should be replaced by code to attempt a blocking lock + ** with a timeout of unixFile->iBusyTimeout ms. The code below is + ** placeholder code. If SQLITE_TEST is defined, the placeholder code + ** retries the lock once every 1ms until it succeeds or the timeout + ** is reached. Or, if SQLITE_TEST is not defined, the placeholder + ** code attempts a non-blocking lock and sets unixFile->iBusyTimeout + ** to 0. This causes the caller to return SQLITE_BUSY, instead of + ** SQLITE_BUSY_TIMEOUT to SQLite - as required by a VFS that does not + ** support blocking locks. + */ +#ifdef SQLITE_TEST + int tm = pFile->iBusyTimeout; + while( tm>0 ){ + rc = osFcntl(h,F_SETLK,pLock); + if( rc==0 ) break; + unixSleep(0,1000); + tm--; + } +#else rc = osFcntl(h,F_SETLK,pLock); - tm--; + pFile->iBusyTimeout = 0; +#endif + /* End of code to replace with real blocking-locks code. */ } + return rc; } #endif /* SQLITE_ENABLE_SETLK_TIMEOUT */ @@ -40533,6 +41032,13 @@ static int unixFileLock(unixFile *pFile, struct flock *pLock){ return rc; } +#if !defined(SQLITE_WASI) && !defined(SQLITE_OMIT_WAL) +/* Forward reference */ +static int unixIsSharingShmNode(unixFile*); +#else +#define unixIsSharingShmNode(pFile) (0) +#endif + /* ** Lock the file with the lock specified by parameter eFileLock - one ** of the following: @@ -40721,7 +41227,9 @@ static int unixLock(sqlite3_file *id, int eFileLock){ pInode->nLock++; pInode->nShared = 1; } - }else if( eFileLock==EXCLUSIVE_LOCK && pInode->nShared>1 ){ + }else if( (eFileLock==EXCLUSIVE_LOCK && pInode->nShared>1) + || unixIsSharingShmNode(pFile) + ){ /* We are trying for an exclusive lock but another thread in this ** same process is still holding a shared lock. */ rc = SQLITE_BUSY; @@ -42816,6 +43324,10 @@ static int unixGetTempname(int nBuf, char *zBuf); #if !defined(SQLITE_WASI) && !defined(SQLITE_OMIT_WAL) static int unixFcntlExternalReader(unixFile*, int*); #endif +#if defined(SQLITE_DEBUG) || defined(SQLITE_ENABLE_FILESTAT) + static void unixDescribeShm(sqlite3_str*,unixShm*); +#endif + /* ** Information and control of an open file handle. @@ -42958,6 +43470,66 @@ static int unixFileControl(sqlite3_file *id, int op, void *pArg){ return SQLITE_OK; #endif } + +#if defined(SQLITE_DEBUG) || defined(SQLITE_ENABLE_FILESTAT) + case SQLITE_FCNTL_FILESTAT: { + sqlite3_str *pStr = (sqlite3_str*)pArg; + char aLck[16]; + unixInodeInfo *pInode; + static const char *azLock[] = { "SHARED", "RESERVED", + "PENDING", "EXCLUSIVE" }; + sqlite3_str_appendf(pStr, "{\"h\":%d", pFile->h); + sqlite3_str_appendf(pStr, ",\"vfs\":\"%s\"", pFile->pVfs->zName); + if( pFile->eFileLock ){ + sqlite3_str_appendf(pStr, ",\"eFileLock\":\"%s\"", + azLock[pFile->eFileLock-1]); + if( unixPosixAdvisoryLocks(pFile->h, aLck)==SQLITE_OK ){ + sqlite3_str_appendf(pStr, ",\"pal\":\"%s\"", aLck); + } + } + unixEnterMutex(); + if( pFile->pShm ){ + sqlite3_str_appendall(pStr, ",\"shm\":"); + unixDescribeShm(pStr, pFile->pShm); + } +#if SQLITE_MAX_MMAP_SIZE>0 + if( pFile->mmapSize ){ + sqlite3_str_appendf(pStr, ",\"mmapSize\":%lld", pFile->mmapSize); + sqlite3_str_appendf(pStr, ",\"nFetchOut\":%d", pFile->nFetchOut); + } +#endif + if( (pInode = pFile->pInode)!=0 ){ + sqlite3_str_appendf(pStr, ",\"inode\":{\"nRef\":%d",pInode->nRef); + sqlite3_mutex_enter(pInode->pLockMutex); + sqlite3_str_appendf(pStr, ",\"nShared\":%d", pInode->nShared); + if( pInode->eFileLock ){ + sqlite3_str_appendf(pStr, ",\"eFileLock\":\"%s\"", + azLock[pInode->eFileLock-1]); + } + if( pInode->pUnused ){ + char cSep = '['; + UnixUnusedFd *pUFd = pFile->pInode->pUnused; + sqlite3_str_appendall(pStr, ",\"unusedFd\":"); + while( pUFd ){ + sqlite3_str_appendf(pStr, "%c{\"fd\":%d,\"flags\":%d", + cSep, pUFd->fd, pUFd->flags); + cSep = ','; + if( unixPosixAdvisoryLocks(pUFd->fd, aLck)==SQLITE_OK ){ + sqlite3_str_appendf(pStr, ",\"pal\":\"%s\"", aLck); + } + sqlite3_str_append(pStr, "}", 1); + pUFd = pUFd->pNext; + } + sqlite3_str_append(pStr, "]", 1); + } + sqlite3_mutex_leave(pInode->pLockMutex); + sqlite3_str_append(pStr, "}", 1); + } + unixLeaveMutex(); + sqlite3_str_append(pStr, "}", 1); + return SQLITE_OK; + } +#endif /* SQLITE_DEBUG || SQLITE_ENABLE_FILESTAT */ } return SQLITE_NOTFOUND; } @@ -43224,6 +43796,26 @@ struct unixShm { #define UNIX_SHM_BASE ((22+SQLITE_SHM_NLOCK)*4) /* first lock byte */ #define UNIX_SHM_DMS (UNIX_SHM_BASE+SQLITE_SHM_NLOCK) /* deadman switch */ +#if defined(SQLITE_DEBUG) || defined(SQLITE_ENABLE_FILESTAT) +/* +** Describe the pShm object using JSON. Used for diagnostics only. +*/ +static void unixDescribeShm(sqlite3_str *pStr, unixShm *pShm){ + unixShmNode *pNode = pShm->pShmNode; + char aLck[16]; + sqlite3_str_appendf(pStr, "{\"h\":%d", pNode->hShm); + assert( unixMutexHeld() ); + sqlite3_str_appendf(pStr, ",\"nRef\":%d", pNode->nRef); + sqlite3_str_appendf(pStr, ",\"id\":%d", pShm->id); + sqlite3_str_appendf(pStr, ",\"sharedMask\":%d", pShm->sharedMask); + sqlite3_str_appendf(pStr, ",\"exclMask\":%d", pShm->exclMask); + if( unixPosixAdvisoryLocks(pNode->hShm, aLck)==SQLITE_OK ){ + sqlite3_str_appendf(pStr, ",\"pal\":\"%s\"", aLck); + } + sqlite3_str_append(pStr, "}", 1); +} +#endif /* SQLITE_DEBUG || SQLITE_ENABLE_FILESTAT */ + /* ** Use F_GETLK to check whether or not there are any readers with open ** wal-mode transactions in other processes on database file pFile. If @@ -43257,6 +43849,49 @@ static int unixFcntlExternalReader(unixFile *pFile, int *piOut){ return rc; } +/* +** If pFile has a -shm file open and it is sharing that file with some +** other connection, either in the same process or in a separate process, +** then return true. Return false if either pFile does not have a -shm +** file open or if it is the only connection to that -shm file across the +** entire system. +** +** This routine is not required for correct operation. It can always return +** false and SQLite will continue to operate according to spec. However, +** when this routine does its job, it adds extra robustness in cases +** where database file locks have been erroneously deleted in a WAL-mode +** database by doing close(open(DATABASE_PATHNAME)) or similar. +** +** With false negatives, SQLite still operates to spec, though with less +** robustness. With false positives, the last database connection on a +** WAL-mode database will fail to unlink the -wal and -shm files, which +** is annoying but harmless. False positives will also prevent a database +** connection from running "PRAGMA journal_mode=DELETE" in order to take +** the database out of WAL mode, which is perhaps more serious, but is +** still not a disaster. +*/ +static int unixIsSharingShmNode(unixFile *pFile){ + int rc; + unixShmNode *pShmNode; + if( pFile->pShm==0 ) return 0; + if( pFile->ctrlFlags & UNIXFILE_EXCL ) return 0; + pShmNode = pFile->pShm->pShmNode; + rc = 1; + unixEnterMutex(); + if( ALWAYS(pShmNode->nRef==1) ){ + struct flock lock; + lock.l_whence = SEEK_SET; + lock.l_start = UNIX_SHM_DMS; + lock.l_len = 1; + lock.l_type = F_WRLCK; + osFcntl(pShmNode->hShm, F_GETLK, &lock); + if( lock.l_type==F_UNLCK ){ + rc = 0; + } + } + unixLeaveMutex(); + return rc; +} /* ** Apply posix advisory locks for all bytes from ofst through ofst+n-1. @@ -43302,7 +43937,8 @@ static int unixShmSystemLock( /* Locks are within range */ assert( n>=1 && n<=SQLITE_SHM_NLOCK ); - assert( ofst>=UNIX_SHM_BASE && ofst<=(UNIX_SHM_DMS+SQLITE_SHM_NLOCK) ); + assert( ofst>=UNIX_SHM_BASE && ofst<=UNIX_SHM_DMS ); + assert( ofst+n-1<=UNIX_SHM_DMS ); if( pShmNode->hShm>=0 ){ int res; @@ -43834,7 +44470,7 @@ static int assertLockingArrayOk(unixShmNode *pShmNode){ return (memcmp(pShmNode->aLock, aLock, sizeof(aLock))==0); #endif } -#endif +#endif /* !defined(SQLITE_WASI) && !defined(SQLITE_OMIT_WAL) */ /* ** Change the lock state for a shared-memory segment. @@ -44796,10 +45432,17 @@ static int fillInUnixFile( storeLastErrno(pNew, 0); #if OS_VXWORKS if( rc!=SQLITE_OK ){ - if( h>=0 ) robust_close(pNew, h, __LINE__); - h = -1; - osUnlink(zFilename); - pNew->ctrlFlags |= UNIXFILE_DELETE; + if( h>=0 ){ + robust_close(pNew, h, __LINE__); + h = -1; + } + if( pNew->ctrlFlags & UNIXFILE_DELETE ){ + osUnlink(zFilename); + } + if( pNew->pId ){ + vxworksReleaseFileId(pNew->pId); + pNew->pId = 0; + } } #endif if( rc!=SQLITE_OK ){ @@ -44843,6 +45486,9 @@ static const char *unixTempFileDir(void){ while(1){ if( zDir!=0 +#if OS_VXWORKS + && zDir[0]=='/' +#endif && osStat(zDir, &buf)==0 && S_ISDIR(buf.st_mode) && osAccess(zDir, 03)==0 @@ -45157,6 +45803,12 @@ static int unixOpen( || eType==SQLITE_OPEN_TRANSIENT_DB || eType==SQLITE_OPEN_WAL ); +#if OS_VXWORKS + /* The file-ID mechanism used in Vxworks requires that all pathnames + ** provided to unixOpen must be absolute pathnames. */ + if( zPath!=0 && zPath[0]!='/' ){ return SQLITE_CANTOPEN; } +#endif + /* Detect a pid change and reset the PRNG. There is a race condition ** here such that two or more threads all trying to open databases at ** the same instant might all reset the PRNG. But multiple resets @@ -45357,8 +46009,11 @@ static int unixOpen( } #endif - assert( zPath==0 || zPath[0]=='/' - || eType==SQLITE_OPEN_SUPER_JOURNAL || eType==SQLITE_OPEN_MAIN_JOURNAL + assert( zPath==0 + || zPath[0]=='/' + || eType==SQLITE_OPEN_SUPER_JOURNAL + || eType==SQLITE_OPEN_MAIN_JOURNAL + || eType==SQLITE_OPEN_TEMP_JOURNAL ); rc = fillInUnixFile(pVfs, fd, pFile, zPath, ctrlFlags); @@ -47087,6 +47742,9 @@ SQLITE_API int sqlite3_os_init(void){ sqlite3KvvfsInit(); #endif unixBigLock = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1); +#if OS_VXWORKS + vxworksMutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS2); +#endif #ifndef SQLITE_OMIT_WAL /* Validate lock assumptions */ @@ -47121,6 +47779,9 @@ SQLITE_API int sqlite3_os_init(void){ */ SQLITE_API int sqlite3_os_end(void){ unixBigLock = 0; +#if OS_VXWORKS + vxworksMutex = 0; +#endif return SQLITE_OK; } @@ -49793,6 +50454,7 @@ static BOOL winLockFile( #endif } +#ifndef SQLITE_OMIT_WAL /* ** Lock a region of nByte bytes starting at offset offset of file hFile. ** Take an EXCLUSIVE lock if parameter bExclusive is true, or a SHARED lock @@ -49875,6 +50537,7 @@ static int winHandleLockTimeout( } return rc; } +#endif /* #ifndef SQLITE_OMIT_WAL */ /* ** Unlock a file region. @@ -49909,6 +50572,7 @@ static BOOL winUnlockFile( #endif } +#ifndef SQLITE_OMIT_WAL /* ** Remove an nByte lock starting at offset iOff from HANDLE h. */ @@ -49916,6 +50580,7 @@ static int winHandleUnlock(HANDLE h, int iOff, int nByte){ BOOL ret = winUnlockFile(&h, iOff, 0, nByte, 0); return (ret ? SQLITE_OK : SQLITE_IOERR_UNLOCK); } +#endif /***************************************************************************** ** The next group of routines implement the I/O methods specified @@ -50253,6 +50918,7 @@ static int winWrite( return SQLITE_OK; } +#ifndef SQLITE_OMIT_WAL /* ** Truncate the file opened by handle h to nByte bytes in size. */ @@ -50306,6 +50972,7 @@ static void winHandleClose(HANDLE h){ osCloseHandle(h); } } +#endif /* #ifndef SQLITE_OMIT_WAL */ /* ** Truncate an open file to a specified size @@ -51083,6 +51750,28 @@ static int winFileControl(sqlite3_file *id, int op, void *pArg){ } #endif /* SQLITE_ENABLE_SETLK_TIMEOUT */ +#if defined(SQLITE_DEBUG) || defined(SQLITE_ENABLE_FILESTAT) + case SQLITE_FCNTL_FILESTAT: { + sqlite3_str *pStr = (sqlite3_str*)pArg; + sqlite3_str_appendf(pStr, "{\"h\":%llu", (sqlite3_uint64)pFile->h); + sqlite3_str_appendf(pStr, ",\"vfs\":\"%s\"", pFile->pVfs->zName); + if( pFile->locktype ){ + static const char *azLock[] = { "SHARED", "RESERVED", + "PENDING", "EXCLUSIVE" }; + sqlite3_str_appendf(pStr, ",\"locktype\":\"%s\"", + azLock[pFile->locktype-1]); + } +#if SQLITE_MAX_MMAP_SIZE>0 + if( pFile->mmapSize ){ + sqlite3_str_appendf(pStr, ",\"mmapSize\":%lld", pFile->mmapSize); + sqlite3_str_appendf(pStr, ",\"nFetchOut\":%d", pFile->nFetchOut); + } +#endif + sqlite3_str_append(pStr, "}", 1); + return SQLITE_OK; + } +#endif /* SQLITE_DEBUG || SQLITE_ENABLE_FILESTAT */ + } OSTRACE(("FCNTL file=%p, rc=SQLITE_NOTFOUND\n", pFile->h)); return SQLITE_NOTFOUND; @@ -51120,6 +51809,103 @@ static int winDeviceCharacteristics(sqlite3_file *id){ */ static SYSTEM_INFO winSysInfo; +/* +** Convert a UTF-8 filename into whatever form the underlying +** operating system wants filenames in. Space to hold the result +** is obtained from malloc and must be freed by the calling +** function +** +** On Cygwin, 3 possible input forms are accepted: +** - If the filename starts with ":/" or ":\", +** it is converted to UTF-16 as-is. +** - If the filename contains '/', it is assumed to be a +** Cygwin absolute path, it is converted to a win32 +** absolute path in UTF-16. +** - Otherwise it must be a filename only, the win32 filename +** is returned in UTF-16. +** Note: If the function cygwin_conv_path() fails, only +** UTF-8 -> UTF-16 conversion will be done. This can only +** happen when the file path >32k, in which case winUtf8ToUnicode() +** will fail too. +*/ +static void *winConvertFromUtf8Filename(const char *zFilename){ + void *zConverted = 0; + if( osIsNT() ){ +#ifdef __CYGWIN__ + int nChar; + LPWSTR zWideFilename; + + if( osCygwin_conv_path && !(winIsDriveLetterAndColon(zFilename) + && winIsDirSep(zFilename[2])) ){ + i64 nByte; + int convertflag = CCP_POSIX_TO_WIN_W; + if( !strchr(zFilename, '/') ) convertflag |= CCP_RELATIVE; + nByte = (i64)osCygwin_conv_path(convertflag, + zFilename, 0, 0); + if( nByte>0 ){ + zConverted = sqlite3MallocZero(12+(u64)nByte); + if ( zConverted==0 ){ + return zConverted; + } + zWideFilename = zConverted; + /* Filenames should be prefixed, except when converted + * full path already starts with "\\?\". */ + if( osCygwin_conv_path(convertflag, zFilename, + zWideFilename+4, nByte)==0 ){ + if( (convertflag&CCP_RELATIVE) ){ + memmove(zWideFilename, zWideFilename+4, nByte); + }else if( memcmp(zWideFilename+4, L"\\\\", 4) ){ + memcpy(zWideFilename, L"\\\\?\\", 8); + }else if( zWideFilename[6]!='?' ){ + memmove(zWideFilename+6, zWideFilename+4, nByte); + memcpy(zWideFilename, L"\\\\?\\UNC", 14); + }else{ + memmove(zWideFilename, zWideFilename+4, nByte); + } + return zConverted; + } + sqlite3_free(zConverted); + } + } + nChar = osMultiByteToWideChar(CP_UTF8, 0, zFilename, -1, NULL, 0); + if( nChar==0 ){ + return 0; + } + zWideFilename = sqlite3MallocZero( nChar*sizeof(WCHAR)+12 ); + if( zWideFilename==0 ){ + return 0; + } + nChar = osMultiByteToWideChar(CP_UTF8, 0, zFilename, -1, + zWideFilename, nChar); + if( nChar==0 ){ + sqlite3_free(zWideFilename); + zWideFilename = 0; + }else if( nChar>MAX_PATH + && winIsDriveLetterAndColon(zFilename) + && winIsDirSep(zFilename[2]) ){ + memmove(zWideFilename+4, zWideFilename, nChar*sizeof(WCHAR)); + zWideFilename[2] = '\\'; + memcpy(zWideFilename, L"\\\\?\\", 8); + }else if( nChar>MAX_PATH + && winIsDirSep(zFilename[0]) && winIsDirSep(zFilename[1]) + && zFilename[2] != '?' ){ + memmove(zWideFilename+6, zWideFilename, nChar*sizeof(WCHAR)); + memcpy(zWideFilename, L"\\\\?\\UNC", 14); + } + zConverted = zWideFilename; +#else + zConverted = winUtf8ToUnicode(zFilename); +#endif /* __CYGWIN__ */ + } +#if defined(SQLITE_WIN32_HAS_ANSI) && defined(_WIN32) + else{ + zConverted = winUtf8ToMbcs(zFilename, osAreFileApisANSI()); + } +#endif + /* caller will handle out of memory */ + return zConverted; +} + #ifndef SQLITE_OMIT_WAL /* @@ -51156,29 +51942,35 @@ static int winShmMutexHeld(void) { ** log-summary is opened only once per process. ** ** winShmMutexHeld() must be true when creating or destroying -** this object or while reading or writing the following fields: +** this object, or while editing the global linked list that starts +** at winShmNodeList. ** -** nRef -** pNext +** When reading or writing the linked list starting at winShmNode.pWinShmList, +** pShmNode->mutex must be held. ** -** The following fields are read-only after the object is created: +** The following fields are constant after the object is created: ** ** zFilename +** hSharedShm +** mutex +** bUseSharedLockHandle ** -** Either winShmNode.mutex must be held or winShmNode.nRef==0 and +** Either winShmNode.mutex must be held or winShmNode.pWinShmList==0 and ** winShmMutexHeld() is true when reading or writing any other field ** in this structure. ** -** File-handle hSharedShm is used to (a) take the DMS lock, (b) truncate -** the *-shm file if the DMS-locking protocol demands it, and (c) map -** regions of the *-shm file into memory using MapViewOfFile() or -** similar. Other locks are taken by individual clients using the -** winShm.hShm handles. +** File-handle hSharedShm is always used to (a) take the DMS lock, (b) +** truncate the *-shm file if the DMS-locking protocol demands it, and +** (c) map regions of the *-shm file into memory using MapViewOfFile() +** or similar. If bUseSharedLockHandle is true, then other locks are also +** taken on hSharedShm. Or, if bUseSharedLockHandle is false, then other +** locks are taken using each connection's winShm.hShm handles. */ struct winShmNode { sqlite3_mutex *mutex; /* Mutex to access this object */ char *zFilename; /* Name of the file */ HANDLE hSharedShm; /* File handle open on zFilename */ + int bUseSharedLockHandle; /* True to use hSharedShm for everything */ int isUnlocked; /* DMS lock has not yet been obtained */ int isReadonly; /* True if read-only */ @@ -51191,7 +51983,8 @@ struct winShmNode { } *aRegion; DWORD lastErrno; /* The Windows errno from the last I/O error */ - int nRef; /* Number of winShm objects pointing to this */ + winShm *pWinShmList; /* List of winShm objects with ptrs to this */ + winShmNode *pNext; /* Next in list of all winShmNode objects */ #if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE) u8 nextShmId; /* Next available winShm.id value */ @@ -51219,6 +52012,7 @@ struct winShm { #if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE) u8 id; /* Id of this connection with its winShmNode */ #endif + winShm *pWinShmNext; /* Next winShm object on same winShmNode */ }; /* @@ -51232,7 +52026,7 @@ static int winOpen(sqlite3_vfs*,const char*,sqlite3_file*,int,int*); static int winDelete(sqlite3_vfs *,const char*,int); /* -** Purge the winShmNodeList list of all entries with winShmNode.nRef==0. +** Purge the winShmNodeList list of all entries with winShmNode.pWinShmList==0. ** ** This is not a VFS shared-memory method; it is a utility function called ** by VFS shared-memory methods. @@ -51245,7 +52039,7 @@ static void winShmPurge(sqlite3_vfs *pVfs, int deleteFlag){ osGetCurrentProcessId(), deleteFlag)); pp = &winShmNodeList; while( (p = *pp)!=0 ){ - if( p->nRef==0 ){ + if( p->pWinShmList==0 ){ int i; if( p->mutex ){ sqlite3_mutex_free(p->mutex); } for(i=0; inRegion; i++){ @@ -51314,103 +52108,6 @@ static int winLockSharedMemory(winShmNode *pShmNode, DWORD nMs){ } -/* -** Convert a UTF-8 filename into whatever form the underlying -** operating system wants filenames in. Space to hold the result -** is obtained from malloc and must be freed by the calling -** function -** -** On Cygwin, 3 possible input forms are accepted: -** - If the filename starts with ":/" or ":\", -** it is converted to UTF-16 as-is. -** - If the filename contains '/', it is assumed to be a -** Cygwin absolute path, it is converted to a win32 -** absolute path in UTF-16. -** - Otherwise it must be a filename only, the win32 filename -** is returned in UTF-16. -** Note: If the function cygwin_conv_path() fails, only -** UTF-8 -> UTF-16 conversion will be done. This can only -** happen when the file path >32k, in which case winUtf8ToUnicode() -** will fail too. -*/ -static void *winConvertFromUtf8Filename(const char *zFilename){ - void *zConverted = 0; - if( osIsNT() ){ -#ifdef __CYGWIN__ - int nChar; - LPWSTR zWideFilename; - - if( osCygwin_conv_path && !(winIsDriveLetterAndColon(zFilename) - && winIsDirSep(zFilename[2])) ){ - i64 nByte; - int convertflag = CCP_POSIX_TO_WIN_W; - if( !strchr(zFilename, '/') ) convertflag |= CCP_RELATIVE; - nByte = (i64)osCygwin_conv_path(convertflag, - zFilename, 0, 0); - if( nByte>0 ){ - zConverted = sqlite3MallocZero(12+(u64)nByte); - if ( zConverted==0 ){ - return zConverted; - } - zWideFilename = zConverted; - /* Filenames should be prefixed, except when converted - * full path already starts with "\\?\". */ - if( osCygwin_conv_path(convertflag, zFilename, - zWideFilename+4, nByte)==0 ){ - if( (convertflag&CCP_RELATIVE) ){ - memmove(zWideFilename, zWideFilename+4, nByte); - }else if( memcmp(zWideFilename+4, L"\\\\", 4) ){ - memcpy(zWideFilename, L"\\\\?\\", 8); - }else if( zWideFilename[6]!='?' ){ - memmove(zWideFilename+6, zWideFilename+4, nByte); - memcpy(zWideFilename, L"\\\\?\\UNC", 14); - }else{ - memmove(zWideFilename, zWideFilename+4, nByte); - } - return zConverted; - } - sqlite3_free(zConverted); - } - } - nChar = osMultiByteToWideChar(CP_UTF8, 0, zFilename, -1, NULL, 0); - if( nChar==0 ){ - return 0; - } - zWideFilename = sqlite3MallocZero( nChar*sizeof(WCHAR)+12 ); - if( zWideFilename==0 ){ - return 0; - } - nChar = osMultiByteToWideChar(CP_UTF8, 0, zFilename, -1, - zWideFilename, nChar); - if( nChar==0 ){ - sqlite3_free(zWideFilename); - zWideFilename = 0; - }else if( nChar>MAX_PATH - && winIsDriveLetterAndColon(zFilename) - && winIsDirSep(zFilename[2]) ){ - memmove(zWideFilename+4, zWideFilename, nChar*sizeof(WCHAR)); - zWideFilename[2] = '\\'; - memcpy(zWideFilename, L"\\\\?\\", 8); - }else if( nChar>MAX_PATH - && winIsDirSep(zFilename[0]) && winIsDirSep(zFilename[1]) - && zFilename[2] != '?' ){ - memmove(zWideFilename+6, zWideFilename, nChar*sizeof(WCHAR)); - memcpy(zWideFilename, L"\\\\?\\UNC", 14); - } - zConverted = zWideFilename; -#else - zConverted = winUtf8ToUnicode(zFilename); -#endif /* __CYGWIN__ */ - } -#if defined(SQLITE_WIN32_HAS_ANSI) && defined(_WIN32) - else{ - zConverted = winUtf8ToMbcs(zFilename, osAreFileApisANSI()); - } -#endif - /* caller will handle out of memory */ - return zConverted; -} - /* ** This function is used to open a handle on a *-shm file. ** @@ -51506,6 +52203,60 @@ static int winHandleOpen( return rc; } +/* +** Close pDbFd's connection to shared-memory. Delete the underlying +** *-shm file if deleteFlag is true. +*/ +static int winCloseSharedMemory(winFile *pDbFd, int deleteFlag){ + winShm *p; /* The connection to be closed */ + winShm **pp; /* Iterator for pShmNode->pWinShmList */ + winShmNode *pShmNode; /* The underlying shared-memory file */ + + p = pDbFd->pShm; + if( p==0 ) return SQLITE_OK; + if( p->hShm!=INVALID_HANDLE_VALUE ){ + osCloseHandle(p->hShm); + } + + winShmEnterMutex(); + pShmNode = p->pShmNode; + + /* Remove this connection from the winShmNode.pWinShmList list */ + sqlite3_mutex_enter(pShmNode->mutex); + for(pp=&pShmNode->pWinShmList; *pp!=p; pp=&(*pp)->pWinShmNext){} + *pp = p->pWinShmNext; + sqlite3_mutex_leave(pShmNode->mutex); + + winShmPurge(pDbFd->pVfs, deleteFlag); + winShmLeaveMutex(); + + /* Free the connection p */ + sqlite3_free(p); + pDbFd->pShm = 0; + return SQLITE_OK; +} + +/* +** testfixture builds may set this global variable to true via a +** Tcl interface. This forces the VFS to use the locking normally +** only used for UNC paths for all files. +*/ +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_win_test_unc_locking = 0; +#else +# define sqlite3_win_test_unc_locking 0 +#endif + +/* +** Return true if the string passed as the only argument is likely +** to be a UNC path. In other words, if it starts with "\\". +*/ +static int winIsUNCPath(const char *zFile){ + if( zFile[0]=='\\' && zFile[1]=='\\' ){ + return 1; + } + return sqlite3_win_test_unc_locking; +} /* ** Open the shared-memory area associated with database file pDbFd. @@ -51532,15 +52283,10 @@ static int winOpenSharedMemory(winFile *pDbFd){ pNew->zFilename = (char*)&pNew[1]; pNew->hSharedShm = INVALID_HANDLE_VALUE; pNew->isUnlocked = 1; + pNew->bUseSharedLockHandle = winIsUNCPath(pDbFd->zPath); sqlite3_snprintf(nName+15, pNew->zFilename, "%s-shm", pDbFd->zPath); sqlite3FileSuffix3(pDbFd->zPath, pNew->zFilename); - /* Open a file-handle on the *-shm file for this connection. This file-handle - ** is only used for locking. The mapping of the *-shm file is created using - ** the shared file handle in winShmNode.hSharedShm. */ - p->bReadonly = sqlite3_uri_boolean(pDbFd->zPath, "readonly_shm", 0); - rc = winHandleOpen(pNew->zFilename, &p->bReadonly, &p->hShm); - /* Look to see if there is an existing winShmNode that can be used. ** If no matching winShmNode currently exists, then create a new one. */ winShmEnterMutex(); @@ -51561,7 +52307,7 @@ static int winOpenSharedMemory(winFile *pDbFd){ /* Open a file-handle to use for mappings, and for the DMS lock. */ if( rc==SQLITE_OK ){ HANDLE h = INVALID_HANDLE_VALUE; - pShmNode->isReadonly = p->bReadonly; + pShmNode->isReadonly = sqlite3_uri_boolean(pDbFd->zPath,"readonly_shm",0); rc = winHandleOpen(pNew->zFilename, &pShmNode->isReadonly, &h); pShmNode->hSharedShm = h; } @@ -51583,20 +52329,35 @@ static int winOpenSharedMemory(winFile *pDbFd){ /* If no error has occurred, link the winShm object to the winShmNode and ** the winShm to pDbFd. */ if( rc==SQLITE_OK ){ + sqlite3_mutex_enter(pShmNode->mutex); p->pShmNode = pShmNode; - pShmNode->nRef++; + p->pWinShmNext = pShmNode->pWinShmList; + pShmNode->pWinShmList = p; #if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE) p->id = pShmNode->nextShmId++; #endif pDbFd->pShm = p; + sqlite3_mutex_leave(pShmNode->mutex); }else if( p ){ - winHandleClose(p->hShm); sqlite3_free(p); } assert( rc!=SQLITE_OK || pShmNode->isUnlocked==0 || pShmNode->nRegion==0 ); winShmLeaveMutex(); sqlite3_free(pNew); + + /* Open a file-handle on the *-shm file for this connection. This file-handle + ** is only used for locking. The mapping of the *-shm file is created using + ** the shared file handle in winShmNode.hSharedShm. */ + if( rc==SQLITE_OK && pShmNode->bUseSharedLockHandle==0 ){ + p->bReadonly = sqlite3_uri_boolean(pDbFd->zPath, "readonly_shm", 0); + rc = winHandleOpen(pShmNode->zFilename, &p->bReadonly, &p->hShm); + if( rc!=SQLITE_OK ){ + assert( p->hShm==INVALID_HANDLE_VALUE ); + winCloseSharedMemory(pDbFd, 0); + } + } + return rc; } @@ -51608,33 +52369,7 @@ static int winShmUnmap( sqlite3_file *fd, /* Database holding shared memory */ int deleteFlag /* Delete after closing if true */ ){ - winFile *pDbFd; /* Database holding shared-memory */ - winShm *p; /* The connection to be closed */ - winShmNode *pShmNode; /* The underlying shared-memory file */ - - pDbFd = (winFile*)fd; - p = pDbFd->pShm; - if( p==0 ) return SQLITE_OK; - if( p->hShm!=INVALID_HANDLE_VALUE ){ - osCloseHandle(p->hShm); - } - - pShmNode = p->pShmNode; - winShmEnterMutex(); - - /* If pShmNode->nRef has reached 0, then close the underlying - ** shared-memory file, too. */ - assert( pShmNode->nRef>0 ); - pShmNode->nRef--; - if( pShmNode->nRef==0 ){ - winShmPurge(pDbFd->pVfs, deleteFlag); - } - winShmLeaveMutex(); - - /* Free the connection p */ - sqlite3_free(p); - pDbFd->pShm = 0; - return SQLITE_OK; + return winCloseSharedMemory((winFile*)fd, deleteFlag); } /* @@ -51703,6 +52438,7 @@ static int winShmLock( || (flags==(SQLITE_SHM_SHARED|SQLITE_SHM_LOCK) && 0==(p->sharedMask & mask)) || (flags==(SQLITE_SHM_EXCLUSIVE|SQLITE_SHM_LOCK)) ){ + HANDLE h = p->hShm; if( flags & SQLITE_SHM_UNLOCK ){ /* Case (a) - unlock. */ @@ -51711,7 +52447,27 @@ static int winShmLock( assert( !(flags & SQLITE_SHM_EXCLUSIVE) || (p->exclMask & mask)==mask ); assert( !(flags & SQLITE_SHM_SHARED) || (p->sharedMask & mask)==mask ); - rc = winHandleUnlock(p->hShm, ofst+WIN_SHM_BASE, n); + assert( !(flags & SQLITE_SHM_SHARED) || n==1 ); + if( pShmNode->bUseSharedLockHandle ){ + h = pShmNode->hSharedShm; + if( flags & SQLITE_SHM_SHARED ){ + winShm *pShm; + sqlite3_mutex_enter(pShmNode->mutex); + for(pShm=pShmNode->pWinShmList; pShm; pShm=pShm->pWinShmNext){ + if( pShm!=p && (pShm->sharedMask & mask) ){ + /* Another connection within this process is also holding this + ** SHARED lock. So do not actually release the OS lock. */ + h = INVALID_HANDLE_VALUE; + break; + } + } + sqlite3_mutex_leave(pShmNode->mutex); + } + } + + if( h!=INVALID_HANDLE_VALUE ){ + rc = winHandleUnlock(h, ofst+WIN_SHM_BASE, n); + } /* If successful, also clear the bits in sharedMask/exclMask */ if( rc==SQLITE_OK ){ @@ -51721,7 +52477,32 @@ static int winShmLock( }else{ int bExcl = ((flags & SQLITE_SHM_EXCLUSIVE) ? 1 : 0); DWORD nMs = winFileBusyTimeout(pDbFd); - rc = winHandleLockTimeout(p->hShm, ofst+WIN_SHM_BASE, n, bExcl, nMs); + + if( pShmNode->bUseSharedLockHandle ){ + winShm *pShm; + h = pShmNode->hSharedShm; + sqlite3_mutex_enter(pShmNode->mutex); + for(pShm=pShmNode->pWinShmList; pShm; pShm=pShm->pWinShmNext){ + if( bExcl ){ + if( (pShm->sharedMask|pShm->exclMask) & mask ){ + rc = SQLITE_BUSY; + h = INVALID_HANDLE_VALUE; + } + }else{ + if( pShm->sharedMask & mask ){ + h = INVALID_HANDLE_VALUE; + }else if( pShm->exclMask & mask ){ + rc = SQLITE_BUSY; + h = INVALID_HANDLE_VALUE; + } + } + } + sqlite3_mutex_leave(pShmNode->mutex); + } + + if( h!=INVALID_HANDLE_VALUE ){ + rc = winHandleLockTimeout(h, ofst+WIN_SHM_BASE, n, bExcl, nMs); + } if( rc==SQLITE_OK ){ if( bExcl ){ p->exclMask = (p->exclMask | mask); @@ -54860,6 +55641,7 @@ struct Bitvec { } u; }; + /* ** Create a new bitmap object able to handle bits between 0 and iSize, ** inclusive. Return a pointer to the new object. Return NULL if @@ -55048,6 +55830,52 @@ SQLITE_PRIVATE u32 sqlite3BitvecSize(Bitvec *p){ return p->iSize; } +#ifdef SQLITE_DEBUG +/* +** Show the content of a Bitvec option and its children. Indent +** everything by n spaces. Add x to each bitvec value. +** +** From a debugger such as gdb, one can type: +** +** call sqlite3ShowBitvec(p) +** +** For some Bitvec p and see a recursive view of the Bitvec's content. +*/ +static void showBitvec(Bitvec *p, int n, unsigned x){ + int i; + if( p==0 ){ + printf("NULL\n"); + return; + } + printf("Bitvec 0x%p iSize=%u", p, p->iSize); + if( p->iSize<=BITVEC_NBIT ){ + printf(" bitmap\n"); + printf("%*s bits:", n, ""); + for(i=1; i<=BITVEC_NBIT; i++){ + if( sqlite3BitvecTest(p,i) ) printf(" %u", x+(unsigned)i); + } + printf("\n"); + }else if( p->iDivisor==0 ){ + printf(" hash with %u entries\n", p->nSet); + printf("%*s bits:", n, ""); + for(i=0; iu.aHash[i] ) printf(" %u", x+(unsigned)p->u.aHash[i]); + } + printf("\n"); + }else{ + printf(" sub-bitvec with iDivisor=%u\n", p->iDivisor); + for(i=0; iu.apSub[i]==0 ) continue; + printf("%*s apSub[%d]=", n, "", i); + showBitvec(p->u.apSub[i], n+4, i*p->iDivisor); + } + } +} +SQLITE_PRIVATE void sqlite3ShowBitvec(Bitvec *p){ + showBitvec(p, 0, 0); +} +#endif + #ifndef SQLITE_UNTESTABLE /* ** Let V[] be an array of unsigned characters sufficient to hold @@ -55059,6 +55887,7 @@ SQLITE_PRIVATE u32 sqlite3BitvecSize(Bitvec *p){ #define CLEARBIT(V,I) V[I>>3] &= ~(BITVEC_TELEM)(1<<(I&7)) #define TESTBIT(V,I) (V[I>>3]&(1<<(I&7)))!=0 + /* ** This routine runs an extensive test of the Bitvec code. ** @@ -55067,7 +55896,7 @@ SQLITE_PRIVATE u32 sqlite3BitvecSize(Bitvec *p){ ** by 0, 1, or 3 operands, depending on the opcode. Another ** opcode follows immediately after the last operand. ** -** There are 6 opcodes numbered from 0 through 5. 0 is the +** There are opcodes numbered starting with 0. 0 is the ** "halt" opcode and causes the test to end. ** ** 0 Halt and return the number of errors @@ -55076,18 +55905,25 @@ SQLITE_PRIVATE u32 sqlite3BitvecSize(Bitvec *p){ ** 3 N Set N randomly chosen bits ** 4 N Clear N randomly chosen bits ** 5 N S X Set N bits from S increment X in array only, not in bitvec +** 6 Invoice sqlite3ShowBitvec() on the Bitvec object so far +** 7 X Show compile-time parameters and the hash of X ** ** The opcodes 1 through 4 perform set and clear operations are performed ** on both a Bitvec object and on a linear array of bits obtained from malloc. ** Opcode 5 works on the linear array only, not on the Bitvec. ** Opcode 5 is used to deliberately induce a fault in order to -** confirm that error detection works. +** confirm that error detection works. Opcodes 6 and greater are +** state output opcodes. Opcodes 6 and greater are no-ops unless +** SQLite has been compiled with SQLITE_DEBUG. ** ** At the conclusion of the test the linear array is compared ** against the Bitvec object. If there are any differences, ** an error is returned. If they are the same, zero is returned. ** ** If a memory allocation error occurs, return -1. +** +** sz is the size of the Bitvec. Or if sz is negative, make the size +** 2*(unsigned)(-sz) and disabled the linear vector check. */ SQLITE_PRIVATE int sqlite3BitvecBuiltinTest(int sz, int *aOp){ Bitvec *pBitvec = 0; @@ -55098,10 +55934,15 @@ SQLITE_PRIVATE int sqlite3BitvecBuiltinTest(int sz, int *aOp){ /* Allocate the Bitvec to be tested and a linear array of ** bits to act as the reference */ - pBitvec = sqlite3BitvecCreate( sz ); - pV = sqlite3MallocZero( (7+(i64)sz)/8 + 1 ); + if( sz<=0 ){ + pBitvec = sqlite3BitvecCreate( 2*(unsigned)(-sz) ); + pV = 0; + }else{ + pBitvec = sqlite3BitvecCreate( sz ); + pV = sqlite3MallocZero( (7+(i64)sz)/8 + 1 ); + } pTmpSpace = sqlite3_malloc64(BITVEC_SZ); - if( pBitvec==0 || pV==0 || pTmpSpace==0 ) goto bitvec_end; + if( pBitvec==0 || pTmpSpace==0 || (pV==0 && sz>0) ) goto bitvec_end; /* NULL pBitvec tests */ sqlite3BitvecSet(0, 1); @@ -55110,6 +55951,24 @@ SQLITE_PRIVATE int sqlite3BitvecBuiltinTest(int sz, int *aOp){ /* Run the program */ pc = i = 0; while( (op = aOp[pc])!=0 ){ + if( op>=6 ){ +#ifdef SQLITE_DEBUG + if( op==6 ){ + sqlite3ShowBitvec(pBitvec); + }else if( op==7 ){ + printf("BITVEC_SZ = %d (%d by sizeof)\n", + BITVEC_SZ, (int)sizeof(Bitvec)); + printf("BITVEC_USIZE = %d\n", (int)BITVEC_USIZE); + printf("BITVEC_NELEM = %d\n", (int)BITVEC_NELEM); + printf("BITVEC_NBIT = %d\n", (int)BITVEC_NBIT); + printf("BITVEC_NINT = %d\n", (int)BITVEC_NINT); + printf("BITVEC_MXHASH = %d\n", (int)BITVEC_MXHASH); + printf("BITVEC_NPTR = %d\n", (int)BITVEC_NPTR); + } +#endif + pc++; + continue; + } switch( op ){ case 1: case 2: @@ -55131,12 +55990,12 @@ SQLITE_PRIVATE int sqlite3BitvecBuiltinTest(int sz, int *aOp){ pc += nx; i = (i & 0x7fffffff)%sz; if( (op & 1)!=0 ){ - SETBIT(pV, (i+1)); + if( pV ) SETBIT(pV, (i+1)); if( op!=5 ){ if( sqlite3BitvecSet(pBitvec, i+1) ) goto bitvec_end; } }else{ - CLEARBIT(pV, (i+1)); + if( pV ) CLEARBIT(pV, (i+1)); sqlite3BitvecClear(pBitvec, i+1, pTmpSpace); } } @@ -55146,14 +56005,18 @@ SQLITE_PRIVATE int sqlite3BitvecBuiltinTest(int sz, int *aOp){ ** match (rc==0). Change rc to non-zero if a discrepancy ** is found. */ - rc = sqlite3BitvecTest(0,0) + sqlite3BitvecTest(pBitvec, sz+1) - + sqlite3BitvecTest(pBitvec, 0) - + (sqlite3BitvecSize(pBitvec) - sz); - for(i=1; i<=sz; i++){ - if( (TESTBIT(pV,i))!=sqlite3BitvecTest(pBitvec,i) ){ - rc = i; - break; + if( pV ){ + rc = sqlite3BitvecTest(0,0) + sqlite3BitvecTest(pBitvec, sz+1) + + sqlite3BitvecTest(pBitvec, 0) + + (sqlite3BitvecSize(pBitvec) - sz); + for(i=1; i<=sz; i++){ + if( (TESTBIT(pV,i))!=sqlite3BitvecTest(pBitvec,i) ){ + rc = i; + break; + } } + }else{ + rc = 0; } /* Free allocated structure */ @@ -59914,7 +60777,7 @@ static void pager_unlock(Pager *pPager){ ** have sqlite3WalEndReadTransaction() drop the write-lock, as it once ** did, because this would break "BEGIN EXCLUSIVE" handling for ** SQLITE_ENABLE_SETLK_TIMEOUT builds. */ - sqlite3WalEndWriteTransaction(pPager->pWal); + (void)sqlite3WalEndWriteTransaction(pPager->pWal); } sqlite3WalEndReadTransaction(pPager->pWal); pPager->eState = PAGER_OPEN; @@ -61670,14 +62533,27 @@ SQLITE_PRIVATE void sqlite3PagerSetFlags( unsigned pgFlags /* Various flags */ ){ unsigned level = pgFlags & PAGER_SYNCHRONOUS_MASK; - if( pPager->tempFile ){ + if( pPager->tempFile || level==PAGER_SYNCHRONOUS_OFF ){ pPager->noSync = 1; pPager->fullSync = 0; pPager->extraSync = 0; }else{ - pPager->noSync = level==PAGER_SYNCHRONOUS_OFF ?1:0; + pPager->noSync = 0; pPager->fullSync = level>=PAGER_SYNCHRONOUS_FULL ?1:0; - pPager->extraSync = level==PAGER_SYNCHRONOUS_EXTRA ?1:0; + + /* Set Pager.extraSync if "PRAGMA synchronous=EXTRA" is requested, or + ** if the file-system supports F2FS style atomic writes. If this flag + ** is set, SQLite syncs the directory to disk immediately after deleting + ** a journal file in "PRAGMA journal_mode=DELETE" mode. */ + if( level==PAGER_SYNCHRONOUS_EXTRA +#ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE + || (sqlite3OsDeviceCharacteristics(pPager->fd) & SQLITE_IOCAP_BATCH_ATOMIC) +#endif + ){ + pPager->extraSync = 1; + }else{ + pPager->extraSync = 0; + } } if( pPager->noSync ){ pPager->syncFlags = 0; @@ -65570,7 +66446,7 @@ SQLITE_PRIVATE int sqlite3PagerCheckpoint( } if( pPager->pWal ){ rc = sqlite3WalCheckpoint(pPager->pWal, db, eMode, - (eMode==SQLITE_CHECKPOINT_PASSIVE ? 0 : pPager->xBusyHandler), + (eMode<=SQLITE_CHECKPOINT_PASSIVE ? 0 : pPager->xBusyHandler), pPager->pBusyHandlerArg, pPager->walSyncFlags, pPager->pageSize, (u8 *)pPager->pTmpSpace, pnLog, pnCkpt @@ -66480,7 +67356,7 @@ struct WalIterator { /* Size (in bytes) of a WalIterator object suitable for N or fewer segments */ #define SZ_WALITERATOR(N) \ - (offsetof(WalIterator,aSegment)*(N)*sizeof(struct WalSegment)) + (offsetof(WalIterator,aSegment)+(N)*sizeof(struct WalSegment)) /* ** Define the parameters of the hash tables in the wal-index file. There @@ -69366,7 +70242,7 @@ SQLITE_PRIVATE void sqlite3WalEndReadTransaction(Wal *pWal){ assert( pWal->writeLock==0 || pWal->readLock<0 ); #endif if( pWal->readLock>=0 ){ - sqlite3WalEndWriteTransaction(pWal); + (void)sqlite3WalEndWriteTransaction(pWal); walUnlockShared(pWal, WAL_READ_LOCK(pWal->readLock)); pWal->readLock = -1; } @@ -70175,7 +71051,8 @@ SQLITE_PRIVATE int sqlite3WalCheckpoint( /* EVIDENCE-OF: R-62920-47450 The busy-handler callback is never invoked ** in the SQLITE_CHECKPOINT_PASSIVE mode. */ - assert( eMode!=SQLITE_CHECKPOINT_PASSIVE || xBusy==0 ); + assert( SQLITE_CHECKPOINT_NOOPSQLITE_CHECKPOINT_PASSIVE || xBusy==0 ); if( pWal->readOnly ) return SQLITE_READONLY; WALTRACE(("WAL%p: checkpoint begins\n", pWal)); @@ -70192,31 +71069,35 @@ SQLITE_PRIVATE int sqlite3WalCheckpoint( ** EVIDENCE-OF: R-53820-33897 Even if there is a busy-handler configured, ** it will not be invoked in this case. */ - rc = walLockExclusive(pWal, WAL_CKPT_LOCK, 1); - testcase( rc==SQLITE_BUSY ); - testcase( rc!=SQLITE_OK && xBusy2!=0 ); - if( rc==SQLITE_OK ){ - pWal->ckptLock = 1; + if( eMode!=SQLITE_CHECKPOINT_NOOP ){ + rc = walLockExclusive(pWal, WAL_CKPT_LOCK, 1); + testcase( rc==SQLITE_BUSY ); + testcase( rc!=SQLITE_OK && xBusy2!=0 ); + if( rc==SQLITE_OK ){ + pWal->ckptLock = 1; - /* IMPLEMENTATION-OF: R-59782-36818 The SQLITE_CHECKPOINT_FULL, RESTART and - ** TRUNCATE modes also obtain the exclusive "writer" lock on the database - ** file. - ** - ** EVIDENCE-OF: R-60642-04082 If the writer lock cannot be obtained - ** immediately, and a busy-handler is configured, it is invoked and the - ** writer lock retried until either the busy-handler returns 0 or the - ** lock is successfully obtained. - */ - if( eMode!=SQLITE_CHECKPOINT_PASSIVE ){ - rc = walBusyLock(pWal, xBusy2, pBusyArg, WAL_WRITE_LOCK, 1); - if( rc==SQLITE_OK ){ - pWal->writeLock = 1; - }else if( rc==SQLITE_BUSY ){ - eMode2 = SQLITE_CHECKPOINT_PASSIVE; - xBusy2 = 0; - rc = SQLITE_OK; + /* IMPLEMENTATION-OF: R-59782-36818 The SQLITE_CHECKPOINT_FULL, RESTART + ** and TRUNCATE modes also obtain the exclusive "writer" lock on the + ** database file. + ** + ** EVIDENCE-OF: R-60642-04082 If the writer lock cannot be obtained + ** immediately, and a busy-handler is configured, it is invoked and the + ** writer lock retried until either the busy-handler returns 0 or the + ** lock is successfully obtained. + */ + if( eMode!=SQLITE_CHECKPOINT_PASSIVE ){ + rc = walBusyLock(pWal, xBusy2, pBusyArg, WAL_WRITE_LOCK, 1); + if( rc==SQLITE_OK ){ + pWal->writeLock = 1; + }else if( rc==SQLITE_BUSY ){ + eMode2 = SQLITE_CHECKPOINT_PASSIVE; + xBusy2 = 0; + rc = SQLITE_OK; + } } } + }else{ + rc = SQLITE_OK; } @@ -70230,7 +71111,7 @@ SQLITE_PRIVATE int sqlite3WalCheckpoint( ** immediately and do a partial checkpoint if it cannot obtain it. */ walDisableBlocking(pWal); rc = walIndexReadHdr(pWal, &isChanged); - if( eMode2!=SQLITE_CHECKPOINT_PASSIVE ) (void)walEnableBlocking(pWal); + if( eMode2>SQLITE_CHECKPOINT_PASSIVE ) (void)walEnableBlocking(pWal); if( isChanged && pWal->pDbFd->pMethods->iVersion>=3 ){ sqlite3OsUnfetch(pWal->pDbFd, 0, 0); } @@ -70240,7 +71121,7 @@ SQLITE_PRIVATE int sqlite3WalCheckpoint( if( rc==SQLITE_OK ){ if( pWal->hdr.mxFrame && walPagesize(pWal)!=nBuf ){ rc = SQLITE_CORRUPT_BKPT; - }else{ + }else if( eMode2!=SQLITE_CHECKPOINT_NOOP ){ rc = walCheckpoint(pWal, db, eMode2, xBusy2, pBusyArg, sync_flags,zBuf); } @@ -70268,7 +71149,7 @@ SQLITE_PRIVATE int sqlite3WalCheckpoint( sqlite3WalDb(pWal, 0); /* Release the locks. */ - sqlite3WalEndWriteTransaction(pWal); + (void)sqlite3WalEndWriteTransaction(pWal); if( pWal->ckptLock ){ walUnlockExclusive(pWal, WAL_CKPT_LOCK, 1); pWal->ckptLock = 0; @@ -72425,7 +73306,7 @@ static int btreeMoveto( assert( nKey==(i64)(int)nKey ); pIdxKey = sqlite3VdbeAllocUnpackedRecord(pKeyInfo); if( pIdxKey==0 ) return SQLITE_NOMEM_BKPT; - sqlite3VdbeRecordUnpack(pKeyInfo, (int)nKey, pKey, pIdxKey); + sqlite3VdbeRecordUnpack((int)nKey, pKey, pIdxKey); if( pIdxKey->nField==0 || pIdxKey->nField>pKeyInfo->nAllField ){ rc = SQLITE_CORRUPT_BKPT; }else{ @@ -73482,10 +74363,10 @@ static int freeSpace(MemPage *pPage, int iStart, int iSize){ assert( pPage->pBt!=0 ); assert( sqlite3PagerIswriteable(pPage->pDbPage) ); assert( CORRUPT_DB || iStart>=pPage->hdrOffset+6+pPage->childPtrSize ); - assert( CORRUPT_DB || iEnd <= pPage->pBt->usableSize ); + assert( CORRUPT_DB || iEnd <= (int)pPage->pBt->usableSize ); assert( sqlite3_mutex_held(pPage->pBt->mutex) ); assert( iSize>=4 ); /* Minimum cell size is 4 */ - assert( CORRUPT_DB || iStart<=pPage->pBt->usableSize-4 ); + assert( CORRUPT_DB || iStart<=(int)pPage->pBt->usableSize-4 ); /* The list of freeblocks must be in ascending order. Find the ** spot on the list where iStart should be inserted. @@ -74409,6 +75290,7 @@ static int removeFromSharingList(BtShared *pBt){ sqlite3_mutex_leave(pMainMtx); return removed; #else + UNUSED_PARAMETER( pBt ); return 1; #endif } @@ -74626,6 +75508,10 @@ SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree *p, int pageSize, int nReserve, sqlite3BtreeEnter(p); pBt->nReserveWanted = (u8)nReserve; x = pBt->pageSize - pBt->usableSize; + if( x==nReserve && (pageSize==0 || (u32)pageSize==pBt->pageSize) ){ + sqlite3BtreeLeave(p); + return SQLITE_OK; + } if( nReservebtsFlags & BTS_PAGESIZE_FIXED ){ sqlite3BtreeLeave(p); @@ -77215,6 +78101,30 @@ SQLITE_PRIVATE int sqlite3BtreeFirst(BtCursor *pCur, int *pRes){ return rc; } +/* Set *pRes to 1 (true) if the BTree pointed to by cursor pCur contains zero +** rows of content. Set *pRes to 0 (false) if the table contains content. +** Return SQLITE_OK on success or some error code (ex: SQLITE_NOMEM) if +** something goes wrong. +*/ +SQLITE_PRIVATE int sqlite3BtreeIsEmpty(BtCursor *pCur, int *pRes){ + int rc; + + assert( cursorOwnsBtShared(pCur) ); + assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); + if( pCur->eState==CURSOR_VALID ){ + *pRes = 0; + return SQLITE_OK; + } + rc = moveToRoot(pCur); + if( rc==SQLITE_EMPTY ){ + *pRes = 1; + rc = SQLITE_OK; + }else{ + *pRes = 0; + } + return rc; +} + #ifdef SQLITE_DEBUG /* The cursors is CURSOR_VALID and has BTCF_AtLast set. Verify that ** this flags are true for a consistent database. @@ -77434,8 +78344,8 @@ SQLITE_PRIVATE int sqlite3BtreeTableMoveto( } /* -** Compare the "idx"-th cell on the page the cursor pCur is currently -** pointing to to pIdxKey using xRecordCompare. Return negative or +** Compare the "idx"-th cell on the page pPage against the key +** pointing to by pIdxKey using xRecordCompare. Return negative or ** zero if the cell is less than or equal pIdxKey. Return positive ** if unknown. ** @@ -77450,12 +78360,11 @@ SQLITE_PRIVATE int sqlite3BtreeTableMoveto( ** a positive value as that will cause the optimization to be skipped. */ static int indexCellCompare( - BtCursor *pCur, + MemPage *pPage, int idx, UnpackedRecord *pIdxKey, RecordCompare xRecordCompare ){ - MemPage *pPage = pCur->pPage; int c; int nCell; /* Size of the pCell cell in bytes */ u8 *pCell = findCellPastPtr(pPage, idx); @@ -77564,14 +78473,14 @@ SQLITE_PRIVATE int sqlite3BtreeIndexMoveto( ){ int c; if( pCur->ix==pCur->pPage->nCell-1 - && (c = indexCellCompare(pCur, pCur->ix, pIdxKey, xRecordCompare))<=0 + && (c = indexCellCompare(pCur->pPage,pCur->ix,pIdxKey,xRecordCompare))<=0 && pIdxKey->errCode==SQLITE_OK ){ *pRes = c; return SQLITE_OK; /* Cursor already pointing at the correct spot */ } if( pCur->iPage>0 - && indexCellCompare(pCur, 0, pIdxKey, xRecordCompare)<=0 + && indexCellCompare(pCur->pPage, 0, pIdxKey, xRecordCompare)<=0 && pIdxKey->errCode==SQLITE_OK ){ pCur->curFlags &= ~(BTCF_ValidOvfl|BTCF_AtLast); @@ -77788,7 +78697,7 @@ SQLITE_PRIVATE i64 sqlite3BtreeRowCountEst(BtCursor *pCur){ n = pCur->pPage->nCell; for(i=0; iiPage; i++){ - n *= pCur->apPage[i]->nCell; + n *= pCur->apPage[i]->nCell+1; } return n; } @@ -80245,7 +81154,12 @@ static int balance_nonroot( ** of the right-most new sibling page is set to the value that was ** originally in the same field of the right-most old sibling page. */ if( (pageFlags & PTF_LEAF)==0 && nOld!=nNew ){ - MemPage *pOld = (nNew>nOld ? apNew : apOld)[nOld-1]; + MemPage *pOld; + if( nNew>nOld ){ + pOld = apNew[nOld-1]; + }else{ + pOld = apOld[nOld-1]; + } memcpy(&apNew[nNew-1]->aData[8], &pOld->aData[8], 4); } @@ -82877,6 +83791,7 @@ SQLITE_PRIVATE void *sqlite3BtreeSchema(Btree *p, int nBytes, void(*xFree)(void */ SQLITE_PRIVATE int sqlite3BtreeSchemaLocked(Btree *p){ int rc; + UNUSED_PARAMETER(p); /* only used in DEBUG builds */ assert( sqlite3_mutex_held(p->db->mutex) ); sqlite3BtreeEnter(p); rc = querySharedCacheTableLock(p, SCHEMA_ROOT, READ_LOCK); @@ -85062,6 +85977,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr( if( sqlite3VdbeMemClearAndResize(pMem, (int)MAX(nAlloc,32)) ){ return SQLITE_NOMEM_BKPT; } + assert( pMem->z!=0 ); memcpy(pMem->z, z, nAlloc); }else{ sqlite3VdbeMemRelease(pMem); @@ -88889,10 +89805,12 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ if( 0==sqlite3Strlen30(sqlite3BtreeGetFilename(db->aDb[0].pBt)) || nTrans<=1 ){ - for(i=0; rc==SQLITE_OK && inDb; i++){ - Btree *pBt = db->aDb[i].pBt; - if( pBt ){ - rc = sqlite3BtreeCommitPhaseOne(pBt, 0); + if( needXcommit ){ + for(i=0; rc==SQLITE_OK && inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( sqlite3BtreeTxnState(pBt)>=SQLITE_TXN_WRITE ){ + rc = sqlite3BtreeCommitPhaseOne(pBt, 0); + } } } @@ -88903,7 +89821,9 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ */ for(i=0; rc==SQLITE_OK && inDb; i++){ Btree *pBt = db->aDb[i].pBt; - if( pBt ){ + int txn = sqlite3BtreeTxnState(pBt); + if( txn!=SQLITE_TXN_NONE ){ + assert( needXcommit || txn==SQLITE_TXN_READ ); rc = sqlite3BtreeCommitPhaseTwo(pBt, 0); } } @@ -89158,28 +90078,31 @@ SQLITE_PRIVATE int sqlite3VdbeCloseStatement(Vdbe *p, int eOp){ /* -** This function is called when a transaction opened by the database +** These functions are called when a transaction opened by the database ** handle associated with the VM passed as an argument is about to be -** committed. If there are outstanding deferred foreign key constraint -** violations, return SQLITE_ERROR. Otherwise, SQLITE_OK. +** committed. If there are outstanding foreign key constraint violations +** return an error code. Otherwise, SQLITE_OK. ** ** If there are outstanding FK violations and this function returns -** SQLITE_ERROR, set the result of the VM to SQLITE_CONSTRAINT_FOREIGNKEY -** and write an error message to it. Then return SQLITE_ERROR. +** non-zero, set the result of the VM to SQLITE_CONSTRAINT_FOREIGNKEY +** and write an error message to it. */ #ifndef SQLITE_OMIT_FOREIGN_KEY -SQLITE_PRIVATE int sqlite3VdbeCheckFk(Vdbe *p, int deferred){ +static SQLITE_NOINLINE int vdbeFkError(Vdbe *p){ + p->rc = SQLITE_CONSTRAINT_FOREIGNKEY; + p->errorAction = OE_Abort; + sqlite3VdbeError(p, "FOREIGN KEY constraint failed"); + if( (p->prepFlags & SQLITE_PREPARE_SAVESQL)==0 ) return SQLITE_ERROR; + return SQLITE_CONSTRAINT_FOREIGNKEY; +} +SQLITE_PRIVATE int sqlite3VdbeCheckFkImmediate(Vdbe *p){ + if( p->nFkConstraint==0 ) return SQLITE_OK; + return vdbeFkError(p); +} +SQLITE_PRIVATE int sqlite3VdbeCheckFkDeferred(Vdbe *p){ sqlite3 *db = p->db; - if( (deferred && (db->nDeferredCons+db->nDeferredImmCons)>0) - || (!deferred && p->nFkConstraint>0) - ){ - p->rc = SQLITE_CONSTRAINT_FOREIGNKEY; - p->errorAction = OE_Abort; - sqlite3VdbeError(p, "FOREIGN KEY constraint failed"); - if( (p->prepFlags & SQLITE_PREPARE_SAVESQL)==0 ) return SQLITE_ERROR; - return SQLITE_CONSTRAINT_FOREIGNKEY; - } - return SQLITE_OK; + if( (db->nDeferredCons+db->nDeferredImmCons)==0 ) return SQLITE_OK; + return vdbeFkError(p); } #endif @@ -89273,7 +90196,7 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ /* Check for immediate foreign key violations. */ if( p->rc==SQLITE_OK || (p->errorAction==OE_Fail && !isSpecialError) ){ - (void)sqlite3VdbeCheckFk(p, 0); + (void)sqlite3VdbeCheckFkImmediate(p); } /* If the auto-commit flag is set and this is the only active writer @@ -89287,7 +90210,7 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ && db->nVdbeWrite==(p->readOnly==0) ){ if( p->rc==SQLITE_OK || (p->errorAction==OE_Fail && !isSpecialError) ){ - rc = sqlite3VdbeCheckFk(p, 1); + rc = sqlite3VdbeCheckFkDeferred(p); if( rc!=SQLITE_OK ){ if( NEVER(p->readOnly) ){ sqlite3VdbeLeave(p); @@ -90097,30 +91020,22 @@ SQLITE_PRIVATE void sqlite3VdbeSerialGet( return; } /* -** This routine is used to allocate sufficient space for an UnpackedRecord -** structure large enough to be used with sqlite3VdbeRecordUnpack() if -** the first argument is a pointer to KeyInfo structure pKeyInfo. -** -** The space is either allocated using sqlite3DbMallocRaw() or from within -** the unaligned buffer passed via the second and third arguments (presumably -** stack space). If the former, then *ppFree is set to a pointer that should -** be eventually freed by the caller using sqlite3DbFree(). Or, if the -** allocation comes from the pSpace/szSpace buffer, *ppFree is set to NULL -** before returning. +** Allocate sufficient space for an UnpackedRecord structure large enough +** to hold a decoded index record for pKeyInfo. ** -** If an OOM error occurs, NULL is returned. +** The space is allocated using sqlite3DbMallocRaw(). If an OOM error +** occurs, NULL is returned. */ SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeAllocUnpackedRecord( KeyInfo *pKeyInfo /* Description of the record */ ){ UnpackedRecord *p; /* Unpacked record to return */ - int nByte; /* Number of bytes required for *p */ + u64 nByte; /* Number of bytes required for *p */ assert( sizeof(UnpackedRecord) + sizeof(Mem)*65536 < 0x7fffffff ); nByte = ROUND8P(sizeof(UnpackedRecord)) + sizeof(Mem)*(pKeyInfo->nKeyField+1); p = (UnpackedRecord *)sqlite3DbMallocRaw(pKeyInfo->db, nByte); if( !p ) return 0; p->aMem = (Mem*)&((char*)p)[ROUND8P(sizeof(UnpackedRecord))]; - assert( pKeyInfo->aSortFlags!=0 ); p->pKeyInfo = pKeyInfo; p->nField = pKeyInfo->nKeyField + 1; return p; @@ -90132,7 +91047,6 @@ SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeAllocUnpackedRecord( ** contents of the decoded record. */ SQLITE_PRIVATE void sqlite3VdbeRecordUnpack( - KeyInfo *pKeyInfo, /* Information about the record format */ int nKey, /* Size of the binary record */ const void *pKey, /* The binary record */ UnpackedRecord *p /* Populate this structure before returning. */ @@ -90143,6 +91057,7 @@ SQLITE_PRIVATE void sqlite3VdbeRecordUnpack( u16 u; /* Unsigned loop counter */ u32 szHdr; Mem *pMem = p->aMem; + KeyInfo *pKeyInfo = p->pKeyInfo; p->default_rc = 0; assert( EIGHT_BYTE_ALIGNMENT(pMem) ); @@ -90160,16 +91075,18 @@ SQLITE_PRIVATE void sqlite3VdbeRecordUnpack( pMem->z = 0; sqlite3VdbeSerialGet(&aKey[d], serial_type, pMem); d += sqlite3VdbeSerialTypeLen(serial_type); - pMem++; if( (++u)>=p->nField ) break; + pMem++; } if( d>(u32)nKey && u ){ assert( CORRUPT_DB ); /* In a corrupt record entry, the last pMem might have been set up using ** uninitialized memory. Overwrite its value with NULL, to prevent ** warnings from MSAN. */ - sqlite3VdbeMemSetNull(pMem-1); + sqlite3VdbeMemSetNull(pMem-(unField)); } + testcase( u == pKeyInfo->nKeyField + 1 ); + testcase( u < pKeyInfo->nKeyField + 1 ); assert( u<=pKeyInfo->nKeyField + 1 ); p->nField = u; } @@ -90337,6 +91254,32 @@ static void vdbeAssertFieldCountWithinLimits( ** or positive value if *pMem1 is less than, equal to or greater than ** *pMem2, respectively. Similar in spirit to "rc = (*pMem1) - (*pMem2);". */ +static SQLITE_NOINLINE int vdbeCompareMemStringWithEncodingChange( + const Mem *pMem1, + const Mem *pMem2, + const CollSeq *pColl, + u8 *prcErr /* If an OOM occurs, set to SQLITE_NOMEM */ +){ + int rc; + const void *v1, *v2; + Mem c1; + Mem c2; + sqlite3VdbeMemInit(&c1, pMem1->db, MEM_Null); + sqlite3VdbeMemInit(&c2, pMem1->db, MEM_Null); + sqlite3VdbeMemShallowCopy(&c1, pMem1, MEM_Ephem); + sqlite3VdbeMemShallowCopy(&c2, pMem2, MEM_Ephem); + v1 = sqlite3ValueText((sqlite3_value*)&c1, pColl->enc); + v2 = sqlite3ValueText((sqlite3_value*)&c2, pColl->enc); + if( (v1==0 || v2==0) ){ + if( prcErr ) *prcErr = SQLITE_NOMEM_BKPT; + rc = 0; + }else{ + rc = pColl->xCmp(pColl->pUser, c1.n, v1, c2.n, v2); + } + sqlite3VdbeMemReleaseMalloc(&c1); + sqlite3VdbeMemReleaseMalloc(&c2); + return rc; +} static int vdbeCompareMemString( const Mem *pMem1, const Mem *pMem2, @@ -90348,25 +91291,7 @@ static int vdbeCompareMemString( ** comparison function directly */ return pColl->xCmp(pColl->pUser,pMem1->n,pMem1->z,pMem2->n,pMem2->z); }else{ - int rc; - const void *v1, *v2; - Mem c1; - Mem c2; - sqlite3VdbeMemInit(&c1, pMem1->db, MEM_Null); - sqlite3VdbeMemInit(&c2, pMem1->db, MEM_Null); - sqlite3VdbeMemShallowCopy(&c1, pMem1, MEM_Ephem); - sqlite3VdbeMemShallowCopy(&c2, pMem2, MEM_Ephem); - v1 = sqlite3ValueText((sqlite3_value*)&c1, pColl->enc); - v2 = sqlite3ValueText((sqlite3_value*)&c2, pColl->enc); - if( (v1==0 || v2==0) ){ - if( prcErr ) *prcErr = SQLITE_NOMEM_BKPT; - rc = 0; - }else{ - rc = pColl->xCmp(pColl->pUser, c1.n, v1, c2.n, v2); - } - sqlite3VdbeMemReleaseMalloc(&c1); - sqlite3VdbeMemReleaseMalloc(&c2); - return rc; + return vdbeCompareMemStringWithEncodingChange(pMem1,pMem2,pColl,prcErr); } } @@ -91029,6 +91954,7 @@ SQLITE_PRIVATE RecordCompare sqlite3VdbeFindCompare(UnpackedRecord *p){ ** The easiest way to enforce this limit is to consider only records with ** 13 fields or less. If the first field is an integer, the maximum legal ** header size is (12*5 + 1 + 1) bytes. */ + assert( p->pKeyInfo->aSortFlags!=0 ); if( p->pKeyInfo->nAllField<=13 ){ int flags = p->aMem[0].flags; if( p->pKeyInfo->aSortFlags[0] ){ @@ -91278,6 +92204,7 @@ SQLITE_PRIVATE void sqlite3VdbeSetVarmask(Vdbe *v, int iVar){ } } +#ifndef SQLITE_OMIT_DATETIME_FUNCS /* ** Cause a function to throw an error if it was call from OP_PureFunc ** rather than OP_Function. @@ -91311,6 +92238,7 @@ SQLITE_PRIVATE int sqlite3NotPureFunc(sqlite3_context *pCtx){ } return 1; } +#endif /* SQLITE_OMIT_DATETIME_FUNCS */ #if defined(SQLITE_ENABLE_CURSOR_HINTS) && defined(SQLITE_DEBUG) /* @@ -91387,7 +92315,6 @@ SQLITE_PRIVATE void sqlite3VdbePreUpdateHook( i64 iKey2; PreUpdate preupdate; const char *zTbl = pTab->zName; - static const u8 fakeSortOrder = 0; #ifdef SQLITE_DEBUG int nRealCol; if( pTab->tabFlags & TF_WithoutRowid ){ @@ -91422,11 +92349,11 @@ SQLITE_PRIVATE void sqlite3VdbePreUpdateHook( preupdate.pCsr = pCsr; preupdate.op = op; preupdate.iNewReg = iReg; - preupdate.pKeyinfo = (KeyInfo*)&preupdate.keyinfoSpace; + preupdate.pKeyinfo = (KeyInfo*)&preupdate.uKey; preupdate.pKeyinfo->db = db; preupdate.pKeyinfo->enc = ENC(db); preupdate.pKeyinfo->nKeyField = pTab->nCol; - preupdate.pKeyinfo->aSortFlags = (u8*)&fakeSortOrder; + preupdate.pKeyinfo->aSortFlags = 0; /* Indicate .aColl, .nAllField uninit */ preupdate.iKey1 = iKey1; preupdate.iKey2 = iKey2; preupdate.pTab = pTab; @@ -91456,6 +92383,17 @@ SQLITE_PRIVATE void sqlite3VdbePreUpdateHook( } #endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ +#ifdef SQLITE_ENABLE_PERCENTILE +/* +** Return the name of an SQL function associated with the sqlite3_context. +*/ +SQLITE_PRIVATE const char *sqlite3VdbeFuncName(const sqlite3_context *pCtx){ + assert( pCtx!=0 ); + assert( pCtx->pFunc!=0 ); + return pCtx->pFunc->zName; +} +#endif /* SQLITE_ENABLE_PERCENTILE */ + /************** End of vdbeaux.c *********************************************/ /************** Begin file vdbeapi.c *****************************************/ /* @@ -93153,8 +94091,12 @@ static int bindText( if( zData!=0 ){ pVar = &p->aVar[i-1]; rc = sqlite3VdbeMemSetStr(pVar, zData, nData, encoding, xDel); - if( rc==SQLITE_OK && encoding!=0 ){ - rc = sqlite3VdbeChangeEncoding(pVar, ENC(p->db)); + if( rc==SQLITE_OK ){ + if( encoding==0 ){ + pVar->enc = ENC(p->db); + }else{ + rc = sqlite3VdbeChangeEncoding(pVar, ENC(p->db)); + } } if( rc ){ sqlite3Error(p->db, rc); @@ -93623,7 +94565,7 @@ static UnpackedRecord *vdbeUnpackRecord( pRet = sqlite3VdbeAllocUnpackedRecord(pKeyInfo); if( pRet ){ memset(pRet->aMem, 0, sizeof(Mem)*(pKeyInfo->nKeyField+1)); - sqlite3VdbeRecordUnpack(pKeyInfo, nKey, pKey, pRet); + sqlite3VdbeRecordUnpack(nKey, pKey, pRet); } return pRet; } @@ -93652,6 +94594,9 @@ SQLITE_API int sqlite3_preupdate_old(sqlite3 *db, int iIdx, sqlite3_value **ppVa } if( p->pPk ){ iStore = sqlite3TableColumnToIndex(p->pPk, iIdx); + }else if( iIdx >= p->pTab->nCol ){ + rc = SQLITE_MISUSE_BKPT; + goto preupdate_old_out; }else{ iStore = sqlite3TableColumnToStorage(p->pTab, iIdx); } @@ -93807,6 +94752,8 @@ SQLITE_API int sqlite3_preupdate_new(sqlite3 *db, int iIdx, sqlite3_value **ppVa } if( p->pPk && p->op!=SQLITE_UPDATE ){ iStore = sqlite3TableColumnToIndex(p->pPk, iIdx); + }else if( iIdx >= p->pTab->nCol ){ + return SQLITE_MISUSE_BKPT; }else{ iStore = sqlite3TableColumnToStorage(p->pTab, iIdx); } @@ -94082,10 +95029,10 @@ SQLITE_API void sqlite3_stmt_scanstatus_reset(sqlite3_stmt *pStmt){ ** a host parameter. If the text contains no host parameters, return ** the total number of bytes in the text. */ -static int findNextHostParameter(const char *zSql, int *pnToken){ +static i64 findNextHostParameter(const char *zSql, i64 *pnToken){ int tokenType; - int nTotal = 0; - int n; + i64 nTotal = 0; + i64 n; *pnToken = 0; while( zSql[0] ){ @@ -94132,8 +95079,8 @@ SQLITE_PRIVATE char *sqlite3VdbeExpandSql( sqlite3 *db; /* The database connection */ int idx = 0; /* Index of a host parameter */ int nextIndex = 1; /* Index of next ? host parameter */ - int n; /* Length of a token prefix */ - int nToken; /* Length of the parameter token */ + i64 n; /* Length of a token prefix */ + i64 nToken; /* Length of the parameter token */ int i; /* Loop counter */ Mem *pVar; /* Value of a host parameter */ StrAccum out; /* Accumulate the output here */ @@ -95057,7 +96004,7 @@ static u64 filterHash(const Mem *aMem, const Op *pOp){ static SQLITE_NOINLINE int vdbeColumnFromOverflow( VdbeCursor *pC, /* The BTree cursor from which we are reading */ int iCol, /* The column to read */ - int t, /* The serial-type code for the column value */ + u32 t, /* The serial-type code for the column value */ i64 iOffset, /* Offset to the start of the content value */ u32 cacheStatus, /* Current Vdbe.cacheCtr value */ u32 colCacheCtr, /* Current value of the column cache counter */ @@ -95132,6 +96079,36 @@ static SQLITE_NOINLINE int vdbeColumnFromOverflow( return rc; } +/* +** Send a "statement aborts" message to the error log. +*/ +static SQLITE_NOINLINE void sqlite3VdbeLogAbort( + Vdbe *p, /* The statement that is running at the time of failure */ + int rc, /* Error code */ + Op *pOp, /* Opcode that filed */ + Op *aOp /* All opcodes */ +){ + const char *zSql = p->zSql; /* Original SQL text */ + const char *zPrefix = ""; /* Prefix added to SQL text */ + int pc; /* Opcode address */ + char zXtra[100]; /* Buffer space to store zPrefix */ + + if( p->pFrame ){ + assert( aOp[0].opcode==OP_Init ); + if( aOp[0].p4.z!=0 ){ + assert( aOp[0].p4.z[0]=='-' + && aOp[0].p4.z[1]=='-' + && aOp[0].p4.z[2]==' ' ); + sqlite3_snprintf(sizeof(zXtra), zXtra,"/* %s */ ",aOp[0].p4.z+3); + zPrefix = zXtra; + }else{ + zPrefix = "/* unknown trigger */ "; + } + } + pc = (int)(pOp - aOp); + sqlite3_log(rc, "statement aborts at %d: %s; [%s%s]", + pc, p->zErrMsg, zPrefix, zSql); +} /* ** Return the symbolic name for the data type of a pMem @@ -95657,8 +96634,7 @@ case OP_Halt: { }else{ sqlite3VdbeError(p, "%s", pOp->p4.z); } - pcx = (int)(pOp - aOp); - sqlite3_log(pOp->p1, "abort at %d: %s; [%s]", pcx, p->zErrMsg, p->zSql); + sqlite3VdbeLogAbort(p, pOp->p1, pOp, aOp); } rc = sqlite3VdbeHalt(p); assert( rc==SQLITE_BUSY || rc==SQLITE_OK || rc==SQLITE_ERROR ); @@ -96037,7 +97013,7 @@ case OP_IntCopy: { /* out2 */ ** RETURNING clause. */ case OP_FkCheck: { - if( (rc = sqlite3VdbeCheckFk(p,0))!=SQLITE_OK ){ + if( (rc = sqlite3VdbeCheckFkImmediate(p))!=SQLITE_OK ){ goto abort_due_to_error; } break; @@ -96129,10 +97105,14 @@ case OP_Concat: { /* same as TK_CONCAT, in1, in2, out3 */ if( sqlite3VdbeMemExpandBlob(pIn2) ) goto no_mem; flags2 = pIn2->flags & ~MEM_Str; } - nByte = pIn1->n + pIn2->n; + nByte = pIn1->n; + nByte += pIn2->n; if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){ goto too_big; } +#if SQLITE_MAX_LENGTH>2147483645 + if( nByte>2147483645 ){ goto too_big; } +#endif if( sqlite3VdbeMemGrow(pOut, (int)nByte+2, pOut==pIn2) ){ goto no_mem; } @@ -96816,6 +97796,7 @@ case OP_Compare: { pKeyInfo = pOp->p4.pKeyInfo; assert( n>0 ); assert( pKeyInfo!=0 ); + assert( pKeyInfo->aSortFlags!=0 ); p1 = pOp->p1; p2 = pOp->p2; #ifdef SQLITE_DEBUG @@ -97578,6 +98559,15 @@ case OP_Column: { /* ncycle */ ** Take the affinities from the Table object in P4. If any value ** cannot be coerced into the correct type, then raise an error. ** +** If P3==0, then omit checking of VIRTUAL columns. +** +** If P3==1, then omit checking of all generated column, both VIRTUAL +** and STORED. +** +** If P3>=2, then only check column number P3-2 in the table (which will +** be a VIRTUAL column) against the value in reg[P1]. In this case, +** P2 will be 1. +** ** This opcode is similar to OP_Affinity except that this opcode ** forces the register type to the Table column type. This is used ** to implement "strict affinity". @@ -97591,8 +98581,8 @@ case OP_Column: { /* ncycle */ ** **
      **
    • P2 should be the number of non-virtual columns in the -** table of P4. -**
    • Table P4 should be a STRICT table. +** table of P4 unless P3>1, in which case P2 will be 1. +**
    • Table P4 is a STRICT table. **
    ** ** If any precondition is false, an assertion fault occurs. @@ -97601,16 +98591,28 @@ case OP_TypeCheck: { Table *pTab; Column *aCol; int i; + int nCol; assert( pOp->p4type==P4_TABLE ); pTab = pOp->p4.pTab; assert( pTab->tabFlags & TF_Strict ); - assert( pTab->nNVCol==pOp->p2 ); + assert( pOp->p3>=0 && pOp->p3nCol+2 ); aCol = pTab->aCol; pIn1 = &aMem[pOp->p1]; - for(i=0; inCol; i++){ - if( aCol[i].colFlags & COLFLAG_GENERATED ){ - if( aCol[i].colFlags & COLFLAG_VIRTUAL ) continue; + if( pOp->p3<2 ){ + assert( pTab->nNVCol==pOp->p2 ); + i = 0; + nCol = pTab->nCol; + }else{ + i = pOp->p3-2; + nCol = i+1; + assert( inCol ); + assert( aCol[i].colFlags & COLFLAG_VIRTUAL ); + assert( pOp->p2==1 ); + } + for(; ip3<2 ){ + if( (aCol[i].colFlags & COLFLAG_VIRTUAL)!=0 ) continue; if( pOp->p3 ){ pIn1++; continue; } } assert( pIn1 < &aMem[pOp->p1+pOp->p2] ); @@ -97932,7 +98934,7 @@ case OP_MakeRecord: { len = (u32)pRec->n; serial_type = (len*2) + 12 + ((pRec->flags & MEM_Str)!=0); if( pRec->flags & MEM_Zero ){ - serial_type += pRec->u.nZero*2; + serial_type += (u32)pRec->u.nZero*2; if( nData ){ if( sqlite3VdbeMemExpandBlob(pRec) ) goto no_mem; len += pRec->u.nZero; @@ -98199,7 +99201,7 @@ case OP_Savepoint: { */ int isTransaction = pSavepoint->pNext==0 && db->isTransactionSavepoint; if( isTransaction && p1==SAVEPOINT_RELEASE ){ - if( (rc = sqlite3VdbeCheckFk(p, 1))!=SQLITE_OK ){ + if( (rc = sqlite3VdbeCheckFkDeferred(p))!=SQLITE_OK ){ goto vdbe_return; } db->autoCommit = 1; @@ -98317,7 +99319,7 @@ case OP_AutoCommit: { "SQL statements in progress"); rc = SQLITE_BUSY; goto abort_due_to_error; - }else if( (rc = sqlite3VdbeCheckFk(p, 1))!=SQLITE_OK ){ + }else if( (rc = sqlite3VdbeCheckFkDeferred(p))!=SQLITE_OK ){ goto vdbe_return; }else{ db->autoCommit = (u8)desiredAutoCommit; @@ -99689,7 +100691,7 @@ case OP_Found: { /* jump, in3, ncycle */ if( rc ) goto no_mem; pIdxKey = sqlite3VdbeAllocUnpackedRecord(pC->pKeyInfo); if( pIdxKey==0 ) goto no_mem; - sqlite3VdbeRecordUnpack(pC->pKeyInfo, r.aMem->n, r.aMem->z, pIdxKey); + sqlite3VdbeRecordUnpack(r.aMem->n, r.aMem->z, pIdxKey); pIdxKey->default_rc = 0; rc = sqlite3BtreeIndexMoveto(pC->uc.pCursor, pIdxKey, &pC->seekResult); sqlite3DbFreeNN(db, pIdxKey); @@ -100687,6 +101689,32 @@ case OP_Rewind: { /* jump0, ncycle */ break; } +/* Opcode: IfEmpty P1 P2 * * * +** Synopsis: if( empty(P1) ) goto P2 +** +** Check to see if the b-tree table that cursor P1 references is empty +** and jump to P2 if it is. +*/ +case OP_IfEmpty: { /* jump */ + VdbeCursor *pC; + BtCursor *pCrsr; + int res; + + assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( pOp->p2>=0 && pOp->p2nOp ); + + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + pCrsr = pC->uc.pCursor; + assert( pCrsr ); + rc = sqlite3BtreeIsEmpty(pCrsr, &res); + if( rc ) goto abort_due_to_error; + VdbeBranchTaken(res!=0,2); + if( res ) goto jump_to_p2; + break; +} + /* Opcode: Next P1 P2 P3 * P5 ** ** Advance cursor P1 so that it points to the next key/data pair in its @@ -102223,6 +103251,7 @@ case OP_Checkpoint: { || pOp->p2==SQLITE_CHECKPOINT_FULL || pOp->p2==SQLITE_CHECKPOINT_RESTART || pOp->p2==SQLITE_CHECKPOINT_TRUNCATE + || pOp->p2==SQLITE_CHECKPOINT_NOOP ); rc = sqlite3Checkpoint(db, pOp->p1, pOp->p2, &aRes[1], &aRes[2]); if( rc ){ @@ -102558,7 +103587,14 @@ case OP_VOpen: { /* ncycle */ const sqlite3_module *pModule; assert( p->bIsReader ); - pCur = 0; + pCur = p->apCsr[pOp->p1]; + if( pCur!=0 + && ALWAYS( pCur->eCurType==CURTYPE_VTAB ) + && ALWAYS( pCur->uc.pVCur->pVtab==pOp->p4.pVtab->pVtab ) + ){ + /* This opcode is a no-op if the cursor is already open */ + break; + } pVCur = 0; pVtab = pOp->p4.pVtab->pVtab; if( pVtab==0 || NEVER(pVtab->pModule==0) ){ @@ -103500,8 +104536,7 @@ default: { /* This is really OP_Noop, OP_Explain */ p->rc = rc; sqlite3SystemError(db, rc); testcase( sqlite3GlobalConfig.xLog!=0 ); - sqlite3_log(rc, "statement aborts at %d: %s; [%s]", - (int)(pOp - aOp), p->zErrMsg, p->zSql); + sqlite3VdbeLogAbort(p, rc, pOp, aOp); if( p->eVdbeState==VDBE_RUN_STATE ) sqlite3VdbeHalt(p); if( rc==SQLITE_IOERR_NOMEM ) sqlite3OomFault(db); if( rc==SQLITE_CORRUPT && db->autoCommit==0 ){ @@ -103962,7 +104997,7 @@ static int blobReadWrite( int iOffset, int (*xCall)(BtCursor*, u32, u32, void*) ){ - int rc; + int rc = SQLITE_OK; Incrblob *p = (Incrblob *)pBlob; Vdbe *v; sqlite3 *db; @@ -104002,17 +105037,32 @@ static int blobReadWrite( ** using the incremental-blob API, this works. For the sessions module ** anyhow. */ - sqlite3_int64 iKey; - iKey = sqlite3BtreeIntegerKey(p->pCsr); - assert( v->apCsr[0]!=0 ); - assert( v->apCsr[0]->eCurType==CURTYPE_BTREE ); - sqlite3VdbePreUpdateHook( - v, v->apCsr[0], SQLITE_DELETE, p->zDb, p->pTab, iKey, -1, p->iCol - ); + if( sqlite3BtreeCursorIsValidNN(p->pCsr)==0 ){ + /* If the cursor is not currently valid, try to reseek it. This + ** always either fails or finds the correct row - the cursor will + ** have been marked permanently CURSOR_INVALID if the open row has + ** been deleted. */ + int bDiff = 0; + rc = sqlite3BtreeCursorRestore(p->pCsr, &bDiff); + assert( bDiff==0 || sqlite3BtreeCursorIsValidNN(p->pCsr)==0 ); + } + if( sqlite3BtreeCursorIsValidNN(p->pCsr) ){ + sqlite3_int64 iKey; + iKey = sqlite3BtreeIntegerKey(p->pCsr); + assert( v->apCsr[0]!=0 ); + assert( v->apCsr[0]->eCurType==CURTYPE_BTREE ); + sqlite3VdbePreUpdateHook( + v, v->apCsr[0], SQLITE_DELETE, p->zDb, p->pTab, iKey, -1, p->iCol + ); + } + } + if( rc==SQLITE_OK ){ + rc = xCall(p->pCsr, iOffset+p->iOffset, n, z); } +#else + rc = xCall(p->pCsr, iOffset+p->iOffset, n, z); #endif - rc = xCall(p->pCsr, iOffset+p->iOffset, n, z); sqlite3BtreeLeaveCursor(p->pCsr); if( rc==SQLITE_ABORT ){ sqlite3VdbeFinalize(v); @@ -104401,6 +105451,7 @@ struct SortSubtask { SorterCompare xCompare; /* Compare function to use */ SorterFile file; /* Temp file for level-0 PMAs */ SorterFile file2; /* Space for other PMAs */ + u64 nSpill; /* Total bytes written by this task */ }; @@ -104521,6 +105572,7 @@ struct PmaWriter { int iBufEnd; /* Last byte of buffer to write */ i64 iWriteOff; /* Offset of start of buffer in file */ sqlite3_file *pFd; /* File handle to write to */ + u64 nPmaSpill; /* Total number of bytes written */ }; /* @@ -104865,7 +105917,7 @@ static int vdbeSorterCompareTail( ){ UnpackedRecord *r2 = pTask->pUnpacked; if( *pbKey2Cached==0 ){ - sqlite3VdbeRecordUnpack(pTask->pSorter->pKeyInfo, nKey2, pKey2, r2); + sqlite3VdbeRecordUnpack(nKey2, pKey2, r2); *pbKey2Cached = 1; } return sqlite3VdbeRecordCompareWithSkip(nKey1, pKey1, r2, 1); @@ -104892,7 +105944,7 @@ static int vdbeSorterCompare( ){ UnpackedRecord *r2 = pTask->pUnpacked; if( !*pbKey2Cached ){ - sqlite3VdbeRecordUnpack(pTask->pSorter->pKeyInfo, nKey2, pKey2, r2); + sqlite3VdbeRecordUnpack(nKey2, pKey2, r2); *pbKey2Cached = 1; } return sqlite3VdbeRecordCompare(nKey1, pKey1, r2); @@ -104932,6 +105984,7 @@ static int vdbeSorterCompareText( ); } }else{ + assert( pTask->pSorter->pKeyInfo->aSortFlags!=0 ); assert( !(pTask->pSorter->pKeyInfo->aSortFlags[0]&KEYINFO_ORDER_BIGNULL) ); if( pTask->pSorter->pKeyInfo->aSortFlags[0] ){ res = res * -1; @@ -104995,6 +106048,7 @@ static int vdbeSorterCompareInt( } } + assert( pTask->pSorter->pKeyInfo->aSortFlags!=0 ); if( res==0 ){ if( pTask->pSorter->pKeyInfo->nKeyField>1 ){ res = vdbeSorterCompareTail( @@ -105068,7 +106122,8 @@ SQLITE_PRIVATE int sqlite3VdbeSorterInit( assert( pCsr->eCurType==CURTYPE_SORTER ); assert( sizeof(KeyInfo) + UMXV(pCsr->pKeyInfo->nKeyField)*sizeof(CollSeq*) < 0x7fffffff ); - szKeyInfo = SZ_KEYINFO(pCsr->pKeyInfo->nKeyField); + assert( pCsr->pKeyInfo->nKeyField<=pCsr->pKeyInfo->nAllField ); + szKeyInfo = SZ_KEYINFO(pCsr->pKeyInfo->nAllField); sz = SZ_VDBESORTER(nWorker+1); pSorter = (VdbeSorter*)sqlite3DbMallocZero(db, sz + szKeyInfo); @@ -105082,7 +106137,12 @@ SQLITE_PRIVATE int sqlite3VdbeSorterInit( pKeyInfo->db = 0; if( nField && nWorker==0 ){ pKeyInfo->nKeyField = nField; + assert( nField<=pCsr->pKeyInfo->nAllField ); } + /* It is OK that pKeyInfo reuses the aSortFlags field from pCsr->pKeyInfo, + ** since the pCsr->pKeyInfo->aSortFlags[] array is invariant and lives + ** longer that pSorter. */ + assert( pKeyInfo->aSortFlags==pCsr->pKeyInfo->aSortFlags ); sqlite3BtreeEnter(pBt); pSorter->pgsz = pgsz = sqlite3BtreeGetPageSize(pBt); sqlite3BtreeLeave(pBt); @@ -105371,6 +106431,12 @@ SQLITE_PRIVATE void sqlite3VdbeSorterClose(sqlite3 *db, VdbeCursor *pCsr){ assert( pCsr->eCurType==CURTYPE_SORTER ); pSorter = pCsr->uc.pSorter; if( pSorter ){ + /* Increment db->nSpill by the total number of bytes of data written + ** to temp files by this sort operation. */ + int ii; + for(ii=0; iinTask; ii++){ + db->nSpill += pSorter->aTask[ii].nSpill; + } sqlite3VdbeSorterReset(db, pSorter); sqlite3_free(pSorter->list.aMemory); sqlite3DbFree(db, pSorter); @@ -105596,6 +106662,7 @@ static void vdbePmaWriteBlob(PmaWriter *p, u8 *pData, int nData){ &p->aBuffer[p->iBufStart], p->iBufEnd - p->iBufStart, p->iWriteOff + p->iBufStart ); + p->nPmaSpill += (p->iBufEnd - p->iBufStart); p->iBufStart = p->iBufEnd = 0; p->iWriteOff += p->nBuffer; } @@ -105612,17 +106679,20 @@ static void vdbePmaWriteBlob(PmaWriter *p, u8 *pData, int nData){ ** required. Otherwise, return an SQLite error code. ** ** Before returning, set *piEof to the offset immediately following the -** last byte written to the file. +** last byte written to the file. Also, increment (*pnSpill) by the total +** number of bytes written to the file. */ -static int vdbePmaWriterFinish(PmaWriter *p, i64 *piEof){ +static int vdbePmaWriterFinish(PmaWriter *p, i64 *piEof, u64 *pnSpill){ int rc; if( p->eFWErr==0 && ALWAYS(p->aBuffer) && p->iBufEnd>p->iBufStart ){ p->eFWErr = sqlite3OsWrite(p->pFd, &p->aBuffer[p->iBufStart], p->iBufEnd - p->iBufStart, p->iWriteOff + p->iBufStart ); + p->nPmaSpill += (p->iBufEnd - p->iBufStart); } *piEof = (p->iWriteOff + p->iBufEnd); + *pnSpill += p->nPmaSpill; sqlite3_free(p->aBuffer); rc = p->eFWErr; memset(p, 0, sizeof(PmaWriter)); @@ -105702,7 +106772,7 @@ static int vdbeSorterListToPMA(SortSubtask *pTask, SorterList *pList){ if( pList->aMemory==0 ) sqlite3_free(p); } pList->pList = p; - rc = vdbePmaWriterFinish(&writer, &pTask->file.iEof); + rc = vdbePmaWriterFinish(&writer, &pTask->file.iEof, &pTask->nSpill); } vdbeSorterWorkDebug(pTask, "exit"); @@ -106016,7 +107086,7 @@ static int vdbeIncrPopulate(IncrMerger *pIncr){ rc = vdbeMergeEngineStep(pIncr->pMerger, &dummy); } - rc2 = vdbePmaWriterFinish(&writer, &pOut->iEof); + rc2 = vdbePmaWriterFinish(&writer, &pOut->iEof, &pTask->nSpill); if( rc==SQLITE_OK ) rc = rc2; vdbeSorterPopulateDebug(pTask, "exit"); return rc; @@ -106862,7 +107932,7 @@ SQLITE_PRIVATE int sqlite3VdbeSorterCompare( assert( r2->nField==nKeyCol ); pKey = vdbeSorterRowkey(pSorter, &nKey); - sqlite3VdbeRecordUnpack(pKeyInfo, nKey, pKey, r2); + sqlite3VdbeRecordUnpack(nKey, pKey, r2); for(i=0; iaMem[i].flags & MEM_Null ){ *pRes = -1; @@ -108407,10 +109477,13 @@ static int lookupName( if( cnt>0 ){ if( pItem->fg.isUsing==0 || sqlite3IdListIndex(pItem->u3.pUsing, zCol)<0 + || pMatch==pItem ){ /* Two or more tables have the same column name which is - ** not joined by USING. This is an error. Signal as much - ** by clearing pFJMatch and letting cnt go above 1. */ + ** not joined by USING. Or, a single table has two columns + ** that match a USING term (if pMatch==pItem). These are both + ** "ambiguous column name" errors. Signal as much by clearing + ** pFJMatch and letting cnt go above 1. */ sqlite3ExprListDelete(db, pFJMatch); pFJMatch = 0; }else @@ -108960,8 +110033,8 @@ static void notValidImpl( /* ** Expression p should encode a floating point value between 1.0 and 0.0. -** Return 1024 times this value. Or return -1 if p is not a floating point -** value between 1.0 and 0.0. +** Return 134,217,728 (2^27) times this value. Or return -1 if p is not +** a floating point value between 1.0 and 0.0. */ static int exprProbability(Expr *p){ double r = -1.0; @@ -109392,11 +110465,13 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ return WRC_Prune; } #ifndef SQLITE_OMIT_SUBQUERY + case TK_EXISTS: case TK_SELECT: - case TK_EXISTS: testcase( pExpr->op==TK_EXISTS ); #endif case TK_IN: { testcase( pExpr->op==TK_IN ); + testcase( pExpr->op==TK_EXISTS ); + testcase( pExpr->op==TK_SELECT ); if( ExprUseXSelect(pExpr) ){ int nRef = pNC->nRef; testcase( pNC->ncFlags & NC_IsCheck ); @@ -109404,6 +110479,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ testcase( pNC->ncFlags & NC_IdxExpr ); testcase( pNC->ncFlags & NC_GenCol ); assert( pExpr->x.pSelect ); + if( pExpr->op==TK_EXISTS ) pParse->bHasExists = 1; if( pNC->ncFlags & NC_SelfRef ){ notValidImpl(pParse, pNC, "subqueries", pExpr, pExpr); }else{ @@ -110314,14 +111390,17 @@ SQLITE_PRIVATE int sqlite3ResolveSelfReference( SrcList *pSrc; /* Fake SrcList for pParse->pNewTable */ NameContext sNC; /* Name context for pParse->pNewTable */ int rc; - u8 srcSpace[SZ_SRCLIST_1]; /* Memory space for the fake SrcList */ + union { + SrcList sSrc; + u8 srcSpace[SZ_SRCLIST_1]; /* Memory space for the fake SrcList */ + } uSrc; assert( type==0 || pTab!=0 ); assert( type==NC_IsCheck || type==NC_PartIdx || type==NC_IdxExpr || type==NC_GenCol || pTab==0 ); memset(&sNC, 0, sizeof(sNC)); - pSrc = (SrcList*)srcSpace; - memset(pSrc, 0, SZ_SRCLIST_1); + memset(&uSrc, 0, sizeof(uSrc)); + pSrc = &uSrc.sSrc; if( pTab ){ pSrc->nSrc = 1; pSrc->a[0].zName = pTab->zName; @@ -111584,6 +112663,11 @@ SQLITE_PRIVATE void sqlite3ExprAddFunctionOrderBy( sqlite3ExprListDelete(db, pOrderBy); return; } + if( pOrderBy->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){ + sqlite3ErrorMsg(pParse, "too many terms in ORDER BY clause"); + sqlite3ExprListDelete(db, pOrderBy); + return; + } pOB = sqlite3ExprAlloc(db, TK_ORDER, 0, 0); if( pOB==0 ){ @@ -112718,6 +113802,85 @@ SQLITE_PRIVATE Expr *sqlite3ExprSimplifiedAndOr(Expr *pExpr){ return pExpr; } +/* +** Return true if it might be advantageous to compute the right operand +** of expression pExpr first, before the left operand. +** +** Normally the left operand is computed before the right operand. But if +** the left operand contains a subquery and the right does not, then it +** might be more efficient to compute the right operand first. +*/ +static int exprEvalRhsFirst(Expr *pExpr){ + if( ExprHasProperty(pExpr->pLeft, EP_Subquery) + && !ExprHasProperty(pExpr->pRight, EP_Subquery) + ){ + return 1; + }else{ + return 0; + } +} + +/* +** Compute the two operands of a binary operator. +** +** If either operand contains a subquery, then the code strives to +** compute the operand containing the subquery second. If the other +** operand evalutes to NULL, then a jump is made. The address of the +** IsNull operand that does this jump is returned. The caller can use +** this to optimize the computation so as to avoid doing the potentially +** expensive subquery. +** +** If no optimization opportunities exist, return 0. +*/ +static int exprComputeOperands( + Parse *pParse, /* Parsing context */ + Expr *pExpr, /* The comparison expression */ + int *pR1, /* OUT: Register holding the left operand */ + int *pR2, /* OUT: Register holding the right operand */ + int *pFree1, /* OUT: Temp register to free if not zero */ + int *pFree2 /* OUT: Another temp register to free if not zero */ +){ + int addrIsNull; + int r1, r2; + Vdbe *v = pParse->pVdbe; + + assert( v!=0 ); + /* + ** If the left operand contains a (possibly expensive) subquery and the + ** right operand does not and the right operation might be NULL, + ** then compute the right operand first and do an IsNull jump if the + ** right operand evalutes to NULL. + */ + if( exprEvalRhsFirst(pExpr) && sqlite3ExprCanBeNull(pExpr->pRight) ){ + r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, pFree2); + addrIsNull = sqlite3VdbeAddOp1(v, OP_IsNull, r2); + VdbeComment((v, "skip left operand")); + VdbeCoverage(v); + }else{ + r2 = 0; /* Silence a false-positive uninit-var warning in MSVC */ + addrIsNull = 0; + } + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, pFree1); + if( addrIsNull==0 ){ + /* + ** If the right operand contains a subquery and the left operand does not + ** and the left operand might be NULL, then do an IsNull check + ** check on the left operand before computing the right operand. + */ + if( ExprHasProperty(pExpr->pRight, EP_Subquery) + && sqlite3ExprCanBeNull(pExpr->pLeft) + ){ + addrIsNull = sqlite3VdbeAddOp1(v, OP_IsNull, r1); + VdbeComment((v, "skip right operand")); + VdbeCoverage(v); + } + r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, pFree2); + } + *pR1 = r1; + *pR2 = r2; + return addrIsNull; +} + /* ** pExpr is a TK_FUNCTION node. Try to determine whether or not the ** function is a constant function. A function is constant if all of @@ -114162,17 +115325,23 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ VdbeComment((v, "Init EXISTS result")); } if( pSel->pLimit ){ - /* The subquery already has a limit. If the pre-existing limit is X - ** then make the new limit X<>0 so that the new limit is either 1 or 0 */ - sqlite3 *db = pParse->db; - pLimit = sqlite3Expr(db, TK_INTEGER, "0"); - if( pLimit ){ - pLimit->affExpr = SQLITE_AFF_NUMERIC; - pLimit = sqlite3PExpr(pParse, TK_NE, - sqlite3ExprDup(db, pSel->pLimit->pLeft, 0), pLimit); + /* The subquery already has a limit. If the pre-existing limit X is + ** not already integer value 1 or 0, then make the new limit X<>0 so that + ** the new limit is either 1 or 0 */ + Expr *pLeft = pSel->pLimit->pLeft; + if( ExprHasProperty(pLeft, EP_IntValue)==0 + || (pLeft->u.iValue!=1 && pLeft->u.iValue!=0) + ){ + sqlite3 *db = pParse->db; + pLimit = sqlite3Expr(db, TK_INTEGER, "0"); + if( pLimit ){ + pLimit->affExpr = SQLITE_AFF_NUMERIC; + pLimit = sqlite3PExpr(pParse, TK_NE, + sqlite3ExprDup(db, pLeft, 0), pLimit); + } + sqlite3ExprDeferredDelete(pParse, pLeft); + pSel->pLimit->pLeft = pLimit; } - sqlite3ExprDeferredDelete(pParse, pSel->pLimit->pLeft); - pSel->pLimit->pLeft = pLimit; }else{ /* If there is no pre-existing limit add a limit of 1 */ pLimit = sqlite3Expr(pParse->db, TK_INTEGER, "1"); @@ -114260,7 +115429,6 @@ static void sqlite3ExprCodeIN( int rRhsHasNull = 0; /* Register that is true if RHS contains NULL values */ int eType; /* Type of the RHS */ int rLhs; /* Register(s) holding the LHS values */ - int rLhsOrig; /* LHS values prior to reordering by aiMap[] */ Vdbe *v; /* Statement under construction */ int *aiMap = 0; /* Map from vector field to index column */ char *zAff = 0; /* Affinity string for comparisons */ @@ -114323,19 +115491,8 @@ static void sqlite3ExprCodeIN( ** by code generated below. */ assert( pParse->okConstFactor==okConstFactor ); pParse->okConstFactor = 0; - rLhsOrig = exprCodeVector(pParse, pLeft, &iDummy); + rLhs = exprCodeVector(pParse, pLeft, &iDummy); pParse->okConstFactor = okConstFactor; - for(i=0; ix.pList; pColl = sqlite3ExprCollSeq(pParse, pExpr->pLeft); @@ -114391,6 +115549,26 @@ static void sqlite3ExprCodeIN( goto sqlite3ExprCodeIN_finished; } + if( eType!=IN_INDEX_ROWID ){ + /* If this IN operator will use an index, then the order of columns in the + ** vector might be different from the order in the index. In that case, + ** we need to reorder the LHS values to be in index order. Run Affinity + ** before reordering the columns, so that the affinity is correct. + */ + sqlite3VdbeAddOp4(v, OP_Affinity, rLhs, nVector, 0, zAff, nVector); + for(i=0; idb, aiMap); @@ -114614,7 +115791,12 @@ SQLITE_PRIVATE void sqlite3ExprCodeGeneratedColumn( iAddr = 0; } sqlite3ExprCodeCopy(pParse, sqlite3ColumnExpr(pTab,pCol), regOut); - if( pCol->affinity>=SQLITE_AFF_TEXT ){ + if( (pCol->colFlags & COLFLAG_VIRTUAL)!=0 + && (pTab->tabFlags & TF_Strict)!=0 + ){ + int p3 = 2+(int)(pCol - pTab->aCol); + sqlite3VdbeAddOp4(v, OP_TypeCheck, regOut, 1, p3, (char*)pTab, P4_TABLE); + }else if( pCol->affinity>=SQLITE_AFF_TEXT ){ sqlite3VdbeAddOp4(v, OP_Affinity, regOut, 1, 0, &pCol->affinity, 1); } if( iAddr ) sqlite3VdbeJumpHere(v, iAddr); @@ -115052,6 +116234,80 @@ static int exprPartidxExprLookup(Parse *pParse, Expr *pExpr, int iTarget){ return 0; } +/* +** Generate code that evaluates an AND or OR operator leaving a +** boolean result in a register. pExpr is the AND/OR expression. +** Store the result in the "target" register. Use short-circuit +** evaluation to avoid computing both operands, if possible. +** +** The code generated might require the use of a temporary register. +** If it does, then write the number of that temporary register +** into *pTmpReg. If not, leave *pTmpReg unchanged. +*/ +static SQLITE_NOINLINE int exprCodeTargetAndOr( + Parse *pParse, /* Parsing context */ + Expr *pExpr, /* AND or OR expression to be coded */ + int target, /* Put result in this register, guaranteed */ + int *pTmpReg /* Write a temporary register here */ +){ + int op; /* The opcode. TK_AND or TK_OR */ + int skipOp; /* Opcode for the branch that skips one operand */ + int addrSkip; /* Branch instruction that skips one of the operands */ + int regSS = 0; /* Register holding computed operand when other omitted */ + int r1, r2; /* Registers for left and right operands, respectively */ + Expr *pAlt; /* Alternative, simplified expression */ + Vdbe *v; /* statement being coded */ + + assert( pExpr!=0 ); + op = pExpr->op; + assert( op==TK_AND || op==TK_OR ); + assert( TK_AND==OP_And ); testcase( op==TK_AND ); + assert( TK_OR==OP_Or ); testcase( op==TK_OR ); + assert( pParse->pVdbe!=0 ); + v = pParse->pVdbe; + pAlt = sqlite3ExprSimplifiedAndOr(pExpr); + if( pAlt!=pExpr ){ + r1 = sqlite3ExprCodeTarget(pParse, pAlt, target); + sqlite3VdbeAddOp3(v, OP_And, r1, r1, target); + return target; + } + skipOp = op==TK_AND ? OP_IfNot : OP_If; + if( exprEvalRhsFirst(pExpr) ){ + /* Compute the right operand first. Skip the computation of the left + ** operand if the right operand fully determines the result */ + r2 = regSS = sqlite3ExprCodeTarget(pParse, pExpr->pRight, target); + addrSkip = sqlite3VdbeAddOp1(v, skipOp, r2); + VdbeComment((v, "skip left operand")); + VdbeCoverage(v); + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, pTmpReg); + }else{ + /* Compute the left operand first */ + r1 = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target); + if( ExprHasProperty(pExpr->pRight, EP_Subquery) ){ + /* Skip over the computation of the right operand if the right + ** operand is a subquery and the left operand completely determines + ** the result */ + regSS = r1; + addrSkip = sqlite3VdbeAddOp1(v, skipOp, r1); + VdbeComment((v, "skip right operand")); + VdbeCoverage(v); + }else{ + addrSkip = regSS = 0; + } + r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, pTmpReg); + } + sqlite3VdbeAddOp3(v, op, r2, r1, target); + testcase( (*pTmpReg)==0 ); + if( addrSkip ){ + sqlite3VdbeAddOp2(v, OP_Goto, 0, sqlite3VdbeCurrentAddr(v)+2); + sqlite3VdbeJumpHere(v, addrSkip); + sqlite3VdbeAddOp3(v, OP_Or, regSS, regSS, target); + VdbeComment((v, "short-circut value")); + } + return target; +} + + /* ** Generate code into the current Vdbe to evaluate the given @@ -115307,11 +116563,17 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) case TK_NE: case TK_EQ: { Expr *pLeft = pExpr->pLeft; + int addrIsNull = 0; if( sqlite3ExprIsVector(pLeft) ){ codeVectorCompare(pParse, pExpr, target, op, p5); }else{ - r1 = sqlite3ExprCodeTemp(pParse, pLeft, ®Free1); - r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); + if( ExprHasProperty(pExpr, EP_Subquery) && p5!=SQLITE_NULLEQ ){ + addrIsNull = exprComputeOperands(pParse, pExpr, + &r1, &r2, ®Free1, ®Free2); + }else{ + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); + } sqlite3VdbeAddOp2(v, OP_Integer, 1, inReg); codeCompare(pParse, pLeft, pExpr->pRight, op, r1, r2, sqlite3VdbeCurrentAddr(v)+2, p5, @@ -115326,6 +116588,11 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) sqlite3VdbeAddOp2(v, OP_Integer, 0, inReg); }else{ sqlite3VdbeAddOp3(v, OP_ZeroOrNull, r1, inReg, r2); + if( addrIsNull ){ + sqlite3VdbeAddOp2(v, OP_Goto, 0, sqlite3VdbeCurrentAddr(v)+2); + sqlite3VdbeJumpHere(v, addrIsNull); + sqlite3VdbeAddOp2(v, OP_Null, 0, inReg); + } } testcase( regFree1==0 ); testcase( regFree2==0 ); @@ -115333,7 +116600,10 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) break; } case TK_AND: - case TK_OR: + case TK_OR: { + inReg = exprCodeTargetAndOr(pParse, pExpr, target, ®Free1); + break; + } case TK_PLUS: case TK_STAR: case TK_MINUS: @@ -115344,8 +116614,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) case TK_LSHIFT: case TK_RSHIFT: case TK_CONCAT: { - assert( TK_AND==OP_And ); testcase( op==TK_AND ); - assert( TK_OR==OP_Or ); testcase( op==TK_OR ); + int addrIsNull; assert( TK_PLUS==OP_Add ); testcase( op==TK_PLUS ); assert( TK_MINUS==OP_Subtract ); testcase( op==TK_MINUS ); assert( TK_REM==OP_Remainder ); testcase( op==TK_REM ); @@ -115355,11 +116624,23 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) assert( TK_LSHIFT==OP_ShiftLeft ); testcase( op==TK_LSHIFT ); assert( TK_RSHIFT==OP_ShiftRight ); testcase( op==TK_RSHIFT ); assert( TK_CONCAT==OP_Concat ); testcase( op==TK_CONCAT ); - r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); - r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); + if( ExprHasProperty(pExpr, EP_Subquery) ){ + addrIsNull = exprComputeOperands(pParse, pExpr, + &r1, &r2, ®Free1, ®Free2); + }else{ + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); + addrIsNull = 0; + } sqlite3VdbeAddOp3(v, op, r2, r1, target); testcase( regFree1==0 ); testcase( regFree2==0 ); + if( addrIsNull ){ + sqlite3VdbeAddOp2(v, OP_Goto, 0, sqlite3VdbeCurrentAddr(v)+2); + sqlite3VdbeJumpHere(v, addrIsNull); + sqlite3VdbeAddOp2(v, OP_Null, 0, target); + VdbeComment((v, "short-circut value")); + } break; } case TK_UMINUS: { @@ -116227,17 +117508,27 @@ SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int Expr *pAlt = sqlite3ExprSimplifiedAndOr(pExpr); if( pAlt!=pExpr ){ sqlite3ExprIfTrue(pParse, pAlt, dest, jumpIfNull); - }else if( op==TK_AND ){ - int d2 = sqlite3VdbeMakeLabel(pParse); - testcase( jumpIfNull==0 ); - sqlite3ExprIfFalse(pParse, pExpr->pLeft, d2, - jumpIfNull^SQLITE_JUMPIFNULL); - sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); - sqlite3VdbeResolveLabel(v, d2); }else{ - testcase( jumpIfNull==0 ); - sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull); - sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); + Expr *pFirst, *pSecond; + if( exprEvalRhsFirst(pExpr) ){ + pFirst = pExpr->pRight; + pSecond = pExpr->pLeft; + }else{ + pFirst = pExpr->pLeft; + pSecond = pExpr->pRight; + } + if( op==TK_AND ){ + int d2 = sqlite3VdbeMakeLabel(pParse); + testcase( jumpIfNull==0 ); + sqlite3ExprIfFalse(pParse, pFirst, d2, + jumpIfNull^SQLITE_JUMPIFNULL); + sqlite3ExprIfTrue(pParse, pSecond, dest, jumpIfNull); + sqlite3VdbeResolveLabel(v, d2); + }else{ + testcase( jumpIfNull==0 ); + sqlite3ExprIfTrue(pParse, pFirst, dest, jumpIfNull); + sqlite3ExprIfTrue(pParse, pSecond, dest, jumpIfNull); + } } break; } @@ -116276,10 +117567,16 @@ SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int case TK_GE: case TK_NE: case TK_EQ: { + int addrIsNull; if( sqlite3ExprIsVector(pExpr->pLeft) ) goto default_expr; - testcase( jumpIfNull==0 ); - r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); - r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); + if( ExprHasProperty(pExpr, EP_Subquery) && jumpIfNull!=SQLITE_NULLEQ ){ + addrIsNull = exprComputeOperands(pParse, pExpr, + &r1, &r2, ®Free1, ®Free2); + }else{ + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); + addrIsNull = 0; + } codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, r1, r2, dest, jumpIfNull, ExprHasProperty(pExpr,EP_Commuted)); assert(TK_LT==OP_Lt); testcase(op==OP_Lt); VdbeCoverageIf(v,op==OP_Lt); @@ -116294,6 +117591,13 @@ SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int VdbeCoverageIf(v, op==OP_Ne && jumpIfNull!=SQLITE_NULLEQ); testcase( regFree1==0 ); testcase( regFree2==0 ); + if( addrIsNull ){ + if( jumpIfNull ){ + sqlite3VdbeChangeP2(v, addrIsNull, dest); + }else{ + sqlite3VdbeJumpHere(v, addrIsNull); + } + } break; } case TK_ISNULL: @@ -116401,17 +117705,27 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int Expr *pAlt = sqlite3ExprSimplifiedAndOr(pExpr); if( pAlt!=pExpr ){ sqlite3ExprIfFalse(pParse, pAlt, dest, jumpIfNull); - }else if( pExpr->op==TK_AND ){ - testcase( jumpIfNull==0 ); - sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull); - sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); }else{ - int d2 = sqlite3VdbeMakeLabel(pParse); - testcase( jumpIfNull==0 ); - sqlite3ExprIfTrue(pParse, pExpr->pLeft, d2, - jumpIfNull^SQLITE_JUMPIFNULL); - sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); - sqlite3VdbeResolveLabel(v, d2); + Expr *pFirst, *pSecond; + if( exprEvalRhsFirst(pExpr) ){ + pFirst = pExpr->pRight; + pSecond = pExpr->pLeft; + }else{ + pFirst = pExpr->pLeft; + pSecond = pExpr->pRight; + } + if( pExpr->op==TK_AND ){ + testcase( jumpIfNull==0 ); + sqlite3ExprIfFalse(pParse, pFirst, dest, jumpIfNull); + sqlite3ExprIfFalse(pParse, pSecond, dest, jumpIfNull); + }else{ + int d2 = sqlite3VdbeMakeLabel(pParse); + testcase( jumpIfNull==0 ); + sqlite3ExprIfTrue(pParse, pFirst, d2, + jumpIfNull^SQLITE_JUMPIFNULL); + sqlite3ExprIfFalse(pParse, pSecond, dest, jumpIfNull); + sqlite3VdbeResolveLabel(v, d2); + } } break; } @@ -116453,10 +117767,16 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int case TK_GE: case TK_NE: case TK_EQ: { + int addrIsNull; if( sqlite3ExprIsVector(pExpr->pLeft) ) goto default_expr; - testcase( jumpIfNull==0 ); - r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); - r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); + if( ExprHasProperty(pExpr, EP_Subquery) && jumpIfNull!=SQLITE_NULLEQ ){ + addrIsNull = exprComputeOperands(pParse, pExpr, + &r1, &r2, ®Free1, ®Free2); + }else{ + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); + addrIsNull = 0; + } codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, r1, r2, dest, jumpIfNull,ExprHasProperty(pExpr,EP_Commuted)); assert(TK_LT==OP_Lt); testcase(op==OP_Lt); VdbeCoverageIf(v,op==OP_Lt); @@ -116471,6 +117791,13 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int VdbeCoverageIf(v, op==OP_Ne && jumpIfNull==SQLITE_NULLEQ); testcase( regFree1==0 ); testcase( regFree2==0 ); + if( addrIsNull ){ + if( jumpIfNull ){ + sqlite3VdbeChangeP2(v, addrIsNull, dest); + }else{ + sqlite3VdbeJumpHere(v, addrIsNull); + } + } break; } case TK_ISNULL: @@ -123436,6 +124763,16 @@ SQLITE_PRIVATE Table *sqlite3LocateTable( if( pMod==0 && sqlite3_strnicmp(zName, "pragma_", 7)==0 ){ pMod = sqlite3PragmaVtabRegister(db, zName); } +#ifndef SQLITE_OMIT_JSON + if( pMod==0 && sqlite3_strnicmp(zName, "json", 4)==0 ){ + pMod = sqlite3JsonVtabRegister(db, zName); + } +#endif +#ifdef SQLITE_ENABLE_CARRAY + if( pMod==0 && sqlite3_stricmp(zName, "carray")==0 ){ + pMod = sqlite3CarrayRegister(db); + } +#endif if( pMod && sqlite3VtabEponymousTableInit(pParse, pMod) ){ testcase( pMod->pEpoTab==0 ); return pMod->pEpoTab; @@ -124074,7 +125411,7 @@ SQLITE_PRIVATE int sqlite3TableColumnToIndex(Index *pIdx, int iCol){ int i; i16 iCol16; assert( iCol>=(-1) && iCol<=SQLITE_MAX_COLUMN ); - assert( pIdx->nColumn<=SQLITE_MAX_COLUMN+1 ); + assert( pIdx->nColumn<=SQLITE_MAX_COLUMN*2 ); iCol16 = iCol; for(i=0; inColumn; i++){ if( iCol16==pIdx->aiColumn[i] ){ @@ -124371,6 +125708,9 @@ SQLITE_PRIVATE void sqlite3StartTable( sqlite3VdbeAddOp3(v, OP_Insert, 0, reg3, reg1); sqlite3VdbeChangeP5(v, OPFLAG_APPEND); sqlite3VdbeAddOp0(v, OP_Close); + }else if( db->init.imposterTable ){ + pTable->tabFlags |= TF_Imposter; + if( db->init.imposterTable>=2 ) pTable->tabFlags |= TF_Readonly; } /* Normal (non-error) return. */ @@ -128140,16 +129480,22 @@ SQLITE_PRIVATE void sqlite3SrcListIndexedBy(Parse *pParse, SrcList *p, Token *pI ** are deleted by this function. */ SQLITE_PRIVATE SrcList *sqlite3SrcListAppendList(Parse *pParse, SrcList *p1, SrcList *p2){ - assert( p1 && p1->nSrc==1 ); + assert( p1 ); + assert( p2 || pParse->nErr ); + assert( p2==0 || p2->nSrc>=1 ); + testcase( p1->nSrc==0 ); if( p2 ){ - SrcList *pNew = sqlite3SrcListEnlarge(pParse, p1, p2->nSrc, 1); + int nOld = p1->nSrc; + SrcList *pNew = sqlite3SrcListEnlarge(pParse, p1, p2->nSrc, nOld); if( pNew==0 ){ sqlite3SrcListDelete(pParse->db, p2); }else{ p1 = pNew; - memcpy(&p1->a[1], p2->a, p2->nSrc*sizeof(SrcItem)); + memcpy(&p1->a[nOld], p2->a, p2->nSrc*sizeof(SrcItem)); + assert( nOld==1 || (p2->a[0].fg.jointype & JT_LTORJ)==0 ); + assert( p1->nSrc>=1 ); + p1->a[0].fg.jointype |= (JT_LTORJ & p2->a[0].fg.jointype); sqlite3DbFree(pParse->db, p2); - p1->a[0].fg.jointype |= (JT_LTORJ & p1->a[1].fg.jointype); } } return p1; @@ -128660,14 +130006,19 @@ SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoOfIndex(Parse *pParse, Index *pIdx){ } if( pParse->nErr ){ assert( pParse->rc==SQLITE_ERROR_MISSING_COLLSEQ ); - if( pIdx->bNoQuery==0 ){ + if( pIdx->bNoQuery==0 + && sqlite3HashFind(&pIdx->pSchema->idxHash, pIdx->zName) + ){ /* Deactivate the index because it contains an unknown collating ** sequence. The only way to reactive the index is to reload the ** schema. Adding the missing collating sequence later does not ** reactive the index. The application had the chance to register ** the missing index using the collation-needed callback. For ** simplicity, SQLite will not give the application a second chance. - */ + ** + ** Except, do not do this if the index is not in the schema hash + ** table. In this case the index is currently being constructed + ** by a CREATE INDEX statement, and retrying will not help. */ pIdx->bNoQuery = 1; pParse->rc = SQLITE_ERROR_RETRY; } @@ -130864,7 +132215,7 @@ static void *contextMalloc(sqlite3_context *context, i64 nByte){ sqlite3 *db = sqlite3_context_db_handle(context); assert( nByte>0 ); testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH] ); - testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH]+1 ); + testcase( nByte==(i64)db->aLimit[SQLITE_LIMIT_LENGTH]+1 ); if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){ sqlite3_result_error_toobig(context); z = 0; @@ -131535,7 +132886,7 @@ SQLITE_PRIVATE void sqlite3QuoteValue(StrAccum *pStr, sqlite3_value *pValue, int */ static int isNHex(const char *z, int N, u32 *pVal){ int i; - int v = 0; + u32 v = 0; for(i=0; i0 && nSep>0 ){ + if( bNotNull && nSep>0 ){ memcpy(&z[j], zSep, nSep); j += nSep; } memcpy(&z[j], v, k); j += k; + bNotNull = 1; } } } @@ -133015,6 +134368,502 @@ static void signFunc( sqlite3_result_int(context, x<0.0 ? -1 : x>0.0 ? +1 : 0); } +#if defined(SQLITE_ENABLE_PERCENTILE) +/*********************************************************************** +** This section implements the percentile(Y,P) SQL function and similar. +** Requirements: +** +** (1) The percentile(Y,P) function is an aggregate function taking +** exactly two arguments. +** +** (2) If the P argument to percentile(Y,P) is not the same for every +** row in the aggregate then an error is thrown. The word "same" +** in the previous sentence means that the value differ by less +** than 0.001. +** +** (3) If the P argument to percentile(Y,P) evaluates to anything other +** than a number in the range of 0.0 to 100.0 inclusive then an +** error is thrown. +** +** (4) If any Y argument to percentile(Y,P) evaluates to a value that +** is not NULL and is not numeric then an error is thrown. +** +** (5) If any Y argument to percentile(Y,P) evaluates to plus or minus +** infinity then an error is thrown. (SQLite always interprets NaN +** values as NULL.) +** +** (6) Both Y and P in percentile(Y,P) can be arbitrary expressions, +** including CASE WHEN expressions. +** +** (7) The percentile(Y,P) aggregate is able to handle inputs of at least +** one million (1,000,000) rows. +** +** (8) If there are no non-NULL values for Y, then percentile(Y,P) +** returns NULL. +** +** (9) If there is exactly one non-NULL value for Y, the percentile(Y,P) +** returns the one Y value. +** +** (10) If there N non-NULL values of Y where N is two or more and +** the Y values are ordered from least to greatest and a graph is +** drawn from 0 to N-1 such that the height of the graph at J is +** the J-th Y value and such that straight lines are drawn between +** adjacent Y values, then the percentile(Y,P) function returns +** the height of the graph at P*(N-1)/100. +** +** (11) The percentile(Y,P) function always returns either a floating +** point number or NULL. +** +** (12) The percentile(Y,P) is implemented as a single C99 source-code +** file that compiles into a shared-library or DLL that can be loaded +** into SQLite using the sqlite3_load_extension() interface. +** +** (13) A separate median(Y) function is the equivalent percentile(Y,50). +** +** (14) A separate percentile_cont(Y,P) function is equivalent to +** percentile(Y,P/100.0). In other words, the fraction value in +** the second argument is in the range of 0 to 1 instead of 0 to 100. +** +** (15) A separate percentile_disc(Y,P) function is like +** percentile_cont(Y,P) except that instead of returning the weighted +** average of the nearest two input values, it returns the next lower +** value. So the percentile_disc(Y,P) will always return a value +** that was one of the inputs. +** +** (16) All of median(), percentile(Y,P), percentile_cont(Y,P) and +** percentile_disc(Y,P) can be used as window functions. +** +** Differences from standard SQL: +** +** * The percentile_cont(X,P) function is equivalent to the following in +** standard SQL: +** +** (percentile_cont(P) WITHIN GROUP (ORDER BY X)) +** +** The SQLite syntax is much more compact. The standard SQL syntax +** is also supported if SQLite is compiled with the +** -DSQLITE_ENABLE_ORDERED_SET_AGGREGATES option. +** +** * No median(X) function exists in the SQL standard. App developers +** are expected to write "percentile_cont(0.5)WITHIN GROUP(ORDER BY X)". +** +** * No percentile(Y,P) function exists in the SQL standard. Instead of +** percential(Y,P), developers must write this: +** "percentile_cont(P/100.0) WITHIN GROUP (ORDER BY Y)". Note that +** the fraction parameter to percentile() goes from 0 to 100 whereas +** the fraction parameter in SQL standard percentile_cont() goes from +** 0 to 1. +** +** Implementation notes as of 2024-08-31: +** +** * The regular aggregate-function versions of these routines work +** by accumulating all values in an array of doubles, then sorting +** that array using quicksort before computing the answer. Thus +** the runtime is O(NlogN) where N is the number of rows of input. +** +** * For the window-function versions of these routines, the array of +** inputs is sorted as soon as the first value is computed. Thereafter, +** the array is kept in sorted order using an insert-sort. This +** results in O(N*K) performance where K is the size of the window. +** One can imagine alternative implementations that give O(N*logN*logK) +** performance, but they require more complex logic and data structures. +** The developers have elected to keep the asymptotically slower +** algorithm for now, for simplicity, under the theory that window +** functions are seldom used and when they are, the window size K is +** often small. The developers might revisit that decision later, +** should the need arise. +*/ + +/* The following object is the group context for a single percentile() +** aggregate. Remember all input Y values until the very end. +** Those values are accumulated in the Percentile.a[] array. +*/ +typedef struct Percentile Percentile; +struct Percentile { + u64 nAlloc; /* Number of slots allocated for a[] */ + u64 nUsed; /* Number of slots actually used in a[] */ + char bSorted; /* True if a[] is already in sorted order */ + char bKeepSorted; /* True if advantageous to keep a[] sorted */ + char bPctValid; /* True if rPct is valid */ + double rPct; /* Fraction. 0.0 to 1.0 */ + double *a; /* Array of Y values */ +}; + +/* +** Return TRUE if the input floating-point number is an infinity. +*/ +static int percentIsInfinity(double r){ + sqlite3_uint64 u; + assert( sizeof(u)==sizeof(r) ); + memcpy(&u, &r, sizeof(u)); + return ((u>>52)&0x7ff)==0x7ff; +} + +/* +** Return TRUE if two doubles differ by 0.001 or less. +*/ +static int percentSameValue(double a, double b){ + a -= b; + return a>=-0.001 && a<=0.001; +} + +/* +** Search p (which must have p->bSorted) looking for an entry with +** value y. Return the index of that entry. +** +** If bExact is true, return -1 if the entry is not found. +** +** If bExact is false, return the index at which a new entry with +** value y should be insert in order to keep the values in sorted +** order. The smallest return value in this case will be 0, and +** the largest return value will be p->nUsed. +*/ +static i64 percentBinarySearch(Percentile *p, double y, int bExact){ + i64 iFirst = 0; /* First element of search range */ + i64 iLast = (i64)p->nUsed - 1; /* Last element of search range */ + while( iLast>=iFirst ){ + i64 iMid = (iFirst+iLast)/2; + double x = p->a[iMid]; + if( xy ){ + iLast = iMid - 1; + }else{ + return iMid; + } + } + if( bExact ) return -1; + return iFirst; +} + +/* +** Generate an error for a percentile function. +** +** The error format string must have exactly one occurrence of "%%s()" +** (with two '%' characters). That substring will be replaced by the name +** of the function. +*/ +static void percentError(sqlite3_context *pCtx, const char *zFormat, ...){ + char *zMsg1; + char *zMsg2; + va_list ap; + + va_start(ap, zFormat); + zMsg1 = sqlite3_vmprintf(zFormat, ap); + va_end(ap); + zMsg2 = zMsg1 ? sqlite3_mprintf(zMsg1, sqlite3VdbeFuncName(pCtx)) : 0; + sqlite3_result_error(pCtx, zMsg2, -1); + sqlite3_free(zMsg1); + sqlite3_free(zMsg2); +} + +/* +** The "step" function for percentile(Y,P) is called once for each +** input row. +*/ +static void percentStep(sqlite3_context *pCtx, int argc, sqlite3_value **argv){ + Percentile *p; + double rPct; + int eType; + double y; + assert( argc==2 || argc==1 ); + + if( argc==1 ){ + /* Requirement 13: median(Y) is the same as percentile(Y,50). */ + rPct = 0.5; + }else{ + /* P must be a number between 0 and 100 for percentile() or between + ** 0.0 and 1.0 for percentile_cont() and percentile_disc(). + ** + ** The user-data is an integer which is 10 times the upper bound. + */ + double mxFrac = (SQLITE_PTR_TO_INT(sqlite3_user_data(pCtx))&2)? 100.0 : 1.0; + eType = sqlite3_value_numeric_type(argv[1]); + rPct = sqlite3_value_double(argv[1])/mxFrac; + if( (eType!=SQLITE_INTEGER && eType!=SQLITE_FLOAT) + || rPct<0.0 || rPct>1.0 + ){ + percentError(pCtx, "the fraction argument to %%s()" + " is not between 0.0 and %.1f", + (double)mxFrac); + return; + } + } + + /* Allocate the session context. */ + p = (Percentile*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p==0 ) return; + + /* Remember the P value. Throw an error if the P value is different + ** from any prior row, per Requirement (2). */ + if( !p->bPctValid ){ + p->rPct = rPct; + p->bPctValid = 1; + }else if( !percentSameValue(p->rPct,rPct) ){ + percentError(pCtx, "the fraction argument to %%s()" + " is not the same for all input rows"); + return; + } + + /* Ignore rows for which Y is NULL */ + eType = sqlite3_value_type(argv[0]); + if( eType==SQLITE_NULL ) return; + + /* If not NULL, then Y must be numeric. Otherwise throw an error. + ** Requirement 4 */ + if( eType!=SQLITE_INTEGER && eType!=SQLITE_FLOAT ){ + percentError(pCtx, "input to %%s() is not numeric"); + return; + } + + /* Throw an error if the Y value is infinity or NaN */ + y = sqlite3_value_double(argv[0]); + if( percentIsInfinity(y) ){ + percentError(pCtx, "Inf input to %%s()"); + return; + } + + /* Allocate and store the Y */ + if( p->nUsed>=p->nAlloc ){ + u64 n = p->nAlloc*2 + 250; + double *a = sqlite3_realloc64(p->a, sizeof(double)*n); + if( a==0 ){ + sqlite3_free(p->a); + memset(p, 0, sizeof(*p)); + sqlite3_result_error_nomem(pCtx); + return; + } + p->nAlloc = n; + p->a = a; + } + if( p->nUsed==0 ){ + p->a[p->nUsed++] = y; + p->bSorted = 1; + }else if( !p->bSorted || y>=p->a[p->nUsed-1] ){ + p->a[p->nUsed++] = y; + }else if( p->bKeepSorted ){ + i64 i; + i = percentBinarySearch(p, y, 0); + if( i<(int)p->nUsed ){ + memmove(&p->a[i+1], &p->a[i], (p->nUsed-i)*sizeof(p->a[0])); + } + p->a[i] = y; + p->nUsed++; + }else{ + p->a[p->nUsed++] = y; + p->bSorted = 0; + } +} + +/* +** Interchange two doubles. +*/ +#define SWAP_DOUBLE(X,Y) {double ttt=(X);(X)=(Y);(Y)=ttt;} + +/* +** Sort an array of doubles. +** +** Algorithm: quicksort +** +** This is implemented separately rather than using the qsort() routine +** from the standard library because: +** +** (1) To avoid a dependency on qsort() +** (2) To avoid the function call to the comparison routine for each +** comparison. +*/ +static void percentSort(double *a, unsigned int n){ + int iLt; /* Entries before a[iLt] are less than rPivot */ + int iGt; /* Entries at or after a[iGt] are greater than rPivot */ + int i; /* Loop counter */ + double rPivot; /* The pivot value */ + + assert( n>=2 ); + if( a[0]>a[n-1] ){ + SWAP_DOUBLE(a[0],a[n-1]) + } + if( n==2 ) return; + iGt = n-1; + i = n/2; + if( a[0]>a[i] ){ + SWAP_DOUBLE(a[0],a[i]) + }else if( a[i]>a[iGt] ){ + SWAP_DOUBLE(a[i],a[iGt]) + } + if( n==3 ) return; + rPivot = a[i]; + iLt = i = 1; + do{ + if( a[i]iLt ) SWAP_DOUBLE(a[i],a[iLt]) + iLt++; + i++; + }else if( a[i]>rPivot ){ + do{ + iGt--; + }while( iGt>i && a[iGt]>rPivot ); + SWAP_DOUBLE(a[i],a[iGt]) + }else{ + i++; + } + }while( i=2 ) percentSort(a, iLt); + if( n-iGt>=2 ) percentSort(a+iGt, n-iGt); + +/* Uncomment for testing */ +#if 0 + for(i=0; ibSorted==0 ){ + assert( p->nUsed>1 ); + percentSort(p->a, p->nUsed); + p->bSorted = 1; + } + p->bKeepSorted = 1; + + /* Find and remove the row */ + i = percentBinarySearch(p, y, 1); + if( i>=0 ){ + p->nUsed--; + if( i<(int)p->nUsed ){ + memmove(&p->a[i], &p->a[i+1], (p->nUsed - i)*sizeof(p->a[0])); + } + } +} + +/* +** Compute the final output of percentile(). Clean up all allocated +** memory if and only if bIsFinal is true. +*/ +static void percentCompute(sqlite3_context *pCtx, int bIsFinal){ + Percentile *p; + int settings = SQLITE_PTR_TO_INT(sqlite3_user_data(pCtx))&1; /* Discrete? */ + unsigned i1, i2; + double v1, v2; + double ix, vx; + p = (Percentile*)sqlite3_aggregate_context(pCtx, 0); + if( p==0 ) return; + if( p->a==0 ) return; + if( p->nUsed ){ + if( p->bSorted==0 ){ + assert( p->nUsed>1 ); + percentSort(p->a, p->nUsed); + p->bSorted = 1; + } + ix = p->rPct*(p->nUsed-1); + i1 = (unsigned)ix; + if( settings & 1 ){ + vx = p->a[i1]; + }else{ + i2 = ix==(double)i1 || i1==p->nUsed-1 ? i1 : i1+1; + v1 = p->a[i1]; + v2 = p->a[i2]; + vx = v1 + (v2-v1)*(ix-i1); + } + sqlite3_result_double(pCtx, vx); + } + if( bIsFinal ){ + sqlite3_free(p->a); + memset(p, 0, sizeof(*p)); + }else{ + p->bKeepSorted = 1; + } +} +static void percentFinal(sqlite3_context *pCtx){ + percentCompute(pCtx, 1); +} +static void percentValue(sqlite3_context *pCtx){ + percentCompute(pCtx, 0); +} +/****** End of percentile family of functions ******/ +#endif /* SQLITE_ENABLE_PERCENTILE */ + +#if defined(SQLITE_DEBUG) || defined(SQLITE_ENABLE_FILESTAT) +/* +** Implementation of sqlite_filestat(SCHEMA). +** +** Return JSON text that describes low-level debug/diagnostic information +** about the sqlite3_file object associated with SCHEMA. +*/ +static void filestatFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + sqlite3 *db = sqlite3_context_db_handle(context); + const char *zDbName; + sqlite3_str *pStr; + Btree *pBtree; + + zDbName = (const char*)sqlite3_value_text(argv[0]); + pBtree = sqlite3DbNameToBtree(db, zDbName); + if( pBtree ){ + Pager *pPager; + sqlite3_file *fd; + int rc; + sqlite3BtreeEnter(pBtree); + pPager = sqlite3BtreePager(pBtree); + assert( pPager!=0 ); + fd = sqlite3PagerFile(pPager); + pStr = sqlite3_str_new(db); + if( pStr==0 ){ + sqlite3_result_error_nomem(context); + }else{ + sqlite3_str_append(pStr, "{\"db\":", 6); + rc = sqlite3OsFileControl(fd, SQLITE_FCNTL_FILESTAT, pStr); + if( rc ) sqlite3_str_append(pStr, "null", 4); + fd = sqlite3PagerJrnlFile(pPager); + if( fd && fd->pMethods!=0 ){ + sqlite3_str_appendall(pStr, ",\"journal\":"); + rc = sqlite3OsFileControl(fd, SQLITE_FCNTL_FILESTAT, pStr); + if( rc ) sqlite3_str_append(pStr, "null", 4); + } + sqlite3_str_append(pStr, "}", 1); + sqlite3_result_text(context, sqlite3_str_finish(pStr), -1, + sqlite3_free); + } + sqlite3BtreeLeave(pBtree); + }else{ + sqlite3_result_text(context, "{}", 2, SQLITE_STATIC); + } +} +#endif /* SQLITE_DEBUG || SQLITE_ENABLE_FILESTAT */ + #ifdef SQLITE_DEBUG /* ** Implementation of fpdecode(x,y,z) function. @@ -133172,6 +135021,9 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){ INLINE_FUNC(likely, 1, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY), #ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC INLINE_FUNC(sqlite_offset, 1, INLINEFUNC_sqlite_offset, 0 ), +#endif +#if defined(SQLITE_DEBUG) || defined(SQLITE_ENABLE_FILESTAT) + FUNCTION(sqlite_filestat, 1, 0, 0, filestatFunc ), #endif FUNCTION(ltrim, 1, 1, 0, trimFunc ), FUNCTION(ltrim, 2, 1, 0, trimFunc ), @@ -133245,6 +135097,21 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){ WAGGREGATE(string_agg, 2, 0, 0, groupConcatStep, groupConcatFinalize, groupConcatValue, groupConcatInverse, 0), +#ifdef SQLITE_ENABLE_PERCENTILE + WAGGREGATE(median, 1, 0,0, percentStep, + percentFinal, percentValue, percentInverse, + SQLITE_INNOCUOUS|SQLITE_SELFORDER1), + WAGGREGATE(percentile, 2, 0x2,0, percentStep, + percentFinal, percentValue, percentInverse, + SQLITE_INNOCUOUS|SQLITE_SELFORDER1), + WAGGREGATE(percentile_cont, 2, 0,0, percentStep, + percentFinal, percentValue, percentInverse, + SQLITE_INNOCUOUS|SQLITE_SELFORDER1), + WAGGREGATE(percentile_disc, 2, 0x1,0, percentStep, + percentFinal, percentValue, percentInverse, + SQLITE_INNOCUOUS|SQLITE_SELFORDER1), +#endif /* SQLITE_ENABLE_PERCENTILE */ + LIKEFUNC(glob, 2, &globInfo, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE), #ifdef SQLITE_CASE_SENSITIVE_LIKE LIKEFUNC(like, 2, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE), @@ -134999,12 +136866,15 @@ SQLITE_PRIVATE void sqlite3TableAffinity(Vdbe *v, Table *pTab, int iReg){ ** by one slot and insert a new OP_TypeCheck where the current ** OP_MakeRecord is found */ VdbeOp *pPrev; + int p3; sqlite3VdbeAppendP4(v, pTab, P4_TABLE); pPrev = sqlite3VdbeGetLastOp(v); assert( pPrev!=0 ); assert( pPrev->opcode==OP_MakeRecord || sqlite3VdbeDb(v)->mallocFailed ); pPrev->opcode = OP_TypeCheck; - sqlite3VdbeAddOp3(v, OP_MakeRecord, pPrev->p1, pPrev->p2, pPrev->p3); + p3 = pPrev->p3; + pPrev->p3 = 0; + sqlite3VdbeAddOp3(v, OP_MakeRecord, pPrev->p1, pPrev->p2, p3); }else{ /* Insert an isolated OP_Typecheck */ sqlite3VdbeAddOp2(v, OP_TypeCheck, iReg, pTab->nNVCol); @@ -138739,6 +140609,10 @@ struct sqlite3_api_routines { int (*set_clientdata)(sqlite3*, const char*, void*, void(*)(void*)); /* Version 3.50.0 and later */ int (*setlk_timeout)(sqlite3*,int,int); + /* Version 3.51.0 and later */ + int (*set_errmsg)(sqlite3*,int,const char*); + int (*db_status64)(sqlite3*,int,sqlite3_int64*,sqlite3_int64*,int); + }; /* @@ -139074,6 +140948,9 @@ typedef int (*sqlite3_loadext_entry)( #define sqlite3_set_clientdata sqlite3_api->set_clientdata /* Version 3.50.0 and later */ #define sqlite3_setlk_timeout sqlite3_api->setlk_timeout +/* Version 3.51.0 and later */ +#define sqlite3_set_errmsg sqlite3_api->set_errmsg +#define sqlite3_db_status64 sqlite3_api->db_status64 #endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ #if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) @@ -139597,7 +141474,10 @@ static const sqlite3_api_routines sqlite3Apis = { sqlite3_get_clientdata, sqlite3_set_clientdata, /* Version 3.50.0 and later */ - sqlite3_setlk_timeout + sqlite3_setlk_timeout, + /* Version 3.51.0 and later */ + sqlite3_set_errmsg, + sqlite3_db_status64 }; /* True if x is the directory separator character @@ -141059,6 +142939,22 @@ static int integrityCheckResultRow(Vdbe *v){ return addr; } +/* +** Should table pTab be skipped when doing an integrity_check? +** Return true or false. +** +** If pObjTab is not null, the return true if pTab matches pObjTab. +** +** If pObjTab is null, then return true only if pTab is an imposter table. +*/ +static int tableSkipIntegrityCheck(const Table *pTab, const Table *pObjTab){ + if( pObjTab ){ + return pTab!=pObjTab; + }else{ + return (pTab->tabFlags & TF_Imposter)!=0; + } +} + /* ** Process a pragma statement. ** @@ -142404,7 +144300,7 @@ SQLITE_PRIVATE void sqlite3Pragma( Table *pTab = sqliteHashData(x); /* Current table */ Index *pIdx; /* An index on pTab */ int nIdx; /* Number of indexes on pTab */ - if( pObjTab && pObjTab!=pTab ) continue; + if( tableSkipIntegrityCheck(pTab,pObjTab) ) continue; if( HasRowid(pTab) ) cnt++; for(nIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdx++){ cnt++; } } @@ -142417,7 +144313,7 @@ SQLITE_PRIVATE void sqlite3Pragma( for(x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){ Table *pTab = sqliteHashData(x); Index *pIdx; - if( pObjTab && pObjTab!=pTab ) continue; + if( tableSkipIntegrityCheck(pTab,pObjTab) ) continue; if( HasRowid(pTab) ) aRoot[++cnt] = pTab->tnum; for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ aRoot[++cnt] = pIdx->tnum; @@ -142448,7 +144344,7 @@ SQLITE_PRIVATE void sqlite3Pragma( int iTab = 0; Table *pTab = sqliteHashData(x); Index *pIdx; - if( pObjTab && pObjTab!=pTab ) continue; + if( tableSkipIntegrityCheck(pTab,pObjTab) ) continue; if( HasRowid(pTab) ){ iTab = cnt++; }else{ @@ -142484,7 +144380,7 @@ SQLITE_PRIVATE void sqlite3Pragma( int r2; /* Previous key for WITHOUT ROWID tables */ int mxCol; /* Maximum non-virtual column number */ - if( pObjTab && pObjTab!=pTab ) continue; + if( tableSkipIntegrityCheck(pTab,pObjTab) ) continue; if( !IsOrdinaryTable(pTab) ) continue; if( isQuick || HasRowid(pTab) ){ pPk = 0; @@ -142808,7 +144704,7 @@ SQLITE_PRIVATE void sqlite3Pragma( Table *pTab = sqliteHashData(x); sqlite3_vtab *pVTab; int a1; - if( pObjTab && pObjTab!=pTab ) continue; + if( tableSkipIntegrityCheck(pTab,pObjTab) ) continue; if( IsOrdinaryTable(pTab) ) continue; if( !IsVirtual(pTab) ) continue; if( pTab->nCol<=0 ){ @@ -143040,6 +144936,8 @@ SQLITE_PRIVATE void sqlite3Pragma( eMode = SQLITE_CHECKPOINT_RESTART; }else if( sqlite3StrICmp(zRight, "truncate")==0 ){ eMode = SQLITE_CHECKPOINT_TRUNCATE; + }else if( sqlite3StrICmp(zRight, "noop")==0 ){ + eMode = SQLITE_CHECKPOINT_NOOP; } } pParse->nMem = 3; @@ -144606,9 +146504,11 @@ static int sqlite3LockAndPrepare( rc = sqlite3Prepare(db, zSql, nBytes, prepFlags, pOld, ppStmt, pzTail); assert( rc==SQLITE_OK || *ppStmt==0 ); if( rc==SQLITE_OK || db->mallocFailed ) break; - }while( (rc==SQLITE_ERROR_RETRY && (cnt++)errMask)==rc ); db->busyHandler.nBusy = 0; @@ -145223,7 +147123,7 @@ static int tableAndColumnIndex( int iEnd, /* Last member of pSrc->a[] to check */ const char *zCol, /* Name of the column we are looking for */ int *piTab, /* Write index of pSrc->a[] here */ - int *piCol, /* Write index of pSrc->a[*piTab].pTab->aCol[] here */ + int *piCol, /* Write index of pSrc->a[*piTab].pSTab->aCol[] here */ int bIgnoreHidden /* Ignore hidden columns */ ){ int i; /* For looping over tables in pSrc */ @@ -145282,8 +147182,7 @@ SQLITE_PRIVATE void sqlite3SetJoinExpr(Expr *p, int iTable, u32 joinFlag){ assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) ); ExprSetVVAProperty(p, EP_NoReduce); p->w.iJoin = iTable; - if( p->op==TK_FUNCTION ){ - assert( ExprUseXList(p) ); + if( ExprUseXList(p) ){ if( p->x.pList ){ int i; for(i=0; ix.pList->nExpr; i++){ @@ -145499,6 +147398,7 @@ static int sqlite3ProcessJoin(Parse *pParse, Select *p){ p->pWhere = sqlite3ExprAnd(pParse, p->pWhere, pRight->u3.pOn); pRight->u3.pOn = 0; pRight->fg.isOn = 1; + p->selFlags |= SF_OnToWhere; } } return 0; @@ -146385,7 +148285,10 @@ static void selectInnerLoop( */ SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoAlloc(sqlite3 *db, int N, int X){ int nExtra = (N+X)*(sizeof(CollSeq*)+1); - KeyInfo *p = sqlite3DbMallocRawNN(db, SZ_KEYINFO(0) + nExtra); + KeyInfo *p; + assert( X>=0 ); + if( NEVER(N+X>0xffff) ) return (KeyInfo*)sqlite3OomFault(db); + p = sqlite3DbMallocRawNN(db, SZ_KEYINFO(0) + nExtra); if( p ){ p->aSortFlags = (u8*)&p->aColl[N+X]; p->nKeyField = (u16)N; @@ -146952,6 +148855,10 @@ static void generateColumnTypes( #endif sqlite3VdbeSetColName(v, i, COLNAME_DECLTYPE, zType, SQLITE_TRANSIENT); } +#else + UNUSED_PARAMETER(pParse); + UNUSED_PARAMETER(pTabList); + UNUSED_PARAMETER(pEList); #endif /* !defined(SQLITE_OMIT_DECLTYPE) */ } @@ -147871,8 +149778,10 @@ static int multiSelect( int priorOp; /* The SRT_ operation to apply to prior selects */ Expr *pLimit; /* Saved values of p->nLimit */ int addr; + int emptyBypass = 0; /* IfEmpty opcode to bypass RHS */ SelectDest uniondest; + testcase( p->op==TK_EXCEPT ); testcase( p->op==TK_UNION ); priorOp = SRT_Union; @@ -147910,6 +149819,8 @@ static int multiSelect( */ if( p->op==TK_EXCEPT ){ op = SRT_Except; + emptyBypass = sqlite3VdbeAddOp1(v, OP_IfEmpty, unionTab); + VdbeCoverage(v); }else{ assert( p->op==TK_UNION ); op = SRT_Union; @@ -147930,6 +149841,7 @@ static int multiSelect( if( p->op==TK_UNION ){ p->nSelectRow = sqlite3LogEstAdd(p->nSelectRow, pPrior->nSelectRow); } + if( emptyBypass ) sqlite3VdbeJumpHere(v, emptyBypass); sqlite3ExprDelete(db, p->pLimit); p->pLimit = pLimit; p->iLimit = 0; @@ -147960,9 +149872,10 @@ static int multiSelect( int tab1, tab2; int iCont, iBreak, iStart; Expr *pLimit; - int addr; + int addr, iLimit, iOffset; SelectDest intersectdest; int r1; + int emptyBypass; /* INTERSECT is different from the others since it requires ** two temporary tables. Hence it has its own case. Begin @@ -147987,14 +149900,28 @@ static int multiSelect( goto multi_select_end; } + /* Initialize LIMIT counters before checking to see if the LHS + ** is empty, in case the jump is taken */ + iBreak = sqlite3VdbeMakeLabel(pParse); + computeLimitRegisters(pParse, p, iBreak); + emptyBypass = sqlite3VdbeAddOp1(v, OP_IfEmpty, tab1); VdbeCoverage(v); + /* Code the current SELECT into temporary table "tab2" */ addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, tab2, 0); assert( p->addrOpenEphm[1] == -1 ); p->addrOpenEphm[1] = addr; - p->pPrior = 0; + + /* Disable prior SELECTs and the LIMIT counters during the computation + ** of the RHS select */ pLimit = p->pLimit; + iLimit = p->iLimit; + iOffset = p->iOffset; + p->pPrior = 0; p->pLimit = 0; + p->iLimit = 0; + p->iOffset = 0; + intersectdest.iSDParm = tab2; ExplainQueryPlan((pParse, 1, "%s USING TEMP B-TREE", sqlite3SelectOpName(p->op))); @@ -148007,19 +149934,21 @@ static int multiSelect( p->nSelectRow = pPrior->nSelectRow; } sqlite3ExprDelete(db, p->pLimit); + + /* Reinstate the LIMIT counters prior to running the final intersect */ p->pLimit = pLimit; + p->iLimit = iLimit; + p->iOffset = iOffset; /* Generate code to take the intersection of the two temporary ** tables. */ if( rc ) break; assert( p->pEList ); - iBreak = sqlite3VdbeMakeLabel(pParse); - iCont = sqlite3VdbeMakeLabel(pParse); - computeLimitRegisters(pParse, p, iBreak); - sqlite3VdbeAddOp2(v, OP_Rewind, tab1, iBreak); VdbeCoverage(v); + sqlite3VdbeAddOp1(v, OP_Rewind, tab1); r1 = sqlite3GetTempReg(pParse); iStart = sqlite3VdbeAddOp2(v, OP_RowData, tab1, r1); + iCont = sqlite3VdbeMakeLabel(pParse); sqlite3VdbeAddOp4Int(v, OP_NotFound, tab2, iCont, r1, 0); VdbeCoverage(v); sqlite3ReleaseTempReg(pParse, r1); @@ -148029,6 +149958,7 @@ static int multiSelect( sqlite3VdbeAddOp2(v, OP_Next, tab1, iStart); VdbeCoverage(v); sqlite3VdbeResolveLabel(v, iBreak); sqlite3VdbeAddOp2(v, OP_Close, tab2, 0); + sqlite3VdbeJumpHere(v, emptyBypass); sqlite3VdbeAddOp2(v, OP_Close, tab1, 0); break; } @@ -148677,7 +150607,7 @@ static int multiSelectOrderBy( ** ## About "isOuterJoin": ** ** The isOuterJoin column indicates that the replacement will occur into a -** position in the parent that NULL-able due to an OUTER JOIN. Either the +** position in the parent that is NULL-able due to an OUTER JOIN. Either the ** target slot in the parent is the right operand of a LEFT JOIN, or one of ** the left operands of a RIGHT JOIN. In either case, we need to potentially ** bypass the substituted expression with OP_IfNullRow. @@ -148707,6 +150637,7 @@ typedef struct SubstContext { int iTable; /* Replace references to this table */ int iNewTable; /* New table number */ int isOuterJoin; /* Add TK_IF_NULL_ROW opcodes on each replacement */ + int nSelDepth; /* Depth of sub-query recursion. Top==1 */ ExprList *pEList; /* Replacement expressions */ ExprList *pCList; /* Collation sequences for replacement expr */ } SubstContext; @@ -148814,6 +150745,9 @@ static Expr *substExpr( if( pExpr->op==TK_IF_NULL_ROW && pExpr->iTable==pSubst->iTable ){ pExpr->iTable = pSubst->iNewTable; } + if( pExpr->op==TK_AGG_FUNCTION && pExpr->op2>=pSubst->nSelDepth ){ + pExpr->op2--; + } pExpr->pLeft = substExpr(pSubst, pExpr->pLeft); pExpr->pRight = substExpr(pSubst, pExpr->pRight); if( ExprUseXSelect(pExpr) ){ @@ -148851,6 +150785,7 @@ static void substSelect( SrcItem *pItem; int i; if( !p ) return; + pSubst->nSelDepth++; do{ substExprList(pSubst, p->pEList); substExprList(pSubst, p->pGroupBy); @@ -148868,6 +150803,7 @@ static void substSelect( } } }while( doPrior && (p = p->pPrior)!=0 ); + pSubst->nSelDepth--; } #endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */ @@ -149479,7 +151415,7 @@ static int flattenSubquery( ** complete, since there may still exist Expr.pTab entries that ** refer to the subquery even after flattening. Ticket #3346. ** - ** pSubitem->pTab is always non-NULL by test restrictions and tests above. + ** pSubitem->pSTab is always non-NULL by test restrictions and tests above. */ if( ALWAYS(pSubitem->pSTab!=0) ){ Table *pTabToDel = pSubitem->pSTab; @@ -149509,17 +151445,12 @@ static int flattenSubquery( pSub = pSub1; for(pParent=p; pParent; pParent=pParent->pPrior, pSub=pSub->pPrior){ int nSubSrc; - u8 jointype = 0; - u8 ltorj = pSrc->a[iFrom].fg.jointype & JT_LTORJ; + u8 jointype = pSubitem->fg.jointype; assert( pSub!=0 ); pSubSrc = pSub->pSrc; /* FROM clause of subquery */ nSubSrc = pSubSrc->nSrc; /* Number of terms in subquery FROM clause */ pSrc = pParent->pSrc; /* FROM clause of the outer query */ - if( pParent==p ){ - jointype = pSubitem->fg.jointype; /* First time through the loop */ - } - /* The subquery uses a single slot of the FROM clause of the outer ** query. If the subquery has more than one element in its FROM clause, ** then expand the outer query to make space for it to hold all elements @@ -149539,6 +151470,7 @@ static int flattenSubquery( pSrc = sqlite3SrcListEnlarge(pParse, pSrc, nSubSrc-1,iFrom+1); if( pSrc==0 ) break; pParent->pSrc = pSrc; + pSubitem = &pSrc->a[iFrom]; } /* Transfer the FROM clause terms from the subquery into the @@ -149553,11 +151485,10 @@ static int flattenSubquery( || pItem->u4.zDatabase==0 ); if( pItem->fg.isUsing ) sqlite3IdListDelete(db, pItem->u3.pUsing); *pItem = pSubSrc->a[i]; - pItem->fg.jointype |= ltorj; + pItem->fg.jointype |= (jointype & JT_LTORJ); memset(&pSubSrc->a[i], 0, sizeof(pSubSrc->a[i])); } - pSrc->a[iFrom].fg.jointype &= JT_LTORJ; - pSrc->a[iFrom].fg.jointype |= jointype | ltorj; + pSubitem->fg.jointype |= jointype; /* Now begin substituting subquery result set expressions for ** references to the iParent in the outer query. @@ -149609,6 +151540,7 @@ static int flattenSubquery( x.iTable = iParent; x.iNewTable = iNewParent; x.isOuterJoin = isOuterJoin; + x.nSelDepth = 0; x.pEList = pSub->pEList; x.pCList = findLeftmostExprlist(pSub); substSelect(&x, pParent, 0); @@ -150194,6 +152126,7 @@ static int pushDownWhereTerms( x.iTable = pSrc->iCursor; x.iNewTable = pSrc->iCursor; x.isOuterJoin = 0; + x.nSelDepth = 0; x.pEList = pSubq->pEList; x.pCList = findLeftmostExprlist(pSubq); pNew = substExpr(&x, pNew); @@ -150591,7 +152524,7 @@ SQLITE_PRIVATE With *sqlite3WithPush(Parse *pParse, With *pWith, u8 bFree){ ** CTE expression, through routine checks to see if the reference is ** a recursive reference to the CTE. ** -** If pFrom matches a CTE according to either of these two above, pFrom->pTab +** If pFrom matches a CTE according to either of these two above, pFrom->pSTab ** and other fields are populated accordingly. ** ** Return 0 if no match is found. @@ -151629,6 +153562,7 @@ static void resetAccumulator(Parse *pParse, AggInfo *pAggInfo){ if( pFunc->bOBPayload ){ /* extra columns for the function arguments */ assert( ExprUseXList(pFunc->pFExpr) ); + assert( pFunc->pFExpr->x.pList!=0 ); nExtra += pFunc->pFExpr->x.pList->nExpr; } if( pFunc->bUseSubtype ){ @@ -152218,6 +154152,193 @@ static int fromClauseTermCanBeCoroutine( return 1; } +/* +** Argument pWhere is the WHERE clause belonging to SELECT statement p. This +** function attempts to transform expressions of the form: +** +** EXISTS (SELECT ...) +** +** into joins. For example, given +** +** CREATE TABLE sailors(sid INTEGER PRIMARY KEY, name TEXT); +** CREATE TABLE reserves(sid INT, day DATE, PRIMARY KEY(sid, day)); +** +** SELECT name FROM sailors AS S WHERE EXISTS ( +** SELECT * FROM reserves AS R WHERE S.sid = R.sid AND R.day = '2022-10-25' +** ); +** +** the SELECT statement may be transformed as follows: +** +** SELECT name FROM sailors AS S, reserves AS R +** WHERE S.sid = R.sid AND R.day = '2022-10-25'; +** +** **Approximately**. Really, we have to ensure that the FROM-clause term +** that was formerly inside the EXISTS is only executed once. This is handled +** by setting the SrcItem.fg.fromExists flag, which then causes code in +** the where.c file to exit the corresponding loop after the first successful +** match (if any). +*/ +static SQLITE_NOINLINE void existsToJoin( + Parse *pParse, /* Parsing context */ + Select *p, /* The SELECT statement being optimized */ + Expr *pWhere /* part of the WHERE clause currently being examined */ +){ + if( pParse->nErr==0 + && pWhere!=0 + && !ExprHasProperty(pWhere, EP_OuterON|EP_InnerON) + && ALWAYS(p->pSrc!=0) + && p->pSrc->nSrcop==TK_AND ){ + Expr *pRight = pWhere->pRight; + existsToJoin(pParse, p, pWhere->pLeft); + existsToJoin(pParse, p, pRight); + } + else if( pWhere->op==TK_EXISTS ){ + Select *pSub = pWhere->x.pSelect; + Expr *pSubWhere = pSub->pWhere; + if( pSub->pSrc->nSrc==1 + && (pSub->selFlags & SF_Aggregate)==0 + && !pSub->pSrc->a[0].fg.isSubquery + && pSub->pLimit==0 + ){ + memset(pWhere, 0, sizeof(*pWhere)); + pWhere->op = TK_INTEGER; + pWhere->u.iValue = 1; + ExprSetProperty(pWhere, EP_IntValue); + + assert( p->pWhere!=0 ); + pSub->pSrc->a[0].fg.fromExists = 1; + pSub->pSrc->a[0].fg.jointype |= JT_CROSS; + p->pSrc = sqlite3SrcListAppendList(pParse, p->pSrc, pSub->pSrc); + if( pSubWhere ){ + p->pWhere = sqlite3PExpr(pParse, TK_AND, p->pWhere, pSubWhere); + pSub->pWhere = 0; + } + pSub->pSrc = 0; + sqlite3ParserAddCleanup(pParse, sqlite3SelectDeleteGeneric, pSub); +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x100000 ){ + TREETRACE(0x100000,pParse,p, + ("After EXISTS-to-JOIN optimization:\n")); + sqlite3TreeViewSelect(0, p, 0); + } +#endif + existsToJoin(pParse, p, pSubWhere); + } + } + } +} + +/* +** Type used for Walker callbacks by selectCheckOnClauses(). +*/ +typedef struct CheckOnCtx CheckOnCtx; +struct CheckOnCtx { + SrcList *pSrc; /* SrcList for this context */ + int iJoin; /* Cursor numbers must be =< than this */ + CheckOnCtx *pParent; /* Parent context */ +}; + +/* +** True if the SrcList passed as the only argument contains at least +** one RIGHT or FULL JOIN. False otherwise. +*/ +#define hasRightJoin(pSrc) (((pSrc)->a[0].fg.jointype & JT_LTORJ)!=0) + +/* +** The xExpr callback for the search of invalid ON clause terms. +*/ +static int selectCheckOnClausesExpr(Walker *pWalker, Expr *pExpr){ + CheckOnCtx *pCtx = pWalker->u.pCheckOnCtx; + + /* Check if pExpr is root or near-root of an ON clause constraint that needs + ** to be checked to ensure that it does not refer to tables in its FROM + ** clause to the right of itself. i.e. it is either: + ** + ** + an ON clause on an OUTER join, or + ** + an ON clause on an INNER join within a FROM that features at + ** least one RIGHT or FULL join. + */ + if( (ExprHasProperty(pExpr, EP_OuterON)) + || (ExprHasProperty(pExpr, EP_InnerON) && hasRightJoin(pCtx->pSrc)) + ){ + /* If CheckOnCtx.iJoin is already set, then fall through and process + ** this expression node as normal. Or, if CheckOnCtx.iJoin is still 0, + ** set it to the cursor number of the RHS of the join to which this + ** ON expression was attached and then iterate through the entire + ** expression. */ + assert( pCtx->iJoin==0 || pCtx->iJoin==pExpr->w.iJoin ); + if( pCtx->iJoin==0 ){ + pCtx->iJoin = pExpr->w.iJoin; + sqlite3WalkExprNN(pWalker, pExpr); + pCtx->iJoin = 0; + return WRC_Prune; + } + } + + if( pExpr->op==TK_COLUMN ){ + /* A column expression. Find the SrcList (if any) to which it refers. + ** Then, if CheckOnCtx.iJoin indicates that this expression is part of an + ** ON clause from that SrcList (i.e. if iJoin is non-zero), check that it + ** does not refer to a table to the right of CheckOnCtx.iJoin. */ + do { + SrcList *pSrc = pCtx->pSrc; + int iTab = pExpr->iTable; + if( iTab>=pSrc->a[0].iCursor && iTab<=pSrc->a[pSrc->nSrc-1].iCursor ){ + if( pCtx->iJoin && iTab>pCtx->iJoin ){ + sqlite3ErrorMsg(pWalker->pParse, + "ON clause references tables to its right"); + return WRC_Abort; + } + break; + } + pCtx = pCtx->pParent; + }while( pCtx ); + } + return WRC_Continue; +} + +/* +** The xSelect callback for the search of invalid ON clause terms. +*/ +static int selectCheckOnClausesSelect(Walker *pWalker, Select *pSelect){ + CheckOnCtx *pCtx = pWalker->u.pCheckOnCtx; + if( pSelect->pSrc==pCtx->pSrc || pSelect->pSrc->nSrc==0 ){ + return WRC_Continue; + }else{ + CheckOnCtx sCtx; + memset(&sCtx, 0, sizeof(sCtx)); + sCtx.pSrc = pSelect->pSrc; + sCtx.pParent = pCtx; + pWalker->u.pCheckOnCtx = &sCtx; + sqlite3WalkSelect(pWalker, pSelect); + pWalker->u.pCheckOnCtx = pCtx; + pSelect->selFlags &= ~SF_OnToWhere; + return WRC_Prune; + } +} + +/* +** Check all ON clauses in pSelect to verify that they do not reference +** columns to the right. +*/ +static void selectCheckOnClauses(Parse *pParse, Select *pSelect){ + Walker w; + CheckOnCtx sCtx; + assert( pSelect->selFlags & SF_OnToWhere ); + assert( pSelect->pSrc!=0 && pSelect->pSrc->nSrc>=2 ); + memset(&w, 0, sizeof(w)); + w.pParse = pParse; + w.xExprCallback = selectCheckOnClausesExpr; + w.xSelectCallback = selectCheckOnClausesSelect; + w.u.pCheckOnCtx = &sCtx; + memset(&sCtx, 0, sizeof(sCtx)); + sCtx.pSrc = pSelect->pSrc; + sqlite3WalkExprNN(&w, pSelect->pWhere); + pSelect->selFlags &= ~SF_OnToWhere; +} + /* ** Generate byte-code for the SELECT statement given in the p argument. ** @@ -152345,6 +154466,18 @@ SQLITE_PRIVATE int sqlite3Select( } #endif + /* If the SELECT statement contains ON clauses that were moved into + ** the WHERE clause, go through and verify that none of the terms + ** in the ON clauses reference tables to the right of the ON clause. + ** Do this now, after name resolution, but before query flattening + */ + if( p->selFlags & SF_OnToWhere ){ + selectCheckOnClauses(pParse, p); + if( pParse->nErr ){ + goto select_end; + } + } + /* If the SF_UFSrcCheck flag is set, then this function is being called ** as part of populating the temp table for an UPDATE...FROM statement. ** In this case, it is an error if the target object (pSrc->a[0]) name @@ -152586,6 +154719,13 @@ SQLITE_PRIVATE int sqlite3Select( } #endif + /* If there may be an "EXISTS (SELECT ...)" in the WHERE clause, attempt + ** to change it into a join. */ + if( pParse->bHasExists && OptimizationEnabled(db,SQLITE_ExistsToJoin) ){ + existsToJoin(pParse, p, p->pWhere); + pTabList = p->pSrc; + } + /* Do the WHERE-clause constant propagation optimization if this is ** a join. No need to spend time on this operation for non-join queries ** as the equivalent optimization will be handled by query planner in @@ -153373,12 +155513,12 @@ SQLITE_PRIVATE int sqlite3Select( ** for the next GROUP BY batch. */ sqlite3VdbeAddOp2(v, OP_Gosub, regOutputRow, addrOutputRow); - VdbeComment((v, "output one row")); + VdbeComment((v, "output one row of %d", p->selId)); sqlite3ExprCodeMove(pParse, iBMem, iAMem, pGroupBy->nExpr); sqlite3VdbeAddOp2(v, OP_IfPos, iAbortFlag, addrEnd); VdbeCoverage(v); VdbeComment((v, "check abort flag")); sqlite3VdbeAddOp2(v, OP_Gosub, regReset, addrReset); - VdbeComment((v, "reset accumulator")); + VdbeComment((v, "reset accumulator %d", p->selId)); /* Update the aggregate accumulators based on the content of ** the current row @@ -153386,7 +155526,7 @@ SQLITE_PRIVATE int sqlite3Select( sqlite3VdbeJumpHere(v, addr1); updateAccumulator(pParse, iUseFlag, pAggInfo, eDist); sqlite3VdbeAddOp2(v, OP_Integer, 1, iUseFlag); - VdbeComment((v, "indicate data in accumulator")); + VdbeComment((v, "indicate data in accumulator %d", p->selId)); /* End of the loop */ @@ -153403,7 +155543,7 @@ SQLITE_PRIVATE int sqlite3Select( /* Output the final row of result */ sqlite3VdbeAddOp2(v, OP_Gosub, regOutputRow, addrOutputRow); - VdbeComment((v, "output final row")); + VdbeComment((v, "output final row of %d", p->selId)); /* Jump over the subroutines */ @@ -153424,7 +155564,7 @@ SQLITE_PRIVATE int sqlite3Select( addrOutputRow = sqlite3VdbeCurrentAddr(v); sqlite3VdbeAddOp2(v, OP_IfPos, iUseFlag, addrOutputRow+2); VdbeCoverage(v); - VdbeComment((v, "Groupby result generator entry point")); + VdbeComment((v, "Groupby result generator entry point %d", p->selId)); sqlite3VdbeAddOp1(v, OP_Return, regOutputRow); finalizeAggFunctions(pParse, pAggInfo); sqlite3ExprIfFalse(pParse, pHaving, addrOutputRow+1, SQLITE_JUMPIFNULL); @@ -153432,14 +155572,14 @@ SQLITE_PRIVATE int sqlite3Select( &sDistinct, pDest, addrOutputRow+1, addrSetAbort); sqlite3VdbeAddOp1(v, OP_Return, regOutputRow); - VdbeComment((v, "end groupby result generator")); + VdbeComment((v, "end groupby result generator %d", p->selId)); /* Generate a subroutine that will reset the group-by accumulator */ sqlite3VdbeResolveLabel(v, addrReset); resetAccumulator(pParse, pAggInfo); sqlite3VdbeAddOp2(v, OP_Integer, 0, iUseFlag); - VdbeComment((v, "indicate accumulator empty")); + VdbeComment((v, "indicate accumulator %d empty", p->selId)); sqlite3VdbeAddOp1(v, OP_Return, regReset); if( distFlag!=0 && eDist!=WHERE_DISTINCT_NOOP ){ @@ -154903,7 +157043,10 @@ static void codeReturningTrigger( Returning *pReturning; Select sSelect; SrcList *pFrom; - u8 fromSpace[SZ_SRCLIST_1]; + union { + SrcList sSrc; + u8 fromSpace[SZ_SRCLIST_1]; + } uSrc; assert( v!=0 ); if( !pParse->bReturning ){ @@ -154919,8 +157062,8 @@ static void codeReturningTrigger( return; } memset(&sSelect, 0, sizeof(sSelect)); - pFrom = (SrcList*)fromSpace; - memset(pFrom, 0, SZ_SRCLIST_1); + memset(&uSrc, 0, sizeof(uSrc)); + pFrom = &uSrc.sSrc; sSelect.pEList = sqlite3ExprListDup(db, pReturning->pReturnEL, 0); sSelect.pSrc = pFrom; pFrom->nSrc = 1; @@ -157327,7 +159470,8 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3RunVacuum( saved_nChange = db->nChange; saved_nTotalChange = db->nTotalChange; saved_mTrace = db->mTrace; - db->flags |= SQLITE_WriteSchema | SQLITE_IgnoreChecks | SQLITE_Comments; + db->flags |= SQLITE_WriteSchema | SQLITE_IgnoreChecks | SQLITE_Comments + | SQLITE_AttachCreate | SQLITE_AttachWrite; db->mDbFlags |= DBFLAG_PreferBuiltin | DBFLAG_Vacuum; db->flags &= ~(u64)(SQLITE_ForeignKeys | SQLITE_ReverseOrder | SQLITE_Defensive | SQLITE_CountRows); @@ -159030,6 +161174,7 @@ struct WhereLevel { int iTabCur; /* The VDBE cursor used to access the table */ int iIdxCur; /* The VDBE cursor used to access pIdx */ int addrBrk; /* Jump here to break out of the loop */ + int addrHalt; /* Abort the query due to empty table or similar */ int addrNxt; /* Jump here to start the next IN combination */ int addrSkip; /* Jump here for next iteration of skip-scan */ int addrCont; /* Jump here to continue with the next loop cycle */ @@ -159235,6 +161380,9 @@ struct WhereTerm { u8 eMatchOp; /* Op for vtab MATCH/LIKE/GLOB/REGEXP terms */ int iParent; /* Disable pWC->a[iParent] when this term disabled */ int leftCursor; /* Cursor number of X in "X " */ +#ifdef SQLITE_DEBUG + int iTerm; /* Which WhereTerm is this, for debug purposes */ +#endif union { struct { int leftColumn; /* Column number of X in "X " */ @@ -159727,7 +161875,6 @@ SQLITE_PRIVATE void sqlite3WhereAddExplainText( #endif { VdbeOp *pOp = sqlite3VdbeGetOp(pParse->pVdbe, addr); - SrcItem *pItem = &pTabList->a[pLevel->iFrom]; sqlite3 *db = pParse->db; /* Database handle */ int isSearch; /* True for a SEARCH. False for SCAN. */ @@ -159750,7 +161897,10 @@ SQLITE_PRIVATE void sqlite3WhereAddExplainText( sqlite3StrAccumInit(&str, db, zBuf, sizeof(zBuf), SQLITE_MAX_LENGTH); str.printfFlags = SQLITE_PRINTF_INTERNAL; - sqlite3_str_appendf(&str, "%s %S", isSearch ? "SEARCH" : "SCAN", pItem); + sqlite3_str_appendf(&str, "%s %S%s", + isSearch ? "SEARCH" : "SCAN", + pItem, + pItem->fg.fromExists ? " EXISTS" : ""); if( (flags & (WHERE_IPK|WHERE_VIRTUALTABLE))==0 ){ const char *zFmt = 0; Index *pIdx; @@ -160994,6 +163144,7 @@ static SQLITE_NOINLINE void filterPullDown( int addrNxt, /* Jump here to bypass inner loops */ Bitmask notReady /* Loops that are not ready */ ){ + int saved_addrBrk; while( ++iLevel < pWInfo->nLevel ){ WhereLevel *pLevel = &pWInfo->a[iLevel]; WhereLoop *pLoop = pLevel->pWLoop; @@ -161002,7 +163153,7 @@ static SQLITE_NOINLINE void filterPullDown( /* ,--- Because sqlite3ConstructBloomFilter() has will not have set ** vvvvv--' pLevel->regFilter if this were true. */ if( NEVER(pLoop->prereq & notReady) ) continue; - assert( pLevel->addrBrk==0 ); + saved_addrBrk = pLevel->addrBrk; pLevel->addrBrk = addrNxt; if( pLoop->wsFlags & WHERE_IPK ){ WhereTerm *pTerm = pLoop->aLTerm[0]; @@ -161032,7 +163183,7 @@ static SQLITE_NOINLINE void filterPullDown( VdbeCoverage(pParse->pVdbe); } pLevel->regFilter = 0; - pLevel->addrBrk = 0; + pLevel->addrBrk = saved_addrBrk; } } @@ -161079,7 +163230,6 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( sqlite3 *db; /* Database connection */ SrcItem *pTabItem; /* FROM clause term being coded */ int addrBrk; /* Jump here to break out of the loop */ - int addrHalt; /* addrBrk for the outermost loop */ int addrCont; /* Jump here to continue with next cycle */ int iRowidReg = 0; /* Rowid is stored in this register, if not zero */ int iReleaseReg = 0; /* Temp register to free before returning */ @@ -161123,7 +163273,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( ** there are no IN operators in the constraints, the "addrNxt" label ** is the same as "addrBrk". */ - addrBrk = pLevel->addrBrk = pLevel->addrNxt = sqlite3VdbeMakeLabel(pParse); + addrBrk = pLevel->addrNxt = pLevel->addrBrk; addrCont = pLevel->addrCont = sqlite3VdbeMakeLabel(pParse); /* If this is the right table of a LEFT OUTER JOIN, allocate and @@ -161139,14 +163289,6 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( VdbeComment((v, "init LEFT JOIN match flag")); } - /* Compute a safe address to jump to if we discover that the table for - ** this loop is empty and can never contribute content. */ - for(j=iLevel; j>0; j--){ - if( pWInfo->a[j].iLeftJoin ) break; - if( pWInfo->a[j].pRJ ) break; - } - addrHalt = pWInfo->a[j].addrBrk; - /* Special case of a FROM clause subquery implemented as a co-routine */ if( pTabItem->fg.viaCoroutine ){ int regYield; @@ -161385,7 +163527,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( VdbeCoverageIf(v, pX->op==TK_GE); sqlite3ReleaseTempReg(pParse, rTemp); }else{ - sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iCur, addrHalt); + sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iCur, pLevel->addrHalt); VdbeCoverageIf(v, bRev==0); VdbeCoverageIf(v, bRev!=0); } @@ -161425,36 +163567,36 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( sqlite3VdbeChangeP5(v, SQLITE_AFF_NUMERIC | SQLITE_JUMPIFNULL); } }else if( pLoop->wsFlags & WHERE_INDEXED ){ - /* Case 4: A scan using an index. + /* Case 4: Search using an index. ** - ** The WHERE clause may contain zero or more equality - ** terms ("==" or "IN" operators) that refer to the N - ** left-most columns of the index. It may also contain - ** inequality constraints (>, <, >= or <=) on the indexed - ** column that immediately follows the N equalities. Only - ** the right-most column can be an inequality - the rest must - ** use the "==" and "IN" operators. For example, if the - ** index is on (x,y,z), then the following clauses are all - ** optimized: + ** The WHERE clause may contain zero or more equality + ** terms ("==" or "IN" or "IS" operators) that refer to the N + ** left-most columns of the index. It may also contain + ** inequality constraints (>, <, >= or <=) on the indexed + ** column that immediately follows the N equalities. Only + ** the right-most column can be an inequality - the rest must + ** use the "==", "IN", or "IS" operators. For example, if the + ** index is on (x,y,z), then the following clauses are all + ** optimized: ** - ** x=5 - ** x=5 AND y=10 - ** x=5 AND y<10 - ** x=5 AND y>5 AND y<10 - ** x=5 AND y=5 AND z<=10 + ** x=5 + ** x=5 AND y=10 + ** x=5 AND y<10 + ** x=5 AND y>5 AND y<10 + ** x=5 AND y=5 AND z<=10 ** - ** The z<10 term of the following cannot be used, only - ** the x=5 term: + ** The z<10 term of the following cannot be used, only + ** the x=5 term: ** - ** x=5 AND z<10 + ** x=5 AND z<10 ** - ** N may be zero if there are inequality constraints. - ** If there are no inequality constraints, then N is at - ** least one. + ** N may be zero if there are inequality constraints. + ** If there are no inequality constraints, then N is at + ** least one. ** - ** This case is also used when there are no WHERE clause - ** constraints but an index is selected anyway, in order - ** to force the output order to conform to an ORDER BY. + ** This case is also used when there are no WHERE clause + ** constraints but an index is selected anyway, in order + ** to force the output order to conform to an ORDER BY. */ static const u8 aStartOp[] = { 0, @@ -162180,7 +164322,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( codeCursorHint(pTabItem, pWInfo, pLevel, 0); pLevel->op = aStep[bRev]; pLevel->p1 = iCur; - pLevel->p2 = 1 + sqlite3VdbeAddOp2(v, aStart[bRev], iCur, addrHalt); + pLevel->p2 = 1 + sqlite3VdbeAddOp2(v, aStart[bRev],iCur,pLevel->addrHalt); VdbeCoverageIf(v, bRev==0); VdbeCoverageIf(v, bRev!=0); pLevel->p5 = SQLITE_STMTSTATUS_FULLSCAN_STEP; @@ -162452,7 +164594,10 @@ SQLITE_PRIVATE SQLITE_NOINLINE void sqlite3WhereRightJoinLoop( WhereLoop *pLoop = pLevel->pWLoop; SrcItem *pTabItem = &pWInfo->pTabList->a[pLevel->iFrom]; SrcList *pFrom; - u8 fromSpace[SZ_SRCLIST_1]; + union { + SrcList sSrc; + u8 fromSpace[SZ_SRCLIST_1]; + } uSrc; Bitmask mAll = 0; int k; @@ -162496,7 +164641,7 @@ SQLITE_PRIVATE SQLITE_NOINLINE void sqlite3WhereRightJoinLoop( sqlite3ExprDup(pParse->db, pTerm->pExpr, 0)); } } - pFrom = (SrcList*)fromSpace; + pFrom = &uSrc.sSrc; pFrom->nSrc = 1; pFrom->nAlloc = 1; memcpy(&pFrom->a[0], pTabItem, sizeof(SrcItem)); @@ -163491,7 +165636,7 @@ static int termIsEquivalence(Parse *pParse, Expr *pExpr, SrcList *pSrc){ if( ExprHasProperty(pExpr, EP_OuterON) ) return 0; /* (3) */ assert( pSrc!=0 ); if( pExpr->op==TK_IS - && pSrc->nSrc + && pSrc->nSrc>=2 && (pSrc->a[0].fg.jointype & JT_LTORJ)!=0 ){ return 0; /* (4) */ @@ -163667,6 +165812,9 @@ static void exprAnalyze( } assert( pWC->nTerm > idxTerm ); pTerm = &pWC->a[idxTerm]; +#ifdef SQLITE_DEBUG + pTerm->iTerm = idxTerm; +#endif pMaskSet = &pWInfo->sMaskSet; pExpr = pTerm->pExpr; assert( pExpr!=0 ); /* Because malloc() has not failed */ @@ -163710,21 +165858,7 @@ static void exprAnalyze( prereqAll |= x; extraRight = x-1; /* ON clause terms may not be used with an index ** on left table of a LEFT JOIN. Ticket #3015 */ - if( (prereqAll>>1)>=x ){ - sqlite3ErrorMsg(pParse, "ON clause references tables to its right"); - return; - } }else if( (prereqAll>>1)>=x ){ - /* The ON clause of an INNER JOIN references a table to its right. - ** Most other SQL database engines raise an error. But SQLite versions - ** 3.0 through 3.38 just put the ON clause constraint into the WHERE - ** clause and carried on. Beginning with 3.39, raise an error only - ** if there is a RIGHT or FULL JOIN in the query. This makes SQLite - ** more like other systems, and also preserves legacy. */ - if( ALWAYS(pSrc->nSrc>0) && (pSrc->a[0].fg.jointype & JT_LTORJ)!=0 ){ - sqlite3ErrorMsg(pParse, "ON clause references tables to its right"); - return; - } ExprClearProperty(pExpr, EP_InnerON); } } @@ -164081,7 +166215,7 @@ static void exprAnalyze( idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC); testcase( idxNew==0 ); pNewTerm = &pWC->a[idxNew]; - pNewTerm->prereqRight = prereqExpr; + pNewTerm->prereqRight = prereqExpr | extraRight; pNewTerm->leftCursor = pLeft->iTable; pNewTerm->u.x.leftColumn = pLeft->iColumn; pNewTerm->eOperator = WO_AUX; @@ -164192,7 +166326,7 @@ static void whereAddLimitExpr( ** ** 1. The SELECT statement has a LIMIT clause, and ** 2. The SELECT statement is not an aggregate or DISTINCT query, and -** 3. The SELECT statement has exactly one object in its from clause, and +** 3. The SELECT statement has exactly one object in its FROM clause, and ** that object is a virtual table, and ** 4. There are no terms in the WHERE clause that will not be passed ** to the virtual table xBestIndex method. @@ -164229,8 +166363,22 @@ SQLITE_PRIVATE void SQLITE_NOINLINE sqlite3WhereAddLimit(WhereClause *pWC, Selec ** (leftCursor==iCsr) test below. */ continue; } - if( pWC->a[ii].leftCursor!=iCsr ) return; - if( pWC->a[ii].prereqRight!=0 ) return; + if( pWC->a[ii].leftCursor==iCsr && pWC->a[ii].prereqRight==0 ) continue; + + /* If this term has a parent with exactly one child, and the parent will + ** be passed through to xBestIndex, then this term can be ignored. */ + if( pWC->a[ii].iParent>=0 ){ + WhereTerm *pParent = &pWC->a[ pWC->a[ii].iParent ]; + if( pParent->leftCursor==iCsr + && pParent->prereqRight==0 + && pParent->nChild==1 + ){ + continue; + } + } + + /* This term will not be passed through. Do not add a LIMIT clause. */ + return; } /* Check condition (5). Return early if it is not met. */ @@ -164894,11 +167042,11 @@ static WhereTerm *whereScanNext(WhereScan *pScan){ pScan->pWC = pWC; pScan->k = k+1; #ifdef WHERETRACE_ENABLED - if( sqlite3WhereTrace & 0x20000 ){ + if( (sqlite3WhereTrace & 0x20000)!=0 && pScan->nEquiv>1 ){ int ii; - sqlite3DebugPrintf("SCAN-TERM %p: nEquiv=%d", - pTerm, pScan->nEquiv); - for(ii=0; iinEquiv; ii++){ + sqlite3DebugPrintf("EQUIVALENT TO {%d:%d} (due to TERM-%d):", + pScan->aiCur[0], pScan->aiColumn[0], pTerm->iTerm); + for(ii=1; iinEquiv; ii++){ sqlite3DebugPrintf(" {%d:%d}", pScan->aiCur[ii], pScan->aiColumn[ii]); } @@ -165669,7 +167817,9 @@ static SQLITE_NOINLINE void constructAutomaticIndex( VdbeCoverage(v); VdbeComment((v, "next row of %s", pSrc->pSTab->zName)); }else{ - addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, pLevel->iTabCur); VdbeCoverage(v); + assert( pLevel->addrHalt ); + addrTop = sqlite3VdbeAddOp2(v, OP_Rewind,pLevel->iTabCur,pLevel->addrHalt); + VdbeCoverage(v); } if( pPartial ){ iContinue = sqlite3VdbeMakeLabel(pParse); @@ -165697,11 +167847,14 @@ static SQLITE_NOINLINE void constructAutomaticIndex( pSrc->u4.pSubq->regResult, pLevel->iIdxCur); sqlite3VdbeGoto(v, addrTop); pSrc->fg.viaCoroutine = 0; + sqlite3VdbeJumpHere(v, addrTop); }else{ sqlite3VdbeAddOp2(v, OP_Next, pLevel->iTabCur, addrTop+1); VdbeCoverage(v); sqlite3VdbeChangeP5(v, SQLITE_STMTSTATUS_AUTOINDEX); + if( (pSrc->fg.jointype & JT_LEFT)!=0 ){ + sqlite3VdbeJumpHere(v, addrTop); + } } - sqlite3VdbeJumpHere(v, addrTop); sqlite3ReleaseTempReg(pParse, regRecord); /* Jump here when skipping the initialization */ @@ -166853,6 +169006,7 @@ SQLITE_PRIVATE void sqlite3WhereTermPrint(WhereTerm *pTerm, int iTerm){ }else{ sqlite3_snprintf(sizeof(zLeft),zLeft,"left=%d", pTerm->leftCursor); } + iTerm = pTerm->iTerm = MAX(iTerm,pTerm->iTerm); sqlite3DebugPrintf( "TERM-%-3d %p %s %-12s op=%03x wtFlags=%04x", iTerm, pTerm, zType, zLeft, pTerm->eOperator, pTerm->wtFlags); @@ -167994,6 +170148,7 @@ static int whereLoopAddBtreeIndex( && pProbe->hasStat1!=0 && OptimizationEnabled(db, SQLITE_SkipScan) && pProbe->aiRowLogEst[saved_nEq+1]>=42 /* TUNING: Minimum for skip-scan */ + && pSrc->fg.fromExists==0 && (rc = whereLoopResize(db, pNew, pNew->nLTerm+1))==SQLITE_OK ){ LogEst nIter; @@ -169565,6 +171720,10 @@ static i8 wherePathSatisfiesOrderBy( && ((wctrlFlags&(WHERE_DISTINCTBY|WHERE_SORTBYGROUP))!=WHERE_DISTINCTBY) ){ obSat = obDone; + }else{ + /* No further ORDER BY terms may be matched. So this call should + ** return >=0, not -1. Clear isOrderDistinct to ensure it does so. */ + isOrderDistinct = 0; } break; } @@ -170310,8 +172469,15 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ ** mxChoice best-so-far paths. ** ** First look for an existing path among best-so-far paths - ** that covers the same set of loops and has the same isOrdered - ** setting as the current path candidate. + ** that: + ** (1) covers the same set of loops, and + ** (2) has a compatible isOrdered value. + ** + ** "Compatible isOrdered value" means either + ** (A) both have isOrdered==-1, or + ** (B) both have isOrder>=0, or + ** (C) ordering does not matter because this is the last round + ** of the solver. ** ** The term "((pTo->isOrdered^isOrdered)&0x80)==0" is equivalent ** to (pTo->isOrdered==(-1))==(isOrdered==(-1))" for the range @@ -170320,7 +172486,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ testcase( nTo==0 ); for(jj=0, pTo=aTo; jjmaskLoop==maskNew - && ((pTo->isOrdered^isOrdered)&0x80)==0 + && ( ((pTo->isOrdered^isOrdered)&0x80)==0 || iLoop==nLoop-1 ) ){ testcase( jj==nTo-1 ); break; @@ -170475,11 +172641,10 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ return SQLITE_ERROR; } - /* Find the lowest cost path. pFrom will be left pointing to that path */ + /* Only one path is available, which is the best path */ + assert( nFrom==1 ); pFrom = aFrom; - for(ii=1; iirCost>aFrom[ii].rCost ) pFrom = &aFrom[ii]; - } + assert( pWInfo->nLevel==nLoop ); /* Load the lowest cost path into pWInfo */ for(iLoop=0; iLoopnLevel; i++){ WhereLoop *p = pWInfo->a[i].pWLoop; if( p==0 ) break; - if( (p->wsFlags & WHERE_VIRTUALTABLE)!=0 ) continue; + if( (p->wsFlags & WHERE_VIRTUALTABLE)!=0 ){ + /* Treat a vtab scan as similar to a full-table scan */ + break; + } if( (p->wsFlags & (WHERE_COLUMN_EQ|WHERE_COLUMN_NULL|WHERE_COLUMN_IN))!=0 ){ u8 iTab = p->iTab; WhereLoop *pLoop; @@ -171550,6 +173718,14 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( pTab = pTabItem->pSTab; iDb = sqlite3SchemaToIndex(db, pTab->pSchema); pLoop = pLevel->pWLoop; + pLevel->addrBrk = sqlite3VdbeMakeLabel(pParse); + if( ii==0 || (pTabItem[0].fg.jointype & JT_LEFT)!=0 ){ + pLevel->addrHalt = pLevel->addrBrk; + }else if( pWInfo->a[ii-1].pRJ ){ + pLevel->addrHalt = pWInfo->a[ii-1].addrBrk; + }else{ + pLevel->addrHalt = pWInfo->a[ii-1].addrHalt; + } if( (pTab->tabFlags & TF_Ephemeral)!=0 || IsView(pTab) ){ /* Do nothing */ }else @@ -171601,6 +173777,13 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( sqlite3VdbeAddOp4Dup8(v, OP_ColumnsUsed, pTabItem->iCursor, 0, 0, (const u8*)&pTabItem->colUsed, P4_INT64); #endif + if( ii>=2 + && (pTabItem[0].fg.jointype & (JT_LTORJ|JT_LEFT))==0 + && pLevel->addrHalt==pWInfo->a[0].addrHalt + ){ + sqlite3VdbeAddOp2(v, OP_IfEmpty, pTabItem->iCursor, pWInfo->iBreak); + VdbeCoverage(v); + } }else{ sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); } @@ -171857,6 +174040,9 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ sqlite3VdbeAddOp2(v, OP_Goto, 1, pLevel->p2); } #endif /* SQLITE_DISABLE_SKIPAHEAD_DISTINCT */ + if( pTabList->a[pLevel->iFrom].fg.fromExists ){ + sqlite3VdbeAddOp2(v, OP_Goto, 0, sqlite3VdbeCurrentAddr(v)+2); + } /* The common case: Advance to the next row */ if( pLevel->addrCont ) sqlite3VdbeResolveLabel(v, pLevel->addrCont); sqlite3VdbeAddOp3(v, pLevel->op, pLevel->p1, pLevel->p2, pLevel->p3); @@ -174707,7 +176893,7 @@ static int windowExprGtZero(Parse *pParse, Expr *pExpr){ ** ** ROWS BETWEEN FOLLOWING AND FOLLOWING ** -** ... loop started by sqlite3WhereBegin() ... +** ... loop started by sqlite3WhereBegin() ... ** if( new partition ){ ** Gosub flush ** } @@ -175225,6 +177411,12 @@ SQLITE_PRIVATE void sqlite3WindowCodeStep( addrBreak2 = windowCodeOp(&s, WINDOW_AGGINVERSE, 0, 1); }else{ assert( pMWin->eEnd==TK_FOLLOWING ); + /* assert( regStart>=0 ); + ** regEnd = regEnd - regStart; + ** regStart = 0; */ + sqlite3VdbeAddOp3(v, OP_Subtract, regStart, regEnd, regEnd); + sqlite3VdbeAddOp2(v, OP_Integer, 0, regStart); + addrStart = sqlite3VdbeCurrentAddr(v); addrBreak1 = windowCodeOp(&s, WINDOW_RETURN_ROW, regEnd, 1); addrBreak2 = windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 1); @@ -181620,8 +183812,9 @@ static int analyzeFilterKeyword(const unsigned char *z, int lastToken){ ** Return the length (in bytes) of the token that begins at z[0]. ** Store the token type in *tokenType before returning. */ -SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ - int i, c; +SQLITE_PRIVATE i64 sqlite3GetToken(const unsigned char *z, int *tokenType){ + i64 i; + int c; switch( aiClass[*z] ){ /* Switch on the character-class of the first byte ** of the token. See the comment on the CC_ defines ** above. */ @@ -181949,7 +184142,7 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql){ int nErr = 0; /* Number of errors encountered */ void *pEngine; /* The LEMON-generated LALR(1) parser */ - int n = 0; /* Length of the next token token */ + i64 n = 0; /* Length of the next token token */ int tokenType; /* type of the next token */ int lastTokenParsed = -1; /* type of the previous token */ sqlite3 *db = pParse->db; /* The database connection */ @@ -182052,13 +184245,13 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql){ }else if( tokenType!=TK_QNUMBER ){ Token x; x.z = zSql; - x.n = n; + x.n = (u32)n; sqlite3ErrorMsg(pParse, "unrecognized token: \"%T\"", &x); break; } } pParse->sLastToken.z = zSql; - pParse->sLastToken.n = n; + pParse->sLastToken.n = (u32)n; sqlite3Parser(pEngine, tokenType, pParse->sLastToken); lastTokenParsed = tokenType; zSql += n; @@ -182134,7 +184327,7 @@ SQLITE_PRIVATE char *sqlite3Normalize( ){ sqlite3 *db; /* The database connection */ int i; /* Next unread byte of zSql[] */ - int n; /* length of current token */ + i64 n; /* length of current token */ int tokenType; /* type of current token */ int prevType = 0; /* Previous non-whitespace token */ int nParen; /* Number of nested levels of parentheses */ @@ -182712,9 +184905,6 @@ static int (*const sqlite3BuiltinExtensions[])(sqlite3*) = { sqlite3DbstatRegister, #endif sqlite3TestExtInit, -#if !defined(SQLITE_OMIT_VIRTUALTABLE) && !defined(SQLITE_OMIT_JSON) - sqlite3JsonTableFunctions, -#endif #ifdef SQLITE_ENABLE_STMTVTAB sqlite3StmtVtabInit, #endif @@ -184170,6 +186360,9 @@ SQLITE_PRIVATE const char *sqlite3ErrName(int rc){ case SQLITE_OK: zName = "SQLITE_OK"; break; case SQLITE_ERROR: zName = "SQLITE_ERROR"; break; case SQLITE_ERROR_SNAPSHOT: zName = "SQLITE_ERROR_SNAPSHOT"; break; + case SQLITE_ERROR_RETRY: zName = "SQLITE_ERROR_RETRY"; break; + case SQLITE_ERROR_MISSING_COLLSEQ: + zName = "SQLITE_ERROR_MISSING_COLLSEQ"; break; case SQLITE_INTERNAL: zName = "SQLITE_INTERNAL"; break; case SQLITE_PERM: zName = "SQLITE_PERM"; break; case SQLITE_ABORT: zName = "SQLITE_ABORT"; break; @@ -185351,6 +187544,29 @@ SQLITE_API const char *sqlite3_errmsg(sqlite3 *db){ return z; } +/* +** Set the error code and error message associated with the database handle. +** +** This routine is intended to be called by outside extensions (ex: the +** Session extension). Internal logic should invoke sqlite3Error() or +** sqlite3ErrorWithMsg() directly. +*/ +SQLITE_API int sqlite3_set_errmsg(sqlite3 *db, int errcode, const char *zMsg){ + int rc = SQLITE_OK; + if( !sqlite3SafetyCheckSickOrOk(db) ){ + return SQLITE_MISUSE_BKPT; + } + sqlite3_mutex_enter(db->mutex); + if( zMsg ){ + sqlite3ErrorWithMsg(db, errcode, "%s", zMsg); + }else{ + sqlite3Error(db, errcode); + } + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + /* ** Return the byte offset of the most recent error */ @@ -187175,13 +189391,15 @@ SQLITE_API int sqlite3_test_control(int op, ...){ break; } - /* sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, db, dbName, onOff, tnum); + /* sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, db, dbName, mode, tnum); ** ** This test control is used to create imposter tables. "db" is a pointer ** to the database connection. dbName is the database name (ex: "main" or - ** "temp") which will receive the imposter. "onOff" turns imposter mode on - ** or off. "tnum" is the root page of the b-tree to which the imposter - ** table should connect. + ** "temp") which will receive the imposter. "mode" turns imposter mode on + ** or off. mode==0 means imposter mode is off. mode==1 means imposter mode + ** is on. mode==2 means imposter mode is on but results in an imposter + ** table that is read-only unless writable_schema is on. "tnum" is the + ** root page of the b-tree to which the imposter table should connect. ** ** Enable imposter mode only when the schema has already been parsed. Then ** run a single CREATE TABLE statement to construct the imposter table in @@ -188418,6 +190636,13 @@ SQLITE_PRIVATE void sqlite3ConnectionClosed(sqlite3 *db){ #ifndef _FTSINT_H #define _FTSINT_H +/* +** Activate assert() only if SQLITE_TEST is enabled. +*/ +#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) +# define NDEBUG 1 +#endif + /* #include */ /* #include */ /* #include */ @@ -188425,10 +190650,6 @@ SQLITE_PRIVATE void sqlite3ConnectionClosed(sqlite3 *db){ /* #include */ /* #include */ -#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) -# define NDEBUG 1 -#endif - /* FTS3/FTS4 require virtual tables */ #ifdef SQLITE_OMIT_VIRTUALTABLE # undef SQLITE_ENABLE_FTS3 @@ -188871,13 +191092,6 @@ typedef sqlite3_int64 i64; /* 8-byte signed integer */ */ #define UNUSED_PARAMETER(x) (void)(x) -/* -** Activate assert() only if SQLITE_TEST is enabled. -*/ -#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) -# define NDEBUG 1 -#endif - /* ** The TESTONLY macro is used to enclose variable declarations or ** other bits of code that are needed to support the arguments @@ -188898,7 +191112,7 @@ typedef sqlite3_int64 i64; /* 8-byte signed integer */ ** Macros needed to provide flexible arrays in a portable way */ #ifndef offsetof -# define offsetof(STRUCTURE,FIELD) ((size_t)((char*)&((STRUCTURE*)0)->FIELD)) +# define offsetof(ST,M) ((size_t)((char*)&((ST*)0)->M - (char*)0)) #endif #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) # define FLEXARRAY @@ -203152,8 +205366,8 @@ struct NodeWriter { ** to an appendable b-tree segment. */ struct IncrmergeWriter { - int nLeafEst; /* Space allocated for leaf blocks */ - int nWork; /* Number of leaf pages flushed */ + i64 nLeafEst; /* Space allocated for leaf blocks */ + i64 nWork; /* Number of leaf pages flushed */ sqlite3_int64 iAbsLevel; /* Absolute level of input segments */ int iIdx; /* Index of *output* segment in iAbsLevel+1 */ sqlite3_int64 iStart; /* Block number of first allocated block */ @@ -203899,7 +206113,7 @@ static int fts3IncrmergeWriter( ){ int rc; /* Return Code */ int i; /* Iterator variable */ - int nLeafEst = 0; /* Blocks allocated for leaf nodes */ + i64 nLeafEst = 0; /* Blocks allocated for leaf nodes */ sqlite3_stmt *pLeafEst = 0; /* SQL used to determine nLeafEst */ sqlite3_stmt *pFirstBlock = 0; /* SQL used to determine first block */ @@ -203909,7 +206123,7 @@ static int fts3IncrmergeWriter( sqlite3_bind_int64(pLeafEst, 1, iAbsLevel); sqlite3_bind_int64(pLeafEst, 2, pCsr->nSegment); if( SQLITE_ROW==sqlite3_step(pLeafEst) ){ - nLeafEst = sqlite3_column_int(pLeafEst, 0); + nLeafEst = sqlite3_column_int64(pLeafEst, 0); } rc = sqlite3_reset(pLeafEst); } @@ -205292,10 +207506,6 @@ SQLITE_PRIVATE int sqlite3Fts3Optimize(Fts3Table *p){ /* #include */ /* #include */ -#ifndef SQLITE_AMALGAMATION -typedef sqlite3_int64 i64; -#endif - /* ** Characters that may appear in the second argument to matchinfo(). */ @@ -210149,7 +212359,7 @@ static u32 jsonTranslateBlobToText( jsonAppendChar(pOut, '\''); break; case 'v': - jsonAppendRawNZ(pOut, "\\u0009", 6); + jsonAppendRawNZ(pOut, "\\u000b", 6); break; case 'x': if( sz2<4 ){ @@ -210999,19 +213209,27 @@ static void jsonReturnTextJsonFromBlob( ** ** If the value is a primitive, return it as an SQL value. ** If the value is an array or object, return it as either -** JSON text or the BLOB encoding, depending on the JSON_B flag -** on the userdata. +** JSON text or the BLOB encoding, depending on the eMode flag +** as follows: +** +** eMode==0 JSONB if the JSON_B flag is set in userdata or +** text if the JSON_B flag is omitted from userdata. +** +** eMode==1 Text +** +** eMode==2 JSONB */ static void jsonReturnFromBlob( JsonParse *pParse, /* Complete JSON parse tree */ u32 i, /* Index of the node */ sqlite3_context *pCtx, /* Return value for this function */ - int textOnly /* return text JSON. Disregard user-data */ + int eMode /* Format of return: text of JSONB */ ){ u32 n, sz; int rc; sqlite3 *db = sqlite3_context_db_handle(pCtx); + assert( eMode>=0 && eMode<=2 ); n = jsonbPayloadSize(pParse, i, &sz); if( n==0 ){ sqlite3_result_error(pCtx, "malformed JSON", -1); @@ -211052,7 +213270,19 @@ static void jsonReturnFromBlob( rc = sqlite3DecOrHexToI64(z, &iRes); sqlite3DbFree(db, z); if( rc==0 ){ - sqlite3_result_int64(pCtx, bNeg ? -iRes : iRes); + if( iRes<0 ){ + /* A hexadecimal literal with 16 significant digits and with the + ** high-order bit set is a negative integer in SQLite (and hence + ** iRes comes back as negative) but should be interpreted as a + ** positive value if it occurs within JSON. The value is too + ** large to appear as an SQLite integer so it must be converted + ** into floating point. */ + double r; + r = (double)*(sqlite3_uint64*)&iRes; + sqlite3_result_double(pCtx, bNeg ? -r : r); + }else{ + sqlite3_result_int64(pCtx, bNeg ? -iRes : iRes); + } }else if( rc==3 && bNeg ){ sqlite3_result_int64(pCtx, SMALLEST_INT64); }else if( rc==1 ){ @@ -211130,8 +213360,14 @@ static void jsonReturnFromBlob( } case JSONB_ARRAY: case JSONB_OBJECT: { - int flags = textOnly ? 0 : SQLITE_PTR_TO_INT(sqlite3_user_data(pCtx)); - if( flags & JSON_BLOB ){ + if( eMode==0 ){ + if( (SQLITE_PTR_TO_INT(sqlite3_user_data(pCtx)) & JSON_BLOB)!=0 ){ + eMode = 2; + }else{ + eMode = 1; + } + } + if( eMode==2 ){ sqlite3_result_blob(pCtx, &pParse->aBlob[i], sz+n, SQLITE_TRANSIENT); }else{ jsonReturnTextJsonFromBlob(pCtx, &pParse->aBlob[i], sz+n); @@ -212778,6 +215014,7 @@ struct JsonEachCursor { u32 nRoot; /* Size of the root path in bytes */ u8 eType; /* Type of the container for element i */ u8 bRecursive; /* True for json_tree(). False for json_each() */ + u8 eMode; /* 1 for json_each(). 2 for jsonb_each() */ u32 nParent; /* Current nesting depth */ u32 nParentAlloc; /* Space allocated for aParent[] */ JsonParent *aParent; /* Parent elements of i */ @@ -212789,6 +215026,8 @@ typedef struct JsonEachConnection JsonEachConnection; struct JsonEachConnection { sqlite3_vtab base; /* Base class - must be first */ sqlite3 *db; /* Database connection */ + u8 eMode; /* 1 for json_each(). 2 for jsonb_each() */ + u8 bRecursive; /* True for json_tree(). False for json_each() */ }; @@ -212831,6 +215070,8 @@ static int jsonEachConnect( if( pNew==0 ) return SQLITE_NOMEM; sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS); pNew->db = db; + pNew->eMode = argv[0][4]=='b' ? 2 : 1; + pNew->bRecursive = argv[0][4+pNew->eMode]=='t'; } return rc; } @@ -212842,8 +215083,8 @@ static int jsonEachDisconnect(sqlite3_vtab *pVtab){ return SQLITE_OK; } -/* constructor for a JsonEachCursor object for json_each(). */ -static int jsonEachOpenEach(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ +/* constructor for a JsonEachCursor object for json_each()/json_tree(). */ +static int jsonEachOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ JsonEachConnection *pVtab = (JsonEachConnection*)p; JsonEachCursor *pCur; @@ -212851,21 +215092,13 @@ static int jsonEachOpenEach(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ pCur = sqlite3DbMallocZero(pVtab->db, sizeof(*pCur)); if( pCur==0 ) return SQLITE_NOMEM; pCur->db = pVtab->db; + pCur->eMode = pVtab->eMode; + pCur->bRecursive = pVtab->bRecursive; jsonStringZero(&pCur->path); *ppCursor = &pCur->base; return SQLITE_OK; } -/* constructor for a JsonEachCursor object for json_tree(). */ -static int jsonEachOpenTree(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ - int rc = jsonEachOpenEach(p, ppCursor); - if( rc==SQLITE_OK ){ - JsonEachCursor *pCur = (JsonEachCursor*)*ppCursor; - pCur->bRecursive = 1; - } - return rc; -} - /* Reset a JsonEachCursor back to its original state. Free any memory ** held. */ static void jsonEachCursorReset(JsonEachCursor *p){ @@ -213070,7 +215303,7 @@ static int jsonEachColumn( } case JEACH_VALUE: { u32 i = jsonSkipLabel(p); - jsonReturnFromBlob(&p->sParse, i, ctx, 1); + jsonReturnFromBlob(&p->sParse, i, ctx, p->eMode); if( (p->sParse.aBlob[i] & 0x0f)>=JSONB_ARRAY ){ sqlite3_result_subtype(ctx, JSON_SUBTYPE); } @@ -213314,36 +215547,7 @@ static sqlite3_module jsonEachModule = { jsonEachBestIndex, /* xBestIndex */ jsonEachDisconnect, /* xDisconnect */ 0, /* xDestroy */ - jsonEachOpenEach, /* xOpen - open a cursor */ - jsonEachClose, /* xClose - close a cursor */ - jsonEachFilter, /* xFilter - configure scan constraints */ - jsonEachNext, /* xNext - advance a cursor */ - jsonEachEof, /* xEof - check for end of scan */ - jsonEachColumn, /* xColumn - read data */ - jsonEachRowid, /* xRowid - read data */ - 0, /* xUpdate */ - 0, /* xBegin */ - 0, /* xSync */ - 0, /* xCommit */ - 0, /* xRollback */ - 0, /* xFindMethod */ - 0, /* xRename */ - 0, /* xSavepoint */ - 0, /* xRelease */ - 0, /* xRollbackTo */ - 0, /* xShadowName */ - 0 /* xIntegrity */ -}; - -/* The methods of the json_tree virtual table. */ -static sqlite3_module jsonTreeModule = { - 0, /* iVersion */ - 0, /* xCreate */ - jsonEachConnect, /* xConnect */ - jsonEachBestIndex, /* xBestIndex */ - jsonEachDisconnect, /* xDisconnect */ - 0, /* xDestroy */ - jsonEachOpenTree, /* xOpen - open a cursor */ + jsonEachOpen, /* xOpen - open a cursor */ jsonEachClose, /* xClose - close a cursor */ jsonEachFilter, /* xFilter - configure scan constraints */ jsonEachNext, /* xNext - advance a cursor */ @@ -213432,22 +215636,21 @@ SQLITE_PRIVATE void sqlite3RegisterJsonFunctions(void){ #if !defined(SQLITE_OMIT_VIRTUALTABLE) && !defined(SQLITE_OMIT_JSON) /* -** Register the JSON table-valued functions +** Register the JSON table-valued function named zName and return a +** pointer to its Module object. Return NULL if something goes wrong. */ -SQLITE_PRIVATE int sqlite3JsonTableFunctions(sqlite3 *db){ - int rc = SQLITE_OK; - static const struct { - const char *zName; - sqlite3_module *pModule; - } aMod[] = { - { "json_each", &jsonEachModule }, - { "json_tree", &jsonTreeModule }, - }; +SQLITE_PRIVATE Module *sqlite3JsonVtabRegister(sqlite3 *db, const char *zName){ unsigned int i; - for(i=0; iaModule, zName)==0 ); + for(i=0; i */ @@ -213552,7 +215755,7 @@ typedef unsigned int u32; # define NEVER(X) (X) #endif #ifndef offsetof -#define offsetof(STRUCTURE,FIELD) ((size_t)((char*)&((STRUCTURE*)0)->FIELD)) +# define offsetof(ST,M) ((size_t)((char*)&((ST*)0)->M - (char*)0)) #endif #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) # define FLEXARRAY @@ -214590,6 +216793,12 @@ static void resetCursor(RtreeCursor *pCsr){ pCsr->base.pVtab = (sqlite3_vtab*)pRtree; pCsr->pReadAux = pStmt; + /* The following will only fail if the previous sqlite3_step() call failed, + ** in which case the error has already been caught. This statement never + ** encounters an error within an sqlite3_column_xxx() function, as it + ** calls sqlite3_column_value(), which does not use malloc(). So it is safe + ** to ignore the error code here. */ + sqlite3_reset(pStmt); } /* @@ -227678,8 +229887,8 @@ typedef struct DbpageCursor DbpageCursor; struct DbpageCursor { sqlite3_vtab_cursor base; /* Base class. Must be first */ - int pgno; /* Current page number */ - int mxPgno; /* Last page to visit on this scan */ + Pgno pgno; /* Current page number */ + Pgno mxPgno; /* Last page to visit on this scan */ Pager *pPager; /* Pager being read/written */ DbPage *pPage1; /* Page 1 of the database */ int iDb; /* Index of database to analyze */ @@ -227816,7 +230025,7 @@ static int dbpageOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ }else{ memset(pCsr, 0, sizeof(DbpageCursor)); pCsr->base.pVtab = pVTab; - pCsr->pgno = -1; + pCsr->pgno = 0; } *ppCursor = (sqlite3_vtab_cursor *)pCsr; @@ -227869,7 +230078,8 @@ static int dbpageFilter( sqlite3 *db = pTab->db; Btree *pBt; - (void)idxStr; + UNUSED_PARAMETER(idxStr); + UNUSED_PARAMETER(argc); /* Default setting is no rows of result */ pCsr->pgno = 1; @@ -227915,12 +230125,12 @@ static int dbpageColumn( int rc = SQLITE_OK; switch( i ){ case 0: { /* pgno */ - sqlite3_result_int(ctx, pCsr->pgno); + sqlite3_result_int64(ctx, (sqlite3_int64)pCsr->pgno); break; } case 1: { /* data */ DbPage *pDbPage = 0; - if( pCsr->pgno==((PENDING_BYTE/pCsr->szPage)+1) ){ + if( pCsr->pgno==(Pgno)((PENDING_BYTE/pCsr->szPage)+1) ){ /* The pending byte page. Assume it is zeroed out. Attempting to ** request this page from the page is an SQLITE_CORRUPT error. */ sqlite3_result_zeroblob(ctx, pCsr->szPage); @@ -227994,10 +230204,10 @@ static int dbpageUpdate( goto update_fail; } if( sqlite3_value_type(argv[0])==SQLITE_NULL ){ - pgno = (Pgno)sqlite3_value_int(argv[2]); + pgno = (Pgno)sqlite3_value_int64(argv[2]); isInsert = 1; }else{ - pgno = sqlite3_value_int(argv[0]); + pgno = (Pgno)sqlite3_value_int64(argv[0]); if( (Pgno)sqlite3_value_int(argv[1])!=pgno ){ zErr = "cannot insert"; goto update_fail; @@ -228049,7 +230259,8 @@ static int dbpageUpdate( memcpy(aPage, pData, szPage); pTab->pgnoTrunc = 0; } - }else{ + } + if( rc!=SQLITE_OK ){ pTab->pgnoTrunc = 0; } sqlite3PagerUnref(pDbPage); @@ -228132,6 +230343,536 @@ SQLITE_PRIVATE int sqlite3DbpageRegister(sqlite3 *db){ return SQLITE_OK; } #endif /* SQLITE_ENABLE_DBSTAT_VTAB */ /************** End of dbpage.c **********************************************/ +/************** Begin file carray.c ******************************************/ +/* +** 2016-06-29 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** +** This file implements a table-valued-function that +** returns the values in a C-language array. +** Examples: +** +** SELECT * FROM carray($ptr,5) +** +** The query above returns 5 integers contained in a C-language array +** at the address $ptr. $ptr is a pointer to the array of integers. +** The pointer value must be assigned to $ptr using the +** sqlite3_bind_pointer() interface with a pointer type of "carray". +** For example: +** +** static int aX[] = { 53, 9, 17, 2231, 4, 99 }; +** int i = sqlite3_bind_parameter_index(pStmt, "$ptr"); +** sqlite3_bind_pointer(pStmt, i, aX, "carray", 0); +** +** There is an optional third parameter to determine the datatype of +** the C-language array. Allowed values of the third parameter are +** 'int32', 'int64', 'double', 'char*', 'struct iovec'. Example: +** +** SELECT * FROM carray($ptr,10,'char*'); +** +** The default value of the third parameter is 'int32'. +** +** HOW IT WORKS +** +** The carray "function" is really a virtual table with the +** following schema: +** +** CREATE TABLE carray( +** value, +** pointer HIDDEN, +** count HIDDEN, +** ctype TEXT HIDDEN +** ); +** +** If the hidden columns "pointer" and "count" are unconstrained, then +** the virtual table has no rows. Otherwise, the virtual table interprets +** the integer value of "pointer" as a pointer to the array and "count" +** as the number of elements in the array. The virtual table steps through +** the array, element by element. +*/ +#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_CARRAY) +/* #include "sqliteInt.h" */ +#if defined(_WIN32) || defined(__RTP__) || defined(_WRS_KERNEL) + struct iovec { + void *iov_base; + size_t iov_len; + }; +#else +# include +#endif + +/* +** Names of allowed datatypes +*/ +static const char *azCarrayType[] = { + "int32", "int64", "double", "char*", "struct iovec" +}; + +/* +** Structure used to hold the sqlite3_carray_bind() information +*/ +typedef struct carray_bind carray_bind; +struct carray_bind { + void *aData; /* The data */ + int nData; /* Number of elements */ + int mFlags; /* Control flags */ + void (*xDel)(void*); /* Destructor for aData */ +}; + + +/* carray_cursor is a subclass of sqlite3_vtab_cursor which will +** serve as the underlying representation of a cursor that scans +** over rows of the result +*/ +typedef struct carray_cursor carray_cursor; +struct carray_cursor { + sqlite3_vtab_cursor base; /* Base class - must be first */ + sqlite3_int64 iRowid; /* The rowid */ + void *pPtr; /* Pointer to the array of values */ + sqlite3_int64 iCnt; /* Number of integers in the array */ + unsigned char eType; /* One of the CARRAY_type values */ +}; + +/* +** The carrayConnect() method is invoked to create a new +** carray_vtab that describes the carray virtual table. +** +** Think of this routine as the constructor for carray_vtab objects. +** +** All this routine needs to do is: +** +** (1) Allocate the carray_vtab object and initialize all fields. +** +** (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the +** result set of queries against carray will look like. +*/ +static int carrayConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + sqlite3_vtab *pNew; + int rc; + +/* Column numbers */ +#define CARRAY_COLUMN_VALUE 0 +#define CARRAY_COLUMN_POINTER 1 +#define CARRAY_COLUMN_COUNT 2 +#define CARRAY_COLUMN_CTYPE 3 + + rc = sqlite3_declare_vtab(db, + "CREATE TABLE x(value,pointer hidden,count hidden,ctype hidden)"); + if( rc==SQLITE_OK ){ + pNew = *ppVtab = sqlite3_malloc( sizeof(*pNew) ); + if( pNew==0 ) return SQLITE_NOMEM; + memset(pNew, 0, sizeof(*pNew)); + } + return rc; +} + +/* +** This method is the destructor for carray_cursor objects. +*/ +static int carrayDisconnect(sqlite3_vtab *pVtab){ + sqlite3_free(pVtab); + return SQLITE_OK; +} + +/* +** Constructor for a new carray_cursor object. +*/ +static int carrayOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ + carray_cursor *pCur; + pCur = sqlite3_malloc( sizeof(*pCur) ); + if( pCur==0 ) return SQLITE_NOMEM; + memset(pCur, 0, sizeof(*pCur)); + *ppCursor = &pCur->base; + return SQLITE_OK; +} + +/* +** Destructor for a carray_cursor. +*/ +static int carrayClose(sqlite3_vtab_cursor *cur){ + sqlite3_free(cur); + return SQLITE_OK; +} + + +/* +** Advance a carray_cursor to its next row of output. +*/ +static int carrayNext(sqlite3_vtab_cursor *cur){ + carray_cursor *pCur = (carray_cursor*)cur; + pCur->iRowid++; + return SQLITE_OK; +} + +/* +** Return values of columns for the row at which the carray_cursor +** is currently pointing. +*/ +static int carrayColumn( + sqlite3_vtab_cursor *cur, /* The cursor */ + sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ + int i /* Which column to return */ +){ + carray_cursor *pCur = (carray_cursor*)cur; + sqlite3_int64 x = 0; + switch( i ){ + case CARRAY_COLUMN_POINTER: return SQLITE_OK; + case CARRAY_COLUMN_COUNT: x = pCur->iCnt; break; + case CARRAY_COLUMN_CTYPE: { + sqlite3_result_text(ctx, azCarrayType[pCur->eType], -1, SQLITE_STATIC); + return SQLITE_OK; + } + default: { + switch( pCur->eType ){ + case CARRAY_INT32: { + int *p = (int*)pCur->pPtr; + sqlite3_result_int(ctx, p[pCur->iRowid-1]); + return SQLITE_OK; + } + case CARRAY_INT64: { + sqlite3_int64 *p = (sqlite3_int64*)pCur->pPtr; + sqlite3_result_int64(ctx, p[pCur->iRowid-1]); + return SQLITE_OK; + } + case CARRAY_DOUBLE: { + double *p = (double*)pCur->pPtr; + sqlite3_result_double(ctx, p[pCur->iRowid-1]); + return SQLITE_OK; + } + case CARRAY_TEXT: { + const char **p = (const char**)pCur->pPtr; + sqlite3_result_text(ctx, p[pCur->iRowid-1], -1, SQLITE_TRANSIENT); + return SQLITE_OK; + } + default: { + const struct iovec *p = (struct iovec*)pCur->pPtr; + assert( pCur->eType==CARRAY_BLOB ); + sqlite3_result_blob(ctx, p[pCur->iRowid-1].iov_base, + (int)p[pCur->iRowid-1].iov_len, SQLITE_TRANSIENT); + return SQLITE_OK; + } + } + } + } + sqlite3_result_int64(ctx, x); + return SQLITE_OK; +} + +/* +** Return the rowid for the current row. In this implementation, the +** rowid is the same as the output value. +*/ +static int carrayRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ + carray_cursor *pCur = (carray_cursor*)cur; + *pRowid = pCur->iRowid; + return SQLITE_OK; +} + +/* +** Return TRUE if the cursor has been moved off of the last +** row of output. +*/ +static int carrayEof(sqlite3_vtab_cursor *cur){ + carray_cursor *pCur = (carray_cursor*)cur; + return pCur->iRowid>pCur->iCnt; +} + +/* +** This method is called to "rewind" the carray_cursor object back +** to the first row of output. +*/ +static int carrayFilter( + sqlite3_vtab_cursor *pVtabCursor, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv +){ + carray_cursor *pCur = (carray_cursor *)pVtabCursor; + pCur->pPtr = 0; + pCur->iCnt = 0; + switch( idxNum ){ + case 1: { + carray_bind *pBind = sqlite3_value_pointer(argv[0], "carray-bind"); + if( pBind==0 ) break; + pCur->pPtr = pBind->aData; + pCur->iCnt = pBind->nData; + pCur->eType = pBind->mFlags & 0x07; + break; + } + case 2: + case 3: { + pCur->pPtr = sqlite3_value_pointer(argv[0], "carray"); + pCur->iCnt = pCur->pPtr ? sqlite3_value_int64(argv[1]) : 0; + if( idxNum<3 ){ + pCur->eType = CARRAY_INT32; + }else{ + unsigned char i; + const char *zType = (const char*)sqlite3_value_text(argv[2]); + for(i=0; i=sizeof(azCarrayType)/sizeof(azCarrayType[0]) ){ + pVtabCursor->pVtab->zErrMsg = sqlite3_mprintf( + "unknown datatype: %Q", zType); + return SQLITE_ERROR; + }else{ + pCur->eType = i; + } + } + break; + } + } + pCur->iRowid = 1; + return SQLITE_OK; +} + +/* +** SQLite will invoke this method one or more times while planning a query +** that uses the carray virtual table. This routine needs to create +** a query plan for each invocation and compute an estimated cost for that +** plan. +** +** In this implementation idxNum is used to represent the +** query plan. idxStr is unused. +** +** idxNum is: +** +** 1 If only the pointer= constraint exists. In this case, the +** parameter must be bound using sqlite3_carray_bind(). +** +** 2 if the pointer= and count= constraints exist. +** +** 3 if the ctype= constraint also exists. +** +** idxNum is 0 otherwise and carray becomes an empty table. +*/ +static int carrayBestIndex( + sqlite3_vtab *tab, + sqlite3_index_info *pIdxInfo +){ + int i; /* Loop over constraints */ + int ptrIdx = -1; /* Index of the pointer= constraint, or -1 if none */ + int cntIdx = -1; /* Index of the count= constraint, or -1 if none */ + int ctypeIdx = -1; /* Index of the ctype= constraint, or -1 if none */ + unsigned seen = 0; /* Bitmask of == constrainted columns */ + + const struct sqlite3_index_constraint *pConstraint; + pConstraint = pIdxInfo->aConstraint; + for(i=0; inConstraint; i++, pConstraint++){ + if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; + if( pConstraint->iColumn>=0 ) seen |= 1 << pConstraint->iColumn; + if( pConstraint->usable==0 ) continue; + switch( pConstraint->iColumn ){ + case CARRAY_COLUMN_POINTER: + ptrIdx = i; + break; + case CARRAY_COLUMN_COUNT: + cntIdx = i; + break; + case CARRAY_COLUMN_CTYPE: + ctypeIdx = i; + break; + } + } + if( ptrIdx>=0 ){ + pIdxInfo->aConstraintUsage[ptrIdx].argvIndex = 1; + pIdxInfo->aConstraintUsage[ptrIdx].omit = 1; + pIdxInfo->estimatedCost = (double)1; + pIdxInfo->estimatedRows = 100; + pIdxInfo->idxNum = 1; + if( cntIdx>=0 ){ + pIdxInfo->aConstraintUsage[cntIdx].argvIndex = 2; + pIdxInfo->aConstraintUsage[cntIdx].omit = 1; + pIdxInfo->idxNum = 2; + if( ctypeIdx>=0 ){ + pIdxInfo->aConstraintUsage[ctypeIdx].argvIndex = 3; + pIdxInfo->aConstraintUsage[ctypeIdx].omit = 1; + pIdxInfo->idxNum = 3; + }else if( seen & (1<estimatedCost = (double)2147483647; + pIdxInfo->estimatedRows = 2147483647; + pIdxInfo->idxNum = 0; + } + return SQLITE_OK; +} + +/* +** This following structure defines all the methods for the +** carray virtual table. +*/ +static sqlite3_module carrayModule = { + 0, /* iVersion */ + 0, /* xCreate */ + carrayConnect, /* xConnect */ + carrayBestIndex, /* xBestIndex */ + carrayDisconnect, /* xDisconnect */ + 0, /* xDestroy */ + carrayOpen, /* xOpen - open a cursor */ + carrayClose, /* xClose - close a cursor */ + carrayFilter, /* xFilter - configure scan constraints */ + carrayNext, /* xNext - advance a cursor */ + carrayEof, /* xEof - check for end of scan */ + carrayColumn, /* xColumn - read data */ + carrayRowid, /* xRowid - read data */ + 0, /* xUpdate */ + 0, /* xBegin */ + 0, /* xSync */ + 0, /* xCommit */ + 0, /* xRollback */ + 0, /* xFindMethod */ + 0, /* xRename */ + 0, /* xSavepoint */ + 0, /* xRelease */ + 0, /* xRollbackTo */ + 0, /* xShadow */ + 0 /* xIntegrity */ +}; + +/* +** Destructor for the carray_bind object +*/ +static void carrayBindDel(void *pPtr){ + carray_bind *p = (carray_bind*)pPtr; + if( p->xDel!=SQLITE_STATIC ){ + p->xDel(p->aData); + } + sqlite3_free(p); +} + +/* +** Invoke this interface in order to bind to the single-argument +** version of CARRAY(). +*/ +SQLITE_API int sqlite3_carray_bind( + sqlite3_stmt *pStmt, + int idx, + void *aData, + int nData, + int mFlags, + void (*xDestroy)(void*) +){ + carray_bind *pNew = 0; + int i; + int rc = SQLITE_OK; + + /* Ensure that the mFlags value is acceptable. */ + assert( CARRAY_INT32==0 && CARRAY_INT64==1 && CARRAY_DOUBLE==2 ); + assert( CARRAY_TEXT==3 && CARRAY_BLOB==4 ); + if( mFlagsCARRAY_BLOB ){ + rc = SQLITE_ERROR; + goto carray_bind_error; + } + + pNew = sqlite3_malloc64(sizeof(*pNew)); + if( pNew==0 ){ + rc = SQLITE_NOMEM; + goto carray_bind_error; + } + + pNew->nData = nData; + pNew->mFlags = mFlags; + if( xDestroy==SQLITE_TRANSIENT ){ + sqlite3_int64 sz = nData; + switch( mFlags ){ + case CARRAY_INT32: sz *= 4; break; + case CARRAY_INT64: sz *= 8; break; + case CARRAY_DOUBLE: sz *= 8; break; + case CARRAY_TEXT: sz *= sizeof(char*); break; + default: sz *= sizeof(struct iovec); break; + } + if( mFlags==CARRAY_TEXT ){ + for(i=0; iaData = sqlite3_malloc64( sz ); + if( pNew->aData==0 ){ + rc = SQLITE_NOMEM; + goto carray_bind_error; + } + + if( mFlags==CARRAY_TEXT ){ + char **az = (char**)pNew->aData; + char *z = (char*)&az[nData]; + for(i=0; iaData; + unsigned char *z = (unsigned char*)&p[nData]; + for(i=0; iaData, aData, sz); + } + pNew->xDel = sqlite3_free; + }else{ + pNew->aData = aData; + pNew->xDel = xDestroy; + } + return sqlite3_bind_pointer(pStmt, idx, pNew, "carray-bind", carrayBindDel); + + carray_bind_error: + if( xDestroy!=SQLITE_STATIC && xDestroy!=SQLITE_TRANSIENT ){ + xDestroy(aData); + } + sqlite3_free(pNew); + return rc; +} + +/* +** Invoke this routine to register the carray() function. +*/ +SQLITE_PRIVATE Module *sqlite3CarrayRegister(sqlite3 *db){ + return sqlite3VtabCreateModule(db, "carray", &carrayModule, 0, 0); +} + +#endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_CARRAY) */ + +/************** End of carray.c **********************************************/ /************** Begin file sqlite3session.c **********************************/ #if defined(SQLITE_ENABLE_SESSION) && defined(SQLITE_ENABLE_PREUPDATE_HOOK) @@ -230950,6 +233691,19 @@ static int sessionAppendDelete( return rc; } +static int sessionPrepare( + sqlite3 *db, + sqlite3_stmt **pp, + char **pzErrmsg, + const char *zSql +){ + int rc = sqlite3_prepare_v2(db, zSql, -1, pp, 0); + if( pzErrmsg && rc!=SQLITE_OK ){ + *pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + } + return rc; +} + /* ** Formulate and prepare a SELECT statement to retrieve a row from table ** zTab in database zDb based on its primary key. i.e. @@ -230971,12 +233725,12 @@ static int sessionSelectStmt( int nCol, /* Number of columns in table */ const char **azCol, /* Names of table columns */ u8 *abPK, /* PRIMARY KEY array */ - sqlite3_stmt **ppStmt /* OUT: Prepared SELECT statement */ + sqlite3_stmt **ppStmt, /* OUT: Prepared SELECT statement */ + char **pzErrmsg /* OUT: Error message */ ){ int rc = SQLITE_OK; char *zSql = 0; const char *zSep = ""; - int nSql = -1; int i; SessionBuffer cols = {0, 0, 0}; @@ -231056,7 +233810,7 @@ static int sessionSelectStmt( #endif if( rc==SQLITE_OK ){ - rc = sqlite3_prepare_v2(db, zSql, nSql, ppStmt, 0); + rc = sessionPrepare(db, ppStmt, pzErrmsg, zSql); } sqlite3_free(zSql); sqlite3_free(nooptest.aBuf); @@ -231220,7 +233974,7 @@ static int sessionGenerateChangeset( /* Build and compile a statement to execute: */ if( rc==SQLITE_OK ){ rc = sessionSelectStmt(db, 0, pSession->zDb, - zName, pTab->bRowid, pTab->nCol, pTab->azCol, pTab->abPK, &pSel + zName, pTab->bRowid, pTab->nCol, pTab->azCol, pTab->abPK, &pSel, 0 ); } @@ -232429,6 +235183,7 @@ struct SessionApplyCtx { u8 bRebase; /* True to collect rebase information */ u8 bIgnoreNoop; /* True to ignore no-op conflicts */ int bRowid; + char *zErr; /* Error message, if any */ }; /* Number of prepared UPDATE statements to cache. */ @@ -232654,7 +235409,7 @@ static int sessionDeleteRow( } if( rc==SQLITE_OK ){ - rc = sqlite3_prepare_v2(db, (char *)buf.aBuf, buf.nBuf, &p->pDelete, 0); + rc = sessionPrepare(db, &p->pDelete, &p->zErr, (char*)buf.aBuf); } sqlite3_free(buf.aBuf); @@ -232681,7 +235436,7 @@ static int sessionSelectRow( ){ /* TODO */ return sessionSelectStmt(db, p->bIgnoreNoop, - "main", zTab, p->bRowid, p->nCol, p->azCol, p->abPK, &p->pSelect + "main", zTab, p->bRowid, p->nCol, p->azCol, p->abPK, &p->pSelect, &p->zErr ); } @@ -232718,16 +235473,12 @@ static int sessionInsertRow( sessionAppendStr(&buf, ")", &rc); if( rc==SQLITE_OK ){ - rc = sqlite3_prepare_v2(db, (char *)buf.aBuf, buf.nBuf, &p->pInsert, 0); + rc = sessionPrepare(db, &p->pInsert, &p->zErr, (char*)buf.aBuf); } sqlite3_free(buf.aBuf); return rc; } -static int sessionPrepare(sqlite3 *db, sqlite3_stmt **pp, const char *zSql){ - return sqlite3_prepare_v2(db, zSql, -1, pp, 0); -} - /* ** Prepare statements for applying changes to the sqlite_stat1 table. ** These are similar to those created by sessionSelectRow(), @@ -232737,14 +235488,14 @@ static int sessionPrepare(sqlite3 *db, sqlite3_stmt **pp, const char *zSql){ static int sessionStat1Sql(sqlite3 *db, SessionApplyCtx *p){ int rc = sessionSelectRow(db, "sqlite_stat1", p); if( rc==SQLITE_OK ){ - rc = sessionPrepare(db, &p->pInsert, + rc = sessionPrepare(db, &p->pInsert, 0, "INSERT INTO main.sqlite_stat1 VALUES(?1, " "CASE WHEN length(?2)=0 AND typeof(?2)='blob' THEN NULL ELSE ?2 END, " "?3)" ); } if( rc==SQLITE_OK ){ - rc = sessionPrepare(db, &p->pDelete, + rc = sessionPrepare(db, &p->pDelete, 0, "DELETE FROM main.sqlite_stat1 WHERE tbl=?1 AND idx IS " "CASE WHEN length(?2)=0 AND typeof(?2)='blob' THEN NULL ELSE ?2 END " "AND (?4 OR stat IS ?3)" @@ -232968,7 +235719,7 @@ static int sessionConflictHandler( void *pCtx, /* First argument for conflict handler */ int *pbReplace /* OUT: Set to true if PK row is found */ ){ - int res = 0; /* Value returned by conflict handler */ + int res = SQLITE_CHANGESET_OMIT;/* Value returned by conflict handler */ int rc; int nCol; int op; @@ -232989,11 +235740,9 @@ static int sessionConflictHandler( if( rc==SQLITE_ROW ){ /* There exists another row with the new.* primary key. */ - if( p->bIgnoreNoop - && sqlite3_column_int(p->pSelect, sqlite3_column_count(p->pSelect)-1) + if( 0==p->bIgnoreNoop + || 0==sqlite3_column_int(p->pSelect, sqlite3_column_count(p->pSelect)-1) ){ - res = SQLITE_CHANGESET_OMIT; - }else{ pIter->pConflict = p->pSelect; res = xConflict(pCtx, eType, pIter); pIter->pConflict = 0; @@ -233007,7 +235756,9 @@ static int sessionConflictHandler( int nBlob = pIter->in.iNext - pIter->in.iCurrent; sessionAppendBlob(&p->constraints, aBlob, nBlob, &rc); return SQLITE_OK; - }else{ + }else if( p->bIgnoreNoop==0 || op!=SQLITE_DELETE + || eType==SQLITE_CHANGESET_CONFLICT + ){ /* No other row with the new.* primary key. */ res = xConflict(pCtx, eType+1, pIter); if( res==SQLITE_CHANGESET_REPLACE ) rc = SQLITE_MISUSE; @@ -233105,7 +235856,7 @@ static int sessionApplyOneOp( sqlite3_step(p->pDelete); rc = sqlite3_reset(p->pDelete); - if( rc==SQLITE_OK && sqlite3_changes(p->db)==0 && p->bIgnoreNoop==0 ){ + if( rc==SQLITE_OK && sqlite3_changes(p->db)==0 ){ rc = sessionConflictHandler( SQLITE_CHANGESET_DATA, p, pIter, xConflict, pCtx, pbRetry ); @@ -233317,6 +236068,10 @@ static int sessionChangesetApply( void *pCtx, /* Copy of sixth arg to _apply() */ const char *zTab /* Table name */ ), + int(*xFilterIter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + sqlite3_changeset_iter *p + ), int(*xConflict)( void *pCtx, /* Copy of fifth arg to _apply() */ int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ @@ -233457,6 +236212,9 @@ static int sessionChangesetApply( ** next change. A log message has already been issued. */ if( schemaMismatch ) continue; + /* If this is a call to apply_v3(), invoke xFilterIter here. */ + if( xFilterIter && 0==xFilterIter(pCtx, pIter) ) continue; + rc = sessionApplyOneWithRetry(db, pIter, &sApply, xConflict, pCtx); } @@ -233503,6 +236261,7 @@ static int sessionChangesetApply( assert( sApply.bRebase || sApply.rebase.nBuf==0 ); if( rc==SQLITE_OK && bPatchset==0 && sApply.bRebase ){ + assert( ppRebase!=0 && pnRebase!=0 ); *ppRebase = (void*)sApply.rebase.aBuf; *pnRebase = sApply.rebase.nBuf; sApply.rebase.aBuf = 0; @@ -233520,22 +236279,74 @@ static int sessionChangesetApply( db->flags &= ~((u64)SQLITE_FkNoAction); db->aDb[0].pSchema->schema_cookie -= 32; } + + assert( rc!=SQLITE_OK || sApply.zErr==0 ); + sqlite3_set_errmsg(db, rc, sApply.zErr); + sqlite3_free(sApply.zErr); + sqlite3_mutex_leave(sqlite3_db_mutex(db)); return rc; } /* -** Apply the changeset passed via pChangeset/nChangeset to the main -** database attached to handle "db". +** This function is called by all six sqlite3changeset_apply() variants: +** +** + sqlite3changeset_apply() +** + sqlite3changeset_apply_v2() +** + sqlite3changeset_apply_v3() +** + sqlite3changeset_apply_strm() +** + sqlite3changeset_apply_strm_v2() +** + sqlite3changeset_apply_strm_v3() +** +** Arguments passed to this function are as follows: +** +** db: +** Database handle to apply changeset to main database of. +** +** nChangeset/pChangeset: +** These are both passed zero for the streaming variants. For the normal +** apply() functions, these are passed the size of and the buffer containing +** the changeset, respectively. +** +** xInput/pIn: +** These are both passed zero for the normal variants. For the streaming +** apply() functions, these are passed the input callback and context +** pointer, respectively. +** +** xFilter: +** The filter function as passed to apply() or apply_v2() (to filter by +** table name), if any. This is always NULL for apply_v3() calls. +** +** xFilterIter: +** The filter function as passed to apply_v3(), if any. +** +** xConflict: +** The conflict handler callback (must not be NULL). +** +** pCtx: +** The context pointer passed to the xFilter and xConflict handler callbacks. +** +** ppRebase, pnRebase: +** Zero for apply(). The rebase changeset output pointers, if any, for +** apply_v2() and apply_v3(). +** +** flags: +** Zero for apply(). The flags parameter for apply_v2() and apply_v3(). */ -SQLITE_API int sqlite3changeset_apply_v2( +static int sessionChangesetApplyV23( sqlite3 *db, /* Apply change to "main" db of this handle */ int nChangeset, /* Size of changeset in bytes */ void *pChangeset, /* Changeset blob */ + int (*xInput)(void *pIn, void *pData, int *pnData), /* Input function */ + void *pIn, /* First arg for xInput */ int(*xFilter)( void *pCtx, /* Copy of sixth arg to _apply() */ const char *zTab /* Table name */ ), + int(*xFilterIter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + sqlite3_changeset_iter *p /* Handle describing current change */ + ), int(*xConflict)( void *pCtx, /* Copy of sixth arg to _apply() */ int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ @@ -233546,18 +236357,74 @@ SQLITE_API int sqlite3changeset_apply_v2( int flags ){ sqlite3_changeset_iter *pIter; /* Iterator to skip through changeset */ - int bInv = !!(flags & SQLITE_CHANGESETAPPLY_INVERT); - int rc = sessionChangesetStart(&pIter, 0, 0, nChangeset, pChangeset, bInv, 1); - + int bInverse = !!(flags & SQLITE_CHANGESETAPPLY_INVERT); + int rc = sessionChangesetStart( + &pIter, xInput, pIn, nChangeset, pChangeset, bInverse, 1 + ); if( rc==SQLITE_OK ){ - rc = sessionChangesetApply( - db, pIter, xFilter, xConflict, pCtx, ppRebase, pnRebase, flags + rc = sessionChangesetApply(db, pIter, + xFilter, xFilterIter, xConflict, pCtx, ppRebase, pnRebase, flags ); } - return rc; } +/* +** Apply the changeset passed via pChangeset/nChangeset to the main +** database attached to handle "db". +*/ +SQLITE_API int sqlite3changeset_apply_v2( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int nChangeset, /* Size of changeset in bytes */ + void *pChangeset, /* Changeset blob */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + const char *zTab /* Table name */ + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx, /* First argument passed to xConflict */ + void **ppRebase, int *pnRebase, + int flags +){ + return sessionChangesetApplyV23(db, + nChangeset, pChangeset, 0, 0, + xFilter, 0, xConflict, pCtx, + ppRebase, pnRebase, flags + ); +} + +/* +** Apply the changeset passed via pChangeset/nChangeset to the main +** database attached to handle "db". +*/ +SQLITE_API int sqlite3changeset_apply_v3( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int nChangeset, /* Size of changeset in bytes */ + void *pChangeset, /* Changeset blob */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + sqlite3_changeset_iter *p /* Handle describing current change */ + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx, /* First argument passed to xConflict */ + void **ppRebase, int *pnRebase, + int flags +){ + return sessionChangesetApplyV23(db, + nChangeset, pChangeset, 0, 0, + 0, xFilter, xConflict, pCtx, + ppRebase, pnRebase, flags + ); +} + /* ** Apply the changeset passed via pChangeset/nChangeset to the main database ** attached to handle "db". Invoke the supplied conflict handler callback @@ -233578,8 +236445,10 @@ SQLITE_API int sqlite3changeset_apply( ), void *pCtx /* First argument passed to xConflict */ ){ - return sqlite3changeset_apply_v2( - db, nChangeset, pChangeset, xFilter, xConflict, pCtx, 0, 0, 0 + return sessionChangesetApplyV23(db, + nChangeset, pChangeset, 0, 0, + xFilter, 0, xConflict, pCtx, + 0, 0, 0 ); } @@ -233588,6 +236457,29 @@ SQLITE_API int sqlite3changeset_apply( ** attached to handle "db". Invoke the supplied conflict handler callback ** to resolve any conflicts encountered while applying the change. */ +SQLITE_API int sqlite3changeset_apply_v3_strm( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int (*xInput)(void *pIn, void *pData, int *pnData), /* Input function */ + void *pIn, /* First arg for xInput */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + sqlite3_changeset_iter *p + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx, /* First argument passed to xConflict */ + void **ppRebase, int *pnRebase, + int flags +){ + return sessionChangesetApplyV23(db, + 0, 0, xInput, pIn, + 0, xFilter, xConflict, pCtx, + ppRebase, pnRebase, flags + ); +} SQLITE_API int sqlite3changeset_apply_v2_strm( sqlite3 *db, /* Apply change to "main" db of this handle */ int (*xInput)(void *pIn, void *pData, int *pnData), /* Input function */ @@ -233605,15 +236497,11 @@ SQLITE_API int sqlite3changeset_apply_v2_strm( void **ppRebase, int *pnRebase, int flags ){ - sqlite3_changeset_iter *pIter; /* Iterator to skip through changeset */ - int bInverse = !!(flags & SQLITE_CHANGESETAPPLY_INVERT); - int rc = sessionChangesetStart(&pIter, xInput, pIn, 0, 0, bInverse, 1); - if( rc==SQLITE_OK ){ - rc = sessionChangesetApply( - db, pIter, xFilter, xConflict, pCtx, ppRebase, pnRebase, flags - ); - } - return rc; + return sessionChangesetApplyV23(db, + 0, 0, xInput, pIn, + xFilter, 0, xConflict, pCtx, + ppRebase, pnRebase, flags + ); } SQLITE_API int sqlite3changeset_apply_strm( sqlite3 *db, /* Apply change to "main" db of this handle */ @@ -233630,8 +236518,10 @@ SQLITE_API int sqlite3changeset_apply_strm( ), void *pCtx /* First argument passed to xConflict */ ){ - return sqlite3changeset_apply_v2_strm( - db, xInput, pIn, xFilter, xConflict, pCtx, 0, 0, 0 + return sessionChangesetApplyV23(db, + 0, 0, xInput, pIn, + xFilter, 0, xConflict, pCtx, + 0, 0, 0 ); } @@ -235603,27 +238493,20 @@ typedef sqlite3_uint64 u64; # define LARGEST_INT64 (0xffffffff|(((i64)0x7fffffff)<<32)) # define SMALLEST_INT64 (((i64)-1) - LARGEST_INT64) -/* The uptr type is an unsigned integer large enough to hold a pointer +/* +** This macro is used in a single assert() within fts5 to check that an +** allocation is aligned to an 8-byte boundary. But it is a complicated +** macro to get right for multiple platforms without generating warnings. +** So instead of reproducing the entire definition from sqliteInt.h, we +** just do without this assert() for the rare non-amalgamation builds. */ -#if defined(HAVE_STDINT_H) - typedef uintptr_t uptr; -#elif SQLITE_PTRSIZE==4 - typedef u32 uptr; -#else - typedef u64 uptr; -#endif - -#ifdef SQLITE_4_BYTE_ALIGNED_MALLOC -# define EIGHT_BYTE_ALIGNMENT(X) ((((uptr)(X) - (uptr)0)&3)==0) -#else -# define EIGHT_BYTE_ALIGNMENT(X) ((((uptr)(X) - (uptr)0)&7)==0) -#endif +#define EIGHT_BYTE_ALIGNMENT(x) 1 /* ** Macros needed to provide flexible arrays in a portable way */ #ifndef offsetof -# define offsetof(STRUCTURE,FIELD) ((size_t)((char*)&((STRUCTURE*)0)->FIELD)) +# define offsetof(ST,M) ((size_t)((char*)&((ST*)0)->M - (char*)0)) #endif #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) # define FLEXARRAY @@ -236365,7 +239248,7 @@ static int sqlite3Fts5ExprPattern( ** i64 iRowid = sqlite3Fts5ExprRowid(pExpr); ** } */ -static int sqlite3Fts5ExprFirst(Fts5Expr*, Fts5Index *pIdx, i64 iMin, int bDesc); +static int sqlite3Fts5ExprFirst(Fts5Expr*, Fts5Index *pIdx, i64 iMin, i64, int bDesc); static int sqlite3Fts5ExprNext(Fts5Expr*, i64 iMax); static int sqlite3Fts5ExprEof(Fts5Expr*); static i64 sqlite3Fts5ExprRowid(Fts5Expr*); @@ -241934,7 +244817,13 @@ static int fts5ExprNodeFirst(Fts5Expr *pExpr, Fts5ExprNode *pNode){ ** Return SQLITE_OK if successful, or an SQLite error code otherwise. It ** is not considered an error if the query does not match any documents. */ -static int sqlite3Fts5ExprFirst(Fts5Expr *p, Fts5Index *pIdx, i64 iFirst, int bDesc){ +static int sqlite3Fts5ExprFirst( + Fts5Expr *p, + Fts5Index *pIdx, + i64 iFirst, + i64 iLast, + int bDesc +){ Fts5ExprNode *pRoot = p->pRoot; int rc; /* Return code */ @@ -241956,6 +244845,9 @@ static int sqlite3Fts5ExprFirst(Fts5Expr *p, Fts5Index *pIdx, i64 iFirst, int bD assert( pRoot->bEof==0 ); rc = fts5ExprNodeNext(p, pRoot, 0, 0); } + if( fts5RowidCmp(p, pRoot->iRowid, iLast)>0 ){ + pRoot->bEof = 1; + } return rc; } @@ -244808,6 +247700,36 @@ struct Fts5SegIter { u8 bDel; /* True if the delete flag is set */ }; +static int fts5IndexCorruptRowid(Fts5Index *pIdx, i64 iRowid){ + pIdx->rc = FTS5_CORRUPT; + sqlite3Fts5ConfigErrmsg(pIdx->pConfig, + "fts5: corruption found reading blob %lld from table \"%s\"", + iRowid, pIdx->pConfig->zName + ); + return SQLITE_CORRUPT_VTAB; +} +#define FTS5_CORRUPT_ROWID(pIdx, iRowid) fts5IndexCorruptRowid(pIdx, iRowid) + +static int fts5IndexCorruptIter(Fts5Index *pIdx, Fts5SegIter *pIter){ + pIdx->rc = FTS5_CORRUPT; + sqlite3Fts5ConfigErrmsg(pIdx->pConfig, + "fts5: corruption on page %d, segment %d, table \"%s\"", + pIter->iLeafPgno, pIter->pSeg->iSegid, pIdx->pConfig->zName + ); + return SQLITE_CORRUPT_VTAB; +} +#define FTS5_CORRUPT_ITER(pIdx, pIter) fts5IndexCorruptIter(pIdx, pIter) + +static int fts5IndexCorruptIdx(Fts5Index *pIdx){ + pIdx->rc = FTS5_CORRUPT; + sqlite3Fts5ConfigErrmsg(pIdx->pConfig, + "fts5: corruption in table \"%s\"", pIdx->pConfig->zName + ); + return SQLITE_CORRUPT_VTAB; +} +#define FTS5_CORRUPT_IDX(pIdx) fts5IndexCorruptIdx(pIdx) + + /* ** Array of tombstone pages. Reference counted. */ @@ -245097,13 +248019,13 @@ static Fts5Data *fts5DataRead(Fts5Index *p, i64 iRowid){ ** All the reasons those functions might return SQLITE_ERROR - missing ** table, missing row, non-blob/text in block column - indicate ** backing store corruption. */ - if( rc==SQLITE_ERROR ) rc = FTS5_CORRUPT; + if( rc==SQLITE_ERROR ) rc = FTS5_CORRUPT_ROWID(p, iRowid); if( rc==SQLITE_OK ){ u8 *aOut = 0; /* Read blob data into this buffer */ - int nByte = sqlite3_blob_bytes(p->pReader); - int szData = (sizeof(Fts5Data) + 7) & ~7; - sqlite3_int64 nAlloc = szData + nByte + FTS5_DATA_PADDING; + i64 nByte = sqlite3_blob_bytes(p->pReader); + i64 szData = (sizeof(Fts5Data) + 7) & ~7; + i64 nAlloc = szData + nByte + FTS5_DATA_PADDING; pRet = (Fts5Data*)sqlite3_malloc64(nAlloc); if( pRet ){ pRet->nn = nByte; @@ -245147,7 +248069,7 @@ static Fts5Data *fts5LeafRead(Fts5Index *p, i64 iRowid){ Fts5Data *pRet = fts5DataRead(p, iRowid); if( pRet ){ if( pRet->nn<4 || pRet->szLeaf>pRet->nn ){ - p->rc = FTS5_CORRUPT; + FTS5_CORRUPT_ROWID(p, iRowid); fts5DataRelease(pRet); pRet = 0; } @@ -245506,8 +248428,14 @@ static Fts5Structure *fts5StructureReadUncached(Fts5Index *p){ /* TODO: Do we need this if the leaf-index is appended? Probably... */ memset(&pData->p[pData->nn], 0, FTS5_DATA_PADDING); p->rc = fts5StructureDecode(pData->p, pData->nn, &iCookie, &pRet); - if( p->rc==SQLITE_OK && (pConfig->pgsz==0 || pConfig->iCookie!=iCookie) ){ - p->rc = sqlite3Fts5ConfigLoad(pConfig, iCookie); + if( p->rc==SQLITE_OK ){ + if( (pConfig->pgsz==0 || pConfig->iCookie!=iCookie) ){ + p->rc = sqlite3Fts5ConfigLoad(pConfig, iCookie); + } + }else if( p->rc==SQLITE_CORRUPT_VTAB ){ + sqlite3Fts5ConfigErrmsg(p->pConfig, + "fts5: corrupt structure record for table \"%s\"", p->pConfig->zName + ); } fts5DataRelease(pData); if( p->rc!=SQLITE_OK ){ @@ -246130,7 +249058,7 @@ static void fts5SegIterLoadRowid(Fts5Index *p, Fts5SegIter *pIter){ while( iOff>=pIter->pLeaf->szLeaf ){ fts5SegIterNextPage(p, pIter); if( pIter->pLeaf==0 ){ - if( p->rc==SQLITE_OK ) p->rc = FTS5_CORRUPT; + if( p->rc==SQLITE_OK ) FTS5_CORRUPT_ITER(p, pIter); return; } iOff = 4; @@ -246162,7 +249090,7 @@ static void fts5SegIterLoadTerm(Fts5Index *p, Fts5SegIter *pIter, int nKeep){ iOff += fts5GetVarint32(&a[iOff], nNew); if( iOff+nNew>pIter->pLeaf->szLeaf || nKeep>pIter->term.n || nNew==0 ){ - p->rc = FTS5_CORRUPT; + FTS5_CORRUPT_ITER(p, pIter); return; } pIter->term.n = nKeep; @@ -246357,7 +249285,7 @@ static void fts5SegIterReverseNewPage(Fts5Index *p, Fts5SegIter *pIter){ iRowidOff = fts5LeafFirstRowidOff(pNew); if( iRowidOff ){ if( iRowidOff>=pNew->szLeaf ){ - p->rc = FTS5_CORRUPT; + FTS5_CORRUPT_ITER(p, pIter); }else{ pIter->pLeaf = pNew; pIter->iLeafOffset = iRowidOff; @@ -246591,7 +249519,7 @@ static void fts5SegIterNext( } assert_nc( iOffszLeaf ); if( iOff>pLeaf->szLeaf ){ - p->rc = FTS5_CORRUPT; + FTS5_CORRUPT_ITER(p, pIter); return; } } @@ -246699,18 +249627,20 @@ static void fts5SegIterReverse(Fts5Index *p, Fts5SegIter *pIter){ fts5DataRelease(pIter->pLeaf); pIter->pLeaf = pLast; pIter->iLeafPgno = pgnoLast; - iOff = fts5LeafFirstRowidOff(pLast); - if( iOff>pLast->szLeaf ){ - p->rc = FTS5_CORRUPT; - return; - } - iOff += fts5GetVarint(&pLast->p[iOff], (u64*)&pIter->iRowid); - pIter->iLeafOffset = iOff; + if( p->rc==SQLITE_OK ){ + iOff = fts5LeafFirstRowidOff(pLast); + if( iOff>pLast->szLeaf ){ + FTS5_CORRUPT_ITER(p, pIter); + return; + } + iOff += fts5GetVarint(&pLast->p[iOff], (u64*)&pIter->iRowid); + pIter->iLeafOffset = iOff; - if( fts5LeafIsTermless(pLast) ){ - pIter->iEndofDoclist = pLast->nn+1; - }else{ - pIter->iEndofDoclist = fts5LeafFirstTermOff(pLast); + if( fts5LeafIsTermless(pLast) ){ + pIter->iEndofDoclist = pLast->nn+1; + }else{ + pIter->iEndofDoclist = fts5LeafFirstTermOff(pLast); + } } } @@ -246780,7 +249710,7 @@ static void fts5LeafSeek( iPgidx += fts5GetVarint32(&a[iPgidx], iTermOff); iOff = iTermOff; if( iOff>n ){ - p->rc = FTS5_CORRUPT; + FTS5_CORRUPT_ITER(p, pIter); return; } @@ -246823,7 +249753,7 @@ static void fts5LeafSeek( iOff = iTermOff; if( iOff>=n ){ - p->rc = FTS5_CORRUPT; + FTS5_CORRUPT_ITER(p, pIter); return; } @@ -246845,7 +249775,7 @@ static void fts5LeafSeek( iPgidx = (u32)pIter->pLeaf->szLeaf; iPgidx += fts5GetVarint32(&pIter->pLeaf->p[iPgidx], iOff); if( iOff<4 || (i64)iOff>=pIter->pLeaf->szLeaf ){ - p->rc = FTS5_CORRUPT; + FTS5_CORRUPT_ITER(p, pIter); return; }else{ nKeep = 0; @@ -246860,7 +249790,7 @@ static void fts5LeafSeek( search_success: if( (i64)iOff+nNew>n || nNew<1 ){ - p->rc = FTS5_CORRUPT; + FTS5_CORRUPT_ITER(p, pIter); return; } pIter->iLeafOffset = iOff + nNew; @@ -247325,7 +250255,7 @@ static void fts5SegIterGotoPage( assert( iLeafPgno>pIter->iLeafPgno ); if( iLeafPgno>pIter->pSeg->pgnoLast ){ - p->rc = FTS5_CORRUPT; + FTS5_CORRUPT_IDX(p); }else{ fts5DataRelease(pIter->pNextLeaf); pIter->pNextLeaf = 0; @@ -247340,7 +250270,7 @@ static void fts5SegIterGotoPage( u8 *a = pIter->pLeaf->p; int n = pIter->pLeaf->szLeaf; if( iOff<4 || iOff>=n ){ - p->rc = FTS5_CORRUPT; + FTS5_CORRUPT_IDX(p); }else{ iOff += fts5GetVarint(&a[iOff], (u64*)&pIter->iRowid); pIter->iLeafOffset = iOff; @@ -247819,7 +250749,7 @@ static void fts5ChunkIterate( if( nRem<=0 ){ break; }else if( pSeg->pSeg==0 ){ - p->rc = FTS5_CORRUPT; + FTS5_CORRUPT_IDX(p); return; }else{ pgno++; @@ -248922,7 +251852,7 @@ static void fts5TrimSegments(Fts5Index *p, Fts5Iter *pIter){ ** a single page has been assigned to more than one segment. In ** this case a prior iteration of this loop may have corrupted the ** segment currently being trimmed. */ - p->rc = FTS5_CORRUPT; + FTS5_CORRUPT_ROWID(p, iLeafRowid); }else{ fts5BufferZero(&buf); fts5BufferGrow(&p->rc, &buf, pData->nn); @@ -249389,7 +252319,7 @@ static void fts5SecureDeleteOverflow( }else if( bDetailNone ){ break; }else if( iNext>=pLeaf->szLeaf || pLeaf->nnszLeaf || iNext<4 ){ - p->rc = FTS5_CORRUPT; + FTS5_CORRUPT_ROWID(p, iRowid); break; }else{ int nShift = iNext - 4; @@ -249409,7 +252339,7 @@ static void fts5SecureDeleteOverflow( i1 += fts5GetVarint32(&aPg[i1], iFirst); if( iFirstrc = FTS5_CORRUPT; + FTS5_CORRUPT_ROWID(p, iRowid); break; } aIdx = sqlite3Fts5MallocZero(&p->rc, (pLeaf->nn-pLeaf->szLeaf)+2); @@ -249632,14 +252562,14 @@ static void fts5DoSecureDelete( nSuffix = (nPrefix2 + nSuffix2) - nPrefix; if( (iKeyOff+nSuffix)>iPgIdx || (iNextOff+nSuffix2)>iPgIdx ){ - p->rc = FTS5_CORRUPT; + FTS5_CORRUPT_IDX(p); }else{ if( iKey!=1 ){ iOff += sqlite3Fts5PutVarint(&aPg[iOff], nPrefix); } iOff += sqlite3Fts5PutVarint(&aPg[iOff], nSuffix); if( nPrefix2>pSeg->term.n ){ - p->rc = FTS5_CORRUPT; + FTS5_CORRUPT_IDX(p); }else if( nPrefix2>nPrefix ){ memcpy(&aPg[iOff], &pSeg->term.p[nPrefix], nPrefix2-nPrefix); iOff += (nPrefix2-nPrefix); @@ -250063,7 +252993,7 @@ static Fts5Structure *fts5IndexOptimizeStruct( } nByte += (((i64)pStruct->nLevel)+1) * sizeof(Fts5StructureLevel); - assert( nByte==SZ_FTS5STRUCTURE(pStruct->nLevel+2) ); + assert( nByte==(i64)SZ_FTS5STRUCTURE(pStruct->nLevel+2) ); pNew = (Fts5Structure*)sqlite3Fts5MallocZero(&p->rc, nByte); if( pNew ){ @@ -250432,7 +253362,7 @@ static void fts5MergePrefixLists( } if( pHead==0 || pHead->pNext==0 ){ - p->rc = FTS5_CORRUPT; + FTS5_CORRUPT_IDX(p); break; } @@ -250469,7 +253399,7 @@ static void fts5MergePrefixLists( assert_nc( tmp.n+nTail<=nTmp ); assert( tmp.n+nTail<=nTmp+nMerge*10 ); if( tmp.n+nTail>nTmp-FTS5_DATA_ZERO_PADDING ){ - if( p->rc==SQLITE_OK ) p->rc = FTS5_CORRUPT; + if( p->rc==SQLITE_OK ) FTS5_CORRUPT_IDX(p); break; } fts5BufferSafeAppendVarint(&out, (tmp.n+nTail) * 2); @@ -251038,11 +253968,14 @@ static int sqlite3Fts5IndexRollback(Fts5Index *p){ */ static int sqlite3Fts5IndexReinit(Fts5Index *p){ Fts5Structure *pTmp; - u8 tmpSpace[SZ_FTS5STRUCTURE(1)]; + union { + Fts5Structure sFts; + u8 tmpSpace[SZ_FTS5STRUCTURE(1)]; + } uFts; fts5StructureInvalidate(p); fts5IndexDiscardData(p); - pTmp = (Fts5Structure*)tmpSpace; - memset(pTmp, 0, SZ_FTS5STRUCTURE(1)); + pTmp = &uFts.sFts; + memset(uFts.tmpSpace, 0, sizeof(uFts.tmpSpace)); if( p->pConfig->bContentlessDelete ){ pTmp->nOriginCntr = 1; } @@ -252502,19 +255435,27 @@ static int fts5TestUtf8(const char *z, int n){ /* ** This function is also purely an internal test. It does not contribute to ** FTS functionality, or even the integrity-check, in any way. +** +** This function sets output variable (*pbFail) to true if the test fails. Or +** leaves it unchanged if the test succeeds. */ static void fts5TestTerm( Fts5Index *p, Fts5Buffer *pPrev, /* Previous term */ const char *z, int n, /* Possibly new term to test */ u64 expected, - u64 *pCksum + u64 *pCksum, + int *pbFail ){ int rc = p->rc; if( pPrev->n==0 ){ fts5BufferSet(&rc, pPrev, n, (const u8*)z); }else - if( rc==SQLITE_OK && (pPrev->n!=n || memcmp(pPrev->p, z, n)) ){ + if( *pbFail==0 + && rc==SQLITE_OK + && (pPrev->n!=n || memcmp(pPrev->p, z, n)) + && (p->pHash==0 || p->pHash->nEntry==0) + ){ u64 cksum3 = *pCksum; const char *zTerm = (const char*)&pPrev->p[1]; /* term sans prefix-byte */ int nTerm = pPrev->n-1; /* Size of zTerm in bytes */ @@ -252564,7 +255505,7 @@ static void fts5TestTerm( fts5BufferSet(&rc, pPrev, n, (const u8*)z); if( rc==SQLITE_OK && cksum3!=expected ){ - rc = FTS5_CORRUPT; + *pbFail = 1; } *pCksum = cksum3; } @@ -252573,7 +255514,7 @@ static void fts5TestTerm( #else # define fts5TestDlidxReverse(x,y,z) -# define fts5TestTerm(u,v,w,x,y,z) +# define fts5TestTerm(t,u,v,w,x,y,z) #endif /* @@ -252598,14 +255539,17 @@ static void fts5IndexIntegrityCheckEmpty( for(i=iFirst; p->rc==SQLITE_OK && i<=iLast; i++){ Fts5Data *pLeaf = fts5DataRead(p, FTS5_SEGMENT_ROWID(pSeg->iSegid, i)); if( pLeaf ){ - if( !fts5LeafIsTermless(pLeaf) ) p->rc = FTS5_CORRUPT; - if( i>=iNoRowid && 0!=fts5LeafFirstRowidOff(pLeaf) ) p->rc = FTS5_CORRUPT; + if( !fts5LeafIsTermless(pLeaf) + || (i>=iNoRowid && 0!=fts5LeafFirstRowidOff(pLeaf)) + ){ + FTS5_CORRUPT_ROWID(p, FTS5_SEGMENT_ROWID(pSeg->iSegid, i)); + } } fts5DataRelease(pLeaf); } } -static void fts5IntegrityCheckPgidx(Fts5Index *p, Fts5Data *pLeaf){ +static void fts5IntegrityCheckPgidx(Fts5Index *p, i64 iRowid, Fts5Data *pLeaf){ i64 iTermOff = 0; int ii; @@ -252623,12 +255567,12 @@ static void fts5IntegrityCheckPgidx(Fts5Index *p, Fts5Data *pLeaf){ iOff = iTermOff; if( iOff>=pLeaf->szLeaf ){ - p->rc = FTS5_CORRUPT; + FTS5_CORRUPT_ROWID(p, iRowid); }else if( iTermOff==nIncr ){ int nByte; iOff += fts5GetVarint32(&pLeaf->p[iOff], nByte); if( (iOff+nByte)>pLeaf->szLeaf ){ - p->rc = FTS5_CORRUPT; + FTS5_CORRUPT_ROWID(p, iRowid); }else{ fts5BufferSet(&p->rc, &buf1, nByte, &pLeaf->p[iOff]); } @@ -252637,7 +255581,7 @@ static void fts5IntegrityCheckPgidx(Fts5Index *p, Fts5Data *pLeaf){ iOff += fts5GetVarint32(&pLeaf->p[iOff], nKeep); iOff += fts5GetVarint32(&pLeaf->p[iOff], nByte); if( nKeep>buf1.n || (iOff+nByte)>pLeaf->szLeaf ){ - p->rc = FTS5_CORRUPT; + FTS5_CORRUPT_ROWID(p, iRowid); }else{ buf1.n = nKeep; fts5BufferAppendBlob(&p->rc, &buf1, nByte, &pLeaf->p[iOff]); @@ -252645,7 +255589,7 @@ static void fts5IntegrityCheckPgidx(Fts5Index *p, Fts5Data *pLeaf){ if( p->rc==SQLITE_OK ){ res = fts5BufferCompare(&buf1, &buf2); - if( res<=0 ) p->rc = FTS5_CORRUPT; + if( res<=0 ) FTS5_CORRUPT_ROWID(p, iRowid); } } fts5BufferSet(&p->rc, &buf2, buf1.n, buf1.p); @@ -252706,7 +255650,7 @@ static void fts5IndexIntegrityCheckSegment( ** entry even if all the terms are removed from it by secure-delete ** operations. */ }else{ - p->rc = FTS5_CORRUPT; + FTS5_CORRUPT_ROWID(p, iRow); } }else{ @@ -252718,15 +255662,15 @@ static void fts5IndexIntegrityCheckSegment( iOff = fts5LeafFirstTermOff(pLeaf); iRowidOff = fts5LeafFirstRowidOff(pLeaf); if( iRowidOff>=iOff || iOff>=pLeaf->szLeaf ){ - p->rc = FTS5_CORRUPT; + FTS5_CORRUPT_ROWID(p, iRow); }else{ iOff += fts5GetVarint32(&pLeaf->p[iOff], nTerm); res = fts5Memcmp(&pLeaf->p[iOff], zIdxTerm, MIN(nTerm, nIdxTerm)); if( res==0 ) res = nTerm - nIdxTerm; - if( res<0 ) p->rc = FTS5_CORRUPT; + if( res<0 ) FTS5_CORRUPT_ROWID(p, iRow); } - fts5IntegrityCheckPgidx(p, pLeaf); + fts5IntegrityCheckPgidx(p, iRow, pLeaf); } fts5DataRelease(pLeaf); if( p->rc ) break; @@ -252756,7 +255700,7 @@ static void fts5IndexIntegrityCheckSegment( iKey = FTS5_SEGMENT_ROWID(iSegid, iPg); pLeaf = fts5DataRead(p, iKey); if( pLeaf ){ - if( fts5LeafFirstRowidOff(pLeaf)!=0 ) p->rc = FTS5_CORRUPT; + if( fts5LeafFirstRowidOff(pLeaf)!=0 ) FTS5_CORRUPT_ROWID(p, iKey); fts5DataRelease(pLeaf); } } @@ -252771,12 +255715,12 @@ static void fts5IndexIntegrityCheckSegment( int iRowidOff = fts5LeafFirstRowidOff(pLeaf); ASSERT_SZLEAF_OK(pLeaf); if( iRowidOff>=pLeaf->szLeaf ){ - p->rc = FTS5_CORRUPT; + FTS5_CORRUPT_ROWID(p, iKey); }else if( bSecureDelete==0 || iRowidOff>0 ){ i64 iDlRowid = fts5DlidxIterRowid(pDlidx); fts5GetVarint(&pLeaf->p[iRowidOff], (u64*)&iRowid); if( iRowidrc = FTS5_CORRUPT; + FTS5_CORRUPT_ROWID(p, iKey); } } fts5DataRelease(pLeaf); @@ -252828,6 +255772,7 @@ static int sqlite3Fts5IndexIntegrityCheck(Fts5Index *p, u64 cksum, int bUseCksum /* Used by extra internal tests only run if NDEBUG is not defined */ u64 cksum3 = 0; /* Checksum based on contents of indexes */ Fts5Buffer term = {0,0,0}; /* Buffer used to hold most recent term */ + int bTestFail = 0; #endif const int flags = FTS5INDEX_QUERY_NOOUTPUT; @@ -252870,7 +255815,7 @@ static int sqlite3Fts5IndexIntegrityCheck(Fts5Index *p, u64 cksum, int bUseCksum char *z = (char*)fts5MultiIterTerm(pIter, &n); /* If this is a new term, query for it. Update cksum3 with the results. */ - fts5TestTerm(p, &term, z, n, cksum2, &cksum3); + fts5TestTerm(p, &term, z, n, cksum2, &cksum3, &bTestFail); if( p->rc ) break; if( eDetail==FTS5_DETAIL_NONE ){ @@ -252888,15 +255833,26 @@ static int sqlite3Fts5IndexIntegrityCheck(Fts5Index *p, u64 cksum, int bUseCksum } } } - fts5TestTerm(p, &term, 0, 0, cksum2, &cksum3); + fts5TestTerm(p, &term, 0, 0, cksum2, &cksum3, &bTestFail); fts5MultiIterFree(pIter); - if( p->rc==SQLITE_OK && bUseCksum && cksum!=cksum2 ) p->rc = FTS5_CORRUPT; - - fts5StructureRelease(pStruct); + if( p->rc==SQLITE_OK && bUseCksum && cksum!=cksum2 ){ + p->rc = FTS5_CORRUPT; + sqlite3Fts5ConfigErrmsg(p->pConfig, + "fts5: checksum mismatch for table \"%s\"", p->pConfig->zName + ); + } #ifdef SQLITE_DEBUG + /* In SQLITE_DEBUG builds, expensive extra checks were run as part of + ** the integrity-check above. If no other errors were detected, but one + ** of these tests failed, set the result to SQLITE_CORRUPT_VTAB here. */ + if( p->rc==SQLITE_OK && bTestFail ){ + p->rc = FTS5_CORRUPT; + } fts5BufferFree(&term); #endif + + fts5StructureRelease(pStruct); fts5BufferFree(&poslist); return fts5IndexReturn(p); } @@ -254240,6 +257196,17 @@ static void fts5SetUniqueFlag(sqlite3_index_info *pIdxInfo){ #endif } +static void fts5SetEstimatedRows(sqlite3_index_info *pIdxInfo, i64 nRow){ +#if SQLITE_VERSION_NUMBER>=3008002 +#ifndef SQLITE_CORE + if( sqlite3_libversion_number()>=3008002 ) +#endif + { + pIdxInfo->estimatedRows = nRow; + } +#endif +} + static int fts5UsePatternMatch( Fts5Config *pConfig, struct sqlite3_index_constraint *p @@ -254375,7 +257342,7 @@ static int fts5BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ nSeenMatch++; idxStr[iIdxStr++] = 'M'; sqlite3_snprintf(6, &idxStr[iIdxStr], "%d", iCol); - idxStr += strlen(&idxStr[iIdxStr]); + iIdxStr += (int)strlen(&idxStr[iIdxStr]); assert( idxStr[iIdxStr]=='\0' ); } pInfo->aConstraintUsage[i].argvIndex = ++iCons; @@ -254394,6 +257361,7 @@ static int fts5BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ idxStr[iIdxStr++] = '='; bSeenEq = 1; pInfo->aConstraintUsage[i].argvIndex = ++iCons; + pInfo->aConstraintUsage[i].omit = 1; } } } @@ -254441,17 +257409,21 @@ static int fts5BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ /* Calculate the estimated cost based on the flags set in idxFlags. */ if( bSeenEq ){ - pInfo->estimatedCost = nSeenMatch ? 1000.0 : 10.0; - if( nSeenMatch==0 ) fts5SetUniqueFlag(pInfo); - }else if( bSeenLt && bSeenGt ){ - pInfo->estimatedCost = nSeenMatch ? 5000.0 : 250000.0; - }else if( bSeenLt || bSeenGt ){ - pInfo->estimatedCost = nSeenMatch ? 7500.0 : 750000.0; - }else{ - pInfo->estimatedCost = nSeenMatch ? 10000.0 : 1000000.0; - } - for(i=1; iestimatedCost *= 0.4; + pInfo->estimatedCost = nSeenMatch ? 1000.0 : 25.0; + fts5SetUniqueFlag(pInfo); + fts5SetEstimatedRows(pInfo, 1); + }else{ + if( bSeenLt && bSeenGt ){ + pInfo->estimatedCost = nSeenMatch ? 5000.0 : 750000.0; + }else if( bSeenLt || bSeenGt ){ + pInfo->estimatedCost = nSeenMatch ? 7500.0 : 2250000.0; + }else{ + pInfo->estimatedCost = nSeenMatch ? 10000.0 : 3000000.0; + } + for(i=1; iestimatedCost *= 0.4; + } + fts5SetEstimatedRows(pInfo, (i64)(pInfo->estimatedCost / 4.0)); } pInfo->idxNum = idxFlags; @@ -254650,7 +257622,9 @@ static int fts5CursorReseek(Fts5Cursor *pCsr, int *pbSkip){ int bDesc = pCsr->bDesc; i64 iRowid = sqlite3Fts5ExprRowid(pCsr->pExpr); - rc = sqlite3Fts5ExprFirst(pCsr->pExpr, pTab->p.pIndex, iRowid, bDesc); + rc = sqlite3Fts5ExprFirst( + pCsr->pExpr, pTab->p.pIndex, iRowid, pCsr->iLastRowid, bDesc + ); if( rc==SQLITE_OK && iRowid!=sqlite3Fts5ExprRowid(pCsr->pExpr) ){ *pbSkip = 1; } @@ -254822,7 +257796,9 @@ static int fts5CursorFirstSorted( static int fts5CursorFirst(Fts5FullTable *pTab, Fts5Cursor *pCsr, int bDesc){ int rc; Fts5Expr *pExpr = pCsr->pExpr; - rc = sqlite3Fts5ExprFirst(pExpr, pTab->p.pIndex, pCsr->iFirstRowid, bDesc); + rc = sqlite3Fts5ExprFirst( + pExpr, pTab->p.pIndex, pCsr->iFirstRowid, pCsr->iLastRowid, bDesc + ); if( sqlite3Fts5ExprEof(pExpr) ){ CsrFlagSet(pCsr, FTS5CSR_EOF); } @@ -257307,7 +260283,7 @@ static void fts5SourceIdFunc( ){ assert( nArg==0 ); UNUSED_PARAM2(nArg, apUnused); - sqlite3_result_text(pCtx, "fts5: 2025-07-30 19:33:53 4d8adfb30e03f9cf27f800a2c1ba3c48fb4ca1b08b0f5ed59a4d5ecbf45e20a3", -1, SQLITE_TRANSIENT); + sqlite3_result_text(pCtx, "fts5: 2025-11-04 19:38:17 fb2c931ae597f8d00a37574ff67aeed3eced4e5547f9120744ae4bfa8e74527b", -1, SQLITE_TRANSIENT); } /* @@ -257330,9 +260306,9 @@ static void fts5LocaleFunc( sqlite3_value **apArg /* Function arguments */ ){ const char *zLocale = 0; - int nLocale = 0; + i64 nLocale = 0; const char *zText = 0; - int nText = 0; + i64 nText = 0; assert( nArg==2 ); UNUSED_PARAM(nArg); @@ -257349,10 +260325,10 @@ static void fts5LocaleFunc( Fts5Global *p = (Fts5Global*)sqlite3_user_data(pCtx); u8 *pBlob = 0; u8 *pCsr = 0; - int nBlob = 0; + i64 nBlob = 0; nBlob = FTS5_LOCALE_HDR_SIZE + nLocale + 1 + nText; - pBlob = (u8*)sqlite3_malloc(nBlob); + pBlob = (u8*)sqlite3_malloc64(nBlob); if( pBlob==0 ){ sqlite3_result_error_nomem(pCtx); return; @@ -257430,8 +260406,9 @@ static int fts5IntegrityMethod( " FTS5 table %s.%s: %s", zSchema, zTabname, sqlite3_errstr(rc)); } + }else if( (rc&0xff)==SQLITE_CORRUPT ){ + rc = SQLITE_OK; } - sqlite3Fts5IndexCloseReader(pTab->p.pIndex); pTab->p.pConfig->pzErrmsg = 0; diff --git a/deps/sqlite/sqlite3.h b/deps/sqlite/sqlite3.h index c2ed750305b244..70a4a1b1a5e990 100644 --- a/deps/sqlite/sqlite3.h +++ b/deps/sqlite/sqlite3.h @@ -146,9 +146,12 @@ extern "C" { ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ -#define SQLITE_VERSION "3.50.4" -#define SQLITE_VERSION_NUMBER 3050004 -#define SQLITE_SOURCE_ID "2025-07-30 19:33:53 4d8adfb30e03f9cf27f800a2c1ba3c48fb4ca1b08b0f5ed59a4d5ecbf45e20a3" +#define SQLITE_VERSION "3.51.0" +#define SQLITE_VERSION_NUMBER 3051000 +#define SQLITE_SOURCE_ID "2025-11-04 19:38:17 fb2c931ae597f8d00a37574ff67aeed3eced4e5547f9120744ae4bfa8e74527b" +#define SQLITE_SCM_BRANCH "trunk" +#define SQLITE_SCM_TAGS "release major-release version-3.51.0" +#define SQLITE_SCM_DATETIME "2025-11-04T19:38:17.314Z" /* ** CAPI3REF: Run-Time Library Version Numbers @@ -168,9 +171,9 @@ extern "C" { ** assert( strcmp(sqlite3_libversion(),SQLITE_VERSION)==0 ); **
  • )^ ** -** ^The sqlite3_version[] string constant contains the text of [SQLITE_VERSION] -** macro. ^The sqlite3_libversion() function returns a pointer to the -** to the sqlite3_version[] string constant. The sqlite3_libversion() +** ^The sqlite3_version[] string constant contains the text of the +** [SQLITE_VERSION] macro. ^The sqlite3_libversion() function returns a +** pointer to the sqlite3_version[] string constant. The sqlite3_libversion() ** function is provided for use in DLLs since DLL users usually do not have ** direct access to string constants within the DLL. ^The ** sqlite3_libversion_number() function returns an integer equal to @@ -370,7 +373,7 @@ typedef int (*sqlite3_callback)(void*,int,char**, char**); ** without having to use a lot of C code. ** ** ^The sqlite3_exec() interface runs zero or more UTF-8 encoded, -** semicolon-separate SQL statements passed into its 2nd argument, +** semicolon-separated SQL statements passed into its 2nd argument, ** in the context of the [database connection] passed in as its 1st ** argument. ^If the callback function of the 3rd argument to ** sqlite3_exec() is not NULL, then it is invoked for each result row @@ -403,7 +406,7 @@ typedef int (*sqlite3_callback)(void*,int,char**, char**); ** result row is NULL then the corresponding string pointer for the ** sqlite3_exec() callback is a NULL pointer. ^The 4th argument to the ** sqlite3_exec() callback is an array of pointers to strings where each -** entry represents the name of corresponding result column as obtained +** entry represents the name of a corresponding result column as obtained ** from [sqlite3_column_name()]. ** ** ^If the 2nd parameter to sqlite3_exec() is a NULL pointer, a pointer @@ -497,6 +500,9 @@ SQLITE_API int sqlite3_exec( #define SQLITE_ERROR_MISSING_COLLSEQ (SQLITE_ERROR | (1<<8)) #define SQLITE_ERROR_RETRY (SQLITE_ERROR | (2<<8)) #define SQLITE_ERROR_SNAPSHOT (SQLITE_ERROR | (3<<8)) +#define SQLITE_ERROR_RESERVESIZE (SQLITE_ERROR | (4<<8)) +#define SQLITE_ERROR_KEY (SQLITE_ERROR | (5<<8)) +#define SQLITE_ERROR_UNABLE (SQLITE_ERROR | (6<<8)) #define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8)) #define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8)) #define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8)) @@ -531,6 +537,8 @@ SQLITE_API int sqlite3_exec( #define SQLITE_IOERR_DATA (SQLITE_IOERR | (32<<8)) #define SQLITE_IOERR_CORRUPTFS (SQLITE_IOERR | (33<<8)) #define SQLITE_IOERR_IN_PAGE (SQLITE_IOERR | (34<<8)) +#define SQLITE_IOERR_BADKEY (SQLITE_IOERR | (35<<8)) +#define SQLITE_IOERR_CODEC (SQLITE_IOERR | (36<<8)) #define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8)) #define SQLITE_LOCKED_VTAB (SQLITE_LOCKED | (2<<8)) #define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8)) @@ -589,7 +597,7 @@ SQLITE_API int sqlite3_exec( ** Note in particular that passing the SQLITE_OPEN_EXCLUSIVE flag into ** [sqlite3_open_v2()] does *not* cause the underlying database file ** to be opened using O_EXCL. Passing SQLITE_OPEN_EXCLUSIVE into -** [sqlite3_open_v2()] has historically be a no-op and might become an +** [sqlite3_open_v2()] has historically been a no-op and might become an ** error in future versions of SQLite. */ #define SQLITE_OPEN_READONLY 0x00000001 /* Ok for sqlite3_open_v2() */ @@ -683,7 +691,7 @@ SQLITE_API int sqlite3_exec( ** SQLite uses one of these integer values as the second ** argument to calls it makes to the xLock() and xUnlock() methods ** of an [sqlite3_io_methods] object. These values are ordered from -** lest restrictive to most restrictive. +** least restrictive to most restrictive. ** ** The argument to xLock() is always SHARED or higher. The argument to ** xUnlock is either SHARED or NONE. @@ -924,7 +932,7 @@ struct sqlite3_io_methods { ** connection. See also [SQLITE_FCNTL_FILE_POINTER]. ** **
  • [[SQLITE_FCNTL_SYNC_OMITTED]] -** No longer in use. +** The SQLITE_FCNTL_SYNC_OMITTED file-control is no longer used. ** **
  • [[SQLITE_FCNTL_SYNC]] ** The [SQLITE_FCNTL_SYNC] opcode is generated internally by SQLite and @@ -999,7 +1007,7 @@ struct sqlite3_io_methods { ** **
  • [[SQLITE_FCNTL_VFSNAME]] ** ^The [SQLITE_FCNTL_VFSNAME] opcode can be used to obtain the names of -** all [VFSes] in the VFS stack. The names are of all VFS shims and the +** all [VFSes] in the VFS stack. The names of all VFS shims and the ** final bottom-level VFS are written into memory obtained from ** [sqlite3_malloc()] and the result is stored in the char* variable ** that the fourth parameter of [sqlite3_file_control()] points to. @@ -1013,7 +1021,7 @@ struct sqlite3_io_methods { ** ^The [SQLITE_FCNTL_VFS_POINTER] opcode finds a pointer to the top-level ** [VFSes] currently in use. ^(The argument X in ** sqlite3_file_control(db,SQLITE_FCNTL_VFS_POINTER,X) must be -** of type "[sqlite3_vfs] **". This opcodes will set *X +** of type "[sqlite3_vfs] **". This opcode will set *X ** to a pointer to the top-level VFS.)^ ** ^When there are multiple VFS shims in the stack, this opcode finds the ** upper-most shim only. @@ -1203,7 +1211,7 @@ struct sqlite3_io_methods { **
  • [[SQLITE_FCNTL_EXTERNAL_READER]] ** The EXPERIMENTAL [SQLITE_FCNTL_EXTERNAL_READER] opcode is used to detect ** whether or not there is a database client in another process with a wal-mode -** transaction open on the database or not. It is only available on unix.The +** transaction open on the database or not. It is only available on unix. The ** (void*) argument passed with this file-control should be a pointer to a ** value of type (int). The integer value is set to 1 if the database is a wal ** mode database and there exists at least one client in another process that @@ -1221,6 +1229,15 @@ struct sqlite3_io_methods { ** database is not a temp db, then the [SQLITE_FCNTL_RESET_CACHE] file-control ** purges the contents of the in-memory page cache. If there is an open ** transaction, or if the db is a temp-db, this opcode is a no-op, not an error. +** +**
  • [[SQLITE_FCNTL_FILESTAT]] +** The [SQLITE_FCNTL_FILESTAT] opcode returns low-level diagnostic information +** about the [sqlite3_file] objects used access the database and journal files +** for the given schema. The fourth parameter to [sqlite3_file_control()] +** should be an initialized [sqlite3_str] pointer. JSON text describing +** various aspects of the sqlite3_file object is appended to the sqlite3_str. +** The SQLITE_FCNTL_FILESTAT opcode is usually a no-op, unless compile-time +** options are used to enable it. ** */ #define SQLITE_FCNTL_LOCKSTATE 1 @@ -1266,6 +1283,7 @@ struct sqlite3_io_methods { #define SQLITE_FCNTL_RESET_CACHE 42 #define SQLITE_FCNTL_NULL_IO 43 #define SQLITE_FCNTL_BLOCK_ON_CONNECT 44 +#define SQLITE_FCNTL_FILESTAT 45 /* deprecated names */ #define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE @@ -1628,7 +1646,7 @@ struct sqlite3_vfs { ** SQLite interfaces so that an application usually does not need to ** invoke sqlite3_initialize() directly. For example, [sqlite3_open()] ** calls sqlite3_initialize() so the SQLite library will be automatically -** initialized when [sqlite3_open()] is called if it has not be initialized +** initialized when [sqlite3_open()] is called if it has not been initialized ** already. ^However, if SQLite is compiled with the [SQLITE_OMIT_AUTOINIT] ** compile-time option, then the automatic calls to sqlite3_initialize() ** are omitted and the application must call sqlite3_initialize() directly @@ -1885,21 +1903,21 @@ struct sqlite3_mem_methods { ** The [sqlite3_mem_methods] ** structure is filled with the currently defined memory allocation routines.)^ ** This option can be used to overload the default memory allocation -** routines with a wrapper that simulations memory allocation failure or +** routines with a wrapper that simulates memory allocation failure or ** tracks memory usage, for example. ** ** [[SQLITE_CONFIG_SMALL_MALLOC]]
    SQLITE_CONFIG_SMALL_MALLOC
    -**
    ^The SQLITE_CONFIG_SMALL_MALLOC option takes single argument of +**
    ^The SQLITE_CONFIG_SMALL_MALLOC option takes a single argument of ** type int, interpreted as a boolean, which if true provides a hint to ** SQLite that it should avoid large memory allocations if possible. ** SQLite will run faster if it is free to make large memory allocations, -** but some application might prefer to run slower in exchange for +** but some applications might prefer to run slower in exchange for ** guarantees about memory fragmentation that are possible if large ** allocations are avoided. This hint is normally off. **
    ** ** [[SQLITE_CONFIG_MEMSTATUS]]
    SQLITE_CONFIG_MEMSTATUS
    -**
    ^The SQLITE_CONFIG_MEMSTATUS option takes single argument of type int, +**
    ^The SQLITE_CONFIG_MEMSTATUS option takes a single argument of type int, ** interpreted as a boolean, which enables or disables the collection of ** memory allocation statistics. ^(When memory allocation statistics are ** disabled, the following SQLite interfaces become non-operational: @@ -1944,7 +1962,7 @@ struct sqlite3_mem_methods { ** ^If pMem is NULL and N is non-zero, then each database connection ** does an initial bulk allocation for page cache memory ** from [sqlite3_malloc()] sufficient for N cache lines if N is positive or -** of -1024*N bytes if N is negative, . ^If additional +** of -1024*N bytes if N is negative. ^If additional ** page cache memory is needed beyond what is provided by the initial ** allocation, then SQLite goes to [sqlite3_malloc()] separately for each ** additional cache line.
    @@ -1973,7 +1991,7 @@ struct sqlite3_mem_methods { **
    ^(The SQLITE_CONFIG_MUTEX option takes a single argument which is a ** pointer to an instance of the [sqlite3_mutex_methods] structure. ** The argument specifies alternative low-level mutex routines to be used -** in place the mutex routines built into SQLite.)^ ^SQLite makes a copy of +** in place of the mutex routines built into SQLite.)^ ^SQLite makes a copy of ** the content of the [sqlite3_mutex_methods] structure before the call to ** [sqlite3_config()] returns. ^If SQLite is compiled with ** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then @@ -2015,7 +2033,7 @@ struct sqlite3_mem_methods { ** ** [[SQLITE_CONFIG_GETPCACHE2]]
    SQLITE_CONFIG_GETPCACHE2
    **
    ^(The SQLITE_CONFIG_GETPCACHE2 option takes a single argument which -** is a pointer to an [sqlite3_pcache_methods2] object. SQLite copies of +** is a pointer to an [sqlite3_pcache_methods2] object. SQLite copies off ** the current page cache implementation into that object.)^
    ** ** [[SQLITE_CONFIG_LOG]]
    SQLITE_CONFIG_LOG
    @@ -2032,7 +2050,7 @@ struct sqlite3_mem_methods { ** the logger function is a copy of the first parameter to the corresponding ** [sqlite3_log()] call and is intended to be a [result code] or an ** [extended result code]. ^The third parameter passed to the logger is -** log message after formatting via [sqlite3_snprintf()]. +** a log message after formatting via [sqlite3_snprintf()]. ** The SQLite logging interface is not reentrant; the logger function ** supplied by the application must not invoke any SQLite interface. ** In a multi-threaded application, the application-defined logger @@ -2223,7 +2241,7 @@ struct sqlite3_mem_methods { ** These constants are the available integer configuration options that ** can be passed as the second parameter to the [sqlite3_db_config()] interface. ** -** The [sqlite3_db_config()] interface is a var-args functions. It takes a +** The [sqlite3_db_config()] interface is a var-args function. It takes a ** variable number of parameters, though always at least two. The number of ** parameters passed into sqlite3_db_config() depends on which of these ** constants is given as the second parameter. This documentation page @@ -2335,17 +2353,20 @@ struct sqlite3_mem_methods { ** ** [[SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER]] **
    SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER
    -**
    ^This option is used to enable or disable the -** [fts3_tokenizer()] function which is part of the -** [FTS3] full-text search engine extension. -** There must be two additional arguments. -** The first argument is an integer which is 0 to disable fts3_tokenizer() or -** positive to enable fts3_tokenizer() or negative to leave the setting -** unchanged. -** The second parameter is a pointer to an integer into which -** is written 0 or 1 to indicate whether fts3_tokenizer is disabled or enabled -** following this call. The second parameter may be a NULL pointer, in -** which case the new setting is not reported back.
    +**
    ^This option is used to enable or disable using the +** [fts3_tokenizer()] function - part of the [FTS3] full-text search engine +** extension - without using bound parameters as the parameters. Doing so +** is disabled by default. There must be two additional arguments. The first +** argument is an integer. If it is passed 0, then using fts3_tokenizer() +** without bound parameters is disabled. If it is passed a positive value, +** then calling fts3_tokenizer without bound parameters is enabled. If it +** is passed a negative value, this setting is not modified - this can be +** used to query for the current setting. The second parameter is a pointer +** to an integer into which is written 0 or 1 to indicate the current value +** of this setting (after it is modified, if applicable). The second +** parameter may be a NULL pointer, in which case the value of the setting +** is not reported back. Refer to [FTS3] documentation for further details. +**
    ** ** [[SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION]] **
    SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION
    @@ -2357,8 +2378,8 @@ struct sqlite3_mem_methods { ** When the first argument to this interface is 1, then only the C-API is ** enabled and the SQL function remains disabled. If the first argument to ** this interface is 0, then both the C-API and the SQL function are disabled. -** If the first argument is -1, then no changes are made to state of either the -** C-API or the SQL function. +** If the first argument is -1, then no changes are made to the state of either +** the C-API or the SQL function. ** The second parameter is a pointer to an integer into which ** is written 0 or 1 to indicate whether [sqlite3_load_extension()] interface ** is disabled or enabled following this call. The second parameter may @@ -2476,7 +2497,7 @@ struct sqlite3_mem_methods { ** [[SQLITE_DBCONFIG_LEGACY_ALTER_TABLE]] **
    SQLITE_DBCONFIG_LEGACY_ALTER_TABLE
    **
    The SQLITE_DBCONFIG_LEGACY_ALTER_TABLE option activates or deactivates -** the legacy behavior of the [ALTER TABLE RENAME] command such it +** the legacy behavior of the [ALTER TABLE RENAME] command such that it ** behaves as it did prior to [version 3.24.0] (2018-06-04). See the ** "Compatibility Notice" on the [ALTER TABLE RENAME documentation] for ** additional information. This feature can also be turned on and off @@ -2525,7 +2546,7 @@ struct sqlite3_mem_methods { **
    SQLITE_DBCONFIG_LEGACY_FILE_FORMAT
    **
    The SQLITE_DBCONFIG_LEGACY_FILE_FORMAT option activates or deactivates ** the legacy file format flag. When activated, this flag causes all newly -** created database file to have a schema format version number (the 4-byte +** created database files to have a schema format version number (the 4-byte ** integer found at offset 44 into the database header) of 1. This in turn ** means that the resulting database file will be readable and writable by ** any SQLite version back to 3.0.0 ([dateof:3.0.0]). Without this setting, @@ -2552,7 +2573,7 @@ struct sqlite3_mem_methods { ** the database handle both when the SQL statement is prepared and when it ** is stepped. The flag is set (collection of statistics is enabled) ** by default.

    This option takes two arguments: an integer and a pointer to -** an integer.. The first argument is 1, 0, or -1 to enable, disable, or +** an integer. The first argument is 1, 0, or -1 to enable, disable, or ** leave unchanged the statement scanstatus option. If the second argument ** is not NULL, then the value of the statement scanstatus setting after ** processing the first argument is written into the integer that the second @@ -2595,8 +2616,8 @@ struct sqlite3_mem_methods { **

    The SQLITE_DBCONFIG_ENABLE_ATTACH_WRITE option enables or disables the ** ability of the [ATTACH DATABASE] SQL command to open a database for writing. ** This capability is enabled by default. Applications can disable or -** reenable this capability using the current DBCONFIG option. If the -** the this capability is disabled, the [ATTACH] command will still work, +** reenable this capability using the current DBCONFIG option. If +** this capability is disabled, the [ATTACH] command will still work, ** but the database will be opened read-only. If this option is disabled, ** then the ability to create a new database using [ATTACH] is also disabled, ** regardless of the value of the [SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE] @@ -2630,7 +2651,7 @@ struct sqlite3_mem_methods { ** **

    Most of the SQLITE_DBCONFIG options take two arguments, so that the ** overall call to [sqlite3_db_config()] has a total of four parameters. -** The first argument (the third parameter to sqlite3_db_config()) is a integer. +** The first argument (the third parameter to sqlite3_db_config()) is an integer. ** The second argument is a pointer to an integer. If the first argument is 1, ** then the option becomes enabled. If the first integer argument is 0, then the ** option is disabled. If the first argument is -1, then the option setting @@ -2920,7 +2941,7 @@ SQLITE_API int sqlite3_is_interrupted(sqlite3*); ** ^These routines return 0 if the statement is incomplete. ^If a ** memory allocation fails, then SQLITE_NOMEM is returned. ** -** ^These routines do not parse the SQL statements thus +** ^These routines do not parse the SQL statements and thus ** will not detect syntactically incorrect SQL. ** ** ^(If SQLite has not been initialized using [sqlite3_initialize()] prior @@ -3037,7 +3058,7 @@ SQLITE_API int sqlite3_busy_timeout(sqlite3*, int ms); ** indefinitely if possible. The results of passing any other negative value ** are undefined. ** -** Internally, each SQLite database handle store two timeout values - the +** Internally, each SQLite database handle stores two timeout values - the ** busy-timeout (used for rollback mode databases, or if the VFS does not ** support blocking locks) and the setlk-timeout (used for blocking locks ** on wal-mode databases). The sqlite3_busy_timeout() method sets both @@ -3067,7 +3088,7 @@ SQLITE_API int sqlite3_setlk_timeout(sqlite3*, int ms, int flags); ** This is a legacy interface that is preserved for backwards compatibility. ** Use of this interface is not recommended. ** -** Definition: A result table is memory data structure created by the +** Definition: A result table is a memory data structure created by the ** [sqlite3_get_table()] interface. A result table records the ** complete query results from one or more queries. ** @@ -3210,7 +3231,7 @@ SQLITE_API char *sqlite3_vsnprintf(int,char*,const char*, va_list); ** ^Calling sqlite3_free() with a pointer previously returned ** by sqlite3_malloc() or sqlite3_realloc() releases that memory so ** that it might be reused. ^The sqlite3_free() routine is -** a no-op if is called with a NULL pointer. Passing a NULL pointer +** a no-op if it is called with a NULL pointer. Passing a NULL pointer ** to sqlite3_free() is harmless. After being freed, memory ** should neither be read nor written. Even reading previously freed ** memory might result in a segmentation fault or other severe error. @@ -3228,13 +3249,13 @@ SQLITE_API char *sqlite3_vsnprintf(int,char*,const char*, va_list); ** sqlite3_free(X). ** ^sqlite3_realloc(X,N) returns a pointer to a memory allocation ** of at least N bytes in size or NULL if insufficient memory is available. -** ^If M is the size of the prior allocation, then min(N,M) bytes -** of the prior allocation are copied into the beginning of buffer returned +** ^If M is the size of the prior allocation, then min(N,M) bytes of the +** prior allocation are copied into the beginning of the buffer returned ** by sqlite3_realloc(X,N) and the prior allocation is freed. ** ^If sqlite3_realloc(X,N) returns NULL and N is positive, then the ** prior allocation is not freed. ** -** ^The sqlite3_realloc64(X,N) interfaces works the same as +** ^The sqlite3_realloc64(X,N) interface works the same as ** sqlite3_realloc(X,N) except that N is a 64-bit unsigned integer instead ** of a 32-bit signed integer. ** @@ -3284,7 +3305,7 @@ SQLITE_API sqlite3_uint64 sqlite3_msize(void*); ** was last reset. ^The values returned by [sqlite3_memory_used()] and ** [sqlite3_memory_highwater()] include any overhead ** added by SQLite in its implementation of [sqlite3_malloc()], -** but not overhead added by the any underlying system library +** but not overhead added by any underlying system library ** routines that [sqlite3_malloc()] may call. ** ** ^The memory high-water mark is reset to the current value of @@ -3736,7 +3757,7 @@ SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); ** there is no harm in trying.) ** ** ^(

    [SQLITE_OPEN_SHAREDCACHE]
    -**
    The database is opened [shared cache] enabled, overriding +**
    The database is opened with [shared cache] enabled, overriding ** the default shared cache setting provided by ** [sqlite3_enable_shared_cache()].)^ ** The [use of shared cache mode is discouraged] and hence shared cache @@ -3744,7 +3765,7 @@ SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); ** this option is a no-op. ** ** ^(
    [SQLITE_OPEN_PRIVATECACHE]
    -**
    The database is opened [shared cache] disabled, overriding +**
    The database is opened with [shared cache] disabled, overriding ** the default shared cache setting provided by ** [sqlite3_enable_shared_cache()].)^ ** @@ -4162,7 +4183,7 @@ SQLITE_API void sqlite3_free_filename(sqlite3_filename); ** subsequent calls to other SQLite interface functions.)^ ** ** ^The sqlite3_errstr(E) interface returns the English-language text -** that describes the [result code] E, as UTF-8, or NULL if E is not an +** that describes the [result code] E, as UTF-8, or NULL if E is not a ** result code for which a text error message is available. ** ^(Memory to hold the error message string is managed internally ** and must not be freed by the application)^. @@ -4170,7 +4191,7 @@ SQLITE_API void sqlite3_free_filename(sqlite3_filename); ** ^If the most recent error references a specific token in the input ** SQL, the sqlite3_error_offset() interface returns the byte offset ** of the start of that token. ^The byte offset returned by -** sqlite3_error_offset() assumes that the input SQL is UTF8. +** sqlite3_error_offset() assumes that the input SQL is UTF-8. ** ^If the most recent error does not reference a specific token in the input ** SQL, then the sqlite3_error_offset() function returns -1. ** @@ -4195,6 +4216,34 @@ SQLITE_API const void *sqlite3_errmsg16(sqlite3*); SQLITE_API const char *sqlite3_errstr(int); SQLITE_API int sqlite3_error_offset(sqlite3 *db); +/* +** CAPI3REF: Set Error Codes And Message +** METHOD: sqlite3 +** +** Set the error code of the database handle passed as the first argument +** to errcode, and the error message to a copy of nul-terminated string +** zErrMsg. If zErrMsg is passed NULL, then the error message is set to +** the default message associated with the supplied error code. Subsequent +** calls to [sqlite3_errcode()] and [sqlite3_errmsg()] and similar will +** return the values set by this routine in place of what was previously +** set by SQLite itself. +** +** This function returns SQLITE_OK if the error code and error message are +** successfully set, SQLITE_NOMEM if an OOM occurs, and SQLITE_MISUSE if +** the database handle is NULL or invalid. +** +** The error code and message set by this routine remains in effect until +** they are changed, either by another call to this routine or until they are +** changed to by SQLite itself to reflect the result of some subsquent +** API call. +** +** This function is intended for use by SQLite extensions or wrappers. The +** idea is that an extension or wrapper can use this routine to set error +** messages and error codes and thus behave more like a core SQLite +** feature from the point of view of an application. +*/ +SQLITE_API int sqlite3_set_errmsg(sqlite3 *db, int errcode, const char *zErrMsg); + /* ** CAPI3REF: Prepared Statement Object ** KEYWORDS: {prepared statement} {prepared statements} @@ -4269,8 +4318,8 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); ** ** These constants define various performance limits ** that can be lowered at run-time using [sqlite3_limit()]. -** The synopsis of the meanings of the various limits is shown below. -** Additional information is available at [limits | Limits in SQLite]. +** A concise description of these limits follows, and additional information +** is available at [limits | Limits in SQLite]. ** **
    ** [[SQLITE_LIMIT_LENGTH]] ^(
    SQLITE_LIMIT_LENGTH
    @@ -4335,7 +4384,7 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); /* ** CAPI3REF: Prepare Flags ** -** These constants define various flags that can be passed into +** These constants define various flags that can be passed into the ** "prepFlags" parameter of the [sqlite3_prepare_v3()] and ** [sqlite3_prepare16_v3()] interfaces. ** @@ -4422,7 +4471,7 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); ** there is a small performance advantage to passing an nByte parameter that ** is the number of bytes in the input string including ** the nul-terminator. -** Note that nByte measure the length of the input in bytes, not +** Note that nByte measures the length of the input in bytes, not ** characters, even for the UTF-16 interfaces. ** ** ^If pzTail is not NULL then *pzTail is made to point to the first byte @@ -4556,7 +4605,7 @@ SQLITE_API int sqlite3_prepare16_v3( ** ** ^The sqlite3_expanded_sql() interface returns NULL if insufficient memory ** is available to hold the result, or if the result would exceed the -** the maximum string length determined by the [SQLITE_LIMIT_LENGTH]. +** maximum string length determined by the [SQLITE_LIMIT_LENGTH]. ** ** ^The [SQLITE_TRACE_SIZE_LIMIT] compile-time option limits the size of ** bound parameter expansions. ^The [SQLITE_OMIT_TRACE] compile-time @@ -4744,7 +4793,7 @@ typedef struct sqlite3_value sqlite3_value; ** ** The context in which an SQL function executes is stored in an ** sqlite3_context object. ^A pointer to an sqlite3_context object -** is always first parameter to [application-defined SQL functions]. +** is always the first parameter to [application-defined SQL functions]. ** The application-defined SQL function implementation will pass this ** pointer through into calls to [sqlite3_result_int | sqlite3_result()], ** [sqlite3_aggregate_context()], [sqlite3_user_data()], @@ -4868,9 +4917,11 @@ typedef struct sqlite3_context sqlite3_context; ** associated with the pointer P of type T. ^D is either a NULL pointer or ** a pointer to a destructor function for P. ^SQLite will invoke the ** destructor D with a single argument of P when it is finished using -** P. The T parameter should be a static string, preferably a string -** literal. The sqlite3_bind_pointer() routine is part of the -** [pointer passing interface] added for SQLite 3.20.0. +** P, even if the call to sqlite3_bind_pointer() fails. Due to a +** historical design quirk, results are undefined if D is +** SQLITE_TRANSIENT. The T parameter should be a static string, +** preferably a string literal. The sqlite3_bind_pointer() routine is +** part of the [pointer passing interface] added for SQLite 3.20.0. ** ** ^If any of the sqlite3_bind_*() routines are called with a NULL pointer ** for the [prepared statement] or with a prepared statement for which @@ -5481,7 +5532,7 @@ SQLITE_API int sqlite3_column_type(sqlite3_stmt*, int iCol); ** ** ^The sqlite3_finalize() function is called to delete a [prepared statement]. ** ^If the most recent evaluation of the statement encountered no errors -** or if the statement is never been evaluated, then sqlite3_finalize() returns +** or if the statement has never been evaluated, then sqlite3_finalize() returns ** SQLITE_OK. ^If the most recent evaluation of statement S failed, then ** sqlite3_finalize(S) returns the appropriate [error code] or ** [extended error code]. @@ -5713,7 +5764,7 @@ SQLITE_API int sqlite3_create_window_function( /* ** CAPI3REF: Text Encodings ** -** These constant define integer codes that represent the various +** These constants define integer codes that represent the various ** text encodings supported by SQLite. */ #define SQLITE_UTF8 1 /* IMP: R-37514-35566 */ @@ -5805,7 +5856,7 @@ SQLITE_API int sqlite3_create_window_function( ** result. ** Every function that invokes [sqlite3_result_subtype()] should have this ** property. If it does not, then the call to [sqlite3_result_subtype()] -** might become a no-op if the function is used as term in an +** might become a no-op if the function is used as a term in an ** [expression index]. On the other hand, SQL functions that never invoke ** [sqlite3_result_subtype()] should avoid setting this property, as the ** purpose of this property is to disable certain optimizations that are @@ -5932,7 +5983,7 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6 ** sqlite3_value_nochange(X) interface returns true if and only if ** the column corresponding to X is unchanged by the UPDATE operation ** that the xUpdate method call was invoked to implement and if -** and the prior [xColumn] method call that was invoked to extracted +** the prior [xColumn] method call that was invoked to extract ** the value for that column returned without setting a result (probably ** because it queried [sqlite3_vtab_nochange()] and found that the column ** was unchanging). ^Within an [xUpdate] method, any value for which @@ -6205,6 +6256,7 @@ SQLITE_API void sqlite3_set_auxdata(sqlite3_context*, int N, void*, void (*)(voi ** or a NULL pointer if there were no prior calls to ** sqlite3_set_clientdata() with the same values of D and N. ** Names are compared using strcmp() and are thus case sensitive. +** It returns 0 on success and SQLITE_NOMEM on allocation failure. ** ** If P and X are both non-NULL, then the destructor X is invoked with ** argument P on the first of the following occurrences: @@ -8881,9 +8933,18 @@ SQLITE_API int sqlite3_status64( ** ^The sqlite3_db_status() routine returns SQLITE_OK on success and a ** non-zero [error code] on failure. ** +** ^The sqlite3_db_status64(D,O,C,H,R) routine works exactly the same +** way as sqlite3_db_status(D,O,C,H,R) routine except that the C and H +** parameters are pointer to 64-bit integers (type: sqlite3_int64) instead +** of pointers to 32-bit integers, which allows larger status values +** to be returned. If a status value exceeds 2,147,483,647 then +** sqlite3_db_status() will truncate the value whereas sqlite3_db_status64() +** will return the full value. +** ** See also: [sqlite3_status()] and [sqlite3_stmt_status()]. */ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int resetFlg); +SQLITE_API int sqlite3_db_status64(sqlite3*,int,sqlite3_int64*,sqlite3_int64*,int); /* ** CAPI3REF: Status Parameters for database connections @@ -8980,6 +9041,10 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r ** If an IO or other error occurs while writing a page to disk, the effect ** on subsequent SQLITE_DBSTATUS_CACHE_WRITE requests is undefined.)^ ^The ** highwater mark associated with SQLITE_DBSTATUS_CACHE_WRITE is always 0. +**

    +** ^(There is overlap between the quantities measured by this parameter +** (SQLITE_DBSTATUS_CACHE_WRITE) and SQLITE_DBSTATUS_TEMPBUF_SPILL. +** Resetting one will reduce the other.)^ **

    ** ** [[SQLITE_DBSTATUS_CACHE_SPILL]] ^(
    SQLITE_DBSTATUS_CACHE_SPILL
    @@ -8995,6 +9060,18 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r **
    This parameter returns zero for the current value if and only if ** all foreign key constraints (deferred or immediate) have been ** resolved.)^ ^The highwater mark is always 0. +** +** [[SQLITE_DBSTATUS_TEMPBUF_SPILL] ^(
    SQLITE_DBSTATUS_TEMPBUF_SPILL
    +**
    ^(This parameter returns the number of bytes written to temporary +** files on disk that could have been kept in memory had sufficient memory +** been available. This value includes writes to intermediate tables that +** are part of complex queries, external sorts that spill to disk, and +** writes to TEMP tables.)^ +** ^The highwater mark is always 0. +**

    +** ^(There is overlap between the quantities measured by this parameter +** (SQLITE_DBSTATUS_TEMPBUF_SPILL) and SQLITE_DBSTATUS_CACHE_WRITE. +** Resetting one will reduce the other.)^ **

    ** */ @@ -9011,7 +9088,8 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r #define SQLITE_DBSTATUS_DEFERRED_FKS 10 #define SQLITE_DBSTATUS_CACHE_USED_SHARED 11 #define SQLITE_DBSTATUS_CACHE_SPILL 12 -#define SQLITE_DBSTATUS_MAX 12 /* Largest defined DBSTATUS */ +#define SQLITE_DBSTATUS_TEMPBUF_SPILL 13 +#define SQLITE_DBSTATUS_MAX 13 /* Largest defined DBSTATUS */ /* @@ -9776,7 +9854,7 @@ SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...); ** is the number of pages currently in the write-ahead log file, ** including those that were just committed. ** -** The callback function should normally return [SQLITE_OK]. ^If an error +** ^The callback function should normally return [SQLITE_OK]. ^If an error ** code is returned, that error will propagate back up through the ** SQLite code base to cause the statement that provoked the callback ** to report an error, though the commit will have still occurred. If the @@ -9784,13 +9862,26 @@ SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...); ** that does not correspond to any valid SQLite error code, the results ** are undefined. ** -** A single database handle may have at most a single write-ahead log callback -** registered at one time. ^Calling [sqlite3_wal_hook()] replaces any -** previously registered write-ahead log callback. ^The return value is -** a copy of the third parameter from the previous call, if any, or 0. -** ^Note that the [sqlite3_wal_autocheckpoint()] interface and the -** [wal_autocheckpoint pragma] both invoke [sqlite3_wal_hook()] and will -** overwrite any prior [sqlite3_wal_hook()] settings. +** ^A single database handle may have at most a single write-ahead log +** callback registered at one time. ^Calling [sqlite3_wal_hook()] +** replaces the default behavior or previously registered write-ahead +** log callback. +** +** ^The return value is a copy of the third parameter from the +** previous call, if any, or 0. +** +** ^The [sqlite3_wal_autocheckpoint()] interface and the +** [wal_autocheckpoint pragma] both invoke [sqlite3_wal_hook()] and +** will overwrite any prior [sqlite3_wal_hook()] settings. +** +** ^If a write-ahead log callback is set using this function then +** [sqlite3_wal_checkpoint_v2()] or [PRAGMA wal_checkpoint] +** should be invoked periodically to keep the write-ahead log file +** from growing without bound. +** +** ^Passing a NULL pointer for the callback disables automatic +** checkpointing entirely. To re-enable the default behavior, call +** sqlite3_wal_autocheckpoint(db,1000) or use [PRAGMA wal_checkpoint]. */ SQLITE_API void *sqlite3_wal_hook( sqlite3*, @@ -9807,7 +9898,7 @@ SQLITE_API void *sqlite3_wal_hook( ** to automatically [checkpoint] ** after committing a transaction if there are N or ** more frames in the [write-ahead log] file. ^Passing zero or -** a negative value as the nFrame parameter disables automatic +** a negative value as the N parameter disables automatic ** checkpoints entirely. ** ** ^The callback registered by this function replaces any existing callback @@ -9823,9 +9914,10 @@ SQLITE_API void *sqlite3_wal_hook( ** ** ^Every new [database connection] defaults to having the auto-checkpoint ** enabled with a threshold of 1000 or [SQLITE_DEFAULT_WAL_AUTOCHECKPOINT] -** pages. The use of this interface -** is only necessary if the default setting is found to be suboptimal -** for a particular application. +** pages. +** +** ^The use of this interface is only necessary if the default setting +** is found to be suboptimal for a particular application. */ SQLITE_API int sqlite3_wal_autocheckpoint(sqlite3 *db, int N); @@ -9890,6 +9982,11 @@ SQLITE_API int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb); ** ^This mode works the same way as SQLITE_CHECKPOINT_RESTART with the ** addition that it also truncates the log file to zero bytes just prior ** to a successful return. +** +**
    SQLITE_CHECKPOINT_NOOP
    +** ^This mode always checkpoints zero frames. The only reason to invoke +** a NOOP checkpoint is to access the values returned by +** sqlite3_wal_checkpoint_v2() via output parameters *pnLog and *pnCkpt. ** ** ** ^If pnLog is not NULL, then *pnLog is set to the total number of frames in @@ -9960,6 +10057,7 @@ SQLITE_API int sqlite3_wal_checkpoint_v2( ** See the [sqlite3_wal_checkpoint_v2()] documentation for details on the ** meaning of each of these checkpoint modes. */ +#define SQLITE_CHECKPOINT_NOOP -1 /* Do no work at all */ #define SQLITE_CHECKPOINT_PASSIVE 0 /* Do as much as possible w/o blocking */ #define SQLITE_CHECKPOINT_FULL 1 /* Wait for writers, then checkpoint */ #define SQLITE_CHECKPOINT_RESTART 2 /* Like FULL but wait for readers */ @@ -10787,7 +10885,7 @@ typedef struct sqlite3_snapshot { ** The [sqlite3_snapshot_get()] interface is only available when the ** [SQLITE_ENABLE_SNAPSHOT] compile-time option is used. */ -SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_get( +SQLITE_API int sqlite3_snapshot_get( sqlite3 *db, const char *zSchema, sqlite3_snapshot **ppSnapshot @@ -10836,7 +10934,7 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_get( ** The [sqlite3_snapshot_open()] interface is only available when the ** [SQLITE_ENABLE_SNAPSHOT] compile-time option is used. */ -SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_open( +SQLITE_API int sqlite3_snapshot_open( sqlite3 *db, const char *zSchema, sqlite3_snapshot *pSnapshot @@ -10853,7 +10951,7 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_open( ** The [sqlite3_snapshot_free()] interface is only available when the ** [SQLITE_ENABLE_SNAPSHOT] compile-time option is used. */ -SQLITE_API SQLITE_EXPERIMENTAL void sqlite3_snapshot_free(sqlite3_snapshot*); +SQLITE_API void sqlite3_snapshot_free(sqlite3_snapshot*); /* ** CAPI3REF: Compare the ages of two snapshot handles. @@ -10880,7 +10978,7 @@ SQLITE_API SQLITE_EXPERIMENTAL void sqlite3_snapshot_free(sqlite3_snapshot*); ** This interface is only available if SQLite is compiled with the ** [SQLITE_ENABLE_SNAPSHOT] option. */ -SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_cmp( +SQLITE_API int sqlite3_snapshot_cmp( sqlite3_snapshot *p1, sqlite3_snapshot *p2 ); @@ -10908,7 +11006,7 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_cmp( ** This interface is only available if SQLite is compiled with the ** [SQLITE_ENABLE_SNAPSHOT] option. */ -SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_recover(sqlite3 *db, const char *zDb); +SQLITE_API int sqlite3_snapshot_recover(sqlite3 *db, const char *zDb); /* ** CAPI3REF: Serialize a database @@ -10982,12 +11080,13 @@ SQLITE_API unsigned char *sqlite3_serialize( ** ** The sqlite3_deserialize(D,S,P,N,M,F) interface causes the ** [database connection] D to disconnect from database S and then -** reopen S as an in-memory database based on the serialization contained -** in P. The serialized database P is N bytes in size. M is the size of -** the buffer P, which might be larger than N. If M is larger than N, and -** the SQLITE_DESERIALIZE_READONLY bit is not set in F, then SQLite is -** permitted to add content to the in-memory database as long as the total -** size does not exceed M bytes. +** reopen S as an in-memory database based on the serialization +** contained in P. If S is a NULL pointer, the main database is +** used. The serialized database P is N bytes in size. M is the size +** of the buffer P, which might be larger than N. If M is larger than +** N, and the SQLITE_DESERIALIZE_READONLY bit is not set in F, then +** SQLite is permitted to add content to the in-memory database as +** long as the total size does not exceed M bytes. ** ** If the SQLITE_DESERIALIZE_FREEONCLOSE bit is set in F, then SQLite will ** invoke sqlite3_free() on the serialization buffer when the database @@ -11054,6 +11153,54 @@ SQLITE_API int sqlite3_deserialize( #define SQLITE_DESERIALIZE_RESIZEABLE 2 /* Resize using sqlite3_realloc64() */ #define SQLITE_DESERIALIZE_READONLY 4 /* Database is read-only */ +/* +** CAPI3REF: Bind array values to the CARRAY table-valued function +** +** The sqlite3_carray_bind(S,I,P,N,F,X) interface binds an array value to +** one of the first argument of the [carray() table-valued function]. The +** S parameter is a pointer to the [prepared statement] that uses the carray() +** functions. I is the parameter index to be bound. P is a pointer to the +** array to be bound, and N is the number of eements in the array. The +** F argument is one of constants [SQLITE_CARRAY_INT32], [SQLITE_CARRAY_INT64], +** [SQLITE_CARRAY_DOUBLE], [SQLITE_CARRAY_TEXT], or [SQLITE_CARRAY_BLOB] to +** indicate the datatype of the array being bound. The X argument is not a +** NULL pointer, then SQLite will invoke the function X on the P parameter +** after it has finished using P, even if the call to +** sqlite3_carray_bind() fails. The special-case finalizer +** SQLITE_TRANSIENT has no effect here. +*/ +SQLITE_API int sqlite3_carray_bind( + sqlite3_stmt *pStmt, /* Statement to be bound */ + int i, /* Parameter index */ + void *aData, /* Pointer to array data */ + int nData, /* Number of data elements */ + int mFlags, /* CARRAY flags */ + void (*xDel)(void*) /* Destructor for aData */ +); + +/* +** CAPI3REF: Datatypes for the CARRAY table-valued function +** +** The fifth argument to the [sqlite3_carray_bind()] interface musts be +** one of the following constants, to specify the datatype of the array +** that is being bound into the [carray table-valued function]. +*/ +#define SQLITE_CARRAY_INT32 0 /* Data is 32-bit signed integers */ +#define SQLITE_CARRAY_INT64 1 /* Data is 64-bit signed integers */ +#define SQLITE_CARRAY_DOUBLE 2 /* Data is doubles */ +#define SQLITE_CARRAY_TEXT 3 /* Data is char* */ +#define SQLITE_CARRAY_BLOB 4 /* Data is struct iovec */ + +/* +** Versions of the above #defines that omit the initial SQLITE_, for +** legacy compatibility. +*/ +#define CARRAY_INT32 0 /* Data is 32-bit signed integers */ +#define CARRAY_INT64 1 /* Data is 64-bit signed integers */ +#define CARRAY_DOUBLE 2 /* Data is doubles */ +#define CARRAY_TEXT 3 /* Data is char* */ +#define CARRAY_BLOB 4 /* Data is struct iovec */ + /* ** Undo the hack that converts floating point types to integer for ** builds on processors without floating point support. @@ -12313,14 +12460,32 @@ SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*); ** update the "main" database attached to handle db with the changes found in ** the changeset passed via the second and third arguments. ** +** All changes made by these functions are enclosed in a savepoint transaction. +** If any other error (aside from a constraint failure when attempting to +** write to the target database) occurs, then the savepoint transaction is +** rolled back, restoring the target database to its original state, and an +** SQLite error code returned. Additionally, starting with version 3.51.0, +** an error code and error message that may be accessed using the +** [sqlite3_errcode()] and [sqlite3_errmsg()] APIs are left in the database +** handle. +** ** The fourth argument (xFilter) passed to these functions is the "filter -** callback". If it is not NULL, then for each table affected by at least one -** change in the changeset, the filter callback is invoked with -** the table name as the second argument, and a copy of the context pointer -** passed as the sixth argument as the first. If the "filter callback" -** returns zero, then no attempt is made to apply any changes to the table. -** Otherwise, if the return value is non-zero or the xFilter argument to -** is NULL, all changes related to the table are attempted. +** callback". This may be passed NULL, in which case all changes in the +** changeset are applied to the database. For sqlite3changeset_apply() and +** sqlite3_changeset_apply_v2(), if it is not NULL, then it is invoked once +** for each table affected by at least one change in the changeset. In this +** case the table name is passed as the second argument, and a copy of +** the context pointer passed as the sixth argument to apply() or apply_v2() +** as the first. If the "filter callback" returns zero, then no attempt is +** made to apply any changes to the table. Otherwise, if the return value is +** non-zero, all changes related to the table are attempted. +** +** For sqlite3_changeset_apply_v3(), the xFilter callback is invoked once +** per change. The second argument in this case is an sqlite3_changeset_iter +** that may be queried using the usual APIs for the details of the current +** change. If the "filter callback" returns zero in this case, then no attempt +** is made to apply the current change. If it returns non-zero, the change +** is applied. ** ** For each table that is not excluded by the filter callback, this function ** tests that the target database contains a compatible table. A table is @@ -12341,11 +12506,11 @@ SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*); ** one such warning is issued for each table in the changeset. ** ** For each change for which there is a compatible table, an attempt is made -** to modify the table contents according to the UPDATE, INSERT or DELETE -** change. If a change cannot be applied cleanly, the conflict handler -** function passed as the fifth argument to sqlite3changeset_apply() may be -** invoked. A description of exactly when the conflict handler is invoked for -** each type of change is below. +** to modify the table contents according to each UPDATE, INSERT or DELETE +** change that is not excluded by a filter callback. If a change cannot be +** applied cleanly, the conflict handler function passed as the fifth argument +** to sqlite3changeset_apply() may be invoked. A description of exactly when +** the conflict handler is invoked for each type of change is below. ** ** Unlike the xFilter argument, xConflict may not be passed NULL. The results ** of passing anything other than a valid function pointer as the xConflict @@ -12441,12 +12606,6 @@ SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*); ** This can be used to further customize the application's conflict ** resolution strategy. ** -** All changes made by these functions are enclosed in a savepoint transaction. -** If any other error (aside from a constraint failure when attempting to -** write to the target database) occurs, then the savepoint transaction is -** rolled back, restoring the target database to its original state, and an -** SQLite error code returned. -** ** If the output parameters (ppRebase) and (pnRebase) are non-NULL and ** the input is a changeset (not a patchset), then sqlite3changeset_apply_v2() ** may set (*ppRebase) to point to a "rebase" that may be used with the @@ -12496,6 +12655,23 @@ SQLITE_API int sqlite3changeset_apply_v2( void **ppRebase, int *pnRebase, /* OUT: Rebase data */ int flags /* SESSION_CHANGESETAPPLY_* flags */ ); +SQLITE_API int sqlite3changeset_apply_v3( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int nChangeset, /* Size of changeset in bytes */ + void *pChangeset, /* Changeset blob */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + sqlite3_changeset_iter *p /* Handle describing change */ + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx, /* First argument passed to xConflict */ + void **ppRebase, int *pnRebase, /* OUT: Rebase data */ + int flags /* SESSION_CHANGESETAPPLY_* flags */ +); /* ** CAPI3REF: Flags for sqlite3changeset_apply_v2 @@ -12915,6 +13091,23 @@ SQLITE_API int sqlite3changeset_apply_v2_strm( void **ppRebase, int *pnRebase, int flags ); +SQLITE_API int sqlite3changeset_apply_v3_strm( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int (*xInput)(void *pIn, void *pData, int *pnData), /* Input function */ + void *pIn, /* First arg for xInput */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + sqlite3_changeset_iter *p + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx, /* First argument passed to xConflict */ + void **ppRebase, int *pnRebase, + int flags +); SQLITE_API int sqlite3changeset_concat_strm( int (*xInputA)(void *pIn, void *pData, int *pnData), void *pInA, diff --git a/deps/sqlite/sqlite3ext.h b/deps/sqlite/sqlite3ext.h index cf775dfbde0fdf..5258faaed313c7 100644 --- a/deps/sqlite/sqlite3ext.h +++ b/deps/sqlite/sqlite3ext.h @@ -368,6 +368,10 @@ struct sqlite3_api_routines { int (*set_clientdata)(sqlite3*, const char*, void*, void(*)(void*)); /* Version 3.50.0 and later */ int (*setlk_timeout)(sqlite3*,int,int); + /* Version 3.51.0 and later */ + int (*set_errmsg)(sqlite3*,int,const char*); + int (*db_status64)(sqlite3*,int,sqlite3_int64*,sqlite3_int64*,int); + }; /* @@ -703,6 +707,9 @@ typedef int (*sqlite3_loadext_entry)( #define sqlite3_set_clientdata sqlite3_api->set_clientdata /* Version 3.50.0 and later */ #define sqlite3_setlk_timeout sqlite3_api->setlk_timeout +/* Version 3.51.0 and later */ +#define sqlite3_set_errmsg sqlite3_api->set_errmsg +#define sqlite3_db_status64 sqlite3_api->db_status64 #endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ #if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) From 4947af957f4f2dfa04a6150f079c280864180495 Mon Sep 17 00:00:00 2001 From: Chengzhong Wu Date: Thu, 13 Nov 2025 00:13:55 +0000 Subject: [PATCH 33/56] deps: add temporal_rs 0.1.0 PR-URL: https://github.com/nodejs/node/pull/60703 Refs: https://github.com/nodejs/node/issues/58730 Refs: https://github.com/nodejs/node/pull/60693 Reviewed-By: Marco Ippolito Reviewed-By: Joyee Cheung Reviewed-By: James M Snell Reviewed-By: Yagiz Nizipli Reviewed-By: Antoine du Hamel --- deps/temporal/.cargo/config.toml | 3 + deps/temporal/.gitignore | 23 + deps/temporal/CHANGELOG.md | 484 ++++ deps/temporal/CONTRIBUTING.md | 51 + deps/temporal/Cargo.lock | 1321 ++++++++++ deps/temporal/Cargo.toml | 113 + deps/temporal/LICENSE-Apache | 201 ++ deps/temporal/LICENSE-MIT | 21 + deps/temporal/README.md | 295 +++ deps/temporal/cliff.toml | 88 + deps/temporal/docs/FAQ.md | 50 + deps/temporal/docs/README.md | 3 + deps/temporal/docs/TZDB.md | 41 + deps/temporal/docs/architecture.md | 108 + .../docs/design/initial-api-concept.md | 68 + deps/temporal/docs/release.md | 40 + deps/temporal/docs/testing.md | 77 + deps/temporal/provider/Cargo.toml | 75 + deps/temporal/provider/LICENSE-Apache | 201 ++ deps/temporal/provider/LICENSE-MIT | 21 + deps/temporal/provider/README.md | 63 + .../data/compiled_zoneinfo_provider.rs.data | 16 + .../src/data/debug/iana_normalizer.json | 2235 +++++++++++++++++ .../provider/src/data/debug/zoneinfo/map.json | 600 +++++ ...zif-1041cd53332eeba8-60aa3eb45cf6bad9.json | 192 ++ ...tzif-1146d998a660d8a7-7083368cf5416b3.json | 157 ++ ...zif-11b63f0f95d852ce-9769280653fbbbb1.json | 19 + ...tzif-12ced9fe919d8b6-35fe81809b640977.json | 211 ++ ...zif-1375eb028a5068b1-c7cfa311f9a3eac8.json | 172 ++ ...zif-14cdf6863a8e2179-b18612ad8b0eacc7.json | 33 + ...zif-14ec5a4ae9e7e087-d5eb6128c4e9c616.json | 19 + ...zif-154d4d1d56f527ae-b4426313fdb85583.json | 30 + ...zif-170cb25ac2daddf1-c28442df6aeaf807.json | 19 + ...zif-1735ba0bbd2e57f5-8adc7347030fce3f.json | 188 ++ ...zif-186e2b651b9e98be-423bebc6a1739dc2.json | 19 + ...zif-1939cc3520b8dae8-a2fd6733973f8da2.json | 297 +++ ...tzif-19d0e567d48830e5-20b2a6d45202416.json | 90 + ...zif-1a285e17b7751f38-aefc034b499da29b.json | 147 ++ ...zif-1dd142eb22754e92-d3cee37600e3912e.json | 223 ++ ...tzif-1ede513c242ae08-561006205b46a9e7.json | 35 + ...zif-1eff85dd787ed3a1-d74f97871f7e97e8.json | 264 ++ ...tzif-206d649fad594120-70deb0fb976b18e.json | 109 + ...zif-21007d26526b6cee-4c7defff421754b5.json | 303 +++ ...zif-239c7722f428fac8-7a4c4b125895f0bd.json | 245 ++ ...zif-2450804cbdb4245e-fc28955e4978e50d.json | 261 ++ ...zif-24b250ef0928a9e9-6530a4ca5485dc31.json | 33 + ...zif-24bc4f701e560e8f-fbbcb1e6855b01a1.json | 167 ++ ...zif-25763d8b26764a7a-5933d51fd56b3fdf.json | 101 + ...zif-26ac36da2732c840-dedd53591694d48d.json | 163 ++ ...tzif-26aecc98f9d83045-d767019b239f072.json | 187 ++ ...zif-26bf0cacd24f77a1-a98e0c85e152f06e.json | 109 + ...zif-273d77751416ce66-188ad35538918cca.json | 149 ++ ...zif-283cf30fce0ee58e-ee056ab931c35019.json | 70 + ...zif-291cff29f8a99dfe-401473cfba65f82d.json | 187 ++ ...zif-2a2176981e284105-59c6fda81a2a226c.json | 59 + ...zif-2a554d4e97833d6e-1eb5fb8bf2c9f728.json | 19 + ...zif-2a7fc944a4c2991b-ed19eb01bbf45250.json | 31 + ...zif-2a9b3a635fc27340-e824f8940a7a64f6.json | 41 + ...zif-2ae3e9466dbec3ec-2dfc2c7ddd060e6d.json | 199 ++ ...zif-2b407bee2bf8cbea-39e72d1f00f10d06.json | 400 +++ ...zif-2bd99bb6843e89cf-932580fc9a3a0c8d.json | 19 + ...tzif-2be99c3dd72ebbf9-e08d147873aff81.json | 36 + ...zif-2c1bb7953877feff-4c66e005cbf579fe.json | 212 ++ ...zif-2d819a70236c9f86-721e9b57fc17e8df.json | 19 + ...zif-3234542952508833-776aeadf2e17fcb4.json | 87 + ...zif-33db81d7f03c072e-e083980d979c0926.json | 225 ++ ...zif-34047004b336df3e-bbe8e4196294f00a.json | 308 +++ ...zif-355a4a5906a54477-e95040f92d9fdd8d.json | 38 + ...zif-3567a65ce3b07b4a-eda38ce2d13af268.json | 105 + ...zif-36890fddb7a9031e-81d4ff9e4c89f2e8.json | 193 ++ ...zif-37762e44a2edd792-4f1b10d181e56a5d.json | 151 ++ ...zif-380c01b13aae6590-113f60eeecce7355.json | 169 ++ ...zif-38d88ef47726082c-a2b861350ff9abaf.json | 38 + ...tzif-3994d21beae7c7b6-eb145d056159d80.json | 408 +++ ...zif-3a07d4451f21c9ef-6b2242eea52b976b.json | 265 ++ ...zif-3a5a827f28d118e9-682e0a2d838b16ae.json | 481 ++++ ...zif-3a6fecb09c143b25-73487cfbfb37a1d6.json | 236 ++ ...zif-3c8506b1fc96536c-4c88dd0e00eba4f2.json | 19 + ...zif-3cc59865618b9844-e109dc95307db988.json | 19 + ...zif-3cc8439b3e85f059-8e4f59b418f8888a.json | 227 ++ ...zif-3d390ef79718594a-1d54abd9de1f791b.json | 71 + ...zif-3d5473248adfd22d-72a86f7189e4c492.json | 77 + ...zif-3f61f7ebb7b0f5d7-3b9e017c8df909f8.json | 558 ++++ ...tzif-3f6ff680ea89333b-f07f1041c6be937.json | 191 ++ ...zif-3fc16258c94fd1bd-f5865999bedfb5cb.json | 306 +++ ...zif-3fd85b535272f921-d61e3c0d217e3de2.json | 191 ++ ...zif-401f78ac94f3eb66-89897df479278829.json | 223 ++ ...zif-405b02408f1a7725-3c0ae0a258a25979.json | 66 + ...zif-40fb52b19ef81b1d-e1ce3cc4e0a17886.json | 82 + ...zif-42518274487a5d74-63fffb5b4ef7fbd9.json | 28 + ...zif-425a92f6316d948f-f81669d6e3b37009.json | 33 + ...zif-43c01a519dcad360-c978a2de09220f3e.json | 315 +++ ...zif-44b31bf3438167a2-f26149998b62ea48.json | 56 + ...zif-4529e4629acf0366-8106ebfc9606aee2.json | 40 + ...zif-46dd3b15bf889536-90c51dda0af69c0c.json | 261 ++ ...zif-4738bf3d72913a1b-ef164d685fcac290.json | 155 ++ ...zif-480b0a55dd7bf29e-c23b37ed84c4f8f9.json | 233 ++ ...zif-486e9282debc62a3-27805d7d5dee9be4.json | 50 + ...zif-4891d41993ed3f5f-4d0c2933ef920fb1.json | 317 +++ ...zif-4a65bbe3253254a1-2a20d46c4d15c0c3.json | 184 ++ ...zif-4ab862d6d4b98ff4-7628975aa4bf631a.json | 161 ++ ...zif-4c9c946292d76a04-7fbd1484596ee05e.json | 175 ++ ...tzif-4ccce3697974db1-dd90a8482c7e02e0.json | 127 + ...zif-4db2cfd1785db9cd-6589edd5db80b603.json | 192 ++ ...zif-4e52d8a7b9ecde7e-b7f50a3a0d1ac3b5.json | 19 + ...zif-4eaf76405b17e0d3-64c6a9f0471d4ce9.json | 204 ++ .../tzif-4f0ad1968e2955-b99def3a9c716c7f.json | 181 ++ ...zif-4fd8d72ac04d9a5d-3133c7dea65f2538.json | 156 ++ ...zif-5060a985014097b1-2e0f3c6f560795ff.json | 60 + ...zif-50abe32c287395c8-d2c3aa5882246ab2.json | 37 + ...zif-50fc3fea132b4f4c-5a5d88ba8de3b7c1.json | 254 ++ ...zif-513821d5372dc2c3-56efcc8826fb3481.json | 290 +++ ...zif-52291e736a34e36b-2ab58b9a9f408e39.json | 273 ++ ...zif-5473a3220fbbe20b-150c46c09db6581d.json | 232 ++ ...zif-55bb5ee9b0a529a6-dce97bdbcf437150.json | 214 ++ ...tzif-55ec396d83237537-39a492626467027.json | 94 + ...tzif-55eedcdc6ff1f85-5b27bba1cde1354f.json | 39 + ...zif-57ad9603575ed991-356d85cfd1d045d6.json | 31 + .../tzif-5890af4975eb815-dbcd9d0a6fe5353.json | 184 ++ ...zif-59d5e08cb19672f5-73d8fe68d8bc0b47.json | 42 + ...zif-5a1de33f302092c9-7fede906b0fbc944.json | 222 ++ ...tzif-5a8de8f20b18b43-384f712f565d0ab0.json | 178 ++ ...zif-5cb26c449b2278f2-a3a1b3aa09d53c07.json | 135 + ...zif-5d69c15d2c4f26ae-d843083a2b2d2784.json | 153 ++ ...zif-5e245c7be541fe52-ac13030bf2bc388c.json | 235 ++ ...zif-5eec9cd299aa076f-857603deebbce60b.json | 26 + ...zif-5fd210f528e95871-c650f43dd3590090.json | 191 ++ ...zif-609a1c759abb0f9e-a202ec7708c700d8.json | 85 + ...zif-6156cfed77f2a26c-d5c8e957d52b5aa1.json | 193 ++ ...tzif-6196bbf525d4d50a-c1285ce65c03319.json | 47 + ...zif-622cbc57a076ea5d-616edf8039af4f62.json | 190 ++ ...zif-6268b48b2e959066-91294d0f7013ba84.json | 37 + ...zif-638a1ae9aef4e05b-74d152a85f1741cd.json | 228 ++ ...zif-6415eb3f74777957-6f718f12281286a3.json | 317 +++ ...zif-6493d17f054bfdfb-35ed6c8176f0fbed.json | 28 + ...zif-650685fe5c95ce2a-2f3eb2e60291229d.json | 172 ++ ...zif-65401a13577707c6-bb9f9264b43c1451.json | 19 + ...zif-65badfa9c283e8d3-9bc658cd314193fd.json | 126 + ...zif-66a5515c6139ad2d-8cdcb912670ca415.json | 33 + ...zif-66fc406d3b90ff90-42d7c96cbf80d3ca.json | 101 + ...zif-6797b3dc466b8334-28780ef70fbe052e.json | 26 + ...zif-67d3e39540d85c91-f13f9d0367c68c92.json | 121 + ...zif-68b74f8e8d191761-a8eaae70013bbfdf.json | 34 + ...zif-69530af9af6cd0cb-6e2e37393c7f8e5d.json | 61 + ...zif-6a52098e032992a5-e1eb00358541c6a0.json | 249 ++ ...zif-6ad7cbb6af2e6144-d93cfc8ee54a6b99.json | 192 ++ ...zif-6bfb62f5e4b63e4a-5a7d3b172eb114d5.json | 412 +++ ...tzif-6d168cde30b3c19-24342dd0af895908.json | 32 + ...zif-6d3285599a38ae5a-e146c246881dc5ed.json | 180 ++ ...zif-6fbdbfed85292c81-468d78f0fb8a53ac.json | 35 + ...zif-6fbdea510dc8bdff-a0d6c86f83720461.json | 140 ++ ...tzif-70408e1d981309b7-da99eb025c30159.json | 285 +++ ...zif-70c6eef1cba9528e-fa6fd92ebfdcf3ad.json | 512 ++++ ...zif-715448d734f9507a-f4183ed224275281.json | 170 ++ ...zif-7238398358c87edf-bc2588b2ce94bc20.json | 41 + ...tzif-7241c1457aae4357-3c4783fc5e291a5.json | 74 + ...zif-7285bd926fe2dc70-a6ffff1cf5147cbf.json | 31 + ...zif-72be3d5f2c49eb87-7e9fa5340a3dee71.json | 26 + ...zif-7459e3ffacdde5a6-a596288a1fff51a3.json | 29 + ...tzif-7481a99701104a1c-da931bd1c7d61a9.json | 105 + ...zif-748e0c2c22be393e-9159f30a64f07d32.json | 205 ++ ...zif-74fc38128e80b92d-871756115f3d1b05.json | 230 ++ ...zif-754b9e4bdb20aa95-1c5b7a1b811c5ae3.json | 147 ++ ...zif-758d7fde6833ba8c-65256d0857a2f636.json | 264 ++ ...zif-7599edfd11a3db64-4bf8d694826715ae.json | 339 +++ ...zif-75a476630c4f3c06-6cc92a5fc490dfa3.json | 129 + ...zif-7622c5c99b380b37-74a373c9f92241c7.json | 224 ++ ...zif-762fa57e245bdc0d-c5a018de141b4cb3.json | 32 + ...zif-768158f1c3d3089e-e43bac17424df347.json | 258 ++ ...zif-7776a42ce751a29e-1629f5ee8a6e924e.json | 98 + ...zif-794b5729aca99b8f-8dcbb73848fb52db.json | 49 + ...zif-79a67056f030a883-f33ddefe3e35e4d0.json | 27 + ...zif-7a158f0aed162547-27577cc8813fb4ed.json | 82 + ...zif-7aa0aebc84b44c67-973b0b87d9034391.json | 38 + ...zif-7ba4aaa7dba09bb0-567af4b250c89d25.json | 210 ++ ...zif-7bce416a66d38e42-b58b08c4c731f7dc.json | 34 + ...zif-7be16635ecf890b5-161efc0ab3ac2299.json | 193 ++ ...zif-7cca7c8a1af35285-679fdca550b074a0.json | 35 + ...zif-7d33da447360d55c-52583d8c13b6f677.json | 250 ++ ...zif-7d7635957a94c158-89410cc4ecfceda2.json | 332 +++ ...zif-7ec2120f35e8ce46-9f313b48e73a78c4.json | 55 + ...zif-806417e5a9e6e27a-d183a9f9e82d72df.json | 284 +++ ...zif-81a0c2bb7c8a41da-7b4ebb9a4aa49253.json | 109 + ...tzif-83ab6f3e7a54b242-140e172ea09b920.json | 164 ++ ...zif-843bd4f4a13e936f-e20d11612a15d3e6.json | 191 ++ ...zif-84569b5d12891e1e-dfbd7173ea59c56d.json | 31 + ...zif-8494d6017f05e49d-6fa1752d1f7aa8c3.json | 161 ++ ...zif-849b49f0ce1dac82-89b53710eb7d9371.json | 196 ++ ...zif-86245dd795582456-61d8c9f7c4ad177a.json | 191 ++ ...zif-87649f3d059a10f2-a8c51b0e84c40a85.json | 265 ++ ...tzif-87ef4dab5f3e3941-c43fb003c147a77.json | 212 ++ ...zif-89cd9f4224d1324a-6ddbd3de8874993f.json | 36 + ...zif-8a0ec5e44a49e44e-1f9e21f2398d2965.json | 200 ++ ...zif-8b129baceef3898a-389e46393fa915f2.json | 90 + ...zif-8b312fc28eb6d503-b57cea257edd1731.json | 50 + ...tzif-8b944106b8f9db7e-1d2f4ecd91296f4.json | 199 ++ ...zif-8bf0f826f4c6e05e-9c27d3058e34d93b.json | 51 + ...zif-8c010856ba3febe1-a27521eb7d78dbf6.json | 19 + ...zif-8e1e620dda961a84-8cb519c7f5594e81.json | 196 ++ ...zif-8e605032c3ce6342-6a27beeec5d94fef.json | 91 + ...zif-8fec2819cc677405-6cfb65330c2f1fa0.json | 264 ++ ...zif-905f75931d73bd53-38c9d0ddc82eec2a.json | 39 + ...zif-90e0499f7b80422b-16e03eeaaf192844.json | 95 + ...zif-916c7f697e6af49e-cd5f0c23c53bde30.json | 433 ++++ ...zif-93ba37d78a84866e-364c3b71717bb302.json | 85 + ...zif-94731e7a96e16727-b9bdd49f2158b98c.json | 69 + ...zif-95eb641ddc74061f-5a914528a766049d.json | 103 + ...zif-96a7050f6c4d3e34-7cc5980522f3fef5.json | 379 +++ ...zif-98fb8731f72daeb6-4585fdc50640db42.json | 72 + ...zif-98fc8236fccd3576-88ddb973d46096e3.json | 192 ++ ...zif-996739b4c558f747-935dbc63456811c2.json | 57 + ...zif-99cdd052561a0879-89252b18a95154e3.json | 169 ++ ...zif-99ce61a08c1199af-56326eb4ceecfd35.json | 124 + ...zif-9a2f8cce797280e8-37784cc07103f2f3.json | 195 ++ ...zif-9af11812af42f7cb-8d70b106abb9243f.json | 233 ++ ...zif-9afb6f21d74a3dbd-d76c18d684813924.json | 19 + ...zif-9b4491a5a7233cc3-9416dbeeb6810774.json | 235 ++ ...tzif-9bd926151a997a3e-9909ffff90c3207.json | 289 +++ ...zif-9c7ac303ad5d20d8-9111a17e7b78de54.json | 194 ++ ...tzif-9c98c8b92084c36-47e6455e977d6bb3.json | 248 ++ ...zif-9d02412abb136ce4-bfde68530f93fb26.json | 26 + ...zif-a053c1334aeab356-645c110894da15be.json | 154 ++ ...zif-a0806703e39bd41f-938b549d3f658065.json | 19 + ...zif-a1347b19ee040601-84e246431e54b763.json | 57 + ...zif-a187ee64c8fae572-4985eb67780f1dca.json | 45 + ...zif-a1b14d47c3da0459-9beeb6b09fc4bd85.json | 133 + ...tzif-a2c4636cb2de823b-69641876de40969.json | 170 ++ ...zif-a3214de8e358efe8-33b7f8f888f95c0b.json | 52 + ...zif-a3bbf95d113466c0-366de44a51a62cbe.json | 168 ++ ...zif-a442eead4fdb53a5-264d7185508cac7f.json | 149 ++ ...zif-a44c115ed3d72421-692eaf79ab1934a7.json | 340 +++ ...zif-a685965c91f5b79b-e66cc1c813ce5bd6.json | 183 ++ ...zif-a7b726e2144b8ec3-b273ddcc47da034b.json | 129 + ...zif-aa6fbecd6b3089a1-3c3e5535078a0aca.json | 351 +++ ...tzif-aba73c12b2e7f46-a62a02047cf0f8be.json | 47 + ...zif-aeaa8db63bed649c-8a6f5505498821c5.json | 19 + ...tzif-b05b7d10c5ffdad-d39eb7f9fe146506.json | 33 + ...tzif-b06ac7e52f27518c-ad815076903a307.json | 162 ++ ...zif-b0c86e4e28bb1810-bccad26ea4f4cee2.json | 191 ++ ...zif-b397eb337d51aec5-9d2674bc81a95add.json | 19 + ...zif-b3a7b6acccb12af9-93f5a4bd9827e971.json | 31 + ...zif-b3d9e43d648fe2bf-fa688f4eb568be69.json | 29 + ...zif-b445d8dfee87de1d-3d26ba9d3df071ac.json | 19 + ...zif-b6ba868b587cad06-6667a264db5d890e.json | 208 ++ ...zif-b785c09bc525b515-5fd6146854daeb91.json | 97 + ...zif-b89f6da72122ca01-812d173fdcfeaaa6.json | 88 + ...zif-b8b54ce37e65e37e-e9672f15a3e270a7.json | 76 + ...zif-b9b18c55e2cd4d53-b3d917ee40af164d.json | 226 ++ ...zif-b9d3679a03af6191-99d89d33c8fd0b60.json | 184 ++ ...zif-bad7f01dd3f01a92-8ed1d7da904b667d.json | 308 +++ ...zif-bafb78fdc913701c-de429c1ed9e982a1.json | 168 ++ ...zif-bbf3217ce334c3f2-5622ec9ecf81c925.json | 19 + ...zif-bbfc9e9111217c11-69684e27be4c3e38.json | 144 ++ ...tzif-bcd5d242787ff58-595e172a944e8f55.json | 71 + ...zif-bd05cebe8eecfa2c-408891f6d5e0c72a.json | 160 ++ ...zif-bd9ad03026ed086f-3d5a919e98fa2787.json | 48 + ...zif-bda89ec29d33a428-f6c6f1d38129c153.json | 201 ++ ...zif-bdc0a1977c311c8d-87860ab499ecadb8.json | 32 + ...zif-bdd491f43b0c1c85-6f9616d7048f0cf9.json | 47 + ...zif-be07532f1af7dccb-7a89363e76463570.json | 116 + ...zif-be7c1ce9358259b9-87fdd35d13d52495.json | 109 + ...zif-be9bc4833f21d33b-2a54484e254d46c8.json | 195 ++ ...zif-c0a7b3c45458ac17-adf27c3e51a11cf6.json | 166 ++ ...zif-c0d9ca8c12b3167c-34f182f235d9fe88.json | 43 + ...zif-c0f3e562f1a83b48-46259b3efc2044b4.json | 43 + ...zif-c17291eb667fe274-81f01d3c395654a6.json | 106 + ...zif-c306ac2cd34a373c-ec50d5ecafac2084.json | 360 +++ ...zif-c3aa55f145295944-50f38632c531aab8.json | 31 + ...zif-c4897a4741bd9e82-aaea1d16ea0a4fb8.json | 256 ++ ...zif-c595527c9472a8dc-da82dc08bd3d58a0.json | 60 + ...zif-c6ecc61594d93097-34f668d36b185b09.json | 19 + ...zif-c711f11538fdc96f-2563abbbef728ca5.json | 194 ++ ...zif-c79f46dbe8103377-6f330e5ab7f7dc8e.json | 49 + ...zif-c7a9617c25e2eb1a-67a9e52b4fa102af.json | 171 ++ ...zif-c7d151e4111f596b-82465a65ac1b9a8e.json | 19 + ...zif-c83537c4365f1258-7426b2a60504f417.json | 19 + ...zif-c841f0aca0404a73-5f8447c455db7736.json | 85 + ...tzif-ca31f6cb7d44b091-6a023a6a71d41a7.json | 391 +++ ...zif-cab5fb5bf9e7625f-4aaae2f823b6e6c9.json | 228 ++ ...tzif-cad03994b9f9755d-786401d28559cef.json | 54 + ...zif-cb2104a4192b82ba-ddba0d84d8ea7d92.json | 31 + ...zif-cb56ff55ea32bb92-c654a08c059dae2e.json | 49 + ...zif-cbcf966225780b1c-8a7f4b3e40c1b2d5.json | 562 +++++ ...zif-cbf2a88472b0862a-de6f37d8951e33ce.json | 128 + ...zif-cd29e561a284f373-1b38f7643a89adc3.json | 19 + ...zif-ce5eb7cf8993261f-bdd600c9c7fb16d5.json | 198 ++ ...tzif-ce802c28d3beb1b-5157362aadd9dd29.json | 388 +++ ...zif-cec2538008230fcd-486e4621268a0834.json | 214 ++ ...zif-d1e4208290566f2f-8b7418c65c288188.json | 19 + ...zif-d28e0bb7485a8522-9d5ad01d4999d0c7.json | 274 ++ ...zif-d3201ec4e70c92f3-5814e30a4cc908b9.json | 203 ++ ...zif-d41aa71f743154ff-cd47b010d657ac37.json | 223 ++ ...zif-d4999f54d6ffa1ff-bdc2dfc5a5de1f94.json | 260 ++ ...zif-d7daa3dddb990290-2188fa690fb895b7.json | 243 ++ ...zif-daeed2898ecd770c-894d1d81ca85ba4d.json | 324 +++ ...zif-dbf1c543882cf4b7-2ee5fc1eb7933ea5.json | 222 ++ ...zif-dc6b1be48367c4f1-5f1fbe94f0718a6a.json | 256 ++ ...tzif-dc8c7c76ac036db-6dcebe24fb293843.json | 37 + ...zif-dc8ea6d022a7ebec-7bdcff969a6b651c.json | 202 ++ ...zif-dd90c0bd2a5d5bcb-4e3fcc5e29cf94e2.json | 38 + ...zif-df3a174a6f1304b9-f30768cdd2518dd1.json | 114 + ...tzif-dfcaab41c352fc41-836527ef6425759.json | 26 + ...zif-e12ae166d8468131-ee348999c2fd8345.json | 93 + ...zif-e20ebf54a807fe0e-10ef646904348bbe.json | 35 + ...zif-e271b0f2662b1c04-20e8607792da4ec7.json | 52 + ...zif-e2789756bce07cca-d7ab71c2384db975.json | 175 ++ ...zif-e2bf7ec87041f1fb-b61a215ea3b5adb3.json | 19 + ...zif-e330917831501a06-5b1f8ec8b0ab9c4a.json | 57 + ...zif-e3d5b2baffd22f2d-4e475abbb4b8264f.json | 35 + ...zif-e4c142bca3031674-44b8ea4e236ae5f5.json | 70 + ...zif-e5822ac52a06a527-c5e561a56943464c.json | 41 + .../tzif-e65fa49c7674041-51ba19ae72a3c69.json | 61 + ...zif-e713de09d9781804-3bc1517947065469.json | 31 + ...zif-e7907c2354d7f128-1222f4f18f058093.json | 26 + ...zif-e953d2a73bc41375-ef97956cf6178835.json | 366 +++ ...zif-ea8173f82f8dccac-190f07fa0585582b.json | 205 ++ ...zif-eafa00d1ad3ada02-ccfdff510d06498a.json | 187 ++ ...zif-eb4384db15894d16-b0aaeb08a0cbe1e0.json | 67 + ...zif-eb9179abb91c8435-726489ced5139013.json | 372 +++ ...zif-ec4f112febcbc032-a69762c688a2158f.json | 227 ++ ...zif-ed29bf9f15004c8a-f6def5db1514383c.json | 405 +++ ...zif-edc11c9a67454353-7a49fa82cac12758.json | 169 ++ ...zif-edc8df3b48d8f1ae-2f0fe2e55f7ceabf.json | 37 + ...zif-ee42b17151e8d0d1-557c16a705ea23d1.json | 132 + ...zif-ef074bbbac9f5764-af06bb8dad04fbb2.json | 121 + ...zif-ef99169dd5b3d431-ae45f4711dd0d14b.json | 225 ++ ...zif-effb0bd5efab2bad-76ee3ca040667987.json | 308 +++ ...zif-f022b64b061d7846-529fb8a37afd1bc3.json | 31 + ...zif-f0d38f589f1464b7-e65390d2a42c7521.json | 313 +++ ...tzif-f104b0a7be76b68-672d15810abf76ed.json | 49 + ...zif-f1b7ca6dc4d0b2b0-d827a5cc52d17740.json | 171 ++ ...zif-f1f0b3541047bfad-8176e7d9a57a1316.json | 234 ++ ...zif-f2238fc53b0fff96-6f6aee2b55131405.json | 41 + ...zif-f229cb4cd552c448-1e8f29f5b7bc6659.json | 156 ++ ...zif-f26b875165969e75-9e25992ccdfbaa1f.json | 89 + ...zif-f5114ea1ad21a447-657f9c7873c390b2.json | 250 ++ ...zif-f58f911ab743ef1d-f57255d26abdda48.json | 29 + ...zif-f5b99738d99ddd8c-edf53ab20b57f392.json | 171 ++ ...zif-f61469e5df5071ba-1d93153e2c1ef413.json | 138 + ...tzif-f665c39691dff65-eb8beb46e71e4a05.json | 199 ++ ...zif-f6698c0e9f2fa661-cfcf92aaf6d6e5be.json | 19 + ...zif-f677bd8d940386cc-6f4acf146c31eb70.json | 199 ++ ...zif-f757031187208623-b42f12ebe4b7bfcb.json | 35 + ...zif-f7b886dc80987d1f-1cfc3c180fd77cd3.json | 150 ++ ...zif-f80d3a6707532038-3bae731e777368b6.json | 19 + ...zif-f842f34f4c14fee1-6af6c77813d81c95.json | 33 + ...zif-f87d2aa5dfe5efe9-6f6f56db37ced2fd.json | 244 ++ ...zif-f8baa073f0e62ab0-5c9c06226b1920d5.json | 220 ++ ...zif-f9736e8dcd3eb5de-9c17b925c6652d48.json | 238 ++ ...zif-f9878deac6fa797b-63a1fb86a70f62e5.json | 181 ++ ...tzif-fb562061c0f6e08b-c76bafb046d43b7.json | 63 + ...zif-fb66f3417dbb2dfe-e13d26a5a5a0ef65.json | 51 + ...zif-fbccf04b5b2fd7f2-b508b8cbe01e354b.json | 71 + ...zif-fc89b67bba9eff21-ed937c5b2210118e.json | 58 + ...zif-fc9fd017e19a24e0-530492ba8305e348.json | 278 ++ ...zif-fd03910821368f68-fa54b0ea0f2a14a7.json | 169 ++ ...zif-fd823ec71e5980ce-fb04074f1843d568.json | 31 + ...zif-fe6e0efb644eced9-f06be10a091cfb41.json | 62 + ...zif-fe8583499fe1cbb8-a7cf0ef087069495.json | 39 + ...zif-fed5f41e1701789d-daf8820af0fe9430.json | 19 + ...zif-fef149820a82a100-d2fff4282c3ad1f4.json | 101 + ...zif-ff54b8a04d630c85-302a593cf4d0c55a.json | 192 ++ ...zif-ffb42884e83683a9-7d164a9bb116efe3.json | 147 ++ ...zif-ffd87968a303e340-9dec629c1fbdf2dc.json | 72 + ...zif-ffd87e4e007fc8e2-442f240405f9b3e2.json | 371 +++ .../provider/src/data/iana_normalizer.rs.data | 18 + deps/temporal/provider/src/data/mod.rs | 3 + .../provider/src/epoch_nanoseconds.rs | 63 + deps/temporal/provider/src/error.rs | 7 + .../provider/src/experimental_tzif/datagen.rs | 96 + .../provider/src/experimental_tzif/mod.rs | 66 + .../provider/src/experimental_tzif/posix.rs | 132 + deps/temporal/provider/src/lib.rs | 141 ++ deps/temporal/provider/src/provider.rs | 377 +++ deps/temporal/provider/src/tzdb.rs | 85 + deps/temporal/provider/src/tzdb/datagen.rs | 129 + deps/temporal/provider/src/tzif.rs | 2007 +++++++++++++++ deps/temporal/provider/src/utc.rs | 0 deps/temporal/provider/src/utils.rs | 132 + .../provider/src/utils/neri_schneider.rs | 266 ++ deps/temporal/provider/src/zoneinfo64.rs | 166 ++ .../src/builtins/compiled/duration.rs | 41 + .../src/builtins/compiled/duration/tests.rs | 845 +++++++ .../temporal/src/builtins/compiled/instant.rs | 35 + deps/temporal/src/builtins/compiled/mod.rs | 20 + deps/temporal/src/builtins/compiled/now.rs | 43 + .../src/builtins/compiled/plain_date.rs | 12 + .../src/builtins/compiled/plain_date_time.rs | 47 + .../src/builtins/compiled/plain_month_day.rs | 9 + .../src/builtins/compiled/plain_year_month.rs | 9 + .../src/builtins/compiled/zoned_date_time.rs | 232 ++ deps/temporal/src/builtins/core/calendar.rs | 992 ++++++++ .../src/builtins/core/calendar/era.rs | 159 ++ .../src/builtins/core/calendar/fields.rs | 389 +++ .../src/builtins/core/calendar/types.rs | 790 ++++++ deps/temporal/src/builtins/core/duration.rs | 1595 ++++++++++++ .../src/builtins/core/duration/date.rs | 182 ++ .../src/builtins/core/duration/normalized.rs | 1058 ++++++++ .../src/builtins/core/duration/tests.rs | 420 ++++ deps/temporal/src/builtins/core/instant.rs | 834 ++++++ deps/temporal/src/builtins/core/mod.rs | 41 + deps/temporal/src/builtins/core/now.rs | 224 ++ deps/temporal/src/builtins/core/plain_date.rs | 1044 ++++++++ .../src/builtins/core/plain_date_time.rs | 1552 ++++++++++++ .../src/builtins/core/plain_month_day.rs | 652 +++++ deps/temporal/src/builtins/core/plain_time.rs | 860 +++++++ .../src/builtins/core/plain_year_month.rs | 1132 +++++++++ deps/temporal/src/builtins/core/time_zone.rs | 685 +++++ .../src/builtins/core/zoned_date_time.rs | 1585 ++++++++++++ .../builtins/core/zoned_date_time/tests.rs | 1145 +++++++++ deps/temporal/src/builtins/mod.rs | 21 + deps/temporal/src/error.rs | 386 +++ deps/temporal/src/host.rs | 62 + deps/temporal/src/iso.rs | 1097 ++++++++ deps/temporal/src/lib.rs | 456 ++++ deps/temporal/src/options.rs | 989 ++++++++ deps/temporal/src/options/increment.rs | 117 + deps/temporal/src/options/relative_to.rs | 181 ++ deps/temporal/src/parsed_intermediates.rs | 210 ++ deps/temporal/src/parsers.rs | 1025 ++++++++ deps/temporal/src/parsers/time_zone.rs | 66 + deps/temporal/src/primitive.rs | 378 +++ deps/temporal/src/provider.rs | 9 + deps/temporal/src/rounding.rs | 626 +++++ deps/temporal/src/sys.rs | 79 + deps/temporal/src/tzdb.rs | 68 + deps/temporal/src/utils.rs | 16 + deps/temporal/temporal_capi/.gitattributes | 1 + deps/temporal/temporal_capi/.gitignore | 1 + deps/temporal/temporal_capi/Cargo.toml | 36 + deps/temporal/temporal_capi/LICENSE-Apache | 201 ++ deps/temporal/temporal_capi/LICENSE-MIT | 21 + deps/temporal/temporal_capi/README.md | 14 + .../bindings/c/AnyCalendarKind.d.h | 39 + .../bindings/c/AnyCalendarKind.h | 28 + .../bindings/c/ArithmeticOverflow.d.h | 23 + .../bindings/c/ArithmeticOverflow.h | 22 + .../temporal_capi/bindings/c/Calendar.d.h | 19 + .../temporal_capi/bindings/c/Calendar.h | 37 + .../temporal_capi/bindings/c/DateDuration.d.h | 19 + .../temporal_capi/bindings/c/DateDuration.h | 35 + .../bindings/c/DifferenceSettings.d.h | 27 + .../bindings/c/DifferenceSettings.h | 22 + .../bindings/c/Disambiguation.d.h | 25 + .../temporal_capi/bindings/c/Disambiguation.h | 22 + .../bindings/c/DisplayCalendar.d.h | 25 + .../bindings/c/DisplayCalendar.h | 22 + .../bindings/c/DisplayOffset.d.h | 23 + .../temporal_capi/bindings/c/DisplayOffset.h | 22 + .../bindings/c/DisplayTimeZone.d.h | 24 + .../bindings/c/DisplayTimeZone.h | 22 + .../temporal_capi/bindings/c/Duration.d.h | 19 + .../temporal_capi/bindings/c/Duration.h | 106 + .../temporal_capi/bindings/c/ErrorKind.d.h | 26 + .../temporal_capi/bindings/c/ErrorKind.h | 22 + .../bindings/c/I128Nanoseconds.d.h | 23 + .../bindings/c/I128Nanoseconds.h | 24 + .../temporal_capi/bindings/c/Instant.d.h | 19 + .../temporal_capi/bindings/c/Instant.h | 82 + .../bindings/c/OffsetDisambiguation.d.h | 25 + .../bindings/c/OffsetDisambiguation.h | 22 + .../bindings/c/OwnedRelativeTo.d.h | 25 + .../bindings/c/OwnedRelativeTo.h | 38 + .../temporal_capi/bindings/c/ParsedDate.d.h | 19 + .../temporal_capi/bindings/c/ParsedDate.h | 43 + .../bindings/c/ParsedDateTime.d.h | 19 + .../temporal_capi/bindings/c/ParsedDateTime.h | 31 + .../bindings/c/ParsedZonedDateTime.d.h | 19 + .../bindings/c/ParsedZonedDateTime.h | 38 + .../temporal_capi/bindings/c/PartialDate.d.h | 29 + .../temporal_capi/bindings/c/PartialDate.h | 22 + .../bindings/c/PartialDateTime.d.h | 25 + .../bindings/c/PartialDateTime.h | 22 + .../bindings/c/PartialDuration.d.h | 31 + .../bindings/c/PartialDuration.h | 24 + .../temporal_capi/bindings/c/PartialTime.d.h | 27 + .../temporal_capi/bindings/c/PartialTime.h | 22 + .../bindings/c/PartialZonedDateTime.d.h | 28 + .../bindings/c/PartialZonedDateTime.h | 22 + .../temporal_capi/bindings/c/PlainDate.d.h | 19 + .../temporal_capi/bindings/c/PlainDate.h | 151 ++ .../bindings/c/PlainDateTime.d.h | 19 + .../temporal_capi/bindings/c/PlainDateTime.h | 161 ++ .../bindings/c/PlainMonthDay.d.h | 19 + .../temporal_capi/bindings/c/PlainMonthDay.h | 73 + .../temporal_capi/bindings/c/PlainTime.d.h | 19 + .../temporal_capi/bindings/c/PlainTime.h | 100 + .../bindings/c/PlainYearMonth.d.h | 19 + .../temporal_capi/bindings/c/PlainYearMonth.h | 104 + .../temporal_capi/bindings/c/Precision.d.h | 23 + .../temporal_capi/bindings/c/Precision.h | 22 + .../temporal_capi/bindings/c/Provider.d.h | 19 + .../temporal_capi/bindings/c/Provider.h | 31 + .../temporal_capi/bindings/c/RelativeTo.d.h | 25 + .../temporal_capi/bindings/c/RelativeTo.h | 22 + .../temporal_capi/bindings/c/RoundingMode.d.h | 30 + .../temporal_capi/bindings/c/RoundingMode.h | 22 + .../bindings/c/RoundingOptions.d.h | 27 + .../bindings/c/RoundingOptions.h | 22 + .../temporal_capi/bindings/c/Sign.d.h | 24 + deps/temporal/temporal_capi/bindings/c/Sign.h | 22 + .../bindings/c/TemporalError.d.h | 24 + .../temporal_capi/bindings/c/TemporalError.h | 22 + .../temporal_capi/bindings/c/TimeZone.d.h | 25 + .../temporal_capi/bindings/c/TimeZone.h | 57 + .../bindings/c/ToStringRoundingOptions.d.h | 27 + .../bindings/c/ToStringRoundingOptions.h | 22 + .../bindings/c/TransitionDirection.d.h | 23 + .../bindings/c/TransitionDirection.h | 22 + .../temporal_capi/bindings/c/Unit.d.h | 32 + deps/temporal/temporal_capi/bindings/c/Unit.h | 22 + .../bindings/c/UnsignedRoundingMode.d.h | 26 + .../bindings/c/UnsignedRoundingMode.h | 22 + .../bindings/c/ZonedDateTime.d.h | 19 + .../temporal_capi/bindings/c/ZonedDateTime.h | 238 ++ .../bindings/c/diplomat_runtime.h | 82 + .../cpp/temporal_rs/AnyCalendarKind.d.hpp | 89 + .../cpp/temporal_rs/AnyCalendarKind.hpp | 70 + .../cpp/temporal_rs/ArithmeticOverflow.d.hpp | 49 + .../cpp/temporal_rs/ArithmeticOverflow.hpp | 38 + .../bindings/cpp/temporal_rs/Calendar.d.hpp | 64 + .../bindings/cpp/temporal_rs/Calendar.hpp | 86 + .../cpp/temporal_rs/DateDuration.d.hpp | 55 + .../bindings/cpp/temporal_rs/DateDuration.hpp | 82 + .../cpp/temporal_rs/DifferenceSettings.d.hpp | 48 + .../cpp/temporal_rs/DifferenceSettings.hpp | 47 + .../cpp/temporal_rs/Disambiguation.d.hpp | 53 + .../cpp/temporal_rs/Disambiguation.hpp | 40 + .../cpp/temporal_rs/DisplayCalendar.d.hpp | 53 + .../cpp/temporal_rs/DisplayCalendar.hpp | 40 + .../cpp/temporal_rs/DisplayOffset.d.hpp | 49 + .../cpp/temporal_rs/DisplayOffset.hpp | 38 + .../cpp/temporal_rs/DisplayTimeZone.d.hpp | 51 + .../cpp/temporal_rs/DisplayTimeZone.hpp | 39 + .../bindings/cpp/temporal_rs/Duration.d.hpp | 119 + .../bindings/cpp/temporal_rs/Duration.hpp | 327 +++ .../bindings/cpp/temporal_rs/ErrorKind.d.hpp | 55 + .../bindings/cpp/temporal_rs/ErrorKind.hpp | 41 + .../cpp/temporal_rs/I128Nanoseconds.d.hpp | 47 + .../cpp/temporal_rs/I128Nanoseconds.hpp | 48 + .../bindings/cpp/temporal_rs/Instant.d.hpp | 97 + .../bindings/cpp/temporal_rs/Instant.hpp | 238 ++ .../temporal_rs/OffsetDisambiguation.d.hpp | 53 + .../cpp/temporal_rs/OffsetDisambiguation.hpp | 40 + .../cpp/temporal_rs/OwnedRelativeTo.d.hpp | 62 + .../cpp/temporal_rs/OwnedRelativeTo.hpp | 86 + .../bindings/cpp/temporal_rs/ParsedDate.d.hpp | 58 + .../bindings/cpp/temporal_rs/ParsedDate.hpp | 97 + .../cpp/temporal_rs/ParsedDateTime.d.hpp | 50 + .../cpp/temporal_rs/ParsedDateTime.hpp | 65 + .../cpp/temporal_rs/ParsedZonedDateTime.d.hpp | 56 + .../cpp/temporal_rs/ParsedZonedDateTime.hpp | 84 + .../cpp/temporal_rs/PartialDate.d.hpp | 52 + .../bindings/cpp/temporal_rs/PartialDate.hpp | 52 + .../cpp/temporal_rs/PartialDateTime.d.hpp | 44 + .../cpp/temporal_rs/PartialDateTime.hpp | 43 + .../cpp/temporal_rs/PartialDuration.d.hpp | 55 + .../cpp/temporal_rs/PartialDuration.hpp | 64 + .../cpp/temporal_rs/PartialTime.d.hpp | 45 + .../bindings/cpp/temporal_rs/PartialTime.hpp | 49 + .../temporal_rs/PartialZonedDateTime.d.hpp | 50 + .../cpp/temporal_rs/PartialZonedDateTime.hpp | 48 + .../bindings/cpp/temporal_rs/PlainDate.d.hpp | 163 ++ .../bindings/cpp/temporal_rs/PlainDate.hpp | 455 ++++ .../cpp/temporal_rs/PlainDateTime.d.hpp | 172 ++ .../cpp/temporal_rs/PlainDateTime.hpp | 502 ++++ .../cpp/temporal_rs/PlainMonthDay.d.hpp | 93 + .../cpp/temporal_rs/PlainMonthDay.hpp | 204 ++ .../bindings/cpp/temporal_rs/PlainTime.d.hpp | 109 + .../bindings/cpp/temporal_rs/PlainTime.hpp | 289 +++ .../cpp/temporal_rs/PlainYearMonth.d.hpp | 122 + .../cpp/temporal_rs/PlainYearMonth.hpp | 313 +++ .../bindings/cpp/temporal_rs/Precision.d.hpp | 37 + .../bindings/cpp/temporal_rs/Precision.hpp | 41 + .../bindings/cpp/temporal_rs/Provider.d.hpp | 62 + .../bindings/cpp/temporal_rs/Provider.hpp | 70 + .../bindings/cpp/temporal_rs/RelativeTo.d.hpp | 44 + .../bindings/cpp/temporal_rs/RelativeTo.hpp | 43 + .../cpp/temporal_rs/RoundingMode.d.hpp | 63 + .../bindings/cpp/temporal_rs/RoundingMode.hpp | 45 + .../cpp/temporal_rs/RoundingOptions.d.hpp | 48 + .../cpp/temporal_rs/RoundingOptions.hpp | 47 + .../bindings/cpp/temporal_rs/Sign.d.hpp | 51 + .../bindings/cpp/temporal_rs/Sign.hpp | 39 + .../cpp/temporal_rs/TemporalError.d.hpp | 42 + .../cpp/temporal_rs/TemporalError.hpp | 42 + .../bindings/cpp/temporal_rs/TimeZone.d.hpp | 90 + .../bindings/cpp/temporal_rs/TimeZone.hpp | 164 ++ .../temporal_rs/ToStringRoundingOptions.d.hpp | 48 + .../temporal_rs/ToStringRoundingOptions.hpp | 46 + .../cpp/temporal_rs/TransitionDirection.d.hpp | 49 + .../cpp/temporal_rs/TransitionDirection.hpp | 38 + .../bindings/cpp/temporal_rs/Unit.d.hpp | 67 + .../bindings/cpp/temporal_rs/Unit.hpp | 47 + .../temporal_rs/UnsignedRoundingMode.d.hpp | 55 + .../cpp/temporal_rs/UnsignedRoundingMode.hpp | 41 + .../cpp/temporal_rs/ZonedDateTime.d.hpp | 234 ++ .../cpp/temporal_rs/ZonedDateTime.hpp | 779 ++++++ .../cpp/temporal_rs/diplomat_runtime.hpp | 566 +++++ deps/temporal/temporal_capi/src/calendar.rs | 84 + deps/temporal/temporal_capi/src/duration.rs | 335 +++ deps/temporal/temporal_capi/src/error.rs | 46 + deps/temporal/temporal_capi/src/instant.rs | 246 ++ deps/temporal/temporal_capi/src/lib.rs | 40 + deps/temporal/temporal_capi/src/options.rs | 175 ++ deps/temporal/temporal_capi/src/plain_date.rs | 469 ++++ .../temporal_capi/src/plain_date_time.rs | 401 +++ .../temporal_capi/src/plain_month_day.rs | 150 ++ deps/temporal/temporal_capi/src/plain_time.rs | 239 ++ .../temporal_capi/src/plain_year_month.rs | 221 ++ deps/temporal/temporal_capi/src/provider.rs | 90 + deps/temporal/temporal_capi/src/time_zone.rs | 156 ++ .../temporal_capi/src/zoned_date_time.rs | 806 ++++++ deps/temporal/temporal_capi/tests/c/Makefile | 25 + deps/temporal/temporal_capi/tests/c/simple.c | 33 + .../temporal/temporal_capi/tests/cpp/Makefile | 25 + .../temporal_capi/tests/cpp/simple.cpp | 15 + deps/temporal/tools/README.md | 10 + deps/temporal/tools/bakeddata/Cargo.toml | 20 + deps/temporal/tools/bakeddata/README.md | 9 + deps/temporal/tools/bakeddata/src/main.rs | 171 ++ deps/temporal/tools/depcheck/Cargo.toml | 13 + deps/temporal/tools/depcheck/src/main.rs | 191 ++ deps/temporal/tools/diplomat-gen/Cargo.toml | 14 + deps/temporal/tools/diplomat-gen/src/main.rs | 44 + deps/temporal/tools/tzif-inspect/Cargo.toml | 17 + deps/temporal/tools/tzif-inspect/README.md | 9 + deps/temporal/tools/tzif-inspect/src/main.rs | 219 ++ .../tools/zoneinfo-test-gen/Cargo.toml | 17 + .../tools/zoneinfo-test-gen/README.md | 37 + .../tools/zoneinfo-test-gen/src/main.rs | 115 + deps/temporal/zoneinfo/Cargo.toml | 30 + deps/temporal/zoneinfo/README.md | 28 + deps/temporal/zoneinfo/src/compiler.rs | 189 ++ deps/temporal/zoneinfo/src/lib.rs | 153 ++ deps/temporal/zoneinfo/src/parser.rs | 222 ++ deps/temporal/zoneinfo/src/posix.rs | 228 ++ deps/temporal/zoneinfo/src/rule.rs | 393 +++ deps/temporal/zoneinfo/src/types.rs | 655 +++++ deps/temporal/zoneinfo/src/tzif.rs | 62 + deps/temporal/zoneinfo/src/utils.rs | 58 + deps/temporal/zoneinfo/src/zone.rs | 819 ++++++ .../tests/data/america-anchorage.json | 681 +++++ .../zoneinfo/tests/data/america-chicago.json | 1409 +++++++++++ .../zoneinfo/tests/data/america-new_york.json | 1409 +++++++++++ .../zoneinfo/tests/data/antarctica-troll.json | 25 + .../tests/data/australia-lord_howe.json | 457 ++++ .../zoneinfo/tests/data/australia-sydney.json | 673 +++++ .../zoneinfo/tests/data/europe-berlin.json | 489 ++++ .../zoneinfo/tests/data/europe-dublin.json | 1169 +++++++++ .../zoneinfo/tests/data/europe-london.json | 1281 ++++++++++ .../zoneinfo/tests/data/europe-paris.json | 817 ++++++ .../zoneinfo/tests/data/europe-riga.json | 433 ++++ .../tests/data/rearguard/europe-dublin.json | 1833 ++++++++++++++ deps/temporal/zoneinfo/tests/posix.rs | 43 + deps/temporal/zoneinfo/tests/test_datagen.rs | 153 ++ deps/temporal/zoneinfo/tests/zoneinfo | 438 ++++ 657 files changed, 111880 insertions(+) create mode 100644 deps/temporal/.cargo/config.toml create mode 100644 deps/temporal/.gitignore create mode 100644 deps/temporal/CHANGELOG.md create mode 100644 deps/temporal/CONTRIBUTING.md create mode 100644 deps/temporal/Cargo.lock create mode 100644 deps/temporal/Cargo.toml create mode 100644 deps/temporal/LICENSE-Apache create mode 100644 deps/temporal/LICENSE-MIT create mode 100644 deps/temporal/README.md create mode 100644 deps/temporal/cliff.toml create mode 100644 deps/temporal/docs/FAQ.md create mode 100644 deps/temporal/docs/README.md create mode 100644 deps/temporal/docs/TZDB.md create mode 100644 deps/temporal/docs/architecture.md create mode 100644 deps/temporal/docs/design/initial-api-concept.md create mode 100644 deps/temporal/docs/release.md create mode 100644 deps/temporal/docs/testing.md create mode 100644 deps/temporal/provider/Cargo.toml create mode 100644 deps/temporal/provider/LICENSE-Apache create mode 100644 deps/temporal/provider/LICENSE-MIT create mode 100644 deps/temporal/provider/README.md create mode 100644 deps/temporal/provider/src/data/compiled_zoneinfo_provider.rs.data create mode 100644 deps/temporal/provider/src/data/debug/iana_normalizer.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/map.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1041cd53332eeba8-60aa3eb45cf6bad9.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1146d998a660d8a7-7083368cf5416b3.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-11b63f0f95d852ce-9769280653fbbbb1.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-12ced9fe919d8b6-35fe81809b640977.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1375eb028a5068b1-c7cfa311f9a3eac8.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-14cdf6863a8e2179-b18612ad8b0eacc7.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-14ec5a4ae9e7e087-d5eb6128c4e9c616.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-154d4d1d56f527ae-b4426313fdb85583.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-170cb25ac2daddf1-c28442df6aeaf807.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1735ba0bbd2e57f5-8adc7347030fce3f.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-186e2b651b9e98be-423bebc6a1739dc2.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1939cc3520b8dae8-a2fd6733973f8da2.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-19d0e567d48830e5-20b2a6d45202416.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1a285e17b7751f38-aefc034b499da29b.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1dd142eb22754e92-d3cee37600e3912e.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1ede513c242ae08-561006205b46a9e7.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1eff85dd787ed3a1-d74f97871f7e97e8.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-206d649fad594120-70deb0fb976b18e.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-21007d26526b6cee-4c7defff421754b5.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-239c7722f428fac8-7a4c4b125895f0bd.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2450804cbdb4245e-fc28955e4978e50d.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-24b250ef0928a9e9-6530a4ca5485dc31.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-24bc4f701e560e8f-fbbcb1e6855b01a1.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-25763d8b26764a7a-5933d51fd56b3fdf.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-26ac36da2732c840-dedd53591694d48d.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-26aecc98f9d83045-d767019b239f072.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-26bf0cacd24f77a1-a98e0c85e152f06e.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-273d77751416ce66-188ad35538918cca.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-283cf30fce0ee58e-ee056ab931c35019.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-291cff29f8a99dfe-401473cfba65f82d.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2a2176981e284105-59c6fda81a2a226c.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2a554d4e97833d6e-1eb5fb8bf2c9f728.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2a7fc944a4c2991b-ed19eb01bbf45250.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2a9b3a635fc27340-e824f8940a7a64f6.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2ae3e9466dbec3ec-2dfc2c7ddd060e6d.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2b407bee2bf8cbea-39e72d1f00f10d06.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2bd99bb6843e89cf-932580fc9a3a0c8d.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2be99c3dd72ebbf9-e08d147873aff81.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2c1bb7953877feff-4c66e005cbf579fe.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2d819a70236c9f86-721e9b57fc17e8df.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3234542952508833-776aeadf2e17fcb4.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-33db81d7f03c072e-e083980d979c0926.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-34047004b336df3e-bbe8e4196294f00a.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-355a4a5906a54477-e95040f92d9fdd8d.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3567a65ce3b07b4a-eda38ce2d13af268.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-36890fddb7a9031e-81d4ff9e4c89f2e8.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-37762e44a2edd792-4f1b10d181e56a5d.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-380c01b13aae6590-113f60eeecce7355.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-38d88ef47726082c-a2b861350ff9abaf.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3994d21beae7c7b6-eb145d056159d80.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3a07d4451f21c9ef-6b2242eea52b976b.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3a5a827f28d118e9-682e0a2d838b16ae.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3a6fecb09c143b25-73487cfbfb37a1d6.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3c8506b1fc96536c-4c88dd0e00eba4f2.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3cc59865618b9844-e109dc95307db988.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3cc8439b3e85f059-8e4f59b418f8888a.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3d390ef79718594a-1d54abd9de1f791b.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3d5473248adfd22d-72a86f7189e4c492.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3f61f7ebb7b0f5d7-3b9e017c8df909f8.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3f6ff680ea89333b-f07f1041c6be937.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3fc16258c94fd1bd-f5865999bedfb5cb.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3fd85b535272f921-d61e3c0d217e3de2.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-401f78ac94f3eb66-89897df479278829.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-405b02408f1a7725-3c0ae0a258a25979.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-40fb52b19ef81b1d-e1ce3cc4e0a17886.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-42518274487a5d74-63fffb5b4ef7fbd9.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-425a92f6316d948f-f81669d6e3b37009.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-43c01a519dcad360-c978a2de09220f3e.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-44b31bf3438167a2-f26149998b62ea48.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4529e4629acf0366-8106ebfc9606aee2.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-46dd3b15bf889536-90c51dda0af69c0c.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4738bf3d72913a1b-ef164d685fcac290.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-480b0a55dd7bf29e-c23b37ed84c4f8f9.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-486e9282debc62a3-27805d7d5dee9be4.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4891d41993ed3f5f-4d0c2933ef920fb1.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4a65bbe3253254a1-2a20d46c4d15c0c3.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4ab862d6d4b98ff4-7628975aa4bf631a.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4c9c946292d76a04-7fbd1484596ee05e.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4ccce3697974db1-dd90a8482c7e02e0.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4db2cfd1785db9cd-6589edd5db80b603.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4e52d8a7b9ecde7e-b7f50a3a0d1ac3b5.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4eaf76405b17e0d3-64c6a9f0471d4ce9.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4f0ad1968e2955-b99def3a9c716c7f.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4fd8d72ac04d9a5d-3133c7dea65f2538.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5060a985014097b1-2e0f3c6f560795ff.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-50abe32c287395c8-d2c3aa5882246ab2.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-50fc3fea132b4f4c-5a5d88ba8de3b7c1.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-513821d5372dc2c3-56efcc8826fb3481.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-52291e736a34e36b-2ab58b9a9f408e39.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5473a3220fbbe20b-150c46c09db6581d.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-55bb5ee9b0a529a6-dce97bdbcf437150.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-55ec396d83237537-39a492626467027.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-55eedcdc6ff1f85-5b27bba1cde1354f.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-57ad9603575ed991-356d85cfd1d045d6.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5890af4975eb815-dbcd9d0a6fe5353.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-59d5e08cb19672f5-73d8fe68d8bc0b47.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5a1de33f302092c9-7fede906b0fbc944.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5a8de8f20b18b43-384f712f565d0ab0.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5cb26c449b2278f2-a3a1b3aa09d53c07.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5d69c15d2c4f26ae-d843083a2b2d2784.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5e245c7be541fe52-ac13030bf2bc388c.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5eec9cd299aa076f-857603deebbce60b.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5fd210f528e95871-c650f43dd3590090.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-609a1c759abb0f9e-a202ec7708c700d8.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6156cfed77f2a26c-d5c8e957d52b5aa1.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6196bbf525d4d50a-c1285ce65c03319.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-622cbc57a076ea5d-616edf8039af4f62.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6268b48b2e959066-91294d0f7013ba84.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-638a1ae9aef4e05b-74d152a85f1741cd.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6415eb3f74777957-6f718f12281286a3.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6493d17f054bfdfb-35ed6c8176f0fbed.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-650685fe5c95ce2a-2f3eb2e60291229d.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-65401a13577707c6-bb9f9264b43c1451.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-65badfa9c283e8d3-9bc658cd314193fd.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-66a5515c6139ad2d-8cdcb912670ca415.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-66fc406d3b90ff90-42d7c96cbf80d3ca.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6797b3dc466b8334-28780ef70fbe052e.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-67d3e39540d85c91-f13f9d0367c68c92.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-68b74f8e8d191761-a8eaae70013bbfdf.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-69530af9af6cd0cb-6e2e37393c7f8e5d.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6a52098e032992a5-e1eb00358541c6a0.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6ad7cbb6af2e6144-d93cfc8ee54a6b99.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6bfb62f5e4b63e4a-5a7d3b172eb114d5.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6d168cde30b3c19-24342dd0af895908.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6d3285599a38ae5a-e146c246881dc5ed.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6fbdbfed85292c81-468d78f0fb8a53ac.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6fbdea510dc8bdff-a0d6c86f83720461.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-70408e1d981309b7-da99eb025c30159.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-70c6eef1cba9528e-fa6fd92ebfdcf3ad.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-715448d734f9507a-f4183ed224275281.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7238398358c87edf-bc2588b2ce94bc20.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7241c1457aae4357-3c4783fc5e291a5.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7285bd926fe2dc70-a6ffff1cf5147cbf.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-72be3d5f2c49eb87-7e9fa5340a3dee71.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7459e3ffacdde5a6-a596288a1fff51a3.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7481a99701104a1c-da931bd1c7d61a9.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-748e0c2c22be393e-9159f30a64f07d32.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-74fc38128e80b92d-871756115f3d1b05.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-754b9e4bdb20aa95-1c5b7a1b811c5ae3.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-758d7fde6833ba8c-65256d0857a2f636.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7599edfd11a3db64-4bf8d694826715ae.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-75a476630c4f3c06-6cc92a5fc490dfa3.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7622c5c99b380b37-74a373c9f92241c7.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-762fa57e245bdc0d-c5a018de141b4cb3.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-768158f1c3d3089e-e43bac17424df347.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7776a42ce751a29e-1629f5ee8a6e924e.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-794b5729aca99b8f-8dcbb73848fb52db.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-79a67056f030a883-f33ddefe3e35e4d0.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7a158f0aed162547-27577cc8813fb4ed.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7aa0aebc84b44c67-973b0b87d9034391.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7ba4aaa7dba09bb0-567af4b250c89d25.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7bce416a66d38e42-b58b08c4c731f7dc.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7be16635ecf890b5-161efc0ab3ac2299.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7cca7c8a1af35285-679fdca550b074a0.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7d33da447360d55c-52583d8c13b6f677.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7d7635957a94c158-89410cc4ecfceda2.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7ec2120f35e8ce46-9f313b48e73a78c4.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-806417e5a9e6e27a-d183a9f9e82d72df.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-81a0c2bb7c8a41da-7b4ebb9a4aa49253.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-83ab6f3e7a54b242-140e172ea09b920.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-843bd4f4a13e936f-e20d11612a15d3e6.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-84569b5d12891e1e-dfbd7173ea59c56d.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8494d6017f05e49d-6fa1752d1f7aa8c3.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-849b49f0ce1dac82-89b53710eb7d9371.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-86245dd795582456-61d8c9f7c4ad177a.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-87649f3d059a10f2-a8c51b0e84c40a85.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-87ef4dab5f3e3941-c43fb003c147a77.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-89cd9f4224d1324a-6ddbd3de8874993f.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8a0ec5e44a49e44e-1f9e21f2398d2965.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8b129baceef3898a-389e46393fa915f2.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8b312fc28eb6d503-b57cea257edd1731.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8b944106b8f9db7e-1d2f4ecd91296f4.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8bf0f826f4c6e05e-9c27d3058e34d93b.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8c010856ba3febe1-a27521eb7d78dbf6.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8e1e620dda961a84-8cb519c7f5594e81.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8e605032c3ce6342-6a27beeec5d94fef.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8fec2819cc677405-6cfb65330c2f1fa0.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-905f75931d73bd53-38c9d0ddc82eec2a.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-90e0499f7b80422b-16e03eeaaf192844.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-916c7f697e6af49e-cd5f0c23c53bde30.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-93ba37d78a84866e-364c3b71717bb302.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-94731e7a96e16727-b9bdd49f2158b98c.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-95eb641ddc74061f-5a914528a766049d.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-96a7050f6c4d3e34-7cc5980522f3fef5.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-98fb8731f72daeb6-4585fdc50640db42.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-98fc8236fccd3576-88ddb973d46096e3.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-996739b4c558f747-935dbc63456811c2.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-99cdd052561a0879-89252b18a95154e3.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-99ce61a08c1199af-56326eb4ceecfd35.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-9a2f8cce797280e8-37784cc07103f2f3.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-9af11812af42f7cb-8d70b106abb9243f.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-9afb6f21d74a3dbd-d76c18d684813924.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-9b4491a5a7233cc3-9416dbeeb6810774.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-9bd926151a997a3e-9909ffff90c3207.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-9c7ac303ad5d20d8-9111a17e7b78de54.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-9c98c8b92084c36-47e6455e977d6bb3.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-9d02412abb136ce4-bfde68530f93fb26.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a053c1334aeab356-645c110894da15be.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a0806703e39bd41f-938b549d3f658065.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a1347b19ee040601-84e246431e54b763.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a187ee64c8fae572-4985eb67780f1dca.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a1b14d47c3da0459-9beeb6b09fc4bd85.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a2c4636cb2de823b-69641876de40969.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a3214de8e358efe8-33b7f8f888f95c0b.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a3bbf95d113466c0-366de44a51a62cbe.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a442eead4fdb53a5-264d7185508cac7f.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a44c115ed3d72421-692eaf79ab1934a7.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a685965c91f5b79b-e66cc1c813ce5bd6.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a7b726e2144b8ec3-b273ddcc47da034b.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-aa6fbecd6b3089a1-3c3e5535078a0aca.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-aba73c12b2e7f46-a62a02047cf0f8be.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-aeaa8db63bed649c-8a6f5505498821c5.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b05b7d10c5ffdad-d39eb7f9fe146506.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b06ac7e52f27518c-ad815076903a307.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b0c86e4e28bb1810-bccad26ea4f4cee2.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b397eb337d51aec5-9d2674bc81a95add.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b3a7b6acccb12af9-93f5a4bd9827e971.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b3d9e43d648fe2bf-fa688f4eb568be69.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b445d8dfee87de1d-3d26ba9d3df071ac.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b6ba868b587cad06-6667a264db5d890e.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b785c09bc525b515-5fd6146854daeb91.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b89f6da72122ca01-812d173fdcfeaaa6.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b8b54ce37e65e37e-e9672f15a3e270a7.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b9b18c55e2cd4d53-b3d917ee40af164d.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b9d3679a03af6191-99d89d33c8fd0b60.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bad7f01dd3f01a92-8ed1d7da904b667d.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bafb78fdc913701c-de429c1ed9e982a1.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bbf3217ce334c3f2-5622ec9ecf81c925.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bbfc9e9111217c11-69684e27be4c3e38.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bcd5d242787ff58-595e172a944e8f55.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bd05cebe8eecfa2c-408891f6d5e0c72a.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bd9ad03026ed086f-3d5a919e98fa2787.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bda89ec29d33a428-f6c6f1d38129c153.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bdc0a1977c311c8d-87860ab499ecadb8.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bdd491f43b0c1c85-6f9616d7048f0cf9.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-be07532f1af7dccb-7a89363e76463570.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-be7c1ce9358259b9-87fdd35d13d52495.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-be9bc4833f21d33b-2a54484e254d46c8.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c0a7b3c45458ac17-adf27c3e51a11cf6.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c0d9ca8c12b3167c-34f182f235d9fe88.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c0f3e562f1a83b48-46259b3efc2044b4.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c17291eb667fe274-81f01d3c395654a6.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c306ac2cd34a373c-ec50d5ecafac2084.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c3aa55f145295944-50f38632c531aab8.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c4897a4741bd9e82-aaea1d16ea0a4fb8.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c595527c9472a8dc-da82dc08bd3d58a0.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c6ecc61594d93097-34f668d36b185b09.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c711f11538fdc96f-2563abbbef728ca5.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c79f46dbe8103377-6f330e5ab7f7dc8e.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c7a9617c25e2eb1a-67a9e52b4fa102af.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c7d151e4111f596b-82465a65ac1b9a8e.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c83537c4365f1258-7426b2a60504f417.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c841f0aca0404a73-5f8447c455db7736.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ca31f6cb7d44b091-6a023a6a71d41a7.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-cab5fb5bf9e7625f-4aaae2f823b6e6c9.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-cad03994b9f9755d-786401d28559cef.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-cb2104a4192b82ba-ddba0d84d8ea7d92.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-cb56ff55ea32bb92-c654a08c059dae2e.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-cbcf966225780b1c-8a7f4b3e40c1b2d5.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-cbf2a88472b0862a-de6f37d8951e33ce.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-cd29e561a284f373-1b38f7643a89adc3.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ce5eb7cf8993261f-bdd600c9c7fb16d5.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ce802c28d3beb1b-5157362aadd9dd29.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-cec2538008230fcd-486e4621268a0834.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-d1e4208290566f2f-8b7418c65c288188.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-d28e0bb7485a8522-9d5ad01d4999d0c7.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-d3201ec4e70c92f3-5814e30a4cc908b9.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-d41aa71f743154ff-cd47b010d657ac37.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-d4999f54d6ffa1ff-bdc2dfc5a5de1f94.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-d7daa3dddb990290-2188fa690fb895b7.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-daeed2898ecd770c-894d1d81ca85ba4d.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-dbf1c543882cf4b7-2ee5fc1eb7933ea5.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-dc6b1be48367c4f1-5f1fbe94f0718a6a.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-dc8c7c76ac036db-6dcebe24fb293843.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-dc8ea6d022a7ebec-7bdcff969a6b651c.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-dd90c0bd2a5d5bcb-4e3fcc5e29cf94e2.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-df3a174a6f1304b9-f30768cdd2518dd1.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-dfcaab41c352fc41-836527ef6425759.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e12ae166d8468131-ee348999c2fd8345.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e20ebf54a807fe0e-10ef646904348bbe.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e271b0f2662b1c04-20e8607792da4ec7.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e2789756bce07cca-d7ab71c2384db975.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e2bf7ec87041f1fb-b61a215ea3b5adb3.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e330917831501a06-5b1f8ec8b0ab9c4a.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e3d5b2baffd22f2d-4e475abbb4b8264f.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e4c142bca3031674-44b8ea4e236ae5f5.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e5822ac52a06a527-c5e561a56943464c.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e65fa49c7674041-51ba19ae72a3c69.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e713de09d9781804-3bc1517947065469.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e7907c2354d7f128-1222f4f18f058093.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e953d2a73bc41375-ef97956cf6178835.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ea8173f82f8dccac-190f07fa0585582b.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-eafa00d1ad3ada02-ccfdff510d06498a.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-eb4384db15894d16-b0aaeb08a0cbe1e0.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-eb9179abb91c8435-726489ced5139013.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ec4f112febcbc032-a69762c688a2158f.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ed29bf9f15004c8a-f6def5db1514383c.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-edc11c9a67454353-7a49fa82cac12758.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-edc8df3b48d8f1ae-2f0fe2e55f7ceabf.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ee42b17151e8d0d1-557c16a705ea23d1.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ef074bbbac9f5764-af06bb8dad04fbb2.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ef99169dd5b3d431-ae45f4711dd0d14b.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-effb0bd5efab2bad-76ee3ca040667987.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f022b64b061d7846-529fb8a37afd1bc3.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f0d38f589f1464b7-e65390d2a42c7521.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f104b0a7be76b68-672d15810abf76ed.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f1b7ca6dc4d0b2b0-d827a5cc52d17740.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f1f0b3541047bfad-8176e7d9a57a1316.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f2238fc53b0fff96-6f6aee2b55131405.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f229cb4cd552c448-1e8f29f5b7bc6659.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f26b875165969e75-9e25992ccdfbaa1f.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f5114ea1ad21a447-657f9c7873c390b2.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f58f911ab743ef1d-f57255d26abdda48.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f5b99738d99ddd8c-edf53ab20b57f392.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f61469e5df5071ba-1d93153e2c1ef413.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f665c39691dff65-eb8beb46e71e4a05.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f6698c0e9f2fa661-cfcf92aaf6d6e5be.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f677bd8d940386cc-6f4acf146c31eb70.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f757031187208623-b42f12ebe4b7bfcb.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f7b886dc80987d1f-1cfc3c180fd77cd3.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f80d3a6707532038-3bae731e777368b6.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f842f34f4c14fee1-6af6c77813d81c95.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f87d2aa5dfe5efe9-6f6f56db37ced2fd.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f8baa073f0e62ab0-5c9c06226b1920d5.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f9736e8dcd3eb5de-9c17b925c6652d48.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f9878deac6fa797b-63a1fb86a70f62e5.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fb562061c0f6e08b-c76bafb046d43b7.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fb66f3417dbb2dfe-e13d26a5a5a0ef65.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fbccf04b5b2fd7f2-b508b8cbe01e354b.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fc89b67bba9eff21-ed937c5b2210118e.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fc9fd017e19a24e0-530492ba8305e348.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fd03910821368f68-fa54b0ea0f2a14a7.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fd823ec71e5980ce-fb04074f1843d568.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fe6e0efb644eced9-f06be10a091cfb41.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fe8583499fe1cbb8-a7cf0ef087069495.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fed5f41e1701789d-daf8820af0fe9430.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fef149820a82a100-d2fff4282c3ad1f4.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ff54b8a04d630c85-302a593cf4d0c55a.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ffb42884e83683a9-7d164a9bb116efe3.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ffd87968a303e340-9dec629c1fbdf2dc.json create mode 100644 deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ffd87e4e007fc8e2-442f240405f9b3e2.json create mode 100644 deps/temporal/provider/src/data/iana_normalizer.rs.data create mode 100644 deps/temporal/provider/src/data/mod.rs create mode 100644 deps/temporal/provider/src/epoch_nanoseconds.rs create mode 100644 deps/temporal/provider/src/error.rs create mode 100644 deps/temporal/provider/src/experimental_tzif/datagen.rs create mode 100644 deps/temporal/provider/src/experimental_tzif/mod.rs create mode 100644 deps/temporal/provider/src/experimental_tzif/posix.rs create mode 100644 deps/temporal/provider/src/lib.rs create mode 100644 deps/temporal/provider/src/provider.rs create mode 100644 deps/temporal/provider/src/tzdb.rs create mode 100644 deps/temporal/provider/src/tzdb/datagen.rs create mode 100644 deps/temporal/provider/src/tzif.rs create mode 100644 deps/temporal/provider/src/utc.rs create mode 100644 deps/temporal/provider/src/utils.rs create mode 100644 deps/temporal/provider/src/utils/neri_schneider.rs create mode 100644 deps/temporal/provider/src/zoneinfo64.rs create mode 100644 deps/temporal/src/builtins/compiled/duration.rs create mode 100644 deps/temporal/src/builtins/compiled/duration/tests.rs create mode 100644 deps/temporal/src/builtins/compiled/instant.rs create mode 100644 deps/temporal/src/builtins/compiled/mod.rs create mode 100644 deps/temporal/src/builtins/compiled/now.rs create mode 100644 deps/temporal/src/builtins/compiled/plain_date.rs create mode 100644 deps/temporal/src/builtins/compiled/plain_date_time.rs create mode 100644 deps/temporal/src/builtins/compiled/plain_month_day.rs create mode 100644 deps/temporal/src/builtins/compiled/plain_year_month.rs create mode 100644 deps/temporal/src/builtins/compiled/zoned_date_time.rs create mode 100644 deps/temporal/src/builtins/core/calendar.rs create mode 100644 deps/temporal/src/builtins/core/calendar/era.rs create mode 100644 deps/temporal/src/builtins/core/calendar/fields.rs create mode 100644 deps/temporal/src/builtins/core/calendar/types.rs create mode 100644 deps/temporal/src/builtins/core/duration.rs create mode 100644 deps/temporal/src/builtins/core/duration/date.rs create mode 100644 deps/temporal/src/builtins/core/duration/normalized.rs create mode 100644 deps/temporal/src/builtins/core/duration/tests.rs create mode 100644 deps/temporal/src/builtins/core/instant.rs create mode 100644 deps/temporal/src/builtins/core/mod.rs create mode 100644 deps/temporal/src/builtins/core/now.rs create mode 100644 deps/temporal/src/builtins/core/plain_date.rs create mode 100644 deps/temporal/src/builtins/core/plain_date_time.rs create mode 100644 deps/temporal/src/builtins/core/plain_month_day.rs create mode 100644 deps/temporal/src/builtins/core/plain_time.rs create mode 100644 deps/temporal/src/builtins/core/plain_year_month.rs create mode 100644 deps/temporal/src/builtins/core/time_zone.rs create mode 100644 deps/temporal/src/builtins/core/zoned_date_time.rs create mode 100644 deps/temporal/src/builtins/core/zoned_date_time/tests.rs create mode 100644 deps/temporal/src/builtins/mod.rs create mode 100644 deps/temporal/src/error.rs create mode 100644 deps/temporal/src/host.rs create mode 100644 deps/temporal/src/iso.rs create mode 100644 deps/temporal/src/lib.rs create mode 100644 deps/temporal/src/options.rs create mode 100644 deps/temporal/src/options/increment.rs create mode 100644 deps/temporal/src/options/relative_to.rs create mode 100644 deps/temporal/src/parsed_intermediates.rs create mode 100644 deps/temporal/src/parsers.rs create mode 100644 deps/temporal/src/parsers/time_zone.rs create mode 100644 deps/temporal/src/primitive.rs create mode 100644 deps/temporal/src/provider.rs create mode 100644 deps/temporal/src/rounding.rs create mode 100644 deps/temporal/src/sys.rs create mode 100644 deps/temporal/src/tzdb.rs create mode 100644 deps/temporal/src/utils.rs create mode 100644 deps/temporal/temporal_capi/.gitattributes create mode 100644 deps/temporal/temporal_capi/.gitignore create mode 100644 deps/temporal/temporal_capi/Cargo.toml create mode 100644 deps/temporal/temporal_capi/LICENSE-Apache create mode 100644 deps/temporal/temporal_capi/LICENSE-MIT create mode 100644 deps/temporal/temporal_capi/README.md create mode 100644 deps/temporal/temporal_capi/bindings/c/AnyCalendarKind.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/AnyCalendarKind.h create mode 100644 deps/temporal/temporal_capi/bindings/c/ArithmeticOverflow.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/ArithmeticOverflow.h create mode 100644 deps/temporal/temporal_capi/bindings/c/Calendar.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/Calendar.h create mode 100644 deps/temporal/temporal_capi/bindings/c/DateDuration.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/DateDuration.h create mode 100644 deps/temporal/temporal_capi/bindings/c/DifferenceSettings.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/DifferenceSettings.h create mode 100644 deps/temporal/temporal_capi/bindings/c/Disambiguation.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/Disambiguation.h create mode 100644 deps/temporal/temporal_capi/bindings/c/DisplayCalendar.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/DisplayCalendar.h create mode 100644 deps/temporal/temporal_capi/bindings/c/DisplayOffset.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/DisplayOffset.h create mode 100644 deps/temporal/temporal_capi/bindings/c/DisplayTimeZone.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/DisplayTimeZone.h create mode 100644 deps/temporal/temporal_capi/bindings/c/Duration.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/Duration.h create mode 100644 deps/temporal/temporal_capi/bindings/c/ErrorKind.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/ErrorKind.h create mode 100644 deps/temporal/temporal_capi/bindings/c/I128Nanoseconds.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/I128Nanoseconds.h create mode 100644 deps/temporal/temporal_capi/bindings/c/Instant.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/Instant.h create mode 100644 deps/temporal/temporal_capi/bindings/c/OffsetDisambiguation.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/OffsetDisambiguation.h create mode 100644 deps/temporal/temporal_capi/bindings/c/OwnedRelativeTo.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/OwnedRelativeTo.h create mode 100644 deps/temporal/temporal_capi/bindings/c/ParsedDate.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/ParsedDate.h create mode 100644 deps/temporal/temporal_capi/bindings/c/ParsedDateTime.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/ParsedDateTime.h create mode 100644 deps/temporal/temporal_capi/bindings/c/ParsedZonedDateTime.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/ParsedZonedDateTime.h create mode 100644 deps/temporal/temporal_capi/bindings/c/PartialDate.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/PartialDate.h create mode 100644 deps/temporal/temporal_capi/bindings/c/PartialDateTime.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/PartialDateTime.h create mode 100644 deps/temporal/temporal_capi/bindings/c/PartialDuration.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/PartialDuration.h create mode 100644 deps/temporal/temporal_capi/bindings/c/PartialTime.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/PartialTime.h create mode 100644 deps/temporal/temporal_capi/bindings/c/PartialZonedDateTime.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/PartialZonedDateTime.h create mode 100644 deps/temporal/temporal_capi/bindings/c/PlainDate.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/PlainDate.h create mode 100644 deps/temporal/temporal_capi/bindings/c/PlainDateTime.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/PlainDateTime.h create mode 100644 deps/temporal/temporal_capi/bindings/c/PlainMonthDay.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/PlainMonthDay.h create mode 100644 deps/temporal/temporal_capi/bindings/c/PlainTime.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/PlainTime.h create mode 100644 deps/temporal/temporal_capi/bindings/c/PlainYearMonth.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/PlainYearMonth.h create mode 100644 deps/temporal/temporal_capi/bindings/c/Precision.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/Precision.h create mode 100644 deps/temporal/temporal_capi/bindings/c/Provider.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/Provider.h create mode 100644 deps/temporal/temporal_capi/bindings/c/RelativeTo.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/RelativeTo.h create mode 100644 deps/temporal/temporal_capi/bindings/c/RoundingMode.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/RoundingMode.h create mode 100644 deps/temporal/temporal_capi/bindings/c/RoundingOptions.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/RoundingOptions.h create mode 100644 deps/temporal/temporal_capi/bindings/c/Sign.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/Sign.h create mode 100644 deps/temporal/temporal_capi/bindings/c/TemporalError.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/TemporalError.h create mode 100644 deps/temporal/temporal_capi/bindings/c/TimeZone.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/TimeZone.h create mode 100644 deps/temporal/temporal_capi/bindings/c/ToStringRoundingOptions.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/ToStringRoundingOptions.h create mode 100644 deps/temporal/temporal_capi/bindings/c/TransitionDirection.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/TransitionDirection.h create mode 100644 deps/temporal/temporal_capi/bindings/c/Unit.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/Unit.h create mode 100644 deps/temporal/temporal_capi/bindings/c/UnsignedRoundingMode.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/UnsignedRoundingMode.h create mode 100644 deps/temporal/temporal_capi/bindings/c/ZonedDateTime.d.h create mode 100644 deps/temporal/temporal_capi/bindings/c/ZonedDateTime.h create mode 100644 deps/temporal/temporal_capi/bindings/c/diplomat_runtime.h create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/AnyCalendarKind.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/AnyCalendarKind.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ArithmeticOverflow.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ArithmeticOverflow.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Calendar.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Calendar.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DateDuration.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DateDuration.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DifferenceSettings.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DifferenceSettings.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Disambiguation.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Disambiguation.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DisplayCalendar.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DisplayCalendar.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DisplayOffset.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DisplayOffset.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DisplayTimeZone.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DisplayTimeZone.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Duration.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Duration.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ErrorKind.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ErrorKind.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/I128Nanoseconds.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/I128Nanoseconds.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Instant.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Instant.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/OffsetDisambiguation.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/OffsetDisambiguation.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/OwnedRelativeTo.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/OwnedRelativeTo.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ParsedDate.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ParsedDate.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ParsedDateTime.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ParsedDateTime.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ParsedZonedDateTime.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ParsedZonedDateTime.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialDate.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialDate.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialDateTime.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialDateTime.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialDuration.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialDuration.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialTime.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialTime.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialZonedDateTime.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialZonedDateTime.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainDate.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainDate.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainDateTime.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainDateTime.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainMonthDay.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainMonthDay.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainTime.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainTime.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainYearMonth.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainYearMonth.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Precision.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Precision.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Provider.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Provider.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/RelativeTo.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/RelativeTo.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/RoundingMode.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/RoundingMode.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/RoundingOptions.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/RoundingOptions.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Sign.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Sign.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/TemporalError.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/TemporalError.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/TimeZone.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/TimeZone.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ToStringRoundingOptions.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ToStringRoundingOptions.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/TransitionDirection.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/TransitionDirection.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Unit.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Unit.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/UnsignedRoundingMode.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/UnsignedRoundingMode.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ZonedDateTime.d.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ZonedDateTime.hpp create mode 100644 deps/temporal/temporal_capi/bindings/cpp/temporal_rs/diplomat_runtime.hpp create mode 100644 deps/temporal/temporal_capi/src/calendar.rs create mode 100644 deps/temporal/temporal_capi/src/duration.rs create mode 100644 deps/temporal/temporal_capi/src/error.rs create mode 100644 deps/temporal/temporal_capi/src/instant.rs create mode 100644 deps/temporal/temporal_capi/src/lib.rs create mode 100644 deps/temporal/temporal_capi/src/options.rs create mode 100644 deps/temporal/temporal_capi/src/plain_date.rs create mode 100644 deps/temporal/temporal_capi/src/plain_date_time.rs create mode 100644 deps/temporal/temporal_capi/src/plain_month_day.rs create mode 100644 deps/temporal/temporal_capi/src/plain_time.rs create mode 100644 deps/temporal/temporal_capi/src/plain_year_month.rs create mode 100644 deps/temporal/temporal_capi/src/provider.rs create mode 100644 deps/temporal/temporal_capi/src/time_zone.rs create mode 100644 deps/temporal/temporal_capi/src/zoned_date_time.rs create mode 100644 deps/temporal/temporal_capi/tests/c/Makefile create mode 100644 deps/temporal/temporal_capi/tests/c/simple.c create mode 100644 deps/temporal/temporal_capi/tests/cpp/Makefile create mode 100644 deps/temporal/temporal_capi/tests/cpp/simple.cpp create mode 100644 deps/temporal/tools/README.md create mode 100644 deps/temporal/tools/bakeddata/Cargo.toml create mode 100644 deps/temporal/tools/bakeddata/README.md create mode 100644 deps/temporal/tools/bakeddata/src/main.rs create mode 100644 deps/temporal/tools/depcheck/Cargo.toml create mode 100644 deps/temporal/tools/depcheck/src/main.rs create mode 100644 deps/temporal/tools/diplomat-gen/Cargo.toml create mode 100644 deps/temporal/tools/diplomat-gen/src/main.rs create mode 100644 deps/temporal/tools/tzif-inspect/Cargo.toml create mode 100644 deps/temporal/tools/tzif-inspect/README.md create mode 100644 deps/temporal/tools/tzif-inspect/src/main.rs create mode 100644 deps/temporal/tools/zoneinfo-test-gen/Cargo.toml create mode 100644 deps/temporal/tools/zoneinfo-test-gen/README.md create mode 100644 deps/temporal/tools/zoneinfo-test-gen/src/main.rs create mode 100644 deps/temporal/zoneinfo/Cargo.toml create mode 100644 deps/temporal/zoneinfo/README.md create mode 100644 deps/temporal/zoneinfo/src/compiler.rs create mode 100644 deps/temporal/zoneinfo/src/lib.rs create mode 100644 deps/temporal/zoneinfo/src/parser.rs create mode 100644 deps/temporal/zoneinfo/src/posix.rs create mode 100644 deps/temporal/zoneinfo/src/rule.rs create mode 100644 deps/temporal/zoneinfo/src/types.rs create mode 100644 deps/temporal/zoneinfo/src/tzif.rs create mode 100644 deps/temporal/zoneinfo/src/utils.rs create mode 100644 deps/temporal/zoneinfo/src/zone.rs create mode 100644 deps/temporal/zoneinfo/tests/data/america-anchorage.json create mode 100644 deps/temporal/zoneinfo/tests/data/america-chicago.json create mode 100644 deps/temporal/zoneinfo/tests/data/america-new_york.json create mode 100644 deps/temporal/zoneinfo/tests/data/antarctica-troll.json create mode 100644 deps/temporal/zoneinfo/tests/data/australia-lord_howe.json create mode 100644 deps/temporal/zoneinfo/tests/data/australia-sydney.json create mode 100644 deps/temporal/zoneinfo/tests/data/europe-berlin.json create mode 100644 deps/temporal/zoneinfo/tests/data/europe-dublin.json create mode 100644 deps/temporal/zoneinfo/tests/data/europe-london.json create mode 100644 deps/temporal/zoneinfo/tests/data/europe-paris.json create mode 100644 deps/temporal/zoneinfo/tests/data/europe-riga.json create mode 100644 deps/temporal/zoneinfo/tests/data/rearguard/europe-dublin.json create mode 100644 deps/temporal/zoneinfo/tests/posix.rs create mode 100644 deps/temporal/zoneinfo/tests/test_datagen.rs create mode 100644 deps/temporal/zoneinfo/tests/zoneinfo diff --git a/deps/temporal/.cargo/config.toml b/deps/temporal/.cargo/config.toml new file mode 100644 index 00000000000000..48f9d0156e7f95 --- /dev/null +++ b/deps/temporal/.cargo/config.toml @@ -0,0 +1,3 @@ +# TODO: track https://github.com/rust-lang/rust/issues/141626 for a resolution +[target.x86_64-pc-windows-msvc] +rustflags = ['-Csymbol-mangling-version=v0'] diff --git a/deps/temporal/.gitignore b/deps/temporal/.gitignore new file mode 100644 index 00000000000000..2c356aa230627a --- /dev/null +++ b/deps/temporal/.gitignore @@ -0,0 +1,23 @@ +# Generated by Cargo +# will have compiled files and executables +debug/ +target/ +tzdata/ + +# Include the data debug view +!/provider/src/data/debug + +# These are backup files generated by rustfmt +**/*.rs.bk + +# MSVC Windows builds of rustc generate these, which store debugging information +*.pdb + +.vscode/ + +# Ignore log files +*.log + +# Ignore clangd files +.cache +compile_commands.json diff --git a/deps/temporal/CHANGELOG.md b/deps/temporal/CHANGELOG.md new file mode 100644 index 00000000000000..a56cfdfaaaf900 --- /dev/null +++ b/deps/temporal/CHANGELOG.md @@ -0,0 +1,484 @@ +## What's Changed in v0.1.0 +* Update Diplomat to 0.13.0 by @Manishearth in [#588](https://github.com/boa-dev/temporal/pull/588) +* Add TryFrom for PartialDuration to Duration by @nekevss in [#585](https://github.com/boa-dev/temporal/pull/585) +* Add missing from_epoch_nanoseconds() FFI by @linusg in [#584](https://github.com/boa-dev/temporal/pull/584) +* Add from_nanoseconds to FFI PlainDateTime by @nekevss in [#583](https://github.com/boa-dev/temporal/pull/583) +* Update diplomat to using cpp lib name by @Manishearth in [#581](https://github.com/boa-dev/temporal/pull/581) +* Fix TimeZone::get_possible_epoch_ns at date-time limits by @ptomato in [#580](https://github.com/boa-dev/temporal/pull/580) +* Rename timezone.rs to time_zone.rs by @nekevss in [#574](https://github.com/boa-dev/temporal/pull/574) +* General updates to temporal_rs's exports and docs by @nekevss in [#575](https://github.com/boa-dev/temporal/pull/575) +* Review Instant API + Duration by @nekevss in [#573](https://github.com/boa-dev/temporal/pull/573) +* Make TimeZone no longer allocate over FFI by @Manishearth in [#572](https://github.com/boa-dev/temporal/pull/572) +* Update the library introduction and README for timezone_provider by @nekevss in [#570](https://github.com/boa-dev/temporal/pull/570) +* Add a minimal README for zoneinfo_rs by @nekevss in [#569](https://github.com/boa-dev/temporal/pull/569) +* Remove passing lint allows by @Manishearth in [#571](https://github.com/boa-dev/temporal/pull/571) +* Updates to PlainYearMonth and PlainMonthDay based on review by @nekevss in [#567](https://github.com/boa-dev/temporal/pull/567) +* Update library introduction documentation and the project README.md by @nekevss in [#564](https://github.com/boa-dev/temporal/pull/564) +* Updates to PlainTime API based on review by @nekevss in [#565](https://github.com/boa-dev/temporal/pull/565) +* Make ISO getters crate private by @nekevss in [#568](https://github.com/boa-dev/temporal/pull/568) +* Handle und month codes by @Manishearth in [#563](https://github.com/boa-dev/temporal/pull/563) +* Update `ZonedDateTime` constructors by @nekevss in [#562](https://github.com/boa-dev/temporal/pull/562) +* Review and update PlainDate and PlainDateTime API by @nekevss in [#561](https://github.com/boa-dev/temporal/pull/561) +* Refactor Now to be trait based for lazy host getters by @nekevss in [#560](https://github.com/boa-dev/temporal/pull/560) +* Fix comment and organization of TimeZone::zero by @Manishearth in [#559](https://github.com/boa-dev/temporal/pull/559) +* Update ZonedDateTime module and API by @nekevss in [#557](https://github.com/boa-dev/temporal/pull/557) +* Remove yoke dep from temporal_capi by @Manishearth in [#556](https://github.com/boa-dev/temporal/pull/556) + +## New Contributors +* @ptomato made their first contribution in [#580](https://github.com/boa-dev/temporal/pull/580) + +**Full Changelog**: https://github.com/boa-dev/temporal/compare/v0.0.16...v0.1.0 + +# Changelog + +All notable changes to this project will be documented in this file. + +## What's Changed in v0.0.16 +* Bump versions to 0.0.16 +* Remove extraneous icu_time dependency +* Add TimeZone::zero() to capi by @Manishearth in [#554](https://github.com/boa-dev/temporal/pull/554) + +**Full Changelog**: https://github.com/boa-dev/temporal/compare/v0.0.15...v0.0.16 + +## What's Changed in v0.0.15 +* Bump versions +* Update zoneinfo64 by @Manishearth in [#552](https://github.com/boa-dev/temporal/pull/552) +* Remove Default impl from TimeZone; use utc() everywhere by @Manishearth in [#551](https://github.com/boa-dev/temporal/pull/551) +* Add missing header files by @Manishearth in [#550](https://github.com/boa-dev/temporal/pull/550) +* Add provider APIs to capi by @Manishearth in [#544](https://github.com/boa-dev/temporal/pull/544) +* Add new unit validation code by @Manishearth in [#542](https://github.com/boa-dev/temporal/pull/542) +* Add calendar consts for calendar construction by @nekevss in [#541](https://github.com/boa-dev/temporal/pull/541) +* Remove some unreachables by @Manishearth in [#543](https://github.com/boa-dev/temporal/pull/543) +* Move timezone tests to testing against multiple providers by @Manishearth in [#539](https://github.com/boa-dev/temporal/pull/539) +* Move TimeZone over to being Copy with TimeZoneId by @Manishearth in [#538](https://github.com/boa-dev/temporal/pull/538) +* Split TimeZoneProvider trait by @Manishearth in [#537](https://github.com/boa-dev/temporal/pull/537) +* Update compiled tzif data provider data by @nekevss in [#535](https://github.com/boa-dev/temporal/pull/535) +* Add zoneinfo64 support to temporal_provider by @Manishearth in [#533](https://github.com/boa-dev/temporal/pull/533) +* Update zoneinfo compilation in zoneinfo crate by @nekevss in [#532](https://github.com/boa-dev/temporal/pull/532) +* Complete some cleanup options module by @nekevss in [#531](https://github.com/boa-dev/temporal/pull/531) +* Make errors Copy by @Manishearth in [#528](https://github.com/boa-dev/temporal/pull/528) +* More saturating arithmetic by @Manishearth in [#527](https://github.com/boa-dev/temporal/pull/527) +* Move TimeZoneProvider to timezone_provider crate by @Manishearth in [#526](https://github.com/boa-dev/temporal/pull/526) +* Clean up TimeZoneProvider crate by @Manishearth in [#525](https://github.com/boa-dev/temporal/pull/525) + +**Full Changelog**: https://github.com/boa-dev/temporal/compare/v0.0.14...v0.0.15 + +## What's Changed in v0.0.14 +* Release 0.0.14 +* Fix validity checks by @Manishearth in [#523](https://github.com/boa-dev/temporal/pull/523) + +**Full Changelog**: https://github.com/boa-dev/temporal/compare/v0.0.13...v0.0.14 + +## What's Changed in v0.0.13 +* Bump versions to 0.13 +* Add validity checks on parse by @Manishearth in [#517](https://github.com/boa-dev/temporal/pull/517) +* Use correct cached offset when rounding ZDTs by @Manishearth in [#520](https://github.com/boa-dev/temporal/pull/520) +* Clamp unit indices before checking table by @Manishearth in [#516](https://github.com/boa-dev/temporal/pull/516) +* Check that year values are in safe arithmetical range by @Manishearth in [#513](https://github.com/boa-dev/temporal/pull/513) +* Use correct sign value in nudge code by @Manishearth in [#514](https://github.com/boa-dev/temporal/pull/514) +* Support fractional hour values in hoursInDay by @Manishearth in [#515](https://github.com/boa-dev/temporal/pull/515) +* Cache offsets on ZDT by @Manishearth in [#510](https://github.com/boa-dev/temporal/pull/510) +* Update duration to unsigned fields + specification updates by @nekevss in [#507](https://github.com/boa-dev/temporal/pull/507) +* Reduce (and lint-disallow) panics in main code by @Manishearth in [#506](https://github.com/boa-dev/temporal/pull/506) +* Further normalize MWDs, add Vancouver and Santiago tests by @Manishearth in [#504](https://github.com/boa-dev/temporal/pull/504) +* Duration rounding: is_date_unit(), not is_calendar_unit() by @Manishearth in [#503](https://github.com/boa-dev/temporal/pull/503) +* Use beyondDaySpan in NudgeToZonedDateTime by @Manishearth in [#501](https://github.com/boa-dev/temporal/pull/501) +* Remove use of unsafe from the main crate by @Manishearth in [#502](https://github.com/boa-dev/temporal/pull/502) +* Simplify calendar API over FFI by @Manishearth in [#498](https://github.com/boa-dev/temporal/pull/498) +* Handle week=5 MWD cases in posix TZ strings by @Manishearth in [#499](https://github.com/boa-dev/temporal/pull/499) +* Exclude tzif files from publish by @Manishearth in [#495](https://github.com/boa-dev/temporal/pull/495) + +**Full Changelog**: https://github.com/boa-dev/temporal/compare/v0.0.12...v0.0.13 + +## What's Changed in v0.0.12 +* Bump versions +* cleanup: Remove parsing functionality from PartialZDT by @Manishearth in [#493](https://github.com/boa-dev/temporal/pull/493) +* Various MonthDay fixes by @Manishearth in [#492](https://github.com/boa-dev/temporal/pull/492) +* Add `CalendarFields` concept and integate it with API and Partial structs by @nekevss in [#487](https://github.com/boa-dev/temporal/pull/487) +* Add support for non-ISO yearmonths and monthdays by @Manishearth in [#490](https://github.com/boa-dev/temporal/pull/490) +* Add separate parsed variants of all types by @Manishearth in [#486](https://github.com/boa-dev/temporal/pull/486) +* Update icu_calendar, fix self-consistency test by @Manishearth in [#488](https://github.com/boa-dev/temporal/pull/488) +* Add builder pattern `with_xxx` methods for PartialDuration by @nekevss in [#485](https://github.com/boa-dev/temporal/pull/485) +* Add CalendarFieldKeysToIgnore by @Manishearth in [#484](https://github.com/boa-dev/temporal/pull/484) +* Reuse ZDT parsing logic from PartialZDT by @Manishearth in [#483](https://github.com/boa-dev/temporal/pull/483) +* Fix hours in day calculation around gap transitions by @Manishearth in [#482](https://github.com/boa-dev/temporal/pull/482) +* Generate the baked zone info data for ZoneInfoProvider by @nekevss in [#264](https://github.com/boa-dev/temporal/pull/264) +* Precompute before/after offsets and use in disambiguate_possible_epoch_nanos by @Manishearth in [#479](https://github.com/boa-dev/temporal/pull/479) +* Add tzif-inspect tool for inspecting tzif data by @Manishearth in [#480](https://github.com/boa-dev/temporal/pull/480) +* Fix behavior of ns-to-seconds casting for negative values by @Manishearth in [#475](https://github.com/boa-dev/temporal/pull/475) +* Fix panics from calling abs on i64::MIN by @nekevss in [#474](https://github.com/boa-dev/temporal/pull/474) +* Implement get_named_tzdb_transition by @Manishearth in [#472](https://github.com/boa-dev/temporal/pull/472) +* Use ISO day of week unconditionally by @Manishearth in [#471](https://github.com/boa-dev/temporal/pull/471) +* Fix overflow when validating Duration by @nekevss in [#470](https://github.com/boa-dev/temporal/pull/470) +* Rewrite v2_estimate_tz_pair to compare local timestamps by @Manishearth in [#468](https://github.com/boa-dev/temporal/pull/468) +* Normalize, don't canonicalize time zones by @Manishearth in [#466](https://github.com/boa-dev/temporal/pull/466) +* Normalize UTC to UTC by @Manishearth in [#463](https://github.com/boa-dev/temporal/pull/463) +* Ensure that the correct year-month is range-checked during diff operations by @Manishearth in [#461](https://github.com/boa-dev/temporal/pull/461) +* Correctly handle matchBehavior for sub-minute offset strings by @Manishearth in [#462](https://github.com/boa-dev/temporal/pull/462) +* Correctly normalize timezones by @Manishearth in [#460](https://github.com/boa-dev/temporal/pull/460) +* Fix posix logic that was causing panics by @nekevss in [#459](https://github.com/boa-dev/temporal/pull/459) +* Fix float precision check by @Manishearth in [#457](https://github.com/boa-dev/temporal/pull/457) +* CalendarDateAdd takes DateDurations, not full Durations by @Manishearth in [#453](https://github.com/boa-dev/temporal/pull/453) +* Check validity where requested by the spec by @Manishearth in [#456](https://github.com/boa-dev/temporal/pull/456) +* Add .clone() to FFI, YearMonth::reference_day by @Manishearth in [#454](https://github.com/boa-dev/temporal/pull/454) +* Move nanoseconds-validity checking to being explicit by @Manishearth in [#452](https://github.com/boa-dev/temporal/pull/452) +* Add debug impl for error message by @Manishearth in [#451](https://github.com/boa-dev/temporal/pull/451) +* Rename ffi epoch_ns_for to epoch_ms_for by @Manishearth in [#443](https://github.com/boa-dev/temporal/pull/443) +* Fix panic in tzdb logic by @nekevss in [#441](https://github.com/boa-dev/temporal/pull/441) +* Support RoundNumberToIncrementAsIfPositive by @Manishearth in [#440](https://github.com/boa-dev/temporal/pull/440) +* Support sub-minute offsets in UTCOffset by @Manishearth in [#437](https://github.com/boa-dev/temporal/pull/437) +* Fix bug in `to_zoned_date_time_with_provider` by @nekevss in [#436](https://github.com/boa-dev/temporal/pull/436) +* Ensure dates are in limits after performing arithmetic by @Manishearth in [#435](https://github.com/boa-dev/temporal/pull/435) +* YearMonth::compare should compare ISO days by @Manishearth in [#433](https://github.com/boa-dev/temporal/pull/433) +* toPlainDate should use CONSTRAIN by @Manishearth in [#430](https://github.com/boa-dev/temporal/pull/430) + +**Full Changelog**: https://github.com/boa-dev/temporal/compare/v0.0.11...v0.0.12 + +## What's Changed in v0.0.11 +* Add PartialZonedDateTime::try_from_str by @Manishearth in [#420](https://github.com/boa-dev/temporal/pull/420) +* Add from_partial for YearMonth/MonthDay FFI by @Manishearth in [#351](https://github.com/boa-dev/temporal/pull/351) +* Throw error if given more than 9 duration digits by @Manishearth in [#425](https://github.com/boa-dev/temporal/pull/425) +* Fix up eras, correctly expose arithmetic year by @Manishearth in [#424](https://github.com/boa-dev/temporal/pull/424) +* Add time zone normalization by @Manishearth in [#415](https://github.com/boa-dev/temporal/pull/415) +* Allow adding date durations to PlainTime by @Manishearth in [#421](https://github.com/boa-dev/temporal/pull/421) +* Parse both zoned and unzoned date times in relativeTo by @Manishearth in [#422](https://github.com/boa-dev/temporal/pull/422) +* Add get_epoch_ns_for on YearMonth/MonthDay by @Manishearth in [#414](https://github.com/boa-dev/temporal/pull/414) +* Don't set None time in ZDT::from_partial by @Manishearth in [#416](https://github.com/boa-dev/temporal/pull/416) +* [capi] Add from_utf8/from_utf16 for OwnedRelativeTo by @Manishearth in [#375](https://github.com/boa-dev/temporal/pull/375) +* Forbid MonthDay/YearMonth formats for non-iso by @Manishearth in [#413](https://github.com/boa-dev/temporal/pull/413) +* Use track_caller in assertion errors by @Manishearth in [#417](https://github.com/boa-dev/temporal/pull/417) +* Properly respect overflow options when performing with_fallback_date/time by @Manishearth in [#407](https://github.com/boa-dev/temporal/pull/407) +* Add TimeZone::utc() to FFI by @Manishearth in [#358](https://github.com/boa-dev/temporal/pull/358) +* Add POSIX time zone string support to zoneinfo by @nekevss in [#265](https://github.com/boa-dev/temporal/pull/265) +* Fix duration validity check by @Manishearth in [#411](https://github.com/boa-dev/temporal/pull/411) +* Produce correct error types for invalid month/era codes by @Manishearth in [#405](https://github.com/boa-dev/temporal/pull/405) +* Add support for offsetBehavior == WALL by @Manishearth in [#404](https://github.com/boa-dev/temporal/pull/404) +* Update README.md - mention other usages of lib by @jasonwilliams in [#401](https://github.com/boa-dev/temporal/pull/401) +* Make TimeZone::identifier() infallible by @linusg in [#399](https://github.com/boa-dev/temporal/pull/399) +* Fix the bakedata provider path by @nekevss in [#398](https://github.com/boa-dev/temporal/pull/398) +* Include time duration in InternalDurationSign by @Manishearth in [#397](https://github.com/boa-dev/temporal/pull/397) +* Use rounded instant in ZDT::toString by @Manishearth in [#396](https://github.com/boa-dev/temporal/pull/396) +* Fix hoursInDay division constant by @nekevss in [#395](https://github.com/boa-dev/temporal/pull/395) +* Expose ParseTemporalCalendarString over FFI by @Manishearth in [#390](https://github.com/boa-dev/temporal/pull/390) +* Remove UTC designator check from time zone parsing by @nekevss in [#392](https://github.com/boa-dev/temporal/pull/392) +* Update ixdtf to icu4x main git branch by @robot-head in [#365](https://github.com/boa-dev/temporal/pull/365) +* Fix `9.5.8 AddDurationToYearMonth` abstract method by @HalidOdat in [#389](https://github.com/boa-dev/temporal/pull/389) +* Fix ZonedDateTime::nanosecond by @Manishearth in [#388](https://github.com/boa-dev/temporal/pull/388) +* Allow datetime strings for YearMonth/MonthDay/Time by @Manishearth in [#386](https://github.com/boa-dev/temporal/pull/386) +* Remove orgs/boa-dev/people from links by @nekevss in [#387](https://github.com/boa-dev/temporal/pull/387) +* Update maintainers in README.md by @jasonwilliams in [#384](https://github.com/boa-dev/temporal/pull/384) +* Re-add try_from_offset_str by @Manishearth in [#376](https://github.com/boa-dev/temporal/pull/376) +* Fix clippy lints for Rust 1.88 by @nekevss in [#377](https://github.com/boa-dev/temporal/pull/377) + +## New Contributors +* @linusg made their first contribution in [#399](https://github.com/boa-dev/temporal/pull/399) + +**Full Changelog**: https://github.com/boa-dev/temporal/compare/v0.0.10...v0.0.11 + +## What's Changed in v0.0.10 +* Add documentation and doctests for builtins by @blarfoon in [#360](https://github.com/boa-dev/temporal/pull/360) +* More error enums by @Manishearth in [#373](https://github.com/boa-dev/temporal/pull/373) +* [capi] Add stringifier/cloning to timezones by @Manishearth in [#344](https://github.com/boa-dev/temporal/pull/344) +* Handle unknown timezone identifiers in FsTzdbProvider by @Manishearth in [#345](https://github.com/boa-dev/temporal/pull/345) +* [capi] Fix i128Nanoseconds by @Manishearth in [#372](https://github.com/boa-dev/temporal/pull/372) +* [capi] expose error strings by @Manishearth in [#364](https://github.com/boa-dev/temporal/pull/364) +* Consolidate tools into a single `tool` directory by @nekevss in [#368](https://github.com/boa-dev/temporal/pull/368) +* Add a new PartialYearMonth to available partial structs (#288) by @robot-head in [#342](https://github.com/boa-dev/temporal/pull/342) +* Implement zoneinfo parsing/compilation and add TZif structs by @nekevss in [#257](https://github.com/boa-dev/temporal/pull/257) +* Add ErrorMessage enum, start using it by @Manishearth in [#355](https://github.com/boa-dev/temporal/pull/355) +* [capi] Add is_valid() to I128Nanoseconds by @Manishearth in [#363](https://github.com/boa-dev/temporal/pull/363) +* [capi] Add ZonedDateTime::{equals,offset} by @Manishearth in [#362](https://github.com/boa-dev/temporal/pull/362) +* Add convenience methods for constructing FFI datetime types from milliseconds by @Manishearth in [#359](https://github.com/boa-dev/temporal/pull/359) +* [capi] Add offset_nanoseconds() to ZDT FFI by @Manishearth in [#361](https://github.com/boa-dev/temporal/pull/361) +* Update diplomat by @Manishearth in [#357](https://github.com/boa-dev/temporal/pull/357) +* Stop depending on `is_dst` for calculations by @jedel1043 in [#356](https://github.com/boa-dev/temporal/pull/356) +* Add some FAQ style docs for temporal_rs by @nekevss in [#350](https://github.com/boa-dev/temporal/pull/350) +* Add try_from_offset_str ctor for TimeZone by @Manishearth in [#348](https://github.com/boa-dev/temporal/pull/348) +* Switch compiled_data APIs to new CompiledTzdbProvider by @Manishearth in [#346](https://github.com/boa-dev/temporal/pull/346) + +## New Contributors +* @blarfoon made their first contribution in [#360](https://github.com/boa-dev/temporal/pull/360) + +**Full Changelog**: https://github.com/boa-dev/temporal/compare/v0.0.9...v0.0.10 + +## What's Changed in v0.0.9 +* Cross boundary rounding fix #286 by @robot-head in [#343](https://github.com/boa-dev/temporal/pull/343) +* Implement PlainMonthDay::with functionality by @nekevss in [#335](https://github.com/boa-dev/temporal/pull/335) +* Add Writeable getters for some types, use in FFI by @Manishearth in [#340](https://github.com/boa-dev/temporal/pull/340) +* Add missing FFI APIs by @Manishearth in [#339](https://github.com/boa-dev/temporal/pull/339) +* Fill in missing Zoned APIs by @Manishearth in [#331](https://github.com/boa-dev/temporal/pull/331) +* Add stringifiers to MonthDay/YearMonth by @Manishearth in [#338](https://github.com/boa-dev/temporal/pull/338) +* Use AnyCalendarKind in PartialDate by @Manishearth in [#332](https://github.com/boa-dev/temporal/pull/332) +* Add ZonedDateTime FFI by @Manishearth in [#329](https://github.com/boa-dev/temporal/pull/329) +* Use a lock internally to FsTzdbProvider instead of externally by @Manishearth in [#327](https://github.com/boa-dev/temporal/pull/327) +* Remove create() APIs, consistently use try_new() by @Manishearth in [#326](https://github.com/boa-dev/temporal/pull/326) +* Switch FFI calendar APIs over to using AnyCalendarKind for input by @Manishearth in [#324](https://github.com/boa-dev/temporal/pull/324) +* Update abstract method `7.5.37 RoundRelativeDuration` by @HalidOdat in [#323](https://github.com/boa-dev/temporal/pull/323) +* Fix abstract method `7.5.36 BubbleRelativeDuration()` by @HalidOdat in [#322](https://github.com/boa-dev/temporal/pull/322) +* Generate FFI bindings for C by @jedel1043 in [#321](https://github.com/boa-dev/temporal/pull/321) +* Improve baked data formatting by @Manishearth in [#319](https://github.com/boa-dev/temporal/pull/319) +* Correctly validate largestUnit when constructing from DifferenceSettings by @Manishearth in [#316](https://github.com/boa-dev/temporal/pull/316) +* Align `Duration.prototype.round()` to latest specification by @HalidOdat in [#317](https://github.com/boa-dev/temporal/pull/317) + +**Full Changelog**: https://github.com/boa-dev/temporal/compare/v0.0.8...v0.0.9 + +## What's Changed in v0.0.8 +* Make duration capi getters non-optional by @Manishearth in [#314](https://github.com/boa-dev/temporal/pull/314) +* Add to_string to Duration by @Manishearth in [#312](https://github.com/boa-dev/temporal/pull/312) +* Add comparison methods to Instant by @Manishearth in [#311](https://github.com/boa-dev/temporal/pull/311) +* Add LICENSEs to timezone_provider crate by @Manishearth in [#308](https://github.com/boa-dev/temporal/pull/308) +* Prune dependencies of timezone_provider in normal mode, add depcheck by @Manishearth in [#310](https://github.com/boa-dev/temporal/pull/310) +* Add to_plain_date to PlainMonthDay and PlainYearMonth by @HenrikTennebekk in [#287](https://github.com/boa-dev/temporal/pull/287) +* Remove exclude and readme by @nekevss in [#304](https://github.com/boa-dev/temporal/pull/304) + +**Full Changelog**: https://github.com/boa-dev/temporal/compare/v0.0.7...v0.0.8 + +## What's Changed in v0.0.7 +* Bump ixdtf and complete changes for update by @nekevss in [#299](https://github.com/boa-dev/temporal/pull/299) +* A few more changes to the readme by @nekevss in [#297](https://github.com/boa-dev/temporal/pull/297) +* Implement a builder API for Now by @nekevss in [#296](https://github.com/boa-dev/temporal/pull/296) +* Some docs cleanup and updates by @nekevss in [#294](https://github.com/boa-dev/temporal/pull/294) +* Add `PlainMonthDay` method + clean up by @nekevss in [#284](https://github.com/boa-dev/temporal/pull/284) +* Add Eq, Ord impls on FiniteF64 by @sffc in [#187](https://github.com/boa-dev/temporal/pull/187) +* Allow parsers to accept unvalidated UTF8 by @HalidOdat in [#295](https://github.com/boa-dev/temporal/pull/295) +* Bump to icu_calendar 2.0 by @nekevss in [#292](https://github.com/boa-dev/temporal/pull/292) +* Add ISO specific constructors to builtins by @nekevss in [#263](https://github.com/boa-dev/temporal/pull/263) +* Rename the provider crate by @nekevss in [#289](https://github.com/boa-dev/temporal/pull/289) +* Expose equals and compare over FFI by @Magnus-Fjeldstad in [#269](https://github.com/boa-dev/temporal/pull/269) +* Impl round_with_provider for ZonedDateTIme by @sebastianjacmatt in [#278](https://github.com/boa-dev/temporal/pull/278) +* Add some compiled_data FFI APIs by @Manishearth in [#273](https://github.com/boa-dev/temporal/pull/273) +* Add string conversion functions for Temporal types by @Manishearth in [#276](https://github.com/boa-dev/temporal/pull/276) +* Make sure temporal_capi can be built no_std by @Manishearth in [#281](https://github.com/boa-dev/temporal/pull/281) +* Make iana-time-zone dep optional by @Manishearth in [#279](https://github.com/boa-dev/temporal/pull/279) +* Implementation of ZonedDateTime.prototype.with by @lockels in [#267](https://github.com/boa-dev/temporal/pull/267) +* Update Duration's inner representation from floating point to integers. by @nekevss in [#268](https://github.com/boa-dev/temporal/pull/268) +* Add all-features = true to docs.rs metadata by @Manishearth in [#271](https://github.com/boa-dev/temporal/pull/271) +* Fix instant math in capi by @Manishearth in [#270](https://github.com/boa-dev/temporal/pull/270) +* Remove the Temporal prefix from Unit, RoundingMode, and UnsignedRoundingMode by @nekevss in [#254](https://github.com/boa-dev/temporal/pull/254) +* Since until by @sebastianjacmatt in [#259](https://github.com/boa-dev/temporal/pull/259) +* Implementation of toZonedDateTimeISO for Instant by @lockels in [#258](https://github.com/boa-dev/temporal/pull/258) +* Implement toZonedDateTime in PlainDate by @JohannesHelleve in [#192](https://github.com/boa-dev/temporal/pull/192) +* Add intro documentation to ZonedDateTime and PlainDateTime by @nekevss in [#253](https://github.com/boa-dev/temporal/pull/253) +* Implement IANA normalizer baked data provider by @nekevss in [#251](https://github.com/boa-dev/temporal/pull/251) + +## New Contributors +* @HalidOdat made their first contribution in [#295](https://github.com/boa-dev/temporal/pull/295) +* @JohannesHelleve made their first contribution in [#192](https://github.com/boa-dev/temporal/pull/192) + +**Full Changelog**: https://github.com/boa-dev/temporal/compare/v0.0.6...v0.0.7 + +## What's Changed in v0.0.6 +* Rename methods on `Now` and add a test by @nekevss in [#243](https://github.com/boa-dev/temporal/pull/243) +* Add licenses to `temporal_capi` and `temporal_rs` for publish by @nekevss in [#247](https://github.com/boa-dev/temporal/pull/247) +* Add with to PlainYearMonth by @sebastianjacmatt in [#231](https://github.com/boa-dev/temporal/pull/231) +* initial implementation of ToZonedDateTime, ToPlainDate, ToPlainTime by @lockels in [#244](https://github.com/boa-dev/temporal/pull/244) +* Initial implementation of Duration.prototype.total by @lockels in [#241](https://github.com/boa-dev/temporal/pull/241) + +**Full Changelog**: https://github.com/boa-dev/temporal/compare/v0.0.5...v0.0.6 + +## What's Changed in v0.0.5 +* Prepare temporal_capi for publish by @jedel1043 in [#238](https://github.com/boa-dev/temporal/pull/238) +* Adjustments to `toPlainYearMonth` and `toPlainMonthDay` methods on PlainDate by @nekevss in [#237](https://github.com/boa-dev/temporal/pull/237) +* Missed an unwrap in the README.md example by @nekevss in [#236](https://github.com/boa-dev/temporal/pull/236) +* Clean up API ergonomics for calendar methods by @nekevss in [#235](https://github.com/boa-dev/temporal/pull/235) +* Add various updates to docs by @nekevss in [#234](https://github.com/boa-dev/temporal/pull/234) +* Reject datetime when fraction digits are too large by @nekevss in [#229](https://github.com/boa-dev/temporal/pull/229) +* Fix not adjusting fraction for duration unit by @nekevss in [#228](https://github.com/boa-dev/temporal/pull/228) +* Fixes for `EpochNanosecond`s and `Offset` parsing by @nekevss in [#223](https://github.com/boa-dev/temporal/pull/223) +* Fix bugs around validating diffing units by @nekevss in [#225](https://github.com/boa-dev/temporal/pull/225) +* Add `UtcOffset` struct for `PartialZonedDateTime` by @nekevss in [#207](https://github.com/boa-dev/temporal/pull/207) +* Check in bindings, add CI for keeping them up to date by @Manishearth in [#220](https://github.com/boa-dev/temporal/pull/220) +* Fix `Instant::epoch_milliseconds` for values before Epoch by @nekevss in [#221](https://github.com/boa-dev/temporal/pull/221) +* Update ixdtf to 0.4.0 by @Manishearth in [#219](https://github.com/boa-dev/temporal/pull/219) +* Update icu4x to 2.0.0-beta2 by @Manishearth in [#218](https://github.com/boa-dev/temporal/pull/218) +* Add `GetNamedTimeZoneTransition` method to TimeZoneProvider trait by @nekevss in [#203](https://github.com/boa-dev/temporal/pull/203) +* Implement posix resolution for month-week-day by @jedel1043 in [#214](https://github.com/boa-dev/temporal/pull/214) +* implement utility methods on partial structs by @nekevss in [#206](https://github.com/boa-dev/temporal/pull/206) +* Test all combinations of features by @jedel1043 in [#212](https://github.com/boa-dev/temporal/pull/212) +* Reject non-iso calendar in `YearMonth::from_str` and `MonthDay::from_str` by @nekevss in [#211](https://github.com/boa-dev/temporal/pull/211) +* Fix not validating `MonthCode` in ISO path by @nekevss in [#210](https://github.com/boa-dev/temporal/pull/210) +* Integrate `MonthCode` into public API and related adjustments by @nekevss in [#208](https://github.com/boa-dev/temporal/pull/208) +* Implement the remaining non-ISO calendar method calls by @nekevss in [#209](https://github.com/boa-dev/temporal/pull/209) +* PlainYearMonth parsing and Calendar field resolution cleanup/fixes by @nekevss in [#205](https://github.com/boa-dev/temporal/pull/205) +* Build out stubs for remaining unimplemented methods by @nekevss in [#202](https://github.com/boa-dev/temporal/pull/202) +* Fix clippy lints by @nekevss in [#201](https://github.com/boa-dev/temporal/pull/201) +* Temporal duration compare by @sffc, @lockels, @Neelzee, @sebastianjacmatt, @Magnus-Fjeldstad and @HenrikTennebekk. in [#186](https://github.com/boa-dev/temporal/pull/186) +* Fix issues with `from_partial` method implementations by @nekevss in [#200](https://github.com/boa-dev/temporal/pull/200) +* More FFI: Finish Calendar, add Instant by @Manishearth in [#198](https://github.com/boa-dev/temporal/pull/198) +* Fix parsing bugs related to UTC Designator usage by @nekevss in [#197](https://github.com/boa-dev/temporal/pull/197) +* Update time parsing to error on dup critical calendars by @nekevss in [#196](https://github.com/boa-dev/temporal/pull/196) +* Update unit group validation to handle rounding options by @nekevss in [#194](https://github.com/boa-dev/temporal/pull/194) +* Fix handling of leap seconds in parsing by @nekevss in [#195](https://github.com/boa-dev/temporal/pull/195) +* Update time zone parsing to include other ixdtf formats by @nekevss in [#193](https://github.com/boa-dev/temporal/pull/193) +* Fix calendar parsing on `from_str` implementation by @nekevss in [#191](https://github.com/boa-dev/temporal/pull/191) +* Cleanup `Now` API in favor of system defined implementations by @nekevss in [#182](https://github.com/boa-dev/temporal/pull/182) +* Reimplement Unit Group with different approach by @nekevss in [#183](https://github.com/boa-dev/temporal/pull/183) +* Implement `ZonedDateTime::offset` and `ZonedDateTime::offset_nanoseconds` by @nekevss in [#185](https://github.com/boa-dev/temporal/pull/185) +* Small API cleanup and a couple dev docs updates by @nekevss in [#190](https://github.com/boa-dev/temporal/pull/190) +* Add Eq and Ord for PlainYearMonth + Eq for PlainMonthDay by @nekevss in [#175](https://github.com/boa-dev/temporal/pull/175) +* More FFI APIs by @Manishearth in [#178](https://github.com/boa-dev/temporal/pull/178) +* Fix the typo that's returning milliseconds instead of microseconds by @nekevss in [#184](https://github.com/boa-dev/temporal/pull/184) +* Add some FFI tests by @Manishearth in [#179](https://github.com/boa-dev/temporal/pull/179) +* Fix Instant parsing by handling order of operations and properly balance `IsoDateTime` by @nekevss in [#174](https://github.com/boa-dev/temporal/pull/174) +* Add some testing / debugging docs by @nekevss in [#176](https://github.com/boa-dev/temporal/pull/176) +* Fix logic on asserting is_time_duration by @nekevss in [#177](https://github.com/boa-dev/temporal/pull/177) +* Rework library restructure to remove wrapper types by @nekevss in [#181](https://github.com/boa-dev/temporal/pull/181) +* Restructure project to separate core provider APIs from non-provider APIs by @nekevss in [#169](https://github.com/boa-dev/temporal/pull/169) +* Fix `Duration` parsing not returning a range error. by @nekevss in [#173](https://github.com/boa-dev/temporal/pull/173) +* Set up basic diplomat workflow by @Manishearth in [#163](https://github.com/boa-dev/temporal/pull/163) +* Implement Neri-Schneider calculations by @nekevss in [#147](https://github.com/boa-dev/temporal/pull/147) +* Remove `UnitGroup` addition by @nekevss in [#171](https://github.com/boa-dev/temporal/pull/171) +* Implement `ZonedDateTime::since` and `ZonedDateTime::until` by @nekevss in [#170](https://github.com/boa-dev/temporal/pull/170) +* Implement to_string functionality and methods for `Duration`, `PlainYearMonth`, and `PlainMonthDay` by @nekevss in [#164](https://github.com/boa-dev/temporal/pull/164) +* API cleanup, visibility updates, and tech debt cleanup by @nekevss in [#168](https://github.com/boa-dev/temporal/pull/168) +* Add to_string functionality for timezone identifer by @nekevss in [#161](https://github.com/boa-dev/temporal/pull/161) +* Bug fixes to address test failures + removing unused API by @nekevss in [#162](https://github.com/boa-dev/temporal/pull/162) +* Implement correct resolving of `getStartOfDay` by @jedel1043 in [#159](https://github.com/boa-dev/temporal/pull/159) +* Add an MSRV check to CI by @nekevss in [#158](https://github.com/boa-dev/temporal/pull/158) +* Fixing panics in test262 when running in debug mode by @nekevss in [#157](https://github.com/boa-dev/temporal/pull/157) +* Fix edge case for disambiguating `ZonedDateTime`s on DSTs skipping midnight by @jedel1043 in [#156](https://github.com/boa-dev/temporal/pull/156) +* Extend implementation of `to_ixdtf_string` to more types by @nekevss in [#155](https://github.com/boa-dev/temporal/pull/155) +* Implement support for `to_string` and implement `PlainDate::to_string` by @nekevss in [#153](https://github.com/boa-dev/temporal/pull/153) +* Fix RoundingMode::truncation to UnsignedRoundingMode mapping by @nekevss in [#146](https://github.com/boa-dev/temporal/pull/146) +* Add validation logic to `from_diff_settings` by @nekevss in [#144](https://github.com/boa-dev/temporal/pull/144) +* Build out the rest of the Now methods by @nekevss in [#145](https://github.com/boa-dev/temporal/pull/145) +* Adjust `RelativeTo` according to specification and implementation by @nekevss in [#140](https://github.com/boa-dev/temporal/pull/140) +* Complete some general cleanup of `temporal_rs` by @nekevss in [#138](https://github.com/boa-dev/temporal/pull/138) +* Add ZonedDateTime functionality to `Duration::round` by @nekevss in [#134](https://github.com/boa-dev/temporal/pull/134) +* Update try_new, new, and new_with_overflow integer type by @nekevss in [#137](https://github.com/boa-dev/temporal/pull/137) +* Fix `Calendar::from_str` to be case-insensitive by @nekevss in [#135](https://github.com/boa-dev/temporal/pull/135) +* Add ToIntegerWithTruncation, ToPositiveIntegerWithTruncation, and ToIntegerIfIntegral methods to `FiniteF64` by @nekevss in [#131](https://github.com/boa-dev/temporal/pull/131) +* Add to-x methods and with-x methods to ZonedDateTime by @nekevss in [#129](https://github.com/boa-dev/temporal/pull/129) +* Fix `epoch_time_to_epoch_year` date equation bug related to `BalanceISODate` by @nekevss in [#132](https://github.com/boa-dev/temporal/pull/132) +* Bump dependencies for `ixdtf`, `tzif`, `icu_calendar`, and `tinystr`. by @nekevss in [#133](https://github.com/boa-dev/temporal/pull/133) +* Fix bug introduced by `EpochNanoseconds` + adjust tests to catch better by @nekevss in [#128](https://github.com/boa-dev/temporal/pull/128) +* Remove epochSeconds and epochMicroseconds + adjust epochMillseconds by @nekevss in [#127](https://github.com/boa-dev/temporal/pull/127) +* Adjust compilation configuration of tzdb to target_family from target_os by @nekevss in [#125](https://github.com/boa-dev/temporal/pull/125) +* Migrate repo to workspace by @jedel1043 in [#126](https://github.com/boa-dev/temporal/pull/126) +* Add now feature flag by @nekevss in [#123](https://github.com/boa-dev/temporal/pull/123) +* Add `ZonedDateTime` calendar accessor methods by @nekevss in [#117](https://github.com/boa-dev/temporal/pull/117) +* Implement `PartialZonedDateTime` and `from_partial` and `from_str` for `ZonedDateTime` by @nekevss in [#115](https://github.com/boa-dev/temporal/pull/115) +* Update CHANGELOG for v0.0.4 release by @nekevss in [#124](https://github.com/boa-dev/temporal/pull/124) +* Patch the now test per matrix discussion by @nekevss in [#121](https://github.com/boa-dev/temporal/pull/121) + +## New Contributors +* @sffc made their first contribution in [#186](https://github.com/boa-dev/temporal/pull/186) +* @lockels made their first contribution in [#186](https://github.com/boa-dev/temporal/pull/186) +* @Neelzee made their first contribution in [#186](https://github.com/boa-dev/temporal/pull/186) +* @sebastianjacmatt made their first contribution in [#186](https://github.com/boa-dev/temporal/pull/186) +* @Magnus-Fjeldstad made their first contribution in [#186](https://github.com/boa-dev/temporal/pull/186) +* @HenrikTennebekk made their first contribution in [#186](https://github.com/boa-dev/temporal/pull/186) +* @cassioneri made their first contribution in [#147](https://github.com/boa-dev/temporal/pull/147) + +**Full Changelog**: https://github.com/boa-dev/temporal/compare/v0.0.4...v0.0.5 + +## What's Changed in v0.0.4 + +* bump release by @jasonwilliams in [#120](https://github.com/boa-dev/temporal/pull/120) +* Add an `EpochNanosecond` new type by @nekevss in [#116](https://github.com/boa-dev/temporal/pull/116) +* Migrate to `web_time::SystemTime` for `wasm32-unknown-unknown` targets by @nekevss in [#118](https://github.com/boa-dev/temporal/pull/118) +* Bug fixes and more implementation by @jasonwilliams in [#110](https://github.com/boa-dev/temporal/pull/110) +* Some `Error` optimizations by @CrazyboyQCD in [#112](https://github.com/boa-dev/temporal/pull/112) +* Add `from_partial` methods to `PlainTime`, `PlainDate`, and `PlainDateTime` by @nekevss in [#106](https://github.com/boa-dev/temporal/pull/106) +* Implement `ZonedDateTime`'s add and subtract methods by @nekevss in [#102](https://github.com/boa-dev/temporal/pull/102) +* Add matrix links to README and some layout adjustments by @nekevss in [#108](https://github.com/boa-dev/temporal/pull/108) +* Stub out `tzdb` support for Windows and POSIX tz string by @nekevss in [#100](https://github.com/boa-dev/temporal/pull/100) +* Stub out tzdb support to unblock `Now` and `ZonedDateTime` by @nekevss in [#99](https://github.com/boa-dev/temporal/pull/99) +* Remove num-bigint dependency and rely on primitives by @nekevss in [#103](https://github.com/boa-dev/temporal/pull/103) +* Move to no_std by @Manishearth in [#101](https://github.com/boa-dev/temporal/pull/101) +* General API cleanup and adjustments by @nekevss in [#97](https://github.com/boa-dev/temporal/pull/97) +* Update README.md by @jasonwilliams in [#96](https://github.com/boa-dev/temporal/pull/96) +* Refactor `TemporalFields` into `CalendarFields` by @nekevss in [#95](https://github.com/boa-dev/temporal/pull/95) +* Patch for partial records by @nekevss in [#94](https://github.com/boa-dev/temporal/pull/94) +* Add `PartialTime` and `PartialDateTime` with corresponding `with` methods. by @nekevss in [#92](https://github.com/boa-dev/temporal/pull/92) +* Implement `MonthCode`, `PartialDate`, and `Date::with` by @nekevss in [#89](https://github.com/boa-dev/temporal/pull/89) +* Add is empty for partialDuration by @jasonwilliams in [#90](https://github.com/boa-dev/temporal/pull/90) +* Fix lints for rustc 1.80.0 by @jedel1043 in [#91](https://github.com/boa-dev/temporal/pull/91) +* adding methods for yearMonth and MonthDay by @jasonwilliams in [#44](https://github.com/boa-dev/temporal/pull/44) +* Implement `DateTime` round method by @nekevss in [#88](https://github.com/boa-dev/temporal/pull/88) +* Update `Duration` types to use a `FiniteF64` instead of `f64` primitive. by @nekevss in [#86](https://github.com/boa-dev/temporal/pull/86) +* Refactor `TemporalFields` interface and add `FieldsKey` enum by @nekevss in [#87](https://github.com/boa-dev/temporal/pull/87) +* Updates to instant and its methods by @nekevss in [#85](https://github.com/boa-dev/temporal/pull/85) +* Implement compare functionality and some more traits by @nekevss in [#82](https://github.com/boa-dev/temporal/pull/82) +* Implement `DateTime` diffing methods `Until` and `Since` by @nekevss in [#83](https://github.com/boa-dev/temporal/pull/83) +* Add `with_*` methods to `Date` and `DateTime` by @nekevss in [#84](https://github.com/boa-dev/temporal/pull/84) +* Add some missing trait implementations by @nekevss in [#81](https://github.com/boa-dev/temporal/pull/81) +* chore(dependabot): bump zerovec-derive from 0.10.2 to 0.10.3 by @dependabot[bot] in [#80](https://github.com/boa-dev/temporal/pull/80) +* Add prefix option to commit-message by @nekevss in [#79](https://github.com/boa-dev/temporal/pull/79) +* Add commit-message prefix to dependabot by @nekevss in [#77](https://github.com/boa-dev/temporal/pull/77) +* Bump zerovec from 0.10.2 to 0.10.4 by @dependabot[bot] in [#78](https://github.com/boa-dev/temporal/pull/78) + +## New Contributors +* @jasonwilliams made their first contribution in [#120](https://github.com/boa-dev/temporal/pull/120) +* @CrazyboyQCD made their first contribution in [#112](https://github.com/boa-dev/temporal/pull/112) +* @Manishearth made their first contribution in [#101](https://github.com/boa-dev/temporal/pull/101) + +**Full Changelog**: https://github.com/boa-dev/temporal/compare/v0.0.3...v0.0.4 + +# CHANGELOG + +## What's Changed in v0.0.3 + +* Implement add and subtract methods for Duration by @nekevss in [#74](https://github.com/boa-dev/temporal/pull/74) +* Implement PartialEq and Eq for `Calendar`, `Date`, and `DateTime` by @nekevss in [#75](https://github.com/boa-dev/temporal/pull/75) +* Update duration validation and switch asserts to debug-asserts by @nekevss in [#73](https://github.com/boa-dev/temporal/pull/73) +* Update duration rounding to new algorithms by @nekevss in [#65](https://github.com/boa-dev/temporal/pull/65) +* Remove `CalendarProtocol` and `TimeZoneProtocol` by @jedel1043 in [#66](https://github.com/boa-dev/temporal/pull/66) +* Use groups in dependabot updates by @jedel1043 in [#69](https://github.com/boa-dev/temporal/pull/69) +* Ensure parsing throws with unknown critical annotations by @jedel1043 in [#63](https://github.com/boa-dev/temporal/pull/63) +* Reject `IsoDate` when outside the allowed range by @jedel1043 in [#62](https://github.com/boa-dev/temporal/pull/62) +* Avoid overflowing when calling `NormalizedTimeDuration::add_days` by @jedel1043 in [#61](https://github.com/boa-dev/temporal/pull/61) +* Ensure parsing throws when duplicate calendar is critical by @jedel1043 in [#58](https://github.com/boa-dev/temporal/pull/58) +* Fix rounding when the dividend is smaller than the divisor by @jedel1043 in [#57](https://github.com/boa-dev/temporal/pull/57) +* Implement the `toYearMonth`, `toMonthDay`, and `toDateTime` for `Date` component by @nekevss in [#56](https://github.com/boa-dev/temporal/pull/56) +* Update increment rounding functionality by @nekevss in [#53](https://github.com/boa-dev/temporal/pull/53) +* Patch `(un)balance_relative` to avoid panicking by @jedel1043 in [#48](https://github.com/boa-dev/temporal/pull/48) +* Cleanup rounding increment usages with new struct by @jedel1043 in [#54](https://github.com/boa-dev/temporal/pull/54) +* Add struct to encapsulate invariants of rounding increments by @jedel1043 in [#49](https://github.com/boa-dev/temporal/pull/49) +* Migrate parsing to `ixdtf` crate by @nekevss in [#50](https://github.com/boa-dev/temporal/pull/50) +* Fix method call in days_in_month by @nekevss in [#46](https://github.com/boa-dev/temporal/pull/46) +* Implement add & subtract methods for `DateTime` component by @nekevss in [#45](https://github.com/boa-dev/temporal/pull/45) +* Fix panics when no relative_to is supplied to round by @nekevss in [#40](https://github.com/boa-dev/temporal/pull/40) +* Implement Time's until and since methods by @nekevss in [#36](https://github.com/boa-dev/temporal/pull/36) +* Implements `Date`'s `add`, `subtract`, `until`, and `since` methods by @nekevss in [#35](https://github.com/boa-dev/temporal/pull/35) +* Fix clippy lints and bump bitflags version by @nekevss in [#38](https://github.com/boa-dev/temporal/pull/38) + +**Full Changelog**: https://github.com/boa-dev/temporal/compare/v0.0.2...v0.0.3 + +## What's Changed in v0.0.2 + +# [0.0.2 (2024-03-04)](https://github.com/boa-dev/temporal/compare/v0.0.1...v0.0.2) + +### Enhancements + +* Fix loop in `diff_iso_date` by @nekevss in https://github.com/boa-dev/temporal/pull/31 +* Remove unnecessary iterations by @nekevss in https://github.com/boa-dev/temporal/pull/30 + +**Full Changelog**: https://github.com/boa-dev/temporal/compare/v0.0.1...v0.0.2 + +# [0.0.1 (2024-02-25)](https://github.com/boa-dev/temporal/commits/v0.0.1) + +### Enhancements +* Add blank and negated + small adjustments by @nekevss in https://github.com/boa-dev/temporal/pull/17 +* Simplify Temporal APIs by @jedel1043 in https://github.com/boa-dev/temporal/pull/18 +* Implement `Duration` normalization - Part 1 by @nekevss in https://github.com/boa-dev/temporal/pull/20 +* Duration Normalization - Part 2 by @nekevss in https://github.com/boa-dev/temporal/pull/23 +* Add `non_exhaustive` attribute to component structs by @nekevss in https://github.com/boa-dev/temporal/pull/25 +* Implement `Duration::round` and some general updates/fixes by @nekevss in https://github.com/boa-dev/temporal/pull/24 + +### Documentation +* Adding a `docs` directory by @nekevss in https://github.com/boa-dev/temporal/pull/16 +* Build out README and CONTRIBUTING docs by @nekevss in https://github.com/boa-dev/temporal/pull/21 + +### Other Changes +* Port `boa_temporal` to new `temporal` crate by @nekevss in https://github.com/boa-dev/temporal/pull/1 +* Add CI and rename license by @jedel1043 in https://github.com/boa-dev/temporal/pull/3 +* Create LICENSE-Apache by @jedel1043 in https://github.com/boa-dev/temporal/pull/6 +* Setup publish CI by @jedel1043 in https://github.com/boa-dev/temporal/pull/26 +* Remove keywords from Cargo.toml by @jedel1043 in https://github.com/boa-dev/temporal/pull/28 + +## New Contributors +* @nekevss made their first contribution in https://github.com/boa-dev/temporal/pull/1 +* @jedel1043 made their first contribution in https://github.com/boa-dev/temporal/pull/3 + +**Full Changelog**: https://github.com/boa-dev/temporal/commits/v0.0.1 \ No newline at end of file diff --git a/deps/temporal/CONTRIBUTING.md b/deps/temporal/CONTRIBUTING.md new file mode 100644 index 00000000000000..eddeedd2700175 --- /dev/null +++ b/deps/temporal/CONTRIBUTING.md @@ -0,0 +1,51 @@ +# Contributing to Temporal in Rust + +We welcome contributions, feel free to checkout our open issues. If you +find an issue you're interested in, please feel free to ask to be assigned. + +If you're interested in helping out but don't see an issue that's for +you, please feel free to contact us on `Boa`'s Matrix server. + +## Contributor Information + +The Temporal proposal is a new date/time API that is being developed and proposed +for the ECMAScript specification. This library aims to be a Rust +implementation of that specification. + +Due to the nature of the material and this library, we would advise anyone +interested in contributing to familiarize themselves with the Temporal +specification. + +Also, always feel free to reach out for any advice or feedback as needed. + +## Testing and debugging + +For more information on testing and debugging `temporal_rs`. Please see +the [testing overview](./docs/testing.md). + +## Diplomat and `temporal_capi` + +If changes are made to `temporal_capi` that affect the public API, the +FFI bindings will need to be regenerated / updated. + +To update the bindings, run: + +```bash +cargo run -p diplomat-gen +``` + +## Baked data + +To regenerate baked data, run: + +```bash +cargo run -p bakeddata +``` + +## Dependency check + +To check the dependencies, run: + +```bash +cargo run -p depcheck +``` diff --git a/deps/temporal/Cargo.lock b/deps/temporal/Cargo.lock new file mode 100644 index 00000000000000..9db20cc27add39 --- /dev/null +++ b/deps/temporal/Cargo.lock @@ -0,0 +1,1321 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6680de5231bd6ee4c6191b8a1325daa282b415391ec9d3a37bd34f2060dc73fa" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys", +] + +[[package]] +name = "askama" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75363874b771be265f4ffe307ca705ef6f3baa19011c149da8674a87f1b75c4" +dependencies = [ + "askama_derive", + "itoa", + "percent-encoding", + "serde", + "serde_json", +] + +[[package]] +name = "askama_derive" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "129397200fe83088e8a68407a8e2b1f826cf0086b21ccdb866a722c8bcd3a94f" +dependencies = [ + "askama_parser", + "basic-toml", + "memchr", + "proc-macro2", + "quote", + "rustc-hash", + "serde", + "serde_derive", + "syn", +] + +[[package]] +name = "askama_parser" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6ab5630b3d5eaf232620167977f95eb51f3432fc76852328774afbd242d4358" +dependencies = [ + "memchr", + "serde", + "serde_derive", + "winnow", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "bakeddata" +version = "0.1.0" +dependencies = [ + "databake", + "prettyplease", + "rustc-hash", + "serde_json", + "syn", + "timezone_provider", + "zerovec", +] + +[[package]] +name = "basic-toml" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba62675e8242a4c4e806d12f11d136e626e6c8361d6b829310732241652a178a" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" + +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "calendrical_calculations" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53c5d386a9f2c8b97e1a036420bcf937db4e5c9df33eb0232025008ced6104c0" +dependencies = [ + "core_maths", + "displaydoc", +] + +[[package]] +name = "cc" +version = "1.2.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16595d3be041c03b09d08d0858631facccee9221e579704070e6e9e4915d3bc7" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clap" +version = "4.5.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7eac00902d9d136acd712710d71823fb8ac8004ca445a89e73a41d45aa712931" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ad9bbf750e73b5884fb8a211a9424a1906c1e156724260fdae972f31d70e1d6" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbfd7eae0b0f1a6e63d4b13c9c478de77c2eb546fba158ad50b4203dc24b9f9c" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "colored" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fde0e0ec90c9dfb3b4b1a0891a7dcd0e2bffde2f7efed5fe7c9bb00e5bfb915e" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core_maths" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30" +dependencies = [ + "libm", +] + +[[package]] +name = "databake" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6ee9e2d2afb173bcdeee45934c89ec341ab26f91c9933774fc15c2b58f83ef" +dependencies = [ + "databake-derive", + "proc-macro2", + "quote", +] + +[[package]] +name = "databake-derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6834770958c7b84223607e49758ec0dde273c4df915e734aad50f62968a4c134" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "depcheck" +version = "0.1.0" + +[[package]] +name = "diplomat" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ece782ffeb426ef0d3074c5623e8f6552cc912e4bbeecfda9583cb01b02b8ba1" +dependencies = [ + "diplomat_core", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "diplomat-gen" +version = "0.1.0" +dependencies = [ + "diplomat-tool", +] + +[[package]] +name = "diplomat-runtime" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa011f69b7f99cd4c4f1545a88cfa5f303abfdd76962843a5e5c88ea7bfe81f4" + +[[package]] +name = "diplomat-tool" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f88fa2be520ed769c790accb955cc51ebc7ceb1e9d87ce4b7db24357e9378bad" +dependencies = [ + "askama", + "clap", + "colored", + "diplomat_core", + "displaydoc", + "heck", + "indenter", + "itertools", + "pulldown-cmark", + "quote", + "serde", + "syn", + "syn-inline-mod", + "toml", +] + +[[package]] +name = "diplomat_core" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb0f9322e2c506400ac3f374abfcaf9fd841fcdb729bbf008a135b600f99ede7" +dependencies = [ + "displaydoc", + "either", + "proc-macro2", + "quote", + "serde", + "smallvec", + "strck", + "syn", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "getopts" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "iana-time-zone" +version = "0.1.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_calendar" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e239d6422e2fdcea5d9756b48400caabac25aa4ab91b6608bd4bb6f23f0558c" +dependencies = [ + "calendrical_calculations", + "displaydoc", + "icu_calendar_data", + "icu_locale", + "icu_locale_core", + "icu_provider", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_calendar_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7219c8639ab936713a87b571eed2bc2615aa9137e8af6eb221446ee5644acc18" + +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ae5921528335e91da1b6c695dbf1ec37df5ac13faa3f91e5640be93aa2fbefd" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_locale_data", + "icu_provider", + "potential_utf", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locale_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fdef0c124749d06a743c69e938350816554eb63ac979166590e2b4ee4252765" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] +name = "indexmap" +version = "2.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "ixdtf" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08b741faae9005d3c809ca4b8566d75745c408171b3c6bbb54d2b00d04910c1c" +dependencies = [ + "displaydoc", +] + +[[package]] +name = "jiff-tzdb" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1283705eb0a21404d2bfd6eef2a7593d240bc42a0bdb39db0ad6fa2ec026524" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.172" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" + +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +dependencies = [ + "serde", +] + +[[package]] +name = "log" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "potential_utf" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +dependencies = [ + "serde", + "zerovec", +] + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "pulldown-cmark" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e8bbe1a966bd2f362681a44f6edce3c2310ac21e4d5067a6e7ec396297a6ea0" +dependencies = [ + "bitflags", + "getopts", + "memchr", + "pulldown-cmark-escape", + "unicase", +] + +[[package]] +name = "pulldown-cmark-escape" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "007d8adb5ddab6f8e3f491ac63566a7d5002cc7ed73901f72057943fa71ae1ae" + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "resb" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd6572f8cee86c6a691a8a1cf8bbf7be8b3d0c02d9f8786ed1929f75e9910dbb" +dependencies = [ + "potential_utf", + "serde", +] + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustversion" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "serde" +version = "1.0.225" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6c24dee235d0da097043389623fb913daddf92c76e9f5a1db88607a0bcbd1d" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.225" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "659356f9a0cb1e529b24c01e43ad2bdf520ec4ceaf83047b83ddcc2251f96383" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.225" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ea936adf78b1f766949a4977b91d2f5595825bd6ec079aa9543ad2685fc4516" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "smallvec" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "strck" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42316e70da376f3d113a68d138a60d8a9883c604fe97942721ec2068dab13a9f" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "2.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn-inline-mod" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fa6dca1fdb7b2ed46dd534a326725419d4fb10f23d8c85a8b2860e5eb25d0f9" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "temporal_capi" +version = "0.1.0" +dependencies = [ + "diplomat", + "diplomat-runtime", + "icu_calendar", + "icu_locale", + "num-traits", + "temporal_rs", + "timezone_provider", + "writeable", + "zoneinfo64", +] + +[[package]] +name = "temporal_rs" +version = "0.1.0" +dependencies = [ + "core_maths", + "iana-time-zone", + "icu_calendar", + "icu_locale", + "ixdtf", + "log", + "num-traits", + "resb", + "timezone_provider", + "tinystr", + "web-time", + "writeable", + "zoneinfo64", +] + +[[package]] +name = "timezone_provider" +version = "0.1.0" +dependencies = [ + "combine", + "databake", + "jiff-tzdb", + "serde", + "serde_json", + "tinystr", + "tzif", + "yoke", + "zerotrie", + "zerovec", + "zoneinfo64", + "zoneinfo_rs", +] + +[[package]] +name = "tinystr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "databake", + "displaydoc", + "serde", + "zerovec", +] + +[[package]] +name = "toml" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "toml_write", + "winnow", +] + +[[package]] +name = "toml_write" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" + +[[package]] +name = "tzif" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5e762ac355f0c204d09ae644b3d59423d5ddfc5603997d60c8c56f24e429a9d" +dependencies = [ + "combine", +] + +[[package]] +name = "tzif-inspect" +version = "0.1.0" +dependencies = [ + "jiff-tzdb", + "temporal_rs", + "timezone_provider", + "tzif", +] + +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" +dependencies = [ + "memchr", +] + +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "databake", + "displaydoc", + "litemap", + "serde", + "zerovec", +] + +[[package]] +name = "zerovec" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +dependencies = [ + "databake", + "serde", + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zoneinfo-test-gen" +version = "0.1.0" +dependencies = [ + "clap", + "serde", + "serde_json", + "tzif", +] + +[[package]] +name = "zoneinfo64" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6916519e4a1cff59d49e0b902caed549d85dbbbf623a95af5c8320d5c08c6e13" +dependencies = [ + "calendrical_calculations", + "icu_locale_core", + "potential_utf", + "resb", + "serde", +] + +[[package]] +name = "zoneinfo_rs" +version = "0.0.17" +dependencies = [ + "hashbrown", + "indexmap", + "serde", + "serde_json", + "tzif", +] diff --git a/deps/temporal/Cargo.toml b/deps/temporal/Cargo.toml new file mode 100644 index 00000000000000..f12b83f4ded78c --- /dev/null +++ b/deps/temporal/Cargo.toml @@ -0,0 +1,113 @@ +[workspace] +resolver = "2" +members = [ + "provider", + "temporal_capi", + "zoneinfo", + + # Tools + "tools/*", +] + +[workspace.package] +edition = "2021" +version = "0.1.0" +rust-version = "1.82.0" +authors = ["boa-dev"] +license = "MIT OR Apache-2.0" +repository = "https://github.com/boa-dev/temporal" +readme = "./README.md" +exclude = [ + "docs/*", + ".github/*", + "debug/", + ".gitignore", + "CONTRIBUTING.md", + "cliff.toml", + "tests/data/zoneinfo64.res", +] + +[workspace.dependencies] +# Self +temporal_rs = { version = "~0.1.0", path = ".", default-features = false } +timezone_provider = { version = "~0.1.0", path = "./provider" } +zoneinfo_rs = { version = "~0.0.17", path = "./zoneinfo" } + +# Dependencies +tinystr = "0.8.1" +icu_calendar = { version = "2.0.3", default-features = false } +icu_locale = "2.0.0" +rustc-hash = "2.1.0" +num-traits = { version = "0.2.19", default-features = false } +ixdtf = "0.6.0" +iana-time-zone = "0.1.64" +log = "0.4.28" +tzif = "0.4.0" +jiff-tzdb = "0.1.4" +combine = "4.6.7" +web-time = "1.1.0" +zerovec = "0.11.4" +zoneinfo64 = "0.2.0" + +# Diplomat +diplomat-tool = { version = "0.13.0", default-features = false } +diplomat-runtime = { version = "0.13.0", default-features = false } +diplomat = { version = "0.13.0", default-features = false } + + +[package] +name = "temporal_rs" +keywords = ["date", "time", "calendar", "timezone", "duration"] +categories = ["date-and-time", "internationalization"] +description = "Temporal in Rust is an implementation of the TC39 Temporal Builtin Proposal in Rust." +version.workspace = true +edition.workspace = true +authors.workspace = true +license.workspace = true +repository.workspace = true +rust-version.workspace = true +readme.workspace = true +exclude.workspace = true + +[dependencies] + +core_maths = "0.1.1" +icu_calendar = { workspace = true, features = ["compiled_data"] } +icu_locale.workspace = true +ixdtf = { workspace = true, features = ["duration"] } +num-traits.workspace = true +tinystr.workspace = true +writeable = "0.6.1" + +# log feature +log = { workspace = true, optional = true } + +# tzdb feature +timezone_provider = { workspace = true } + +# System time feature +web-time = { workspace = true, optional = true } +iana-time-zone = { workspace = true, optional = true } + +[dev-dependencies] +timezone_provider = { workspace = true, features = ["zoneinfo64"] } +zoneinfo64 = { workspace = true } +resb = "0.1.0" + +[features] +default = ["sys"] +log = ["dep:log"] +compiled_data = ["tzdb"] +sys = ["std", "compiled_data", "dep:web-time", "dep:iana-time-zone"] +tzdb = [ + "std", + "timezone_provider/tzif", +] +std = [] + +[package.metadata.cargo-all-features] +denylist = ["default"] +max_combination_size = 4 + +[package.metadata.docs.rs] +all-features = true diff --git a/deps/temporal/LICENSE-Apache b/deps/temporal/LICENSE-Apache new file mode 100644 index 00000000000000..551045b58932a5 --- /dev/null +++ b/deps/temporal/LICENSE-Apache @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2024 Boa + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/deps/temporal/LICENSE-MIT b/deps/temporal/LICENSE-MIT new file mode 100644 index 00000000000000..d5624ad0c1fb69 --- /dev/null +++ b/deps/temporal/LICENSE-MIT @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Boa + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/deps/temporal/README.md b/deps/temporal/README.md new file mode 100644 index 00000000000000..58b5c3315b6700 --- /dev/null +++ b/deps/temporal/README.md @@ -0,0 +1,295 @@ +# Temporal in Rust + +Temporal is a calendar and timezone aware date/time builtin currently +proposed for addition to the ECMAScript specification. + +`temporal_rs` is an implementation of Temporal in Rust that aims to be +100% test compliant. While initially developed for [Boa][boa-repo], the +crate has been externalized and is being used in other engines such as [V8](https://v8.dev) and [Kiesel](https://codeberg.org/kiesel-js/kiesel). + +For more information on `temporal_rs`'s general position in the Rust +date/time library ecoystem, see our [FAQ](./docs/FAQ.md). + + +Temporal is an API for working with date and time in a calendar +and time zone aware manner. + +temporal_rs is designed with ECMAScript implementations and general +purpose Rust usage in mind, meaning that temporal_rs can be used to implement +the Temporal built-ins in an ECMAScript implementation or generally +used as a date and time library in a Rust project. + +temporal_rs is the primary library for the Temporal API implementation in Boa, Kiesel, +and V8. Each of these engines pass the large ECMAScript conformance test suite for +the specification. + +## Why use temporal_rs? + +As previously mentioned, Temporal is an API for working with date and time in +a calendar and time zone aware manner. This means that calendar and time zone support +are first class in Temporal as well as in temporal_rs. + +For instance, converting between calendars is as simple as providing the calendar as +shown below. + +```rust +use temporal_rs::{PlainDate, Calendar}; +use tinystr::tinystr; +use core::str::FromStr; + +// Create a date with an ISO calendar +let iso8601_date = PlainDate::try_new_iso(2025, 3, 3).unwrap(); + +// Create a new date with the japanese calendar +let japanese_date = iso8601_date.with_calendar(Calendar::JAPANESE); +assert_eq!(japanese_date.era(), Some(tinystr!(16, "reiwa"))); +assert_eq!(japanese_date.era_year(), Some(7)); +assert_eq!(japanese_date.month(), 3) +``` + +Beyond the general calendar use case, temporal_rs has robust support for +time zones which can generally by applied to a `PlainDate` via [`ZonedDateTime`]. + +**Important Note:** The below API is enabled with the +`compiled_data` feature flag. + +```rust +use temporal_rs::{ZonedDateTime, TimeZone}; +use temporal_rs::options::{Disambiguation, OffsetDisambiguation}; + +let zdt = ZonedDateTime::from_utf8( +b"2025-03-01T11:16:10Z[America/Chicago][u-ca=iso8601]", +Disambiguation::Compatible, +OffsetDisambiguation::Reject +).unwrap(); +assert_eq!(zdt.year(), 2025); +assert_eq!(zdt.month(), 3); +assert_eq!(zdt.day(), 1); +// Using Z and a timezone projects a UTC datetime into the timezone. +assert_eq!(zdt.hour(), 5); +assert_eq!(zdt.minute(), 16); +assert_eq!(zdt.second(), 10); + +// You can also update a time zone easily. +let zurich_zone = TimeZone::try_from_str("Europe/Zurich").unwrap(); +let zdt_zurich = zdt.with_timezone(zurich_zone).unwrap(); +assert_eq!(zdt_zurich.year(), 2025); +assert_eq!(zdt_zurich.month(), 3); +assert_eq!(zdt_zurich.day(), 1); +assert_eq!(zdt_zurich.hour(), 12); +assert_eq!(zdt_zurich.minute(), 16); +assert_eq!(zdt_zurich.second(), 10); + +``` + +## Overview + +temporal_rs provides 8 core types for working with date and time. The core types are: + +- [PlainDate] +- [PlainTime] +- [PlainDateTime] +- [ZonedDateTime] +- [Instant] +- [Duration] +- [PlainYearMonth] +- [PlainMonthDay] + +In addition to these types, there are the [`Calendar`] and [`TimeZone`] type that +support the calendars or time zones. The specific support for calendars and time +zones per type are as follows. + +| Temporal type | Category | Calendar support | Time zone support | +|----------------|--------------------------------------|--------------------|--------------------| +| PlainDate | Calendar date | yes | no | +| PlainTime | Wall-clock time | no | no | +| PlainDateTime | Calendar date and wall-clock time | yes | no | +| ZonedDateTime | Calendar date and exact time | yes | yes | +| Instant | Exact time | no | no | +| Duration | None | no | no | +| PlainYearMonth | Calendar date | yes | no | +| PlainMonthDay | Calendar date | yes | no | + +There is also the [`Now`][now::Now], which provides access to the current host system +time. This can then be used to map to any of the above Temporal types. + +**Important Note:** the below example is only available with the `sys` and +`compiled_data` feature flag enabled. + +```rust +use core::cmp::Ordering; +use temporal_rs::{Temporal, Calendar, ZonedDateTime}; +let current_instant = Temporal::now().instant().unwrap(); +let current_zoned_date_time = Temporal::now().zoned_date_time_iso(None).unwrap(); + +/// Create a `ZonedDateTime` from the requested instant. +let zoned_date_time_from_instant = ZonedDateTime::try_new( +current_instant.as_i128(), +*current_zoned_date_time.time_zone(), +Calendar::ISO, +).unwrap(); + +// The two `ZonedDateTime` will be equal down to the second. +assert_eq!(current_zoned_date_time.year(), zoned_date_time_from_instant.year()); +assert_eq!(current_zoned_date_time.month(), zoned_date_time_from_instant.month()); +assert_eq!(current_zoned_date_time.day(), zoned_date_time_from_instant.day()); +assert_eq!(current_zoned_date_time.hour(), zoned_date_time_from_instant.hour()); +assert_eq!(current_zoned_date_time.minute(), zoned_date_time_from_instant.minute()); +assert_eq!(current_zoned_date_time.second(), zoned_date_time_from_instant.second()); + +// The `Instant` reading that occurred first will be less than the ZonedDateTime +// reading +assert_eq!( +zoned_date_time_from_instant.compare_instant(¤t_zoned_date_time), +Ordering::Less +); +``` + +## General design + +While temporal_rs can be used in native Rust programs, the library is -- first and +foremost -- designed for use in ECMAScript implementations. This is not to detract +from temporal_rs's use in a native Rust program, but it is important information to +understand in order to understand the library's architecture and general API design. + +Without default feature flags, temporal_rs does not have with access to the host +environment and it does not embed any time zone data. This is important from an +interpreter perspective, because access to the host environment and time zone data +comes from the interpreter's agent, not from a dependency. + +Instead, temporal_rs provides the [`HostHooks`][host::HostHooks] and [`TimeZoneProvider`][provider::TimeZoneProvider] +traits that can be implemented and provided as function arguments that temporal_rs will +use to access the host system or time zone data. temporal_rs also provides some baseline +implementations of the traits that can be selected from depending on application needs. + +That being said, this does not mean that everyone must implement their own trait +implementations for that functionality to exist, but the APIs are there for power +users who may need a custom host system or time zone data implementation. + +A default host system and time zone provider have been implemented and are automatically +active as default features. + +### A quick walkthrough + +For instance, the examples thus far have been using the general usage Rust API with +the `sys` and `compiled_data` feature. + +For instance, let's manually write our [`Now`][now::Now] implementation instead of using +[`Temporal::now()`] with an empty host system implementation. + +```rust +use temporal_rs::{Instant, now::Now, host::EmptyHostSystem}; + +// The empty host system is a system implementation HostHooks that always +// returns the UNIX_EPOCH and the "+00:00" time zone. +let now = Now::new(EmptyHostSystem); +let time_zone = now.time_zone().unwrap(); +assert_eq!(time_zone.identifier().unwrap(), "+00:00"); +let now = Now::new(EmptyHostSystem); +assert_eq!(now.instant(), Instant::try_new(0)); +``` + +However, even in our above example, we cheated a bit. We were still relying on the +`compiled_data` feature flag that provided time zone data for us. Let's try again, +but this time without the feature flag. + +```rust +use temporal_rs::{Instant, now::Now, host::EmptyHostSystem}; +use timezone_provider::tzif::CompiledTzdbProvider; + +let provider = CompiledTzdbProvider::default(); + +// The empty host system is a system implementation HostHooks that always +// returns the UNIX_EPOCH and the "+00:00" time zone. +let now = Now::new(EmptyHostSystem); +let time_zone = now.time_zone_with_provider(&provider).unwrap(); +assert_eq!(time_zone.identifier_with_provider(&provider).unwrap(), "+00:00"); + +let now = Now::new(EmptyHostSystem); +assert_eq!(now.instant(), Instant::try_new(0)); +``` + +Now -- pun only partially intended -- we've successfully written a no-default-features +example with temporal_rs! + +### What have we learned going over this all this? + +First, any API that has the suffix `_with_provider` is a power user API for supplying +a custom or specific time zone data provider. Furthermore, any API that has a +`_with_provider` suffix will also have a version without the suffix that automagically +provides time zone data for you. + +Finally, sourcing time zone data is a very scary (but fun!) business. If you're interested +in learning more, feel free to check out the `timezone_provider` crate! + +With any luck, this also highlights the general design of temporal_rs. It provides a +general usage API that aligns with the Temporal specification while also being +flexible enough to provide an power user to take control of their host system access +and time zone data sourcing as needed. + +## Formatting + +temporal_rs adheres to Temporal grammar, which is a strict version of +[RFC9557's IXDTF][ixdtf]. RFC9557 is an update to RFC3339 that adds +extensions to the format. + +## More information + +[`Temporal`][proposal] is the Stage 3 proposal for ECMAScript that +provides new JS objects and functions for working with dates and +times that fully supports time zones and non-gregorian calendars. + +This library's primary development source is the Temporal +Proposal [specification][spec]. + +## Temporal proposal + +Relevant links and information regarding Temporal can be found below. + +- [Temporal MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal) +- [Temporal Documentation](https://tc39.es/proposal-temporal/docs/) +- [Temporal Proposal Specification](https://tc39.es/proposal-temporal/) +- [Temporal Proposal Repository](https://github.com/tc39/proposal-temporal) + +## Core maintainers + +- [Kevin Ness](https://github.com/nekevss) +- [Manish Goregaokar](https://github.com/Manishearth) +- [José Julián Espina](https://github.com/jedel1043) +- [Jason Williams](https://github.com/jasonwilliams) +- [Haled Odat](https://github.com/HalidOdat) +- [Boa Developers](https://github.com/orgs/boa-dev/people) + +## Contributing + +This project is open source and welcomes anyone interested to +participate. Please see [CONTRIBUTING.md](./CONTRIBUTING.md) for more +information. + +## Test262 Conformance + + + +The `temporal_rs`'s current conformance results can be viewed on Boa's +[test262 conformance page](https://boajs.dev/conformance). + +## FFI + +`temporal_rs` currently has bindings for C++, available via the +`temporal_capi` crate. + +## Communication + +Feel free to contact us on +[Matrix](https://matrix.to/#/#boa:matrix.org). + +## License + +This project is licensed under the [Apache](./LICENSE-Apache) or +[MIT](./LICENSE-MIT) licenses, at your option. + +[boa-repo]: https://github.com/boa-dev/boa +[ixdtf]: https://www.rfc-editor.org/rfc/rfc9557.txt +[proposal]: https://github.com/tc39/proposal-temporal +[spec]: https://tc39.es/proposal-temporal/ + diff --git a/deps/temporal/cliff.toml b/deps/temporal/cliff.toml new file mode 100644 index 00000000000000..9fc7f12586cf6f --- /dev/null +++ b/deps/temporal/cliff.toml @@ -0,0 +1,88 @@ +# git-cliff ~ configuration file +# https://git-cliff.org/docs/configuration + +[remote.github] +owner = "boa-dev" +repo = "temporal" + +[changelog] +body = """ +## What's Changed + +{%- if version %} in {{ version }}{%- endif -%} +{% for commit in commits %} + {% if commit.remote.pr_title -%} + {%- set commit_message = commit.remote.pr_title -%} + {%- else -%} + {%- set commit_message = commit.message -%} + {%- endif -%} + * {{ commit_message | split(pat="\n") | first | trim }}\ + {% if commit.remote.username %} by @{{ commit.remote.username }}{%- endif -%} + {% if commit.remote.pr_number %} in \ + [#{{ commit.remote.pr_number }}]({{ self::remote_url() }}/pull/{{ commit.remote.pr_number }}) \ + {%- endif %} +{%- endfor -%} + +{% if github.contributors | filter(attribute="is_first_time", value=true) | length != 0 %} + {% raw %}\n{% endraw -%} + ## New Contributors +{%- endif %}\ +{% for contributor in github.contributors | filter(attribute="is_first_time", value=true) %} + * @{{ contributor.username }} made their first contribution + {%- if contributor.pr_number %} in \ + [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) \ + {%- endif %} +{%- endfor -%} + +{% if version %} + {% if previous.version %} + **Full Changelog**: {{ self::remote_url() }}/compare/{{ previous.version }}...{{ version }} + {% endif %} +{% else -%} + {% raw %}\n{% endraw %} +{% endif %} + +{%- macro remote_url() -%} + https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }} +{%- endmacro -%} +""" +# remove the leading and trailing whitespace from the template +trim = true +# changelog footer +footer = """ + +""" +# postprocessors +postprocessors = [] + +[git] +# parse the commits based on https://www.conventionalcommits.org +conventional_commits = false +# filter out the commits that are not conventional +filter_unconventional = false +# process each line of a commit as an individual commit +split_commits = false +# regex for preprocessing the commit messages +commit_preprocessors = [ + # remove issue numbers from commits + { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" }, +] +# Commit grouping +commit_parsers = [ + { message = "^chore(release):", skip = true}, + { field = "author.name", pattern = "dependabot", skip = true } +] +# protect breaking changes from being skipped due to matching a skipping commit_parser +protect_breaking_commits = false +# filter out the commits that are not matched by commit parsers +filter_commits = false +# regex for matching git tags +tag_pattern = "v[0-9].*" +# regex for skipping tags +skip_tags = "beta|alpha" +# regex for ignoring tags +ignore_tags = "rc" +# sort the tags topologically +topo_order = false +# sort the commits inside sections by oldest/newest order +sort_commits = "newest" diff --git a/deps/temporal/docs/FAQ.md b/deps/temporal/docs/FAQ.md new file mode 100644 index 00000000000000..ed20345566e7e7 --- /dev/null +++ b/deps/temporal/docs/FAQ.md @@ -0,0 +1,50 @@ +# FAQ + +## Why should I use `temporal_rs`? + +`temporal_rs` implements the Temporal API in Rust. + +The Temporal API is designed to be a calendar and time zone aware +date/time API. + +`temporal_rs` may fit your use case if any of the below are true: + +- You are implementing the Temporal API in a JavaScript engine or any + other language. +- You have internationalization date/time needs for different calendars + that do not involve the ISO / proleptic Gregorian calendar. +- You really like the JavaScript Temporal built-in and would like to use + a similar API that you are familiar with. +- Idk, are you a big [ECMA402][ecma402-spec] fan? Than we might be your jam. + +## Why not use `jiff` to implement Temporal? + +There are a few reasons why `jiff` was not used for Boa's Temporal +implementation. + +Primary reasons: + +- `temporal_rs` is older than `jiff`; so, it was not an option when the + work on `temporal_rs` began +- `jiff` is inspired by Temporal, while `temporal_rs` aims to be a 100% + compliant implementation. `jiff` can break from the specification if + it would like where `temporal_rs` is bound to the specification + behavior. + +Other concerns: + +- Time zones are designed around the concept of BYOP (Bring your own + provider). This is VERY important for engines to be able to define + their own time zone providers. +- Without feature flags, `temporal_rs`'s `Now` does not ship with a + clock as this is left to JavaScript engines. +- Calendar support is first class in `temporal_rs`. The library aims to + support all ECMA402 defined calendars. `jiff` primarily implements the + ISO calendar with some support for other calendars through `jiff_icu`. + +## Why not use other date/time Rust crates `chrono`, `time` and `hifitime`? + +These crates provide fantastic APIs for their intended goal, but most +are designed for use with the proleptic Gregorian calendar. + +[ecma402-spec]: https://tc39.es/ecma402/ \ No newline at end of file diff --git a/deps/temporal/docs/README.md b/deps/temporal/docs/README.md new file mode 100644 index 00000000000000..645d85a00c7b0a --- /dev/null +++ b/deps/temporal/docs/README.md @@ -0,0 +1,3 @@ +# Temporal Documentation + +This documentation is intended to eventually serve as supplementary repo specific material and documentation. diff --git a/deps/temporal/docs/TZDB.md b/deps/temporal/docs/TZDB.md new file mode 100644 index 00000000000000..5f66f525fdceca --- /dev/null +++ b/deps/temporal/docs/TZDB.md @@ -0,0 +1,41 @@ +# General TZDB implementation notes + +Below are some logs of the logic currently at play to find the local +time records based off user provided nanoseconds (seconds). + +Important to note, that currently the logs only exist for notably +/- +time zones that observe DST. + +Further testing still needs to be done for time zones without any DST +transition / potentially historically abnormal edge cases. + +## Slim format testing + +`jiff_tzdb` and potentially others use a different compiled `tzif` +than operating systems. + +Where operating systems use the "-b fat", smaller embedded tzifs may +use "-b slim" (it's also worth noting that slim is the default setting) + +What does slim actually do? The slim formats "slims" the size of a tzif +by calculating the transition times for a smaller range. Instead of calculating +the transition times in a larger range, the tzif (and thus user) differs to +the POSIX tz string. + +So in order to support "slim" format `tzif`s, we need to be able to resolve the +[POSIX tz string](glibc-posix-docs). + +### Running tests / logging + +While using `jiff_tzdb`, the binary search will run the below: + +Running a date from 2017 using jiff: + +time array length: 175 +Returned idx: Err(175) + +This will panic, because we have gone past the supported transition times, so +we should default to parsing the POSIX tz string. + + +[glibc-posix-docs]:https://sourceware.org/glibc/manual/2.40/html_node/Proleptic-TZ.html diff --git a/deps/temporal/docs/architecture.md b/deps/temporal/docs/architecture.md new file mode 100644 index 00000000000000..17980052f92a9a --- /dev/null +++ b/deps/temporal/docs/architecture.md @@ -0,0 +1,108 @@ +# Library Architecture + +TODO: FFI docs + +This doc provides an overview of the layout of `temporal_rs`. + +We will go over the Temporal Date/Time builtins, general primitives, and +utiltity crates. + +## `temporal_rs` design considerations + +`temporal_rs` is first and foremost designed to be a fully spec +compliant implementation of ECMAScript's Temporal date/time builtins. + +As such, the main design consideration of `temporal_rs` is that it needs +to be able to service language interpreters / engines. + +Thus, `temporal_rs` aims to provide an API along with tools to implement +Temporal while minimizing issue with integrating Temporal into engines. + +## Date/Time builtins + +The primary date & time builtins/components are located in the +`builtins` directory. + +These builtins are then reexported from `lib.rs` to be available from +`temporal_rs`'s root module. + +### Core vs. Compiled + +`temporal_rs`'s builtins are split in two distinct directories `core` +and `compiled`. The core implementation contains the core implementation +of the Temporal builtins; meanwhile, the `compiled` implementation provides +method wrappers around the `core` methods that simplify some "lower" level +date/time APIs that may not be necessary for a general use case. + +### Core implementation + +The core implementation is always publicly available, but may not be +available to import from the `temporal_rs`'s root. + +The core implementation exposes the Provider API that allows the user to +supply a "provider", or any type that implements the `TimeZoneProvider` +trait, for time zone data that the library can use to complete it's +calculations. This is useful from an engine / implementor perspective +because it allows the engine to source time zone data in their preferred +manner without locking them into a library specific implementation that +may or may not have side effects. + +A `TimeZoneProvider` API on a core builtin will look like the below. + +```rust +impl ZonedDateTime { + pub fn day_with_provider(&self, provider: &impl TimeZoneProvider) -> TemporalResult { + // Code goes here. + } +} +``` + +### Compiled implementation + +The native implementation is only available via the "compiled" default +feature flag. + +For the same reason that the Provider API is useful for language +implementors, it is a deterent from a general use case perspective. Most +people using a datetime library, outside of the self-proclaimed time +zone nerds, probably won't care from where their time zone data is being +sourced. + +The native Rust wrapper of the core implementation provides a default +provider implementation to remove the need of the user to think or deal +with `TimeZoneProvider`. + +```rust +impl ZonedDateTime { + pub fn day(&self) -> TemporalResult { + // Code goes here. + } +} +``` + +This greatly simplifies the API for general use cases. + +## Primitives + + + +`temporal_rs` has a primitive number implementation `FiniteF64` along +with a few date and time primitives: `IsoDate`, `IsoTime`, +`IsoDateTime`, and `EpochNanoseconds`. + +`FiniteF64` allows an interface to translate between ECMAScript's number +type vs. `temporal_rs`'s strictly typed API. + +Meanwhile the Date and Time primitives allow certain invariants to be +enforced on their records. + +## Utiltiies + +`temporal_rs` provides one implementation of the `TimeZoneProvider` +trait: `FsTzdbProvider`. + +`FsTzdbProvider` reads from the file systems' tzdb and when not +available on the system, `FsTzdbProvider` relies on a prepackaged +`tzdb`. + + diff --git a/deps/temporal/docs/design/initial-api-concept.md b/deps/temporal/docs/design/initial-api-concept.md new file mode 100644 index 00000000000000..fc23ba0876d359 --- /dev/null +++ b/deps/temporal/docs/design/initial-api-concept.md @@ -0,0 +1,68 @@ +# Temporal API Design + +This design hopes to layout an initial concept to adapting the `Temporal` API for Rust. The layout +was broadly mentioned in a previous PR earlier in the development of `Temporal`. This write up is to +mainly overview the API, and provide context to any potential contributors. + +There are three incredibly important points to keep in mind during the design and implementation + +1. This library should empower any language engine to implement `Temporal` to a high degree of fidelity. +2. This library should be able to provide a non-engine API consumable by any potential user. + +Admittedly, as this library is being designed for use in a `JavaScript` engine. One takes priority, +but that should not completely overshadow the two. + +The largest concerns come around the implementation for both `Calendar` and `TimeZone` (aka, `CalendarSlot` +and `TimeZoneSlot`). + +Date is defined (broadly) as: + +```rust + +// In `Boa`, Date is represented as Date +struct Date { + iso: IsoDate, + calendar: CalendarSlot, +} + +``` + +In this instance, C represents any Custom Calendar implementation that is required by the `Temporal` +specification. It is also fundamental to the design of the library; however, it introduces an +interesting API concern. + +Primarily, what if someone doesn't want to implement a custom Calendar? Well, that's easy, we can just +use `Date<()>`. That's easy. We've solved the great API crisis! + +But there's a catch. To provide utility to engine implementors, `CalendarProtocol` implements a `Context` +associated type. In order to have access to that context, it needs to be passed in as an argument. + +So in an engine, like Boa, this may look like. + +```rust +// Theoretically, fetching a the year value with context. +let year_value = Date.year(context); +``` + +But this API, makes the non-engine API just that much more cumbersome. + +```rust +// A user fetching a year value. +let year_value = Date<()>.year(&mut ()); +``` + +There is also the chance that some user WANTS to implement a custom calendar, but does NOT need any `Context`. + +```rust +let year_value = Date.year(&mut ()); +``` + +The API in this instance is not necessarily bad, per se. It's just it could be better for non-engine consumers. + +In order to address this issue, this design concept would require that any function that needs a `Context` argument +clearly labels itself as such. + +```rust +let year_1 = Date<()>.year(); +let year_2 = Date<()>.year_with_context(&mut ()); +``` diff --git a/deps/temporal/docs/release.md b/deps/temporal/docs/release.md new file mode 100644 index 00000000000000..deba1eeb1d5c21 --- /dev/null +++ b/deps/temporal/docs/release.md @@ -0,0 +1,40 @@ +# Release process + +The steps for preparing and making a new release for `temporal_rs` and +its crates are as follows. + +1. Fetch the remote refs and tags (`git fetch --tags`) +2. Create and checkout release prep branch +3. Bump the version in the workspace Cargo.toml in the workspace package + and dependencies sections +4. Update the CHANGELOG with git cliff (See below for more information) +5. Commit changes to branch + - (Optional / recommended) A dry run publish could be preemptively run with + `cargo workspaces publish --dry-run` +6. Push to Github/remote, make pull request, and merge release prep. +7. Draft a new release targeting `main` with a `vx.x.x` tag +8. Publish release + +## Release post + +The release post generally includes the CHANGELOG content; however, an +introduction may be added if the individual making the release would +like to write one. + +## Git Cliff + +Updating the CHANGELOG with the below commits by running: + +```bash +git cliff $PREVIOUS_TAG.. --tag $RELEASE_TAG --prepend CHANGELOG.md +``` + +`$PREVIOUS_TAG` is the tag for the last release while `$RELEASE_TAG` is +the upcoming release tag. + +For example, in order to prep for release `v0.0.9`, the git cliff +command would be: + +```bash +git cliff v0.0.8.. --tag v0.0.9 --prepend CHANGELOG.md +``` diff --git a/deps/temporal/docs/testing.md b/deps/temporal/docs/testing.md new file mode 100644 index 00000000000000..bd04e1ec0adacc --- /dev/null +++ b/deps/temporal/docs/testing.md @@ -0,0 +1,77 @@ +## Testing `temporal_rs` + +Temporal's primary test suite is the [Temporal `test262` test +suite][test262-temporal]. There is an open issue / PR to extract +the tests from test262 into a format that `temporal_rs` can run +against in native Rust. + +In the meantime, there are two primary ways to test: + +1. Map the test into a Rust version in the `test` module in + `temporal_rs`. (Ex: [Duration's tests][duration-test-mod]) + +2. Implement the feature in a relevant ECMAScript interpreter / engine, + and run the engine through the test suite. + +### Testing with Boa + +Testing with Boa can be completed fairly easily. First and definitely +not least, implement the feature in Boa. Boa's Temporal builtin can be +found [here][boa-temporal]. + +Once implemented, the builtin Temporal test suite can be run with the +command: + +```bash +cargo run --bin boa_tester -- run -vv --console -s test/built-ins/Temporal +``` + +The `intl402` Temporal test suite can be run with: + +```bash +cargo run --bin boa_tester -- run -vv --console -s test/intl402/Temporal +``` + +#### Specify method test suites + +The test suite can be further specified by qualifying the path. In order +to run the tests for `ZonedDateTime.prototype.add`, run: + +```bash +cargo run --bin boa_tester -- run -vv --console -s test/built-ins/Temporal/ZonedDateTime/prototype/add +``` + +#### Debugging single `test262` tests + +When debugging a specific test, the test output can be viewed by running +the test in verbose mode (`-vvv`): + +```bash +cargo run --bin boa_tester -- run -vvv --console -s test/built-ins/Temporal/Instant/compare/argument-string-limits.js +``` + +Running the above command will output whether the test failed or passed, +and the test failure output if failed. + +```txt +Getting last commit on 'HEAD' branch +Loading the test suite... +Test loaded, starting... +`/home/user/Projects/boa/test262/test/built-ins/Temporal/Instant/compare/argument-string-limits.js`: starting +`/home/user/Projects/boa/test262/test/built-ins/Temporal/Instant/compare/argument-string-limits.js`: Failed +`/home/user/Projects/boa/test262/test/built-ins/Temporal/Instant/compare/argument-string-limits.js`: result text +Uncaught RangeError: Instant nanoseconds are not within a valid epoch range. +``` + +### A note on testing with ECMAScript implementations + +Any ECMAScript implementation implementing `temporal_rs` will require +some level of glue code in order to move from the implementation to +`temporal_rs`. So when debugging, it is important to determine that the +error falls in `temporal_rs`. + +[test262-temporal]: + https://github.com/tc39/test262/tree/main/test/built-ins/Temporal +[duration-test-mod]: ./src/components/duration/tests.rs +[boa-temporal]: + https://github.com/boa-dev/boa/tree/main/core/engine/src/builtins/temporal diff --git a/deps/temporal/provider/Cargo.toml b/deps/temporal/provider/Cargo.toml new file mode 100644 index 00000000000000..9e40a10233a5f2 --- /dev/null +++ b/deps/temporal/provider/Cargo.toml @@ -0,0 +1,75 @@ +[package] +name = "timezone_provider" +description = "Time zone data providers" +edition.workspace = true +version.workspace = true +rust-version.workspace = true +authors.workspace = true +license.workspace = true +repository.workspace = true +include = [ + "src/**/*.rs", + "src/data/*.rs.data", + "Cargo.toml", + "LICENSE-Apache", + "LICENSE-MIT", + "README.md", +] + +[features] +# Allow people to use default-features = false +default = [] +datagen = [ + "std", + "dep:serde", + "dep:databake", + "dep:yoke", + "dep:serde_json", + "tinystr/serde", + "tinystr/databake", + "zerotrie/serde", + "zerotrie/databake", + "zerovec/serde", + "zerovec/databake", + "zerovec/derive", + "dep:zoneinfo_rs", + "experimental_tzif", +] +std = [] +# Experimental tzif/tzdb compiled data +experimental_tzif = [] + +# Performing timezone resolution with the `tzif` crate +tzif = ["dep:tzif", + "dep:jiff-tzdb", + "dep:combine", + "std"] + +# Performing timezone resolution using the `zoneinfo64` crate +# (ICU4C zoneinfo64.res) +zoneinfo64 = ["dep:zoneinfo64"] + +[dependencies] + +# Provider dependency +zerotrie = "0.2.2" +zerovec = { workspace = true, features = ["derive", "alloc"] } +tinystr = { workspace = true, features = ["zerovec"] } + +# IANA dependency +zoneinfo_rs = { workspace = true, features = ["std"], optional = true } + +# tzif dependency +tzif = { workspace = true, optional = true } +jiff-tzdb = { workspace = true, optional = true } +combine = { workspace = true, optional = true } + +# zoneinfo64 dependency +zoneinfo64 = { workspace = true, optional = true } + +# Databake dependencies +serde = { version = "1.0.225", features = ["derive"], optional = true } +databake = { version = "0.2.0", features = ["derive"], optional = true } +yoke = { version = "0.8.0", features = ["derive"], optional = true } +serde_json = { version = "1.0.145", optional = true } + diff --git a/deps/temporal/provider/LICENSE-Apache b/deps/temporal/provider/LICENSE-Apache new file mode 100644 index 00000000000000..551045b58932a5 --- /dev/null +++ b/deps/temporal/provider/LICENSE-Apache @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2024 Boa + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/deps/temporal/provider/LICENSE-MIT b/deps/temporal/provider/LICENSE-MIT new file mode 100644 index 00000000000000..d5624ad0c1fb69 --- /dev/null +++ b/deps/temporal/provider/LICENSE-MIT @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Boa + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/deps/temporal/provider/README.md b/deps/temporal/provider/README.md new file mode 100644 index 00000000000000..e1d849f4acf7d2 --- /dev/null +++ b/deps/temporal/provider/README.md @@ -0,0 +1,63 @@ +# Time zone providers + + + +Providers for time zone data + +Let's talk about time zone data everyone! + +At a high level, the `timezone_provider` crate provides a set of traits along with a few +implementations of those traits. The general intention here is to make providing time zone +data as agnostic and easy as possible. + +This crate is fairly "low level" at least as far as date and time needs are concerned. So +we'll cover the basic overview of the trait and some of the general implementations of +those traits, and then we will go on a bit further of a dive for the power users that +are interested in implementing their own provider or is just really curious about what +is going on. + +### Available providers + +Below is a list of currently available time zone providers. + +- `ZoneInfo64TzdbProvider`: a provider using ICU4C's zoneinfo64 resource bundle (enable with `zoneinfo64` features flag) +- `FsTzdbProvider`: a provider that reads and parses tzdata at runtime from the host file system's +TZif files (enable with `tzif` feature flag) +- `CompiledTzdbProvider`: a provider that reads and parses tzdata at runtime from TZif's compiled +into the application (enable with `tzif` feature flag) + +Coming soon (hopefully), a zero copy compiled tzdb provider (see `experimental_tzif` for more). + +### Time zone provider traits + +This crate provides three primary traits for working with time zone data. + +- [`TimeZoneProvider`][crate::provider::TimeZoneProvider] +- [`TimeZoneNormalizer`][crate::provider::TimeZoneNormalizer] +- [`TimeZoneResolver`][crate::provider::TimeZoneResolver] + +The first trait `TimeZoneProvider` is the primary interface for a time zone provider used by `temporal_rs`. + +Meanwhile, the two other traits, `TimeZoneNormalizer` and `TimeZoneResolver`, are secondary +traits that can be used to implement the core `TimeZoneProvider`. Once implemented, this +crate providers a default type for creating a `TimeZoneProvider` by mixing and matching objects that implement the secondary +traits, `NormalizerAndResolver`. + +#### Why two secondary traits? + +Well that's because `TimeZoneProvider` handles two different concerns: fetching and +formatting normalized and canonicalized time zone identifiers, and resolving time +zone data requests. This functionality typically requires two different sets of data, +each of which may be in a variety of formats. + +#### Why not just have the two secondary traits without `TimeZoneProvider`? + +Well while the functionality typically requires two sets of data. Those sets are not +necessarily completely unique. The time zone database updates potentially multiple times a +year so having your formatting in 2025a while your data is in 2025b could cause some +desync. So in order to better represent this `TimeZoneProvider` is used on top of them. + +**NOTE:** you CAN always just directly use `TimeZoneNormalizer` and +`TimeZoneResolver` together if you want. We just wouldn't recommemnd it. + + diff --git a/deps/temporal/provider/src/data/compiled_zoneinfo_provider.rs.data b/deps/temporal/provider/src/data/compiled_zoneinfo_provider.rs.data new file mode 100644 index 00000000000000..f1de69eaa08ffc --- /dev/null +++ b/deps/temporal/provider/src/data/compiled_zoneinfo_provider.rs.data @@ -0,0 +1,16 @@ +//@generated +// (by `bakeddata` binary in temporal_rs, using `databake`) + +#[macro_export] +macro_rules! compiled_zoneinfo_provider { + ($providername:ident) => { + pub const $providername : & 'static + timezone_provider::experimental_tzif::ZoneInfoProvider = & + timezone_provider::experimental_tzif::ZoneInfoProvider { ids : + zerotrie::ZeroAsciiIgnoreCaseTrie { store : unsafe { + zerovec::ZeroVec::from_bytes_unchecked(b"\xE1tabcefghijklmnprstuwz\x0E\x0F\x0F\x12\x12\x13\x13\x13\x13\x13\x13\x14\x14\x15\x15\x16\x16\x16\x16\xDE\x05\x9D\xEF\xF7 /\xB5\xC4\xCE\xD4\x08\x1B\xF5\xFE\x08\x0F\xA6\xB1\xE1gfmnrstu\x01\t\t\t\r\r\xF7\x05\x86\x99`\xE4rica/\xE1rabcdefghjklmnopstw\0\0\0\0\0\0\0\0\0\0\x01\x01\x01\x01\x01\x01\x01/i\x88\xAC\xB4\xBC\xC4\xCA\xDC\xFD+Z}\x88\x92\x9A\xB3\xC5bcdls\x06\n\x14\x1Aidjan\x80cra\x80dis_ababa\x8Dgiers\x81m\xC2ae\x03ra\x8Dra\x8D\xC5ailru\x12\x17\x1E(\xC2mn\x04ako\x80\xC2gj\x03ui\x8Aul\x80ssau\x82antyre\x8Bazzaville\x8Ajumbura\x8B\xC3aeo\x0F\x13\xC2is\x03ro\x83ablanca\x84uta\x85nakry\x80\xC3ajo\x12\x19\xC2kr\x03ar\x80_es_salaam\x8Dibouti\x8Duala\x8Al_aaiun\x86reetown\x80aborone\x8Barare\x8B\xC2ou\x0Bhannesburg\x87ba\x88\xC3ahi\x06\rmpala\x8Dartoum\x89\xC2gn\x04ali\x8Bshasa\x8A\xC4aiou\x04\r\x10gos\x8Abreville\x8Ame\x80\xC3abs\x04\x0Cnda\x8Aumbashi\x8Baka\x8B\xC3abo\x12\x18\xC3lps\x04\x08abo\x8Auto\x8Beru\x87abane\x87\xC2gn\x07adishu\x8Drovia\x8C\xC4adio\x06\r\x12irobi\x8Djamena\x8Eamey\x8Auakchott\x80uagadougou\x80orto-novo\x8Aao_tome\x8F\xC3iru\x07\x0Embuktu\x80ipoli\x90\0nis\x90\x01indhoek\x90\x02erica/\xE1vabcdefghijklmnoprstvwy\0\x01\x01\x02\x02\x02\x02\x02\x03\x03\x03\x03\x04\x04\x04\x05\x05\x06\x06\x06\x06\xE7F\xF4-Xv\xD1\xEEg\x7F\xB7\xEC\x92\xEC\xF4g\xB0M\x87\x9A\xB0\xC5dnrst\x04\x1F\xC7\xCFak\x90\x03\xC3cgt\x08\x0Fhorage\x90\x04uilla\x90eigua\x90e\xC3agu\x08\x9Eguaina\x90\x05entina/\xC9bcjlmrstu\r17@HUmuuenos_aires\x90\x06\xC2ao\ttamarca\x90\x07\xC2mr\rodrivadavia\x90\x07doba\x90\x08ujuy\x90\ta_rioja\x90\nendoza\x90\x0Bio_gallegos\x90\x0Ca\xC2ln\x04ta\x90\r_\xC2jl\x05uan\x90\x0Euis\x90\x0Fucuman\x90\x10shuaia\x90\x11ba\x90euncion\x90\x12\xC2ik\x07kokan\x90`a\x90\x03\xC5aelou\x1A&2I\xC2hr\x0Fia\x90\x13_banderas\x90\x14bados\x90\x15l\xC2ei\x03m\x90\x16ze\x90\x17anc-sablon\x90e\xC3agi\x08\r_vista\x90\x18ota\x90\x19se\x90\x1Aenos_aires\x90\x06\xC6ahioruCTa\x8C\x93\xC5mnrty\x19\x1E$,\xC2bp\x0Bridge_bay\x90\x1Bo_grande\x90\x1Ccun\x90\x1Dacas\x90\x1Eamarca\x90\x07\xC2em\x05nne\x90\x1Fan\x90`i\xC2ch\x05ago\x90 uahua\x90!udad_juarez\x90\"\xC3rsy\x14\x1D\xC2ad\x0Bl_harbour\x90`oba\x90\x08ta_rica\x90#haique\x90$eston\x90b\xC2ir\x05aba\x90%acao\x90e\xC3aeo\x1C+\xC2nw\x0Bmarkshavn\x90&son\x90'_creek\x90(\xC2nt\x05ver\x90)roit\x90*minica\x90e\xC4diln\x08\x10\x1Bmonton\x90+runepe\x90,_salvador\x90-senada\x90vort\xC2_a\x11\xC2nw\x07elson\x90.ayne\x909leza\x90/\xC4loru\t\x1B.ace_bay\x900\xC2do\x06thab\x90^se_bay\x901\xC2ae\tnd_turk\x902nada\x90e\xC2ay\x1C\xC3dty\x08\x0Feloupe\x90eemala\x903aquil\x904ana\x905\xC2ae\x0F\xC2lv\x06ifax\x906ana\x907rmosillo\x908\xC2nqn\xC2dueiana\xC2/pW\xC7ikmptvw\r\x12\x1A%/Andianapolis\x909nox\x90:arengo\x90;etersburg\x90ncennes\x90?inamac\x90@olis\x909vik\x90Aaluit\x90B\xC2au\x07maica\x90C\xC2jn\x04uy\x90\teau\x90D\xC3enr!(ntucky/\xC2lm\x0Bouisville\x90Eonticello\x90Fox_in\x90:alendijk\x90e\xC3aio\x06\n_paz\x90Gma\x90H\xC3suw\n\x13_angeles\x90Iisville\x90Eer_princes\x90e\xC4aeio;ks\xC5cnrtz\x05\x11\"*eio\x90Ja\xC2gu\x04ua\x90Ks\x90L\xC2it\x05got\x90einique\x90Mamoros\x90Natlan\x90O\xC4nrtx\x10\x15\x1E\xC2do\x05oza\x90\x0Bminee\x90Pida\x90Qlakatla\x90Rico_city\x90Squelon\x90Tn\xC2ct\x05ton\x90U\xC3ers\x0F\x14\xC2rv\x05rey\x90Video\x90Weal\x90werrat\x90e\xC5aeiou\x06\x0E\x15Lssau\x90ww_york\x90Xpigon\x90w\xC2mr\x03e\x90Y\xC2ot\x05nha\x90Zh_dakota/\xC3bcn\x07\x0Eeulah\x90[enter\x90\\ew_salem\x90]uk\x90^jinaga\x90_\xC4ahou\x1E%R\xC2nr\x11\xC2ag\x04ma\x90`nirtung\x90Bamaribo\x90aoenix\x90brt\xC3-_o\x0B\x15au-prince\x90cof_spain\x90e_\xC2av\x05cre\x90kelho\x90d\xC2en\nrto_rico\x90eta_arenas\x90f\xC4aeio\x190:\xC2in\nny_river\x90zkin_inlet\x90g\xC3cgs\x05\nife\x90hina\x90iolute\x90jo_branco\x90ksario\x90\x08\xC6achitw2>FK\x84\xC2no&t\xC3aio\x10\x15\xC2_r\x08isabel\x90vem\x90lago\x90m_domingo\x90n_paulo\x90ooresbysund\x90piprock\x90)tka\x90q_\xC6bjkltv\x0B\x11\x17\x1D$arthelemy\x90eohns\x90ritts\x90eucia\x90ehomas\x90eincent\x90eift_current\x90s\xC4ehio\x0B\x1C#gucigalpa\x90tu\xC2ln\x03e\x90uder_bay\x90wjuana\x90vr\xC2ot\x05nto\x90wola\x90e\xC2ai\tncouver\x90xrgin\x90e\xC2hi\nitehorse\x90ynnipeg\x90z\xC2ae\x07kutat\x90{llowknife\x90+tarctica/\xC8cdmprstv\x06\x1D9@H[aasey\x90|\xC2au\x05vis\x90}montdurville\x92@\xC2ac\x11\xC2cw\x08quarie\x90~son\x90\x7Fmurdo\x92(almer\x91\0othera\x91\x01\xC2oy\nuth_pole\x92(owa\x918roll\x91\x02ostok\x91\x03ctic/longyearbyen\x92\x01ia/\xE1uabcdfghijkmnopqrstuvy\0\0\0\0\0\0\x01\x01\x01\x01\x01\x02\x02\x02\x02\x02\x02\x03\x03\x03G\x87\xC1\xF0\xFA\xFF,?]\xD0\xFD\x1F+Miz\xC1\x0BD\\\xC7dlmnqst\x04\n\x0F\x15!3en\x918maty\x91\x04man\x91\x05adyr\x91\x06t\xC2ao\x03u\x91\x07be\x91\x08h\xC2gk\x06abat\x91\thabad\x91\tyrau\x91\n\xC4aeir%+2\xC5ghknr\x06\x0C\x0F\x15hdad\x91\x0Brain\x915u\x91\x0Cgkok\x91\rnaul\x91\x0Eirut\x91\x0Fshkek\x91\x10unei\x91)\xC3aho\x08-lcutta\x91'\xC3iou\x04\x17ta\x91\x11\xC2in\x08balsan\x91Fgqing\x91\xC5abeho\x10\x17'4\xC2is\x05pei\x91?hkent\x91@ilisi\x91A\xC2hl\x05ran\x91B_aviv\x91!im\xC2bp\x03u\x91Chu\x91C\xC2km\x04yo\x91Dsk\x91E\xC4jlrs\r#)ung_pandang\x91,a\xC2an\tnbaatar\x91F_bator\x91Fumqi\x91Gt-nera\x91H\xC2il\tentiane\x91\radivostok\x91I\xC2ae\x0F\xC2kn\x06utsk\x91Jgon\x91K\xC2kr\x0Caterinburg\x91Levan\x91Mlantic/\xC8abcfjmrs\x07\x0F\"0:BKzores\x91Nermuda\x91Oa\xC2np\x05ary\x91Pe_verde\x91Qa\xC2er\x05roe\x91Roe\x91Ran_mayen\x92\x01adeira\x91Seykjavik\x80\xC2ot\ruth_georgia\x91T\xC2_a\x07helena\x80nley\x91Ustralia/\xD0abcdehlmnpqstvwy\x0F%7>DKeo{\x81\x8C\x9B\xA4\xAD\xB2\xC2cd\x03t\x91`elaide\x91Vr\xC2io\x07sbane\x91Wken_hill\x91X\xC2au\x08nberra\x91`rrie\x91[arwin\x91Yucla\x91Zobart\x91[\xC3hio\x03\x0Bi\x91]ndeman\x91\\rd_howe\x91]elbourne\x91^\xC2os\x05rth\x91Yw\x91`erth\x91_ueensland\x91W\xC2oy\x05uth\x91Vdney\x91`asmania\x91[ictoria\x91^est\x91_ancowinna\x91Xrazil/\xC4adew\x05\x0F\x14cre\x90kenoronha\x90Zast\x90oest\x90L\xC5aehsu_b\x83\x8Anada/\xC8acemnpsy\t\x11\x19\"/7Dtlantic\x906entral\x90zastern\x90wountain\x90+ewfoundland\x90racific\x90xaskatchewan\x90iukon\x90yt\x92\x02ile/\xC2ce\x0Continental\x90masterisland\x92+t6cdt\x90 ba\x907\xE1fegistu\0\0\0\0\0\x03\x07\x0B\x14\xBEt\x91\x7Fypt\x83re\x92\x06t\x90`5edt\x90Xc/\xC3guz\x88\x9D\xC2mr{t\x91a\xC3+-04p\xCA0123456789\x02\x10\x12\x14\x16\x18\x1A\x1C\x1E\x91a\x91b\xC3012\x02\x04\x91c\x91d\x91e\x91f\x91g\x91h\x91i\x91j\x91k\x91l\x91m\xCA0123456789\x02\x18\x1A\x1C\x1E \"$&\x91a\x91n\xC501234\x02\x04\x06\x08\x91o\x91p\x91q\x91r\x91s\x91t\x91u\x91v\x91w\x91x\x91y\x91z\x91{\x91aeenwich\x91a\xC3cnt\x03\x0Ct\x91|iversal\x91|c\x91|ulu\x91|rope/\xE1uabcdghijklmnoprstuvwz\0\0\0\0\0\0\0\0\0\x01\x01\x01\x01\x01\x01\x01\x01\x01\x02\x02'u\x8B\x92\xA7\xB0\xC6\xCD\xED\x14DLQkw\xC1\xDA\xEF\x1B\"\xC4mnst\t\x10\x19sterdam\x92\x02dorra\x91}trakhan\x91~hens\x91\x7F\xC3eru\x18,\xC2lr\x0F\xC2fg\x05ast\x92\x0Erade\x92\0lin\x92\x01\xC2au\ttislava\x92\x14ssels\x92\x02\xC3cds\x08\x0Fharest\x92\x03apest\x92\x04ingen\x92\"\xC2ho\x08isinau\x92\x05penhagen\x92\x01ublin\x92\x06\xC2iu\tbraltar\x92\x07ernsey\x92\x0Eelsinki\x92\x08s\xC2lt\ne_of_man\x92\x0Eanbul\x92\tersey\x92\x0E\xC3aiy\x0B\x16liningrad\x92\n\xC2er\x03v\x92\x0Cov\x92\x0Biv\x92\x0C\xC4ijou\x06\x0F\x15sbon\x92\rubljana\x92\0ndon\x92\x0Exembourg\x92\x02\xC3aio\x17\x1C\xC3dlr\x05\trid\x92\x0Fta\x92\x10iehamn\x92\x08nsk\x92\x11\xC2ns\x05aco\x92\x13cow\x92\x12icosia\x91.slo\x92\x01\xC3aor\x05\x0Eris\x92\x13dgorica\x92\0ague\x92\x14\xC2io\x04ga\x92\x15me\x92\x16\xC5aikot\",27\xC3mnr\x05\x0Eara\x92\x17_marino\x92\x16a\xC2jt\x05evo\x92\0ov\x92\x18mferopol\x92\x19opje\x92\0fia\x92\x1Aockholm\x92\x01\xC2ai\x07llinn\x92\x1Bra\xC2ns\x03e\x92\x1Cpol\x92\x05\xC2lz\tyanovsk\x92\x1Dhgorod\x92\x0C\xC3aio\x0E\x1D\xC2dt\x04uz\x92\"ican\x92\x16\xC2el\x05nna\x92\x1Enius\x92\x1Flgograd\x92 arsaw\x92!\xC2au\x12\xC2gp\x05reb\x92\0orozhye\x92\x0Crich\x92\"actory\x92#\xC3bmr\t\x1A\x92\x0E-eire\x92\x0Et\x91a\xC3+-0\x03\x060\x91a0\x91a\x91aeenwich\x91a\xC2os\x08ngkong\x91\x1Ct\x923\xC4cnrs\x06txeland\x80dian/\xC5ackmr\x0C-7Wntananarivo\x8D\xC2ho\x11\xC2ar\x05gos\x92$istmas\x91\r\xC2cm\x04os\x91Koro\x8Derguelen\x92%a\xC4hluy\x03\n\x12e\x91\x16dives\x92%ritius\x92&otte\x8Deunion\x91\x16an\x91Brael\x91!a\xC2mp\x06aica\x90Can\x91Dwajalein\x927ibya\x90\0\xC2es'\xC2tx\x02\x92\x02ico/\xC2bg\x11aja\xC2ns\x06orte\x90vur\x90Oeneral\x90St\x90b7mdt\x90)\xC2az\x06vajo\x90)\x92(-chat\x92*\xE1daors\x01\x01\x01\xB4\xC4\xC7cific/\xE1qabcefghjkmnprstwy\0\0\0\0\0\0\0\0\0\0\0\x01\x01\x01\x01\x01\x10\x1D,F_\x85\x8E\x97\xBE\xD9\xF71;Ijw\xC2pu\x04ia\x92'ckland\x92(ougainville\x92)h\xC2au\x06tham\x92*uk\x92@\xC3afn\x06\x0Bster\x92+ate\x92,derbury\x924\xC3aiu\x07\x0Bkaofo\x92-ji\x92.nafuti\x92C\xC2au\x12\xC2lm\x08apagos\x92/bier\x920a\xC2dm\talcanal\x921\x922onolulu\x923ohnston\x923\xC4aiow\x06\x10\x16nton\x924ritimati\x925srae\x926ajalein\x927\xC2ai\x11\xC2jr\x05uro\x92Cquesas\x928dway\x92=\xC3aio\x05\turu\x929ue\x92:\xC2ru\x06folk\x92;mea\x92<\xC3aio\x10\x18\xC2gl\x08o_pago\x92=au\x92>tcairn\x92?\xC3hnr\x06\x0Bnpei\x921ape\x921t_moresby\x92@arotonga\x92Aa\xC2im\x05pan\x922oa\x92=\xC3aor\x0E\x17\xC2hr\x05iti\x92Bawa\x92Cngatapu\x92Duk\x92@a\xC2kl\x03e\x92Clis\x92Cap\x92@\xC2lr\x05and\x92!tugal\x92\rc\x91Mai\xC2lr\x10\xC2ae\x05ska\x90\x04utian\x90\x03izona\x90bentral\x90 ast\xC2-e\tindiana\x909rn\x90Xawaii\x923ndiana-starke\x90:\xC2io\x08chigan\x90*untain\x90)acific\x90Iamoa\x92=c\x91|\xC2-e\x04su\x92\x12t\x92\rulu\x91|") + }, }, tzifs : unsafe { + zerovec::vecs::VarZeroVec32::from_bytes_unchecked(b"U\x01\0\0X\0\0\0\x03\x02\0\0l\x02\0\0L\x07\0\0\xE9\x0E\0\0\xE8\x10\0\0\xC8\x17\0\0T\x18\0\0\xEF\x19\0\0\x8A\x1B\0\0\r\x1C\0\0e\x1C\0\0\xD7\x1C\0\0c\x1D\0\0\xD5\x1D\0\0X\x1E\0\0\xE5\x1F\0\0R!\0\0\xC0#\0\0F'\0\0\xCC*\0\0\xEE,\0\0\x83/\0\0!2\0\0\xAD4\0\0A7\0\0\xE99\0\0\x87<\0\0&?\0\0\xB1A\0\0YD\0\0\xF7F\0\0\x9EI\0\0=L\0\0wP\0\0\xF3R\0\0\xAET\0\0\x94U\0\0\xF0V\0\0\xC1Z\0\0A\\\0\0\xBC\\\0\0\x81`\0\0\xAFc\0\0\x0Cg\0\0\x0Bi\0\0\x97i\0\0\0j\0\0\xD5p\0\0vs\0\0 v\0\0\xD1v\0\0?|\0\0\x8A\x7F\0\0\x1B\x81\0\0\xF9\x84\0\0c\x87\0\0,\x8B\0\0d\x8E\0\0\xE5\x91\0\0n\x93\0\0\xE0\x93\0\0G\x99\0\0\xFD\x9A\0\0$\x9E\0\0\xF2\xA3\0\0\x07\xA7\0\0\xAF\xA7\0\x002\xA8\0\0\xB5\xA8\0\0\xF4\xAE\0\0\x1F\xB3\0\0\xF8\xB3\0\0\xC4\xB5\0\0\x97\xB9\0\0\x8C\xBB\0\0\xFC\xBD\0\0\xC8\xBF\0\0\xF3\xC0\0\0\xDA\xC2\0\0\xF6\xC4\0\0\x0B\xC8\0\0(\xCB\0\0E\xCC\0\0\xD7\xCF\0\0\x8E\xD4\0\0\x15\xD8\0\0\x87\xD8\0\0v\xD9\0\0;\xDE\0\0\x03\xE0\0\0\0\xE1\0\0n\xE2\0\0\xE9\xE2\0\0W\xE4\0\0|\xE5\0\0\xF3\xE8\0\0\xF2\xE9\0\0\xE8\xEB\0\0X\xED\0\0L\xEF\0\0\xD6\xF4\0\0\r\xF6\0\0\x0E\xF9\0\0\x95\xFF\0\0\x01\x03\x01\0\xB7\x04\x01\0w\x08\x01\0\x18\x0C\x01\0\xAE\x0F\x01\0&\x13\x01\0\xC7\x15\x01\x000\x16\x01\0\xBB\x16\x01\0u\x17\x01\0r\x19\x01\0\xCE\x1A\x01\0I\x1B\x01\0\x1F \x01\0\x17#\x01\0\xCD$\x01\0\n'\x01\0\x03*\x01\0z+\x01\0\xE8,\x01\x0022\x01\0<3\x01\0\xA26\x01\0_:\x01\0\xE4=\x01\0\xD5D\x01\0\x04F\x01\0\x9AF\x01\0,H\x01\x006L\x01\0\xA2R\x01\0\x8BW\x01\0i[\x01\0.`\x01\0\x81c\x01\0qd\x01\0\x07e\x01\0\x9Ah\x01\0\x03i\x01\0ql\x01\0\xC9l\x01\x003m\x01\0\xAEm\x01\0\x01p\x01\0ps\x01\0tv\x01\0\xDDx\x01\0P{\x01\0\xA4|\x01\0\x19\x7F\x01\0>\x80\x01\0\xC2\x81\x01\0#\x82\x01\0\x05\x85\x01\0\xA5\x87\x01\0\xFA\x89\x01\0\xDB\x8C\x01\0\x9C\x8D\x01\0=\x92\x01\0\xEB\x92\x01\0f\x93\x01\0\xBE\x93\x01\0\xFE\x94\x01\0d\x98\x01\0\x97\xA1\x01\0\xDC\xAA\x01\0\x8C\xAB\x01\0\x81\xAE\x01\0\x90\xB0\x01\0q\xB3\x01\0(\xB4\x01\0\x9A\xB4\x01\0\x8E\xB8\x01\0\xF7\xB8\x01\0\xC6\xBB\x01\0~\xBC\x01\0\xE7\xBC\x01\0\xE3\xBF\x01\0\x89\xC0\x01\0a\xC3\x01\0j\xC4\x01\0p\xC7\x01\0Q\xCA\x01\0\xCC\xCA\x01\0\xB6\xCB\x01\0\xBD\xCD\x01\0\x8C\xD0\x01\0n\xD3\x01\0F\xD6\x01\0\xBF\xD8\x01\0n\xD9\x01\0\xF2\xD9\x01\0[\xDA\x01\0\xD8\xDC\x01\0g\xDF\x01\0\xBF\xDF\x01\0\xA9\xE2\x01\0\xFC\xE3\x01\0V\xE5\x01\0X\xE6\x01\0\x18\xE7\x01\0\xF0\xE9\x01\0\xD3\xEB\x01\0\x1D\xED\x01\0q\xEF\x01\0E\xF2\x01\0\xAE\xF2\x01\0 \xF3\x01\0\x02\xF6\x01\0\x11\xF8\x01\0i\xF8\x01\0Z\xFB\x01\x002\xFE\x01\0\n\x01\x02\0\x85\x01\x02\0n\x04\x02\0\"\x07\x02\0u\x0C\x02\x004\x10\x02\0\xD7\x11\x02\0[\x12\x02\0\xDB\x13\x02\0\xF6\x18\x02\0N\x19\x02\0Q\x1C\x02\0\xAD\x1F\x02\0\x82 \x02\0\xEF#\x02\0\x9F$\x02\0\x86%\x02\0=)\x02\0H*\x02\0\xB0,\x02\0\xFB/\x02\0\xE20\x02\0-4\x02\0t4\x02\0\xBB4\x02\0\x025\x02\0I5\x02\0\x905\x02\0\xD75\x02\0\x1E6\x02\0e6\x02\0\xAC6\x02\0\xF36\x02\0:7\x02\0\x817\x02\0\xC87\x02\0\x0F8\x02\0V8\x02\0\x9D8\x02\0\xE48\x02\0+9\x02\0r9\x02\0\xB99\x02\0\0:\x02\0G:\x02\0\x8E:\x02\0\xD5:\x02\0\x1C;\x02\0c;\x02\0\xAA;\x02\0\xF1;\x02\0:=\x02\0\r@\x02\0\x86B\x02\0*D\x02\0\xAEF\x02\0\xE3J\x02\0 M\x02\0\xE4O\x02\0\xADR\x02\0PX\x02\0\xDB\\\x02\0v^\x02\0\x13c\x02\0\x93f\x02\0\\i\x02\0@k\x02\0\xB2p\x02\0\xD3v\x02\0(z\x02\0\x8E}\x02\0\x9D\x80\x02\0\0\x84\x02\0\x16\x88\x02\0\x9A\x8A\x02\0\x06\x8D\x02\0u\x90\x02\0\\\x93\x02\x000\x96\x02\0\x8A\x99\x02\0\x9A\x9B\x02\0\xF6\x9D\x02\0\x18\xA0\x02\0\"\xA3\x02\0z\xA5\x02\0\xDB\xA7\x02\0\xB8\xAA\x02\x000\xAE\x02\0\xE5\xAF\x02\0,\xB0\x02\0\x95\xB0\x02\0\xF6\xB0\x02\0z\xB1\x02\0B\xB2\x02\0F\xB6\x02\0\xDA\xB6\x02\0\xB8\xB9\x02\0/\xBE\x02\0L\xBF\x02\0\xB5\xBF\x02\0\xAE\xC0\x02\x002\xC1\x02\0\x8A\xC1\x02\0\xE2\xC1\x02\0\x06\xC3\x02\0\xA4\xC3\x02\0\x1E\xC4\x02\0\x98\xC4\x02\0X\xC5\x02\0\xFD\xC5\x02\0U\xC6\x02\0\xD8\xC6\x02\0A\xC7\x02\0\xD5\xC7\x02\0k\xC8\x02\0\xD4\xC8\x02\0=\xC9\x02\0\xA6\xC9\x02\0\x0F\xCA\x02\0\xA3\xCA\x02\0\xFB\xCA\x02\0S\xCB\x02\0GMT\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\t\0H\x92\xE6\x92\xFF\xFF\xFF\xFF\x018\xFC\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0CET\0\0\x10\x0E\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\x01<\x01$\x9B\xC9k\xFF\xFF\xFF\xFFOP`\x91\xFF\xFF\xFF\xFF\xF0xG\x9B\xFF\xFF\xFF\xFFp,\xD7\x9B\xFF\xFF\xFF\xFFp\x91\xBC\x9C\xFF\xFF\xFF\xFF\xF0H\xC0\x9D\xFF\xFF\xFF\xFFp\xFE\x89\x9E\xFF\xFF\xFF\xFF\xF0*\xA0\x9F\xFF\xFF\xFF\xFF\xF0\xA5`\xA0\xFF\xFF\xFF\xFF\xF0\x0C\x80\xA1\xFF\xFF\xFF\xFF\xF0\x12.\xA2\xFF\xFF\xFF\xFF\xF0Lz\xA3\xFF\xFF\xFF\xFF\xF0\x815\xA4\xFF\xFF\xFF\xFFp\x06\xB8\xA4\xFF\xFF\xFF\xFFp\x06\xFF\xC6\xFF\xFF\xFF\xFF\x80\xBAX\xC7\xFF\xFF\xFF\xFF\xA0\t\xDA\xC7\xFF\xFF\xFF\xFF\x104\x92\xCF\xFF\xFF\xFF\xFF\0\0\x8A\xD0\xFF\xFF\xFF\xFF\x10\x16r\xD1\xFF\xFF\xFF\xFFp$N\xD2\xFF\xFF\xFF\xFFp\x07K\xD4\xFF\xFF\xFF\xFF\0\xD3\xCE\xE5\xFF\xFF\xFF\xFF\xF0\xB0\\\xF3\xFF\xFF\xFF\xFF\xF0\xC1x\x02\0\0\0\0\xF0\xC8C\x03\0\0\0\0\0\xD7\xCF\r\0\0\0\0\xF0D\xAD\x0E\0\0\0\0\0Zx\x0F\0\0\0\0\x10Yh\x10\0\0\0\0pCv\x12\0\0\0\0\x80Bf\x13\0\0\0\0\x10|_\x14\0\0\0\0\0_O\x15\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x05\x03\x04\x05\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x03\x04\x05\x03\x04\x02\x03\x04\x02\x03\x04\xDC\x02\0\0\0\0\0\x001\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0 \x1C\0\0\0\0\0\0GMT\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\0\x12\0\x90\x9C\xE6\x92\xFF\xFF\xFF\xFF\x10ag\t\0\0\0\0\x01\x02d\xF1\xFF\xFF\xFF\xFF\xFF\xFF\xF0\xF1\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0EET\0\0 \x1C\0\0\0\0\0\0\x01EEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x04\x05\x05\0\0\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\x04\x80Q\x01\0\0\0\0\0\x08\x04\x89\x04\xABM\xBD}\xFF\xFF\xFF\xFF\xE0\xB4\x93\xC8\xFF\xFF\xFF\xFF\xD0{\xFA\xC8\xFF\xFF\xFF\xFF\xE0\xEF\xFC\xC9\xFF\xFF\xFF\xFF\xD0\xE8\xC7\xCA\xFF\xFF\xFF\xFF`\xAE\xCB\xCB\xFF\xFF\xFF\xFF\xD0)\xDF\xCC\xFF\xFF\xFF\xFF\xE0\xE1\xAC\xCD\xFF\xFF\xFF\xFF\xD0\xF4\xC6\xCE\xFF\xFF\xFF\xFF\xE0f\x8F\xCF\xFF\xFF\xFF\xFF\xD0y\xA9\xD0\xFF\xFF\xFF\xFF\xE0`\x84\xD1\xFF\xFF\xFF\xFFP\xAD\x8A\xD2\xFF\xFF\xFF\xFF`c6\xE8\xFF\xFF\xFF\xFFP-\xF4\xE8\xFF\xFF\xFF\xFF`\xB9\x0B\xEA\xFF\xFF\xFF\xFF\xD0`\xD5\xEA\xFF\xFF\xFF\xFF\xF0\xFA\xEC\xEB\xFF\xFF\xFF\xFF\0m\xB5\xEC\xFF\xFF\xFF\xFF\xF0\x7F\xCF\xED\xFF\xFF\xFF\xFF\0\xF2\x97\xEE\xFF\xFF\xFF\xFFp\xB3\xB0\xEF\xFF\xFF\xFF\xFF\x80%y\xF0\xFF\xFF\xFF\xFF\xF0\xE6\x91\xF1\xFF\xFF\xFF\xFF\0YZ\xF2\xFF\xFF\xFF\xFFp\x1As\xF3\xFF\xFF\xFF\xFF\x80\x8C;\xF4\xFF\xFF\xFF\xFFp\x9FU\xF5\xFF\xFF\xFF\xFF\x80\x11\x1E\xF6\xFF\xFF\xFF\xFF\xF0\xD26\xF7\xFF\xFF\xFF\xFF\0E\xFF\xF7\xFF\xFF\xFF\xFFp\x06\x18\xF9\xFF\xFF\xFF\xFF\0\xCA\xE1\xF9\xFF\xFF\xFF\xFF\xF09\xF9\xFA\xFF\xFF\xFF\xFF\x80\xFD\xC2\xFB\xFF\xFF\xFF\xFF\xF0\xBE\xDB\xFC\xFF\xFF\xFF\xFF\x80\x82\xA5\xFD\xFF\xFF\xFF\xFFp\xF2\xBC\xFE\xFF\xFF\xFF\xFF\0\xB6\x86\xFF\xFF\xFF\xFF\xFF\xF0%\x9E\0\0\0\0\0\x80\xE9g\x01\0\0\0\0pY\x7F\x02\0\0\0\0\0\x1DI\x03\0\0\0\0p\xDEa\x04\0\0\0\0\0\xA2+\x05\0\0\0\0\xF0\x11C\x06\0\0\0\0\x80\xD5\x0C\x07\0\0\0\0pE$\x08\0\0\0\0\0\t\xEE\x08\0\0\0\0\xF0x\x05\n\0\0\0\0\x80<\xCF\n\0\0\0\0\xF0\xFD\xE7\x0B\0\0\0\0\x80\xC1\xB1\x0C\0\0\0\0p1\xC9\r\0\0\0\0\0\xF5\x92\x0E\0\0\0\0\xF0d\xAA\x0F\0\0\0\0\x80(t\x10\0\0\0\0p\x98\x8B\x11\0\0\0\0\0\\U\x12\0\0\0\0p\x1Dn\x13\0\0\0\0\0\xE17\x14\0\0\0\0\xF0PO\x15\0\0\0\0\x80\x14\x19\x16\0\0\0\0\xF0\x93\xA0\x17\0\0\0\0\0H\xFA\x17\0\0\0\0\xF0\xA3p\x19\0\0\0\0\x80{\xDB\x19\0\0\0\0\xF0<\xF4\x1A\0\0\0\0\x80\0\xBE\x1B\0\0\0\0pp\xD5\x1C\0\0\0\0\x004\x9F\x1D\0\0\0\0\xF0\xA3\xB6\x1E\0\0\0\0\x80g\x80\x1F\0\0\0\0p\xD7\x97 \0\0\0\0\0\x9Ba!\0\0\0\0p\\z\"\0\0\0\0\0 D#\0\0\0\0p'b$\0\0\0\0\x80S%%\0\0\0\0p\xC3<&\0\0\0\0\0\x87\x06'\0\0\0\0\xF0\xF6\x1D(\0\0\0\0\x80\xBA\xE7(\0\0\0\0\xF0{\0*\0\0\0\0\x80?\xCA*\0\0\0\0p\xAF\xE1+\0\0\0\0\0s\xAB,\0\0\0\0\xF0\xE2\xC2-\0\0\0\0\x80\xA6\x8C.\0\0\0\0\xE0\x13\xA0/\0\0\0\0\xD0\x0Ck0\0\0\0\0\xE0\xF5\x7F1\0\0\0\0\xD0\xEEJ2\0\0\0\0\xE0\xD7_3\0\0\0\0\xD0\xD0*4\0\0\0\0\xE0\xB9?5\0\0\0\0\xD0\xB2\n6\0\0\0\0`\xD6(7\0\0\0\0P\xCF\xF37\0\0\0\0`\xB8\x089\0\0\0\0P\xB1\xD39\0\0\0\0`\x9A\xE8:\0\0\0\0P\x93\xB3;\0\0\0\0`|\xC8<\0\0\0\0Pu\x93=\0\0\0\0`^\xA8>\0\0\0\0PWs?\0\0\0\0\xE0z\x91@\0\0\0\0\xD0s\\A\0\0\0\0\xE0\\qB\0\0\0\0\xD0UQD\0\0\0\0P\xFD\x12E\0\0\0\0\xE0 1F\0\0\0\0Pj\xE0F\0\0\0\0\xE0\x02\x11H\0\0\0\0\xD0\x11\xB7H\0\0\0\0\xE0\xE4\xF0I\0\0\0\0P\xB9\x8DJ\0\0\0\0`\x01\xDAK\0\0\0\0\xD0\xBDaL\0\0\0\0\xE0X\x89L\0\0\0\0P\xFA\xA4L\0\0\0\0\xE08uS\0\0\0\0\xD0\x89\xACS\0\0\0\0`\xBC\xDAS\0\0\0\0P\x82$T\0\0\0\0`\xF0Jd\0\0\0\0P\xD3:e\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01U\x1D\0\0\0\0\0\0 \x1C\0\0\0\0\0\x000*\0\0\0\0\0\0+01\0\0\x10\x0E\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \x06>\x07\x9C\xF9Q\x96\xFF\xFF\xFF\xFF\x80\x14\xFF\xC6\xFF\xFF\xFF\xFFp\xACX\xC7\xFF\xFF\xFF\xFF\x80\xED\xD9\xC7\xFF\xFF\xFF\xFF\xF02\xA1\xD2\xFF\xFF\xFF\xFF\0\xA45\xDB\xFF\xFF\xFF\xFF\xF0'\xEE\xDB\xFF\xFF\xFF\xFF@r%\xFB\xFF\xFF\xFF\xFFp\xEF\xC2\xFB\xFF\xFF\xFF\xFF\x80\x84k\x08\0\0\0\0\xF0m\xC6\x08\0\0\0\0\0\x0C\xE8\x0B\0\0\0\0\xF0Ga\x0C\0\0\0\0\x80?\xC9\r\0\0\0\0p\xF2\x8E\x0E\0\0\0\0\x80Q\xD3\x0F\0\0\0\0p\xA3'\x10\0\0\0\0\0\xA6\xB7\x1A\0\0\0\0\xF0o\x18\x1E\0\0\0\0\x80\xE6AH\0\0\0\0p\"\xBBH\0\0\0\0\0\x1A#J\0\0\0\0p\xD5\x8DJ\0\0\0\0\x80\xC0\xDCK\0\0\0\0p\xE5]L\0\0\0\0\x80\xB8\x97M\0\0\0\0\xF0\x8C4N\0\0\0\0\xA0\xA0\x9CO\0\0\0\0\xA0\xBB\x08P\0\0\0\0 \x9A1P\0\0\0\0\xA0\xA7gP\0\0\0\0\xA0\x82|Q\0\0\0\0\xA0\xCB\xD8Q\0\0\0\0\xA0\x9E\x05R\0\0\0\0\xA0slR\0\0\0\0\xA0z7S\0\0\0\0\xA0!\xAES\0\0\0\0 F\xDCS\0\0\0\0\xA0ULT\0\0\0\0\xA0\\\x17U\0\0\0\0 \xE0|U\0\0\0\0\xA0\x04\xABU\0\0\0\0\xA07,V\0\0\0\0\xA0>\xF7V\0\0\0\0\xA0\x87SW\0\0\0\0 \xAC\x81W\0\0\0\0 T\x15X\0\0\0\0\xA0 \xD7X\0\0\0\0\xA0\xF4 Y\0\0\0\0\xA0SXY\0\0\0\0 6\xF5Y\0\0\0\0\xA0\x02\xB7Z\0\0\0\0 \x9C\xF7Z\0\0\0\0\xA0\xC0%[\0\0\0\0\xA0C\xCE\\\0\0\0\0 h\xFC\\\0\0\0\0\xA0\xB0\x9B^\0\0\0\0\xA0\x0F\xD3^\0\0\0\0 Xr`\0\0\0\0\xA0|\xA0`\0\0\0\0 \xC5?b\0\0\0\0 $wb\0\0\0\0\xA0l\x16d\0\0\0\0 \x91Dd\0\0\0\0 \x14\xEDe\0\0\0\0\xA08\x1Bf\0\0\0\0 \x81\xBAg\0\0\0\0 \xE0\xF1g\0\0\0\0\xA0(\x91i\0\0\0\0 M\xBFi\0\0\0\0 \xD0gk\0\0\0\0\xA0\xF4\x95k\0\0\0\0 =5m\0\0\0\0 \x9Clm\0\0\0\0\xA0\xE4\x0Bo\0\0\0\0 \t:o\0\0\0\0\xA0Q\xD9p\0\0\0\0\xA0\xB0\x10q\0\0\0\0 \xF9\xAFr\0\0\0\0\xA0\x1D\xDEr\0\0\0\0\xA0\xA0\x86t\0\0\0\0 \xC5\xB4t\0\0\0\0\xA0\rTv\0\0\0\0\xA0l\x8Bv\0\0\0\0 \xB5*x\0\0\0\0\xA0\xD9Xx\0\0\0\0 \"\xF8y\0\0\0\0 \x81/z\0\0\0\0\xA0\xC9\xCE{\0\0\0\0\xA0(\x06|\0\0\0\0 q\xA5}\0\0\0\0\xA0\x95\xD3}\0\0\0\0 \xDEr\x7F\0\0\0\0 =\xAA\x7F\0\0\0\0\xA0\x85I\x81\0\0\0\0 \xAAw\x81\0\0\0\0 - \x83\0\0\0\0\xA0QN\x83\0\0\0\0 \x9A\xED\x84\0\0\0\0 \xF9$\x85\0\0\0\0\xA0A\xC4\x86\0\0\0\0 f\xF2\x86\0\0\0\0\xA0\xAE\x91\x88\0\0\0\0\xA0\r\xC9\x88\0\0\0\0 Vh\x8A\0\0\0\0 \xB5\x9F\x8A\0\0\0\0\xA0\xFD>\x8C\0\0\0\0 \"m\x8C\0\0\0\0\xA0j\x0C\x8E\0\0\0\0\xA0\xC9C\x8E\0\0\0\0 \x12\xE3\x8F\0\0\0\0\xA06\x11\x90\0\0\0\0\xA0\xB9\xB9\x91\0\0\0\0 \xDE\xE7\x91\0\0\0\0\xA0&\x87\x93\0\0\0\0\xA0\x85\xBE\x93\0\0\0\0 \xCE]\x95\0\0\0\0\xA0\xF2\x8B\x95\0\0\0\0 ;+\x97\0\0\0\0 \x9Ab\x97\0\0\0\0\xA0\xE2\x01\x99\0\0\0\0\xA0A9\x99\0\0\0\0 \x8A\xD8\x9A\0\0\0\0\xA0\xAE\x06\x9B\0\0\0\0 \xF7\xA5\x9C\0\0\0\0 V\xDD\x9C\0\0\0\0\xA0\x9E|\x9E\0\0\0\0 \xC3\xAA\x9E\0\0\0\0 FS\xA0\0\0\0\0\xA0j\x81\xA0\0\0\0\0 \xB3 \xA2\0\0\0\0 \x12X\xA2\0\0\0\0\xA0Z\xF7\xA3\0\0\0\0 \x7F%\xA4\0\0\0\0\xA0\xC7\xC4\xA5\0\0\0\0\xA0&\xFC\xA5\0\0\0\0 o\x9B\xA7\0\0\0\0 \xCE\xD2\xA7\0\0\0\0\xA0\x16r\xA9\0\0\0\0 ;\xA0\xA9\0\0\0\0\xA0\x83?\xAB\0\0\0\0\xA0\xE2v\xAB\0\0\0\0 +\x16\xAD\0\0\0\0\xA0OD\xAD\0\0\0\0\xA0\xD2\xEC\xAE\0\0\0\0 \xF7\x1A\xAF\0\0\0\0\xA0?\xBA\xB0\0\0\0\0\xA0\x9E\xF1\xB0\0\0\0\0 \xE7\x90\xB2\0\0\0\0\xA0\x0B\xBF\xB2\0\0\0\0 T^\xB4\0\0\0\0 \xB3\x95\xB4\0\0\0\0\xA0\xFB4\xB6\0\0\0\0\xA0Zl\xB6\0\0\0\0 \xA3\x0B\xB8\0\0\0\0\xA0\xC79\xB8\0\0\0\0 \x10\xD9\xB9\0\0\0\0 o\x10\xBA\0\0\0\0\xA0\xB7\xAF\xBB\0\0\0\0 \xDC\xDD\xBB\0\0\0\0 _\x86\xBD\0\0\0\0\xA0\x83\xB4\xBD\0\0\0\0 \xCCS\xBF\0\0\0\0 +\x8B\xBF\0\0\0\0\xA0s*\xC1\0\0\0\0 \x98X\xC1\0\0\0\0\xA0\xE0\xF7\xC2\0\0\0\0\xA0?/\xC3\0\0\0\0 \x88\xCE\xC4\0\0\0\0 \xE7\x05\xC5\0\0\0\0\xA0/\xA5\xC6\0\0\0\0 T\xD3\xC6\0\0\0\0\xA0\x9Cr\xC8\0\0\0\0\xA0\xFB\xA9\xC8\0\0\0\0 DI\xCA\0\0\0\0\xA0hw\xCA\0\0\0\0\xA0\xEB\x1F\xCC\0\0\0\0 \x10N\xCC\0\0\0\0\xA0X\xED\xCD\0\0\0\0\xA0\xB7$\xCE\0\0\0\0 \0\xC4\xCF\0\0\0\0\xA0$\xF2\xCF\0\0\0\0 m\x91\xD1\0\0\0\0 \xCC\xC8\xD1\0\0\0\0\xA0\x14h\xD3\0\0\0\0 9\x96\xD3\0\0\0\0 \xBC>\xD5\0\0\0\0\xA0\xE0l\xD5\0\0\0\0 )\x0C\xD7\0\0\0\0 \x88C\xD7\0\0\0\0\xA0\xD0\xE2\xD8\0\0\0\0 \xF5\x10\xD9\0\0\0\0 x\xB9\xDA\0\0\0\0\xA0\x9C\xE7\xDA\0\0\0\0 \xE5\x86\xDC\0\0\0\0 D\xBE\xDC\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\xE4\xF8\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0CET\0\0\x10\x0E\0\0\0\0\0\0\x01CEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\x000*\0\0\0\0\0\0`\x01\x98\x01\0\xB56~\xFF\xFF\xFF\xFFpu\xD6\x9E\xFF\xFF\xFF\xFF`n\xA1\x9F\xFF\xFF\xFF\xFFp\xEF\x05\xAA\xFF\xFF\xFF\xFF\0n\xE7\xAA\xFF\xFF\xFF\xFF\xF0\xA7\xC9\xAD\xFF\xFF\xFF\xFF\x002\xA7\xAE\xFF\xFF\xFF\xFFpO\xA0\xAF\xFF\xFF\xFF\xFF\0\x14\x87\xB0\xFF\xFF\xFF\xFF\0z\x89\xB1\xFF\xFF\xFF\xFF\x800p\xB2\xFF\xFF\xFF\xFF@r%\xFB\xFF\xFF\xFF\xFFp\xEF\xC2\xFB\xFF\xFF\xFF\xFF\x80\x84k\x08\0\0\0\0\xF0m\xC6\x08\0\0\0\0\0\x0C\xE8\x0B\0\0\0\0\xF0Ga\x0C\0\0\0\0\x80?\xC9\r\0\0\0\0p\xF2\x8E\x0E\0\0\0\0\x80Q\xD3\x0F\0\0\0\0p\xA3'\x10\0\0\0\0\0\xA6\xB7\x1A\0\0\0\0\xF0o\x18\x1E\0\0\0\0\x10\x81|\x1F\0\0\0\0\x10rl \0\0\0\0\x10c\\!\0\0\0\0\x10TL\"\0\0\0\0\x10E<#\0\0\0\0\x106,$\0\0\0\0\x10'\x1C%\0\0\0\0\x10\x18\x0C&\0\0\0\0\x90C\x05'\0\0\0\0\x904\xF5'\0\0\0\0\x90%\xE5(\0\0\0\0\x90\x16\xD5)\0\0\0\0\x90\x07\xC5*\0\0\0\0\x90\xF8\xB4+\0\0\0\0\x90\xE9\xA4,\0\0\0\0\x90\xDA\x94-\0\0\0\0\x90\xCB\x84.\0\0\0\0\x90\xBCt/\0\0\0\0\x90\xADd0\0\0\0\0\x10\xD9]1\0\0\0\0\x10\xB4r2\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\xFB\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0 \x1C\0\0\0\0\0\0+01\0\0\x10\x0E\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xC8\x05\x81\x06\xE0\xF0H\xBC\xFF\xFF\xFF\xFF\x90\xB0\xD1\x0B\0\0\0\0\0\x0C\xE8\x0B\0\0\0\0\xF0Ga\x0C\0\0\0\0\x80?\xC9\r\0\0\0\0p\xF2\x8E\x0E\0\0\0\0\x80Q\xD3\x0F\0\0\0\0p\xA3'\x10\0\0\0\0\x80\xE6AH\0\0\0\0p\"\xBBH\0\0\0\0\0\x1A#J\0\0\0\0p\xD5\x8DJ\0\0\0\0\x80\xC0\xDCK\0\0\0\0p\xE5]L\0\0\0\0\x80\xB8\x97M\0\0\0\0\xF0\x8C4N\0\0\0\0\xA0\xA0\x9CO\0\0\0\0\xA0\xBB\x08P\0\0\0\0 \x9A1P\0\0\0\0\xA0\xA7gP\0\0\0\0\xA0\x82|Q\0\0\0\0\xA0\xCB\xD8Q\0\0\0\0\xA0\x9E\x05R\0\0\0\0\xA0slR\0\0\0\0\xA0z7S\0\0\0\0\xA0!\xAES\0\0\0\0 F\xDCS\0\0\0\0\xA0ULT\0\0\0\0\xA0\\\x17U\0\0\0\0 \xE0|U\0\0\0\0\xA0\x04\xABU\0\0\0\0\xA07,V\0\0\0\0\xA0>\xF7V\0\0\0\0\xA0\x87SW\0\0\0\0 \xAC\x81W\0\0\0\0 T\x15X\0\0\0\0\xA0 \xD7X\0\0\0\0\xA0\xF4 Y\0\0\0\0\xA0SXY\0\0\0\0 6\xF5Y\0\0\0\0\xA0\x02\xB7Z\0\0\0\0 \x9C\xF7Z\0\0\0\0\xA0\xC0%[\0\0\0\0\xA0C\xCE\\\0\0\0\0 h\xFC\\\0\0\0\0\xA0\xB0\x9B^\0\0\0\0\xA0\x0F\xD3^\0\0\0\0 Xr`\0\0\0\0\xA0|\xA0`\0\0\0\0 \xC5?b\0\0\0\0 $wb\0\0\0\0\xA0l\x16d\0\0\0\0 \x91Dd\0\0\0\0 \x14\xEDe\0\0\0\0\xA08\x1Bf\0\0\0\0 \x81\xBAg\0\0\0\0 \xE0\xF1g\0\0\0\0\xA0(\x91i\0\0\0\0 M\xBFi\0\0\0\0 \xD0gk\0\0\0\0\xA0\xF4\x95k\0\0\0\0 =5m\0\0\0\0 \x9Clm\0\0\0\0\xA0\xE4\x0Bo\0\0\0\0 \t:o\0\0\0\0\xA0Q\xD9p\0\0\0\0\xA0\xB0\x10q\0\0\0\0 \xF9\xAFr\0\0\0\0\xA0\x1D\xDEr\0\0\0\0\xA0\xA0\x86t\0\0\0\0 \xC5\xB4t\0\0\0\0\xA0\rTv\0\0\0\0\xA0l\x8Bv\0\0\0\0 \xB5*x\0\0\0\0\xA0\xD9Xx\0\0\0\0 \"\xF8y\0\0\0\0 \x81/z\0\0\0\0\xA0\xC9\xCE{\0\0\0\0\xA0(\x06|\0\0\0\0 q\xA5}\0\0\0\0\xA0\x95\xD3}\0\0\0\0 \xDEr\x7F\0\0\0\0 =\xAA\x7F\0\0\0\0\xA0\x85I\x81\0\0\0\0 \xAAw\x81\0\0\0\0 - \x83\0\0\0\0\xA0QN\x83\0\0\0\0 \x9A\xED\x84\0\0\0\0 \xF9$\x85\0\0\0\0\xA0A\xC4\x86\0\0\0\0 f\xF2\x86\0\0\0\0\xA0\xAE\x91\x88\0\0\0\0\xA0\r\xC9\x88\0\0\0\0 Vh\x8A\0\0\0\0 \xB5\x9F\x8A\0\0\0\0\xA0\xFD>\x8C\0\0\0\0 \"m\x8C\0\0\0\0\xA0j\x0C\x8E\0\0\0\0\xA0\xC9C\x8E\0\0\0\0 \x12\xE3\x8F\0\0\0\0\xA06\x11\x90\0\0\0\0\xA0\xB9\xB9\x91\0\0\0\0 \xDE\xE7\x91\0\0\0\0\xA0&\x87\x93\0\0\0\0\xA0\x85\xBE\x93\0\0\0\0 \xCE]\x95\0\0\0\0\xA0\xF2\x8B\x95\0\0\0\0 ;+\x97\0\0\0\0 \x9Ab\x97\0\0\0\0\xA0\xE2\x01\x99\0\0\0\0\xA0A9\x99\0\0\0\0 \x8A\xD8\x9A\0\0\0\0\xA0\xAE\x06\x9B\0\0\0\0 \xF7\xA5\x9C\0\0\0\0 V\xDD\x9C\0\0\0\0\xA0\x9E|\x9E\0\0\0\0 \xC3\xAA\x9E\0\0\0\0 FS\xA0\0\0\0\0\xA0j\x81\xA0\0\0\0\0 \xB3 \xA2\0\0\0\0 \x12X\xA2\0\0\0\0\xA0Z\xF7\xA3\0\0\0\0 \x7F%\xA4\0\0\0\0\xA0\xC7\xC4\xA5\0\0\0\0\xA0&\xFC\xA5\0\0\0\0 o\x9B\xA7\0\0\0\0 \xCE\xD2\xA7\0\0\0\0\xA0\x16r\xA9\0\0\0\0 ;\xA0\xA9\0\0\0\0\xA0\x83?\xAB\0\0\0\0\xA0\xE2v\xAB\0\0\0\0 +\x16\xAD\0\0\0\0\xA0OD\xAD\0\0\0\0\xA0\xD2\xEC\xAE\0\0\0\0 \xF7\x1A\xAF\0\0\0\0\xA0?\xBA\xB0\0\0\0\0\xA0\x9E\xF1\xB0\0\0\0\0 \xE7\x90\xB2\0\0\0\0\xA0\x0B\xBF\xB2\0\0\0\0 T^\xB4\0\0\0\0 \xB3\x95\xB4\0\0\0\0\xA0\xFB4\xB6\0\0\0\0\xA0Zl\xB6\0\0\0\0 \xA3\x0B\xB8\0\0\0\0\xA0\xC79\xB8\0\0\0\0 \x10\xD9\xB9\0\0\0\0 o\x10\xBA\0\0\0\0\xA0\xB7\xAF\xBB\0\0\0\0 \xDC\xDD\xBB\0\0\0\0 _\x86\xBD\0\0\0\0\xA0\x83\xB4\xBD\0\0\0\0 \xCCS\xBF\0\0\0\0 +\x8B\xBF\0\0\0\0\xA0s*\xC1\0\0\0\0 \x98X\xC1\0\0\0\0\xA0\xE0\xF7\xC2\0\0\0\0\xA0?/\xC3\0\0\0\0 \x88\xCE\xC4\0\0\0\0 \xE7\x05\xC5\0\0\0\0\xA0/\xA5\xC6\0\0\0\0 T\xD3\xC6\0\0\0\0\xA0\x9Cr\xC8\0\0\0\0\xA0\xFB\xA9\xC8\0\0\0\0 DI\xCA\0\0\0\0\xA0hw\xCA\0\0\0\0\xA0\xEB\x1F\xCC\0\0\0\0 \x10N\xCC\0\0\0\0\xA0X\xED\xCD\0\0\0\0\xA0\xB7$\xCE\0\0\0\0 \0\xC4\xCF\0\0\0\0\xA0$\xF2\xCF\0\0\0\0 m\x91\xD1\0\0\0\0 \xCC\xC8\xD1\0\0\0\0\xA0\x14h\xD3\0\0\0\0 9\x96\xD3\0\0\0\0 \xBC>\xD5\0\0\0\0\xA0\xE0l\xD5\0\0\0\0 )\x0C\xD7\0\0\0\0 \x88C\xD7\0\0\0\0\xA0\xD0\xE2\xD8\0\0\0\0 \xF5\x10\xD9\0\0\0\0 x\xB9\xDA\0\0\0\0\xA0\x9C\xE7\xDA\0\0\0\0 \xE5\x86\xDC\0\0\0\0 D\xBE\xDC\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\xA0\xF3\xFF\xFF\xFF\xFF\xFF\xFF\xF0\xF1\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0SAST\0 \x1C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0(\0-\0@A{m\xFF\xFF\xFF\xFFh\xCFF\x82\xFF\xFF\xFF\xFF\x80\x8C\xAE\xCC\xFF\xFF\xFF\xFFpo\x9E\xCD\xFF\xFF\xFF\xFF\x80n\x8E\xCE\xFF\xFF\xFF\xFF\x01\x02\x03\x02\x03@\x1A\0\0\0\0\0\0\x18\x15\0\0\0\0\0\0 \x1C\0\0\0\0\0\x000*\0\0\0\0\0\0CAT\0\0 \x1C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x18\x01<\x01\xDC\xDA\xA3\xB6\xFF\xFF\xFF\xFF\xE0\x17\x9E\0\0\0\0\0P4z\x01\0\0\0\0\xE0\xF9}\x02\0\0\0\0\xD0g[\x03\0\0\0\0\xE0~`\x04\0\0\0\0\xD0\xEC=\x05\0\0\0\0\xE0`@\x06\0\0\0\0P \x1F\x07\0\0\0\0\xE0B \x08\0\0\0\0\xD0S\0\t\0\0\0\0\xE0$\0\n\0\0\0\0P\x87\xE1\n\0\0\0\0\xE0\x06\xE0\x0B\0\0\0\0P\x0C\xC4\x0C\0\0\0\0\xE0\xE8\xBF\r\0\0\0\0\xD0?\xA5\x0E\0\0\0\0`\x05\xA9\x0F\0\0\0\0Ps\x86\x10\0\0\0\0`\xE7\x88\x11\0\0\0\0\xD0\xA6g\x12\0\0\0\0`\xC9h\x13\0\0\0\0\xD0+J\x14\0\0\0\0`\xABH\x15\0\0\0\0P_+\x16\0\0\0\0`\x8D(\x17\0\0\0\0\xD0\x92\x0C\x18\0\0\0\0`o\x08\x19\0\0\0\0P\xC6\xED\x19\0\0\0\0\xE0\x8B\xF1\x1A\0\0\0\0PK\xD0\x1B\0\0\0\0\xE0m\xD1\x1C\0\0\0\0\xD0~\xB1\x1D\0\0\0\0 E\x808\0\0\0\0P\x1A\x17`\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x01\xA4\x1D\0\0\0\0\0\0 \x1C\0\0\0\0\0\x000*\0\0\0\0\0\x000*\0\0\0\0\0\0CAT\0\0 \x1C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x18\x01<\x01\0\xDA\xA3\xB6\xFF\xFF\xFF\xFF\xE0\x17\x9E\0\0\0\0\0P4z\x01\0\0\0\0\xE0\xF9}\x02\0\0\0\0\xD0g[\x03\0\0\0\0\xE0~`\x04\0\0\0\0\xD0\xEC=\x05\0\0\0\0\xE0`@\x06\0\0\0\0P \x1F\x07\0\0\0\0\xE0B \x08\0\0\0\0\xD0S\0\t\0\0\0\0\xE0$\0\n\0\0\0\0P\x87\xE1\n\0\0\0\0\xE0\x06\xE0\x0B\0\0\0\0P\x0C\xC4\x0C\0\0\0\0\xE0\xE8\xBF\r\0\0\0\0\xD0?\xA5\x0E\0\0\0\0`\x05\xA9\x0F\0\0\0\0Ps\x86\x10\0\0\0\0`\xE7\x88\x11\0\0\0\0\xD0\xA6g\x12\0\0\0\0`\xC9h\x13\0\0\0\0\xD0+J\x14\0\0\0\0`\xABH\x15\0\0\0\0P_+\x16\0\0\0\0`\x8D(\x17\0\0\0\0\xD0\x92\x0C\x18\0\0\0\0`o\x08\x19\0\0\0\0P\xC6\xED\x19\0\0\0\0\xE0\x8B\xF1\x1A\0\0\0\0PK\xD0\x1B\0\0\0\0\xE0m\xD1\x1C\0\0\0\0\xD0~\xB1\x1D\0\0\0\0 E\x808\0\0\0\0P\xE4\xF8Y\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x01\x80\x1E\0\0\0\0\0\0 \x1C\0\0\0\0\0\x000*\0\0\0\0\0\x000*\0\0\0\0\0\0WAT\0\0\x10\x0E\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0$\0\xD1p\xAB\x86\xFF\xFF\xFF\xFF\0`P\x8C\xFF\xFF\xFF\xFF\xD1C\xAA\x96\xFF\xFF\xFF\xFFx\xEFQ\xA1\xFF\xFF\xFF\xFF\x01\0\x02\x03/\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\x07\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0CAT\0\0 \x1C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\t\0v\xD5B\x8D\xFF\xFF\xFF\xFF\x01\x8A\x1E\0\0\0\0\0\0 \x1C\0\0\0\0\0\0GMT\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x18\0\x1B\0\x9C\xA6zZ\xFF\xFF\xFF\xFF\x9Cl_\xA0\xFF\xFF\xFF\xFFnZ\xCA\x03\0\0\0\0\0\x01\x02\xE4\xF5\xFF\xFF\xFF\xFF\xFF\xFF\x92\xF5\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0EAT\0\x000*\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0(\0-\0\xFC\xD1\xFF\x8B\xFF\xFF\xFF\xFFX\xDA\xEE\xB1\xFF\xFF\xFF\xFF\xD0\xE0\xC7\xB4\xFF\xFF\xFF\xFFX\xAD\xED\xC1\xFF\xFF\xFF\xFF\xD4zl\xCC\xFF\xFF\xFF\xFF\x01\x02\x01\x03\x02\x84\"\0\0\0\0\0\0(#\0\0\0\0\0\x000*\0\0\0\0\0\0\xAC&\0\0\0\0\0\0WAT\0\0\x10\x0E\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x18\0\x1B\0d\x80\xE6\x92\xFF\xFF\xFF\xFFpqf\x12\0\0\0\0`\xDE&\x13\0\0\0\0\x01\x02\x01\x1C\x0E\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0 \x1C\0\0\0\0\0\0GMT\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0$\x000\xFD<^\xFF\xFF\xFF\xFF\x80\x8E\xE6\x92\xFF\xFF\xFF\xFF\x10\x88IZ\0\0\0\0\x90\xBB*\\\0\0\0\0\x01\x02\x03\x02P\x06\0\0\0\0\0\0c\xF7\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0EET\0\0 \x1C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01.\x01$\xC1\xF2\xA1\xFF\xFF\xFF\xFF\x10\xB1\xBB\xDD\xFF\xFF\xFF\xFF`\xAD#\xDE\xFF\xFF\xFF\xFF\x10\xD2x\xE1\xFF\xFF\xFF\xFF\xE0e\xE7\xE1\xFF\xFF\xFF\xFFp?/\xE5\xFF\xFF\xFF\xFF\xE0\xCC\xA9\xE5\xFF\xFF\xFF\xFF\xF0\xC6N\xEB\xFF\xFF\xFF\xFF`B\x92\x16\0\0\0\0p\xF7\x08\x17\0\0\0\0\xE0+\xFA\x17\0\0\0\0\xF0*\xEA\x18\0\0\0\0`_\xDB\x19\0\0\0\0\xF0\xAF\xCC\x1A\0\0\0\0`\xE4\xBD\x1B\0\0\0\0\xF0z\xB4\x1C\0\0\0\0\xE0\x17\x9F\x1D\0\0\0\0p\x0B\x93\x1E\0\0\0\0`\xEE\x82\x1F\0\0\0\0pJp \0\0\0\0\xE0~a!\0\0\0\0p\xCFR\"\0\0\0\0\xE0\x03D#\0\0\0\0\xF0\x024$\0\0\0\0`7%%\0\0\0\0\xF0\xB7@&\0\0\0\0`\xF1N2\0\0\0\0p6D3\0\0\0\0\xE0j54\0\0\0\0\0\x99\x9DP\0\0\0\0\x80\xD9TQ\0\0\0\0\x80\xB4iR\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x02\x03\x01\x02\x03\x02\x03\\\x0C\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0 \x1C\0\0\0\0\0\0 \x1C\0\0\0\0\0\0CET\0\0\x10\x0E\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xF0\0\x0E\x01\xF4\x13FY\xFF\xFF\xFF\xFFOP`\x91\xFF\xFF\xFF\xFF\xE0\x88:\xC6\xFF\xFF\xFF\xFF`\x9EX\xC7\xFF\xFF\xFF\xFF\xE0\"\xDB\xC7\xFF\xFF\xFF\xFF\xE0T\xE2\xCA\xFF\xFF\xFF\xFF\xF0i\xAD\xCB\xFF\xFF\xFF\xFF\x10K\xE7\xCC\xFF\xFF\xFF\xFF\x90\x17\xA9\xCD\xFF\xFF\xFF\xFF\0\x16\xC2\xCD\xFF\xFF\xFF\xFF\x10\xB0\xCC\xCD\xFF\xFF\xFF\xFF\x005\xA2\xCE\xFF\xFF\xFF\xFF\x104\x92\xCF\xFF\xFF\xFF\xFF\xE0\xE3\x89\xD0\xFF\xFF\xFF\xFF\x10\x16r\xD1\xFF\xFF\xFF\xFF`\x16N\xD2\xFF\xFF\xFF\xFF\xF0\xDF\xC7\r\0\0\0\0p\xAC\x89\x0E\0\0\0\0\xF0d\xAA\x0F\0\0\0\0p\x1At\x10\0\0\0\0\xF0:\xA3\"\0\0\0\0\xF0(<#\0\0\0\0\xF0\x19,$\0\0\0\0\xF0\n\x1C%\0\0\0\0p\xC3<&\0\0\0\0p'\x05'\0\0\0\0\xF0\rtB\0\0\0\0\0\x80\0\0\0\0\x10\x83Z?\0\0\0\0\0Po@\0\0\0\0\x10e:A\0\0\0\0\x002OB\0\0\0\0\x10G\x1AC\0\0\0\0\0\x14/D\0\0\0\0\x10)\xFAD\0\0\0\0\0\xF6\x0EF\0\0\0\0\x10\x0B\xDAF\0\0\0\0\x80\x12\xF8G\0\0\0\0\x90'\xC3H\0\0\0\0\x80\xF4\xD7I\0\0\0\0\x90\t\xA3J\0\0\0\0\x80\xD6\xB7K\0\0\0\0\x90\xEB\x82L\0\0\0\0\x80\xB8\x97M\0\0\0\0\x90\xCDbN\0\0\0\0\x80\x9AwO\0\0\0\0\x90\xAFBP\0\0\0\0\0\xB7`Q\0\0\0\0\x90\x91\"R\0\0\0\0\0\x99@S\0\0\0\0\x10\xAE\x0BT\0\0\0\0\0{ U\0\0\0\0\x10\x90\xEBU\0\0\0\0\0]\0W\0\0\0\0\x10r\xCBW\0\0\0\0\0?\xE0X\0\0\0\0\x10T\xABY\0\0\0\0`f\xEEY\0\0\0\0\x01\x02\x03\x02\x02\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x02\x05\x08\x10\0\0\0\0\0\0\x18\x15\0\0\0\0\0\0 \x1C\0\0\0\0\0\x000*\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0 \x1C\0\0\0\0\0\0HST\0\0`s\xFF\xFF\xFF\xFF\xFF\xFF\x01HDT\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0\xA8\x02\x17\x03\xD1\xFD\xC2?\xFF\xFF\xFF\xFF^Z\x87}\xFF\xFF\xFF\xFF\xD0D\x89\xCB\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF@Pa\xD2\xFF\xFF\xFF\xFF\xB0U\xD2\xFA\xFF\xFF\xFF\xFFPq\xB8\xFE\xFF\xFF\xFF\xFF@T\xA8\xFF\xFF\xFF\xFF\xFFPS\x98\0\0\0\0\0@6\x88\x01\0\0\0\0P5x\x02\0\0\0\0\xC0Rq\x03\0\0\0\0\xD0Qa\x04\0\0\0\0\xC04Q\x05\0\0\0\0\xD03A\x06\0\0\0\0\xC0\x161\x07\0\0\0\0\xD0m\x8D\x07\0\0\0\0\xC0\xF8\x10\t\0\0\0\0P\xE9\xAD\t\0\0\0\0\xC0\xDA\xF0\n\0\0\0\0\xD0\xD9\xE0\x0B\0\0\0\0@\xF7\xD9\x0C\0\0\0\0\xD0\xBB\xC0\r\0\0\0\0@\xD9\xB9\x0E\0\0\0\0P\xD8\xA9\x0F\0\0\0\0@\xBB\x99\x10\0\0\0\0P\xBA\x89\x11\0\0\0\0@\x9Dy\x12\0\0\0\0P\x9Ci\x13\0\0\0\0@\x7FY\x14\0\0\0\0P~I\x15\0\0\0\0@a9\x16\0\0\0\0P`)\x17\0\0\0\0\xC0}\"\x18\0\0\0\0PB\t\x19\0\0\0\0\xC0_\x02\x1A\0\0\0\0 \"+\x1A\0\0\0\0\xC0P\xF2\x1A\0\0\0\0\xB03\xE2\x1B\0\0\0\0\xC02\xD2\x1C\0\0\0\0\xB0\x15\xC2\x1D\0\0\0\0\xC0\x14\xB2\x1E\0\0\0\0\xB0\xF7\xA1\x1F\0\0\0\0@Gv \0\0\0\0\xB0\xD9\x81!\0\0\0\0@)V\"\0\0\0\x000\xF6j#\0\0\0\0@\x0B6$\0\0\0\x000\xD8J%\0\0\0\0@\xED\x15&\0\0\0\x000\xBA*'\0\0\0\0\xC0\t\xFF'\0\0\0\x000\x9C\n)\0\0\0\0\xC0\xEB\xDE)\0\0\0\x000~\xEA*\0\0\0\0\xC0\xCD\xBE+\0\0\0\0\xB0\x9A\xD3,\0\0\0\0\xC0\xAF\x9E-\0\0\0\0\xB0|\xB3.\0\0\0\0\xC0\x91~/\0\0\0\0\xB0^\x930\0\0\0\0@\xAEg1\0\0\0\0\xB0@s2\0\0\0\0@\x90G3\0\0\0\0\xB0\"S4\0\0\0\0@r'5\0\0\0\0\xB0\x0436\0\0\0\0@T\x077\0\0\0\x000!\x1C8\0\0\0\0@6\xE78\0\0\0\x000\x03\xFC9\0\0\0\0@\x18\xC7:\0\0\0\x000\xE5\xDB;\0\0\0\0\xC04\xB0<\0\0\0\x000\xC7\xBB=\0\0\0\0\xC0\x16\x90>\0\0\0\x000\xA9\x9B?\0\0\0\0\xC0\xF8o@\0\0\0\0\xB0\xC5\x84A\0\0\0\0\xC0\xDAOB\0\0\0\0\xB0\xA7dC\0\0\0\0\xC0\xBC/D\0\0\0\0\xB0\x89DE\0\0\0\0@\xEF\xF3E\0\0\0\x000\xA6-G\0\0\0\0\x01\x02\x03\x03\x02\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x03\x04\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\xE2\xAB\0\0\0\0\0\0bZ\xFF\xFF\xFF\xFF\xFF\xFFPe\xFF\xFF\xFF\xFF\xFF\xFF`s\xFF\xFF\xFF\xFF\xFF\xFF`s\xFF\xFF\xFF\xFF\xFF\xFFp\x81\xFF\xFF\xFF\xFF\xFF\xFFAKST\0p\x81\xFF\xFF\xFF\xFF\xFF\xFF\x01AKDT\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0\xA8\x02\x17\x03\xD1\xFD\xC2?\xFF\xFF\xFF\xFFHA\x87}\xFF\xFF\xFF\xFF\xC06\x89\xCB\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF0Ba\xD2\xFF\xFF\xFF\xFF\xA0G\xD2\xFA\xFF\xFF\xFF\xFF@c\xB8\xFE\xFF\xFF\xFF\xFF0F\xA8\xFF\xFF\xFF\xFF\xFF@E\x98\0\0\0\0\x000(\x88\x01\0\0\0\0@'x\x02\0\0\0\0\xB0Dq\x03\0\0\0\0\xC0Ca\x04\0\0\0\0\xB0&Q\x05\0\0\0\0\xC0%A\x06\0\0\0\0\xB0\x081\x07\0\0\0\0\xC0_\x8D\x07\0\0\0\0\xB0\xEA\x10\t\0\0\0\0@\xDB\xAD\t\0\0\0\0\xB0\xCC\xF0\n\0\0\0\0\xC0\xCB\xE0\x0B\0\0\0\x000\xE9\xD9\x0C\0\0\0\0\xC0\xAD\xC0\r\0\0\0\x000\xCB\xB9\x0E\0\0\0\0@\xCA\xA9\x0F\0\0\0\x000\xAD\x99\x10\0\0\0\0@\xAC\x89\x11\0\0\0\x000\x8Fy\x12\0\0\0\0@\x8Ei\x13\0\0\0\x000qY\x14\0\0\0\0@pI\x15\0\0\0\x000S9\x16\0\0\0\0@R)\x17\0\0\0\0\xB0o\"\x18\0\0\0\0@4\t\x19\0\0\0\0\xB0Q\x02\x1A\0\0\0\0\x10\x14+\x1A\0\0\0\0\xB0B\xF2\x1A\0\0\0\0\xA0%\xE2\x1B\0\0\0\0\xB0$\xD2\x1C\0\0\0\0\xA0\x07\xC2\x1D\0\0\0\0\xB0\x06\xB2\x1E\0\0\0\0\xA0\xE9\xA1\x1F\0\0\0\x0009v \0\0\0\0\xA0\xCB\x81!\0\0\0\x000\x1BV\"\0\0\0\0 \xE8j#\0\0\0\x000\xFD5$\0\0\0\0 \xCAJ%\0\0\0\x000\xDF\x15&\0\0\0\0 \xAC*'\0\0\0\0\xB0\xFB\xFE'\0\0\0\0 \x8E\n)\0\0\0\0\xB0\xDD\xDE)\0\0\0\0 p\xEA*\0\0\0\0\xB0\xBF\xBE+\0\0\0\0\xA0\x8C\xD3,\0\0\0\0\xB0\xA1\x9E-\0\0\0\0\xA0n\xB3.\0\0\0\0\xB0\x83~/\0\0\0\0\xA0P\x930\0\0\0\x000\xA0g1\0\0\0\0\xA02s2\0\0\0\x000\x82G3\0\0\0\0\xA0\x14S4\0\0\0\x000d'5\0\0\0\0\xA0\xF626\0\0\0\x000F\x077\0\0\0\0 \x13\x1C8\0\0\0\x000(\xE78\0\0\0\0 \xF5\xFB9\0\0\0\x000\n\xC7:\0\0\0\0 \xD7\xDB;\0\0\0\0\xB0&\xB0<\0\0\0\0 \xB9\xBB=\0\0\0\0\xB0\x08\x90>\0\0\0\0 \x9B\x9B?\0\0\0\0\xB0\xEAo@\0\0\0\0\xA0\xB7\x84A\0\0\0\0\xB0\xCCOB\0\0\0\0\xA0\x99dC\0\0\0\0\xB0\xAE/D\0\0\0\0\xA0{DE\0\0\0\x000\xE1\xF3E\0\0\0\0 \x98-G\0\0\0\0\x01\x02\x03\x03\x02\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x03\x04\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\xF8\xC4\0\0\0\0\0\0xs\xFF\xFF\xFF\xFF\xFF\xFF`s\xFF\xFF\xFF\xFF\xFF\xFFp\x81\xFF\xFF\xFF\xFF\xFF\xFFp\x81\xFF\xFF\xFF\xFF\xFF\xFF\x80\x8F\xFF\xFF\xFF\xFF\xFF\xFF-03\0\0\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x98\x01\xCB\x010t\xAA\x96\xFF\xFF\xFF\xFF\xE0I\x0F\xB8\xFF\xFF\xFF\xFF\xA0@\xFD\xB8\xFF\xFF\xFF\xFF04\xF1\xB9\xFF\xFF\xFF\xFF t\xDE\xBA\xFF\xFF\xFF\xFF0\xAE8\xDA\xFF\xFF\xFF\xFF0\xFA\xEB\xDA\xFF\xFF\xFF\xFF\xB0\xE1\x19\xDC\xFF\xFF\xFF\xFF Y\xB9\xDC\xFF\xFF\xFF\xFF0\x15\xFB\xDD\xFF\xFF\xFF\xFF \xDE\x9B\xDE\xFF\xFF\xFF\xFF0\x9A\xDD\xDF\xFF\xFF\xFF\xFF 3T\xE0\xFF\xFF\xFF\xFF\xB0\xFF\x97\xF4\xFF\xFF\xFF\xFF ^\x05\xF5\xFF\xFF\xFF\xFF0d\xC0\xF6\xFF\xFF\xFF\xFF\xA0\x1E\x0E\xF7\xFF\xFF\xFF\xFF0,Q\xF8\xFF\xFF\xFF\xFF \xC5\xC7\xF8\xFF\xFF\xFF\xFF\xB0\xD2\n\xFA\xFF\xFF\xFF\xFF\xA0\xF8\xA8\xFA\xFF\xFF\xFF\xFF0\x06\xEC\xFB\xFF\xFF\xFF\xFF\xA0}\x8B\xFC\xFF\xFF\xFF\xFF0\x8E\xC9\x1D\0\0\0\0\xA0\xD7x\x1E\0\0\0\0\xB05\xA0\x1F\0\0\0\0\xA0\xCF3 \0\0\0\x000i\x81!\0\0\0\0\xA0\xC8\x0B\"\0\0\0\0\xB0\x10X#\0\0\0\0 p\xE2#\0\0\0\0\xB0\xF27%\0\0\0\0 \xC7\xD4%\0\0\0\x000y\x800\0\0\0\0\xA0M\x1D1\0\0\0\0\xB0 W2\0\0\0\0 j\x063\0\0\0\x000T84\0\0\0\0 \xC1\xF84\0\0\0\x000\x1F 6\0\0\0\0\xA0h\xCF6\0\0\0\0\xB0\xC6\xF67\0\0\0\0 \x85\xB88\0\0\0\x000\xE3\xDF9\0\0\0\0\xA0,\x8F:\0\0\0\0\xB0\xFF\xC8;\0\0\0\0\xA0\x0Eo<\0\0\0\x000\x91\xC4=\0\0\0\0\xA0\xF0N>\0\0\0\x000e\x83P\0\0\0\0\xA09 Q\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xD0\xD2\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFF-03\0\0\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xE0\x01&\x02L\xA8\x9Cr\xFF\xFF\xFF\xFF0\x8F\x92\xA2\xFF\xFF\xFF\xFF@R{\xB6\xFF\xFF\xFF\xFF\xB0\xC9\x1A\xB7\xFF\xFF\xFF\xFF@\x8F\x1E\xB8\xFF\xFF\xFF\xFF0p\xD4\xB8\xFF\xFF\xFF\xFF\xC0}\x17\xBA\xFF\xFF\xFF\xFF\xB0\xA3\xB5\xBA\xFF\xFF\xFF\xFF@\xB1\xF8\xBB\xFF\xFF\xFF\xFF0\xD7\x96\xBC\xFF\xFF\xFF\xFF\xC0\xE4\xD9\xBD\xFF\xFF\xFF\xFF\xB0\nx\xBE\xFF\xFF\xFF\xFF@\x18\xBB\xBF\xFF\xFF\xFF\xFF\xB0\x8FZ\xC0\xFF\xFF\xFF\xFF@\x9D\x9D\xC1\xFF\xFF\xFF\xFF0\xC3;\xC2\xFF\xFF\xFF\xFF\xC0\xD0~\xC3\xFF\xFF\xFF\xFF\xB0\xF6\x1C\xC4\xFF\xFF\xFF\xFF@\x04`\xC5\xFF\xFF\xFF\xFF0*\xFE\xC5\xFF\xFF\xFF\xFF\xC07A\xC7\xFF\xFF\xFF\xFF0\xAF\xE0\xC7\xFF\xFF\xFF\xFF@\x94\x81\xC8\xFF\xFF\xFF\xFF\xB0\xA1M\xCA\xFF\xFF\xFF\xFF\xC0\x86\xEE\xCA\xFF\xFF\xFF\xFF0\xFFM\xCE\xFF\xFF\xFF\xFF\xC0\xED\xB0\xCE\xFF\xFF\xFF\xFF\xB05)\xD3\xFF\xFF\xFF\xFF\xC0dC\xD4\xFF\xFF\xFF\xFF0\x08=\xF4\xFF\xFF\xFF\xFF\xC0\xF6\x9F\xF4\xFF\xFF\xFF\xFF0l\x05\xF5\xFF\xFF\xFF\xFF@\x102\xF6\xFF\xFF\xFF\xFF\xB0\x9F\xE6\xF6\xFF\xFF\xFF\xFF\xC0C\x13\xF8\xFF\xFF\xFF\xFF0\xD3\xC7\xF8\xFF\xFF\xFF\xFF@w\xF4\xF9\xFF\xFF\xFF\xFF\xB06\xD3\xFA\xFF\xFF\xFF\xFF\xC05\xC3\xFB\xFF\xFF\xFF\xFF0S\xBC\xFC\xFF\xFF\xFF\xFF@R\xAC\xFD\xFF\xFF\xFF\xFF05\x9C\xFE\xFF\xFF\xFF\xFF@4\x8C\xFF\xFF\xFF\xFF\xFF\xB0J\xA3\x07\0\0\0\0\xA0o$\x08\0\0\0\0\xB0\xB5\x94#\0\0\0\0\xA0\x94\x10$\0\0\0\0\xB0\xF27%\0\0\0\0\xA0v\xF0%\0\0\0\x000\x0F!'\0\0\0\0\xA0X\xD0'\0\0\0\x000\xF1\0)\0\0\0\0\xA0:\xB0)\0\0\0\x000\xD3\xE0*\0\0\0\0 W\x99+\0\0\0\0\xB0\xC6\xF67\0\0\0\0\xB0*\xBF8\0\0\0\0\xB0\twG\0\0\0\0 \x7F\xDCG\0\0\0\0\xB0\xA2\xFAH\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x03\x04\x03\x04\x05\x03\x04\x054\xC9\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xC3\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFF-03\0\0\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xE8\x01/\x02,\xAF\x9Cr\xFF\xFF\xFF\xFF0\x8F\x92\xA2\xFF\xFF\xFF\xFF@R{\xB6\xFF\xFF\xFF\xFF\xB0\xC9\x1A\xB7\xFF\xFF\xFF\xFF@\x8F\x1E\xB8\xFF\xFF\xFF\xFF0p\xD4\xB8\xFF\xFF\xFF\xFF\xC0}\x17\xBA\xFF\xFF\xFF\xFF\xB0\xA3\xB5\xBA\xFF\xFF\xFF\xFF@\xB1\xF8\xBB\xFF\xFF\xFF\xFF0\xD7\x96\xBC\xFF\xFF\xFF\xFF\xC0\xE4\xD9\xBD\xFF\xFF\xFF\xFF\xB0\nx\xBE\xFF\xFF\xFF\xFF@\x18\xBB\xBF\xFF\xFF\xFF\xFF\xB0\x8FZ\xC0\xFF\xFF\xFF\xFF@\x9D\x9D\xC1\xFF\xFF\xFF\xFF0\xC3;\xC2\xFF\xFF\xFF\xFF\xC0\xD0~\xC3\xFF\xFF\xFF\xFF\xB0\xF6\x1C\xC4\xFF\xFF\xFF\xFF@\x04`\xC5\xFF\xFF\xFF\xFF0*\xFE\xC5\xFF\xFF\xFF\xFF\xC07A\xC7\xFF\xFF\xFF\xFF0\xAF\xE0\xC7\xFF\xFF\xFF\xFF@\x94\x81\xC8\xFF\xFF\xFF\xFF\xB0\xA1M\xCA\xFF\xFF\xFF\xFF\xC0\x86\xEE\xCA\xFF\xFF\xFF\xFF0\xFFM\xCE\xFF\xFF\xFF\xFF\xC0\xED\xB0\xCE\xFF\xFF\xFF\xFF\xB05)\xD3\xFF\xFF\xFF\xFF\xC0dC\xD4\xFF\xFF\xFF\xFF0\x08=\xF4\xFF\xFF\xFF\xFF\xC0\xF6\x9F\xF4\xFF\xFF\xFF\xFF0l\x05\xF5\xFF\xFF\xFF\xFF@\x102\xF6\xFF\xFF\xFF\xFF\xB0\x9F\xE6\xF6\xFF\xFF\xFF\xFF\xC0C\x13\xF8\xFF\xFF\xFF\xFF0\xD3\xC7\xF8\xFF\xFF\xFF\xFF@w\xF4\xF9\xFF\xFF\xFF\xFF\xB06\xD3\xFA\xFF\xFF\xFF\xFF\xC05\xC3\xFB\xFF\xFF\xFF\xFF0S\xBC\xFC\xFF\xFF\xFF\xFF@R\xAC\xFD\xFF\xFF\xFF\xFF05\x9C\xFE\xFF\xFF\xFF\xFF@4\x8C\xFF\xFF\xFF\xFF\xFF\xB0J\xA3\x07\0\0\0\0\xA0o$\x08\0\0\0\0\xB0\xB5\x94#\0\0\0\0\xA0\x94\x10$\0\0\0\0\xB0\xF27%\0\0\0\0\xA0v\xF0%\0\0\0\x000\x0F!'\0\0\0\0\xA0X\xD0'\0\0\0\0@\xFF\0)\0\0\0\0\xA0:\xB0)\0\0\0\x000\xD3\xE0*\0\0\0\0 W\x99+\0\0\0\0\xB0\xC6\xF67\0\0\0\0\xB0*\xBF8\0\0\0\x000\xF1\xBB@\0\0\0\0\xC0\x0B\xD5@\0\0\0\0\xB0\twG\0\0\0\0 \x7F\xDCG\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x02\x05\x03\x04\x05\x03\x04\x03\x04\x03\x04\x02\x03\x04\x05\x03\x04T\xC2\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xC3\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFF-03\0\0\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xE0\x01%\x02\xB0\xAD\x9Cr\xFF\xFF\xFF\xFF0\x8F\x92\xA2\xFF\xFF\xFF\xFF@R{\xB6\xFF\xFF\xFF\xFF\xB0\xC9\x1A\xB7\xFF\xFF\xFF\xFF@\x8F\x1E\xB8\xFF\xFF\xFF\xFF0p\xD4\xB8\xFF\xFF\xFF\xFF\xC0}\x17\xBA\xFF\xFF\xFF\xFF\xB0\xA3\xB5\xBA\xFF\xFF\xFF\xFF@\xB1\xF8\xBB\xFF\xFF\xFF\xFF0\xD7\x96\xBC\xFF\xFF\xFF\xFF\xC0\xE4\xD9\xBD\xFF\xFF\xFF\xFF\xB0\nx\xBE\xFF\xFF\xFF\xFF@\x18\xBB\xBF\xFF\xFF\xFF\xFF\xB0\x8FZ\xC0\xFF\xFF\xFF\xFF@\x9D\x9D\xC1\xFF\xFF\xFF\xFF0\xC3;\xC2\xFF\xFF\xFF\xFF\xC0\xD0~\xC3\xFF\xFF\xFF\xFF\xB0\xF6\x1C\xC4\xFF\xFF\xFF\xFF@\x04`\xC5\xFF\xFF\xFF\xFF0*\xFE\xC5\xFF\xFF\xFF\xFF\xC07A\xC7\xFF\xFF\xFF\xFF0\xAF\xE0\xC7\xFF\xFF\xFF\xFF@\x94\x81\xC8\xFF\xFF\xFF\xFF\xB0\xA1M\xCA\xFF\xFF\xFF\xFF\xC0\x86\xEE\xCA\xFF\xFF\xFF\xFF0\xFFM\xCE\xFF\xFF\xFF\xFF\xC0\xED\xB0\xCE\xFF\xFF\xFF\xFF\xB05)\xD3\xFF\xFF\xFF\xFF\xC0dC\xD4\xFF\xFF\xFF\xFF0\x08=\xF4\xFF\xFF\xFF\xFF\xC0\xF6\x9F\xF4\xFF\xFF\xFF\xFF0l\x05\xF5\xFF\xFF\xFF\xFF@\x102\xF6\xFF\xFF\xFF\xFF\xB0\x9F\xE6\xF6\xFF\xFF\xFF\xFF\xC0C\x13\xF8\xFF\xFF\xFF\xFF0\xD3\xC7\xF8\xFF\xFF\xFF\xFF@w\xF4\xF9\xFF\xFF\xFF\xFF\xB06\xD3\xFA\xFF\xFF\xFF\xFF\xC05\xC3\xFB\xFF\xFF\xFF\xFF0S\xBC\xFC\xFF\xFF\xFF\xFF@R\xAC\xFD\xFF\xFF\xFF\xFF05\x9C\xFE\xFF\xFF\xFF\xFF@4\x8C\xFF\xFF\xFF\xFF\xFF\xB0J\xA3\x07\0\0\0\0\xA0o$\x08\0\0\0\0\xB0\xB5\x94#\0\0\0\0\xA0\x94\x10$\0\0\0\0\xB0\xF27%\0\0\0\0\xA0v\xF0%\0\0\0\x000\x0F!'\0\0\0\0\xA0X\xD0'\0\0\0\0@\xFF\0)\0\0\0\0\xA0:\xB0)\0\0\0\x000\xD3\xE0*\0\0\0\0 W\x99+\0\0\0\0\xB0\xC6\xF67\0\0\0\0\xB0*\xBF8\0\0\0\0\xB0\twG\0\0\0\0 \x7F\xDCG\0\0\0\0\xB0\xA2\xFAH\0\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x01\x04\x02\x03\x04\x02\x03\x02\x03\x02\x03\x04\x02\x03\x04\xD0\xC3\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFF-03\0\0\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xE0\x01%\x02\xB8\xAE\x9Cr\xFF\xFF\xFF\xFF0\x8F\x92\xA2\xFF\xFF\xFF\xFF@R{\xB6\xFF\xFF\xFF\xFF\xB0\xC9\x1A\xB7\xFF\xFF\xFF\xFF@\x8F\x1E\xB8\xFF\xFF\xFF\xFF0p\xD4\xB8\xFF\xFF\xFF\xFF\xC0}\x17\xBA\xFF\xFF\xFF\xFF\xB0\xA3\xB5\xBA\xFF\xFF\xFF\xFF@\xB1\xF8\xBB\xFF\xFF\xFF\xFF0\xD7\x96\xBC\xFF\xFF\xFF\xFF\xC0\xE4\xD9\xBD\xFF\xFF\xFF\xFF\xB0\nx\xBE\xFF\xFF\xFF\xFF@\x18\xBB\xBF\xFF\xFF\xFF\xFF\xB0\x8FZ\xC0\xFF\xFF\xFF\xFF@\x9D\x9D\xC1\xFF\xFF\xFF\xFF0\xC3;\xC2\xFF\xFF\xFF\xFF\xC0\xD0~\xC3\xFF\xFF\xFF\xFF\xB0\xF6\x1C\xC4\xFF\xFF\xFF\xFF@\x04`\xC5\xFF\xFF\xFF\xFF0*\xFE\xC5\xFF\xFF\xFF\xFF\xC07A\xC7\xFF\xFF\xFF\xFF0\xAF\xE0\xC7\xFF\xFF\xFF\xFF@\x94\x81\xC8\xFF\xFF\xFF\xFF\xB0\xA1M\xCA\xFF\xFF\xFF\xFF\xC0\x86\xEE\xCA\xFF\xFF\xFF\xFF0\xFFM\xCE\xFF\xFF\xFF\xFF\xC0\xED\xB0\xCE\xFF\xFF\xFF\xFF\xB05)\xD3\xFF\xFF\xFF\xFF\xC0dC\xD4\xFF\xFF\xFF\xFF0\x08=\xF4\xFF\xFF\xFF\xFF\xC0\xF6\x9F\xF4\xFF\xFF\xFF\xFF0l\x05\xF5\xFF\xFF\xFF\xFF@\x102\xF6\xFF\xFF\xFF\xFF\xB0\x9F\xE6\xF6\xFF\xFF\xFF\xFF\xC0C\x13\xF8\xFF\xFF\xFF\xFF0\xD3\xC7\xF8\xFF\xFF\xFF\xFF@w\xF4\xF9\xFF\xFF\xFF\xFF\xB06\xD3\xFA\xFF\xFF\xFF\xFF\xC05\xC3\xFB\xFF\xFF\xFF\xFF0S\xBC\xFC\xFF\xFF\xFF\xFF@R\xAC\xFD\xFF\xFF\xFF\xFF05\x9C\xFE\xFF\xFF\xFF\xFF@4\x8C\xFF\xFF\xFF\xFF\xFF\xB0J\xA3\x07\0\0\0\0\xA0o$\x08\0\0\0\0\xB0\xB5\x94#\0\0\0\0\xA0\x94\x10$\0\0\0\0\xB0\xF27%\0\0\0\0\xA0v\xF0%\0\0\0\0\xC0W*'\0\0\0\0\xB0\xDB\xE2'\0\0\0\0@\x8A\xEE(\0\0\0\0\xA0 a)\0\0\0\0\xA0:\xB0)\0\0\0\x000\xD3\xE0*\0\0\0\0 W\x99+\0\0\0\0\xB0\xC6\xF67\0\0\0\0\xB0*\xBF8\0\0\0\0\xB0\twG\0\0\0\0 \x7F\xDCG\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x05\x03\x04\x05\x03\x04\x05\x02\x03\x04\x02\x05\x05\x03\x04\x05\x03\x04\x03\x04\x03\x04\x05\x03\x04\xC8\xC2\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xC3\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFF-03\0\0\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xF0\x019\x02,\xB0\x9Cr\xFF\xFF\xFF\xFF0\x8F\x92\xA2\xFF\xFF\xFF\xFF@R{\xB6\xFF\xFF\xFF\xFF\xB0\xC9\x1A\xB7\xFF\xFF\xFF\xFF@\x8F\x1E\xB8\xFF\xFF\xFF\xFF0p\xD4\xB8\xFF\xFF\xFF\xFF\xC0}\x17\xBA\xFF\xFF\xFF\xFF\xB0\xA3\xB5\xBA\xFF\xFF\xFF\xFF@\xB1\xF8\xBB\xFF\xFF\xFF\xFF0\xD7\x96\xBC\xFF\xFF\xFF\xFF\xC0\xE4\xD9\xBD\xFF\xFF\xFF\xFF\xB0\nx\xBE\xFF\xFF\xFF\xFF@\x18\xBB\xBF\xFF\xFF\xFF\xFF\xB0\x8FZ\xC0\xFF\xFF\xFF\xFF@\x9D\x9D\xC1\xFF\xFF\xFF\xFF0\xC3;\xC2\xFF\xFF\xFF\xFF\xC0\xD0~\xC3\xFF\xFF\xFF\xFF\xB0\xF6\x1C\xC4\xFF\xFF\xFF\xFF@\x04`\xC5\xFF\xFF\xFF\xFF0*\xFE\xC5\xFF\xFF\xFF\xFF\xC07A\xC7\xFF\xFF\xFF\xFF0\xAF\xE0\xC7\xFF\xFF\xFF\xFF@\x94\x81\xC8\xFF\xFF\xFF\xFF\xB0\xA1M\xCA\xFF\xFF\xFF\xFF\xC0\x86\xEE\xCA\xFF\xFF\xFF\xFF0\xFFM\xCE\xFF\xFF\xFF\xFF\xC0\xED\xB0\xCE\xFF\xFF\xFF\xFF\xB05)\xD3\xFF\xFF\xFF\xFF\xC0dC\xD4\xFF\xFF\xFF\xFF0\x08=\xF4\xFF\xFF\xFF\xFF\xC0\xF6\x9F\xF4\xFF\xFF\xFF\xFF0l\x05\xF5\xFF\xFF\xFF\xFF@\x102\xF6\xFF\xFF\xFF\xFF\xB0\x9F\xE6\xF6\xFF\xFF\xFF\xFF\xC0C\x13\xF8\xFF\xFF\xFF\xFF0\xD3\xC7\xF8\xFF\xFF\xFF\xFF@w\xF4\xF9\xFF\xFF\xFF\xFF\xB06\xD3\xFA\xFF\xFF\xFF\xFF\xC05\xC3\xFB\xFF\xFF\xFF\xFF0S\xBC\xFC\xFF\xFF\xFF\xFF@R\xAC\xFD\xFF\xFF\xFF\xFF05\x9C\xFE\xFF\xFF\xFF\xFF@4\x8C\xFF\xFF\xFF\xFF\xFF\xB0J\xA3\x07\0\0\0\0\xA0o$\x08\0\0\0\0\xB0\xB5\x94#\0\0\0\0\xA0\x94\x10$\0\0\0\0\xB0\xF27%\0\0\0\0\xA0v\xF0%\0\0\0\x000\x0F!'\0\0\0\0\xA0\xB5\xCD'\0\0\0\0@&&(\0\0\0\x000\xF1\0)\0\0\0\0\xA0:\xB0)\0\0\0\x000\xD3\xE0*\0\0\0\0 W\x99+\0\0\0\0\xB0\xC6\xF67\0\0\0\0\xB0*\xBF8\0\0\0\x000\xF1\xBB@\0\0\0\0\xC0\x0B\xD5@\0\0\0\0\xB0\twG\0\0\0\0 \x7F\xDCG\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x02\x03\x04\x05\x03\x04\x05\x03\x04\x03\x04\x03\x04\x02\x03\x04\x05\x03\x04T\xC1\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xC3\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFF-03\0\0\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xE8\x01/\x02\x04\xB2\x9Cr\xFF\xFF\xFF\xFF0\x8F\x92\xA2\xFF\xFF\xFF\xFF@R{\xB6\xFF\xFF\xFF\xFF\xB0\xC9\x1A\xB7\xFF\xFF\xFF\xFF@\x8F\x1E\xB8\xFF\xFF\xFF\xFF0p\xD4\xB8\xFF\xFF\xFF\xFF\xC0}\x17\xBA\xFF\xFF\xFF\xFF\xB0\xA3\xB5\xBA\xFF\xFF\xFF\xFF@\xB1\xF8\xBB\xFF\xFF\xFF\xFF0\xD7\x96\xBC\xFF\xFF\xFF\xFF\xC0\xE4\xD9\xBD\xFF\xFF\xFF\xFF\xB0\nx\xBE\xFF\xFF\xFF\xFF@\x18\xBB\xBF\xFF\xFF\xFF\xFF\xB0\x8FZ\xC0\xFF\xFF\xFF\xFF@\x9D\x9D\xC1\xFF\xFF\xFF\xFF0\xC3;\xC2\xFF\xFF\xFF\xFF\xC0\xD0~\xC3\xFF\xFF\xFF\xFF\xB0\xF6\x1C\xC4\xFF\xFF\xFF\xFF@\x04`\xC5\xFF\xFF\xFF\xFF0*\xFE\xC5\xFF\xFF\xFF\xFF\xC07A\xC7\xFF\xFF\xFF\xFF0\xAF\xE0\xC7\xFF\xFF\xFF\xFF@\x94\x81\xC8\xFF\xFF\xFF\xFF\xB0\xA1M\xCA\xFF\xFF\xFF\xFF\xC0\x86\xEE\xCA\xFF\xFF\xFF\xFF0\xFFM\xCE\xFF\xFF\xFF\xFF\xC0\xED\xB0\xCE\xFF\xFF\xFF\xFF\xB05)\xD3\xFF\xFF\xFF\xFF\xC0dC\xD4\xFF\xFF\xFF\xFF0\x08=\xF4\xFF\xFF\xFF\xFF\xC0\xF6\x9F\xF4\xFF\xFF\xFF\xFF0l\x05\xF5\xFF\xFF\xFF\xFF@\x102\xF6\xFF\xFF\xFF\xFF\xB0\x9F\xE6\xF6\xFF\xFF\xFF\xFF\xC0C\x13\xF8\xFF\xFF\xFF\xFF0\xD3\xC7\xF8\xFF\xFF\xFF\xFF@w\xF4\xF9\xFF\xFF\xFF\xFF\xB06\xD3\xFA\xFF\xFF\xFF\xFF\xC05\xC3\xFB\xFF\xFF\xFF\xFF0S\xBC\xFC\xFF\xFF\xFF\xFF@R\xAC\xFD\xFF\xFF\xFF\xFF05\x9C\xFE\xFF\xFF\xFF\xFF@4\x8C\xFF\xFF\xFF\xFF\xFF\xB0J\xA3\x07\0\0\0\0\xA0o$\x08\0\0\0\0\xB0\xB5\x94#\0\0\0\0\xA0\x94\x10$\0\0\0\0\xB0\xF27%\0\0\0\0\xA0v\xF0%\0\0\0\0@4\x19'\0\0\0\0\xB0\xC3\xCD'\0\0\0\0\xC0g\xFA(\0\0\0\0\xB0H\xB0)\0\0\0\0@\xE1\xE0*\0\0\0\0 W\x99+\0\0\0\0\xB0\xC6\xF67\0\0\0\0\xB0*\xBF8\0\0\0\0\xB0\x13\xB0@\0\0\0\0\xC0>VA\0\0\0\0\xB0\twG\0\0\0\0 \x7F\xDCG\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x05\x03\x04\x05\x03\x04\x05\x02\x03\x04\x02\x03\x04\x02\x05\x03\x04\x03\x04\x03\x04\x02\x03\x04\x05\x03\x04|\xBF\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xC3\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFF-03\0\0\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xE8\x010\x02d\xB2\x9Cr\xFF\xFF\xFF\xFF0\x8F\x92\xA2\xFF\xFF\xFF\xFF@R{\xB6\xFF\xFF\xFF\xFF\xB0\xC9\x1A\xB7\xFF\xFF\xFF\xFF@\x8F\x1E\xB8\xFF\xFF\xFF\xFF0p\xD4\xB8\xFF\xFF\xFF\xFF\xC0}\x17\xBA\xFF\xFF\xFF\xFF\xB0\xA3\xB5\xBA\xFF\xFF\xFF\xFF@\xB1\xF8\xBB\xFF\xFF\xFF\xFF0\xD7\x96\xBC\xFF\xFF\xFF\xFF\xC0\xE4\xD9\xBD\xFF\xFF\xFF\xFF\xB0\nx\xBE\xFF\xFF\xFF\xFF@\x18\xBB\xBF\xFF\xFF\xFF\xFF\xB0\x8FZ\xC0\xFF\xFF\xFF\xFF@\x9D\x9D\xC1\xFF\xFF\xFF\xFF0\xC3;\xC2\xFF\xFF\xFF\xFF\xC0\xD0~\xC3\xFF\xFF\xFF\xFF\xB0\xF6\x1C\xC4\xFF\xFF\xFF\xFF@\x04`\xC5\xFF\xFF\xFF\xFF0*\xFE\xC5\xFF\xFF\xFF\xFF\xC07A\xC7\xFF\xFF\xFF\xFF0\xAF\xE0\xC7\xFF\xFF\xFF\xFF@\x94\x81\xC8\xFF\xFF\xFF\xFF\xB0\xA1M\xCA\xFF\xFF\xFF\xFF\xC0\x86\xEE\xCA\xFF\xFF\xFF\xFF0\xFFM\xCE\xFF\xFF\xFF\xFF\xC0\xED\xB0\xCE\xFF\xFF\xFF\xFF\xB05)\xD3\xFF\xFF\xFF\xFF\xC0dC\xD4\xFF\xFF\xFF\xFF0\x08=\xF4\xFF\xFF\xFF\xFF\xC0\xF6\x9F\xF4\xFF\xFF\xFF\xFF0l\x05\xF5\xFF\xFF\xFF\xFF@\x102\xF6\xFF\xFF\xFF\xFF\xB0\x9F\xE6\xF6\xFF\xFF\xFF\xFF\xC0C\x13\xF8\xFF\xFF\xFF\xFF0\xD3\xC7\xF8\xFF\xFF\xFF\xFF@w\xF4\xF9\xFF\xFF\xFF\xFF\xB06\xD3\xFA\xFF\xFF\xFF\xFF\xC05\xC3\xFB\xFF\xFF\xFF\xFF0S\xBC\xFC\xFF\xFF\xFF\xFF@R\xAC\xFD\xFF\xFF\xFF\xFF05\x9C\xFE\xFF\xFF\xFF\xFF@4\x8C\xFF\xFF\xFF\xFF\xFF\xB0J\xA3\x07\0\0\0\0\xA0o$\x08\0\0\0\0\xB0\xB5\x94#\0\0\0\0\xA0\x94\x10$\0\0\0\0\xB0\xF27%\0\0\0\0\xA0v\xF0%\0\0\0\x000\x0F!'\0\0\0\0\xA0X\xD0'\0\0\0\x000\xF1\0)\0\0\0\0\xA0:\xB0)\0\0\0\x000\xD3\xE0*\0\0\0\0 W\x99+\0\0\0\0\xB0\xC6\xF67\0\0\0\0\xB0*\xBF8\0\0\0\x000\xF1\xBB@\0\0\0\0\xC0\x0B\xD5@\0\0\0\0\xB0\twG\0\0\0\0 \x7F\xDCG\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x03\x04\x03\x04\x02\x03\x04\x05\x03\x04\x1C\xBF\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xC3\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFF-03\0\0\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xD8\x01\x1C\x02\xD4\xAE\x9Cr\xFF\xFF\xFF\xFF0\x8F\x92\xA2\xFF\xFF\xFF\xFF@R{\xB6\xFF\xFF\xFF\xFF\xB0\xC9\x1A\xB7\xFF\xFF\xFF\xFF@\x8F\x1E\xB8\xFF\xFF\xFF\xFF0p\xD4\xB8\xFF\xFF\xFF\xFF\xC0}\x17\xBA\xFF\xFF\xFF\xFF\xB0\xA3\xB5\xBA\xFF\xFF\xFF\xFF@\xB1\xF8\xBB\xFF\xFF\xFF\xFF0\xD7\x96\xBC\xFF\xFF\xFF\xFF\xC0\xE4\xD9\xBD\xFF\xFF\xFF\xFF\xB0\nx\xBE\xFF\xFF\xFF\xFF@\x18\xBB\xBF\xFF\xFF\xFF\xFF\xB0\x8FZ\xC0\xFF\xFF\xFF\xFF@\x9D\x9D\xC1\xFF\xFF\xFF\xFF0\xC3;\xC2\xFF\xFF\xFF\xFF\xC0\xD0~\xC3\xFF\xFF\xFF\xFF\xB0\xF6\x1C\xC4\xFF\xFF\xFF\xFF@\x04`\xC5\xFF\xFF\xFF\xFF0*\xFE\xC5\xFF\xFF\xFF\xFF\xC07A\xC7\xFF\xFF\xFF\xFF0\xAF\xE0\xC7\xFF\xFF\xFF\xFF@\x94\x81\xC8\xFF\xFF\xFF\xFF\xB0\xA1M\xCA\xFF\xFF\xFF\xFF\xC0\x86\xEE\xCA\xFF\xFF\xFF\xFF0\xFFM\xCE\xFF\xFF\xFF\xFF\xC0\xED\xB0\xCE\xFF\xFF\xFF\xFF\xB05)\xD3\xFF\xFF\xFF\xFF\xC0dC\xD4\xFF\xFF\xFF\xFF0\x08=\xF4\xFF\xFF\xFF\xFF\xC0\xF6\x9F\xF4\xFF\xFF\xFF\xFF0l\x05\xF5\xFF\xFF\xFF\xFF@\x102\xF6\xFF\xFF\xFF\xFF\xB0\x9F\xE6\xF6\xFF\xFF\xFF\xFF\xC0C\x13\xF8\xFF\xFF\xFF\xFF0\xD3\xC7\xF8\xFF\xFF\xFF\xFF@w\xF4\xF9\xFF\xFF\xFF\xFF\xB06\xD3\xFA\xFF\xFF\xFF\xFF\xC05\xC3\xFB\xFF\xFF\xFF\xFF0S\xBC\xFC\xFF\xFF\xFF\xFF@R\xAC\xFD\xFF\xFF\xFF\xFF05\x9C\xFE\xFF\xFF\xFF\xFF@4\x8C\xFF\xFF\xFF\xFF\xFF\xB0J\xA3\x07\0\0\0\0\xA0o$\x08\0\0\0\0\xB0\xB5\x94#\0\0\0\0\xA0\x94\x10$\0\0\0\0\xB0\xF27%\0\0\0\0\xA0v\xF0%\0\0\0\x000\x0F!'\0\0\0\0\xA0X\xD0'\0\0\0\0@\xFF\0)\0\0\0\0\xA0:\xB0)\0\0\0\x000\xD3\xE0*\0\0\0\0 W\x99+\0\0\0\0\xB0\xC6\xF67\0\0\0\0\xB0*\xBF8\0\0\0\0\xB0\twG\0\0\0\0 \x7F\xDCG\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x02\x05\x03\x04\x05\x03\x04\x03\x04\x03\x04\x05\x03\x04\xAC\xC2\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xC3\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFF-03\0\0\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xF0\x019\x02\xBC\xB1\x9Cr\xFF\xFF\xFF\xFF0\x8F\x92\xA2\xFF\xFF\xFF\xFF@R{\xB6\xFF\xFF\xFF\xFF\xB0\xC9\x1A\xB7\xFF\xFF\xFF\xFF@\x8F\x1E\xB8\xFF\xFF\xFF\xFF0p\xD4\xB8\xFF\xFF\xFF\xFF\xC0}\x17\xBA\xFF\xFF\xFF\xFF\xB0\xA3\xB5\xBA\xFF\xFF\xFF\xFF@\xB1\xF8\xBB\xFF\xFF\xFF\xFF0\xD7\x96\xBC\xFF\xFF\xFF\xFF\xC0\xE4\xD9\xBD\xFF\xFF\xFF\xFF\xB0\nx\xBE\xFF\xFF\xFF\xFF@\x18\xBB\xBF\xFF\xFF\xFF\xFF\xB0\x8FZ\xC0\xFF\xFF\xFF\xFF@\x9D\x9D\xC1\xFF\xFF\xFF\xFF0\xC3;\xC2\xFF\xFF\xFF\xFF\xC0\xD0~\xC3\xFF\xFF\xFF\xFF\xB0\xF6\x1C\xC4\xFF\xFF\xFF\xFF@\x04`\xC5\xFF\xFF\xFF\xFF0*\xFE\xC5\xFF\xFF\xFF\xFF\xC07A\xC7\xFF\xFF\xFF\xFF0\xAF\xE0\xC7\xFF\xFF\xFF\xFF@\x94\x81\xC8\xFF\xFF\xFF\xFF\xB0\xA1M\xCA\xFF\xFF\xFF\xFF\xC0\x86\xEE\xCA\xFF\xFF\xFF\xFF0\xFFM\xCE\xFF\xFF\xFF\xFF\xC0\xED\xB0\xCE\xFF\xFF\xFF\xFF\xB05)\xD3\xFF\xFF\xFF\xFF\xC0dC\xD4\xFF\xFF\xFF\xFF0\x08=\xF4\xFF\xFF\xFF\xFF\xC0\xF6\x9F\xF4\xFF\xFF\xFF\xFF0l\x05\xF5\xFF\xFF\xFF\xFF@\x102\xF6\xFF\xFF\xFF\xFF\xB0\x9F\xE6\xF6\xFF\xFF\xFF\xFF\xC0C\x13\xF8\xFF\xFF\xFF\xFF0\xD3\xC7\xF8\xFF\xFF\xFF\xFF@w\xF4\xF9\xFF\xFF\xFF\xFF\xB06\xD3\xFA\xFF\xFF\xFF\xFF\xC05\xC3\xFB\xFF\xFF\xFF\xFF0S\xBC\xFC\xFF\xFF\xFF\xFF@R\xAC\xFD\xFF\xFF\xFF\xFF05\x9C\xFE\xFF\xFF\xFF\xFF@4\x8C\xFF\xFF\xFF\xFF\xFF\xB0J\xA3\x07\0\0\0\0\xA0o$\x08\0\0\0\0\xB0\xB5\x94#\0\0\0\0\xA0\x94\x10$\0\0\0\0\xB0\xF27%\0\0\0\0\xA0v\xF0%\0\0\0\x000\x0F!'\0\0\0\0\xA0\xB5\xCD'\0\0\0\0@&&(\0\0\0\x000\xF1\0)\0\0\0\0\xA0:\xB0)\0\0\0\x000\xD3\xE0*\0\0\0\0 W\x99+\0\0\0\0\xB0\xC6\xF67\0\0\0\0\xB0*\xBF8\0\0\0\0\xB0\x9F\xBA@\0\0\0\0@0\x03A\0\0\0\0\xB0\twG\0\0\0\0 \x7F\xDCG\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x02\x03\x04\x05\x03\x04\x05\x03\x04\x03\x04\x03\x04\x02\x03\x04\x05\x03\x04\xC4\xBF\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xC3\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFF-03\0\0\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xE8\x01/\x02\xB4\xAF\x9Cr\xFF\xFF\xFF\xFF0\x8F\x92\xA2\xFF\xFF\xFF\xFF@R{\xB6\xFF\xFF\xFF\xFF\xB0\xC9\x1A\xB7\xFF\xFF\xFF\xFF@\x8F\x1E\xB8\xFF\xFF\xFF\xFF0p\xD4\xB8\xFF\xFF\xFF\xFF\xC0}\x17\xBA\xFF\xFF\xFF\xFF\xB0\xA3\xB5\xBA\xFF\xFF\xFF\xFF@\xB1\xF8\xBB\xFF\xFF\xFF\xFF0\xD7\x96\xBC\xFF\xFF\xFF\xFF\xC0\xE4\xD9\xBD\xFF\xFF\xFF\xFF\xB0\nx\xBE\xFF\xFF\xFF\xFF@\x18\xBB\xBF\xFF\xFF\xFF\xFF\xB0\x8FZ\xC0\xFF\xFF\xFF\xFF@\x9D\x9D\xC1\xFF\xFF\xFF\xFF0\xC3;\xC2\xFF\xFF\xFF\xFF\xC0\xD0~\xC3\xFF\xFF\xFF\xFF\xB0\xF6\x1C\xC4\xFF\xFF\xFF\xFF@\x04`\xC5\xFF\xFF\xFF\xFF0*\xFE\xC5\xFF\xFF\xFF\xFF\xC07A\xC7\xFF\xFF\xFF\xFF0\xAF\xE0\xC7\xFF\xFF\xFF\xFF@\x94\x81\xC8\xFF\xFF\xFF\xFF\xB0\xA1M\xCA\xFF\xFF\xFF\xFF\xC0\x86\xEE\xCA\xFF\xFF\xFF\xFF0\xFFM\xCE\xFF\xFF\xFF\xFF\xC0\xED\xB0\xCE\xFF\xFF\xFF\xFF\xB05)\xD3\xFF\xFF\xFF\xFF\xC0dC\xD4\xFF\xFF\xFF\xFF0\x08=\xF4\xFF\xFF\xFF\xFF\xC0\xF6\x9F\xF4\xFF\xFF\xFF\xFF0l\x05\xF5\xFF\xFF\xFF\xFF@\x102\xF6\xFF\xFF\xFF\xFF\xB0\x9F\xE6\xF6\xFF\xFF\xFF\xFF\xC0C\x13\xF8\xFF\xFF\xFF\xFF0\xD3\xC7\xF8\xFF\xFF\xFF\xFF@w\xF4\xF9\xFF\xFF\xFF\xFF\xB06\xD3\xFA\xFF\xFF\xFF\xFF\xC05\xC3\xFB\xFF\xFF\xFF\xFF0S\xBC\xFC\xFF\xFF\xFF\xFF@R\xAC\xFD\xFF\xFF\xFF\xFF05\x9C\xFE\xFF\xFF\xFF\xFF@4\x8C\xFF\xFF\xFF\xFF\xFF\xB0J\xA3\x07\0\0\0\0\xA0o$\x08\0\0\0\0\xB0\xB5\x94#\0\0\0\0\xA0\x94\x10$\0\0\0\0\xB0\xF27%\0\0\0\0\xA0\xA5\xFD%\0\0\0\0@4\x19'\0\0\0\0\xB0\xC3\xCD'\0\0\0\0\xC0\x1BG(\0\0\0\0\xB0\xC6\xF67\0\0\0\0\xB0*\xBF8\0\0\0\0\xB0\x9F\xBA@\0\0\0\0@0\x03A\0\0\0\0\xB0\twG\0\0\0\0\xA0\xFC\x93G\0\0\0\0@v\xF1H\0\0\0\0\xB04\xB3I\0\0\0\0@X\xD1J\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x05\x03\x04\x05\x03\x04\x05\x02\x03\x04\x02\x03\x04\x03\x04\x03\x04\x02\x03\x04\x05\x02\x03\x04\x02\x03\x04\xCC\xC1\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xC3\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFF-03\0\0\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xF0\x018\x02\xA4\xAE\x9Cr\xFF\xFF\xFF\xFF0\x8F\x92\xA2\xFF\xFF\xFF\xFF@R{\xB6\xFF\xFF\xFF\xFF\xB0\xC9\x1A\xB7\xFF\xFF\xFF\xFF@\x8F\x1E\xB8\xFF\xFF\xFF\xFF0p\xD4\xB8\xFF\xFF\xFF\xFF\xC0}\x17\xBA\xFF\xFF\xFF\xFF\xB0\xA3\xB5\xBA\xFF\xFF\xFF\xFF@\xB1\xF8\xBB\xFF\xFF\xFF\xFF0\xD7\x96\xBC\xFF\xFF\xFF\xFF\xC0\xE4\xD9\xBD\xFF\xFF\xFF\xFF\xB0\nx\xBE\xFF\xFF\xFF\xFF@\x18\xBB\xBF\xFF\xFF\xFF\xFF\xB0\x8FZ\xC0\xFF\xFF\xFF\xFF@\x9D\x9D\xC1\xFF\xFF\xFF\xFF0\xC3;\xC2\xFF\xFF\xFF\xFF\xC0\xD0~\xC3\xFF\xFF\xFF\xFF\xB0\xF6\x1C\xC4\xFF\xFF\xFF\xFF@\x04`\xC5\xFF\xFF\xFF\xFF0*\xFE\xC5\xFF\xFF\xFF\xFF\xC07A\xC7\xFF\xFF\xFF\xFF0\xAF\xE0\xC7\xFF\xFF\xFF\xFF@\x94\x81\xC8\xFF\xFF\xFF\xFF\xB0\xA1M\xCA\xFF\xFF\xFF\xFF\xC0\x86\xEE\xCA\xFF\xFF\xFF\xFF0\xFFM\xCE\xFF\xFF\xFF\xFF\xC0\xED\xB0\xCE\xFF\xFF\xFF\xFF\xB05)\xD3\xFF\xFF\xFF\xFF\xC0dC\xD4\xFF\xFF\xFF\xFF0\x08=\xF4\xFF\xFF\xFF\xFF\xC0\xF6\x9F\xF4\xFF\xFF\xFF\xFF0l\x05\xF5\xFF\xFF\xFF\xFF@\x102\xF6\xFF\xFF\xFF\xFF\xB0\x9F\xE6\xF6\xFF\xFF\xFF\xFF\xC0C\x13\xF8\xFF\xFF\xFF\xFF0\xD3\xC7\xF8\xFF\xFF\xFF\xFF@w\xF4\xF9\xFF\xFF\xFF\xFF\xB06\xD3\xFA\xFF\xFF\xFF\xFF\xC05\xC3\xFB\xFF\xFF\xFF\xFF0S\xBC\xFC\xFF\xFF\xFF\xFF@R\xAC\xFD\xFF\xFF\xFF\xFF05\x9C\xFE\xFF\xFF\xFF\xFF@4\x8C\xFF\xFF\xFF\xFF\xFF\xB0J\xA3\x07\0\0\0\0\xA0o$\x08\0\0\0\0\xB0\xB5\x94#\0\0\0\0\xA0\x94\x10$\0\0\0\0\xB0\xF27%\0\0\0\0\xA0v\xF0%\0\0\0\x000\x0F!'\0\0\0\0\xA0X\xD0'\0\0\0\0@\xFF\0)\0\0\0\0\xA0:\xB0)\0\0\0\x000\xD3\xE0*\0\0\0\0 W\x99+\0\0\0\0\xB0\xC6\xF67\0\0\0\0\xB0*\xBF8\0\0\0\x000\xF1\xBB@\0\0\0\0@\xD1\xCB@\0\0\0\0\xB0\twG\0\0\0\0 \x7F\xDCG\0\0\0\0\xB0\xA2\xFAH\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x02\x05\x03\x04\x05\x03\x04\x03\x04\x03\x04\x02\x03\x04\x05\x03\x04\x05\xDC\xC2\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xC3\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFF-03\0\0\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xE8\x010\x02\x88\xB1\x9Cr\xFF\xFF\xFF\xFF0\x8F\x92\xA2\xFF\xFF\xFF\xFF@R{\xB6\xFF\xFF\xFF\xFF\xB0\xC9\x1A\xB7\xFF\xFF\xFF\xFF@\x8F\x1E\xB8\xFF\xFF\xFF\xFF0p\xD4\xB8\xFF\xFF\xFF\xFF\xC0}\x17\xBA\xFF\xFF\xFF\xFF\xB0\xA3\xB5\xBA\xFF\xFF\xFF\xFF@\xB1\xF8\xBB\xFF\xFF\xFF\xFF0\xD7\x96\xBC\xFF\xFF\xFF\xFF\xC0\xE4\xD9\xBD\xFF\xFF\xFF\xFF\xB0\nx\xBE\xFF\xFF\xFF\xFF@\x18\xBB\xBF\xFF\xFF\xFF\xFF\xB0\x8FZ\xC0\xFF\xFF\xFF\xFF@\x9D\x9D\xC1\xFF\xFF\xFF\xFF0\xC3;\xC2\xFF\xFF\xFF\xFF\xC0\xD0~\xC3\xFF\xFF\xFF\xFF\xB0\xF6\x1C\xC4\xFF\xFF\xFF\xFF@\x04`\xC5\xFF\xFF\xFF\xFF0*\xFE\xC5\xFF\xFF\xFF\xFF\xC07A\xC7\xFF\xFF\xFF\xFF0\xAF\xE0\xC7\xFF\xFF\xFF\xFF@\x94\x81\xC8\xFF\xFF\xFF\xFF\xB0\xA1M\xCA\xFF\xFF\xFF\xFF\xC0\x86\xEE\xCA\xFF\xFF\xFF\xFF0\xFFM\xCE\xFF\xFF\xFF\xFF\xC0\xED\xB0\xCE\xFF\xFF\xFF\xFF\xB05)\xD3\xFF\xFF\xFF\xFF\xC0dC\xD4\xFF\xFF\xFF\xFF0\x08=\xF4\xFF\xFF\xFF\xFF\xC0\xF6\x9F\xF4\xFF\xFF\xFF\xFF0l\x05\xF5\xFF\xFF\xFF\xFF@\x102\xF6\xFF\xFF\xFF\xFF\xB0\x9F\xE6\xF6\xFF\xFF\xFF\xFF\xC0C\x13\xF8\xFF\xFF\xFF\xFF0\xD3\xC7\xF8\xFF\xFF\xFF\xFF@w\xF4\xF9\xFF\xFF\xFF\xFF\xB06\xD3\xFA\xFF\xFF\xFF\xFF\xC05\xC3\xFB\xFF\xFF\xFF\xFF0S\xBC\xFC\xFF\xFF\xFF\xFF@R\xAC\xFD\xFF\xFF\xFF\xFF05\x9C\xFE\xFF\xFF\xFF\xFF@4\x8C\xFF\xFF\xFF\xFF\xFF\xB0J\xA3\x07\0\0\0\0\xA0o$\x08\0\0\0\0\xB0\xB5\x94#\0\0\0\0\xA0\x94\x10$\0\0\0\0\xB0\xF27%\0\0\0\0\xA0v\xF0%\0\0\0\x000\x0F!'\0\0\0\0\xA0X\xD0'\0\0\0\x000\xF1\0)\0\0\0\0\xA0:\xB0)\0\0\0\x000\xD3\xE0*\0\0\0\0 W\x99+\0\0\0\0\xB0\xC6\xF67\0\0\0\0\xB0*\xBF8\0\0\0\x000N\xB9@\0\0\0\0\xC0\x0B\xD5@\0\0\0\0\xB0\twG\0\0\0\0 \x7F\xDCG\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x03\x04\x03\x04\x02\x03\x04\x05\x03\x04\xF8\xBF\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xC3\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFF-03\0\0\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0@\x03\xDB\x03\x90\x11\x87i\xFF\xFF\xFF\xFF\x90\xF5\x17\xB8\xFF\xFF\xFF\xFF@\xDA+\x05\0\0\0\0\xB0\xF0\xFC\x07\0\0\0\0\xC0t\xCF\n\0\0\0\0\xB0\xCA\x97\x0B\0\0\0\0\xC0\xF9\xB1\x0C\0\0\0\x000\xFEx\r\0\0\0\0@-\x93\x0E\0\0\0\0\xB01Z\x0F\0\0\0\0\xC0`t\x10\0\0\0\0\xB0Cd\x11\0\0\0\0@\x94U\x12\0\0\0\0\xB0\xC8F\x13\0\0\0\0@\x198\x14\0\0\0\x000\xFC'\x15\0\0\0\0\xC0L\x19\x16\0\0\0\0\xB0/\t\x17\0\0\0\0@\x80\xFA\x17\0\0\0\x000c\xEA\x18\0\0\0\0\xC0\xB3\xDB\x19\0\0\0\x000\xE8\xCC\x1A\0\0\0\0\xC08\xBE\x1B\0\0\0\0\xB0\x1B\xAE\x1C\0\0\0\0@l\x9F\x1D\0\0\0\x000O\x8F\x1E\0\0\0\0\xC0\x9F\x80\x1F\0\0\0\0\xB0\x82p \0\0\0\0@\xD3a!\0\0\0\0\xB0\x07S\"\0\0\0\0@XD#\0\0\0\x000;4$\0\0\0\0@;A%\0\0\0\0\xB0n\x15&\0\0\0\0@\xBF\x06'\0\0\0\x000\xA2\xF6'\0\0\0\0@\x8A\xEE(\0\0\0\0\xB0H\xB0)\0\0\0\0\xC0\xBD\xCF*\0\0\0\x000\t\xB9+\0\0\0\0@\xAB\xAB,\0\0\0\0\xB0\x0Cp-\0\0\0\0\xC0\xDE\x8C.\0\0\0\0\xB0\xEEO/\0\0\0\0@\x12n0\0\0\0\x000h61\0\0\0\0\xC0.W2\0\0\0\0\xB0\xB2\x0F3\0\0\0\0\xC0\x1074\0\0\0\x000\xCF\xF84\0\0\0\0\xC0\xF2\x166\0\0\0\0\xB0\xEB\xE16\0\0\0\0\xC0\xD4\xF67\0\0\0\0\xB0\xCD\xC18\0\0\0\0\xC0\xB6\xD69\0\0\0\0\xB0\xAF\xA1:\0\0\0\0@\xD3\xBF;\0\0\0\x000\xB6\xAF<\0\0\0\0\xC0\x90q=\0\0\0\x000\x98\x8F>\0\0\0\0@\xADZ?\0\0\0\x000zo@\0\0\0\0@\xEEqA\0\0\0\0\xB0\xAC3B\0\0\0\0@\xD0QC\0\0\0\0\xB0\x8E\x13D\0\0\0\0@\xB21E\0\0\0\0\xB0p\xF3E\0\0\0\0\xC0\xCE\x1AG\0\0\0\0\xB0R\xD3G\0\0\0\0\xC0\xB0\xFAH\0\0\0\0\xB04\xB3I\0\0\0\0\xC0\x92\xDAJ\0\0\0\x000;\xC1K\0\0\0\0\xC0\xFF\xA7L\0\0\0\x000\x1D\xA1M\0\0\0\0\xC0\xE1\x87N\0\0\0\x000\xFF\x80O\0\0\0\0@\xFEpP\0\0\0\x000lNQ\0\0\0\0@\xE0PR\0\0\0\x000N.S\0\0\0\0@\xC20T\0\0\0\x0000\x0EU\0\0\0\0@\xA4\x10V\0\0\0\0\xB0L\xF7V\0\0\0\0@\x86\xF0W\0\0\0\0\xB0.\xD7X\0\0\0\0@h\xD0Y\0\0\0\0\xB0\x10\xB7Z\0\0\0\0\xC0\x84\xB9[\0\0\0\0\xB0\xF2\x96\\\0\0\0\0\xC0f\x99]\0\0\0\0\xB0\xD4v^\0\0\0\0\xC0Hy_\0\0\0\x000\xF1_`\0\0\0\0\xC0*Ya\0\0\0\x000\xD3?b\0\0\0\0\xC0\x0C9c\0\0\0\x000\xB5\x1Fd\0\0\0\0\xC0\xEE\x18e\0\0\0\x000\x97\xFFe\0\0\0\0@\x0B\x02g\0\0\0\0\xB0\xDA\rg\0\0\0\0\0\x01\x02\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x02\x03\xF0\xC9\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF-03\0\0\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xE8\x01%\x02\x1Ck\xAA\x96\xFF\xFF\xFF\xFF\xE0I\x0F\xB8\xFF\xFF\xFF\xFF\xA0@\xFD\xB8\xFF\xFF\xFF\xFF04\xF1\xB9\xFF\xFF\xFF\xFF t\xDE\xBA\xFF\xFF\xFF\xFF0\xAE8\xDA\xFF\xFF\xFF\xFF0\xFA\xEB\xDA\xFF\xFF\xFF\xFF\xB0\xE1\x19\xDC\xFF\xFF\xFF\xFF Y\xB9\xDC\xFF\xFF\xFF\xFF0\x15\xFB\xDD\xFF\xFF\xFF\xFF \xDE\x9B\xDE\xFF\xFF\xFF\xFF0\x9A\xDD\xDF\xFF\xFF\xFF\xFF 3T\xE0\xFF\xFF\xFF\xFF\xB0\xFF\x97\xF4\xFF\xFF\xFF\xFF ^\x05\xF5\xFF\xFF\xFF\xFF0d\xC0\xF6\xFF\xFF\xFF\xFF\xA0\x1E\x0E\xF7\xFF\xFF\xFF\xFF0,Q\xF8\xFF\xFF\xFF\xFF \xC5\xC7\xF8\xFF\xFF\xFF\xFF\xB0\xD2\n\xFA\xFF\xFF\xFF\xFF\xA0\xF8\xA8\xFA\xFF\xFF\xFF\xFF0\x06\xEC\xFB\xFF\xFF\xFF\xFF\xA0}\x8B\xFC\xFF\xFF\xFF\xFF0\x8E\xC9\x1D\0\0\0\0\xA0\xD7x\x1E\0\0\0\0\xB05\xA0\x1F\0\0\0\0\xA0\xCF3 \0\0\0\x000i\x81!\0\0\0\0\xA0\xC8\x0B\"\0\0\0\0\xB0\x10X#\0\0\0\0 p\xE2#\0\0\0\0\xB0\xF27%\0\0\0\0 \xC7\xD4%\0\0\0\x000\x0F!'\0\0\0\0\xA0\xE3\xBD'\0\0\0\x000\xF1\0)\0\0\0\0 \x8B\x94)\0\0\0\0\xB0\r\xEA*\0\0\0\0\xA02k+\0\0\0\x000\xB5\xC0,\0\0\0\0 \xC4f-\0\0\0\x000\x97\xA0.\0\0\0\0 \xA6F/\0\0\0\x000y\x800\0\0\0\0\xA0M\x1D1\0\0\0\0\xB0 W2\0\0\0\0 j\x063\0\0\0\x000T84\0\0\0\0 \xC1\xF84\0\0\0\x000\x1F 6\0\0\0\0\xA0h\xCF6\0\0\0\0\xB0\xC6\xF67\0\0\0\0 \x85\xB88\0\0\0\x000\xE3\xDF9\0\0\0\0\xA0,\x8F:\0\0\0\0\xB0\xFF\xC8;\0\0\0\0\xA0\x0Eo<\0\0\0\x000\x91\xC4=\0\0\0\0\xA0\xF0N>\0\0\0\0\xB0H\x9AN\0\0\0\0 \x92IO\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xE4\xDB\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFFCST\0\0\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \x01T\x01p\xE8\xB6\xA5\xFF\xFF\xFF\xFFp+\xF1\xAF\xFF\xFF\xFF\xFF`Vf\xB6\xFF\xFF\xFF\xFFp=A\xB7\xFF\xFF\xFF\xFF`6\x0C\xB8\xFF\xFF\xFF\xFF\xF0\x86\xFD\xB8\xFF\xFF\xFF\xFF`q\xEA\xCB\xFF\xFF\xFF\xFF\x10\x84g1\0\0\0\0\x80\x16s2\0\0\0\0\x10fG3\0\0\0\0\x80\xF8R4\0\0\0\0\x10H'5\0\0\0\0\x80\xDA26\0\0\0\0\x10*\x077\0\0\0\0\0\xF7\x1B8\0\0\0\0\x10\x0C\xE78\0\0\0\0\0\xD9\xFB9\0\0\0\0\x90\x12\xF5:\0\0\0\0\0\xD1\xB6;\0\0\0\0\x90\n\xB0<\0\0\0\0\0\x9D\xBB=\0\0\0\0\x90\xEC\x8F>\0\0\0\0\0\x7F\x9B?\0\0\0\0\x90\xCEo@\0\0\0\0\x80\x9B\x84A\0\0\0\0\x90\xB0OB\0\0\0\0\x80}dC\0\0\0\0\x90\x92/D\0\0\0\0\x80_DE\0\0\0\0\x90t\x0FF\0\0\0\0\x80A$G\0\0\0\0\x10\x91\xF8G\0\0\0\0\x80#\x04I\0\0\0\0\x10s\xD8I\0\0\0\0\x80\x05\xE4J\0\0\0\0\x10U\xB8K\0\0\0\0\x01\x02\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x04T\x9D\xFF\xFF\xFF\xFF\xFF\xFF\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFFAST\0\0\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0x\0\x87\0e\xA9@\x92\xFF\xFF\xFF\xFF\xD0\xCB\xE3\xCB\xFF\xFF\xFF\xFF\xE0\x82\x94\xCC\xFF\xFF\xFF\xFF\xD0\"\xD6\xCD\xFF\xFF\xFF\xFF\xE0M|\xCE\xFF\xFF\xFF\xFF\xD0\xA6\x9B\xCF\xFF\xFF\xFF\xFF`je\xD0\xFF\xFF\xFF\xFF\xE0\xF2\0\x0E\0\0\0\0\xD0\x8C\x94\x0E\0\0\0\0\xE0\0\x97\x0F\0\0\0\0\xD0nt\x10\0\0\0\0\xE0\xE2v\x11\0\0\0\0\xD0PT\x12\0\0\0\0`\xFF_\x13\0\0\0\0P>0\x14\0\0\0\0\x01\x02\x01\x02\x01\x03\x01\x02\x01\x02\x01\x02\x01\x02\x01\x1B\xC8\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xC8\xCE\xFF\xFF\xFF\xFF\xFF\xFF-03\0\0\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xE8\0\x05\x01tt\xAA\x96\xFF\xFF\xFF\xFF\xE0I\x0F\xB8\xFF\xFF\xFF\xFF\xA0@\xFD\xB8\xFF\xFF\xFF\xFF04\xF1\xB9\xFF\xFF\xFF\xFF t\xDE\xBA\xFF\xFF\xFF\xFF0\xAE8\xDA\xFF\xFF\xFF\xFF0\xFA\xEB\xDA\xFF\xFF\xFF\xFF\xB0\xE1\x19\xDC\xFF\xFF\xFF\xFF Y\xB9\xDC\xFF\xFF\xFF\xFF0\x15\xFB\xDD\xFF\xFF\xFF\xFF \xDE\x9B\xDE\xFF\xFF\xFF\xFF0\x9A\xDD\xDF\xFF\xFF\xFF\xFF 3T\xE0\xFF\xFF\xFF\xFF\xB0\xFF\x97\xF4\xFF\xFF\xFF\xFF ^\x05\xF5\xFF\xFF\xFF\xFF0d\xC0\xF6\xFF\xFF\xFF\xFF\xA0\x1E\x0E\xF7\xFF\xFF\xFF\xFF0,Q\xF8\xFF\xFF\xFF\xFF \xC5\xC7\xF8\xFF\xFF\xFF\xFF\xB0\xD2\n\xFA\xFF\xFF\xFF\xFF\xA0\xF8\xA8\xFA\xFF\xFF\xFF\xFF0\x06\xEC\xFB\xFF\xFF\xFF\xFF\xA0}\x8B\xFC\xFF\xFF\xFF\xFF0\x8E\xC9\x1D\0\0\0\0\xA0\xD7x\x1E\0\0\0\0\xB05\xA0\x1F\0\0\0\0\xA0\xCF3 \0\0\0\x000i\x81!\0\0\0\0\xA0\xC8\x0B\"\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x8C\xD2\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFFCST\0\0\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\x03r\x03\xB0\xD9^\x93\xFF\xFF\xFF\xFF\xE0;\x9F\x9F\xFF\xFF\xFF\xFF\xD8QE\xA0\xFF\xFF\xFF\xFF\xE0\x1D\x7F\xA1\xFF\xFF\xFF\xFFXn.\xA2\xFF\xFF\xFF\xFF\xE0\xFF^\xA3\xFF\xFF\xFF\xFFXP\x0E\xA4\xFF\xFF\xFF\xFF\xE0\xE1>\xA5\xFF\xFF\xFF\xFFX2\xEE\xA5\xFF\xFF\xFF\xFF`\xFE'\xA7\xFF\xFF\xFF\xFFX\x14\xCE\xA7\xFF\xFF\xFF\xFF`\xE0\x07\xA9\xFF\xFF\xFF\xFFX\xF6\xAD\xA9\xFF\xFF\xFF\xFF`\xC2\xE7\xAA\xFF\xFF\xFF\xFF\xD8\x12\x97\xAB\xFF\xFF\xFF\xFF`\xA4\xC7\xAC\xFF\xFF\xFF\xFF\xD8\xF4v\xAD\xFF\xFF\xFF\xFF`\x86\xA7\xAE\xFF\xFF\xFF\xFF\xD8\xD6V\xAF\xFF\xFF\xFF\xFF`h\x87\xB0\xFF\xFF\xFF\xFF\xD8\xB86\xB1\xFF\xFF\xFF\xFF\xE0\x84p\xB2\xFF\xFF\xFF\xFF\xD8\x9A\x16\xB3\xFF\xFF\xFF\xFF\xE0fP\xB4\xFF\xFF\xFF\xFF\xD8|\xF6\xB4\xFF\xFF\xFF\xFF\xE0H0\xB6\xFF\xFF\xFF\xFFX\x99\xDF\xB6\xFF\xFF\xFF\xFF\xE0*\x10\xB8\xFF\xFF\xFF\xFFX{\xBF\xB8\xFF\xFF\xFF\xFF\xE0\x0C\xF0\xB9\xFF\xFF\xFF\xFFX]\x9F\xBA\xFF\xFF\xFF\xFF`)\xD9\xBB\xFF\xFF\xFF\xFFX?\x7F\xBC\xFF\xFF\xFF\xFF`\x0B\xB9\xBD\xFF\xFF\xFF\xFFX!_\xBE\xFF\xFF\xFF\xFF`\xED\x98\xBF\xFF\xFF\xFF\xFFX\x03?\xC0\xFF\xFF\xFF\xFF`\xCFx\xC1\xFF\xFF\xFF\xFF\xD8\x1F(\xC2\xFF\xFF\xFF\xFF`\xB1X\xC3\xFF\xFF\xFF\xFF\xD8\x01\x08\xC4\xFF\xFF\xFF\xFF`\x938\xC5\xFF\xFF\xFF\xFF\xD8\xE3\xE7\xC5\xFF\xFF\xFF\xFF\xE0\xAF!\xC7\xFF\xFF\xFF\xFF\xD8\xC5\xC7\xC7\xFF\xFF\xFF\xFF\xE0\x91\x01\xC9\xFF\xFF\xFF\xFF\xD8\xA7\xA7\xC9\xFF\xFF\xFF\xFF\xE0s\xE1\xCA\xFF\xFF\xFF\xFFX\xC4\x90\xCB\xFF\xFF\xFF\xFF\xE0\"@\xCC\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFFPq\xC6\xD2\xFF\xFF\xFF\xFF`\xFA)\xD6\xFF\xFF\xFF\xFF\xD8J\xD9\xD6\xFF\xFF\xFF\xFF`\xDC\t\xD8\xFF\xFF\xFF\xFF\xD8,\xB9\xD8\xFF\xFF\xFF\xFF`\xBE\xE9\xD9\xFF\xFF\xFF\xFF\xD8\x0E\x99\xDA\xFF\xFF\xFF\xFF\xE0\xDA\xD2\xDB\xFF\xFF\xFF\xFF\xD8\xF0x\xDC\xFF\xFF\xFF\xFF\xE0\xBC\xB2\xDD\xFF\xFF\xFF\xFF\xD8\xD2X\xDE\xFF\xFF\xFF\xFF\xE0\x9E\x92\xDF\xFF\xFF\xFF\xFFX\xEFA\xE0\xFF\xFF\xFF\xFF\xE0\x80r\xE1\xFF\xFF\xFF\xFFX\xD1!\xE2\xFF\xFF\xFF\xFF\xE0bR\xE3\xFF\xFF\xFF\xFFX\xB3\x01\xE4\xFF\xFF\xFF\xFF\xE0D2\xE5\xFF\xFF\xFF\xFFX\x95\xE1\xE5\xFF\xFF\xFF\xFF`a\x1B\xE7\xFF\xFF\xFF\xFFXw\xC1\xE7\xFF\xFF\xFF\xFF`C\xFB\xE8\xFF\xFF\xFF\xFFXY\xA1\xE9\xFF\xFF\xFF\xFF`%\xDB\xEA\xFF\xFF\xFF\xFF\xD8u\x8A\xEB\xFF\xFF\xFF\xFF`\x07\xBB\xEC\xFF\xFF\xFF\xFF\xD8Wj\xED\xFF\xFF\xFF\xFF`\xE9\x9A\xEE\xFF\xFF\xFF\xFF\xD89J\xEF\xFF\xFF\xFF\xFF\xE0\x05\x84\xF0\xFF\xFF\xFF\xFF\xD8\x1B*\xF1\xFF\xFF\xFF\xFF\xE0\xE7c\xF2\xFF\xFF\xFF\xFF\xD8\xFD\t\xF3\xFF\xFF\xFF\xFF\xE0\xC9C\xF4\xFF\xFF\xFF\xFF\xD8\xDF\xE9\xF4\xFF\xFF\xFF\xFF\xE0\xAB#\xF6\xFF\xFF\xFF\xFFX\xFC\xD2\xF6\xFF\xFF\xFF\xFF\xE0\x8D\x03\xF8\xFF\xFF\xFF\xFFX\xDE\xB2\xF8\xFF\xFF\xFF\xFF\xE0o\xE3\xF9\xFF\xFF\xFF\xFFX\xC0\x92\xFA\xFF\xFF\xFF\xFF`\x8C\xCC\xFB\xFF\xFF\xFF\xFFX\xA2r\xFC\xFF\xFF\xFF\xFF`\xDBb\x07\0\0\0\0P\xD0\xB9\x07\0\0\0\0`qa\x18\0\0\0\0P7\xAB\x18\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x03\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x01\x03\x01P\xAD\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xA8\xB2\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF-04\0\0\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\x01)\x01\xE0\x7F\xAA\x96\xFF\xFF\xFF\xFF\xF0W\x0F\xB8\xFF\xFF\xFF\xFF\xB0N\xFD\xB8\xFF\xFF\xFF\xFF@B\xF1\xB9\xFF\xFF\xFF\xFF0\x82\xDE\xBA\xFF\xFF\xFF\xFF@\xBC8\xDA\xFF\xFF\xFF\xFF@\x08\xEC\xDA\xFF\xFF\xFF\xFF\xC0\xEF\x19\xDC\xFF\xFF\xFF\xFF0g\xB9\xDC\xFF\xFF\xFF\xFF@#\xFB\xDD\xFF\xFF\xFF\xFF0\xEC\x9B\xDE\xFF\xFF\xFF\xFF@\xA8\xDD\xDF\xFF\xFF\xFF\xFF0AT\xE0\xFF\xFF\xFF\xFF\xC0\r\x98\xF4\xFF\xFF\xFF\xFF0l\x05\xF5\xFF\xFF\xFF\xFF@r\xC0\xF6\xFF\xFF\xFF\xFF\xB0,\x0E\xF7\xFF\xFF\xFF\xFF@:Q\xF8\xFF\xFF\xFF\xFF0\xD3\xC7\xF8\xFF\xFF\xFF\xFF\xC0\xE0\n\xFA\xFF\xFF\xFF\xFF\xB0\x06\xA9\xFA\xFF\xFF\xFF\xFF@\x14\xEC\xFB\xFF\xFF\xFF\xFF\xB0\x8B\x8B\xFC\xFF\xFF\xFF\xFF@\x9C\xC9\x1D\0\0\0\0\xB0\xE5x\x1E\0\0\0\0\xC0C\xA0\x1F\0\0\0\0\xB0\xDD3 \0\0\0\0@w\x81!\0\0\0\0\xB0\xD6\x0B\"\0\0\0\0\xC0\xD4\xF67\0\0\0\x000\x93\xB88\0\0\0\0@\xF1\xDF9\0\0\0\0\xB0\x1D\xE99\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01 \xC7\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF-05\0\0\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0$\0\xF04\x9C^\xFF\xFF\xFF\xFFpUX\x98\xFF\xFF\xFF\xFFPs\x03*\0\0\0\0@\x89t+\0\0\0\0\0\x01\x02\x01\x90\xBA\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFFMST\0\0\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFF\x01MDT\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0\xD8\x02^\x03\xC0\x1A\x04^\xFF\xFF\xFF\xFF\xA0H\xA6\x9E\xFF\xFF\xFF\xFF\x90\x15\xBB\x9F\xFF\xFF\xFF\xFF\xA0*\x86\xA0\xFF\xFF\xFF\xFF\x90\xF7\x9A\xA1\xFF\xFF\xFF\xFF LF\xA8\xFF\xFF\xFF\xFF\x90\x0C\x89\xCB\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF\0\x18a\xD2\xFF\xFF\xFF\xFF\x10u\xF8\xFA\xFF\xFF\xFF\xFF\0X\xE8\xFB\xFF\xFF\xFF\xFF\x10W\xD8\xFC\xFF\xFF\xFF\xFF\0:\xC8\xFD\xFF\xFF\xFF\xFF\x109\xB8\xFE\xFF\xFF\xFF\xFF\0\x1C\xA8\xFF\xFF\xFF\xFF\xFF\x10\x1B\x98\0\0\0\0\0\0\xFE\x87\x01\0\0\0\0\x10\xFDw\x02\0\0\0\0\x80\x1Aq\x03\0\0\0\0\x90\x19a\x04\0\0\0\0\x80\xFCP\x05\0\0\0\0\x90\xFB@\x06\0\0\0\0\x80\xDE0\x07\0\0\0\0\x90\x1F\xB2\x07\0\0\0\0\x80\xC0\x10\t\0\0\0\0\x10\xB1\xAD\t\0\0\0\0\x80\xA2\xF0\n\0\0\0\0\x90\xA1\xE0\x0B\0\0\0\0\0\xBF\xD9\x0C\0\0\0\0\x90\x83\xC0\r\0\0\0\0\0\xA1\xB9\x0E\0\0\0\0\x10\xA0\xA9\x0F\0\0\0\0\0\x83\x99\x10\0\0\0\0\x10\x82\x89\x11\0\0\0\0\0ey\x12\0\0\0\0\x10di\x13\0\0\0\0\0GY\x14\0\0\0\0\x10FI\x15\0\0\0\0\0)9\x16\0\0\0\0\x10()\x17\0\0\0\0\x80E\"\x18\0\0\0\0\x10\n\t\x19\0\0\0\0\x80'\x02\x1A\0\0\0\0\x90&\xF2\x1A\0\0\0\0\x80\t\xE2\x1B\0\0\0\0\x90\x08\xD2\x1C\0\0\0\0\x80\xEB\xC1\x1D\0\0\0\0\x90\xEA\xB1\x1E\0\0\0\0\x80\xCD\xA1\x1F\0\0\0\0\x10\x1Dv \0\0\0\0\x80\xAF\x81!\0\0\0\0\x10\xFFU\"\0\0\0\0\0\xCCj#\0\0\0\0\x10\xE15$\0\0\0\0\0\xAEJ%\0\0\0\0\x10\xC3\x15&\0\0\0\0\0\x90*'\0\0\0\0\x90\xDF\xFE'\0\0\0\0\0r\n)\0\0\0\0\x90\xC1\xDE)\0\0\0\0\0T\xEA*\0\0\0\0\x90\xA3\xBE+\0\0\0\0\x80p\xD3,\0\0\0\0\x90\x85\x9E-\0\0\0\0\x80R\xB3.\0\0\0\0\x90g~/\0\0\0\0\x804\x930\0\0\0\0\x10\x84g1\0\0\0\0\x80\x16s2\0\0\0\0\x10fG3\0\0\0\0\x80\xF8R4\0\0\0\0\x10H'5\0\0\0\0\x80\xDA26\0\0\0\0\x10*\x077\0\0\0\0\0\xF7\x1B8\0\0\0\0\x10\x0C\xE78\0\0\0\0\0\xD9\xFB9\0\0\0\0\x10\xEE\xC6:\0\0\0\0\0\xBB\xDB;\0\0\0\0\x90\n\xB0<\0\0\0\0\0\x9D\xBB=\0\0\0\0\x90\xEC\x8F>\0\0\0\0\0\x7F\x9B?\0\0\0\0\x90\xCEo@\0\0\0\0\x80\x9B\x84A\0\0\0\0\x90\xB0OB\0\0\0\0\x80}dC\0\0\0\0\x90\x92/D\0\0\0\0\x80_DE\0\0\0\0\x10\xC5\xF3E\0\0\0\0\0|-G\0\0\0\0\x01\x02\x01\x02\x01\x02\x03\x04\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x0F\x93\xFF\xFF\xFF\xFF\xFF\xFF\x80\x8F\xFF\xFF\xFF\xFF\xFF\xFF\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFF\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFFMST\0\0\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFF\x01MDT\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0h\x02\xBF\x02\x80\xCD\xF2\xA1\xFF\xFF\xFF\xFF\x90\x0C\x89\xCB\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF\0\x18a\xD2\xFF\xFF\xFF\xFF\x90\x19a\x04\0\0\0\0\x80\xFCP\x05\0\0\0\0\x90\xFB@\x06\0\0\0\0\x80\xDE0\x07\0\0\0\0\x90\xDD \x08\0\0\0\0\x80\xC0\x10\t\0\0\0\0\x90\xBF\0\n\0\0\0\0\x80\xA2\xF0\n\0\0\0\0\x90\xA1\xE0\x0B\0\0\0\0\0\xBF\xD9\x0C\0\0\0\0\x90\x83\xC0\r\0\0\0\0\0\xA1\xB9\x0E\0\0\0\0\x10\xA0\xA9\x0F\0\0\0\0\0\x83\x99\x10\0\0\0\0\x10\x82\x89\x11\0\0\0\0\0ey\x12\0\0\0\0\x10di\x13\0\0\0\0\0GY\x14\0\0\0\0\x10FI\x15\0\0\0\0\0)9\x16\0\0\0\0\x10()\x17\0\0\0\0\x80E\"\x18\0\0\0\0\x10\n\t\x19\0\0\0\0\x80'\x02\x1A\0\0\0\0\x90&\xF2\x1A\0\0\0\0\x80\t\xE2\x1B\0\0\0\0\x90\x08\xD2\x1C\0\0\0\0\x80\xEB\xC1\x1D\0\0\0\0\x90\xEA\xB1\x1E\0\0\0\0\x80\xCD\xA1\x1F\0\0\0\0\x10\x1Dv \0\0\0\0\x80\xAF\x81!\0\0\0\0\x10\xFFU\"\0\0\0\0\0\xCCj#\0\0\0\0\x10\xE15$\0\0\0\0\0\xAEJ%\0\0\0\0\x10\xC3\x15&\0\0\0\0\0\x90*'\0\0\0\0\x90\xDF\xFE'\0\0\0\0\0r\n)\0\0\0\0\x90\xC1\xDE)\0\0\0\0\0T\xEA*\0\0\0\0\x90\xA3\xBE+\0\0\0\0\x80p\xD3,\0\0\0\0\x90\x85\x9E-\0\0\0\0\x80R\xB3.\0\0\0\0\x90g~/\0\0\0\0\x804\x930\0\0\0\0\x10\x84g1\0\0\0\0\x80\x16s2\0\0\0\0\x10fG3\0\0\0\0\x80\xF8R4\0\0\0\0\x10H'5\0\0\0\0\x80\xDA26\0\0\0\0\x10*\x077\0\0\0\0\0\xF7\x1B8\0\0\0\0\0\xFE\xE68\0\0\0\0\xF0\xCA\xFB9\0\0\0\0P\xE9\x04:\0\0\0\0\x10\xEE\xC6:\0\0\0\0\0\xBB\xDB;\0\0\0\0\x90\n\xB0<\0\0\0\0\0\x9D\xBB=\0\0\0\0\x90\xEC\x8F>\0\0\0\0\0\x7F\x9B?\0\0\0\0\x90\xCEo@\0\0\0\0\x80\x9B\x84A\0\0\0\0\x90\xB0OB\0\0\0\0\x80}dC\0\0\0\0\x90\x92/D\0\0\0\0\x80_DE\0\0\0\0\x10\xC5\xF3E\0\0\0\0\0|-G\0\0\0\0\x01\x02\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x02\x03\x04\x04\x05\x02\x03\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\0\0\0\0\0\0\0\0\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF-04\0\0\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xB0\x02\x06\x034z\xAA\x96\xFF\xFF\xFF\xFF\xF0W\x0F\xB8\xFF\xFF\xFF\xFF\xB0N\xFD\xB8\xFF\xFF\xFF\xFF@B\xF1\xB9\xFF\xFF\xFF\xFF0\x82\xDE\xBA\xFF\xFF\xFF\xFF@\xBC8\xDA\xFF\xFF\xFF\xFF@\x08\xEC\xDA\xFF\xFF\xFF\xFF\xC0\xEF\x19\xDC\xFF\xFF\xFF\xFF0g\xB9\xDC\xFF\xFF\xFF\xFF@#\xFB\xDD\xFF\xFF\xFF\xFF0\xEC\x9B\xDE\xFF\xFF\xFF\xFF@\xA8\xDD\xDF\xFF\xFF\xFF\xFF0AT\xE0\xFF\xFF\xFF\xFF\xC0\r\x98\xF4\xFF\xFF\xFF\xFF0l\x05\xF5\xFF\xFF\xFF\xFF@r\xC0\xF6\xFF\xFF\xFF\xFF\xB0,\x0E\xF7\xFF\xFF\xFF\xFF@:Q\xF8\xFF\xFF\xFF\xFF0\xD3\xC7\xF8\xFF\xFF\xFF\xFF\xC0\xE0\n\xFA\xFF\xFF\xFF\xFF\xB0\x06\xA9\xFA\xFF\xFF\xFF\xFF@\x14\xEC\xFB\xFF\xFF\xFF\xFF\xB0\x8B\x8B\xFC\xFF\xFF\xFF\xFF@\x9C\xC9\x1D\0\0\0\0\xB0\xE5x\x1E\0\0\0\0\xC0C\xA0\x1F\0\0\0\0\xB0\xDD3 \0\0\0\0@w\x81!\0\0\0\0\xB0\xD6\x0B\"\0\0\0\0\xC0\x1EX#\0\0\0\x000~\xE2#\0\0\0\0\xC0\08%\0\0\0\x000\xD5\xD4%\0\0\0\0@\x1D!'\0\0\0\0\xB0\xF1\xBD'\0\0\0\0@\xFF\0)\0\0\0\x000\x99\x94)\0\0\0\0\xC0\x1B\xEA*\0\0\0\0\xB0@k+\0\0\0\0@\xC3\xC0,\0\0\0\x000\xD2f-\0\0\0\0@\xA5\xA0.\0\0\0\x000\xB4F/\0\0\0\0@\x87\x800\0\0\0\0\xB0[\x1D1\0\0\0\0\xC0.W2\0\0\0\x000x\x063\0\0\0\0@b84\0\0\0\x000\xCF\xF84\0\0\0\0@- 6\0\0\0\0\xB0v\xCF6\0\0\0\0\xC0\xD4\xF67\0\0\0\x000\x93\xB88\0\0\0\0@\xF1\xDF9\0\0\0\0\xB0:\x8F:\0\0\0\0\xC0\r\xC9;\0\0\0\0\xB0\x1Co<\0\0\0\0@\x9F\xC4=\0\0\0\0\xB0\xFEN>\0\0\0\0@\x0C\x92?\0\0\0\0\xB0\xE0.@\0\0\0\0@\x06\x87A\0\0\0\x000\xFD\x17B\0\0\0\0@\xD0QC\0\0\0\x000\xDF\xF7C\0\0\0\0\xC0aME\0\0\0\0\xB0\xFB\xE0E\0\0\0\0@\x94\x11G\0\0\0\x000\xA3\xB7G\0\0\0\0\xC0\xB0\xFAH\0\0\0\x000\x85\x97I\0\0\0\0\xC0\x92\xDAJ\0\0\0\0\xB0\xA1\x80K\0\0\0\0\xC0t\xBAL\0\0\0\0\xB0\x83`M\0\0\0\0\xC0V\x9AN\0\0\0\x000\xA0IO\0\0\0\0@s\x83P\0\0\0\0\xB0G Q\0\0\0\0@UcR\0\0\0\0\xB0)\0S\0\0\0\0@7CT\0\0\0\x000F\xE9T\0\0\0\0@\x19#V\0\0\0\x000(\xC9V\0\0\0\0@\xFB\x02X\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\xCC\xCC\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFFEST\0\0\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0X\x01\x98\x01`\xDA\xB6\xA5\xFF\xFF\xFF\xFF\0\xE6\x8A\x16\0\0\0\0\xD0\xCCw\x18\0\0\0\0\0vg1\0\0\0\0p\x08s2\0\0\0\0\0XG3\0\0\0\0p\xEAR4\0\0\0\0\xF0+'5\0\0\0\0`\0\xC45\0\0\0\0p\xCC26\0\0\0\0\0\x1C\x077\0\0\0\0\xF0\xE8\x1B8\0\0\0\0\0\xFE\xE68\0\0\0\0\xF0\xCA\xFB9\0\0\0\0\x80\x04\xF5:\0\0\0\0\xF0\xC2\xB6;\0\0\0\0\x80\xFC\xAF<\0\0\0\0\xF0\x8E\xBB=\0\0\0\0\x80\xDE\x8F>\0\0\0\0\xF0p\x9B?\0\0\0\0\x80\xC0o@\0\0\0\0p\x8D\x84A\0\0\0\0\x80\xA2OB\0\0\0\0podC\0\0\0\0\x80\x84/D\0\0\0\0pQDE\0\0\0\0\x80f\x0FF\0\0\0\0p3$G\0\0\0\0\0\x83\xF8G\0\0\0\0p\x15\x04I\0\0\0\0\0e\xD8I\0\0\0\0p\xF7\xE3J\0\0\0\0\0G\xB8K\0\0\0\0\xF0\x13\xCDL\0\0\0\0\0)\x98M\0\0\0\0\xF0\xF5\xACN\0\0\0\0\0\x0BxO\0\0\0\0\xF0\xD7\x8CP\0\0\0\0\x80'aQ\0\0\0\0\xF0\xB9lR\0\0\0\0\x80\tAS\0\0\0\0\xF0\x9BLT\0\0\0\0\0\xDD\xCDT\0\0\0\0\x01\x02\x01\x02\x03\x01\x02\x03\x02\x03\x04\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\xA8\xAE\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF-04\0\0\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0(\0-\0@\x1A\x87i\xFF\xFF\xFF\xFF<,\x1E\x93\xFF\xFF\xFF\xFFH\xEC\x98\xF6\xFF\xFF\xFF\xFFp\x92[G\0\0\0\0p\xA9%W\0\0\0\0\x01\x02\x03\x02\x03@\xC1\xFF\xFF\xFF\xFF\xFF\xFFD\xC1\xFF\xFF\xFF\xFF\xFF\xFF\xB8\xC0\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF-03\0\0\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\0\x12\0\x90+\xF4\x91\xFF\xFF\xFF\xFF\xC05\xC3\xFB\xFF\xFF\xFF\xFF\x01\x02\xF0\xCE\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFFCST\0\0\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\x01CDT\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0\x80\x05v\x06\xA0\xFE\x03^\xFF\xFF\xFF\xFF\x80,\xA6\x9E\xFF\xFF\xFF\xFFp\xF9\xBA\x9F\xFF\xFF\xFF\xFF\x80\x0E\x86\xA0\xFF\xFF\xFF\xFFp\xDB\x9A\xA1\xFF\xFF\xFF\xFF\0t\xCB\xA2\xFF\xFF\xFF\xFF\xF0\xF7\x83\xA3\xFF\xFF\xFF\xFF\x80\xD2E\xA4\xFF\xFF\xFF\xFF\xF0\xD9c\xA5\xFF\xFF\xFF\xFF\0\xD9S\xA6\xFF\xFF\xFF\xFFp\x97\x15\xA7\xFF\xFF\xFF\xFF\0\xBB3\xA8\xFF\xFF\xFF\xFF\xF0\xB3\xFE\xA8\xFF\xFF\xFF\xFF\0\x9D\x13\xAA\xFF\xFF\xFF\xFF\xF0\x95\xDE\xAA\xFF\xFF\xFF\xFF\0\x7F\xF3\xAB\xFF\xFF\xFF\xFF\xF0w\xBE\xAC\xFF\xFF\xFF\xFF\0a\xD3\xAD\xFF\xFF\xFF\xFF\xF0Y\x9E\xAE\xFF\xFF\xFF\xFF\0C\xB3\xAF\xFF\xFF\xFF\xFF\xF0;~\xB0\xFF\xFF\xFF\xFF\x80_\x9C\xB1\xFF\xFF\xFF\xFFpXg\xB2\xFF\xFF\xFF\xFF\x80A|\xB3\xFF\xFF\xFF\xFFp:G\xB4\xFF\xFF\xFF\xFF\x80#\\\xB5\xFF\xFF\xFF\xFFp\x1C'\xB6\xFF\xFF\xFF\xFF\x80\x05<\xB7\xFF\xFF\xFF\xFFp\xFE\x06\xB8\xFF\xFF\xFF\xFF\x80\xE7\x1B\xB9\xFF\xFF\xFF\xFFp\xE0\xE6\xB9\xFF\xFF\xFF\xFF\0\x04\x05\xBB\xFF\xFF\xFF\xFFp\xC2\xC6\xBB\xFF\xFF\xFF\xFF\0\xE6\xE4\xBC\xFF\xFF\xFF\xFF\xF0\xDE\xAF\xBD\xFF\xFF\xFF\xFF\0\xC8\xC4\xBE\xFF\xFF\xFF\xFF\xF0\xC0\x8F\xBF\xFF\xFF\xFF\xFF\0\xD6Z\xC0\xFF\xFF\xFF\xFFp<\xB0\xC1\xFF\xFF\xFF\xFF\0\x8C\x84\xC2\xFF\xFF\xFF\xFF\xF0\x84O\xC3\xFF\xFF\xFF\xFF\0nd\xC4\xFF\xFF\xFF\xFF\xF0f/\xC5\xFF\xFF\xFF\xFF\x80\x8AM\xC6\xFF\xFF\xFF\xFF\xF0H\x0F\xC7\xFF\xFF\xFF\xFF\x80l-\xC8\xFF\xFF\xFF\xFFpe\xF8\xC8\xFF\xFF\xFF\xFF\x80N\r\xCA\xFF\xFF\xFF\xFFpG\xD8\xCA\xFF\xFF\xFF\xFF\x80\xFE\x88\xCB\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF\xF0\ta\xD2\xFF\xFF\xFF\xFF\0\xF3u\xD3\xFF\xFF\xFF\xFF\xF0\xEB@\xD4\xFF\xFF\xFF\xFF\0\xD5U\xD5\xFF\xFF\xFF\xFF\xF0\xCD \xD6\xFF\xFF\xFF\xFF\0\xB75\xD7\xFF\xFF\xFF\xFF\xF0\xAF\0\xD8\xFF\xFF\xFF\xFF\0\x99\x15\xD9\xFF\xFF\xFF\xFF\xF0\x91\xE0\xD9\xFF\xFF\xFF\xFF\x80\xB5\xFE\xDA\xFF\xFF\xFF\xFF\xF0s\xC0\xDB\xFF\xFF\xFF\xFF\x80\x97\xDE\xDC\xFF\xFF\xFF\xFFp\x90\xA9\xDD\xFF\xFF\xFF\xFF\x80y\xBE\xDE\xFF\xFF\xFF\xFFpr\x89\xDF\xFF\xFF\xFF\xFF\x80[\x9E\xE0\xFF\xFF\xFF\xFFpTi\xE1\xFF\xFF\xFF\xFF\x80=~\xE2\xFF\xFF\xFF\xFFp6I\xE3\xFF\xFF\xFF\xFF\x80\x1F^\xE4\xFF\xFF\xFF\xFF\xF0\0\0\0\0\xF0p\x9B?\0\0\0\0\x80\xC0o@\0\0\0\0p\x8D\x84A\0\0\0\0\x80\xA2OB\0\0\0\0podC\0\0\0\0\x80\x84/D\0\0\0\0pQDE\0\0\0\0\0\xB7\xF3E\0\0\0\0\xF0m-G\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\xD4\xAD\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFFCST\0\0\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xE0\x01:\x02p\xE8\xB6\xA5\xFF\xFF\xFF\xFFp+\xF1\xAF\xFF\xFF\xFF\xFF`Vf\xB6\xFF\xFF\xFF\xFFp=A\xB7\xFF\xFF\xFF\xFF`6\x0C\xB8\xFF\xFF\xFF\xFF\xF0\x86\xFD\xB8\xFF\xFF\xFF\xFF\0vg1\0\0\0\0p\x08s2\0\0\0\0\0XG3\0\0\0\0p\xEAR4\0\0\0\0\x10H'5\0\0\0\0\x80\xDA26\0\0\0\0\x10*\x077\0\0\0\0\0\xF7\x1B8\0\0\0\0\x10\x0C\xE78\0\0\0\0\0\xD9\xFB9\0\0\0\0\x90\x12\xF5:\0\0\0\0\0\xD1\xB6;\0\0\0\0\x90\n\xB0<\0\0\0\0\0\x9D\xBB=\0\0\0\0\x90\xEC\x8F>\0\0\0\0\0\x7F\x9B?\0\0\0\0\x90\xCEo@\0\0\0\0\x80\x9B\x84A\0\0\0\0\x90\xB0OB\0\0\0\0\x80}dC\0\0\0\0\x90\x92/D\0\0\0\0\x80_DE\0\0\0\0\x90t\x0FF\0\0\0\0\x80A$G\0\0\0\0\x10\x91\xF8G\0\0\0\0\x80#\x04I\0\0\0\0\x10s\xD8I\0\0\0\0\x80\x05\xE4J\0\0\0\0\x10U\xB8K\0\0\0\0\0\"\xCDL\0\0\0\0\x107\x98M\0\0\0\0\0\x04\xADN\0\0\0\0\x10\x19xO\0\0\0\0\0\xE6\x8CP\0\0\0\0\x905aQ\0\0\0\0\0\xC8lR\0\0\0\0\x90\x17AS\0\0\0\0\0\xAALT\0\0\0\0\x90\xF9 U\0\0\0\0\0\x8C,V\0\0\0\0\x90\xDB\0W\0\0\0\0\x80\xA8\x15X\0\0\0\0\x90\xBD\xE0X\0\0\0\0\x80\x8A\xF5Y\0\0\0\0\x90\x9F\xC0Z\0\0\0\0\x80l\xD5[\0\0\0\0\x10\xBC\xA9\\\0\0\0\0\x80N\xB5]\0\0\0\0\x10\x9E\x89^\0\0\0\0\x800\x95_\0\0\0\0\x10\x80i`\0\0\0\0\0M~a\0\0\0\0\x10bIb\0\0\0\0\0/^c\0\0\0\0\x01\x02\x01\x02\x03\x01\x02\x03\x04\x02\x03\x04\x02\x03\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x02\x03\x8C\x9C\xFF\xFF\xFF\xFF\xFF\xFF\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFFMST\0\0\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFF\x01MDT\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0\xE8\x01C\x02p\xE8\xB6\xA5\xFF\xFF\xFF\xFFp+\xF1\xAF\xFF\xFF\xFF\xFF`Vf\xB6\xFF\xFF\xFF\xFFp=A\xB7\xFF\xFF\xFF\xFF`6\x0C\xB8\xFF\xFF\xFF\xFF\xF0\x86\xFD\xB8\xFF\xFF\xFF\xFF\0vg1\0\0\0\0p\x08s2\0\0\0\0\0XG3\0\0\0\0p\xEAR4\0\0\0\0\x10H'5\0\0\0\0\x80\xDA26\0\0\0\0\x10*\x077\0\0\0\0\0\xF7\x1B8\0\0\0\0\x10\x0C\xE78\0\0\0\0\0\xD9\xFB9\0\0\0\0\x90\x12\xF5:\0\0\0\0\0\xD1\xB6;\0\0\0\0\x90\n\xB0<\0\0\0\0\0\x9D\xBB=\0\0\0\0\x90\xEC\x8F>\0\0\0\0\0\x7F\x9B?\0\0\0\0\x90\xCEo@\0\0\0\0\x80\x9B\x84A\0\0\0\0\x90\xB0OB\0\0\0\0\x80}dC\0\0\0\0\x90\x92/D\0\0\0\0\x80_DE\0\0\0\0\x90t\x0FF\0\0\0\0\x80A$G\0\0\0\0\x10\x91\xF8G\0\0\0\0\x80#\x04I\0\0\0\0\x10s\xD8I\0\0\0\0\x80\x05\xE4J\0\0\0\0\x90\xA5\x9CK\0\0\0\0\x80\\\xD6L\0\0\0\0\x90\x87|M\0\0\0\0\x80>\xB6N\0\0\0\0\x90i\\O\0\0\0\0\x80 \x96P\0\0\0\0\x90K\x05\0\0\0\0\xB0\r\0\x06\0\0\0\0@\xBC\x0B\x07\0\0\0\0\xB0\xEF\xDF\x07\0\0\0\0@\x13\xFE\x08\0\0\0\0\xB0\xD1\xBF\t\0\0\0\0@\xF5\xDD\n\0\0\0\x000\xEE\xA8\x0B\0\0\0\0@\xD7\xBD\x0C\0\0\0\x000\xD0\x88\r\0\0\0\0@\xB9\x9D\x0E\0\0\0\x000\xB2h\x0F\0\0\0\0\xC0\xD5\x86\x10\0\0\0\x000\x94H\x11\0\0\0\0\xC0\xB7f\x12\0\0\0\x000v(\x13\0\0\0\0\xC0\x99F\x14\0\0\0\0\xB0\x92\x11\x15\0\0\0\0\xC0{&\x16\0\0\0\0\xB0t\xF1\x16\0\0\0\0\xC0]\x06\x18\0\0\0\0\xB0V\xD1\x18\0\0\0\0\xC0?\xE6\x19\0\0\0\0\xB08\xB1\x1A\0\0\0\0@\\\xCF\x1B\0\0\0\0\xB0\x1A\x91\x1C\0\0\0\0@>\xAF\x1D\0\0\0\0\xB0\xFCp\x1E\0\0\0\0@ \x8F\x1F\0\0\0\x000\x03\x7F \0\0\0\0@\x02o!\0\0\0\x000\xFB9\"\0\0\0\0@\xE4N#\0\0\0\x000\xDD\x19$\0\0\0\0\xC0\08%\0\0\0\x000\xBF\xF9%\0\0\0\0\xC0\xF8\xF2&\0\0\0\x000\xA1\xD9'\0\0\0\0\xC0\xC4\xF7(\0\0\0\0\xB0\xBD\xC2)\0\0\0\0\xC0\xA6\xD7*\0\0\0\0\xB0\x9F\xA2+\0\0\0\0\xC0\x88\xB7,\0\0\0\0\xB0\x81\x82-\0\0\0\0\xC0j\x97.\0\0\0\0\xB0cb/\0\0\0\0@\x87\x800\0\0\0\0\xB0EB1\0\0\0\0@i`2\0\0\0\x000\xD7=3\0\0\0\0@K@4\0\0\0\x000D\x0B5\0\0\0\0@\xB8\r6\0\0\0\0\xB0\xD5\x067\0\0\0\0@\x0F\08\0\0\0\x000\x08\xCB8\0\0\0\0\xC0+\xE99\0\0\0\x000\xEA\xAA:\0\0\0\0\xC0\r\xC9;\0\0\0\x000\xCC\x8A<\0\0\0\0\xC0\xEF\xA8=\0\0\0\x000\xAEj>\0\0\0\0\xC0\xD1\x88?\0\0\0\0\xB0\xCAS@\0\0\0\0\xC0\xB3hA\0\0\0\0\xB0\xAC3B\0\0\0\0\xC0\x95HC\0\0\0\0\xB0\x8E\x13D\0\0\0\0@\xB21E\0\0\0\0\xB0p\xF3E\0\0\0\0@\x94\x11G\0\0\0\x000\x02\xEFG\0\0\0\0@v\xF1H\0\0\0\x000o\xBCI\0\0\0\0@X\xD1J\0\0\0\0\xB0\0\xB8K\0\0\0\0@:\xB1L\0\0\0\x000\x07\xC6M\0\0\0\0\xC0\x82PN\0\0\0\0\xB0\xAE\x9CO\0\0\0\0\xC0\xD9BP\0\0\0\0\xB0\x90|Q\0\0\0\0@\xF6+R\0\0\0\0\xB0r\\S\0\0\0\0@\xD8\x0BT\0\0\0\x000\xE67W\0\0\0\0\xC0\xEC\xAFW\0\0\0\x000\xC8\x17Y\0\0\0\0\xC0\xCE\x8FY\0\0\0\x000\xAA\xF7Z\0\0\0\0\xC0\xB0o[\0\0\0\0\xB0g\xA9\\\0\0\0\0\xC0|t]\0\0\0\0\xB0I\x89^\0\0\0\0\xC0^T_\0\0\0\0\xB0+i`\0\0\0\0\xC0@4a\0\0\0\0\xB0\rIb\0\0\0\0@]\x1Dc\0\0\0\0\xB0\xEF(d\0\0\0\0\xC0\x04\xF4d\0\0\0\x000\x0C\x12f\0\0\0\0@!\xDDf\0\0\0\0\xB0\x84\xDBg\0\0\0\0\x01\x02\x01\x03\x01\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x03\x04\x02\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x05\x06p\xBC\xFF\xFF\xFF\xFF\xFF\xFF\xBB\xBD\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF-04\0\0\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xA0\x02\xF4\x02\x94{\xAA\x96\xFF\xFF\xFF\xFF\xF0W\x0F\xB8\xFF\xFF\xFF\xFF\xB0N\xFD\xB8\xFF\xFF\xFF\xFF@B\xF1\xB9\xFF\xFF\xFF\xFF0\x82\xDE\xBA\xFF\xFF\xFF\xFF@\xBC8\xDA\xFF\xFF\xFF\xFF@\x08\xEC\xDA\xFF\xFF\xFF\xFF\xC0\xEF\x19\xDC\xFF\xFF\xFF\xFF0g\xB9\xDC\xFF\xFF\xFF\xFF@#\xFB\xDD\xFF\xFF\xFF\xFF0\xEC\x9B\xDE\xFF\xFF\xFF\xFF@\xA8\xDD\xDF\xFF\xFF\xFF\xFF0AT\xE0\xFF\xFF\xFF\xFF\xC0\r\x98\xF4\xFF\xFF\xFF\xFF0l\x05\xF5\xFF\xFF\xFF\xFF@r\xC0\xF6\xFF\xFF\xFF\xFF\xB0,\x0E\xF7\xFF\xFF\xFF\xFF@:Q\xF8\xFF\xFF\xFF\xFF0\xD3\xC7\xF8\xFF\xFF\xFF\xFF\xC0\xE0\n\xFA\xFF\xFF\xFF\xFF\xB0\x06\xA9\xFA\xFF\xFF\xFF\xFF@\x14\xEC\xFB\xFF\xFF\xFF\xFF\xB0\x8B\x8B\xFC\xFF\xFF\xFF\xFF@\x9C\xC9\x1D\0\0\0\0\xB0\xE5x\x1E\0\0\0\0\xC0C\xA0\x1F\0\0\0\0\xB0\xDD3 \0\0\0\0@w\x81!\0\0\0\0\xB0\xD6\x0B\"\0\0\0\0\xC0\x1EX#\0\0\0\x000~\xE2#\0\0\0\0\xC0\08%\0\0\0\x000\xD5\xD4%\0\0\0\0@\x1D!'\0\0\0\0\xB0\xF1\xBD'\0\0\0\0@\xFF\0)\0\0\0\x000\x99\x94)\0\0\0\0\xC0\x1B\xEA*\0\0\0\0\xB0@k+\0\0\0\0@\xC3\xC0,\0\0\0\x000\xD2f-\0\0\0\0@\xA5\xA0.\0\0\0\x000\xB4F/\0\0\0\0@\x87\x800\0\0\0\0\xB0[\x1D1\0\0\0\0\xC0.W2\0\0\0\x000x\x063\0\0\0\0@b84\0\0\0\x000\xCF\xF84\0\0\0\0@- 6\0\0\0\0\xB0v\xCF6\0\0\0\0\xC0\xD4\xF67\0\0\0\x000\x93\xB88\0\0\0\0@\xF1\xDF9\0\0\0\0\xB0:\x8F:\0\0\0\0\xC0\r\xC9;\0\0\0\0\xB0\x1Co<\0\0\0\0@\x9F\xC4=\0\0\0\0\xB0\xFEN>\0\0\0\0@\x06\x87A\0\0\0\x000\xFD\x17B\0\0\0\0@\xD0QC\0\0\0\x000\xDF\xF7C\0\0\0\0\xC0aME\0\0\0\0\xB0\xFB\xE0E\0\0\0\0@\x94\x11G\0\0\0\x000\xA3\xB7G\0\0\0\0\xC0\xB0\xFAH\0\0\0\x000\x85\x97I\0\0\0\0\xC0\x92\xDAJ\0\0\0\0\xB0\xA1\x80K\0\0\0\0\xC0t\xBAL\0\0\0\0\xB0\x83`M\0\0\0\0\xC0V\x9AN\0\0\0\x000\xA0IO\0\0\0\0@s\x83P\0\0\0\0\xB0G Q\0\0\0\0@UcR\0\0\0\0\xB0)\0S\0\0\0\0@7CT\0\0\0\x000F\xE9T\0\0\0\0@\x19#V\0\0\0\x000(\xC9V\0\0\0\0@\xFB\x02X\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02l\xCB\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFFGMT\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\x012\x01\0I\x80\x9B\xFF\xFF\xFF\xFFP|M\x13\0\0\0\0\x90\xFA3\x14\0\0\0\0\x90\xEB#\x15\0\0\0\0\x90\xDC\x13\x16\0\0\0\0\x90\xCD\x03\x17\0\0\0\0\x90\xBE\xF3\x17\0\0\0\0\x90\xAF\xE3\x18\0\0\0\0\x90\xA0\xD3\x19\0\0\0\0\x90\x91\xC3\x1A\0\0\0\0\x10\xBD\xBC\x1B\0\0\0\0\x10\xAE\xAC\x1C\0\0\0\0\x10\x9F\x9C\x1D\0\0\0\0\x10\x90\x8C\x1E\0\0\0\0\x10\x81|\x1F\0\0\0\0\x10rl \0\0\0\0\x10c\\!\0\0\0\0\x10TL\"\0\0\0\0\x10E<#\0\0\0\0\x106,$\0\0\0\0\x10'\x1C%\0\0\0\0\x10\x18\x0C&\0\0\0\0\x90C\x05'\0\0\0\0\x904\xF5'\0\0\0\0\x90%\xE5(\0\0\0\0\x90\x16\xD5)\0\0\0\0\x90\x07\xC5*\0\0\0\0\x90\xF8\xB4+\0\0\0\0\x90\xE9\xA4,\0\0\0\0\x90\xDA\x94-\0\0\0\0\x90\xCB\x84.\0\0\0\0\x90\xBCt/\0\0\0\0\x90\xADd0\0\0\0\x000N\xE70\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x80\xEE\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0MST\0\0\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xE8\x02o\x03\xB4\x8E\x86}\xFF\xFF\xFF\xFF\xB0\xCB\xB8\x9E\xFF\xFF\xFF\xFF\xA0#\xBB\x9F\xFF\xFF\xFF\xFF\xB0\x0C\xD0\xA0\xFF\xFF\xFF\xFF\x80\xD2\xA2\xA1\xFF\xFF\xFF\xFF\xB0(\x89\xCB\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF 4a\xD2\xFF\xFF\xFF\xFF\x90v/\xF7\xFF\xFF\xFF\xFF\x10\xA2(\xF8\xFF\xFF\xFF\xFF\x90\xEC0\x07\0\0\0\0 ri\x13\0\0\0\0\x10UY\x14\0\0\0\0 TI\x15\0\0\0\0\x1079\x16\0\0\0\0 6)\x17\0\0\0\0\x90S\"\x18\0\0\0\0 \x18\t\x19\0\0\0\0\x905\x02\x1A\0\0\0\0\xA04\xF2\x1A\0\0\0\0\x90\x17\xE2\x1B\0\0\0\0\xA0\x16\xD2\x1C\0\0\0\0\x90\xF9\xC1\x1D\0\0\0\0\xA0\xF8\xB1\x1E\0\0\0\0\x90\xDB\xA1\x1F\0\0\0\0 +v \0\0\0\0\x90\xBD\x81!\0\0\0\0 \rV\"\0\0\0\0\x10\xDAj#\0\0\0\0 \xEF5$\0\0\0\0\x10\xBCJ%\0\0\0\0 \xD1\x15&\0\0\0\0\x10\x9E*'\0\0\0\0\xA0\xED\xFE'\0\0\0\0\x10\x80\n)\0\0\0\0\xA0\xCF\xDE)\0\0\0\0\x10b\xEA*\0\0\0\0\xA0\xB1\xBE+\0\0\0\0\x90~\xD3,\0\0\0\0\xA0\x93\x9E-\0\0\0\0\x90`\xB3.\0\0\0\0\xA0u~/\0\0\0\0\x90B\x930\0\0\0\0 \x92g1\0\0\0\0\x90$s2\0\0\0\0 tG3\0\0\0\0\x90\x06S4\0\0\0\0 V'5\0\0\0\0\x90\xE826\0\0\0\0 8\x077\0\0\0\0\x10\x05\x1C8\0\0\0\0 \x1A\xE78\0\0\0\0\x10\xE7\xFB9\0\0\0\0 \xFC\xC6:\0\0\0\0\x10\xC9\xDB;\0\0\0\0\xA0\x18\xB0<\0\0\0\0\x10\xAB\xBB=\0\0\0\0\xA0\xFA\x8F>\0\0\0\0\x10\x8D\x9B?\0\0\0\0\xA0\xDCo@\0\0\0\0\x90\xA9\x84A\0\0\0\0\xA0\xBEOB\0\0\0\0\x90\x8BdC\0\0\0\0\xA0\xA0/D\0\0\0\0\x90mDE\0\0\0\0 \xD3\xF3E\0\0\0\0\x10\x8A-G\0\0\0\0 \xB5\xD3G\0\0\0\0\x10l\rI\0\0\0\0 \x97\xB3I\0\0\0\0\x10N\xEDJ\0\0\0\0\xA0\xB3\x9CK\0\0\0\0\x90j\xD6L\0\0\0\0\xA0\x95|M\0\0\0\0\x90L\xB6N\0\0\0\0\xA0w\\O\0\0\0\0\x90.\x96P\0\0\0\0\xA0Y\0\0\0\0\0\x7F\x9B?\0\0\0\0\x90\xCEo@\0\0\0\0\x80\x9B\x84A\0\0\0\0\x90\xB0OB\0\0\0\0\x80}dC\0\0\0\0\x90\x92/D\0\0\0\0\x80_DE\0\0\0\0\x10\xC5\xF3E\0\0\0\0\0|-G\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x94\x9D\xFF\xFF\xFF\xFF\xFF\xFF\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFFEST\0\0\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\x01EDT\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0\x88\x02\xD9\x02[\"\xBD\x85\xFF\xFF\xFF\xFF\0\x94<\x99\xFF\xFF\xFF\xFFp\xF0\x88\xCB\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF\xE0\xFB`\xD2\xFF\xFF\xFF\xFF\xF0\xA85\xD7\xFF\xFF\xFF\xFF\xE0\xA1\0\xD8\xFF\xFF\xFF\xFF\x8C\x903\xFB\xFF\xFF\xFF\xFF\xE0;\xE8\xFB\xFF\xFF\xFF\xFF\xF0:\xD8\xFC\xFF\xFF\xFF\xFF\xE0\x1D\xC8\xFD\xFF\xFF\xFF\xFFp\xDF@\x06\0\0\0\0`\xC20\x07\0\0\0\0p\x19\x8D\x07\0\0\0\0`\xA4\x10\t\0\0\0\0p\xA3\0\n\0\0\0\0`\x86\xF0\n\0\0\0\0p\x85\xE0\x0B\0\0\0\0\xE0\xA2\xD9\x0C\0\0\0\0pg\xC0\r\0\0\0\0\xE0\x84\xB9\x0E\0\0\0\0\xF0\x83\xA9\x0F\0\0\0\0\xE0f\x99\x10\0\0\0\0\xF0e\x89\x11\0\0\0\0\xE0Hy\x12\0\0\0\0\xF0Gi\x13\0\0\0\0\xE0*Y\x14\0\0\0\0\xF0)I\x15\0\0\0\0\xE0\x0C9\x16\0\0\0\0\xF0\x0B)\x17\0\0\0\0`)\"\x18\0\0\0\0\xF0\xED\x08\x19\0\0\0\0`\x0B\x02\x1A\0\0\0\0p\n\xF2\x1A\0\0\0\0`\xED\xE1\x1B\0\0\0\0p\xEC\xD1\x1C\0\0\0\0`\xCF\xC1\x1D\0\0\0\0p\xCE\xB1\x1E\0\0\0\0`\xB1\xA1\x1F\0\0\0\0\xF0\0v \0\0\0\0`\x93\x81!\0\0\0\0\xF0\xE2U\"\0\0\0\0\xE0\xAFj#\0\0\0\0\xF0\xC45$\0\0\0\0\xE0\x91J%\0\0\0\0\xF0\xA6\x15&\0\0\0\0\xE0s*'\0\0\0\0p\xC3\xFE'\0\0\0\0\xE0U\n)\0\0\0\0p\xA5\xDE)\0\0\0\0\xE07\xEA*\0\0\0\0p\x87\xBE+\0\0\0\0`T\xD3,\0\0\0\0pi\x9E-\0\0\0\0`6\xB3.\0\0\0\0pK~/\0\0\0\0`\x18\x930\0\0\0\0\xF0gg1\0\0\0\0`\xFAr2\0\0\0\0\xF0IG3\0\0\0\0`\xDCR4\0\0\0\0\xF0+'5\0\0\0\0`\xBE26\0\0\0\0\xF0\r\x077\0\0\0\0\xE0\xDA\x1B8\0\0\0\0\xF0\xEF\xE68\0\0\0\0\xE0\xBC\xFB9\0\0\0\0\xF0\xD1\xC6:\0\0\0\0\xE0\x9E\xDB;\0\0\0\0p\xEE\xAF<\0\0\0\0\xE0\x80\xBB=\0\0\0\0p\xD0\x8F>\0\0\0\0\xE0b\x9B?\0\0\0\0p\xB2o@\0\0\0\0`\x7F\x84A\0\0\0\0p\x94OB\0\0\0\0`adC\0\0\0\0pv/D\0\0\0\0`CDE\0\0\0\0\xF0\xA8\xF3E\0\0\0\0\xE0_-G\0\0\0\0\x01\x02\x03\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02%\xB2\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFFMST\0\0\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFF\x01MDT\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0\xD0\x02*\x03\xE0\xCE\xDE\x88\xFF\xFF\xFF\xFF\x90\xAF\xB8\x9E\xFF\xFF\xFF\xFF\x80\x07\xBB\x9F\xFF\xFF\xFF\xFF\x90\x91\x98\xA0\xFF\xFF\xFF\xFF\x80\x85\xD2\xA0\xFF\xFF\xFF\xFF\x90\xE8\x8A\xA2\xFF\xFF\xFF\xFF\0\x06\x84\xA3\xFF\xFF\xFF\xFF\x90\xCAj\xA4\xFF\xFF\xFF\xFF\x80\xC35\xA5\xFF\xFF\xFF\xFF\x10\xE7S\xA6\xFF\xFF\xFF\xFF\x80\xA5\x15\xA7\xFF\xFF\xFF\xFF\x10\xC93\xA8\xFF\xFF\xFF\xFF\0\xC2\xFE\xA8\xFF\xFF\xFF\xFF\x90\x0C\x89\xCB\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF\0\x18a\xD2\xFF\xFF\xFF\xFF\x10\xE3U\xD5\xFF\xFF\xFF\xFF\0\xDC \xD6\xFF\xFF\xFF\xFF\x90\x19a\x04\0\0\0\0\x80\xFCP\x05\0\0\0\0\x90\xFB@\x06\0\0\0\0\x80\xDE0\x07\0\0\0\0\x90\xDD \x08\0\0\0\0\x80\xC0\x10\t\0\0\0\0\x90\xBF\0\n\0\0\0\0\x80\xA2\xF0\n\0\0\0\0\x90\xA1\xE0\x0B\0\0\0\0\0\xBF\xD9\x0C\0\0\0\0\x90\x83\xC0\r\0\0\0\0\0\xA1\xB9\x0E\0\0\0\0\x10\xA0\xA9\x0F\0\0\0\0\0\x83\x99\x10\0\0\0\0\x10\x82\x89\x11\0\0\0\0\0ey\x12\0\0\0\0\x10di\x13\0\0\0\0\0GY\x14\0\0\0\0\x10FI\x15\0\0\0\0\0)9\x16\0\0\0\0\x10()\x17\0\0\0\0\x80E\"\x18\0\0\0\0\x10\n\t\x19\0\0\0\0\x80'\x02\x1A\0\0\0\0\x90&\xF2\x1A\0\0\0\0\x80\t\xE2\x1B\0\0\0\0\x90\x08\xD2\x1C\0\0\0\0\x80\xEB\xC1\x1D\0\0\0\0\x90\xEA\xB1\x1E\0\0\0\0\x80\xCD\xA1\x1F\0\0\0\0\xF0\x13\xFA\x1F\0\0\0\0\x80\xAF\x81!\0\0\0\0\x10\xFFU\"\0\0\0\0\0\xCCj#\0\0\0\0\x10\xE15$\0\0\0\0\0\xAEJ%\0\0\0\0\x10\xC3\x15&\0\0\0\0\0\x90*'\0\0\0\0\x90\xDF\xFE'\0\0\0\0\0r\n)\0\0\0\0\x90\xC1\xDE)\0\0\0\0\0T\xEA*\0\0\0\0\x90\xA3\xBE+\0\0\0\0\x80p\xD3,\0\0\0\0\x90\x85\x9E-\0\0\0\0\x80R\xB3.\0\0\0\0\x90g~/\0\0\0\0\x804\x930\0\0\0\0\x10\x84g1\0\0\0\0\x80\x16s2\0\0\0\0\x10fG3\0\0\0\0\x80\xF8R4\0\0\0\0\x10H'5\0\0\0\0\x80\xDA26\0\0\0\0\x10*\x077\0\0\0\0\0\xF7\x1B8\0\0\0\0\x10\x0C\xE78\0\0\0\0\0\xD9\xFB9\0\0\0\0\x10\xEE\xC6:\0\0\0\0\0\xBB\xDB;\0\0\0\0\x90\n\xB0<\0\0\0\0\0\x9D\xBB=\0\0\0\0\x90\xEC\x8F>\0\0\0\0\0\x7F\x9B?\0\0\0\0\x90\xCEo@\0\0\0\0\x80\x9B\x84A\0\0\0\0\x90\xB0OB\0\0\0\0\x80}dC\0\0\0\0\x90\x92/D\0\0\0\0\x80_DE\0\0\0\0\x10\xC5\xF3E\0\0\0\0\0|-G\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xA0\x95\xFF\xFF\xFF\xFF\xFF\xFF\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF-05\0\0\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\x01*\x01\x80\x88\xAA\x96\xFF\xFF\xFF\xFF\0f\x0F\xB8\xFF\xFF\xFF\xFF\xC0\\\xFD\xB8\xFF\xFF\xFF\xFFPP\xF1\xB9\xFF\xFF\xFF\xFF@\x90\xDE\xBA\xFF\xFF\xFF\xFFP\xCA8\xDA\xFF\xFF\xFF\xFFP\x16\xEC\xDA\xFF\xFF\xFF\xFF\xD0\xFD\x19\xDC\xFF\xFF\xFF\xFF@u\xB9\xDC\xFF\xFF\xFF\xFFP1\xFB\xDD\xFF\xFF\xFF\xFF@\xFA\x9B\xDE\xFF\xFF\xFF\xFFP\xB6\xDD\xDF\xFF\xFF\xFF\xFF@OT\xE0\xFF\xFF\xFF\xFF\xD0\x1B\x98\xF4\xFF\xFF\xFF\xFF@z\x05\xF5\xFF\xFF\xFF\xFFP\x80\xC0\xF6\xFF\xFF\xFF\xFF\xC0:\x0E\xF7\xFF\xFF\xFF\xFFPHQ\xF8\xFF\xFF\xFF\xFF@\xE1\xC7\xF8\xFF\xFF\xFF\xFF\xD0\xEE\n\xFA\xFF\xFF\xFF\xFF\xC0\x14\xA9\xFA\xFF\xFF\xFF\xFFP\"\xEC\xFB\xFF\xFF\xFF\xFF\xC0\x99\x8B\xFC\xFF\xFF\xFF\xFFP\xAA\xC9\x1D\0\0\0\0\xC0\xF3x\x1E\0\0\0\0\xD0Q\xA0\x1F\0\0\0\0\xC0\xEB3 \0\0\0\0P\x85\x81!\0\0\0\0\xC0\xE4\x0B\"\0\0\0\0P\xD1\xC0,\0\0\0\0@\xE0f-\0\0\0\0P\x7F`H\0\0\0\0\xC0\x04\x7FR\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x01\x80\xBE\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFFCST\0\0\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x18\0\x1B\0 \xA6\xD5\xA3\xFF\xFF\xFF\xFF\xE0\xDC\x9A \0\0\0\0P\x9B\\!\0\0\0\0\x01\x02\x01`\xAC\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFFMST\0\0\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0x\x04\x08\x05\x87v=^\xFF\xFF\xFF\xFF\xA0\xBD\xB8\x9E\xFF\xFF\xFF\xFF\x90\x15\xBB\x9F\xFF\xFF\xFF\xFF\xA0\x1A\x89\xCB\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF\x10&a\xD2\xFF\xFF\xFF\xFF \xF1U\xD5\xFF\xFF\xFF\xFF\x10\xEA \xD6\xFF\xFF\xFF\xFF \xD35\xD7\xFF\xFF\xFF\xFF\x10\xCC\0\xD8\xFF\xFF\xFF\xFF \xB5\x15\xD9\xFF\xFF\xFF\xFF\x10\xAE\xE0\xD9\xFF\xFF\xFF\xFF\xA0\xD1\xFE\xDA\xFF\xFF\xFF\xFF\x10\x90\xC0\xDB\xFF\xFF\xFF\xFF\xA0\xB3\xDE\xDC\xFF\xFF\xFF\xFF\x90\xAC\xA9\xDD\xFF\xFF\xFF\xFF\xA0\x95\xBE\xDE\xFF\xFF\xFF\xFF\x90\x8E\x89\xDF\xFF\xFF\xFF\xFF\xA0w\x9E\xE0\xFF\xFF\xFF\xFF\x90pi\xE1\xFF\xFF\xFF\xFF\xA0Y~\xE2\xFF\xFF\xFF\xFF\x90RI\xE3\xFF\xFF\xFF\xFF\xA0;^\xE4\xFF\xFF\xFF\xFF\x904)\xE5\xFF\xFF\xFF\xFF XG\xE6\xFF\xFF\xFF\xFF\x10Q\x12\xE7\xFF\xFF\xFF\xFF :'\xE8\xFF\xFF\xFF\xFF\x103\xF2\xE8\xFF\xFF\xFF\xFF \x1C\x07\xEA\xFF\xFF\xFF\xFF\x10\x15\xD2\xEA\xFF\xFF\xFF\xFF \xFE\xE6\xEB\xFF\xFF\xFF\xFF\x10\xF7\xB1\xEC\xFF\xFF\xFF\xFF \xE0\xC6\xED\xFF\xFF\xFF\xFF\x10\xD9\x91\xEE\xFF\xFF\xFF\xFF\xA0\xFC\xAF\xEF\xFF\xFF\xFF\xFF\x10\xBBq\xF0\xFF\xFF\xFF\xFF\xA0\xDE\x8F\xF1\xFF\xFF\xFF\xFF\x90\xC1\x7F\xF2\xFF\xFF\xFF\xFF\xA0\xC0o\xF3\xFF\xFF\xFF\xFF\x90\xA3_\xF4\xFF\xFF\xFF\xFF\xA0\xA2O\xF5\xFF\xFF\xFF\xFF\x90\x85?\xF6\xFF\xFF\xFF\xFF\xA0\x84/\xF7\xFF\xFF\xFF\xFF\x10\xA2(\xF8\xFF\xFF\xFF\xFF\xA0f\x0F\xF9\xFF\xFF\xFF\xFF\x10\x84\x08\xFA\xFF\xFF\xFF\xFF \x83\xF8\xFA\xFF\xFF\xFF\xFF\x10f\xE8\xFB\xFF\xFF\xFF\xFF e\xD8\xFC\xFF\xFF\xFF\xFF\x10H\xC8\xFD\xFF\xFF\xFF\xFF G\xB8\xFE\xFF\xFF\xFF\xFF\x10*\xA8\xFF\xFF\xFF\xFF\xFF )\x98\0\0\0\0\0\x10\x0C\x88\x01\0\0\0\0 \x0Bx\x02\0\0\0\0\x90(q\x03\0\0\0\0\xA0'a\x04\0\0\0\0\x90\nQ\x05\0\0\0\0\xA0\tA\x06\0\0\0\0\x90\xEC0\x07\0\0\0\0\xA0\xEB \x08\0\0\0\0\x90\xCE\x10\t\0\0\0\0\xA0\xCD\0\n\0\0\0\0\x90\xB0\xF0\n\0\0\0\0\xA0\xAF\xE0\x0B\0\0\0\0\x10\xCD\xD9\x0C\0\0\0\0\xA0\x91\xC0\r\0\0\0\0\x10\xAF\xB9\x0E\0\0\0\0 \xAE\xA9\x0F\0\0\0\0\x10\x91\x99\x10\0\0\0\0 \x90\x89\x11\0\0\0\0\x10sy\x12\0\0\0\0 ri\x13\0\0\0\0\x10UY\x14\0\0\0\0 TI\x15\0\0\0\0\x1079\x16\0\0\0\0 6)\x17\0\0\0\0\x90S\"\x18\0\0\0\0 \x18\t\x19\0\0\0\0\x905\x02\x1A\0\0\0\0\xA04\xF2\x1A\0\0\0\0\x90\x17\xE2\x1B\0\0\0\0\xA0\x16\xD2\x1C\0\0\0\0\x90\xF9\xC1\x1D\0\0\0\0\xA0\xF8\xB1\x1E\0\0\0\0\x90\xDB\xA1\x1F\0\0\0\0\0\"\xFA\x1F\0\0\0\0\x90\xBD\x81!\0\0\0\0 \rV\"\0\0\0\0\x10\xDAj#\0\0\0\0 \xEF5$\0\0\0\0\x10\xBCJ%\0\0\0\0 \xD1\x15&\0\0\0\0\x10\x9E*'\0\0\0\0\xA0\xED\xFE'\0\0\0\0\x10\x80\n)\0\0\0\0\xA0\xCF\xDE)\0\0\0\0\x10b\xEA*\0\0\0\0\xA0\xB1\xBE+\0\0\0\0\x90~\xD3,\0\0\0\0\xA0\x93\x9E-\0\0\0\0\x90`\xB3.\0\0\0\0\xA0u~/\0\0\0\0\x90B\x930\0\0\0\0 \x92g1\0\0\0\0\x90$s2\0\0\0\0 tG3\0\0\0\0\x90\x06S4\0\0\0\0 V'5\0\0\0\0\x90\xE826\0\0\0\0 8\x077\0\0\0\0\x10\x05\x1C8\0\0\0\0 \x1A\xE78\0\0\0\0\x10\xE7\xFB9\0\0\0\0 \xFC\xC6:\0\0\0\0\x10\xC9\xDB;\0\0\0\0\xA0\x18\xB0<\0\0\0\0\x10\xAB\xBB=\0\0\0\0\xA0\xFA\x8F>\0\0\0\0\x10\x8D\x9B?\0\0\0\0\xA0\xDCo@\0\0\0\0\x90\xA9\x84A\0\0\0\0\xA0\xBEOB\0\0\0\0\x90\x8BdC\0\0\0\0\xA0\xA0/D\0\0\0\0\x90mDE\0\0\0\0 \xD3\xF3E\0\0\0\0\x10\x8A-G\0\0\0\0 \xB5\xD3G\0\0\0\0\x10l\rI\0\0\0\0 \x97\xB3I\0\0\0\0\x10N\xEDJ\0\0\0\0\xA0\xB3\x9CK\0\0\0\0\x90j\xD6L\0\0\0\0\xA0\x95|M\0\0\0\0\x90L\xB6N\0\0\0\0\xA0w\\O\0\0\0\0\x90.\x96P\0\0\0\0\xA0Y\0\0\0\0\xD0T\x9B?\0\0\0\0`\xA4o@\0\0\0\0Pq\x84A\0\0\0\0`\x86OB\0\0\0\0PSdC\0\0\0\0`h/D\0\0\0\0P5DE\0\0\0\0\xE0\x9A\xF3E\0\0\0\0\xD0Q-G\0\0\0\0\x01\x02\x01\x02\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xCC\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFFAST\0\0\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\x01ADT\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0\xB8\x04O\x05$<=^\xFF\xFF\xFF\xFF\x8C~\xB8\x9E\xFF\xFF\xFF\xFF|\xD6\xBA\x9F\xFF\xFF\xFF\xFFlM\x9E\xBE\xFF\xFF\xFF\xFF81\xB8\xC0\xFF\xFF\xFF\xFF\xA8\xEFy\xC1\xFF\xFF\xFF\xFF8\x13\x98\xC2\xFF\xFF\xFF\xFF\xA8\xD1Y\xC3\xFF\xFF\xFF\xFF8\xF5w\xC4\xFF\xFF\xFF\xFF\xA8\xB39\xC5\xFF\xFF\xFF\xFF\xB8\x11a\xC6\xFF\xFF\xFF\xFF\xA8\x95\x19\xC7\xFF\xFF\xFF\xFF\xB8\xF3@\xC8\xFF\xFF\xFF\xFF(\xB2\x02\xC9\xFF\xFF\xFF\xFF\xB8\xD5 \xCA\xFF\xFF\xFF\xFF(\x94\xE2\xCA\xFF\xFF\xFF\xFF\xB8\xB7\0\xCC\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF\xC8\xE6`\xD2\xFF\xFF\xFF\xFF\xD8D\x88\xD3\xFF\xFF\xFF\xFFH\x03J\xD4\xFF\xFF\xFF\xFF\xD8&h\xD5\xFF\xFF\xFF\xFFH\xE5)\xD6\xFF\xFF\xFF\xFF\xD8\x08H\xD7\xFF\xFF\xFF\xFFH\xC7\t\xD8\xFF\xFF\xFF\xFF\xD8\xEA'\xD9\xFF\xFF\xFF\xFFH\xA9\xE9\xD9\xFF\xFF\xFF\xFFX\x07\x11\xDB\xFF\xFF\xFF\xFF\xC8\xC5\xD2\xDB\xFF\xFF\xFF\xFFXt\xDE\xDC\xFF\xFF\xFF\xFFHm\xA9\xDD\xFF\xFF\xFF\xFFXV\xBE\xDE\xFF\xFF\xFF\xFFHO\x89\xDF\xFF\xFF\xFF\xFFX8\x9E\xE0\xFF\xFF\xFF\xFFH1i\xE1\xFF\xFF\xFF\xFFX\x1A~\xE2\xFF\xFF\xFF\xFFH\x13I\xE3\xFF\xFF\xFF\xFFX\xFC]\xE4\xFF\xFF\xFF\xFFH\xF5(\xE5\xFF\xFF\xFF\xFF\xD8\x18G\xE6\xFF\xFF\xFF\xFF\xC8\x11\x12\xE7\xFF\xFF\xFF\xFF\xD8\xFA&\xE8\xFF\xFF\xFF\xFF\xC8\xF3\xF1\xE8\xFF\xFF\xFF\xFF\xD8\xDC\x06\xEA\xFF\xFF\xFF\xFF\xC8\xD5\xD1\xEA\xFF\xFF\xFF\xFF\xD8\xBE\xE6\xEB\xFF\xFF\xFF\xFF\xC8\xB7\xB1\xEC\xFF\xFF\xFF\xFF\xD8\xA0\xC6\xED\xFF\xFF\xFF\xFFH\xBE\xBF\xEE\xFF\xFF\xFF\xFFX\xBD\xAF\xEF\xFF\xFF\xFF\xFFH\xA0\x9F\xF0\xFF\xFF\xFF\xFFX\x9F\x8F\xF1\xFF\xFF\xFF\xFFH\x82\x7F\xF2\xFF\xFF\xFF\xFFX\x81o\xF3\xFF\xFF\xFF\xFFHd_\xF4\xFF\xFF\xFF\xFFXcO\xF5\xFF\xFF\xFF\xFFHF?\xF6\xFF\xFF\xFF\xFFXE/\xF7\xFF\xFF\xFF\xFF\xC8b(\xF8\xFF\xFF\xFF\xFFXk\xDA\xF8\xFF\xFF\xFF\xFF`.\x0F\xF9\xFF\xFF\xFF\xFF\xD0K\x08\xFA\xFF\xFF\xFF\xFF\xE0J\xF8\xFA\xFF\xFF\xFF\xFF\xD0-\xE8\xFB\xFF\xFF\xFF\xFF\xE0,\xD8\xFC\xFF\xFF\xFF\xFF\xD0\x0F\xC8\xFD\xFF\xFF\xFF\xFF\xE0\x0E\xB8\xFE\xFF\xFF\xFF\xFF\xD0\xF1\xA7\xFF\xFF\xFF\xFF\xFF\xE0\xF0\x97\0\0\0\0\0\xD0\xD3\x87\x01\0\0\0\0\xE0\xD2w\x02\0\0\0\0P\xF0p\x03\0\0\0\0`\xEF`\x04\0\0\0\0P\xD2P\x05\0\0\0\0`\xD1@\x06\0\0\0\0P\xB40\x07\0\0\0\0`\xB3 \x08\0\0\0\0P\x96\x10\t\0\0\0\0`\x95\0\n\0\0\0\0Px\xF0\n\0\0\0\0`w\xE0\x0B\0\0\0\0\xD0\x94\xD9\x0C\0\0\0\0`Y\xC0\r\0\0\0\0\xD0v\xB9\x0E\0\0\0\0\xE0u\xA9\x0F\0\0\0\0\xD0X\x99\x10\0\0\0\0\xE0W\x89\x11\0\0\0\0\xD0:y\x12\0\0\0\0\xE09i\x13\0\0\0\0\xD0\x1CY\x14\0\0\0\0\xE0\x1BI\x15\0\0\0\0\xD0\xFE8\x16\0\0\0\0\xE0\xFD(\x17\0\0\0\0P\x1B\"\x18\0\0\0\0\xE0\xDF\x08\x19\0\0\0\0P\xFD\x01\x1A\0\0\0\0`\xFC\xF1\x1A\0\0\0\0P\xDF\xE1\x1B\0\0\0\0`\xDE\xD1\x1C\0\0\0\0P\xC1\xC1\x1D\0\0\0\0`\xC0\xB1\x1E\0\0\0\0P\xA3\xA1\x1F\0\0\0\0\xFC\xD6u \0\0\0\0li\x81!\0\0\0\0\xFC\xB8U\"\0\0\0\0\xDCwj#\0\0\0\0\xFC\x9A5$\0\0\0\0\xECgJ%\0\0\0\0\xFC|\x15&\0\0\0\0\xECI*'\0\0\0\0|\x99\xFE'\0\0\0\0\xEC+\n)\0\0\0\0|{\xDE)\0\0\0\0\xEC\r\xEA*\0\0\0\0|]\xBE+\0\0\0\0l*\xD3,\0\0\0\0|?\x9E-\0\0\0\0l\x0C\xB3.\0\0\0\0|!~/\0\0\0\0l\xEE\x920\0\0\0\0\xFC=g1\0\0\0\0l\xD0r2\0\0\0\0\xFC\x1FG3\0\0\0\0l\xB2R4\0\0\0\0\xFC\x01'5\0\0\0\0l\x9426\0\0\0\0\xFC\xE3\x067\0\0\0\0\xEC\xB0\x1B8\0\0\0\0\xFC\xC5\xE68\0\0\0\0\xEC\x92\xFB9\0\0\0\0\xFC\xA7\xC6:\0\0\0\0\xECt\xDB;\0\0\0\0|\xC4\xAF<\0\0\0\0\xECV\xBB=\0\0\0\0|\xA6\x8F>\0\0\0\0\xEC8\x9B?\0\0\0\0|\x88o@\0\0\0\0lU\x84A\0\0\0\0|jOB\0\0\0\0l7dC\0\0\0\0|L/D\0\0\0\0l\x19DE\0\0\0\0\xFC~\xF3E\0\0\0\0\xEC5-G\0\0\0\0\xFC`\xD3G\0\0\0\0\xEC\x17\rI\0\0\0\0\xFCB\xB3I\0\0\0\0\xEC\xF9\xECJ\0\0\0\0|_\x9CK\0\0\0\0l\x16\xD6L\0\0\0\0|A|M\0\0\0\0\x01\x02\x01\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x07\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\\\xC7\xFF\xFF\xFF\xFF\xFF\xFF\x94\xCE\xFF\xFF\xFF\xFF\xFF\xFF\xA4\xDC\xFF\xFF\xFF\xFF\xFF\xFF\xC8\xCE\xFF\xFF\xFF\xFF\xFF\xFF\xD8\xDC\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFFEST\0\0\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\x01EDT\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0`\x02\xAE\x020\x1E\x87i\xFF\xFF\xFF\xFF\xFE\xB4\x0F\x93\xFF\xFF\xFF\xFF\xF0e\x89\x11\0\0\0\0\xE0Hy\x12\0\0\0\0\xF0Gi\x13\0\0\0\0\xE0*Y\x14\0\0\0\0\xF0)I\x15\0\0\0\0\xE0\x0C9\x16\0\0\0\0\xF0\x0B)\x17\0\0\0\0`)\"\x18\0\0\0\0\xF0\xED\x08\x19\0\0\0\0`\x0B\x02\x1A\0\0\0\0p\n\xF2\x1A\0\0\0\0`\xED\xE1\x1B\0\0\0\0p\xEC\xD1\x1C\0\0\0\0`\xCF\xC1\x1D\0\0\0\0p\xCE\xB1\x1E\0\0\0\0`\xB1\xA1\x1F\0\0\0\0\xF0\0v \0\0\0\0`\x93\x81!\0\0\0\0\xF0\xE2U\"\0\0\0\0\xE0\xAFj#\0\0\0\0\xF0\xC45$\0\0\0\0\xE0\x91J%\0\0\0\0\xF0\xA6\x15&\0\0\0\0\xE0s*'\0\0\0\0p\xC3\xFE'\0\0\0\0\xE0U\n)\0\0\0\0p\xA5\xDE)\0\0\0\0\xE07\xEA*\0\0\0\0p\x87\xBE+\0\0\0\0`T\xD3,\0\0\0\0pi\x9E-\0\0\0\0`6\xB3.\0\0\0\0pK~/\0\0\0\0`\x18\x930\0\0\0\0\xF0gg1\0\0\0\0`\xFAr2\0\0\0\0\xF0IG3\0\0\0\0`\xDCR4\0\0\0\0\xF0+'5\0\0\0\0`\xBE26\0\0\0\0\xF0\r\x077\0\0\0\0\xE0\xDA\x1B8\0\0\0\0\xF0\xEF\xE68\0\0\0\0\xE0\xBC\xFB9\0\0\0\0\xF0\xD1\xC6:\0\0\0\0\xE0\x9E\xDB;\0\0\0\0p\xEE\xAF<\0\0\0\0\xE0\x80\xBB=\0\0\0\0p\xD0\x8F>\0\0\0\0\xE0b\x9B?\0\0\0\0p\xB2o@\0\0\0\0`\x7F\x84A\0\0\0\0p\x94OB\0\0\0\0`adC\0\0\0\0pv/D\0\0\0\0`CDE\0\0\0\0\xF0\xA8\xF3E\0\0\0\0\xE0_-G\0\0\0\0\xF0\x8A\xD3G\0\0\0\0\xE0A\rI\0\0\0\0\xF0l\xB3I\0\0\0\0\xE0#\xEDJ\0\0\0\0p\x89\x9CK\0\0\0\0`@\xD6L\0\0\0\0pk|M\0\0\0\0`\"\xB6N\0\0\0\0pM\\O\0\0\0\0`\x04\x96P\0\0\0\0p/\0\0\0\0\xD0T\x9B?\0\0\0\0`\xA4o@\0\0\0\0Pq\x84A\0\0\0\0`\x86OB\0\0\0\0PSdC\0\0\0\0`h/D\0\0\0\0P5DE\0\0\0\0\xE0\x9A\xF3E\0\0\0\0\xD0Q-G\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01`\xC4\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFFCST\0\0\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\x01CDT\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0\0\0\0\0\0\0\0\0`\x03\xCC\x03\xB8(\x87i\xFF\xFF\xFF\xFF\x80\xC2b\xAC\xFF\xFF\xFF\xFFP\x94\xD3\xB1\xFF\xFF\xFF\xFF@]t\xB2\xFF\xFF\xFF\xFF\xD0f[\xC8\xFF\xFF\xFF\xFF@Q\xD3\xC8\xFF\xFF\xFF\xFF\xD0H;\xCA\xFF\xFF\xFF\xFF\xC0m\xBC\xCA\xFF\xFF\xFF\xFFPe$\xCC\xFF\xFF\xFF\xFF\xC0O\x9C\xCC\xFF\xFF\xFF\xFFP\x0B\xC4\xD1\xFF\xFF\xFF\xFF\xC0\xF5;\xD2\xFF\xFF\xFF\xFFP\xED\xA3\xD3\xFF\xFF\xFF\xFF\xC0\xD7\x1B\xD4\xFF\xFF\xFF\xFF\xD0\x05`\xF7\xFF\xFF\xFF\xFF@}\xFF\xF7\xFF\xFF\xFF\xFF\xD0D=\xF9\xFF\xFF\xFF\xFF\xC0S\xE3\xF9\xFF\xFF\xFF\xFF\xD0;\xDB\xFA\xFF\xFF\xFF\xFF@\x86\xA7\xFB\xFF\xFF\xFF\xFF\xD0\xA9\xC5\xFC\xFF\xFF\xFF\xFF@h\x87\xFD\xFF\xFF\xFF\xFF\xD0\0\xB8\xFE\xFF\xFF\xFF\xFF\xC0\xE3\xA7\xFF\xFF\xFF\xFF\xFF\xD0\xE2\x97\0\0\0\0\0\xC0\xC5\x87\x01\0\0\0\0\xD0\xC4w\x02\0\0\0\0@\xE2p\x03\0\0\0\0P\xE1`\x04\0\0\0\0\xC0\x145\x05\0\0\0\0P\xC3@\x06\0\0\0\0@H\x16\x07\0\0\0\0P\xA5 \x08\0\0\0\0\xC0{\xF7\x08\0\0\0\0P\x87\0\n\0\0\0\0@j\xF0\n\0\0\0\0Pi\xE0\x0B\0\0\0\0\xC0\x86\xD9\x0C\0\0\0\0PK\xC0\r\0\0\0\0\xC0h\xB9\x0E\0\0\0\0P\xA2\xB2\x0F\0\0\0\0@\x9B}\x10\0\0\0\0\xD0\xEAQ\x11\0\0\0\0\xC0\xB7f\x12\0\0\0\0\xD0\xCC1\x13\0\0\0\0\xC0\x99F\x14\0\0\0\0\xD0\x82[\x15\0\0\0\0\xC0{&\x16\0\0\0\0\xD0d;\x17\0\0\0\0\xC0]\x06\x18\0\0\0\0\xD0F\x1B\x19\0\0\0\0\xC0?\xE6\x19\0\0\0\0\xD0(\xFB\x1A\0\0\0\0@\\\xCF\x1B\0\0\0\0\xD0\n\xDB\x1C\0\0\0\0@>\xAF\x1D\0\0\0\0PSz\x1E\0\0\0\0@ \x8F\x1F\0\0\0\0P5Z \0\0\0\0@\x02o!\0\0\0\0\xD0QC\"\0\0\0\0@\xE4N#\0\0\0\0\xD03#$\0\0\0\0@\xC6.%\0\0\0\0\xD0\x8A\x15&\0\0\0\0\xC0\xE2\x17'\0\0\0\0P\xA7\xFE'\0\0\0\0\xD0\xD2\xF7(\0\0\0\0P\x89\xDE)\0\0\0\0\xD0\xB4\xD7*\0\0\0\0Pk\xBE+\0\0\0\0\xD0\x96\xB7,\0\0\0\0PM\x9E-\0\0\0\0\xD0x\x97.\0\0\0\0P/~/\0\0\0\0\xD0Zw0\0\0\0\0\xD0Kg1\0\0\0\0\xD0\0\0\0\0\xD0T\x9B?\0\0\0\0\xD0[f@\0\0\0\0P5DE\0\0\0\0\xD0\x8C\xF3E\0\0\0\0P\x17$G\0\0\0\0P\xA9\xDCG\0\0\0\0P\xF9\x03I\0\0\0\0\xD0P\xB3I\0\0\0\0P\xDB\xE3J\0\0\0\0Pm\x9CK\0\0\0\0\xD0\xF7\xCCL\0\0\0\0\xD0\x89\x85M\0\0\0\0\xD0N\xBFN\0\0\0\0\xD0\xE0wO\0\0\0\0P\xF6\x95P\0\0\0\0P\x13\0\0\0\0\0\x7F\x9B?\0\0\0\0\x90\xCEo@\0\0\0\0\x80\x9B\x84A\0\0\0\0\x90\xB0OB\0\0\0\0\x80}dC\0\0\0\0\x90\x92/D\0\0\0\0\x80_DE\0\0\0\0\x10\xC5\xF3E\0\0\0\0\0|-G\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\0\0\0\0\0\0\0\0\x80\x8F\xFF\xFF\xFF\xFF\xFF\xFF\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFFEST\0\0\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\x01EDT\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0`\x02\xB6\x02\x80\xA1l\xCC\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF\xE0\xFB`\xD2\xFF\xFF\xFF\xFFp\xFD`\x04\0\0\0\0`\xE0P\x05\0\0\0\0p\xDF@\x06\0\0\0\0`\xC20\x07\0\0\0\0p\xC1 \x08\0\0\0\0`\xA4\x10\t\0\0\0\0p\xA3\0\n\0\0\0\0`\x86\xF0\n\0\0\0\0p\x85\xE0\x0B\0\0\0\0\xE0\xA2\xD9\x0C\0\0\0\0pg\xC0\r\0\0\0\0\xE0\x84\xB9\x0E\0\0\0\0\xF0\x83\xA9\x0F\0\0\0\0\xE0f\x99\x10\0\0\0\0\xF0e\x89\x11\0\0\0\0\xE0Hy\x12\0\0\0\0\xF0Gi\x13\0\0\0\0\xE0*Y\x14\0\0\0\0\xF0)I\x15\0\0\0\0\xE0\x0C9\x16\0\0\0\0\xF0\x0B)\x17\0\0\0\0`)\"\x18\0\0\0\0\xF0\xED\x08\x19\0\0\0\0`\x0B\x02\x1A\0\0\0\0p\n\xF2\x1A\0\0\0\0`\xED\xE1\x1B\0\0\0\0p\xEC\xD1\x1C\0\0\0\0`\xCF\xC1\x1D\0\0\0\0p\xCE\xB1\x1E\0\0\0\0`\xB1\xA1\x1F\0\0\0\0\xF0\0v \0\0\0\0`\x93\x81!\0\0\0\0\xF0\xE2U\"\0\0\0\0\xE0\xAFj#\0\0\0\0\xF0\xC45$\0\0\0\0\xE0\x91J%\0\0\0\0\xF0\xA6\x15&\0\0\0\0\xE0s*'\0\0\0\0p\xC3\xFE'\0\0\0\0\xE0U\n)\0\0\0\0p\xA5\xDE)\0\0\0\0\xE07\xEA*\0\0\0\0p\x87\xBE+\0\0\0\0`T\xD3,\0\0\0\0pi\x9E-\0\0\0\0`6\xB3.\0\0\0\0pK~/\0\0\0\0`\x18\x930\0\0\0\0\xF0gg1\0\0\0\0`\xFAr2\0\0\0\0\xF0IG3\0\0\0\0`\xDCR4\0\0\0\0\xF0+'5\0\0\0\0`\xBE26\0\0\0\0\xF0\r\x077\0\0\0\0\xE0\xDA\x1B8\0\0\0\0\xF0\xE8\x1B8\0\0\0\0\0\xFE\xE68\0\0\0\0\xF0\xCA\xFB9\0\0\0\0\xF0\xD1\xC6:\0\0\0\0\xE0\x9E\xDB;\0\0\0\0p\xEE\xAF<\0\0\0\0\xE0\x80\xBB=\0\0\0\0p\xD0\x8F>\0\0\0\0\xE0b\x9B?\0\0\0\0p\xB2o@\0\0\0\0`\x7F\x84A\0\0\0\0p\x94OB\0\0\0\0`adC\0\0\0\0pv/D\0\0\0\0`CDE\0\0\0\0\xF0\xA8\xF3E\0\0\0\0\xE0_-G\0\0\0\0\x01\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x04\x02\x03\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\0\0\0\0\0\0\0\0\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFFEST\0\0\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xB0\0\xC6\0~#\x87i\xFF\xFF\xFF\xFF\xFE\xB4\x0F\x93\xFF\xFF\xFF\xFFp\x19\x8D\x07\0\0\0\0`\xA4\x10\t\0\0\0\0\xF0\x94\xAD\t\0\0\0\0`\x86\xF0\n\0\0\0\0p\x85\xE0\x0B\0\0\0\0\xE0\xA2\xD9\x0C\0\0\0\0pg\xC0\r\0\0\0\0\xE0\x84\xB9\x0E\0\0\0\0\xF0\x83\xA9\x0F\0\0\0\0\xE0f\x99\x10\0\0\0\0\xF0e\x89\x11\0\0\0\0\xE0Hy\x12\0\0\0\0\xF0Gi\x13\0\0\0\0\xE0*Y\x14\0\0\0\0\xF0)I\x15\0\0\0\0\xE0\x0C9\x16\0\0\0\0\xF0\x0B)\x17\0\0\0\0`)\"\x18\0\0\0\0\xF0\xED\x08\x19\0\0\0\0`\x0B\x02\x1A\0\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\xB8\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFFAKST\0p\x81\xFF\xFF\xFF\xFF\xFF\xFF\x01AKDT\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0\xB0\x02#\x03\xD1\xFD\xC2?\xFF\xFF\xFF\xFF\xC52\x87}\xFF\xFF\xFF\xFF\xA0\x1A\x89\xCB\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF\x10&a\xD2\xFF\xFF\xFF\xFF G\xB8\xFE\xFF\xFF\xFF\xFF\x10*\xA8\xFF\xFF\xFF\xFF\xFF )\x98\0\0\0\0\0\x10\x0C\x88\x01\0\0\0\0 \x0Bx\x02\0\0\0\0\x90(q\x03\0\0\0\0\xA0'a\x04\0\0\0\0\x90\nQ\x05\0\0\0\0\xA0\tA\x06\0\0\0\0\x90\xEC0\x07\0\0\0\0\xA0C\x8D\x07\0\0\0\0\x90\xCE\x10\t\0\0\0\0 \xBF\xAD\t\0\0\0\0\x90\xB0\xF0\n\0\0\0\0\xA0\xAF\xE0\x0B\0\0\0\0\x10\xCD\xD9\x0C\0\0\0\0\xA0\x91\xC0\r\0\0\0\0\x10\xAF\xB9\x0E\0\0\0\0 \xAE\xA9\x0F\0\0\0\0\x10\x91\x99\x10\0\0\0\0 \x90\x89\x11\0\0\0\0\x10sy\x12\0\0\0\0 ri\x13\0\0\0\x000\x80i\x13\0\0\0\0 cY\x14\0\0\0\0 TI\x15\0\0\0\0\x1079\x16\0\0\0\0 6)\x17\0\0\0\0\x90S\"\x18\0\0\0\0 \x18\t\x19\0\0\0\0\x905\x02\x1A\0\0\0\0\xA0C\x02\x1A\0\0\0\0\x10\x14+\x1A\0\0\0\0\xB0B\xF2\x1A\0\0\0\0\xA0%\xE2\x1B\0\0\0\0\xB0$\xD2\x1C\0\0\0\0\xA0\x07\xC2\x1D\0\0\0\0\xB0\x06\xB2\x1E\0\0\0\0\xA0\xE9\xA1\x1F\0\0\0\x0009v \0\0\0\0\xA0\xCB\x81!\0\0\0\x000\x1BV\"\0\0\0\0 \xE8j#\0\0\0\x000\xFD5$\0\0\0\0 \xCAJ%\0\0\0\x000\xDF\x15&\0\0\0\0 \xAC*'\0\0\0\0\xB0\xFB\xFE'\0\0\0\0 \x8E\n)\0\0\0\0\xB0\xDD\xDE)\0\0\0\0 p\xEA*\0\0\0\0\xB0\xBF\xBE+\0\0\0\0\xA0\x8C\xD3,\0\0\0\0\xB0\xA1\x9E-\0\0\0\0\xA0n\xB3.\0\0\0\0\xB0\x83~/\0\0\0\0\xA0P\x930\0\0\0\x000\xA0g1\0\0\0\0\xA02s2\0\0\0\x000\x82G3\0\0\0\0\xA0\x14S4\0\0\0\x000d'5\0\0\0\0\xA0\xF626\0\0\0\x000F\x077\0\0\0\0 \x13\x1C8\0\0\0\x000(\xE78\0\0\0\0 \xF5\xFB9\0\0\0\x000\n\xC7:\0\0\0\0 \xD7\xDB;\0\0\0\0\xB0&\xB0<\0\0\0\0 \xB9\xBB=\0\0\0\0\xB0\x08\x90>\0\0\0\0 \x9B\x9B?\0\0\0\0\xB0\xEAo@\0\0\0\0\xA0\xB7\x84A\0\0\0\0\xB0\xCCOB\0\0\0\0\xA0\x99dC\0\0\0\0\xB0\xAE/D\0\0\0\0\xA0{DE\0\0\0\x000\xE1\xF3E\0\0\0\0 \x98-G\0\0\0\0\x01\x02\x03\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x04\x02\x05\x02\x05\x03\x02\x05\x03\x02\x05\x03\x02\x05\x04\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04\x02\x05\x04{\xD3\0\0\0\0\0\0\xFB\x81\xFF\xFF\xFF\xFF\xFF\xFF\x80\x8F\xFF\xFF\xFF\xFF\xFF\xFF\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFFp\x81\xFF\xFF\xFF\xFF\xFF\xFF\x80\x8F\xFF\xFF\xFF\xFF\xFF\xFFEST\0\0\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\x01EDT\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0\xB0\x03P\x04\xA0\xFE\x03^\xFF\xFF\xFF\xFF\x80,\xA6\x9E\xFF\xFF\xFF\xFFp\xF9\xBA\x9F\xFF\xFF\xFF\xFF\x80\x0E\x86\xA0\xFF\xFF\xFF\xFFp\xDB\x9A\xA1\xFF\xFF\xFF\xFF\0\xF7s\xA4\xFF\xFF\xFF\xFFp\x11\x16\xA5\xFF\xFF\xFF\xFF\x80N\r\xCA\xFF\xFF\xFF\xFFpG\xD8\xCA\xFF\xFF\xFF\xFF\x80\xFE\x88\xCB\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF\xF0\ta\xD2\xFF\xFF\xFF\xFF\x1C\xD7u\xD3\xFF\xFF\xFF\xFFp\t\xA4\xD3\xFF\xFF\xFF\xFF\x80\xB5\xFE\xDA\xFF\xFF\xFF\xFF\xF0s\xC0\xDB\xFF\xFF\xFF\xFF\x80\x97\xDE\xDC\xFF\xFF\xFF\xFFp\x90\xA9\xDD\xFF\xFF\xFF\xFF\x80y\xBE\xDE\xFF\xFF\xFF\xFFpr\x89\xDF\xFF\xFF\xFF\xFF\x80[\x9E\xE0\xFF\xFF\xFF\xFFpTi\xE1\xFF\xFF\xFF\xFF\x80=~\xE2\xFF\xFF\xFF\xFFp6I\xE3\xFF\xFF\xFF\xFF\x80\x1F^\xE4\xFF\xFF\xFF\xFFp\x18)\xE5\xFF\xFF\xFF\xFF\0\0\0\0\0\xE0b\x9B?\0\0\0\0p\xB2o@\0\0\0\0`\x7F\x84A\0\0\0\0p\x94OB\0\0\0\0`adC\0\0\0\0pv/D\0\0\0\0`CDE\0\0\0\0\xF0\xA8\xF3E\0\0\0\0\xE0_-G\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x02\x03\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x9A\xAF\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFFEST\0\0\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\x01EDT\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0\xC0\x02 \x03\xA0\xFE\x03^\xFF\xFF\xFF\xFF\x80,\xA6\x9E\xFF\xFF\xFF\xFFp\xF9\xBA\x9F\xFF\xFF\xFF\xFF\x80\x0E\x86\xA0\xFF\xFF\xFF\xFFp\xDB\x9A\xA1\xFF\xFF\xFF\xFF\x80\xFE\x88\xCB\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF\xF0\ta\xD2\xFF\xFF\xFF\xFF\0I\xD8\xFC\xFF\xFF\xFF\xFF\xF0+\xC8\xFD\xFF\xFF\xFF\xFF\0+\xB8\xFE\xFF\xFF\xFF\xFF\xF0\r\xA8\xFF\xFF\xFF\xFF\xFF\0\r\x98\0\0\0\0\0\xF0\xEF\x87\x01\0\0\0\0\0\xEFw\x02\0\0\0\0p\x0Cq\x03\0\0\0\0\x80\x0Ba\x04\0\0\0\0p\xEEP\x05\0\0\0\0\x80\xED@\x06\0\0\0\0p\xD00\x07\0\0\0\0\x80'\x8D\x07\0\0\0\0p\xB2\x10\t\0\0\0\0\0\xA3\xAD\t\0\0\0\0p\x94\xF0\n\0\0\0\0\x80\x93\xE0\x0B\0\0\0\0\xF0\xB0\xD9\x0C\0\0\0\0\x80u\xC0\r\0\0\0\0\xF0\x92\xB9\x0E\0\0\0\0\0\x92\xA9\x0F\0\0\0\0\xF0t\x99\x10\0\0\0\0\0t\x89\x11\0\0\0\0\xF0Vy\x12\0\0\0\0\0Vi\x13\0\0\0\0\xF08Y\x14\0\0\0\0\08I\x15\0\0\0\0\xF0\x1A9\x16\0\0\0\0\0\x1A)\x17\0\0\0\0p7\"\x18\0\0\0\0\0\xFC\x08\x19\0\0\0\0p\x19\x02\x1A\0\0\0\0\x80\x18\xF2\x1A\0\0\0\0p\xFB\xE1\x1B\0\0\0\0\x80\xFA\xD1\x1C\0\0\0\0p\xDD\xC1\x1D\0\0\0\0\x80\xDC\xB1\x1E\0\0\0\0p\xBF\xA1\x1F\0\0\0\0\0\x0Fv \0\0\0\0p\xA1\x81!\0\0\0\0\0\xF1U\"\0\0\0\0\xF0\xBDj#\0\0\0\0\0\xD35$\0\0\0\0\xF0\x9FJ%\0\0\0\0\0\xB5\x15&\0\0\0\0\xF0\x81*'\0\0\0\0\x80\xD1\xFE'\0\0\0\0\xF0c\n)\0\0\0\0\x80\xB3\xDE)\0\0\0\0\xF0E\xEA*\0\0\0\0\x80\x95\xBE+\0\0\0\0pb\xD3,\0\0\0\0\x80w\x9E-\0\0\0\0pD\xB3.\0\0\0\0\x80Y~/\0\0\0\0p&\x930\0\0\0\0\0vg1\0\0\0\0p\x08s2\0\0\0\0\0XG3\0\0\0\0p\xEAR4\0\0\0\0\0:'5\0\0\0\0p\xCC26\0\0\0\0\0\x1C\x077\0\0\0\0\xF0\xE8\x1B8\0\0\0\0\0\xFE\xE68\0\0\0\0\xF0\xCA\xFB9\0\0\0\0\xF0\xD1\xC6:\0\0\0\0\xE0\x9E\xDB;\0\0\0\0p\xEE\xAF<\0\0\0\0\xE0\x80\xBB=\0\0\0\0p\xD0\x8F>\0\0\0\0\xE0b\x9B?\0\0\0\0p\xB2o@\0\0\0\0`\x7F\x84A\0\0\0\0p\x94OB\0\0\0\0`adC\0\0\0\0pv/D\0\0\0\0`CDE\0\0\0\0\xF0\xA8\xF3E\0\0\0\0\xE0_-G\0\0\0\0\x01\x02\x01\x02\x01\x02\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03t\xB0\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF-04\0\0\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x18\0\x1B\0d\x1B\x87i\xFF\xFF\xFF\xFF\xE4\x96\x1E\xB8\xFF\xFF\xFF\xFF\xD4\xD5\xEE\xB8\xFF\xFF\xFF\xFF\0\x01\x02\x1C\xC0\xFF\xFF\xFF\xFF\xFF\xFF,\xCE\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF-05\0\0\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x80\0\x90\0\xBC#\x87i\xFF\xFF\xFF\xFF\xD4@t\x8C\xFF\xFF\xFF\xFFPJ\xCF\xC3\xFF\xFF\xFF\xFF@\xE3E\xC4\xFF\xFF\xFF\xFF\xD0J/\xC5\xFF\xFF\xFF\xFF\xC0-\x1F\xC6\xFF\xFF\xFF\xFF\xD0,\x0F\xC7\xFF\xFF\xFF\xFF\xC0\x0F\xFF\xC7\xFF\xFF\xFF\xFFP\xC4\x18\x1E\0\0\0\0@]\x8F\x1E\0\0\0\0\xD0\xF7\xF9\x1F\0\0\0\0\xC0\x90p \0\0\0\0\xD0\xE3\x9E%\0\0\0\0\xC0|\x15&\0\0\0\0P\x03%-\0\0\0\0@\x9C\x9B-\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\xC4\xB7\xFF\xFF\xFF\xFF\xFF\xFF\xAC\xB7\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFFPST\0\0\x80\x8F\xFF\xFF\xFF\xFF\xFF\xFF\x01PDT\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0\xF0\x03n\x04\xC0\x1A\x04^\xFF\xFF\xFF\xFF\xA0H\xA6\x9E\xFF\xFF\xFF\xFF\x90\x15\xBB\x9F\xFF\xFF\xFF\xFF\xA0*\x86\xA0\xFF\xFF\xFF\xFF\x90\xF7\x9A\xA1\xFF\xFF\xFF\xFF\xA0\x1A\x89\xCB\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF\x10&a\xD2\xFF\xFF\xFF\xFF\\t\xFE\xD6\xFF\xFF\xFF\xFF\x90\xAD\x80\xD8\xFF\xFF\xFF\xFF\x90\xC3\xFE\xDA\xFF\xFF\xFF\xFF\x10\x90\xC0\xDB\xFF\xFF\xFF\xFF\x90\xA5\xDE\xDC\xFF\xFF\xFF\xFF\x90\xAC\xA9\xDD\xFF\xFF\xFF\xFF\x90\x87\xBE\xDE\xFF\xFF\xFF\xFF\x90\x8E\x89\xDF\xFF\xFF\xFF\xFF\x90i\x9E\xE0\xFF\xFF\xFF\xFF\x90pi\xE1\xFF\xFF\xFF\xFF\x90K~\xE2\xFF\xFF\xFF\xFF\x90RI\xE3\xFF\xFF\xFF\xFF\x90-^\xE4\xFF\xFF\xFF\xFF\x904)\xE5\xFF\xFF\xFF\xFF\x10JG\xE6\xFF\xFF\xFF\xFF\x10Q\x12\xE7\xFF\xFF\xFF\xFF\x10,'\xE8\xFF\xFF\xFF\xFF\x103\xF2\xE8\xFF\xFF\xFF\xFF\x10\x0E\x07\xEA\xFF\xFF\xFF\xFF\x10\x15\xD2\xEA\xFF\xFF\xFF\xFF\x10\xF0\xE6\xEB\xFF\xFF\xFF\xFF\x10\xF7\xB1\xEC\xFF\xFF\xFF\xFF\x10\xD2\xC6\xED\xFF\xFF\xFF\xFF\x10\xD9\x91\xEE\xFF\xFF\xFF\xFF\x90\xEE\xAF\xEF\xFF\xFF\xFF\xFF\x10\xBBq\xF0\xFF\xFF\xFF\xFF\x90\xD0\x8F\xF1\xFF\xFF\xFF\xFF\x90\xC1\x7F\xF2\xFF\xFF\xFF\xFF\x90\xB2o\xF3\xFF\xFF\xFF\xFF\x90\xA3_\xF4\xFF\xFF\xFF\xFF\x90\x94O\xF5\xFF\xFF\xFF\xFF\x90\x85?\xF6\xFF\xFF\xFF\xFF\x90v/\xF7\xFF\xFF\xFF\xFF\x10\xA2(\xF8\xFF\xFF\xFF\xFF\x90X\x0F\xF9\xFF\xFF\xFF\xFF\x10\x84\x08\xFA\xFF\xFF\xFF\xFF \x83\xF8\xFA\xFF\xFF\xFF\xFF\x10f\xE8\xFB\xFF\xFF\xFF\xFF e\xD8\xFC\xFF\xFF\xFF\xFF\x10H\xC8\xFD\xFF\xFF\xFF\xFF G\xB8\xFE\xFF\xFF\xFF\xFF\x10*\xA8\xFF\xFF\xFF\xFF\xFF )\x98\0\0\0\0\0\x10\x0C\x88\x01\0\0\0\0 \x0Bx\x02\0\0\0\0\x90(q\x03\0\0\0\0\xA0'a\x04\0\0\0\0\x90\nQ\x05\0\0\0\0\xA0\tA\x06\0\0\0\0\x90\xEC0\x07\0\0\0\0\xA0C\x8D\x07\0\0\0\0\x90\xCE\x10\t\0\0\0\0 \xBF\xAD\t\0\0\0\0\x90\xB0\xF0\n\0\0\0\0\xA0\xAF\xE0\x0B\0\0\0\0\x10\xCD\xD9\x0C\0\0\0\0\xA0\x91\xC0\r\0\0\0\0\x10\xAF\xB9\x0E\0\0\0\0 \xAE\xA9\x0F\0\0\0\0\x10\x91\x99\x10\0\0\0\0 \x90\x89\x11\0\0\0\0\x10sy\x12\0\0\0\0 ri\x13\0\0\0\0\x10UY\x14\0\0\0\0 TI\x15\0\0\0\0\x1079\x16\0\0\0\0 6)\x17\0\0\0\0\x90S\"\x18\0\0\0\0 \x18\t\x19\0\0\0\0\x905\x02\x1A\0\0\0\0\xA04\xF2\x1A\0\0\0\0\x90\x17\xE2\x1B\0\0\0\0\xA0\x16\xD2\x1C\0\0\0\0\x90\xF9\xC1\x1D\0\0\0\0\xA0\xF8\xB1\x1E\0\0\0\0\x90\xDB\xA1\x1F\0\0\0\0 +v \0\0\0\0\x90\xBD\x81!\0\0\0\0 \rV\"\0\0\0\0\x10\xDAj#\0\0\0\0 \xEF5$\0\0\0\0\x10\xBCJ%\0\0\0\0 \xD1\x15&\0\0\0\0\x10\x9E*'\0\0\0\0\xA0\xED\xFE'\0\0\0\0\x10\x80\n)\0\0\0\0\xA0\xCF\xDE)\0\0\0\0\x10b\xEA*\0\0\0\0\xA0\xB1\xBE+\0\0\0\0\x90~\xD3,\0\0\0\0\xA0\x93\x9E-\0\0\0\0\x90`\xB3.\0\0\0\0\xA0u~/\0\0\0\0\x90B\x930\0\0\0\0 \x92g1\0\0\0\0\x90$s2\0\0\0\0 tG3\0\0\0\0\x90\x06S4\0\0\0\0 V'5\0\0\0\0\x90\xE826\0\0\0\0 8\x077\0\0\0\0\x10\x05\x1C8\0\0\0\0 \x1A\xE78\0\0\0\0\x10\xE7\xFB9\0\0\0\0 \xFC\xC6:\0\0\0\0\x10\xC9\xDB;\0\0\0\0\xA0\x18\xB0<\0\0\0\0\x10\xAB\xBB=\0\0\0\0\xA0\xFA\x8F>\0\0\0\0\x10\x8D\x9B?\0\0\0\0\xA0\xDCo@\0\0\0\0\x90\xA9\x84A\0\0\0\0\xA0\xBEOB\0\0\0\0\x90\x8BdC\0\0\0\0\xA0\xA0/D\0\0\0\0\x90mDE\0\0\0\0 \xD3\xF3E\0\0\0\0\x10\x8A-G\0\0\0\0\x01\x02\x01\x02\x01\x02\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01&\x91\xFF\xFF\xFF\xFF\xFF\xFF\x80\x8F\xFF\xFF\xFF\xFF\xFF\xFF\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFF-03\0\0\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0H\x01q\x01|h\xAA\x96\xFF\xFF\xFF\xFF\xE0I\x0F\xB8\xFF\xFF\xFF\xFF\xA0@\xFD\xB8\xFF\xFF\xFF\xFF04\xF1\xB9\xFF\xFF\xFF\xFF t\xDE\xBA\xFF\xFF\xFF\xFF0\xAE8\xDA\xFF\xFF\xFF\xFF0\xFA\xEB\xDA\xFF\xFF\xFF\xFF\xB0\xE1\x19\xDC\xFF\xFF\xFF\xFF Y\xB9\xDC\xFF\xFF\xFF\xFF0\x15\xFB\xDD\xFF\xFF\xFF\xFF \xDE\x9B\xDE\xFF\xFF\xFF\xFF0\x9A\xDD\xDF\xFF\xFF\xFF\xFF 3T\xE0\xFF\xFF\xFF\xFF\xB0\xFF\x97\xF4\xFF\xFF\xFF\xFF ^\x05\xF5\xFF\xFF\xFF\xFF0d\xC0\xF6\xFF\xFF\xFF\xFF\xA0\x1E\x0E\xF7\xFF\xFF\xFF\xFF0,Q\xF8\xFF\xFF\xFF\xFF \xC5\xC7\xF8\xFF\xFF\xFF\xFF\xB0\xD2\n\xFA\xFF\xFF\xFF\xFF\xA0\xF8\xA8\xFA\xFF\xFF\xFF\xFF0\x06\xEC\xFB\xFF\xFF\xFF\xFF\xA0}\x8B\xFC\xFF\xFF\xFF\xFF0\x8E\xC9\x1D\0\0\0\0\xA0\xD7x\x1E\0\0\0\0\xB05\xA0\x1F\0\0\0\0\xA0\xCF3 \0\0\0\x000i\x81!\0\0\0\0\xA0\xC8\x0B\"\0\0\0\0\xB0\x10X#\0\0\0\0 p\xE2#\0\0\0\0\xB0\xF27%\0\0\0\0 \xC7\xD4%\0\0\0\x000y\x800\0\0\0\0\xA0M\x1D1\0\0\0\0\xB0\xC6\xF67\0\0\0\0 \x85\xB88\0\0\0\x000\xE3\xDF9\0\0\0\0 J\xF29\0\0\0\0\xB0\xFF\xC8;\0\0\0\0\xA0\x0Eo<\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x84\xDE\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFFCST\0\0\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x80\0\x96\0d,\x87i\xFF\xFF\xFF\xFF\xE8H-\xBD\xFF\xFF\xFF\xFF`tC\x06\0\0\0\0P>\xA4\t\0\0\0\0\xE0\xF8Q\x11\0\0\0\0Po\xD4\x11\0\0\0\0\xE0\xDA1\x13\0\0\0\0PQ\xB4\x13\0\0\0\0 \x91a)\0\0\0\0PK\xC1*\0\0\0\0\xE0\xDDC+\0\0\0\0P\xEF\xC92\0\0\0\0\xE0\xC0XB\0\0\0\0Pi?C\0\0\0\0\x80nTD\0\0\0\0`Y\x1FE\0\0\0\0\x01\x02\x03\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x1C\xAF\xFF\xFF\xFF\xFF\xFF\xFF\x18\xAF\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF-04\0\0\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xF8\0\x17\x01D\x7F\xAA\x96\xFF\xFF\xFF\xFF\xF0W\x0F\xB8\xFF\xFF\xFF\xFF\xB0N\xFD\xB8\xFF\xFF\xFF\xFF@B\xF1\xB9\xFF\xFF\xFF\xFF0\x82\xDE\xBA\xFF\xFF\xFF\xFF@\xBC8\xDA\xFF\xFF\xFF\xFF@\x08\xEC\xDA\xFF\xFF\xFF\xFF\xC0\xEF\x19\xDC\xFF\xFF\xFF\xFF0g\xB9\xDC\xFF\xFF\xFF\xFF@#\xFB\xDD\xFF\xFF\xFF\xFF0\xEC\x9B\xDE\xFF\xFF\xFF\xFF@\xA8\xDD\xDF\xFF\xFF\xFF\xFF0AT\xE0\xFF\xFF\xFF\xFF\xC0\r\x98\xF4\xFF\xFF\xFF\xFF0l\x05\xF5\xFF\xFF\xFF\xFF@r\xC0\xF6\xFF\xFF\xFF\xFF\xB0,\x0E\xF7\xFF\xFF\xFF\xFF@:Q\xF8\xFF\xFF\xFF\xFF0\xD3\xC7\xF8\xFF\xFF\xFF\xFF\xC0\xE0\n\xFA\xFF\xFF\xFF\xFF\xB0\x06\xA9\xFA\xFF\xFF\xFF\xFF@\x14\xEC\xFB\xFF\xFF\xFF\xFF\xB0\x8B\x8B\xFC\xFF\xFF\xFF\xFF@\x9C\xC9\x1D\0\0\0\0\xB0\xE5x\x1E\0\0\0\0\xC0C\xA0\x1F\0\0\0\0\xB0\xDD3 \0\0\0\0@w\x81!\0\0\0\0\xB0\xD6\x0B\"\0\0\0\0@\xC3\xC0,\0\0\0\x000\xD2f-\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xBC\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFFAST\0\0\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0$\0\xC4\x14\x87i\xFF\xFF\xFF\xFFD\xC8\xA3\x91\xFF\xFF\xFF\xFF@nM\x13\0\0\0\0\xB0\x164\x14\0\0\0\0\0\x01\x02\x01\xBC\xC6\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFFCST\0\0\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\x01CDT\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0\xF8\0\x17\x01`\xDA\xB6\xA5\xFF\xFF\xFF\xFF\0\xF1U\"\0\0\0\0\xF0\xBDj#\0\0\0\0\0vg1\0\0\0\0p\x08s2\0\0\0\0\0XG3\0\0\0\0p\xEAR4\0\0\0\0\0:'5\0\0\0\0p\xCC26\0\0\0\0\0\x1C\x077\0\0\0\0\xF0\xE8\x1B8\0\0\0\0\0\xFE\xE68\0\0\0\0\xF0\xCA\xFB9\0\0\0\0\x80\x04\xF5:\0\0\0\0\xF0\xC2\xB6;\0\0\0\0\x80\xFC\xAF<\0\0\0\0\xF0\x8E\xBB=\0\0\0\0\x80\xDE\x8F>\0\0\0\0\xF0p\x9B?\0\0\0\0\x80\xC0o@\0\0\0\0p\x8D\x84A\0\0\0\0\x80\xA2OB\0\0\0\0podC\0\0\0\0\x80\x84/D\0\0\0\0pQDE\0\0\0\0\x80f\x0FF\0\0\0\0p3$G\0\0\0\0\0\x83\xF8G\0\0\0\0p\x15\x04I\0\0\0\0\0e\xD8I\0\0\0\0p\xF7\xE3J\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x98\xA4\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFFMST\0\0\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xA8\0\xC6\0p\xE8\xB6\xA5\xFF\xFF\xFF\xFFp+\xF1\xAF\xFF\xFF\xFF\xFF`Vf\xB6\xFF\xFF\xFF\xFFp=A\xB7\xFF\xFF\xFF\xFF`6\x0C\xB8\xFF\xFF\xFF\xFF\xF0\x86\xFD\xB8\xFF\xFF\xFF\xFF`q\xEA\xCB\xFF\xFF\xFF\xFF\x10\x84g1\0\0\0\0\x80\x16s2\0\0\0\0\x10fG3\0\0\0\0\x80\xF8R4\0\0\0\0\x10H'5\0\0\0\0\x80\xDA26\0\0\0\0\x10*\x077\0\0\0\0\0\xF7\x1B8\0\0\0\0\x10\x0C\xE78\0\0\0\0\0\xD9\xFB9\0\0\0\0\x90\x12\xF5:\0\0\0\0\0\xD1\xB6;\0\0\0\0\x90\n\xB0<\0\0\0\0\0\x9D\xBB=\0\0\0\0\x01\x02\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01<\x9C\xFF\xFF\xFF\xFF\xFF\xFF\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFFCST\0\0\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\x01CDT\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0\xA0\x02\x18\x03cIwa\xFF\xFF\xFF\xFF\x80,\xA6\x9E\xFF\xFF\xFF\xFFp\xF9\xBA\x9F\xFF\xFF\xFF\xFF\x80\x0E\x86\xA0\xFF\xFF\xFF\xFFp\xDB\x9A\xA1\xFF\xFF\xFF\xFF\x80\xFE\x88\xCB\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF\xF0\ta\xD2\xFF\xFF\xFF\xFF\0\xF3u\xD3\xFF\xFF\xFF\xFF\xF0\xEB@\xD4\xFF\xFF\xFF\xFF\x80J\x0F\xF9\xFF\xFF\xFF\xFF\xF0g\x08\xFA\xFF\xFF\xFF\xFF\0+\xB8\xFE\xFF\xFF\xFF\xFFp\xDF@\x06\0\0\0\0\x80\xED@\x06\0\0\0\0p\xD00\x07\0\0\0\0\x80'\x8D\x07\0\0\0\0p\xB2\x10\t\0\0\0\0\0\xA3\xAD\t\0\0\0\0p\x94\xF0\n\0\0\0\0\x80\x93\xE0\x0B\0\0\0\0\xF0\xB0\xD9\x0C\0\0\0\0\x80u\xC0\r\0\0\0\0\xF0\x92\xB9\x0E\0\0\0\0\0\x92\xA9\x0F\0\0\0\0\xF0t\x99\x10\0\0\0\0\0t\x89\x11\0\0\0\0\xF0Vy\x12\0\0\0\0\0Vi\x13\0\0\0\0\xF08Y\x14\0\0\0\0\08I\x15\0\0\0\0\xF0\x1A9\x16\0\0\0\0\0\x1A)\x17\0\0\0\0p7\"\x18\0\0\0\0\0\xFC\x08\x19\0\0\0\0p\x19\x02\x1A\0\0\0\0\x80\x18\xF2\x1A\0\0\0\0p\xFB\xE1\x1B\0\0\0\0\x80\xFA\xD1\x1C\0\0\0\0p\xDD\xC1\x1D\0\0\0\0\x80\xDC\xB1\x1E\0\0\0\0p\xBF\xA1\x1F\0\0\0\0\0\x0Fv \0\0\0\0p\xA1\x81!\0\0\0\0\0\xF1U\"\0\0\0\0\xF0\xBDj#\0\0\0\0\0\xD35$\0\0\0\0\xF0\x9FJ%\0\0\0\0\0\xB5\x15&\0\0\0\0\xF0\x81*'\0\0\0\0\x80\xD1\xFE'\0\0\0\0\xF0c\n)\0\0\0\0\x80\xB3\xDE)\0\0\0\0\xF0E\xEA*\0\0\0\0\x80\x95\xBE+\0\0\0\0pb\xD3,\0\0\0\0\x80w\x9E-\0\0\0\0pD\xB3.\0\0\0\0\x80Y~/\0\0\0\0p&\x930\0\0\0\0\0vg1\0\0\0\0p\x08s2\0\0\0\0\0XG3\0\0\0\0p\xEAR4\0\0\0\0\0:'5\0\0\0\0p\xCC26\0\0\0\0\0\x1C\x077\0\0\0\0\xF0\xE8\x1B8\0\0\0\0\0\xFE\xE68\0\0\0\0\xF0\xCA\xFB9\0\0\0\0\0\xE0\xC6:\0\0\0\0\xF0\xAC\xDB;\0\0\0\0\x80\xFC\xAF<\0\0\0\0\xF0\x8E\xBB=\0\0\0\0\x80\xDE\x8F>\0\0\0\0\xF0p\x9B?\0\0\0\0\x80\xC0o@\0\0\0\0p\x8D\x84A\0\0\0\0\x80\xA2OB\0\0\0\0podC\0\0\0\0\x80\x84/D\0\0\0\0pQDE\0\0\0\0\0\xB7\xF3E\0\0\0\0\xF0m-G\0\0\0\0\x01\x02\x01\x02\x01\x02\x02\x01\x02\x01\x02\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\xDD\xAD\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFFCST\0\0\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x88\0\xA0\0`\xDA\xB6\xA5\xFF\xFF\xFF\xFF\0\xE6\x8A\x16\0\0\0\0p\xDA$\x18\0\0\0\0\0vg1\0\0\0\0p\x08s2\0\0\0\0\0XG3\0\0\0\0p\xEAR4\0\0\0\0\0:'5\0\0\0\0p\xCC26\0\0\0\0\0\x1C\x077\0\0\0\0\xF0\xE8\x1B8\0\0\0\0\0\xFE\xE68\0\0\0\0\xF0\xCA\xFB9\0\0\0\0\x80\x04\xF5:\0\0\0\0\xF0\xC2\xB6;\0\0\0\0\x80\xFC\xAF<\0\0\0\0\xF0\x8E\xBB=\0\0\0\0\x01\x02\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\xFC\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFFAKST\0p\x81\xFF\xFF\xFF\xFF\xFF\xFF\x01AKDT\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0X\x01\x87\x01\xD1\xFD\xC2?\xFF\xFF\xFF\xFF\x1A0\x87}\xFF\xFF\xFF\xFF\xA0\x1A\x89\xCB\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF\x10&a\xD2\xFF\xFF\xFF\xFF G\xB8\xFE\xFF\xFF\xFF\xFF\x10*\xA8\xFF\xFF\xFF\xFF\xFF )\x98\0\0\0\0\0\x10\x0C\x88\x01\0\0\0\0 \x0Bx\x02\0\0\0\0\x90(q\x03\0\0\0\0\xA0'a\x04\0\0\0\0\x90\nQ\x05\0\0\0\0\xA0\tA\x06\0\0\0\0\x90\xEC0\x07\0\0\0\0\xA0C\x8D\x07\0\0\0\0\x90\xCE\x10\t\0\0\0\0 \xBF\xAD\t\0\0\0\0\x90\xB0\xF0\n\0\0\0\0\xA0\xAF\xE0\x0B\0\0\0\0\x10\xCD\xD9\x0C\0\0\0\0\xA0\x91\xC0\r\0\0\0\0\x10\xAF\xB9\x0E\0\0\0\0 \xAE\xA9\x0F\0\0\0\0\x10\x91\x99\x10\0\0\0\0 \x90\x89\x11\0\0\0\0\x10sy\x12\0\0\0\0 ri\x13\0\0\0\0\x10UY\x14\0\0\0\0 TI\x15\0\0\0\0\x1079\x16\0\0\0\0 6)\x17\0\0\0\0\x90S\"\x18\0\0\0\0 \x18\t\x19\0\0\0\0\x905\x02\x1A\0\0\0\0\xA0\xE25V\0\0\0\x000H\xE5V\0\0\0\0 \xFF\x1EX\0\0\0\x000*\xC5X\0\0\0\0 \xE1\xFEY\0\0\0\x000\x0C\xA5Z\0\0\0\0 \xC3\xDE[\0\0\0\0\xA0FD\\\0\0\0\0\x01\x02\x03\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x04\x02\x05\x04\x02\x05\x04\x02\x05\x02\x05\x04&\xD6\0\0\0\0\0\0\xA6\x84\xFF\xFF\xFF\xFF\xFF\xFF\x80\x8F\xFF\xFF\xFF\xFF\xFF\xFF\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFFp\x81\xFF\xFF\xFF\xFF\xFF\xFF\x80\x8F\xFF\xFF\xFF\xFF\xFF\xFFCST\0\0\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xE0\0\t\x01p\xE8\xB6\xA5\xFF\xFF\xFF\xFFp+\xF1\xAF\xFF\xFF\xFF\xFF`Vf\xB6\xFF\xFF\xFF\xFFp=A\xB7\xFF\xFF\xFF\xFF`6\x0C\xB8\xFF\xFF\xFF\xFF\xF0\x86\xFD\xB8\xFF\xFF\xFF\xFF`\xB0\xDE\xC5\xFF\xFF\xFF\xFFP4\x97\xC6\xFF\xFF\xFF\xFF\xE0\xF1U\xC9\xFF\xFF\xFF\xFFP\xDD\xEA\xC9\xFF\xFF\xFF\xFF\xE0\xC6\x02\xCF\xFF\xFF\xFF\xFFPV\xB7\xCF\xFF\xFF\xFF\xFF\xE0\x15\x99\xDA\xFF\xFF\xFF\xFF\xD0\x83v\xDB\xFF\xFF\xFF\xFF\0vg1\0\0\0\0p\x08s2\0\0\0\0\0XG3\0\0\0\0p\xEAR4\0\0\0\0\0:'5\0\0\0\0p\xCC26\0\0\0\0\0\x1C\x077\0\0\0\0\xF0\xE8\x1B8\0\0\0\0\0\xFE\xE68\0\0\0\0\xF0\xCA\xFB9\0\0\0\0\x80\x04\xF5:\0\0\0\0\xF0\xC2\xB6;\0\0\0\0\x80\xFC\xAF<\0\0\0\0\xF0\x8E\xBB=\0\0\0\0\x01\x02\x01\x02\x03\x01\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x0C\xA3\xFF\xFF\xFF\xFF\xFF\xFF\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF-03\0\0\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\x01-02\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0h\x01\x95\x01(\x17\xDF\x91\xFF\xFF\xFF\xFF\xC0cn\x13\0\0\0\0\xB0\xDB\xF9\x1F\0\0\0\0\xC0\xD6u \0\0\0\0@w\x81!\0\0\0\0\xD0\xC6U\"\0\0\0\0\xC0\x93j#\0\0\0\0\xD0\xA85$\0\0\0\0\xC0uJ%\0\0\0\0\xD0\x8A\x15&\0\0\0\0\xC0W*'\0\0\0\0P\xA7\xFE'\0\0\0\0\xC09\n)\0\0\0\0P\x89\xDE)\0\0\0\0\xC0\x1B\xEA*\0\0\0\0Pk\xBE+\0\0\0\0@8\xD3,\0\0\0\0PM\x9E-\0\0\0\0@\x1A\xB3.\0\0\0\0P/~/\0\0\0\0@\xFC\x920\0\0\0\0\xD0Kg1\0\0\0\0@\xDEr2\0\0\0\0\xD0-G3\0\0\0\0@\xC0R4\0\0\0\0\xD0\x0F'5\0\0\0\0@\xA226\0\0\0\0\xD0\xF1\x067\0\0\0\0\xC0\xBE\x1B8\0\0\0\0\xD0\xD3\xE68\0\0\0\0\xC0\xA0\xFB9\0\0\0\0\xD0\xB5\xC6:\0\0\0\0\xC0\x82\xDB;\0\0\0\0P\xD2\xAF<\0\0\0\0\xC0d\xBB=\0\0\0\0P\xB4\x8F>\0\0\0\0\xC0F\x9B?\0\0\0\0P\x96o@\0\0\0\0@c\x84A\0\0\0\0PxOB\0\0\0\0@EdC\0\0\0\0PZ/D\0\0\0\0@'DE\0\0\0\0\xD0\x8C\xF3E\0\0\0\0\xC0C-G\0\0\0\0\x01\x02\x03\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02X\xCB\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFFAST\0\0\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\x01ADT\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0\x98\x04+\x05\xBC\xED\x1E^\xFF\xFF\xFF\xFFP\xB6\xF1\x80\xFF\xFF\xFF\xFF`\x85\xB8\x9E\xFF\xFF\xFF\xFFP\xDD\xBA\x9F\xFF\xFF\xFF\xFF\xD08<\xBB\xFF\xFF\xFF\xFF@#\xB4\xBB\xFF\xFF\xFF\xFF\xD0\x1A\x1C\xBD\xFF\xFF\xFF\xFF@\x05\x94\xBD\xFF\xFF\xFF\xFF\xD0\xFC\xFB\xBE\xFF\xFF\xFF\xFF@\xE7s\xBF\xFF\xFF\xFF\xFF\xD0\xDE\xDB\xC0\xFF\xFF\xFF\xFF@\xC9S\xC1\xFF\xFF\xFF\xFF\xD0\xC0\xBB\xC2\xFF\xFF\xFF\xFF@\xAB3\xC3\xFF\xFF\xFF\xFF\xD0\xA2\x9B\xC4\xFF\xFF\xFF\xFF@\x8D\x13\xC5\xFF\xFF\xFF\xFF\xD0\xF8p\xC6\xFF\xFF\xFF\xFF@\xCD\r\xC7\xFF\xFF\xFF\xFF\xD0\xF1H\xC8\xFF\xFF\xFF\xFF@\xAF\xED\xC8\xFF\xFF\xFF\xFF\xD0^\x16\xCA\xFF\xFF\xFF\xFF\xC0\xCB\xD6\xCA\xFF\xFF\xFF\xFF`\xE2\x88\xCB\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF\xD0\xED`\xD2\xFF\xFF\xFF\xFF\xE0\xD6u\xD3\xFF\xFF\xFF\xFF\xD0\xCF@\xD4\xFF\xFF\xFF\xFF\xE0\xB8U\xD5\xFF\xFF\xFF\xFF\xD0\xB1 \xD6\xFF\xFF\xFF\xFF\xE0\x9A5\xD7\xFF\xFF\xFF\xFF\xD0\x93\0\xD8\xFF\xFF\xFF\xFF\xE0|\x15\xD9\xFF\xFF\xFF\xFF\xD0u\xE0\xD9\xFF\xFF\xFF\xFF`\x99\xFE\xDA\xFF\xFF\xFF\xFF\xD0W\xC0\xDB\xFF\xFF\xFF\xFF`{\xDE\xDC\xFF\xFF\xFF\xFFPt\xA9\xDD\xFF\xFF\xFF\xFF`]\xBE\xDE\xFF\xFF\xFF\xFFPV\x89\xDF\xFF\xFF\xFF\xFF`?\x9E\xE0\xFF\xFF\xFF\xFFP8i\xE1\xFF\xFF\xFF\xFF`!~\xE2\xFF\xFF\xFF\xFFP\x1AI\xE3\xFF\xFF\xFF\xFF`\x03^\xE4\xFF\xFF\xFF\xFFP\xFC(\xE5\xFF\xFF\xFF\xFF\xE0\x1FG\xE6\xFF\xFF\xFF\xFF\xD0\x18\x12\xE7\xFF\xFF\xFF\xFF\xE0\x01'\xE8\xFF\xFF\xFF\xFF\xD0\xE4\x16\xE9\xFF\xFF\xFF\xFF\xE0\xE3\x06\xEA\xFF\xFF\xFF\xFF\xD0\xC6\xF6\xEA\xFF\xFF\xFF\xFF\xE0\xC5\xE6\xEB\xFF\xFF\xFF\xFF\xD0\xA8\xD6\xEC\xFF\xFF\xFF\xFF\xE0\xA7\xC6\xED\xFF\xFF\xFF\xFFP\xC5\xBF\xEE\xFF\xFF\xFF\xFF`\xC4\xAF\xEF\xFF\xFF\xFF\xFFP\xA7\x9F\xF0\xFF\xFF\xFF\xFF`\xA6\x8F\xF1\xFF\xFF\xFF\xFFP\x89\x7F\xF2\xFF\xFF\xFF\xFF`\x88o\xF3\xFF\xFF\xFF\xFFPk_\xF4\xFF\xFF\xFF\xFF`jO\xF5\xFF\xFF\xFF\xFFPM?\xF6\xFF\xFF\xFF\xFF`L/\xF7\xFF\xFF\xFF\xFF\xD0i(\xF8\xFF\xFF\xFF\xFF`.\x0F\xF9\xFF\xFF\xFF\xFF\xD0K\x08\xFA\xFF\xFF\xFF\xFF\xE0J\xF8\xFA\xFF\xFF\xFF\xFF\xD0-\xE8\xFB\xFF\xFF\xFF\xFF\xE0,\xD8\xFC\xFF\xFF\xFF\xFF\xD0\x0F\xC8\xFD\xFF\xFF\xFF\xFF\xE0\x0E\xB8\xFE\xFF\xFF\xFF\xFF\xD0\xF1\xA7\xFF\xFF\xFF\xFF\xFF\xE0\xF0\x97\0\0\0\0\0\xD0\xD3\x87\x01\0\0\0\0\xE0\xD2w\x02\0\0\0\0P\xF0p\x03\0\0\0\0`\xEF`\x04\0\0\0\0P\xD2P\x05\0\0\0\0`\xB3 \x08\0\0\0\0P\x96\x10\t\0\0\0\0`\x95\0\n\0\0\0\0Px\xF0\n\0\0\0\0`w\xE0\x0B\0\0\0\0\xD0\x94\xD9\x0C\0\0\0\0`Y\xC0\r\0\0\0\0\xD0v\xB9\x0E\0\0\0\0\xE0u\xA9\x0F\0\0\0\0\xD0X\x99\x10\0\0\0\0\xE0W\x89\x11\0\0\0\0\xD0:y\x12\0\0\0\0\xE09i\x13\0\0\0\0\xD0\x1CY\x14\0\0\0\0\xE0\x1BI\x15\0\0\0\0\xD0\xFE8\x16\0\0\0\0\xE0\xFD(\x17\0\0\0\0P\x1B\"\x18\0\0\0\0\xE0\xDF\x08\x19\0\0\0\0P\xFD\x01\x1A\0\0\0\0`\xFC\xF1\x1A\0\0\0\0P\xDF\xE1\x1B\0\0\0\0`\xDE\xD1\x1C\0\0\0\0P\xC1\xC1\x1D\0\0\0\0`\xC0\xB1\x1E\0\0\0\0P\xA3\xA1\x1F\0\0\0\0\xE0\xF2u \0\0\0\0P\x85\x81!\0\0\0\0\xE0\xD4U\"\0\0\0\0\xD0\xA1j#\0\0\0\0\xE0\xB65$\0\0\0\0\xD0\x83J%\0\0\0\0\xE0\x98\x15&\0\0\0\0\xD0e*'\0\0\0\0`\xB5\xFE'\0\0\0\0\xD0G\n)\0\0\0\0`\x97\xDE)\0\0\0\0\xD0)\xEA*\0\0\0\0|]\xBE+\0\0\0\0l*\xD3,\0\0\0\0|?\x9E-\0\0\0\0l\x0C\xB3.\0\0\0\0|!~/\0\0\0\0l\xEE\x920\0\0\0\0\xFC=g1\0\0\0\0l\xD0r2\0\0\0\0\xFC\x1FG3\0\0\0\0l\xB2R4\0\0\0\0\xFC\x01'5\0\0\0\0l\x9426\0\0\0\0\xFC\xE3\x067\0\0\0\0\xEC\xB0\x1B8\0\0\0\0\xFC\xC5\xE68\0\0\0\0\xEC\x92\xFB9\0\0\0\0\xFC\xA7\xC6:\0\0\0\0\xECt\xDB;\0\0\0\0|\xC4\xAF<\0\0\0\0\xECV\xBB=\0\0\0\0|\xA6\x8F>\0\0\0\0\xEC8\x9B?\0\0\0\0|\x88o@\0\0\0\0lU\x84A\0\0\0\0|jOB\0\0\0\0l7dC\0\0\0\0|L/D\0\0\0\0l\x19DE\0\0\0\0\xE0\x9A\xF3E\0\0\0\0\xD0Q-G\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02D\xC3\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFFCST\0\0\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xB0\0\xD0\0`\xDA\xB6\xA5\xFF\xFF\xFF\xFFp+\xF1\xAF\xFF\xFF\xFF\xFF`Vf\xB6\xFF\xFF\xFF\xFFp=A\xB7\xFF\xFF\xFF\xFF`6\x0C\xB8\xFF\xFF\xFF\xFF\xF0\x86\xFD\xB8\xFF\xFF\xFF\xFF\0\xF1U\"\0\0\0\0\xF0\xBDj#\0\0\0\0\0vg1\0\0\0\0p\x08s2\0\0\0\0\0XG3\0\0\0\0p\xEAR4\0\0\0\0\0:'5\0\0\0\0p\xCC26\0\0\0\0\0\x1C\x077\0\0\0\0\xF0\xE8\x1B8\0\0\0\0\0\xFE\xE68\0\0\0\0\xF0\xCA\xFB9\0\0\0\0\x80\x04\xF5:\0\0\0\0\xF0\xC2\xB6;\0\0\0\0\x80\xFC\xAF<\0\0\0\0\xF0\x8E\xBB=\0\0\0\0\x01\x02\x01\x02\x03\x01\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\xF4\xA1\xFF\xFF\xFF\xFF\xFF\xFF\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF-03\0\0\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0(\x02\x82\x023\xE54\x8C\xFF\xFF\xFF\xFF\xB3\x87\x92\xA2\xFF\xFF\xFF\xFF@\xDB\xFF\xA8\xFF\xFF\xFF\xFF\xB0\x0F\xF1\xA9\xFF\xFF\xFF\xFF8Y\xE2\xAA\xFF\xFF\xFF\xFF0C\xD2\xAB\xFF\xFF\xFF\xFF\xB8\x8C\xC3\xAC\xFF\xFF\xFF\xFF\xB0v\xB3\xAD\xFF\xFF\xFF\xFF\xB8\xB5\xF4\xBB\xFF\xFF\xFF\xFF\xB0\xB5\xBF\xBC\xFF\xFF\xFF\xFF\xB8\x97\xD4\xBD\xFF\xFF\xFF\xFF\xB0\x97\x9F\xBE\xFF\xFF\xFF\xFF\xB8y\xB4\xBF\xFF\xFF\xFF\xFF\xB0y\x7F\xC0\xFF\xFF\xFF\xFF\xB8[\x94\xC1\xFF\xFF\xFF\xFF\xB0[_\xC2\xFF\xFF\xFF\xFF8x}\xC3\xFF\xFF\xFF\xFF\xB0=?\xC4\xFF\xFF\xFF\xFF8Z]\xC5\xFF\xFF\xFF\xFF\xB0\x1F\x1F\xC6\xFF\xFF\xFF\xFF8R\x18\xC7\xFF\xFF\xFF\xFF0<\x08\xC8\xFF\xFF\xFF\xFF8\x1E\x1D\xC9\xFF\xFF\xFF\xFF0\x1E\xE8\xC9\xFF\xFF\xFF\xFF8\x9F\x8B\xCA\xFF\xFF\xFF\xFF0\xC6\x1E\xCD\xFF\xFF\xFF\xFF(f\x95\xCD\xFF\xFF\xFF\xFF\xB0\x85\x0B\xEC\xFF\xFF\xFF\xFF(5\xF2\xEC\xFF\xFF\xFF\xFF\xB0JE\xED\xFF\xFF\xFF\xFF \xD6\x85\xED\xFF\xFF\xFF\xFF\xB0r\x13\xF7\xFF\xFF\xFF\xFF \x1B\xFA\xF7\xFF\xFF\xFF\xFF0>\xFE\xFC\xFF\xFF\xFF\xFF(\x11\xF6\xFD\xFF\xFF\xFF\xFF0u\x96\0\0\0\0\0 R\xD8\0\0\0\0\0\xB0\x8AW\x04\0\0\0\0\xA0:\xC6\x04\0\0\0\0\xB0\x1B\x96\x07\0\0\0\0\x98\xDA\xDF\x07\0\0\0\0(\x9F\xC6\x08\0\0\0\x000NZ\t\0\0\0\0 s\xDB\t\0\0\0\x000\x12\x1A\r\0\0\0\0\xA0\x87\x7F\r\0\0\0\x000\x7F\xE7\x0E\0\0\0\0\xA0i_\x0F\0\0\0\x000\xD6\xD9\x10\0\0\0\0\xA0K?\x11\0\0\0\0\xB0-\x89\x11\0\0\0\0\xA0\xA21\x13\0\0\0\x000T\xC3!\0\0\0\0 x'\"\0\0\0\0\xB0\xE4\xA1#\0\0\0\0\xA0\x94\x10$\0\0\0\0\xB0gJ%\0\0\0\0 <\xE7%\0\0\0\x000\x0F!'\0\0\0\0\xA0X\xD0'\0\0\0\0\xB0+\n)\0\0\0\0\xA0:\xB0)\0\0\0\x000\xD3\xE0*\0\0\0\0\xA0\x1C\x90+\0\0\0\x000\xF6LA\0\0\0\0\xC0/FB\0\0\0\0\xD0\xA3HC\0\0\0\0\xC0\x9C\x13D\0\0\0\0PK\x1FE\0\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x04\x02\x05\x04\x02\x05\x06\x02\x05\x06\x02\x05\x04\x02\x05\x06\x02\x05\x06\x02\x05\x07\x04\x02\x05\x06\x02\x05\x06\x02\x05\x06\x02\x05\x06\x02\x05\x06\x02\x05\x06\x02\x05\x06\x02\x05\x06\x02\x05\x06\x02\x05\x06\x02\x05\x06\x02\x05\x06\x02\x05\x06\x02\x05\x06M\xCB\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xC8\xCE\xFF\xFF\xFF\xFF\xFF\xFF\xD8\xDC\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFF\xE8\xEA\xFF\xFF\xFF\xFF\xFF\xFFEST\0\0\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\x01EDT\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0\x80\x050\x06\x90\xF0\x03^\xFF\xFF\xFF\xFFp\x1E\xA6\x9E\xFF\xFF\xFF\xFF`\xEB\xBA\x9F\xFF\xFF\xFF\xFFp\0\x86\xA0\xFF\xFF\xFF\xFF`\xCD\x9A\xA1\xFF\xFF\xFF\xFFp\xE2e\xA2\xFF\xFF\xFF\xFF\xE0\xE9\x83\xA3\xFF\xFF\xFF\xFFp\xAEj\xA4\xFF\xFF\xFF\xFF`\xA75\xA5\xFF\xFF\xFF\xFF\xF0\xCAS\xA6\xFF\xFF\xFF\xFF`\x89\x15\xA7\xFF\xFF\xFF\xFF\xF0\xAC3\xA8\xFF\xFF\xFF\xFF\xE0\xA5\xFE\xA8\xFF\xFF\xFF\xFF\xF0\x8E\x13\xAA\xFF\xFF\xFF\xFF\xE0\x87\xDE\xAA\xFF\xFF\xFF\xFF\xF0p\xF3\xAB\xFF\xFF\xFF\xFF\xE0i\xBE\xAC\xFF\xFF\xFF\xFF\xF0R\xD3\xAD\xFF\xFF\xFF\xFF\xE0K\x9E\xAE\xFF\xFF\xFF\xFF\xF04\xB3\xAF\xFF\xFF\xFF\xFF\xE0-~\xB0\xFF\xFF\xFF\xFFpQ\x9C\xB1\xFF\xFF\xFF\xFF`Jg\xB2\xFF\xFF\xFF\xFFp3|\xB3\xFF\xFF\xFF\xFF`,G\xB4\xFF\xFF\xFF\xFFp\x15\\\xB5\xFF\xFF\xFF\xFF`\x0E'\xB6\xFF\xFF\xFF\xFFp\xF7;\xB7\xFF\xFF\xFF\xFF`\xF0\x06\xB8\xFF\xFF\xFF\xFFp\xD9\x1B\xB9\xFF\xFF\xFF\xFF`\xD2\xE6\xB9\xFF\xFF\xFF\xFF\xF0\xF5\x04\xBB\xFF\xFF\xFF\xFF`\xB4\xC6\xBB\xFF\xFF\xFF\xFF\xF0\xD7\xE4\xBC\xFF\xFF\xFF\xFF\xE0\xD0\xAF\xBD\xFF\xFF\xFF\xFF\xF0\xB9\xC4\xBE\xFF\xFF\xFF\xFF\xE0\xB2\x8F\xBF\xFF\xFF\xFF\xFF\xF0\x9B\xA4\xC0\xFF\xFF\xFF\xFF\xE0\x94o\xC1\xFF\xFF\xFF\xFF\xF0}\x84\xC2\xFF\xFF\xFF\xFF\xE0vO\xC3\xFF\xFF\xFF\xFF\xF0_d\xC4\xFF\xFF\xFF\xFF\xE0X/\xC5\xFF\xFF\xFF\xFFp|M\xC6\xFF\xFF\xFF\xFF\xE0:\x0F\xC7\xFF\xFF\xFF\xFFp^-\xC8\xFF\xFF\xFF\xFF`W\xF8\xC8\xFF\xFF\xFF\xFFp@\r\xCA\xFF\xFF\xFF\xFF`9\xD8\xCA\xFF\xFF\xFF\xFFp\xF0\x88\xCB\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF\xE0\xFB`\xD2\xFF\xFF\xFF\xFF\xF0\xE4u\xD3\xFF\xFF\xFF\xFF\xE0\xDD@\xD4\xFF\xFF\xFF\xFF\xF0\xC6U\xD5\xFF\xFF\xFF\xFF\xE0\xBF \xD6\xFF\xFF\xFF\xFF\xF0\xA85\xD7\xFF\xFF\xFF\xFF\xE0\xA1\0\xD8\xFF\xFF\xFF\xFF\xF0\x8A\x15\xD9\xFF\xFF\xFF\xFF\xE0\x83\xE0\xD9\xFF\xFF\xFF\xFFp\xA7\xFE\xDA\xFF\xFF\xFF\xFF\xE0e\xC0\xDB\xFF\xFF\xFF\xFFp\x89\xDE\xDC\xFF\xFF\xFF\xFF`\x82\xA9\xDD\xFF\xFF\xFF\xFFpk\xBE\xDE\xFF\xFF\xFF\xFF`d\x89\xDF\xFF\xFF\xFF\xFFpM\x9E\xE0\xFF\xFF\xFF\xFF`Fi\xE1\xFF\xFF\xFF\xFFp/~\xE2\xFF\xFF\xFF\xFF`(I\xE3\xFF\xFF\xFF\xFFp\x11^\xE4\xFF\xFF\xFF\xFF\xE0.W\xE5\xFF\xFF\xFF\xFF\xF0-G\xE6\xFF\xFF\xFF\xFF\xE0\x107\xE7\xFF\xFF\xFF\xFF\xF0\x0F'\xE8\xFF\xFF\xFF\xFF\xE0\xF2\x16\xE9\xFF\xFF\xFF\xFF\xF0\xF1\x06\xEA\xFF\xFF\xFF\xFF\xE0\xD4\xF6\xEA\xFF\xFF\xFF\xFF\xF0\xD3\xE6\xEB\xFF\xFF\xFF\xFF\xE0\xB6\xD6\xEC\xFF\xFF\xFF\xFF\xF0\xB5\xC6\xED\xFF\xFF\xFF\xFF`\xD3\xBF\xEE\xFF\xFF\xFF\xFFp\xD2\xAF\xEF\xFF\xFF\xFF\xFF`\xB5\x9F\xF0\xFF\xFF\xFF\xFFp\xB4\x8F\xF1\xFF\xFF\xFF\xFF`\x97\x7F\xF2\xFF\xFF\xFF\xFFp\x96o\xF3\xFF\xFF\xFF\xFF`y_\xF4\xFF\xFF\xFF\xFFpxO\xF5\xFF\xFF\xFF\xFF`[?\xF6\xFF\xFF\xFF\xFFpZ/\xF7\xFF\xFF\xFF\xFF\xE0w(\xF8\xFF\xFF\xFF\xFFp<\x0F\xF9\xFF\xFF\xFF\xFF\xE0Y\x08\xFA\xFF\xFF\xFF\xFF\xF0X\xF8\xFA\xFF\xFF\xFF\xFF\xE0;\xE8\xFB\xFF\xFF\xFF\xFF\xF0:\xD8\xFC\xFF\xFF\xFF\xFF\xE0\x1D\xC8\xFD\xFF\xFF\xFF\xFF\xF0\x1C\xB8\xFE\xFF\xFF\xFF\xFF\xE0\xFF\xA7\xFF\xFF\xFF\xFF\xFF\xF0\xFE\x97\0\0\0\0\0\xE0\xE1\x87\x01\0\0\0\0\xF0\xE0w\x02\0\0\0\0`\xFEp\x03\0\0\0\0p\xFD`\x04\0\0\0\0`\xE0P\x05\0\0\0\0p\xDF@\x06\0\0\0\0`\xC20\x07\0\0\0\0p\x19\x8D\x07\0\0\0\0`\xA4\x10\t\0\0\0\0\xF0\x94\xAD\t\0\0\0\0`\x86\xF0\n\0\0\0\0p\x85\xE0\x0B\0\0\0\0\xE0\xA2\xD9\x0C\0\0\0\0pg\xC0\r\0\0\0\0\xE0\x84\xB9\x0E\0\0\0\0\xF0\x83\xA9\x0F\0\0\0\0\xE0f\x99\x10\0\0\0\0\xF0e\x89\x11\0\0\0\0\xE0Hy\x12\0\0\0\0\xF0Gi\x13\0\0\0\0\xE0*Y\x14\0\0\0\0\xF0)I\x15\0\0\0\0\xE0\x0C9\x16\0\0\0\0\xF0\x0B)\x17\0\0\0\0`)\"\x18\0\0\0\0\xF0\xED\x08\x19\0\0\0\0`\x0B\x02\x1A\0\0\0\0p\n\xF2\x1A\0\0\0\0`\xED\xE1\x1B\0\0\0\0p\xEC\xD1\x1C\0\0\0\0`\xCF\xC1\x1D\0\0\0\0p\xCE\xB1\x1E\0\0\0\0`\xB1\xA1\x1F\0\0\0\0\xF0\0v \0\0\0\0`\x93\x81!\0\0\0\0\xF0\xE2U\"\0\0\0\0\xE0\xAFj#\0\0\0\0\xF0\xC45$\0\0\0\0\xE0\x91J%\0\0\0\0\xF0\xA6\x15&\0\0\0\0\xE0s*'\0\0\0\0p\xC3\xFE'\0\0\0\0\xE0U\n)\0\0\0\0p\xA5\xDE)\0\0\0\0\xE07\xEA*\0\0\0\0p\x87\xBE+\0\0\0\0`T\xD3,\0\0\0\0pi\x9E-\0\0\0\0`6\xB3.\0\0\0\0pK~/\0\0\0\0`\x18\x930\0\0\0\0\xF0gg1\0\0\0\0`\xFAr2\0\0\0\0\xF0IG3\0\0\0\0`\xDCR4\0\0\0\0\xF0+'5\0\0\0\0`\xBE26\0\0\0\0\xF0\r\x077\0\0\0\0\xE0\xDA\x1B8\0\0\0\0\xF0\xEF\xE68\0\0\0\0\xE0\xBC\xFB9\0\0\0\0\xF0\xD1\xC6:\0\0\0\0\xE0\x9E\xDB;\0\0\0\0p\xEE\xAF<\0\0\0\0\xE0\x80\xBB=\0\0\0\0p\xD0\x8F>\0\0\0\0\xE0b\x9B?\0\0\0\0p\xB2o@\0\0\0\0`\x7F\x84A\0\0\0\0p\x94OB\0\0\0\0`adC\0\0\0\0pv/D\0\0\0\0`CDE\0\0\0\0\xF0\xA8\xF3E\0\0\0\0\xE0_-G\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x9E\xBA\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFFAKST\0p\x81\xFF\xFF\xFF\xFF\xFF\xFF\x01AKDT\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0\xA8\x02\xFD\x02\xD1\xFD\xC2?\xFF\xFF\xFF\xFF\xD2O\x87}\xFF\xFF\xFF\xFF\xD0D\x89\xCB\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF@Pa\xD2\xFF\xFF\xFF\xFF\xB0U\xD2\xFA\xFF\xFF\xFF\xFFPq\xB8\xFE\xFF\xFF\xFF\xFF@T\xA8\xFF\xFF\xFF\xFF\xFFPS\x98\0\0\0\0\0@6\x88\x01\0\0\0\0P5x\x02\0\0\0\0\xC0Rq\x03\0\0\0\0\xD0Qa\x04\0\0\0\0\xC04Q\x05\0\0\0\0\xD03A\x06\0\0\0\0\xC0\x161\x07\0\0\0\0\xD0m\x8D\x07\0\0\0\0\xC0\xF8\x10\t\0\0\0\0P\xE9\xAD\t\0\0\0\0\xC0\xDA\xF0\n\0\0\0\0\xD0\xD9\xE0\x0B\0\0\0\0@\xF7\xD9\x0C\0\0\0\0\xD0\xBB\xC0\r\0\0\0\0@\xD9\xB9\x0E\0\0\0\0P\xD8\xA9\x0F\0\0\0\0@\xBB\x99\x10\0\0\0\0P\xBA\x89\x11\0\0\0\0@\x9Dy\x12\0\0\0\0P\x9Ci\x13\0\0\0\0@\x7FY\x14\0\0\0\0P~I\x15\0\0\0\0@a9\x16\0\0\0\0P`)\x17\0\0\0\0\xC0}\"\x18\0\0\0\0PB\t\x19\0\0\0\0\xC0_\x02\x1A\0\0\0\0\x10\x14+\x1A\0\0\0\0\xB0B\xF2\x1A\0\0\0\0\xA0%\xE2\x1B\0\0\0\0\xB0$\xD2\x1C\0\0\0\0\xA0\x07\xC2\x1D\0\0\0\0\xB0\x06\xB2\x1E\0\0\0\0\xA0\xE9\xA1\x1F\0\0\0\x0009v \0\0\0\0\xA0\xCB\x81!\0\0\0\x000\x1BV\"\0\0\0\0 \xE8j#\0\0\0\x000\xFD5$\0\0\0\0 \xCAJ%\0\0\0\x000\xDF\x15&\0\0\0\0 \xAC*'\0\0\0\0\xB0\xFB\xFE'\0\0\0\0 \x8E\n)\0\0\0\0\xB0\xDD\xDE)\0\0\0\0 p\xEA*\0\0\0\0\xB0\xBF\xBE+\0\0\0\0\xA0\x8C\xD3,\0\0\0\0\xB0\xA1\x9E-\0\0\0\0\xA0n\xB3.\0\0\0\0\xB0\x83~/\0\0\0\0\xA0P\x930\0\0\0\x000\xA0g1\0\0\0\0\xA02s2\0\0\0\x000\x82G3\0\0\0\0\xA0\x14S4\0\0\0\x000d'5\0\0\0\0\xA0\xF626\0\0\0\x000F\x077\0\0\0\0 \x13\x1C8\0\0\0\x000(\xE78\0\0\0\0 \xF5\xFB9\0\0\0\x000\n\xC7:\0\0\0\0 \xD7\xDB;\0\0\0\0\xB0&\xB0<\0\0\0\0 \xB9\xBB=\0\0\0\0\xB0\x08\x90>\0\0\0\0 \x9B\x9B?\0\0\0\0\xB0\xEAo@\0\0\0\0\xA0\xB7\x84A\0\0\0\0\xB0\xCCOB\0\0\0\0\xA0\x99dC\0\0\0\0\xB0\xAE/D\0\0\0\0\xA0{DE\0\0\0\x000\xE1\xF3E\0\0\0\0 \x98-G\0\0\0\0\x01\x02\x03\x03\x02\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04n\xB6\0\0\0\0\0\0\xEEd\xFF\xFF\xFF\xFF\xFF\xFFPe\xFF\xFF\xFF\xFF\xFF\xFF`s\xFF\xFF\xFF\xFF\xFF\xFFp\x81\xFF\xFF\xFF\xFF\xFF\xFF\x80\x8F\xFF\xFF\xFF\xFF\xFF\xFF-02\0\0\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\08\x01_\x01de\xAA\x96\xFF\xFF\xFF\xFF\xD0;\x0F\xB8\xFF\xFF\xFF\xFF\x902\xFD\xB8\xFF\xFF\xFF\xFF &\xF1\xB9\xFF\xFF\xFF\xFF\x10f\xDE\xBA\xFF\xFF\xFF\xFF \xA08\xDA\xFF\xFF\xFF\xFF \xEC\xEB\xDA\xFF\xFF\xFF\xFF\xA0\xD3\x19\xDC\xFF\xFF\xFF\xFF\x10K\xB9\xDC\xFF\xFF\xFF\xFF \x07\xFB\xDD\xFF\xFF\xFF\xFF\x10\xD0\x9B\xDE\xFF\xFF\xFF\xFF \x8C\xDD\xDF\xFF\xFF\xFF\xFF\x10%T\xE0\xFF\xFF\xFF\xFF\xA0\xF1\x97\xF4\xFF\xFF\xFF\xFF\x10P\x05\xF5\xFF\xFF\xFF\xFF V\xC0\xF6\xFF\xFF\xFF\xFF\x90\x10\x0E\xF7\xFF\xFF\xFF\xFF \x1EQ\xF8\xFF\xFF\xFF\xFF\x10\xB7\xC7\xF8\xFF\xFF\xFF\xFF\xA0\xC4\n\xFA\xFF\xFF\xFF\xFF\x90\xEA\xA8\xFA\xFF\xFF\xFF\xFF \xF8\xEB\xFB\xFF\xFF\xFF\xFF\x90o\x8B\xFC\xFF\xFF\xFF\xFF \x80\xC9\x1D\0\0\0\0\x90\xC9x\x1E\0\0\0\0\xA0'\xA0\x1F\0\0\0\0\x90\xC13 \0\0\0\0 [\x81!\0\0\0\0\x90\xBA\x0B\"\0\0\0\0\xA0\x02X#\0\0\0\0\x10b\xE2#\0\0\0\0\xA0\xE47%\0\0\0\0\x10\xB9\xD4%\0\0\0\0\xA0\xB8\xF67\0\0\0\0\x10w\xB88\0\0\0\0 \xD5\xDF9\0\0\0\0\x90\x01\xE99\0\0\0\0\xA0\xF1\xC8;\0\0\0\0\x90\0o<\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x9C\xE1\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFF\xF0\xF1\xFF\xFF\xFF\xFF\xFF\xFFCST\0\0\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\x01CDT\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0\0\x03a\x03\xB0\x0C\x04^\xFF\xFF\xFF\xFF\x90:\xA6\x9E\xFF\xFF\xFF\xFF\x80\x07\xBB\x9F\xFF\xFF\xFF\xFF\x90\x1C\x86\xA0\xFF\xFF\xFF\xFF\x80\xE9\x9A\xA1\xFF\xFF\xFF\xFF\x90\x0C\x89\xCB\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF\0\x18a\xD2\xFF\xFF\xFF\xFF\x10u\xF8\xFA\xFF\xFF\xFF\xFF\0X\xE8\xFB\xFF\xFF\xFF\xFF\x10W\xD8\xFC\xFF\xFF\xFF\xFF\0:\xC8\xFD\xFF\xFF\xFF\xFF\x109\xB8\xFE\xFF\xFF\xFF\xFF\0\x1C\xA8\xFF\xFF\xFF\xFF\xFF\x10\x1B\x98\0\0\0\0\0\0\xFE\x87\x01\0\0\0\0\x10\xFDw\x02\0\0\0\0\x80\x1Aq\x03\0\0\0\0\x90\x19a\x04\0\0\0\0\x80\xFCP\x05\0\0\0\0\x90\xFB@\x06\0\0\0\0\x80\xDE0\x07\0\0\0\0\x905\x8D\x07\0\0\0\0\x80\xC0\x10\t\0\0\0\0\x10\xB1\xAD\t\0\0\0\0\x80\xA2\xF0\n\0\0\0\0\x90\xA1\xE0\x0B\0\0\0\0\0\xBF\xD9\x0C\0\0\0\0\x90\x83\xC0\r\0\0\0\0\0\xA1\xB9\x0E\0\0\0\0\x10\xA0\xA9\x0F\0\0\0\0\0\x83\x99\x10\0\0\0\0\x10\x82\x89\x11\0\0\0\0\0ey\x12\0\0\0\0\x10di\x13\0\0\0\0\0GY\x14\0\0\0\0\x10FI\x15\0\0\0\0\0)9\x16\0\0\0\0\x10()\x17\0\0\0\0\x80E\"\x18\0\0\0\0\x10\n\t\x19\0\0\0\0\x80'\x02\x1A\0\0\0\0\x90&\xF2\x1A\0\0\0\0\x80\t\xE2\x1B\0\0\0\0\x90\x08\xD2\x1C\0\0\0\0\x80\xEB\xC1\x1D\0\0\0\0\x90\xEA\xB1\x1E\0\0\0\0\x80\xCD\xA1\x1F\0\0\0\0\x10\x1Dv \0\0\0\0\x80\xAF\x81!\0\0\0\0\x10\xFFU\"\0\0\0\0\0\xCCj#\0\0\0\0\x10\xE15$\0\0\0\0\0\xAEJ%\0\0\0\0\x10\xC3\x15&\0\0\0\0\0\x90*'\0\0\0\0\x90\xDF\xFE'\0\0\0\0\0r\n)\0\0\0\0\x90\xC1\xDE)\0\0\0\0\0T\xEA*\0\0\0\0\x90\xA3\xBE+\0\0\0\0\x80p\xD3,\0\0\0\0\x90\x85\x9E-\0\0\0\0\x80R\xB3.\0\0\0\0\x90g~/\0\0\0\0\x804\x930\0\0\0\0\x10\x84g1\0\0\0\0\x80\x16s2\0\0\0\0\x10fG3\0\0\0\0\x80\xF8R4\0\0\0\0\x10H'5\0\0\0\0\x80\xDA26\0\0\0\0\x10*\x077\0\0\0\0\0\xF7\x1B8\0\0\0\0\x10\x0C\xE78\0\0\0\0\0\xD9\xFB9\0\0\0\0\x10\xEE\xC6:\0\0\0\0\0\xBB\xDB;\0\0\0\0\x90\n\xB0<\0\0\0\0\0\x9D\xBB=\0\0\0\0\x90\xEC\x8F>\0\0\0\0\0\x7F\x9B?\0\0\0\0\x90\xCEo@\0\0\0\0\x80\x9B\x84A\0\0\0\0\x90\xB0OB\0\0\0\0\x80}dC\0\0\0\0\x90\x92/D\0\0\0\0\x80_DE\0\0\0\0\x10\xC5\xF3E\0\0\0\0\0|-G\0\0\0\0\x10\xA7\xD3G\0\0\0\0\0^\rI\0\0\0\0\x10\x89\xB3I\0\0\0\0\0@\xEDJ\0\0\0\0\x90\xA5\x9CK\0\0\0\0\x80\\\xD6L\0\0\0\0\x01\x02\x01\x02\x01\x02\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x02\x03\x95\xA0\xFF\xFF\xFF\xFF\xFF\xFF\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFFCST\0\0\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\x01CDT\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0\xD0\x02:\x03\xB0\x0C\x04^\xFF\xFF\xFF\xFF\x90:\xA6\x9E\xFF\xFF\xFF\xFF\x80\x07\xBB\x9F\xFF\xFF\xFF\xFF\x90\x1C\x86\xA0\xFF\xFF\xFF\xFF\x80\xE9\x9A\xA1\xFF\xFF\xFF\xFF\x90\x0C\x89\xCB\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF\0\x18a\xD2\xFF\xFF\xFF\xFF\x10u\xF8\xFA\xFF\xFF\xFF\xFF\0X\xE8\xFB\xFF\xFF\xFF\xFF\x10W\xD8\xFC\xFF\xFF\xFF\xFF\0:\xC8\xFD\xFF\xFF\xFF\xFF\x109\xB8\xFE\xFF\xFF\xFF\xFF\0\x1C\xA8\xFF\xFF\xFF\xFF\xFF\x10\x1B\x98\0\0\0\0\0\0\xFE\x87\x01\0\0\0\0\x10\xFDw\x02\0\0\0\0\x80\x1Aq\x03\0\0\0\0\x90\x19a\x04\0\0\0\0\x80\xFCP\x05\0\0\0\0\x90\xFB@\x06\0\0\0\0\x80\xDE0\x07\0\0\0\0\x905\x8D\x07\0\0\0\0\x80\xC0\x10\t\0\0\0\0\x10\xB1\xAD\t\0\0\0\0\x80\xA2\xF0\n\0\0\0\0\x90\xA1\xE0\x0B\0\0\0\0\0\xBF\xD9\x0C\0\0\0\0\x90\x83\xC0\r\0\0\0\0\0\xA1\xB9\x0E\0\0\0\0\x10\xA0\xA9\x0F\0\0\0\0\0\x83\x99\x10\0\0\0\0\x10\x82\x89\x11\0\0\0\0\0ey\x12\0\0\0\0\x10di\x13\0\0\0\0\0GY\x14\0\0\0\0\x10FI\x15\0\0\0\0\0)9\x16\0\0\0\0\x10()\x17\0\0\0\0\x80E\"\x18\0\0\0\0\x10\n\t\x19\0\0\0\0\x80'\x02\x1A\0\0\0\0\x90&\xF2\x1A\0\0\0\0\x80\t\xE2\x1B\0\0\0\0\x90\x08\xD2\x1C\0\0\0\0\x80\xEB\xC1\x1D\0\0\0\0\x90\xEA\xB1\x1E\0\0\0\0\x80\xCD\xA1\x1F\0\0\0\0\x10\x1Dv \0\0\0\0\x80\xAF\x81!\0\0\0\0\x10\xFFU\"\0\0\0\0\0\xCCj#\0\0\0\0\x10\xE15$\0\0\0\0\0\xAEJ%\0\0\0\0\x10\xC3\x15&\0\0\0\0\0\x90*'\0\0\0\0\x90\xDF\xFE'\0\0\0\0\0r\n)\0\0\0\0\x90\xC1\xDE)\0\0\0\0\0T\xEA*\0\0\0\0\x80\x95\xBE+\0\0\0\0pb\xD3,\0\0\0\0\x80w\x9E-\0\0\0\0pD\xB3.\0\0\0\0\x80Y~/\0\0\0\0p&\x930\0\0\0\0\0vg1\0\0\0\0p\x08s2\0\0\0\0\0XG3\0\0\0\0p\xEAR4\0\0\0\0\0:'5\0\0\0\0p\xCC26\0\0\0\0\0\x1C\x077\0\0\0\0\xF0\xE8\x1B8\0\0\0\0\0\xFE\xE68\0\0\0\0\xF0\xCA\xFB9\0\0\0\0\0\xE0\xC6:\0\0\0\0\xF0\xAC\xDB;\0\0\0\0\x80\xFC\xAF<\0\0\0\0\xF0\x8E\xBB=\0\0\0\0\x80\xDE\x8F>\0\0\0\0\xF0p\x9B?\0\0\0\0\x80\xC0o@\0\0\0\0p\x8D\x84A\0\0\0\0\x80\xA2OB\0\0\0\0podC\0\0\0\0\x80\x84/D\0\0\0\0pQDE\0\0\0\0\0\xB7\xF3E\0\0\0\0\xF0m-G\0\0\0\0\x01\x02\x01\x02\x01\x02\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x08\xA1\xFF\xFF\xFF\xFF\xFF\xFF\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFFCST\0\0\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\x01CDT\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0\xD0\x02/\x03\xB0\x0C\x04^\xFF\xFF\xFF\xFF\x90:\xA6\x9E\xFF\xFF\xFF\xFF\x80\x07\xBB\x9F\xFF\xFF\xFF\xFF\x90\x1C\x86\xA0\xFF\xFF\xFF\xFF\x80\xE9\x9A\xA1\xFF\xFF\xFF\xFF\x90\x0C\x89\xCB\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF\0\x18a\xD2\xFF\xFF\xFF\xFF\x10u\xF8\xFA\xFF\xFF\xFF\xFF\0X\xE8\xFB\xFF\xFF\xFF\xFF\x10W\xD8\xFC\xFF\xFF\xFF\xFF\0:\xC8\xFD\xFF\xFF\xFF\xFF\x109\xB8\xFE\xFF\xFF\xFF\xFF\0\x1C\xA8\xFF\xFF\xFF\xFF\xFF\x10\x1B\x98\0\0\0\0\0\0\xFE\x87\x01\0\0\0\0\x10\xFDw\x02\0\0\0\0\x80\x1Aq\x03\0\0\0\0\x90\x19a\x04\0\0\0\0\x80\xFCP\x05\0\0\0\0\x90\xFB@\x06\0\0\0\0\x80\xDE0\x07\0\0\0\0\x905\x8D\x07\0\0\0\0\x80\xC0\x10\t\0\0\0\0\x10\xB1\xAD\t\0\0\0\0\x80\xA2\xF0\n\0\0\0\0\x90\xA1\xE0\x0B\0\0\0\0\0\xBF\xD9\x0C\0\0\0\0\x90\x83\xC0\r\0\0\0\0\0\xA1\xB9\x0E\0\0\0\0\x10\xA0\xA9\x0F\0\0\0\0\0\x83\x99\x10\0\0\0\0\x10\x82\x89\x11\0\0\0\0\0ey\x12\0\0\0\0\x10di\x13\0\0\0\0\0GY\x14\0\0\0\0\x10FI\x15\0\0\0\0\0)9\x16\0\0\0\0\x10()\x17\0\0\0\0\x80E\"\x18\0\0\0\0\x10\n\t\x19\0\0\0\0\x80'\x02\x1A\0\0\0\0\x90&\xF2\x1A\0\0\0\0\x80\t\xE2\x1B\0\0\0\0\x90\x08\xD2\x1C\0\0\0\0\x80\xEB\xC1\x1D\0\0\0\0\x90\xEA\xB1\x1E\0\0\0\0\x80\xCD\xA1\x1F\0\0\0\0\x10\x1Dv \0\0\0\0\x80\xAF\x81!\0\0\0\0\x10\xFFU\"\0\0\0\0\0\xCCj#\0\0\0\0\x10\xE15$\0\0\0\0\0\xAEJ%\0\0\0\0\x10\xC3\x15&\0\0\0\0\0\x90*'\0\0\0\0\x90\xDF\xFE'\0\0\0\0\0r\n)\0\0\0\0\x90\xC1\xDE)\0\0\0\0\0T\xEA*\0\0\0\0\x90\xA3\xBE+\0\0\0\0\x80p\xD3,\0\0\0\0\x90\x85\x9E-\0\0\0\0\x80R\xB3.\0\0\0\0\x90g~/\0\0\0\0\x804\x930\0\0\0\0\x10\x84g1\0\0\0\0\x80\x16s2\0\0\0\0\x10fG3\0\0\0\0\x80\xF8R4\0\0\0\0\x10H'5\0\0\0\0\x80\xDA26\0\0\0\0\x10*\x077\0\0\0\0\0\xF7\x1B8\0\0\0\0\x10\x0C\xE78\0\0\0\0\0\xD9\xFB9\0\0\0\0\x10\xEE\xC6:\0\0\0\0\0\xBB\xDB;\0\0\0\0\x90\n\xB0<\0\0\0\0\0\x9D\xBB=\0\0\0\0\x90\xEC\x8F>\0\0\0\0\0\x7F\x9B?\0\0\0\0\x80\xC0o@\0\0\0\0p\x8D\x84A\0\0\0\0\x80\xA2OB\0\0\0\0podC\0\0\0\0\x80\x84/D\0\0\0\0pQDE\0\0\0\0\0\xB7\xF3E\0\0\0\0\xF0m-G\0\0\0\0\x01\x02\x01\x02\x01\x02\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\xED\xA0\xFF\xFF\xFF\xFF\xFF\xFF\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF-02\0\0\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFF\x01-01\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\0\xF0\xF1\xFF\xFF\xFF\xFF\xFF\xFF\x02\0\0\0\x01\n\x05\0\0\0\0\0\0\0\0\0\xC0\x02\x19\x03\0h\x80\x9B\xFF\xFF\xFF\xFFP|M\x13\0\0\0\0\x90\xFA3\x14\0\0\0\0\x90\xEB#\x15\0\0\0\0\x90\xDC\x13\x16\0\0\0\0\x90\xCD\x03\x17\0\0\0\0\x90\xBE\xF3\x17\0\0\0\0\x90\xAF\xE3\x18\0\0\0\0\x90\xA0\xD3\x19\0\0\0\0\x90\x91\xC3\x1A\0\0\0\0\x10\xBD\xBC\x1B\0\0\0\0\x10\xAE\xAC\x1C\0\0\0\0\x10\x9F\x9C\x1D\0\0\0\0\x10\x90\x8C\x1E\0\0\0\0\x10\x81|\x1F\0\0\0\0\x10rl \0\0\0\0\x10c\\!\0\0\0\0\x10TL\"\0\0\0\0\x10E<#\0\0\0\0\x106,$\0\0\0\0\x10'\x1C%\0\0\0\0\x10\x18\x0C&\0\0\0\0\x90C\x05'\0\0\0\0\x904\xF5'\0\0\0\0\x90%\xE5(\0\0\0\0\x90\x16\xD5)\0\0\0\0\x90\x07\xC5*\0\0\0\0\x90\xF8\xB4+\0\0\0\0\x90\xE9\xA4,\0\0\0\0\x90\xDA\x94-\0\0\0\0\x90\xCB\x84.\0\0\0\0\x90\xBCt/\0\0\0\0\x90\xADd0\0\0\0\0\x10\xD9]1\0\0\0\0\x10\xB4r2\0\0\0\0\x10\xBB=3\0\0\0\0\x10\x96R4\0\0\0\0\x10\x9D\x1D5\0\0\0\0\x10x26\0\0\0\0\x10\x7F\xFD6\0\0\0\0\x90\x94\x1B8\0\0\0\0\x10a\xDD8\0\0\0\0\x90v\xFB9\0\0\0\0\x10C\xBD:\0\0\0\0\x90X\xDB;\0\0\0\0\x90_\xA6<\0\0\0\0\x90:\xBB=\0\0\0\0\x90A\x86>\0\0\0\0\x90\x1C\x9B?\0\0\0\0\x90#f@\0\0\0\0\x109\x84A\0\0\0\0\x90\x05FB\0\0\0\0\x10\x1BdC\0\0\0\0\x90\xE7%D\0\0\0\0\x10\xFDCE\0\0\0\0\x90\xC9\x05F\0\0\0\0\x10\xDF#G\0\0\0\0\x10\xE6\xEEG\0\0\0\0\x10\xC1\x03I\0\0\0\0\x10\xC8\xCEI\0\0\0\0\x10\xA3\xE3J\0\0\0\0\x10\xAA\xAEK\0\0\0\0\x90\xBF\xCCL\0\0\0\0\x10\x8C\x8EM\0\0\0\0\x90\xA1\xACN\0\0\0\0\x10nnO\0\0\0\0\x90\x83\x8CP\0\0\0\0\x90\x8AWQ\0\0\0\0\x90elR\0\0\0\0\x90l7S\0\0\0\0\x90GLT\0\0\0\0\x90N\x17U\0\0\0\0\x90),V\0\0\0\0\x900\xF7V\0\0\0\0\x10F\x15X\0\0\0\0\x90\x12\xD7X\0\0\0\0\x10(\xF5Y\0\0\0\0\x90\xF4\xB6Z\0\0\0\0\x10\n\xD5[\0\0\0\0\x10\x11\xA0\\\0\0\0\0\x10\xEC\xB4]\0\0\0\0\x10\xF3\x7F^\0\0\0\0\x10\xCE\x94_\0\0\0\0\x10\xD5_`\0\0\0\0\x90\xEA}a\0\0\0\0\x10\xB7?b\0\0\0\0\x90\xCC]c\0\0\0\0\x10\x99\x1Fd\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x80\xCF\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFFCST\0\0\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\x01CDT\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0\xE0\x01:\x02p\xE8\xB6\xA5\xFF\xFF\xFF\xFFp+\xF1\xAF\xFF\xFF\xFF\xFF`Vf\xB6\xFF\xFF\xFF\xFFp=A\xB7\xFF\xFF\xFF\xFF`6\x0C\xB8\xFF\xFF\xFF\xFF\xF0\x86\xFD\xB8\xFF\xFF\xFF\xFF\0vg1\0\0\0\0p\x08s2\0\0\0\0\0XG3\0\0\0\0p\xEAR4\0\0\0\0\x10H'5\0\0\0\0\x80\xDA26\0\0\0\0\x10*\x077\0\0\0\0\0\xF7\x1B8\0\0\0\0\x10\x0C\xE78\0\0\0\0\0\xD9\xFB9\0\0\0\0\x90\x12\xF5:\0\0\0\0\0\xD1\xB6;\0\0\0\0\x90\n\xB0<\0\0\0\0\0\x9D\xBB=\0\0\0\0\x90\xEC\x8F>\0\0\0\0\0\x7F\x9B?\0\0\0\0\x90\xCEo@\0\0\0\0\x80\x9B\x84A\0\0\0\0\x90\xB0OB\0\0\0\0\x80}dC\0\0\0\0\x90\x92/D\0\0\0\0\x80_DE\0\0\0\0\x90t\x0FF\0\0\0\0\x80A$G\0\0\0\0\x10\x91\xF8G\0\0\0\0\x80#\x04I\0\0\0\0\x10s\xD8I\0\0\0\0\x80\x05\xE4J\0\0\0\0\x90\xA5\x9CK\0\0\0\0\x80\\\xD6L\0\0\0\0\x90\x87|M\0\0\0\0\x80>\xB6N\0\0\0\0\x90i\\O\0\0\0\0\x80 \x96P\0\0\0\0\x90K\x05\0\0\0\0\xB0\r\0\x06\0\0\0\0@\xBC\x0B\x07\0\0\0\0\xB0\xEF\xDF\x07\0\0\0\0@\x13\xFE\x08\0\0\0\0\xB0\xD1\xBF\t\0\0\0\0@\xF5\xDD\n\0\0\0\x000\xEE\xA8\x0B\0\0\0\0@\xD7\xBD\x0C\0\0\0\x000\xD0\x88\r\0\0\0\0@\xB9\x9D\x0E\0\0\0\x000\xB2h\x0F\0\0\0\0\xC0\xD5\x86\x10\0\0\0\x000\x94H\x11\0\0\0\0\xC0\xB7f\x12\0\0\0\x000v(\x13\0\0\0\0\xC0\x99F\x14\0\0\0\0\xB0\x92\x11\x15\0\0\0\0\xC0{&\x16\0\0\0\0\xB0t\xF1\x16\0\0\0\0\xC0]\x06\x18\0\0\0\0\xB0V\xD1\x18\0\0\0\0\xC0?\xE6\x19\0\0\0\0\xB08\xB1\x1A\0\0\0\0@\\\xCF\x1B\0\0\0\0\xB0\x1A\x91\x1C\0\0\0\0@>\xAF\x1D\0\0\0\0\xB0\xFCp\x1E\0\0\0\0@ \x8F\x1F\0\0\0\x000\x03\x7F \0\0\0\0@\x02o!\0\0\0\x000\xFB9\"\0\0\0\0@\xE4N#\0\0\0\x000\xDD\x19$\0\0\0\0\xC0\08%\0\0\0\x000\xBF\xF9%\0\0\0\0\xC0\xF8\xF2&\0\0\0\x000\xA1\xD9'\0\0\0\0\xC0\xC4\xF7(\0\0\0\0\xB0\xBD\xC2)\0\0\0\0\xC0\xA6\xD7*\0\0\0\0\xB0\x9F\xA2+\0\0\0\0\xC0\x88\xB7,\0\0\0\0\xB0\x81\x82-\0\0\0\0\xC0j\x97.\0\0\0\0\xB0cb/\0\0\0\0@\x87\x800\0\0\0\0\xB0EB1\0\0\0\0@i`2\0\0\0\x000\xD7=3\0\0\0\0@K@4\0\0\0\x000D\x0B5\0\0\0\0@\xB8\r6\0\0\0\0\xB0\xD5\x067\0\0\0\0@\x0F\08\0\0\0\x000\x08\xCB8\0\0\0\0\xC0+\xE99\0\0\0\x000\xEA\xAA:\0\0\0\0\xC0\r\xC9;\0\0\0\x000\xCC\x8A<\0\0\0\0\xC0\xEF\xA8=\0\0\0\x000\xAEj>\0\0\0\0\xC0\xD1\x88?\0\0\0\0\xB0\xCAS@\0\0\0\0\xC0\xB3hA\0\0\0\0\xB0\xAC3B\0\0\0\0\xC0\x95HC\0\0\0\0\xB0\x8E\x13D\0\0\0\0@\xB21E\0\0\0\0\xB0p\xF3E\0\0\0\0@\x94\x11G\0\0\0\x000\x02\xEFG\0\0\0\0@v\xF1H\0\0\0\x000o\xBCI\0\0\0\0@X\xD1J\0\0\0\0\xB0\0\xB8K\0\0\0\0@:\xB1L\0\0\0\x000\x07\xC6M\0\0\0\0\xC0\x82PN\0\0\0\0\xB0\xAE\x9CO\0\0\0\0\xC0\xD9BP\0\0\0\0\xB0\x90|Q\0\0\0\0@\xF6+R\0\0\0\0\xB0r\\S\0\0\0\0@\xD8\x0BT\0\0\0\x000\xE67W\0\0\0\0\xC0\xEC\xAFW\0\0\0\0\xB0\x86CX\0\0\0\0\x01\x02\x01\x03\x01\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x03\x04\x02\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x05\x06\x84\xBD\xFF\xFF\xFF\xFF\xFF\xFF\xBB\xBD\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFFCST\0\0\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\x01CDT\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0H\x02\x99\x02\0n\x8C\xE7\xFF\xFF\xFF\xFF\x80\x0Ba\x04\0\0\0\0p\xEEP\x05\0\0\0\0\x80\xED@\x06\0\0\0\0p\xD00\x07\0\0\0\0\x80\xCF \x08\0\0\0\0p\xB2\x10\t\0\0\0\0\x80\xB1\0\n\0\0\0\0p\x94\xF0\n\0\0\0\0\x80\x93\xE0\x0B\0\0\0\0\xF0\xB0\xD9\x0C\0\0\0\0\x80u\xC0\r\0\0\0\0\xF0\x92\xB9\x0E\0\0\0\0\0\x92\xA9\x0F\0\0\0\0\xF0t\x99\x10\0\0\0\0\0t\x89\x11\0\0\0\0\xF0Vy\x12\0\0\0\0\0Vi\x13\0\0\0\0\xF08Y\x14\0\0\0\0\08I\x15\0\0\0\0\xF0\x1A9\x16\0\0\0\0\0\x1A)\x17\0\0\0\0p7\"\x18\0\0\0\0\0\xFC\x08\x19\0\0\0\0p\x19\x02\x1A\0\0\0\0\x80\x18\xF2\x1A\0\0\0\0p\xFB\xE1\x1B\0\0\0\0\x80\xFA\xD1\x1C\0\0\0\0p\xDD\xC1\x1D\0\0\0\0\x80\xDC\xB1\x1E\0\0\0\0p\xBF\xA1\x1F\0\0\0\0\0\x0Fv \0\0\0\0p\xA1\x81!\0\0\0\0\0\xF1U\"\0\0\0\0\xF0\xBDj#\0\0\0\0\0\xD35$\0\0\0\0\xF0\x9FJ%\0\0\0\0\0\xB5\x15&\0\0\0\0\xF0\x81*'\0\0\0\0\x80\xD1\xFE'\0\0\0\0\xF0c\n)\0\0\0\0\x80\xB3\xDE)\0\0\0\0\xF0E\xEA*\0\0\0\0\x80\x95\xBE+\0\0\0\0pb\xD3,\0\0\0\0\x80w\x9E-\0\0\0\0pD\xB3.\0\0\0\0\x80Y~/\0\0\0\0p&\x930\0\0\0\0\0vg1\0\0\0\0p\x08s2\0\0\0\0\0XG3\0\0\0\0p\xEAR4\0\0\0\0\0:'5\0\0\0\0p\xCC26\0\0\0\0\0\x1C\x077\0\0\0\0\xF0\xE8\x1B8\0\0\0\0\0\xFE\xE68\0\0\0\0\xF0\xCA\xFB9\0\0\0\0\0\xE0\xC6:\0\0\0\0\xF0\xAC\xDB;\0\0\0\0\x80\xFC\xAF<\0\0\0\0\xF0\x8E\xBB=\0\0\0\0\x80\xDE\x8F>\0\0\0\0\xF0p\x9B?\0\0\0\0\x80\xC0o@\0\0\0\0p\x8D\x84A\0\0\0\0\x80\xA2OB\0\0\0\0podC\0\0\0\0\x80\x84/D\0\0\0\0pQDE\0\0\0\0\0\xB7\xF3E\0\0\0\0\xF0m-G\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x02\x03\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\0\0\0\0\0\0\0\0\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF-03\0\0\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\08\x01_\x01\xB8g\xAA\x96\xFF\xFF\xFF\xFF\xE0I\x0F\xB8\xFF\xFF\xFF\xFF\xA0@\xFD\xB8\xFF\xFF\xFF\xFF04\xF1\xB9\xFF\xFF\xFF\xFF t\xDE\xBA\xFF\xFF\xFF\xFF0\xAE8\xDA\xFF\xFF\xFF\xFF0\xFA\xEB\xDA\xFF\xFF\xFF\xFF\xB0\xE1\x19\xDC\xFF\xFF\xFF\xFF Y\xB9\xDC\xFF\xFF\xFF\xFF0\x15\xFB\xDD\xFF\xFF\xFF\xFF \xDE\x9B\xDE\xFF\xFF\xFF\xFF0\x9A\xDD\xDF\xFF\xFF\xFF\xFF 3T\xE0\xFF\xFF\xFF\xFF\xB0\xFF\x97\xF4\xFF\xFF\xFF\xFF ^\x05\xF5\xFF\xFF\xFF\xFF0d\xC0\xF6\xFF\xFF\xFF\xFF\xA0\x1E\x0E\xF7\xFF\xFF\xFF\xFF0,Q\xF8\xFF\xFF\xFF\xFF \xC5\xC7\xF8\xFF\xFF\xFF\xFF\xB0\xD2\n\xFA\xFF\xFF\xFF\xFF\xA0\xF8\xA8\xFA\xFF\xFF\xFF\xFF0\x06\xEC\xFB\xFF\xFF\xFF\xFF\xA0}\x8B\xFC\xFF\xFF\xFF\xFF0\x8E\xC9\x1D\0\0\0\0\xA0\xD7x\x1E\0\0\0\0\xB05\xA0\x1F\0\0\0\0\xA0\xCF3 \0\0\0\x000i\x81!\0\0\0\0\xA0\xC8\x0B\"\0\0\0\0\xB0\x10X#\0\0\0\0 p\xE2#\0\0\0\0\xB0\xF27%\0\0\0\0 \xC7\xD4%\0\0\0\0\xB0\xC6\xF67\0\0\0\0 \x85\xB88\0\0\0\x000\xE3\xDF9\0\0\0\0\xA0\x0F\xE99\0\0\0\0\xB0\xFF\xC8;\0\0\0\0\xA0\x0Eo<\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01H\xDF\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFFCST\0\0\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xA8\x01\xDE\x01\x1C\x93\xFD\x86\xFF\xFF\xFF\xFF\x90\xAF\xB8\x9E\xFF\xFF\xFF\xFF\x80\x07\xBB\x9F\xFF\xFF\xFF\xFF\xF0Oe\xB5\xFF\xFF\xFF\xFF\xE0H0\xB6\xFF\xFF\xFF\xFF\xF01E\xB7\xFF\xFF\xFF\xFF\xE0*\x10\xB8\xFF\xFF\xFF\xFF\xF0\x13%\xB9\xFF\xFF\xFF\xFF\xE0\x0C\xF0\xB9\xFF\xFF\xFF\xFFp0\x0E\xBB\xFF\xFF\xFF\xFF\xE0\xEE\xCF\xBB\xFF\xFF\xFF\xFFp\x12\xEE\xBC\xFF\xFF\xFF\xFF`\x0B\xB9\xBD\xFF\xFF\xFF\xFF\xF0\x08r\xC2\xFF\xFF\xFF\xFF\xE0\xEBa\xC3\xFF\xFF\xFF\xFF\xF0\xEAQ\xC4\xFF\xFF\xFF\xFF`\x938\xC5\xFF\xFF\xFF\xFF\xF0\xCC1\xC6\xFF\xFF\xFF\xFF\xE0\xAF!\xC7\xFF\xFF\xFF\xFFp\xE9\x1A\xC8\xFF\xFF\xFF\xFF`\xCC\n\xC9\xFF\xFF\xFF\xFFp\xCB\xFA\xC9\xFF\xFF\xFF\xFF`\xAE\xEA\xCA\xFF\xFF\xFF\xFF\x90\x0C\x89\xCB\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF\0\x18a\xD2\xFF\xFF\xFF\xFF\x10\x8Cc\xD3\xFF\xFF\xFF\xFF\0oS\xD4\xFF\xFF\xFF\xFF\x10\xE3U\xD5\xFF\xFF\xFF\xFF\0\xDC \xD6\xFF\xFF\xFF\xFF\x10\xC55\xD7\xFF\xFF\xFF\xFF\0\xBE\0\xD8\xFF\xFF\xFF\xFF\x10\xA7\x15\xD9\xFF\xFF\xFF\xFF\0\xA0\xE0\xD9\xFF\xFF\xFF\xFF\x90\xC3\xFE\xDA\xFF\xFF\xFF\xFF\0\x82\xC0\xDB\xFF\xFF\xFF\xFF\x90\xA5\xDE\xDC\xFF\xFF\xFF\xFF\x80\x9E\xA9\xDD\xFF\xFF\xFF\xFF\x90\x87\xBE\xDE\xFF\xFF\xFF\xFF\x80\x80\x89\xDF\xFF\xFF\xFF\xFF\x90i\x9E\xE0\xFF\xFF\xFF\xFF\x80bi\xE1\xFF\xFF\xFF\xFF\x90K~\xE2\xFF\xFF\xFF\xFF\x80DI\xE3\xFF\xFF\xFF\xFF\x90-^\xE4\xFF\xFF\xFF\xFF\x80&)\xE5\xFF\xFF\xFF\xFF\x10JG\xE6\xFF\xFF\xFF\xFF\0C\x12\xE7\xFF\xFF\xFF\xFF\x10,'\xE8\xFF\xFF\xFF\xFF\0%\xF2\xE8\xFF\xFF\xFF\xFF\x10\xF0\xE6\xEB\xFF\xFF\xFF\xFF\0\xD3\xD6\xEC\xFF\xFF\xFF\xFF\x10\xD2\xC6\xED\xFF\xFF\xFF\xFF\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\xE4\x9D\xFF\xFF\xFF\xFF\xFF\xFF\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFFCST\0\0\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\x01CDT\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0H\x02\x9A\x02\x80\x81\xFB\xD5\xFF\xFF\xFF\xFF\x80\x0Ba\x04\0\0\0\0p\xEEP\x05\0\0\0\0\x80\xED@\x06\0\0\0\0p\xD00\x07\0\0\0\0\x80\xCF \x08\0\0\0\0p\xB2\x10\t\0\0\0\0\x80\xB1\0\n\0\0\0\0p\x94\xF0\n\0\0\0\0\x80\x93\xE0\x0B\0\0\0\0\xF0\xB0\xD9\x0C\0\0\0\0\x80u\xC0\r\0\0\0\0\xF0\x92\xB9\x0E\0\0\0\0\0\x92\xA9\x0F\0\0\0\0\xF0t\x99\x10\0\0\0\0\0t\x89\x11\0\0\0\0\xF0Vy\x12\0\0\0\0\0Vi\x13\0\0\0\0\xF08Y\x14\0\0\0\0\08I\x15\0\0\0\0\xF0\x1A9\x16\0\0\0\0\0\x1A)\x17\0\0\0\0p7\"\x18\0\0\0\0\0\xFC\x08\x19\0\0\0\0p\x19\x02\x1A\0\0\0\0\x80\x18\xF2\x1A\0\0\0\0p\xFB\xE1\x1B\0\0\0\0\x80\xFA\xD1\x1C\0\0\0\0p\xDD\xC1\x1D\0\0\0\0\x80\xDC\xB1\x1E\0\0\0\0p\xBF\xA1\x1F\0\0\0\0\0\x0Fv \0\0\0\0p\xA1\x81!\0\0\0\0\0\xF1U\"\0\0\0\0\xF0\xBDj#\0\0\0\0\0\xD35$\0\0\0\0\xF0\x9FJ%\0\0\0\0\0\xB5\x15&\0\0\0\0\xF0\x81*'\0\0\0\0\x80\xD1\xFE'\0\0\0\0\xF0c\n)\0\0\0\0\x80\xB3\xDE)\0\0\0\0\xF0E\xEA*\0\0\0\0\x80\x95\xBE+\0\0\0\0pb\xD3,\0\0\0\0\x80w\x9E-\0\0\0\0pD\xB3.\0\0\0\0\x80Y~/\0\0\0\0p&\x930\0\0\0\0\0vg1\0\0\0\0p\x08s2\0\0\0\0\0XG3\0\0\0\0p\xEAR4\0\0\0\0\0:'5\0\0\0\0p\xCC26\0\0\0\0\0\x1C\x077\0\0\0\0\xF0\xE8\x1B8\0\0\0\0\0\xFE\xE68\0\0\0\0\xF0\xCA\xFB9\0\0\0\0\0\xE0\xC6:\0\0\0\0\xF0\xAC\xDB;\0\0\0\0\x80\xFC\xAF<\0\0\0\0\xF0\x8E\xBB=\0\0\0\0\x80\xDE\x8F>\0\0\0\0\xF0p\x9B?\0\0\0\0\x80\xC0o@\0\0\0\0p\x8D\x84A\0\0\0\0\x80\xA2OB\0\0\0\0podC\0\0\0\0\x80\x84/D\0\0\0\0pQDE\0\0\0\0\0\xB7\xF3E\0\0\0\0\xF0m-G\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x02\x03\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x02\x03\x02\x03\x01\0\0\0\0\0\0\0\0\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF-05\0\0\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xF8\0\x18\x01\x90\x86\xAA\x96\xFF\xFF\xFF\xFF\0f\x0F\xB8\xFF\xFF\xFF\xFF\xC0\\\xFD\xB8\xFF\xFF\xFF\xFFPP\xF1\xB9\xFF\xFF\xFF\xFF@\x90\xDE\xBA\xFF\xFF\xFF\xFFP\xCA8\xDA\xFF\xFF\xFF\xFFP\x16\xEC\xDA\xFF\xFF\xFF\xFF\xD0\xFD\x19\xDC\xFF\xFF\xFF\xFF@u\xB9\xDC\xFF\xFF\xFF\xFFP1\xFB\xDD\xFF\xFF\xFF\xFF@\xFA\x9B\xDE\xFF\xFF\xFF\xFFP\xB6\xDD\xDF\xFF\xFF\xFF\xFF@OT\xE0\xFF\xFF\xFF\xFF\xD0\x1B\x98\xF4\xFF\xFF\xFF\xFF@z\x05\xF5\xFF\xFF\xFF\xFFP\x80\xC0\xF6\xFF\xFF\xFF\xFF\xC0:\x0E\xF7\xFF\xFF\xFF\xFFPHQ\xF8\xFF\xFF\xFF\xFF@\xE1\xC7\xF8\xFF\xFF\xFF\xFF\xD0\xEE\n\xFA\xFF\xFF\xFF\xFF\xC0\x14\xA9\xFA\xFF\xFF\xFF\xFFP\"\xEC\xFB\xFF\xFF\xFF\xFF\xC0\x99\x8B\xFC\xFF\xFF\xFF\xFFP\xAA\xC9\x1D\0\0\0\0\xC0\xF3x\x1E\0\0\0\0\xD0Q\xA0\x1F\0\0\0\0\xC0\xEB3 \0\0\0\0P\x85\x81!\0\0\0\0\xC0\xE4\x0B\"\0\0\0\0P\x7F`H\0\0\0\0\xC0\x04\x7FR\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x01p\xC0\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF-03\0\0\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xF0\0\x0F\x01Hz\xAA\x96\xFF\xFF\xFF\xFF\xF0W\x0F\xB8\xFF\xFF\xFF\xFF\xB0N\xFD\xB8\xFF\xFF\xFF\xFF@B\xF1\xB9\xFF\xFF\xFF\xFF0\x82\xDE\xBA\xFF\xFF\xFF\xFF@\xBC8\xDA\xFF\xFF\xFF\xFF@\x08\xEC\xDA\xFF\xFF\xFF\xFF\xC0\xEF\x19\xDC\xFF\xFF\xFF\xFF0g\xB9\xDC\xFF\xFF\xFF\xFF@#\xFB\xDD\xFF\xFF\xFF\xFF0\xEC\x9B\xDE\xFF\xFF\xFF\xFF@\xA8\xDD\xDF\xFF\xFF\xFF\xFF0AT\xE0\xFF\xFF\xFF\xFF\xC0\r\x98\xF4\xFF\xFF\xFF\xFF0l\x05\xF5\xFF\xFF\xFF\xFF@r\xC0\xF6\xFF\xFF\xFF\xFF\xB0,\x0E\xF7\xFF\xFF\xFF\xFF@:Q\xF8\xFF\xFF\xFF\xFF0\xD3\xC7\xF8\xFF\xFF\xFF\xFF\xC0\xE0\n\xFA\xFF\xFF\xFF\xFF\xB0\x06\xA9\xFA\xFF\xFF\xFF\xFF@\x14\xEC\xFB\xFF\xFF\xFF\xFF\xB0\x8B\x8B\xFC\xFF\xFF\xFF\xFF@\x9C\xC9\x1D\0\0\0\0\xB0\xE5x\x1E\0\0\0\0\xC0C\xA0\x1F\0\0\0\0\xB0\xDD3 \0\0\0\0@w\x81!\0\0\0\0\xB0\xD6\x0B\"\0\0\0\0@q`H\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\xB8\xCC\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF-04\0\0\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\x01-03\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\t\x01\0\0\0\0\0\0\0\0\0\x02\0\0\0\x01\x04\x01\0\0\0\0\0\0\0\0\0 \x04\xE3\x04\xC5\x1D\x87i\xFF\xFF\xFF\xFFEG0\x8F\xFF\xFF\xFF\xFFP\xE5\\\x9B\xFF\xFF\xFF\xFF\xC5\xE2|\x9F\xFF\xFF\xFF\xFF\xC0q\0\xA1\xFF\xFF\xFF\xFF\xC5w^\xB0\xFF\xFF\xFF\xFF\xD0{^\xB0\xFF\xFF\xFF\xFF@=w\xB1\xFF\xFF\xFF\xFF\xD0\0A\xB2\xFF\xFF\xFF\xFF\xC0pX\xB3\xFF\xFF\xFF\xFFP4\"\xB4\xFF\xFF\xFF\xFF@\xA49\xB5\xFF\xFF\xFF\xFF\xD0g\x03\xB6\xFF\xFF\xFF\xFF\xC0\xD7\x1A\xB7\xFF\xFF\xFF\xFFP\x9B\xE4\xB7\xFF\xFF\xFF\xFF\xC0\\\xFD\xB8\xFF\xFF\xFF\xFFP \xC7\xB9\xFF\xFF\xFF\xFF@n\x1C\xCC\xFF\xFF\xFF\xFF\xD0\xE7l\xCC\xFF\xFF\xFF\xFF\xC0\x8F\xDC\xD3\xFF\xFF\xFF\xFF0\xD5\x17\xD4\xFF\xFF\xFF\xFF\xC0U3\xD5\xFF\xFF\xFF\xFF@\x92v\xD5\xFF\xFF\xFF\xFF@<\xD1\xFD\xFF\xFF\xFF\xFF\xB0\xFA\x92\xFE\xFF\xFF\xFF\xFF\xC0\xCD\xCC\xFF\xFF\xFF\xFF\xFF\xB0\xDCr\0\0\0\0\0\xC0Pu\x01\0\0\0\0\xB0I@\x02\0\0\0\0\xC02U\x03\0\0\0\0\xB0+ \x04\0\0\0\0@O>\x05\0\0\0\0\xB0\r\0\x06\0\0\0\0@\xBC\x0B\x07\0\0\0\0\xB0\xEF\xDF\x07\0\0\0\0@\x13\xFE\x08\0\0\0\0\xB0\xD1\xBF\t\0\0\0\0@\xF5\xDD\n\0\0\0\x000\xEE\xA8\x0B\0\0\0\0@\xD7\xBD\x0C\0\0\0\x000\xD0\x88\r\0\0\0\0@\xB9\x9D\x0E\0\0\0\x000\xB2h\x0F\0\0\0\0\xC0\xD5\x86\x10\0\0\0\x000\x94H\x11\0\0\0\0\xC0\xB7f\x12\0\0\0\x000v(\x13\0\0\0\0\xC0\x99F\x14\0\0\0\0\xB0\x92\x11\x15\0\0\0\0\xC0{&\x16\0\0\0\0\xB0t\xF1\x16\0\0\0\0\xC0]\x06\x18\0\0\0\0\xB0V\xD1\x18\0\0\0\0\xC0?\xE6\x19\0\0\0\0\xB08\xB1\x1A\0\0\0\0@\\\xCF\x1B\0\0\0\0\xB0\x1A\x91\x1C\0\0\0\0@>\xAF\x1D\0\0\0\0\xB0\xFCp\x1E\0\0\0\0@ \x8F\x1F\0\0\0\x000\x03\x7F \0\0\0\0@\x02o!\0\0\0\x000\xFB9\"\0\0\0\0@\xE4N#\0\0\0\x000\xDD\x19$\0\0\0\0\xC0\08%\0\0\0\x000\xBF\xF9%\0\0\0\0\xC0\xF8\xF2&\0\0\0\x000\xA1\xD9'\0\0\0\0\xC0\xC4\xF7(\0\0\0\0\xB0\xBD\xC2)\0\0\0\0\xC0\xA6\xD7*\0\0\0\0\xB0\x9F\xA2+\0\0\0\0\xC0\x88\xB7,\0\0\0\0\xB0\x81\x82-\0\0\0\0\xC0j\x97.\0\0\0\0\xB0cb/\0\0\0\0@\x87\x800\0\0\0\0\xB0EB1\0\0\0\0@i`2\0\0\0\x000\xD7=3\0\0\0\0@K@4\0\0\0\x000D\x0B5\0\0\0\0@\xB8\r6\0\0\0\0\xB0\xD5\x067\0\0\0\0@\x0F\08\0\0\0\x000\x08\xCB8\0\0\0\0\xC0+\xE99\0\0\0\x000\xEA\xAA:\0\0\0\0\xC0\r\xC9;\0\0\0\x000\xCC\x8A<\0\0\0\0\xC0\xEF\xA8=\0\0\0\x000\xAEj>\0\0\0\0\xC0\xD1\x88?\0\0\0\0\xB0\xCAS@\0\0\0\0\xC0\xB3hA\0\0\0\0\xB0\xAC3B\0\0\0\0\xC0\x95HC\0\0\0\0\xB0\x8E\x13D\0\0\0\0@\xB21E\0\0\0\0\xB0p\xF3E\0\0\0\0@\x94\x11G\0\0\0\x000\x02\xEFG\0\0\0\0@v\xF1H\0\0\0\x000o\xBCI\0\0\0\0@X\xD1J\0\0\0\0\xB0\0\xB8K\0\0\0\0@:\xB1L\0\0\0\x000\x07\xC6M\0\0\0\0\xC0\x82PN\0\0\0\0\xB0\xAE\x9CO\0\0\0\0\xC0\xD9BP\0\0\0\0\xB0\x90|Q\0\0\0\0@\xF6+R\0\0\0\0\xB0r\\S\0\0\0\0@\xD8\x0BT\0\0\0\x000\xE67W\0\0\0\0\xC0\xEC\xAFW\0\0\0\x000\xC8\x17Y\0\0\0\0\xC0\xCE\x8FY\0\0\0\x000\xAA\xF7Z\0\0\0\0\xC0\xB0o[\0\0\0\0\xB0g\xA9\\\0\0\0\0\xC0|t]\0\0\0\0\xB0I\x89^\0\0\0\0\xC0^T_\0\0\0\0\xB0+i`\0\0\0\0\xC0@4a\0\0\0\0\xB0\rIb\0\0\0\0@]\x1Dc\0\0\0\0\xB0\xEF(d\0\0\0\0\xC0\x04\xF4d\0\0\0\0\0\x01\0\x02\0\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x04\x02\x03\x01\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\xBB\xBD\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFFAST\0\0\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x88\0\x9B\0\x08\x1D\x87i\xFF\xFF\xFF\xFF`B\xDF\xBA\xFF\xFF\xFF\xFF\xD0K\x08\xFA\xFF\xFF\xFF\xFF@\xC3\xA7\xFA\xFF\xFF\xFF\xFF\xD0\xF1\xA7\xFF\xFF\xFF\xFF\xFF\xC8{C\0\0\0\0\0\xD0\xD3\x87\x01\0\0\0\0H\x7F\xFA\x01\0\0\0\0P\xF0p\x03\0\0\0\0H\x04\xDD\x03\0\0\0\0P\xD2P\x05\0\0\0\0H\x89\xBF\x05\0\0\0\0P\xB40\x07\0\0\0\0\xC8\xBC\xA0\x07\0\0\0\0P\x96\x10\t\0\0\0\0\xE0\xBC\xFB9\0\0\0\0`\xE1):\0\0\0\0\x01\x02\x03\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x03\x05\x02\x03\x05x\xBE\xFF\xFF\xFF\xFF\xFF\xFF`\xBE\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xB8\xC0\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF-03\0\0\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xB8\x02\x0F\x03\xB4r\xAA\x96\xFF\xFF\xFF\xFF\xE0I\x0F\xB8\xFF\xFF\xFF\xFF\xA0@\xFD\xB8\xFF\xFF\xFF\xFF04\xF1\xB9\xFF\xFF\xFF\xFF t\xDE\xBA\xFF\xFF\xFF\xFF0\xAE8\xDA\xFF\xFF\xFF\xFF0\xFA\xEB\xDA\xFF\xFF\xFF\xFF\xB0\xE1\x19\xDC\xFF\xFF\xFF\xFF Y\xB9\xDC\xFF\xFF\xFF\xFF0\x15\xFB\xDD\xFF\xFF\xFF\xFF \xDE\x9B\xDE\xFF\xFF\xFF\xFF0\x9A\xDD\xDF\xFF\xFF\xFF\xFF 3T\xE0\xFF\xFF\xFF\xFF0\tZ\xF4\xFF\xFF\xFF\xFF D\xB6\xF4\xFF\xFF\xFF\xFF ^\x05\xF5\xFF\xFF\xFF\xFF0d\xC0\xF6\xFF\xFF\xFF\xFF\xA0\x1E\x0E\xF7\xFF\xFF\xFF\xFF0,Q\xF8\xFF\xFF\xFF\xFF \xC5\xC7\xF8\xFF\xFF\xFF\xFF\xB0\xD2\n\xFA\xFF\xFF\xFF\xFF\xA0\xF8\xA8\xFA\xFF\xFF\xFF\xFF0\x06\xEC\xFB\xFF\xFF\xFF\xFF\xA0}\x8B\xFC\xFF\xFF\xFF\xFF0\x8E\xC9\x1D\0\0\0\0\xA0\xD7x\x1E\0\0\0\0\xB05\xA0\x1F\0\0\0\0\xA0\xCF3 \0\0\0\x000i\x81!\0\0\0\0\xA0\xC8\x0B\"\0\0\0\0\xB0\x10X#\0\0\0\0 p\xE2#\0\0\0\0\xB0\xF27%\0\0\0\0 \xC7\xD4%\0\0\0\x000\x0F!'\0\0\0\0\xA0\xE3\xBD'\0\0\0\x000\xF1\0)\0\0\0\0 \x8B\x94)\0\0\0\0\xB0\r\xEA*\0\0\0\0\xA02k+\0\0\0\x000\xB5\xC0,\0\0\0\0 \xC4f-\0\0\0\x000\x97\xA0.\0\0\0\0 \xA6F/\0\0\0\x000y\x800\0\0\0\0\xA0M\x1D1\0\0\0\0\xB0 W2\0\0\0\0 j\x063\0\0\0\x000T84\0\0\0\0 \xC1\xF84\0\0\0\x000\x1F 6\0\0\0\0\xA0h\xCF6\0\0\0\0\xB0\xC6\xF67\0\0\0\0 \x85\xB88\0\0\0\x000\xE3\xDF9\0\0\0\0\xA0,\x8F:\0\0\0\0\xB0\xFF\xC8;\0\0\0\0\xA0\x0Eo<\0\0\0\x000\x91\xC4=\0\0\0\0\xA0\xF0N>\0\0\0\x000\xFE\x91?\0\0\0\0\xA0\xD2.@\0\0\0\x000\xF8\x86A\0\0\0\0 \xEF\x17B\0\0\0\x000\xC2QC\0\0\0\0 \xD1\xF7C\0\0\0\0\xB0SME\0\0\0\0\xA0\xED\xE0E\0\0\0\x000\x86\x11G\0\0\0\0 \x95\xB7G\0\0\0\0\xB0\xA2\xFAH\0\0\0\0 w\x97I\0\0\0\0\xB0\x84\xDAJ\0\0\0\0\xA0\x93\x80K\0\0\0\0\xB0f\xBAL\0\0\0\0\xA0u`M\0\0\0\0\xB0H\x9AN\0\0\0\0 \x92IO\0\0\0\x000e\x83P\0\0\0\0\xA09 Q\0\0\0\x000GcR\0\0\0\0\xA0\x1B\0S\0\0\0\x000)CT\0\0\0\0 8\xE9T\0\0\0\x000\x0B#V\0\0\0\0 \x1A\xC9V\0\0\0\x000\xED\x02X\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02L\xD4\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFF-02\0\0\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFF\x01-01\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\0\xF0\xF1\xFF\xFF\xFF\xFF\xFF\xFF\x02\0\0\0\x01\n\x05\0\0\0\0\0\0\0\0\0\xD0\x02V\x03\x18L\x80\x9B\xFF\xFF\xFF\xFF@nM\x13\0\0\0\0\xC0$4\x14\0\0\0\0\xA0\xF9#\x15\0\0\0\0\x90\xDC\x13\x16\0\0\0\0\x90\xCD\x03\x17\0\0\0\0\x90\xBE\xF3\x17\0\0\0\0\x90\xAF\xE3\x18\0\0\0\0\x90\xA0\xD3\x19\0\0\0\0\x90\x91\xC3\x1A\0\0\0\0\x10\xBD\xBC\x1B\0\0\0\0\x10\xAE\xAC\x1C\0\0\0\0\x10\x9F\x9C\x1D\0\0\0\0\x10\x90\x8C\x1E\0\0\0\0\x10\x81|\x1F\0\0\0\0\x10rl \0\0\0\0\x10c\\!\0\0\0\0\x10TL\"\0\0\0\0\x10E<#\0\0\0\0\x106,$\0\0\0\0\x10'\x1C%\0\0\0\0\x10\x18\x0C&\0\0\0\0\x90C\x05'\0\0\0\0\x904\xF5'\0\0\0\0\x90%\xE5(\0\0\0\0\x90\x16\xD5)\0\0\0\0\x90\x07\xC5*\0\0\0\0\x90\xF8\xB4+\0\0\0\0\x90\xE9\xA4,\0\0\0\0\x90\xDA\x94-\0\0\0\0\x90\xCB\x84.\0\0\0\0\x90\xBCt/\0\0\0\0\x90\xADd0\0\0\0\0\x10\xD9]1\0\0\0\0\x10\xB4r2\0\0\0\0\x10\xBB=3\0\0\0\0\x10\x96R4\0\0\0\0\x10\x9D\x1D5\0\0\0\0\x10x26\0\0\0\0\x10\x7F\xFD6\0\0\0\0\x90\x94\x1B8\0\0\0\0\x10a\xDD8\0\0\0\0\x90v\xFB9\0\0\0\0\x10C\xBD:\0\0\0\0\x90X\xDB;\0\0\0\0\x90_\xA6<\0\0\0\0\x90:\xBB=\0\0\0\0\x90A\x86>\0\0\0\0\x90\x1C\x9B?\0\0\0\0\x90#f@\0\0\0\0\x109\x84A\0\0\0\0\x90\x05FB\0\0\0\0\x10\x1BdC\0\0\0\0\x90\xE7%D\0\0\0\0\x10\xFDCE\0\0\0\0\x90\xC9\x05F\0\0\0\0\x10\xDF#G\0\0\0\0\x10\xE6\xEEG\0\0\0\0\x10\xC1\x03I\0\0\0\0\x10\xC8\xCEI\0\0\0\0\x10\xA3\xE3J\0\0\0\0\x10\xAA\xAEK\0\0\0\0\x90\xBF\xCCL\0\0\0\0\x10\x8C\x8EM\0\0\0\0\x90\xA1\xACN\0\0\0\0\x10nnO\0\0\0\0\x90\x83\x8CP\0\0\0\0\x90\x8AWQ\0\0\0\0\x90elR\0\0\0\0\x90l7S\0\0\0\0\x90GLT\0\0\0\0\x90N\x17U\0\0\0\0\x90),V\0\0\0\0\x900\xF7V\0\0\0\0\x10F\x15X\0\0\0\0\x90\x12\xD7X\0\0\0\0\x10(\xF5Y\0\0\0\0\x90\xF4\xB6Z\0\0\0\0\x10\n\xD5[\0\0\0\0\x10\x11\xA0\\\0\0\0\0\x10\xEC\xB4]\0\0\0\0\x10\xF3\x7F^\0\0\0\0\x10\xCE\x94_\0\0\0\0\x10\xD5_`\0\0\0\0\x90\xEA}a\0\0\0\0\x10\xB7?b\0\0\0\0\x90\xCC]c\0\0\0\0\x10\x99\x1Fd\0\0\0\0\x90\xAE=e\0\0\0\0\x90\xB5\x08f\0\0\0\0\x01\x02\x01\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x02\x04h\xEB\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFF\xF0\xF1\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\xF0\xF1\xFF\xFF\xFF\xFF\xFF\xFFAKST\0p\x81\xFF\xFF\xFF\xFF\xFF\xFF\x01AKDT\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0\xA8\x02\x16\x03\xD1\xFD\xC2?\xFF\xFF\xFF\xFF\x993\x87}\xFF\xFF\xFF\xFF\xA0\x1A\x89\xCB\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF\x10&a\xD2\xFF\xFF\xFF\xFF G\xB8\xFE\xFF\xFF\xFF\xFF\x10*\xA8\xFF\xFF\xFF\xFF\xFF )\x98\0\0\0\0\0\x10\x0C\x88\x01\0\0\0\0 \x0Bx\x02\0\0\0\0\x90(q\x03\0\0\0\0\xA0'a\x04\0\0\0\0\x90\nQ\x05\0\0\0\0\xA0\tA\x06\0\0\0\0\x90\xEC0\x07\0\0\0\0\xA0C\x8D\x07\0\0\0\0\x90\xCE\x10\t\0\0\0\0 \xBF\xAD\t\0\0\0\0\x90\xB0\xF0\n\0\0\0\0\xA0\xAF\xE0\x0B\0\0\0\0\x10\xCD\xD9\x0C\0\0\0\0\xA0\x91\xC0\r\0\0\0\0\x10\xAF\xB9\x0E\0\0\0\0 \xAE\xA9\x0F\0\0\0\0\x10\x91\x99\x10\0\0\0\0 \x90\x89\x11\0\0\0\0\x10sy\x12\0\0\0\0 ri\x13\0\0\0\0\x10UY\x14\0\0\0\0 TI\x15\0\0\0\0\x1079\x16\0\0\0\0 6)\x17\0\0\0\0\x90S\"\x18\0\0\0\0 \x18\t\x19\0\0\0\0\x905\x02\x1A\0\0\0\0\xA0C\x02\x1A\0\0\0\0\x10\x14+\x1A\0\0\0\0\xB0B\xF2\x1A\0\0\0\0\xA0%\xE2\x1B\0\0\0\0\xB0$\xD2\x1C\0\0\0\0\xA0\x07\xC2\x1D\0\0\0\0\xB0\x06\xB2\x1E\0\0\0\0\xA0\xE9\xA1\x1F\0\0\0\x0009v \0\0\0\0\xA0\xCB\x81!\0\0\0\x000\x1BV\"\0\0\0\0 \xE8j#\0\0\0\x000\xFD5$\0\0\0\0 \xCAJ%\0\0\0\x000\xDF\x15&\0\0\0\0 \xAC*'\0\0\0\0\xB0\xFB\xFE'\0\0\0\0 \x8E\n)\0\0\0\0\xB0\xDD\xDE)\0\0\0\0 p\xEA*\0\0\0\0\xB0\xBF\xBE+\0\0\0\0\xA0\x8C\xD3,\0\0\0\0\xB0\xA1\x9E-\0\0\0\0\xA0n\xB3.\0\0\0\0\xB0\x83~/\0\0\0\0\xA0P\x930\0\0\0\x000\xA0g1\0\0\0\0\xA02s2\0\0\0\x000\x82G3\0\0\0\0\xA0\x14S4\0\0\0\x000d'5\0\0\0\0\xA0\xF626\0\0\0\x000F\x077\0\0\0\0 \x13\x1C8\0\0\0\x000(\xE78\0\0\0\0 \xF5\xFB9\0\0\0\x000\n\xC7:\0\0\0\0 \xD7\xDB;\0\0\0\0\xB0&\xB0<\0\0\0\0 \xB9\xBB=\0\0\0\0\xB0\x08\x90>\0\0\0\0 \x9B\x9B?\0\0\0\0\xB0\xEAo@\0\0\0\0\xA0\xB7\x84A\0\0\0\0\xB0\xCCOB\0\0\0\0\xA0\x99dC\0\0\0\0\xB0\xAE/D\0\0\0\0\xA0{DE\0\0\0\x000\xE1\xF3E\0\0\0\0 \x98-G\0\0\0\0\x01\x02\x03\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x04\x05\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\xA7\xD2\0\0\0\0\0\0'\x81\xFF\xFF\xFF\xFF\xFF\xFF\x80\x8F\xFF\xFF\xFF\xFF\xFF\xFF\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFF\x80\x8F\xFF\xFF\xFF\xFF\xFF\xFFp\x81\xFF\xFF\xFF\xFF\xFF\xFFNST\0\0\xC8\xCE\xFF\xFF\xFF\xFF\xFF\xFF\x01NDT\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0\xD0\x05\x8A\x06\xEC4=^\xFF\xFF\xFF\xFF\x0Cb\xCF\x9C\xFF\xFF\xFF\xFF\xFC\xE6\xA4\x9D\xFF\xFF\xFF\xFF\x8C~\xB8\x9E\xFF\xFF\xFF\xFF|\xD6\xBA\x9F\xFF\xFF\xFF\xFF\xDC\x88\xB6\xA0\xFF\xFF\xFF\xFFL\xFF8\xA1\xFF\xFF\xFF\xFF\\\x19\x95\xA2\xFF\xFF\xFF\xFFL\xFC\x84\xA3\xFF\xFF\xFF\xFF\\\xFBt\xA4\xFF\xFF\xFF\xFFL\xDEd\xA5\xFF\xFF\xFF\xFF\xDC\x17^\xA6\xFF\xFF\xFF\xFFL\xC0D\xA7\xFF\xFF\xFF\xFF\xDC\xF9=\xA8\xFF\xFF\xFF\xFFL\xA2$\xA9\xFF\xFF\xFF\xFF\xDC\xDB\x1D\xAA\xFF\xFF\xFF\xFFL\x84\x04\xAB\xFF\xFF\xFF\xFF\xDC\xBD\xFD\xAB\xFF\xFF\xFF\xFFLf\xE4\xAC\xFF\xFF\xFF\xFF\xDC\x9F\xDD\xAD\xFF\xFF\xFF\xFF\xCC\x82\xCD\xAE\xFF\xFF\xFF\xFF\xDC\x81\xBD\xAF\xFF\xFF\xFF\xFF\xCCd\xAD\xB0\xFF\xFF\xFF\xFF\\\x9E\xA6\xB1\xFF\xFF\xFF\xFF\xCCF\x8D\xB2\xFF\xFF\xFF\xFF\\\x80\x86\xB3\xFF\xFF\xFF\xFF\xCC(m\xB4\xFF\xFF\xFF\xFF\\bf\xB5\xFF\xFF\xFF\xFF\xCC\nM\xB6\xFF\xFF\xFF\xFF\\DF\xB7\xFF\xFF\xFF\xFF\xCC\xEC,\xB8\xFF\xFF\xFF\xFF\\&&\xB9\xFF\xFF\xFF\xFFL\t\x16\xBA\xFF\xFF\xFF\xFF\xDCB\x0F\xBB\xFF\xFF\xFF\xFFL\xEB\xF5\xBB\xFF\xFF\xFF\xFF\xDC$\xEF\xBC\xFF\xFF\xFF\xFFL\xCD\xD5\xBD\xFF\xFF\xFF\xFFlM\x9E\xBE\xFF\xFF\xFF\xFF\xA8\x06\xCF\xBE\xFF\xFF\xFF\xFF\x18\xAF\xB5\xBF\xFF\xFF\xFF\xFF81\xB8\xC0\xFF\xFF\xFF\xFF\xA8\xEFy\xC1\xFF\xFF\xFF\xFF8\x13\x98\xC2\xFF\xFF\xFF\xFF\xA8\xD1Y\xC3\xFF\xFF\xFF\xFF8\xF5w\xC4\xFF\xFF\xFF\xFF\xA8\xB39\xC5\xFF\xFF\xFF\xFF\xB8\x11a\xC6\xFF\xFF\xFF\xFF\xA8\x95\x19\xC7\xFF\xFF\xFF\xFF\xB8\xF3@\xC8\xFF\xFF\xFF\xFF(\xB2\x02\xC9\xFF\xFF\xFF\xFF\xB8\xD5 \xCA\xFF\xFF\xFF\xFF(\x94\xE2\xCA\xFF\xFF\xFF\xFF\xB8\xB7\0\xCC\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF\xC8\xE6`\xD2\xFF\xFF\xFF\xFF\xD8D\x88\xD3\xFF\xFF\xFF\xFFH\x03J\xD4\xFF\xFF\xFF\xFF\xD8&h\xD5\xFF\xFF\xFF\xFFH\xE5)\xD6\xFF\xFF\xFF\xFF\xD8\x08H\xD7\xFF\xFF\xFF\xFFH\xC7\t\xD8\xFF\xFF\xFF\xFF\xD8\xEA'\xD9\xFF\xFF\xFF\xFFH\xA9\xE9\xD9\xFF\xFF\xFF\xFFX\x07\x11\xDB\xFF\xFF\xFF\xFF\xC8\xC5\xD2\xDB\xFF\xFF\xFF\xFFXt\xDE\xDC\xFF\xFF\xFF\xFFHm\xA9\xDD\xFF\xFF\xFF\xFFXV\xBE\xDE\xFF\xFF\xFF\xFFHO\x89\xDF\xFF\xFF\xFF\xFFX8\x9E\xE0\xFF\xFF\xFF\xFFH1i\xE1\xFF\xFF\xFF\xFFX\x1A~\xE2\xFF\xFF\xFF\xFFH\x13I\xE3\xFF\xFF\xFF\xFFX\xFC]\xE4\xFF\xFF\xFF\xFFH\xF5(\xE5\xFF\xFF\xFF\xFF\xD8\x18G\xE6\xFF\xFF\xFF\xFF\xC8\x11\x12\xE7\xFF\xFF\xFF\xFF\xD8\xFA&\xE8\xFF\xFF\xFF\xFF\xC8\xF3\xF1\xE8\xFF\xFF\xFF\xFF\xD8\xDC\x06\xEA\xFF\xFF\xFF\xFF\xC8\xD5\xD1\xEA\xFF\xFF\xFF\xFF\xD8\xBE\xE6\xEB\xFF\xFF\xFF\xFF\xC8\xB7\xB1\xEC\xFF\xFF\xFF\xFF\xD8\xA0\xC6\xED\xFF\xFF\xFF\xFFH\xBE\xBF\xEE\xFF\xFF\xFF\xFFX\xBD\xAF\xEF\xFF\xFF\xFF\xFFH\xA0\x9F\xF0\xFF\xFF\xFF\xFFX\x9F\x8F\xF1\xFF\xFF\xFF\xFFH\x82\x7F\xF2\xFF\xFF\xFF\xFFX\x81o\xF3\xFF\xFF\xFF\xFFHd_\xF4\xFF\xFF\xFF\xFFXcO\xF5\xFF\xFF\xFF\xFFHF?\xF6\xFF\xFF\xFF\xFFXE/\xF7\xFF\xFF\xFF\xFF\xC8b(\xF8\xFF\xFF\xFF\xFFX'\x0F\xF9\xFF\xFF\xFF\xFF\xC8D\x08\xFA\xFF\xFF\xFF\xFF\xD8C\xF8\xFA\xFF\xFF\xFF\xFF\xC8&\xE8\xFB\xFF\xFF\xFF\xFF\xD8%\xD8\xFC\xFF\xFF\xFF\xFF\xC8\x08\xC8\xFD\xFF\xFF\xFF\xFF\xD8\x07\xB8\xFE\xFF\xFF\xFF\xFF\xC8\xEA\xA7\xFF\xFF\xFF\xFF\xFF\xD8\xE9\x97\0\0\0\0\0\xC8\xCC\x87\x01\0\0\0\0\xD8\xCBw\x02\0\0\0\0H\xE9p\x03\0\0\0\0X\xE8`\x04\0\0\0\0H\xCBP\x05\0\0\0\0X\xCA@\x06\0\0\0\0H\xAD0\x07\0\0\0\0X\xAC \x08\0\0\0\0H\x8F\x10\t\0\0\0\0X\x8E\0\n\0\0\0\0Hq\xF0\n\0\0\0\0Xp\xE0\x0B\0\0\0\0\xC8\x8D\xD9\x0C\0\0\0\0XR\xC0\r\0\0\0\0\xC8o\xB9\x0E\0\0\0\0\xD8n\xA9\x0F\0\0\0\0\xC8Q\x99\x10\0\0\0\0\xD8P\x89\x11\0\0\0\0\xC83y\x12\0\0\0\0\xD82i\x13\0\0\0\0\xC8\x15Y\x14\0\0\0\0\xD8\x14I\x15\0\0\0\0\xC8\xF78\x16\0\0\0\0\xD8\xF6(\x17\0\0\0\0H\x14\"\x18\0\0\0\0\xD8\xD8\x08\x19\0\0\0\0H\xF6\x01\x1A\0\0\0\0X\xF5\xF1\x1A\0\0\0\0H\xD8\xE1\x1B\0\0\0\0X\xD7\xD1\x1C\0\0\0\0H\xBA\xC1\x1D\0\0\0\0X\xB9\xB1\x1E\0\0\0\0H\x9C\xA1\x1F\0\0\0\0\xF4\xCFu \0\0\0\0db\x81!\0\0\0\0\xF4\xB1U\"\0\0\0\0\xD4pj#\0\0\0\0\xF4\x935$\0\0\0\0\xE4`J%\0\0\0\0\xF4u\x15&\0\0\0\0\xE4B*'\0\0\0\0t\x92\xFE'\0\0\0\0\xE4$\n)\0\0\0\0tt\xDE)\0\0\0\0\xE4\x06\xEA*\0\0\0\0tV\xBE+\0\0\0\0d#\xD3,\0\0\0\0t8\x9E-\0\0\0\0d\x05\xB3.\0\0\0\0t\x1A~/\0\0\0\0d\xE7\x920\0\0\0\0\xF46g1\0\0\0\0d\xC9r2\0\0\0\0\xF4\x18G3\0\0\0\0d\xABR4\0\0\0\0\xF4\xFA&5\0\0\0\0d\x8D26\0\0\0\0\xF4\xDC\x067\0\0\0\0\xE4\xA9\x1B8\0\0\0\0\xF4\xBE\xE68\0\0\0\0\xE4\x8B\xFB9\0\0\0\0\xF4\xA0\xC6:\0\0\0\0\xE4m\xDB;\0\0\0\0t\xBD\xAF<\0\0\0\0\xE4O\xBB=\0\0\0\0t\x9F\x8F>\0\0\0\0\xE41\x9B?\0\0\0\0t\x81o@\0\0\0\0dN\x84A\0\0\0\0tcOB\0\0\0\0d0dC\0\0\0\0tE/D\0\0\0\0d\x12DE\0\0\0\0\xF4w\xF3E\0\0\0\0\xE4.-G\0\0\0\0\xF4Y\xD3G\0\0\0\0\xE4\x10\rI\0\0\0\0\xF4;\xB3I\0\0\0\0\xE4\xF2\xECJ\0\0\0\0tX\x9CK\0\0\0\0d\x0F\xD6L\0\0\0\0t:|M\0\0\0\0\0\x01\0\x01\0\x01\0\x01\0\x01\0\x01\0\x01\0\x01\0\x01\0\x01\0\x01\0\x01\0\x01\0\x01\0\x01\0\x01\0\x01\0\x01\0\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x04\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x94\xCE\xFF\xFF\xFF\xFF\xFF\xFF\xA4\xDC\xFF\xFF\xFF\xFF\xFF\xFF\xC8\xCE\xFF\xFF\xFF\xFF\xFF\xFF\xD8\xDC\xFF\xFF\xFF\xFF\xFF\xFF\xE8\xEA\xFF\xFF\xFF\xFF\xFF\xFFCST\0\0\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xB8\0\xD0\0\x18\x96\xFD\x86\xFF\xFF\xFF\xFF\x90\xAF\xB8\x9E\xFF\xFF\xFF\xFF\x80\x07\xBB\x9F\xFF\xFF\xFF\xFF\x90\x0C\x89\xCB\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF\0\x18a\xD2\xFF\xFF\xFF\xFF\x10\x01v\xD3\xFF\xFF\xFF\xFF\0oS\xD4\xFF\xFF\xFF\xFF\x10\xE3U\xD5\xFF\xFF\xFF\xFF\0\xDC \xD6\xFF\xFF\xFF\xFF\x10\xC55\xD7\xFF\xFF\xFF\xFF\0\xBE\0\xD8\xFF\xFF\xFF\xFF\x10\xA7\x15\xD9\xFF\xFF\xFF\xFF\0\xA0\xE0\xD9\xFF\xFF\xFF\xFF\x10,'\xE8\xFF\xFF\xFF\xFF\0\x0F\x17\xE9\xFF\xFF\xFF\xFF\x10\xF0\xE6\xEB\xFF\xFF\xFF\xFF\0\xD3\xD6\xEC\xFF\xFF\xFF\xFF\x10\xD2\xC6\xED\xFF\xFF\xFF\xFF\0\xCB\x91\xEE\xFF\xFF\xFF\xFF\x90\xEE\xAF\xEF\xFF\xFF\xFF\xFF\0\xADq\xF0\xFF\xFF\xFF\xFF\x90\x19a\x04\0\0\0\0\x01\x02\x01\x02\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\xE8\x9A\xFF\xFF\xFF\xFF\xFF\xFF\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFFCST\0\0\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\08\0?\0DKL\xA4\xFF\xFF\xFF\xFF\xE0\xDC\x9A \0\0\0\0P\x9B\\!\0\0\0\0\xE0\xBEz\"\0\0\0\0P}<#\0\0\0\0\xE0\x8C]D\0\0\0\0\xD0\xC8\xD6D\0\0\0\0\x01\x02\x01\x02\x01\x02\x01<\xAE\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFFAST\0\0\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\x01ADT\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0\x18\x01;\x01\xFCw\x80\x9B\xFF\xFF\xFF\xFF\xE0z\xF5'\0\0\0\0\xD0]\xE5(\0\0\0\0\xE0\\\xD5)\0\0\0\0\xD0?\xC5*\0\0\0\0`y\xBE+\0\0\0\0PF\xD3,\0\0\0\0`[\x9E-\0\0\0\0P(\xB3.\0\0\0\0`=~/\0\0\0\0P\n\x930\0\0\0\0\xE0Yg1\0\0\0\0P\xECr2\0\0\0\0\xE0;G3\0\0\0\0P\xCER4\0\0\0\0\xE0\x1D'5\0\0\0\0P\xB026\0\0\0\0\xE0\xFF\x067\0\0\0\0\xD0\xCC\x1B8\0\0\0\0\xE0\xE1\xE68\0\0\0\0\xD0\xAE\xFB9\0\0\0\0\xE0\xC3\xC6:\0\0\0\0\xD0\x90\xDB;\0\0\0\0`\xE0\xAF<\0\0\0\0\xD0r\xBB=\0\0\0\0`\xC2\x8F>\0\0\0\0\xD0T\x9B?\0\0\0\0`\xA4o@\0\0\0\0Pq\x84A\0\0\0\0`\x86OB\0\0\0\0PSdC\0\0\0\0`h/D\0\0\0\0P5DE\0\0\0\0\xE0\x9A\xF3E\0\0\0\0\xD0Q-G\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x84\xBF\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFFPST\0\0\x80\x8F\xFF\xFF\xFF\xFF\xFF\xFF\x01PDT\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0\x18\x03\xAB\x03p\xE8\xB6\xA5\xFF\xFF\xFF\xFFpOy\xA9\xFF\xFF\xFF\xFF\x809\xF1\xAF\xFF\xFF\xFF\xFFpdf\xB6\xFF\xFF\xFF\xFF\0\x10\x1B\xB7\xFF\xFF\xFF\xFF\xF0\xF2\n\xB8\xFF\xFF\xFF\xFF\x80\x8D\xEA\xCB\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF\xF0\xAE\x9D\xD2\xFF\xFF\xFF\xFF\0Y\x1B\xD7\xFF\xFF\xFF\xFF\xF0\xB4\x91\xD8\xFF\xFF\xFF\xFF\0\x07\0\xDB\xFF\xFF\xFF\xFF\xF0s\xC0\xDB\xFF\xFF\xFF\xFF\xA0\xB3\xDE\xDC\xFF\xFF\xFF\xFF\x90\xAC\xA9\xDD\xFF\xFF\xFF\xFF\xA0\x95\xBE\xDE\xFF\xFF\xFF\xFF\x90\x8E\x89\xDF\xFF\xFF\xFF\xFF\x90K~\xE2\xFF\xFF\xFF\xFF\x90RI\xE3\xFF\xFF\xFF\xFF\x90-^\xE4\xFF\xFF\xFF\xFF\x904)\xE5\xFF\xFF\xFF\xFF\x10JG\xE6\xFF\xFF\xFF\xFF\x10Q\x12\xE7\xFF\xFF\xFF\xFF\x10,'\xE8\xFF\xFF\xFF\xFF\x103\xF2\xE8\xFF\xFF\xFF\xFF\x10\x0E\x07\xEA\xFF\xFF\xFF\xFF\x10\x15\xD2\xEA\xFF\xFF\xFF\xFF\x10\xF0\xE6\xEB\xFF\xFF\xFF\xFF\x10\xF7\xB1\xEC\xFF\xFF\xFF\xFF\x10\xD2\xC6\xED\xFF\xFF\xFF\xFF\x10\xD9\x91\xEE\xFF\xFF\xFF\xFF\xA0\xAF\xE0\x0B\0\0\0\0\x10\xCD\xD9\x0C\0\0\0\0\xA0\x91\xC0\r\0\0\0\0\x10\xAF\xB9\x0E\0\0\0\0 \xAE\xA9\x0F\0\0\0\0\x10\x91\x99\x10\0\0\0\0 \x90\x89\x11\0\0\0\0\x10sy\x12\0\0\0\0 ri\x13\0\0\0\0\x10UY\x14\0\0\0\0 TI\x15\0\0\0\0\x1079\x16\0\0\0\0 6)\x17\0\0\0\0\x90S\"\x18\0\0\0\0 \x18\t\x19\0\0\0\0\x905\x02\x1A\0\0\0\0\xA04\xF2\x1A\0\0\0\0\x90\x17\xE2\x1B\0\0\0\0\xA0\x16\xD2\x1C\0\0\0\0\x90\xF9\xC1\x1D\0\0\0\0\xA0\xF8\xB1\x1E\0\0\0\0\x90\xDB\xA1\x1F\0\0\0\0 +v \0\0\0\0\x90\xBD\x81!\0\0\0\0 \rV\"\0\0\0\0\x10\xDAj#\0\0\0\0 \xEF5$\0\0\0\0\x10\xBCJ%\0\0\0\0 \xD1\x15&\0\0\0\0\x10\x9E*'\0\0\0\0\xA0\xED\xFE'\0\0\0\0\x10\x80\n)\0\0\0\0\xA0\xCF\xDE)\0\0\0\0\x10b\xEA*\0\0\0\0\xA0\xB1\xBE+\0\0\0\0\x90~\xD3,\0\0\0\0\xA0\x93\x9E-\0\0\0\0\x90`\xB3.\0\0\0\0\xA0u~/\0\0\0\0\x90B\x930\0\0\0\0 \x92g1\0\0\0\0\x90$s2\0\0\0\0 tG3\0\0\0\0\x90\x06S4\0\0\0\0 V'5\0\0\0\0\x90\xE826\0\0\0\0 8\x077\0\0\0\0\x10\x05\x1C8\0\0\0\0 \x1A\xE78\0\0\0\0\x10\xE7\xFB9\0\0\0\0 \xFC\xC6:\0\0\0\0\x10\xC9\xDB;\0\0\0\0\xA0\x18\xB0<\0\0\0\0\x10\xAB\xBB=\0\0\0\0\xA0\xFA\x8F>\0\0\0\0\x10\x8D\x9B?\0\0\0\0\xA0\xDCo@\0\0\0\0\x90\xA9\x84A\0\0\0\0\xA0\xBEOB\0\0\0\0\x90\x8BdC\0\0\0\0\xA0\xA0/D\0\0\0\0\x90mDE\0\0\0\0\xA0\x82\x0FF\0\0\0\0\x90O$G\0\0\0\0 \x9F\xF8G\0\0\0\0\x901\x04I\0\0\0\0 \x81\xD8I\0\0\0\0\x90\x13\xE4J\0\0\0\0\x01\x02\x01\x02\x01\x03\x02\x01\x03\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02L\x92\xFF\xFF\xFF\xFF\xFF\xFF\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFF\x80\x8F\xFF\xFF\xFF\xFF\xFF\xFF\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFFEST\0\0\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\x01EDT\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0h\x05\x15\x06\xECx\xEEr\xFF\xFF\xFF\xFFp\x93\xB8\x9E\xFF\xFF\xFF\xFF`\xEB\xBA\x9F\xFF\xFF\xFF\xFF\xC8.\x87\xA0\xFF\xFF\xFF\xFF@\xB1\x9A\xA1\xFF\xFF\xFF\xFF\xF0\x06\x94\xA2\xFF\xFF\xFF\xFF@\xA9U\xA3\xFF\xFF\xFF\xFF\xF0]\x86\xA4\xFF\xFF\xFF\xFF`x(\xA5\xFF\xFF\xFF\xFF\xF0?f\xA6\xFF\xFF\xFF\xFF\xE0N\x0C\xA7\xFF\xFF\xFF\xFF\xF0!F\xA8\xFF\xFF\xFF\xFF\xE00\xEC\xA8\xFF\xFF\xFF\xFFp\xC9\x1C\xAA\xFF\xFF\xFF\xFF`M\xD5\xAA\xFF\xFF\xFF\xFFp\xAB\xFC\xAB\xFF\xFF\xFF\xFF`/\xB5\xAC\xFF\xFF\xFF\xFFp\x8D\xDC\xAD\xFF\xFF\xFF\xFF`\x11\x95\xAE\xFF\xFF\xFF\xFFpo\xBC\xAF\xFF\xFF\xFF\xFF\xE0-~\xB0\xFF\xFF\xFF\xFFpQ\x9C\xB1\xFF\xFF\xFF\xFF`Jg\xB2\xFF\xFF\xFF\xFFp3|\xB3\xFF\xFF\xFF\xFF`,G\xB4\xFF\xFF\xFF\xFFp\x15\\\xB5\xFF\xFF\xFF\xFF`\x0E'\xB6\xFF\xFF\xFF\xFFp\xF7;\xB7\xFF\xFF\xFF\xFF`\xF0\x06\xB8\xFF\xFF\xFF\xFF\xF0\x13%\xB9\xFF\xFF\xFF\xFF`\xD2\xE6\xB9\xFF\xFF\xFF\xFF\xF0\xF5\x04\xBB\xFF\xFF\xFF\xFF\xE0\xEE\xCF\xBB\xFF\xFF\xFF\xFF\xF0\xD7\xE4\xBC\xFF\xFF\xFF\xFF\xE0\xD0\xAF\xBD\xFF\xFF\xFF\xFF\xF0\xB9\xC4\xBE\xFF\xFF\xFF\xFF\xE0\xB2\x8F\xBF\xFF\xFF\xFF\xFF\xF0\x9B\xA4\xC0\xFF\xFF\xFF\xFF\xE0\x94o\xC1\xFF\xFF\xFF\xFF\xF0}\x84\xC2\xFF\xFF\xFF\xFF\xE0vO\xC3\xFF\xFF\xFF\xFF\xF0_d\xC4\xFF\xFF\xFF\xFF\xE0X/\xC5\xFF\xFF\xFF\xFFp|M\xC6\xFF\xFF\xFF\xFF\xE0:\x0F\xC7\xFF\xFF\xFF\xFFp^-\xC8\xFF\xFF\xFF\xFFp\xF0\x88\xCB\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF\xE0\xFB`\xD2\xFF\xFF\xFF\xFFP\x89\xDB\xD2\xFF\xFF\xFF\xFF\xE0\xDD@\xD4\xFF\xFF\xFF\xFF\xF0\xC6U\xD5\xFF\xFF\xFF\xFF\xE0\xBF \xD6\xFF\xFF\xFF\xFF\xF0\xA85\xD7\xFF\xFF\xFF\xFF\xE0\xA1\0\xD8\xFF\xFF\xFF\xFF\xF0\x8A\x15\xD9\xFF\xFF\xFF\xFF`\x923\xDA\xFF\xFF\xFF\xFFp\xA7\xFE\xDA\xFF\xFF\xFF\xFF`t\x13\xDC\xFF\xFF\xFF\xFFp\x89\xDE\xDC\xFF\xFF\xFF\xFF`\x82\xA9\xDD\xFF\xFF\xFF\xFFpk\xBE\xDE\xFF\xFF\xFF\xFF`d\x89\xDF\xFF\xFF\xFF\xFFpM\x9E\xE0\xFF\xFF\xFF\xFF`Fi\xE1\xFF\xFF\xFF\xFFp/~\xE2\xFF\xFF\xFF\xFF`(I\xE3\xFF\xFF\xFF\xFFp\x11^\xE4\xFF\xFF\xFF\xFF`\n)\xE5\xFF\xFF\xFF\xFF\xF0-G\xE6\xFF\xFF\xFF\xFF\xE0&\x12\xE7\xFF\xFF\xFF\xFF\xF0\x0F'\xE8\xFF\xFF\xFF\xFF\xE0\xF2\x16\xE9\xFF\xFF\xFF\xFF\xF0\xF1\x06\xEA\xFF\xFF\xFF\xFF\xE0\xD4\xF6\xEA\xFF\xFF\xFF\xFF\xF0\xD3\xE6\xEB\xFF\xFF\xFF\xFF\xE0\xB6\xD6\xEC\xFF\xFF\xFF\xFF\xF0\xB5\xC6\xED\xFF\xFF\xFF\xFF`\xD3\xBF\xEE\xFF\xFF\xFF\xFFp\xD2\xAF\xEF\xFF\xFF\xFF\xFF`\xB5\x9F\xF0\xFF\xFF\xFF\xFFp\xB4\x8F\xF1\xFF\xFF\xFF\xFF`\x97\x7F\xF2\xFF\xFF\xFF\xFFp\x96o\xF3\xFF\xFF\xFF\xFF`y_\xF4\xFF\xFF\xFF\xFFpxO\xF5\xFF\xFF\xFF\xFF`[?\xF6\xFF\xFF\xFF\xFFpZ/\xF7\xFF\xFF\xFF\xFF\xE0w(\xF8\xFF\xFF\xFF\xFFp<\x0F\xF9\xFF\xFF\xFF\xFF\xE0Y\x08\xFA\xFF\xFF\xFF\xFF\xF0X\xF8\xFA\xFF\xFF\xFF\xFF\xE0;\xE8\xFB\xFF\xFF\xFF\xFF\xF0:\xD8\xFC\xFF\xFF\xFF\xFF\xE0\x1D\xC8\xFD\xFF\xFF\xFF\xFF\xF0\x1C\xB8\xFE\xFF\xFF\xFF\xFF\xE0\xFF\xA7\xFF\xFF\xFF\xFF\xFF\xF0\xFE\x97\0\0\0\0\0\xE0\xE1\x87\x01\0\0\0\0\xF0\xE0w\x02\0\0\0\0`\xFEp\x03\0\0\0\0p\xFD`\x04\0\0\0\0`\xE0P\x05\0\0\0\0p\xDF@\x06\0\0\0\0`\xC20\x07\0\0\0\0p\xC1 \x08\0\0\0\0`\xA4\x10\t\0\0\0\0p\xA3\0\n\0\0\0\0`\x86\xF0\n\0\0\0\0p\x85\xE0\x0B\0\0\0\0\xE0\xA2\xD9\x0C\0\0\0\0pg\xC0\r\0\0\0\0\xE0\x84\xB9\x0E\0\0\0\0\xF0\x83\xA9\x0F\0\0\0\0\xE0f\x99\x10\0\0\0\0\xF0e\x89\x11\0\0\0\0\xE0Hy\x12\0\0\0\0\xF0Gi\x13\0\0\0\0\xE0*Y\x14\0\0\0\0\xF0)I\x15\0\0\0\0\xE0\x0C9\x16\0\0\0\0\xF0\x0B)\x17\0\0\0\0`)\"\x18\0\0\0\0\xF0\xED\x08\x19\0\0\0\0`\x0B\x02\x1A\0\0\0\0p\n\xF2\x1A\0\0\0\0`\xED\xE1\x1B\0\0\0\0p\xEC\xD1\x1C\0\0\0\0`\xCF\xC1\x1D\0\0\0\0p\xCE\xB1\x1E\0\0\0\0`\xB1\xA1\x1F\0\0\0\0\xF0\0v \0\0\0\0`\x93\x81!\0\0\0\0\xF0\xE2U\"\0\0\0\0\xE0\xAFj#\0\0\0\0\xF0\xC45$\0\0\0\0\xE0\x91J%\0\0\0\0\xF0\xA6\x15&\0\0\0\0\xE0s*'\0\0\0\0p\xC3\xFE'\0\0\0\0\xE0U\n)\0\0\0\0p\xA5\xDE)\0\0\0\0\xE07\xEA*\0\0\0\0p\x87\xBE+\0\0\0\0`T\xD3,\0\0\0\0pi\x9E-\0\0\0\0`6\xB3.\0\0\0\0pK~/\0\0\0\0`\x18\x930\0\0\0\0\xF0gg1\0\0\0\0`\xFAr2\0\0\0\0\xF0IG3\0\0\0\0`\xDCR4\0\0\0\0\xF0+'5\0\0\0\0`\xBE26\0\0\0\0\xF0\r\x077\0\0\0\0\xE0\xDA\x1B8\0\0\0\0\xF0\xEF\xE68\0\0\0\0\xE0\xBC\xFB9\0\0\0\0\xF0\xD1\xC6:\0\0\0\0\xE0\x9E\xDB;\0\0\0\0p\xEE\xAF<\0\0\0\0\xE0\x80\xBB=\0\0\0\0p\xD0\x8F>\0\0\0\0\xE0b\x9B?\0\0\0\0p\xB2o@\0\0\0\0`\x7F\x84A\0\0\0\0p\x94OB\0\0\0\0`adC\0\0\0\0pv/D\0\0\0\0`CDE\0\0\0\0\xF0\xA8\xF3E\0\0\0\0\xE0_-G\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x02\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x94\xB5\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFFPST\0\0\x80\x8F\xFF\xFF\xFF\xFF\xFF\xFF\x01PDT\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0\x10\x04\x92\x04\xECv=^\xFF\xFF\xFF\xFF\xA0\xBD\xB8\x9E\xFF\xFF\xFF\xFF\x90\x15\xBB\x9F\xFF\xFF\xFF\xFF\xA0\x1A\x89\xCB\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF\x10&a\xD2\xFF\xFF\xFF\xFF \x0Fv\xD3\xFF\xFF\xFF\xFF\x10\x08A\xD4\xFF\xFF\xFF\xFF \xF1U\xD5\xFF\xFF\xFF\xFF\x10\xEA \xD6\xFF\xFF\xFF\xFF \xD35\xD7\xFF\xFF\xFF\xFF\x10\xCC\0\xD8\xFF\xFF\xFF\xFF \xB5\x15\xD9\xFF\xFF\xFF\xFF\x10\xAE\xE0\xD9\xFF\xFF\xFF\xFF\xA0\xD1\xFE\xDA\xFF\xFF\xFF\xFF\x10\x90\xC0\xDB\xFF\xFF\xFF\xFF\xA0\xB3\xDE\xDC\xFF\xFF\xFF\xFF\x90\xAC\xA9\xDD\xFF\xFF\xFF\xFF\xA0\x95\xBE\xDE\xFF\xFF\xFF\xFF\x90\x8E\x89\xDF\xFF\xFF\xFF\xFF\xA0w\x9E\xE0\xFF\xFF\xFF\xFF\x90pi\xE1\xFF\xFF\xFF\xFF\xA0Y~\xE2\xFF\xFF\xFF\xFF\x90RI\xE3\xFF\xFF\xFF\xFF\xA0;^\xE4\xFF\xFF\xFF\xFF\x904)\xE5\xFF\xFF\xFF\xFF XG\xE6\xFF\xFF\xFF\xFF\x10Q\x12\xE7\xFF\xFF\xFF\xFF :'\xE8\xFF\xFF\xFF\xFF\x103\xF2\xE8\xFF\xFF\xFF\xFF \x1C\x07\xEA\xFF\xFF\xFF\xFF\x10\x15\xD2\xEA\xFF\xFF\xFF\xFF \xFE\xE6\xEB\xFF\xFF\xFF\xFF\x10\xF7\xB1\xEC\xFF\xFF\xFF\xFF \xE0\xC6\xED\xFF\xFF\xFF\xFF\x10\xD9\x91\xEE\xFF\xFF\xFF\xFF\xA0\xFC\xAF\xEF\xFF\xFF\xFF\xFF\x10\xBBq\xF0\xFF\xFF\xFF\xFF\xA0\xDE\x8F\xF1\xFF\xFF\xFF\xFF\x90\xC1\x7F\xF2\xFF\xFF\xFF\xFF\xA0\xC0o\xF3\xFF\xFF\xFF\xFF\x90\xA3_\xF4\xFF\xFF\xFF\xFF\xA0\xA2O\xF5\xFF\xFF\xFF\xFF\x90\x85?\xF6\xFF\xFF\xFF\xFF\xA0\x84/\xF7\xFF\xFF\xFF\xFF\x10\xA2(\xF8\xFF\xFF\xFF\xFF\xA0f\x0F\xF9\xFF\xFF\xFF\xFF\x10\x84\x08\xFA\xFF\xFF\xFF\xFF \x83\xF8\xFA\xFF\xFF\xFF\xFF\x10f\xE8\xFB\xFF\xFF\xFF\xFF e\xD8\xFC\xFF\xFF\xFF\xFF\x10H\xC8\xFD\xFF\xFF\xFF\xFF G\xB8\xFE\xFF\xFF\xFF\xFF\x10*\xA8\xFF\xFF\xFF\xFF\xFF )\x98\0\0\0\0\0\x10\x0C\x88\x01\0\0\0\0 \x0Bx\x02\0\0\0\0\x90(q\x03\0\0\0\0\xA0'a\x04\0\0\0\0\x90\nQ\x05\0\0\0\0\xA0\tA\x06\0\0\0\0\x90\xEC0\x07\0\0\0\0\xA0\xEB \x08\0\0\0\0\x90\xCE\x10\t\0\0\0\0\xA0\xCD\0\n\0\0\0\0\x90\xB0\xF0\n\0\0\0\0\xA0\xAF\xE0\x0B\0\0\0\0\x10\xCD\xD9\x0C\0\0\0\0\xA0\x91\xC0\r\0\0\0\0\x10\xAF\xB9\x0E\0\0\0\0 \xAE\xA9\x0F\0\0\0\0\x10\x91\x99\x10\0\0\0\0 \x90\x89\x11\0\0\0\0\x10sy\x12\0\0\0\0 ri\x13\0\0\0\0\x10UY\x14\0\0\0\0 TI\x15\0\0\0\0\x1079\x16\0\0\0\0 6)\x17\0\0\0\0\x90S\"\x18\0\0\0\0 \x18\t\x19\0\0\0\0\x905\x02\x1A\0\0\0\0\xA04\xF2\x1A\0\0\0\0\x90\x17\xE2\x1B\0\0\0\0\xA0\x16\xD2\x1C\0\0\0\0\x90\xF9\xC1\x1D\0\0\0\0\xA0\xF8\xB1\x1E\0\0\0\0\x90\xDB\xA1\x1F\0\0\0\0\0\"\xFA\x1F\0\0\0\0\x90\xBD\x81!\0\0\0\0 \rV\"\0\0\0\0\x10\xDAj#\0\0\0\0 \xEF5$\0\0\0\0\x10\xBCJ%\0\0\0\0 \xD1\x15&\0\0\0\0\x10\x9E*'\0\0\0\0\xA0\xED\xFE'\0\0\0\0\x10\x80\n)\0\0\0\0\xA0\xCF\xDE)\0\0\0\0\x10b\xEA*\0\0\0\0\xA0\xB1\xBE+\0\0\0\0\x90~\xD3,\0\0\0\0\xA0\x93\x9E-\0\0\0\0\x90`\xB3.\0\0\0\0\xA0u~/\0\0\0\0\x90B\x930\0\0\0\0 \x92g1\0\0\0\0\x90$s2\0\0\0\0 tG3\0\0\0\0\x90\x06S4\0\0\0\0 V'5\0\0\0\0\x90\xE826\0\0\0\0 8\x077\0\0\0\0\x10\x05\x1C8\0\0\0\0 \x1A\xE78\0\0\0\0\x10\xE7\xFB9\0\0\0\0 \xFC\xC6:\0\0\0\0\x10\xC9\xDB;\0\0\0\0\xA0\x18\xB0<\0\0\0\0\x10\xAB\xBB=\0\0\0\0\xA0\xFA\x8F>\0\0\0\0\x10\x8D\x9B?\0\0\0\0\xA0\xDCo@\0\0\0\0\x90\xA9\x84A\0\0\0\0\xA0\xBEOB\0\0\0\0\x90\x8BdC\0\0\0\0\xA0\xA0/D\0\0\0\0\x90mDE\0\0\0\0 \xD3\xF3E\0\0\0\0\x10\x8A-G\0\0\0\0\x01\x02\x01\x02\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x94\x8C\xFF\xFF\xFF\xFF\xFF\xFF\x80\x8F\xFF\xFF\xFF\xFF\xFF\xFF\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFFMST\0\0\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xE8\x02o\x03\x9C\x8A\x86}\xFF\xFF\xFF\xFF\xB0\xCB\xB8\x9E\xFF\xFF\xFF\xFF\xA0#\xBB\x9F\xFF\xFF\xFF\xFF\xB0\x0C\xD0\xA0\xFF\xFF\xFF\xFF\x80\xD2\xA2\xA1\xFF\xFF\xFF\xFF\xB0(\x89\xCB\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF 4a\xD2\xFF\xFF\xFF\xFF\x90v/\xF7\xFF\xFF\xFF\xFF\x10\xA2(\xF8\xFF\xFF\xFF\xFF\x90\x84\xC5\xF8\xFF\xFF\xFF\xFF ri\x13\0\0\0\0\x10UY\x14\0\0\0\0 TI\x15\0\0\0\0\x1079\x16\0\0\0\0 6)\x17\0\0\0\0\x90S\"\x18\0\0\0\0 \x18\t\x19\0\0\0\0\x905\x02\x1A\0\0\0\0\xA04\xF2\x1A\0\0\0\0\x90\x17\xE2\x1B\0\0\0\0\xA0\x16\xD2\x1C\0\0\0\0\x90\xF9\xC1\x1D\0\0\0\0\xA0\xF8\xB1\x1E\0\0\0\0\x90\xDB\xA1\x1F\0\0\0\0 +v \0\0\0\0\x90\xBD\x81!\0\0\0\0 \rV\"\0\0\0\0\x10\xDAj#\0\0\0\0 \xEF5$\0\0\0\0\x10\xBCJ%\0\0\0\0 \xD1\x15&\0\0\0\0\x10\x9E*'\0\0\0\0\xA0\xED\xFE'\0\0\0\0\x10\x80\n)\0\0\0\0\xA0\xCF\xDE)\0\0\0\0\x10b\xEA*\0\0\0\0\xA0\xB1\xBE+\0\0\0\0\x90~\xD3,\0\0\0\0\xA0\x93\x9E-\0\0\0\0\x90`\xB3.\0\0\0\0\xA0u~/\0\0\0\0\x90B\x930\0\0\0\0 \x92g1\0\0\0\0\x90$s2\0\0\0\0 tG3\0\0\0\0\x90\x06S4\0\0\0\0 V'5\0\0\0\0\x90\xE826\0\0\0\0 8\x077\0\0\0\0\x10\x05\x1C8\0\0\0\0 \x1A\xE78\0\0\0\0\x10\xE7\xFB9\0\0\0\0 \xFC\xC6:\0\0\0\0\x10\xC9\xDB;\0\0\0\0\xA0\x18\xB0<\0\0\0\0\x10\xAB\xBB=\0\0\0\0\xA0\xFA\x8F>\0\0\0\0\x10\x8D\x9B?\0\0\0\0\xA0\xDCo@\0\0\0\0\x90\xA9\x84A\0\0\0\0\xA0\xBEOB\0\0\0\0\x90\x8BdC\0\0\0\0\xA0\xA0/D\0\0\0\0\x90mDE\0\0\0\0 \xD3\xF3E\0\0\0\0\x10\x8A-G\0\0\0\0 \xB5\xD3G\0\0\0\0\x10l\rI\0\0\0\0 \x97\xB3I\0\0\0\0\x10N\xEDJ\0\0\0\0\xA0\xB3\x9CK\0\0\0\0\x90j\xD6L\0\0\0\0\xA0\x95|M\0\0\0\0\x90L\xB6N\0\0\0\0\xA0w\\O\0\0\0\0\x90.\x96P\0\0\0\0\xA0Y\0\0\0\0\0\x7F\x9B?\0\0\0\0\x80\xC0o@\0\0\0\0\x80\x9B\x84A\0\0\0\0\x80\xA2OB\0\0\0\0\x80}dC\0\0\0\0\xE0o\xB7C\0\0\0\0pQDE\0\0\0\0\0\xB7\xF3E\0\0\0\0\xF0m-G\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xEC\xA4\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFFAKST\0p\x81\xFF\xFF\xFF\xFF\xFF\xFF\x01AKDT\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0\xA0\x02\xF4\x02\xD1\xFD\xC2?\xFF\xFF\xFF\xFF\xBF7\x87}\xFF\xFF\xFF\xFF\xB0(\x89\xCB\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF 4a\xD2\xFF\xFF\xFF\xFF0U\xB8\xFE\xFF\xFF\xFF\xFF 8\xA8\xFF\xFF\xFF\xFF\xFF07\x98\0\0\0\0\0 \x1A\x88\x01\0\0\0\x000\x19x\x02\0\0\0\0\xA06q\x03\0\0\0\0\xB05a\x04\0\0\0\0\xA0\x18Q\x05\0\0\0\0\xB0\x17A\x06\0\0\0\0\xA0\xFA0\x07\0\0\0\0\xB0Q\x8D\x07\0\0\0\0\xA0\xDC\x10\t\0\0\0\x000\xCD\xAD\t\0\0\0\0\xA0\xBE\xF0\n\0\0\0\0\xB0\xBD\xE0\x0B\0\0\0\0 \xDB\xD9\x0C\0\0\0\0\xB0\x9F\xC0\r\0\0\0\0 \xBD\xB9\x0E\0\0\0\x000\xBC\xA9\x0F\0\0\0\0 \x9F\x99\x10\0\0\0\x000\x9E\x89\x11\0\0\0\0 \x81y\x12\0\0\0\x000\x80i\x13\0\0\0\0 cY\x14\0\0\0\x000bI\x15\0\0\0\0 E9\x16\0\0\0\x000D)\x17\0\0\0\0\xA0a\"\x18\0\0\0\x000&\t\x19\0\0\0\0\xA0C\x02\x1A\0\0\0\0\x10\x14+\x1A\0\0\0\0\xB0B\xF2\x1A\0\0\0\0\xA0%\xE2\x1B\0\0\0\0\xB0$\xD2\x1C\0\0\0\0\xA0\x07\xC2\x1D\0\0\0\0\xB0\x06\xB2\x1E\0\0\0\0\xA0\xE9\xA1\x1F\0\0\0\x0009v \0\0\0\0\xA0\xCB\x81!\0\0\0\x000\x1BV\"\0\0\0\0 \xE8j#\0\0\0\x000\xFD5$\0\0\0\0 \xCAJ%\0\0\0\x000\xDF\x15&\0\0\0\0 \xAC*'\0\0\0\0\xB0\xFB\xFE'\0\0\0\0 \x8E\n)\0\0\0\0\xB0\xDD\xDE)\0\0\0\0 p\xEA*\0\0\0\0\xB0\xBF\xBE+\0\0\0\0\xA0\x8C\xD3,\0\0\0\0\xB0\xA1\x9E-\0\0\0\0\xA0n\xB3.\0\0\0\0\xB0\x83~/\0\0\0\0\xA0P\x930\0\0\0\x000\xA0g1\0\0\0\0\xA02s2\0\0\0\x000\x82G3\0\0\0\0\xA0\x14S4\0\0\0\x000d'5\0\0\0\0\xA0\xF626\0\0\0\x000F\x077\0\0\0\0 \x13\x1C8\0\0\0\x000(\xE78\0\0\0\0 \xF5\xFB9\0\0\0\x000\n\xC7:\0\0\0\0 \xD7\xDB;\0\0\0\0\xB0&\xB0<\0\0\0\0 \xB9\xBB=\0\0\0\0\xB0\x08\x90>\0\0\0\0 \x9B\x9B?\0\0\0\0\xB0\xEAo@\0\0\0\0\xA0\xB7\x84A\0\0\0\0\xB0\xCCOB\0\0\0\0\xA0\x99dC\0\0\0\0\xB0\xAE/D\0\0\0\0\xA0{DE\0\0\0\x000\xE1\xF3E\0\0\0\0 \x98-G\0\0\0\0\x01\x02\x03\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x81\xCE\0\0\0\0\0\0\x01}\xFF\xFF\xFF\xFF\xFF\xFFp\x81\xFF\xFF\xFF\xFF\xFF\xFF\x80\x8F\xFF\xFF\xFF\xFF\xFF\xFF+08\0\0\x80p\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x88\0\x99\0\x80\xCC\x1E\xFE\xFF\xFF\xFF\xFF \x06\xDAJ\0\0\0\0\xF0\xCA\x8FK\0\0\0\0 \x9C\xA9N\0\0\0\0\x90\xCDCO\0\0\0\0\x80;\nX\0\0\0\0\x10\x0F\xA4Z\0\0\0\0@\x14\xB9[\0\0\0\0\x80\x1D\x8D\\\0\0\0\x000E\x96]\0\0\0\0\0\xC5c^\0\0\0\0<\xA0x_\0\0\0\0P\xB7L`\0\0\0\0<\x82Xa\0\0\0\0P\x99,b\0\0\0\0\x11\0\0\0\0\0\x84x\x12\0\0\0\0\0\xA1\x1E\x13\0\0\0\0\0fX\x14\0\0\0\0\0\x83\xFE\x14\0\0\0\0\0H8\x16\0\0\0\0\0O\x03\x17\0\0\0\0\x80d!\x18\0\0\0\0\x001\xE3\x18\0\0\0\0\x80F\x01\x1A\0\0\0\0\x80c\xA7\x1A\0\0\0\0\x80(\xE1\x1B\0\0\0\0\x80E\x87\x1C\0\0\0\0\x80\n\xC1\x1D\0\0\0\0\x80'g\x1E\0\0\0\0\0\xB2\x97\x1F\0\0\0\0\x80~Y \0\0\0\0\x80\xCE\x80!\0\0\0\0\0\x9BB\"\0\0\0\0\0\xEBi#\0\0\0\0\0}\"$\0\0\0\0\0\xCDI%\0\0\0\0\0_\x02&\0\0\0\0\0\xAF)'\0\0\0\0\0\xB6\xF4'\0\0\0\0\x80\xE1\xED(\0\0\0\0\0\x98\xD4)\0\0\0\0\x80\xC3\xCD*\0\0\0\0\0z\xB4+\0\0\0\0\x80\xA5\xAD,\0\0\0\0\0\\\x94-\0\0\0\0\x80\x87\x8D.\0\0\0\0\0>t/\0\0\0\0\x80im0\0\0\0\0\x80Z]1\0\0\0\0\0\x86V2\0\0\0\0\x80<=3\0\0\0\0\0h64\0\0\0\0\x80\x1E\x1D5\0\0\0\0\0J\x166\0\0\0\0\x80\0\xFD6\0\0\0\0\0,\xF67\0\0\0\0\x80\xE2\xDC8\0\0\0\0\x80\xE9\xA79\0\0\0\0\x80\xC4\xBC:\0\0\0\0\x80*\xBF;\0\0\0\0\0\xE1\xA5<\0\0\0\0\x80\x0C\x9F=\0\0\0\0\0\xC3\x85>\0\0\0\0\x80\xEE~?\0\0\0\0\0\xA5e@\0\0\0\0\x80\xD0^A\0\0\0\0\0\x87EB\0\0\0\0\x80\xB2>C\0\0\0\0\x80\xA3.D\0\0\0\0\x80\x94\x1EE\0\0\0\0\0K\x05F\0\0\0\0\0\xB1\x07G\0\0\0\0\0\xA2\xF7G\0\0\0\0\0\x93\xE7H\0\0\0\0\0\x84\xD7I\0\0\0\0\0u\xC7J\0\0\0\0\xD0\xD3\x1DM\0\0\0\0\x01\x02\x02\x01\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\0\0\0\0\0\0\0\0\xA0\x8C\0\0\0\0\0\0\xB0\x9A\0\0\0\0\0\0+05\0\0PF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\0\x12\0\x802 \xE2\xFF\xFF\xFF\xFF@\"\xDAJ\0\0\0\0\x01\x02\0\0\0\0\0\0\0\0`T\0\0\0\0\0\0PF\0\0\0\0\0\0-03\0\0\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x02\x07\x03\0\xAD\x98\xF6\xFF\xFF\xFF\xFF\xB0\x9F\xE6\xF6\xFF\xFF\xFF\xFF\xC0C\x13\xF8\xFF\xFF\xFF\xFF0\xD3\xC7\xF8\xFF\xFF\xFF\xFF@w\xF4\xF9\xFF\xFF\xFF\xFF\xB06\xD3\xFA\xFF\xFF\xFF\xFF\xC05\xC3\xFB\xFF\xFF\xFF\xFF0S\xBC\xFC\xFF\xFF\xFF\xFF@R\xAC\xFD\xFF\xFF\xFF\xFF05\x9C\xFE\xFF\xFF\xFF\xFF@4\x8C\xFF\xFF\xFF\xFF\xFF\xB0J\xA3\x07\0\0\0\0\xA0o$\x08\0\0\0\0\xB0\xBC0\x17\0\0\0\0\xC0]\x06\x18\0\0\0\0\xB0V\xD1\x18\0\0\0\0\xC0?\xE6\x19\0\0\0\0\xB08\xB1\x1A\0\0\0\0@\\\xCF\x1B\0\0\0\0\xB0\x1A\x91\x1C\0\0\0\0@>\xAF\x1D\0\0\0\0\xB0\xFCp\x1E\0\0\0\0@ \x8F\x1F\0\0\0\x000\x03\x7F \0\0\0\0@\x02o!\0\0\0\x000\xFB9\"\0\0\0\0@\xE4N#\0\0\0\x000\xDD\x19$\0\0\0\0\xC0\08%\0\0\0\x000\xBF\xF9%\0\0\0\0\xC0\xF8\xF2&\0\0\0\x000\xA1\xD9'\0\0\0\0\xC0\xC4\xF7(\0\0\0\0\xB0\xBD\xC2)\0\0\0\0\xC0\xA6\xD7*\0\0\0\0\xB0\x9F\xA2+\0\0\0\0\xC0\x88\xB7,\0\0\0\0\xB0\x81\x82-\0\0\0\0\xC0j\x97.\0\0\0\0\xB0cb/\0\0\0\0@\x87\x800\0\0\0\0\xB0EB1\0\0\0\0@i`2\0\0\0\x000\xD7=3\0\0\0\0@K@4\0\0\0\x000D\x0B5\0\0\0\0@\xB8\r6\0\0\0\0\xB0\xD5\x067\0\0\0\0@\x0F\08\0\0\0\x000\x08\xCB8\0\0\0\0\xC0+\xE99\0\0\0\x000\xEA\xAA:\0\0\0\0\xC0\r\xC9;\0\0\0\x000\xCC\x8A<\0\0\0\0\xC0\xEF\xA8=\0\0\0\x000\xAEj>\0\0\0\0\xC0\xD1\x88?\0\0\0\0\xB0\xCAS@\0\0\0\0\xC0\xB3hA\0\0\0\0\xB0\xAC3B\0\0\0\0\xC0\x95HC\0\0\0\0\xB0\x8E\x13D\0\0\0\0@\xB21E\0\0\0\0\xB0p\xF3E\0\0\0\0@\x94\x11G\0\0\0\x000\x02\xEFG\0\0\0\0@v\xF1H\0\0\0\x000o\xBCI\0\0\0\0@X\xD1J\0\0\0\0\xB0\0\xB8K\0\0\0\0@:\xB1L\0\0\0\x000\x07\xC6M\0\0\0\0\xC0\x82PN\0\0\0\0\xB0\xAE\x9CO\0\0\0\0\xC0\xD9BP\0\0\0\0\xB0\x90|Q\0\0\0\0@\xF6+R\0\0\0\0\xB0r\\S\0\0\0\0@\xD8\x0BT\0\0\0\x000\xE67W\0\0\0\0\xC0\xEC\xAFW\0\0\0\0\xB0\x86CX\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x04\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x01\x03\0\0\0\0\0\0\0\0\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFF-03\0\0\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\t\0\0-\x02\r\0\0\0\0\x01\0\0\0\0\0\0\0\0\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF+00\0\0\0\0\0\0\0\0\0\0\x01+02\0\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\x000*\0\0\0\0\0\0\x18\0\x1B\0\0G\rB\0\0\0\0\x90\x05FB\0\0\0\0\x10\x1BdC\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0 \x1C\0\0\0\0\0\0+05\0\0PF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0$\0\x80\x89X\xE9\xFF\xFF\xFF\xFF\x109M-\0\0\0\0\0\x85\xB5.\0\0\0\x000E\x7Fe\0\0\0\0\x01\0\x01\x02\0\0\0\0\0\0\0\0pb\0\0\0\0\0\0PF\0\0\0\0\0\0+05\0\0PF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xA8\x01\xEC\x01\xDC{\x19\xAA\xFF\xFF\xFF\xFF0\xEF\xA3\xB5\xFF\xFF\xFF\xFF\xA0}'\x15\0\0\0\0\x10\xB2\x18\x16\0\0\0\0 \xB1\x08\x17\0\0\0\0\x90\xE5\xF9\x17\0\0\0\0\xA0\xE4\xE9\x18\0\0\0\0\x10\x19\xDB\x19\0\0\0\0\xA0i\xCC\x1A\0\0\0\0\xC0v\xBC\x1B\0\0\0\0\xC0g\xAC\x1C\0\0\0\0\xC0X\x9C\x1D\0\0\0\0\xC0I\x8C\x1E\0\0\0\0\xC0:|\x1F\0\0\0\0\xC0+l \0\0\0\0\xC0\x1C\\!\0\0\0\0\xC0\rL\"\0\0\0\0\xC0\xFE;#\0\0\0\0\xC0\xEF+$\0\0\0\0\xC0\xE0\x1B%\0\0\0\0\xC0\xD1\x0B&\0\0\0\0@\xFD\x04'\0\0\0\0@\xEE\xF4'\0\0\0\0P\xFC\xF4'\0\0\0\0P\xED\xE4(\0\0\0\0P\x95x)\0\0\0\0@\xD0\xD4)\0\0\0\0@\xC1\xC4*\0\0\0\0@\xB2\xB4+\0\0\0\0@\xA3\xA4,\0\0\0\0@\x94\x94-\0\0\0\0@\x85\x84.\0\0\0\0@vt/\0\0\0\0@gd0\0\0\0\0\xC0\x92]1\0\0\0\0\xC0mr2\0\0\0\0\xC0t=3\0\0\0\0\xC0OR4\0\0\0\0\xC0V\x1D5\0\0\0\0\xC0126\0\0\0\0\xC08\xFD6\0\0\0\0@N\x1B8\0\0\0\0\xC0\x1A\xDD8\0\0\0\0@0\xFB9\0\0\0\0\xC0\xFC\xBC:\0\0\0\0@\x12\xDB;\0\0\0\0@\x19\xA6<\0\0\0\0@\xF4\xBA=\0\0\0\0@\xFB\x85>\0\0\0\0@\xD6\x9A?\0\0\0\0@\xDDe@\0\0\0\0\xC0\xF2\x83A\0\0\0\0 \xC6\xE0e\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x02\x04\x02\x04\x01\x03\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x01$H\0\0\0\0\0\0PF\0\0\0\0\0\0`T\0\0\0\0\0\0pb\0\0\0\0\0\0`T\0\0\0\0\0\0+03\0\x000*\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xB8\x02\x10\x03\xD0\xD6\xA3\xB6\xFF\xFF\xFF\xFF\xE0yr\x06\0\0\0\0P\xAB\x0C\x07\0\0\0\0`7$\x08\0\0\0\0\xD0\xDE\xED\x08\0\0\0\0\xE0j\x05\n\0\0\0\0P\x12\xCF\n\0\0\0\0\xE0\xEF\xE7\x0B\0\0\0\0\xD0u\xDA\x0C\0\0\0\0`#\xC9\r\0\0\0\0\xD0\xCA\x92\x0E\0\0\0\0`\x05\xA9\x0F\0\0\0\0\xD0\xACr\x10\0\0\0\0`\xD5\xAD\x1C\0\0\0\0\xD0\t\x9F\x1D\0\0\0\0`\xFD\x92\x1E\0\0\0\0P\xE0\x82\x1F\0\0\0\0`\xDFr \0\0\0\0P\xC2b!\0\0\0\0`\xC1R\"\0\0\0\0\xD0\xDEK#\0\0\0\0`\xBCd$\0\0\0\0\xD0\xC0+%\0\0\0\0`o7&\0\0\0\0\xD0\xA2\x0B'\0\0\0\0\xE0s\x0B(\0\0\0\0PJ\xE2(\0\0\0\0`\xBE\xE4)\0\0\0\0\xD0f\xCB*\0\0\0\0\xE0e\xBB+\0\0\0\0\xD0H\xAB,\0\0\0\0\xE0G\x9B-\0\0\0\0\xD0\xB5x.\0\0\0\0`d\x84/\0\0\0\0\xE0\xA5X0\0\0\0\0`Fd1\0\0\0\0`\xC2A2\0\0\0\0`(D3\0\0\0\0`\xA4!4\0\0\0\0`\n$5\0\0\0\0`\x86\x016\0\0\0\0`\x93z7\0\0\0\0\xE0\xA2\xEA7\0\0\0\0\xE0|\xE28\0\0\0\0`\xBF\xD39\0\0\0\0\xE0^\xC2:\0\0\0\0`\xA1\xB3;\0\0\0\0`\x92\xA3<\0\0\0\0`\x83\x93=\0\0\0\0`t\x83>\0\0\0\0`O\x98?\0\0\0\0`Vc@\0\0\0\0\xE0\xF6nA\0\0\0\0\xE0rLB\0\0\0\0\xE0c]1\0\0\0\0`\x19r2\0\0\0\0` =3\0\0\0\0`\xFBQ4\0\0\0\0`\x02\x1D5\0\0\0\0`\xDD16\0\0\0\0`\xE4\xFC6\0\0\0\0\xE0\xF9\x1A8\0\0\0\0`\xC6\xDC8\0\0\0\0\xE0\xDB\xFA9\0\0\0\0`\xA8\xBC:\0\0\0\0\xE0\xBD\xDA;\0\0\0\0\xE0\xC4\xA5<\0\0\0\0\xE0\x9F\xBA=\0\0\0\0\xE0\xA6\x85>\0\0\0\0\xE0\x81\x9A?\0\0\0\0\xE0\x88e@\0\0\0\0`\x9E\x83A\0\0\0\0\xE0jEB\0\0\0\0`\x80cC\0\0\0\0\xE0L%D\0\0\0\0`bCE\0\0\0\0\xE0.\x05F\0\0\0\0`D#G\0\0\0\0`K\xEEG\0\0\0\0`&\x03I\0\0\0\0`-\xCEI\0\0\0\0`\x08\xE3J\0\0\0\0`\x0F\xAEK\0\0\0\0p\x1D\xAEK\0\0\0\0\xF02\xCCL\0\0\0\0p\xFF\x8DM\0\0\0\0\x01\x02\x03\x02\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x01\x05\x01\x05\x06\x02\x04\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x06\x01\x05\x06\x01\x05d\xA6\0\0\0\0\0\0\xC0\xA8\0\0\0\0\0\0\xD0\xB6\0\0\0\0\0\0\xE0\xC4\0\0\0\0\0\0\xD0\xB6\0\0\0\0\0\0\xC0\xA8\0\0\0\0\0\0\xB0\x9A\0\0\0\0\0\0+05\0\0PF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xA8\x01\xFA\x01\xE0\x94\x19\xAA\xFF\xFF\xFF\xFF@\xFD\xA3\xB5\xFF\xFF\xFF\xFF0\xCE\x18\x16\0\0\0\0 \xB1\x08\x17\0\0\0\x000\xBF\x08\x17\0\0\0\0\xA0\xF3\xF9\x17\0\0\0\0\xB0\xF2\xE9\x18\0\0\0\0 '\xDB\x19\0\0\0\0\xB0w\xCC\x1A\0\0\0\0\xD0\x84\xBC\x1B\0\0\0\0\xD0u\xAC\x1C\0\0\0\0\xD0f\x9C\x1D\0\0\0\0\xD0W\x8C\x1E\0\0\0\0\xD0H|\x1F\0\0\0\0\xD09l \0\0\0\0\xD0*\\!\0\0\0\0\xD0\x1BL\"\0\0\0\0\xD0\x0C<#\0\0\0\0\xD0\xFD+$\0\0\0\0\xD0\xEE\x1B%\0\0\0\0\xD0\xDF\x0B&\0\0\0\0P\x0B\x05'\0\0\0\0P\xFC\xF4'\0\0\0\0`\n\xF5'\0\0\0\0`\xFB\xE4(\0\0\0\0`\xA3x)\0\0\0\0P\xDE\xD4)\0\0\0\0P\xCF\xC4*\0\0\0\0P\xC0\xB4+\0\0\0\0P\xB1\xA4,\0\0\0\0P\xA2\x94-\0\0\0\0P\x93\x84.\0\0\0\0`\xA1\x84.\0\0\0\0`\x92t/\0\0\0\0`\x83d0\0\0\0\0\xE0\xAE]1\0\0\0\0\xE0\x89r2\0\0\0\0\xE0\x90=3\0\0\0\0\xE0kR4\0\0\0\0\xE0r\x1D5\0\0\0\0\xE0M26\0\0\0\0\xE0T\xFD6\0\0\0\0`j\x1B8\0\0\0\0\xE06\xDD8\0\0\0\0`L\xFB9\0\0\0\0\xE0\x18\xBD:\0\0\0\0`.\xDB;\0\0\0\0`5\xA6<\0\0\0\0`\x10\xBB=\0\0\0\0`\x17\x86>\0\0\0\0`\xF2\x9A?\0\0\0\0`\xF9e@\0\0\0\0\xE0\x0E\x84A\0\0\0\0\x01\x02\x03\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x02\x05\x02\x05\x01\x03\x04\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x01\x02\x05\x01\x02\x05\x01\x02\x05\x01\x02\x05\x01\x02\x05\x01\x02\x05\x01\x02\x05\x01\x02\x05\x01\x02\x05\x01\x02\x05\x02\x05 /\0\0\0\0\0\0@8\0\0\0\0\0\0PF\0\0\0\0\0\0`T\0\0\0\0\0\0`T\0\0\0\0\0\0PF\0\0\0\0\0\0+05\0\0PF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xA8\x01\x04\x02h\x8E\x19\xAA\xFF\xFF\xFF\xFF@\xFD\xA3\xB5\xFF\xFF\xFF\xFF\xB0\x8B'\x15\0\0\0\0 \xC0\x18\x16\0\0\0\0 \xB1\x08\x17\0\0\0\x000\xBF\x08\x17\0\0\0\0\xA0\xF3\xF9\x17\0\0\0\0\xB0\xF2\xE9\x18\0\0\0\0 '\xDB\x19\0\0\0\0\xB0w\xCC\x1A\0\0\0\0\xD0\x84\xBC\x1B\0\0\0\0\xD0u\xAC\x1C\0\0\0\0\xD0f\x9C\x1D\0\0\0\0\xD0W\x8C\x1E\0\0\0\0\xD0H|\x1F\0\0\0\0\xD09l \0\0\0\0\xD0*\\!\0\0\0\0\xD0\x1BL\"\0\0\0\0\xD0\x0C<#\0\0\0\0\xD0\xFD+$\0\0\0\0\xD0\xEE\x1B%\0\0\0\0\xD0\xDF\x0B&\0\0\0\0P\x0B\x05'\0\0\0\0P\xFC\xF4'\0\0\0\0`\n\xF5'\0\0\0\0`\xFB\xE4(\0\0\0\0`\xA3x)\0\0\0\0P\xDE\xD4)\0\0\0\0P\xCF\xC4*\0\0\0\0P\xC0\xB4+\0\0\0\0P\xB1\xA4,\0\0\0\0P\xA2\x94-\0\0\0\0P\x93\x84.\0\0\0\0P\x84t/\0\0\0\0Pud0\0\0\0\0\xD0\xA0]1\0\0\0\0\xD0{r2\0\0\0\0\xD0\x82=3\0\0\0\0\xD0]R4\0\0\0\0\xD0d\x1D5\0\0\0\0\xD0?26\0\0\0\0\xD0F\xFD6\0\0\0\0P\\\x1B8\0\0\0\0\xD0(\xDD8\0\0\0\0P>\xFB9\0\0\0\0\xD0\n\xBD:\0\0\0\0P \xDB;\0\0\0\0P'\xA6<\0\0\0\0P\x02\xBB=\0\0\0\0P\t\x86>\0\0\0\0P\xE4\x9A?\0\0\0\0P\xEBe@\0\0\0\0\xD0\0\x84A\0\0\0\0\x01\x02\x03\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x02\x05\x02\x05\x01\x03\x04\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x985\0\0\0\0\0\0@8\0\0\0\0\0\0PF\0\0\0\0\0\0`T\0\0\0\0\0\0`T\0\0\0\0\0\0PF\0\0\0\0\0\0+05\0\0PF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xD0\0\xED\0D\x8D\x19\xAA\xFF\xFF\xFF\xFF@\xFD\xA3\xB5\xFF\xFF\xFF\xFF\xB0\x8B'\x15\0\0\0\0 \xC0\x18\x16\0\0\0\x000\xBF\x08\x17\0\0\0\0\xA0\xF3\xF9\x17\0\0\0\0\xB0\xF2\xE9\x18\0\0\0\0 '\xDB\x19\0\0\0\0\xB0w\xCC\x1A\0\0\0\0\xD0\x84\xBC\x1B\0\0\0\0\xD0u\xAC\x1C\0\0\0\0\xD0f\x9C\x1D\0\0\0\0\xD0W\x8C\x1E\0\0\0\0\xD0H|\x1F\0\0\0\0\xD09l \0\0\0\0\xD0*\\!\0\0\0\0\xD0\x1BL\"\0\0\0\0\xD0\x0C<#\0\0\0\0\xD0\xFD+$\0\0\0\0\xD0\xEE\x1B%\0\0\0\0\xD0\xDF\x0B&\0\0\0\0P\x0B\x05'\0\0\0\0P\xFC\xF4'\0\0\0\0`\n\xF5'\0\0\0\0`\xFB\xE4(\0\0\0\0`\xA3x)\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x02\x04\x02\x04\x01\x02\x04\xBC6\0\0\0\0\0\0@8\0\0\0\0\0\0PF\0\0\0\0\0\0`T\0\0\0\0\0\0PF\0\0\0\0\0\0+05\0\0PF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xA8\x01\xFE\x01P\x93\x19\xAA\xFF\xFF\xFF\xFFP\x0B\xA4\xB5\xFF\xFF\xFF\xFF0\xCE\x18\x16\0\0\0\0 \xB1\x08\x17\0\0\0\x000\xBF\x08\x17\0\0\0\0\xA0\xF3\xF9\x17\0\0\0\0\xB0\xF2\xE9\x18\0\0\0\0 '\xDB\x19\0\0\0\0\xB0w\xCC\x1A\0\0\0\0\xD0\x84\xBC\x1B\0\0\0\0\xD0u\xAC\x1C\0\0\0\0\xD0f\x9C\x1D\0\0\0\0\xD0W\x8C\x1E\0\0\0\0\xD0H|\x1F\0\0\0\0\xD09l \0\0\0\0\xD0*\\!\0\0\0\0\xD0\x1BL\"\0\0\0\0\xD0\x0C<#\0\0\0\0\xD0\xFD+$\0\0\0\0\xD0\xEE\x1B%\0\0\0\0\xD0\xDF\x0B&\0\0\0\0P\x0B\x05'\0\0\0\0P\xFC\xF4'\0\0\0\0`\n\xF5'\0\0\0\0`\xFB\xE4(\0\0\0\0`\xA3x)\0\0\0\0P\xDE\xD4)\0\0\0\0P\xCF\xC4*\0\0\0\0P\xC0\xB4+\0\0\0\0P\xB1\xA4,\0\0\0\0P\xA2\x94-\0\0\0\0P\x93\x84.\0\0\0\0P\x84t/\0\0\0\0Pud0\0\0\0\0\xD0\xA0]1\0\0\0\0\xD0{r2\0\0\0\0\xD0\x82=3\0\0\0\0\xD0]R4\0\0\0\0\xD0d\x1D5\0\0\0\0\xD0?26\0\0\0\0\xD0F\xFD6\0\0\0\0\xE0T\xFD6\0\0\0\0`j\x1B8\0\0\0\0\xE06\xDD8\0\0\0\0`L\xFB9\0\0\0\0\xE0\x18\xBD:\0\0\0\0`.\xDB;\0\0\0\0`5\xA6<\0\0\0\0`\x10\xBB=\0\0\0\0`\x17\x86>\0\0\0\0`\xF2\x9A?\0\0\0\0`\xF9e@\0\0\0\0\xE0\x0E\x84A\0\0\0\0\x01\x02\x03\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x02\x05\x02\x05\x06\x03\x04\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x06\x02\x05\x06\x02\x05\x06\x02\x05\x06\x02\x05\x06\x02\x05\x06\x02\x05\x02\x05\xB00\0\0\0\0\0\x000*\0\0\0\0\0\0PF\0\0\0\0\0\0`T\0\0\0\0\0\0`T\0\0\0\0\0\0PF\0\0\0\0\0\0@8\0\0\0\0\0\0+03\0\x000*\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xB0\0\xC6\0\xDC\xB1\x86i\xFF\xFF\xFF\xFF\xE0<0\x9E\xFF\xFF\xFF\xFFPh0\x17\0\0\0\0\xC0\x0F\xFA\x17\0\0\0\0P\xBD\xE8\x18\0\0\0\0@C\xDB\x19\0\0\0\0\xD0\x93\xCC\x1A\0\0\0\0@\xC8\xBD\x1B\0\0\0\0P\xC7\xAD\x1C\0\0\0\0\xE0t\x9C\x1D\0\0\0\0\xE0e\x8C\x1E\0\0\0\0\xE0V|\x1F\0\0\0\0\xE0Gl \0\0\0\0\xE08\\!\0\0\0\0\xE0)L\"\0\0\0\0\xE0\x1A<#\0\0\0\0\xE0\x0B,$\0\0\0\0\xE0\xFC\x1B%\0\0\0\0\xE0\xED\x0B&\0\0\0\0`\x19\x05'\0\0\0\0\0x\xF6'\0\0\0\0\x80\xBA\xE7(\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\xA4)\0\0\0\0\0\0\xA0)\0\0\0\0\0\x000*\0\0\0\0\0\0@8\0\0\0\0\0\0+04\0\0@8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xF8\0\x1D\x01D\x95\x19\xAA\xFF\xFF\xFF\xFFP\x0C\xDA\xE7\xFF\xFF\xFF\xFF\xC0\x99'\x15\0\0\0\x000\xCE\x18\x16\0\0\0\0@\xCD\x08\x17\0\0\0\0\xB0\x01\xFA\x17\0\0\0\0\xC0\0\xEA\x18\0\0\0\x0005\xDB\x19\0\0\0\0\xC0\x85\xCC\x1A\0\0\0\0\xE0\x92\xBC\x1B\0\0\0\0\xE0\x83\xAC\x1C\0\0\0\0\xE0t\x9C\x1D\0\0\0\0\xE0e\x8C\x1E\0\0\0\0\xE0V|\x1F\0\0\0\0\xE0Gl \0\0\0\0\xE08\\!\0\0\0\0\xE0)L\"\0\0\0\0\xE0\x1A<#\0\0\0\0\xE0\x0B,$\0\0\0\0\xE0\xFC\x1B%\0\0\0\0\xE0\xED\x0B&\0\0\0\0`\x19\x05'\0\0\0\0`\n\xF5'\0\0\0\0p\x18\xF5'\0\0\0\0p\t\xE5(\0\0\0\0p\xFA\xD4)\0\0\0\0p\xEB\xC4*\0\0\0\0\x10\xD9]1\0\0\0\0\x10\xB4r2\0\0\0\0\0\xAD=3\0\0\0\0\0\x88R4\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x02\x04\x02\x04\x01\x02\x04\x02\x04\x03\x02\x04\x03\x02\x04\xBC.\0\0\0\0\0\x000*\0\0\0\0\0\0@8\0\0\0\0\0\0PF\0\0\0\0\0\0@8\0\0\0\0\0\0+07\0\0pb\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\0\x12\0\xC4\x85\xB6V\xFF\xFF\xFF\xFF\xC4gj\xA2\xFF\xFF\xFF\xFF\0\x01<^\0\0\0\0\0\0pb\0\0\0\0\0\0+07\0\0pb\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \x02{\x02\xFC}\xD5\xA1\xFF\xFF\xFF\xFF \xE1\xA3\xB5\xFF\xFF\xFF\xFF\x90o'\x15\0\0\0\0\0\xA4\x18\x16\0\0\0\0\x10\xA3\x08\x17\0\0\0\0\x80\xD7\xF9\x17\0\0\0\0\x90\xD6\xE9\x18\0\0\0\0\0\x0B\xDB\x19\0\0\0\0\x90[\xCC\x1A\0\0\0\0\xB0h\xBC\x1B\0\0\0\0\xB0Y\xAC\x1C\0\0\0\0\xB0J\x9C\x1D\0\0\0\0\xB0;\x8C\x1E\0\0\0\0\xB0,|\x1F\0\0\0\0\xB0\x1Dl \0\0\0\0\xB0\x0E\\!\0\0\0\0\xB0\xFFK\"\0\0\0\0\xB0\xF0;#\0\0\0\0\xB0\xE1+$\0\0\0\0\xB0\xD2\x1B%\0\0\0\0\xB0\xC3\x0B&\0\0\0\x000\xEF\x04'\0\0\0\x000\xE0\xF4'\0\0\0\0@\xEE\xF4'\0\0\0\0@\xDF\xE4(\0\0\0\0@\x87x)\0\0\0\x000\xC2\xD4)\0\0\0\x000\xB3\xC4*\0\0\0\x000\xA4\xB4+\0\0\0\x000\x95\xA4,\0\0\0\x000\x86\x94-\0\0\0\x000w\x84.\0\0\0\x000ht/\0\0\0\0\x80L\xC7/\0\0\0\0@gd0\0\0\0\0\xC0\x92]1\0\0\0\0\xC0mr2\0\0\0\0\xC0t=3\0\0\0\0\xC0OR4\0\0\0\0\xC0V\x1D5\0\0\0\0\xC0126\0\0\0\0\xC08\xFD6\0\0\0\0@N\x1B8\0\0\0\0\xC0\x1A\xDD8\0\0\0\0@0\xFB9\0\0\0\0\xC0\xFC\xBC:\0\0\0\0@\x12\xDB;\0\0\0\0@\x19\xA6<\0\0\0\0@\xF4\xBA=\0\0\0\0@\xFB\x85>\0\0\0\0@\xD6\x9A?\0\0\0\0@\xDDe@\0\0\0\0\xC0\xF2\x83A\0\0\0\0@\xBFEB\0\0\0\0\xC0\xD4cC\0\0\0\0@\xA1%D\0\0\0\0\xC0\xB6CE\0\0\0\0@\x83\x05F\0\0\0\0\xC0\x98#G\0\0\0\0\xC0\x9F\xEEG\0\0\0\0\xC0z\x03I\0\0\0\0\xC0\x81\xCEI\0\0\0\0\xC0\\\xE3J\0\0\0\0\xC0c\xAEK\0\0\0\0@y\xCCL\0\0\0\0\xC0E\x8EM\0\0\0\x000\xF3KT\0\0\0\0@\xEA\xF6V\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x02\x04\x02\x04\x01\x03\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x84N\0\0\0\0\0\0`T\0\0\0\0\0\0pb\0\0\0\0\0\0\x80p\0\0\0\0\0\0pb\0\0\0\0\0\0EET\0\0 \x1C\0\0\0\0\0\0\x01EEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\0\0\0\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\0\0\0\0\0\0\0\0\0\x08\x02I\x02\xB8\xC2\xB6V\xFF\xFF\xFF\xFF\xE0ce\xA2\xFF\xFF\xFF\xFFP\x82{\xA3\xFF\xFF\xFF\xFF`\x80N\xA4\xFF\xFF\xFF\xFF\xD0\xB4?\xA5\xFF\xFF\xFF\xFF\xE0'%\xA6\xFF\xFF\xFF\xFF\xD0\x7F'\xA7\xFF\xFF\xFF\xFF\xE0\xF3)\xA8\xFF\xFF\xFF\xFFP\xB2\xEB\xA8\xFF\xFF\xFF\xFF\xE0\x85*\xE8\xFF\xFF\xFF\xFFP-\xF4\xE8\xFF\xFF\xFF\xFF`\xB9\x0B\xEA\xFF\xFF\xFF\xFF\xD0`\xD5\xEA\xFF\xFF\xFF\xFF\xE0\xEC\xEC\xEB\xFF\xFF\xFF\xFFP\x94\xB6\xEC\xFF\xFF\xFF\xFF\xE0q\xCF\xED\xFF\xFF\xFF\xFFP\x19\x99\xEE\xFF\xFF\xFF\xFF`\xA5\xB0\xEF\xFF\xFF\xFF\xFF\xD0Lz\xF0\xFF\xFF\xFF\xFF`^\xA6\x04\0\0\0\0\xD0w+\x05\0\0\0\0\xE0\x03C\x06\0\0\0\0P\xAB\x0C\x07\0\0\0\0`7$\x08\0\0\0\0\xD0\xDE\xED\x08\0\0\0\0\xE0j\x05\n\0\0\0\0P\x12\xCF\n\0\0\0\0\xE0\xEF\xE7\x0B\0\0\0\0P\x97\xB1\x0C\0\0\0\0`#\xC9\r\0\0\0\0\xD0\xCA\x92\x0E\0\0\0\0`\x05\xA9\x0F\0\0\0\0\xD0\xACr\x10\0\0\0\0\xE0.\xF4\x1A\0\0\0\0\xD0\x9C\xD1\x1B\0\0\0\0`b\xD5\x1C\0\0\0\0P\xD0\xB2\x1D\0\0\0\0\xE0\x95\xB6\x1E\0\0\0\0\xD0\x03\x94\x1F\0\0\0\0`\xC9\x97 \0\0\0\0P7u!\0\0\0\0\xE0,\xA3\"\0\0\0\0P\xBCW#\0\0\0\0`_g$\0\0\0\0\xD0\xEF8%\0\0\0\0`\xB5<&\0\0\0\0P#\x1A'\0\0\0\0\xE0\xE8\x1D(\0\0\0\0\xD0V\xFB(\0\0\0\0\xE0m\0*\0\0\0\0\xD0\t\xCE*\0\0\0\0`\xCE\xB4+\0\0\0\0P\xB1\xA4,\0\0\0\0`\xB0\x94-\0\0\0\0P\x93\x84.\0\0\0\0`\x92t/\0\0\0\0Pud0\0\0\0\0\xE0\xAE]1\0\0\0\0\xD0\x91M2\0\0\0\0\xE0\x90=3\0\0\0\0\xD0s-4\0\0\0\0\xE0r\x1D5\0\0\0\0\xD0U\r6\0\0\0\0\xE0T\xFD6\0\0\0\0P\\\x1B8\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01H!\0\0\0\0\0\0 \x1C\0\0\0\0\0\x000*\0\0\0\0\0\0+06\0\0`T\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xA8\x01\xEE\x01\x10~\x19\xAA\xFF\xFF\xFF\xFF0\xEF\xA3\xB5\xFF\xFF\xFF\xFF\xA0}'\x15\0\0\0\0\x10\xB2\x18\x16\0\0\0\0 \xB1\x08\x17\0\0\0\0\x90\xE5\xF9\x17\0\0\0\0\xA0\xE4\xE9\x18\0\0\0\0\x10\x19\xDB\x19\0\0\0\0\xA0i\xCC\x1A\0\0\0\0\xC0v\xBC\x1B\0\0\0\0\xC0g\xAC\x1C\0\0\0\0\xC0X\x9C\x1D\0\0\0\0\xC0I\x8C\x1E\0\0\0\0\xC0:|\x1F\0\0\0\0\xC0+l \0\0\0\0\xC0\x1C\\!\0\0\0\0\xC0\rL\"\0\0\0\0\xC0\xFE;#\0\0\0\0\xC0\xEF+$\0\0\0\0\xC0\xE0\x1B%\0\0\0\0\xC0\xD1\x0B&\0\0\0\0@\xFD\x04'\0\0\0\0@\xEE\xF4'\0\0\0\0P\xFC\xF4'\0\0\0\0\xC0\xA3\xBE(\0\0\0\x0007\xE7)\0\0\0\0 \xA5\xC4*\0\0\0\x000\x19\xC7+\0\0\0\0 \x87\xA4,\0\0\0\x000\xFB\xA6-\0\0\0\0 i\x84.\0\0\0\x000\xDD\x86/\0\0\0\0 Kd0\0\0\0\x000\xBFf1\0\0\0\0\xA0gM2\0\0\0\0\xD8\x89=3\0\0\0\0\xC8VR4\0\0\0\0\xD8k\x1D5\0\0\0\0\xC8826\0\0\0\0\xD8M\xFD6\0\0\0\0HU\x1B8\0\0\0\0\xD8/\xDD8\0\0\0\0H7\xFB9\0\0\0\0\xD8\x11\xBD:\0\0\0\0H\x19\xDB;\0\0\0\0X.\xA6<\0\0\0\0H\xFB\xBA=\0\0\0\0X\x10\x86>\0\0\0\0H\xDD\x9A?\0\0\0\0X\xF2e@\0\0\0\0\xC8\xF9\x83A\0\0\0\0X\xD4EB\0\0\0\0 \x92\xFBB\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x02\x04\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x02\x04\xF0E\0\0\0\0\0\0PF\0\0\0\0\0\0`T\0\0\0\0\0\0pb\0\0\0\0\0\0`T\0\0\0\0\0\0+09\0\0\x90~\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x18\x02r\x02\xA0\xF9\xDB\xA1\xFF\xFF\xFF\xFF\0\xC5\xA3\xB5\xFF\xFF\xFF\xFFpS'\x15\0\0\0\0\xE0\x87\x18\x16\0\0\0\0\xF0\x86\x08\x17\0\0\0\0`\xBB\xF9\x17\0\0\0\0p\xBA\xE9\x18\0\0\0\0\xE0\xEE\xDA\x19\0\0\0\0p?\xCC\x1A\0\0\0\0\x90L\xBC\x1B\0\0\0\0\x90=\xAC\x1C\0\0\0\0\x90.\x9C\x1D\0\0\0\0\x90\x1F\x8C\x1E\0\0\0\0\x90\x10|\x1F\0\0\0\0\x90\x01l \0\0\0\0\x90\xF2[!\0\0\0\0\x90\xE3K\"\0\0\0\0\x90\xD4;#\0\0\0\0\x90\xC5+$\0\0\0\0\x90\xB6\x1B%\0\0\0\0\x90\xA7\x0B&\0\0\0\0\x10\xD3\x04'\0\0\0\0\x10\xC4\xF4'\0\0\0\0 \xD2\xF4'\0\0\0\0 \xC3\xE4(\0\0\0\0 kx)\0\0\0\0\x10\xA6\xD4)\0\0\0\0\x10\x97\xC4*\0\0\0\0\x10\x88\xB4+\0\0\0\0\x10y\xA4,\0\0\0\0\x10j\x94-\0\0\0\0\x10[\x84.\0\0\0\0\x10Lt/\0\0\0\0\x10=d0\0\0\0\0\x90h]1\0\0\0\0\x90Cr2\0\0\0\0\x90J=3\0\0\0\0\x90%R4\0\0\0\0\x90,\x1D5\0\0\0\0\x90\x0726\0\0\0\0\x90\x0E\xFD6\0\0\0\0\x10$\x1B8\0\0\0\0\x90\xF0\xDC8\0\0\0\0\x10\x06\xFB9\0\0\0\0\x90\xD2\xBC:\0\0\0\0\x10\xE8\xDA;\0\0\0\0\x10\xEF\xA5<\0\0\0\0\x10\xCA\xBA=\0\0\0\0\x10\xD1\x85>\0\0\0\0\x10\xAC\x9A?\0\0\0\0\x10\xB3e@\0\0\0\0\x90\xC8\x83A\0\0\0\0\x10\x95EB\0\0\0\0\x90\xAAcC\0\0\0\0\x10w%D\0\0\0\0\x90\x8CCE\0\0\0\0\x10Y\x05F\0\0\0\0\x90n#G\0\0\0\0\x90u\xEEG\0\0\0\0\x90P\x03I\0\0\0\0\x90W\xCEI\0\0\0\0\x902\xE3J\0\0\0\0\x909\xAEK\0\0\0\0\x10O\xCCL\0\0\0\0\x90\x1B\x8EM\0\0\0\0\0\xC9KT\0\0\0\0 \xCE\xF6V\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x02\x04\x02\x04\x01\x03\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x05\x01\x02\x04`j\0\0\0\0\0\0\x80p\0\0\0\0\0\0\x90~\0\0\0\0\0\0\xA0\x8C\0\0\0\0\0\0\x90~\0\0\0\0\0\0\xA0\x8C\0\0\0\0\0\0+0530XM\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0@\0J\0$\x99\xB6V\xFF\xFF\xFF\xFF\x1C\xBD\x9D\x87\xFF\xFF\xFF\xFF(\x1CZ\xCB\xFF\xFF\xFF\xFF\xA0+\x95\xCC\xFF\xFF\xFF\xFF8\x80u\xD2\xFF\xFF\xFF\xFF(\0\xA61\0\0\0\0 \0q2\0\0\0\0(\xEA?D\0\0\0\0\x01\x02\x03\x04\x02\x04\x05\x03\x06\x02\xDCJ\0\0\0\0\0\0\xE4J\0\0\0\0\0\0XM\0\0\0\0\0\0`T\0\0\0\0\0\0h[\0\0\0\0\0\0h[\0\0\0\0\0\0`T\0\0\0\0\0\0+03\0\x000*\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xC8\x03B\x04x\xAB\xF2\xA1\xFF\xFF\xFF\xFF\x80/\x81\xA2\xFF\xFF\xFF\xFFp\x9D^\xA3\xFF\xFF\xFF\xFF\x80\x11a\xA4\xFF\xFF\xFF\xFFp\x7F>\xA5\xFF\xFF\xFF\xFF\x80\xF3@\xA6\xFF\xFF\xFF\xFFpa\x1E\xA7\xFF\xFF\xFF\xFF\x80\xD5 \xA8\xFF\xFF\xFF\xFF\xF0}\x07\xA9\xFF\xFF\xFF\xFF\0R\x8F\xF1\xFF\xFF\xFF\xFFp\x9C[\xF2\xFF\xFF\xFF\xFF\x80(s\xF3\xFF\xFF\xFF\xFFp~;\xF4\xFF\xFF\xFF\xFF\x80\xADU\xF5\xFF\xFF\xFF\xFF\xF0T\x1F\xF6\xFF\xFF\xFF\xFF\0\xE16\xF7\xFF\xFF\xFF\xFF\xF06\xFF\xF7\xFF\xFF\xFF\xFF\0\xDA\x0E\xF9\xFF\xFF\xFF\xFF\xF0\xBB\xE1\xF9\xFF\xFF\xFF\xFF\0H\xF9\xFA\xFF\xFF\xFF\xFFp\xEF\xC2\xFB\xFF\xFF\xFF\xFF\0\xCD\xDB\xFC\xFF\xFF\xFF\xFFpt\xA5\xFD\xFF\xFF\xFF\xFF\x80\0\xBD\xFE\xFF\xFF\xFF\xFF\xF0\xA7\x86\xFF\xFF\xFF\xFF\xFF\x004\x9E\0\0\0\0\0p\xDBg\x01\0\0\0\0\x80g\x7F\x02\0\0\0\0\xF0\x0EI\x03\0\0\0\0\x80\xECa\x04\0\0\0\0\xF0\x93+\x05\0\0\0\0\0 C\x06\0\0\0\0p\xC7\x0C\x07\0\0\0\0\x80S$\x08\0\0\0\0\xF0\xFA\xED\x08\0\0\0\0\0\x87\x05\n\0\0\0\0p.\xCF\n\0\0\0\0\0\x0C\xE8\x0B\0\0\0\0p\xB3\xB1\x0C\0\0\0\0\x80?\xC9\r\0\0\0\0\xF0Yk\x0E\0\0\0\0\0s\xAA\x0F\0\0\0\0p\x8DL\x10\0\0\0\0\0\xC5\xF4\x18\0\0\0\0pm\xDB\x19\0\0\0\0\0J\xD7\x1A\0\0\0\0p\xF2\xBD\x1B\0\0\0\0\0#U\x1E\0\0\0\0p\xE5\x8A\x1F\0\0\0\0\0zG \0\0\0\0\xF0\x19\x89!\0\0\0\0\0t<\"\0\0\0\0\xF0\x9Ek#\0\0\0\0\x80\xBF2$\0\0\0\0pE%%\0\0\0\0\x80D\x15&\0\0\0\0p'\x05'\0\0\0\0\xE0[\xF6'\0\0\0\0P\x90\xE7(\0\0\0\0`\x1B\xE2)\0\0\0\0P\x15\xCA*\0\0\0\0`+\xB2+\0\0\0\0\xD0_\xA3,\0\0\0\0\xE0G\x9B-\0\0\0\0P|\x8C.\0\0\0\0`{|/\0\0\0\0\xD0\xAFm0\0\0\0\0`\0_1\0\0\0\0\xD04P2\0\0\0\0`\xE2>3\0\0\0\0Ph14\0\0\0\0`\xC4\x1E5\0\0\0\0\xD0\x9B\x126\0\0\0\0\xE0\x9A\x027\0\0\0\0P\xCF\xF37\0\0\0\0\xE0\x1F\xE58\0\0\0\0PT\xD69\0\0\0\0`S\xC6:\0\0\0\0\xD0\x87\xB7;\0\0\0\0\xE0\x86\xA7<\0\0\0\0P\xBB\x98=\0\0\0\0`\xBA\x88>\0\0\0\0\xD0\xEEy?\0\0\0\0`?k@\0\0\0\0\xD0s\\A\0\0\0\0\xE0rLB\0\0\0\0P\xA7=C\0\0\0\0`\xA6-D\0\0\0\0P\xFD\x12E\0\0\0\0\xE06\x0CF\0\0\0\0P>*G\0\0\0\0`S\xF5G\0\0\0\0\xD0q\x0BI\0\0\0\0\xE0\xFA\xCBI\0\0\0\0P\x02\xEAJ\0\0\0\0`\x17\xB5K\0\0\0\0P\xE4\xC9L\0\0\0\0`\xF9\x94M\0\0\0\0P\xC6\xA9N\0\0\0\0`\xDBtO\0\0\0\0P\xA8\x89P\0\0\0\0`\xBDTQ\0\0\0\0P\x8AiR\0\0\0\0`\x9F4S\0\0\0\0\xD0\xA6RT\0\0\0\0`\x81\x14U\0\0\0\0\xD0\x882V\0\0\0\0`c\xF4V\0\0\0\0\xD0j\x12X\0\0\0\0\xE0\x7F\xDDX\0\0\0\0\xD0L\xF2Y\0\0\0\0\xE0a\xBDZ\0\0\0\0\xD0.\xD2[\0\0\0\0\xE0C\x9D\\\0\0\0\0\xD0\x10\xB2]\0\0\0\0\xE0%}^\0\0\0\0P-\x9B_\0\0\0\0\xE0\x07]`\0\0\0\0P\x0F{a\0\0\0\0\xE0\xE9\0\0\0\0\x90\x1C\x9B?\0\0\0\0\x90#f@\0\0\0\0\x109\x84A\0\0\0\0\x90\x05FB\0\0\0\0\x10\x1BdC\0\0\0\0\x90\xE7%D\0\0\0\0\x10\xFDCE\0\0\0\0\x90\xC9\x05F\0\0\0\0\x10\xDF#G\0\0\0\0\x10\xE6\xEEG\0\0\0\0\x10\xC1\x03I\0\0\0\0\x10\xC8\xCEI\0\0\0\0\x10\xA3\xE3J\0\0\0\0\x10\xAA\xAEK\0\0\0\0\x90\xBF\xCCL\0\0\0\0\x10\x8C\x8EM\0\0\0\0\x90\xA1\xACN\0\0\0\0\x10nnO\0\0\0\0\x90\x83\x8CP\0\0\0\0\x90\x8AWQ\0\0\0\0\x90elR\0\0\0\0\x90l7S\0\0\0\0\x90GLT\0\0\0\0\x90N\x17U\0\0\0\0\x90),V\0\0\0\0\x900\xF7V\0\0\0\0\xD0\x7F\xD0W\0\0\0\0\x10(\xF5Y\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x02\x03\x01\xD4\x1F\0\0\0\0\0\0 \x1C\0\0\0\0\0\x000*\0\0\0\0\0\x000*\0\0\0\0\0\0EET\0\0 \x1C\0\0\0\0\0\0\x01EEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x04\x06 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\n\x04\x06 \x1C\0\0\0\0\0\0\xE0\x07\xDC\x08\xB0J\xBD}\xFF\xFF\xFF\xFF\0\xCFY\xC8\xFF\xFF\xFF\xFF\0\xA6\xFA\xC8\xFF\xFF\xFF\xFF\x80\x9C8\xC9\xFF\xFF\xFF\xFF\x80\xEB\xE5\xCC\xFF\xFF\xFF\xFF\0\xFE\xAC\xCD\xFF\xFF\xFF\xFF\0\x1F\xC7\xCE\xFF\xFF\xFF\xFF\0\x83\x8F\xCF\xFF\xFF\xFF\xFF\0\xA4\xA9\xD0\xFF\xFF\xFF\xFF\0}\x84\xD1\xFF\xFF\xFF\xFF\x80\xD7\x8A\xD2\xFF\xFF\xFF\xFF\x80\xB0e\xD3\xFF\xFF\xFF\xFF\0\x0Bl\xD4\xFF\xFF\xFF\xFF`c6\xE8\xFF\xFF\xFF\xFFP-\xF4\xE8\xFF\xFF\xFF\xFF`\xB9\x0B\xEA\xFF\xFF\xFF\xFF\xD0`\xD5\xEA\xFF\xFF\xFF\xFF\xF0\xFA\xEC\xEB\xFF\xFF\xFF\xFF\0m\xB5\xEC\xFF\xFF\xFF\xFF\xF0\x7F\xCF\xED\xFF\xFF\xFF\xFF\0\xF2\x97\xEE\xFF\xFF\xFF\xFFp\xB3\xB0\xEF\xFF\xFF\xFF\xFF\x80%y\xF0\xFF\xFF\xFF\xFF\xF0\xE6\x91\xF1\xFF\xFF\xFF\xFF\0YZ\xF2\xFF\xFF\xFF\xFFp\x1As\xF3\xFF\xFF\xFF\xFF\x80\x8C;\xF4\xFF\xFF\xFF\xFFp\x9FU\xF5\xFF\xFF\xFF\xFF\x80\x11\x1E\xF6\xFF\xFF\xFF\xFF\xF0\xD26\xF7\xFF\xFF\xFF\xFF\0E\xFF\xF7\xFF\xFF\xFF\xFFp\x06\x18\xF9\xFF\xFF\xFF\xFF\0\xCA\xE1\xF9\xFF\xFF\xFF\xFF\xF09\xF9\xFA\xFF\xFF\xFF\xFFPB'\xFB\xFF\xFF\xFF\xFF\xE0\x8B|\x08\0\0\0\0\xD0\xB0\xFD\x08\0\0\0\0`\xEA\xF6\t\0\0\0\0\xD03\xA6\n\0\0\0\0`\xFC\xE9\x13\0\0\0\0`[!\x14\0\0\0\0`\xC6\xFA\x1A\0\0\0\0`n\x8E\x1B\0\0\0\0\xE0\xF8\xBE\x1C\0\0\0\0\xD0|w\x1D\0\0\0\0`\xFF\xCC\x1E\0\0\0\0P\x99`\x1F\0\0\0\0`\xB1\x82 \0\0\0\0\xD0\xB5I!\0\0\0\0\xE0\x9E^\"\0\0\0\0P] #\0\0\0\0`0Z$\0\0\0\0P?\0%\0\0\0\0\xE0\xED\x0B&\0\0\0\0\xD0\xE6\xD6&\0\0\0\0\xE0\xCF\xEB'\0\0\0\0P\x03\xC0(\0\0\0\0`\xEC\xD4)\0\0\0\0\xD0\x1F\xA9*\0\0\0\0\xE0e\xBB+\0\0\0\0\xD0\x01\x89,\0\0\0\0\xE0G\x9B-\0\0\0\0P\xA9_.\0\0\0\0\xE0){/\0\0\0\0\xD0\xC5H0\0\0\0\0\xE0\x07\xE70\0\0\0\0`Fd1\0\0\0\0`\xC2A2\0\0\0\0`(D3\0\0\0\0`\xA4!4\0\0\0\0`\n$5\0\0\0\0`\x86\x016\0\0\0\0`a\x167\0\0\0\0PD\x068\0\0\0\0\xE0}\xFF8\0\0\0\0\xD0`\xEF9\0\0\0\0\xE0_\xDF:\0\0\0\0\xD0B\xCF;\0\0\0\0\xE0A\xBF<\0\0\0\0\xD0$\xAF=\0\0\0\0\xE0#\x9F>\0\0\0\0\xD0\x06\x8F?\0\0\0\0\xE0\x05\x7F@\0\0\0\0\xE0\x81\\A\0\0\0\0\xE0\xE7^B\0\0\0\0\xF0\xB7AC\0\0\0\0`\xA6-D\0\0\0\0P\xFD\x12E\0\0\0\0\xE0\xD9\x0EF\0\0\0\0po\xE8F\0\0\0\0\xE0\x18\xECG\0\0\0\0\xD0\x11\xB7H\0\0\0\0\xE0\xFA\xCBI\0\0\0\0`<\xA0J\0\0\0\0\x9C.\xADK\0\0\0\0\xD0\xBDaL\0\0\0\0\x9C\xF9\x94M\0\0\0\0P\xC25N\0\0\0\0`\xDBtO\0\0\0\0\xE0\x91[P\0\0\0\0`\xBDTQ\0\0\0\0P\xA0DR\0\0\0\0`\x9F4S\0\0\0\0PlIT\0\0\0\0\xE0\xD2\x15U\0\0\0\0`\\)V\0\0\0\0\xF0\xC2\xF5V\0\0\0\0`\xCA\x13X\0\0\0\0\xF0\xA4\xD5X\0\0\0\0`\xAC\xF3Y\0\0\0\0\xF0\x86\xB5Z\0\0\0\0`\x8E\xD3[\0\0\0\0\xE0C\x9D\\\0\0\0\0Pb\xB3]\0\0\0\0`w~^\0\0\0\0`R\x93_\0\0\0\0`Y^`\0\0\0\0`\x1D{a\0\0\0\0\xE0\x8C?b\0\0\0\0\xF0^\\c\0\0\0\0\0^Ld\0\0\0\0\xF0@\"\x90\0\0\0\0\xF0x~\x90\0\0\0\0\0\x8EI\x91\0\0\0\0\xF0=\xB8\x91\0\0\0\0\0\xAB\xEF\x91\0\0\0\0\xF0Z^\x92\0\0\0\0\0p)\x93\0\0\0\0\xF0\xAA\x85\x93\0\0\0\0\x80R\xC6\x93\0\0\0\0\xF0<>\x94\0\0\0\0\0R\t\x95\0\0\0\0pR\\\x95\0\0\0\0\x80\xBF\x93\x95\0\0\0\0pY'\x96\0\0\0\0\x004\xE9\x96\0\0\0\0\xF0\xF92\x97\0\0\0\0\0gj\x97\0\0\0\0p;\x07\x98\0\0\0\0\0\x16\xC9\x98\0\0\0\0\xF0f\0\x99\0\0\0\0\x80\x0EA\x99\0\0\0\0p\x1D\xE7\x99\0\0\0\0\x802\xB2\x9A\0\0\0\0p\x0E\xD7\x9A\0\0\0\0\x80{\x0E\x9B\0\0\0\0p\xFF\xC6\x9B\0\0\0\0\x80\x14\x92\x9C\0\0\0\0p{\xA4\x9C\0\0\0\0\0#\xE5\x9C\0\0\0\0p\xE1\xA6\x9D\0\0\0\0\x80\xF6q\x9E\0\0\0\0\xF0\"{\x9E\0\0\0\0\x80\xCA\xBB\x9E\0\0\0\0p\xC3\x86\x9F\0\0\0\0\x807\x89\xA0\0\0\0\0\xF0\xDFo\xA1\0\0\0\0\0\xDF_\xA2\0\0\0\0\xF0\xC1O\xA3\0\0\0\0\0L-\xA4\0\0\0\0\xF0\xA3/\xA5\0\0\0\0\x80\xF3\x03\xA6\0\0\0\0\xF0\x85\x0F\xA7\0\0\0\0\0\x9B\xDA\xA7\0\0\0\0\xF0g\xEF\xA8\0\0\0\0\0}\xBA\xA9\0\0\0\0p\x84\xD8\xAA\0\0\0\0\0_\x9A\xAB\0\0\0\0pf\xB8\xAC\0\0\0\0\0Az\xAD\0\0\0\0pH\x98\xAE\0\0\0\0\0#Z\xAF\0\0\0\0p*x\xB0\0\0\0\0\x80?C\xB1\0\0\0\0p\x0CX\xB2\0\0\0\0\x80!#\xB3\0\0\0\0p\xEE7\xB4\0\0\0\0\x80\x03\x03\xB5\0\0\0\0\xF0\n!\xB6\0\0\0\0\x80\xE5\xE2\xB6\0\0\0\0\xF0\xEC\0\xB8\0\0\0\0\x80\xC7\xC2\xB8\0\0\0\0p\x94\xD7\xB9\0\0\0\0\0\xE4\xAB\xBA\0\0\0\0\xF0;\xAE\xBB\0\0\0\0\0\xC6\x8B\xBC\0\0\0\0p\xE3\x84\xBD\0\0\0\0\0\xA8k\xBE\0\0\0\0pPR\xBF\0\0\0\0\0\x8AK\xC0\0\0\0\0\xF0\xF7(\xC1\0\0\0\0\0e`\xC1\0\0\0\0p\x91i\xC1\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01P \0\0\0\0\0\0 \x1C\0\0\0\0\0\x000*\0\0\0\0\0\0EET\0\0 \x1C\0\0\0\0\0\0\x01EEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x04\x06 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\n\x04\x06 \x1C\0\0\0\0\0\0\xF0\x07\xEE\x08\x19J\xBD}\xFF\xFF\xFF\xFF\0\xCFY\xC8\xFF\xFF\xFF\xFF\0\xA6\xFA\xC8\xFF\xFF\xFF\xFF\x80\x9C8\xC9\xFF\xFF\xFF\xFF\x80\xEB\xE5\xCC\xFF\xFF\xFF\xFF\0\xFE\xAC\xCD\xFF\xFF\xFF\xFF\0\x1F\xC7\xCE\xFF\xFF\xFF\xFF\0\x83\x8F\xCF\xFF\xFF\xFF\xFF\0\xA4\xA9\xD0\xFF\xFF\xFF\xFF\0}\x84\xD1\xFF\xFF\xFF\xFF\x80\xD7\x8A\xD2\xFF\xFF\xFF\xFF\x80\xB0e\xD3\xFF\xFF\xFF\xFF\0\x0Bl\xD4\xFF\xFF\xFF\xFF`c6\xE8\xFF\xFF\xFF\xFFP-\xF4\xE8\xFF\xFF\xFF\xFF`\xB9\x0B\xEA\xFF\xFF\xFF\xFF\xD0`\xD5\xEA\xFF\xFF\xFF\xFF\xF0\xFA\xEC\xEB\xFF\xFF\xFF\xFF\0m\xB5\xEC\xFF\xFF\xFF\xFF\xF0\x7F\xCF\xED\xFF\xFF\xFF\xFF\0\xF2\x97\xEE\xFF\xFF\xFF\xFFp\xB3\xB0\xEF\xFF\xFF\xFF\xFF\x80%y\xF0\xFF\xFF\xFF\xFF\xF0\xE6\x91\xF1\xFF\xFF\xFF\xFF\0YZ\xF2\xFF\xFF\xFF\xFFp\x1As\xF3\xFF\xFF\xFF\xFF\x80\x8C;\xF4\xFF\xFF\xFF\xFFp\x9FU\xF5\xFF\xFF\xFF\xFF\x80\x11\x1E\xF6\xFF\xFF\xFF\xFF\xF0\xD26\xF7\xFF\xFF\xFF\xFF\0E\xFF\xF7\xFF\xFF\xFF\xFFp\x06\x18\xF9\xFF\xFF\xFF\xFF\0\xCA\xE1\xF9\xFF\xFF\xFF\xFF\xF09\xF9\xFA\xFF\xFF\xFF\xFFPB'\xFB\xFF\xFF\xFF\xFF\xE0\x8B|\x08\0\0\0\0\xD0\xB0\xFD\x08\0\0\0\0`\xEA\xF6\t\0\0\0\0\xD03\xA6\n\0\0\0\0`\xFC\xE9\x13\0\0\0\0`[!\x14\0\0\0\0`\xC6\xFA\x1A\0\0\0\0`n\x8E\x1B\0\0\0\0\xE0\xF8\xBE\x1C\0\0\0\0\xD0|w\x1D\0\0\0\0`\xFF\xCC\x1E\0\0\0\0P\x99`\x1F\0\0\0\0`\xB1\x82 \0\0\0\0\xD0\xB5I!\0\0\0\0\xE0\x9E^\"\0\0\0\0P] #\0\0\0\0`0Z$\0\0\0\0P?\0%\0\0\0\0\xE0\xED\x0B&\0\0\0\0\xD0\xE6\xD6&\0\0\0\0\xE0\xCF\xEB'\0\0\0\0P\x03\xC0(\0\0\0\0`\xEC\xD4)\0\0\0\0\xD0\x1F\xA9*\0\0\0\0\xE0e\xBB+\0\0\0\0\xD0\x01\x89,\0\0\0\0\xE0G\x9B-\0\0\0\0P\xA9_.\0\0\0\0\xE0){/\0\0\0\0\xD0\xC5H0\0\0\0\0\xE0\x07\xE70\0\0\0\0`Fd1\0\0\0\0`\xC2A2\0\0\0\0`(D3\0\0\0\0`\xA4!4\0\0\0\0`\n$5\0\0\0\0`\x86\x016\0\0\0\0`a\x167\0\0\0\0PD\x068\0\0\0\0\xE0}\xFF8\0\0\0\0\xD0`\xEF9\0\0\0\0\xE0_\xDF:\0\0\0\0\xD0B\xCF;\0\0\0\0\xE0A\xBF<\0\0\0\0\xD0$\xAF=\0\0\0\0\xE0#\x9F>\0\0\0\0\xD0\x06\x8F?\0\0\0\0\xE0\x05\x7F@\0\0\0\0\xE0\x81\\A\0\0\0\0\xE0\xE7^B\0\0\0\0\xF0\xB7AC\0\0\0\0`\xA6-D\0\0\0\0P\xFD\x12E\0\0\0\0\xE0\xD9\x0EF\0\0\0\0po\xE8F\0\0\0\0\xE0\x18\xECG\0\0\0\0P\x06\xBBH\0\0\0\0\xE0\xFA\xCBI\0\0\0\0`<\xA0J\0\0\0\0\xE0\xDC\xABK\0\0\0\0\xD0\xBDaL\0\0\0\0\x9C\xF9\x94M\0\0\0\0P\xC25N\0\0\0\0\xE0\x0B\\N\0\0\0\0P\xDC\x84N\0\0\0\0`\xDBtO\0\0\0\0\xE0\x91[P\0\0\0\0`\xBDTQ\0\0\0\0P\xA0DR\0\0\0\0`\x9F4S\0\0\0\0PlIT\0\0\0\0\xE0\xD2\x15U\0\0\0\0`\\)V\0\0\0\0\xF0\xC2\xF5V\0\0\0\0`\xCA\x13X\0\0\0\0\xF0\xA4\xD5X\0\0\0\0`\xAC\xF3Y\0\0\0\0\xF0\x86\xB5Z\0\0\0\0`\x8E\xD3[\0\0\0\0\xE0C\x9D\\\0\0\0\0Pb\xB3]\0\0\0\0`w~^\0\0\0\0`R\x93_\0\0\0\0`Y^`\0\0\0\0`\x1D{a\0\0\0\0\xE0\x8C?b\0\0\0\0\xF0^\\c\0\0\0\0\0^Ld\0\0\0\0\xF0@\"\x90\0\0\0\0\xF0x~\x90\0\0\0\0\0\x8EI\x91\0\0\0\0\xF0=\xB8\x91\0\0\0\0\0\xAB\xEF\x91\0\0\0\0\xF0Z^\x92\0\0\0\0\0p)\x93\0\0\0\0\xF0\xAA\x85\x93\0\0\0\0\x80R\xC6\x93\0\0\0\0\xF0<>\x94\0\0\0\0\0R\t\x95\0\0\0\0pR\\\x95\0\0\0\0\x80\xBF\x93\x95\0\0\0\0pY'\x96\0\0\0\0\x004\xE9\x96\0\0\0\0\xF0\xF92\x97\0\0\0\0\0gj\x97\0\0\0\0p;\x07\x98\0\0\0\0\0\x16\xC9\x98\0\0\0\0\xF0f\0\x99\0\0\0\0\x80\x0EA\x99\0\0\0\0p\x1D\xE7\x99\0\0\0\0\x802\xB2\x9A\0\0\0\0p\x0E\xD7\x9A\0\0\0\0\x80{\x0E\x9B\0\0\0\0p\xFF\xC6\x9B\0\0\0\0\x80\x14\x92\x9C\0\0\0\0p{\xA4\x9C\0\0\0\0\0#\xE5\x9C\0\0\0\0p\xE1\xA6\x9D\0\0\0\0\x80\xF6q\x9E\0\0\0\0\xF0\"{\x9E\0\0\0\0\x80\xCA\xBB\x9E\0\0\0\0p\xC3\x86\x9F\0\0\0\0\x807\x89\xA0\0\0\0\0\xF0\xDFo\xA1\0\0\0\0\0\xDF_\xA2\0\0\0\0\xF0\xC1O\xA3\0\0\0\0\0L-\xA4\0\0\0\0\xF0\xA3/\xA5\0\0\0\0\x80\xF3\x03\xA6\0\0\0\0\xF0\x85\x0F\xA7\0\0\0\0\0\x9B\xDA\xA7\0\0\0\0\xF0g\xEF\xA8\0\0\0\0\0}\xBA\xA9\0\0\0\0p\x84\xD8\xAA\0\0\0\0\0_\x9A\xAB\0\0\0\0pf\xB8\xAC\0\0\0\0\0Az\xAD\0\0\0\0pH\x98\xAE\0\0\0\0\0#Z\xAF\0\0\0\0p*x\xB0\0\0\0\0\x80?C\xB1\0\0\0\0p\x0CX\xB2\0\0\0\0\x80!#\xB3\0\0\0\0p\xEE7\xB4\0\0\0\0\x80\x03\x03\xB5\0\0\0\0\xF0\n!\xB6\0\0\0\0\x80\xE5\xE2\xB6\0\0\0\0\xF0\xEC\0\xB8\0\0\0\0\x80\xC7\xC2\xB8\0\0\0\0p\x94\xD7\xB9\0\0\0\0\0\xE4\xAB\xBA\0\0\0\0\xF0;\xAE\xBB\0\0\0\0\0\xC6\x8B\xBC\0\0\0\0p\xE3\x84\xBD\0\0\0\0\0\xA8k\xBE\0\0\0\0pPR\xBF\0\0\0\0\0\x8AK\xC0\0\0\0\0\xF0\xF7(\xC1\0\0\0\0\0e`\xC1\0\0\0\0p\x91i\xC1\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xE7 \0\0\0\0\0\0 \x1C\0\0\0\0\0\x000*\0\0\0\0\0\0+07\0\0pb\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0H\0Q\0\x8AC\x8C\x88\xFF\xFF\xFF\xFF\n+\xA3\x91\xFF\xFF\xFF\xFF\x80\xE65\xCD\xFF\xFF\xFF\xFFp\xCEY\xD1\xFF\xFF\xFF\xFF\xF0>;\xD2\xFF\xFF\xFF\xFF\x10\xBB2\xD5\xFF\xFF\xFF\xFF\x90\xF2\xB6\xE4\xFF\xFF\xFF\xFF\0\x98/\xED\xFF\xFF\xFF\xFF\0\xC7=\n\0\0\0\0\0\x01\x02\x03\x01\x02\x01\x02\x01\xF6c\0\0\0\0\0\0pb\0\0\0\0\0\0\x80p\0\0\0\0\0\0\x90~\0\0\0\0\0\0HKT\0\0\x80p\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0(\x02\x8E\x02\x90ci\x85\xFF\xFF\xFF\xFF01M\xCA\xFF\xFF\xFF\xFF0\x93\xDB\xCA\xFF\xFF\xFF\xFFxqK\xCB\xFF\xFF\xFF\xFF\x90\xDE\xA0\xD2\xFF\xFF\xFF\xFF\x80\xD7k\xD3\xFF\xFF\xFF\xFF\xB8X\x93\xD4\xFF\xFF\xFF\xFF8\xB0B\xD5\xFF\xFF\xFF\xFF\xB8:s\xD6\xFF\xFF\xFF\xFF\xB8A>\xD7\xFF\xFF\xFF\xFF\xB82.\xD8\xFF\xFF\xFF\xFF\xB89\xF9\xD8\xFF\xFF\xFF\xFF\xB8\x14\x0E\xDA\xFF\xFF\xFF\xFF\xB8\x1B\xD9\xDA\xFF\xFF\xFF\xFF\xB8\xF6\xED\xDB\xFF\xFF\xFF\xFF\xB8\xFD\xB8\xDC\xFF\xFF\xFF\xFF\xB8\xD8\xCD\xDD\xFF\xFF\xFF\xFF8\x1A\xA2\xDE\xFF\xFF\xFF\xFF8\xF5\xB6\xDF\xFF\xFF\xFF\xFF8\xFC\x81\xE0\xFF\xFF\xFF\xFF(\xC9\x96\xE1\xFF\xFF\xFF\xFF8iO\xE2\xFF\xFF\xFF\xFF(\xABv\xE3\xFF\xFF\xFF\xFF8K/\xE4\xFF\xFF\xFF\xFF\xA8\xC7_\xE5\xFF\xFF\xFF\xFF8-\x0F\xE6\xFF\xFF\xFF\xFF\xA8\xA9?\xE7\xFF\xFF\xFF\xFF\xB8I\xF8\xE7\xFF\xFF\xFF\xFF\xA8\x8B\x1F\xE9\xFF\xFF\xFF\xFF\xB8+\xD8\xE9\xFF\xFF\xFF\xFF\xA8m\xFF\xEA\xFF\xFF\xFF\xFF\xB8\r\xB8\xEB\xFF\xFF\xFF\xFF\xA8O\xDF\xEC\xFF\xFF\xFF\xFF\xB8\xEF\x97\xED\xFF\xFF\xFF\xFF(l\xC8\xEE\xFF\xFF\xFF\xFF\xB8\xD1w\xEF\xFF\xFF\xFF\xFF(N\xA8\xF0\xFF\xFF\xFF\xFF\xB8\xB3W\xF1\xFF\xFF\xFF\xFF(0\x88\xF2\xFF\xFF\xFF\xFF8\xD0@\xF3\xFF\xFF\xFF\xFF(\x12h\xF4\xFF\xFF\xFF\xFF8\xB2 \xF5\xFF\xFF\xFF\xFF(\xF4G\xF6\xFF\xFF\xFF\xFF8~%\xF7\xFF\xFF\xFF\xFF(a\x15\xF8\xFF\xFF\xFF\xFF8`\x05\xF9\xFF\xFF\xFF\xFF(C\xF5\xF9\xFF\xFF\xFF\xFF8B\xE5\xFA\xFF\xFF\xFF\xFF\xA8_\xDE\xFB\xFF\xFF\xFF\xFF\xB8^\xCE\xFC\xFF\xFF\xFF\xFF\xA8A\xBE\xFD\xFF\xFF\xFF\xFF\xB8@\xAE\xFE\xFF\xFF\xFF\xFF\xA8#\x9E\xFF\xFF\xFF\xFF\xFF\xB8\"\x8E\0\0\0\0\0\xA8\x05~\x01\0\0\0\0\xB8\x04n\x02\0\0\0\0\xA8\xE7]\x03\0\0\0\0\xB8\xE6M\x04\0\0\0\0(\x04G\x05\0\0\0\08\x037\x06\0\0\0\0(\xE6&\x07\0\0\0\08=\x83\x07\0\0\0\0(\xC8\x06\t\0\0\0\08\xC7\xF6\t\0\0\0\0(\xAA\xE6\n\0\0\0\08\xA9\xD6\x0B\0\0\0\0(\x8C\xC6\x0C\0\0\0\089\x9B\x11\0\0\0\0\xA8lo\x12\0\0\0\0\x01\x02\x03\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\nk\0\0\0\0\0\0\x80p\0\0\0\0\0\0\x90~\0\0\0\0\0\0\x88w\0\0\0\0\0\0\x90~\0\0\0\0\0\0+07\0\0pb\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x80\x01\xB0\x01\x94\xFC\xD3\x86\xFF\xFF\xFF\xFF\xA0\xEA\x0B\x0F\0\0\0\0\x90\xD6\xE9\x18\0\0\0\0\0\x0B\xDB\x19\0\0\0\0\x90[\xCC\x1A\0\0\0\0\x80>\xBC\x1B\0\0\0\0\x90=\xAC\x1C\0\0\0\0\x80 \x9C\x1D\0\0\0\0\x90\x1F\x8C\x1E\0\0\0\0\x80\x02|\x1F\0\0\0\0\x90\x01l \0\0\0\0\x80\xE4[!\0\0\0\0\x90\xE3K\"\0\0\0\0\x80\xC6;#\0\0\0\0\x90\xC5+$\0\0\0\0\x80\xA8\x1B%\0\0\0\0\x90\xA7\x0B&\0\0\0\0\0\xC5\x04'\0\0\0\0\x10\xC4\xF4'\0\0\0\0\0\xA7\xE4(\0\0\0\0\x10\xA6\xD4)\0\0\0\0\0\x89\xC4*\0\0\0\0\x10\x88\xB4+\0\0\0\0\0k\xA4,\0\0\0\0\x10j\x94-\0\0\0\0\0M\x84.\0\0\0\0\x10Lt/\0\0\0\0\0/d0\0\0\0\0\x90h]1\0\0\0\0\x80KM2\0\0\0\0\x90J=3\0\0\0\0\x80--4\0\0\0\0\x90,\x1D5\0\0\0\0\x80\x0F\r6\0\0\0\0\xB0\xC1\xE9:\0\0\0\0\xA0\xBA\xB4;\0\0\0\0\xB0\xB9\xA4<\0\0\0\0\xA0\x9C\x94=\0\0\0\0\xB0\x9B\x84>\0\0\0\0\xA0~t?\0\0\0\0\xB0}d@\0\0\0\0\xA0`TA\0\0\0\0\xB0_DB\0\0\0\0\xA0B4C\0\0\0\0\xB0A$D\0\0\0\0 _\x1DE\0\0\0\0\xB0\xA8\x15U\0\0\0\0\x80o\x05V\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\xECU\0\0\0\0\0\0`T\0\0\0\0\0\0pb\0\0\0\0\0\0\x80p\0\0\0\0\0\0+08\0\0\x80p\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x18\x02r\x02?\x82\xB6V\xFF\xFF\xFF\xFF\xBF\x0F\x12\xA2\xFF\xFF\xFF\xFF\x10\xD3\xA3\xB5\xFF\xFF\xFF\xFF\x80a'\x15\0\0\0\0\xF0\x95\x18\x16\0\0\0\0\0\x95\x08\x17\0\0\0\0p\xC9\xF9\x17\0\0\0\0\x80\xC8\xE9\x18\0\0\0\0\xF0\xFC\xDA\x19\0\0\0\0\x80M\xCC\x1A\0\0\0\0\xA0Z\xBC\x1B\0\0\0\0\xA0K\xAC\x1C\0\0\0\0\xA0<\x9C\x1D\0\0\0\0\xA0-\x8C\x1E\0\0\0\0\xA0\x1E|\x1F\0\0\0\0\xA0\x0Fl \0\0\0\0\xA0\0\\!\0\0\0\0\xA0\xF1K\"\0\0\0\0\xA0\xE2;#\0\0\0\0\xA0\xD3+$\0\0\0\0\xA0\xC4\x1B%\0\0\0\0\xA0\xB5\x0B&\0\0\0\0 \xE1\x04'\0\0\0\0 \xD2\xF4'\0\0\0\x000\xE0\xF4'\0\0\0\x000\xD1\xE4(\0\0\0\x000yx)\0\0\0\0 \xB4\xD4)\0\0\0\0 \xA5\xC4*\0\0\0\0 \x96\xB4+\0\0\0\0 \x87\xA4,\0\0\0\0 x\x94-\0\0\0\0 i\x84.\0\0\0\0 Zt/\0\0\0\0 Kd0\0\0\0\0\xA0v]1\0\0\0\0\xA0Qr2\0\0\0\0\xA0X=3\0\0\0\0\xA03R4\0\0\0\0\xA0:\x1D5\0\0\0\0\xA0\x1526\0\0\0\0\xA0\x1C\xFD6\0\0\0\0 2\x1B8\0\0\0\0\xA0\xFE\xDC8\0\0\0\0 \x14\xFB9\0\0\0\0\xA0\xE0\xBC:\0\0\0\0 \xF6\xDA;\0\0\0\0 \xFD\xA5<\0\0\0\0 \xD8\xBA=\0\0\0\0 \xDF\x85>\0\0\0\0 \xBA\x9A?\0\0\0\0 \xC1e@\0\0\0\0\xA0\xD6\x83A\0\0\0\0 \xA3EB\0\0\0\0\xA0\xB8cC\0\0\0\0 \x85%D\0\0\0\0\xA0\x9ACE\0\0\0\0 g\x05F\0\0\0\0\xA0|#G\0\0\0\0\xA0\x83\xEEG\0\0\0\0\xA0^\x03I\0\0\0\0\xA0e\xCEI\0\0\0\0\xA0@\xE3J\0\0\0\0\xA0G\xAEK\0\0\0\0 ]\xCCL\0\0\0\0\xA0)\x8EM\0\0\0\0\x10\xD7KT\0\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x02\x04\x02\x04\x01\x03\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x05\x02\x04\xC1a\0\0\0\0\0\0pb\0\0\0\0\0\0\x80p\0\0\0\0\0\0\x90~\0\0\0\0\0\0\x80p\0\0\0\0\0\0\x90~\0\0\0\0\0\0WIB\0\0pb\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0@\0H\0`If?\xFF\xFF\xFF\xFF\xE0\x85x\xA9\xFF\xFF\xFF\xFF`\xDE\x16\xBA\xFF\xFF\xFF\xFF\x88\x83\xBF\xCB\xFF\xFF\xFF\xFFp\xEEV\xD2\xFF\xFF\xFF\xFF\x08\xC6<\xD7\xFF\xFF\xFF\xFF\0&\xFF\xDA\xFF\xFF\xFF\xFF\x88\xBE\xB5\xF4\xFF\xFF\xFF\xFF\0\x01\x02\x03\x02\x04\x02\x05 d\0\0\0\0\0\0 g\0\0\0\0\0\0xi\0\0\0\0\0\0\x90~\0\0\0\0\0\0\x80p\0\0\0\0\0\0pb\0\0\0\0\0\0WIT\0\0\x90~\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x18\0\x1B\0\x98\xC1\x16\xBA\xFF\xFF\xFF\xFF\xF0\xB9X\xD0\xFF\xFF\xFF\xFFh\xA2\xB5\xF4\xFF\xFF\xFF\xFF\x01\x02\x01\xE8\x83\0\0\0\0\0\0\x90~\0\0\0\0\0\0\x98\x85\0\0\0\0\0\0IST\0\0 \x1C\0\0\0\0\0\0\x01IDT\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x04\x05 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\0 \x1C\0\0\0\0\0\0(\x03\x8D\x03\xFA\xC2\xB6V\xFF\xFF\xFF\xFF\x88E0\x9E\xFF\xFF\xFF\xFF\0\xCFY\xC8\xFF\xFF\xFF\xFF\0\xA6\xFA\xC8\xFF\xFF\xFF\xFF\x80\x9C8\xC9\xFF\xFF\xFF\xFF\x80\xEB\xE5\xCC\xFF\xFF\xFF\xFF\0\xFE\xAC\xCD\xFF\xFF\xFF\xFF\0\x1F\xC7\xCE\xFF\xFF\xFF\xFF\0\x83\x8F\xCF\xFF\xFF\xFF\xFF\0\xA4\xA9\xD0\xFF\xFF\xFF\xFF\0}\x84\xD1\xFF\xFF\xFF\xFF\x80\xD7\x8A\xD2\xFF\xFF\xFF\xFF\x80\xB0e\xD3\xFF\xFF\xFF\xFF\0\x0Bl\xD4\xFF\xFF\xFF\xFF\x800Z\xD7\xFF\xFF\xFF\xFF\0X\xDF\xD7\xFF\xFF\xFF\xFF\x80\xC3/\xD8\xFF\xFF\xFF\xFF\0c\x1E\xD9\xFF\xFF\xFF\xFF\0\xF7\x10\xDA\xFF\xFF\xFF\xFF\0\xD0\xEB\xDA\xFF\xFF\xFF\xFF\x004\xB4\xDB\xFF\xFF\xFF\xFF\0=\xB9\xDC\xFF\xFF\xFF\xFF\0\x8D\xE0\xDD\xFF\xFF\xFF\xFF\x80\xCE\xB4\xDE\xFF\xFF\xFF\xFF\x80\xBF\xA4\xDF\xFF\xFF\xFF\xFF\0v\x8B\xE0\xFF\xFF\xFF\xFF\0}V\xE1\xFF\xFF\xFF\xFF\x80f\xBE\xE2\xFF\xFF\xFF\xFF\0_6\xE3\xFF\xFF\xFF\xFF\x80H\x9E\xE4\xFF\xFF\xFF\xFF\0A\x16\xE5\xFF\xFF\xFF\xFF\0\xF0t\xE6\xFF\xFF\xFF\xFF\x80\xD2\x11\xE7\xFF\xFF\xFF\xFF\x80\xAD&\xE8\xFF\xFF\xFF\xFF\0z\xE8\xE8\xFF\xFF\xFF\xFF\xE0\x8B|\x08\0\0\0\0\xD0\xB0\xFD\x08\0\0\0\0`\xEA\xF6\t\0\0\0\0\xD03\xA6\n\0\0\0\0`\xFC\xE9\x13\0\0\0\0`[!\x14\0\0\0\0`\xC6\xFA\x1A\0\0\0\0`n\x8E\x1B\0\0\0\0\xE0\xF8\xBE\x1C\0\0\0\0\xD0|w\x1D\0\0\0\0`\xFF\xCC\x1E\0\0\0\0P\x99`\x1F\0\0\0\0`\xB1\x82 \0\0\0\0\xD0\xB5I!\0\0\0\0\xE0\x9E^\"\0\0\0\0P] #\0\0\0\0`0Z$\0\0\0\0P?\0%\0\0\0\0\xE0\xED\x0B&\0\0\0\0\xD0\xE6\xD6&\0\0\0\0\xE0\xCF\xEB'\0\0\0\0P\x03\xC0(\0\0\0\0`\xEC\xD4)\0\0\0\0\xD0\x1F\xA9*\0\0\0\0\xE0e\xBB+\0\0\0\0\xD0\x01\x89,\0\0\0\0\xE0G\x9B-\0\0\0\0P\xA9_.\0\0\0\0\xE0){/\0\0\0\0\xD0\xC5H0\0\0\0\0\xE0\x96H1\0\0\0\0Pn<2\0\0\0\0`\xB313\0\0\0\0\xD0\xFE\x1A4\0\0\0\0`\x95\x115\0\0\0\0P\xA6\xF15\0\0\0\0\x80\x08\x047\0\0\0\0p\x01\xCF7\0\0\0\0\x80_\xF68\0\0\0\0\xE0\xF9\xDC9\0\0\0\0p\xED\xD0:\0\0\0\0`[\xAE;\0\0\0\0p\xA0\xA3<\0\0\0\0`\xB2\xA0=\0\0\0\0p\x82\x83>\0\0\0\0\xE0\x9F|?\0\0\0\0p6s@\0\0\0\0`\xA4PA\0\0\0\0\0\x8FLB\0\0\0\0pOHC\0\0\0\0\0q,D\0\0\0\0\xF0\xF6\x1EE\0\0\0\0\0S\x0CF\0\0\0\0\xF0c\xECF\0\0\0\0\x005\xECG\0\0\0\0p\xF5\xE7H\0\0\0\0\0\x17\xCCI\0\0\0\0\xF0\x9C\xBEJ\0\0\0\0\0\xF9\xABK\0\0\0\0\xF0\t\x8CL\0\0\0\0\x80\x15\x95M\0\0\0\0p\x9B\x87N\0\0\0\0\x80\xF7tO\0\0\0\0\xF0B^P\0\0\0\0\x80\xD9TQ\0\0\0\0pIlR\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x04\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x06!\0\0\0\0\0\0\xF8 \0\0\0\0\0\0 \x1C\0\0\0\0\0\x000*\0\0\0\0\0\0@8\0\0\0\0\0\0+0430H?\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\0\x12\0\xA0\x9A\x86i\xFF\xFF\xFF\xFF@\xD7\xF9\xD0\xFF\xFF\xFF\xFF\x01\x02\xE0@\0\0\0\0\0\0@8\0\0\0\0\0\0H?\0\0\0\0\0\0+12\0\0\xC0\xA8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\x02h\x02\xC4\x96R\xA7\xFF\xFF\xFF\xFF\xD0\x9A\xA3\xB5\xFF\xFF\xFF\xFF@)'\x15\0\0\0\0\xB0]\x18\x16\0\0\0\0\xC0\\\x08\x17\0\0\0\x000\x91\xF9\x17\0\0\0\0@\x90\xE9\x18\0\0\0\0\xB0\xC4\xDA\x19\0\0\0\0@\x15\xCC\x1A\0\0\0\0`\"\xBC\x1B\0\0\0\0`\x13\xAC\x1C\0\0\0\0`\x04\x9C\x1D\0\0\0\0`\xF5\x8B\x1E\0\0\0\0`\xE6{\x1F\0\0\0\0`\xD7k \0\0\0\0`\xC8[!\0\0\0\0`\xB9K\"\0\0\0\0`\xAA;#\0\0\0\0`\x9B+$\0\0\0\0`\x8C\x1B%\0\0\0\0`}\x0B&\0\0\0\0\xE0\xA8\x04'\0\0\0\0\xE0\x99\xF4'\0\0\0\0\xF0\xA7\xF4'\0\0\0\0\xF0\x98\xE4(\0\0\0\0\xF0@x)\0\0\0\0\xE0{\xD4)\0\0\0\0\xE0l\xC4*\0\0\0\0\xE0]\xB4+\0\0\0\0\xE0N\xA4,\0\0\0\0\xE0?\x94-\0\0\0\0\xE00\x84.\0\0\0\0\xE0!t/\0\0\0\0\xE0\x12d0\0\0\0\0`>]1\0\0\0\0`\x19r2\0\0\0\0` =3\0\0\0\0`\xFBQ4\0\0\0\0`\x02\x1D5\0\0\0\0`\xDD16\0\0\0\0`\xE4\xFC6\0\0\0\0\xE0\xF9\x1A8\0\0\0\0`\xC6\xDC8\0\0\0\0\xE0\xDB\xFA9\0\0\0\0`\xA8\xBC:\0\0\0\0\xE0\xBD\xDA;\0\0\0\0\xE0\xC4\xA5<\0\0\0\0\xE0\x9F\xBA=\0\0\0\0\xE0\xA6\x85>\0\0\0\0\xE0\x81\x9A?\0\0\0\0\xE0\x88e@\0\0\0\0`\x9E\x83A\0\0\0\0\xE0jEB\0\0\0\0`\x80cC\0\0\0\0\xE0L%D\0\0\0\0`bCE\0\0\0\0\xE0.\x05F\0\0\0\0`D#G\0\0\0\0`K\xEEG\0\0\0\0`&\x03I\0\0\0\0`-\xCEI\0\0\0\0`\x08\xE3J\0\0\0\0`\x0F\xAEK\0\0\0\0p\x1D\xAEK\0\0\0\0\xF02\xCCL\0\0\0\0p\xFF\x8DM\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x02\x04\x02\x04\x01\x03\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x01\x02\x04\x01\x02\x04\xBC\x94\0\0\0\0\0\0\xB0\x9A\0\0\0\0\0\0\xC0\xA8\0\0\0\0\0\0\xD0\xB6\0\0\0\0\0\0\xC0\xA8\0\0\0\0\0\0PKT\0\0PF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0H\0Q\0\xA4\xFC~\x89\xFF\xFF\xFF\xFF\xA82\x95\xCC\xFF\xFF\xFF\xFF\x98\x12t\xD2\xFF\xFF\xFF\xFF\xA8\xE0\xA8\xDD\xFF\xFF\xFF\xFF0\xABO\x02\0\0\0\0\xB0E\xAF<\0\0\0\0\xA0(\x9F=\0\0\0\x000\xA0AH\0\0\0\0\xA0G\x0BI\0\0\0\0\x01\x02\x01\x03\x03\x04\x03\x04\x03\xDC>\0\0\0\0\0\0XM\0\0\0\0\0\0h[\0\0\0\0\0\0PF\0\0\0\0\0\0`T\0\0\0\0\0\0+0545\xDCP\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\0\x12\0\x84}\xF2\xA1\xFF\xFF\xFF\xFF\xA80\x18\x1E\0\0\0\0\x01\x02\xFCO\0\0\0\0\0\0XM\0\0\0\0\0\0\xDCP\0\0\0\0\0\0+09\0\0\x90~\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \x02}\x02\xEB\xE4\xDB\xA1\xFF\xFF\xFF\xFF\0\xC5\xA3\xB5\xFF\xFF\xFF\xFFpS'\x15\0\0\0\0\xE0\x87\x18\x16\0\0\0\0\xF0\x86\x08\x17\0\0\0\0`\xBB\xF9\x17\0\0\0\0p\xBA\xE9\x18\0\0\0\0\xE0\xEE\xDA\x19\0\0\0\0p?\xCC\x1A\0\0\0\0\x90L\xBC\x1B\0\0\0\0\x90=\xAC\x1C\0\0\0\0\x90.\x9C\x1D\0\0\0\0\x90\x1F\x8C\x1E\0\0\0\0\x90\x10|\x1F\0\0\0\0\x90\x01l \0\0\0\0\x90\xF2[!\0\0\0\0\x90\xE3K\"\0\0\0\0\x90\xD4;#\0\0\0\0\x90\xC5+$\0\0\0\0\x90\xB6\x1B%\0\0\0\0\x90\xA7\x0B&\0\0\0\0\x10\xD3\x04'\0\0\0\0\x10\xC4\xF4'\0\0\0\0 \xD2\xF4'\0\0\0\0 \xC3\xE4(\0\0\0\0 kx)\0\0\0\0\x10\xA6\xD4)\0\0\0\0\x10\x97\xC4*\0\0\0\0\x10\x88\xB4+\0\0\0\0\x10y\xA4,\0\0\0\0\x10j\x94-\0\0\0\0\x10[\x84.\0\0\0\0\x10Lt/\0\0\0\0\x10=d0\0\0\0\0\x90h]1\0\0\0\0\x90Cr2\0\0\0\0\x90J=3\0\0\0\0\x90%R4\0\0\0\0\x90,\x1D5\0\0\0\0\x90\x0726\0\0\0\0\x90\x0E\xFD6\0\0\0\0\x10$\x1B8\0\0\0\0\x90\xF0\xDC8\0\0\0\0\x10\x06\xFB9\0\0\0\0\x90\xD2\xBC:\0\0\0\0\x10\xE8\xDA;\0\0\0\0\x10\xEF\xA5<\0\0\0\0\x10\xCA\xBA=\0\0\0\0\x10\xD1\x85>\0\0\0\0\x10\xAC\x9A?\0\0\0\0p\xE4\xF2?\0\0\0\0\0\xA5e@\0\0\0\0\x80\xBA\x83A\0\0\0\0\0\x87EB\0\0\0\0\x80\x9CcC\0\0\0\0\0i%D\0\0\0\0\x80~CE\0\0\0\0\0K\x05F\0\0\0\0\x80`#G\0\0\0\0\x80g\xEEG\0\0\0\0\x80B\x03I\0\0\0\0\x80I\xCEI\0\0\0\0\x80$\xE3J\0\0\0\0\x80+\xAEK\0\0\0\0\0A\xCCL\0\0\0\0\x80\r\x8EM\0\0\0\0P\x02nN\0\0\0\0\0\xC9KT\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x02\x04\x02\x04\x01\x03\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x05\x06\x03\x05\x06\x03\x05\x06\x03\x05\x06\x03\x05\x06\x03\x05\x06\x03\x05\x06\x03\x05\x06\x07\x03\x05\x02\x04\x15\x7F\0\0\0\0\0\0\x80p\0\0\0\0\0\0\x90~\0\0\0\0\0\0\xA0\x8C\0\0\0\0\0\0\x90~\0\0\0\0\0\0\xA0\x8C\0\0\0\0\0\0\xB0\x9A\0\0\0\0\0\0\xB0\x9A\0\0\0\0\0\0IST\0\0XM\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\08\0?\0(\x18\xBA&\xFF\xFF\xFF\xFF0\xEB\xE7C\xFF\xFF\xFF\xFF\xBA\xBC\x9D\x87\xFF\xFF\xFF\xFF(\x8C\xDB\xCA\xFF\xFF\xFF\xFF\x18q\x05\xCC\xFF\xFF\xFF\xFF\xA82\x95\xCC\xFF\xFF\xFF\xFF\x98\x12t\xD2\xFF\xFF\xFF\xFF\x01\x02\x03\x04\x03\x04\x03\xD8R\0\0\0\0\0\0\xD0R\0\0\0\0\0\0FK\0\0\0\0\0\0XM\0\0\0\0\0\0h[\0\0\0\0\0\0+07\0\0pb\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\x02i\x02\xF2\r\xF9\xA1\xFF\xFF\xFF\xFF \xE1\xA3\xB5\xFF\xFF\xFF\xFF\x90o'\x15\0\0\0\0\0\xA4\x18\x16\0\0\0\0\x10\xA3\x08\x17\0\0\0\0\x80\xD7\xF9\x17\0\0\0\0\x90\xD6\xE9\x18\0\0\0\0\0\x0B\xDB\x19\0\0\0\0\x90[\xCC\x1A\0\0\0\0\xB0h\xBC\x1B\0\0\0\0\xB0Y\xAC\x1C\0\0\0\0\xB0J\x9C\x1D\0\0\0\0\xB0;\x8C\x1E\0\0\0\0\xB0,|\x1F\0\0\0\0\xB0\x1Dl \0\0\0\0\xB0\x0E\\!\0\0\0\0\xB0\xFFK\"\0\0\0\0\xB0\xF0;#\0\0\0\0\xB0\xE1+$\0\0\0\0\xB0\xD2\x1B%\0\0\0\0\xB0\xC3\x0B&\0\0\0\x000\xEF\x04'\0\0\0\x000\xE0\xF4'\0\0\0\0@\xEE\xF4'\0\0\0\0@\xDF\xE4(\0\0\0\0@\x87x)\0\0\0\x000\xC2\xD4)\0\0\0\x000\xB3\xC4*\0\0\0\x000\xA4\xB4+\0\0\0\x000\x95\xA4,\0\0\0\x000\x86\x94-\0\0\0\x000w\x84.\0\0\0\x000ht/\0\0\0\x000Yd0\0\0\0\0\xB0\x84]1\0\0\0\0\xB0_r2\0\0\0\0\xB0f=3\0\0\0\0\xB0AR4\0\0\0\0\xB0H\x1D5\0\0\0\0\xB0#26\0\0\0\0\xB0*\xFD6\0\0\0\x000@\x1B8\0\0\0\0\xB0\x0C\xDD8\0\0\0\x000\"\xFB9\0\0\0\0\xB0\xEE\xBC:\0\0\0\x000\x04\xDB;\0\0\0\x000\x0B\xA6<\0\0\0\x000\xE6\xBA=\0\0\0\x000\xED\x85>\0\0\0\x000\xC8\x9A?\0\0\0\x000\xCFe@\0\0\0\0\xB0\xE4\x83A\0\0\0\x000\xB1EB\0\0\0\0\xB0\xC6cC\0\0\0\x000\x93%D\0\0\0\0\xB0\xA8CE\0\0\0\x000u\x05F\0\0\0\0\xB0\x8A#G\0\0\0\0\xB0\x91\xEEG\0\0\0\0\xB0l\x03I\0\0\0\0\xB0s\xCEI\0\0\0\0\xB0N\xE3J\0\0\0\0\xB0U\xAEK\0\0\0\x000k\xCCL\0\0\0\0\xB07\x8EM\0\0\0\0 \xE5KT\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x02\x04\x02\x04\x01\x03\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x05\x02\x04\x0EW\0\0\0\0\0\0`T\0\0\0\0\0\0pb\0\0\0\0\0\0\x80p\0\0\0\0\0\0pb\0\0\0\0\0\0\x80p\0\0\0\0\0\0+08\0\0\x80p\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\0\xA2\0\x90\x06\x8A\xAD\xFF\xFF\xFF\xFF\x88Gg\xBA\xFF\xFF\xFF\xFF\x80'{\xBF\xFF\xFF\xFF\xFFP\x1B\xF3\xBF\xFF\xFF\xFF\xFF\x80\xAC]\xC1\xFF\xFF\xFF\xFFP\xA0\xD5\xC1\xFF\xFF\xFF\xFF\0\xE0>\xC3\xFF\xFF\xFF\xFF\xD0\xD3\xB6\xC3\xFF\xFF\xFF\xFF\x80\x13 \xC5\xFF\xFF\xFF\xFFP\x07\x98\xC5\xFF\xFF\xFF\xFF\0G\x01\xC7\xFF\xFF\xFF\xFF\xD0:y\xC7\xFF\xFF\xFF\xFF\0\xCC\xE3\xC8\xFF\xFF\xFF\xFF\xD0\xBF[\xC9\xFF\xFF\xFF\xFF\x80\xFF\xC4\xCA\xFF\xFF\xFF\xFFP\xF3<\xCB\xFF\xFF\xFF\xFF\0X\x91\xCB\xFF\xFF\xFF\xFF\xF0mH\xD2\xFF\xFF\xFF\xFF\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x04\x02pg\0\0\0\0\0\0xi\0\0\0\0\0\0\x80p\0\0\0\0\0\x000u\0\0\0\0\0\0\x90~\0\0\0\0\0\0CST\0\0\x80p\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\08\x02\x9F\x02\x8E[i\x85\xFF\xFF\xFF\xFF\xF0uG\xCB\xFF\xFF\xFF\xFF\xE0\xCA\xF2\xCB\xFF\xFF\xFF\xFFP\xBA\xFB\xCC\xFF\xFF\xFF\xFF`\xFE\xD3\xCD\xFF\xFF\xFF\xFF\xD0\xA5\x9D\xCE\xFF\xFF\xFF\xFFpza\xD2\xFF\xFF\xFF\xFFp\xF8x\xD3\xFF\xFF\xFF\xFF\xF0\xADB\xD4\xFF\xFF\xFF\xFFp\xABK\xD5\xFF\xFF\xFF\xFF\xF0Lt\xD6\xFF\xFF\xFF\xFF\xF0S?\xD7\xFF\xFF\xFF\xFF\xF0D/\xD8\xFF\xFF\xFF\xFFp\xFA\xF8\xD8\xFF\xFF\xFF\xFFp\xD5\r\xDA\xFF\xFF\xFF\xFFp\xDC\xD8\xDA\xFF\xFF\xFF\xFFp\xB7\xED\xDB\xFF\xFF\xFF\xFFp\xBE\xB8\xDC\xFF\xFF\xFF\xFF\xF0\xEA\xCE\xDD\xFF\xFF\xFF\xFF\xF0\xDA\xA1\xDE\xFF\xFF\xFF\xFF\xF0\xB5\xB6\xDF\xFF\xFF\xFF\xFF\xF0\xBC\x81\xE0\xFF\xFF\xFF\xFF\xF0\x97\x96\xE1\xFF\xFF\xFF\xFF\xF0)O\xE2\xFF\xFF\xFF\xFF\xF0yv\xE3\xFF\xFF\xFF\xFF\xF0\x0B/\xE4\xFF\xFF\xFF\xFFp\x96_\xE5\xFF\xFF\xFF\xFF\xF0\xED\x0E\xE6\xFF\xFF\xFF\xFF\xA8\xA9?\xE7\xFF\xFF\xFF\xFF\xB8I\xF8\xE7\xFF\xFF\xFF\xFF\xA8\x8B\x1F\xE9\xFF\xFF\xFF\xFF\xB8+\xD8\xE9\xFF\xFF\xFF\xFF\xA8m\xFF\xEA\xFF\xFF\xFF\xFF\xB8\r\xB8\xEB\xFF\xFF\xFF\xFF\xA8O\xDF\xEC\xFF\xFF\xFF\xFF\xB8\xEF\x97\xED\xFF\xFF\xFF\xFF(l\xC8\xEE\xFF\xFF\xFF\xFF\xB8\xD1w\xEF\xFF\xFF\xFF\xFF(N\xA8\xF0\xFF\xFF\xFF\xFF\xB8\xB3W\xF1\xFF\xFF\xFF\xFF(0\x88\xF2\xFF\xFF\xFF\xFF8\xD0@\xF3\xFF\xFF\xFF\xFF(\x12h\xF4\xFF\xFF\xFF\xFF8\xB2 \xF5\xFF\xFF\xFF\xFF(\xF4G\xF6\xFF\xFF\xFF\xFF8~%\xF7\xFF\xFF\xFF\xFF\x18S\x15\xF8\xFF\xFF\xFF\xFF8`\x05\xF9\xFF\xFF\xFF\xFF\x185\xF5\xF9\xFF\xFF\xFF\xFF8B\xE5\xFA\xFF\xFF\xFF\xFF\xA8_\xDE\xFB\xFF\xFF\xFF\xFF\xB8^\xCE\xFC\xFF\xFF\xFF\xFF\xA8A\xBE\xFD\xFF\xFF\xFF\xFF\xB8@\xAE\xFE\xFF\xFF\xFF\xFF\xA8#\x9E\xFF\xFF\xFF\xFF\xFF\xB8\"\x8E\0\0\0\0\0\xA8\x05~\x01\0\0\0\0\xB8\x04n\x02\0\0\0\0\xA8\xE7]\x03\0\0\0\0\xB8\xE6M\x04\0\0\0\0(\x04G\x05\0\0\0\08\x037\x06\0\0\0\0(\xE6&\x07\0\0\0\08=\x83\x07\0\0\0\0(\xC8\x06\t\0\0\0\08\xC7\xF6\t\0\0\0\0(\xAA\xE6\n\0\0\0\08\xA9\xD6\x0B\0\0\0\0(\x8C\xC6\x0C\0\0\0\089\x9B\x11\0\0\0\0\xA8lo\x12\0\0\0\0\x01\x02\x03\x02\x03\x02\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01rj\0\0\0\0\0\0\x80p\0\0\0\0\0\0\x90~\0\0\0\0\0\0\xA0\x8C\0\0\0\0\0\0\x90~\0\0\0\0\0\0+11\0\0\xB0\x9A\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x18\x02r\x02\xA06\x19\xAA\xFF\xFF\xFF\xFF\xE0\xA8\xA3\xB5\xFF\xFF\xFF\xFFP7'\x15\0\0\0\0\xC0k\x18\x16\0\0\0\0\xD0j\x08\x17\0\0\0\0@\x9F\xF9\x17\0\0\0\0P\x9E\xE9\x18\0\0\0\0\xC0\xD2\xDA\x19\0\0\0\0P#\xCC\x1A\0\0\0\0p0\xBC\x1B\0\0\0\0p!\xAC\x1C\0\0\0\0p\x12\x9C\x1D\0\0\0\0p\x03\x8C\x1E\0\0\0\0p\xF4{\x1F\0\0\0\0p\xE5k \0\0\0\0p\xD6[!\0\0\0\0p\xC7K\"\0\0\0\0p\xB8;#\0\0\0\0p\xA9+$\0\0\0\0p\x9A\x1B%\0\0\0\0p\x8B\x0B&\0\0\0\0\xF0\xB6\x04'\0\0\0\0\xF0\xA7\xF4'\0\0\0\0\0\xB6\xF4'\0\0\0\0\0\xA7\xE4(\0\0\0\0\0Ox)\0\0\0\0\xF0\x89\xD4)\0\0\0\0\xF0z\xC4*\0\0\0\0\xF0k\xB4+\0\0\0\0\xF0\\\xA4,\0\0\0\0\xF0M\x94-\0\0\0\0\xF0>\x84.\0\0\0\0\xF0/t/\0\0\0\0\xF0 d0\0\0\0\0pL]1\0\0\0\0p'r2\0\0\0\0p.=3\0\0\0\0p\tR4\0\0\0\0p\x10\x1D5\0\0\0\0p\xEB16\0\0\0\0p\xF2\xFC6\0\0\0\0\xF0\x07\x1B8\0\0\0\0p\xD4\xDC8\0\0\0\0\xF0\xE9\xFA9\0\0\0\0p\xB6\xBC:\0\0\0\0\xF0\xCB\xDA;\0\0\0\0\xF0\xD2\xA5<\0\0\0\0\xF0\xAD\xBA=\0\0\0\0\xF0\xB4\x85>\0\0\0\0\xF0\x8F\x9A?\0\0\0\0\xF0\x96e@\0\0\0\0p\xAC\x83A\0\0\0\0\xF0xEB\0\0\0\0p\x8EcC\0\0\0\0\xF0Z%D\0\0\0\0ppCE\0\0\0\0\xF0<\x05F\0\0\0\0pR#G\0\0\0\0pY\xEEG\0\0\0\0p4\x03I\0\0\0\0p;\xCEI\0\0\0\0p\x16\xE3J\0\0\0\0p\x1D\xAEK\0\0\0\0\xF02\xCCL\0\0\0\0p\xFF\x8DM\0\0\0\0\xE0\xACKT\0\0\0\0\0\x9C\x1BW\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x02\x04\x02\x04\x01\x03\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x05\x01\x02\x04`\x8D\0\0\0\0\0\0\xA0\x8C\0\0\0\0\0\0\xB0\x9A\0\0\0\0\0\0\xC0\xA8\0\0\0\0\0\0\xB0\x9A\0\0\0\0\0\0\xC0\xA8\0\0\0\0\0\0WITA\0\x80p\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0$\0\x90]\xF2\xA1\xFF\xFF\xFF\xFF\x90\xD5\x16\xBA\xFF\xFF\xFF\xFF\x80\x1D\x88\xCB\xFF\xFF\xFF\xFFp\xEEV\xD2\xFF\xFF\xFF\xFF\0\x01\x02\x01\xF0o\0\0\0\0\0\0\x80p\0\0\0\0\0\0\x90~\0\0\0\0\0\0PST\0\0\x80p\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0p\0\x83\0\x18\xDC\xE1\x14\xFF\xFF\xFF\xFF@z\xBB{\xFF\xFF\xFF\xFF\x80\xF4\x9C\xC1\xFF\xFF\xFF\xFFp\x18\x01\xC2\xFF\xFF\xFF\xFF\0\x9B?\xCB\xFF\xFF\xFF\xFF\xF0\x03\x8C\xCB\xFF\xFF\xFF\xFF\xF0MK\xD1\xFF\xFF\xFF\xFF\xF0\xE5\xB1\xD2\xFF\xFF\xFF\xFF\09l\xE2\xFF\xFF\xFF\xFF\xF0[\xB3\xE2\xFF\xFF\xFF\xFF\0\xFC\x9B\r\0\0\0\0\xF0\x98\x86\x0E\0\0\0\0\0\xBFV&\0\0\0\0p\xA8\xB1&\0\0\0\0\x01\x02\x03\x02\x03\x03\x04\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\xE8\x1F\xFF\xFF\xFF\xFF\xFF\xFFhq\0\0\0\0\0\0\x80p\0\0\0\0\0\0\x90~\0\0\0\0\0\0\x90~\0\0\0\0\0\0EET\0\0 \x1C\0\0\0\0\0\0\x01EEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\x000*\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\0@8\0\0\0\0\0\0\x80\x01\xB0\x01\xB8\x1Ew\xA5\xFF\xFF\xFF\xFF\xE0\xAF\xED\t\0\0\0\0\xD0\x92\xDD\n\0\0\0\0\xE0d\xFA\x0B\0\0\0\0P\xC6\xBE\x0C\0\0\0\0`9\xA4\r\0\0\0\0\xD0\xE1\x8A\x0E\0\0\0\0`\x1B\x84\x0F\0\0\0\0\xD0Ou\x10\0\0\0\0`\xFDc\x11\0\0\0\0P\xE0S\x12\0\0\0\0\xE0\x19M\x13\0\0\0\0P\xC23\x14\0\0\0\0`\xC1#\x15\0\0\0\0P\xA4\x13\x16\0\0\0\0`\xA3\x03\x17\0\0\0\0P\x86\xF3\x17\0\0\0\0`\x85\xE3\x18\0\0\0\0Ph\xD3\x19\0\0\0\0`g\xC3\x1A\0\0\0\0\xD0\x84\xBC\x1B\0\0\0\0\xE0\x83\xAC\x1C\0\0\0\0\xD0f\x9C\x1D\0\0\0\0\xE0e\x8C\x1E\0\0\0\0\xD0H|\x1F\0\0\0\0\xE0Gl \0\0\0\0\xD0*\\!\0\0\0\0\xE0)L\"\0\0\0\0\xD0\x0C<#\0\0\0\0\xE0\x0B,$\0\0\0\0\xD0\xEE\x1B%\0\0\0\0\xE0\xED\x0B&\0\0\0\0P\x0B\x05'\0\0\0\0`\n\xF5'\0\0\0\0P\xED\xE4(\0\0\0\0`\xEC\xD4)\0\0\0\0P\xCF\xC4*\0\0\0\0`\xCE\xB4+\0\0\0\0P\xB1\xA4,\0\0\0\0`\xB0\x94-\0\0\0\0P\x93\x84.\0\0\0\0`\x92t/\0\0\0\0Pud0\0\0\0\0\xE0\xAE]1\0\0\0\0\xD0\x91M2\0\0\0\0\xE0\x90=3\0\0\0\0\xD0s-4\0\0\0\0\xE0r\x1D5\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02H\x1F\0\0\0\0\0\0 \x1C\0\0\0\0\0\x000*\0\0\0\0\0\0+07\0\0pb\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\x02h\x02\xC0 \x18\xAA\xFF\xFF\xFF\xFF \xE1\xA3\xB5\xFF\xFF\xFF\xFF\x90o'\x15\0\0\0\0\0\xA4\x18\x16\0\0\0\0\x10\xA3\x08\x17\0\0\0\0\x80\xD7\xF9\x17\0\0\0\0\x90\xD6\xE9\x18\0\0\0\0\0\x0B\xDB\x19\0\0\0\0\x90[\xCC\x1A\0\0\0\0\xB0h\xBC\x1B\0\0\0\0\xB0Y\xAC\x1C\0\0\0\0\xB0J\x9C\x1D\0\0\0\0\xB0;\x8C\x1E\0\0\0\0\xB0,|\x1F\0\0\0\0\xB0\x1Dl \0\0\0\0\xB0\x0E\\!\0\0\0\0\xB0\xFFK\"\0\0\0\0\xB0\xF0;#\0\0\0\0\xB0\xE1+$\0\0\0\0\xB0\xD2\x1B%\0\0\0\0\xB0\xC3\x0B&\0\0\0\x000\xEF\x04'\0\0\0\x000\xE0\xF4'\0\0\0\0@\xEE\xF4'\0\0\0\0@\xDF\xE4(\0\0\0\0@\x87x)\0\0\0\x000\xC2\xD4)\0\0\0\x000\xB3\xC4*\0\0\0\x000\xA4\xB4+\0\0\0\x000\x95\xA4,\0\0\0\x000\x86\x94-\0\0\0\x000w\x84.\0\0\0\x000ht/\0\0\0\x000Yd0\0\0\0\0\xB0\x84]1\0\0\0\0\xB0_r2\0\0\0\0\xB0f=3\0\0\0\0\xB0AR4\0\0\0\0\xB0H\x1D5\0\0\0\0\xB0#26\0\0\0\0\xB0*\xFD6\0\0\0\x000@\x1B8\0\0\0\0\xB0\x0C\xDD8\0\0\0\x000\"\xFB9\0\0\0\0\xB0\xEE\xBC:\0\0\0\x000\x04\xDB;\0\0\0\x000\x0B\xA6<\0\0\0\x000\xE6\xBA=\0\0\0\x000\xED\x85>\0\0\0\x000\xC8\x9A?\0\0\0\x000\xCFe@\0\0\0\0\xB0\xE4\x83A\0\0\0\x000\xB1EB\0\0\0\0\xB0\xC6cC\0\0\0\x000\x93%D\0\0\0\0\xB0\xA8CE\0\0\0\x000u\x05F\0\0\0\0\xB0\x8A#G\0\0\0\0\xB0\x91\xEEG\0\0\0\0\xB0l\x03I\0\0\0\0\xB0s\xCEI\0\0\0\0\xB0N\xE3J\0\0\0\0\xB0U\xAEK\0\0\0\0\xC0c\xAEK\0\0\0\0@y\xCCL\0\0\0\0\xC0E\x8EM\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x02\x04\x02\x04\x01\x03\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x01\x02\x04\x01\x02\x04\xC0Q\0\0\0\0\0\0`T\0\0\0\0\0\0pb\0\0\0\0\0\0\x80p\0\0\0\0\0\0pb\0\0\0\0\0\0+07\0\0pb\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \x02{\x02$\x19\xDB\xA1\xFF\xFF\xFF\xFF \xE1\xA3\xB5\xFF\xFF\xFF\xFF\x90o'\x15\0\0\0\0\0\xA4\x18\x16\0\0\0\0\x10\xA3\x08\x17\0\0\0\0\x80\xD7\xF9\x17\0\0\0\0\x90\xD6\xE9\x18\0\0\0\0\0\x0B\xDB\x19\0\0\0\0\x90[\xCC\x1A\0\0\0\0\xB0h\xBC\x1B\0\0\0\0\xB0Y\xAC\x1C\0\0\0\0\xB0J\x9C\x1D\0\0\0\0\xB0;\x8C\x1E\0\0\0\0\xB0,|\x1F\0\0\0\0\xB0\x1Dl \0\0\0\0\xB0\x0E\\!\0\0\0\0\xB0\xFFK\"\0\0\0\0\xB0\xF0;#\0\0\0\0\xB0\xE1+$\0\0\0\0\xB0\xD2\x1B%\0\0\0\0\xB0\xC3\x0B&\0\0\0\x000\xEF\x04'\0\0\0\x000\xE0\xF4'\0\0\0\0@\xEE\xF4'\0\0\0\0@\xDF\xE4(\0\0\0\0@\x87x)\0\0\0\x000\xC2\xD4)\0\0\0\x000\xB3\xC4*\0\0\0\x000\xA4\xB4+\0\0\0\0\0N\xFE+\0\0\0\0@\xA3\xA4,\0\0\0\0@\x94\x94-\0\0\0\0@\x85\x84.\0\0\0\0@vt/\0\0\0\0@gd0\0\0\0\0\xC0\x92]1\0\0\0\0\xC0mr2\0\0\0\0\xC0t=3\0\0\0\0\xC0OR4\0\0\0\0\xC0V\x1D5\0\0\0\0\xC0126\0\0\0\0\xC08\xFD6\0\0\0\0@N\x1B8\0\0\0\0\xC0\x1A\xDD8\0\0\0\0@0\xFB9\0\0\0\0\xC0\xFC\xBC:\0\0\0\0@\x12\xDB;\0\0\0\0@\x19\xA6<\0\0\0\0@\xF4\xBA=\0\0\0\0@\xFB\x85>\0\0\0\0@\xD6\x9A?\0\0\0\0@\xDDe@\0\0\0\0\xC0\xF2\x83A\0\0\0\0@\xBFEB\0\0\0\0\xC0\xD4cC\0\0\0\0@\xA1%D\0\0\0\0\xC0\xB6CE\0\0\0\0@\x83\x05F\0\0\0\0\xC0\x98#G\0\0\0\0\xC0\x9F\xEEG\0\0\0\0\xC0z\x03I\0\0\0\0\xC0\x81\xCEI\0\0\0\0\xC0\\\xE3J\0\0\0\0\xC0c\xAEK\0\0\0\0@y\xCCL\0\0\0\0\xC0E\x8EM\0\0\0\x000\xF3KT\0\0\0\0\xC0\xCC\x93W\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x02\x04\x02\x04\x01\x03\x03\x02\x04\x03\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\xBCM\0\0\0\0\0\0`T\0\0\0\0\0\0pb\0\0\0\0\0\0\x80p\0\0\0\0\0\0pb\0\0\0\0\0\0+06\0\0`T\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\x02i\x02\xB6@\xB3\xA1\xFF\xFF\xFF\xFF0\xEF\xA3\xB5\xFF\xFF\xFF\xFF\xA0}'\x15\0\0\0\0\x10\xB2\x18\x16\0\0\0\0 \xB1\x08\x17\0\0\0\0\x90\xE5\xF9\x17\0\0\0\0\xA0\xE4\xE9\x18\0\0\0\0\x10\x19\xDB\x19\0\0\0\0\xA0i\xCC\x1A\0\0\0\0\xC0v\xBC\x1B\0\0\0\0\xC0g\xAC\x1C\0\0\0\0\xC0X\x9C\x1D\0\0\0\0\xC0I\x8C\x1E\0\0\0\0\xC0:|\x1F\0\0\0\0\xC0+l \0\0\0\0\xC0\x1C\\!\0\0\0\0\xC0\rL\"\0\0\0\0\xC0\xFE;#\0\0\0\0\xC0\xEF+$\0\0\0\0\xC0\xE0\x1B%\0\0\0\0\xC0\xD1\x0B&\0\0\0\0@\xFD\x04'\0\0\0\0@\xEE\xF4'\0\0\0\0P\xFC\xF4'\0\0\0\0P\xED\xE4(\0\0\0\0P\x95x)\0\0\0\0@\xD0\xD4)\0\0\0\0@\xC1\xC4*\0\0\0\0@\xB2\xB4+\0\0\0\0@\xA3\xA4,\0\0\0\0@\x94\x94-\0\0\0\0@\x85\x84.\0\0\0\0@vt/\0\0\0\0@gd0\0\0\0\0\xC0\x92]1\0\0\0\0\xC0mr2\0\0\0\0\xC0t=3\0\0\0\0\xC0OR4\0\0\0\0\xC0V\x1D5\0\0\0\0\xC0126\0\0\0\0\xC08\xFD6\0\0\0\0@N\x1B8\0\0\0\0\xC0\x1A\xDD8\0\0\0\0@0\xFB9\0\0\0\0\xC0\xFC\xBC:\0\0\0\0@\x12\xDB;\0\0\0\0@\x19\xA6<\0\0\0\0@\xF4\xBA=\0\0\0\0@\xFB\x85>\0\0\0\0@\xD6\x9A?\0\0\0\0@\xDDe@\0\0\0\0\xC0\xF2\x83A\0\0\0\0@\xBFEB\0\0\0\0\xC0\xD4cC\0\0\0\0@\xA1%D\0\0\0\0\xC0\xB6CE\0\0\0\0@\x83\x05F\0\0\0\0\xC0\x98#G\0\0\0\0\xC0\x9F\xEEG\0\0\0\0\xC0z\x03I\0\0\0\0\xC0\x81\xCEI\0\0\0\0\xC0\\\xE3J\0\0\0\0\xC0c\xAEK\0\0\0\0@y\xCCL\0\0\0\0\xC0E\x8EM\0\0\0\x000\xF3KT\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x02\x04\x02\x04\x01\x03\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x05\x02\x04\xCAD\0\0\0\0\0\0PF\0\0\0\0\0\0`T\0\0\0\0\0\0pb\0\0\0\0\0\0`T\0\0\0\0\0\0pb\0\0\0\0\0\0+05\0\0PF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xB0\x01\x02\x02\xDC\x93\x19\xAA\xFF\xFF\xFF\xFFP\x0B\xA4\xB5\xFF\xFF\xFF\xFF\xB0\x8B'\x15\0\0\0\0 \xC0\x18\x16\0\0\0\0 \xB1\x08\x17\0\0\0\x000\xBF\x08\x17\0\0\0\0\xA0\xF3\xF9\x17\0\0\0\0\xB0\xF2\xE9\x18\0\0\0\0 '\xDB\x19\0\0\0\0\xB0w\xCC\x1A\0\0\0\0\xD0\x84\xBC\x1B\0\0\0\0\xD0u\xAC\x1C\0\0\0\0\xD0f\x9C\x1D\0\0\0\0\xD0W\x8C\x1E\0\0\0\0\xD0H|\x1F\0\0\0\0\xD09l \0\0\0\0\xD0*\\!\0\0\0\0\xD0\x1BL\"\0\0\0\0\xD0\x0C<#\0\0\0\0\xD0\xFD+$\0\0\0\0\xE0\x0B,$\0\0\0\0\xE0\xFC\x1B%\0\0\0\0\xE0\xED\x0B&\0\0\0\0`\x19\x05'\0\0\0\0`\n\xF5'\0\0\0\0`\xFB\xE4(\0\0\0\0`\xA3x)\0\0\0\0P\xDE\xD4)\0\0\0\0`\xEC\xD4)\0\0\0\0`\xDD\xC4*\0\0\0\0`\xCE\xB4+\0\0\0\0`\xBF\xA4,\0\0\0\0`\xB0\x94-\0\0\0\0`\xA1\x84.\0\0\0\0`\x92t/\0\0\0\0`\x83d0\0\0\0\0\xE0\xAE]1\0\0\0\0\xE0\x89r2\0\0\0\0\xE0\x90=3\0\0\0\0\xE0kR4\0\0\0\0\xE0r\x1D5\0\0\0\0\xE0M26\0\0\0\0\xE0T\xFD6\0\0\0\0`j\x1B8\0\0\0\0\xE06\xDD8\0\0\0\0`L\xFB9\0\0\0\0\xE0\x18\xBD:\0\0\0\0`.\xDB;\0\0\0\0`5\xA6<\0\0\0\0`\x10\xBB=\0\0\0\0`\x17\x86>\0\0\0\0`\xF2\x9A?\0\0\0\0`\xF9e@\0\0\0\0\xE0\x0E\x84A\0\0\0\0\x01\x02\x03\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x02\x05\x02\x05\x06\x02\x05\x06\x02\x05\x06\x03\x04\x02\x05\x02\x05\x06\x02\x05\x06\x02\x05\x06\x02\x05\x06\x02\x05\x06\x02\x05\x06\x02\x05\x06\x02\x05\x06\x02\x05\x06\x02\x05\x06\x02\x05\x06\x02\x05\x06\x02\x05\x02\x05$0\0\0\0\0\0\x000*\0\0\0\0\0\0PF\0\0\0\0\0\0`T\0\0\0\0\0\0`T\0\0\0\0\0\0PF\0\0\0\0\0\0@8\0\0\0\0\0\0WIB\0\0pb\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0@\0H\0\0\x8E\xFF\x8B\xFF\xFF\xFF\xFF\0\xDF\x16\xBA\xFF\xFF\xFF\xFF\x08\xA4y\xCB\xFF\xFF\xFF\xFFp\xEEV\xD2\xFF\xFF\xFF\xFF\x08\xC6<\xD7\xFF\xFF\xFF\xFF\0&\xFF\xDA\xFF\xFF\xFF\xFF\x88\xBE\xB5\xF4\xFF\xFF\xFF\xFF\x80t\xDA!\0\0\0\0\0\x01\x02\x01\x03\x01\x03\x04\x80f\0\0\0\0\0\0xi\0\0\0\0\0\0\x90~\0\0\0\0\0\0\x80p\0\0\0\0\0\0pb\0\0\0\0\0\0KST\0\0\x90~\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0(\0-\0\x9C\xF1\xD7\x8B\xFF\xFF\xFF\xFF\xF8\x16\xE6\x92\xFF\xFF\xFF\xFFpa/\xD2\xFF\xFF\xFF\xFFp\x02\xCEU\0\0\0\0pu\xECZ\0\0\0\0\x01\x02\x02\x01\x02\xE4u\0\0\0\0\0\0\x88w\0\0\0\0\0\0\x90~\0\0\0\0\0\0+03\0\x000*\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\0\x12\x000\x9D\xF2\xA1\xFF\xFF\xFF\xFF\xC0\x92\x8A\x04\0\0\0\0\x01\x02P0\0\0\0\0\0\0@8\0\0\0\0\0\x000*\0\0\0\0\0\0+05\0\0PF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xB0\x01\x0E\x02\\\x88\x19\xAA\xFF\xFF\xFF\xFF@\xFD\xA3\xB5\xFF\xFF\xFF\xFF\xB0\x8B'\x15\0\0\0\0 \xC0\x18\x16\0\0\0\0 \xB1\x08\x17\0\0\0\x000\xBF\x08\x17\0\0\0\0\xA0\xF3\xF9\x17\0\0\0\0\xB0\xF2\xE9\x18\0\0\0\0 '\xDB\x19\0\0\0\0\xB0w\xCC\x1A\0\0\0\0\xD0\x84\xBC\x1B\0\0\0\0\xD0u\xAC\x1C\0\0\0\0\xD0f\x9C\x1D\0\0\0\0\xD0W\x8C\x1E\0\0\0\0\xD0H|\x1F\0\0\0\0\xD09l \0\0\0\0\xD0*\\!\0\0\0\0\xD0\x1BL\"\0\0\0\0\xD0\x0C<#\0\0\0\0\xD0\xFD+$\0\0\0\0\xD0\xEE\x1B%\0\0\0\0\xD0\xDF\x0B&\0\0\0\0P\x0B\x05'\0\0\0\0P\xFC\xF4'\0\0\0\0`\n\xF5'\0\0\0\0`\xFB\xE4(\0\0\0\0`\xA3x)\0\0\0\0P\xDE\xD4)\0\0\0\0P\xCF\xC4*\0\0\0\0P\xC0\xB4+\0\0\0\0P\xB1\xA4,\0\0\0\0P\xA2\x94-\0\0\0\0P\x93\x84.\0\0\0\0P\x84t/\0\0\0\0Pud0\0\0\0\0\xD0\xA0]1\0\0\0\0\xD0{r2\0\0\0\0\xD0\x82=3\0\0\0\0\xD0]R4\0\0\0\0\xD0d\x1D5\0\0\0\0\xD0?26\0\0\0\0\xD0F\xFD6\0\0\0\0P\\\x1B8\0\0\0\0\xD0(\xDD8\0\0\0\0P>\xFB9\0\0\0\0\xD0\n\xBD:\0\0\0\0P \xDB;\0\0\0\0P'\xA6<\0\0\0\0P\x02\xBB=\0\0\0\0P\t\x86>\0\0\0\0P\xE4\x9A?\0\0\0\0P\xEBe@\0\0\0\0\xD0\0\x84A\0\0\0\0 \xC6\xE0e\0\0\0\0\x01\x02\x03\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x02\x05\x02\x05\x01\x03\x04\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x03\x04\x02\x05\xA4;\0\0\0\0\0\0@8\0\0\0\0\0\0PF\0\0\0\0\0\0`T\0\0\0\0\0\0`T\0\0\0\0\0\0PF\0\0\0\0\0\0+05\0\0PF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xB8\x01\x18\x02\xA0\x86\x19\xAA\xFF\xFF\xFF\xFF@\xFD\xA3\xB5\xFF\xFF\xFF\xFF\xB0\x8B'\x15\0\0\0\0 \xC0\x18\x16\0\0\0\0 \xB1\x08\x17\0\0\0\x000\xBF\x08\x17\0\0\0\0\xA0\xF3\xF9\x17\0\0\0\0\xB0\xF2\xE9\x18\0\0\0\0 '\xDB\x19\0\0\0\0\xB0w\xCC\x1A\0\0\0\0\xD0\x84\xBC\x1B\0\0\0\0\xD0u\xAC\x1C\0\0\0\0\xD0f\x9C\x1D\0\0\0\0\xD0W\x8C\x1E\0\0\0\0\xD0H|\x1F\0\0\0\0\xD09l \0\0\0\0\xD0*\\!\0\0\0\0\xD0\x1BL\"\0\0\0\0\xD0\x0C<#\0\0\0\0\xD0\xFD+$\0\0\0\0\xD0\xEE\x1B%\0\0\0\0\xD0\xDF\x0B&\0\0\0\0P\x0B\x05'\0\0\0\0P\xFC\xF4'\0\0\0\0`\n\xF5'\0\0\0\0`\xFB\xE4(\0\0\0\0P\x95x)\0\0\0\0@\xD0\xD4)\0\0\0\0P\xDE\xD4)\0\0\0\0P\xCF\xC4*\0\0\0\0P\xC0\xB4+\0\0\0\0P\xB1\xA4,\0\0\0\0P\xA2\x94-\0\0\0\0P\x93\x84.\0\0\0\0P\x84t/\0\0\0\0Pud0\0\0\0\0\xD0\xA0]1\0\0\0\0\xD0{r2\0\0\0\0\xD0\x82=3\0\0\0\0\xD0]R4\0\0\0\0\xD0d\x1D5\0\0\0\0\xD0?26\0\0\0\0\xD0F\xFD6\0\0\0\0P\\\x1B8\0\0\0\0\xD0(\xDD8\0\0\0\0P>\xFB9\0\0\0\0\xD0\n\xBD:\0\0\0\0P \xDB;\0\0\0\0P'\xA6<\0\0\0\0P\x02\xBB=\0\0\0\0P\t\x86>\0\0\0\0P\xE4\x9A?\0\0\0\0P\xEBe@\0\0\0\0\xD0\0\x84A\0\0\0\0\xA0\xD8\x1B\\\0\0\0\0\x01\x02\x03\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x02\x05\x02\x05\x02\x05\x06\x03\x04\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x02\x05\x03\x04\x03\x04\x02\x05`=\0\0\0\0\0\0@8\0\0\0\0\0\0PF\0\0\0\0\0\0`T\0\0\0\0\0\0`T\0\0\0\0\0\0PF\0\0\0\0\0\0pb\0\0\0\0\0\0+03\0\x000*\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\t\0\xB46\x1B\xD5\xFF\xFF\xFF\xFF\x01\xCC+\0\0\0\0\0\x000*\0\0\0\0\0\0+11\0\0\xB0\x9A\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \x02{\x02\xB8\xCD\xF0\x86\xFF\xFF\xFF\xFF\xF0\xB20\xD2\xFF\xFF\xFF\xFFP7'\x15\0\0\0\0\xC0k\x18\x16\0\0\0\0\xD0j\x08\x17\0\0\0\0@\x9F\xF9\x17\0\0\0\0P\x9E\xE9\x18\0\0\0\0\xC0\xD2\xDA\x19\0\0\0\0P#\xCC\x1A\0\0\0\0p0\xBC\x1B\0\0\0\0p!\xAC\x1C\0\0\0\0p\x12\x9C\x1D\0\0\0\0p\x03\x8C\x1E\0\0\0\0p\xF4{\x1F\0\0\0\0p\xE5k \0\0\0\0p\xD6[!\0\0\0\0p\xC7K\"\0\0\0\0p\xB8;#\0\0\0\0p\xA9+$\0\0\0\0p\x9A\x1B%\0\0\0\0p\x8B\x0B&\0\0\0\0\xF0\xB6\x04'\0\0\0\0\xF0\xA7\xF4'\0\0\0\0\0\xB6\xF4'\0\0\0\0\0\xA7\xE4(\0\0\0\0\0Ox)\0\0\0\0\xF0\x89\xD4)\0\0\0\0\xF0z\xC4*\0\0\0\0\xF0k\xB4+\0\0\0\0\xF0\\\xA4,\0\0\0\0\xF0M\x94-\0\0\0\0\xF0>\x84.\0\0\0\0\xF0/t/\0\0\0\0\xF0 d0\0\0\0\0pL]1\0\0\0\0p'r2\0\0\0\0p.=3\0\0\0\0\x80<=3\0\0\0\0\x80\x17R4\0\0\0\0\x80\x1E\x1D5\0\0\0\0\x80\xF916\0\0\0\0\x80\0\xFD6\0\0\0\0\0\x16\x1B8\0\0\0\0\x80\xE2\xDC8\0\0\0\0\0\xF8\xFA9\0\0\0\0\x80\xC4\xBC:\0\0\0\0\0\xDA\xDA;\0\0\0\0\0\xE1\xA5<\0\0\0\0\0\xBC\xBA=\0\0\0\0\0\xC3\x85>\0\0\0\0\0\x9E\x9A?\0\0\0\0\0\xA5e@\0\0\0\0\x80\xBA\x83A\0\0\0\0\0\x87EB\0\0\0\0\x80\x9CcC\0\0\0\0\0i%D\0\0\0\0\x80~CE\0\0\0\0\0K\x05F\0\0\0\0\x80`#G\0\0\0\0\x80g\xEEG\0\0\0\0\x80B\x03I\0\0\0\0\x80I\xCEI\0\0\0\0\x80$\xE3J\0\0\0\0\x80+\xAEK\0\0\0\0\0A\xCCL\0\0\0\0\x80\r\x8EM\0\0\0\0\xF0\xBAKT\0\0\0\0\0\xB2\xF6V\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x02\x04\x02\x04\x05\x03\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\xC8\x85\0\0\0\0\0\0\x90~\0\0\0\0\0\0\xB0\x9A\0\0\0\0\0\0\xC0\xA8\0\0\0\0\0\0\xB0\x9A\0\0\0\0\0\0\xA0\x8C\0\0\0\0\0\0+05\0\0PF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xC8\0\xEC\x007\x85\x19\xAA\xFF\xFF\xFF\xFF@\xFD\xA3\xB5\xFF\xFF\xFF\xFF\xB0\x8B'\x15\0\0\0\0 \xC0\x18\x16\0\0\0\0 \xB1\x08\x17\0\0\0\x000\xBF\x08\x17\0\0\0\0\xA0\xF3\xF9\x17\0\0\0\0\xB0\xF2\xE9\x18\0\0\0\0 '\xDB\x19\0\0\0\0\xB0w\xCC\x1A\0\0\0\0\xD0\x84\xBC\x1B\0\0\0\0\xD0u\xAC\x1C\0\0\0\0\xD0f\x9C\x1D\0\0\0\0\xD0W\x8C\x1E\0\0\0\0\xD0H|\x1F\0\0\0\0\xD09l \0\0\0\0\xD0*\\!\0\0\0\0\xD0\x1BL\"\0\0\0\0\xD0\x0C<#\0\0\0\0\xD0\xFD+$\0\0\0\0\xD0\xEE\x1B%\0\0\0\0\xD0\xDF\x0B&\0\0\0\0P\x0B\x05'\0\0\0\0P\xFC\xF4'\0\0\0\0P\xED\xE4(\0\0\0\0\x01\x02\x03\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\xC9>\0\0\0\0\0\0@8\0\0\0\0\0\0PF\0\0\0\0\0\0`T\0\0\0\0\0\0`T\0\0\0\0\0\0KST\0\0\x90~\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xD8\0\xF3\0x\xF0\xD7\x8B\xFF\xFF\xFF\xFF\xF8\x16\xE6\x92\xFF\xFF\xFF\xFF\xF0'C\xD2\xFF\xFF\xFF\xFFp\x8Fe\xD7\xFF\xFF\xFF\xFF`\x9D\xEE\xD7\xFF\xFF\xFF\xFFp\xFA\xF8\xD8\xFF\xFF\xFF\xFF\xE0-\xCD\xD9\xFF\xFF\xFF\xFF\xF0\x8A\xD7\xDA\xFF\xFF\xFF\xFF\xE0\x0F\xAD\xDB\xFF\xFF\xFF\xFF\xF0\xE2\xE6\xDC\xFF\xFF\xFF\xFF\xE0\xF1\x8C\xDD\xFF\xFF\xFF\xFF\xF0)O\xE2\xFF\xFF\xFF\xFF\xF8\xB7k\xE4\xFF\xFF\xFF\xFFh\x18\x13\xE5\xFF\xFF\xFF\xFFx\x03b\xE6\xFF\xFF\xFF\xFF\xE8L\x11\xE7\xFF\xFF\xFF\xFFxp/\xE8\xFF\xFF\xFF\xFFh\xF4\xE7\xE8\xFF\xFF\xFF\xFFxR\x0F\xEA\xFF\xFF\xFF\xFFh\xD6\xC7\xEA\xFF\xFF\xFF\xFFx4\xEF\xEB\xFF\xFF\xFF\xFFh\xB8\xA7\xEC\xFF\xFF\xFF\xFFx\x16\xCF\xED\xFF\xFF\xFF\xFFh\x9A\x87\xEE\xFF\xFF\xFF\xFFxq5\xF0\xFF\xFF\xFF\xFF\x90`\xA3 \0\0\0\0\x90gn!\0\0\0\0\x01\x02\x02\x03\x02\x03\x02\x03\x02\x03\x02\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x02\x03\x02\x08w\0\0\0\0\0\0\x88w\0\0\0\0\0\0\x90~\0\0\0\0\0\0\xA0\x8C\0\0\0\0\0\0\x98\x85\0\0\0\0\0\0CST\0\0\x80p\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x98\0\xAB\0)C6~\xFF\xFF\xFF\xFF\x80\xA2\x97\xA0\xFF\xFF\xFF\xFF\xF0\x04y\xA1\xFF\xFF\xFF\xFF\x80^Y\xC8\xFF\xFF\xFF\xFFp\xF9\t\xC9\xFF\xFF\xFF\xFF\0\xBD\xD3\xC9\xFF\xFF\xFF\xFF\xF0\x8A\x05\xCB\xFF\xFF\xFF\xFF\0@|\xCB\xFF\xFF\xFF\xFF\xF0>;\xD2\xFF\xFF\xFF\xFF\x80{\x8B\xD3\xFF\xFF\xFF\xFF\xF0\xADB\xD4\xFF\xFF\xFF\xFF\0\"E\xD5\xFF\xFF\xFF\xFF\xF0\xBFL\xD6\xFF\xFF\xFF\xFF\0\xBF<\xD7\xFF\xFF\xFF\xFFpf\x06\xD8\xFF\xFF\xFF\xFF\x80\xF2\x1D\xD9\xFF\xFF\xFF\xFF\xF0|A\xD9\xFF\xFF\xFF\xFF R\xBA\x1E\0\0\0\0\x90\x9Bi\x1F\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xD7q\0\0\0\0\0\0\x80p\0\0\0\0\0\0\x90~\0\0\0\0\0\0+08\0\0\x80p\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0@\0I\0\xA3S6~\xFF\xFF\xFF\xFF\xA3\x85\x83\x86\xFF\xFF\xFF\xFF\x90Ng\xBA\xFF\xFF\xFF\xFF`\xE4\n\xC0\xFF\xFF\xFF\xFF`\xE5\xB3\xCA\xFF\xFF\xFF\xFF\x08_\x91\xCB\xFF\xFF\xFF\xFF\xF0mH\xD2\xFF\xFF\xFF\xFF\0\xEE\x91\x16\0\0\0\0\0\x01\x02\x02\x03\x04\x05\x04\x06]a\0\0\0\0\0\0pb\0\0\0\0\0\0 g\0\0\0\0\0\0 g\0\0\0\0\0\0xi\0\0\0\0\0\0\x90~\0\0\0\0\0\0\x80p\0\0\0\0\0\0+11\0\0\xB0\x9A\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\x02i\x02\xE43\x19\xAA\xFF\xFF\xFF\xFF\xE0\xA8\xA3\xB5\xFF\xFF\xFF\xFFP7'\x15\0\0\0\0\xC0k\x18\x16\0\0\0\0\xD0j\x08\x17\0\0\0\0@\x9F\xF9\x17\0\0\0\0P\x9E\xE9\x18\0\0\0\0\xC0\xD2\xDA\x19\0\0\0\0P#\xCC\x1A\0\0\0\0p0\xBC\x1B\0\0\0\0p!\xAC\x1C\0\0\0\0p\x12\x9C\x1D\0\0\0\0p\x03\x8C\x1E\0\0\0\0p\xF4{\x1F\0\0\0\0p\xE5k \0\0\0\0p\xD6[!\0\0\0\0p\xC7K\"\0\0\0\0p\xB8;#\0\0\0\0p\xA9+$\0\0\0\0p\x9A\x1B%\0\0\0\0p\x8B\x0B&\0\0\0\0\xF0\xB6\x04'\0\0\0\0\xF0\xA7\xF4'\0\0\0\0\0\xB6\xF4'\0\0\0\0\0\xA7\xE4(\0\0\0\0\0Ox)\0\0\0\0\xF0\x89\xD4)\0\0\0\0\xF0z\xC4*\0\0\0\0\xF0k\xB4+\0\0\0\0\xF0\\\xA4,\0\0\0\0\xF0M\x94-\0\0\0\0\xF0>\x84.\0\0\0\0\xF0/t/\0\0\0\0\xF0 d0\0\0\0\0pL]1\0\0\0\0p'r2\0\0\0\0p.=3\0\0\0\0p\tR4\0\0\0\0p\x10\x1D5\0\0\0\0p\xEB16\0\0\0\0p\xF2\xFC6\0\0\0\0\xF0\x07\x1B8\0\0\0\0p\xD4\xDC8\0\0\0\0\xF0\xE9\xFA9\0\0\0\0p\xB6\xBC:\0\0\0\0\xF0\xCB\xDA;\0\0\0\0\xF0\xD2\xA5<\0\0\0\0\xF0\xAD\xBA=\0\0\0\0\xF0\xB4\x85>\0\0\0\0\xF0\x8F\x9A?\0\0\0\0\xF0\x96e@\0\0\0\0p\xAC\x83A\0\0\0\0\xF0xEB\0\0\0\0p\x8EcC\0\0\0\0\xF0Z%D\0\0\0\0ppCE\0\0\0\0\xF0<\x05F\0\0\0\0pR#G\0\0\0\0pY\xEEG\0\0\0\0p4\x03I\0\0\0\0p;\xCEI\0\0\0\0p\x16\xE3J\0\0\0\0p\x1D\xAEK\0\0\0\0\xF02\xCCL\0\0\0\0p\xFF\x8DM\0\0\0\0\xE0\xACKT\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x02\x04\x02\x04\x01\x03\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x05\x02\x04\x1C\x90\0\0\0\0\0\0\xA0\x8C\0\0\0\0\0\0\xB0\x9A\0\0\0\0\0\0\xC0\xA8\0\0\0\0\0\0\xB0\x9A\0\0\0\0\0\0\xC0\xA8\0\0\0\0\0\0CST\0\0\x80p\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0H\x01\x84\x01\x18\xF0\xCEt\xFF\xFF\xFF\xFF\x80IU\xC3\xFF\xFF\xFF\xFF\x80YT\xD2\xFF\xFF\xFF\xFF\x80{\x8B\xD3\xFF\xFF\xFF\xFF\xF0\xADB\xD4\xFF\xFF\xFF\xFF\0\"E\xD5\xFF\xFF\xFF\xFF\xF0\xBFL\xD6\xFF\xFF\xFF\xFF\0\xBF<\xD7\xFF\xFF\xFF\xFFpf\x06\xD8\xFF\xFF\xFF\xFF\x80\xF2\x1D\xD9\xFF\xFF\xFF\xFF\xF0\x99\xE7\xD9\xFF\xFF\xFF\xFF\0&\xFF\xDA\xFF\xFF\xFF\xFFp\xCD\xC8\xDB\xFF\xFF\xFF\xFF\x80Y\xE0\xDC\xFF\xFF\xFF\xFF\xF0\0\xAA\xDD\xFF\xFF\xFF\xFF\0sr\xDE\xFF\xFF\xFF\xFFpd\xB5\xDF\xFF\xFF\xFF\xFF\0\x85|\xE0\xFF\xFF\xFF\xFF\xF0\x97\x96\xE1\xFF\xFF\xFF\xFF\x80\xB8]\xE2\xFF\xFF\xFF\xFFp\xCBw\xE3\xFF\xFF\xFF\xFF\0\xEC>\xE4\xFF\xFF\xFF\xFFp 0\xE5\xFF\xFF\xFF\xFF\0q!\xE6\xFF\xFF\xFF\xFFp\xA5\x12\xE7\xFF\xFF\xFF\xFF\x80\xA4\x02\xE8\xFF\xFF\xFF\xFF\xF0\xD8\xF3\xE8\xFF\xFF\xFF\xFF\0\xD8\xE3\xE9\xFF\xFF\xFF\xFFp\x0C\xD5\xEA\xFF\xFF\xFF\xFF\x80\x0B\xC5\xEB\xFF\xFF\xFF\xFF\xF0?\xB6\xEC\xFF\xFF\xFF\xFF\0\xFC\xF7\xED\xFF\xFF\xFF\xFF\xF0\xC4\x98\xEE\xFF\xFF\xFF\xFF\x80/\xD9\xEF\xFF\xFF\xFF\xFFp\xF8y\xF0\xFF\xFF\xFF\xFF\0V\xFC\x07\0\0\0\0p\x8A\xED\x08\0\0\0\0\x80\x89\xDD\t\0\0\0\0\xF0\xBD\xCE\n\0\0\0\0\x80\xA1\xDB\x11\0\0\0\0p\xDDT\x12\0\0\0\0\x01\x02\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\xE8q\0\0\0\0\0\0\x80p\0\0\0\0\0\0\x90~\0\0\0\0\0\0\x90~\0\0\0\0\0\0+05\0\0PF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xC8\0\xE3\0\t\x83\x19\xAA\xFF\xFF\xFF\xFF0\xEF\xA3\xB5\xFF\xFF\xFF\xFF\xA0}'\x15\0\0\0\0\x10\xB2\x18\x16\0\0\0\0 \xB1\x08\x17\0\0\0\0\x90\xE5\xF9\x17\0\0\0\0\xA0\xE4\xE9\x18\0\0\0\0\x10\x19\xDB\x19\0\0\0\0\xA0i\xCC\x1A\0\0\0\0\xC0v\xBC\x1B\0\0\0\0\xC0g\xAC\x1C\0\0\0\0\xC0X\x9C\x1D\0\0\0\0\xC0I\x8C\x1E\0\0\0\0\xC0:|\x1F\0\0\0\0\xC0+l \0\0\0\0\xC0\x1C\\!\0\0\0\0\xC0\rL\"\0\0\0\0\xC0\xFE;#\0\0\0\0\xC0\xEF+$\0\0\0\0\xC0\xE0\x1B%\0\0\0\0\xC0\xD1\x0B&\0\0\0\0@\xFD\x04'\0\0\0\0@\xEE\xF4'\0\0\0\0P\xFC\xF4'\0\0\0\0P\xED\xE4(\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x02\x04\x02\x04\x01\xF7@\0\0\0\0\0\0PF\0\0\0\0\0\0`T\0\0\0\0\0\0pb\0\0\0\0\0\0`T\0\0\0\0\0\0+04\0\0@8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xA8\x01\xED\x01\x01\xBA\xB6V\xFF\xFF\xFF\xFF\x01\x9A\x19\xAA\xFF\xFF\xFF\xFFP\x0C\xDA\xE7\xFF\xFF\xFF\xFF\xC0\x99'\x15\0\0\0\x000\xCE\x18\x16\0\0\0\0@\xCD\x08\x17\0\0\0\0\xB0\x01\xFA\x17\0\0\0\0\xC0\0\xEA\x18\0\0\0\x0005\xDB\x19\0\0\0\0\xC0\x85\xCC\x1A\0\0\0\0\xE0\x92\xBC\x1B\0\0\0\0\xE0\x83\xAC\x1C\0\0\0\0\xE0t\x9C\x1D\0\0\0\0\xE0e\x8C\x1E\0\0\0\0\xE0V|\x1F\0\0\0\0\xE0Gl \0\0\0\0\xE08\\!\0\0\0\0\xE0)L\"\0\0\0\0\xE0\x1A<#\0\0\0\0\xE0\x0B,$\0\0\0\0\xE0\xFC\x1B%\0\0\0\0\xE0\xED\x0B&\0\0\0\0`\x19\x05'\0\0\0\0`\n\xF5'\0\0\0\0p\x18\xF5'\0\0\0\0p\t\xE5(\0\0\0\0P\xDE\xD4)\0\0\0\0@\xC1\xC4*\0\0\0\0P\xC0\xB4+\0\0\0\0@\xA3\xA4,\0\0\0\0P\xA2\x94-\0\0\0\0@\x85\x84.\0\0\0\0@vt/\0\0\0\x000Yd0\0\0\0\0\xC0\x92]1\0\0\0\0\xB0f=3\0\0\0\0\xB0AR4\0\0\0\0\xC0V\x1D5\0\0\0\0\xB0#26\0\0\0\0\xC08\xFD6\0\0\0\x000@\x1B8\0\0\0\0\xC0\x1A\xDD8\0\0\0\x000\"\xFB9\0\0\0\0\xC0\xFC\xBC:\0\0\0\x000\x04\xDB;\0\0\0\0@\x19\xA6<\0\0\0\x000\xE6\xBA=\0\0\0\0@\xFB\x85>\0\0\0\x000\xC8\x9A?\0\0\0\0@\xDDe@\0\0\0\0\xB0\xC7\xDD@\0\0\0\0\xF0\x1C\x84A\0\0\0\0p\xE9EB\0\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x02\x04\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x02\x04\x03\x02\x04\x03\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x01\x02\x04\xFF)\0\0\0\0\0\x000*\0\0\0\0\0\0@8\0\0\0\0\0\0PF\0\0\0\0\0\0@8\0\0\0\0\0\0+033081\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0(\x02m\x02\xC8}l\x9A\xFF\xFF\xFF\xFFH\xCC\0\xBF\xFF\xFF\xFF\xFF8D\x94\r\0\0\0\0\xB8\x13\xAD\x0E\0\0\0\0@sy\x0F\0\0\0\0\xC0\xCA(\x10\0\0\0\0\xC0\xFD\xA9\x10\0\0\0\0H\xBC\xAD\x11\0\0\0\0\xB8JE\x12\0\0\0\0\xC8\xEC7\x13\0\0\0\0\xB8\x15-\x14\0\0\0\0\xC8v (\0\0\0\0\xB8\x9D\xDB(\0\0\0\0\xC8\x9C\xCB)\0\0\0\0\xB8\"\xBE*\0\0\0\0H\xD0\xAC+\0\0\0\08V\x9F,\0\0\0\0\xC8\x03\x8E-\0\0\0\0\xB8\x89\x80.\0\0\0\0H7o/\0\0\0\08\xBDa0\0\0\0\0\xC8jP1\0\0\0\0\xB8\xF0B2\0\0\0\0\xC8\xEF23\0\0\0\0\xB8u%4\0\0\0\0H#\x145\0\0\0\08\xA9\x066\0\0\0\0\xC8V\xF56\0\0\0\0\xB8\xDC\xE77\0\0\0\0H\x8A\xD68\0\0\0\08\x10\xC99\0\0\0\0H\x0F\xB9:\0\0\0\08\x95\xAB;\0\0\0\0\xC8B\x9A<\0\0\0\0\xB8\xC8\x8C=\0\0\0\0Hv{>\0\0\0\08\xFCm?\0\0\0\0\xC8\xA9\\@\0\0\0\0\xB8/OA\0\0\0\0\xC8.?B\0\0\0\0\xB8\xB41C\0\0\0\0H\xC9\xE2G\0\0\0\08O\xD5H\0\0\0\0HN\xC5I\0\0\0\08\xD4\xB7J\0\0\0\0\xC8\x81\xA6K\0\0\0\0\xB8\x07\x99L\0\0\0\0H\xB5\x87M\0\0\0\08;zN\0\0\0\0\xC8\xE8hO\0\0\0\0\xB8n[P\0\0\0\0\xC8mKQ\0\0\0\0\xB8\xF3=R\0\0\0\0H\xA1,S\0\0\0\08'\x1FT\0\0\0\0\xC8\xD4\rU\0\0\0\0\xB8Z\0V\0\0\0\0H\x08\xEFV\0\0\0\08\x8E\xE1W\0\0\0\0H\x8D\xD1X\0\0\0\08\x13\xC4Y\0\0\0\0\xC8\xC0\xB2Z\0\0\0\0\xB8F\xA5[\0\0\0\0H\xF4\x93\\\0\0\0\08z\x86]\0\0\0\0\xC8'u^\0\0\0\0\xB8\xADg_\0\0\0\0\xC8\xACW`\0\0\0\0\xB82Ja\0\0\0\0\0\x01\x02\x03\x04\x03\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x0180\0\0\0\0\0\081\0\0\0\0\0\0H?\0\0\0\0\0\0@8\0\0\0\0\0\0PF\0\0\0\0\0\0+06\0\0`T\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\0\x12\0t\x15\xE6\xD5\xFF\xFF\xFF\xFF\xA8Ma!\0\0\0\0\x01\x02\x0CT\0\0\0\0\0\0XM\0\0\0\0\0\0`T\0\0\0\0\0\0JST\0\0\x90~\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x18\0\x1B\0p\xA4\xC2e\xFF\xFF\xFF\xFFp\x02>\xD7\xFF\xFF\xFF\xFF\xF0Y\xED\xD7\xFF\xFF\xFF\xFF\x01\x02\x01\x03\x83\0\0\0\0\0\0\x90~\0\0\0\0\0\0\xA0\x8C\0\0\0\0\0\0+07\0\0pb\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \x02{\x02\xD9N\xE5\xA1\xFF\xFF\xFF\xFF \xE1\xA3\xB5\xFF\xFF\xFF\xFF\x90o'\x15\0\0\0\0\0\xA4\x18\x16\0\0\0\0\x10\xA3\x08\x17\0\0\0\0\x80\xD7\xF9\x17\0\0\0\0\x90\xD6\xE9\x18\0\0\0\0\0\x0B\xDB\x19\0\0\0\0\x90[\xCC\x1A\0\0\0\0\xB0h\xBC\x1B\0\0\0\0\xB0Y\xAC\x1C\0\0\0\0\xB0J\x9C\x1D\0\0\0\0\xB0;\x8C\x1E\0\0\0\0\xB0,|\x1F\0\0\0\0\xB0\x1Dl \0\0\0\0\xB0\x0E\\!\0\0\0\0\xB0\xFFK\"\0\0\0\0\xB0\xF0;#\0\0\0\0\xB0\xE1+$\0\0\0\0\xB0\xD2\x1B%\0\0\0\0\xB0\xC3\x0B&\0\0\0\x000\xEF\x04'\0\0\0\x000\xE0\xF4'\0\0\0\0@\xEE\xF4'\0\0\0\0@\xDF\xE4(\0\0\0\0@\x87x)\0\0\0\x000\xC2\xD4)\0\0\0\x000\xB3\xC4*\0\0\0\x000\xA4\xB4+\0\0\0\x000\x95\xA4,\0\0\0\x000\x86\x94-\0\0\0\x000w\x84.\0\0\0\x000ht/\0\0\0\x000Yd0\0\0\0\0\xB0\x84]1\0\0\0\0\xB0_r2\0\0\0\0\xB0f=3\0\0\0\0\xB0AR4\0\0\0\0\xB0H\x1D5\0\0\0\0\xB0#26\0\0\0\0\xB0*\xFD6\0\0\0\x000@\x1B8\0\0\0\0\xB0\x0C\xDD8\0\0\0\x000\"\xFB9\0\0\0\0\xB0\xEE\xBC:\0\0\0\x000\x04\xDB;\0\0\0\x000\x0B\xA6<\0\0\0\0\xB0\xE9\xCE<\0\0\0\0@\xF4\xBA=\0\0\0\0@\xFB\x85>\0\0\0\0@\xD6\x9A?\0\0\0\0@\xDDe@\0\0\0\0\xC0\xF2\x83A\0\0\0\0@\xBFEB\0\0\0\0\xC0\xD4cC\0\0\0\0@\xA1%D\0\0\0\0\xC0\xB6CE\0\0\0\0@\x83\x05F\0\0\0\0\xC0\x98#G\0\0\0\0\xC0\x9F\xEEG\0\0\0\0\xC0z\x03I\0\0\0\0\xC0\x81\xCEI\0\0\0\0\xC0\\\xE3J\0\0\0\0\xC0c\xAEK\0\0\0\0@y\xCCL\0\0\0\0\xC0E\x8EM\0\0\0\x000\xF3KT\0\0\0\0\xC0\xF8IW\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x02\x04\x02\x04\x01\x03\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\xA7O\0\0\0\0\0\0`T\0\0\0\0\0\0pb\0\0\0\0\0\0\x80p\0\0\0\0\0\0pb\0\0\0\0\0\0+08\0\0\x80p\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x80\x01\xB0\x01L\xEE\xD3\x86\xFF\xFF\xFF\xFF\x90\xDC\x0B\x0F\0\0\0\0\x80\xC8\xE9\x18\0\0\0\0\xF0\xFC\xDA\x19\0\0\0\0\x80M\xCC\x1A\0\0\0\0p0\xBC\x1B\0\0\0\0\x80/\xAC\x1C\0\0\0\0p\x12\x9C\x1D\0\0\0\0\x80\x11\x8C\x1E\0\0\0\0p\xF4{\x1F\0\0\0\0\x80\xF3k \0\0\0\0p\xD6[!\0\0\0\0\x80\xD5K\"\0\0\0\0p\xB8;#\0\0\0\0\x80\xB7+$\0\0\0\0p\x9A\x1B%\0\0\0\0\x80\x99\x0B&\0\0\0\0\xF0\xB6\x04'\0\0\0\0\0\xB6\xF4'\0\0\0\0\xF0\x98\xE4(\0\0\0\0\0\x98\xD4)\0\0\0\0\xF0z\xC4*\0\0\0\0\0z\xB4+\0\0\0\0\xF0\\\xA4,\0\0\0\0\0\\\x94-\0\0\0\0\xF0>\x84.\0\0\0\0\0>t/\0\0\0\0\xF0 d0\0\0\0\0\x80Z]1\0\0\0\0p=M2\0\0\0\0\x80<=3\0\0\0\0p\x1F-4\0\0\0\0\x80\x1E\x1D5\0\0\0\0p\x01\r6\0\0\0\0\xA0\xB3\xE9:\0\0\0\0\x90\xAC\xB4;\0\0\0\0\xA0\xAB\xA4<\0\0\0\0\x90\x8E\x94=\0\0\0\0\xA0\x8D\x84>\0\0\0\0\x90pt?\0\0\0\0\xA0od@\0\0\0\0\x90RTA\0\0\0\0\xA0QDB\0\0\0\0\x9044C\0\0\0\0\xA03$D\0\0\0\0\x10Q\x1DE\0\0\0\0\xA0\x9A\x15U\0\0\0\0pa\x05V\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x024d\0\0\0\0\0\0pb\0\0\0\0\0\0\x80p\0\0\0\0\0\0\x90~\0\0\0\0\0\0+06\0\0`T\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\t\0d\xBA\xFE\xB0\xFF\xFF\xFF\xFF\x01\x1CR\0\0\0\0\0\0`T\0\0\0\0\0\0+10\0\0\xA0\x8C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x18\x02r\x02\xBA\xDD\xDB\xA1\xFF\xFF\xFF\xFF\0\xC5\xA3\xB5\xFF\xFF\xFF\xFFpS'\x15\0\0\0\0\xC0k\x18\x16\0\0\0\0\xD0j\x08\x17\0\0\0\0@\x9F\xF9\x17\0\0\0\0P\x9E\xE9\x18\0\0\0\0\xC0\xD2\xDA\x19\0\0\0\0P#\xCC\x1A\0\0\0\0p0\xBC\x1B\0\0\0\0p!\xAC\x1C\0\0\0\0p\x12\x9C\x1D\0\0\0\0p\x03\x8C\x1E\0\0\0\0p\xF4{\x1F\0\0\0\0p\xE5k \0\0\0\0p\xD6[!\0\0\0\0p\xC7K\"\0\0\0\0p\xB8;#\0\0\0\0p\xA9+$\0\0\0\0p\x9A\x1B%\0\0\0\0p\x8B\x0B&\0\0\0\0\xF0\xB6\x04'\0\0\0\0\xF0\xA7\xF4'\0\0\0\0\0\xB6\xF4'\0\0\0\0\0\xA7\xE4(\0\0\0\0\0Ox)\0\0\0\0\xF0\x89\xD4)\0\0\0\0\xF0z\xC4*\0\0\0\0\xF0k\xB4+\0\0\0\0\xF0\\\xA4,\0\0\0\0\xF0M\x94-\0\0\0\0\xF0>\x84.\0\0\0\0\xF0/t/\0\0\0\0\xF0 d0\0\0\0\0pL]1\0\0\0\0p'r2\0\0\0\0p.=3\0\0\0\0p\tR4\0\0\0\0p\x10\x1D5\0\0\0\0p\xEB16\0\0\0\0p\xF2\xFC6\0\0\0\0\xF0\x07\x1B8\0\0\0\0p\xD4\xDC8\0\0\0\0\xF0\xE9\xFA9\0\0\0\0p\xB6\xBC:\0\0\0\0\xF0\xCB\xDA;\0\0\0\0\xF0\xD2\xA5<\0\0\0\0\xF0\xAD\xBA=\0\0\0\0\xF0\xB4\x85>\0\0\0\0\xF0\x8F\x9A?\0\0\0\0\xF0\x96e@\0\0\0\0p\xAC\x83A\0\0\0\0\xF0xEB\0\0\0\0p\x8EcC\0\0\0\0\xF0Z%D\0\0\0\0ppCE\0\0\0\0\xF0<\x05F\0\0\0\0pR#G\0\0\0\0pY\xEEG\0\0\0\0p4\x03I\0\0\0\0p;\xCEI\0\0\0\0p\x16\xE3J\0\0\0\0p\x1D\xAEK\0\0\0\0\xF02\xCCL\0\0\0\0p\xFF\x8DM\0\0\0\0@\xF4mN\0\0\0\0\xF0\xBAKT\0\0\0\0\x01\x02\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x04\x05\x04\x05\x06\x03\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x07\x04\x05\x06F\x86\0\0\0\0\0\0\x80p\0\0\0\0\0\0\x90~\0\0\0\0\0\0\xC0\xA8\0\0\0\0\0\0\xB0\x9A\0\0\0\0\0\0\xB0\x9A\0\0\0\0\0\0\xA0\x8C\0\0\0\0\0\0\xC0\xA8\0\0\0\0\0\0+10\0\0\xA0\x8C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\x02i\x02]GY\xA7\xFF\xFF\xFF\xFF\xF0\xB6\xA3\xB5\xFF\xFF\xFF\xFF`E'\x15\0\0\0\0\xD0y\x18\x16\0\0\0\0\xE0x\x08\x17\0\0\0\0P\xAD\xF9\x17\0\0\0\0`\xAC\xE9\x18\0\0\0\0\xD0\xE0\xDA\x19\0\0\0\0`1\xCC\x1A\0\0\0\0\x80>\xBC\x1B\0\0\0\0\x80/\xAC\x1C\0\0\0\0\x80 \x9C\x1D\0\0\0\0\x80\x11\x8C\x1E\0\0\0\0\x80\x02|\x1F\0\0\0\0\x80\xF3k \0\0\0\0\x80\xE4[!\0\0\0\0\x80\xD5K\"\0\0\0\0\x80\xC6;#\0\0\0\0\x80\xB7+$\0\0\0\0\x80\xA8\x1B%\0\0\0\0\x80\x99\x0B&\0\0\0\0\0\xC5\x04'\0\0\0\0\0\xB6\xF4'\0\0\0\0\x10\xC4\xF4'\0\0\0\0\x10\xB5\xE4(\0\0\0\0\x10]x)\0\0\0\0\0\x98\xD4)\0\0\0\0\0\x89\xC4*\0\0\0\0\0z\xB4+\0\0\0\0\0k\xA4,\0\0\0\0\0\\\x94-\0\0\0\0\0M\x84.\0\0\0\0\0>t/\0\0\0\0\0/d0\0\0\0\0\x80Z]1\0\0\0\0\x805r2\0\0\0\0\x80<=3\0\0\0\0\x80\x17R4\0\0\0\0\x80\x1E\x1D5\0\0\0\0\x80\xF916\0\0\0\0\x80\0\xFD6\0\0\0\0\0\x16\x1B8\0\0\0\0\x80\xE2\xDC8\0\0\0\0\0\xF8\xFA9\0\0\0\0\x80\xC4\xBC:\0\0\0\0\0\xDA\xDA;\0\0\0\0\0\xE1\xA5<\0\0\0\0\0\xBC\xBA=\0\0\0\0\0\xC3\x85>\0\0\0\0\0\x9E\x9A?\0\0\0\0\0\xA5e@\0\0\0\0\x80\xBA\x83A\0\0\0\0\0\x87EB\0\0\0\0\x80\x9CcC\0\0\0\0\0i%D\0\0\0\0\x80~CE\0\0\0\0\0K\x05F\0\0\0\0\x80`#G\0\0\0\0\x80g\xEEG\0\0\0\0\x80B\x03I\0\0\0\0\x80I\xCEI\0\0\0\0\x80$\xE3J\0\0\0\0\x80+\xAEK\0\0\0\0\0A\xCCL\0\0\0\0\x80\r\x8EM\0\0\0\0\xF0\xBAKT\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x02\x04\x02\x04\x01\x03\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x05\x02\x04\xA3{\0\0\0\0\0\0\x90~\0\0\0\0\0\0\xA0\x8C\0\0\0\0\0\0\xB0\x9A\0\0\0\0\0\0\xA0\x8C\0\0\0\0\0\0\xB0\x9A\0\0\0\0\0\0+09\0\0\x90~\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\x02i\x02^\xEA\xDB\xA1\xFF\xFF\xFF\xFF\0\xC5\xA3\xB5\xFF\xFF\xFF\xFFpS'\x15\0\0\0\0\xE0\x87\x18\x16\0\0\0\0\xF0\x86\x08\x17\0\0\0\0`\xBB\xF9\x17\0\0\0\0p\xBA\xE9\x18\0\0\0\0\xE0\xEE\xDA\x19\0\0\0\0p?\xCC\x1A\0\0\0\0\x90L\xBC\x1B\0\0\0\0\x90=\xAC\x1C\0\0\0\0\x90.\x9C\x1D\0\0\0\0\x90\x1F\x8C\x1E\0\0\0\0\x90\x10|\x1F\0\0\0\0\x90\x01l \0\0\0\0\x90\xF2[!\0\0\0\0\x90\xE3K\"\0\0\0\0\x90\xD4;#\0\0\0\0\x90\xC5+$\0\0\0\0\x90\xB6\x1B%\0\0\0\0\x90\xA7\x0B&\0\0\0\0\x10\xD3\x04'\0\0\0\0\x10\xC4\xF4'\0\0\0\0 \xD2\xF4'\0\0\0\0 \xC3\xE4(\0\0\0\0 kx)\0\0\0\0\x10\xA6\xD4)\0\0\0\0\x10\x97\xC4*\0\0\0\0\x10\x88\xB4+\0\0\0\0\x10y\xA4,\0\0\0\0\x10j\x94-\0\0\0\0\x10[\x84.\0\0\0\0\x10Lt/\0\0\0\0\x10=d0\0\0\0\0\x90h]1\0\0\0\0\x90Cr2\0\0\0\0\x90J=3\0\0\0\0\x90%R4\0\0\0\0\x90,\x1D5\0\0\0\0\x90\x0726\0\0\0\0\x90\x0E\xFD6\0\0\0\0\x10$\x1B8\0\0\0\0\x90\xF0\xDC8\0\0\0\0\x10\x06\xFB9\0\0\0\0\x90\xD2\xBC:\0\0\0\0\x10\xE8\xDA;\0\0\0\0\x10\xEF\xA5<\0\0\0\0\x10\xCA\xBA=\0\0\0\0\x10\xD1\x85>\0\0\0\0\x10\xAC\x9A?\0\0\0\0\x10\xB3e@\0\0\0\0\x90\xC8\x83A\0\0\0\0\x10\x95EB\0\0\0\0\x90\xAAcC\0\0\0\0\x10w%D\0\0\0\0\x90\x8CCE\0\0\0\0\x10Y\x05F\0\0\0\0\x90n#G\0\0\0\0\x90u\xEEG\0\0\0\0\x90P\x03I\0\0\0\0\x90W\xCEI\0\0\0\0\x902\xE3J\0\0\0\0\x909\xAEK\0\0\0\0\x10O\xCCL\0\0\0\0\x90\x1B\x8EM\0\0\0\0\0\xC9KT\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x02\x04\x02\x04\x01\x03\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x05\x02\x04\xA2y\0\0\0\0\0\0\x80p\0\0\0\0\0\0\x90~\0\0\0\0\0\0\xA0\x8C\0\0\0\0\0\0\x90~\0\0\0\0\0\0\xA0\x8C\0\0\0\0\0\0+0630h[\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0$\0\xD1\x89\xB6V\xFF\xFF\xFF\xFFQs\xF2\xA1\xFF\xFF\xFF\xFF\x18\xFC\xF2\xCB\xFF\xFF\xFF\xFF\xF0g\x9A\xD1\xFF\xFF\xFF\xFF\0\x01\x02\x01/Z\0\0\0\0\0\0h[\0\0\0\0\0\0\x90~\0\0\0\0\0\0+05\0\0PF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x18\x02r\x02'\t_\x9B\xFF\xFF\xFF\xFF\xFF\xB1\x12\xA1\xFF\xFF\xFF\xFF@\xFD\xA3\xB5\xFF\xFF\xFF\xFF\xB0\x8B'\x15\0\0\0\0 \xC0\x18\x16\0\0\0\x000\xBF\x08\x17\0\0\0\0\xA0\xF3\xF9\x17\0\0\0\0\xB0\xF2\xE9\x18\0\0\0\0 '\xDB\x19\0\0\0\0\xB0w\xCC\x1A\0\0\0\0\xD0\x84\xBC\x1B\0\0\0\0\xD0u\xAC\x1C\0\0\0\0\xD0f\x9C\x1D\0\0\0\0\xD0W\x8C\x1E\0\0\0\0\xD0H|\x1F\0\0\0\0\xD09l \0\0\0\0\xD0*\\!\0\0\0\0\xD0\x1BL\"\0\0\0\0\xD0\x0C<#\0\0\0\0\xD0\xFD+$\0\0\0\0\xD0\xEE\x1B%\0\0\0\0\xD0\xDF\x0B&\0\0\0\0P\x0B\x05'\0\0\0\0P\xFC\xF4'\0\0\0\0`\n\xF5'\0\0\0\0`\xFB\xE4(\0\0\0\0`\xA3x)\0\0\0\0P\xDE\xD4)\0\0\0\0P\xCF\xC4*\0\0\0\0P\xC0\xB4+\0\0\0\0P\xB1\xA4,\0\0\0\0P\xA2\x94-\0\0\0\0P\x93\x84.\0\0\0\0P\x84t/\0\0\0\0Pud0\0\0\0\0\xD0\xA0]1\0\0\0\0\xD0{r2\0\0\0\0\xD0\x82=3\0\0\0\0\xD0]R4\0\0\0\0\xD0d\x1D5\0\0\0\0\xD0?26\0\0\0\0\xD0F\xFD6\0\0\0\0P\\\x1B8\0\0\0\0\xD0(\xDD8\0\0\0\0P>\xFB9\0\0\0\0\xD0\n\xBD:\0\0\0\0P \xDB;\0\0\0\0P'\xA6<\0\0\0\0P\x02\xBB=\0\0\0\0P\t\x86>\0\0\0\0P\xE4\x9A?\0\0\0\0P\xEBe@\0\0\0\0\xD0\0\x84A\0\0\0\0P\xCDEB\0\0\0\0\xD0\xE2cC\0\0\0\0P\xAF%D\0\0\0\0\xD0\xC4CE\0\0\0\0P\x91\x05F\0\0\0\0\xD0\xA6#G\0\0\0\0\xD0\xAD\xEEG\0\0\0\0\xD0\x88\x03I\0\0\0\0\xD0\x8F\xCEI\0\0\0\0\xD0j\xE3J\0\0\0\0\xD0q\xAEK\0\0\0\0P\x87\xCCL\0\0\0\0\xD0S\x8EM\0\0\0\0@\x01LT\0\0\0\0\x01\x02\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x03\x05\x03\x05\x02\x04\x04\x03\x05\x04\x03\x05\x04\x03\x05\x04\x03\x05\x04\x03\x05\x04\x03\x05\x04\x03\x05\x04\x03\x05\x04\x03\x05\x04\x03\x05\x04\x03\x05\x04\x03\x05\x04\x03\x05\x04\x03\x05\x04\x03\x05\x04\x03\x05\x04\x03\x05\x04\x03\x05\x04\x03\x05\x04\x06\x03\x05\xD98\0\0\0\0\0\0\xC14\0\0\0\0\0\0@8\0\0\0\0\0\0PF\0\0\0\0\0\0`T\0\0\0\0\0\0PF\0\0\0\0\0\0`T\0\0\0\0\0\0+04\0\0@8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xF8\x01M\x02H\x9A\x19\xAA\xFF\xFF\xFF\xFFP\x0C\xDA\xE7\xFF\xFF\xFF\xFF\xC0\x99'\x15\0\0\0\x000\xCE\x18\x16\0\0\0\0@\xCD\x08\x17\0\0\0\0\xB0\x01\xFA\x17\0\0\0\0\xC0\0\xEA\x18\0\0\0\x0005\xDB\x19\0\0\0\0\xC0\x85\xCC\x1A\0\0\0\0\xE0\x92\xBC\x1B\0\0\0\0\xE0\x83\xAC\x1C\0\0\0\0\xE0t\x9C\x1D\0\0\0\0\xE0e\x8C\x1E\0\0\0\0\xE0V|\x1F\0\0\0\0\xE0Gl \0\0\0\0\xE08\\!\0\0\0\0\xE0)L\"\0\0\0\0\xE0\x1A<#\0\0\0\0\xE0\x0B,$\0\0\0\0\xE0\xFC\x1B%\0\0\0\0\xE0\xED\x0B&\0\0\0\0`\x19\x05'\0\0\0\0`\n\xF5'\0\0\0\0p\x18\xF5'\0\0\0\0p\t\xE5(\0\0\0\0p\xFA\xD4)\0\0\0\0p\xEB\xC4*\0\0\0\0p\xDC\xB4+\0\0\0\0p\xCD\xA4,\0\0\0\0p\xBE\x94-\0\0\0\0p\xAF\x84.\0\0\0\0p\xA0t/\0\0\0\0p\x91d0\0\0\0\0\xE0\x90=3\0\0\0\0\xE0kR4\0\0\0\0\xE0r\x1D5\0\0\0\0\xE0M26\0\0\0\0\xE0T\xFD6\0\0\0\0`j\x1B8\0\0\0\0\xE06\xDD8\0\0\0\0`L\xFB9\0\0\0\0\xE0\x18\xBD:\0\0\0\0`.\xDB;\0\0\0\0`5\xA6<\0\0\0\0`\x10\xBB=\0\0\0\0`\x17\x86>\0\0\0\0`\xF2\x9A?\0\0\0\0`\xF9e@\0\0\0\0\xE0\x0E\x84A\0\0\0\0`\xDBEB\0\0\0\0\xE0\xF0cC\0\0\0\0`\xBD%D\0\0\0\0\xE0\xD2CE\0\0\0\0`\x9F\x05F\0\0\0\0\xE0\xB4#G\0\0\0\0\xE0\xBB\xEEG\0\0\0\0\xE0\x96\x03I\0\0\0\0\xE0\x9D\xCEI\0\0\0\0\xE0x\xE3J\0\0\0\0\xE0\x7F\xAEK\0\0\0\0`\x95\xCCL\0\0\0\0\xE0a\x8EM\0\0\0\0`w\xACN\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x02\x04\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\xB8)\0\0\0\0\0\x000*\0\0\0\0\0\0@8\0\0\0\0\0\0PF\0\0\0\0\0\0@8\0\0\0\0\0\0-01\0\0\xF0\xF1\xFF\xFF\xFF\xFF\xFF\xFF\x01+00\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\0\0\0\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\0\x10\x0E\0\0\0\0\0\08\x04\xD4\x04\x90\x1B=^\xFF\xFF\xFF\xFF\xA0\xAA\xE6\x92\xFF\xFF\xFF\xFF\x90\x89K\x9B\xFF\xFF\xFF\xFF\xA0\xE3\xFE\x9B\xFF\xFF\xFF\xFF\xA0\x17\x9D\x9C\xFF\xFF\xFF\xFF\x90\x9F\xC9\x9D\xFF\xFF\xFF\xFF K~\x9E\xFF\xFF\xFF\xFF\x10\xD3\xAA\x9F\xFF\xFF\xFF\xFF\xA0~_\xA0\xFF\xFF\xFF\xFF\x90\x06\x8C\xA1\xFF\xFF\xFF\xFF\xA0\x03B\xA2\xFF\xFF\xFF\xFF\x90\x8Bn\xA3\xFF\xFF\xFF\xFF 7#\xA4\xFF\xFF\xFF\xFF\x10\xBFO\xA5\xFF\xFF\xFF\xFF\x90\x0B\x06\xAA\xFF\xFF\xFF\xFF\x10|\xE7\xAA\xFF\xFF\xFF\xFF\x10\xC4\xC9\xAD\xFF\xFF\xFF\xFF\x10@\xA7\xAE\xFF\xFF\xFF\xFF\x90k\xA0\xAF\xFF\xFF\xFF\xFF\x10\"\x87\xB0\xFF\xFF\xFF\xFF\x10\x88\x89\xB1\xFF\xFF\xFF\xFF\x90>p\xB2\xFF\xFF\xFF\xFF\x90\xA4r\xB3\xFF\xFF\xFF\xFF\x90 P\xB4\xFF\xFF\xFF\xFF\x90h2\xB7\xFF\xFF\xFF\xFF\x90\xE4\x0F\xB8\xFF\xFF\xFF\xFF\x90\xD5\xFF\xB8\xFF\xFF\xFF\xFF\x90\xC6\xEF\xB9\xFF\xFF\xFF\xFF\x10\xD4\xC8\xBC\xFF\xFF\xFF\xFF\x10\xC5\xB8\xBD\xFF\xFF\xFF\xFF\x90{\x9F\xBE\xFF\xFF\xFF\xFF\x10\xA7\x98\xBF\xFF\xFF\xFF\xFF\x10\r\x9B\xC0\xFF\xFF\xFF\xFF\x10\x89x\xC1\xFF\xFF\xFF\xFF\x10zh\xC2\xFF\xFF\xFF\xFF\x10kX\xC3\xFF\xFF\xFF\xFF\x90!?\xC4\xFF\xFF\xFF\xFF\x10M8\xC5\xFF\xFF\xFF\xFF\x10\xB3:\xC6\xFF\xFF\xFF\xFF\x90\xC8X\xC7\xFF\xFF\xFF\xFF\x90\xFB\xD9\xC7\xFF\xFF\xFF\xFF\x90\xEE\x03\xC9\xFF\xFF\xFF\xFF\x90<\xF1\xC9\xFF\xFF\xFF\xFF\x10\x7F\xE2\xCA\xFF\xFF\xFF\xFF\x10o\xB5\xCB\xFF\xFF\xFF\xFF\0\xC0\xEC\xCB\xFF\xFF\xFF\xFF\0h\x80\xCC\xFF\xFF\xFF\xFF\x10\xBF\xDC\xCC\xFF\xFF\xFF\xFF\x10Q\x95\xCD\xFF\xFF\xFF\xFF\x80g\xC3\xCD\xFF\xFF\xFF\xFF\0\xBFr\xCE\xFF\xFF\xFF\xFF\x90\xDB\xC5\xCE\xFF\xFF\xFF\xFF\x103u\xCF\xFF\xFF\xFF\xFF\0\x84\xAC\xCF\xFF\xFF\xFF\xFF\0\xA1R\xD0\xFF\xFF\xFF\xFF\x90\xBD\xA5\xD0\xFF\xFF\xFF\xFF\x10\x15U\xD1\xFF\xFF\xFF\xFF\0f\x8C\xD1\xFF\xFF\xFF\xFF\0\x832\xD2\xFF\xFF\xFF\xFF\x90\x9F\x85\xD2\xFF\xFF\xFF\xFF\x10\xE1Y\xD3\xFF\xFF\xFF\xFF\x10\xD2I\xD4\xFF\xFF\xFF\xFF@\xED9\xD5\xFF\xFF\xFF\xFF@\xDE)\xD6\xFF\xFF\xFF\xFF@\xCF\x19\xD7\xFF\xFF\xFF\xFF@\xC0\t\xD8\xFF\xFF\xFF\xFF@\xB1\xF9\xD8\xFF\xFF\xFF\xFF@\xA2\xE9\xD9\xFF\xFF\xFF\xFF@\x93\xD9\xDA\xFF\xFF\xFF\xFF@\x84\xC9\xDB\xFF\xFF\xFF\xFF@u\xB9\xDC\xFF\xFF\xFF\xFF\xC0\xA0\xB2\xDD\xFF\xFF\xFF\xFF\xC0\x91\xA2\xDE\xFF\xFF\xFF\xFF\xC0\x82\x92\xDF\xFF\xFF\xFF\xFF\xC0s\x82\xE0\xFF\xFF\xFF\xFF\xC0dr\xE1\xFF\xFF\xFF\xFF\xC0Ub\xE2\xFF\xFF\xFF\xFF\xC0FR\xE3\xFF\xFF\xFF\xFF\xC07B\xE4\xFF\xFF\xFF\xFF\xC0(2\xE5\xFF\xFF\xFF\xFF\xC0\x19\"\xE6\xFF\xFF\xFF\xFF@E\x1B\xE7\xFF\xFF\xFF\xFF@6\x0B\xE8\xFF\xFF\xFF\xFF@'\xFB\xE8\xFF\xFF\xFF\xFF@\x18\xEB\xE9\xFF\xFF\xFF\xFF@\t\xDB\xEA\xFF\xFF\xFF\xFF@\xFA\xCA\xEB\xFF\xFF\xFF\xFF@\xEB\xBA\xEC\xFF\xFF\xFF\xFF@\xDC\xAA\xED\xFF\xFF\xFF\xFF@\xCD\x9A\xEE\xFF\xFF\xFF\xFF@\xBE\x8A\xEF\xFF\xFF\xFF\xFF@\xAFz\xF0\xFF\xFF\xFF\xFF@\xA0j\xF1\xFF\xFF\xFF\xFF\xC0\xCBc\xF2\xFF\xFF\xFF\xFF\xC0\xBCS\xF3\xFF\xFF\xFF\xFF\xC0\xADC\xF4\xFF\xFF\xFF\xFF\xC0\x9E3\xF5\xFF\xFF\xFF\xFF\xC0\x8F#\xF6\xFF\xFF\xFF\xFF\xC0\x80\x13\xF7\xFF\xFF\xFF\xFF\xC0q\x03\xF8\xFF\xFF\xFF\xFF\xC0b\xF3\xF8\xFF\xFF\xFF\xFF\xC0S\xE3\xF9\xFF\xFF\xFF\xFF\x90\xCD\x03\x17\0\0\0\0\x90\xBE\xF3\x17\0\0\0\0\x90\xAF\xE3\x18\0\0\0\0\x90\xA0\xD3\x19\0\0\0\0\x90\x91\xC3\x1A\0\0\0\0\x10\xBD\xBC\x1B\0\0\0\0\x10\xAE\xAC\x1C\0\0\0\0\x10\x9F\x9C\x1D\0\0\0\0\x10\x8C\x18\x1E\0\0\0\0\x10\x90\x8C\x1E\0\0\0\0\x10\x81|\x1F\0\0\0\0\x10rl \0\0\0\0\x10c\\!\0\0\0\0\x10TL\"\0\0\0\0\x10E<#\0\0\0\0\x106,$\0\0\0\0\x10'\x1C%\0\0\0\0\x10\x18\x0C&\0\0\0\0\x90C\x05'\0\0\0\0\x904\xF5'\0\0\0\0\x90%\xE5(\0\0\0\0\x90\x16\xD5)\0\0\0\0\x90\x07\xC5*\0\0\0\0 \x0E=+\0\0\0\0\x90\xF8\xB4+\0\0\0\0\x10\xC2\x1F,\0\0\0\0\x90\xE9\xA4,\0\0\0\0\x90\xDA\x94-\0\0\0\0\x90\xCB\x84.\0\0\0\0\x90\xBCt/\0\0\0\0\x90\xADd0\0\0\0\0\x10\xD9]1\0\0\0\0\x10\xB4r2\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x03\x02\x03\x04\x03\x02\x03\x04\x03\x02\x03\x04\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x03\x05\x04\x03\x05\x04\x03\x05\x04\x03\x05\x04\x03\x05\x04\x04\x03\x05\x04\x03\x05\x04\x03\x05\x04\x03\x05\x04\x03\x05\x04\x03\x05\x04\x03\x05\x04\x06\x07\x04\x06\x03\x05\x04\x06\x03\x05\x04\x06\x03\x05\x04\x06\x03\x05\xF0\xE7\xFF\xFF\xFF\xFF\xFF\xFF(\xE5\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFF\xF0\xF1\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\xF0\xF1\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0AST\0\0\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\x01ADT\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x02\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x0B\x01\0 \x1C\0\0\0\0\0\0\0\x03`\x03F\x18\x87i\xFF\xFF\xFF\xFFF\xAE\xCC\x9C\xFF\xFF\xFF\xFF6K\xB7\x9D\xFF\xFF\xFF\xFF\xC6m\xB8\x9E\xFF\xFF\xFF\xFF6\xB8\x84\x9F\xFF\xFF\xFF\xFF\xE6\x1D\xC3\xB4\xFF\xFF\xFF\xFF\xE0\xA6b\xCB\xFF\xFF\xFF\xFF\xD0\xBC\xD3\xCC\xFF\xFF\xFF\xFF\xE0\xD1\x9E\xCD\xFF\xFF\xFF\xFF\xD0\x13\xC6\xCE\xFF\xFF\xFF\xFF`yu\xCF\xFF\xFF\xFF\xFFP0\xAF\xD0\xFF\xFF\xFF\xFF`[U\xD1\xFF\xFF\xFF\xFFP\x12\x8F\xD2\xFF\xFF\xFF\xFF`hq\xD5\xFF\xFF\xFF\xFF\xD0<\x0E\xD6\xFF\xFF\xFF\xFF\xE0\x84Z\xD7\xFF\xFF\xFF\xFFP\xE4\xE4\xD7\xFF\xFF\xFF\xFF\xE0f:\xD9\xFF\xFF\xFF\xFFP\xC6\xC4\xD9\xFF\xFF\xFF\xFF`\x83#\xDB\xFF\xFF\xFF\xFFP\xA8\xA4\xDB\xFF\xFF\xFF\xFF`e\x03\xDD\xFF\xFF\xFF\xFFP\x8A\x84\xDD\xFF\xFF\xFF\xFF`G\xE3\xDE\xFF\xFF\xFF\xFF\xD0\xA6m\xDF\xFF\xFF\xFF\xFF\xE0\tl\xE6\xFF\xFF\xFF\xFF\xD0\x027\xE7\xFF\xFF\xFF\xFF`\xB3 \x08\0\0\0\0P\x96\x10\t\0\0\0\0`\x95\0\n\0\0\0\0Px\xF0\n\0\0\0\0`w\xE0\x0B\0\0\0\0\xD0\x94\xD9\x0C\0\0\0\0`Y\xC0\r\0\0\0\0\xD0v\xB9\x0E\0\0\0\0\xE0u\xA9\x0F\0\0\0\0\xD0X\x99\x10\0\0\0\0\xE0W\x89\x11\0\0\0\0\xD0:y\x12\0\0\0\0\xE09i\x13\0\0\0\0\xD0\x1CY\x14\0\0\0\0\xE0\x1BI\x15\0\0\0\0\xD0\xFE8\x16\0\0\0\0\xE0\xFD(\x17\0\0\0\0P\x1B\"\x18\0\0\0\0\xE0\xDF\x08\x19\0\0\0\0P\xFD\x01\x1A\0\0\0\0`\xFC\xF1\x1A\0\0\0\0P\xDF\xE1\x1B\0\0\0\0`\xDE\xD1\x1C\0\0\0\0P\xC1\xC1\x1D\0\0\0\0`\xC0\xB1\x1E\0\0\0\0P\xA3\xA1\x1F\0\0\0\0\xE0\xF2u \0\0\0\0P\x85\x81!\0\0\0\0\xE0\xD4U\"\0\0\0\0\xD0\xA1j#\0\0\0\0\xE0\xB65$\0\0\0\0\xD0\x83J%\0\0\0\0\xE0\x98\x15&\0\0\0\0\xD0e*'\0\0\0\0`\xB5\xFE'\0\0\0\0\xD0G\n)\0\0\0\0`\x97\xDE)\0\0\0\0\xD0)\xEA*\0\0\0\0`y\xBE+\0\0\0\0PF\xD3,\0\0\0\0`[\x9E-\0\0\0\0P(\xB3.\0\0\0\0`=~/\0\0\0\0P\n\x930\0\0\0\0\xE0Yg1\0\0\0\0P\xECr2\0\0\0\0\xE0;G3\0\0\0\0P\xCER4\0\0\0\0\xE0\x1D'5\0\0\0\0P\xB026\0\0\0\0\xE0\xFF\x067\0\0\0\0\xD0\xCC\x1B8\0\0\0\0\xE0\xE1\xE68\0\0\0\0\xD0\xAE\xFB9\0\0\0\0\xE0\xC3\xC6:\0\0\0\0\xD0\x90\xDB;\0\0\0\0`\xE0\xAF<\0\0\0\0\xD0r\xBB=\0\0\0\0`\xC2\x8F>\0\0\0\0\xD0T\x9B?\0\0\0\0`\xA4o@\0\0\0\0Pq\x84A\0\0\0\0`\x86OB\0\0\0\0PSdC\0\0\0\0`h/D\0\0\0\0P5DE\0\0\0\0\xE0\x9A\xF3E\0\0\0\0\xD0Q-G\0\0\0\0\0\x01\0\x01\0\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02:\xC3\xFF\xFF\xFF\xFF\xFF\xFFJ\xD1\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFFWET\0\0\0\0\0\0\0\0\0\0\x01WEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\0 \x1C\0\0\0\0\0\0 \x01D\x01\xF0\\\x04\xA6\xFF\xFF\xFF\xFF \xF7A\xD4\xFF\xFF\xFF\xFF\x006M\x13\0\0\0\0\x90\xFA3\x14\0\0\0\0\x90\xEB#\x15\0\0\0\0\x90\xDC\x13\x16\0\0\0\0\x90\xCD\x03\x17\0\0\0\0\x90\xBE\xF3\x17\0\0\0\0\x90\xAF\xE3\x18\0\0\0\0\x90\xA0\xD3\x19\0\0\0\0\x90\x91\xC3\x1A\0\0\0\0\x10\xBD\xBC\x1B\0\0\0\0\x10\xAE\xAC\x1C\0\0\0\0\x10\x9F\x9C\x1D\0\0\0\0\x10\x90\x8C\x1E\0\0\0\0\x10\x81|\x1F\0\0\0\0\x10rl \0\0\0\0\x10c\\!\0\0\0\0\x10TL\"\0\0\0\0\x10E<#\0\0\0\0\x106,$\0\0\0\0\x10'\x1C%\0\0\0\0\x10\x18\x0C&\0\0\0\0\x90C\x05'\0\0\0\0\x904\xF5'\0\0\0\0\x90%\xE5(\0\0\0\0\x90\x16\xD5)\0\0\0\0\x90\x07\xC5*\0\0\0\0\x90\xF8\xB4+\0\0\0\0\x90\xE9\xA4,\0\0\0\0\x90\xDA\x94-\0\0\0\0\x90\xCB\x84.\0\0\0\0\x90\xBCt/\0\0\0\0\x90\xADd0\0\0\0\0\x10\xD9]1\0\0\0\0\x10\xB4r2\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x90\xF1\xFF\xFF\xFF\xFF\xFF\xFF\xF0\xF1\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0-01\0\0\xF0\xF1\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0%\0\xA0\xAA\xE6\x92\xFF\xFF\xFF\xFF \x9C\x95\xCC\xFF\xFF\xFF\xFF\x10|t\xD2\xFF\xFF\xFF\xFF@\xF7\x17\x0B\0\0\0\0\x01\x02\x01\x02\x03\xF4\xE9\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFF\xF0\xF1\xFF\xFF\xFF\xFF\xFF\xFF\xF0\xF1\xFF\xFF\xFF\xFF\xFF\xFFWET\0\0\0\0\0\0\0\0\0\0\x01WEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\0 \x1C\0\0\0\0\0\0\x08\x01)\x01X\xA4m\x8B\xFF\xFF\xFF\xFF\0+\xB1\x14\0\0\0\0\x90\xDC\x13\x16\0\0\0\0\x90\xCD\x03\x17\0\0\0\0\x90\xBE\xF3\x17\0\0\0\0\x90\xAF\xE3\x18\0\0\0\0\x90\xA0\xD3\x19\0\0\0\0\x90\x91\xC3\x1A\0\0\0\0\x10\xBD\xBC\x1B\0\0\0\0\x10\xAE\xAC\x1C\0\0\0\0\x10\x9F\x9C\x1D\0\0\0\0\x10\x90\x8C\x1E\0\0\0\0\x10\x81|\x1F\0\0\0\0\x10rl \0\0\0\0\x10c\\!\0\0\0\0\x10TL\"\0\0\0\0\x10E<#\0\0\0\0\x106,$\0\0\0\0\x10'\x1C%\0\0\0\0\x10\x18\x0C&\0\0\0\0\x90C\x05'\0\0\0\0\x904\xF5'\0\0\0\0\x90%\xE5(\0\0\0\0\x90\x16\xD5)\0\0\0\0\x90\x07\xC5*\0\0\0\0\x90\xF8\xB4+\0\0\0\0\x90\xE9\xA4,\0\0\0\0\x90\xDA\x94-\0\0\0\0\x90\xCB\x84.\0\0\0\0\x90\xBCt/\0\0\0\0\x90\xADd0\0\0\0\0\x10\xD9]1\0\0\0\0\x10\xB4r2\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xA8\xF9\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0WET\0\0\0\0\0\0\0\0\0\0\x01WEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\0 \x1C\0\0\0\0\0\0 \x04\xB4\x04X\x13=^\xFF\xFF\xFF\xFF\x90\x9C\xE6\x92\xFF\xFF\xFF\xFF\x80{K\x9B\xFF\xFF\xFF\xFF\x90\xD5\xFE\x9B\xFF\xFF\xFF\xFF\x90\t\x9D\x9C\xFF\xFF\xFF\xFF\x80\x91\xC9\x9D\xFF\xFF\xFF\xFF\x10=~\x9E\xFF\xFF\xFF\xFF\0\xC5\xAA\x9F\xFF\xFF\xFF\xFF\x90p_\xA0\xFF\xFF\xFF\xFF\x80\xF8\x8B\xA1\xFF\xFF\xFF\xFF\x90\xF5A\xA2\xFF\xFF\xFF\xFF\x80}n\xA3\xFF\xFF\xFF\xFF\x10)#\xA4\xFF\xFF\xFF\xFF\0\xB1O\xA5\xFF\xFF\xFF\xFF\x80\xFD\x05\xAA\xFF\xFF\xFF\xFF\0n\xE7\xAA\xFF\xFF\xFF\xFF\0\xB6\xC9\xAD\xFF\xFF\xFF\xFF\x002\xA7\xAE\xFF\xFF\xFF\xFF\x80]\xA0\xAF\xFF\xFF\xFF\xFF\0\x14\x87\xB0\xFF\xFF\xFF\xFF\0z\x89\xB1\xFF\xFF\xFF\xFF\x800p\xB2\xFF\xFF\xFF\xFF\x80\x96r\xB3\xFF\xFF\xFF\xFF\x80\x12P\xB4\xFF\xFF\xFF\xFF\x80Z2\xB7\xFF\xFF\xFF\xFF\x80\xD6\x0F\xB8\xFF\xFF\xFF\xFF\x80\xC7\xFF\xB8\xFF\xFF\xFF\xFF\x80\xB8\xEF\xB9\xFF\xFF\xFF\xFF\0\xC6\xC8\xBC\xFF\xFF\xFF\xFF\0\xB7\xB8\xBD\xFF\xFF\xFF\xFF\x80m\x9F\xBE\xFF\xFF\xFF\xFF\0\x99\x98\xBF\xFF\xFF\xFF\xFF\0\xFF\x9A\xC0\xFF\xFF\xFF\xFF\0{x\xC1\xFF\xFF\xFF\xFF\0lh\xC2\xFF\xFF\xFF\xFF\0]X\xC3\xFF\xFF\xFF\xFF\x80\x13?\xC4\xFF\xFF\xFF\xFF\0?8\xC5\xFF\xFF\xFF\xFF\0\xA5:\xC6\xFF\xFF\xFF\xFF\x80\xBAX\xC7\xFF\xFF\xFF\xFF\x80\xED\xD9\xC7\xFF\xFF\xFF\xFF\x80\xE0\x03\xC9\xFF\xFF\xFF\xFF\x80.\xF1\xC9\xFF\xFF\xFF\xFF\0q\xE2\xCA\xFF\xFF\xFF\xFF\0a\xB5\xCB\xFF\xFF\xFF\xFF\xF0\xB1\xEC\xCB\xFF\xFF\xFF\xFF\xF0Y\x80\xCC\xFF\xFF\xFF\xFF\0\xB1\xDC\xCC\xFF\xFF\xFF\xFF\0C\x95\xCD\xFF\xFF\xFF\xFFpY\xC3\xCD\xFF\xFF\xFF\xFF\xF0\xB0r\xCE\xFF\xFF\xFF\xFF\x80\xCD\xC5\xCE\xFF\xFF\xFF\xFF\0%u\xCF\xFF\xFF\xFF\xFF\xF0u\xAC\xCF\xFF\xFF\xFF\xFF\xF0\x92R\xD0\xFF\xFF\xFF\xFF\x80\xAF\xA5\xD0\xFF\xFF\xFF\xFF\0\x07U\xD1\xFF\xFF\xFF\xFF\xF0W\x8C\xD1\xFF\xFF\xFF\xFF\xF0t2\xD2\xFF\xFF\xFF\xFF\x80\x91\x85\xD2\xFF\xFF\xFF\xFF\0\xD3Y\xD3\xFF\xFF\xFF\xFF\0\xC4I\xD4\xFF\xFF\xFF\xFF0\xDF9\xD5\xFF\xFF\xFF\xFF0\xD0)\xD6\xFF\xFF\xFF\xFF0\xC1\x19\xD7\xFF\xFF\xFF\xFF0\xB2\t\xD8\xFF\xFF\xFF\xFF0\xA3\xF9\xD8\xFF\xFF\xFF\xFF0\x94\xE9\xD9\xFF\xFF\xFF\xFF0\x85\xD9\xDA\xFF\xFF\xFF\xFF0v\xC9\xDB\xFF\xFF\xFF\xFF0g\xB9\xDC\xFF\xFF\xFF\xFF\xB0\x92\xB2\xDD\xFF\xFF\xFF\xFF\xB0\x83\xA2\xDE\xFF\xFF\xFF\xFF\xB0t\x92\xDF\xFF\xFF\xFF\xFF\xB0e\x82\xE0\xFF\xFF\xFF\xFF\xB0Vr\xE1\xFF\xFF\xFF\xFF\xB0Gb\xE2\xFF\xFF\xFF\xFF\xB08R\xE3\xFF\xFF\xFF\xFF\xB0)B\xE4\xFF\xFF\xFF\xFF\xB0\x1A2\xE5\xFF\xFF\xFF\xFF\xB0\x0B\"\xE6\xFF\xFF\xFF\xFF07\x1B\xE7\xFF\xFF\xFF\xFF0(\x0B\xE8\xFF\xFF\xFF\xFF0\x19\xFB\xE8\xFF\xFF\xFF\xFF0\n\xEB\xE9\xFF\xFF\xFF\xFF0\xFB\xDA\xEA\xFF\xFF\xFF\xFF0\xEC\xCA\xEB\xFF\xFF\xFF\xFF0\xDD\xBA\xEC\xFF\xFF\xFF\xFF0\xCE\xAA\xED\xFF\xFF\xFF\xFF0\xBF\x9A\xEE\xFF\xFF\xFF\xFF0\xB0\x8A\xEF\xFF\xFF\xFF\xFF0\xA1z\xF0\xFF\xFF\xFF\xFF0\x92j\xF1\xFF\xFF\xFF\xFF\xB0\xBDc\xF2\xFF\xFF\xFF\xFF\xB0\xAES\xF3\xFF\xFF\xFF\xFF\xB0\x9FC\xF4\xFF\xFF\xFF\xFF\xB0\x903\xF5\xFF\xFF\xFF\xFF\xB0\x81#\xF6\xFF\xFF\xFF\xFF\xB0r\x13\xF7\xFF\xFF\xFF\xFF\xB0c\x03\xF8\xFF\xFF\xFF\xFF\xB0T\xF3\xF8\xFF\xFF\xFF\xFF\xB0E\xE3\xF9\xFF\xFF\xFF\xFF\0\xFA\x0C\x17\0\0\0\0\x80\xB0\xF3\x17\0\0\0\0\x80\xA1\xE3\x18\0\0\0\0\x80\x92\xD3\x19\0\0\0\0\x80\x83\xC3\x1A\0\0\0\0\0\xAF\xBC\x1B\0\0\0\0\0\xA0\xAC\x1C\0\0\0\0\0\x91\x9C\x1D\0\0\0\0\0\x82\x8C\x1E\0\0\0\0\x10\x81|\x1F\0\0\0\0\x10rl \0\0\0\0\x10c\\!\0\0\0\0\x10TL\"\0\0\0\0\x10E<#\0\0\0\0\x106,$\0\0\0\0\x10'\x1C%\0\0\0\0\x10\x18\x0C&\0\0\0\0\x90C\x05'\0\0\0\0\x904\xF5'\0\0\0\0\x90%\xE5(\0\0\0\0\x90\x16\xD5)\0\0\0\0\x90\x07\xC5*\0\0\0\0\x90\xF8\xB4+\0\0\0\0\x90\xE9\xA4,\0\0\0\0\x90\xDA\x94-\0\0\0\0\x90\xCB\x84.\0\0\0\0\x90\xBCt/\0\0\0\0\x90\xADd0\0\0\0\0\x10\xD9]1\0\0\0\0\x10\xB4r2\0\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x02\x01\x02\x03\x02\x01\x02\x03\x02\x01\x02\x03\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04(\xF0\xFF\xFF\xFF\xFF\xFF\xFF\xF0\xF1\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0\0\0\0\0\0\0\0\0-02\0\0\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\t\0\xC0\xFD\x86i\xFF\xFF\xFF\xFF\x01\xC0\xDD\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFF-03\0\0\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\08\x02\x9C\x02\xBC\x11\x87i\xFF\xFF\xFF\xFF<_D\x93\xFF\xFF\xFF\xFF\xC0ZO\xC3\xFF\xFF\xFF\xFF0\x036\xC4\xFF\xFF\xFF\xFF\xC0\0\0\0\0`\xC9Z?\0\0\0\0P\x0B\x82@\0\0\0\0`\xAB:A\0\0\0\0P\xEDaB\0\0\0\0`\x8D\x1AC\0\0\0\0P\xCFAD\0\0\0\0`o\xFAD\0\0\0\0P\xB1!F\0\0\0\0`Q\xDAF\0\0\0\0\xD0\xCD\nH\0\0\0\0\xE0m\xC3H\0\0\0\0\xD0\xAF\xEAI\0\0\0\0\xE0O\xA3J\0\0\0\0\xD0\x91\xCAK\0\0\0\0\xE01\x83L\0\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x04\x02\x03\x04\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\xC4\xC9\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFFACST\0\x98\x85\0\0\0\0\0\0\x01ACDT\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\n\x01\x000*\0\0\0\0\0\0\x02\0\0\0\x01\x04\x01\0 \x1C\0\0\0\0\0\0\xA8\x02\xFD\x02\x14\x8B\x16s\xFF\xFF\xFF\xFFp\x03\x12{\xFF\xFF\xFF\xFF\x88\xC9N\x9C\xFF\xFF\xFF\xFF\x086\xBC\x9C\xFF\xFF\xFF\xFF\x08\xBAT\xCB\xFF\xFF\xFF\xFF\x88l\xC7\xCB\xFF\xFF\xFF\xFF\x88]\xB7\xCC\xFF\xFF\xFF\xFF\x88N\xA7\xCD\xFF\xFF\xFF\xFF\x08z\xA0\xCE\xFF\xFF\xFF\xFF\x880\x87\xCF\xFF\xFF\xFF\xFF\x88@p\x03\0\0\0\0\x08#\r\x04\0\0\0\0\x88\"P\x05\0\0\0\0\x88?\xF6\x05\0\0\0\0\x88\x040\x07\0\0\0\0\x88!\xD6\x07\0\0\0\0\x88\xE6\x0F\t\0\0\0\0\x88\x03\xB6\t\0\0\0\0\x88\xC8\xEF\n\0\0\0\0\x08 \x9F\x0B\0\0\0\0\x08\xE5\xD8\x0C\0\0\0\0\x08\x02\x7F\r\0\0\0\0\x08\xC7\xB8\x0E\0\0\0\0\x08\xE4^\x0F\0\0\0\0\x08\xA9\x98\x10\0\0\0\0\x08\xC6>\x11\0\0\0\0\x08\x8Bx\x12\0\0\0\0\x08\xA8\x1E\x13\0\0\0\0\x08mX\x14\0\0\0\0\x08\x8A\xFE\x14\0\0\0\0\x08O8\x16\0\0\0\0\x88\xA6\xE7\x16\0\0\0\0\x88k!\x18\0\0\0\0\x88\x88\xC7\x18\0\0\0\0\x88M\x01\x1A\0\0\0\0\x88j\xA7\x1A\0\0\0\0\x88/\xE1\x1B\0\0\0\0\x88L\x87\x1C\0\0\0\0\x88\x11\xC1\x1D\0\0\0\0\x88\xA3y\x1E\0\0\0\0\x08\xB9\x97\x1F\0\0\0\0\x88\x85Y \0\0\0\0\x88\xD5\x80!\0\0\0\0\x08\xA2B\"\0\0\0\0\x08\xF2i#\0\0\0\0\x08\x84\"$\0\0\0\0\x08\xD4I%\0\0\0\0\x08f\x02&\0\0\0\0\x08\xB6)'\0\0\0\0\x08\xD3\xCF'\0\0\0\0\x08\x98\t)\0\0\0\0\x88d\xCB)\0\0\0\0\x08z\xE9*\0\0\0\0\x88\xD1\x98+\0\0\0\0\x88\x96\xD2,\0\0\0\0\x88(\x8B-\0\0\0\0\x88x\xB2.\0\0\0\0\x08Et/\0\0\0\0\x88Z\x920\0\0\0\0\x88a]1\0\0\0\0\x88\0\0\0\0\x08\xA5\x9A?\0\0\0\0\x08\xACe@\0\0\0\0\x88\xC1\x83A\0\0\0\0\x08\x8EEB\0\0\0\0\x88\xA3cC\0\0\0\0\x88\xAA.D\0\0\0\0\x88\x85CE\0\0\0\0\x08R\x05F\0\0\0\0\x88g#G\0\0\0\0\x08\xA9\xF7G\0\0\0\0\x08\x9A\xE7H\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\xEC\x81\0\0\0\0\0\0\x90~\0\0\0\0\0\0\x98\x85\0\0\0\0\0\0\xA8\x93\0\0\0\0\0\0AEST\0\xA0\x8C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0p\0~\0\x08\x9F\xEDr\xFF\xFF\xFF\xFF\x80\xC2N\x9C\xFF\xFF\xFF\xFF\0/\xBC\x9C\xFF\xFF\xFF\xFF\0\xB3T\xCB\xFF\xFF\xFF\xFF\x80e\xC7\xCB\xFF\xFF\xFF\xFF\x80V\xB7\xCC\xFF\xFF\xFF\xFF\x80G\xA7\xCD\xFF\xFF\xFF\xFF\0s\xA0\xCE\xFF\xFF\xFF\xFF\x80)\x87\xCF\xFF\xFF\xFF\xFF\x809p\x03\0\0\0\0\0\x1C\r\x04\0\0\0\0\0\xCDI%\0\0\0\0\0\xEA\xEF%\0\0\0\0\0\xAF)'\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02x\x8F\0\0\0\0\0\0\xA0\x8C\0\0\0\0\0\0\xB0\x9A\0\0\0\0\0\0ACST\0\x98\x85\0\0\0\0\0\0\x01ACDT\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\n\x01\x000*\0\0\0\0\0\0\x02\0\0\0\x01\x04\x01\0 \x1C\0\0\0\0\0\0\xB0\x02\x06\x03d\x88\x16s\xFF\xFF\xFF\xFF\xE0\xA5\x04v\xFF\xFF\xFF\xFFp\x03\x12{\xFF\xFF\xFF\xFF\x88\xC9N\x9C\xFF\xFF\xFF\xFF\x086\xBC\x9C\xFF\xFF\xFF\xFF\x08\xBAT\xCB\xFF\xFF\xFF\xFF\x88l\xC7\xCB\xFF\xFF\xFF\xFF\x88]\xB7\xCC\xFF\xFF\xFF\xFF\x88N\xA7\xCD\xFF\xFF\xFF\xFF\x08z\xA0\xCE\xFF\xFF\xFF\xFF\x880\x87\xCF\xFF\xFF\xFF\xFF\x88@p\x03\0\0\0\0\x08#\r\x04\0\0\0\0\x88\"P\x05\0\0\0\0\x88?\xF6\x05\0\0\0\0\x88\x040\x07\0\0\0\0\x88!\xD6\x07\0\0\0\0\x88\xE6\x0F\t\0\0\0\0\x88\x03\xB6\t\0\0\0\0\x88\xC8\xEF\n\0\0\0\0\x08 \x9F\x0B\0\0\0\0\x08\xE5\xD8\x0C\0\0\0\0\x08\x02\x7F\r\0\0\0\0\x08\xC7\xB8\x0E\0\0\0\0\x08\xE4^\x0F\0\0\0\0\x08\xA9\x98\x10\0\0\0\0\x08\xC6>\x11\0\0\0\0\x08\x8Bx\x12\0\0\0\0\x08\xA8\x1E\x13\0\0\0\0\x08mX\x14\0\0\0\0\x08\x8A\xFE\x14\0\0\0\0\x08O8\x16\0\0\0\0\x88\x90\x0C\x17\0\0\0\0\x88k!\x18\0\0\0\0\x88\x88\xC7\x18\0\0\0\0\x88M\x01\x1A\0\0\0\0\x88j\xA7\x1A\0\0\0\0\x88/\xE1\x1B\0\0\0\0\x88L\x87\x1C\0\0\0\0\x88\x11\xC1\x1D\0\0\0\0\x88\xA3y\x1E\0\0\0\0\x08\xB9\x97\x1F\0\0\0\0\x88\x85Y \0\0\0\0\x88\xD5\x80!\0\0\0\0\x08\xA2B\"\0\0\0\0\x08\xF2i#\0\0\0\0\x08\x84\"$\0\0\0\0\x08\xD4I%\0\0\0\0\x08\xF1\xEF%\0\0\0\0\x08\xB6)'\0\0\0\0\x08\xD3\xCF'\0\0\0\0\x08\x98\t)\0\0\0\0\x08\xB5\xAF)\0\0\0\0\x08z\xE9*\0\0\0\0\x88\xD1\x98+\0\0\0\0\x88\x96\xD2,\0\0\0\0\x88\xB3x-\0\0\0\0\x88x\xB2.\0\0\0\0\x88\x95X/\0\0\0\0\x88Z\x920\0\0\0\0\x88a]1\0\0\0\0\x88\0\0\0\0\x08\xA5\x9A?\0\0\0\0\x08\xACe@\0\0\0\0\x88\xC1\x83A\0\0\0\0\x08\x8EEB\0\0\0\0\x88\xA3cC\0\0\0\0\x88\xAA.D\0\0\0\0\x88\x85CE\0\0\0\0\x08R\x05F\0\0\0\0\x88g#G\0\0\0\0\x08\xA9\xF7G\0\0\0\0\x08\x9A\xE7H\0\0\0\0\x01\x02\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x9C\x84\0\0\0\0\0\0\xA0\x8C\0\0\0\0\0\0\x90~\0\0\0\0\0\0\x98\x85\0\0\0\0\0\0\xA8\x93\0\0\0\0\0\0ACST\0\x98\x85\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0H\0Q\0X\x92\x16s\xFF\xFF\xFF\xFFp\x03\x12{\xFF\xFF\xFF\xFF\x88\xC9N\x9C\xFF\xFF\xFF\xFF\x086\xBC\x9C\xFF\xFF\xFF\xFF\x08\xBAT\xCB\xFF\xFF\xFF\xFF\x88l\xC7\xCB\xFF\xFF\xFF\xFF\x88]\xB7\xCC\xFF\xFF\xFF\xFF\x88N\xA7\xCD\xFF\xFF\xFF\xFF\x08z\xA0\xCE\xFF\xFF\xFF\xFF\x01\x02\x03\x02\x03\x02\x03\x02\x03\xA8z\0\0\0\0\0\0\x90~\0\0\0\0\0\0\x98\x85\0\0\0\0\0\0\xA8\x93\0\0\0\0\0\0+0845\x0C{\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x80\0\x90\0\xB0\n\xA6t\xFF\xFF\xFF\xFF\x14\xD4N\x9C\xFF\xFF\xFF\xFF\x94@\xBC\x9C\xFF\xFF\xFF\xFF\x94\xC4T\xCB\xFF\xFF\xFF\xFF\x14w\xC7\xCB\xFF\xFF\xFF\xFF\x14h\xB7\xCC\xFF\xFF\xFF\xFF\x14Y\xA7\xCD\xFF\xFF\xFF\xFF\x14\xF1\x0F\t\0\0\0\0\x14\x0E\xB6\t\0\0\0\0\x14X\x01\x1A\0\0\0\0\x14u\xA7\x1A\0\0\0\0\x14R%)\0\0\0\0\x94\xBF\xAF)\0\0\0\0\x94\xB4qE\0\0\0\0\x94\\\x05F\0\0\0\0\x14r#G\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\xD0x\0\0\0\0\0\0\x0C{\0\0\0\0\0\0\x1C\x89\0\0\0\0\0\0AEST\0\xA0\x8C\0\0\0\0\0\0\x01AEDT\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\n\x01\x000*\0\0\0\0\0\0\x02\0\0\0\x01\x04\x01\0 \x1C\0\0\0\0\0\0\0\x03`\x03\xE4\0.t\xFF\xFF\xFF\xFF\x80x\xD5\x9B\xFF\xFF\xFF\xFF\0/\xBC\x9C\xFF\xFF\xFF\xFF\x80D\xDA\x9D\xFF\xFF\xFF\xFF\x80a\x80\x9E\xFF\xFF\xFF\xFF\x80&\xBA\x9F\xFF\xFF\xFF\xFF\x80C`\xA0\xFF\xFF\xFF\xFF\0\xB3T\xCB\xFF\xFF\xFF\xFF\x80e\xC7\xCB\xFF\xFF\xFF\xFF\x80V\xB7\xCC\xFF\xFF\xFF\xFF\x80G\xA7\xCD\xFF\xFF\xFF\xFF\0s\xA0\xCE\xFF\xFF\xFF\xFF\x80)\x87\xCF\xFF\xFF\xFF\xFF\0\x8D\xC2\xFB\xFF\xFF\xFF\xFF\0~\xB2\xFC\xFF\xFF\xFF\xFF\0Y\xC7\xFD\xFF\xFF\xFF\xFF\x80\xB0v\xFE\xFF\xFF\xFF\xFF\0;\xA7\xFF\xFF\xFF\xFF\xFF\x80\x92V\0\0\0\0\0\0\x1D\x87\x01\0\0\0\0\0\xAF?\x02\0\0\0\0\x809p\x03\0\0\0\0\0\x1C\r\x04\0\0\0\0\x80\x1BP\x05\0\0\0\0\x808\xF6\x05\0\0\0\0\x80\xFD/\x07\0\0\0\0\x80\x1A\xD6\x07\0\0\0\0\x80\xDF\x0F\t\0\0\0\0\x80\xFC\xB5\t\0\0\0\0\x80\xC1\xEF\n\0\0\0\0\0\x19\x9F\x0B\0\0\0\0\0\xDE\xD8\x0C\0\0\0\0\0\xFB~\r\0\0\0\0\0\xC0\xB8\x0E\0\0\0\0\0\xDD^\x0F\0\0\0\0\0\xA2\x98\x10\0\0\0\0\0\xBF>\x11\0\0\0\0\0\x84x\x12\0\0\0\0\0\xA1\x1E\x13\0\0\0\0\0fX\x14\0\0\0\0\0\x83\xFE\x14\0\0\0\0\0H8\x16\0\0\0\0\0O\x03\x17\0\0\0\0\x80d!\x18\0\0\0\0\x001\xE3\x18\0\0\0\0\x80F\x01\x1A\0\0\0\0\x80c\xA7\x1A\0\0\0\0\x80(\xE1\x1B\0\0\0\0\x80E\x87\x1C\0\0\0\0\x80\n\xC1\x1D\0\0\0\0\x80'g\x1E\0\0\0\0\0\xB2\x97\x1F\0\0\0\0\x80~Y \0\0\0\0\x80\xCE\x80!\0\0\0\0\0\x9BB\"\0\0\0\0\0\xEBi#\0\0\0\0\0}\"$\0\0\0\0\0\xCDI%\0\0\0\0\0_\x02&\0\0\0\0\0\xAF)'\0\0\0\0\0\xB6\xF4'\0\0\0\0\x80\xE1\xED(\0\0\0\0\0\x98\xD4)\0\0\0\0\x80\xC3\xCD*\0\0\0\0\0z\xB4+\0\0\0\0\x80\xA5\xAD,\0\0\0\0\0\\\x94-\0\0\0\0\x80\x87\x8D.\0\0\0\0\0>t/\0\0\0\0\x80im0\0\0\0\0\x80Z]1\0\0\0\0\0\x86V2\0\0\0\0\x80<=3\0\0\0\0\0h64\0\0\0\0\x80\x1E\x1D5\0\0\0\0\0J\x166\0\0\0\0\x80\0\xFD6\0\0\0\0\0,\xF67\0\0\0\0\x80\xE2\xDC8\0\0\0\0\x80\xE9\xA79\0\0\0\0\x80\xC4\xBC:\0\0\0\0\x80*\xBF;\0\0\0\0\0\xE1\xA5<\0\0\0\0\x80\x0C\x9F=\0\0\0\0\0\xC3\x85>\0\0\0\0\x80\xEE~?\0\0\0\0\0\xA5e@\0\0\0\0\x80\xD0^A\0\0\0\0\0\x87EB\0\0\0\0\x80\xB2>C\0\0\0\0\x80\xA3.D\0\0\0\0\x80\x94\x1EE\0\0\0\0\0K\x05F\0\0\0\0\0\xB1\x07G\0\0\0\0\0\xA2\xF7G\0\0\0\0\0\x93\xE7H\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x1C\x8A\0\0\0\0\0\0\xA0\x8C\0\0\0\0\0\0\xB0\x9A\0\0\0\0\0\0AEST\0\xA0\x8C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xA0\0\xB4\0\xD4\xA2\xEDr\xFF\xFF\xFF\xFF\x80\xC2N\x9C\xFF\xFF\xFF\xFF\0/\xBC\x9C\xFF\xFF\xFF\xFF\0\xB3T\xCB\xFF\xFF\xFF\xFF\x80e\xC7\xCB\xFF\xFF\xFF\xFF\x80V\xB7\xCC\xFF\xFF\xFF\xFF\x80G\xA7\xCD\xFF\xFF\xFF\xFF\0s\xA0\xCE\xFF\xFF\xFF\xFF\x80)\x87\xCF\xFF\xFF\xFF\xFF\x809p\x03\0\0\0\0\0\x1C\r\x04\0\0\0\0\0\xCDI%\0\0\0\0\0\xEA\xEF%\0\0\0\0\0\xAF)'\0\0\0\0\0\xCC\xCF'\0\0\0\0\0\x91\t)\0\0\0\0\0\xAE\xAF)\0\0\0\0\0s\xE9*\0\0\0\0\x80\xCA\x98+\0\0\0\0\x80\x8F\xD2,\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\xAC\x8B\0\0\0\0\0\0\xA0\x8C\0\0\0\0\0\0\xB0\x9A\0\0\0\0\0\0+1030\xA8\x93\0\0\0\0\0\0\x01+11\0\0\x08\x07\0\0\0\0\0\0\x02\0\0\0\x01\n\x01\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\x04\x01\0 \x1C\0\0\0\0\0\0\xC8\x01\x01\x02\xDCw\x16s\xFF\xFF\xFF\xFF\xE0f\xFE\x14\0\0\0\0\xF8@8\x16\0\0\0\0h\x8A\xE7\x16\0\0\0\0x]!\x18\0\0\0\0hl\xC7\x18\0\0\0\0x?\x01\x1A\0\0\0\0hN\xA7\x1A\0\0\0\0x!\xE1\x1B\0\0\0\0h0\x87\x1C\0\0\0\0x\x03\xC1\x1D\0\0\0\0p\x8Ey\x1E\0\0\0\0\xF8\xAA\x97\x1F\0\0\0\0ppY \0\0\0\0x\xC7\x80!\0\0\0\0\xF0\x8CB\"\0\0\0\0\xF8\xE3i#\0\0\0\0\xF0n\"$\0\0\0\0\xF8\xC5I%\0\0\0\0\xF0\xDB\xEF%\0\0\0\0\xF8\xA7)'\0\0\0\0\xF0\xBD\xCF'\0\0\0\0\xF8\x89\t)\0\0\0\0\xF0\x9F\xAF)\0\0\0\0\xF8k\xE9*\0\0\0\0p\xBC\x98+\0\0\0\0x\x88\xD2,\0\0\0\0p\x9Ex-\0\0\0\0xj\xB2.\0\0\0\0p\x80X/\0\0\0\0xL\x920\0\0\0\0pL]1\0\0\0\0x.r2\0\0\0\0p.=3\0\0\0\0x\x10R4\0\0\0\0p\x10\x1D5\0\0\0\0x\xF216\0\0\0\0p\xF2\xFC6\0\0\0\0\xF8\x0E\x1B8\0\0\0\0p\xD4\xDC8\0\0\0\0x\xE2\xA79\0\0\0\0p\xB6\xBC:\0\0\0\0\xF8\xD2\xDA;\0\0\0\0\xF0\xD2\xA5<\0\0\0\0\xF8\xB4\xBA=\0\0\0\0\xF0\xB4\x85>\0\0\0\0\xF8\x96\x9A?\0\0\0\0\xF0\x96e@\0\0\0\0x\xB3\x83A\0\0\0\0\xF0xEB\0\0\0\0x\x95cC\0\0\0\0p\x95.D\0\0\0\0xwCE\0\0\0\0\xF0<\x05F\0\0\0\0xY#G\0\0\0\0\xF0\x93\xF7G\0\0\0\0\xF8\x8B\xE7H\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04$\x95\0\0\0\0\0\0\xA0\x8C\0\0\0\0\0\0\xA8\x93\0\0\0\0\0\0\xB8\xA1\0\0\0\0\0\0\xB0\x9A\0\0\0\0\0\0AEST\0\xA0\x8C\0\0\0\0\0\0\x01AEDT\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\n\x01\x000*\0\0\0\0\0\0\x02\0\0\0\x01\x04\x01\0 \x1C\0\0\0\0\0\0\xA0\x02\xF4\x02\x18\x85\x16s\xFF\xFF\xFF\xFF\x80\xC2N\x9C\xFF\xFF\xFF\xFF\0/\xBC\x9C\xFF\xFF\xFF\xFF\0\xB3T\xCB\xFF\xFF\xFF\xFF\x80e\xC7\xCB\xFF\xFF\xFF\xFF\x80V\xB7\xCC\xFF\xFF\xFF\xFF\x80G\xA7\xCD\xFF\xFF\xFF\xFF\0s\xA0\xCE\xFF\xFF\xFF\xFF\x80)\x87\xCF\xFF\xFF\xFF\xFF\x809p\x03\0\0\0\0\0\x1C\r\x04\0\0\0\0\x80\x1BP\x05\0\0\0\0\x808\xF6\x05\0\0\0\0\x80\xFD/\x07\0\0\0\0\x80\x1A\xD6\x07\0\0\0\0\x80\xDF\x0F\t\0\0\0\0\x80\xFC\xB5\t\0\0\0\0\x80\xC1\xEF\n\0\0\0\0\0\x19\x9F\x0B\0\0\0\0\0\xDE\xD8\x0C\0\0\0\0\0\xFB~\r\0\0\0\0\0\xC0\xB8\x0E\0\0\0\0\0\xDD^\x0F\0\0\0\0\0\xA2\x98\x10\0\0\0\0\0\xBF>\x11\0\0\0\0\0\x84x\x12\0\0\0\0\0\xA1\x1E\x13\0\0\0\0\0fX\x14\0\0\0\0\0\x83\xFE\x14\0\0\0\0\0H8\x16\0\0\0\0\x80\x9F\xE7\x16\0\0\0\0\x80d!\x18\0\0\0\0\x80\x81\xC7\x18\0\0\0\0\x80F\x01\x1A\0\0\0\0\x80c\xA7\x1A\0\0\0\0\x80(\xE1\x1B\0\0\0\0\x80E\x87\x1C\0\0\0\0\x80\n\xC1\x1D\0\0\0\0\x80\x9Cy\x1E\0\0\0\0\0\xB2\x97\x1F\0\0\0\0\x80~Y \0\0\0\0\0\x94w!\0\0\0\0\0\x9BB\"\0\0\0\0\0\xEBi#\0\0\0\0\0}\"$\0\0\0\0\0\xCDI%\0\0\0\0\0_\x02&\0\0\0\0\0\xAF)'\0\0\0\0\0\xCC\xCF'\0\0\0\0\0\x91\t)\0\0\0\0\0\xAE\xAF)\0\0\0\0\0s\xE9*\0\0\0\0\x80\xCA\x98+\0\0\0\0\x80\x8F\xD2,\0\0\0\0\x80\xACx-\0\0\0\0\x80q\xB2.\0\0\0\0\0>t/\0\0\0\0\x80S\x920\0\0\0\0\x80Z]1\0\0\0\0\x805r2\0\0\0\0\x80<=3\0\0\0\0\x80\x17R4\0\0\0\0\x80\x1E\x1D5\0\0\0\0\x80\xF916\0\0\0\0\x80\0\xFD6\0\0\0\0\0\x16\x1B8\0\0\0\0\x80\xE2\xDC8\0\0\0\0\x80\xE9\xA79\0\0\0\0\x80\xC4\xBC:\0\0\0\0\0\xDA\xDA;\0\0\0\0\0\xE1\xA5<\0\0\0\0\0\xBC\xBA=\0\0\0\0\0\xC3\x85>\0\0\0\0\0\x9E\x9A?\0\0\0\0\0\xA5e@\0\0\0\0\x80\xBA\x83A\0\0\0\0\0\x87EB\0\0\0\0\x80\x9CcC\0\0\0\0\x80\xA3.D\0\0\0\0\x80~CE\0\0\0\0\0K\x05F\0\0\0\0\x80`#G\0\0\0\0\0\xA2\xF7G\0\0\0\0\0\x93\xE7H\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\xE8\x87\0\0\0\0\0\0\xA0\x8C\0\0\0\0\0\0\xB0\x9A\0\0\0\0\0\0AWST\0\x80p\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x80\0\x90\0\xE4\x16\xA6t\xFF\xFF\xFF\xFF\xA0\xDEN\x9C\xFF\xFF\xFF\xFF K\xBC\x9C\xFF\xFF\xFF\xFF \xCFT\xCB\xFF\xFF\xFF\xFF\xA0\x81\xC7\xCB\xFF\xFF\xFF\xFF\xA0r\xB7\xCC\xFF\xFF\xFF\xFF\xA0c\xA7\xCD\xFF\xFF\xFF\xFF\xA0\xFB\x0F\t\0\0\0\0\xA0\x18\xB6\t\0\0\0\0\xA0b\x01\x1A\0\0\0\0\xA0\x7F\xA7\x1A\0\0\0\0\xA0\\%)\0\0\0\0 \xCA\xAF)\0\0\0\0 \xBFqE\0\0\0\0 g\x05F\0\0\0\0\xA0|#G\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x9Cl\0\0\0\0\0\0\x80p\0\0\0\0\0\0\x90~\0\0\0\0\0\0AEST\0\xA0\x8C\0\0\0\0\0\0\x01AEDT\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\n\x01\x000*\0\0\0\0\0\0\x02\0\0\0\x01\x04\x01\0 \x1C\0\0\0\0\0\0\xA0\x02\xF4\x02<\x7F\x16s\xFF\xFF\xFF\xFF\x80\xC2N\x9C\xFF\xFF\xFF\xFF\0/\xBC\x9C\xFF\xFF\xFF\xFF\0\xB3T\xCB\xFF\xFF\xFF\xFF\x80e\xC7\xCB\xFF\xFF\xFF\xFF\x80V\xB7\xCC\xFF\xFF\xFF\xFF\x80G\xA7\xCD\xFF\xFF\xFF\xFF\0s\xA0\xCE\xFF\xFF\xFF\xFF\x80)\x87\xCF\xFF\xFF\xFF\xFF\x809p\x03\0\0\0\0\0\x1C\r\x04\0\0\0\0\x80\x1BP\x05\0\0\0\0\x808\xF6\x05\0\0\0\0\x80\xFD/\x07\0\0\0\0\x80\x1A\xD6\x07\0\0\0\0\x80\xDF\x0F\t\0\0\0\0\x80\xFC\xB5\t\0\0\0\0\x80\xC1\xEF\n\0\0\0\0\0\x19\x9F\x0B\0\0\0\0\0\xDE\xD8\x0C\0\0\0\0\0\xFB~\r\0\0\0\0\0\xC0\xB8\x0E\0\0\0\0\0\xDD^\x0F\0\0\0\0\0\xA2\x98\x10\0\0\0\0\0\xBF>\x11\0\0\0\0\0\x84x\x12\0\0\0\0\0\xA1\x1E\x13\0\0\0\0\0fX\x14\0\0\0\0\0\x83\xFE\x14\0\0\0\0\0H8\x16\0\0\0\0\x80\x89\x0C\x17\0\0\0\0\x80d!\x18\0\0\0\0\x80\x81\xC7\x18\0\0\0\0\x80F\x01\x1A\0\0\0\0\x80c\xA7\x1A\0\0\0\0\x80(\xE1\x1B\0\0\0\0\x80E\x87\x1C\0\0\0\0\x80\n\xC1\x1D\0\0\0\0\x80\x9Cy\x1E\0\0\0\0\0\xB2\x97\x1F\0\0\0\0\x80~Y \0\0\0\0\x80\xCE\x80!\0\0\0\0\0\x9BB\"\0\0\0\0\0\xEBi#\0\0\0\0\0}\"$\0\0\0\0\0\xCDI%\0\0\0\0\0\xEA\xEF%\0\0\0\0\0\xAF)'\0\0\0\0\0\xCC\xCF'\0\0\0\0\0\x91\t)\0\0\0\0\0\xAE\xAF)\0\0\0\0\0s\xE9*\0\0\0\0\x80\xCA\x98+\0\0\0\0\x80\x8F\xD2,\0\0\0\0\x80\xACx-\0\0\0\0\x80q\xB2.\0\0\0\0\x80\x8EX/\0\0\0\0\x80S\x920\0\0\0\0\x80Z]1\0\0\0\0\x805r2\0\0\0\0\x80<=3\0\0\0\0\x80\x17R4\0\0\0\0\x80\x1E\x1D5\0\0\0\0\x80\xF916\0\0\0\0\x80\0\xFD6\0\0\0\0\0\x16\x1B8\0\0\0\0\x80\xE2\xDC8\0\0\0\0\x80\xE9\xA79\0\0\0\0\x80\xC4\xBC:\0\0\0\0\0\xDA\xDA;\0\0\0\0\0\xE1\xA5<\0\0\0\0\0\xBC\xBA=\0\0\0\0\0\xC3\x85>\0\0\0\0\0\x9E\x9A?\0\0\0\0\0\xA5e@\0\0\0\0\x80\xBA\x83A\0\0\0\0\0\x87EB\0\0\0\0\x80\x9CcC\0\0\0\0\x80\xA3.D\0\0\0\0\x80~CE\0\0\0\0\0K\x05F\0\0\0\0\x80`#G\0\0\0\0\0\xA2\xF7G\0\0\0\0\0\x93\xE7H\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\xC4\x8D\0\0\0\0\0\0\xA0\x8C\0\0\0\0\0\0\xB0\x9A\0\0\0\0\0\0GMT\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0-01\0\0\xF0\xF1\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xF0\xF1\xFF\xFF\xFF\xFF\xFF\xFF-10\0\0`s\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`s\xFF\xFF\xFF\xFF\xFF\xFF-11\0\0Pe\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0Pe\xFF\xFF\xFF\xFF\xFF\xFF-12\0\0@W\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0@W\xFF\xFF\xFF\xFF\xFF\xFF-02\0\0\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFF-03\0\0\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xD0\xD5\xFF\xFF\xFF\xFF\xFF\xFF-04\0\0\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xC0\xC7\xFF\xFF\xFF\xFF\xFF\xFF-05\0\0\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF-06\0\0\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF-07\0\0\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFF-08\0\0\x80\x8F\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x80\x8F\xFF\xFF\xFF\xFF\xFF\xFF-09\0\0p\x81\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0p\x81\xFF\xFF\xFF\xFF\xFF\xFF+01\0\0\x10\x0E\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0+10\0\0\xA0\x8C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xA0\x8C\0\0\0\0\0\0+11\0\0\xB0\x9A\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xB0\x9A\0\0\0\0\0\0+12\0\0\xC0\xA8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xC0\xA8\0\0\0\0\0\0+13\0\0\xD0\xB6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xD0\xB6\0\0\0\0\0\0+14\0\0\xE0\xC4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xE0\xC4\0\0\0\0\0\0+02\0\0 \x1C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \x1C\0\0\0\0\0\0+03\0\x000*\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000*\0\0\0\0\0\0+04\0\0@8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0@8\0\0\0\0\0\0+05\0\0PF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0PF\0\0\0\0\0\0+06\0\0`T\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`T\0\0\0\0\0\0+07\0\0pb\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0pb\0\0\0\0\0\0+08\0\0\x80p\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x80p\0\0\0\0\0\0+09\0\0\x90~\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90~\0\0\0\0\0\0UTC\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0CET\0\0\x10\x0E\0\0\0\0\0\0\x01CEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\x000*\0\0\0\0\0\0\xD0\0\xEA\0\x94\xB36~\xFF\xFF\xFF\xFF\0\xDBA\xD4\xFF\xFF\xFF\xFF\x10\xAE\xAC\x1C\0\0\0\0\x10\x9F\x9C\x1D\0\0\0\0\x10\x90\x8C\x1E\0\0\0\0\x10\x81|\x1F\0\0\0\0\x10rl \0\0\0\0\x10c\\!\0\0\0\0\x10TL\"\0\0\0\0\x10E<#\0\0\0\0\x106,$\0\0\0\0\x10'\x1C%\0\0\0\0\x10\x18\x0C&\0\0\0\0\x90C\x05'\0\0\0\0\x904\xF5'\0\0\0\0\x90%\xE5(\0\0\0\0\x90\x16\xD5)\0\0\0\0\x90\x07\xC5*\0\0\0\0\x90\xF8\xB4+\0\0\0\0\x90\xE9\xA4,\0\0\0\0\x90\xDA\x94-\0\0\0\0\x90\xCB\x84.\0\0\0\0\x90\xBCt/\0\0\0\0\x90\xADd0\0\0\0\0\x10\xD9]1\0\0\0\0\x10\xB4r2\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02l\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0 \x1C\0\0\0\0\0\0+04\0\0@8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\x02l\x02tE\x18\xAA\xFF\xFF\xFF\xFFP\x0B\xA4\xB5\xFF\xFF\xFF\xFF\xC0\x99'\x15\0\0\0\x000\xCE\x18\x16\0\0\0\0@\xCD\x08\x17\0\0\0\0\xB0\x01\xFA\x17\0\0\0\0\xC0\0\xEA\x18\0\0\0\x0005\xDB\x19\0\0\0\0\xC0\x85\xCC\x1A\0\0\0\0\xE0\x92\xBC\x1B\0\0\0\0\xE0\x83\xAC\x1C\0\0\0\0\xE0t\x9C\x1D\0\0\0\0\xE0e\x8C\x1E\0\0\0\0\xE0V|\x1F\0\0\0\0\xE0Gl \0\0\0\0\xE08\\!\0\0\0\0\xE0)L\"\0\0\0\0\xE0\x1A<#\0\0\0\0\xE0\x0B,$\0\0\0\0\xF0\x19,$\0\0\0\0\xF0\n\x1C%\0\0\0\0\xF0\xFB\x0B&\0\0\0\0p'\x05'\0\0\0\0p\x18\xF5'\0\0\0\0`\xEC\xD4)\0\0\0\0p\xFA\xD4)\0\0\0\0p\xEB\xC4*\0\0\0\0p\xDC\xB4+\0\0\0\0p\xCD\xA4,\0\0\0\0p\xBE\x94-\0\0\0\0p\xAF\x84.\0\0\0\0p\xA0t/\0\0\0\0p\x91d0\0\0\0\0\xF0\xBC]1\0\0\0\0\xF0\x97r2\0\0\0\0\xF0\x9E=3\0\0\0\0\xF0yR4\0\0\0\0\xF0\x80\x1D5\0\0\0\0\xF0[26\0\0\0\0\xF0b\xFD6\0\0\0\0px\x1B8\0\0\0\0\xF0D\xDD8\0\0\0\0pZ\xFB9\0\0\0\0\xF0&\xBD:\0\0\0\0p<\xDB;\0\0\0\0pC\xA6<\0\0\0\0p\x1E\xBB=\0\0\0\0p%\x86>\0\0\0\0p\0\x9B?\0\0\0\0p\x07f@\0\0\0\0\xF0\x1C\x84A\0\0\0\0p\xE9EB\0\0\0\0\xF0\xFEcC\0\0\0\0p\xCB%D\0\0\0\0\xF0\xE0CE\0\0\0\0p\xAD\x05F\0\0\0\0\xF0\xC2#G\0\0\0\0\xF0\xC9\xEEG\0\0\0\0\xF0\xA4\x03I\0\0\0\0\xF0\xAB\xCEI\0\0\0\0\xF0\x86\xE3J\0\0\0\0\xF0\x8D\xAEK\0\0\0\0p\xA3\xCCL\0\0\0\0\xF0o\x8EM\0\0\0\0`\x1DLT\0\0\0\0p\x14\xF7V\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x02\x04\x02\x04\x01\x02\x04\x01\x02\x04\x02\x04\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x0C-\0\0\0\0\0\x000*\0\0\0\0\0\0@8\0\0\0\0\0\0PF\0\0\0\0\0\0@8\0\0\0\0\0\0EET\0\0 \x1C\0\0\0\0\0\0\x01EEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\x000*\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\0@8\0\0\0\0\0\0\xC0\x01\x12\x02D\x98?t\xFF\xFF\xFF\xFF\x80!\x80\x9B\xFF\xFF\xFF\xFF\xE0\xE9|\xB9\xFF\xFF\xFF\xFF\xD0\xAF\xC6\xB9\xFF\xFF\xFF\xFF\xE0c\xF2\xC9\xFF\xFF\xFF\xFFP\xA8\x10\xCA\xFF\xFF\xFF\xFF\x10K\xE7\xCC\xFF\xFF\xFF\xFF\xF0L\xAA\xCD\xFF\xFF\xFF\xFF\xE0\x18\xA2\xCE\xFF\xFF\xFF\xFFpi\x93\xCF\xFF\xFF\xFF\xFF`\x9E\x13\xDF\xFF\xFF\xFF\xFFP\n\xB7\xDF\xFF\xFF\xFF\xFF`^\xEC\t\0\0\0\0`\xF4\x18\x0B\0\0\0\0\0\xAE\xCD\x0B\0\0\0\0\0\x9F\xBD\x0C\0\0\0\0\x80U\xA4\r\0\0\0\0\x80]\x8C\x0E\0\0\0\0\x807\x84\x0F\0\0\0\0\x10\xFCj\x10\0\0\0\0\xF0{d\x11\0\0\0\0\xF0\xAAR\x12\0\0\0\0`\x82F\x13\0\0\0\0P\xC23\x14\0\0\0\0\xE0\x0E\xB1\x14\0\0\0\0\x90\xDC\x13\x16\0\0\0\0\x90\xCD\x03\x17\0\0\0\0\x90\xBE\xF3\x17\0\0\0\0\x90\xAF\xE3\x18\0\0\0\0\x90\xA0\xD3\x19\0\0\0\0\x90\x91\xC3\x1A\0\0\0\0\x10\xBD\xBC\x1B\0\0\0\0\x10\xAE\xAC\x1C\0\0\0\0\x10\x9F\x9C\x1D\0\0\0\0\x10\x90\x8C\x1E\0\0\0\0\x10\x81|\x1F\0\0\0\0\x10rl \0\0\0\0\x10c\\!\0\0\0\0\x10TL\"\0\0\0\0\x10E<#\0\0\0\0\x106,$\0\0\0\0\x10'\x1C%\0\0\0\0\x10\x18\x0C&\0\0\0\0\x90C\x05'\0\0\0\0\x904\xF5'\0\0\0\0\x90%\xE5(\0\0\0\0\x90\x16\xD5)\0\0\0\0\x90\x07\xC5*\0\0\0\0\x90\xF8\xB4+\0\0\0\0\x90\xE9\xA4,\0\0\0\0\x90\xDA\x94-\0\0\0\0\x90\xCB\x84.\0\0\0\0\x90\xBCt/\0\0\0\0\x90\xADd0\0\0\0\0\x10\xD9]1\0\0\0\0\x10\xB4r2\0\0\0\0\0\x01\x02\x01\x02\x01\x03\x04\x01\x03\x04\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03\x02\x01\x03<\x16\0\0\0\0\0\0 \x1C\0\0\0\0\0\x000*\0\0\0\0\0\0 \x1C\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0CET\0\0\x10\x0E\0\0\0\0\0\0\x01CEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\x000*\0\0\0\0\0\0(\x01M\x01H\xF0<^\xFF\xFF\xFF\xFF\xE05\x02\xCA\xFF\xFF\xFF\xFF\x10K\xE7\xCC\xFF\xFF\xFF\xFF\x90\x17\xA9\xCD\xFF\xFF\xFF\xFF\x10C\xA2\xCE\xFF\xFF\xFF\xFF\x104\x92\xCF\xFF\xFF\xFF\xFF\x10%\x82\xD0\xFF\xFF\xFF\xFF\x10\x8C\xA1\xD1\xFF\xFF\xFF\xFF\x90@N\xD2\xFF\xFF\xFF\xFF\x90\xAF\xE3\x18\0\0\0\0\x90\xA0\xD3\x19\0\0\0\0\x90\x91\xC3\x1A\0\0\0\0\x10\xBD\xBC\x1B\0\0\0\0\x10\xAE\xAC\x1C\0\0\0\0\x10\x9F\x9C\x1D\0\0\0\0\x10\x90\x8C\x1E\0\0\0\0\x10\x81|\x1F\0\0\0\0\x10rl \0\0\0\0\x10c\\!\0\0\0\0\x10TL\"\0\0\0\0\x10E<#\0\0\0\0\x106,$\0\0\0\0\x10'\x1C%\0\0\0\0\x10\x18\x0C&\0\0\0\0\x90C\x05'\0\0\0\0\x904\xF5'\0\0\0\0\x90%\xE5(\0\0\0\0\x90\x16\xD5)\0\0\0\0\x90\x07\xC5*\0\0\0\0\x90\xF8\xB4+\0\0\0\0\x90\xE9\xA4,\0\0\0\0\x90\xDA\x94-\0\0\0\0\x90\xCB\x84.\0\0\0\0\x90\xBCt/\0\0\0\0\x90\xADd0\0\0\0\0\x10\xD9]1\0\0\0\0\x10\xB4r2\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x018\x13\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0 \x1C\0\0\0\0\0\0CET\0\0\x10\x0E\0\0\0\0\0\0\x01CEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\x000*\0\0\0\0\0\0\xE8\x01%\x02\xF8a\xA2o\xFF\xFF\xFF\xFF`\x17\x0C\x9B\xFF\xFF\xFF\xFF\xF0\xDA\xD5\x9B\xFF\xFF\xFF\xFF\x90\xAE\xD9\x9C\xFF\xFF\xFF\xFF\x90\xB5\xA4\x9D\xFF\xFF\xFF\xFF\x90\x90\xB9\x9E\xFF\xFF\xFF\xFF\x90\x97\x84\x9F\xFF\xFF\xFF\xFF\x90q\t\xC8\xFF\xFF\xFF\xFF\x10K\xE7\xCC\xFF\xFF\xFF\xFF\x90\x17\xA9\xCD\xFF\xFF\xFF\xFF\x10C\xA2\xCE\xFF\xFF\xFF\xFF\x104\x92\xCF\xFF\xFF\xFF\xFF\x10%\x82\xD0\xFF\xFF\xFF\xFF\x10\x16r\xD1\xFF\xFF\xFF\xFF\0\x96\xB6\xD1\xFF\xFF\xFF\xFF\x80\xBEX\xD2\xFF\xFF\xFF\xFF\x10O\xA1\xD2\xFF\xFF\xFF\xFF\x90\x1Bc\xD3\xFF\xFF\xFF\xFF\x90#K\xD4\xFF\xFF\xFF\xFF \xD19\xD5\xFF\xFF\xFF\xFF\x90\xE7g\xD5\xFF\xFF\xFF\xFF\0s\xA8\xD5\xFF\xFF\xFF\xFF\x10\xB4)\xD6\xFF\xFF\xFF\xFF\x10\x1A,\xD7\xFF\xFF\xFF\xFF\x10\x96\t\xD8\xFF\xFF\xFF\xFF\x90\xC1\x02\xD9\xFF\xFF\xFF\xFF\x10x\xE9\xD9\xFF\xFF\xFF\xFF\x10DM\x13\0\0\0\0\x90\xFA3\x14\0\0\0\0\x90\xEB#\x15\0\0\0\0\x90\xDC\x13\x16\0\0\0\0\x90\xCD\x03\x17\0\0\0\0\x90\xBE\xF3\x17\0\0\0\0\x90\xAF\xE3\x18\0\0\0\0\x90\xA0\xD3\x19\0\0\0\0\x90\x91\xC3\x1A\0\0\0\0\x10\xBD\xBC\x1B\0\0\0\0\x10\xAE\xAC\x1C\0\0\0\0\x10\x9F\x9C\x1D\0\0\0\0\x10\x90\x8C\x1E\0\0\0\0\x10\x81|\x1F\0\0\0\0\x10rl \0\0\0\0\x10c\\!\0\0\0\0\x10TL\"\0\0\0\0\x10E<#\0\0\0\0\x106,$\0\0\0\0\x10'\x1C%\0\0\0\0\x10\x18\x0C&\0\0\0\0\x90C\x05'\0\0\0\0\x904\xF5'\0\0\0\0\x90%\xE5(\0\0\0\0\x90\x16\xD5)\0\0\0\0\x90\x07\xC5*\0\0\0\0\x90\xF8\xB4+\0\0\0\0\x90\xE9\xA4,\0\0\0\0\x90\xDA\x94-\0\0\0\0\x90\xCB\x84.\0\0\0\0\x90\xBCt/\0\0\0\0\x90\xADd0\0\0\0\0\x10\xD9]1\0\0\0\0\x10\xB4r2\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x02\x01\x02\x01\x02\x03\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x88\x0C\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0 \x1C\0\0\0\0\0\x000*\0\0\0\0\0\0CET\0\0\x10\x0E\0\0\0\0\0\0\x01CEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\x000*\0\0\0\0\0\08\x03\xCE\x03\xE6\xDF\xB6V\xFF\xFF\xFF\xFF\0\xC8\xE8m\xFF\xFF\xFF\xFF\x80ID\x98\xFF\xFF\xFF\xFFp%\x0C\x9B\xFF\xFF\xFF\xFF\xF0\xDA\xD5\x9B\xFF\xFF\xFF\xFF\x90\xAE\xD9\x9C\xFF\xFF\xFF\xFF\x90\xB5\xA4\x9D\xFF\xFF\xFF\xFF\x90\x90\xB9\x9E\xFF\xFF\xFF\xFF\x90\x97\x84\x9F\xFF\xFF\xFF\xFF0\xF8\xCE\x9F\xFF\xFF\xFF\xFF\xF0\xA5`\xA0\xFF\xFF\xFF\xFFp\xBB~\xA1\xFF\xFF\xFF\xFF\xF0\x12.\xA2\xFF\xFF\xFF\xFF\xF0Lz\xA3\xFF\xFF\xFF\xFF\xF0\x815\xA4\xFF\xFF\xFF\xFFp#^\xA5\xFF\xFF\xFF\xFF\xF05%\xA6\xFF\xFF\xFF\xFF\xF0\x9B'\xA7\xFF\xFF\xFF\xFF\xF0\x01*\xA8\xFF\xFF\xFF\xFF\xF0}\x07\xA9\xFF\xFF\xFF\xFFp4\xEE\xA9\xFF\xFF\xFF\xFF\xF0_\xE7\xAA\xFF\xFF\xFF\xFF\xF0P\xD7\xAB\xFF\xFF\xFF\xFF\xF0A\xC7\xAC\xFF\xFF\xFF\xFF\xF0\xA7\xC9\xAD\xFF\xFF\xFF\xFF\xF0#\xA7\xAE\xFF\xFF\xFF\xFFpO\xA0\xAF\xFF\xFF\xFF\xFF\xF0\x05\x87\xB0\xFF\xFF\xFF\xFF\xF0k\x89\xB1\xFF\xFF\xFF\xFF\xA0Lp\xB2\xFF\xFF\xFF\xFF\xA0\xB2r\xB3\xFF\xFF\xFF\xFF\xA0.P\xB4\xFF\xFF\xFF\xFF ZI\xB5\xFF\xFF\xFF\xFF\xA0\x100\xB6\xFF\xFF\xFF\xFF\xA0v2\xB7\xFF\xFF\xFF\xFF\xA0\xF2\x0F\xB8\xFF\xFF\xFF\xFF\xA0\xE3\xFF\xB8\xFF\xFF\xFF\xFF\xA0\xD4\xEF\xB9\xFF\xFF\xFF\xFF \x8B\xD6\xBA\xFF\xFF\xFF\xFF \xF1\xD8\xBB\xFF\xFF\xFF\xFF \xE2\xC8\xBC\xFF\xFF\xFF\xFF \xD3\xB8\xBD\xFF\xFF\xFF\xFF\xA0\x89\x9F\xBE\xFF\xFF\xFF\xFF \xB5\x98\xBF\xFF\xFF\xFF\xFF \x1B\x9B\xC0\xFF\xFF\xFF\xFF \x97x\xC1\xFF\xFF\xFF\xFF \x88h\xC2\xFF\xFF\xFF\xFF yX\xC3\xFF\xFF\xFF\xFF\xA0/?\xC4\xFF\xFF\xFF\xFF [8\xC5\xFF\xFF\xFF\xFF \xC1:\xC6\xFF\xFF\xFF\xFF\xA0\xD6X\xC7\xFF\xFF\xFF\xFF\xA0\t\xDA\xC7\xFF\xFF\xFF\xFF \x19J\xC8\xFF\xFF\xFF\xFF\x10K\xE7\xCC\xFF\xFF\xFF\xFF\x90\x17\xA9\xCD\xFF\xFF\xFF\xFF\x10C\xA2\xCE\xFF\xFF\xFF\xFF\x104\x92\xCF\xFF\xFF\xFF\xFF\x90^n\xD0\xFF\xFF\xFF\xFF\x10\x16r\xD1\xFF\xFF\xFF\xFF\x90@N\xD2\xFF\xFF\xFF\xFF\x10@\x91\xD3\xFF\xFF\xFF\xFF\x90#K\xD4\xFF\xFF\xFF\xFF\x90c\xA4\r\0\0\0\0\x10\x1A\x8B\x0E\0\0\0\0\x90E\x84\x0F\0\0\0\0\x906t\x10\0\0\0\0\x90'd\x11\0\0\0\0\x90\x18T\x12\0\0\0\0\x10DM\x13\0\0\0\0\x90\xFA3\x14\0\0\0\0\x90\xEB#\x15\0\0\0\0\x90\xDC\x13\x16\0\0\0\0\x90\xCD\x03\x17\0\0\0\0\x90\xBE\xF3\x17\0\0\0\0\x90\xAF\xE3\x18\0\0\0\0\x90\xA0\xD3\x19\0\0\0\0\x90\x91\xC3\x1A\0\0\0\0\x10\xBD\xBC\x1B\0\0\0\0\x10\xAE\xAC\x1C\0\0\0\0\x10\x9F\x9C\x1D\0\0\0\0\x10\x90\x8C\x1E\0\0\0\0\x10\x81|\x1F\0\0\0\0\x10rl \0\0\0\0\x10c\\!\0\0\0\0\x10TL\"\0\0\0\0\x10E<#\0\0\0\0\x106,$\0\0\0\0\x10'\x1C%\0\0\0\0\x10\x18\x0C&\0\0\0\0\x90C\x05'\0\0\0\0\x904\xF5'\0\0\0\0\x90%\xE5(\0\0\0\0\x90\x16\xD5)\0\0\0\0\x90\x07\xC5*\0\0\0\0\x90\xF8\xB4+\0\0\0\0\x90\xE9\xA4,\0\0\0\0\x90\xDA\x94-\0\0\0\0\x90\xCB\x84.\0\0\0\0\x90\xBCt/\0\0\0\0\x90\xADd0\0\0\0\0\x10\xD9]1\0\0\0\0\x10\xB4r2\0\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x1A\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0 \x1C\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0EET\0\0 \x1C\0\0\0\0\0\0\x01EEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\x000*\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\0@8\0\0\0\0\0\0\xB0\x01\xE6\x01\x08\xE0\xCFl\xFF\xFF\xFF\xFF\x08\xD2\xB0\xB7\xFF\xFF\xFF\xFF`\xF3>\xB9\xFF\xFF\xFF\xFF`\x9C\xEF\xB9\xFF\xFF\xFF\xFF`\x8D\xDF\xBA\xFF\xFF\xFF\xFF`~\xCF\xBB\xFF\xFF\xFF\xFF\xE0\xA9\xC8\xBC\xFF\xFF\xFF\xFF\xE0\x9A\xB8\xBD\xFF\xFF\xFF\xFF\xE0\x8B\xA8\xBE\xFF\xFF\xFF\xFF\xE0|\x98\xBF\xFF\xFF\xFF\xFF\xE0m\x88\xC0\xFF\xFF\xFF\xFF\xE0^x\xC1\xFF\xFF\xFF\xFF\xE0Oh\xC2\xFF\xFF\xFF\xFF\xE0@X\xC3\xFF\xFF\xFF\xFF\xE01H\xC4\xFF\xFF\xFF\xFF\xE0\"8\xC5\xFF\xFF\xFF\xFF\xE0\x13(\xC6\xFF\xFF\xFF\xFF\xE0\x04\x18\xC7\xFF\xFF\xFF\xFF`\xD1\xAD\x11\0\0\0\0P\xE0S\x12\0\0\0\0\xD0\x0BM\x13\0\0\0\0`\xD03\x14\0\0\0\0\x80\xDD#\x15\0\0\0\0\x80\xCE\x13\x16\0\0\0\0\x80\xBF\x03\x17\0\0\0\0\x80\xB0\xF3\x17\0\0\0\0\x80\xA1\xE3\x18\0\0\0\0\x80\x92\xD3\x19\0\0\0\0\x80\x83\xC3\x1A\0\0\0\0\0\xAF\xBC\x1B\0\0\0\0\0\xA0\xAC\x1C\0\0\0\0\0\x91\x9C\x1D\0\0\0\0\0\x82\x8C\x1E\0\0\0\0\0s|\x1F\0\0\0\0\0dl \0\0\0\0\0U\\!\0\0\0\0\0FL\"\0\0\0\0\x007<#\0\0\0\0\0(,$\0\0\0\0\0\x19\x1C%\0\0\0\0\0\n\x0C&\0\0\0\0\x805\x05'\0\0\0\0`\n\xF5'\0\0\0\0`\xFB\xE4(\0\0\0\0`\xEC\xD4)\0\0\0\0`\xDD\xC4*\0\0\0\0`\xCE\xB4+\0\0\0\0`\xBF\xA4,\0\0\0\0\xE0\xA0$-\0\0\0\0P\x93\x84.\0\0\0\0`\x92t/\0\0\0\0Pud0\0\0\0\0\xE0\xAE]1\0\0\0\0\xD0{r2\0\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01x\x18\0\0\0\0\0\0 \x1C\0\0\0\0\0\x000*\0\0\0\0\0\0CET\0\0\x10\x0E\0\0\0\0\0\0\x01CEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\x000*\0\0\0\0\0\0(\x02m\x02\x9C\x91\x17k\xFF\xFF\xFF\xFF`\x17\x0C\x9B\xFF\xFF\xFF\xFF\xF0\xDA\xD5\x9B\xFF\xFF\xFF\xFF\x90\xAE\xD9\x9C\xFF\xFF\xFF\xFF\x90\xB5\xA4\x9D\xFF\xFF\xFF\xFF\x90\x90\xB9\x9E\xFF\xFF\xFF\xFF\x90\x97\x84\x9F\xFF\xFF\xFF\xFF\x10\xC4\x9A\xA0\xFF\xFF\xFF\xFF\x90yd\xA1\xFF\xFF\xFF\xFF\x10\x1Ap\xA2\xFF\xFF\xFF\xFF\x10\x96M\xA3\xFF\xFF\xFF\xFF`\xB5\xF3\xC9\xFF\xFF\xFF\xFF\x10K\xE7\xCC\xFF\xFF\xFF\xFF\x90\x17\xA9\xCD\xFF\xFF\xFF\xFF\x10C\xA2\xCE\xFF\xFF\xFF\xFF\x104\x92\xCF\xFF\xFF\xFF\xFF\x10%\x82\xD0\xFF\xFF\xFF\xFF\xE0x\x99\xD1\xFF\xFF\xFF\xFFp\xC9\x8A\xD2\xFF\xFF\xFF\xFF\x90\xA6P\xD3\xFF\xFF\xFF\xFF\x80\x15K\xD4\xFF\xFF\xFF\xFF\x10\xC39\xD5\xFF\xFF\xFF\xFF\x10\xB4)\xD6\xFF\xFF\xFF\xFF\x10\xA5\x19\xD7\xFF\xFF\xFF\xFF\x10\x96\t\xD8\xFF\xFF\xFF\xFF\x90\xC1\x02\xD9\xFF\xFF\xFF\xFF\x10x\xE9\xD9\xFF\xFF\xFF\xFF\xF0\xA8\xA2\xE2\xFF\xFF\xFF\xFF`\xF2Q\xE3\xFF\xFF\xFF\xFF\x10\xA7\x82\xE4\xFF\xFF\xFF\xFF\x90\xFE1\xE5\xFF\xFF\xFF\xFF\x10\xFEt\xE6\xFF\xFF\xFF\xFF\x90\xE0\x11\xE7\xFF\xFF\xFF\xFF\x10\xE0T\xE8\xFF\xFF\xFF\xFF\x90\xC2\xF1\xE8\xFF\xFF\xFF\xFF\xF0'M\x13\0\0\0\0p\xDE3\x14\0\0\0\0p\xCF#\x15\0\0\0\0p\xC0\x13\x16\0\0\0\0p\xB1\x03\x17\0\0\0\0p\xA2\xF3\x17\0\0\0\0p\x93\xE3\x18\0\0\0\0p\x84\xD3\x19\0\0\0\0p\xB7T\x1A\0\0\0\0\x10\xBD\xBC\x1B\0\0\0\0\x10\xAE\xAC\x1C\0\0\0\0\x10\x9F\x9C\x1D\0\0\0\0\x10\x90\x8C\x1E\0\0\0\0\x10\x81|\x1F\0\0\0\0\x10rl \0\0\0\0\x10c\\!\0\0\0\0\x10TL\"\0\0\0\0\x10E<#\0\0\0\0\x106,$\0\0\0\0\x10'\x1C%\0\0\0\0\x10\x18\x0C&\0\0\0\0\x90C\x05'\0\0\0\0\x904\xF5'\0\0\0\0\x90%\xE5(\0\0\0\0\x90\x16\xD5)\0\0\0\0\x90\x07\xC5*\0\0\0\0\x90\xF8\xB4+\0\0\0\0\x90\xE9\xA4,\0\0\0\0\x90\xDA\x94-\0\0\0\0\x90\xCB\x84.\0\0\0\0\x90\xBCt/\0\0\0\0\x90\xADd0\0\0\0\0\x10\xD9]1\0\0\0\0\x10\xB4r2\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xE4\x11\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0 \x1C\0\0\0\0\0\0EET\0\0 \x1C\0\0\0\0\0\0\x01EEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\x000*\0\0\0\0\0\0\xE8\x01B\x02\xF8\xC8\xB6V\xFF\xFF\xFF\xFF\x0C\x9Fk\x9E\xFF\xFF\xFF\xFF\x08\xD2\xB0\xB7\xFF\xFF\xFF\xFF`\xF3>\xB9\xFF\xFF\xFF\xFF`\x9C\xEF\xB9\xFF\xFF\xFF\xFF`\x8D\xDF\xBA\xFF\xFF\xFF\xFF`~\xCF\xBB\xFF\xFF\xFF\xFF\xE0\xA9\xC8\xBC\xFF\xFF\xFF\xFF\xE0\x9A\xB8\xBD\xFF\xFF\xFF\xFF\xE0\x8B\xA8\xBE\xFF\xFF\xFF\xFF\xE0|\x98\xBF\xFF\xFF\xFF\xFF\xE0m\x88\xC0\xFF\xFF\xFF\xFF\xE0^x\xC1\xFF\xFF\xFF\xFF\xE0Oh\xC2\xFF\xFF\xFF\xFF\xE0@X\xC3\xFF\xFF\xFF\xFF\xE01H\xC4\xFF\xFF\xFF\xFF\xE0\"8\xC5\xFF\xFF\xFF\xFF\xE0\x13(\xC6\xFF\xFF\xFF\xFF\xE0\x04\x18\xC7\xFF\xFF\xFF\xFF`\x93\xBC\xC8\xFF\xFF\xFF\xFFP}w\xCA\xFF\xFF\xFF\xFF\x10K\xE7\xCC\xFF\xFF\xFF\xFF\x90\x17\xA9\xCD\xFF\xFF\xFF\xFF\x10C\xA2\xCE\xFF\xFF\xFF\xFF\x104\x92\xCF\xFF\xFF\xFF\xFF`\x90N\xD0\xFF\xFF\xFF\xFF\xD0\xA7'\x15\0\0\0\0@\xDC\x18\x16\0\0\0\0P\xDB\x08\x17\0\0\0\0\xC0\x0F\xFA\x17\0\0\0\0\xD0\x0E\xEA\x18\0\0\0\0@C\xDB\x19\0\0\0\0\xD0\x93\xCC\x1A\0\0\0\0\xF0\xA0\xBC\x1B\0\0\0\0\xF0\x91\xAC\x1C\0\0\0\0\xF0\x82\x9C\x1D\0\0\0\0\xF0s\x8C\x1E\0\0\0\0\xF0d|\x1F\0\0\0\0\xF0Ul \0\0\0\0\xF0F\\!\0\0\0\0\xF07L\"\0\0\0\0\xF0(<#\0\0\0\0\xF0\x19,$\0\0\0\0\xF0\n\x1C%\0\0\0\0\xF0\xFB\x0B&\0\0\0\0\xE0LC&\0\0\0\0\x805\x05'\0\0\0\0\x80&\xF5'\0\0\0\0\x80\x17\xE5(\0\0\0\0`\xE8`)\0\0\0\0P\xCF\xC4*\0\0\0\0`\xCE\xB4+\0\0\0\0P\xB1\xA4,\0\0\0\0`\xB0\x94-\0\0\0\0P\x93\x84.\0\0\0\0`\x92t/\0\0\0\0Pud0\0\0\0\0\xE0\xAE]1\0\0\0\0\xD0{r2\0\0\0\0\0\xAD=3\0\0\0\0\0\x88R4\0\0\0\0\x01\x02\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x05\x06\x03\x05\x06\x03\x05\x04\x07\x08\x04\x07\x08\x04\x07\x08\x04\x07\x08\x04\x07\x08\x04\x07\x08\x04\x07\x08\x04\x07\x08\x04\x07\x08\x04\x07\x08\x04\x07\x03\x05\x04\x07\x03\x05\x04\x07\x03\x05\x04\x07\x03\x05\x04\x07\x03\x05\x04\x07\x03\x05\x04\x07\x03\x05\x04\x07\x03\x05\x08\x1B\0\0\0\0\0\0\xF4\x1A\0\0\0\0\0\0x\x18\0\0\0\0\0\0 \x1C\0\0\0\0\0\x000*\0\0\0\0\0\0 \x1C\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\x000*\0\0\0\0\0\0@8\0\0\0\0\0\0GMT\0\0\0\0\0\0\0\0\0\0\x01IST\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\0 \x1C\0\0\0\0\0\0\x90\x04<\x05\xF1\n\xD1W\xFF\xFF\xFF\xFF\x91\xB3&\x9B\xFF\xFF\xFF\xFF\x11\x0B\xD6\x9B\xFF\xFF\xFF\xFF\xA00\xCF\x9C\xFF\xFF\xFF\xFF\xA0\xC3\xA4\x9D\xFF\xFF\xFF\xFF\xA0\x9D\x9C\x9E\xFF\xFF\xFF\xFF\xA0\x1A\x97\x9F\xFF\xFF\xFF\xFF \xBA\x85\xA0\xFF\xFF\xFF\xFF\xA0\xFCv\xA1\xFF\xFF\xFF\xFF \x9Ce\xA2\xFF\xFF\xFF\xFF\xA0\xC8{\xA3\xFF\xFF\xFF\xFF\xA0\xB8N\xA4\xFF\xFF\xFF\xFF \xFB?\xA5\xFF\xFF\xFF\xFF `%\xA6\xFF\xFF\xFF\xFF \xC6'\xA7\xFF\xFF\xFF\xFF ,*\xA8\xFF\xFF\xFF\xFF\xA0\xF8\xEB\xA8\xFF\xFF\xFF\xFF\xA0\xD3\0\xAA\xFF\xFF\xFF\xFF \x15\xD5\xAA\xFF\xFF\xFF\xFF \xF0\xE9\xAB\xFF\xFF\xFF\xFF l\xC7\xAC\xFF\xFF\xFF\xFF \xD2\xC9\xAD\xFF\xFF\xFF\xFF N\xA7\xAE\xFF\xFF\xFF\xFF\xA0y\xA0\xAF\xFF\xFF\xFF\xFF 0\x87\xB0\xFF\xFF\xFF\xFF\xA0\xD0\x92\xB1\xFF\xFF\xFF\xFF\xA0Lp\xB2\xFF\xFF\xFF\xFF\xA0\xB2r\xB3\xFF\xFF\xFF\xFF\xA0.P\xB4\xFF\xFF\xFF\xFF ZI\xB5\xFF\xFF\xFF\xFF\xA0\x100\xB6\xFF\xFF\xFF\xFF\xA0v2\xB7\xFF\xFF\xFF\xFF\xA0\xF2\x0F\xB8\xFF\xFF\xFF\xFF\xA0X\x12\xB9\xFF\xFF\xFF\xFF\xA0\xD4\xEF\xB9\xFF\xFF\xFF\xFF \0\xE9\xBA\xFF\xFF\xFF\xFF \xF1\xD8\xBB\xFF\xFF\xFF\xFF W\xDB\xBC\xFF\xFF\xFF\xFF \xD3\xB8\xBD\xFF\xFF\xFF\xFF\xA0\xFE\xB1\xBE\xFF\xFF\xFF\xFF \xB5\x98\xBF\xFF\xFF\xFF\xFF \x1B\x9B\xC0\xFF\xFF\xFF\xFF \x97x\xC1\xFF\xFF\xFF\xFF \xFDz\xC2\xFF\xFF\xFF\xFF yX\xC3\xFF\xFF\xFF\xFF\xA0\xA4Q\xC4\xFF\xFF\xFF\xFF [8\xC5\xFF\xFF\xFF\xFF \xC1:\xC6\xFF\xFF\xFF\xFF\xA0\xD6X\xC7\xFF\xFF\xFF\xFF\xA0\t\xDA\xC7\xFF\xFF\xFF\xFF \xE0I\xD4\xFF\xFF\xFF\xFF\xA0!\x1E\xD5\xFF\xFF\xFF\xFF \xACN\xD6\xFF\xFF\xFF\xFF (,\xD7\xFF\xFF\xFF\xFF \x8E.\xD8\xFF\xFF\xFF\xFF \x95\xF9\xD8\xFF\xFF\xFF\xFF p\x0E\xDA\xFF\xFF\xFF\xFF \xEC\xEB\xDA\xFF\xFF\xFF\xFF\xA0\x17\xE5\xDB\xFF\xFF\xFF\xFF \xCE\xCB\xDC\xFF\xFF\xFF\xFF\xA0\xF9\xC4\xDD\xFF\xFF\xFF\xFF\xA0\xEA\xB4\xDE\xFF\xFF\xFF\xFF \x16\xAE\xDF\xFF\xFF\xFF\xFF\xA0\xCC\x94\xE0\xFF\xFF\xFF\xFF\xA0Hr\xE1\xFF\xFF\xFF\xFF tk\xE2\xFF\xFF\xFF\xFF\xA0*R\xE3\xFF\xFF\xFF\xFF\xA0\x90T\xE4\xFF\xFF\xFF\xFF\xA0\x0C2\xE5\xFF\xFF\xFF\xFF \xAD=\xE6\xFF\xFF\xFF\xFF )\x1B\xE7\xFF\xFF\xFF\xFF\xA0T\x14\xE8\xFF\xFF\xFF\xFF \x0B\xFB\xE8\xFF\xFF\xFF\xFF q\xFD\xE9\xFF\xFF\xFF\xFF \xED\xDA\xEA\xFF\xFF\xFF\xFF S\xDD\xEB\xFF\xFF\xFF\xFF \xCF\xBA\xEC\xFF\xFF\xFF\xFF\xA0\xFA\xB3\xED\xFF\xFF\xFF\xFF \xB1\x9A\xEE\xFF\xFF\xFF\xFF\xA0g\x81\xEF\xFF\xFF\xFF\xFF }\x9F\xF0\xFF\xFF\xFF\xFF\xA0Ia\xF1\xFF\xFF\xFF\xFF _\x7F\xF2\xFF\xFF\xFF\xFF fJ\xF3\xFF\xFF\xFF\xFF A_\xF4\xFF\xFF\xFF\xFF\xA0\r!\xF5\xFF\xFF\xFF\xFF #?\xF6\xFF\xFF\xFF\xFF\xA0\xEF\0\xF7\xFF\xFF\xFF\xFF \x05\x1F\xF8\xFF\xFF\xFF\xFF\xA0\xD1\xE0\xF8\xFF\xFF\xFF\xFF \xE7\xFE\xF9\xFF\xFF\xFF\xFF\xA0\xB3\xC0\xFA\xFF\xFF\xFF\xFF\xA0\x03\xE8\xFB\xFF\xFF\xFF\xFF\xA0\xAB{\xFC\xFF\xFF\xFF\xFFp\xBB\xC7\xFD\xFF\xFF\xFF\xFF \xC6p\x03\0\0\0\0 X)\x04\0\0\0\0 \xA8P\x05\0\0\0\0 :\t\x06\0\0\0\0 \x8A0\x07\0\0\0\0 \x1C\xE9\x07\0\0\0\0 l\x10\t\0\0\0\0 \xFE\xC8\t\0\0\0\0 N\xF0\n\0\0\0\0\xA0\x1A\xB2\x0B\0\0\0\0 0\xD0\x0C\0\0\0\0\xA0\xFC\x91\r\0\0\0\0 \x12\xB0\x0E\0\0\0\0\xA0\xDEq\x0F\0\0\0\0\xA0.\x99\x10\0\0\0\0\xA0\xC0Q\x11\0\0\0\0\xA0\x10y\x12\0\0\0\0\xA0\xA21\x13\0\0\0\0\xA0\xF2X\x14\0\0\0\0\x90\xEB#\x15\0\0\0\0\x90\xC68\x16\0\0\0\0\x90\xCD\x03\x17\0\0\0\0\x90\xA8\x18\x18\0\0\0\0\x90\xAF\xE3\x18\0\0\0\0\x90\x8A\xF8\x19\0\0\0\0\x90\x91\xC3\x1A\0\0\0\0\x10\xA7\xE1\x1B\0\0\0\0\x10\xAE\xAC\x1C\0\0\0\0\x10\x89\xC1\x1D\0\0\0\0\x10\x90\x8C\x1E\0\0\0\0\x10k\xA1\x1F\0\0\0\0\x10rl \0\0\0\0\x10M\x81!\0\0\0\0\x10TL\"\0\0\0\0\x10/a#\0\0\0\0\x106,$\0\0\0\0\x90KJ%\0\0\0\0\x10\x18\x0C&\0\0\0\0\x90-*'\0\0\0\0\x904\xF5'\0\0\0\0\x90\x0F\n)\0\0\0\0\x90\x16\xD5)\0\0\0\0\x90\xF1\xE9*\0\0\0\0\x90\xF8\xB4+\0\0\0\0\x90\xD3\xC9,\0\0\0\0\x90\xDA\x94-\0\0\0\0\x90\xB5\xA9.\0\0\0\0\x90\xBCt/\0\0\0\0\x90\x97\x890\0\0\0\0\x10\xD9]1\0\0\0\0\x10\xB4r2\0\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x0F\xFA\xFF\xFF\xFF\xFF\xFF\xFF\x1F\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0CET\0\0\x10\x0E\0\0\0\0\0\0\x01CEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\x000*\0\0\0\0\0\0\xA0\x03$\x04\x04\n\xD1W\xFF\xFF\xFF\xFF\xA0\xAD&\x9B\xFF\xFF\xFF\xFF \x05\xD6\x9B\xFF\xFF\xFF\xFF\xA00\xCF\x9C\xFF\xFF\xFF\xFF\xA0\xC3\xA4\x9D\xFF\xFF\xFF\xFF\xA0\x9D\x9C\x9E\xFF\xFF\xFF\xFF\xA0\x1A\x97\x9F\xFF\xFF\xFF\xFF \xBA\x85\xA0\xFF\xFF\xFF\xFF\xA0\xFCv\xA1\xFF\xFF\xFF\xFF \x9Ce\xA2\xFF\xFF\xFF\xFF\xA0\xC8{\xA3\xFF\xFF\xFF\xFF\xA0\xB8N\xA4\xFF\xFF\xFF\xFF \xFB?\xA5\xFF\xFF\xFF\xFF `%\xA6\xFF\xFF\xFF\xFF \xC6'\xA7\xFF\xFF\xFF\xFF ,*\xA8\xFF\xFF\xFF\xFF\xA0\xF8\xEB\xA8\xFF\xFF\xFF\xFF\xA0\xD3\0\xAA\xFF\xFF\xFF\xFF \x15\xD5\xAA\xFF\xFF\xFF\xFF \xF0\xE9\xAB\xFF\xFF\xFF\xFF l\xC7\xAC\xFF\xFF\xFF\xFF \xD2\xC9\xAD\xFF\xFF\xFF\xFF N\xA7\xAE\xFF\xFF\xFF\xFF\xA0y\xA0\xAF\xFF\xFF\xFF\xFF 0\x87\xB0\xFF\xFF\xFF\xFF\xA0\xD0\x92\xB1\xFF\xFF\xFF\xFF\xA0Lp\xB2\xFF\xFF\xFF\xFF\xA0\xB2r\xB3\xFF\xFF\xFF\xFF\xA0.P\xB4\xFF\xFF\xFF\xFF ZI\xB5\xFF\xFF\xFF\xFF\xA0\x100\xB6\xFF\xFF\xFF\xFF\xA0v2\xB7\xFF\xFF\xFF\xFF\xA0\xF2\x0F\xB8\xFF\xFF\xFF\xFF\xA0X\x12\xB9\xFF\xFF\xFF\xFF\xA0\xD4\xEF\xB9\xFF\xFF\xFF\xFF \0\xE9\xBA\xFF\xFF\xFF\xFF \xF1\xD8\xBB\xFF\xFF\xFF\xFF W\xDB\xBC\xFF\xFF\xFF\xFF \xD3\xB8\xBD\xFF\xFF\xFF\xFF\xA0\xFE\xB1\xBE\xFF\xFF\xFF\xFF \xB5\x98\xBF\xFF\xFF\xFF\xFF \x1B\x9B\xC0\xFF\xFF\xFF\xFF \x97x\xC1\xFF\xFF\xFF\xFF \xFDz\xC2\xFF\xFF\xFF\xFF yX\xC3\xFF\xFF\xFF\xFF\xA0\xA4Q\xC4\xFF\xFF\xFF\xFF [8\xC5\xFF\xFF\xFF\xFF \xC1:\xC6\xFF\xFF\xFF\xFF\xA0\xD6X\xC7\xFF\xFF\xFF\xFF\xA0\t\xDA\xC7\xFF\xFF\xFF\xFF\x90&\x16\xCA\xFF\xFF\xFF\xFF\x90Y\x97\xCA\xFF\xFF\xFF\xFF\x90\x1E\xD1\xCB\xFF\xFF\xFF\xFF\x90;w\xCC\xFF\xFF\xFF\xFF\x90\0\xB1\xCD\xFF\xFF\xFF\xFF\x10X`\xCE\xFF\xFF\xFF\xFF\x90\xE2\x90\xCF\xFF\xFF\xFF\xFF\x90^n\xD0\xFF\xFF\xFF\xFF\x10\x16r\xD1\xFF\xFF\xFF\xFF\x102\xFB\xD1\xFF\xFF\xFF\xFF \xFEi\xD2\xFF\xFF\xFF\xFF\xA0)c\xD3\xFF\xFF\xFF\xFF \xE0I\xD4\xFF\xFF\xFF\xFF\xA0!\x1E\xD5\xFF\xFF\xFF\xFF\x90\xFDB\xD5\xFF\xFF\xFF\xFF\x10\xE0\xDF\xD5\xFF\xFF\xFF\xFF \xACN\xD6\xFF\xFF\xFF\xFF\xA0\x03\xFE\xD6\xFF\xFF\xFF\xFF \x8E.\xD8\xFF\xFF\xFF\xFF \x95\xF9\xD8\xFF\xFF\xFF\xFF p\x0E\xDA\xFF\xFF\xFF\xFF \xEC\xEB\xDA\xFF\xFF\xFF\xFF\xA0\x17\xE5\xDB\xFF\xFF\xFF\xFF \xCE\xCB\xDC\xFF\xFF\xFF\xFF\xA0\xF9\xC4\xDD\xFF\xFF\xFF\xFF\xA0\xEA\xB4\xDE\xFF\xFF\xFF\xFF \x16\xAE\xDF\xFF\xFF\xFF\xFF\xA0\xCC\x94\xE0\xFF\xFF\xFF\xFF\xA0Hr\xE1\xFF\xFF\xFF\xFF tk\xE2\xFF\xFF\xFF\xFF\xA0*R\xE3\xFF\xFF\xFF\xFF\xA0\x90T\xE4\xFF\xFF\xFF\xFF\xA0\x0C2\xE5\xFF\xFF\xFF\xFF \xAD=\xE6\xFF\xFF\xFF\xFF )\x1B\xE7\xFF\xFF\xFF\xFF\xA0T\x14\xE8\xFF\xFF\xFF\xFFpP\x92\x16\0\0\0\0\x90\xBE\xF3\x17\0\0\0\0\x90\xAF\xE3\x18\0\0\0\0\x90\xA0\xD3\x19\0\0\0\0\x90\x91\xC3\x1A\0\0\0\0\x10\xBD\xBC\x1B\0\0\0\0\x10\xAE\xAC\x1C\0\0\0\0\x10\x9F\x9C\x1D\0\0\0\0\x10\x90\x8C\x1E\0\0\0\0\x10\x81|\x1F\0\0\0\0\x10rl \0\0\0\0\x10c\\!\0\0\0\0\x10TL\"\0\0\0\0\x10E<#\0\0\0\0\x106,$\0\0\0\0\x10'\x1C%\0\0\0\0\x10\x18\x0C&\0\0\0\0\x90C\x05'\0\0\0\0\x904\xF5'\0\0\0\0\x90%\xE5(\0\0\0\0\x90\x16\xD5)\0\0\0\0\x90\x07\xC5*\0\0\0\0\x90\xF8\xB4+\0\0\0\0\x90\xE9\xA4,\0\0\0\0\x90\xDA\x94-\0\0\0\0\x90\xCB\x84.\0\0\0\0\x90\xBCt/\0\0\0\0\x90\xADd0\0\0\0\0\x10\xD9]1\0\0\0\0\x10\xB4r2\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x01\x02\x01\x02\x03\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\xFC\xFA\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0 \x1C\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0EET\0\0 \x1C\0\0\0\0\0\0\x01EEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\x000*\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\0@8\0\0\0\0\0\0 \x01D\x01\x9B&\xBAS\xFF\xFF\xFF\xFF\x1Bos\xA4\xFF\xFF\xFF\xFF`Q\xCE\xCB\xFF\xFF\xFF\xFF`\xE5\xC0\xCC\xFF\xFF\xFF\xFF\x80\xDD#\x15\0\0\0\0\x80\xCE\x13\x16\0\0\0\0\x80\xBF\x03\x17\0\0\0\0\x80\xB0\xF3\x17\0\0\0\0\xE0us\x18\0\0\0\0\x90\xA0\xD3\x19\0\0\0\0\x90\x91\xC3\x1A\0\0\0\0\x10\xBD\xBC\x1B\0\0\0\0\x10\xAE\xAC\x1C\0\0\0\0\x10\x9F\x9C\x1D\0\0\0\0\x10\x90\x8C\x1E\0\0\0\0\x10\x81|\x1F\0\0\0\0\x10rl \0\0\0\0\x10c\\!\0\0\0\0\x10TL\"\0\0\0\0\x10E<#\0\0\0\0\x106,$\0\0\0\0\x10'\x1C%\0\0\0\0\x10\x18\x0C&\0\0\0\0\x90C\x05'\0\0\0\0\x904\xF5'\0\0\0\0\x90%\xE5(\0\0\0\0\x90\x16\xD5)\0\0\0\0\x90\x07\xC5*\0\0\0\0\x90\xF8\xB4+\0\0\0\0\x90\xE9\xA4,\0\0\0\0\x90\xDA\x94-\0\0\0\0\x90\xCB\x84.\0\0\0\0\x90\xBCt/\0\0\0\0\x90\xADd0\0\0\0\0\x10\xD9]1\0\0\0\0\x10\xB4r2\0\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01e\x17\0\0\0\0\0\0 \x1C\0\0\0\0\0\x000*\0\0\0\0\0\0+03\0\x000*\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x98\x03.\x04\xD8\xC8\xB6V\xFF\xFF\xFF\xFF\x98\xF5\x8B\x90\xFF\xFF\xFF\xFF`\x17\x0C\x9B\xFF\xFF\xFF\xFF\xD0\xBE\xD5\x9B\xFF\xFF\xFF\xFF\xE0ce\xA2\xFF\xFF\xFF\xFFP\x82{\xA3\xFF\xFF\xFF\xFF`\x80N\xA4\xFF\xFF\xFF\xFF\xD0\xB4?\xA5\xFF\xFF\xFF\xFF\xE0'%\xA6\xFF\xFF\xFF\xFF\xD0\x7F'\xA7\xFF\xFF\xFF\xFF`((\xAA\xFF\xFF\xFF\xFF\xD0\xFD\xE1\xAA\xFF\xFF\xFF\xFF\xE0\x89\xF9\xAB\xFF\xFF\xFF\xFFP1\xC3\xAC\xFF\xFF\xFF\xFF\xE0?\x81\xC8\xFF\xFF\xFF\xFFP\x13\x01\xC9\xFF\xFF\xFF\xFF`\xF5J\xC9\xFF\xFF\xFF\xFFP\x80\xCE\xCA\xFF\xFF\xFF\xFF`\xAE\xCB\xCB\xFF\xFF\xFF\xFFP\tk\xD2\xFF\xFF\xFF\xFF`9\xA2\xD3\xFF\xFF\xFF\xFFP\x02C\xD4\xFF\xFF\xFF\xFF\xE0\rL\xD5\xFF\xFF\xFF\xFF\xD0{)\xD6\xFF\xFF\xFF\xFF\xE0\xEF+\xD7\xFF\xFF\xFF\xFF\xD0]\t\xD8\xFF\xFF\xFF\xFF`\x97\x02\xD9\xFF\xFF\xFF\xFF\xD0?\xE9\xD9\xFF\xFF\xFF\xFF\xE0\xB3\xEB\xDA\xFF\xFF\xFF\xFFP\\\xD2\xDB\xFF\xFF\xFF\xFF`\xD0\xD4\xDC\xFF\xFF\xFF\xFFP>\xB2\xDD\xFF\xFF\xFF\xFF`\xB9\xF4\xF1\xFF\xFF\xFF\xFFP\xEFb\xF4\xFF\xFF\xFF\xFF`\x06h\xF5\xFF\xFF\xFF\xFF\xD08\x1F\xF6\xFF\xFF\xFF\xFFp\x93n\x06\0\0\0\0p\x9A9\x07\0\0\0\0\0u\xFB\x07\0\0\0\0p|\x19\t\0\0\0\0\0\xCB\xD0\t\0\0\0\0p^\xF9\n\0\0\0\0\x80\xFE\xB1\x0B\0\0\0\0p@\xD9\x0C\0\0\0\0\x80U\xA4\r\0\0\0\0p\xAD\xA6\x0E\0\0\0\0\x807\x84\x0F\0\0\0\0P\x11\xF8\x0F\0\0\0\0p\xB0\x89\x19\0\0\0\0\xE0\xB0\xDC\x19\0\0\0\0\xF0\xD0\xE6\x1B\0\0\0\0\xF0\xEF\xC6\x1C\0\0\0\0p1\x9B\x1D\0\0\0\0\xF0s\x8C\x1E\0\0\0\0\xF0d|\x1F\0\0\0\0\xF0Ul \0\0\0\0\xF0F\\!\0\0\0\0\xF07L\"\0\0\0\0\xF0(<#\0\0\0\0\xF0\x19,$\0\0\0\0\xF0\n\x1C%\0\0\0\0\xF0\xFB\x0B&\0\0\0\0p'\x05'\0\0\0\0p\x18\xF5'\0\0\0\0p\t\xE5(\0\0\0\0p\xFA\xD4)\0\0\0\0p\xEB\xC4*\0\0\0\0p\xDC\xB4+\0\0\0\0p\xCD\xA4,\0\0\0\0\xF0\x83\x8B-\0\0\0\0p\xAF\x84.\0\0\0\0p\xA0t/\0\0\0\0p\x91d0\0\0\0\0\xF0\xBC]1\0\0\0\0\xF0\x97r2\0\0\0\0\xF0\x9E=3\0\0\0\0\xF0yR4\0\0\0\0\xF0\x80\x1D5\0\0\0\0\xF0[26\0\0\0\0\xF0b\xFD6\0\0\0\0px\x1B8\0\0\0\0\xF0D\xDD8\0\0\0\0pZ\xFB9\0\0\0\0\xF0&\xBD:\0\0\0\0p<\xDB;\0\0\0\0pC\xA6<\0\0\0\0p\x1E\xBB=\0\0\0\0p%\x86>\0\0\0\0p\0\x9B?\0\0\0\0p\x07f@\0\0\0\0\xF0\x1C\x84A\0\0\0\0p\xE9EB\0\0\0\0\xF0\xFEcC\0\0\0\0p\xCB%D\0\0\0\0\xF0\xE0CE\0\0\0\0\x90\xC9\x05F\0\0\0\0\x10\xDF#G\0\0\0\0\x10\xE6\xEEG\0\0\0\0\x10\xC1\x03I\0\0\0\0\x10\xC8\xCEI\0\0\0\0\x10\xA3\xE3J\0\0\0\0\x10\xAA\xAEK\0\0\0\0\x90\xBF\xCCL\0\0\0\0\x90\xDD\x8FM\0\0\0\0\x90\xA1\xACN\0\0\0\0\x10nnO\0\0\0\0\x90\x83\x8CP\0\0\0\0\x90\x8AWQ\0\0\0\0\x90elR\0\0\0\0\x10\xBE8S\0\0\0\0\x90GLT\0\0\0\0\x90N\x17U\0\0\0\0\x90\x9E>V\0\0\0\0\x900\xF7V\0\0\0\0P.\xCFW\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x03\x04\x05\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x03\x04(\x1B\0\0\0\0\0\0h\x1B\0\0\0\0\0\0 \x1C\0\0\0\0\0\x000*\0\0\0\0\0\x000*\0\0\0\0\0\0@8\0\0\0\0\0\0EET\0\0 \x1C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x80\x02\t\x03H[\xA2o\xFF\xFF\xFF\xFF`\x17\x0C\x9B\xFF\xFF\xFF\xFF\xF0\xDA\xD5\x9B\xFF\xFF\xFF\xFF\x90\xAE\xD9\x9C\xFF\xFF\xFF\xFF\x90\xB5\xA4\x9D\xFF\xFF\xFF\xFF\x90\x90\xB9\x9E\xFF\xFF\xFF\xFF\x90\x97\x84\x9F\xFF\xFF\xFF\xFF\x90q\t\xC8\xFF\xFF\xFF\xFF\x10K\xE7\xCC\xFF\xFF\xFF\xFF\x90\x17\xA9\xCD\xFF\xFF\xFF\xFF\x10C\xA2\xCE\xFF\xFF\xFF\xFF\x104\x92\xCF\xFF\xFF\xFF\xFF\x10%\x82\xD0\xFF\xFF\xFF\xFF\x10\x16r\xD1\xFF\xFF\xFF\xFF\xE0w|\xD1\xFF\xFF\xFF\xFF`\x84\x95\xD1\xFF\xFF\xFF\xFFP\xAD\x8A\xD2\xFF\xFF\xFF\xFF\xE0\xB6Y\xD3\xFF\xFF\xFF\xFF\xD0\xA7'\x15\0\0\0\0@\xDC\x18\x16\0\0\0\0P\xDB\x08\x17\0\0\0\0\xC0\x0F\xFA\x17\0\0\0\0\xD0\x0E\xEA\x18\0\0\0\0@C\xDB\x19\0\0\0\0\xD0\x93\xCC\x1A\0\0\0\0\xF0\xA0\xBC\x1B\0\0\0\0\xF0\x91\xAC\x1C\0\0\0\0\xF0\x82\x9C\x1D\0\0\0\0\xF0s\x8C\x1E\0\0\0\0\xF0d|\x1F\0\0\0\0\xF0Ul \0\0\0\0\xF0F\\!\0\0\0\0\xF07L\"\0\0\0\0\xF0(<#\0\0\0\0\xF0\x19,$\0\0\0\0\0\x19\x1C%\0\0\0\0\0\n\x0C&\0\0\0\0\x805\x05'\0\0\0\0\x80&\xF5'\0\0\0\0\x80\x17\xE5(\0\0\0\0\x80\x08\xD5)\0\0\0\0\x80\xF9\xC4*\0\0\0\0\x80\xEA\xB4+\0\0\0\0\x80\xDB\xA4,\0\0\0\0\x80\xCC\x94-\0\0\0\0\x80\xBD\x84.\0\0\0\0\x80\xAEt/\0\0\0\0\x80\x9Fd0\0\0\0\0\0\xCB]1\0\0\0\0\0\xA6r2\0\0\0\0\0\xAD=3\0\0\0\0\0\x88R4\0\0\0\0\0\x8F\x1D5\0\0\0\0\0j26\0\0\0\0\0q\xFD6\0\0\0\0\x80\x86\x1B8\0\0\0\0\0S\xDD8\0\0\0\0\x80h\xFB9\0\0\0\0\x005\xBD:\0\0\0\0\x80J\xDB;\0\0\0\0\x80Q\xA6<\0\0\0\0\x80,\xBB=\0\0\0\0\x803\x86>\0\0\0\0\x80\x0E\x9B?\0\0\0\0\x80\x15f@\0\0\0\0\0+\x84A\0\0\0\0\x80\xF7EB\0\0\0\0\0\rdC\0\0\0\0\x80\xD9%D\0\0\0\0\0\xEFCE\0\0\0\0\x80\xBB\x05F\0\0\0\0\0\xD1#G\0\0\0\0\0\xD8\xEEG\0\0\0\0\0\xB3\x03I\0\0\0\0\0\xBA\xCEI\0\0\0\0\0\x95\xE3J\0\0\0\0\0\x9C\xAEK\0\0\0\0\x80\xB1\xCCL\0\0\0\0\0~\x8EM\0\0\0\0p+LT\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x02\x03\x04\x02\x03\x04\x05\x06\x04\x05\x06\x04\x05\x06\x04\x05\x06\x04\x05\x06\x04\x05\x06\x04\x05\x06\x04\x05\x06\x04\x05\x04\x05\x02\x03\x04\x05\x02\x03\x04\x05\x02\x03\x04\x05\x02\x03\x04\x05\x02\x03\x04\x05\x02\x03\x04\x05\x02\x03\x04\x05\x02\x03\x04\x05\x02\x03\x04\x05\x02\x03\x04\x05\x02\x03\x04\x05\x02\x03\x04\x05\x02\x03\x04\x05\x02\x03\x04\x05\x02\x03\x04\x05\x02\x03\x04\x05\x02\x03\x04\x05\x02\x03\x04\x05\x02\x03\x04\x05\x02\x03\x04\x05\x02\x03\x04\x05\x02\x03\x04\x05\x02\x038\x13\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0 \x1C\0\0\0\0\0\0 \x1C\0\0\0\0\0\x000*\0\0\0\0\0\x000*\0\0\0\0\0\0@8\0\0\0\0\0\0MSK\0\x000*\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\x02b\x02\x809\0\xA1\xFF\xFF\xFF\xFFP\x0B\xA4\xB5\xFF\xFF\xFF\xFF\xC0\x99'\x15\0\0\0\x000\xCE\x18\x16\0\0\0\0@\xCD\x08\x17\0\0\0\0\xB0\x01\xFA\x17\0\0\0\0\xC0\0\xEA\x18\0\0\0\x0005\xDB\x19\0\0\0\0\xC0\x85\xCC\x1A\0\0\0\0\xE0\x92\xBC\x1B\0\0\0\0\xE0\x83\xAC\x1C\0\0\0\0\xE0t\x9C\x1D\0\0\0\0\xE0e\x8C\x1E\0\0\0\0\xE0V|\x1F\0\0\0\0\xE0Gl \0\0\0\0\xE08\\!\0\0\0\0\xE0)L\"\0\0\0\0\xE0\x1A<#\0\0\0\0\xE0\x0B,$\0\0\0\0\xF0\x19,$\0\0\0\0\xF0\n\x1C%\0\0\0\0\xF0\xFB\x0B&\0\0\0\0p'\x05'\0\0\0\0p\x18\xF5'\0\0\0\0`\xEC\xD4)\0\0\0\0p\xFA\xD4)\0\0\0\0p\xEB\xC4*\0\0\0\0p\xDC\xB4+\0\0\0\0p\xCD\xA4,\0\0\0\0p\xBE\x94-\0\0\0\0p\xAF\x84.\0\0\0\0p\xA0t/\0\0\0\0p\x91d0\0\0\0\0\xF0\xBC]1\0\0\0\0\xF0\x97r2\0\0\0\0\xF0\x9E=3\0\0\0\0\xF0yR4\0\0\0\0\xF0\x80\x1D5\0\0\0\0\xF0[26\0\0\0\0\xF0b\xFD6\0\0\0\0px\x1B8\0\0\0\0\xF0D\xDD8\0\0\0\0pZ\xFB9\0\0\0\0\xF0&\xBD:\0\0\0\0p<\xDB;\0\0\0\0pC\xA6<\0\0\0\0p\x1E\xBB=\0\0\0\0p%\x86>\0\0\0\0p\0\x9B?\0\0\0\0p\x07f@\0\0\0\0\xF0\x1C\x84A\0\0\0\0p\xE9EB\0\0\0\0\xF0\xFEcC\0\0\0\0p\xCB%D\0\0\0\0\xF0\xE0CE\0\0\0\0p\xAD\x05F\0\0\0\0\xF0\xC2#G\0\0\0\0\xF0\xC9\xEEG\0\0\0\0\xF0\xA4\x03I\0\0\0\0\xF0\xAB\xCEI\0\0\0\0\xF0\x86\xE3J\0\0\0\0\xF0\x8D\xAEK\0\0\0\0p\xA3\xCCL\0\0\0\0\xF0o\x8EM\0\0\0\0`\x1DLT\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x02\x04\x02\x04\x01\x02\x04\x01\x02\x04\x02\x04\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x98.\0\0\0\0\0\x000*\0\0\0\0\0\0@8\0\0\0\0\0\0PF\0\0\0\0\0\0@8\0\0\0\0\0\0EET\0\0 \x1C\0\0\0\0\0\0\x01EEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\x000*\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\0@8\0\0\0\0\0\08\x01m\x01d\xC7\xB6V\xFF\xFF\xFF\xFFd\xA7\x19\xAA\xFF\xFF\xFF\xFF`\x19\xA4\xB5\xFF\xFF\xFF\xFF\xD0.\xCD\xCA\xFF\xFF\xFF\xFF\x10K\xE7\xCC\xFF\xFF\xFF\xFF\x90\x17\xA9\xCD\xFF\xFF\xFF\xFF\x10C\xA2\xCE\xFF\xFF\xFF\xFFp\xA8\xCD\xCE\xFF\xFF\xFF\xFF\xD0\xA7'\x15\0\0\0\0@\xDC\x18\x16\0\0\0\0P\xDB\x08\x17\0\0\0\0\xC0\x0F\xFA\x17\0\0\0\0\xD0\x0E\xEA\x18\0\0\0\0@C\xDB\x19\0\0\0\0\xD0\x93\xCC\x1A\0\0\0\0\xF0\xA0\xBC\x1B\0\0\0\0\xF0\x91\xAC\x1C\0\0\0\0\xF0\x82\x9C\x1D\0\0\0\0\xF0s\x8C\x1E\0\0\0\0\xF0d|\x1F\0\0\0\0\xF0Ul \0\0\0\0\xF0F\\!\0\0\0\0\xF07L\"\0\0\0\0\xF0(<#\0\0\0\0\xF0\x19,$\0\0\0\0\xF0\n\x1C%\0\0\0\0\xF0\xFB\x0B&\0\0\0\0\xE0 \x8D&\0\0\0\0\x80\x17\xE5(\0\0\0\0\x80\x08\xD5)\0\0\0\0\x80\xF9\xC4*\0\0\0\0\x80\xEA\xB4+\0\0\0\0\x80\xDB\xA4,\0\0\0\0\x80\xCC\x94-\0\0\0\0\x80\xBD\x84.\0\0\0\0\x80\xAEt/\0\0\0\0\x80\x9Fd0\0\0\0\0\0\xCB]1\0\0\0\0\x10\xB4r2\0\0\0\0\0\x01\x02\x01\x03\x04\x01\x03\x04\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x06\x01\x03\x02\x06\x01\x03\x02\x06\x01\x03\x02\x06\x01\x03\x02\x06\x01\x03\x02\x06\x01\x03\x9C\x1C\0\0\0\0\0\0 \x1C\0\0\0\0\0\x000*\0\0\0\0\0\0 \x1C\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0@8\0\0\0\0\0\x000*\0\0\0\0\0\0WET\0\0\0\0\0\0\0\0\0\0\x01WEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\0 \x1C\0\0\0\0\0\0h\x04\x0B\x05\x80\x8E\xE6\x92\xFF\xFF\xFF\xFFpmK\x9B\xFF\xFF\xFF\xFF\x80\xC7\xFE\x9B\xFF\xFF\xFF\xFF\x80\xFB\x9C\x9C\xFF\xFF\xFF\xFFp\x83\xC9\x9D\xFF\xFF\xFF\xFF\0/~\x9E\xFF\xFF\xFF\xFF\xF0\xB6\xAA\x9F\xFF\xFF\xFF\xFF\x80b_\xA0\xFF\xFF\xFF\xFFp\xEA\x8B\xA1\xFF\xFF\xFF\xFF\x80\xE7A\xA2\xFF\xFF\xFF\xFFpon\xA3\xFF\xFF\xFF\xFF\0\x1B#\xA4\xFF\xFF\xFF\xFF\xF0\xA2O\xA5\xFF\xFF\xFF\xFFp\xEF\x05\xAA\xFF\xFF\xFF\xFF\xF0_\xE7\xAA\xFF\xFF\xFF\xFF\xF0\xA7\xC9\xAD\xFF\xFF\xFF\xFF\xF0#\xA7\xAE\xFF\xFF\xFF\xFFpO\xA0\xAF\xFF\xFF\xFF\xFF\xF0\x05\x87\xB0\xFF\xFF\xFF\xFF\xF0k\x89\xB1\xFF\xFF\xFF\xFFp\"p\xB2\xFF\xFF\xFF\xFFp\x88r\xB3\xFF\xFF\xFF\xFFp\x04P\xB4\xFF\xFF\xFF\xFFpL2\xB7\xFF\xFF\xFF\xFFp\xC8\x0F\xB8\xFF\xFF\xFF\xFFp\xB9\xFF\xB8\xFF\xFF\xFF\xFFp\xAA\xEF\xB9\xFF\xFF\xFF\xFF\xF0\xB7\xC8\xBC\xFF\xFF\xFF\xFF\xF0\xA8\xB8\xBD\xFF\xFF\xFF\xFFp_\x9F\xBE\xFF\xFF\xFF\xFF\xF0\x8A\x98\xBF\xFF\xFF\xFF\xFF\xF0\xF0\x9A\xC0\xFF\xFF\xFF\xFF\xF0lx\xC1\xFF\xFF\xFF\xFF\xF0]h\xC2\xFF\xFF\xFF\xFF\xF0NX\xC3\xFF\xFF\xFF\xFFp\x05?\xC4\xFF\xFF\xFF\xFF\xF008\xC5\xFF\xFF\xFF\xFF\xF0\x96:\xC6\xFF\xFF\xFF\xFFp\xACX\xC7\xFF\xFF\xFF\xFFp\xDF\xD9\xC7\xFF\xFF\xFF\xFFp\xD2\x03\xC9\xFF\xFF\xFF\xFFp \xF1\xC9\xFF\xFF\xFF\xFF\xF0b\xE2\xCA\xFF\xFF\xFF\xFF\xF0R\xB5\xCB\xFF\xFF\xFF\xFF\xE0\xA3\xEC\xCB\xFF\xFF\xFF\xFF\xE0K\x80\xCC\xFF\xFF\xFF\xFF\xF0\xA2\xDC\xCC\xFF\xFF\xFF\xFF\xF04\x95\xCD\xFF\xFF\xFF\xFF`K\xC3\xCD\xFF\xFF\xFF\xFF\xE0\xA2r\xCE\xFF\xFF\xFF\xFFp\xBF\xC5\xCE\xFF\xFF\xFF\xFF\xF0\x16u\xCF\xFF\xFF\xFF\xFF\xE0g\xAC\xCF\xFF\xFF\xFF\xFF\xE0\x84R\xD0\xFF\xFF\xFF\xFFp\xA1\xA5\xD0\xFF\xFF\xFF\xFF\xF0\xF8T\xD1\xFF\xFF\xFF\xFF\xE0I\x8C\xD1\xFF\xFF\xFF\xFF\xE0f2\xD2\xFF\xFF\xFF\xFFp\x83\x85\xD2\xFF\xFF\xFF\xFF\xF0\xC4Y\xD3\xFF\xFF\xFF\xFF\xF0\xB5I\xD4\xFF\xFF\xFF\xFF \xD19\xD5\xFF\xFF\xFF\xFF \xC2)\xD6\xFF\xFF\xFF\xFF \xB3\x19\xD7\xFF\xFF\xFF\xFF \xA4\t\xD8\xFF\xFF\xFF\xFF \x95\xF9\xD8\xFF\xFF\xFF\xFF \x86\xE9\xD9\xFF\xFF\xFF\xFF w\xD9\xDA\xFF\xFF\xFF\xFF h\xC9\xDB\xFF\xFF\xFF\xFF Y\xB9\xDC\xFF\xFF\xFF\xFF\xA0\x84\xB2\xDD\xFF\xFF\xFF\xFF\xA0u\xA2\xDE\xFF\xFF\xFF\xFF\xA0f\x92\xDF\xFF\xFF\xFF\xFF\xA0W\x82\xE0\xFF\xFF\xFF\xFF\xA0Hr\xE1\xFF\xFF\xFF\xFF\xA09b\xE2\xFF\xFF\xFF\xFF\xA0*R\xE3\xFF\xFF\xFF\xFF\xA0\x1BB\xE4\xFF\xFF\xFF\xFF\xA0\x0C2\xE5\xFF\xFF\xFF\xFF\xA0\xFD!\xE6\xFF\xFF\xFF\xFF )\x1B\xE7\xFF\xFF\xFF\xFF \x1A\x0B\xE8\xFF\xFF\xFF\xFF \x0B\xFB\xE8\xFF\xFF\xFF\xFF \xFC\xEA\xE9\xFF\xFF\xFF\xFF \xED\xDA\xEA\xFF\xFF\xFF\xFF \xDE\xCA\xEB\xFF\xFF\xFF\xFF \xCF\xBA\xEC\xFF\xFF\xFF\xFF \xC0\xAA\xED\xFF\xFF\xFF\xFF \xB1\x9A\xEE\xFF\xFF\xFF\xFF \xA2\x8A\xEF\xFF\xFF\xFF\xFF \x93z\xF0\xFF\xFF\xFF\xFF \x84j\xF1\xFF\xFF\xFF\xFF\xA0\xAFc\xF2\xFF\xFF\xFF\xFF\xA0\xA0S\xF3\xFF\xFF\xFF\xFF\xA0\x91C\xF4\xFF\xFF\xFF\xFF\xA0\x823\xF5\xFF\xFF\xFF\xFF\xA0s#\xF6\xFF\xFF\xFF\xFF\xA0d\x13\xF7\xFF\xFF\xFF\xFF\xA0U\x03\xF8\xFF\xFF\xFF\xFF\xA0F\xF3\xF8\xFF\xFF\xFF\xFF\xA07\xE3\xF9\xFF\xFF\xFF\xFF\0*\xAB\x0C\0\0\0\0\0\x0C\x8B\x0E\0\0\0\0\x90E\x84\x0F\0\0\0\0\x906t\x10\0\0\0\0\x90'd\x11\0\0\0\0\x90\x18T\x12\0\0\0\0\x10DM\x13\0\0\0\0\x90\xFA3\x14\0\0\0\0\x80\xDD#\x15\0\0\0\0\x80\xCE\x13\x16\0\0\0\0\x80\xBF\x03\x17\0\0\0\0\x80\xB0\xF3\x17\0\0\0\0\x80\xA1\xE3\x18\0\0\0\0\x80\x92\xD3\x19\0\0\0\0\x80\x83\xC3\x1A\0\0\0\0\0\xAF\xBC\x1B\0\0\0\0\0\xA0\xAC\x1C\0\0\0\0\0\x91\x9C\x1D\0\0\0\0\0~\x18\x1E\0\0\0\0\x10\x81|\x1F\0\0\0\0\x10rl \0\0\0\0\x10c\\!\0\0\0\0\x10TL\"\0\0\0\0\x10E<#\0\0\0\0\x106,$\0\0\0\0\x10'\x1C%\0\0\0\0\x10\x18\x0C&\0\0\0\0\x90C\x05'\0\0\0\0\x904\xF5'\0\0\0\0\x90%\xE5(\0\0\0\0\x90\x16\xD5)\0\0\0\0\x90\x07\xC5*\0\0\0\0\x90\xF8\xB4+\0\0\0\0\x90\xE9\xA4,\0\0\0\0\x90\xDA\x94-\0\0\0\0\x90\xCB\x84.\0\0\0\0\x90\xBCt/\0\0\0\0\x90\xADd0\0\0\0\0\x10\xD9]1\0\0\0\0\x10\xB4r2\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x02\x01\x02\x03\x02\x01\x02\x03\x02\x01\x02\x03\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x02\x04\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x02\x04\x01c\xF7\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0 \x1C\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0GMT\0\0\0\0\0\0\0\0\0\0\x01BST\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\0 \x1C\0\0\0\0\0\0\0\x05\xBA\x05\xCB\t]\x1A\xFF\xFF\xFF\xFF\xA0\xAD&\x9B\xFF\xFF\xFF\xFF \x05\xD6\x9B\xFF\xFF\xFF\xFF\xA00\xCF\x9C\xFF\xFF\xFF\xFF\xA0\xC3\xA4\x9D\xFF\xFF\xFF\xFF\xA0\x9D\x9C\x9E\xFF\xFF\xFF\xFF\xA0\x1A\x97\x9F\xFF\xFF\xFF\xFF \xBA\x85\xA0\xFF\xFF\xFF\xFF\xA0\xFCv\xA1\xFF\xFF\xFF\xFF \x9Ce\xA2\xFF\xFF\xFF\xFF\xA0\xC8{\xA3\xFF\xFF\xFF\xFF\xA0\xB8N\xA4\xFF\xFF\xFF\xFF \xFB?\xA5\xFF\xFF\xFF\xFF `%\xA6\xFF\xFF\xFF\xFF \xC6'\xA7\xFF\xFF\xFF\xFF ,*\xA8\xFF\xFF\xFF\xFF\xA0\xF8\xEB\xA8\xFF\xFF\xFF\xFF\xA0\xD3\0\xAA\xFF\xFF\xFF\xFF \x15\xD5\xAA\xFF\xFF\xFF\xFF \xF0\xE9\xAB\xFF\xFF\xFF\xFF l\xC7\xAC\xFF\xFF\xFF\xFF \xD2\xC9\xAD\xFF\xFF\xFF\xFF N\xA7\xAE\xFF\xFF\xFF\xFF\xA0y\xA0\xAF\xFF\xFF\xFF\xFF 0\x87\xB0\xFF\xFF\xFF\xFF\xA0\xD0\x92\xB1\xFF\xFF\xFF\xFF\xA0Lp\xB2\xFF\xFF\xFF\xFF\xA0\xB2r\xB3\xFF\xFF\xFF\xFF\xA0.P\xB4\xFF\xFF\xFF\xFF ZI\xB5\xFF\xFF\xFF\xFF\xA0\x100\xB6\xFF\xFF\xFF\xFF\xA0v2\xB7\xFF\xFF\xFF\xFF\xA0\xF2\x0F\xB8\xFF\xFF\xFF\xFF\xA0X\x12\xB9\xFF\xFF\xFF\xFF\xA0\xD4\xEF\xB9\xFF\xFF\xFF\xFF \0\xE9\xBA\xFF\xFF\xFF\xFF \xF1\xD8\xBB\xFF\xFF\xFF\xFF W\xDB\xBC\xFF\xFF\xFF\xFF \xD3\xB8\xBD\xFF\xFF\xFF\xFF\xA0\xFE\xB1\xBE\xFF\xFF\xFF\xFF \xB5\x98\xBF\xFF\xFF\xFF\xFF \x1B\x9B\xC0\xFF\xFF\xFF\xFF \x97x\xC1\xFF\xFF\xFF\xFF \xFDz\xC2\xFF\xFF\xFF\xFF yX\xC3\xFF\xFF\xFF\xFF\xA0\xA4Q\xC4\xFF\xFF\xFF\xFF [8\xC5\xFF\xFF\xFF\xFF \xC1:\xC6\xFF\xFF\xFF\xFF\xA0\xD6X\xC7\xFF\xFF\xFF\xFF\xA0\t\xDA\xC7\xFF\xFF\xFF\xFF\x90&\x16\xCA\xFF\xFF\xFF\xFF\x90Y\x97\xCA\xFF\xFF\xFF\xFF\x90\x1E\xD1\xCB\xFF\xFF\xFF\xFF\x90;w\xCC\xFF\xFF\xFF\xFF\x90\0\xB1\xCD\xFF\xFF\xFF\xFF\x10X`\xCE\xFF\xFF\xFF\xFF\x90\xE2\x90\xCF\xFF\xFF\xFF\xFF\x90^n\xD0\xFF\xFF\xFF\xFF\x10\x16r\xD1\xFF\xFF\xFF\xFF\x102\xFB\xD1\xFF\xFF\xFF\xFF \xFEi\xD2\xFF\xFF\xFF\xFF\xA0)c\xD3\xFF\xFF\xFF\xFF \xE0I\xD4\xFF\xFF\xFF\xFF\xA0!\x1E\xD5\xFF\xFF\xFF\xFF\x90\xFDB\xD5\xFF\xFF\xFF\xFF\x10\xE0\xDF\xD5\xFF\xFF\xFF\xFF \xACN\xD6\xFF\xFF\xFF\xFF\xA0\x03\xFE\xD6\xFF\xFF\xFF\xFF \x8E.\xD8\xFF\xFF\xFF\xFF \x95\xF9\xD8\xFF\xFF\xFF\xFF p\x0E\xDA\xFF\xFF\xFF\xFF \xEC\xEB\xDA\xFF\xFF\xFF\xFF\xA0\x17\xE5\xDB\xFF\xFF\xFF\xFF \xCE\xCB\xDC\xFF\xFF\xFF\xFF\xA0\xF9\xC4\xDD\xFF\xFF\xFF\xFF\xA0\xEA\xB4\xDE\xFF\xFF\xFF\xFF \x16\xAE\xDF\xFF\xFF\xFF\xFF\xA0\xCC\x94\xE0\xFF\xFF\xFF\xFF\xA0Hr\xE1\xFF\xFF\xFF\xFF tk\xE2\xFF\xFF\xFF\xFF\xA0*R\xE3\xFF\xFF\xFF\xFF\xA0\x90T\xE4\xFF\xFF\xFF\xFF\xA0\x0C2\xE5\xFF\xFF\xFF\xFF \xAD=\xE6\xFF\xFF\xFF\xFF )\x1B\xE7\xFF\xFF\xFF\xFF\xA0T\x14\xE8\xFF\xFF\xFF\xFF \x0B\xFB\xE8\xFF\xFF\xFF\xFF q\xFD\xE9\xFF\xFF\xFF\xFF \xED\xDA\xEA\xFF\xFF\xFF\xFF S\xDD\xEB\xFF\xFF\xFF\xFF \xCF\xBA\xEC\xFF\xFF\xFF\xFF\xA0\xFA\xB3\xED\xFF\xFF\xFF\xFF \xB1\x9A\xEE\xFF\xFF\xFF\xFF\xA0g\x81\xEF\xFF\xFF\xFF\xFF }\x9F\xF0\xFF\xFF\xFF\xFF\xA0Ia\xF1\xFF\xFF\xFF\xFF _\x7F\xF2\xFF\xFF\xFF\xFF fJ\xF3\xFF\xFF\xFF\xFF A_\xF4\xFF\xFF\xFF\xFF\xA0\r!\xF5\xFF\xFF\xFF\xFF #?\xF6\xFF\xFF\xFF\xFF\xA0\xEF\0\xF7\xFF\xFF\xFF\xFF \x05\x1F\xF8\xFF\xFF\xFF\xFF\xA0\xD1\xE0\xF8\xFF\xFF\xFF\xFF \xE7\xFE\xF9\xFF\xFF\xFF\xFF\xA0\xB3\xC0\xFA\xFF\xFF\xFF\xFF\xA0\x03\xE8\xFB\xFF\xFF\xFF\xFF\xA0\xAB{\xFC\xFF\xFF\xFF\xFFp\xBB\xC7\xFD\xFF\xFF\xFF\xFF \xC6p\x03\0\0\0\0 X)\x04\0\0\0\0 \xA8P\x05\0\0\0\0 :\t\x06\0\0\0\0 \x8A0\x07\0\0\0\0 \x1C\xE9\x07\0\0\0\0 l\x10\t\0\0\0\0 \xFE\xC8\t\0\0\0\0 N\xF0\n\0\0\0\0\xA0\x1A\xB2\x0B\0\0\0\0 0\xD0\x0C\0\0\0\0\xA0\xFC\x91\r\0\0\0\0 \x12\xB0\x0E\0\0\0\0\xA0\xDEq\x0F\0\0\0\0\xA0.\x99\x10\0\0\0\0\xA0\xC0Q\x11\0\0\0\0\xA0\x10y\x12\0\0\0\0\xA0\xA21\x13\0\0\0\0\xA0\xF2X\x14\0\0\0\0\x90\xEB#\x15\0\0\0\0\x90\xC68\x16\0\0\0\0\x90\xCD\x03\x17\0\0\0\0\x90\xA8\x18\x18\0\0\0\0\x90\xAF\xE3\x18\0\0\0\0\x90\x8A\xF8\x19\0\0\0\0\x90\x91\xC3\x1A\0\0\0\0\x10\xA7\xE1\x1B\0\0\0\0\x10\xAE\xAC\x1C\0\0\0\0\x10\x89\xC1\x1D\0\0\0\0\x10\x90\x8C\x1E\0\0\0\0\x10k\xA1\x1F\0\0\0\0\x10rl \0\0\0\0\x10M\x81!\0\0\0\0\x10TL\"\0\0\0\0\x10/a#\0\0\0\0\x106,$\0\0\0\0\x90KJ%\0\0\0\0\x10\x18\x0C&\0\0\0\0\x90-*'\0\0\0\0\x904\xF5'\0\0\0\0\x90\x0F\n)\0\0\0\0\x90\x16\xD5)\0\0\0\0\x90\xF1\xE9*\0\0\0\0\x90\xF8\xB4+\0\0\0\0\x90\xD3\xC9,\0\0\0\0\x90\xDA\x94-\0\0\0\0\x90\xB5\xA9.\0\0\0\0\x90\xBCt/\0\0\0\0\x90\x97\x890\0\0\0\0\x10\xD9]1\0\0\0\0\x10\xB4r2\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x01\x02\x01\x02\x03\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\xB5\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0 \x1C\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0CET\0\0\x10\x0E\0\0\0\0\0\0\x01CEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\x000*\0\0\0\0\0\0\x80\x02\xEE\x02\0\xB56~\xFF\xFF\xFF\xFF\xF0\xC5\xBA\x9E\xFF\xFF\xFF\xFF\09\xA0\x9F\xFF\xFF\xFF\xFF\xF0\x1B\x90\xA0\xFF\xFF\xFF\xFF\x80l\x81\xA1\xFF\xFF\xFF\xFFp\xEF\x05\xAA\xFF\xFF\xFF\xFF\0n\xE7\xAA\xFF\xFF\xFF\xFF\xF0\xA7\xC9\xAD\xFF\xFF\xFF\xFF\x002\xA7\xAE\xFF\xFF\xFF\xFFpO\xA0\xAF\xFF\xFF\xFF\xFF\0\x14\x87\xB0\xFF\xFF\xFF\xFF\0z\x89\xB1\xFF\xFF\xFF\xFF\x800p\xB2\xFF\xFF\xFF\xFFp\x88r\xB3\xFF\xFF\xFF\xFF\x80\x12P\xB4\xFF\xFF\xFF\xFF\xF0\xEC\xC9\xC2\xFF\xFF\xFF\xFF\0]X\xC3\xFF\xFF\xFF\xFF\xF0?H\xC4\xFF\xFF\xFF\xFF\xE0\x1Bm\xC4\xFF\xFF\xFF\xFF`t9\xC5\xFF\xFF\xFF\xFF\x80[!\xC7\xFF\xFF\xFF\xFF\xF0\x8E\xF5\xC7\xFF\xFF\xFF\xFF`\xDE\xF5\xCB\xFF\xFF\xFF\xFF\xF0q\x95\xCC\xFF\xFF\xFF\xFF`K\xC3\xCD\xFF\xFF\xFF\xFFp\xD5\xA0\xCE\xFF\xFF\xFF\xFF`-\xA3\xCF\xFF\xFF\xFF\xFFp\xB7\x80\xD0\xFF\xFF\xFF\xFF`\x0F\x83\xD1\xFF\xFF\xFF\xFFp\x99`\xD2\xFF\xFF\xFF\xFF`\xF1b\xD3\xFF\xFF\xFF\xFFp{@\xD4\xFF\xFF\xFF\xFF\xE0F\x1E\xD9\xFF\xFF\xFF\xFF\xF0[\xE9\xD9\xFF\xFF\xFF\xFF\xE0\xCD\r\x08\0\0\0\0p\x92\xF4\x08\0\0\0\0\xE0\xAF\xED\t\0\0\0\0pt\xD4\n\0\0\0\0\xE0\x1C\xBB\x0B\0\0\0\0\xF0\x1B\xAB\x0C\0\0\0\0`9\xA4\r\0\0\0\0\xF0\xFD\x8A\x0E\0\0\0\0\x90E\x84\x0F\0\0\0\0\x906t\x10\0\0\0\0\x90'd\x11\0\0\0\0\x90\x18T\x12\0\0\0\0\x10DM\x13\0\0\0\0\x90\xFA3\x14\0\0\0\0\x90\xEB#\x15\0\0\0\0\x90\xDC\x13\x16\0\0\0\0\x90\xCD\x03\x17\0\0\0\0\x90\xBE\xF3\x17\0\0\0\0\x90\xAF\xE3\x18\0\0\0\0\x90\xA0\xD3\x19\0\0\0\0\x90\x91\xC3\x1A\0\0\0\0\x10\xBD\xBC\x1B\0\0\0\0\x10\xAE\xAC\x1C\0\0\0\0\x10\x9F\x9C\x1D\0\0\0\0\x10\x90\x8C\x1E\0\0\0\0\x10\x81|\x1F\0\0\0\0\x10rl \0\0\0\0\x10c\\!\0\0\0\0\x10TL\"\0\0\0\0\x10E<#\0\0\0\0\x106,$\0\0\0\0\x10'\x1C%\0\0\0\0\x10\x18\x0C&\0\0\0\0\x90C\x05'\0\0\0\0\x904\xF5'\0\0\0\0\x90%\xE5(\0\0\0\0\x90\x16\xD5)\0\0\0\0\x90\x07\xC5*\0\0\0\0\x90\xF8\xB4+\0\0\0\0\x90\xE9\xA4,\0\0\0\0\x90\xDA\x94-\0\0\0\0\x90\xCB\x84.\0\0\0\0\x90\xBCt/\0\0\0\0\x90\xADd0\0\0\0\0\x10\xD9]1\0\0\0\0\x10\xB4r2\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x02\x01\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x8C\xFC\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0 \x1C\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0CET\0\0\x10\x0E\0\0\0\0\0\0\x01CEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\x000*\0\0\0\0\0\0\xB8\x02\x0F\x03d\xD3\xBDp\xFF\xFF\xFF\xFFp\xF88\x9B\xFF\xFF\xFF\xFF\xE0\xCC\xD5\x9B\xFF\xFF\xFF\xFF\xF0\xCB\xC5\x9C\xFF\xFF\xFF\xFF`\0\xB7\x9D\xFF\xFF\xFF\xFFp\xFE\x89\x9E\xFF\xFF\xFF\xFF\xE0\x1C\xA0\x9F\xFF\xFF\xFF\xFF\xF0\xA5`\xA0\xFF\xFF\xFF\xFF`\xAD~\xA1\xFF\xFF\xFF\xFFp7\\\xA2\xFF\xFF\xFF\xFF`\x1AL\xA3\xFF\xFF\xFF\xFF\xF05l\xC8\xFF\xFF\xFF\xFF\x10K\xE7\xCC\xFF\xFF\xFF\xFF\x90\x17\xA9\xCD\xFF\xFF\xFF\xFF\x10C\xA2\xCE\xFF\xFF\xFF\xFF\x90\xE2\x90\xCF\xFF\xFF\xFF\xFF\x90^n\xD0\xFF\xFF\xFF\xFF\x10\x16r\xD1\xFF\xFF\xFF\xFF\xF0\xD2L\xD2\xFF\xFF\xFF\xFF\x901>\xD3\xFF\xFF\xFF\xFF\x10\xD2I\xD4\xFF\xFF\xFF\xFFp\xF7\x1D\xD5\xFF\xFF\xFF\xFF\xF0\x97)\xD6\xFF\xFF\xFF\xFF\x90\x80\xEB\xD6\xFF\xFF\xFF\xFF\x10\x96\t\xD8\xFF\xFF\xFF\xFF\xF0\xB53\xF9\xFF\xFF\xFF\xFF\xE0\xC4\xD9\xF9\xFF\xFF\xFF\xFFp\xD2\x1C\xFB\xFF\xFF\xFF\xFF\xF0\xB4\xB9\xFB\xFF\xFF\xFF\xFFp\xB4\xFC\xFC\xFF\xFF\xFF\xFF\xF0\x96\x99\xFD\xFF\xFF\xFF\xFF\xF0\xD0\xE5\xFE\xFF\xFF\xFF\xFFp\xB3\x82\xFF\xFF\xFF\xFF\xFF\xF0\xB2\xC5\0\0\0\0\0p\x95b\x01\0\0\0\0pZ\x9C\x02\0\0\0\0pwB\x03\0\0\0\0\xF0v\x85\x04\0\0\0\0\xF0\x93+\x05\0\0\0\0p3\x1A\x06\0\0\0\0p$\n\x07\0\0\0\0p\x16\x17\x08\0\0\0\0p4\xDA\x08\0\0\0\0\x90\x14\xF7\t\0\0\0\0\x80\r\xC2\n\0\0\0\0\x90\xF6\xD6\x0B\0\0\0\0\x80\xEF\xA1\x0C\0\0\0\0\x90\xD8\xB6\r\0\0\0\0\x80\xD1\x81\x0E\0\0\0\0\x90\xBA\x96\x0F\0\0\0\0\x80\xB3a\x10\0\0\0\0\x90\x9Cv\x11\0\0\0\0\x80\x95A\x12\0\0\0\0\x10[E\x13\0\0\0\0\0\xB2*\x14\0\0\0\0\xF0\x1C\xB1\x14\0\0\0\0\x90\xDC\x13\x16\0\0\0\0\x90\xCD\x03\x17\0\0\0\0\x90\xBE\xF3\x17\0\0\0\0\x90\xAF\xE3\x18\0\0\0\0\x90\xA0\xD3\x19\0\0\0\0\x90\x91\xC3\x1A\0\0\0\0\x10\xBD\xBC\x1B\0\0\0\0\x10\xAE\xAC\x1C\0\0\0\0\x10\x9F\x9C\x1D\0\0\0\0\x10\x90\x8C\x1E\0\0\0\0\x10\x81|\x1F\0\0\0\0\x10rl \0\0\0\0\x10c\\!\0\0\0\0\x10TL\"\0\0\0\0\x10E<#\0\0\0\0\x106,$\0\0\0\0\x10'\x1C%\0\0\0\0\x10\x18\x0C&\0\0\0\0\x90C\x05'\0\0\0\0\x904\xF5'\0\0\0\0\x90%\xE5(\0\0\0\0\x90\x16\xD5)\0\0\0\0\x90\x07\xC5*\0\0\0\0\x90\xF8\xB4+\0\0\0\0\x90\xE9\xA4,\0\0\0\0\x90\xDA\x94-\0\0\0\0\x90\xCB\x84.\0\0\0\0\x90\xBCt/\0\0\0\0\x90\xADd0\0\0\0\0\x10\xD9]1\0\0\0\0\x10\xB4r2\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x9C\r\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0 \x1C\0\0\0\0\0\0+03\0\x000*\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \x02\x90\x02(\xCA\xB6V\xFF\xFF\xFF\xFF8\xAA\x19\xAA\xFF\xFF\xFF\xFF`\x19\xA4\xB5\xFF\xFF\xFF\xFF\xD0p^\xCA\xFF\xFF\xFF\xFF\x10K\xE7\xCC\xFF\xFF\xFF\xFF\x90\x17\xA9\xCD\xFF\xFF\xFF\xFF\x10C\xA2\xCE\xFF\xFF\xFF\xFF\x104\x92\xCF\xFF\xFF\xFF\xFF`\x02\n\xD0\xFF\xFF\xFF\xFF\xD0\xA7'\x15\0\0\0\0@\xDC\x18\x16\0\0\0\0P\xDB\x08\x17\0\0\0\0\xC0\x0F\xFA\x17\0\0\0\0\xD0\x0E\xEA\x18\0\0\0\0@C\xDB\x19\0\0\0\0\xD0\x93\xCC\x1A\0\0\0\0\xF0\xA0\xBC\x1B\0\0\0\0\xF0\x91\xAC\x1C\0\0\0\0\xF0\x82\x9C\x1D\0\0\0\0\xF0s\x8C\x1E\0\0\0\0\xF0d|\x1F\0\0\0\0\xF0Ul \0\0\0\0\xF0F\\!\0\0\0\0\xF07L\"\0\0\0\0\xF0(<#\0\0\0\0\xF0\x19,$\0\0\0\0\xF0\n\x1C%\0\0\0\0p\x18\xF5'\0\0\0\0\x80\x17\xE5(\0\0\0\0\x80\x08\xD5)\0\0\0\0\x80\xF9\xC4*\0\0\0\0\x80\xEA\xB4+\0\0\0\0\x80\xDB\xA4,\0\0\0\0\x80\xCC\x94-\0\0\0\0\x80\xBD\x84.\0\0\0\0\x80\xAEt/\0\0\0\0\x80\x9Fd0\0\0\0\0\0\xCB]1\0\0\0\0\0\xA6r2\0\0\0\0\0\xAD=3\0\0\0\0\0\x88R4\0\0\0\0\0\x8F\x1D5\0\0\0\0\0j26\0\0\0\0\0q\xFD6\0\0\0\0\x80\x86\x1B8\0\0\0\0\0S\xDD8\0\0\0\0\x80h\xFB9\0\0\0\0\x005\xBD:\0\0\0\0\x80J\xDB;\0\0\0\0\x80Q\xA6<\0\0\0\0\x80,\xBB=\0\0\0\0\x803\x86>\0\0\0\0\x80\x0E\x9B?\0\0\0\0\x80\x15f@\0\0\0\0\0+\x84A\0\0\0\0\x80\xF7EB\0\0\0\0\0\rdC\0\0\0\0\x80\xD9%D\0\0\0\0\0\xEFCE\0\0\0\0\x80\xBB\x05F\0\0\0\0\0\xD1#G\0\0\0\0\0\xD8\xEEG\0\0\0\0\0\xB3\x03I\0\0\0\0\0\xBA\xCEI\0\0\0\0\0\x95\xE3J\0\0\0\0\0\x9C\xAEK\0\0\0\0\x80\xB1\xCCL\0\0\0\0\0~\x8EM\0\0\0\0\x01\x02\x03\x02\x04\x05\x02\x04\x05\x02\x04\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\xD8\x19\0\0\0\0\0\0\xC8\x19\0\0\0\0\0\0 \x1C\0\0\0\0\0\x000*\0\0\0\0\0\0 \x1C\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0@8\0\0\0\0\0\x000*\0\0\0\0\0\0MSK\0\x000*\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0p\x02\xD4\x02\xC7\xC0\xB6V\xFF\xFF\xFF\xFF\xC7\x1E_\x9B\xFF\xFF\xFF\xFFy\xF2>\x9D\xFF\xFF\xFF\xFF\xF9\xEE*\x9E\xFF\xFF\xFF\xFFi9\xF7\x9E\xFF\xFF\xFF\xFF\xF9W\x84\x9F\xFF\xFF\xFF\xFF\xE9l\xD8\xA0\xFF\xFF\xFF\xFF\x809\0\xA1\xFF\xFF\xFF\xFF@\xA6<\xA1\xFF\xFF\xFF\xFF\xC0m\x10\xA4\xFF\xFF\xFF\xFF\xB02=\xA4\xFF\xFF\xFF\xFF\xB0h\x15\xA5\xFF\xFF\xFF\xFF\xC0\x03=\xA5\xFF\xFF\xFF\xFFPE\x1E\xA7\xFF\xFF\xFF\xFF`\x19\xA4\xB5\xFF\xFF\xFF\xFF\xD0\xA7'\x15\0\0\0\0@\xDC\x18\x16\0\0\0\0P\xDB\x08\x17\0\0\0\0\xC0\x0F\xFA\x17\0\0\0\0\xD0\x0E\xEA\x18\0\0\0\0@C\xDB\x19\0\0\0\0\xD0\x93\xCC\x1A\0\0\0\0\xF0\xA0\xBC\x1B\0\0\0\0\xF0\x91\xAC\x1C\0\0\0\0\xF0\x82\x9C\x1D\0\0\0\0\xF0s\x8C\x1E\0\0\0\0\xF0d|\x1F\0\0\0\0\xF0Ul \0\0\0\0\xF0F\\!\0\0\0\0\xF07L\"\0\0\0\0\xF0(<#\0\0\0\0\xF0\x19,$\0\0\0\0\xF0\n\x1C%\0\0\0\0\xF0\xFB\x0B&\0\0\0\0p'\x05'\0\0\0\0p\x18\xF5'\0\0\0\0\x80\x17\xE5(\0\0\0\0\x80\xBFx)\0\0\0\0p\xFA\xD4)\0\0\0\0p\xEB\xC4*\0\0\0\0p\xDC\xB4+\0\0\0\0p\xCD\xA4,\0\0\0\0p\xBE\x94-\0\0\0\0p\xAF\x84.\0\0\0\0p\xA0t/\0\0\0\0p\x91d0\0\0\0\0\xF0\xBC]1\0\0\0\0\xF0\x97r2\0\0\0\0\xF0\x9E=3\0\0\0\0\xF0yR4\0\0\0\0\xF0\x80\x1D5\0\0\0\0\xF0[26\0\0\0\0\xF0b\xFD6\0\0\0\0px\x1B8\0\0\0\0\xF0D\xDD8\0\0\0\0pZ\xFB9\0\0\0\0\xF0&\xBD:\0\0\0\0p<\xDB;\0\0\0\0pC\xA6<\0\0\0\0p\x1E\xBB=\0\0\0\0p%\x86>\0\0\0\0p\0\x9B?\0\0\0\0p\x07f@\0\0\0\0\xF0\x1C\x84A\0\0\0\0p\xE9EB\0\0\0\0\xF0\xFEcC\0\0\0\0p\xCB%D\0\0\0\0\xF0\xE0CE\0\0\0\0p\xAD\x05F\0\0\0\0\xF0\xC2#G\0\0\0\0\xF0\xC9\xEEG\0\0\0\0\xF0\xA4\x03I\0\0\0\0\xF0\xAB\xCEI\0\0\0\0\xF0\x86\xE3J\0\0\0\0\xF0\x8D\xAEK\0\0\0\0p\xA3\xCCL\0\0\0\0\xF0o\x8EM\0\0\0\0`\x1DLT\0\0\0\0\0\x01\x02\x01\x03\x02\x03\x04\x05\x04\x06\x04\x05\x07\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x05\x08\x07\x04\x04\x05\x08\x04\x05\x08\x04\x05\x08\x04\x05\x08\x04\x05\x08\x04\x05\x08\x04\x05\x08\x04\x05\x08\x04\x05\x08\x04\x05\x08\x04\x05\x08\x04\x05\x08\x04\x05\x08\x04\x05\x08\x04\x05\x08\x04\x05\x08\x04\x05\x08\x04\x05\x08\x04\x05\x08\x04\t\x05\x089#\0\0\0\0\0\0w#\0\0\0\0\0\0\x871\0\0\0\0\0\0\x97?\0\0\0\0\0\0@8\0\0\0\0\0\x000*\0\0\0\0\0\0PF\0\0\0\0\0\0 \x1C\0\0\0\0\0\x000*\0\0\0\0\0\0@8\0\0\0\0\0\0CET\0\0\x10\x0E\0\0\0\0\0\0\x01CEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\x000*\0\0\0\0\0\x000\x03\xAF\x03\xCF\x9B\xC9k\xFF\xFF\xFF\xFFOP`\x91\xFF\xFF\xFF\xFF\xF0xG\x9B\xFF\xFF\xFF\xFFp,\xD7\x9B\xFF\xFF\xFF\xFFp\x91\xBC\x9C\xFF\xFF\xFF\xFF\xF0H\xC0\x9D\xFF\xFF\xFF\xFFp\xFE\x89\x9E\xFF\xFF\xFF\xFF\xF0*\xA0\x9F\xFF\xFF\xFF\xFF\xF0\xA5`\xA0\xFF\xFF\xFF\xFF\xF0\x0C\x80\xA1\xFF\xFF\xFF\xFF\xF0\x12.\xA2\xFF\xFF\xFF\xFF\xF0Lz\xA3\xFF\xFF\xFF\xFF\xF0\x815\xA4\xFF\xFF\xFF\xFFp#^\xA5\xFF\xFF\xFF\xFF\xF05%\xA6\xFF\xFF\xFF\xFF\xF0\x9B'\xA7\xFF\xFF\xFF\xFFp&X\xA8\xFF\xFF\xFF\xFF\xF0}\x07\xA9\xFF\xFF\xFF\xFFp4\xEE\xA9\xFF\xFF\xFF\xFF\xF0_\xE7\xAA\xFF\xFF\xFF\xFF\xF0P\xD7\xAB\xFF\xFF\xFF\xFF\xF0A\xC7\xAC\xFF\xFF\xFF\xFF\xF0\xA7\xC9\xAD\xFF\xFF\xFF\xFF\xF0#\xA7\xAE\xFF\xFF\xFF\xFFpO\xA0\xAF\xFF\xFF\xFF\xFF\xF0\x05\x87\xB0\xFF\xFF\xFF\xFF\xF0k\x89\xB1\xFF\xFF\xFF\xFFp\"p\xB2\xFF\xFF\xFF\xFFp\x88r\xB3\xFF\xFF\xFF\xFFp\x04P\xB4\xFF\xFF\xFF\xFF\xF0/I\xB5\xFF\xFF\xFF\xFFp\xE6/\xB6\xFF\xFF\xFF\xFFpL2\xB7\xFF\xFF\xFF\xFFp\xC8\x0F\xB8\xFF\xFF\xFF\xFFp\xB9\xFF\xB8\xFF\xFF\xFF\xFFp\xAA\xEF\xB9\xFF\xFF\xFF\xFF\xF0`\xD6\xBA\xFF\xFF\xFF\xFF\xF0\xC6\xD8\xBB\xFF\xFF\xFF\xFF\xF0\xB7\xC8\xBC\xFF\xFF\xFF\xFF\xF0\xA8\xB8\xBD\xFF\xFF\xFF\xFFp_\x9F\xBE\xFF\xFF\xFF\xFF\xF0\x8A\x98\xBF\xFF\xFF\xFF\xFF\xF0\xF0\x9A\xC0\xFF\xFF\xFF\xFF\xF0lx\xC1\xFF\xFF\xFF\xFF\xF0]h\xC2\xFF\xFF\xFF\xFF\xF0NX\xC3\xFF\xFF\xFF\xFFp\x05?\xC4\xFF\xFF\xFF\xFF\xF008\xC5\xFF\xFF\xFF\xFF\xF0\x96:\xC6\xFF\xFF\xFF\xFFp\xACX\xC7\xFF\xFF\xFF\xFF\xA0\t\xDA\xC7\xFF\xFF\xFF\xFF\xE0'l\xC8\xFF\xFF\xFF\xFF\x10K\xE7\xCC\xFF\xFF\xFF\xFF\x90\x17\xA9\xCD\xFF\xFF\xFF\xFF\x10C\xA2\xCE\xFF\xFF\xFF\xFF\x104\x92\xCF\xFF\xFF\xFF\xFF\xE0\xE1O\xD0\xFF\xFF\xFF\xFF\xF0\xF1\x89\xD0\xFF\xFF\xFF\xFF\x10\x16r\xD1\xFF\xFF\xFF\xFF\x90@N\xD2\xFF\xFF\xFF\xFF\09\xBB\x0B\0\0\0\0\xF0\x1B\xAB\x0C\0\0\0\0\x90c\xA4\r\0\0\0\0\x10\x1A\x8B\x0E\0\0\0\0\x90E\x84\x0F\0\0\0\0\x906t\x10\0\0\0\0\x90'd\x11\0\0\0\0\x90\x18T\x12\0\0\0\0\x10DM\x13\0\0\0\0\x90\xFA3\x14\0\0\0\0\x90\xEB#\x15\0\0\0\0\x90\xDC\x13\x16\0\0\0\0\x90\xCD\x03\x17\0\0\0\0\x90\xBE\xF3\x17\0\0\0\0\x90\xAF\xE3\x18\0\0\0\0\x90\xA0\xD3\x19\0\0\0\0\x90\x91\xC3\x1A\0\0\0\0\x10\xBD\xBC\x1B\0\0\0\0\x10\xAE\xAC\x1C\0\0\0\0\x10\x9F\x9C\x1D\0\0\0\0\x10\x90\x8C\x1E\0\0\0\0\x10\x81|\x1F\0\0\0\0\x10rl \0\0\0\0\x10c\\!\0\0\0\0\x10TL\"\0\0\0\0\x10E<#\0\0\0\0\x106,$\0\0\0\0\x10'\x1C%\0\0\0\0\x10\x18\x0C&\0\0\0\0\x90C\x05'\0\0\0\0\x904\xF5'\0\0\0\0\x90%\xE5(\0\0\0\0\x90\x16\xD5)\0\0\0\0\x90\x07\xC5*\0\0\0\0\x90\xF8\xB4+\0\0\0\0\x90\xE9\xA4,\0\0\0\0\x90\xDA\x94-\0\0\0\0\x90\xCB\x84.\0\0\0\0\x90\xBCt/\0\0\0\0\x90\xADd0\0\0\0\0\x10\xD9]1\0\0\0\0\x10\xB4r2\0\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x03\x02\x04\x03\x02\x04\x03\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x041\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0 \x1C\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0CET\0\0\x10\x0E\0\0\0\0\0\0\x01CEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\x000*\0\0\0\0\0\0\xE8\x01%\x02\xF8\x92I\x1E\xFF\xFF\xFF\xFF\xF8\xEA\xCFl\xFF\xFF\xFF\xFF`\x17\x0C\x9B\xFF\xFF\xFF\xFF\xF0\xDA\xD5\x9B\xFF\xFF\xFF\xFF\x90\xAE\xD9\x9C\xFF\xFF\xFF\xFF\x90\xB5\xA4\x9D\xFF\xFF\xFF\xFF\x90\x90\xB9\x9E\xFF\xFF\xFF\xFF\x90\x97\x84\x9F\xFF\xFF\xFF\xFF\x90q\t\xC8\xFF\xFF\xFF\xFF\x10K\xE7\xCC\xFF\xFF\xFF\xFF\x90\x17\xA9\xCD\xFF\xFF\xFF\xFF\x10C\xA2\xCE\xFF\xFF\xFF\xFF\x104\x92\xCF\xFF\xFF\xFF\xFF\x10%\x82\xD0\xFF\xFF\xFF\xFF\x10\x16r\xD1\xFF\xFF\xFF\xFF\x10\x07b\xD2\xFF\xFF\xFF\xFF\x90\x1C\x80\xD3\xFF\xFF\xFF\xFF\x10\xD2I\xD4\xFF\xFF\xFF\xFF \xB4\x93\xD4\xFF\xFF\xFF\xFF r\x02\xD5\xFF\xFF\xFF\xFF\x10\xB4)\xD6\xFF\xFF\xFF\xFF\x10\x1A,\xD7\xFF\xFF\xFF\xFF\x10\x96\t\xD8\xFF\xFF\xFF\xFF\x10p\x01\xD9\xFF\xFF\xFF\xFF\x10x\xE9\xD9\xFF\xFF\xFF\xFF\x90'd\x11\0\0\0\0\x90\x18T\x12\0\0\0\0\x10DM\x13\0\0\0\0\x90\xFA3\x14\0\0\0\0\x90\xEB#\x15\0\0\0\0\x90\xDC\x13\x16\0\0\0\0\x90\xCD\x03\x17\0\0\0\0\x90\xBE\xF3\x17\0\0\0\0\x90\xAF\xE3\x18\0\0\0\0\x90\xA0\xD3\x19\0\0\0\0\x90\x91\xC3\x1A\0\0\0\0\x10\xBD\xBC\x1B\0\0\0\0\x10\xAE\xAC\x1C\0\0\0\0\x10\x9F\x9C\x1D\0\0\0\0\x10\x90\x8C\x1E\0\0\0\0\x10\x81|\x1F\0\0\0\0\x10rl \0\0\0\0\x10c\\!\0\0\0\0\x10TL\"\0\0\0\0\x10E<#\0\0\0\0\x106,$\0\0\0\0\x10'\x1C%\0\0\0\0\x10\x18\x0C&\0\0\0\0\x90C\x05'\0\0\0\0\x904\xF5'\0\0\0\0\x90%\xE5(\0\0\0\0\x90\x16\xD5)\0\0\0\0\x90\x07\xC5*\0\0\0\0\x90\xF8\xB4+\0\0\0\0\x90\xE9\xA4,\0\0\0\0\x90\xDA\x94-\0\0\0\0\x90\xCB\x84.\0\0\0\0\x90\xBCt/\0\0\0\0\x90\xADd0\0\0\0\0\x10\xD9]1\0\0\0\0\x10\xB4r2\0\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x88\r\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0 \x1C\0\0\0\0\0\0\0\0\0\0\0\0\0\0EET\0\0 \x1C\0\0\0\0\0\0\x01EEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\x000*\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\0@8\0\0\0\0\0\0\xA0\x01\xED\x01^\xCD\xB6V\xFF\xFF\xFF\xFF\xFE\x87\xB9\x9E\xFF\xFF\xFF\xFF\xFE\x8E\x84\x9F\xFF\xFF\xFF\xFF~F\x88\xA0\xFF\xFF\xFF\xFF\xFE\x82\xCB\xA0\xFF\xFF\xFF\xFF\xDE\xF1\xE7\xAD\xFF\xFF\xFF\xFF`d\xAF\xC8\xFF\xFF\xFF\xFFPeb\xCA\xFF\xFF\xFF\xFF\x10K\xE7\xCC\xFF\xFF\xFF\xFF\x90\x17\xA9\xCD\xFF\xFF\xFF\xFF\x10C\xA2\xCE\xFF\xFF\xFF\xFF\x104\x92\xCF\xFF\xFF\xFF\xFF\x10%\x82\xD0\xFF\xFF\xFF\xFFp\x89\x90\xD0\xFF\xFF\xFF\xFF\xD0\xA7'\x15\0\0\0\0@\xDC\x18\x16\0\0\0\0P\xDB\x08\x17\0\0\0\0\xC0\x0F\xFA\x17\0\0\0\0\xD0\x0E\xEA\x18\0\0\0\0@C\xDB\x19\0\0\0\0\xD0\x93\xCC\x1A\0\0\0\0\xF0\xA0\xBC\x1B\0\0\0\0\xF0\x91\xAC\x1C\0\0\0\0\xF0\x82\x9C\x1D\0\0\0\0\xF0s\x8C\x1E\0\0\0\0\xF0d|\x1F\0\0\0\0\xF0Ul \0\0\0\0\xF0F\\!\0\0\0\0\xF07L\"\0\0\0\0\xF0(<#\0\0\0\0\xF0\x19,$\0\0\0\0\0\x19\x1C%\0\0\0\0\0\n\x0C&\0\0\0\0\x805\x05'\0\0\0\0\x80&\xF5'\0\0\0\0\x80\x17\xE5(\0\0\0\0\x80\x08\xD5)\0\0\0\0\x80\xF9\xC4*\0\0\0\0\x80\xEA\xB4+\0\0\0\0\x80\xDB\xA4,\0\0\0\0\x80\xCC\x94-\0\0\0\0\x80\xBD\x84.\0\0\0\0\x80\xAEt/\0\0\0\0\x80\x9Fd0\0\0\0\0\0\xCB]1\0\0\0\0\0\xBCM2\0\0\0\0\x10\xBB=3\0\0\0\0\x10\x96R4\0\0\0\0\x10\x9D\x1D5\0\0\0\0\x10x26\0\0\0\0\x10\x7F\xFD6\0\0\0\0\x90\x94\x1B8\0\0\0\0\0\x01\0\x01\0\x02\x03\x02\x04\x05\x02\x04\x05\x02\x04\x05\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\xA2\x16\0\0\0\0\0\0\xB2$\0\0\0\0\0\0 \x1C\0\0\0\0\0\x000*\0\0\0\0\0\0 \x1C\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0@8\0\0\0\0\0\x000*\0\0\0\0\0\0CET\0\0\x10\x0E\0\0\0\0\0\0\x01CEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\x000*\0\0\0\0\0\0\xC0\x02\x18\x03L\xE8(>\xFF\xFF\xFF\xFFp\x81\xBCp\xFF\xFF\xFF\xFFp\xF88\x9B\xFF\xFF\xFF\xFF\xE0\xCC\xD5\x9B\xFF\xFF\xFF\xFF\xF0\xCB\xC5\x9C\xFF\xFF\xFF\xFF`\0\xB7\x9D\xFF\xFF\xFF\xFFp\xFE\x89\x9E\xFF\xFF\xFF\xFF\xE0\x1C\xA0\x9F\xFF\xFF\xFF\xFF\xF0\xA5`\xA0\xFF\xFF\xFF\xFF`\xAD~\xA1\xFF\xFF\xFF\xFFp7\\\xA2\xFF\xFF\xFF\xFF`\x1AL\xA3\xFF\xFF\xFF\xFF\xF05l\xC8\xFF\xFF\xFF\xFF\x10K\xE7\xCC\xFF\xFF\xFF\xFF\x90\x17\xA9\xCD\xFF\xFF\xFF\xFF\x10C\xA2\xCE\xFF\xFF\xFF\xFF\x104\x92\xCF\xFF\xFF\xFF\xFF\x90^n\xD0\xFF\xFF\xFF\xFF\x10\x16r\xD1\xFF\xFF\xFF\xFF\xF0\xD2L\xD2\xFF\xFF\xFF\xFF\x901>\xD3\xFF\xFF\xFF\xFF\x10\xD2I\xD4\xFF\xFF\xFF\xFFp\xF7\x1D\xD5\xFF\xFF\xFF\xFF\xF0\x97)\xD6\xFF\xFF\xFF\xFF\x90\x80\xEB\xD6\xFF\xFF\xFF\xFF\x10\x96\t\xD8\xFF\xFF\xFF\xFF\xF0\xB53\xF9\xFF\xFF\xFF\xFF\xE0\xC4\xD9\xF9\xFF\xFF\xFF\xFFp\xD2\x1C\xFB\xFF\xFF\xFF\xFF\xF0\xB4\xB9\xFB\xFF\xFF\xFF\xFFp\xB4\xFC\xFC\xFF\xFF\xFF\xFF\xF0\x96\x99\xFD\xFF\xFF\xFF\xFF\xF0\xD0\xE5\xFE\xFF\xFF\xFF\xFFp\xB3\x82\xFF\xFF\xFF\xFF\xFF\xF0\xB2\xC5\0\0\0\0\0p\x95b\x01\0\0\0\0pZ\x9C\x02\0\0\0\0pwB\x03\0\0\0\0\xF0v\x85\x04\0\0\0\0\xF0\x93+\x05\0\0\0\0p\x93n\x06\0\0\0\0\xF0u\x0B\x07\0\0\0\0\xF0:E\x08\0\0\0\0\xF0W\xEB\x08\0\0\0\0pW.\n\0\0\0\0\xF09\xCB\n\0\0\0\0p9\x0E\x0C\0\0\0\0\xF0\x1B\xAB\x0C\0\0\0\0\xF0\xE0\xE4\r\0\0\0\0\xF0\xFD\x8A\x0E\0\0\0\0p\xFD\xCD\x0F\0\0\0\0p\x1At\x10\0\0\0\0p\xDF\xAD\x11\0\0\0\0p\xFCS\x12\0\0\0\0\x10DM\x13\0\0\0\0\x90\xFA3\x14\0\0\0\0\x90\xEB#\x15\0\0\0\0\x90\xDC\x13\x16\0\0\0\0\x90\xCD\x03\x17\0\0\0\0\x90\xBE\xF3\x17\0\0\0\0\x90\xAF\xE3\x18\0\0\0\0\x90\xA0\xD3\x19\0\0\0\0\x90\x91\xC3\x1A\0\0\0\0\x10\xBD\xBC\x1B\0\0\0\0\x10\xAE\xAC\x1C\0\0\0\0\x10\x9F\x9C\x1D\0\0\0\0\x10\x90\x8C\x1E\0\0\0\0\x10\x81|\x1F\0\0\0\0\x10rl \0\0\0\0\x10c\\!\0\0\0\0\x10TL\"\0\0\0\0\x10E<#\0\0\0\0\x106,$\0\0\0\0\x10'\x1C%\0\0\0\0\x10\x18\x0C&\0\0\0\0\x90C\x05'\0\0\0\0\x904\xF5'\0\0\0\0\x90%\xE5(\0\0\0\0\x90\x16\xD5)\0\0\0\0\x90\x07\xC5*\0\0\0\0\x90\xF8\xB4+\0\0\0\0\x90\xE9\xA4,\0\0\0\0\x90\xDA\x94-\0\0\0\0\x90\xCB\x84.\0\0\0\0\x90\xBCt/\0\0\0\0\x90\xADd0\0\0\0\0\x10\xD9]1\0\0\0\0\x10\xB4r2\0\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xB4\x0B\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0 \x1C\0\0\0\0\0\0+04\0\0@8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x18\x02x\x02\x809\0\xA1\xFF\xFF\xFF\xFFP\x0B\xA4\xB5\xFF\xFF\xFF\xFF\xC0\x99'\x15\0\0\0\x000\xCE\x18\x16\0\0\0\0@\xCD\x08\x17\0\0\0\0\xB0\x01\xFA\x17\0\0\0\0\xC0\0\xEA\x18\0\0\0\x0005\xDB\x19\0\0\0\0\xC0\x85\xCC\x1A\0\0\0\0\xE0\x92\xBC\x1B\0\0\0\0\xE0\x83\xAC\x1C\0\0\0\0\xE0t\x9C\x1D\0\0\0\0\xE0e\x8C\x1E\0\0\0\0\xE0V|\x1F\0\0\0\0\xE0Gl \0\0\0\0\xE08\\!\0\0\0\0\xE0)L\"\0\0\0\0\xE0\x1A<#\0\0\0\0\xE0\x0B,$\0\0\0\0\xF0\x19,$\0\0\0\0\xF0\n\x1C%\0\0\0\0\xF0\xFB\x0B&\0\0\0\0p'\x05'\0\0\0\0p\x18\xF5'\0\0\0\0\x80&\xF5'\0\0\0\0\x80\x17\xE5(\0\0\0\0\0\xC7\0)\0\0\0\0`\xEC\xD4)\0\0\0\0`\xDD\xC4*\0\0\0\0`\xCE\xB4+\0\0\0\0`\xBF\xA4,\0\0\0\0`\xB0\x94-\0\0\0\0`\xA1\x84.\0\0\0\0`\x92t/\0\0\0\0`\x83d0\0\0\0\0\xE0\xAE]1\0\0\0\0\xE0\x89r2\0\0\0\0\xE0\x90=3\0\0\0\0\xE0kR4\0\0\0\0\xE0r\x1D5\0\0\0\0\xE0M26\0\0\0\0\xE0T\xFD6\0\0\0\0`j\x1B8\0\0\0\0\xE06\xDD8\0\0\0\0`L\xFB9\0\0\0\0\xE0\x18\xBD:\0\0\0\0`.\xDB;\0\0\0\0`5\xA6<\0\0\0\0`\x10\xBB=\0\0\0\0`\x17\x86>\0\0\0\0`\xF2\x9A?\0\0\0\0`\xF9e@\0\0\0\0\xE0\x0E\x84A\0\0\0\0`\xDBEB\0\0\0\0\xE0\xF0cC\0\0\0\0`\xBD%D\0\0\0\0\xE0\xD2CE\0\0\0\0`\x9F\x05F\0\0\0\0\xE0\xB4#G\0\0\0\0\xE0\xBB\xEEG\0\0\0\0\xE0\x96\x03I\0\0\0\0\xE0\x9D\xCEI\0\0\0\0\xE0x\xE3J\0\0\0\0\xE0\x7F\xAEK\0\0\0\0\xF0\x8D\xAEK\0\0\0\0p\xA3\xCCL\0\0\0\0\xF0o\x8EM\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x02\x04\x02\x04\x01\x02\x04\x01\x01\x05\x01\x05\x01\x05\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x03\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\xF4.\0\0\0\0\0\x000*\0\0\0\0\0\0@8\0\0\0\0\0\0PF\0\0\0\0\0\0@8\0\0\0\0\0\x000*\0\0\0\0\0\0+04\0\0@8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\x02m\x02\x809\0\xA1\xFF\xFF\xFF\xFFP\x0B\xA4\xB5\xFF\xFF\xFF\xFF\xC0\x99'\x15\0\0\0\x000\xCE\x18\x16\0\0\0\0@\xCD\x08\x17\0\0\0\0\xB0\x01\xFA\x17\0\0\0\0\xC0\0\xEA\x18\0\0\0\x0005\xDB\x19\0\0\0\0\xC0\x85\xCC\x1A\0\0\0\0\xE0\x92\xBC\x1B\0\0\0\0\xE0\x83\xAC\x1C\0\0\0\0\xE0t\x9C\x1D\0\0\0\0\xE0e\x8C\x1E\0\0\0\0\xE0V|\x1F\0\0\0\0\xE0Gl \0\0\0\0\xE08\\!\0\0\0\0\xE0)L\"\0\0\0\0\xF07L\"\0\0\0\0\xF0(<#\0\0\0\0\xF0\x19,$\0\0\0\0\xF0\n\x1C%\0\0\0\0\xF0\xFB\x0B&\0\0\0\0p'\x05'\0\0\0\0p\x18\xF5'\0\0\0\0`\xEC\xD4)\0\0\0\0p\xFA\xD4)\0\0\0\0p\xEB\xC4*\0\0\0\0p\xDC\xB4+\0\0\0\0p\xCD\xA4,\0\0\0\0p\xBE\x94-\0\0\0\0p\xAF\x84.\0\0\0\0p\xA0t/\0\0\0\0p\x91d0\0\0\0\0\xF0\xBC]1\0\0\0\0\xF0\x97r2\0\0\0\0\xF0\x9E=3\0\0\0\0\xF0yR4\0\0\0\0\xF0\x80\x1D5\0\0\0\0\xF0[26\0\0\0\0\xF0b\xFD6\0\0\0\0px\x1B8\0\0\0\0\xF0D\xDD8\0\0\0\0pZ\xFB9\0\0\0\0\xF0&\xBD:\0\0\0\0p<\xDB;\0\0\0\0pC\xA6<\0\0\0\0p\x1E\xBB=\0\0\0\0p%\x86>\0\0\0\0p\0\x9B?\0\0\0\0p\x07f@\0\0\0\0\xF0\x1C\x84A\0\0\0\0p\xE9EB\0\0\0\0\xF0\xFEcC\0\0\0\0p\xCB%D\0\0\0\0\xF0\xE0CE\0\0\0\0p\xAD\x05F\0\0\0\0\xF0\xC2#G\0\0\0\0\xF0\xC9\xEEG\0\0\0\0\xF0\xA4\x03I\0\0\0\0\xF0\xAB\xCEI\0\0\0\0\xF0\x86\xE3J\0\0\0\0\xF0\x8D\xAEK\0\0\0\0p\xA3\xCCL\0\0\0\0\xF0o\x8EM\0\0\0\0`\x1DLT\0\0\0\0pNCX\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x02\x04\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x02\x04\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x042+\0\0\0\0\0\x000*\0\0\0\0\0\0@8\0\0\0\0\0\0PF\0\0\0\0\0\0@8\0\0\0\0\0\0MSK\0\x000*\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0X\x02\xD3\x02\x08\xC4\xB6V\xFF\xFF\xFF\xFF \xA4\x19\xAA\xFF\xFF\xFF\xFF`\x19\xA4\xB5\xFF\xFF\xFF\xFF\xD0\x8D\x04\xCB\xFF\xFF\xFF\xFF\x10K\xE7\xCC\xFF\xFF\xFF\xFF\x90\x17\xA9\xCD\xFF\xFF\xFF\xFF\x10C\xA2\xCE\xFF\xFF\xFF\xFF\x104\x92\xCF\xFF\xFF\xFF\xFF\xE08\x9F\xCF\xFF\xFF\xFF\xFF\xD0\xA7'\x15\0\0\0\0@\xDC\x18\x16\0\0\0\0P\xDB\x08\x17\0\0\0\0\xC0\x0F\xFA\x17\0\0\0\0\xD0\x0E\xEA\x18\0\0\0\0@C\xDB\x19\0\0\0\0\xD0\x93\xCC\x1A\0\0\0\0\xF0\xA0\xBC\x1B\0\0\0\0\xF0\x91\xAC\x1C\0\0\0\0\xF0\x82\x9C\x1D\0\0\0\0\xF0s\x8C\x1E\0\0\0\0\xF0d|\x1F\0\0\0\0\xF0Ul \0\0\0\0\xF0F\\!\0\0\0\0\xF07L\"\0\0\0\0\xF0(<#\0\0\0\0\xF0\x19,$\0\0\0\0\xF0\n\x1C%\0\0\0\0\xF0.\x8D&\0\0\0\0\xE0\x0E\xC9)\0\0\0\0\x80\xF9\xC4*\0\0\0\0\x80\xEA\xB4+\0\0\0\0\x80\xDB\xA4,\0\0\0\0\x80\xCC\x94-\0\0\0\0\xD0\xC6\xC2-\0\0\0\0p\xAF\x84.\0\0\0\0p\xA0t/\0\0\0\0p\x91d0\0\0\0\0\xD0\xA0]1\0\0\0\0\0\xA6r2\0\0\0\0\x10\xBB=3\0\0\0\0\x10\x96R4\0\0\0\0\x10\x9D\x1D5\0\0\0\0\x10x26\0\0\0\0\x10\x7F\xFD6\0\0\0\0\x90\x94\x1B8\0\0\0\0\x10a\xDD8\0\0\0\0\x90v\xFB9\0\0\0\0\x10C\xBD:\0\0\0\0\x90X\xDB;\0\0\0\0\x90_\xA6<\0\0\0\0\x90:\xBB=\0\0\0\0\x90A\x86>\0\0\0\0\x90\x1C\x9B?\0\0\0\0\x90#f@\0\0\0\0\x109\x84A\0\0\0\0\x90\x05FB\0\0\0\0\x10\x1BdC\0\0\0\0\x90\xE7%D\0\0\0\0\x10\xFDCE\0\0\0\0\x90\xC9\x05F\0\0\0\0\x10\xDF#G\0\0\0\0\x10\xE6\xEEG\0\0\0\0\x10\xC1\x03I\0\0\0\0\x10\xC8\xCEI\0\0\0\0\x10\xA3\xE3J\0\0\0\0\x10\xAA\xAEK\0\0\0\0\x90\xBF\xCCL\0\0\0\0\x10\x8C\x8EM\0\0\0\0\x90\xA1\xACN\0\0\0\0\x10nnO\0\0\0\0\x90\x83\x8CP\0\0\0\0\x90\x8AWQ\0\0\0\0\x90elR\0\0\0\0\x80^7S\0\0\0\0`\x1DLT\0\0\0\0\x01\x02\x03\x02\x04\x05\x02\x04\x05\x02\x04\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x06\x03\x07\x06\x03\x07\x06\x03\x07\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x03\x07\x02\x04\x06\x08\x03\x07\xF8\x1F\0\0\0\0\0\0\xE0\x1F\0\0\0\0\0\0 \x1C\0\0\0\0\0\x000*\0\0\0\0\0\0 \x1C\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0@8\0\0\0\0\0\x000*\0\0\0\0\0\0@8\0\0\0\0\0\0EET\0\0 \x1C\0\0\0\0\0\0\x01EEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\x000*\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\0@8\0\0\0\0\0\0`\x01\xA1\x01$\xCE\xB6V\xFF\xFF\xFF\xFF\x18\xE3\xC3r\xFF\xFF\xFF\xFF\x10K\xE7\xCC\xFF\xFF\xFF\xFF\x90\x17\xA9\xCD\xFF\xFF\xFF\xFF\x10C\xA2\xCE\xFF\xFF\xFF\xFF\x104\x92\xCF\xFF\xFF\xFF\xFF\x10%\x82\xD0\xFF\xFF\xFF\xFF $r\xD1\xFF\xFF\xFF\xFFP\xEFc\x11\0\0\0\0\xE0?U\x12\0\0\0\0\xD0\x0BM\x13\0\0\0\0\xE0!5\x14\0\0\0\0\xD0\xED,\x15\0\0\0\0p\xC0\x13\x16\0\0\0\0\xD0\xCF\x0C\x17\0\0\0\0\x80\xB0\xF3\x17\0\0\0\0\x80\xA1\xE3\x18\0\0\0\0\x80\x92\xD3\x19\0\0\0\0\x80\x83\xC3\x1A\0\0\0\0\0\xAF\xBC\x1B\0\0\0\0\0\xA0\xAC\x1C\0\0\0\0\0\x91\x9C\x1D\0\0\0\0\0\x82\x8C\x1E\0\0\0\0\0s|\x1F\0\0\0\0\0dl \0\0\0\0\0U\\!\0\0\0\0\0FL\"\0\0\0\0\x007<#\0\0\0\0\0(,$\0\0\0\0\0\x19\x1C%\0\0\0\0\0\n\x0C&\0\0\0\0\x805\x05'\0\0\0\0\xE0\xB4\x7F'\0\0\0\0P\xED\xE4(\0\0\0\0`\xEC\xD4)\0\0\0\0P\xCF\xC4*\0\0\0\0`\xCE\xB4+\0\0\0\0P\xB1\xA4,\0\0\0\0`\xB0\x94-\0\0\0\0P\x93\x84.\0\0\0\0`\x92t/\0\0\0\0Pud0\0\0\0\0\xE0\xAE]1\0\0\0\0\xD0{r2\0\0\0\0\x01\x02\x03\x02\x04\x03\x02\x04\x03\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\x05\x02\x04\xDC\x15\0\0\0\0\0\0h\x1B\0\0\0\0\0\0 \x1C\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0 \x1C\0\0\0\0\0\x000*\0\0\0\0\0\0EET\0\0 \x1C\0\0\0\0\0\0\x01EEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\x000*\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\0@8\0\0\0\0\0\0\x98\x01\xE5\x01\xCC\xCC\xB6V\xFF\xFF\xFF\xFF\xCC-Y\x9E\xFF\xFF\xFF\xFF\x90\x90\xB9\x9E\xFF\xFF\xFF\xFF\x90\x97\x84\x9F\xFF\xFF\xFF\xFFp+\0\xA1\xFF\xFF\xFF\xFFLos\xA4\xFF\xFF\xFF\xFF\xE0\xB5\xB0\xC8\xFF\xFF\xFF\xFFP\x97\xC6\xCA\xFF\xFF\xFF\xFF\x10K\xE7\xCC\xFF\xFF\xFF\xFF\x90\x17\xA9\xCD\xFF\xFF\xFF\xFF\x10C\xA2\xCE\xFF\xFF\xFF\xFF\x104\x92\xCF\xFF\xFF\xFF\xFF\xE0\xCBt\xD0\xFF\xFF\xFF\xFF\xD0\xA7'\x15\0\0\0\0@\xDC\x18\x16\0\0\0\0P\xDB\x08\x17\0\0\0\0\xC0\x0F\xFA\x17\0\0\0\0\xD0\x0E\xEA\x18\0\0\0\0@C\xDB\x19\0\0\0\0\xD0\x93\xCC\x1A\0\0\0\0\xF0\xA0\xBC\x1B\0\0\0\0\xF0\x91\xAC\x1C\0\0\0\0\xF0\x82\x9C\x1D\0\0\0\0\xF0s\x8C\x1E\0\0\0\0\xF0d|\x1F\0\0\0\0\xF0Ul \0\0\0\0\xF0F\\!\0\0\0\0\xF07L\"\0\0\0\0\xF0(<#\0\0\0\0\xF0\x19,$\0\0\0\0\0\x19\x1C%\0\0\0\0\0\n\x0C&\0\0\0\0\x805\x05'\0\0\0\0\x80&\xF5'\0\0\0\0\x80\x17\xE5(\0\0\0\0\x80\x08\xD5)\0\0\0\0\x80\xF9\xC4*\0\0\0\0\x80\xEA\xB4+\0\0\0\0\x80\xDB\xA4,\0\0\0\0\x80\xCC\x94-\0\0\0\0\x80\xBD\x84.\0\0\0\0\x80\xAEt/\0\0\0\0\x80\x9Fd0\0\0\0\0\0\xCB]1\0\0\0\0\0\xA6r2\0\0\0\0\0\xAD=3\0\0\0\0\0\x88R4\0\0\0\0\0\x8F\x1D5\0\0\0\0\x10x26\0\0\0\0\x10\x7F\xFD6\0\0\0\0\x90\x94\x1B8\0\0\0\0\0\x01\x02\x01\0\x02\x03\x04\x02\x03\x01\x02\x03\x01\x02\x03\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x04\x06\x02\x03\x04\x06\x02\x03\x04\x06\x02\x03\x04\x06\x02\x03\x04\x06\x02\x03\x04\x06\x02\x03\x04\x06\x02\x03\x04\x06\x02\x03\x04\x06\x02\x03\x04\x06\x02\x03\x04\x06\x02\x034\x17\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0 \x1C\0\0\0\0\0\0 \x1C\0\0\0\0\0\x000*\0\0\0\0\0\0@8\0\0\0\0\0\x000*\0\0\0\0\0\0CET\0\0\x10\x0E\0\0\0\0\0\0\x01CEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\x000*\0\0\0\0\0\0\x98\x01\xCB\x01h4\xAA\x96\xFF\xFF\xFF\xFFp\x87m\xC8\xFF\xFF\xFF\xFF\x10K\xE7\xCC\xFF\xFF\xFF\xFF\x90\x17\xA9\xCD\xFF\xFF\xFF\xFF\x90\xE9\xB8\xCD\xFF\xFF\xFF\xFF\xF09(\x08\0\0\0\0`>\xEF\x08\0\0\0\0\xF0x\x05\n\0\0\0\0\xE0q\xD0\n\0\0\0\0pO\xE9\x0B\0\0\0\0`H\xB4\x0C\0\0\0\0\xF0k\xD2\r\0\0\0\0`*\x94\x0E\0\0\0\0p\xFC\xB0\x0F\0\0\0\0`\x0Ct\x10\0\0\0\0p\xDE\x90\x11\0\0\0\0`\xEES\x12\0\0\0\0p\xC0p\x13\0\0\0\0`\xB9;\x14\0\0\0\0p\xB9H\x15\0\0\0\0`\xB2\x13\x16\0\0\0\0\xF0\xD51\x17\0\0\0\0\xE0\xCE\xFC\x17\0\0\0\0p\x94\0\x19\0\0\0\0`_\xDB\x19\0\0\0\0\xF0\xAF\xCC\x1A\0\0\0\0\x10\xBD\xBC\x1B\0\0\0\0\x10\xAE\xAC\x1C\0\0\0\0\x10\x9F\x9C\x1D\0\0\0\0\x10\x90\x8C\x1E\0\0\0\0\x10\x81|\x1F\0\0\0\0\x10rl \0\0\0\0\x10c\\!\0\0\0\0\x10TL\"\0\0\0\0\x10E<#\0\0\0\0\x106,$\0\0\0\0\x10'\x1C%\0\0\0\0\x10\x18\x0C&\0\0\0\0\x90C\x05'\0\0\0\0\x904\xF5'\0\0\0\0\x90%\xE5(\0\0\0\0\x90\x16\xD5)\0\0\0\0\x90\x07\xC5*\0\0\0\0\x90\xF8\xB4+\0\0\0\0\x90\xE9\xA4,\0\0\0\0\x90\xDA\x94-\0\0\0\0\x90\xCB\x84.\0\0\0\0\x90\xBCt/\0\0\0\0\x90\xADd0\0\0\0\0\x10\xD9]1\0\0\0\0\x10\xB4r2\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x98\x12\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0 \x1C\0\0\0\0\0\0+04\0\0@8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \x02\x93\x02\x809\0\xA1\xFF\xFF\xFF\xFFP\x0B\xA4\xB5\xFF\xFF\xFF\xFF\xC0\x99'\x15\0\0\0\x000\xCE\x18\x16\0\0\0\0@\xCD\x08\x17\0\0\0\0\xB0\x01\xFA\x17\0\0\0\0\xC0\0\xEA\x18\0\0\0\x0005\xDB\x19\0\0\0\0\xC0\x85\xCC\x1A\0\0\0\0\xE0\x92\xBC\x1B\0\0\0\0\xE0\x83\xAC\x1C\0\0\0\0\xE0t\x9C\x1D\0\0\0\0\xE0e\x8C\x1E\0\0\0\0\xE0V|\x1F\0\0\0\0\xE0Gl \0\0\0\0\xE08\\!\0\0\0\0\xE0)L\"\0\0\0\0\xE0\x1A<#\0\0\0\0\xE0\x0B,$\0\0\0\0\xF0\x19,$\0\0\0\0\xF0\n\x1C%\0\0\0\0\xF0\xFB\x0B&\0\0\0\0p'\x05'\0\0\0\0p\x18\xF5'\0\0\0\0\x80&\xF5'\0\0\0\0\x80\x17\xE5(\0\0\0\0\x80\xBFx)\0\0\0\0p\xFA\xD4)\0\0\0\0p\xEB\xC4*\0\0\0\0p\xDC\xB4+\0\0\0\0p\xCD\xA4,\0\0\0\0p\xBE\x94-\0\0\0\0p\xAF\x84.\0\0\0\0p\xA0t/\0\0\0\0p\x91d0\0\0\0\0\xF0\xBC]1\0\0\0\0\xF0\x97r2\0\0\0\0\xF0\x9E=3\0\0\0\0\xF0yR4\0\0\0\0\xF0\x80\x1D5\0\0\0\0\xF0[26\0\0\0\0\xF0b\xFD6\0\0\0\0px\x1B8\0\0\0\0\xF0D\xDD8\0\0\0\0pZ\xFB9\0\0\0\0\xF0&\xBD:\0\0\0\0p<\xDB;\0\0\0\0pC\xA6<\0\0\0\0p\x1E\xBB=\0\0\0\0p%\x86>\0\0\0\0p\0\x9B?\0\0\0\0p\x07f@\0\0\0\0\xF0\x1C\x84A\0\0\0\0p\xE9EB\0\0\0\0\xF0\xFEcC\0\0\0\0p\xCB%D\0\0\0\0\xF0\xE0CE\0\0\0\0p\xAD\x05F\0\0\0\0\xF0\xC2#G\0\0\0\0\xF0\xC9\xEEG\0\0\0\0\xF0\xA4\x03I\0\0\0\0\xF0\xAB\xCEI\0\0\0\0\xF0\x86\xE3J\0\0\0\0\xF0\x8D\xAEK\0\0\0\0p\xA3\xCCL\0\0\0\0\xF0o\x8EM\0\0\0\0`\x1DLT\0\0\0\0p\x14\xF7V\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x02\x04\x02\x04\x01\x02\x04\x01\x01\x05\x01\x05\x06\x02\x04\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04\x01\x05\x02\x04`-\0\0\0\0\0\x000*\0\0\0\0\0\0@8\0\0\0\0\0\0PF\0\0\0\0\0\0@8\0\0\0\0\0\x000*\0\0\0\0\0\0 \x1C\0\0\0\0\0\0CET\0\0\x10\x0E\0\0\0\0\0\0\x01CEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\x000*\0\0\0\0\0\0\xC8\x01\x01\x02/_\xA2o\xFF\xFF\xFF\xFF`\x17\x0C\x9B\xFF\xFF\xFF\xFF\xF0\xDA\xD5\x9B\xFF\xFF\xFF\xFF\x90\xAE\xD9\x9C\xFF\xFF\xFF\xFF\x90\xB5\xA4\x9D\xFF\xFF\xFF\xFF\x90\x90\xB9\x9E\xFF\xFF\xFF\xFF\x90\x97\x84\x9F\xFF\xFF\xFF\xFF\x10\x1Ap\xA2\xFF\xFF\xFF\xFF\x90[D\xA3\xFF\xFF\xFF\xFF\x90q\t\xC8\xFF\xFF\xFF\xFF\x10K\xE7\xCC\xFF\xFF\xFF\xFF\x90\x17\xA9\xCD\xFF\xFF\xFF\xFF\x10C\xA2\xCE\xFF\xFF\xFF\xFF\x104\x92\xCF\xFF\xFF\xFF\xFF\x10%\x82\xD0\xFF\xFF\xFF\xFF\x10\x16r\xD1\xFF\xFF\xFF\xFF\x10E\x7F\xD1\xFF\xFF\xFF\xFF\x90\x1Bc\xD3\xFF\xFF\xFF\xFF\x90#K\xD4\xFF\xFF\xFF\xFF\x10\xC39\xD5\xFF\xFF\xFF\xFF\x10\xB4)\xD6\xFF\xFF\xFF\xFF\x10\x1A,\xD7\xFF\xFF\xFF\xFF\x10\x96\t\xD8\xFF\xFF\xFF\xFF\xF0'M\x13\0\0\0\0`\xD03\x14\0\0\0\0\xF0\x1C\xB1\x14\0\0\0\0\x90\xDC\x13\x16\0\0\0\0\x90\xCD\x03\x17\0\0\0\0\x90\xBE\xF3\x17\0\0\0\0\x90\xAF\xE3\x18\0\0\0\0\x90\xA0\xD3\x19\0\0\0\0\x90\x91\xC3\x1A\0\0\0\0\x10\xBD\xBC\x1B\0\0\0\0\x10\xAE\xAC\x1C\0\0\0\0\x10\x9F\x9C\x1D\0\0\0\0\x10\x90\x8C\x1E\0\0\0\0\x10\x81|\x1F\0\0\0\0\x10rl \0\0\0\0\x10c\\!\0\0\0\0\x10TL\"\0\0\0\0\x10E<#\0\0\0\0\x106,$\0\0\0\0\x10'\x1C%\0\0\0\0\x10\x18\x0C&\0\0\0\0\x90C\x05'\0\0\0\0\x904\xF5'\0\0\0\0\x90%\xE5(\0\0\0\0\x90\x16\xD5)\0\0\0\0\x90\x07\xC5*\0\0\0\0\x90\xF8\xB4+\0\0\0\0\x90\xE9\xA4,\0\0\0\0\x90\xDA\x94-\0\0\0\0\x90\xCB\x84.\0\0\0\0\x90\xBCt/\0\0\0\0\x90\xADd0\0\0\0\0\x10\xD9]1\0\0\0\0\x10\xB4r2\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01Q\x0F\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0 \x1C\0\0\0\0\0\0EET\0\0 \x1C\0\0\0\0\0\0\x01EEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\x000*\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\0@8\0\0\0\0\0\0\x90\x01\xDA\x01D\xCC\xB6V\xFF\xFF\xFF\xFFP\x1FO\x9C\xFF\xFF\xFF\xFF\x98J\x85\xA1\xFF\xFF\xFF\xFF\xF00\xF1\xA2\xFF\xFF\xFF\xFF`xf\xA3\xFF\xFF\xFF\xFFp\xCF\xAC\xC8\xFF\xFF\xFF\xFF\xD0*Y\xCA\xFF\xFF\xFF\xFF\x10K\xE7\xCC\xFF\xFF\xFF\xFF\x90\x17\xA9\xCD\xFF\xFF\xFF\xFF\x10C\xA2\xCE\xFF\xFF\xFF\xFF\x104\x92\xCF\xFF\xFF\xFF\xFF\xE0=0\xD0\xFF\xFF\xFF\xFF\xD0\xA7'\x15\0\0\0\0@\xDC\x18\x16\0\0\0\0P\xDB\x08\x17\0\0\0\0\xC0\x0F\xFA\x17\0\0\0\0\xD0\x0E\xEA\x18\0\0\0\0@C\xDB\x19\0\0\0\0\xD0\x93\xCC\x1A\0\0\0\0\xF0\xA0\xBC\x1B\0\0\0\0\xF0\x91\xAC\x1C\0\0\0\0\xF0\x82\x9C\x1D\0\0\0\0\xF0s\x8C\x1E\0\0\0\0\xF0d|\x1F\0\0\0\0\xF0Ul \0\0\0\0\xF0F\\!\0\0\0\0\xF07L\"\0\0\0\0\xF0(<#\0\0\0\0\xF0\x19,$\0\0\0\0\0\x19\x1C%\0\0\0\0\0\n\x0C&\0\0\0\0\x805\x05'\0\0\0\0\x80&\xF5'\0\0\0\0\x80\x17\xE5(\0\0\0\0\x80\x08\xD5)\0\0\0\0\x80\xF9\xC4*\0\0\0\0\x80\xEA\xB4+\0\0\0\0\x80\xDB\xA4,\0\0\0\0\x80\xCC\x94-\0\0\0\0\x80\xBD\x84.\0\0\0\0\x80\xAEt/\0\0\0\0\x80\x9Fd0\0\0\0\0\0\xCB]1\0\0\0\0\0\xA6r2\0\0\0\0\0\xAD=3\0\0\0\0\0\x88R4\0\0\0\0\x10\x9D\x1D5\0\0\0\0\x10x26\0\0\0\0\x10\x7F\xFD6\0\0\0\0\x90\x94\x1B8\0\0\0\0\x01\x02\x03\x04\x03\x05\x04\x06\x03\x04\x06\x03\x04\x06\x05\x07\x05\x07\x05\x07\x05\x07\x05\x07\x05\x07\x05\x07\x05\x07\x05\x05\x08\x04\x06\x05\x08\x04\x06\x05\x08\x04\x06\x05\x08\x04\x06\x05\x08\x04\x06\x05\x08\x04\x06\x05\x08\x04\x06\x05\x08\x04\x06\x05\x08\x04\x06\x04\x06\x03\x04\x06\x04\x06\xBC\x17\0\0\0\0\0\0\xB0\x13\0\0\0\0\0\0h\x16\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0 \x1C\0\0\0\0\0\x000*\0\0\0\0\0\0 \x1C\0\0\0\0\0\0@8\0\0\0\0\0\x000*\0\0\0\0\0\0MSK\0\x000*\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x18\x02v\x02\xDCF\xF5\xA1\xFF\xFF\xFF\xFFP\x0B\xA4\xB5\xFF\xFF\xFF\xFF\xC0\x99'\x15\0\0\0\x000\xCE\x18\x16\0\0\0\0@\xCD\x08\x17\0\0\0\0\xB0\x01\xFA\x17\0\0\0\0\xC0\0\xEA\x18\0\0\0\x0005\xDB\x19\0\0\0\0\xC0\x85\xCC\x1A\0\0\0\0\xE0\x92\xBC\x1B\0\0\0\0\xE0\x83\xAC\x1C\0\0\0\0\xE0t\x9C\x1D\0\0\0\0\xE0e\x8C\x1E\0\0\0\0\xE0V|\x1F\0\0\0\0\xE0Gl \0\0\0\0\xE08\\!\0\0\0\0\xE0)L\"\0\0\0\0\xF07L\"\0\0\0\0\xF0(<#\0\0\0\0\xF0\x19,$\0\0\0\0\xF0\n\x1C%\0\0\0\0\xF0\xFB\x0B&\0\0\0\0p'\x05'\0\0\0\0p\x18\xF5'\0\0\0\0`\xEC\xD4)\0\0\0\0p\xFA\xD4)\0\0\0\0p\xEB\xC4*\0\0\0\0p\xDC\xB4+\0\0\0\0p\xCD\xA4,\0\0\0\0p\xBE\x94-\0\0\0\0p\xAF\x84.\0\0\0\0p\xA0t/\0\0\0\0p\x91d0\0\0\0\0\xF0\xBC]1\0\0\0\0\xF0\x97r2\0\0\0\0\xF0\x9E=3\0\0\0\0\xF0yR4\0\0\0\0\xF0\x80\x1D5\0\0\0\0\xF0[26\0\0\0\0\xF0b\xFD6\0\0\0\0px\x1B8\0\0\0\0\xF0D\xDD8\0\0\0\0pZ\xFB9\0\0\0\0\xF0&\xBD:\0\0\0\0p<\xDB;\0\0\0\0pC\xA6<\0\0\0\0p\x1E\xBB=\0\0\0\0p%\x86>\0\0\0\0p\0\x9B?\0\0\0\0p\x07f@\0\0\0\0\xF0\x1C\x84A\0\0\0\0p\xE9EB\0\0\0\0\xF0\xFEcC\0\0\0\0p\xCB%D\0\0\0\0\xF0\xE0CE\0\0\0\0p\xAD\x05F\0\0\0\0\xF0\xC2#G\0\0\0\0\xF0\xC9\xEEG\0\0\0\0\xF0\xA4\x03I\0\0\0\0\xF0\xAB\xCEI\0\0\0\0\xF0\x86\xE3J\0\0\0\0\xF0\x8D\xAEK\0\0\0\0p\xA3\xCCL\0\0\0\0\xF0o\x8EM\0\0\0\0`\x1DLT\0\0\0\0\xF0\xED\xD4[\0\0\0\0`\xB2\xE7_\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x02\x04\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x02\x04\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\x02\x04\x01\xA4)\0\0\0\0\0\x000*\0\0\0\0\0\0@8\0\0\0\0\0\0PF\0\0\0\0\0\0@8\0\0\0\0\0\0CET\0\0\x10\x0E\0\0\0\0\0\0\x01CEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\x000*\0\0\0\0\0\0\x98\x02\x11\x03P\xD0\xB6V\xFF\xFF\xFF\xFF\xD0*\xA8\x99\xFF\xFF\xFF\xFF`\x17\x0C\x9B\xFF\xFF\xFF\xFF\xF0\xDA\xD5\x9B\xFF\xFF\xFF\xFF\x90\xAE\xD9\x9C\xFF\xFF\xFF\xFF\x90\xB5\xA4\x9D\xFF\xFF\xFF\xFF\x90\x90\xB9\x9E\xFF\xFF\xFF\xFF\x90\x97\x84\x9F\xFF\xFF\xFF\xFF\0\xB6\x9A\xA0\xFF\xFF\xFF\xFF\0\xBDe\xA1\xFF\xFF\xFF\xFF`|}\xA6\xFF\xFF\xFF\xFF\x10\xDEv\xC8\xFF\xFF\xFF\xFF\x10K\xE7\xCC\xFF\xFF\xFF\xFF\x90\x17\xA9\xCD\xFF\xFF\xFF\xFF\x10C\xA2\xCE\xFF\xFF\xFF\xFF\x104\x92\xCF\xFF\xFF\xFF\xFF\0\xBA\x84\xD0\xFF\xFF\xFF\xFFp\x92\x95\xD1\xFF\xFF\xFF\xFF`\xBB\x8A\xD2\xFF\xFF\xFF\xFFp\xFFb\xD3\xFF\xFF\xFF\xFF\x90#K\xD4\xFF\xFF\xFF\xFF\x10\xAD^\xD5\xFF\xFF\xFF\xFF\x10\xB4)\xD6\xFF\xFF\xFF\xFF\x10\x1A,\xD7\xFF\xFF\xFF\xFF\x10\x96\t\xD8\xFF\xFF\xFF\xFF\x90\xC1\x02\xD9\xFF\xFF\xFF\xFF\x10x\xE9\xD9\xFF\xFF\xFF\xFF\0\xD2T\xE8\xFF\xFF\xFF\xFF\x80\xB4\xF1\xE8\xFF\xFF\xFF\xFF\x80\xA5\xE1\xE9\xFF\xFF\xFF\xFF\x80\x96\xD1\xEA\xFF\xFF\xFF\xFF\0\x96\x14\xEC\xFF\xFF\xFF\xFF\0\xB3\xBA\xEC\xFF\xFF\xFF\xFF\0\xA4\xAA\xED\xFF\xFF\xFF\xFF\0\x95\x9A\xEE\xFF\xFF\xFF\xFF\0Z\xD4\xEF\xFF\xFF\xFF\xFF\0wz\xF0\xFF\xFF\xFF\xFF\0<\xB4\xF1\xFF\xFF\xFF\xFF\0YZ\xF2\xFF\xFF\xFF\xFF\0\x1E\x94\xF3\xFF\xFF\xFF\xFF\0;:\xF4\xFF\xFF\xFF\xFF\x80:}\xF5\xFF\xFF\xFF\xFF\0\x1D\x1A\xF6\xFF\xFF\xFF\xFF\x80U\xA4\r\0\0\0\0\0\x0C\x8B\x0E\0\0\0\0\x807\x84\x0F\0\0\0\0\x80(t\x10\0\0\0\0\x80\x19d\x11\0\0\0\0\x80\nT\x12\0\0\0\0\x006M\x13\0\0\0\0\x80\xEC3\x14\0\0\0\0\x80\xDD#\x15\0\0\0\0\x80\xCE\x13\x16\0\0\0\0\x80\xBF\x03\x17\0\0\0\0\x80\xB0\xF3\x17\0\0\0\0\x80\xA1\xE3\x18\0\0\0\0\x80\x92\xD3\x19\0\0\0\0\x80\x83\xC3\x1A\0\0\0\0\0\xAF\xBC\x1B\0\0\0\0\0\xA0\xAC\x1C\0\0\0\0\0\x91\x9C\x1D\0\0\0\0\0\x82\x8C\x1E\0\0\0\0\0s|\x1F\0\0\0\0\0dl \0\0\0\0\0U\\!\0\0\0\0\xF0\xD6\xDA!\0\0\0\0\x10E<#\0\0\0\0\x106,$\0\0\0\0\x10'\x1C%\0\0\0\0\x10\x18\x0C&\0\0\0\0\x90C\x05'\0\0\0\0\x904\xF5'\0\0\0\0\x90%\xE5(\0\0\0\0\x90\x16\xD5)\0\0\0\0\x90\x07\xC5*\0\0\0\0\x90\xF8\xB4+\0\0\0\0\x90\xE9\xA4,\0\0\0\0\x90\xDA\x94-\0\0\0\0\x90\xCB\x84.\0\0\0\0\x90\xBCt/\0\0\0\0\x90\xADd0\0\0\0\0\x10\xD9]1\0\0\0\0\x10\xB4r2\0\0\0\0\0\x01\x02\x01\x02\x01\x02\x02\x03\x04\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\x02\x03\x01\xB0\x13\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0 \x1C\0\0\0\0\0\0 \x1C\0\0\0\0\0\x000*\0\0\0\0\0\0CET\0\0\x10\x0E\0\0\0\0\0\0\x01CEST\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\x03\x05\0 \x1C\0\0\0\0\0\0\x02\0\0\0\x01\n\x05\x000*\0\0\0\0\0\x000\x01V\x01\x80\xEA\xF0$\xFF\xFF\xFF\xFF\x86\x06\xD4q\xFF\xFF\xFF\xFF\0j\x17\xCA\xFF\xFF\xFF\xFF\0q\xE2\xCA\xFF\xFF\xFF\xFF\0L\xF7\xCB\xFF\xFF\xFF\xFF\0S\xC2\xCC\xFF\xFF\xFF\xFF\xF0\x1C\xB1\x14\0\0\0\0\x90\xDC\x13\x16\0\0\0\0\x90\xCD\x03\x17\0\0\0\0\x90\xBE\xF3\x17\0\0\0\0\x90\xAF\xE3\x18\0\0\0\0\x90\xA0\xD3\x19\0\0\0\0\x90\x91\xC3\x1A\0\0\0\0\x10\xBD\xBC\x1B\0\0\0\0\x10\xAE\xAC\x1C\0\0\0\0\x10\x9F\x9C\x1D\0\0\0\0\x10\x90\x8C\x1E\0\0\0\0\x10\x81|\x1F\0\0\0\0\x10rl \0\0\0\0\x10c\\!\0\0\0\0\x10TL\"\0\0\0\0\x10E<#\0\0\0\0\x106,$\0\0\0\0\x10'\x1C%\0\0\0\0\x10\x18\x0C&\0\0\0\0\x90C\x05'\0\0\0\0\x904\xF5'\0\0\0\0\x90%\xE5(\0\0\0\0\x90\x16\xD5)\0\0\0\0\x90\x07\xC5*\0\0\0\0\x90\xF8\xB4+\0\0\0\0\x90\xE9\xA4,\0\0\0\0\x90\xDA\x94-\0\0\0\0\x90\xCB\x84.\0\0\0\0\x90\xBCt/\0\0\0\0\x90\xADd0\0\0\0\0\x10\xD9]1\0\0\0\0\x10\xB4r2\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\0\x08\0\0\0\0\0\0\xFA\x06\0\0\0\0\0\0\x10\x0E\0\0\0\0\0\0 \x1C\0\0\0\0\0\0-00\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0+06\0\0`T\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\0\x12\0\x9C\xF7~\x89\xFF\xFF\xFF\xFF\xB0\xDD\xE60\0\0\0\0\x01\x02\xE4C\0\0\0\0\0\0PF\0\0\0\0\0\0`T\0\0\0\0\0\0+05\0\0PF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\0\x12\0\x18\x9F\xB6V\xFF\xFF\xFF\xFF\x98\xC3/\xED\xFF\xFF\xFF\xFF\0\x01\xE8D\0\0\0\0\0\0PF\0\0\0\0\0\0+04\0\0@8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0(\0-\0\x98\x05\x7F\x89\xFF\xFF\xFF\xFF@\xED\x05\x18\0\0\0\x000r\xDB\x18\0\0\0\0\xE0\x96\x03I\0\0\0\0\xD0\x8F\xCEI\0\0\0\0\x01\x02\x01\x02\x01\xE85\0\0\0\0\0\0@8\0\0\0\0\0\0PF\0\0\0\0\0\0+13\0\0\xD0\xB6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0H\0Q\0\0\xC9=n\xFF\xFF\xFF\xFF\0\xFC\x05\x91\xFF\xFF\xFF\xFF8\x04b\xDA\xFF\xFF\xFF\xFF\xB0'\x9FL\0\0\0\0\xE0+\x97M\0\0\0\0`\xE2}N\0\0\0\0\xA0\x8B\xFDN\0\0\0\0\xE0\rwO\0\0\0\0\xE0\xFEfP\0\0\0\0\x01\x02\x03\x04\x03\x04\x05\x06\x05\x80\xB0\0\0\0\0\0\0\0_\xFF\xFF\xFF\xFF\xFF\xFFH^\xFF\xFF\xFF\xFF\xFF\xFFPe\xFF\xFF\xFF\xFF\xFF\xFF`s\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xC4\0\0\0\0\0\0\xD0\xB6\0\0\0\0\0\0NZST\0\xC0\xA8\0\0\0\0\0\0\x01NZDT\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\t\x05\x000*\0\0\0\0\0\0\x02\0\0\0\x01\x04\x01\0 \x1C\0\0\0\0\0\0\x10\x03\x95\x03\xA8L\xB7A\xFF\xFF\xFF\xFF\xE8\xB2\xB4\xB0\xFF\xFF\xFF\xFFX\x87Q\xB1\xFF\xFF\xFF\xFFh\xE5x\xB2\xFF\xFF\xFF\xFF`\xE5C\xB3\xFF\xFF\xFF\xFFh\xC7X\xB4\xFF\xFF\xFF\xFF`\xC7#\xB5\xFF\xFF\xFF\xFFh\xA98\xB6\xFF\xFF\xFF\xFF`\xA9\x03\xB7\xFF\xFF\xFF\xFFh\x8B\x18\xB8\xFF\xFF\xFF\xFF\xE0\xC5\xEC\xB8\xFF\xFF\xFF\xFFhm\xF8\xB9\xFF\xFF\xFF\xFF\xE0\xA7\xCC\xBA\xFF\xFF\xFF\xFFhO\xD8\xBB\xFF\xFF\xFF\xFF\xE0\xE8\xE3\xBC\xFF\xFF\xFF\xFF\xE8\xF6\xAE\xBD\xFF\xFF\xFF\xFF\xE0\xCA\xC3\xBE\xFF\xFF\xFF\xFF\xE8\xD8\x8E\xBF\xFF\xFF\xFF\xFF\xE0\xAC\xA3\xC0\xFF\xFF\xFF\xFF\xE8\xBAn\xC1\xFF\xFF\xFF\xFF\xE0\x8E\x83\xC2\xFF\xFF\xFF\xFF\xE8\x9CN\xC3\xFF\xFF\xFF\xFF\xE0pc\xC4\xFF\xFF\xFF\xFF\xE8~.\xC5\xFF\xFF\xFF\xFF`\x8DL\xC6\xFF\xFF\xFF\xFF\xE8`\x0E\xC7\xFF\xFF\xFF\xFF`o,\xC8\xFF\xFF\xFF\xFFh}\xF7\xC8\xFF\xFF\xFF\xFF@\x9A\xDA\xD2\xFF\xFF\xFF\xFF\xE0\xFD\x18\t\0\0\0\0\xE0\xA5\xAC\t\0\0\0\0`\xA5\xEF\n\0\0\0\0\xE0\xFC\x9E\x0B\0\0\0\0\xE0\xC1\xD8\x0C\0\0\0\0\xE0\xDE~\r\0\0\0\0\xE0\xA3\xB8\x0E\0\0\0\0\xE0\xC0^\x0F\0\0\0\0\xE0\x85\x98\x10\0\0\0\0\xE0\xA2>\x11\0\0\0\0\xE0gx\x12\0\0\0\0\xE0\x84\x1E\x13\0\0\0\0\xE0IX\x14\0\0\0\0\xE0f\xFE\x14\0\0\0\0\xE0+8\x16\0\0\0\0`\x83\xE7\x16\0\0\0\0`H!\x18\0\0\0\0`e\xC7\x18\0\0\0\0`*\x01\x1A\0\0\0\0`G\xA7\x1A\0\0\0\0`\x0C\xE1\x1B\0\0\0\0`)\x87\x1C\0\0\0\0`\xEE\xC0\x1D\0\0\0\0`\x0Bg\x1E\0\0\0\0`\xD0\xA0\x1F\0\0\0\0`\xEDF \0\0\0\0`\xB2\x80!\0\0\0\0\xE0\t0\"\0\0\0\0\xE0\xCEi#\0\0\0\0\xE0\xEB\x0F$\0\0\0\0`\x01.%\0\0\0\0\xE0B\x02&\0\0\0\0`\xE3\r'\0\0\0\0\xE0$\xE2'\0\0\0\0`\xC5\xED(\0\0\0\0\xE0\x06\xC2)\0\0\0\0`\xA7\xCD*\0\0\0\0`#\xAB+\0\0\0\0`\x89\xAD,\0\0\0\0`\x05\x8B-\0\0\0\0`k\x8D.\0\0\0\0`\xE7j/\0\0\0\0`Mm0\0\0\0\0`\xC9J1\0\0\0\0\xE0iV2\0\0\0\0`\xAB*3\0\0\0\0\xE0K64\0\0\0\0`\x8D\n5\0\0\0\0\xE0-\x166\0\0\0\0\xE0\xA9\xF36\0\0\0\0\xE0\x0F\xF67\0\0\0\0\xE0\x8B\xD38\0\0\0\0\xE0\xF1\xD59\0\0\0\0\xE0m\xB3:\0\0\0\0`\x0E\xBF;\0\0\0\0\xE0O\x93<\0\0\0\0`\xF0\x9E=\0\0\0\0\xE01s>\0\0\0\0`\xD2~?\0\0\0\0`N\\@\0\0\0\0`\xB4^A\0\0\0\0`0C\0\0\0\0`\x12\x1CD\0\0\0\0`x\x1EE\0\0\0\0`\xF4\xFBE\0\0\0\0`Z\xFEF\0\0\0\0\xE0\x85\xF7G\0\0\0\0`<\xDEH\0\0\0\0\x01\x02\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\x03\x04\x05\xD8\xA3\0\0\0\0\0\0\xB8\xA1\0\0\0\0\0\0\xC8\xAF\0\0\0\0\0\0\xC0\xA8\0\0\0\0\0\0\xC0\xA8\0\0\0\0\0\0\xD0\xB6\0\0\0\0\0\0+11\0\0\xB0\x9A\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0(\0-\0(R\xB6V\xFF\xFF\xFF\xFF\x90\xA4\xEDr\xFF\xFF\xFF\xFF`6C\xCC\xFF\xFF\xFF\xFF\xF0l+\xD2\xFF\xFF\xFF\xFF\x80\xD7\x9ET\0\0\0\0\x01\x02\x03\x02\x04\xD8\x91\0\0\0\0\0\0\xF0\x89\0\0\0\0\0\0\xA0\x8C\0\0\0\0\0\0\x90~\0\0\0\0\0\0\xB0\x9A\0\0\0\0\0\0+1245L\xB3\0\0\0\0\0\0\x01+1345\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\t\x05\0\xBC4\0\0\0\0\0\0\x02\0\0\0\x01\x04\x01\0\xAC&\0\0\0\0\0\08\x02\x7F\x02\x84D\xB7A\xFF\xFF\xFF\xFF\xBC\x96\xDA\xD2\xFF\xFF\xFF\xFF\xE0\xFD\x18\t\0\0\0\0\xE0\xA5\xAC\t\0\0\0\0`\xA5\xEF\n\0\0\0\0\xE0\xFC\x9E\x0B\0\0\0\0\xE0\xC1\xD8\x0C\0\0\0\0\xE0\xDE~\r\0\0\0\0\xE0\xA3\xB8\x0E\0\0\0\0\xE0\xC0^\x0F\0\0\0\0\xE0\x85\x98\x10\0\0\0\0\xE0\xA2>\x11\0\0\0\0\xE0gx\x12\0\0\0\0\xE0\x84\x1E\x13\0\0\0\0\xE0IX\x14\0\0\0\0\xE0f\xFE\x14\0\0\0\0\xE0+8\x16\0\0\0\0`\x83\xE7\x16\0\0\0\0`H!\x18\0\0\0\0`e\xC7\x18\0\0\0\0`*\x01\x1A\0\0\0\0`G\xA7\x1A\0\0\0\0`\x0C\xE1\x1B\0\0\0\0`)\x87\x1C\0\0\0\0`\xEE\xC0\x1D\0\0\0\0`\x0Bg\x1E\0\0\0\0`\xD0\xA0\x1F\0\0\0\0`\xEDF \0\0\0\0`\xB2\x80!\0\0\0\0\xE0\t0\"\0\0\0\0\xE0\xCEi#\0\0\0\0\xE0\xEB\x0F$\0\0\0\0`\x01.%\0\0\0\0\xE0B\x02&\0\0\0\0`\xE3\r'\0\0\0\0\xE0$\xE2'\0\0\0\0`\xC5\xED(\0\0\0\0\xE0\x06\xC2)\0\0\0\0`\xA7\xCD*\0\0\0\0`#\xAB+\0\0\0\0`\x89\xAD,\0\0\0\0`\x05\x8B-\0\0\0\0`k\x8D.\0\0\0\0`\xE7j/\0\0\0\0`Mm0\0\0\0\0`\xC9J1\0\0\0\0\xE0iV2\0\0\0\0`\xAB*3\0\0\0\0\xE0K64\0\0\0\0`\x8D\n5\0\0\0\0\xE0-\x166\0\0\0\0\xE0\xA9\xF36\0\0\0\0\xE0\x0F\xF67\0\0\0\0\xE0\x8B\xD38\0\0\0\0\xE0\xF1\xD59\0\0\0\0\xE0m\xB3:\0\0\0\0`\x0E\xBF;\0\0\0\0\xE0O\x93<\0\0\0\0`\xF0\x9E=\0\0\0\0\xE01s>\0\0\0\0`\xD2~?\0\0\0\0`N\\@\0\0\0\0`\xB4^A\0\0\0\0`0C\0\0\0\0`\x12\x1CD\0\0\0\0`x\x1EE\0\0\0\0`\xF4\xFBE\0\0\0\0`Z\xFEF\0\0\0\0\xE0\x85\xF7G\0\0\0\0`<\xDEH\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\xFC\xAB\0\0\0\0\0\0D\xAC\0\0\0\0\0\0L\xB3\0\0\0\0\0\0\\\xC1\0\0\0\0\0\0-06\0\0\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\x01-05\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\t\x01\0\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFF\x02\0\0\0\x01\x04\x01\0\xE0\xE3\xFF\xFF\xFF\xFF\xFF\xFFx\x03\x10\x04\x08B\x87i\xFF\xFF\xFF\xFF\x88@\xC7\xB9\xFF\xFF\xFF\xFF@<\xD1\xFD\xFF\xFF\xFF\xFF\xB0\xFA\x92\xFE\xFF\xFF\xFF\xFF\xC0\xCD\xCC\xFF\xFF\xFF\xFF\xFF\xB0\xDCr\0\0\0\0\0\xC0Pu\x01\0\0\0\0\xB0I@\x02\0\0\0\0\xC02U\x03\0\0\0\0\xB0+ \x04\0\0\0\0@O>\x05\0\0\0\0\xB0\r\0\x06\0\0\0\0@\xBC\x0B\x07\0\0\0\0\xB0\xEF\xDF\x07\0\0\0\0@\x13\xFE\x08\0\0\0\0\xB0\xD1\xBF\t\0\0\0\0@\xF5\xDD\n\0\0\0\x000\xEE\xA8\x0B\0\0\0\0@\xD7\xBD\x0C\0\0\0\x000\xD0\x88\r\0\0\0\0@\xB9\x9D\x0E\0\0\0\x000\xB2h\x0F\0\0\0\0\xC0\xD5\x86\x10\0\0\0\x000\x94H\x11\0\0\0\0\xC0\xB7f\x12\0\0\0\x000v(\x13\0\0\0\0\xC0\x99F\x14\0\0\0\0\xB0\x92\x11\x15\0\0\0\0\xC0{&\x16\0\0\0\0\xB0t\xF1\x16\0\0\0\0\xC0]\x06\x18\0\0\0\0\xB0V\xD1\x18\0\0\0\0\xC0?\xE6\x19\0\0\0\0\xB08\xB1\x1A\0\0\0\0@\\\xCF\x1B\0\0\0\0\xB0\x1A\x91\x1C\0\0\0\0@>\xAF\x1D\0\0\0\0\xB0\xFCp\x1E\0\0\0\0@ \x8F\x1F\0\0\0\x000\x03\x7F \0\0\0\0@\x02o!\0\0\0\x000\xFB9\"\0\0\0\0@\xE4N#\0\0\0\x000\xDD\x19$\0\0\0\0\xC0\08%\0\0\0\x000\xBF\xF9%\0\0\0\0\xC0\xF8\xF2&\0\0\0\x000\xA1\xD9'\0\0\0\0\xC0\xC4\xF7(\0\0\0\0\xB0\xBD\xC2)\0\0\0\0\xC0\xA6\xD7*\0\0\0\0\xB0\x9F\xA2+\0\0\0\0\xC0\x88\xB7,\0\0\0\0\xB0\x81\x82-\0\0\0\0\xC0j\x97.\0\0\0\0\xB0cb/\0\0\0\0@\x87\x800\0\0\0\0\xB0EB1\0\0\0\0@i`2\0\0\0\x000\xD7=3\0\0\0\0@K@4\0\0\0\x000D\x0B5\0\0\0\0@\xB8\r6\0\0\0\0\xB0\xD5\x067\0\0\0\0@\x0F\08\0\0\0\x000\x08\xCB8\0\0\0\0\xC0+\xE99\0\0\0\x000\xEA\xAA:\0\0\0\0\xC0\r\xC9;\0\0\0\x000\xCC\x8A<\0\0\0\0\xC0\xEF\xA8=\0\0\0\x000\xAEj>\0\0\0\0\xC0\xD1\x88?\0\0\0\0\xB0\xCAS@\0\0\0\0\xC0\xB3hA\0\0\0\0\xB0\xAC3B\0\0\0\0\xC0\x95HC\0\0\0\0\xB0\x8E\x13D\0\0\0\0@\xB21E\0\0\0\0\xB0p\xF3E\0\0\0\0@\x94\x11G\0\0\0\x000\x02\xEFG\0\0\0\0@v\xF1H\0\0\0\x000o\xBCI\0\0\0\0@X\xD1J\0\0\0\0\xB0\0\xB8K\0\0\0\0@:\xB1L\0\0\0\x000\x07\xC6M\0\0\0\0\xC0\x82PN\0\0\0\0\xB0\xAE\x9CO\0\0\0\0\xC0\xD9BP\0\0\0\0\xB0\x90|Q\0\0\0\0@\xF6+R\0\0\0\0\xB0r\\S\0\0\0\0@\xD8\x0BT\0\0\0\x000\xE67W\0\0\0\0\xC0\xEC\xAFW\0\0\0\x000\xC8\x17Y\0\0\0\0\xC0\xCE\x8FY\0\0\0\x000\xAA\xF7Z\0\0\0\0\xC0\xB0o[\0\0\0\0\xB0g\xA9\\\0\0\0\0\xC0|t]\0\0\0\0\xB0I\x89^\0\0\0\0\xC0^T_\0\0\0\0\xB0+i`\0\0\0\0\xC0@4a\0\0\0\0\xB0\rIb\0\0\0\0@]\x1Dc\0\0\0\0\xB0\xEF(d\0\0\0\0\xC0\x04\xF4d\0\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04\x02\x03\x04x\x99\xFF\xFF\xFF\xFF\xFF\xFF\x90\x9D\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF+11\0\0\xB0\x9A\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xB0\0\xC6\0\xB4\xC2\xF5\x92\xFF\xFF\xFF\xFF@\x99y\x07\0\0\0\0@\xCC\xFA\x07\0\0\0\0\xD0\xF7\xD2\x19\0\0\0\0\xC0\xDA\xC2\x1A\0\0\0\0\xD0\xD9\xB2\x1B\0\0\0\0\xC0\xBC\xA2\x1C\0\0\0\0P\xF6\x9B\x1D\0\0\0\0\xC0\x9E\x82\x1E\0\0\0\0P\xD8{\x1F\0\0\0\0@\xBBk \0\0\0\0P\xBA[!\0\0\0\0@\x9DK\"\0\0\0\0P\x9C;#\0\0\0\0@\x7F+$\0\0\0\0P~\x1B%\0\0\0\0@a\x0B&\0\0\0\0P`\xFB&\0\0\0\0@C\xEB'\0\0\0\0\xD0|\xE4(\0\0\0\0@Q\x81)\0\0\0\0\xD0H\xE9*\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\xCC\x9D\0\0\0\0\0\0\xB0\x9A\0\0\0\0\0\0\xC0\xA8\0\0\0\0\0\0+13\0\0\xD0\xB6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\0\x12\0\x88U7~\xFF\xFF\xFF\xFF\xB0\x99\xFDN\0\0\0\0\x01\x02x_\xFF\xFF\xFF\xFF\xFF\xFFPe\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xB6\0\0\0\0\0\0+12\0\0\xC0\xA8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\0\xA2\0\xC0\xB1\x13\x9A\xFF\xFF\xFF\xFF\xE0\x17;6\0\0\0\0`\xFA\xD76\0\0\0\0`4$8\0\0\0\0`\xDC\xB78\0\0\0\0\xE0,\x11K\0\0\0\0`\x0F\xAEK\0\0\0\0`\xEA\xC2L\0\0\0\0\xE0ArM\0\0\0\0`\xCC\xA2N\0\0\0\0\xE0\xC4\x1AO\0\0\0\0`\xAE\x82P\0\0\0\0\xE0\xA6\xFAP\0\0\0\0\xE0\xCAkR\0\0\0\0\xD0z\xDAR\0\0\0\0`\xE7TT\0\0\0\0\xE0j\xBAT\0\0\0\0`\xC94V\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\xC0\xA7\0\0\0\0\0\0\xC0\xA8\0\0\0\0\0\0\xD0\xB6\0\0\0\0\0\0-06\0\0\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0%\0\x80L\xA4\xB6\xFF\xFF\xFF\xFFP\xC4\x18\x1E\0\0\0\0\xE0\n\x17+\0\0\0\0P\xF4q+\0\0\0\0\x01\x02\x01\x03\x02\0\xAC\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF\xA0\xAB\xFF\xFF\xFF\xFF\xFF\xFF\xB0\xB9\xFF\xFF\xFF\xFF\xFF\xFF-09\0\0p\x81\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\t\0\x04HP\x94\xFF\xFF\xFF\xFF\x01|\x81\xFF\xFF\xFF\xFF\xFF\xFFp\x81\xFF\xFF\xFF\xFF\xFF\xFF+11\0\0\xB0\x9A\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\t\0\x8C3O\x94\xFF\xFF\xFF\xFF\x01\xF4\x95\0\0\0\0\0\0\xB0\x9A\0\0\0\0\0\0ChST\0\xA0\x8C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xA8\0\xBD\0\xCC\xC5\xE1\x14\xFF\xFF\xFF\xFFL-6~\xFF\xFF\xFF\xFF\xE0\x957\xCB\xFF\xFF\xFF\xFF\xF0\x89.\xD0\xFF\xFF\xFF\xFF\0\xBE7\xEC\xFF\xFF\xFF\xFF\xF0\xF86\xEF\xFF\xFF\xFF\xFF\0\0\x9B\xFB\xFF\xFF\xFF\xFF\x8C'?\xFE\xFF\xFF\xFF\xFF\0\x1E\x01\xFF\xFF\xFF\xFF\xFF\xF0X]\xFF\xFF\xFF\xFF\xFF\0,\x97\0\0\0\0\0puF\x01\0\0\0\0\0\x0Ew\x02\0\0\0\0pW&\x03\0\0\0\0\0\x97p\x07\0\0\0\0\xF0\xD1\xCC\x07\0\0\0\0\0\x91\x08\x0C\0\0\0\0,\x87|\x0C\0\0\0\0\x80\x94\xBF\r\0\0\0\0p\xA3e\x0E\0\0\0\0`^C:\0\0\0\0\x01\x02\x03\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x0246\xFF\xFF\xFF\xFF\xFF\xFF\xB4\x87\0\0\0\0\0\0\xA0\x8C\0\0\0\0\0\0\x90~\0\0\0\0\0\0\xB0\x9A\0\0\0\0\0\0HST\0\0`s\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\08\0?\0\xBEp\xE0t\xFF\xFF\xFF\xFFHC\x05\xBB\xFF\xFF\xFF\xFFXq!\xBB\xFF\xFF\xFF\xFF\xC8=\x89\xCB\xFF\xFF\xFF\xFFp\xF4#\xD2\xFF\xFF\xFF\xFF8Ia\xD2\xFF\xFF\xFF\xFFHs\x8D\xD5\xFF\xFF\xFF\xFF\x01\x02\x01\x02\x02\x01\x03\x02l\xFF\xFF\xFF\xFF\xFF\xFFXl\xFF\xFF\xFF\xFF\xFF\xFFhz\xFF\xFF\xFF\xFF\xFF\xFF`s\xFF\xFF\xFF\xFF\xFF\xFF+13\0\0\xD0\xB6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x18\0\x1B\0\x80\xDB,\xC3\xFF\xFF\xFF\xFF\xC0\x04V\x12\0\0\0\0\xB09\x05/\0\0\0\0\x01\x02\x03\0\0\0\0\0\0\0\0@W\xFF\xFF\xFF\xFF\xFF\xFFPe\xFF\xFF\xFF\xFF\xFF\xFF\xD0\xB6\0\0\0\0\0\0+14\0\0\xE0\xC4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x18\0\x1B\0\x80H7~\xFF\xFF\xFF\xFF\0\xF2U\x12\0\0\0\0\xA0+\x05/\0\0\0\0\x01\x02\x03\x80l\xFF\xFF\xFF\xFF\xFF\xFF\0j\xFF\xFF\xFF\xFF\xFF\xFF`s\xFF\xFF\xFF\xFF\xFF\xFF\xE0\xC4\0\0\0\0\0\0+11\0\0\xB0\x9A\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0H\0Q\0\xB4\xB4\xE1\x14\xFF\xFF\xFF\xFF4\x1C6~\xFF\xFF\xFF\xFF\xD0\x95\x11\x98\xFF\xFF\xFF\xFF\xF0\xF99\xA0\xFF\xFF\xFF\xFF\xD05\xED\xC1\xFF\xFF\xFF\xFF`\n\xEA\xC9\xFF\xFF\xFF\xFF\xF0\x0E\x11\xD2\xFF\xFF\xFF\xFFP\x1B\x86\xFF\xFF\xFF\xFF\xFF@g\x8B6\0\0\0\0\x01\x02\x03\x02\x04\x03\x02\x05\x02LG\xFF\xFF\xFF\xFF\xFF\xFF\xCC\x98\0\0\0\0\0\0\xB0\x9A\0\0\0\0\0\0\x90~\0\0\0\0\0\0\xA0\x8C\0\0\0\0\0\0\xC0\xA8\0\0\0\0\0\0+12\0\0\xC0\xA8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x006\0 \x186~\xFF\xFF\xFF\xFF\xD05\xED\xC1\xFF\xFF\xFF\xFF`\n\xEA\xC9\xFF\xFF\xFF\xFF\xF0\x81F\xCF\xFF\xFF\xFF\xFFP\x1B\x86\xFF\xFF\xFF\xFF\xFF@\x0Ev,\0\0\0\0\x01\x02\x03\x01\x04\x05\xE0\x9C\0\0\0\0\0\0\xB0\x9A\0\0\0\0\0\0\xA0\x8C\0\0\0\0\0\0\x90~\0\0\0\0\0\0@W\xFF\xFF\xFF\xFF\xFF\xFF\xC0\xA8\0\0\0\0\0\0-0930hz\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\t\0HLP\x94\xFF\xFF\xFF\xFF\x018}\xFF\xFF\xFF\xFF\xFF\xFFhz\xFF\xFF\xFF\xFF\xFF\xFF+12\0\0\xC0\xA8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0$\0\x04+\xE7\xA3\xFF\xFF\xFF\xFF\xC8\xE9\x90\xCC\xFF\xFF\xFF\xFF\xF0'C\xD2\xFF\xFF\xFF\xFF\xE8\xA8!\x11\0\0\0\0\x01\x02\x01\x03|\x9C\0\0\0\0\0\0\xB8\xA1\0\0\0\0\0\0\x90~\0\0\0\0\0\0\xC0\xA8\0\0\0\0\0\0-11\0\0Pe\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\0\x12\0Lj\xA1\xDF\xFF\xFF\xFF\xFF`\xB8\xA6\xF5\xFF\xFF\xFF\xFF\x01\x02\xB4`\xFF\xFF\xFF\xFF\xFF\xFF\xA0`\xFF\xFF\xFF\xFF\xFF\xFFPe\xFF\xFF\xFF\xFF\xFF\xFF+11\0\0\xB0\x9A\0\0\0\0\0\0\x01+12\0\0\x10\x0E\0\0\0\0\0\0\x02\0\0\0\x01\n\x01\x000*\0\0\0\0\0\0\x02\0\0\0\x01\x04\x01\0 \x1C\0\0\0\0\0\0(\0-\0\x88\x176~\xFF\xFF\xFF\xFF\x80\xF8A\xDC\xFF\xFF\xFF\xFFh\xCA\x0F\t\0\0\0\0h\xE7\xB5\t\0\0\0\0h\xE6\x0FV\0\0\0\0\x01\x02\x03\x02\x04x\x9D\0\0\0\0\0\0\x80\x9D\0\0\0\0\0\0\xB8\xA1\0\0\0\0\0\0\xC8\xAF\0\0\0\0\0\0\xB0\x9A\0\0\0\0\0\0+11\0\0\xB0\x9A\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\08\0?\0t\xC4\xF5\x92\xFF\xFF\xFF\xFFP\xBA\xE6\x0E\0\0\0\0\xC0\xBBV\x0F\0\0\0\0P\x9C\xC6\x10\0\0\0\0@\xEF7\x11\0\0\0\0\xF0K\xA02\0\0\0\0pD\x183\0\0\0\0\x01\x02\x01\x02\x01\x02\x01\x0C\x9C\0\0\0\0\0\0\xB0\x9A\0\0\0\0\0\0\xC0\xA8\0\0\0\0\0\0SST\0\0Pe\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\0\x12\0\x08\xC8=n\xFF\xFF\xFF\xFF\x08\xFB\x05\x91\xFF\xFF\xFF\xFF\x01\x02x\xB1\0\0\0\0\0\0\xF8_\xFF\xFF\xFF\xFF\xFF\xFFPe\xFF\xFF\xFF\xFF\xFF\xFF+09\0\0\x90~\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\0\x12\0l\xCF\xE1\x14\xFF\xFF\xFF\xFF\xEC66~\xFF\xFF\xFF\xFF\x01\x02\x94,\xFF\xFF\xFF\xFF\xFF\xFF\x14~\0\0\0\0\0\0\x90~\0\0\0\0\0\0-08\0\0\x80\x8F\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\0\x12\0\xF4.7~\xFF\xFF\xFF\xFF\x08BD5\0\0\0\0\x01\x02\x0C\x86\xFF\xFF\xFF\xFF\xFF\xFFx\x88\xFF\xFF\xFF\xFF\xFF\xFF\x80\x8F\xFF\xFF\xFF\xFF\xFF\xFF+10\0\0\xA0\x8C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\0\x12\0\x08Z\xB6V\xFF\xFF\xFF\xFF\x90\xA4\xEDr\xFF\xFF\xFF\xFF\x01\x02\xF8\x89\0\0\0\0\0\0\xF0\x89\0\0\0\0\0\0\xA0\x8C\0\0\0\0\0\0-10\0\0`s\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0(\0-\0\xC8\xDCL|\xFF\xFF\xFF\xFF\xC8`\xA1\xDF\xFF\xFF\xFF\xFF(\x1B\xAC\x10\0\0\0\0\x18\xB5?\x11\0\0\0\0 \x81y\x12\0\0\0\0\x01\x02\x03\x04\x03\xB8\xBB\0\0\0\0\0\08j\xFF\xFF\xFF\xFF\xFF\xFFXl\xFF\xFF\xFF\xFF\xFF\xFFhz\xFF\xFF\xFF\xFF\xFF\xFF`s\xFF\xFF\xFF\xFF\xFF\xFF-10\0\0`s\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\t\0\xB8UP\x94\xFF\xFF\xFF\xFF\x01\xC8s\xFF\xFF\xFF\xFF\xFF\xFF`s\xFF\xFF\xFF\xFF\xFF\xFF+12\0\0\xC0\xA8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\t\0\xCC\x126~\xFF\xFF\xFF\xFF\x014\xA2\0\0\0\0\0\0\xC0\xA8\0\0\0\0\0\0+13\0\0\xD0\xB6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0P\0Z\0@\x9CE\xD2\xFF\xFF\xFF\xFF\x10\xE0\x11\xEF\xFF\xFF\xFF\xFF\xD0G\xFB7\0\0\0\0\xD0}\xD38\0\0\0\0P\x08\x04:\0\0\0\0@\xB8r:\0\0\0\0P\xEA\xE3;\0\0\0\0@\x9AR<\0\0\0\0\xD0\xD7\x1DX\0\0\0\0\xD0 zX\0\0\0\0\x01\x02\x03\x02\x03\x02\x03\x02\x03\x02@\xAD\0\0\0\0\0\0p\xAD\0\0\0\0\0\0\xD0\xB6\0\0\0\0\0\0\xE0\xC4\0\0\0\0\0\0") + }, }; + }; +} diff --git a/deps/temporal/provider/src/data/debug/iana_normalizer.json b/deps/temporal/provider/src/data/debug/iana_normalizer.json new file mode 100644 index 00000000000000..b898f3339ada83 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/iana_normalizer.json @@ -0,0 +1,2235 @@ +{ + "version": "2025b", + "available_id_index": { + "africa/abidjan": 0, + "africa/accra": 1, + "africa/addis_ababa": 2, + "africa/algiers": 3, + "africa/asmara": 4, + "africa/asmera": 5, + "africa/bamako": 6, + "africa/bangui": 7, + "africa/banjul": 8, + "africa/bissau": 9, + "africa/blantyre": 10, + "africa/brazzaville": 11, + "africa/bujumbura": 12, + "africa/cairo": 13, + "africa/casablanca": 14, + "africa/ceuta": 15, + "africa/conakry": 16, + "africa/dakar": 17, + "africa/dar_es_salaam": 18, + "africa/djibouti": 19, + "africa/douala": 20, + "africa/el_aaiun": 21, + "africa/freetown": 22, + "africa/gaborone": 23, + "africa/harare": 24, + "africa/johannesburg": 25, + "africa/juba": 26, + "africa/kampala": 27, + "africa/khartoum": 28, + "africa/kigali": 29, + "africa/kinshasa": 30, + "africa/lagos": 31, + "africa/libreville": 32, + "africa/lome": 33, + "africa/luanda": 34, + "africa/lubumbashi": 35, + "africa/lusaka": 36, + "africa/malabo": 37, + "africa/maputo": 38, + "africa/maseru": 39, + "africa/mbabane": 40, + "africa/mogadishu": 41, + "africa/monrovia": 42, + "africa/nairobi": 43, + "africa/ndjamena": 44, + "africa/niamey": 45, + "africa/nouakchott": 46, + "africa/ouagadougou": 47, + "africa/porto-novo": 48, + "africa/sao_tome": 49, + "africa/timbuktu": 50, + "africa/tripoli": 51, + "africa/tunis": 52, + "africa/windhoek": 53, + "america/adak": 54, + "america/anchorage": 55, + "america/anguilla": 56, + "america/antigua": 57, + "america/araguaina": 58, + "america/argentina/buenos_aires": 59, + "america/argentina/catamarca": 60, + "america/argentina/comodrivadavia": 61, + "america/argentina/cordoba": 62, + "america/argentina/jujuy": 63, + "america/argentina/la_rioja": 64, + "america/argentina/mendoza": 65, + "america/argentina/rio_gallegos": 66, + "america/argentina/salta": 67, + "america/argentina/san_juan": 68, + "america/argentina/san_luis": 69, + "america/argentina/tucuman": 70, + "america/argentina/ushuaia": 71, + "america/aruba": 72, + "america/asuncion": 73, + "america/atikokan": 74, + "america/atka": 75, + "america/bahia": 76, + "america/bahia_banderas": 77, + "america/barbados": 78, + "america/belem": 79, + "america/belize": 80, + "america/blanc-sablon": 81, + "america/boa_vista": 82, + "america/bogota": 83, + "america/boise": 84, + "america/buenos_aires": 85, + "america/cambridge_bay": 86, + "america/campo_grande": 87, + "america/cancun": 88, + "america/caracas": 89, + "america/catamarca": 90, + "america/cayenne": 91, + "america/cayman": 92, + "america/chicago": 93, + "america/chihuahua": 94, + "america/ciudad_juarez": 95, + "america/coral_harbour": 96, + "america/cordoba": 97, + "america/costa_rica": 98, + "america/coyhaique": 99, + "america/creston": 100, + "america/cuiaba": 101, + "america/curacao": 102, + "america/danmarkshavn": 103, + "america/dawson": 104, + "america/dawson_creek": 105, + "america/denver": 106, + "america/detroit": 107, + "america/dominica": 108, + "america/edmonton": 109, + "america/eirunepe": 110, + "america/el_salvador": 111, + "america/ensenada": 112, + "america/fort_nelson": 113, + "america/fort_wayne": 114, + "america/fortaleza": 115, + "america/glace_bay": 116, + "america/godthab": 117, + "america/goose_bay": 118, + "america/grand_turk": 119, + "america/grenada": 120, + "america/guadeloupe": 121, + "america/guatemala": 122, + "america/guayaquil": 123, + "america/guyana": 124, + "america/halifax": 125, + "america/havana": 126, + "america/hermosillo": 127, + "america/indiana/indianapolis": 128, + "america/indiana/knox": 129, + "america/indiana/marengo": 130, + "america/indiana/petersburg": 131, + "america/indiana/tell_city": 132, + "america/indiana/vevay": 133, + "america/indiana/vincennes": 134, + "america/indiana/winamac": 135, + "america/indianapolis": 136, + "america/inuvik": 137, + "america/iqaluit": 138, + "america/jamaica": 139, + "america/jujuy": 140, + "america/juneau": 141, + "america/kentucky/louisville": 142, + "america/kentucky/monticello": 143, + "america/knox_in": 144, + "america/kralendijk": 145, + "america/la_paz": 146, + "america/lima": 147, + "america/los_angeles": 148, + "america/louisville": 149, + "america/lower_princes": 150, + "america/maceio": 151, + "america/managua": 152, + "america/manaus": 153, + "america/marigot": 154, + "america/martinique": 155, + "america/matamoros": 156, + "america/mazatlan": 157, + "america/mendoza": 158, + "america/menominee": 159, + "america/merida": 160, + "america/metlakatla": 161, + "america/mexico_city": 162, + "america/miquelon": 163, + "america/moncton": 164, + "america/monterrey": 165, + "america/montevideo": 166, + "america/montreal": 167, + "america/montserrat": 168, + "america/nassau": 169, + "america/new_york": 170, + "america/nipigon": 171, + "america/nome": 172, + "america/noronha": 173, + "america/north_dakota/beulah": 174, + "america/north_dakota/center": 175, + "america/north_dakota/new_salem": 176, + "america/nuuk": 177, + "america/ojinaga": 178, + "america/panama": 179, + "america/pangnirtung": 180, + "america/paramaribo": 181, + "america/phoenix": 182, + "america/port-au-prince": 183, + "america/port_of_spain": 184, + "america/porto_acre": 185, + "america/porto_velho": 186, + "america/puerto_rico": 187, + "america/punta_arenas": 188, + "america/rainy_river": 189, + "america/rankin_inlet": 190, + "america/recife": 191, + "america/regina": 192, + "america/resolute": 193, + "america/rio_branco": 194, + "america/rosario": 195, + "america/santa_isabel": 196, + "america/santarem": 197, + "america/santiago": 198, + "america/santo_domingo": 199, + "america/sao_paulo": 200, + "america/scoresbysund": 201, + "america/shiprock": 202, + "america/sitka": 203, + "america/st_barthelemy": 204, + "america/st_johns": 205, + "america/st_kitts": 206, + "america/st_lucia": 207, + "america/st_thomas": 208, + "america/st_vincent": 209, + "america/swift_current": 210, + "america/tegucigalpa": 211, + "america/thule": 212, + "america/thunder_bay": 213, + "america/tijuana": 214, + "america/toronto": 215, + "america/tortola": 216, + "america/vancouver": 217, + "america/virgin": 218, + "america/whitehorse": 219, + "america/winnipeg": 220, + "america/yakutat": 221, + "america/yellowknife": 222, + "antarctica/casey": 223, + "antarctica/davis": 224, + "antarctica/dumontdurville": 225, + "antarctica/macquarie": 226, + "antarctica/mawson": 227, + "antarctica/mcmurdo": 228, + "antarctica/palmer": 229, + "antarctica/rothera": 230, + "antarctica/south_pole": 231, + "antarctica/syowa": 232, + "antarctica/troll": 233, + "antarctica/vostok": 234, + "arctic/longyearbyen": 235, + "asia/aden": 236, + "asia/almaty": 237, + "asia/amman": 238, + "asia/anadyr": 239, + "asia/aqtau": 240, + "asia/aqtobe": 241, + "asia/ashgabat": 242, + "asia/ashkhabad": 243, + "asia/atyrau": 244, + "asia/baghdad": 245, + "asia/bahrain": 246, + "asia/baku": 247, + "asia/bangkok": 248, + "asia/barnaul": 249, + "asia/beirut": 250, + "asia/bishkek": 251, + "asia/brunei": 252, + "asia/calcutta": 253, + "asia/chita": 254, + "asia/choibalsan": 255, + "asia/chongqing": 256, + "asia/chungking": 257, + "asia/colombo": 258, + "asia/dacca": 259, + "asia/damascus": 260, + "asia/dhaka": 261, + "asia/dili": 262, + "asia/dubai": 263, + "asia/dushanbe": 264, + "asia/famagusta": 265, + "asia/gaza": 266, + "asia/harbin": 267, + "asia/hebron": 268, + "asia/ho_chi_minh": 269, + "asia/hong_kong": 270, + "asia/hovd": 271, + "asia/irkutsk": 272, + "asia/istanbul": 273, + "asia/jakarta": 274, + "asia/jayapura": 275, + "asia/jerusalem": 276, + "asia/kabul": 277, + "asia/kamchatka": 278, + "asia/karachi": 279, + "asia/kashgar": 280, + "asia/kathmandu": 281, + "asia/katmandu": 282, + "asia/khandyga": 283, + "asia/kolkata": 284, + "asia/krasnoyarsk": 285, + "asia/kuala_lumpur": 286, + "asia/kuching": 287, + "asia/kuwait": 288, + "asia/macao": 289, + "asia/macau": 290, + "asia/magadan": 291, + "asia/makassar": 292, + "asia/manila": 293, + "asia/muscat": 294, + "asia/nicosia": 295, + "asia/novokuznetsk": 296, + "asia/novosibirsk": 297, + "asia/omsk": 298, + "asia/oral": 299, + "asia/phnom_penh": 300, + "asia/pontianak": 301, + "asia/pyongyang": 302, + "asia/qatar": 303, + "asia/qostanay": 304, + "asia/qyzylorda": 305, + "asia/rangoon": 306, + "asia/riyadh": 307, + "asia/saigon": 308, + "asia/sakhalin": 309, + "asia/samarkand": 310, + "asia/seoul": 311, + "asia/shanghai": 312, + "asia/singapore": 313, + "asia/srednekolymsk": 314, + "asia/taipei": 315, + "asia/tashkent": 316, + "asia/tbilisi": 317, + "asia/tehran": 318, + "asia/tel_aviv": 319, + "asia/thimbu": 320, + "asia/thimphu": 321, + "asia/tokyo": 322, + "asia/tomsk": 323, + "asia/ujung_pandang": 324, + "asia/ulaanbaatar": 325, + "asia/ulan_bator": 326, + "asia/urumqi": 327, + "asia/ust-nera": 328, + "asia/vientiane": 329, + "asia/vladivostok": 330, + "asia/yakutsk": 331, + "asia/yangon": 332, + "asia/yekaterinburg": 333, + "asia/yerevan": 334, + "atlantic/azores": 335, + "atlantic/bermuda": 336, + "atlantic/canary": 337, + "atlantic/cape_verde": 338, + "atlantic/faeroe": 339, + "atlantic/faroe": 340, + "atlantic/jan_mayen": 341, + "atlantic/madeira": 342, + "atlantic/reykjavik": 343, + "atlantic/south_georgia": 344, + "atlantic/st_helena": 345, + "atlantic/stanley": 346, + "australia/act": 347, + "australia/adelaide": 348, + "australia/brisbane": 349, + "australia/broken_hill": 350, + "australia/canberra": 351, + "australia/currie": 352, + "australia/darwin": 353, + "australia/eucla": 354, + "australia/hobart": 355, + "australia/lhi": 356, + "australia/lindeman": 357, + "australia/lord_howe": 358, + "australia/melbourne": 359, + "australia/north": 361, + "australia/nsw": 360, + "australia/perth": 362, + "australia/queensland": 363, + "australia/south": 364, + "australia/sydney": 365, + "australia/tasmania": 366, + "australia/victoria": 367, + "australia/west": 368, + "australia/yancowinna": 369, + "brazil/acre": 370, + "brazil/denoronha": 371, + "brazil/east": 372, + "brazil/west": 373, + "canada/atlantic": 376, + "canada/central": 377, + "canada/eastern": 378, + "canada/mountain": 379, + "canada/newfoundland": 380, + "canada/pacific": 381, + "canada/saskatchewan": 382, + "canada/yukon": 383, + "cet": 374, + "chile/continental": 384, + "chile/easterisland": 385, + "cst6cdt": 375, + "cuba": 386, + "eet": 387, + "egypt": 390, + "eire": 391, + "est": 388, + "est5edt": 389, + "etc/gmt": 392, + "etc/gmt+0": 393, + "etc/gmt+1": 394, + "etc/gmt+10": 395, + "etc/gmt+11": 396, + "etc/gmt+12": 397, + "etc/gmt+2": 398, + "etc/gmt+3": 399, + "etc/gmt+4": 400, + "etc/gmt+5": 401, + "etc/gmt+6": 402, + "etc/gmt+7": 403, + "etc/gmt+8": 404, + "etc/gmt+9": 405, + "etc/gmt-0": 406, + "etc/gmt-1": 407, + "etc/gmt-10": 408, + "etc/gmt-11": 409, + "etc/gmt-12": 410, + "etc/gmt-13": 411, + "etc/gmt-14": 412, + "etc/gmt-2": 413, + "etc/gmt-3": 414, + "etc/gmt-4": 415, + "etc/gmt-5": 416, + "etc/gmt-6": 417, + "etc/gmt-7": 418, + "etc/gmt-8": 419, + "etc/gmt-9": 420, + "etc/gmt0": 421, + "etc/greenwich": 422, + "etc/uct": 423, + "etc/universal": 425, + "etc/utc": 424, + "etc/zulu": 426, + "europe/amsterdam": 427, + "europe/andorra": 428, + "europe/astrakhan": 429, + "europe/athens": 430, + "europe/belfast": 431, + "europe/belgrade": 432, + "europe/berlin": 433, + "europe/bratislava": 434, + "europe/brussels": 435, + "europe/bucharest": 436, + "europe/budapest": 437, + "europe/busingen": 438, + "europe/chisinau": 439, + "europe/copenhagen": 440, + "europe/dublin": 441, + "europe/gibraltar": 442, + "europe/guernsey": 443, + "europe/helsinki": 444, + "europe/isle_of_man": 445, + "europe/istanbul": 446, + "europe/jersey": 447, + "europe/kaliningrad": 448, + "europe/kiev": 449, + "europe/kirov": 450, + "europe/kyiv": 451, + "europe/lisbon": 452, + "europe/ljubljana": 453, + "europe/london": 454, + "europe/luxembourg": 455, + "europe/madrid": 456, + "europe/malta": 457, + "europe/mariehamn": 458, + "europe/minsk": 459, + "europe/monaco": 460, + "europe/moscow": 461, + "europe/nicosia": 462, + "europe/oslo": 463, + "europe/paris": 464, + "europe/podgorica": 465, + "europe/prague": 466, + "europe/riga": 467, + "europe/rome": 468, + "europe/samara": 469, + "europe/san_marino": 470, + "europe/sarajevo": 471, + "europe/saratov": 472, + "europe/simferopol": 473, + "europe/skopje": 474, + "europe/sofia": 475, + "europe/stockholm": 476, + "europe/tallinn": 477, + "europe/tirane": 478, + "europe/tiraspol": 479, + "europe/ulyanovsk": 480, + "europe/uzhgorod": 481, + "europe/vaduz": 482, + "europe/vatican": 483, + "europe/vienna": 484, + "europe/vilnius": 485, + "europe/volgograd": 486, + "europe/warsaw": 487, + "europe/zagreb": 488, + "europe/zaporozhye": 489, + "europe/zurich": 490, + "gb": 491, + "gb-eire": 492, + "gmt": 493, + "gmt+0": 494, + "gmt-0": 495, + "gmt0": 496, + "greenwich": 497, + "hongkong": 499, + "hst": 498, + "iceland": 500, + "indian/antananarivo": 501, + "indian/chagos": 502, + "indian/christmas": 503, + "indian/cocos": 504, + "indian/comoro": 505, + "indian/kerguelen": 506, + "indian/mahe": 507, + "indian/maldives": 508, + "indian/mauritius": 509, + "indian/mayotte": 510, + "indian/reunion": 511, + "iran": 512, + "israel": 513, + "jamaica": 514, + "japan": 515, + "kwajalein": 516, + "libya": 517, + "met": 518, + "mexico/bajanorte": 521, + "mexico/bajasur": 522, + "mexico/general": 523, + "mst": 519, + "mst7mdt": 520, + "navajo": 526, + "nz": 524, + "nz-chat": 525, + "pacific/apia": 529, + "pacific/auckland": 530, + "pacific/bougainville": 531, + "pacific/chatham": 532, + "pacific/chuuk": 533, + "pacific/easter": 534, + "pacific/efate": 535, + "pacific/enderbury": 536, + "pacific/fakaofo": 537, + "pacific/fiji": 538, + "pacific/funafuti": 539, + "pacific/galapagos": 540, + "pacific/gambier": 541, + "pacific/guadalcanal": 542, + "pacific/guam": 543, + "pacific/honolulu": 544, + "pacific/johnston": 545, + "pacific/kanton": 546, + "pacific/kiritimati": 547, + "pacific/kosrae": 548, + "pacific/kwajalein": 549, + "pacific/majuro": 550, + "pacific/marquesas": 551, + "pacific/midway": 552, + "pacific/nauru": 553, + "pacific/niue": 554, + "pacific/norfolk": 555, + "pacific/noumea": 556, + "pacific/pago_pago": 557, + "pacific/palau": 558, + "pacific/pitcairn": 559, + "pacific/pohnpei": 560, + "pacific/ponape": 561, + "pacific/port_moresby": 562, + "pacific/rarotonga": 563, + "pacific/saipan": 564, + "pacific/samoa": 565, + "pacific/tahiti": 566, + "pacific/tarawa": 567, + "pacific/tongatapu": 568, + "pacific/truk": 569, + "pacific/wake": 570, + "pacific/wallis": 571, + "pacific/yap": 572, + "poland": 573, + "portugal": 574, + "prc": 527, + "pst8pdt": 528, + "roc": 575, + "rok": 576, + "singapore": 577, + "turkey": 578, + "uct": 579, + "universal": 593, + "us/alaska": 580, + "us/aleutian": 581, + "us/arizona": 582, + "us/central": 583, + "us/east-indiana": 584, + "us/eastern": 585, + "us/hawaii": 586, + "us/indiana-starke": 587, + "us/michigan": 588, + "us/mountain": 589, + "us/pacific": 590, + "us/samoa": 591, + "utc": 592, + "w-su": 594, + "wet": 595, + "zulu": 596 + }, + "non_canonical_identifiers": [ + [ + 1, + 0 + ], + [ + 2, + 43 + ], + [ + 4, + 43 + ], + [ + 5, + 43 + ], + [ + 6, + 0 + ], + [ + 7, + 31 + ], + [ + 8, + 0 + ], + [ + 10, + 38 + ], + [ + 11, + 31 + ], + [ + 12, + 38 + ], + [ + 16, + 0 + ], + [ + 17, + 0 + ], + [ + 18, + 43 + ], + [ + 19, + 43 + ], + [ + 20, + 31 + ], + [ + 22, + 0 + ], + [ + 23, + 38 + ], + [ + 24, + 38 + ], + [ + 27, + 43 + ], + [ + 29, + 38 + ], + [ + 30, + 31 + ], + [ + 32, + 31 + ], + [ + 33, + 0 + ], + [ + 34, + 31 + ], + [ + 35, + 38 + ], + [ + 36, + 38 + ], + [ + 37, + 31 + ], + [ + 39, + 25 + ], + [ + 40, + 25 + ], + [ + 41, + 43 + ], + [ + 45, + 31 + ], + [ + 46, + 0 + ], + [ + 47, + 0 + ], + [ + 48, + 31 + ], + [ + 50, + 0 + ], + [ + 56, + 187 + ], + [ + 57, + 187 + ], + [ + 61, + 60 + ], + [ + 72, + 187 + ], + [ + 74, + 179 + ], + [ + 75, + 54 + ], + [ + 81, + 187 + ], + [ + 85, + 59 + ], + [ + 90, + 60 + ], + [ + 92, + 179 + ], + [ + 96, + 179 + ], + [ + 97, + 62 + ], + [ + 100, + 182 + ], + [ + 102, + 187 + ], + [ + 108, + 187 + ], + [ + 112, + 214 + ], + [ + 114, + 128 + ], + [ + 117, + 177 + ], + [ + 120, + 187 + ], + [ + 121, + 187 + ], + [ + 136, + 128 + ], + [ + 140, + 63 + ], + [ + 144, + 129 + ], + [ + 145, + 187 + ], + [ + 149, + 142 + ], + [ + 150, + 187 + ], + [ + 154, + 187 + ], + [ + 158, + 65 + ], + [ + 167, + 215 + ], + [ + 168, + 187 + ], + [ + 169, + 215 + ], + [ + 171, + 215 + ], + [ + 180, + 138 + ], + [ + 184, + 187 + ], + [ + 185, + 194 + ], + [ + 189, + 220 + ], + [ + 195, + 62 + ], + [ + 196, + 214 + ], + [ + 202, + 106 + ], + [ + 204, + 187 + ], + [ + 206, + 187 + ], + [ + 207, + 187 + ], + [ + 208, + 187 + ], + [ + 209, + 187 + ], + [ + 213, + 215 + ], + [ + 216, + 187 + ], + [ + 218, + 187 + ], + [ + 222, + 109 + ], + [ + 225, + 562 + ], + [ + 228, + 530 + ], + [ + 231, + 530 + ], + [ + 232, + 307 + ], + [ + 235, + 433 + ], + [ + 236, + 307 + ], + [ + 243, + 242 + ], + [ + 246, + 303 + ], + [ + 252, + 287 + ], + [ + 253, + 284 + ], + [ + 255, + 325 + ], + [ + 256, + 312 + ], + [ + 257, + 312 + ], + [ + 259, + 261 + ], + [ + 267, + 312 + ], + [ + 273, + 446 + ], + [ + 280, + 327 + ], + [ + 282, + 281 + ], + [ + 286, + 313 + ], + [ + 288, + 307 + ], + [ + 289, + 290 + ], + [ + 294, + 263 + ], + [ + 300, + 248 + ], + [ + 306, + 332 + ], + [ + 308, + 269 + ], + [ + 319, + 276 + ], + [ + 320, + 321 + ], + [ + 324, + 292 + ], + [ + 326, + 325 + ], + [ + 329, + 248 + ], + [ + 339, + 340 + ], + [ + 341, + 433 + ], + [ + 343, + 0 + ], + [ + 345, + 0 + ], + [ + 347, + 365 + ], + [ + 351, + 365 + ], + [ + 352, + 355 + ], + [ + 356, + 358 + ], + [ + 360, + 365 + ], + [ + 361, + 353 + ], + [ + 363, + 349 + ], + [ + 364, + 348 + ], + [ + 366, + 355 + ], + [ + 367, + 359 + ], + [ + 368, + 362 + ], + [ + 369, + 350 + ], + [ + 370, + 194 + ], + [ + 371, + 173 + ], + [ + 372, + 200 + ], + [ + 373, + 153 + ], + [ + 374, + 435 + ], + [ + 375, + 93 + ], + [ + 376, + 125 + ], + [ + 377, + 220 + ], + [ + 378, + 215 + ], + [ + 379, + 109 + ], + [ + 380, + 205 + ], + [ + 381, + 217 + ], + [ + 382, + 192 + ], + [ + 383, + 219 + ], + [ + 384, + 198 + ], + [ + 385, + 534 + ], + [ + 386, + 126 + ], + [ + 387, + 430 + ], + [ + 388, + 179 + ], + [ + 389, + 170 + ], + [ + 390, + 13 + ], + [ + 391, + 441 + ], + [ + 392, + 592 + ], + [ + 393, + 592 + ], + [ + 406, + 592 + ], + [ + 421, + 592 + ], + [ + 422, + 592 + ], + [ + 423, + 592 + ], + [ + 424, + 592 + ], + [ + 425, + 592 + ], + [ + 426, + 592 + ], + [ + 427, + 435 + ], + [ + 431, + 454 + ], + [ + 434, + 466 + ], + [ + 438, + 490 + ], + [ + 440, + 433 + ], + [ + 443, + 454 + ], + [ + 445, + 454 + ], + [ + 447, + 454 + ], + [ + 449, + 451 + ], + [ + 453, + 432 + ], + [ + 455, + 435 + ], + [ + 458, + 444 + ], + [ + 460, + 464 + ], + [ + 462, + 295 + ], + [ + 463, + 433 + ], + [ + 465, + 432 + ], + [ + 470, + 468 + ], + [ + 471, + 432 + ], + [ + 474, + 432 + ], + [ + 476, + 433 + ], + [ + 479, + 439 + ], + [ + 481, + 451 + ], + [ + 482, + 490 + ], + [ + 483, + 468 + ], + [ + 488, + 432 + ], + [ + 489, + 451 + ], + [ + 491, + 454 + ], + [ + 492, + 454 + ], + [ + 493, + 592 + ], + [ + 494, + 592 + ], + [ + 495, + 592 + ], + [ + 496, + 592 + ], + [ + 497, + 592 + ], + [ + 498, + 544 + ], + [ + 499, + 270 + ], + [ + 500, + 0 + ], + [ + 501, + 43 + ], + [ + 503, + 248 + ], + [ + 504, + 332 + ], + [ + 505, + 43 + ], + [ + 506, + 508 + ], + [ + 507, + 263 + ], + [ + 510, + 43 + ], + [ + 511, + 263 + ], + [ + 512, + 318 + ], + [ + 513, + 276 + ], + [ + 514, + 139 + ], + [ + 515, + 322 + ], + [ + 516, + 549 + ], + [ + 517, + 51 + ], + [ + 518, + 435 + ], + [ + 519, + 182 + ], + [ + 520, + 106 + ], + [ + 521, + 214 + ], + [ + 522, + 157 + ], + [ + 523, + 162 + ], + [ + 524, + 530 + ], + [ + 525, + 532 + ], + [ + 526, + 106 + ], + [ + 527, + 312 + ], + [ + 528, + 148 + ], + [ + 533, + 562 + ], + [ + 536, + 546 + ], + [ + 539, + 567 + ], + [ + 545, + 544 + ], + [ + 550, + 567 + ], + [ + 552, + 557 + ], + [ + 560, + 542 + ], + [ + 561, + 542 + ], + [ + 564, + 543 + ], + [ + 565, + 557 + ], + [ + 569, + 562 + ], + [ + 570, + 567 + ], + [ + 571, + 567 + ], + [ + 572, + 562 + ], + [ + 573, + 487 + ], + [ + 574, + 452 + ], + [ + 575, + 315 + ], + [ + 576, + 311 + ], + [ + 577, + 313 + ], + [ + 578, + 446 + ], + [ + 579, + 592 + ], + [ + 580, + 55 + ], + [ + 581, + 54 + ], + [ + 582, + 182 + ], + [ + 583, + 93 + ], + [ + 584, + 128 + ], + [ + 585, + 170 + ], + [ + 586, + 544 + ], + [ + 587, + 129 + ], + [ + 588, + 107 + ], + [ + 589, + 106 + ], + [ + 590, + 148 + ], + [ + 591, + 557 + ], + [ + 593, + 592 + ], + [ + 594, + 461 + ], + [ + 595, + 452 + ], + [ + 596, + 592 + ] + ], + "normalized_identifiers": [ + "Africa/Abidjan", + "Africa/Accra", + "Africa/Addis_Ababa", + "Africa/Algiers", + "Africa/Asmara", + "Africa/Asmera", + "Africa/Bamako", + "Africa/Bangui", + "Africa/Banjul", + "Africa/Bissau", + "Africa/Blantyre", + "Africa/Brazzaville", + "Africa/Bujumbura", + "Africa/Cairo", + "Africa/Casablanca", + "Africa/Ceuta", + "Africa/Conakry", + "Africa/Dakar", + "Africa/Dar_es_Salaam", + "Africa/Djibouti", + "Africa/Douala", + "Africa/El_Aaiun", + "Africa/Freetown", + "Africa/Gaborone", + "Africa/Harare", + "Africa/Johannesburg", + "Africa/Juba", + "Africa/Kampala", + "Africa/Khartoum", + "Africa/Kigali", + "Africa/Kinshasa", + "Africa/Lagos", + "Africa/Libreville", + "Africa/Lome", + "Africa/Luanda", + "Africa/Lubumbashi", + "Africa/Lusaka", + "Africa/Malabo", + "Africa/Maputo", + "Africa/Maseru", + "Africa/Mbabane", + "Africa/Mogadishu", + "Africa/Monrovia", + "Africa/Nairobi", + "Africa/Ndjamena", + "Africa/Niamey", + "Africa/Nouakchott", + "Africa/Ouagadougou", + "Africa/Porto-Novo", + "Africa/Sao_Tome", + "Africa/Timbuktu", + "Africa/Tripoli", + "Africa/Tunis", + "Africa/Windhoek", + "America/Adak", + "America/Anchorage", + "America/Anguilla", + "America/Antigua", + "America/Araguaina", + "America/Argentina/Buenos_Aires", + "America/Argentina/Catamarca", + "America/Argentina/ComodRivadavia", + "America/Argentina/Cordoba", + "America/Argentina/Jujuy", + "America/Argentina/La_Rioja", + "America/Argentina/Mendoza", + "America/Argentina/Rio_Gallegos", + "America/Argentina/Salta", + "America/Argentina/San_Juan", + "America/Argentina/San_Luis", + "America/Argentina/Tucuman", + "America/Argentina/Ushuaia", + "America/Aruba", + "America/Asuncion", + "America/Atikokan", + "America/Atka", + "America/Bahia", + "America/Bahia_Banderas", + "America/Barbados", + "America/Belem", + "America/Belize", + "America/Blanc-Sablon", + "America/Boa_Vista", + "America/Bogota", + "America/Boise", + "America/Buenos_Aires", + "America/Cambridge_Bay", + "America/Campo_Grande", + "America/Cancun", + "America/Caracas", + "America/Catamarca", + "America/Cayenne", + "America/Cayman", + "America/Chicago", + "America/Chihuahua", + "America/Ciudad_Juarez", + "America/Coral_Harbour", + "America/Cordoba", + "America/Costa_Rica", + "America/Coyhaique", + "America/Creston", + "America/Cuiaba", + "America/Curacao", + "America/Danmarkshavn", + "America/Dawson", + "America/Dawson_Creek", + "America/Denver", + "America/Detroit", + "America/Dominica", + "America/Edmonton", + "America/Eirunepe", + "America/El_Salvador", + "America/Ensenada", + "America/Fort_Nelson", + "America/Fort_Wayne", + "America/Fortaleza", + "America/Glace_Bay", + "America/Godthab", + "America/Goose_Bay", + "America/Grand_Turk", + "America/Grenada", + "America/Guadeloupe", + "America/Guatemala", + "America/Guayaquil", + "America/Guyana", + "America/Halifax", + "America/Havana", + "America/Hermosillo", + "America/Indiana/Indianapolis", + "America/Indiana/Knox", + "America/Indiana/Marengo", + "America/Indiana/Petersburg", + "America/Indiana/Tell_City", + "America/Indiana/Vevay", + "America/Indiana/Vincennes", + "America/Indiana/Winamac", + "America/Indianapolis", + "America/Inuvik", + "America/Iqaluit", + "America/Jamaica", + "America/Jujuy", + "America/Juneau", + "America/Kentucky/Louisville", + "America/Kentucky/Monticello", + "America/Knox_IN", + "America/Kralendijk", + "America/La_Paz", + "America/Lima", + "America/Los_Angeles", + "America/Louisville", + "America/Lower_Princes", + "America/Maceio", + "America/Managua", + "America/Manaus", + "America/Marigot", + "America/Martinique", + "America/Matamoros", + "America/Mazatlan", + "America/Mendoza", + "America/Menominee", + "America/Merida", + "America/Metlakatla", + "America/Mexico_City", + "America/Miquelon", + "America/Moncton", + "America/Monterrey", + "America/Montevideo", + "America/Montreal", + "America/Montserrat", + "America/Nassau", + "America/New_York", + "America/Nipigon", + "America/Nome", + "America/Noronha", + "America/North_Dakota/Beulah", + "America/North_Dakota/Center", + "America/North_Dakota/New_Salem", + "America/Nuuk", + "America/Ojinaga", + "America/Panama", + "America/Pangnirtung", + "America/Paramaribo", + "America/Phoenix", + "America/Port-au-Prince", + "America/Port_of_Spain", + "America/Porto_Acre", + "America/Porto_Velho", + "America/Puerto_Rico", + "America/Punta_Arenas", + "America/Rainy_River", + "America/Rankin_Inlet", + "America/Recife", + "America/Regina", + "America/Resolute", + "America/Rio_Branco", + "America/Rosario", + "America/Santa_Isabel", + "America/Santarem", + "America/Santiago", + "America/Santo_Domingo", + "America/Sao_Paulo", + "America/Scoresbysund", + "America/Shiprock", + "America/Sitka", + "America/St_Barthelemy", + "America/St_Johns", + "America/St_Kitts", + "America/St_Lucia", + "America/St_Thomas", + "America/St_Vincent", + "America/Swift_Current", + "America/Tegucigalpa", + "America/Thule", + "America/Thunder_Bay", + "America/Tijuana", + "America/Toronto", + "America/Tortola", + "America/Vancouver", + "America/Virgin", + "America/Whitehorse", + "America/Winnipeg", + "America/Yakutat", + "America/Yellowknife", + "Antarctica/Casey", + "Antarctica/Davis", + "Antarctica/DumontDUrville", + "Antarctica/Macquarie", + "Antarctica/Mawson", + "Antarctica/McMurdo", + "Antarctica/Palmer", + "Antarctica/Rothera", + "Antarctica/South_Pole", + "Antarctica/Syowa", + "Antarctica/Troll", + "Antarctica/Vostok", + "Arctic/Longyearbyen", + "Asia/Aden", + "Asia/Almaty", + "Asia/Amman", + "Asia/Anadyr", + "Asia/Aqtau", + "Asia/Aqtobe", + "Asia/Ashgabat", + "Asia/Ashkhabad", + "Asia/Atyrau", + "Asia/Baghdad", + "Asia/Bahrain", + "Asia/Baku", + "Asia/Bangkok", + "Asia/Barnaul", + "Asia/Beirut", + "Asia/Bishkek", + "Asia/Brunei", + "Asia/Calcutta", + "Asia/Chita", + "Asia/Choibalsan", + "Asia/Chongqing", + "Asia/Chungking", + "Asia/Colombo", + "Asia/Dacca", + "Asia/Damascus", + "Asia/Dhaka", + "Asia/Dili", + "Asia/Dubai", + "Asia/Dushanbe", + "Asia/Famagusta", + "Asia/Gaza", + "Asia/Harbin", + "Asia/Hebron", + "Asia/Ho_Chi_Minh", + "Asia/Hong_Kong", + "Asia/Hovd", + "Asia/Irkutsk", + "Asia/Istanbul", + "Asia/Jakarta", + "Asia/Jayapura", + "Asia/Jerusalem", + "Asia/Kabul", + "Asia/Kamchatka", + "Asia/Karachi", + "Asia/Kashgar", + "Asia/Kathmandu", + "Asia/Katmandu", + "Asia/Khandyga", + "Asia/Kolkata", + "Asia/Krasnoyarsk", + "Asia/Kuala_Lumpur", + "Asia/Kuching", + "Asia/Kuwait", + "Asia/Macao", + "Asia/Macau", + "Asia/Magadan", + "Asia/Makassar", + "Asia/Manila", + "Asia/Muscat", + "Asia/Nicosia", + "Asia/Novokuznetsk", + "Asia/Novosibirsk", + "Asia/Omsk", + "Asia/Oral", + "Asia/Phnom_Penh", + "Asia/Pontianak", + "Asia/Pyongyang", + "Asia/Qatar", + "Asia/Qostanay", + "Asia/Qyzylorda", + "Asia/Rangoon", + "Asia/Riyadh", + "Asia/Saigon", + "Asia/Sakhalin", + "Asia/Samarkand", + "Asia/Seoul", + "Asia/Shanghai", + "Asia/Singapore", + "Asia/Srednekolymsk", + "Asia/Taipei", + "Asia/Tashkent", + "Asia/Tbilisi", + "Asia/Tehran", + "Asia/Tel_Aviv", + "Asia/Thimbu", + "Asia/Thimphu", + "Asia/Tokyo", + "Asia/Tomsk", + "Asia/Ujung_Pandang", + "Asia/Ulaanbaatar", + "Asia/Ulan_Bator", + "Asia/Urumqi", + "Asia/Ust-Nera", + "Asia/Vientiane", + "Asia/Vladivostok", + "Asia/Yakutsk", + "Asia/Yangon", + "Asia/Yekaterinburg", + "Asia/Yerevan", + "Atlantic/Azores", + "Atlantic/Bermuda", + "Atlantic/Canary", + "Atlantic/Cape_Verde", + "Atlantic/Faeroe", + "Atlantic/Faroe", + "Atlantic/Jan_Mayen", + "Atlantic/Madeira", + "Atlantic/Reykjavik", + "Atlantic/South_Georgia", + "Atlantic/St_Helena", + "Atlantic/Stanley", + "Australia/ACT", + "Australia/Adelaide", + "Australia/Brisbane", + "Australia/Broken_Hill", + "Australia/Canberra", + "Australia/Currie", + "Australia/Darwin", + "Australia/Eucla", + "Australia/Hobart", + "Australia/LHI", + "Australia/Lindeman", + "Australia/Lord_Howe", + "Australia/Melbourne", + "Australia/NSW", + "Australia/North", + "Australia/Perth", + "Australia/Queensland", + "Australia/South", + "Australia/Sydney", + "Australia/Tasmania", + "Australia/Victoria", + "Australia/West", + "Australia/Yancowinna", + "Brazil/Acre", + "Brazil/DeNoronha", + "Brazil/East", + "Brazil/West", + "CET", + "CST6CDT", + "Canada/Atlantic", + "Canada/Central", + "Canada/Eastern", + "Canada/Mountain", + "Canada/Newfoundland", + "Canada/Pacific", + "Canada/Saskatchewan", + "Canada/Yukon", + "Chile/Continental", + "Chile/EasterIsland", + "Cuba", + "EET", + "EST", + "EST5EDT", + "Egypt", + "Eire", + "Etc/GMT", + "Etc/GMT+0", + "Etc/GMT+1", + "Etc/GMT+10", + "Etc/GMT+11", + "Etc/GMT+12", + "Etc/GMT+2", + "Etc/GMT+3", + "Etc/GMT+4", + "Etc/GMT+5", + "Etc/GMT+6", + "Etc/GMT+7", + "Etc/GMT+8", + "Etc/GMT+9", + "Etc/GMT-0", + "Etc/GMT-1", + "Etc/GMT-10", + "Etc/GMT-11", + "Etc/GMT-12", + "Etc/GMT-13", + "Etc/GMT-14", + "Etc/GMT-2", + "Etc/GMT-3", + "Etc/GMT-4", + "Etc/GMT-5", + "Etc/GMT-6", + "Etc/GMT-7", + "Etc/GMT-8", + "Etc/GMT-9", + "Etc/GMT0", + "Etc/Greenwich", + "Etc/UCT", + "Etc/UTC", + "Etc/Universal", + "Etc/Zulu", + "Europe/Amsterdam", + "Europe/Andorra", + "Europe/Astrakhan", + "Europe/Athens", + "Europe/Belfast", + "Europe/Belgrade", + "Europe/Berlin", + "Europe/Bratislava", + "Europe/Brussels", + "Europe/Bucharest", + "Europe/Budapest", + "Europe/Busingen", + "Europe/Chisinau", + "Europe/Copenhagen", + "Europe/Dublin", + "Europe/Gibraltar", + "Europe/Guernsey", + "Europe/Helsinki", + "Europe/Isle_of_Man", + "Europe/Istanbul", + "Europe/Jersey", + "Europe/Kaliningrad", + "Europe/Kiev", + "Europe/Kirov", + "Europe/Kyiv", + "Europe/Lisbon", + "Europe/Ljubljana", + "Europe/London", + "Europe/Luxembourg", + "Europe/Madrid", + "Europe/Malta", + "Europe/Mariehamn", + "Europe/Minsk", + "Europe/Monaco", + "Europe/Moscow", + "Europe/Nicosia", + "Europe/Oslo", + "Europe/Paris", + "Europe/Podgorica", + "Europe/Prague", + "Europe/Riga", + "Europe/Rome", + "Europe/Samara", + "Europe/San_Marino", + "Europe/Sarajevo", + "Europe/Saratov", + "Europe/Simferopol", + "Europe/Skopje", + "Europe/Sofia", + "Europe/Stockholm", + "Europe/Tallinn", + "Europe/Tirane", + "Europe/Tiraspol", + "Europe/Ulyanovsk", + "Europe/Uzhgorod", + "Europe/Vaduz", + "Europe/Vatican", + "Europe/Vienna", + "Europe/Vilnius", + "Europe/Volgograd", + "Europe/Warsaw", + "Europe/Zagreb", + "Europe/Zaporozhye", + "Europe/Zurich", + "GB", + "GB-Eire", + "GMT", + "GMT+0", + "GMT-0", + "GMT0", + "Greenwich", + "HST", + "Hongkong", + "Iceland", + "Indian/Antananarivo", + "Indian/Chagos", + "Indian/Christmas", + "Indian/Cocos", + "Indian/Comoro", + "Indian/Kerguelen", + "Indian/Mahe", + "Indian/Maldives", + "Indian/Mauritius", + "Indian/Mayotte", + "Indian/Reunion", + "Iran", + "Israel", + "Jamaica", + "Japan", + "Kwajalein", + "Libya", + "MET", + "MST", + "MST7MDT", + "Mexico/BajaNorte", + "Mexico/BajaSur", + "Mexico/General", + "NZ", + "NZ-CHAT", + "Navajo", + "PRC", + "PST8PDT", + "Pacific/Apia", + "Pacific/Auckland", + "Pacific/Bougainville", + "Pacific/Chatham", + "Pacific/Chuuk", + "Pacific/Easter", + "Pacific/Efate", + "Pacific/Enderbury", + "Pacific/Fakaofo", + "Pacific/Fiji", + "Pacific/Funafuti", + "Pacific/Galapagos", + "Pacific/Gambier", + "Pacific/Guadalcanal", + "Pacific/Guam", + "Pacific/Honolulu", + "Pacific/Johnston", + "Pacific/Kanton", + "Pacific/Kiritimati", + "Pacific/Kosrae", + "Pacific/Kwajalein", + "Pacific/Majuro", + "Pacific/Marquesas", + "Pacific/Midway", + "Pacific/Nauru", + "Pacific/Niue", + "Pacific/Norfolk", + "Pacific/Noumea", + "Pacific/Pago_Pago", + "Pacific/Palau", + "Pacific/Pitcairn", + "Pacific/Pohnpei", + "Pacific/Ponape", + "Pacific/Port_Moresby", + "Pacific/Rarotonga", + "Pacific/Saipan", + "Pacific/Samoa", + "Pacific/Tahiti", + "Pacific/Tarawa", + "Pacific/Tongatapu", + "Pacific/Truk", + "Pacific/Wake", + "Pacific/Wallis", + "Pacific/Yap", + "Poland", + "Portugal", + "ROC", + "ROK", + "Singapore", + "Turkey", + "UCT", + "US/Alaska", + "US/Aleutian", + "US/Arizona", + "US/Central", + "US/East-Indiana", + "US/Eastern", + "US/Hawaii", + "US/Indiana-Starke", + "US/Michigan", + "US/Mountain", + "US/Pacific", + "US/Samoa", + "UTC", + "Universal", + "W-SU", + "WET", + "Zulu" + ] +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/map.json b/deps/temporal/provider/src/data/debug/zoneinfo/map.json new file mode 100644 index 00000000000000..2cc52f05332bcf --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/map.json @@ -0,0 +1,600 @@ +{ + "africa/abidjan": "tzif-fe8583499fe1cbb8-a7cf0ef087069495.json", + "africa/accra": "tzif-fe8583499fe1cbb8-a7cf0ef087069495.json", + "africa/addis_ababa": "tzif-486e9282debc62a3-27805d7d5dee9be4.json", + "africa/algiers": "tzif-df3a174a6f1304b9-f30768cdd2518dd1.json", + "africa/asmara": "tzif-486e9282debc62a3-27805d7d5dee9be4.json", + "africa/asmera": "tzif-486e9282debc62a3-27805d7d5dee9be4.json", + "africa/bamako": "tzif-fe8583499fe1cbb8-a7cf0ef087069495.json", + "africa/bangui": "tzif-aba73c12b2e7f46-a62a02047cf0f8be.json", + "africa/banjul": "tzif-fe8583499fe1cbb8-a7cf0ef087069495.json", + "africa/bissau": "tzif-84569b5d12891e1e-dfbd7173ea59c56d.json", + "africa/blantyre": "tzif-14cdf6863a8e2179-b18612ad8b0eacc7.json", + "africa/brazzaville": "tzif-aba73c12b2e7f46-a62a02047cf0f8be.json", + "africa/bujumbura": "tzif-14cdf6863a8e2179-b18612ad8b0eacc7.json", + "africa/cairo": "tzif-f0d38f589f1464b7-e65390d2a42c7521.json", + "africa/casablanca": "tzif-70c6eef1cba9528e-fa6fd92ebfdcf3ad.json", + "africa/ceuta": "tzif-bd05cebe8eecfa2c-408891f6d5e0c72a.json", + "africa/conakry": "tzif-fe8583499fe1cbb8-a7cf0ef087069495.json", + "africa/dakar": "tzif-fe8583499fe1cbb8-a7cf0ef087069495.json", + "africa/dar_es_salaam": "tzif-486e9282debc62a3-27805d7d5dee9be4.json", + "africa/djibouti": "tzif-486e9282debc62a3-27805d7d5dee9be4.json", + "africa/douala": "tzif-aba73c12b2e7f46-a62a02047cf0f8be.json", + "africa/el_aaiun": "tzif-2b407bee2bf8cbea-39e72d1f00f10d06.json", + "africa/freetown": "tzif-fe8583499fe1cbb8-a7cf0ef087069495.json", + "africa/gaborone": "tzif-14cdf6863a8e2179-b18612ad8b0eacc7.json", + "africa/harare": "tzif-14cdf6863a8e2179-b18612ad8b0eacc7.json", + "africa/johannesburg": "tzif-59d5e08cb19672f5-73d8fe68d8bc0b47.json", + "africa/juba": "tzif-66fc406d3b90ff90-42d7c96cbf80d3ca.json", + "africa/kampala": "tzif-486e9282debc62a3-27805d7d5dee9be4.json", + "africa/khartoum": "tzif-25763d8b26764a7a-5933d51fd56b3fdf.json", + "africa/kigali": "tzif-14cdf6863a8e2179-b18612ad8b0eacc7.json", + "africa/kinshasa": "tzif-aba73c12b2e7f46-a62a02047cf0f8be.json", + "africa/lagos": "tzif-aba73c12b2e7f46-a62a02047cf0f8be.json", + "africa/libreville": "tzif-aba73c12b2e7f46-a62a02047cf0f8be.json", + "africa/lome": "tzif-fe8583499fe1cbb8-a7cf0ef087069495.json", + "africa/luanda": "tzif-aba73c12b2e7f46-a62a02047cf0f8be.json", + "africa/lubumbashi": "tzif-14cdf6863a8e2179-b18612ad8b0eacc7.json", + "africa/lusaka": "tzif-14cdf6863a8e2179-b18612ad8b0eacc7.json", + "africa/malabo": "tzif-aba73c12b2e7f46-a62a02047cf0f8be.json", + "africa/maputo": "tzif-14cdf6863a8e2179-b18612ad8b0eacc7.json", + "africa/maseru": "tzif-59d5e08cb19672f5-73d8fe68d8bc0b47.json", + "africa/mbabane": "tzif-59d5e08cb19672f5-73d8fe68d8bc0b47.json", + "africa/mogadishu": "tzif-486e9282debc62a3-27805d7d5dee9be4.json", + "africa/monrovia": "tzif-f842f34f4c14fee1-6af6c77813d81c95.json", + "africa/nairobi": "tzif-486e9282debc62a3-27805d7d5dee9be4.json", + "africa/ndjamena": "tzif-24b250ef0928a9e9-6530a4ca5485dc31.json", + "africa/niamey": "tzif-aba73c12b2e7f46-a62a02047cf0f8be.json", + "africa/nouakchott": "tzif-fe8583499fe1cbb8-a7cf0ef087069495.json", + "africa/ouagadougou": "tzif-fe8583499fe1cbb8-a7cf0ef087069495.json", + "africa/porto-novo": "tzif-aba73c12b2e7f46-a62a02047cf0f8be.json", + "africa/sao_tome": "tzif-7aa0aebc84b44c67-973b0b87d9034391.json", + "africa/timbuktu": "tzif-fe8583499fe1cbb8-a7cf0ef087069495.json", + "africa/tripoli": "tzif-81a0c2bb7c8a41da-7b4ebb9a4aa49253.json", + "africa/tunis": "tzif-19d0e567d48830e5-20b2a6d45202416.json", + "africa/windhoek": "tzif-99cdd052561a0879-89252b18a95154e3.json", + "america/adak": "tzif-2450804cbdb4245e-fc28955e4978e50d.json", + "america/anchorage": "tzif-d4999f54d6ffa1ff-bdc2dfc5a5de1f94.json", + "america/anguilla": "tzif-7ec2120f35e8ce46-9f313b48e73a78c4.json", + "america/antigua": "tzif-7ec2120f35e8ce46-9f313b48e73a78c4.json", + "america/araguaina": "tzif-75a476630c4f3c06-6cc92a5fc490dfa3.json", + "america/argentina/buenos_aires": "tzif-24bc4f701e560e8f-fbbcb1e6855b01a1.json", + "america/argentina/catamarca": "tzif-a2c4636cb2de823b-69641876de40969.json", + "america/argentina/comodrivadavia": "tzif-a2c4636cb2de823b-69641876de40969.json", + "america/argentina/cordoba": "tzif-83ab6f3e7a54b242-140e172ea09b920.json", + "america/argentina/jujuy": "tzif-c0a7b3c45458ac17-adf27c3e51a11cf6.json", + "america/argentina/la_rioja": "tzif-c7a9617c25e2eb1a-67a9e52b4fa102af.json", + "america/argentina/mendoza": "tzif-fd03910821368f68-fa54b0ea0f2a14a7.json", + "america/argentina/rio_gallegos": "tzif-edc11c9a67454353-7a49fa82cac12758.json", + "america/argentina/salta": "tzif-26ac36da2732c840-dedd53591694d48d.json", + "america/argentina/san_juan": "tzif-f5b99738d99ddd8c-edf53ab20b57f392.json", + "america/argentina/san_luis": "tzif-a3bbf95d113466c0-366de44a51a62cbe.json", + "america/argentina/tucuman": "tzif-715448d734f9507a-f4183ed224275281.json", + "america/argentina/ushuaia": "tzif-380c01b13aae6590-113f60eeecce7355.json", + "america/aruba": "tzif-7ec2120f35e8ce46-9f313b48e73a78c4.json", + "america/asuncion": "tzif-9bd926151a997a3e-9909ffff90c3207.json", + "america/atikokan": "tzif-6fbdbfed85292c81-468d78f0fb8a53ac.json", + "america/atka": "tzif-2450804cbdb4245e-fc28955e4978e50d.json", + "america/bahia": "tzif-a442eead4fdb53a5-264d7185508cac7f.json", + "america/bahia_banderas": "tzif-ef074bbbac9f5764-af06bb8dad04fbb2.json", + "america/barbados": "tzif-5060a985014097b1-2e0f3c6f560795ff.json", + "america/belem": "tzif-93ba37d78a84866e-364c3b71717bb302.json", + "america/belize": "tzif-b9b18c55e2cd4d53-b3d917ee40af164d.json", + "america/blanc-sablon": "tzif-7ec2120f35e8ce46-9f313b48e73a78c4.json", + "america/boa_vista": "tzif-e12ae166d8468131-ee348999c2fd8345.json", + "america/bogota": "tzif-e20ebf54a807fe0e-10ef646904348bbe.json", + "america/boise": "tzif-70408e1d981309b7-da99eb025c30159.json", + "america/buenos_aires": "tzif-24bc4f701e560e8f-fbbcb1e6855b01a1.json", + "america/cambridge_bay": "tzif-3cc8439b3e85f059-8e4f59b418f8888a.json", + "america/campo_grande": "tzif-f677bd8d940386cc-6f4acf146c31eb70.json", + "america/cancun": "tzif-6fbdea510dc8bdff-a0d6c86f83720461.json", + "america/caracas": "tzif-4529e4629acf0366-8106ebfc9606aee2.json", + "america/catamarca": "tzif-a2c4636cb2de823b-69641876de40969.json", + "america/cayenne": "tzif-c3aa55f145295944-50f38632c531aab8.json", + "america/cayman": "tzif-6fbdbfed85292c81-468d78f0fb8a53ac.json", + "america/chicago": "tzif-3a5a827f28d118e9-682e0a2d838b16ae.json", + "america/chihuahua": "tzif-a685965c91f5b79b-e66cc1c813ce5bd6.json", + "america/ciudad_juarez": "tzif-2c1bb7953877feff-4c66e005cbf579fe.json", + "america/coral_harbour": "tzif-6fbdbfed85292c81-468d78f0fb8a53ac.json", + "america/cordoba": "tzif-83ab6f3e7a54b242-140e172ea09b920.json", + "america/costa_rica": "tzif-bdd491f43b0c1c85-6f9616d7048f0cf9.json", + "america/coyhaique": "tzif-eb9179abb91c8435-726489ced5139013.json", + "america/creston": "tzif-a3214de8e358efe8-33b7f8f888f95c0b.json", + "america/cuiaba": "tzif-be9bc4833f21d33b-2a54484e254d46c8.json", + "america/curacao": "tzif-7ec2120f35e8ce46-9f313b48e73a78c4.json", + "america/danmarkshavn": "tzif-7776a42ce751a29e-1629f5ee8a6e924e.json", + "america/dawson": "tzif-1eff85dd787ed3a1-d74f97871f7e97e8.json", + "america/dawson_creek": "tzif-1a285e17b7751f38-aefc034b499da29b.json", + "america/denver": "tzif-50fc3fea132b4f4c-5a5d88ba8de3b7c1.json", + "america/detroit": "tzif-f8baa073f0e62ab0-5c9c06226b1920d5.json", + "america/dominica": "tzif-7ec2120f35e8ce46-9f313b48e73a78c4.json", + "america/edmonton": "tzif-3a6fecb09c143b25-73487cfbfb37a1d6.json", + "america/eirunepe": "tzif-b785c09bc525b515-5fd6146854daeb91.json", + "america/el_salvador": "tzif-425a92f6316d948f-f81669d6e3b37009.json", + "america/ensenada": "tzif-3fc16258c94fd1bd-f5865999bedfb5cb.json", + "america/fort_nelson": "tzif-4891d41993ed3f5f-4d0c2933ef920fb1.json", + "america/fort_wayne": "tzif-754b9e4bdb20aa95-1c5b7a1b811c5ae3.json", + "america/fortaleza": "tzif-3567a65ce3b07b4a-eda38ce2d13af268.json", + "america/glace_bay": "tzif-55bb5ee9b0a529a6-dce97bdbcf437150.json", + "america/godthab": "tzif-5e245c7be541fe52-ac13030bf2bc388c.json", + "america/goose_bay": "tzif-ffd87e4e007fc8e2-442f240405f9b3e2.json", + "america/grand_turk": "tzif-cec2538008230fcd-486e4621268a0834.json", + "america/grenada": "tzif-7ec2120f35e8ce46-9f313b48e73a78c4.json", + "america/guadeloupe": "tzif-7ec2120f35e8ce46-9f313b48e73a78c4.json", + "america/guatemala": "tzif-a187ee64c8fae572-4985eb67780f1dca.json", + "america/guayaquil": "tzif-dd90c0bd2a5d5bcb-4e3fcc5e29cf94e2.json", + "america/guyana": "tzif-38d88ef47726082c-a2b861350ff9abaf.json", + "america/halifax": "tzif-ca31f6cb7d44b091-6a023a6a71d41a7.json", + "america/havana": "tzif-d28e0bb7485a8522-9d5ad01d4999d0c7.json", + "america/hermosillo": "tzif-69530af9af6cd0cb-6e2e37393c7f8e5d.json", + "america/indiana/indianapolis": "tzif-754b9e4bdb20aa95-1c5b7a1b811c5ae3.json", + "america/indiana/knox": "tzif-fc9fd017e19a24e0-530492ba8305e348.json", + "america/indiana/marengo": "tzif-1146d998a660d8a7-7083368cf5416b3.json", + "america/indiana/petersburg": "tzif-26aecc98f9d83045-d767019b239f072.json", + "america/indiana/tell_city": "tzif-bbfc9e9111217c11-69684e27be4c3e38.json", + "america/indiana/vevay": "tzif-be7c1ce9358259b9-87fdd35d13d52495.json", + "america/indiana/vincennes": "tzif-f7b886dc80987d1f-1cfc3c180fd77cd3.json", + "america/indiana/winamac": "tzif-8494d6017f05e49d-6fa1752d1f7aa8c3.json", + "america/indianapolis": "tzif-754b9e4bdb20aa95-1c5b7a1b811c5ae3.json", + "america/inuvik": "tzif-9b4491a5a7233cc3-9416dbeeb6810774.json", + "america/iqaluit": "tzif-1dd142eb22754e92-d3cee37600e3912e.json", + "america/jamaica": "tzif-98fb8731f72daeb6-4585fdc50640db42.json", + "america/jujuy": "tzif-c0a7b3c45458ac17-adf27c3e51a11cf6.json", + "america/juneau": "tzif-8fec2819cc677405-6cfb65330c2f1fa0.json", + "america/kentucky/louisville": "tzif-7599edfd11a3db64-4bf8d694826715ae.json", + "america/kentucky/monticello": "tzif-f87d2aa5dfe5efe9-6f6f56db37ced2fd.json", + "america/knox_in": "tzif-fc9fd017e19a24e0-530492ba8305e348.json", + "america/kralendijk": "tzif-7ec2120f35e8ce46-9f313b48e73a78c4.json", + "america/la_paz": "tzif-66a5515c6139ad2d-8cdcb912670ca415.json", + "america/lima": "tzif-fe6e0efb644eced9-f06be10a091cfb41.json", + "america/los_angeles": "tzif-effb0bd5efab2bad-76ee3ca040667987.json", + "america/louisville": "tzif-7599edfd11a3db64-4bf8d694826715ae.json", + "america/lower_princes": "tzif-7ec2120f35e8ce46-9f313b48e73a78c4.json", + "america/maceio": "tzif-206d649fad594120-70deb0fb976b18e.json", + "america/managua": "tzif-fbccf04b5b2fd7f2-b508b8cbe01e354b.json", + "america/manaus": "tzif-8b129baceef3898a-389e46393fa915f2.json", + "america/marigot": "tzif-7ec2120f35e8ce46-9f313b48e73a78c4.json", + "america/martinique": "tzif-f757031187208623-b42f12ebe4b7bfcb.json", + "america/matamoros": "tzif-be07532f1af7dccb-7a89363e76463570.json", + "america/mazatlan": "tzif-40fb52b19ef81b1d-e1ce3cc4e0a17886.json", + "america/mendoza": "tzif-fd03910821368f68-fa54b0ea0f2a14a7.json", + "america/menominee": "tzif-46dd3b15bf889536-90c51dda0af69c0c.json", + "america/merida": "tzif-3d390ef79718594a-1d54abd9de1f791b.json", + "america/metlakatla": "tzif-5d69c15d2c4f26ae-d843083a2b2d2784.json", + "america/mexico_city": "tzif-95eb641ddc74061f-5a914528a766049d.json", + "america/miquelon": "tzif-ffb42884e83683a9-7d164a9bb116efe3.json", + "america/moncton": "tzif-aa6fbecd6b3089a1-3c3e5535078a0aca.json", + "america/monterrey": "tzif-3234542952508833-776aeadf2e17fcb4.json", + "america/montevideo": "tzif-bda89ec29d33a428-f6c6f1d38129c153.json", + "america/montreal": "tzif-ed29bf9f15004c8a-f6def5db1514383c.json", + "america/montserrat": "tzif-7ec2120f35e8ce46-9f313b48e73a78c4.json", + "america/nassau": "tzif-ed29bf9f15004c8a-f6def5db1514383c.json", + "america/new_york": "tzif-3994d21beae7c7b6-eb145d056159d80.json", + "america/nipigon": "tzif-ed29bf9f15004c8a-f6def5db1514383c.json", + "america/nome": "tzif-480b0a55dd7bf29e-c23b37ed84c4f8f9.json", + "america/noronha": "tzif-c17291eb667fe274-81f01d3c395654a6.json", + "america/north_dakota/beulah": "tzif-f5114ea1ad21a447-657f9c7873c390b2.json", + "america/north_dakota/center": "tzif-c4897a4741bd9e82-aaea1d16ea0a4fb8.json", + "america/north_dakota/new_salem": "tzif-239c7722f428fac8-7a4c4b125895f0bd.json", + "america/nuuk": "tzif-5e245c7be541fe52-ac13030bf2bc388c.json", + "america/ojinaga": "tzif-7ba4aaa7dba09bb0-567af4b250c89d25.json", + "america/panama": "tzif-6fbdbfed85292c81-468d78f0fb8a53ac.json", + "america/pangnirtung": "tzif-1dd142eb22754e92-d3cee37600e3912e.json", + "america/paramaribo": "tzif-2a9b3a635fc27340-e824f8940a7a64f6.json", + "america/phoenix": "tzif-a3214de8e358efe8-33b7f8f888f95c0b.json", + "america/port-au-prince": "tzif-273d77751416ce66-188ad35538918cca.json", + "america/port_of_spain": "tzif-7ec2120f35e8ce46-9f313b48e73a78c4.json", + "america/porto_acre": "tzif-90e0499f7b80422b-16e03eeaaf192844.json", + "america/porto_velho": "tzif-609a1c759abb0f9e-a202ec7708c700d8.json", + "america/puerto_rico": "tzif-7ec2120f35e8ce46-9f313b48e73a78c4.json", + "america/punta_arenas": "tzif-7d7635957a94c158-89410cc4ecfceda2.json", + "america/rainy_river": "tzif-bad7f01dd3f01a92-8ed1d7da904b667d.json", + "america/rankin_inlet": "tzif-12ced9fe919d8b6-35fe81809b640977.json", + "america/recife": "tzif-7481a99701104a1c-da931bd1c7d61a9.json", + "america/regina": "tzif-f61469e5df5071ba-1d93153e2c1ef413.json", + "america/resolute": "tzif-87ef4dab5f3e3941-c43fb003c147a77.json", + "america/rio_branco": "tzif-90e0499f7b80422b-16e03eeaaf192844.json", + "america/rosario": "tzif-83ab6f3e7a54b242-140e172ea09b920.json", + "america/santa_isabel": "tzif-3fc16258c94fd1bd-f5865999bedfb5cb.json", + "america/santarem": "tzif-8e605032c3ce6342-6a27beeec5d94fef.json", + "america/santiago": "tzif-ce802c28d3beb1b-5157362aadd9dd29.json", + "america/santo_domingo": "tzif-ffd87968a303e340-9dec629c1fbdf2dc.json", + "america/sao_paulo": "tzif-dc8ea6d022a7ebec-7bdcff969a6b651c.json", + "america/scoresbysund": "tzif-806417e5a9e6e27a-d183a9f9e82d72df.json", + "america/shiprock": "tzif-50fc3fea132b4f4c-5a5d88ba8de3b7c1.json", + "america/sitka": "tzif-768158f1c3d3089e-e43bac17424df347.json", + "america/st_barthelemy": "tzif-7ec2120f35e8ce46-9f313b48e73a78c4.json", + "america/st_johns": "tzif-916c7f697e6af49e-cd5f0c23c53bde30.json", + "america/st_kitts": "tzif-7ec2120f35e8ce46-9f313b48e73a78c4.json", + "america/st_lucia": "tzif-7ec2120f35e8ce46-9f313b48e73a78c4.json", + "america/st_thomas": "tzif-7ec2120f35e8ce46-9f313b48e73a78c4.json", + "america/st_vincent": "tzif-7ec2120f35e8ce46-9f313b48e73a78c4.json", + "america/swift_current": "tzif-3d5473248adfd22d-72a86f7189e4c492.json", + "america/tegucigalpa": "tzif-e5822ac52a06a527-c5e561a56943464c.json", + "america/thule": "tzif-99ce61a08c1199af-56326eb4ceecfd35.json", + "america/thunder_bay": "tzif-ed29bf9f15004c8a-f6def5db1514383c.json", + "america/tijuana": "tzif-3fc16258c94fd1bd-f5865999bedfb5cb.json", + "america/toronto": "tzif-ed29bf9f15004c8a-f6def5db1514383c.json", + "america/tortola": "tzif-7ec2120f35e8ce46-9f313b48e73a78c4.json", + "america/vancouver": "tzif-43c01a519dcad360-c978a2de09220f3e.json", + "america/virgin": "tzif-7ec2120f35e8ce46-9f313b48e73a78c4.json", + "america/whitehorse": "tzif-87649f3d059a10f2-a8c51b0e84c40a85.json", + "america/winnipeg": "tzif-bad7f01dd3f01a92-8ed1d7da904b667d.json", + "america/yakutat": "tzif-33db81d7f03c072e-e083980d979c0926.json", + "america/yellowknife": "tzif-3a6fecb09c143b25-73487cfbfb37a1d6.json", + "antarctica/casey": "tzif-e65fa49c7674041-51ba19ae72a3c69.json", + "antarctica/davis": "tzif-f2238fc53b0fff96-6f6aee2b55131405.json", + "antarctica/dumontdurville": "tzif-1ede513c242ae08-561006205b46a9e7.json", + "antarctica/macquarie": "tzif-f9736e8dcd3eb5de-9c17b925c6652d48.json", + "antarctica/mawson": "tzif-fd823ec71e5980ce-fb04074f1843d568.json", + "antarctica/mcmurdo": "tzif-1939cc3520b8dae8-a2fd6733973f8da2.json", + "antarctica/palmer": "tzif-f1f0b3541047bfad-8176e7d9a57a1316.json", + "antarctica/rothera": "tzif-dfcaab41c352fc41-836527ef6425759.json", + "antarctica/south_pole": "tzif-1939cc3520b8dae8-a2fd6733973f8da2.json", + "antarctica/syowa": "tzif-f58f911ab743ef1d-f57255d26abdda48.json", + "antarctica/troll": "tzif-e330917831501a06-5b1f8ec8b0ab9c4a.json", + "antarctica/vostok": "tzif-e3d5b2baffd22f2d-4e475abbb4b8264f.json", + "arctic/longyearbyen": "tzif-4a65bbe3253254a1-2a20d46c4d15c0c3.json", + "asia/aden": "tzif-f58f911ab743ef1d-f57255d26abdda48.json", + "asia/almaty": "tzif-a053c1334aeab356-645c110894da15be.json", + "asia/amman": "tzif-748e0c2c22be393e-9159f30a64f07d32.json", + "asia/anadyr": "tzif-d41aa71f743154ff-cd47b010d657ac37.json", + "asia/aqtau": "tzif-f1b7ca6dc4d0b2b0-d827a5cc52d17740.json", + "asia/aqtobe": "tzif-4f0ad1968e2955-b99def3a9c716c7f.json", + "asia/ashgabat": "tzif-f26b875165969e75-9e25992ccdfbaa1f.json", + "asia/ashkhabad": "tzif-f26b875165969e75-9e25992ccdfbaa1f.json", + "asia/atyrau": "tzif-5a8de8f20b18b43-384f712f565d0ab0.json", + "asia/baghdad": "tzif-7241c1457aae4357-3c4783fc5e291a5.json", + "asia/bahrain": "tzif-bdc0a1977c311c8d-87860ab499ecadb8.json", + "asia/baku": "tzif-fef149820a82a100-d2fff4282c3ad1f4.json", + "asia/bangkok": "tzif-2a7fc944a4c2991b-ed19eb01bbf45250.json", + "asia/barnaul": "tzif-ff54b8a04d630c85-302a593cf4d0c55a.json", + "asia/beirut": "tzif-5890af4975eb815-dbcd9d0a6fe5353.json", + "asia/bishkek": "tzif-f229cb4cd552c448-1e8f29f5b7bc6659.json", + "asia/brunei": "tzif-283cf30fce0ee58e-ee056ab931c35019.json", + "asia/calcutta": "tzif-bd9ad03026ed086f-3d5a919e98fa2787.json", + "asia/chita": "tzif-36890fddb7a9031e-81d4ff9e4c89f2e8.json", + "asia/choibalsan": "tzif-cbf2a88472b0862a-de6f37d8951e33ce.json", + "asia/chongqing": "tzif-94731e7a96e16727-b9bdd49f2158b98c.json", + "asia/chungking": "tzif-94731e7a96e16727-b9bdd49f2158b98c.json", + "asia/colombo": "tzif-996739b4c558f747-935dbc63456811c2.json", + "asia/dacca": "tzif-8bf0f826f4c6e05e-9c27d3058e34d93b.json", + "asia/damascus": "tzif-52291e736a34e36b-2ab58b9a9f408e39.json", + "asia/dhaka": "tzif-8bf0f826f4c6e05e-9c27d3058e34d93b.json", + "asia/dili": "tzif-7cca7c8a1af35285-679fdca550b074a0.json", + "asia/dubai": "tzif-7459e3ffacdde5a6-a596288a1fff51a3.json", + "asia/dushanbe": "tzif-7a158f0aed162547-27577cc8813fb4ed.json", + "asia/famagusta": "tzif-74fc38128e80b92d-871756115f3d1b05.json", + "asia/gaza": "tzif-3f61f7ebb7b0f5d7-3b9e017c8df909f8.json", + "asia/harbin": "tzif-94731e7a96e16727-b9bdd49f2158b98c.json", + "asia/hebron": "tzif-cbcf966225780b1c-8a7f4b3e40c1b2d5.json", + "asia/ho_chi_minh": "tzif-c79f46dbe8103377-6f330e5ab7f7dc8e.json", + "asia/hong_kong": "tzif-ea8173f82f8dccac-190f07fa0585582b.json", + "asia/hovd": "tzif-65badfa9c283e8d3-9bc658cd314193fd.json", + "asia/irkutsk": "tzif-6156cfed77f2a26c-d5c8e957d52b5aa1.json", + "asia/istanbul": "tzif-21007d26526b6cee-4c7defff421754b5.json", + "asia/jakarta": "tzif-e271b0f2662b1c04-20e8607792da4ec7.json", + "asia/jayapura": "tzif-b05b7d10c5ffdad-d39eb7f9fe146506.json", + "asia/jerusalem": "tzif-758d7fde6833ba8c-65256d0857a2f636.json", + "asia/kabul": "tzif-cb2104a4192b82ba-ddba0d84d8ea7d92.json", + "asia/kamchatka": "tzif-eafa00d1ad3ada02-ccfdff510d06498a.json", + "asia/karachi": "tzif-fb66f3417dbb2dfe-e13d26a5a5a0ef65.json", + "asia/kashgar": "tzif-79a67056f030a883-f33ddefe3e35e4d0.json", + "asia/kathmandu": "tzif-6d168cde30b3c19-24342dd0af895908.json", + "asia/katmandu": "tzif-6d168cde30b3c19-24342dd0af895908.json", + "asia/khandyga": "tzif-d3201ec4e70c92f3-5814e30a4cc908b9.json", + "asia/kolkata": "tzif-bd9ad03026ed086f-3d5a919e98fa2787.json", + "asia/krasnoyarsk": "tzif-b0c86e4e28bb1810-bccad26ea4f4cee2.json", + "asia/kuala_lumpur": "tzif-fc89b67bba9eff21-ed937c5b2210118e.json", + "asia/kuching": "tzif-283cf30fce0ee58e-ee056ab931c35019.json", + "asia/kuwait": "tzif-f58f911ab743ef1d-f57255d26abdda48.json", + "asia/macao": "tzif-b6ba868b587cad06-6667a264db5d890e.json", + "asia/macau": "tzif-b6ba868b587cad06-6667a264db5d890e.json", + "asia/magadan": "tzif-7be16635ecf890b5-161efc0ab3ac2299.json", + "asia/makassar": "tzif-89cd9f4224d1324a-6ddbd3de8874993f.json", + "asia/manila": "tzif-405b02408f1a7725-3c0ae0a258a25979.json", + "asia/muscat": "tzif-7459e3ffacdde5a6-a596288a1fff51a3.json", + "asia/nicosia": "tzif-37762e44a2edd792-4f1b10d181e56a5d.json", + "asia/novokuznetsk": "tzif-291cff29f8a99dfe-401473cfba65f82d.json", + "asia/novosibirsk": "tzif-98fc8236fccd3576-88ddb973d46096e3.json", + "asia/omsk": "tzif-86245dd795582456-61d8c9f7c4ad177a.json", + "asia/oral": "tzif-4c9c946292d76a04-7fbd1484596ee05e.json", + "asia/phnom_penh": "tzif-2a7fc944a4c2991b-ed19eb01bbf45250.json", + "asia/pontianak": "tzif-cb56ff55ea32bb92-c654a08c059dae2e.json", + "asia/pyongyang": "tzif-6268b48b2e959066-91294d0f7013ba84.json", + "asia/qatar": "tzif-bdc0a1977c311c8d-87860ab499ecadb8.json", + "asia/qostanay": "tzif-b9d3679a03af6191-99d89d33c8fd0b60.json", + "asia/qyzylorda": "tzif-622cbc57a076ea5d-616edf8039af4f62.json", + "asia/rangoon": "tzif-50abe32c287395c8-d2c3aa5882246ab2.json", + "asia/riyadh": "tzif-f58f911ab743ef1d-f57255d26abdda48.json", + "asia/saigon": "tzif-c79f46dbe8103377-6f330e5ab7f7dc8e.json", + "asia/sakhalin": "tzif-9a2f8cce797280e8-37784cc07103f2f3.json", + "asia/samarkand": "tzif-55ec396d83237537-39a492626467027.json", + "asia/seoul": "tzif-b89f6da72122ca01-812d173fdcfeaaa6.json", + "asia/shanghai": "tzif-94731e7a96e16727-b9bdd49f2158b98c.json", + "asia/singapore": "tzif-fc89b67bba9eff21-ed937c5b2210118e.json", + "asia/srednekolymsk": "tzif-843bd4f4a13e936f-e20d11612a15d3e6.json", + "asia/taipei": "tzif-ee42b17151e8d0d1-557c16a705ea23d1.json", + "asia/tashkent": "tzif-c841f0aca0404a73-5f8447c455db7736.json", + "asia/tbilisi": "tzif-4738bf3d72913a1b-ef164d685fcac290.json", + "asia/tehran": "tzif-650685fe5c95ce2a-2f3eb2e60291229d.json", + "asia/tel_aviv": "tzif-758d7fde6833ba8c-65256d0857a2f636.json", + "asia/thimbu": "tzif-762fa57e245bdc0d-c5a018de141b4cb3.json", + "asia/thimphu": "tzif-762fa57e245bdc0d-c5a018de141b4cb3.json", + "asia/tokyo": "tzif-7bce416a66d38e42-b58b08c4c731f7dc.json", + "asia/tomsk": "tzif-4db2cfd1785db9cd-6589edd5db80b603.json", + "asia/ujung_pandang": "tzif-89cd9f4224d1324a-6ddbd3de8874993f.json", + "asia/ulaanbaatar": "tzif-cbf2a88472b0862a-de6f37d8951e33ce.json", + "asia/ulan_bator": "tzif-cbf2a88472b0862a-de6f37d8951e33ce.json", + "asia/urumqi": "tzif-79a67056f030a883-f33ddefe3e35e4d0.json", + "asia/ust-nera": "tzif-8b944106b8f9db7e-1d2f4ecd91296f4.json", + "asia/vientiane": "tzif-2a7fc944a4c2991b-ed19eb01bbf45250.json", + "asia/vladivostok": "tzif-3fd85b535272f921-d61e3c0d217e3de2.json", + "asia/yakutsk": "tzif-3f6ff680ea89333b-f07f1041c6be937.json", + "asia/yangon": "tzif-50abe32c287395c8-d2c3aa5882246ab2.json", + "asia/yekaterinburg": "tzif-849b49f0ce1dac82-89b53710eb7d9371.json", + "asia/yerevan": "tzif-f9878deac6fa797b-63a1fb86a70f62e5.json", + "atlantic/azores": "tzif-c306ac2cd34a373c-ec50d5ecafac2084.json", + "atlantic/bermuda": "tzif-6a52098e032992a5-e1eb00358541c6a0.json", + "atlantic/canary": "tzif-a7b726e2144b8ec3-b273ddcc47da034b.json", + "atlantic/cape_verde": "tzif-55eedcdc6ff1f85-5b27bba1cde1354f.json", + "atlantic/faeroe": "tzif-67d3e39540d85c91-f13f9d0367c68c92.json", + "atlantic/faroe": "tzif-67d3e39540d85c91-f13f9d0367c68c92.json", + "atlantic/jan_mayen": "tzif-4a65bbe3253254a1-2a20d46c4d15c0c3.json", + "atlantic/madeira": "tzif-a44c115ed3d72421-692eaf79ab1934a7.json", + "atlantic/reykjavik": "tzif-fe8583499fe1cbb8-a7cf0ef087069495.json", + "atlantic/south_georgia": "tzif-9d02412abb136ce4-bfde68530f93fb26.json", + "atlantic/st_helena": "tzif-fe8583499fe1cbb8-a7cf0ef087069495.json", + "atlantic/stanley": "tzif-4eaf76405b17e0d3-64c6a9f0471d4ce9.json", + "australia/act": "tzif-ef99169dd5b3d431-ae45f4711dd0d14b.json", + "australia/adelaide": "tzif-cab5fb5bf9e7625f-4aaae2f823b6e6c9.json", + "australia/brisbane": "tzif-44b31bf3438167a2-f26149998b62ea48.json", + "australia/broken_hill": "tzif-9af11812af42f7cb-8d70b106abb9243f.json", + "australia/canberra": "tzif-ef99169dd5b3d431-ae45f4711dd0d14b.json", + "australia/currie": "tzif-9c98c8b92084c36-47e6455e977d6bb3.json", + "australia/darwin": "tzif-794b5729aca99b8f-8dcbb73848fb52db.json", + "australia/eucla": "tzif-2a2176981e284105-59c6fda81a2a226c.json", + "australia/hobart": "tzif-9c98c8b92084c36-47e6455e977d6bb3.json", + "australia/lhi": "tzif-e2789756bce07cca-d7ab71c2384db975.json", + "australia/lindeman": "tzif-eb4384db15894d16-b0aaeb08a0cbe1e0.json", + "australia/lord_howe": "tzif-e2789756bce07cca-d7ab71c2384db975.json", + "australia/melbourne": "tzif-401f78ac94f3eb66-89897df479278829.json", + "australia/north": "tzif-794b5729aca99b8f-8dcbb73848fb52db.json", + "australia/nsw": "tzif-ef99169dd5b3d431-ae45f4711dd0d14b.json", + "australia/perth": "tzif-c595527c9472a8dc-da82dc08bd3d58a0.json", + "australia/queensland": "tzif-44b31bf3438167a2-f26149998b62ea48.json", + "australia/south": "tzif-cab5fb5bf9e7625f-4aaae2f823b6e6c9.json", + "australia/sydney": "tzif-ef99169dd5b3d431-ae45f4711dd0d14b.json", + "australia/tasmania": "tzif-9c98c8b92084c36-47e6455e977d6bb3.json", + "australia/victoria": "tzif-401f78ac94f3eb66-89897df479278829.json", + "australia/west": "tzif-c595527c9472a8dc-da82dc08bd3d58a0.json", + "australia/yancowinna": "tzif-9af11812af42f7cb-8d70b106abb9243f.json", + "brazil/acre": "tzif-90e0499f7b80422b-16e03eeaaf192844.json", + "brazil/denoronha": "tzif-c17291eb667fe274-81f01d3c395654a6.json", + "brazil/east": "tzif-dc8ea6d022a7ebec-7bdcff969a6b651c.json", + "brazil/west": "tzif-8b129baceef3898a-389e46393fa915f2.json", + "canada/atlantic": "tzif-ca31f6cb7d44b091-6a023a6a71d41a7.json", + "canada/central": "tzif-bad7f01dd3f01a92-8ed1d7da904b667d.json", + "canada/eastern": "tzif-ed29bf9f15004c8a-f6def5db1514383c.json", + "canada/mountain": "tzif-3a6fecb09c143b25-73487cfbfb37a1d6.json", + "canada/newfoundland": "tzif-916c7f697e6af49e-cd5f0c23c53bde30.json", + "canada/pacific": "tzif-43c01a519dcad360-c978a2de09220f3e.json", + "canada/saskatchewan": "tzif-f61469e5df5071ba-1d93153e2c1ef413.json", + "canada/yukon": "tzif-87649f3d059a10f2-a8c51b0e84c40a85.json", + "cet": "tzif-6415eb3f74777957-6f718f12281286a3.json", + "chile/continental": "tzif-ce802c28d3beb1b-5157362aadd9dd29.json", + "chile/easterisland": "tzif-daeed2898ecd770c-894d1d81ca85ba4d.json", + "cst6cdt": "tzif-3a5a827f28d118e9-682e0a2d838b16ae.json", + "cuba": "tzif-d28e0bb7485a8522-9d5ad01d4999d0c7.json", + "eet": "tzif-f665c39691dff65-eb8beb46e71e4a05.json", + "egypt": "tzif-f0d38f589f1464b7-e65390d2a42c7521.json", + "eire": "tzif-96a7050f6c4d3e34-7cc5980522f3fef5.json", + "est": "tzif-6fbdbfed85292c81-468d78f0fb8a53ac.json", + "est5edt": "tzif-3994d21beae7c7b6-eb145d056159d80.json", + "etc/gmt": "tzif-42518274487a5d74-63fffb5b4ef7fbd9.json", + "etc/gmt+0": "tzif-42518274487a5d74-63fffb5b4ef7fbd9.json", + "etc/gmt+1": "tzif-3c8506b1fc96536c-4c88dd0e00eba4f2.json", + "etc/gmt+10": "tzif-c83537c4365f1258-7426b2a60504f417.json", + "etc/gmt+11": "tzif-bbf3217ce334c3f2-5622ec9ecf81c925.json", + "etc/gmt+12": "tzif-e2bf7ec87041f1fb-b61a215ea3b5adb3.json", + "etc/gmt+2": "tzif-2d819a70236c9f86-721e9b57fc17e8df.json", + "etc/gmt+3": "tzif-fed5f41e1701789d-daf8820af0fe9430.json", + "etc/gmt+4": "tzif-d1e4208290566f2f-8b7418c65c288188.json", + "etc/gmt+5": "tzif-a0806703e39bd41f-938b549d3f658065.json", + "etc/gmt+6": "tzif-9afb6f21d74a3dbd-d76c18d684813924.json", + "etc/gmt+7": "tzif-aeaa8db63bed649c-8a6f5505498821c5.json", + "etc/gmt+8": "tzif-f80d3a6707532038-3bae731e777368b6.json", + "etc/gmt+9": "tzif-2a554d4e97833d6e-1eb5fb8bf2c9f728.json", + "etc/gmt-0": "tzif-42518274487a5d74-63fffb5b4ef7fbd9.json", + "etc/gmt-1": "tzif-b397eb337d51aec5-9d2674bc81a95add.json", + "etc/gmt-10": "tzif-c6ecc61594d93097-34f668d36b185b09.json", + "etc/gmt-11": "tzif-170cb25ac2daddf1-c28442df6aeaf807.json", + "etc/gmt-12": "tzif-b445d8dfee87de1d-3d26ba9d3df071ac.json", + "etc/gmt-13": "tzif-186e2b651b9e98be-423bebc6a1739dc2.json", + "etc/gmt-14": "tzif-f6698c0e9f2fa661-cfcf92aaf6d6e5be.json", + "etc/gmt-2": "tzif-cd29e561a284f373-1b38f7643a89adc3.json", + "etc/gmt-3": "tzif-11b63f0f95d852ce-9769280653fbbbb1.json", + "etc/gmt-4": "tzif-c7d151e4111f596b-82465a65ac1b9a8e.json", + "etc/gmt-5": "tzif-3cc59865618b9844-e109dc95307db988.json", + "etc/gmt-6": "tzif-65401a13577707c6-bb9f9264b43c1451.json", + "etc/gmt-7": "tzif-4e52d8a7b9ecde7e-b7f50a3a0d1ac3b5.json", + "etc/gmt-8": "tzif-2bd99bb6843e89cf-932580fc9a3a0c8d.json", + "etc/gmt-9": "tzif-14ec5a4ae9e7e087-d5eb6128c4e9c616.json", + "etc/gmt0": "tzif-42518274487a5d74-63fffb5b4ef7fbd9.json", + "etc/greenwich": "tzif-42518274487a5d74-63fffb5b4ef7fbd9.json", + "etc/uct": "tzif-5eec9cd299aa076f-857603deebbce60b.json", + "etc/universal": "tzif-5eec9cd299aa076f-857603deebbce60b.json", + "etc/utc": "tzif-5eec9cd299aa076f-857603deebbce60b.json", + "etc/zulu": "tzif-5eec9cd299aa076f-857603deebbce60b.json", + "europe/amsterdam": "tzif-6415eb3f74777957-6f718f12281286a3.json", + "europe/andorra": "tzif-26bf0cacd24f77a1-a98e0c85e152f06e.json", + "europe/astrakhan": "tzif-5fd210f528e95871-c650f43dd3590090.json", + "europe/athens": "tzif-f665c39691dff65-eb8beb46e71e4a05.json", + "europe/belfast": "tzif-6bfb62f5e4b63e4a-5a7d3b172eb114d5.json", + "europe/belgrade": "tzif-a1b14d47c3da0459-9beeb6b09fc4bd85.json", + "europe/berlin": "tzif-4a65bbe3253254a1-2a20d46c4d15c0c3.json", + "europe/bratislava": "tzif-6d3285599a38ae5a-e146c246881dc5ed.json", + "europe/brussels": "tzif-6415eb3f74777957-6f718f12281286a3.json", + "europe/bucharest": "tzif-b06ac7e52f27518c-ad815076903a307.json", + "europe/budapest": "tzif-1041cd53332eeba8-60aa3eb45cf6bad9.json", + "europe/busingen": "tzif-5cb26c449b2278f2-a3a1b3aa09d53c07.json", + "europe/chisinau": "tzif-7622c5c99b380b37-74a373c9f92241c7.json", + "europe/copenhagen": "tzif-4a65bbe3253254a1-2a20d46c4d15c0c3.json", + "europe/dublin": "tzif-96a7050f6c4d3e34-7cc5980522f3fef5.json", + "europe/gibraltar": "tzif-34047004b336df3e-bbe8e4196294f00a.json", + "europe/guernsey": "tzif-6bfb62f5e4b63e4a-5a7d3b172eb114d5.json", + "europe/helsinki": "tzif-4ccce3697974db1-dd90a8482c7e02e0.json", + "europe/isle_of_man": "tzif-6bfb62f5e4b63e4a-5a7d3b172eb114d5.json", + "europe/istanbul": "tzif-21007d26526b6cee-4c7defff421754b5.json", + "europe/jersey": "tzif-6bfb62f5e4b63e4a-5a7d3b172eb114d5.json", + "europe/kaliningrad": "tzif-dc6b1be48367c4f1-5f1fbe94f0718a6a.json", + "europe/kiev": "tzif-4ab862d6d4b98ff4-7628975aa4bf631a.json", + "europe/kirov": "tzif-1735ba0bbd2e57f5-8adc7347030fce3f.json", + "europe/kyiv": "tzif-4ab862d6d4b98ff4-7628975aa4bf631a.json", + "europe/lisbon": "tzif-e953d2a73bc41375-ef97956cf6178835.json", + "europe/ljubljana": "tzif-a1b14d47c3da0459-9beeb6b09fc4bd85.json", + "europe/london": "tzif-6bfb62f5e4b63e4a-5a7d3b172eb114d5.json", + "europe/luxembourg": "tzif-6415eb3f74777957-6f718f12281286a3.json", + "europe/madrid": "tzif-7d33da447360d55c-52583d8c13b6f677.json", + "europe/malta": "tzif-638a1ae9aef4e05b-74d152a85f1741cd.json", + "europe/mariehamn": "tzif-4ccce3697974db1-dd90a8482c7e02e0.json", + "europe/minsk": "tzif-5a1de33f302092c9-7fede906b0fbc944.json", + "europe/monaco": "tzif-513821d5372dc2c3-56efcc8826fb3481.json", + "europe/moscow": "tzif-ec4f112febcbc032-a69762c688a2158f.json", + "europe/nicosia": "tzif-37762e44a2edd792-4f1b10d181e56a5d.json", + "europe/oslo": "tzif-4a65bbe3253254a1-2a20d46c4d15c0c3.json", + "europe/paris": "tzif-513821d5372dc2c3-56efcc8826fb3481.json", + "europe/podgorica": "tzif-a1b14d47c3da0459-9beeb6b09fc4bd85.json", + "europe/prague": "tzif-6d3285599a38ae5a-e146c246881dc5ed.json", + "europe/riga": "tzif-ce5eb7cf8993261f-bdd600c9c7fb16d5.json", + "europe/rome": "tzif-5473a3220fbbe20b-150c46c09db6581d.json", + "europe/samara": "tzif-2ae3e9466dbec3ec-2dfc2c7ddd060e6d.json", + "europe/san_marino": "tzif-5473a3220fbbe20b-150c46c09db6581d.json", + "europe/sarajevo": "tzif-a1b14d47c3da0459-9beeb6b09fc4bd85.json", + "europe/saratov": "tzif-6ad7cbb6af2e6144-d93cfc8ee54a6b99.json", + "europe/simferopol": "tzif-d7daa3dddb990290-2188fa690fb895b7.json", + "europe/skopje": "tzif-a1b14d47c3da0459-9beeb6b09fc4bd85.json", + "europe/sofia": "tzif-1375eb028a5068b1-c7cfa311f9a3eac8.json", + "europe/stockholm": "tzif-4a65bbe3253254a1-2a20d46c4d15c0c3.json", + "europe/tallinn": "tzif-9c7ac303ad5d20d8-9111a17e7b78de54.json", + "europe/tirane": "tzif-4fd8d72ac04d9a5d-3133c7dea65f2538.json", + "europe/tiraspol": "tzif-7622c5c99b380b37-74a373c9f92241c7.json", + "europe/ulyanovsk": "tzif-dbf1c543882cf4b7-2ee5fc1eb7933ea5.json", + "europe/uzhgorod": "tzif-4ab862d6d4b98ff4-7628975aa4bf631a.json", + "europe/vaduz": "tzif-5cb26c449b2278f2-a3a1b3aa09d53c07.json", + "europe/vatican": "tzif-5473a3220fbbe20b-150c46c09db6581d.json", + "europe/vienna": "tzif-bafb78fdc913701c-de429c1ed9e982a1.json", + "europe/vilnius": "tzif-8e1e620dda961a84-8cb519c7f5594e81.json", + "europe/volgograd": "tzif-c711f11538fdc96f-2563abbbef728ca5.json", + "europe/warsaw": "tzif-3a07d4451f21c9ef-6b2242eea52b976b.json", + "europe/zagreb": "tzif-a1b14d47c3da0459-9beeb6b09fc4bd85.json", + "europe/zaporozhye": "tzif-4ab862d6d4b98ff4-7628975aa4bf631a.json", + "europe/zurich": "tzif-5cb26c449b2278f2-a3a1b3aa09d53c07.json", + "factory": "tzif-8c010856ba3febe1-a27521eb7d78dbf6.json", + "gb": "tzif-6bfb62f5e4b63e4a-5a7d3b172eb114d5.json", + "gb-eire": "tzif-6bfb62f5e4b63e4a-5a7d3b172eb114d5.json", + "gmt": "tzif-42518274487a5d74-63fffb5b4ef7fbd9.json", + "gmt+0": "tzif-42518274487a5d74-63fffb5b4ef7fbd9.json", + "gmt-0": "tzif-42518274487a5d74-63fffb5b4ef7fbd9.json", + "gmt0": "tzif-42518274487a5d74-63fffb5b4ef7fbd9.json", + "greenwich": "tzif-42518274487a5d74-63fffb5b4ef7fbd9.json", + "hongkong": "tzif-ea8173f82f8dccac-190f07fa0585582b.json", + "hst": "tzif-6196bbf525d4d50a-c1285ce65c03319.json", + "iceland": "tzif-fe8583499fe1cbb8-a7cf0ef087069495.json", + "indian/antananarivo": "tzif-486e9282debc62a3-27805d7d5dee9be4.json", + "indian/chagos": "tzif-e713de09d9781804-3bc1517947065469.json", + "indian/christmas": "tzif-2a7fc944a4c2991b-ed19eb01bbf45250.json", + "indian/cocos": "tzif-50abe32c287395c8-d2c3aa5882246ab2.json", + "indian/comoro": "tzif-486e9282debc62a3-27805d7d5dee9be4.json", + "indian/kerguelen": "tzif-b3d9e43d648fe2bf-fa688f4eb568be69.json", + "indian/mahe": "tzif-7459e3ffacdde5a6-a596288a1fff51a3.json", + "indian/maldives": "tzif-b3d9e43d648fe2bf-fa688f4eb568be69.json", + "indian/mauritius": "tzif-dc8c7c76ac036db-6dcebe24fb293843.json", + "indian/mayotte": "tzif-486e9282debc62a3-27805d7d5dee9be4.json", + "indian/reunion": "tzif-7459e3ffacdde5a6-a596288a1fff51a3.json", + "iran": "tzif-650685fe5c95ce2a-2f3eb2e60291229d.json", + "israel": "tzif-758d7fde6833ba8c-65256d0857a2f636.json", + "jamaica": "tzif-98fb8731f72daeb6-4585fdc50640db42.json", + "japan": "tzif-7bce416a66d38e42-b58b08c4c731f7dc.json", + "kwajalein": "tzif-f104b0a7be76b68-672d15810abf76ed.json", + "libya": "tzif-81a0c2bb7c8a41da-7b4ebb9a4aa49253.json", + "met": "tzif-6415eb3f74777957-6f718f12281286a3.json", + "mexico/bajanorte": "tzif-3fc16258c94fd1bd-f5865999bedfb5cb.json", + "mexico/bajasur": "tzif-40fb52b19ef81b1d-e1ce3cc4e0a17886.json", + "mexico/general": "tzif-95eb641ddc74061f-5a914528a766049d.json", + "mst": "tzif-a3214de8e358efe8-33b7f8f888f95c0b.json", + "mst7mdt": "tzif-50fc3fea132b4f4c-5a5d88ba8de3b7c1.json", + "navajo": "tzif-50fc3fea132b4f4c-5a5d88ba8de3b7c1.json", + "nz": "tzif-1939cc3520b8dae8-a2fd6733973f8da2.json", + "nz-chat": "tzif-8a0ec5e44a49e44e-1f9e21f2398d2965.json", + "pacific/apia": "tzif-a1347b19ee040601-84e246431e54b763.json", + "pacific/auckland": "tzif-1939cc3520b8dae8-a2fd6733973f8da2.json", + "pacific/bougainville": "tzif-c0f3e562f1a83b48-46259b3efc2044b4.json", + "pacific/chatham": "tzif-8a0ec5e44a49e44e-1f9e21f2398d2965.json", + "pacific/chuuk": "tzif-1ede513c242ae08-561006205b46a9e7.json", + "pacific/easter": "tzif-daeed2898ecd770c-894d1d81ca85ba4d.json", + "pacific/efate": "tzif-bcd5d242787ff58-595e172a944e8f55.json", + "pacific/enderbury": "tzif-edc8df3b48d8f1ae-2f0fe2e55f7ceabf.json", + "pacific/fakaofo": "tzif-57ad9603575ed991-356d85cfd1d045d6.json", + "pacific/fiji": "tzif-fb562061c0f6e08b-c76bafb046d43b7.json", + "pacific/funafuti": "tzif-154d4d1d56f527ae-b4426313fdb85583.json", + "pacific/galapagos": "tzif-905f75931d73bd53-38c9d0ddc82eec2a.json", + "pacific/gambier": "tzif-e7907c2354d7f128-1222f4f18f058093.json", + "pacific/guadalcanal": "tzif-6493d17f054bfdfb-35ed6c8176f0fbed.json", + "pacific/guam": "tzif-b8b54ce37e65e37e-e9672f15a3e270a7.json", + "pacific/honolulu": "tzif-6196bbf525d4d50a-c1285ce65c03319.json", + "pacific/johnston": "tzif-6196bbf525d4d50a-c1285ce65c03319.json", + "pacific/kanton": "tzif-edc8df3b48d8f1ae-2f0fe2e55f7ceabf.json", + "pacific/kiritimati": "tzif-2be99c3dd72ebbf9-e08d147873aff81.json", + "pacific/kosrae": "tzif-cad03994b9f9755d-786401d28559cef.json", + "pacific/kwajalein": "tzif-f104b0a7be76b68-672d15810abf76ed.json", + "pacific/majuro": "tzif-154d4d1d56f527ae-b4426313fdb85583.json", + "pacific/marquesas": "tzif-6797b3dc466b8334-28780ef70fbe052e.json", + "pacific/midway": "tzif-68b74f8e8d191761-a8eaae70013bbfdf.json", + "pacific/nauru": "tzif-355a4a5906a54477-e95040f92d9fdd8d.json", + "pacific/niue": "tzif-7285bd926fe2dc70-a6ffff1cf5147cbf.json", + "pacific/norfolk": "tzif-e4c142bca3031674-44b8ea4e236ae5f5.json", + "pacific/noumea": "tzif-7238398358c87edf-bc2588b2ce94bc20.json", + "pacific/pago_pago": "tzif-68b74f8e8d191761-a8eaae70013bbfdf.json", + "pacific/palau": "tzif-b3a7b6acccb12af9-93f5a4bd9827e971.json", + "pacific/pitcairn": "tzif-f022b64b061d7846-529fb8a37afd1bc3.json", + "pacific/pohnpei": "tzif-6493d17f054bfdfb-35ed6c8176f0fbed.json", + "pacific/ponape": "tzif-6493d17f054bfdfb-35ed6c8176f0fbed.json", + "pacific/port_moresby": "tzif-1ede513c242ae08-561006205b46a9e7.json", + "pacific/rarotonga": "tzif-c0d9ca8c12b3167c-34f182f235d9fe88.json", + "pacific/saipan": "tzif-b8b54ce37e65e37e-e9672f15a3e270a7.json", + "pacific/samoa": "tzif-68b74f8e8d191761-a8eaae70013bbfdf.json", + "pacific/tahiti": "tzif-72be3d5f2c49eb87-7e9fa5340a3dee71.json", + "pacific/tarawa": "tzif-154d4d1d56f527ae-b4426313fdb85583.json", + "pacific/tongatapu": "tzif-8b312fc28eb6d503-b57cea257edd1731.json", + "pacific/truk": "tzif-1ede513c242ae08-561006205b46a9e7.json", + "pacific/wake": "tzif-154d4d1d56f527ae-b4426313fdb85583.json", + "pacific/wallis": "tzif-154d4d1d56f527ae-b4426313fdb85583.json", + "pacific/yap": "tzif-1ede513c242ae08-561006205b46a9e7.json", + "poland": "tzif-3a07d4451f21c9ef-6b2242eea52b976b.json", + "portugal": "tzif-e953d2a73bc41375-ef97956cf6178835.json", + "prc": "tzif-94731e7a96e16727-b9bdd49f2158b98c.json", + "pst8pdt": "tzif-effb0bd5efab2bad-76ee3ca040667987.json", + "roc": "tzif-ee42b17151e8d0d1-557c16a705ea23d1.json", + "rok": "tzif-b89f6da72122ca01-812d173fdcfeaaa6.json", + "singapore": "tzif-fc89b67bba9eff21-ed937c5b2210118e.json", + "turkey": "tzif-21007d26526b6cee-4c7defff421754b5.json", + "uct": "tzif-5eec9cd299aa076f-857603deebbce60b.json", + "universal": "tzif-5eec9cd299aa076f-857603deebbce60b.json", + "us/alaska": "tzif-d4999f54d6ffa1ff-bdc2dfc5a5de1f94.json", + "us/aleutian": "tzif-2450804cbdb4245e-fc28955e4978e50d.json", + "us/arizona": "tzif-a3214de8e358efe8-33b7f8f888f95c0b.json", + "us/central": "tzif-3a5a827f28d118e9-682e0a2d838b16ae.json", + "us/east-indiana": "tzif-754b9e4bdb20aa95-1c5b7a1b811c5ae3.json", + "us/eastern": "tzif-3994d21beae7c7b6-eb145d056159d80.json", + "us/hawaii": "tzif-6196bbf525d4d50a-c1285ce65c03319.json", + "us/indiana-starke": "tzif-fc9fd017e19a24e0-530492ba8305e348.json", + "us/michigan": "tzif-f8baa073f0e62ab0-5c9c06226b1920d5.json", + "us/mountain": "tzif-50fc3fea132b4f4c-5a5d88ba8de3b7c1.json", + "us/pacific": "tzif-effb0bd5efab2bad-76ee3ca040667987.json", + "us/samoa": "tzif-68b74f8e8d191761-a8eaae70013bbfdf.json", + "utc": "tzif-5eec9cd299aa076f-857603deebbce60b.json", + "w-su": "tzif-ec4f112febcbc032-a69762c688a2158f.json", + "wet": "tzif-e953d2a73bc41375-ef97956cf6178835.json", + "zulu": "tzif-5eec9cd299aa076f-857603deebbce60b.json" +} diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1041cd53332eeba8-60aa3eb45cf6bad9.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1041cd53332eeba8-60aa3eb45cf6bad9.json new file mode 100644 index 00000000000000..d3ad1712ecbe1a --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1041cd53332eeba8-60aa3eb45cf6bad9.json @@ -0,0 +1,192 @@ +{ + "ids": [ + "europe/budapest" + ], + "tzif": { + "posix": { + "abbr": "CET", + "offset": 3600, + "transition": { + "abbr": "CEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 10800 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -2498260580, + -1693706400, + -1680483600, + -1663455600, + -1650150000, + -1632006000, + -1618700400, + -1600470000, + -1587250800, + -1569711600, + -1555196400, + -906775200, + -857257200, + -844556400, + -828226800, + -812502000, + -796777200, + -778471200, + -762656400, + -749689200, + -733276800, + -717634800, + -701910000, + -686185200, + -670460400, + -654130800, + -639010800, + -492656400, + -481168800, + -461199600, + -449708400, + -428540400, + -418258800, + -397090800, + -386809200, + 323823600, + 338943600, + 354668400, + 370393200, + 386118000, + 401842800, + 417567600, + 433292400, + 441759600, + 465354000, + 481078800, + 496803600, + 512528400, + 528253200, + 543978000, + 559702800, + 575427600, + 591152400, + 606877200, + 622602000, + 638326800, + 654656400, + 670381200, + 686106000, + 701830800, + 717555600, + 733280400, + 749005200, + 764730000, + 780454800, + 796179600, + 811904400, + 828234000, + 846378000 + ], + "types": [ + { + "offset": 4580 + }, + { + "offset": 3600 + }, + { + "offset": 7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1146d998a660d8a7-7083368cf5416b3.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1146d998a660d8a7-7083368cf5416b3.json new file mode 100644 index 00000000000000..1b0dd650af316c --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1146d998a660d8a7-7083368cf5416b3.json @@ -0,0 +1,157 @@ +{ + "ids": [ + "america/indiana/marengo" + ], + "tzif": { + "posix": { + "abbr": "EST", + "offset": -18000, + "transition": { + "abbr": "EDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 2, + 3, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3 + ], + "transitions": [ + -2717647200, + -1633276800, + -1615136400, + -1601827200, + -1583686800, + -880214400, + -769395600, + -765392400, + -589392000, + -576090000, + -495043200, + -481741200, + -463593600, + -450291600, + -431539200, + -418237200, + -400089600, + -386787600, + -368640000, + -355338000, + -337190400, + -323888400, + -305740800, + -292438800, + -273686400, + -21488400, + -5767200, + 9961200, + 25682400, + 41410800, + 57736800, + 73465200, + 89186400, + 104914800, + 120636000, + 126687600, + 152089200, + 162370800, + 183535200, + 1143961200, + 1162101600, + 1173596400, + 1194156000 + ], + "types": [ + { + "offset": -20723 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + }, + { + "offset": -18000 + }, + { + "offset": -14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-11b63f0f95d852ce-9769280653fbbbb1.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-11b63f0f95d852ce-9769280653fbbbb1.json new file mode 100644 index 00000000000000..1eb57361493a51 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-11b63f0f95d852ce-9769280653fbbbb1.json @@ -0,0 +1,19 @@ +{ + "ids": [ + "etc/gmt-3" + ], + "tzif": { + "posix": { + "abbr": "+03", + "offset": 10800, + "transition": null + }, + "transition_types": [], + "transitions": [], + "types": [ + { + "offset": 10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-12ced9fe919d8b6-35fe81809b640977.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-12ced9fe919d8b6-35fe81809b640977.json new file mode 100644 index 00000000000000..dd8376e76f5159 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-12ced9fe919d8b6-35fe81809b640977.json @@ -0,0 +1,211 @@ +{ + "ids": [ + "america/rankin_inlet" + ], + "tzif": { + "posix": { + "abbr": "CST", + "offset": -21600, + "transition": { + "abbr": "CDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 3, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1 + ], + "transitions": [ + -410227200, + 73468800, + 89190000, + 104918400, + 120639600, + 136368000, + 152089200, + 167817600, + 183538800, + 199267200, + 215593200, + 230716800, + 247042800, + 262771200, + 278492400, + 294220800, + 309942000, + 325670400, + 341391600, + 357120000, + 372841200, + 388569600, + 404895600, + 420019200, + 436345200, + 452073600, + 467794800, + 483523200, + 499244400, + 514972800, + 530694000, + 544608000, + 562143600, + 576057600, + 594198000, + 607507200, + 625647600, + 638956800, + 657097200, + 671011200, + 688546800, + 702460800, + 719996400, + 733910400, + 752050800, + 765360000, + 783500400, + 796809600, + 814950000, + 828864000, + 846399600, + 860313600, + 877849200, + 891763200, + 909298800, + 923212800, + 941353200, + 954662400, + 972802800, + 986112000, + 1004252400, + 1018166400, + 1035702000, + 1049616000, + 1067151600, + 1081065600, + 1099206000, + 1112515200, + 1130655600, + 1143964800, + 1162105200, + 1173600000, + 1194159600 + ], + "types": [ + { + "offset": 0 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + }, + { + "offset": -18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1375eb028a5068b1-c7cfa311f9a3eac8.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1375eb028a5068b1-c7cfa311f9a3eac8.json new file mode 100644 index 00000000000000..07f1ef5da6fdef --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1375eb028a5068b1-c7cfa311f9a3eac8.json @@ -0,0 +1,172 @@ +{ + "ids": [ + "europe/sofia" + ], + "tzif": { + "posix": { + "abbr": "EET", + "offset": 7200, + "transition": { + "abbr": "EEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 14400 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 10800 + } + } + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4 + ], + "transitions": [ + -2840146396, + -2369527016, + -857257200, + -844556400, + -828226800, + -812502000, + -796777200, + -781048800, + 291762000, + 307576800, + 323816400, + 339026400, + 355266000, + 370393200, + 386715600, + 401846400, + 417571200, + 433296000, + 449020800, + 465350400, + 481075200, + 496800000, + 512524800, + 528249600, + 543974400, + 559699200, + 575424000, + 591148800, + 606873600, + 622598400, + 638323200, + 654652800, + 662680800, + 686091600, + 701820000, + 717541200, + 733269600, + 748990800, + 764719200, + 780440400, + 796168800, + 811890000, + 828223200, + 846363600 + ], + "types": [ + { + "offset": 5596 + }, + { + "offset": 7016 + }, + { + "offset": 7200 + }, + { + "offset": 3600 + }, + { + "offset": 7200 + }, + { + "offset": 10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-14cdf6863a8e2179-b18612ad8b0eacc7.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-14cdf6863a8e2179-b18612ad8b0eacc7.json new file mode 100644 index 00000000000000..83f92649a30756 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-14cdf6863a8e2179-b18612ad8b0eacc7.json @@ -0,0 +1,33 @@ +{ + "ids": [ + "africa/blantyre", + "africa/bujumbura", + "africa/gaborone", + "africa/harare", + "africa/kigali", + "africa/lubumbashi", + "africa/lusaka", + "africa/maputo" + ], + "tzif": { + "posix": { + "abbr": "CAT", + "offset": 7200, + "transition": null + }, + "transition_types": [ + 1 + ], + "transitions": [ + -1924999818 + ], + "types": [ + { + "offset": 7818 + }, + { + "offset": 7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-14ec5a4ae9e7e087-d5eb6128c4e9c616.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-14ec5a4ae9e7e087-d5eb6128c4e9c616.json new file mode 100644 index 00000000000000..eedae29730891c --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-14ec5a4ae9e7e087-d5eb6128c4e9c616.json @@ -0,0 +1,19 @@ +{ + "ids": [ + "etc/gmt-9" + ], + "tzif": { + "posix": { + "abbr": "+09", + "offset": 32400, + "transition": null + }, + "transition_types": [], + "transitions": [], + "types": [ + { + "offset": 32400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-154d4d1d56f527ae-b4426313fdb85583.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-154d4d1d56f527ae-b4426313fdb85583.json new file mode 100644 index 00000000000000..bd8a666f692e0f --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-154d4d1d56f527ae-b4426313fdb85583.json @@ -0,0 +1,30 @@ +{ + "ids": [ + "pacific/funafuti", + "pacific/majuro", + "pacific/tarawa", + "pacific/wake", + "pacific/wallis" + ], + "tzif": { + "posix": { + "abbr": "+12", + "offset": 43200, + "transition": null + }, + "transition_types": [ + 1 + ], + "transitions": [ + -2177494324 + ], + "types": [ + { + "offset": 41524 + }, + { + "offset": 43200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-170cb25ac2daddf1-c28442df6aeaf807.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-170cb25ac2daddf1-c28442df6aeaf807.json new file mode 100644 index 00000000000000..592ee829b34240 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-170cb25ac2daddf1-c28442df6aeaf807.json @@ -0,0 +1,19 @@ +{ + "ids": [ + "etc/gmt-11" + ], + "tzif": { + "posix": { + "abbr": "+11", + "offset": 39600, + "transition": null + }, + "transition_types": [], + "transitions": [], + "types": [ + { + "offset": 39600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1735ba0bbd2e57f5-8adc7347030fce3f.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1735ba0bbd2e57f5-8adc7347030fce3f.json new file mode 100644 index 00000000000000..58df87ed8dbffe --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1735ba0bbd2e57f5-8adc7347030fce3f.json @@ -0,0 +1,188 @@ +{ + "ids": [ + "europe/kirov" + ], + "tzif": { + "posix": { + "abbr": "MSK", + "offset": 10800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 4, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 2, + 4, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1 + ], + "transitions": [ + -1593820800, + -1247540400, + 354916800, + 370724400, + 386452800, + 402260400, + 417988800, + 433796400, + 449611200, + 465343200, + 481068000, + 496792800, + 512517600, + 528242400, + 543967200, + 559692000, + 575416800, + 591141600, + 606866400, + 606870000, + 622594800, + 638319600, + 654649200, + 670374000, + 701820000, + 701823600, + 717548400, + 733273200, + 748998000, + 764722800, + 780447600, + 796172400, + 811897200, + 828226800, + 846370800, + 859676400, + 877820400, + 891126000, + 909270000, + 922575600, + 941324400, + 954025200, + 972774000, + 985474800, + 1004223600, + 1017529200, + 1035673200, + 1048978800, + 1067122800, + 1080428400, + 1099177200, + 1111878000, + 1130626800, + 1143327600, + 1162076400, + 1174777200, + 1193526000, + 1206831600, + 1224975600, + 1238281200, + 1256425200, + 1269730800, + 1288479600, + 1301180400, + 1414274400 + ], + "types": [ + { + "offset": 11928 + }, + { + "offset": 10800 + }, + { + "offset": 14400 + }, + { + "offset": 18000 + }, + { + "offset": 14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-186e2b651b9e98be-423bebc6a1739dc2.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-186e2b651b9e98be-423bebc6a1739dc2.json new file mode 100644 index 00000000000000..c5d947315ccbbd --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-186e2b651b9e98be-423bebc6a1739dc2.json @@ -0,0 +1,19 @@ +{ + "ids": [ + "etc/gmt-13" + ], + "tzif": { + "posix": { + "abbr": "+13", + "offset": 46800, + "transition": null + }, + "transition_types": [], + "transitions": [], + "types": [ + { + "offset": 46800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1939cc3520b8dae8-a2fd6733973f8da2.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1939cc3520b8dae8-a2fd6733973f8da2.json new file mode 100644 index 00000000000000..12a5503f838e54 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1939cc3520b8dae8-a2fd6733973f8da2.json @@ -0,0 +1,297 @@ +{ + "ids": [ + "antarctica/mcmurdo", + "antarctica/south_pole", + "nz", + "pacific/auckland" + ], + "tzif": { + "posix": { + "abbr": "NZST", + "offset": 43200, + "transition": { + "abbr": "NZDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 4, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 9, + 5, + 0 + ] + }, + "time": 10800 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 3, + 1, + 3, + 1, + 3, + 1, + 3, + 1, + 3, + 1, + 3, + 1, + 3, + 1, + 3, + 1, + 3, + 1, + 3, + 1, + 3, + 1, + 3, + 1, + 3, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5 + ], + "transitions": [ + -3192435544, + -1330335000, + -1320057000, + -1300699800, + -1287396000, + -1269250200, + -1255946400, + -1237800600, + -1224496800, + -1206351000, + -1192442400, + -1174901400, + -1160992800, + -1143451800, + -1125914400, + -1112607000, + -1094464800, + -1081157400, + -1063015200, + -1049707800, + -1031565600, + -1018258200, + -1000116000, + -986808600, + -968061600, + -955359000, + -936612000, + -923304600, + -757425600, + 152632800, + 162309600, + 183477600, + 194968800, + 215532000, + 226418400, + 246981600, + 257868000, + 278431200, + 289317600, + 309880800, + 320767200, + 341330400, + 352216800, + 372780000, + 384271200, + 404834400, + 415720800, + 436284000, + 447170400, + 467733600, + 478620000, + 499183200, + 510069600, + 530632800, + 541519200, + 562082400, + 573573600, + 594136800, + 605023200, + 623772000, + 637682400, + 655221600, + 669132000, + 686671200, + 700581600, + 718120800, + 732636000, + 749570400, + 764085600, + 781020000, + 795535200, + 812469600, + 826984800, + 844524000, + 858434400, + 875973600, + 889884000, + 907423200, + 921938400, + 938872800, + 953388000, + 970322400, + 984837600, + 1002376800, + 1016287200, + 1033826400, + 1047736800, + 1065276000, + 1079791200, + 1096725600, + 1111240800, + 1128175200, + 1142690400, + 1159624800, + 1174140000, + 1191074400, + 1207404000, + 1222524000 + ], + "types": [ + { + "offset": 41944 + }, + { + "offset": 41400 + }, + { + "offset": 45000 + }, + { + "offset": 43200 + }, + { + "offset": 43200 + }, + { + "offset": 46800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-19d0e567d48830e5-20b2a6d45202416.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-19d0e567d48830e5-20b2a6d45202416.json new file mode 100644 index 00000000000000..9360ace55f629f --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-19d0e567d48830e5-20b2a6d45202416.json @@ -0,0 +1,90 @@ +{ + "ids": [ + "africa/tunis" + ], + "tzif": { + "posix": { + "abbr": "CET", + "offset": 3600, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2 + ], + "transitions": [ + -2797202444, + -1855958961, + -969242400, + -950493600, + -941940000, + -891136800, + -877827600, + -857257200, + -844556400, + -842918400, + -842223600, + -828230400, + -812502000, + -796269600, + -781052400, + -766634400, + 231202800, + 243903600, + 262825200, + 276044400, + 581122800, + 591145200, + 606870000, + 622594800, + 641516400, + 654649200, + 1114902000, + 1128038400, + 1143334800, + 1162083600 + ], + "types": [ + { + "offset": 2444 + }, + { + "offset": 561 + }, + { + "offset": 3600 + }, + { + "offset": 7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1a285e17b7751f38-aefc034b499da29b.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1a285e17b7751f38-aefc034b499da29b.json new file mode 100644 index 00000000000000..ad440c47a25c56 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1a285e17b7751f38-aefc034b499da29b.json @@ -0,0 +1,147 @@ +{ + "ids": [ + "america/dawson_creek" + ], + "tzif": { + "posix": { + "abbr": "MST", + "offset": -25200, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 3 + ], + "transitions": [ + -2713881544, + -1632060000, + -1615129200, + -880207200, + -769395600, + -765385200, + -715788000, + -702486000, + -684338400, + -671036400, + -652888800, + -639586800, + -620834400, + -608137200, + -589384800, + -576082800, + -557935200, + -544633200, + -526485600, + -513183600, + -495036000, + -481734000, + -463586400, + -450284400, + -431532000, + -418230000, + -400082400, + -386780400, + -368632800, + -355330800, + -337183200, + -323881200, + -305733600, + -292431600, + -273679200, + -260982000, + -242229600, + -226508400, + -210780000, + -195058800, + -179330400, + -163609200, + -147880800, + -131554800, + -116431200, + -100105200, + -84376800, + -68655600, + -52927200, + -37206000, + -21477600, + -5756400, + 9972000, + 25693200, + 41421600, + 57747600, + 73476000, + 84013200 + ], + "types": [ + { + "offset": -28856 + }, + { + "offset": -28800 + }, + { + "offset": -25200 + }, + { + "offset": -25200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1dd142eb22754e92-d3cee37600e3912e.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1dd142eb22754e92-d3cee37600e3912e.json new file mode 100644 index 00000000000000..9cd293b6de7870 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1dd142eb22754e92-d3cee37600e3912e.json @@ -0,0 +1,223 @@ +{ + "ids": [ + "america/iqaluit", + "america/pangnirtung" + ], + "tzif": { + "posix": { + "abbr": "EST", + "offset": -18000, + "transition": { + "abbr": "EDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 3, + 4, + 2, + 3, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3 + ], + "transitions": [ + -865296000, + -769395600, + -765396000, + 73465200, + 89186400, + 104914800, + 120636000, + 136364400, + 152085600, + 167814000, + 183535200, + 199263600, + 215589600, + 230713200, + 247039200, + 262767600, + 278488800, + 294217200, + 309938400, + 325666800, + 341388000, + 357116400, + 372837600, + 388566000, + 404892000, + 420015600, + 436341600, + 452070000, + 467791200, + 483519600, + 499240800, + 514969200, + 530690400, + 544604400, + 562140000, + 576054000, + 594194400, + 607503600, + 625644000, + 638953200, + 657093600, + 671007600, + 688543200, + 702457200, + 719992800, + 733906800, + 752047200, + 765356400, + 783496800, + 796806000, + 814946400, + 828860400, + 846396000, + 860310000, + 877845600, + 891759600, + 909295200, + 923209200, + 941349600, + 941353200, + 954662400, + 972802800, + 986108400, + 1004248800, + 1018162800, + 1035698400, + 1049612400, + 1067148000, + 1081062000, + 1099202400, + 1112511600, + 1130652000, + 1143961200, + 1162101600, + 1173596400, + 1194156000 + ], + "types": [ + { + "offset": 0 + }, + { + "offset": -14400 + }, + { + "offset": -18000 + }, + { + "offset": -18000 + }, + { + "offset": -21600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1ede513c242ae08-561006205b46a9e7.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1ede513c242ae08-561006205b46a9e7.json new file mode 100644 index 00000000000000..e12048673575b5 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1ede513c242ae08-561006205b46a9e7.json @@ -0,0 +1,35 @@ +{ + "ids": [ + "antarctica/dumontdurville", + "pacific/chuuk", + "pacific/port_moresby", + "pacific/truk", + "pacific/yap" + ], + "tzif": { + "posix": { + "abbr": "+10", + "offset": 36000, + "transition": null + }, + "transition_types": [ + 1, + 2 + ], + "transitions": [ + -2840176120, + -2366790512 + ], + "types": [ + { + "offset": 35320 + }, + { + "offset": 35312 + }, + { + "offset": 36000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1eff85dd787ed3a1-d74f97871f7e97e8.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1eff85dd787ed3a1-d74f97871f7e97e8.json new file mode 100644 index 00000000000000..b70bec1a070cf6 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-1eff85dd787ed3a1-d74f97871f7e97e8.json @@ -0,0 +1,264 @@ +{ + "ids": [ + "america/dawson" + ], + "tzif": { + "posix": { + "abbr": "MST", + "offset": -25200, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 1, + 3, + 1, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 3, + 5 + ], + "transitions": [ + -2188996940, + -1632056400, + -1615125600, + -1596978000, + -1583164800, + -880203600, + -769395600, + -765381600, + -147884400, + -131554800, + 120646800, + 325677600, + 341398800, + 357127200, + 372848400, + 388576800, + 404902800, + 420026400, + 436352400, + 452080800, + 467802000, + 483530400, + 499251600, + 514980000, + 530701200, + 544615200, + 562150800, + 576064800, + 594205200, + 607514400, + 625654800, + 638964000, + 657104400, + 671018400, + 688554000, + 702468000, + 720003600, + 733917600, + 752058000, + 765367200, + 783507600, + 796816800, + 814957200, + 828871200, + 846406800, + 860320800, + 877856400, + 891770400, + 909306000, + 923220000, + 941360400, + 954669600, + 972810000, + 986119200, + 1004259600, + 1018173600, + 1035709200, + 1049623200, + 1067158800, + 1081072800, + 1099213200, + 1112522400, + 1130662800, + 1143972000, + 1162112400, + 1173607200, + 1194166800, + 1205056800, + 1225616400, + 1236506400, + 1257066000, + 1268560800, + 1289120400, + 1300010400, + 1320570000, + 1331460000, + 1352019600, + 1362909600, + 1383469200, + 1394359200, + 1414918800, + 1425808800, + 1446368400, + 1457863200, + 1478422800, + 1489312800, + 1509872400, + 1520762400, + 1541322000, + 1552212000, + 1572771600, + 1583661600, + 1604214000 + ], + "types": [ + { + "offset": -33460 + }, + { + "offset": -32400 + }, + { + "offset": -28800 + }, + { + "offset": -25200 + }, + { + "offset": -28800 + }, + { + "offset": -25200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-206d649fad594120-70deb0fb976b18e.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-206d649fad594120-70deb0fb976b18e.json new file mode 100644 index 00000000000000..7b82c07f97dc87 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-206d649fad594120-70deb0fb976b18e.json @@ -0,0 +1,109 @@ +{ + "ids": [ + "america/maceio" + ], + "tzif": { + "posix": { + "abbr": "-03", + "offset": -10800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -1767217028, + -1206957600, + -1191362400, + -1175374800, + -1159826400, + -633819600, + -622069200, + -602283600, + -591832800, + -570747600, + -560210400, + -539125200, + -531352800, + -191365200, + -184197600, + -155163600, + -150069600, + -128898000, + -121125600, + -99954000, + -89589600, + -68418000, + -57967200, + 499748400, + 511236000, + 530593200, + 540266400, + 562129200, + 571197600, + 592974000, + 602042400, + 624423600, + 634701600, + 813726000, + 824004000, + 938919600, + 951616800, + 970974000, + 972180000, + 1003028400, + 1013911200 + ], + "types": [ + { + "offset": -8572 + }, + { + "offset": -10800 + }, + { + "offset": -7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-21007d26526b6cee-4c7defff421754b5.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-21007d26526b6cee-4c7defff421754b5.json new file mode 100644 index 00000000000000..f073b72b52a89f --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-21007d26526b6cee-4c7defff421754b5.json @@ -0,0 +1,303 @@ +{ + "ids": [ + "asia/istanbul", + "europe/istanbul", + "turkey" + ], + "tzif": { + "posix": { + "abbr": "+03", + "offset": 10800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 3, + 4, + 5, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 3, + 4 + ], + "transitions": [ + -2840147752, + -1869875816, + -1693706400, + -1680490800, + -1570413600, + -1552186800, + -1538359200, + -1522551600, + -1507514400, + -1490583600, + -1440208800, + -1428030000, + -1409709600, + -1396494000, + -931053600, + -922676400, + -917834400, + -892436400, + -875844000, + -764737200, + -744343200, + -733806000, + -716436000, + -701924400, + -684986400, + -670474800, + -654141600, + -639025200, + -622087200, + -606970800, + -590032800, + -575521200, + -235620000, + -194842800, + -177732000, + -165726000, + 107910000, + 121215600, + 133920000, + 152665200, + 164678400, + 184114800, + 196214400, + 215564400, + 228873600, + 245804400, + 260323200, + 267915600, + 428454000, + 433893600, + 468111600, + 482799600, + 496710000, + 512521200, + 528246000, + 543970800, + 559695600, + 575420400, + 591145200, + 606870000, + 622594800, + 638319600, + 654649200, + 670374000, + 686098800, + 701823600, + 717548400, + 733273200, + 748998000, + 764118000, + 780447600, + 796172400, + 811897200, + 828226800, + 846370800, + 859676400, + 877820400, + 891126000, + 909270000, + 922575600, + 941324400, + 954025200, + 972774000, + 985474800, + 1004223600, + 1017529200, + 1035673200, + 1048978800, + 1067122800, + 1080428400, + 1099177200, + 1111878000, + 1130626800, + 1143327600, + 1162076400, + 1174784400, + 1193533200, + 1206838800, + 1224982800, + 1238288400, + 1256432400, + 1269738000, + 1288486800, + 1301274000, + 1319936400, + 1332637200, + 1351386000, + 1364691600, + 1382835600, + 1396227600, + 1414285200, + 1427590800, + 1446944400, + 1459040400, + 1473195600 + ], + "types": [ + { + "offset": 6952 + }, + { + "offset": 7016 + }, + { + "offset": 7200 + }, + { + "offset": 10800 + }, + { + "offset": 10800 + }, + { + "offset": 14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-239c7722f428fac8-7a4c4b125895f0bd.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-239c7722f428fac8-7a4c4b125895f0bd.json new file mode 100644 index 00000000000000..2040ebc2f37af4 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-239c7722f428fac8-7a4c4b125895f0bd.json @@ -0,0 +1,245 @@ +{ + "ids": [ + "america/north_dakota/new_salem" + ], + "tzif": { + "posix": { + "abbr": "CST", + "offset": -21600, + "transition": { + "abbr": "CDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3 + ], + "transitions": [ + -2717643600, + -1633273200, + -1615132800, + -1601823600, + -1583683200, + -880210800, + -769395600, + -765388800, + -84380400, + -68659200, + -52930800, + -37209600, + -21481200, + -5760000, + 9968400, + 25689600, + 41418000, + 57744000, + 73472400, + 89193600, + 104922000, + 120643200, + 126694800, + 152092800, + 162378000, + 183542400, + 199270800, + 215596800, + 230720400, + 247046400, + 262774800, + 278496000, + 294224400, + 309945600, + 325674000, + 341395200, + 357123600, + 372844800, + 388573200, + 404899200, + 420022800, + 436348800, + 452077200, + 467798400, + 483526800, + 499248000, + 514976400, + 530697600, + 544611600, + 562147200, + 576061200, + 594201600, + 607510800, + 625651200, + 638960400, + 657100800, + 671014800, + 688550400, + 702464400, + 720000000, + 733914000, + 752054400, + 765363600, + 783504000, + 796813200, + 814953600, + 828867600, + 846403200, + 860317200, + 877852800, + 891766800, + 909302400, + 923216400, + 941356800, + 954666000, + 972806400, + 986115600, + 1004256000, + 1018170000, + 1035705600, + 1049619600, + 1067155200, + 1081065600, + 1099206000, + 1112515200, + 1130655600, + 1143964800, + 1162105200, + 1173600000, + 1194159600 + ], + "types": [ + { + "offset": -24339 + }, + { + "offset": -25200 + }, + { + "offset": -21600 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2450804cbdb4245e-fc28955e4978e50d.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2450804cbdb4245e-fc28955e4978e50d.json new file mode 100644 index 00000000000000..410d980cae1ae6 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2450804cbdb4245e-fc28955e4978e50d.json @@ -0,0 +1,261 @@ +{ + "ids": [ + "america/adak", + "america/atka", + "us/aleutian" + ], + "tzif": { + "posix": { + "abbr": "HST", + "offset": -36000, + "transition": { + "abbr": "HDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 3, + 3, + 2, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 3, + 4, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4 + ], + "transitions": [ + -3225223727, + -2188944802, + -880196400, + -769395600, + -765374400, + -86878800, + -21466800, + -5745600, + 9982800, + 25704000, + 41432400, + 57758400, + 73486800, + 89208000, + 104936400, + 120657600, + 126709200, + 152107200, + 162392400, + 183556800, + 199285200, + 215611200, + 230734800, + 247060800, + 262789200, + 278510400, + 294238800, + 309960000, + 325688400, + 341409600, + 357138000, + 372859200, + 388587600, + 404913600, + 420037200, + 436363200, + 439034400, + 452088000, + 467809200, + 483537600, + 499258800, + 514987200, + 530708400, + 544622400, + 562158000, + 576072000, + 594212400, + 607521600, + 625662000, + 638971200, + 657111600, + 671025600, + 688561200, + 702475200, + 720010800, + 733924800, + 752065200, + 765374400, + 783514800, + 796824000, + 814964400, + 828878400, + 846414000, + 860328000, + 877863600, + 891777600, + 909313200, + 923227200, + 941367600, + 954676800, + 972817200, + 986126400, + 1004266800, + 1018180800, + 1035716400, + 1049630400, + 1067166000, + 1081080000, + 1099220400, + 1112529600, + 1130670000, + 1143979200, + 1162119600, + 1173614400, + 1194174000 + ], + "types": [ + { + "offset": 44002 + }, + { + "offset": -42398 + }, + { + "offset": -39600 + }, + { + "offset": -36000 + }, + { + "offset": -36000 + }, + { + "offset": -32400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-24b250ef0928a9e9-6530a4ca5485dc31.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-24b250ef0928a9e9-6530a4ca5485dc31.json new file mode 100644 index 00000000000000..58d5b54283ee54 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-24b250ef0928a9e9-6530a4ca5485dc31.json @@ -0,0 +1,33 @@ +{ + "ids": [ + "africa/ndjamena" + ], + "tzif": { + "posix": { + "abbr": "WAT", + "offset": 3600, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1 + ], + "transitions": [ + -1830387612, + 308703600, + 321314400 + ], + "types": [ + { + "offset": 3612 + }, + { + "offset": 3600 + }, + { + "offset": 7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-24bc4f701e560e8f-fbbcb1e6855b01a1.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-24bc4f701e560e8f-fbbcb1e6855b01a1.json new file mode 100644 index 00000000000000..7092c8654595c0 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-24bc4f701e560e8f-fbbcb1e6855b01a1.json @@ -0,0 +1,167 @@ +{ + "ids": [ + "america/argentina/buenos_aires", + "america/buenos_aires" + ], + "tzif": { + "posix": { + "abbr": "-03", + "offset": -10800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 3, + 4, + 3, + 4, + 5, + 3, + 4, + 5 + ], + "transitions": [ + -2372097972, + -1567453392, + -1233432000, + -1222981200, + -1205956800, + -1194037200, + -1172865600, + -1162501200, + -1141329600, + -1130965200, + -1109793600, + -1099429200, + -1078257600, + -1067806800, + -1046635200, + -1036270800, + -1015099200, + -1004734800, + -983563200, + -973198800, + -952027200, + -941576400, + -931032000, + -900882000, + -890337600, + -833749200, + -827265600, + -752274000, + -733780800, + -197326800, + -190843200, + -184194000, + -164491200, + -152658000, + -132955200, + -121122000, + -101419200, + -86821200, + -71092800, + -54766800, + -39038400, + -23317200, + -7588800, + 128142000, + 136605600, + 596948400, + 605066400, + 624423600, + 636516000, + 656478000, + 667965600, + 687927600, + 699415200, + 719377200, + 731469600, + 938919600, + 952052400, + 1198983600, + 1205632800, + 1224385200 + ], + "types": [ + { + "offset": -14028 + }, + { + "offset": -15408 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + }, + { + "offset": -10800 + }, + { + "offset": -7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-25763d8b26764a7a-5933d51fd56b3fdf.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-25763d8b26764a7a-5933d51fd56b3fdf.json new file mode 100644 index 00000000000000..7bcfeefaf17b33 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-25763d8b26764a7a-5933d51fd56b3fdf.json @@ -0,0 +1,101 @@ +{ + "ids": [ + "africa/khartoum" + ], + "tzif": { + "posix": { + "abbr": "CAT", + "offset": 7200, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 3, + 1 + ], + "transitions": [ + -1230775808, + 10360800, + 24786000, + 41810400, + 56322000, + 73432800, + 87944400, + 104882400, + 119480400, + 136332000, + 151016400, + 167781600, + 182552400, + 199231200, + 214174800, + 230680800, + 245710800, + 262735200, + 277246800, + 294184800, + 308782800, + 325634400, + 340405200, + 357084000, + 371941200, + 388533600, + 403477200, + 419983200, + 435013200, + 452037600, + 466635600, + 483487200, + 498171600, + 947930400, + 1509483600 + ], + "types": [ + { + "offset": 7808 + }, + { + "offset": 7200 + }, + { + "offset": 10800 + }, + { + "offset": 10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-26ac36da2732c840-dedd53591694d48d.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-26ac36da2732c840-dedd53591694d48d.json new file mode 100644 index 00000000000000..f610efed9b7fa8 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-26ac36da2732c840-dedd53591694d48d.json @@ -0,0 +1,163 @@ +{ + "ids": [ + "america/argentina/salta" + ], + "tzif": { + "posix": { + "abbr": "-03", + "offset": -10800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 2, + 5, + 3, + 4, + 5, + 3, + 4, + 3, + 4, + 3, + 4, + 5, + 3, + 4 + ], + "transitions": [ + -2372096300, + -1567453392, + -1233432000, + -1222981200, + -1205956800, + -1194037200, + -1172865600, + -1162501200, + -1141329600, + -1130965200, + -1109793600, + -1099429200, + -1078257600, + -1067806800, + -1046635200, + -1036270800, + -1015099200, + -1004734800, + -983563200, + -973198800, + -952027200, + -941576400, + -931032000, + -900882000, + -890337600, + -833749200, + -827265600, + -752274000, + -733780800, + -197326800, + -190843200, + -184194000, + -164491200, + -152658000, + -132955200, + -121122000, + -101419200, + -86821200, + -71092800, + -54766800, + -39038400, + -23317200, + -7588800, + 128142000, + 136605600, + 596948400, + 605066400, + 624423600, + 636516000, + 656478000, + 667965600, + 687931200, + 699415200, + 719377200, + 731469600, + 938919600, + 952052400, + 1198983600, + 1205632800 + ], + "types": [ + { + "offset": -15700 + }, + { + "offset": -15408 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + }, + { + "offset": -10800 + }, + { + "offset": -7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-26aecc98f9d83045-d767019b239f072.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-26aecc98f9d83045-d767019b239f072.json new file mode 100644 index 00000000000000..2d80a757a35eaf --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-26aecc98f9d83045-d767019b239f072.json @@ -0,0 +1,187 @@ +{ + "ids": [ + "america/indiana/petersburg" + ], + "tzif": { + "posix": { + "abbr": "EST", + "offset": -18000, + "transition": { + "abbr": "EDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 2, + 3 + ], + "transitions": [ + -2717647200, + -1633276800, + -1615136400, + -1601827200, + -1583686800, + -880214400, + -769395600, + -765392400, + -462996000, + -450291600, + -431539200, + -418237200, + -400089600, + -386787600, + -368640000, + -355338000, + -337190400, + -323888400, + -305740800, + -292438800, + -273686400, + -257965200, + -242236800, + -226515600, + -210787200, + -195066000, + -179337600, + -163616400, + -147888000, + -100112400, + -84384000, + -68662800, + -52934400, + -37213200, + -21484800, + -5763600, + 9964800, + 25686000, + 41414400, + 57740400, + 73468800, + 89190000, + 104918400, + 120639600, + 126691200, + 152089200, + 162374400, + 183538800, + 199267200, + 215593200, + 230716800, + 247042800, + 1143961200, + 1143964800, + 1162105200, + 1173600000, + 1194159600 + ], + "types": [ + { + "offset": -20947 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + }, + { + "offset": -18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-26bf0cacd24f77a1-a98e0c85e152f06e.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-26bf0cacd24f77a1-a98e0c85e152f06e.json new file mode 100644 index 00000000000000..81c37cebb14d25 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-26bf0cacd24f77a1-a98e0c85e152f06e.json @@ -0,0 +1,109 @@ +{ + "ids": [ + "europe/andorra" + ], + "tzif": { + "posix": { + "abbr": "CET", + "offset": 3600, + "transition": { + "abbr": "CEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 10800 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2 + ], + "transitions": [ + -2177453164, + -733881600, + 481078800, + 496803600, + 512528400, + 528253200, + 543978000, + 559702800, + 575427600, + 591152400, + 606877200, + 622602000, + 638326800, + 654656400, + 670381200, + 686106000, + 701830800, + 717555600, + 733280400, + 749005200, + 764730000, + 780454800, + 796179600, + 811904400, + 828234000, + 846378000 + ], + "types": [ + { + "offset": 364 + }, + { + "offset": 0 + }, + { + "offset": 3600 + }, + { + "offset": 7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-273d77751416ce66-188ad35538918cca.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-273d77751416ce66-188ad35538918cca.json new file mode 100644 index 00000000000000..ebad836a0f7d1b --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-273d77751416ce66-188ad35538918cca.json @@ -0,0 +1,149 @@ +{ + "ids": [ + "america/port-au-prince" + ], + "tzif": { + "posix": { + "abbr": "EST", + "offset": -18000, + "transition": { + "abbr": "EDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2 + ], + "transitions": [ + -2524504240, + -1670483460, + 421218000, + 436334400, + 452062800, + 467784000, + 483512400, + 499233600, + 514962000, + 530683200, + 546411600, + 562132800, + 576050400, + 594194400, + 607500000, + 625644000, + 638949600, + 657093600, + 671004000, + 688543200, + 702453600, + 719992800, + 733903200, + 752047200, + 765352800, + 783496800, + 796802400, + 814946400, + 828856800, + 846396000, + 860306400, + 877845600, + 1112504400, + 1130644800, + 1143954000, + 1162094400, + 1331449200, + 1352008800, + 1362898800, + 1383458400, + 1394348400, + 1414908000, + 1425798000, + 1446357600, + 1489302000, + 1509861600 + ], + "types": [ + { + "offset": -17360 + }, + { + "offset": -17340 + }, + { + "offset": -18000 + }, + { + "offset": -14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-283cf30fce0ee58e-ee056ab931c35019.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-283cf30fce0ee58e-ee056ab931c35019.json new file mode 100644 index 00000000000000..382c8e0d2b5979 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-283cf30fce0ee58e-ee056ab931c35019.json @@ -0,0 +1,70 @@ +{ + "ids": [ + "asia/brunei", + "asia/kuching" + ], + "tzif": { + "posix": { + "abbr": "+08", + "offset": 28800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 4, + 2 + ], + "transitions": [ + -1383463280, + -1167636600, + -1082448000, + -1074586800, + -1050825600, + -1042964400, + -1019289600, + -1011428400, + -987753600, + -979892400, + -956217600, + -948356400, + -924595200, + -916734000, + -893059200, + -885198000, + -879667200, + -767005200 + ], + "types": [ + { + "offset": 26480 + }, + { + "offset": 27000 + }, + { + "offset": 28800 + }, + { + "offset": 30000 + }, + { + "offset": 32400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-291cff29f8a99dfe-401473cfba65f82d.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-291cff29f8a99dfe-401473cfba65f82d.json new file mode 100644 index 00000000000000..f05550ee11962f --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-291cff29f8a99dfe-401473cfba65f82d.json @@ -0,0 +1,187 @@ +{ + "ids": [ + "asia/novokuznetsk" + ], + "tzif": { + "posix": { + "abbr": "+07", + "offset": 25200, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 4, + 2, + 4, + 1, + 3, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4 + ], + "transitions": [ + -1441259328, + -1247551200, + 354906000, + 370713600, + 386442000, + 402249600, + 417978000, + 433785600, + 449600400, + 465332400, + 481057200, + 496782000, + 512506800, + 528231600, + 543956400, + 559681200, + 575406000, + 591130800, + 606855600, + 622580400, + 638305200, + 654634800, + 670359600, + 670363200, + 686088000, + 695764800, + 701809200, + 717534000, + 733258800, + 748983600, + 764708400, + 780433200, + 796158000, + 811882800, + 828212400, + 846356400, + 859662000, + 877806000, + 891111600, + 909255600, + 922561200, + 941310000, + 954010800, + 972759600, + 985460400, + 1004209200, + 1017514800, + 1035658800, + 1048964400, + 1067108400, + 1080414000, + 1099162800, + 1111863600, + 1130612400, + 1143313200, + 1162062000, + 1174762800, + 1193511600, + 1206817200, + 1224961200, + 1238266800, + 1256410800, + 1269716400, + 1269720000, + 1288468800, + 1301169600 + ], + "types": [ + { + "offset": 20928 + }, + { + "offset": 21600 + }, + { + "offset": 25200 + }, + { + "offset": 28800 + }, + { + "offset": 25200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2a2176981e284105-59c6fda81a2a226c.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2a2176981e284105-59c6fda81a2a226c.json new file mode 100644 index 00000000000000..99c9d868be8581 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2a2176981e284105-59c6fda81a2a226c.json @@ -0,0 +1,59 @@ +{ + "ids": [ + "australia/eucla" + ], + "tzif": { + "posix": { + "abbr": "+0845", + "offset": 31500, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2 + ], + "transitions": [ + -2337928528, + -1672555500, + -1665384300, + -883637100, + -876120300, + -860395500, + -844670700, + 152039700, + 162926100, + 436295700, + 447182100, + 690311700, + 699383700, + 1165079700, + 1174756500, + 1193505300 + ], + "types": [ + { + "offset": 30928 + }, + { + "offset": 31500 + }, + { + "offset": 35100 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2a554d4e97833d6e-1eb5fb8bf2c9f728.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2a554d4e97833d6e-1eb5fb8bf2c9f728.json new file mode 100644 index 00000000000000..67e1af22ea67c6 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2a554d4e97833d6e-1eb5fb8bf2c9f728.json @@ -0,0 +1,19 @@ +{ + "ids": [ + "etc/gmt+9" + ], + "tzif": { + "posix": { + "abbr": "-09", + "offset": -32400, + "transition": null + }, + "transition_types": [], + "transitions": [], + "types": [ + { + "offset": -32400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2a7fc944a4c2991b-ed19eb01bbf45250.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2a7fc944a4c2991b-ed19eb01bbf45250.json new file mode 100644 index 00000000000000..cd69ddcc83060f --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2a7fc944a4c2991b-ed19eb01bbf45250.json @@ -0,0 +1,31 @@ +{ + "ids": [ + "asia/bangkok", + "asia/phnom_penh", + "asia/vientiane", + "indian/christmas" + ], + "tzif": { + "posix": { + "abbr": "+07", + "offset": 25200, + "transition": null + }, + "transition_types": [ + 0, + 1 + ], + "transitions": [ + -2840164924, + -1570084924 + ], + "types": [ + { + "offset": 24124 + }, + { + "offset": 25200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2a9b3a635fc27340-e824f8940a7a64f6.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2a9b3a635fc27340-e824f8940a7a64f6.json new file mode 100644 index 00000000000000..821b7cc5122730 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2a9b3a635fc27340-e824f8940a7a64f6.json @@ -0,0 +1,41 @@ +{ + "ids": [ + "america/paramaribo" + ], + "tzif": { + "posix": { + "abbr": "-03", + "offset": -10800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 4 + ], + "transitions": [ + -1861906760, + -1104524348, + -765317964, + 465449400 + ], + "types": [ + { + "offset": -13240 + }, + { + "offset": -13252 + }, + { + "offset": -13236 + }, + { + "offset": -12600 + }, + { + "offset": -10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2ae3e9466dbec3ec-2dfc2c7ddd060e6d.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2ae3e9466dbec3ec-2dfc2c7ddd060e6d.json new file mode 100644 index 00000000000000..fbfbd1d89b0c92 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2ae3e9466dbec3ec-2dfc2c7ddd060e6d.json @@ -0,0 +1,199 @@ +{ + "ids": [ + "europe/samara" + ], + "tzif": { + "posix": { + "abbr": "+04", + "offset": 14400, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 4, + 2, + 4, + 1, + 2, + 4, + 1, + 1, + 5, + 1, + 5, + 1, + 5, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4 + ], + "transitions": [ + -1593820800, + -1247540400, + 354916800, + 370724400, + 386452800, + 402260400, + 417988800, + 433796400, + 449611200, + 465343200, + 481068000, + 496792800, + 512517600, + 528242400, + 543967200, + 559692000, + 575416800, + 591141600, + 606866400, + 606870000, + 622594800, + 638319600, + 654649200, + 670374000, + 670377600, + 686102400, + 687916800, + 701820000, + 717544800, + 733269600, + 748994400, + 764719200, + 780444000, + 796168800, + 811893600, + 828223200, + 846367200, + 859672800, + 877816800, + 891122400, + 909266400, + 922572000, + 941320800, + 954021600, + 972770400, + 985471200, + 1004220000, + 1017525600, + 1035669600, + 1048975200, + 1067119200, + 1080424800, + 1099173600, + 1111874400, + 1130623200, + 1143324000, + 1162072800, + 1174773600, + 1193522400, + 1206828000, + 1224972000, + 1238277600, + 1256421600, + 1269727200, + 1269730800, + 1288479600, + 1301180400 + ], + "types": [ + { + "offset": 12020 + }, + { + "offset": 10800 + }, + { + "offset": 14400 + }, + { + "offset": 18000 + }, + { + "offset": 14400 + }, + { + "offset": 10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2b407bee2bf8cbea-39e72d1f00f10d06.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2b407bee2bf8cbea-39e72d1f00f10d06.json new file mode 100644 index 00000000000000..fb22f36175653e --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2b407bee2bf8cbea-39e72d1f00f10d06.json @@ -0,0 +1,400 @@ +{ + "ids": [ + "africa/el_aaiun" + ], + "tzif": { + "posix": { + "abbr": "+01", + "offset": 3600, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3 + ], + "transitions": [ + -1136070432, + 198291600, + 199756800, + 207702000, + 231292800, + 244249200, + 265507200, + 271033200, + 1212278400, + 1220223600, + 1243814400, + 1250809200, + 1272758400, + 1281222000, + 1301788800, + 1312066800, + 1335664800, + 1342749600, + 1345428000, + 1348970400, + 1367114400, + 1373162400, + 1376100000, + 1382839200, + 1396144800, + 1403920800, + 1406944800, + 1414288800, + 1427594400, + 1434247200, + 1437271200, + 1445738400, + 1459044000, + 1465092000, + 1468116000, + 1477792800, + 1490493600, + 1495332000, + 1498960800, + 1509242400, + 1521943200, + 1526176800, + 1529200800, + 1557021600, + 1560045600, + 1587261600, + 1590890400, + 1618106400, + 1621130400, + 1648346400, + 1651975200, + 1679191200, + 1682215200, + 1710036000, + 1713060000, + 1740276000, + 1743904800, + 1771120800, + 1774144800, + 1801965600, + 1804989600, + 1832205600, + 1835834400, + 1863050400, + 1866074400, + 1893290400, + 1896919200, + 1924135200, + 1927159200, + 1954980000, + 1958004000, + 1985220000, + 1988848800, + 2016064800, + 2019088800, + 2046304800, + 2049933600, + 2077149600, + 2080778400, + 2107994400, + 2111018400, + 2138234400, + 2141863200, + 2169079200, + 2172103200, + 2199924000, + 2202948000, + 2230164000, + 2233792800, + 2261008800, + 2264032800, + 2291248800, + 2294877600, + 2322093600, + 2325722400, + 2352938400, + 2355962400, + 2383178400, + 2386807200, + 2414023200, + 2417047200, + 2444868000, + 2447892000, + 2475108000, + 2478736800, + 2505952800, + 2508976800, + 2536192800, + 2539821600, + 2567037600, + 2570666400, + 2597882400, + 2600906400, + 2628122400, + 2631751200, + 2658967200, + 2661991200, + 2689812000, + 2692836000, + 2720052000, + 2723680800, + 2750896800, + 2753920800, + 2781136800, + 2784765600, + 2811981600, + 2815610400, + 2842826400, + 2845850400, + 2873066400, + 2876695200, + 2903911200, + 2906935200, + 2934756000, + 2937780000, + 2964996000, + 2968624800, + 2995840800, + 2998864800, + 3026080800, + 3029709600, + 3056925600, + 3060554400, + 3087770400, + 3090794400, + 3118010400, + 3121639200, + 3148855200, + 3151879200, + 3179700000, + 3182724000, + 3209940000, + 3213568800, + 3240784800, + 3243808800, + 3271024800, + 3274653600, + 3301869600, + 3305498400, + 3332714400, + 3335738400, + 3362954400, + 3366583200, + 3393799200, + 3396823200, + 3424644000, + 3427668000, + 3454884000, + 3458512800, + 3485728800, + 3488752800, + 3515968800, + 3519597600, + 3546813600, + 3549837600, + 3577658400, + 3580682400, + 3607898400, + 3611527200, + 3638743200, + 3641767200, + 3669588000, + 3672612000, + 3699828000, + 3703456800 + ], + "types": [ + { + "offset": -3168 + }, + { + "offset": -3600 + }, + { + "offset": 0 + }, + { + "offset": 3600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2bd99bb6843e89cf-932580fc9a3a0c8d.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2bd99bb6843e89cf-932580fc9a3a0c8d.json new file mode 100644 index 00000000000000..e2fdc4ac7f09f7 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2bd99bb6843e89cf-932580fc9a3a0c8d.json @@ -0,0 +1,19 @@ +{ + "ids": [ + "etc/gmt-8" + ], + "tzif": { + "posix": { + "abbr": "+08", + "offset": 28800, + "transition": null + }, + "transition_types": [], + "transitions": [], + "types": [ + { + "offset": 28800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2be99c3dd72ebbf9-e08d147873aff81.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2be99c3dd72ebbf9-e08d147873aff81.json new file mode 100644 index 00000000000000..0121b65b33d6f3 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2be99c3dd72ebbf9-e08d147873aff81.json @@ -0,0 +1,36 @@ +{ + "ids": [ + "pacific/kiritimati" + ], + "tzif": { + "posix": { + "abbr": "+14", + "offset": 50400, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3 + ], + "transitions": [ + -2177415040, + 307622400, + 788868000 + ], + "types": [ + { + "offset": -37760 + }, + { + "offset": -38400 + }, + { + "offset": -36000 + }, + { + "offset": 50400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2c1bb7953877feff-4c66e005cbf579fe.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2c1bb7953877feff-4c66e005cbf579fe.json new file mode 100644 index 00000000000000..a0b81cf6290dc1 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2c1bb7953877feff-4c66e005cbf579fe.json @@ -0,0 +1,212 @@ +{ + "ids": [ + "america/ciudad_juarez" + ], + "tzif": { + "posix": { + "abbr": "MST", + "offset": -25200, + "transition": { + "abbr": "MDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 3, + 1, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 2, + 3, + 1 + ], + "transitions": [ + -1514739600, + -1343149200, + -1234807200, + -1220461200, + -1207159200, + -1191344400, + 828864000, + 846399600, + 860313600, + 877849200, + 891766800, + 909302400, + 923216400, + 941356800, + 954666000, + 972806400, + 989139600, + 1001836800, + 1018170000, + 1035705600, + 1049619600, + 1067155200, + 1081069200, + 1099209600, + 1112518800, + 1130659200, + 1143968400, + 1162108800, + 1175418000, + 1193558400, + 1207472400, + 1225008000, + 1238922000, + 1256457600, + 1268557200, + 1289116800, + 1300006800, + 1320566400, + 1331456400, + 1352016000, + 1362906000, + 1383465600, + 1394355600, + 1414915200, + 1425805200, + 1446364800, + 1457859600, + 1478419200, + 1489309200, + 1509868800, + 1520758800, + 1541318400, + 1552208400, + 1572768000, + 1583658000, + 1604217600, + 1615712400, + 1636272000, + 1647162000, + 1667116800, + 1669788000 + ], + "types": [ + { + "offset": -25556 + }, + { + "offset": -25200 + }, + { + "offset": -21600 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2d819a70236c9f86-721e9b57fc17e8df.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2d819a70236c9f86-721e9b57fc17e8df.json new file mode 100644 index 00000000000000..0a9a6edf70c84a --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-2d819a70236c9f86-721e9b57fc17e8df.json @@ -0,0 +1,19 @@ +{ + "ids": [ + "etc/gmt+2" + ], + "tzif": { + "posix": { + "abbr": "-02", + "offset": -7200, + "transition": null + }, + "transition_types": [], + "transitions": [], + "types": [ + { + "offset": -7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3234542952508833-776aeadf2e17fcb4.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3234542952508833-776aeadf2e17fcb4.json new file mode 100644 index 00000000000000..cfaa49a044f546 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3234542952508833-776aeadf2e17fcb4.json @@ -0,0 +1,87 @@ +{ + "ids": [ + "america/monterrey" + ], + "tzif": { + "posix": { + "abbr": "CST", + "offset": -21600, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 3, + 1, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3 + ], + "transitions": [ + -1514743200, + -1343149200, + -1234807200, + -1220461200, + -1207159200, + -1191344400, + 576057600, + 594198000, + 828864000, + 846399600, + 860313600, + 877849200, + 891763200, + 909298800, + 923212800, + 941353200, + 954662400, + 972802800, + 989136000, + 1001833200, + 1018166400, + 1035702000 + ], + "types": [ + { + "offset": -24076 + }, + { + "offset": -25200 + }, + { + "offset": -21600 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-33db81d7f03c072e-e083980d979c0926.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-33db81d7f03c072e-e083980d979c0926.json new file mode 100644 index 00000000000000..c6f248e4c19cfa --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-33db81d7f03c072e-e083980d979c0926.json @@ -0,0 +1,225 @@ +{ + "ids": [ + "america/yakutat" + ], + "tzif": { + "posix": { + "abbr": "AKST", + "offset": -32400, + "transition": { + "abbr": "AKDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 3, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2 + ], + "transitions": [ + -3225223727, + -2188953665, + -880203600, + -769395600, + -765381600, + -21474000, + -5752800, + 9975600, + 25696800, + 41425200, + 57751200, + 73479600, + 89200800, + 104929200, + 120650400, + 126702000, + 152100000, + 162385200, + 183549600, + 199278000, + 215604000, + 230727600, + 247053600, + 262782000, + 278503200, + 294231600, + 309952800, + 325681200, + 341402400, + 357130800, + 372852000, + 388580400, + 404906400, + 420030000, + 436356000, + 439030800, + 452084400, + 467805600, + 483534000, + 499255200, + 514983600, + 530704800, + 544618800, + 562154400, + 576068400, + 594208800, + 607518000, + 625658400, + 638967600, + 657108000, + 671022000, + 688557600, + 702471600, + 720007200, + 733921200, + 752061600, + 765370800, + 783511200, + 796820400, + 814960800, + 828874800, + 846410400, + 860324400, + 877860000, + 891774000, + 909309600, + 923223600, + 941364000, + 954673200, + 972813600, + 986122800, + 1004263200, + 1018177200, + 1035712800, + 1049626800, + 1067162400, + 1081076400, + 1099216800, + 1112526000, + 1130666400, + 1143975600, + 1162116000, + 1173610800, + 1194170400 + ], + "types": [ + { + "offset": 52865 + }, + { + "offset": -33535 + }, + { + "offset": -32400 + }, + { + "offset": -28800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-34047004b336df3e-bbe8e4196294f00a.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-34047004b336df3e-bbe8e4196294f00a.json new file mode 100644 index 00000000000000..db806ecb2d352d --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-34047004b336df3e-bbe8e4196294f00a.json @@ -0,0 +1,308 @@ +{ + "ids": [ + "europe/gibraltar" + ], + "tzif": { + "posix": { + "abbr": "CET", + "offset": 3600, + "transition": { + "abbr": "CEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 10800 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 1, + 2, + 1, + 2, + 3, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4 + ], + "transitions": [ + -2821649916, + -1691964000, + -1680472800, + -1664143200, + -1650146400, + -1633903200, + -1617487200, + -1601848800, + -1586037600, + -1570399200, + -1552168800, + -1538344800, + -1522533600, + -1507500000, + -1490565600, + -1473631200, + -1460930400, + -1442786400, + -1428876000, + -1410732000, + -1396216800, + -1379282400, + -1364767200, + -1348437600, + -1333317600, + -1315778400, + -1301263200, + -1284328800, + -1269813600, + -1253484000, + -1238364000, + -1221429600, + -1206914400, + -1189980000, + -1175464800, + -1159135200, + -1143410400, + -1126476000, + -1111960800, + -1095631200, + -1080511200, + -1063576800, + -1049061600, + -1032127200, + -1017612000, + -1001282400, + -986162400, + -969228000, + -950479200, + -942012000, + -904518000, + -896050800, + -875487600, + -864601200, + -844038000, + -832546800, + -812588400, + -798073200, + -781052400, + -772066800, + -764805600, + -748476000, + -733356000, + -719445600, + -717030000, + -706748400, + -699487200, + -687996000, + -668037600, + -654732000, + -636588000, + -622072800, + -605743200, + -590623200, + -574293600, + -558568800, + -542239200, + -527119200, + -512604000, + -496274400, + -481154400, + -464220000, + -449704800, + -432165600, + -417650400, + -401320800, + 378687600, + 401850000, + 417574800, + 433299600, + 449024400, + 465354000, + 481078800, + 496803600, + 512528400, + 528253200, + 543978000, + 559702800, + 575427600, + 591152400, + 606877200, + 622602000, + 638326800, + 654656400, + 670381200, + 686106000, + 701830800, + 717555600, + 733280400, + 749005200, + 764730000, + 780454800, + 796179600, + 811904400, + 828234000, + 846378000 + ], + "types": [ + { + "offset": -1284 + }, + { + "offset": 0 + }, + { + "offset": 3600 + }, + { + "offset": 7200 + }, + { + "offset": 3600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-355a4a5906a54477-e95040f92d9fdd8d.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-355a4a5906a54477-e95040f92d9fdd8d.json new file mode 100644 index 00000000000000..ab0fb4881687ca --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-355a4a5906a54477-e95040f92d9fdd8d.json @@ -0,0 +1,38 @@ +{ + "ids": [ + "pacific/nauru" + ], + "tzif": { + "posix": { + "abbr": "+12", + "offset": 43200, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 3 + ], + "transitions": [ + -1545131260, + -862918200, + -767350800, + 287418600 + ], + "types": [ + { + "offset": 40060 + }, + { + "offset": 41400 + }, + { + "offset": 32400 + }, + { + "offset": 43200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3567a65ce3b07b4a-eda38ce2d13af268.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3567a65ce3b07b4a-eda38ce2d13af268.json new file mode 100644 index 00000000000000..199abb8a269e02 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3567a65ce3b07b4a-eda38ce2d13af268.json @@ -0,0 +1,105 @@ +{ + "ids": [ + "america/fortaleza" + ], + "tzif": { + "posix": { + "abbr": "-03", + "offset": -10800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -1767216360, + -1206957600, + -1191362400, + -1175374800, + -1159826400, + -633819600, + -622069200, + -602283600, + -591832800, + -570747600, + -560210400, + -539125200, + -531352800, + -191365200, + -184197600, + -155163600, + -150069600, + -128898000, + -121125600, + -99954000, + -89589600, + -68418000, + -57967200, + 499748400, + 511236000, + 530593200, + 540266400, + 562129200, + 571197600, + 592974000, + 602042400, + 624423600, + 634701600, + 938919600, + 951616800, + 970974000, + 972180000, + 1003028400, + 1013911200 + ], + "types": [ + { + "offset": -9240 + }, + { + "offset": -10800 + }, + { + "offset": -7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-36890fddb7a9031e-81d4ff9e4c89f2e8.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-36890fddb7a9031e-81d4ff9e4c89f2e8.json new file mode 100644 index 00000000000000..694b3d0dd1ee51 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-36890fddb7a9031e-81d4ff9e4c89f2e8.json @@ -0,0 +1,193 @@ +{ + "ids": [ + "asia/chita" + ], + "tzif": { + "posix": { + "abbr": "+09", + "offset": 32400, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 4, + 2, + 4, + 1, + 3, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 5, + 1, + 2, + 4 + ], + "transitions": [ + -1579419232, + -1247558400, + 354898800, + 370706400, + 386434800, + 402242400, + 417970800, + 433778400, + 449593200, + 465325200, + 481050000, + 496774800, + 512499600, + 528224400, + 543949200, + 559674000, + 575398800, + 591123600, + 606848400, + 622573200, + 638298000, + 654627600, + 670352400, + 670356000, + 686080800, + 695757600, + 701802000, + 717526800, + 733251600, + 748976400, + 764701200, + 780426000, + 796150800, + 811875600, + 828205200, + 846349200, + 859654800, + 877798800, + 891104400, + 909248400, + 922554000, + 941302800, + 954003600, + 972752400, + 985453200, + 1004202000, + 1017507600, + 1035651600, + 1048957200, + 1067101200, + 1080406800, + 1099155600, + 1111856400, + 1130605200, + 1143306000, + 1162054800, + 1174755600, + 1193504400, + 1206810000, + 1224954000, + 1238259600, + 1256403600, + 1269709200, + 1288458000, + 1301158800, + 1414252800, + 1459015200 + ], + "types": [ + { + "offset": 27232 + }, + { + "offset": 28800 + }, + { + "offset": 32400 + }, + { + "offset": 36000 + }, + { + "offset": 32400 + }, + { + "offset": 36000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-37762e44a2edd792-4f1b10d181e56a5d.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-37762e44a2edd792-4f1b10d181e56a5d.json new file mode 100644 index 00000000000000..b7ec567d32235d --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-37762e44a2edd792-4f1b10d181e56a5d.json @@ -0,0 +1,151 @@ +{ + "ids": [ + "asia/nicosia", + "europe/nicosia" + ], + "tzif": { + "posix": { + "abbr": "EET", + "offset": 7200, + "transition": { + "abbr": "EEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 14400 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 10800 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2 + ], + "transitions": [ + -1518920008, + 166572000, + 182293200, + 200959200, + 213829200, + 228866400, + 243982800, + 260316000, + 276123600, + 291765600, + 307486800, + 323820000, + 338936400, + 354664800, + 370386000, + 386114400, + 401835600, + 417564000, + 433285200, + 449013600, + 465339600, + 481068000, + 496789200, + 512517600, + 528238800, + 543967200, + 559688400, + 575416800, + 591138000, + 606866400, + 622587600, + 638316000, + 654642000, + 670370400, + 686091600, + 701820000, + 717541200, + 733269600, + 748990800, + 764719200, + 780440400, + 796168800, + 811890000, + 828223200, + 843944400, + 859672800, + 875394000, + 891122400 + ], + "types": [ + { + "offset": 8008 + }, + { + "offset": 7200 + }, + { + "offset": 10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-380c01b13aae6590-113f60eeecce7355.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-380c01b13aae6590-113f60eeecce7355.json new file mode 100644 index 00000000000000..b297d4d4220e13 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-380c01b13aae6590-113f60eeecce7355.json @@ -0,0 +1,169 @@ +{ + "ids": [ + "america/argentina/ushuaia" + ], + "tzif": { + "posix": { + "abbr": "-03", + "offset": -10800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 3, + 4, + 3, + 4, + 2, + 3, + 4, + 5, + 3, + 4 + ], + "transitions": [ + -2372095608, + -1567453392, + -1233432000, + -1222981200, + -1205956800, + -1194037200, + -1172865600, + -1162501200, + -1141329600, + -1130965200, + -1109793600, + -1099429200, + -1078257600, + -1067806800, + -1046635200, + -1036270800, + -1015099200, + -1004734800, + -983563200, + -973198800, + -952027200, + -941576400, + -931032000, + -900882000, + -890337600, + -833749200, + -827265600, + -752274000, + -733780800, + -197326800, + -190843200, + -184194000, + -164491200, + -152658000, + -132955200, + -121122000, + -101419200, + -86821200, + -71092800, + -54766800, + -39038400, + -23317200, + -7588800, + 128142000, + 136605600, + 596948400, + 605066400, + 624423600, + 636516000, + 656478000, + 667965600, + 687927600, + 699415200, + 719377200, + 731469600, + 938919600, + 952052400, + 1085886000, + 1087704000, + 1198983600, + 1205632800 + ], + "types": [ + { + "offset": -16392 + }, + { + "offset": -15408 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + }, + { + "offset": -10800 + }, + { + "offset": -7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-38d88ef47726082c-a2b861350ff9abaf.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-38d88ef47726082c-a2b861350ff9abaf.json new file mode 100644 index 00000000000000..732b957b94c895 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-38d88ef47726082c-a2b861350ff9abaf.json @@ -0,0 +1,38 @@ +{ + "ids": [ + "america/guyana" + ], + "tzif": { + "posix": { + "abbr": "-04", + "offset": -14400, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 1 + ], + "transitions": [ + -1843589241, + -1730577600, + 176096700, + 701841600 + ], + "types": [ + { + "offset": -13959 + }, + { + "offset": -14400 + }, + { + "offset": -13500 + }, + { + "offset": -10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3994d21beae7c7b6-eb145d056159d80.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3994d21beae7c7b6-eb145d056159d80.json new file mode 100644 index 00000000000000..5eda4ef05aa56a --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3994d21beae7c7b6-eb145d056159d80.json @@ -0,0 +1,408 @@ +{ + "ids": [ + "america/new_york", + "est5edt", + "us/eastern" + ], + "tzif": { + "posix": { + "abbr": "EST", + "offset": -18000, + "transition": { + "abbr": "EDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -2717650800, + -1633280400, + -1615140000, + -1601830800, + -1583690400, + -1570381200, + -1551636000, + -1536512400, + -1523210400, + -1504458000, + -1491760800, + -1473008400, + -1459706400, + -1441558800, + -1428256800, + -1410109200, + -1396807200, + -1378659600, + -1365357600, + -1347210000, + -1333908000, + -1315155600, + -1301853600, + -1283706000, + -1270404000, + -1252256400, + -1238954400, + -1220806800, + -1207504800, + -1189357200, + -1176055200, + -1157302800, + -1144605600, + -1125853200, + -1112551200, + -1094403600, + -1081101600, + -1062954000, + -1049652000, + -1031504400, + -1018202400, + -1000054800, + -986752800, + -968000400, + -955303200, + -936550800, + -923248800, + -905101200, + -891799200, + -880218000, + -769395600, + -765396000, + -747248400, + -733946400, + -715798800, + -702496800, + -684349200, + -671047200, + -652899600, + -639597600, + -620845200, + -608148000, + -589395600, + -576093600, + -557946000, + -544644000, + -526496400, + -513194400, + -495046800, + -481744800, + -463597200, + -447271200, + -431542800, + -415821600, + -400093200, + -384372000, + -368643600, + -352922400, + -337194000, + -321472800, + -305744400, + -289418400, + -273690000, + -257968800, + -242240400, + -226519200, + -210790800, + -195069600, + -179341200, + -163620000, + -147891600, + -131565600, + -116442000, + -100116000, + -84387600, + -68666400, + -52938000, + -37216800, + -21488400, + -5767200, + 9961200, + 25682400, + 41410800, + 57736800, + 73465200, + 89186400, + 104914800, + 120636000, + 126687600, + 152085600, + 162370800, + 183535200, + 199263600, + 215589600, + 230713200, + 247039200, + 262767600, + 278488800, + 294217200, + 309938400, + 325666800, + 341388000, + 357116400, + 372837600, + 388566000, + 404892000, + 420015600, + 436341600, + 452070000, + 467791200, + 483519600, + 499240800, + 514969200, + 530690400, + 544604400, + 562140000, + 576054000, + 594194400, + 607503600, + 625644000, + 638953200, + 657093600, + 671007600, + 688543200, + 702457200, + 719992800, + 733906800, + 752047200, + 765356400, + 783496800, + 796806000, + 814946400, + 828860400, + 846396000, + 860310000, + 877845600, + 891759600, + 909295200, + 923209200, + 941349600, + 954658800, + 972799200, + 986108400, + 1004248800, + 1018162800, + 1035698400, + 1049612400, + 1067148000, + 1081062000, + 1099202400, + 1112511600, + 1130652000, + 1143961200, + 1162101600, + 1173596400, + 1194156000 + ], + "types": [ + { + "offset": -17762 + }, + { + "offset": -18000 + }, + { + "offset": -14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3a07d4451f21c9ef-6b2242eea52b976b.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3a07d4451f21c9ef-6b2242eea52b976b.json new file mode 100644 index 00000000000000..bed8302e00b057 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3a07d4451f21c9ef-6b2242eea52b976b.json @@ -0,0 +1,265 @@ +{ + "ids": [ + "europe/warsaw", + "poland" + ], + "tzif": { + "posix": { + "abbr": "CET", + "offset": 3600, + "transition": { + "abbr": "CEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 10800 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 0, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 3, + 4, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1 + ], + "transitions": [ + -2840145840, + -1717032240, + -1693706400, + -1680483600, + -1663455600, + -1650150000, + -1632006000, + -1618700400, + -1600473600, + -1587168000, + -1501725600, + -931734000, + -857257200, + -844556400, + -828226800, + -812502000, + -796608000, + -778726800, + -762660000, + -748486800, + -733273200, + -715215600, + -701910000, + -684975600, + -670460400, + -654130800, + -639010800, + -397094400, + -386812800, + -371088000, + -355363200, + -334195200, + -323308800, + -307584000, + -291859200, + -271296000, + -260409600, + -239846400, + -228960000, + -208396800, + -197510400, + -176342400, + -166060800, + 228873600, + 243993600, + 260323200, + 276048000, + 291772800, + 307497600, + 323827200, + 338947200, + 354672000, + 370396800, + 386121600, + 401846400, + 417571200, + 433296000, + 449020800, + 465350400, + 481075200, + 496800000, + 512524800, + 528249600, + 543974400, + 559699200, + 567990000, + 591152400, + 606877200, + 622602000, + 638326800, + 654656400, + 670381200, + 686106000, + 701830800, + 717555600, + 733280400, + 749005200, + 764730000, + 780454800, + 796179600, + 811904400, + 828234000, + 846378000 + ], + "types": [ + { + "offset": 5040 + }, + { + "offset": 3600 + }, + { + "offset": 7200 + }, + { + "offset": 7200 + }, + { + "offset": 10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3a5a827f28d118e9-682e0a2d838b16ae.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3a5a827f28d118e9-682e0a2d838b16ae.json new file mode 100644 index 00000000000000..edbab3547764d7 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3a5a827f28d118e9-682e0a2d838b16ae.json @@ -0,0 +1,481 @@ +{ + "ids": [ + "america/chicago", + "cst6cdt", + "us/central" + ], + "tzif": { + "posix": { + "abbr": "CST", + "offset": -21600, + "transition": { + "abbr": "CDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1 + ], + "transitions": [ + -2717647200, + -1633276800, + -1615136400, + -1601827200, + -1583686800, + -1563724800, + -1551632400, + -1538928000, + -1520182800, + -1504454400, + -1491757200, + -1473004800, + -1459702800, + -1441555200, + -1428253200, + -1410105600, + -1396803600, + -1378656000, + -1365354000, + -1347206400, + -1333904400, + -1315152000, + -1301850000, + -1283702400, + -1270400400, + -1252252800, + -1238950800, + -1220803200, + -1207501200, + -1189353600, + -1176051600, + -1157299200, + -1144602000, + -1125849600, + -1112547600, + -1094400000, + -1081098000, + -1067788800, + -1045414800, + -1031500800, + -1018198800, + -1000051200, + -986749200, + -967996800, + -955299600, + -936547200, + -923245200, + -905097600, + -891795600, + -880214400, + -769395600, + -765392400, + -747244800, + -733942800, + -715795200, + -702493200, + -684345600, + -671043600, + -652896000, + -639594000, + -620841600, + -608144400, + -589392000, + -576090000, + -557942400, + -544640400, + -526492800, + -513190800, + -495043200, + -481741200, + -463593600, + -447267600, + -431539200, + -415818000, + -400089600, + -384368400, + -368640000, + -352918800, + -337190400, + -321469200, + -305740800, + -289414800, + -273686400, + -257965200, + -242236800, + -226515600, + -210787200, + -195066000, + -179337600, + -163616400, + -147888000, + -131562000, + -116438400, + -100112400, + -84384000, + -68662800, + -52934400, + -37213200, + -21484800, + -5763600, + 9964800, + 25686000, + 41414400, + 57740400, + 73468800, + 89190000, + 104918400, + 120639600, + 126691200, + 152089200, + 162374400, + 183538800, + 199267200, + 215593200, + 230716800, + 247042800, + 262771200, + 278492400, + 294220800, + 309942000, + 325670400, + 341391600, + 357120000, + 372841200, + 388569600, + 404895600, + 420019200, + 436345200, + 452073600, + 467794800, + 483523200, + 499244400, + 514972800, + 530694000, + 544608000, + 562143600, + 576057600, + 594198000, + 607507200, + 625647600, + 638956800, + 657097200, + 671011200, + 688546800, + 702460800, + 719996400, + 733910400, + 752050800, + 765360000, + 783500400, + 796809600, + 814950000, + 828864000, + 846399600, + 860313600, + 877849200, + 891763200, + 909298800, + 923212800, + 941353200, + 954662400, + 972802800, + 986112000, + 1004252400, + 1018166400, + 1035702000, + 1049616000, + 1067151600, + 1081065600, + 1099206000, + 1112515200, + 1130655600, + 1143964800, + 1162105200, + 1173600000, + 1194159600 + ], + "types": [ + { + "offset": -21036 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + }, + { + "offset": -18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3a6fecb09c143b25-73487cfbfb37a1d6.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3a6fecb09c143b25-73487cfbfb37a1d6.json new file mode 100644 index 00000000000000..6dd3b910d77f8c --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3a6fecb09c143b25-73487cfbfb37a1d6.json @@ -0,0 +1,236 @@ +{ + "ids": [ + "america/edmonton", + "america/yellowknife", + "canada/mountain" + ], + "tzif": { + "posix": { + "abbr": "MST", + "offset": -25200, + "transition": { + "abbr": "MDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -1998663968, + -1632063600, + -1615132800, + -1600614000, + -1596816000, + -1567954800, + -1551628800, + -1536505200, + -1523203200, + -1504450800, + -1491753600, + -1473001200, + -1459699200, + -880210800, + -769395600, + -765388800, + -715791600, + -702489600, + 73472400, + 89193600, + 104922000, + 120643200, + 136371600, + 152092800, + 167821200, + 183542400, + 199270800, + 215596800, + 230720400, + 247046400, + 262774800, + 278496000, + 294224400, + 309945600, + 325674000, + 341395200, + 357123600, + 372844800, + 388573200, + 404899200, + 420022800, + 436348800, + 452077200, + 467798400, + 483526800, + 499248000, + 514976400, + 530697600, + 536482800, + 562147200, + 576061200, + 594201600, + 607510800, + 625651200, + 638960400, + 657100800, + 671014800, + 688550400, + 702464400, + 720000000, + 733914000, + 752054400, + 765363600, + 783504000, + 796813200, + 814953600, + 828867600, + 846403200, + 860317200, + 877852800, + 891766800, + 909302400, + 923216400, + 941356800, + 954666000, + 972806400, + 986115600, + 1004256000, + 1018170000, + 1035705600, + 1049619600, + 1067155200, + 1081069200, + 1099209600, + 1112518800, + 1130659200, + 1143968400, + 1162108800, + 1173603600, + 1194163200 + ], + "types": [ + { + "offset": -27232 + }, + { + "offset": -25200 + }, + { + "offset": -21600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3c8506b1fc96536c-4c88dd0e00eba4f2.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3c8506b1fc96536c-4c88dd0e00eba4f2.json new file mode 100644 index 00000000000000..75fd4000318d9c --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3c8506b1fc96536c-4c88dd0e00eba4f2.json @@ -0,0 +1,19 @@ +{ + "ids": [ + "etc/gmt+1" + ], + "tzif": { + "posix": { + "abbr": "-01", + "offset": -3600, + "transition": null + }, + "transition_types": [], + "transitions": [], + "types": [ + { + "offset": -3600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3cc59865618b9844-e109dc95307db988.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3cc59865618b9844-e109dc95307db988.json new file mode 100644 index 00000000000000..787916aff640af --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3cc59865618b9844-e109dc95307db988.json @@ -0,0 +1,19 @@ +{ + "ids": [ + "etc/gmt-5" + ], + "tzif": { + "posix": { + "abbr": "+05", + "offset": 18000, + "transition": null + }, + "transition_types": [], + "transitions": [], + "types": [ + { + "offset": 18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3cc8439b3e85f059-8e4f59b418f8888a.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3cc8439b3e85f059-8e4f59b418f8888a.json new file mode 100644 index 00000000000000..ba409c58b518f2 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3cc8439b3e85f059-8e4f59b418f8888a.json @@ -0,0 +1,227 @@ +{ + "ids": [ + "america/cambridge_bay" + ], + "tzif": { + "posix": { + "abbr": "MST", + "offset": -25200, + "transition": { + "abbr": "MDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 3, + 4, + 4, + 5, + 2, + 3, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1 + ], + "transitions": [ + -1577923200, + -880210800, + -769395600, + -765388800, + 73472400, + 89193600, + 104922000, + 120643200, + 136371600, + 152092800, + 167821200, + 183542400, + 199270800, + 215596800, + 230720400, + 247046400, + 262774800, + 278496000, + 294224400, + 309945600, + 325674000, + 341395200, + 357123600, + 372844800, + 388573200, + 404899200, + 420022800, + 436348800, + 452077200, + 467798400, + 483526800, + 499248000, + 514976400, + 530697600, + 544611600, + 562147200, + 576061200, + 594201600, + 607510800, + 625651200, + 638960400, + 657100800, + 671014800, + 688550400, + 702464400, + 720000000, + 733914000, + 752054400, + 765363600, + 783504000, + 796813200, + 814953600, + 828867600, + 846403200, + 860317200, + 877852800, + 891766800, + 909302400, + 923216400, + 941356800, + 954662400, + 972802800, + 973400400, + 986115600, + 1004256000, + 1018170000, + 1035705600, + 1049619600, + 1067155200, + 1081069200, + 1099209600, + 1112518800, + 1130659200, + 1143968400, + 1162108800, + 1173603600, + 1194163200 + ], + "types": [ + { + "offset": 0 + }, + { + "offset": -25200 + }, + { + "offset": -21600 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + }, + { + "offset": -18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3d390ef79718594a-1d54abd9de1f791b.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3d390ef79718594a-1d54abd9de1f791b.json new file mode 100644 index 00000000000000..600da5393ecd4c --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3d390ef79718594a-1d54abd9de1f791b.json @@ -0,0 +1,71 @@ +{ + "ids": [ + "america/merida" + ], + "tzif": { + "posix": { + "abbr": "CST", + "offset": -21600, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1 + ], + "transitions": [ + -1514743200, + 378201600, + 405068400, + 828864000, + 846399600, + 860313600, + 877849200, + 891763200, + 909298800, + 923212800, + 941353200, + 954662400, + 972802800, + 989136000, + 1001833200, + 1018166400, + 1035702000 + ], + "types": [ + { + "offset": -21508 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + }, + { + "offset": -18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3d5473248adfd22d-72a86f7189e4c492.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3d5473248adfd22d-72a86f7189e4c492.json new file mode 100644 index 00000000000000..e262510dcdafcf --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3d5473248adfd22d-72a86f7189e4c492.json @@ -0,0 +1,77 @@ +{ + "ids": [ + "america/swift_current" + ], + "tzif": { + "posix": { + "abbr": "CST", + "offset": -21600, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 3 + ], + "transitions": [ + -2030201320, + -1632063600, + -1615132800, + -880210800, + -769395600, + -765388800, + -747241200, + -732729600, + -715791600, + -702489600, + -684342000, + -671040000, + -652892400, + -639590400, + -400086000, + -384364800, + -337186800, + -321465600, + -305737200, + -292435200, + -273682800, + -260985600, + 73472400 + ], + "types": [ + { + "offset": -25880 + }, + { + "offset": -25200 + }, + { + "offset": -21600 + }, + { + "offset": -21600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3f61f7ebb7b0f5d7-3b9e017c8df909f8.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3f61f7ebb7b0f5d7-3b9e017c8df909f8.json new file mode 100644 index 00000000000000..2ce32d5c52846b --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3f61f7ebb7b0f5d7-3b9e017c8df909f8.json @@ -0,0 +1,558 @@ +{ + "ids": [ + "asia/gaza" + ], + "tzif": { + "posix": { + "abbr": "EET", + "offset": 7200, + "transition": { + "abbr": "EEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 4, + 6 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 4, + 6 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -2185409872, + -933638400, + -923097600, + -919036800, + -857347200, + -844300800, + -825811200, + -812678400, + -794188800, + -779846400, + -762652800, + -748310400, + -731116800, + -399088800, + -386650800, + -368330400, + -355114800, + -336790800, + -323654400, + -305168400, + -292032000, + -273632400, + -260496000, + -242096400, + -228960000, + -210560400, + -197424000, + -178938000, + -165801600, + -147402000, + -134265600, + -115866000, + -102643200, + -84330000, + -81313200, + 142380000, + 150843600, + 167176800, + 178664400, + 334101600, + 337730400, + 452642400, + 462319200, + 482277600, + 494370000, + 516751200, + 526424400, + 545436000, + 558478800, + 576626400, + 589323600, + 609890400, + 620773200, + 638316000, + 651618000, + 669765600, + 683672400, + 701820000, + 715726800, + 733701600, + 747176400, + 765151200, + 778021200, + 796600800, + 810075600, + 820447200, + 828655200, + 843170400, + 860104800, + 874620000, + 891554400, + 906069600, + 924213600, + 939934800, + 956268000, + 971989200, + 987717600, + 1003438800, + 1019167200, + 1034888400, + 1050616800, + 1066338000, + 1082066400, + 1096581600, + 1113516000, + 1128380400, + 1143842400, + 1158872400, + 1175378400, + 1189638000, + 1206655200, + 1219957200, + 1238104800, + 1252015200, + 1269640860, + 1281474000, + 1301608860, + 1312146000, + 1333058400, + 1348178400, + 1364508000, + 1380229200, + 1395957600, + 1414098000, + 1427493600, + 1445551200, + 1458946800, + 1477692000, + 1490396400, + 1509141600, + 1521846000, + 1540591200, + 1553810400, + 1572037200, + 1585346400, + 1603490400, + 1616796000, + 1635458400, + 1648332000, + 1666998000, + 1682726400, + 1698447600, + 1713571200, + 1729897200, + 1744416000, + 1761346800, + 1774656000, + 1792796400, + 1806105600, + 1824850800, + 1837555200, + 1856300400, + 1869004800, + 1887750000, + 1901059200, + 1919199600, + 1932508800, + 1950649200, + 1963958400, + 1982703600, + 1995408000, + 2014153200, + 2026857600, + 2045602800, + 2058307200, + 2077052400, + 2090361600, + 2107897200, + 2121811200, + 2138742000, + 2153260800, + 2168982000, + 2184710400, + 2199826800, + 2216160000, + 2230066800, + 2234304000, + 2234905200, + 2248214400, + 2260911600, + 2264544000, + 2266354800, + 2279664000, + 2291756400, + 2295388800, + 2297804400, + 2311113600, + 2321996400, + 2326233600, + 2329254000, + 2342563200, + 2352841200, + 2356473600, + 2361308400, + 2374012800, + 2383686000, + 2387318400, + 2392758000, + 2405462400, + 2413926000, + 2418163200, + 2424207600, + 2437516800, + 2444770800, + 2448403200, + 2455657200, + 2468966400, + 2475010800, + 2479248000, + 2487106800, + 2500416000, + 2505855600, + 2509488000, + 2519161200, + 2531865600, + 2536700400, + 2540332800, + 2550610800, + 2563315200, + 2566940400, + 2571177600, + 2582060400, + 2595369600, + 2597785200, + 2601417600, + 2613510000, + 2626819200, + 2628025200, + 2632262400, + 2644959600, + 2658268800, + 2658870000, + 2663107200, + 2676409200, + 2693347200, + 2708463600, + 2724192000, + 2739913200, + 2754432000, + 2771362800, + 2785276800, + 2802812400, + 2816121600, + 2834262000, + 2847571200, + 2866316400, + 2879020800, + 2897766000, + 2910470400, + 2929215600, + 2941920000, + 2960665200, + 2973974400, + 2992114800, + 3005424000, + 3023564400, + 3036873600, + 3055618800, + 3068323200, + 3087068400, + 3099772800, + 3117913200, + 3131827200, + 3148758000, + 3163276800, + 3179602800, + 3194726400, + 3209842800, + 3226176000, + 3240687600, + 3244320000, + 3244921200 + ], + "types": [ + { + "offset": 8272 + }, + { + "offset": 7200 + }, + { + "offset": 10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3f6ff680ea89333b-f07f1041c6be937.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3f6ff680ea89333b-f07f1041c6be937.json new file mode 100644 index 00000000000000..4007c94b4cf33e --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3f6ff680ea89333b-f07f1041c6be937.json @@ -0,0 +1,191 @@ +{ + "ids": [ + "asia/yakutsk" + ], + "tzif": { + "posix": { + "abbr": "+09", + "offset": 32400, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 4, + 2, + 4, + 1, + 3, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 5, + 2, + 4 + ], + "transitions": [ + -1579423138, + -1247558400, + 354898800, + 370706400, + 386434800, + 402242400, + 417970800, + 433778400, + 449593200, + 465325200, + 481050000, + 496774800, + 512499600, + 528224400, + 543949200, + 559674000, + 575398800, + 591123600, + 606848400, + 622573200, + 638298000, + 654627600, + 670352400, + 670356000, + 686080800, + 695757600, + 701802000, + 717526800, + 733251600, + 748976400, + 764701200, + 780426000, + 796150800, + 811875600, + 828205200, + 846349200, + 859654800, + 877798800, + 891104400, + 909248400, + 922554000, + 941302800, + 954003600, + 972752400, + 985453200, + 1004202000, + 1017507600, + 1035651600, + 1048957200, + 1067101200, + 1080406800, + 1099155600, + 1111856400, + 1130605200, + 1143306000, + 1162054800, + 1174755600, + 1193504400, + 1206810000, + 1224954000, + 1238259600, + 1256403600, + 1269709200, + 1288458000, + 1301158800, + 1414252800 + ], + "types": [ + { + "offset": 31138 + }, + { + "offset": 28800 + }, + { + "offset": 32400 + }, + { + "offset": 36000 + }, + { + "offset": 32400 + }, + { + "offset": 36000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3fc16258c94fd1bd-f5865999bedfb5cb.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3fc16258c94fd1bd-f5865999bedfb5cb.json new file mode 100644 index 00000000000000..a0cd891d06c297 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3fc16258c94fd1bd-f5865999bedfb5cb.json @@ -0,0 +1,306 @@ +{ + "ids": [ + "america/ensenada", + "america/santa_isabel", + "america/tijuana", + "mexico/bajanorte" + ], + "tzif": { + "posix": { + "abbr": "PST", + "offset": -28800, + "transition": { + "abbr": "PDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 3, + 2, + 1, + 3, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2 + ], + "transitions": [ + -1514739600, + -1451667600, + -1343145600, + -1234803600, + -1222963200, + -1207242000, + -873820800, + -769395600, + -761418000, + -686073600, + -661539600, + -620755200, + -608144400, + -589384800, + -576082800, + -557935200, + -544633200, + -495039600, + -481734000, + -463590000, + -450284400, + -431535600, + -418230000, + -400086000, + -386780400, + -368636400, + -355330800, + -337186800, + -323881200, + -305737200, + -292431600, + 199274400, + 215600400, + 230724000, + 247050000, + 262778400, + 278499600, + 294228000, + 309949200, + 325677600, + 341398800, + 357127200, + 372848400, + 388576800, + 404902800, + 420026400, + 436352400, + 452080800, + 467802000, + 483530400, + 499251600, + 514980000, + 530701200, + 544615200, + 562150800, + 576064800, + 594205200, + 607514400, + 625654800, + 638964000, + 657104400, + 671018400, + 688554000, + 702468000, + 720003600, + 733917600, + 752058000, + 765367200, + 783507600, + 796816800, + 814957200, + 828871200, + 846406800, + 860320800, + 877856400, + 891770400, + 909306000, + 923220000, + 941360400, + 954669600, + 972810000, + 986119200, + 1004259600, + 1018173600, + 1035709200, + 1049623200, + 1067158800, + 1081072800, + 1099213200, + 1112522400, + 1130662800, + 1143972000, + 1162112400, + 1175421600, + 1193562000, + 1207476000, + 1225011600, + 1238925600, + 1256461200 + ], + "types": [ + { + "offset": -28084 + }, + { + "offset": -25200 + }, + { + "offset": -28800 + }, + { + "offset": -25200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3fd85b535272f921-d61e3c0d217e3de2.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3fd85b535272f921-d61e3c0d217e3de2.json new file mode 100644 index 00000000000000..bff57591b70e74 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-3fd85b535272f921-d61e3c0d217e3de2.json @@ -0,0 +1,191 @@ +{ + "ids": [ + "asia/vladivostok" + ], + "tzif": { + "posix": { + "abbr": "+10", + "offset": 36000, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 4, + 2, + 4, + 1, + 3, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 5, + 2, + 4 + ], + "transitions": [ + -1487321251, + -1247562000, + 354895200, + 370702800, + 386431200, + 402238800, + 417967200, + 433774800, + 449589600, + 465321600, + 481046400, + 496771200, + 512496000, + 528220800, + 543945600, + 559670400, + 575395200, + 591120000, + 606844800, + 622569600, + 638294400, + 654624000, + 670348800, + 670352400, + 686077200, + 695754000, + 701798400, + 717523200, + 733248000, + 748972800, + 764697600, + 780422400, + 796147200, + 811872000, + 828201600, + 846345600, + 859651200, + 877795200, + 891100800, + 909244800, + 922550400, + 941299200, + 954000000, + 972748800, + 985449600, + 1004198400, + 1017504000, + 1035648000, + 1048953600, + 1067097600, + 1080403200, + 1099152000, + 1111852800, + 1130601600, + 1143302400, + 1162051200, + 1174752000, + 1193500800, + 1206806400, + 1224950400, + 1238256000, + 1256400000, + 1269705600, + 1288454400, + 1301155200, + 1414249200 + ], + "types": [ + { + "offset": 31651 + }, + { + "offset": 32400 + }, + { + "offset": 36000 + }, + { + "offset": 39600 + }, + { + "offset": 36000 + }, + { + "offset": 39600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-401f78ac94f3eb66-89897df479278829.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-401f78ac94f3eb66-89897df479278829.json new file mode 100644 index 00000000000000..ce7840183cce49 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-401f78ac94f3eb66-89897df479278829.json @@ -0,0 +1,223 @@ +{ + "ids": [ + "australia/melbourne", + "australia/victoria" + ], + "tzif": { + "posix": { + "abbr": "AEST", + "offset": 36000, + "transition": { + "abbr": "AEDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 4, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 1, + 0 + ] + }, + "time": 10800 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2 + ], + "transitions": [ + -2364111592, + -1672560000, + -1665388800, + -883641600, + -876124800, + -860400000, + -844675200, + -828345600, + -813225600, + 57686400, + 67968000, + 89136000, + 100022400, + 120585600, + 131472000, + 152035200, + 162921600, + 183484800, + 194976000, + 215539200, + 226425600, + 246988800, + 257875200, + 278438400, + 289324800, + 309888000, + 320774400, + 341337600, + 352224000, + 372787200, + 384278400, + 404841600, + 415728000, + 436291200, + 447177600, + 467740800, + 478627200, + 499190400, + 511286400, + 530035200, + 542736000, + 561484800, + 574790400, + 594144000, + 606240000, + 625593600, + 637689600, + 657043200, + 667929600, + 688492800, + 699379200, + 719942400, + 731433600, + 751996800, + 762883200, + 783446400, + 796147200, + 814896000, + 828201600, + 846345600, + 859651200, + 877795200, + 891100800, + 909244800, + 922550400, + 941299200, + 954000000, + 967305600, + 985449600, + 1004198400, + 1017504000, + 1035648000, + 1048953600, + 1067097600, + 1080403200, + 1099152000, + 1111852800, + 1130601600, + 1143907200, + 1162051200, + 1174752000, + 1193500800, + 1207411200, + 1223136000 + ], + "types": [ + { + "offset": 34792 + }, + { + "offset": 36000 + }, + { + "offset": 39600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-405b02408f1a7725-3c0ae0a258a25979.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-405b02408f1a7725-3c0ae0a258a25979.json new file mode 100644 index 00000000000000..211fe410dc780e --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-405b02408f1a7725-3c0ae0a258a25979.json @@ -0,0 +1,66 @@ +{ + "ids": [ + "asia/manila" + ], + "tzif": { + "posix": { + "abbr": "PST", + "offset": 28800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 3, + 4, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2 + ], + "transitions": [ + -3944621032, + -2219083200, + -1046678400, + -1040115600, + -885024000, + -880016400, + -783594000, + -760093200, + -496224000, + -491562000, + 228326400, + 243702000, + 643219200, + 649177200 + ], + "types": [ + { + "offset": -57368 + }, + { + "offset": 29032 + }, + { + "offset": 28800 + }, + { + "offset": 32400 + }, + { + "offset": 32400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-40fb52b19ef81b1d-e1ce3cc4e0a17886.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-40fb52b19ef81b1d-e1ce3cc4e0a17886.json new file mode 100644 index 00000000000000..079082964c00d6 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-40fb52b19ef81b1d-e1ce3cc4e0a17886.json @@ -0,0 +1,82 @@ +{ + "ids": [ + "america/mazatlan", + "mexico/bajasur" + ], + "tzif": { + "posix": { + "abbr": "MST", + "offset": -25200, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1 + ], + "transitions": [ + -1514739600, + -1343149200, + -1234807200, + -1220461200, + -1207159200, + -1191344400, + -873828000, + 828867600, + 846403200, + 860317200, + 877852800, + 891766800, + 909302400, + 923216400, + 941356800, + 954666000, + 972806400, + 989139600, + 1001836800, + 1018170000, + 1035705600 + ], + "types": [ + { + "offset": -25540 + }, + { + "offset": -25200 + }, + { + "offset": -21600 + }, + { + "offset": -21600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-42518274487a5d74-63fffb5b4ef7fbd9.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-42518274487a5d74-63fffb5b4ef7fbd9.json new file mode 100644 index 00000000000000..0692594390a83a --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-42518274487a5d74-63fffb5b4ef7fbd9.json @@ -0,0 +1,28 @@ +{ + "ids": [ + "etc/gmt", + "etc/gmt+0", + "etc/gmt-0", + "etc/gmt0", + "etc/greenwich", + "gmt", + "gmt+0", + "gmt-0", + "gmt0", + "greenwich" + ], + "tzif": { + "posix": { + "abbr": "GMT", + "offset": 0, + "transition": null + }, + "transition_types": [], + "transitions": [], + "types": [ + { + "offset": 0 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-425a92f6316d948f-f81669d6e3b37009.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-425a92f6316d948f-f81669d6e3b37009.json new file mode 100644 index 00000000000000..ce7bd0e255881c --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-425a92f6316d948f-f81669d6e3b37009.json @@ -0,0 +1,33 @@ +{ + "ids": [ + "america/el_salvador" + ], + "tzif": { + "posix": { + "abbr": "CST", + "offset": -21600, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1 + ], + "transitions": [ + -1546279392, + 547020000, + 559717200 + ], + "types": [ + { + "offset": -21408 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-43c01a519dcad360-c978a2de09220f3e.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-43c01a519dcad360-c978a2de09220f3e.json new file mode 100644 index 00000000000000..e7a2242e2633e9 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-43c01a519dcad360-c978a2de09220f3e.json @@ -0,0 +1,315 @@ +{ + "ids": [ + "america/vancouver", + "canada/pacific" + ], + "tzif": { + "posix": { + "abbr": "PST", + "offset": -28800, + "transition": { + "abbr": "PDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -2713880852, + -1632060000, + -1615129200, + -880207200, + -769395600, + -765385200, + -747237600, + -733935600, + -715788000, + -702486000, + -684338400, + -671036400, + -652888800, + -639586800, + -620834400, + -608137200, + -589384800, + -576082800, + -557935200, + -544633200, + -526485600, + -513183600, + -495036000, + -481734000, + -463586400, + -450284400, + -431532000, + -418230000, + -400082400, + -386780400, + -368632800, + -355330800, + -337183200, + -323881200, + -305733600, + -292431600, + -273679200, + -260982000, + -242229600, + -226508400, + -210780000, + -195058800, + -179330400, + -163609200, + -147880800, + -131554800, + -116431200, + -100105200, + -84376800, + -68655600, + -52927200, + -37206000, + -21477600, + -5756400, + 9972000, + 25693200, + 41421600, + 57747600, + 73476000, + 89197200, + 104925600, + 120646800, + 136375200, + 152096400, + 167824800, + 183546000, + 199274400, + 215600400, + 230724000, + 247050000, + 262778400, + 278499600, + 294228000, + 309949200, + 325677600, + 341398800, + 357127200, + 372848400, + 388576800, + 404902800, + 420026400, + 436352400, + 452080800, + 467802000, + 483530400, + 499251600, + 514980000, + 530701200, + 536486400, + 562150800, + 576064800, + 594205200, + 607514400, + 625654800, + 638964000, + 657104400, + 671018400, + 688554000, + 702468000, + 720003600, + 733917600, + 752058000, + 765367200, + 783507600, + 796816800, + 814957200, + 828871200, + 846406800, + 860320800, + 877856400, + 891770400, + 909306000, + 923220000, + 941360400, + 954669600, + 972810000, + 986119200, + 1004259600, + 1018173600, + 1035709200, + 1049623200, + 1067158800, + 1081072800, + 1099213200, + 1112522400, + 1130662800, + 1143972000, + 1162112400, + 1173607200, + 1194166800 + ], + "types": [ + { + "offset": -29548 + }, + { + "offset": -28800 + }, + { + "offset": -25200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-44b31bf3438167a2-f26149998b62ea48.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-44b31bf3438167a2-f26149998b62ea48.json new file mode 100644 index 00000000000000..0ca1bcca10a91f --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-44b31bf3438167a2-f26149998b62ea48.json @@ -0,0 +1,56 @@ +{ + "ids": [ + "australia/brisbane", + "australia/queensland" + ], + "tzif": { + "posix": { + "abbr": "AEST", + "offset": 36000, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2 + ], + "transitions": [ + -2366791928, + -1672560000, + -1665388800, + -883641600, + -876124800, + -860400000, + -844675200, + -828345600, + -813225600, + 57686400, + 67968000, + 625593600, + 636480000, + 657043200 + ], + "types": [ + { + "offset": 36728 + }, + { + "offset": 36000 + }, + { + "offset": 39600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4529e4629acf0366-8106ebfc9606aee2.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4529e4629acf0366-8106ebfc9606aee2.json new file mode 100644 index 00000000000000..cc15a1014678ba --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4529e4629acf0366-8106ebfc9606aee2.json @@ -0,0 +1,40 @@ +{ + "ids": [ + "america/caracas" + ], + "tzif": { + "posix": { + "abbr": "-04", + "offset": -14400, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3 + ], + "transitions": [ + -2524505536, + -1826739140, + -157750200, + 1197183600, + 1462086000 + ], + "types": [ + { + "offset": -16064 + }, + { + "offset": -16060 + }, + { + "offset": -16200 + }, + { + "offset": -14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-46dd3b15bf889536-90c51dda0af69c0c.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-46dd3b15bf889536-90c51dda0af69c0c.json new file mode 100644 index 00000000000000..b110dd6b5396f0 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-46dd3b15bf889536-90c51dda0af69c0c.json @@ -0,0 +1,261 @@ +{ + "ids": [ + "america/menominee" + ], + "tzif": { + "posix": { + "abbr": "CST", + "offset": -21600, + "transition": { + "abbr": "CDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1 + ], + "transitions": [ + -2659759773, + -1633276800, + -1615136400, + -1601827200, + -1583686800, + -880214400, + -769395600, + -765392400, + -747244800, + -733942800, + -116438400, + -100112400, + -21484800, + 104914800, + 104918400, + 120639600, + 126691200, + 152089200, + 162374400, + 183538800, + 199267200, + 215593200, + 230716800, + 247042800, + 262771200, + 278492400, + 294220800, + 309942000, + 325670400, + 341391600, + 357120000, + 372841200, + 388569600, + 404895600, + 420019200, + 436345200, + 452073600, + 467794800, + 483523200, + 499244400, + 514972800, + 530694000, + 544608000, + 562143600, + 576057600, + 594198000, + 607507200, + 625647600, + 638956800, + 657097200, + 671011200, + 688546800, + 702460800, + 719996400, + 733910400, + 752050800, + 765360000, + 783500400, + 796809600, + 814950000, + 828864000, + 846399600, + 860313600, + 877849200, + 891763200, + 909298800, + 923212800, + 941353200, + 954662400, + 972802800, + 986112000, + 1004252400, + 1018166400, + 1035702000, + 1049616000, + 1067151600, + 1081065600, + 1099206000, + 1112515200, + 1130655600, + 1143964800, + 1162105200, + 1173600000, + 1194159600 + ], + "types": [ + { + "offset": -21027 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + }, + { + "offset": -18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4738bf3d72913a1b-ef164d685fcac290.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4738bf3d72913a1b-ef164d685fcac290.json new file mode 100644 index 00000000000000..70bf116c36c34c --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4738bf3d72913a1b-ef164d685fcac290.json @@ -0,0 +1,155 @@ +{ + "ids": [ + "asia/tbilisi" + ], + "tzif": { + "posix": { + "abbr": "+04", + "offset": 14400, + "transition": null + }, + "transition_types": [ + 0, + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 4, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 2, + 4, + 3, + 2, + 4, + 3, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 1, + 2, + 4 + ], + "transitions": [ + -2840151551, + -1441162751, + -405140400, + 354916800, + 370724400, + 386452800, + 402260400, + 417988800, + 433796400, + 449611200, + 465343200, + 481068000, + 496792800, + 512517600, + 528242400, + 543967200, + 559692000, + 575416800, + 591141600, + 606866400, + 622591200, + 638316000, + 654645600, + 670370400, + 670374000, + 686098800, + 701816400, + 717537600, + 733266000, + 748987200, + 764715600, + 780436800, + 796161600, + 811882800, + 828216000, + 859662000, + 877806000, + 891115200, + 909255600, + 922564800, + 941310000, + 954014400, + 972759600, + 985464000, + 1004209200, + 1017518400, + 1035658800, + 1048968000, + 1067108400, + 1080417600, + 1088276400, + 1099177200, + 1111878000 + ], + "types": [ + { + "offset": 10751 + }, + { + "offset": 10800 + }, + { + "offset": 14400 + }, + { + "offset": 18000 + }, + { + "offset": 14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-480b0a55dd7bf29e-c23b37ed84c4f8f9.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-480b0a55dd7bf29e-c23b37ed84c4f8f9.json new file mode 100644 index 00000000000000..a625eea350ae4f --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-480b0a55dd7bf29e-c23b37ed84c4f8f9.json @@ -0,0 +1,233 @@ +{ + "ids": [ + "america/nome" + ], + "tzif": { + "posix": { + "abbr": "AKST", + "offset": -32400, + "transition": { + "abbr": "AKDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 3, + 3, + 2, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 4, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4 + ], + "transitions": [ + -3225223727, + -2188947502, + -880196400, + -769395600, + -765374400, + -86878800, + -21466800, + -5745600, + 9982800, + 25704000, + 41432400, + 57758400, + 73486800, + 89208000, + 104936400, + 120657600, + 126709200, + 152107200, + 162392400, + 183556800, + 199285200, + 215611200, + 230734800, + 247060800, + 262789200, + 278510400, + 294238800, + 309960000, + 325688400, + 341409600, + 357138000, + 372859200, + 388587600, + 404913600, + 420037200, + 436363200, + 439030800, + 452084400, + 467805600, + 483534000, + 499255200, + 514983600, + 530704800, + 544618800, + 562154400, + 576068400, + 594208800, + 607518000, + 625658400, + 638967600, + 657108000, + 671022000, + 688557600, + 702471600, + 720007200, + 733921200, + 752061600, + 765370800, + 783511200, + 796820400, + 814960800, + 828874800, + 846410400, + 860324400, + 877860000, + 891774000, + 909309600, + 923223600, + 941364000, + 954673200, + 972813600, + 986122800, + 1004263200, + 1018177200, + 1035712800, + 1049626800, + 1067162400, + 1081076400, + 1099216800, + 1112526000, + 1130666400, + 1143975600, + 1162116000, + 1173610800, + 1194170400 + ], + "types": [ + { + "offset": 46702 + }, + { + "offset": -39698 + }, + { + "offset": -39600 + }, + { + "offset": -36000 + }, + { + "offset": -32400 + }, + { + "offset": -28800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-486e9282debc62a3-27805d7d5dee9be4.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-486e9282debc62a3-27805d7d5dee9be4.json new file mode 100644 index 00000000000000..7d4bdf2ccb96b6 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-486e9282debc62a3-27805d7d5dee9be4.json @@ -0,0 +1,50 @@ +{ + "ids": [ + "africa/addis_ababa", + "africa/asmara", + "africa/asmera", + "africa/dar_es_salaam", + "africa/djibouti", + "africa/kampala", + "africa/mogadishu", + "africa/nairobi", + "indian/antananarivo", + "indian/comoro", + "indian/mayotte" + ], + "tzif": { + "posix": { + "abbr": "EAT", + "offset": 10800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 3, + 2 + ], + "transitions": [ + -1946168836, + -1309746600, + -1261969200, + -1041388200, + -865305900 + ], + "types": [ + { + "offset": 8836 + }, + { + "offset": 9000 + }, + { + "offset": 10800 + }, + { + "offset": 9900 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4891d41993ed3f5f-4d0c2933ef920fb1.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4891d41993ed3f5f-4d0c2933ef920fb1.json new file mode 100644 index 00000000000000..dd9a049b68e60e --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4891d41993ed3f5f-4d0c2933ef920fb1.json @@ -0,0 +1,317 @@ +{ + "ids": [ + "america/fort_nelson" + ], + "tzif": { + "posix": { + "abbr": "MST", + "offset": -25200, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 3 + ], + "transitions": [ + -2713880953, + -1632060000, + -1615129200, + -880207200, + -769395600, + -765385200, + -715788000, + -702486000, + -684338400, + -671036400, + -652888800, + -639586800, + -620834400, + -608137200, + -589384800, + -576082800, + -557935200, + -544633200, + -526485600, + -513183600, + -495036000, + -481734000, + -463586400, + -450284400, + -431532000, + -418230000, + -400082400, + -386780400, + -368632800, + -355330800, + -337183200, + -323881200, + -305733600, + -292431600, + -273679200, + -260982000, + -242229600, + -226508400, + -210780000, + -195058800, + -179330400, + -163609200, + -147880800, + -131554800, + -116431200, + -100105200, + -84376800, + -68655600, + -52927200, + -37206000, + -21477600, + -5756400, + 9972000, + 25693200, + 41421600, + 57747600, + 73476000, + 89197200, + 104925600, + 120646800, + 136375200, + 152096400, + 167824800, + 183546000, + 199274400, + 215600400, + 230724000, + 247050000, + 262778400, + 278499600, + 294228000, + 309949200, + 325677600, + 341398800, + 357127200, + 372848400, + 388576800, + 404902800, + 420026400, + 436352400, + 452080800, + 467802000, + 483530400, + 499251600, + 514980000, + 530701200, + 536486400, + 562150800, + 576064800, + 594205200, + 607514400, + 625654800, + 638964000, + 657104400, + 671018400, + 688554000, + 702468000, + 720003600, + 733917600, + 752058000, + 765367200, + 783507600, + 796816800, + 814957200, + 828871200, + 846406800, + 860320800, + 877856400, + 891770400, + 909306000, + 923220000, + 941360400, + 954669600, + 972810000, + 986119200, + 1004259600, + 1018173600, + 1035709200, + 1049623200, + 1067158800, + 1081072800, + 1099213200, + 1112522400, + 1130662800, + 1143972000, + 1162112400, + 1173607200, + 1194166800, + 1205056800, + 1225616400, + 1236506400, + 1257066000, + 1268560800, + 1289120400, + 1300010400, + 1320570000, + 1331460000, + 1352019600, + 1362909600, + 1383469200, + 1394359200, + 1414918800, + 1425808800 + ], + "types": [ + { + "offset": -29447 + }, + { + "offset": -28800 + }, + { + "offset": -25200 + }, + { + "offset": -25200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4a65bbe3253254a1-2a20d46c4d15c0c3.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4a65bbe3253254a1-2a20d46c4d15c0c3.json new file mode 100644 index 00000000000000..3238dcf5bf11de --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4a65bbe3253254a1-2a20d46c4d15c0c3.json @@ -0,0 +1,184 @@ +{ + "ids": [ + "arctic/longyearbyen", + "atlantic/jan_mayen", + "europe/berlin", + "europe/copenhagen", + "europe/oslo", + "europe/stockholm" + ], + "tzif": { + "posix": { + "abbr": "CET", + "offset": 3600, + "transition": { + "abbr": "CEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 10800 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 3, + 2, + 1, + 2, + 1, + 2, + 3, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -2422054408, + -1693706400, + -1680483600, + -1663455600, + -1650150000, + -1632006000, + -1618700400, + -938905200, + -857257200, + -844556400, + -828226800, + -812502000, + -796777200, + -781052400, + -776563200, + -765936000, + -761180400, + -748479600, + -733273200, + -717631200, + -714610800, + -710380800, + -701910000, + -684975600, + -670460400, + -654130800, + -639010800, + 323830800, + 338950800, + 354675600, + 370400400, + 386125200, + 401850000, + 417574800, + 433299600, + 449024400, + 465354000, + 481078800, + 496803600, + 512528400, + 528253200, + 543978000, + 559702800, + 575427600, + 591152400, + 606877200, + 622602000, + 638326800, + 654656400, + 670381200, + 686106000, + 701830800, + 717555600, + 733280400, + 749005200, + 764730000, + 780454800, + 796179600, + 811904400, + 828234000, + 846378000 + ], + "types": [ + { + "offset": 3208 + }, + { + "offset": 3600 + }, + { + "offset": 7200 + }, + { + "offset": 10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4ab862d6d4b98ff4-7628975aa4bf631a.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4ab862d6d4b98ff4-7628975aa4bf631a.json new file mode 100644 index 00000000000000..802200d8234c39 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4ab862d6d4b98ff4-7628975aa4bf631a.json @@ -0,0 +1,161 @@ +{ + "ids": [ + "europe/kiev", + "europe/kyiv", + "europe/uzhgorod", + "europe/zaporozhye" + ], + "tzif": { + "posix": { + "abbr": "EET", + "offset": 7200, + "transition": { + "abbr": "EEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 14400 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 10800 + } + } + }, + "transition_types": [ + 0, + 1, + 2, + 1, + 3, + 4, + 1, + 3, + 4, + 2, + 5, + 2, + 5, + 2, + 5, + 2, + 5, + 2, + 5, + 2, + 5, + 2, + 5, + 2, + 5, + 2, + 5, + 2, + 5, + 2, + 6, + 1, + 3, + 2, + 6, + 1, + 3, + 2, + 6, + 1, + 3, + 2, + 6, + 1, + 3, + 2, + 6, + 1, + 3, + 2, + 6, + 1, + 3 + ], + "transitions": [ + -2840148124, + -1441159324, + -1247536800, + -892522800, + -857257200, + -844556400, + -828226800, + -825382800, + 354920400, + 370728000, + 386456400, + 402264000, + 417992400, + 433800000, + 449614800, + 465346800, + 481071600, + 496796400, + 512521200, + 528246000, + 543970800, + 559695600, + 575420400, + 591145200, + 606870000, + 622594800, + 638319600, + 646783200, + 686102400, + 701827200, + 717552000, + 733276800, + 749001600, + 764726400, + 780451200, + 796176000, + 811900800, + 828230400, + 846378000 + ], + "types": [ + { + "offset": 7324 + }, + { + "offset": 7200 + }, + { + "offset": 10800 + }, + { + "offset": 7200 + }, + { + "offset": 3600 + }, + { + "offset": 14400 + }, + { + "offset": 10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4c9c946292d76a04-7fbd1484596ee05e.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4c9c946292d76a04-7fbd1484596ee05e.json new file mode 100644 index 00000000000000..e3d953fbeee511 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4c9c946292d76a04-7fbd1484596ee05e.json @@ -0,0 +1,175 @@ +{ + "ids": [ + "asia/oral" + ], + "tzif": { + "posix": { + "abbr": "+05", + "offset": 18000, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 2, + 5, + 2, + 5, + 6, + 2, + 5, + 6, + 2, + 5, + 6, + 3, + 4, + 2, + 5, + 2, + 5, + 6, + 2, + 5, + 6, + 2, + 5, + 6, + 2, + 5, + 6, + 2, + 5, + 6, + 2, + 5, + 6, + 2, + 5, + 6, + 2, + 5, + 6, + 2, + 5, + 6, + 2, + 5, + 6, + 2, + 5, + 6, + 2, + 5, + 6, + 2, + 5, + 2, + 5 + ], + "transitions": [ + -1441164324, + -1247540400, + 354913200, + 370720800, + 386445600, + 386449200, + 402256800, + 417985200, + 433792800, + 449607600, + 465339600, + 481064400, + 496789200, + 512514000, + 528238800, + 543963600, + 559688400, + 575413200, + 591138000, + 606862800, + 606866400, + 622591200, + 638316000, + 654645600, + 670370400, + 686095200, + 695772000, + 701816400, + 701820000, + 717544800, + 733269600, + 748994400, + 764719200, + 780444000, + 796168800, + 811893600, + 828223200, + 846367200, + 859672800, + 877816800, + 891122400, + 909266400, + 922572000, + 941320800, + 954021600, + 972770400, + 985471200, + 1004220000, + 1017525600, + 1035669600, + 1048975200, + 1067119200, + 1080424800, + 1099173600 + ], + "types": [ + { + "offset": 12324 + }, + { + "offset": 10800 + }, + { + "offset": 18000 + }, + { + "offset": 21600 + }, + { + "offset": 21600 + }, + { + "offset": 18000 + }, + { + "offset": 14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4ccce3697974db1-dd90a8482c7e02e0.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4ccce3697974db1-dd90a8482c7e02e0.json new file mode 100644 index 00000000000000..dde574d49a2ca0 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4ccce3697974db1-dd90a8482c7e02e0.json @@ -0,0 +1,127 @@ +{ + "ids": [ + "europe/helsinki", + "europe/mariehamn" + ], + "tzif": { + "posix": { + "abbr": "EET", + "offset": 7200, + "transition": { + "abbr": "EEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 14400 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 10800 + } + } + }, + "transition_types": [ + 0, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -2890258789, + -1535938789, + -875671200, + -859773600, + 354672000, + 370396800, + 386121600, + 401846400, + 410220000, + 433299600, + 449024400, + 465354000, + 481078800, + 496803600, + 512528400, + 528253200, + 543978000, + 559702800, + 575427600, + 591152400, + 606877200, + 622602000, + 638326800, + 654656400, + 670381200, + 686106000, + 701830800, + 717555600, + 733280400, + 749005200, + 764730000, + 780454800, + 796179600, + 811904400, + 828234000, + 846378000 + ], + "types": [ + { + "offset": 5989 + }, + { + "offset": 7200 + }, + { + "offset": 10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4db2cfd1785db9cd-6589edd5db80b603.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4db2cfd1785db9cd-6589edd5db80b603.json new file mode 100644 index 00000000000000..88b79a4d3c41ef --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4db2cfd1785db9cd-6589edd5db80b603.json @@ -0,0 +1,192 @@ +{ + "ids": [ + "asia/tomsk" + ], + "tzif": { + "posix": { + "abbr": "+07", + "offset": 25200, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 4, + 2, + 4, + 1, + 3, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4 + ], + "transitions": [ + -1578807591, + -1247551200, + 354906000, + 370713600, + 386442000, + 402249600, + 417978000, + 433785600, + 449600400, + 465332400, + 481057200, + 496782000, + 512506800, + 528231600, + 543956400, + 559681200, + 575406000, + 591130800, + 606855600, + 622580400, + 638305200, + 654634800, + 670359600, + 670363200, + 686088000, + 695764800, + 701809200, + 717534000, + 733258800, + 748983600, + 764708400, + 780433200, + 796158000, + 811882800, + 828212400, + 846356400, + 859662000, + 877806000, + 891111600, + 909255600, + 922561200, + 941310000, + 954010800, + 972759600, + 985460400, + 1004209200, + 1017514800, + 1020193200, + 1035662400, + 1048968000, + 1067112000, + 1080417600, + 1099166400, + 1111867200, + 1130616000, + 1143316800, + 1162065600, + 1174766400, + 1193515200, + 1206820800, + 1224964800, + 1238270400, + 1256414400, + 1269720000, + 1288468800, + 1301169600, + 1414263600, + 1464465600 + ], + "types": [ + { + "offset": 20391 + }, + { + "offset": 21600 + }, + { + "offset": 25200 + }, + { + "offset": 28800 + }, + { + "offset": 25200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4e52d8a7b9ecde7e-b7f50a3a0d1ac3b5.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4e52d8a7b9ecde7e-b7f50a3a0d1ac3b5.json new file mode 100644 index 00000000000000..923657a81ceb98 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4e52d8a7b9ecde7e-b7f50a3a0d1ac3b5.json @@ -0,0 +1,19 @@ +{ + "ids": [ + "etc/gmt-7" + ], + "tzif": { + "posix": { + "abbr": "+07", + "offset": 25200, + "transition": null + }, + "transition_types": [], + "transitions": [], + "types": [ + { + "offset": 25200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4eaf76405b17e0d3-64c6a9f0471d4ce9.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4eaf76405b17e0d3-64c6a9f0471d4ce9.json new file mode 100644 index 00000000000000..d77bbee2e365c9 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4eaf76405b17e0d3-64c6a9f0471d4ce9.json @@ -0,0 +1,204 @@ +{ + "ids": [ + "atlantic/stanley" + ], + "tzif": { + "posix": { + "abbr": "-03", + "offset": -10800, + "transition": null + }, + "transition_types": [ + 0, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3 + ], + "transitions": [ + -2524507716, + -1824235716, + -1018209600, + -1003093200, + -986760000, + -971643600, + -954705600, + -939589200, + -923256000, + -908139600, + -891806400, + -876690000, + -860356800, + -852066000, + 420609600, + 433306800, + 452052000, + 464151600, + 483501600, + 495601200, + 495604800, + 514350000, + 527054400, + 545799600, + 558504000, + 577249200, + 589953600, + 608698800, + 621403200, + 640753200, + 652852800, + 672202800, + 684907200, + 703652400, + 716356800, + 735102000, + 747806400, + 766551600, + 779256000, + 798001200, + 810705600, + 830055600, + 842760000, + 861505200, + 874209600, + 892954800, + 905659200, + 924404400, + 937108800, + 955854000, + 968558400, + 987310800, + 999410400, + 1019365200, + 1030860000, + 1050814800, + 1062914400, + 1082264400, + 1094364000, + 1113714000, + 1125813600, + 1145163600, + 1157263200, + 1176613200, + 1188712800, + 1208667600, + 1220767200, + 1240117200, + 1252216800, + 1271566800, + 1283666400 + ], + "types": [ + { + "offset": -13884 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + }, + { + "offset": -10800 + }, + { + "offset": -7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4f0ad1968e2955-b99def3a9c716c7f.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4f0ad1968e2955-b99def3a9c716c7f.json new file mode 100644 index 00000000000000..a033cd1690e7af --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4f0ad1968e2955-b99def3a9c716c7f.json @@ -0,0 +1,181 @@ +{ + "ids": [ + "asia/aqtobe" + ], + "tzif": { + "posix": { + "abbr": "+05", + "offset": 18000, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 2, + 5, + 2, + 5, + 1, + 3, + 4, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5 + ], + "transitions": [ + -1441165720, + -1247544000, + 354913200, + 370720800, + 386445600, + 386449200, + 402256800, + 417985200, + 433792800, + 449607600, + 465339600, + 481064400, + 496789200, + 512514000, + 528238800, + 543963600, + 559688400, + 575413200, + 591138000, + 606862800, + 622587600, + 638312400, + 654642000, + 670366800, + 670370400, + 686095200, + 695772000, + 701816400, + 717541200, + 733266000, + 748990800, + 764715600, + 780440400, + 796165200, + 811890000, + 828219600, + 846363600, + 859669200, + 877813200, + 891118800, + 909262800, + 922568400, + 941317200, + 954018000, + 972766800, + 985467600, + 1004216400, + 1017522000, + 1035666000, + 1048971600, + 1067115600, + 1080421200, + 1099170000 + ], + "types": [ + { + "offset": 13720 + }, + { + "offset": 14400 + }, + { + "offset": 18000 + }, + { + "offset": 21600 + }, + { + "offset": 21600 + }, + { + "offset": 18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4fd8d72ac04d9a5d-3133c7dea65f2538.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4fd8d72ac04d9a5d-3133c7dea65f2538.json new file mode 100644 index 00000000000000..e86789ea25167d --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-4fd8d72ac04d9a5d-3133c7dea65f2538.json @@ -0,0 +1,156 @@ +{ + "ids": [ + "europe/tirane" + ], + "tzif": { + "posix": { + "abbr": "CET", + "offset": 3600, + "transition": { + "abbr": "CEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 10800 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -1767230360, + -932346000, + -857257200, + -844556400, + -843519600, + 136854000, + 149896800, + 168130800, + 181432800, + 199839600, + 213141600, + 231894000, + 244591200, + 263257200, + 276040800, + 294706800, + 307490400, + 326156400, + 339458400, + 357087600, + 370389600, + 389142000, + 402444000, + 419468400, + 433807200, + 449622000, + 465354000, + 481078800, + 496803600, + 512528400, + 528253200, + 543978000, + 559702800, + 575427600, + 591152400, + 606877200, + 622602000, + 638326800, + 654656400, + 670381200, + 686106000, + 701830800, + 717555600, + 733280400, + 749005200, + 764730000, + 780454800, + 796179600, + 811904400, + 828234000, + 846378000 + ], + "types": [ + { + "offset": 4760 + }, + { + "offset": 3600 + }, + { + "offset": 7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5060a985014097b1-2e0f3c6f560795ff.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5060a985014097b1-2e0f3c6f560795ff.json new file mode 100644 index 00000000000000..61494cf8537715 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5060a985014097b1-2e0f3c6f560795ff.json @@ -0,0 +1,60 @@ +{ + "ids": [ + "america/barbados" + ], + "tzif": { + "posix": { + "abbr": "AST", + "offset": -14400, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 3, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -1841256091, + -874263600, + -862682400, + -841604400, + -830714400, + -811882800, + -798660000, + 234943200, + 244616400, + 261554400, + 276066000, + 293004000, + 307515600, + 325058400, + 338706000 + ], + "types": [ + { + "offset": -14309 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + }, + { + "offset": -12600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-50abe32c287395c8-d2c3aa5882246ab2.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-50abe32c287395c8-d2c3aa5882246ab2.json new file mode 100644 index 00000000000000..f5ef8aa144f049 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-50abe32c287395c8-d2c3aa5882246ab2.json @@ -0,0 +1,37 @@ +{ + "ids": [ + "asia/rangoon", + "asia/yangon", + "indian/cocos" + ], + "tzif": { + "posix": { + "abbr": "+0630", + "offset": 23400, + "transition": null + }, + "transition_types": [ + 0, + 1, + 2, + 1 + ], + "transitions": [ + -2840163887, + -1577946287, + -873268200, + -778410000 + ], + "types": [ + { + "offset": 23087 + }, + { + "offset": 23400 + }, + { + "offset": 32400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-50fc3fea132b4f4c-5a5d88ba8de3b7c1.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-50fc3fea132b4f4c-5a5d88ba8de3b7c1.json new file mode 100644 index 00000000000000..036507d60d322d --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-50fc3fea132b4f4c-5a5d88ba8de3b7c1.json @@ -0,0 +1,254 @@ +{ + "ids": [ + "america/denver", + "america/shiprock", + "mst7mdt", + "navajo", + "us/mountain" + ], + "tzif": { + "posix": { + "abbr": "MST", + "offset": -25200, + "transition": { + "abbr": "MDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -2717643600, + -1633273200, + -1615132800, + -1601823600, + -1583683200, + -1570374000, + -1551628800, + -1538924400, + -1534089600, + -880210800, + -769395600, + -765388800, + -147884400, + -131558400, + -116434800, + -100108800, + -84380400, + -68659200, + -52930800, + -37209600, + -21481200, + -5760000, + 9968400, + 25689600, + 41418000, + 57744000, + 73472400, + 89193600, + 104922000, + 120643200, + 126694800, + 152092800, + 162378000, + 183542400, + 199270800, + 215596800, + 230720400, + 247046400, + 262774800, + 278496000, + 294224400, + 309945600, + 325674000, + 341395200, + 357123600, + 372844800, + 388573200, + 404899200, + 420022800, + 436348800, + 452077200, + 467798400, + 483526800, + 499248000, + 514976400, + 530697600, + 544611600, + 562147200, + 576061200, + 594201600, + 607510800, + 625651200, + 638960400, + 657100800, + 671014800, + 688550400, + 702464400, + 720000000, + 733914000, + 752054400, + 765363600, + 783504000, + 796813200, + 814953600, + 828867600, + 846403200, + 860317200, + 877852800, + 891766800, + 909302400, + 923216400, + 941356800, + 954666000, + 972806400, + 986115600, + 1004256000, + 1018170000, + 1035705600, + 1049619600, + 1067155200, + 1081069200, + 1099209600, + 1112518800, + 1130659200, + 1143968400, + 1162108800, + 1173603600, + 1194163200 + ], + "types": [ + { + "offset": -25196 + }, + { + "offset": -25200 + }, + { + "offset": -21600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-513821d5372dc2c3-56efcc8826fb3481.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-513821d5372dc2c3-56efcc8826fb3481.json new file mode 100644 index 00000000000000..5347109a6947d3 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-513821d5372dc2c3-56efcc8826fb3481.json @@ -0,0 +1,290 @@ +{ + "ids": [ + "europe/monaco", + "europe/paris" + ], + "tzif": { + "posix": { + "abbr": "CET", + "offset": 3600, + "transition": { + "abbr": "CEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 10800 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 0, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4 + ], + "transitions": [ + -2486592561, + -1855958961, + -1689814800, + -1680397200, + -1665363600, + -1648342800, + -1635123600, + -1616893200, + -1604278800, + -1585443600, + -1574038800, + -1552266000, + -1539997200, + -1520557200, + -1507510800, + -1490576400, + -1470618000, + -1459126800, + -1444006800, + -1427677200, + -1411952400, + -1396227600, + -1379293200, + -1364778000, + -1348448400, + -1333328400, + -1316394000, + -1301274000, + -1284339600, + -1269824400, + -1253494800, + -1238374800, + -1221440400, + -1206925200, + -1191200400, + -1175475600, + -1160355600, + -1143421200, + -1127696400, + -1111971600, + -1096851600, + -1080522000, + -1063587600, + -1049072400, + -1033347600, + -1017622800, + -1002502800, + -986173200, + -969238800, + -950490000, + -942012000, + -932436000, + -857257200, + -844556400, + -828226800, + -812502000, + -800071200, + -796266000, + -781052400, + -766623600, + 196819200, + 212540400, + 228877200, + 243997200, + 260326800, + 276051600, + 291776400, + 307501200, + 323830800, + 338950800, + 354675600, + 370400400, + 386125200, + 401850000, + 417574800, + 433299600, + 449024400, + 465354000, + 481078800, + 496803600, + 512528400, + 528253200, + 543978000, + 559702800, + 575427600, + 591152400, + 606877200, + 622602000, + 638326800, + 654656400, + 670381200, + 686106000, + 701830800, + 717555600, + 733280400, + 749005200, + 764730000, + 780454800, + 796179600, + 811904400, + 828234000, + 846378000 + ], + "types": [ + { + "offset": 561 + }, + { + "offset": 0 + }, + { + "offset": 3600 + }, + { + "offset": 7200 + }, + { + "offset": 3600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-52291e736a34e36b-2ab58b9a9f408e39.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-52291e736a34e36b-2ab58b9a9f408e39.json new file mode 100644 index 00000000000000..e59d24012e655b --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-52291e736a34e36b-2ab58b9a9f408e39.json @@ -0,0 +1,273 @@ +{ + "ids": [ + "asia/damascus" + ], + "tzif": { + "posix": { + "abbr": "+03", + "offset": 10800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 3 + ], + "transitions": [ + -1577931912, + -1568592000, + -1554080400, + -1537142400, + -1522630800, + -1505692800, + -1491181200, + -1474243200, + -1459126800, + -242265600, + -228877200, + -210556800, + -197427600, + -178934400, + -165718800, + -147398400, + -134269200, + -116467200, + -102646800, + -84326400, + -71110800, + -52704000, + -39488400, + -21168000, + -7952400, + 10368000, + 23583600, + 41904000, + 55119600, + 73526400, + 86742000, + 105062400, + 118278000, + 136598400, + 149814000, + 168134400, + 181350000, + 199756800, + 212972400, + 231292800, + 241916400, + 262828800, + 273452400, + 418694400, + 433810800, + 450316800, + 465433200, + 508896000, + 529196400, + 541555200, + 562633200, + 574387200, + 594255600, + 607305600, + 623199600, + 638928000, + 654649200, + 670456800, + 686264400, + 702684000, + 717886800, + 733096800, + 748904400, + 765151200, + 780958800, + 796687200, + 812494800, + 828309600, + 844117200, + 859759200, + 875653200, + 891208800, + 907189200, + 922917600, + 938725200, + 954540000, + 970347600, + 986076000, + 1001883600, + 1017612000, + 1033419600, + 1049148000, + 1064955600, + 1080770400, + 1096578000, + 1112306400, + 1128114000, + 1143842400, + 1158872400, + 1175205600, + 1193950800, + 1207260000, + 1225486800, + 1238104800, + 1256850000, + 1270159200, + 1288299600, + 1301608800, + 1319749200, + 1333058400, + 1351198800, + 1364508000, + 1382648400, + 1395957600, + 1414702800, + 1427407200, + 1446152400, + 1458856800, + 1477602000, + 1490911200, + 1509051600, + 1522360800, + 1540501200, + 1553810400, + 1571950800, + 1585260000, + 1604005200, + 1616709600, + 1635454800, + 1648159200, + 1666904400 + ], + "types": [ + { + "offset": 8712 + }, + { + "offset": 7200 + }, + { + "offset": 10800 + }, + { + "offset": 10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5473a3220fbbe20b-150c46c09db6581d.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5473a3220fbbe20b-150c46c09db6581d.json new file mode 100644 index 00000000000000..3c17b5dd61b95a --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5473a3220fbbe20b-150c46c09db6581d.json @@ -0,0 +1,232 @@ +{ + "ids": [ + "europe/rome", + "europe/san_marino", + "europe/vatican" + ], + "tzif": { + "posix": { + "abbr": "CET", + "offset": 3600, + "transition": { + "abbr": "CEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 10800 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 0, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -3252098996, + -2403565200, + -1690765200, + -1680487200, + -1664758800, + -1648951200, + -1635123600, + -1616896800, + -1604278800, + -1585533600, + -1571014800, + -1555293600, + -932432400, + -857257200, + -844556400, + -828226800, + -812502000, + -798073200, + -781052400, + -766717200, + -750898800, + -733359600, + -719456400, + -701917200, + -689209200, + -670460400, + -114051600, + -103168800, + -81997200, + -71715600, + -50547600, + -40266000, + -18493200, + -8211600, + 12956400, + 23238000, + 43801200, + 54687600, + 75855600, + 86742000, + 107910000, + 118191600, + 138754800, + 149641200, + 170809200, + 181090800, + 202258800, + 212540400, + 233103600, + 243990000, + 265158000, + 276044400, + 296607600, + 307494000, + 323830800, + 338950800, + 354675600, + 370400400, + 386125200, + 401850000, + 417574800, + 433299600, + 449024400, + 465354000, + 481078800, + 496803600, + 512528400, + 528253200, + 543978000, + 559702800, + 575427600, + 591152400, + 606877200, + 622602000, + 638326800, + 654656400, + 670381200, + 686106000, + 701830800, + 717555600, + 733280400, + 749005200, + 764730000, + 780454800, + 796179600, + 811904400, + 828234000, + 846378000 + ], + "types": [ + { + "offset": 2996 + }, + { + "offset": 3600 + }, + { + "offset": 7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-55bb5ee9b0a529a6-dce97bdbcf437150.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-55bb5ee9b0a529a6-dce97bdbcf437150.json new file mode 100644 index 00000000000000..fde754caa0f764 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-55bb5ee9b0a529a6-dce97bdbcf437150.json @@ -0,0 +1,214 @@ +{ + "ids": [ + "america/glace_bay" + ], + "tzif": { + "posix": { + "abbr": "AST", + "offset": -14400, + "transition": { + "abbr": "ADT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -2131646412, + -1632074400, + -1615143600, + -880221600, + -769395600, + -765399600, + -526500000, + -513198000, + 73461600, + 89182800, + 104911200, + 120632400, + 136360800, + 152082000, + 167810400, + 183531600, + 199260000, + 215586000, + 230709600, + 247035600, + 262764000, + 278485200, + 294213600, + 309934800, + 325663200, + 341384400, + 357112800, + 372834000, + 388562400, + 404888400, + 420012000, + 436338000, + 452066400, + 467787600, + 483516000, + 499237200, + 514965600, + 530686800, + 544600800, + 562136400, + 576050400, + 594190800, + 607500000, + 625640400, + 638949600, + 657090000, + 671004000, + 688539600, + 702453600, + 719989200, + 733903200, + 752043600, + 765352800, + 783493200, + 796802400, + 814942800, + 828856800, + 846392400, + 860306400, + 877842000, + 891756000, + 909291600, + 923205600, + 941346000, + 954655200, + 972795600, + 986104800, + 1004245200, + 1018159200, + 1035694800, + 1049608800, + 1067144400, + 1081058400, + 1099198800, + 1112508000, + 1130648400, + 1143957600, + 1162098000, + 1173592800, + 1194152400 + ], + "types": [ + { + "offset": -14388 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-55ec396d83237537-39a492626467027.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-55ec396d83237537-39a492626467027.json new file mode 100644 index 00000000000000..f5f89fa3395714 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-55ec396d83237537-39a492626467027.json @@ -0,0 +1,94 @@ +{ + "ids": [ + "asia/samarkand" + ], + "tzif": { + "posix": { + "abbr": "+05", + "offset": 18000, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2 + ], + "transitions": [ + -1441168073, + -1247544000, + 354913200, + 370720800, + 386445600, + 386449200, + 402256800, + 417985200, + 433792800, + 449607600, + 465339600, + 481064400, + 496789200, + 512514000, + 528238800, + 543963600, + 559688400, + 575413200, + 591138000, + 606862800, + 622587600, + 638312400, + 654642000, + 670366800, + 686091600 + ], + "types": [ + { + "offset": 16073 + }, + { + "offset": 14400 + }, + { + "offset": 18000 + }, + { + "offset": 21600 + }, + { + "offset": 21600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-55eedcdc6ff1f85-5b27bba1cde1354f.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-55eedcdc6ff1f85-5b27bba1cde1354f.json new file mode 100644 index 00000000000000..3b0a1fc4156ca6 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-55eedcdc6ff1f85-5b27bba1cde1354f.json @@ -0,0 +1,39 @@ +{ + "ids": [ + "atlantic/cape_verde" + ], + "tzif": { + "posix": { + "abbr": "-01", + "offset": -3600, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 3 + ], + "transitions": [ + -1830376800, + -862610400, + -764118000, + 186120000 + ], + "types": [ + { + "offset": -5644 + }, + { + "offset": -7200 + }, + { + "offset": -3600 + }, + { + "offset": -3600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-57ad9603575ed991-356d85cfd1d045d6.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-57ad9603575ed991-356d85cfd1d045d6.json new file mode 100644 index 00000000000000..8c668066e41d4a --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-57ad9603575ed991-356d85cfd1d045d6.json @@ -0,0 +1,31 @@ +{ + "ids": [ + "pacific/fakaofo" + ], + "tzif": { + "posix": { + "abbr": "+13", + "offset": 46800, + "transition": null + }, + "transition_types": [ + 1, + 2 + ], + "transitions": [ + -2177411704, + 1325242800 + ], + "types": [ + { + "offset": -41096 + }, + { + "offset": -39600 + }, + { + "offset": 46800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5890af4975eb815-dbcd9d0a6fe5353.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5890af4975eb815-dbcd9d0a6fe5353.json new file mode 100644 index 00000000000000..516c7c31176de3 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5890af4975eb815-dbcd9d0a6fe5353.json @@ -0,0 +1,184 @@ +{ + "ids": [ + "asia/beirut" + ], + "tzif": { + "posix": { + "abbr": "EET", + "offset": 7200, + "transition": { + "abbr": "EEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 0 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 0 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -2840149320, + -1570413600, + -1552186800, + -1538359200, + -1522551600, + -1507514400, + -1490583600, + -1473645600, + -1460948400, + -399866400, + -386650800, + -368330400, + -355114800, + -336794400, + -323578800, + -305172000, + -291956400, + -273636000, + -260420400, + 78012000, + 86734800, + 105055200, + 118270800, + 136591200, + 149806800, + 168127200, + 181342800, + 199749600, + 212965200, + 231285600, + 244501200, + 262735200, + 275950800, + 452210400, + 466722000, + 483746400, + 498258000, + 515282400, + 529794000, + 546818400, + 561330000, + 581119200, + 592952400, + 610754400, + 624488400, + 641512800, + 656024400, + 673048800, + 687560400, + 704671200, + 718146000, + 733269600, + 748990800, + 764719200, + 780440400, + 796168800, + 811890000, + 828223200, + 843944400, + 859672800, + 875394000, + 891122400, + 906843600, + 922572000, + 941317200 + ], + "types": [ + { + "offset": 8520 + }, + { + "offset": 7200 + }, + { + "offset": 10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-59d5e08cb19672f5-73d8fe68d8bc0b47.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-59d5e08cb19672f5-73d8fe68d8bc0b47.json new file mode 100644 index 00000000000000..6c2fed3339ce46 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-59d5e08cb19672f5-73d8fe68d8bc0b47.json @@ -0,0 +1,42 @@ +{ + "ids": [ + "africa/johannesburg", + "africa/maseru", + "africa/mbabane" + ], + "tzif": { + "posix": { + "abbr": "SAST", + "offset": 7200, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3 + ], + "transitions": [ + -2458173120, + -2109288600, + -860976000, + -845254800, + -829526400 + ], + "types": [ + { + "offset": 6720 + }, + { + "offset": 5400 + }, + { + "offset": 7200 + }, + { + "offset": 10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5a1de33f302092c9-7fede906b0fbc944.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5a1de33f302092c9-7fede906b0fbc944.json new file mode 100644 index 00000000000000..acdce38d08db61 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5a1de33f302092c9-7fede906b0fbc944.json @@ -0,0 +1,222 @@ +{ + "ids": [ + "europe/minsk" + ], + "tzif": { + "posix": { + "abbr": "+03", + "offset": 10800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 3, + 6, + 3, + 6, + 3, + 6, + 3, + 6, + 3, + 6, + 3, + 6, + 3, + 6, + 3, + 6, + 3, + 6, + 3, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7 + ], + "transitions": [ + -2840147416, + -1441158600, + -1247536800, + -899780400, + -857257200, + -844556400, + -828226800, + -812502000, + -804650400, + 354920400, + 370728000, + 386456400, + 402264000, + 417992400, + 433800000, + 449614800, + 465346800, + 481071600, + 496796400, + 512521200, + 528246000, + 543970800, + 559695600, + 575420400, + 591145200, + 606870000, + 622594800, + 670374000, + 686102400, + 701827200, + 717552000, + 733276800, + 749001600, + 764726400, + 780451200, + 796176000, + 811900800, + 828230400, + 846374400, + 859680000, + 877824000, + 891129600, + 909273600, + 922579200, + 941328000, + 954028800, + 972777600, + 985478400, + 1004227200, + 1017532800, + 1035676800, + 1048982400, + 1067126400, + 1080432000, + 1099180800, + 1111881600, + 1130630400, + 1143331200, + 1162080000, + 1174780800, + 1193529600, + 1206835200, + 1224979200, + 1238284800, + 1256428800, + 1269734400, + 1288483200, + 1301184000 + ], + "types": [ + { + "offset": 6616 + }, + { + "offset": 6600 + }, + { + "offset": 7200 + }, + { + "offset": 10800 + }, + { + "offset": 7200 + }, + { + "offset": 3600 + }, + { + "offset": 14400 + }, + { + "offset": 10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5a8de8f20b18b43-384f712f565d0ab0.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5a8de8f20b18b43-384f712f565d0ab0.json new file mode 100644 index 00000000000000..9e04ac7f13ad11 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5a8de8f20b18b43-384f712f565d0ab0.json @@ -0,0 +1,178 @@ +{ + "ids": [ + "asia/atyrau" + ], + "tzif": { + "posix": { + "abbr": "+05", + "offset": 18000, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 2, + 5, + 2, + 5, + 6, + 3, + 4, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 6, + 2, + 5, + 6, + 2, + 5, + 6, + 2, + 5, + 6, + 2, + 5, + 6, + 2, + 5, + 6, + 2, + 5, + 2, + 5 + ], + "transitions": [ + -1441164464, + -1247540400, + 370724400, + 386445600, + 386449200, + 402256800, + 417985200, + 433792800, + 449607600, + 465339600, + 481064400, + 496789200, + 512514000, + 528238800, + 543963600, + 559688400, + 575413200, + 591138000, + 606862800, + 622587600, + 638312400, + 654642000, + 670366800, + 670370400, + 686095200, + 695772000, + 701816400, + 717541200, + 733266000, + 748990800, + 764715600, + 780440400, + 796165200, + 811890000, + 828219600, + 846363600, + 859669200, + 877813200, + 891118800, + 909262800, + 922568400, + 922572000, + 941320800, + 954021600, + 972770400, + 985471200, + 1004220000, + 1017525600, + 1035669600, + 1048975200, + 1067119200, + 1080424800, + 1099173600 + ], + "types": [ + { + "offset": 12464 + }, + { + "offset": 10800 + }, + { + "offset": 18000 + }, + { + "offset": 21600 + }, + { + "offset": 21600 + }, + { + "offset": 18000 + }, + { + "offset": 14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5cb26c449b2278f2-a3a1b3aa09d53c07.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5cb26c449b2278f2-a3a1b3aa09d53c07.json new file mode 100644 index 00000000000000..b9586f684cf408 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5cb26c449b2278f2-a3a1b3aa09d53c07.json @@ -0,0 +1,135 @@ +{ + "ids": [ + "europe/busingen", + "europe/vaduz", + "europe/zurich" + ], + "tzif": { + "posix": { + "abbr": "CET", + "offset": 3600, + "transition": { + "abbr": "CEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 10800 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2 + ], + "transitions": [ + -3675198848, + -2385246586, + -904435200, + -891129600, + -872985600, + -859680000, + 347151600, + 370400400, + 386125200, + 401850000, + 417574800, + 433299600, + 449024400, + 465354000, + 481078800, + 496803600, + 512528400, + 528253200, + 543978000, + 559702800, + 575427600, + 591152400, + 606877200, + 622602000, + 638326800, + 654656400, + 670381200, + 686106000, + 701830800, + 717555600, + 733280400, + 749005200, + 764730000, + 780454800, + 796179600, + 811904400, + 828234000, + 846378000 + ], + "types": [ + { + "offset": 2048 + }, + { + "offset": 1786 + }, + { + "offset": 3600 + }, + { + "offset": 7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5d69c15d2c4f26ae-d843083a2b2d2784.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5d69c15d2c4f26ae-d843083a2b2d2784.json new file mode 100644 index 00000000000000..b8757bffa0181e --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5d69c15d2c4f26ae-d843083a2b2d2784.json @@ -0,0 +1,153 @@ +{ + "ids": [ + "america/metlakatla" + ], + "tzif": { + "posix": { + "abbr": "AKST", + "offset": -32400, + "transition": { + "abbr": "AKDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 3, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 2, + 5, + 4 + ], + "transitions": [ + -3225223727, + -2188955622, + -880207200, + -769395600, + -765385200, + -21477600, + -5756400, + 9972000, + 25693200, + 41421600, + 57747600, + 73476000, + 89197200, + 104925600, + 120646800, + 126698400, + 152096400, + 162381600, + 183546000, + 199274400, + 215600400, + 230724000, + 247050000, + 262778400, + 278499600, + 294228000, + 309949200, + 325677600, + 341398800, + 357127200, + 372848400, + 388576800, + 404902800, + 420026400, + 436352400, + 1446372000, + 1457866800, + 1478426400, + 1489316400, + 1509876000, + 1520766000, + 1541325600, + 1547978400 + ], + "types": [ + { + "offset": 54822 + }, + { + "offset": -31578 + }, + { + "offset": -28800 + }, + { + "offset": -25200 + }, + { + "offset": -32400 + }, + { + "offset": -28800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5e245c7be541fe52-ac13030bf2bc388c.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5e245c7be541fe52-ac13030bf2bc388c.json new file mode 100644 index 00000000000000..64cb6496a95f55 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5e245c7be541fe52-ac13030bf2bc388c.json @@ -0,0 +1,235 @@ +{ + "ids": [ + "america/godthab", + "america/nuuk" + ], + "tzif": { + "posix": { + "abbr": "-02", + "offset": -7200, + "transition": { + "abbr": "-01", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 0 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": -3600 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 3 + ], + "transitions": [ + -1686083584, + 323845200, + 338950800, + 354675600, + 370400400, + 386125200, + 401850000, + 417574800, + 433299600, + 449024400, + 465354000, + 481078800, + 496803600, + 512528400, + 528253200, + 543978000, + 559702800, + 575427600, + 591152400, + 606877200, + 622602000, + 638326800, + 654656400, + 670381200, + 686106000, + 701830800, + 717555600, + 733280400, + 749005200, + 764730000, + 780454800, + 796179600, + 811904400, + 828234000, + 846378000, + 859683600, + 877827600, + 891133200, + 909277200, + 922582800, + 941331600, + 954032400, + 972781200, + 985482000, + 1004230800, + 1017536400, + 1035680400, + 1048986000, + 1067130000, + 1080435600, + 1099184400, + 1111885200, + 1130634000, + 1143334800, + 1162083600, + 1174784400, + 1193533200, + 1206838800, + 1224982800, + 1238288400, + 1256432400, + 1269738000, + 1288486800, + 1301187600, + 1319936400, + 1332637200, + 1351386000, + 1364691600, + 1382835600, + 1396141200, + 1414285200, + 1427590800, + 1445734800, + 1459040400, + 1477789200, + 1490490000, + 1509238800, + 1521939600, + 1540688400, + 1553994000, + 1572138000, + 1585443600, + 1603587600, + 1616893200, + 1635642000, + 1648342800, + 1667091600, + 1679792400 + ], + "types": [ + { + "offset": -12416 + }, + { + "offset": -10800 + }, + { + "offset": -7200 + }, + { + "offset": -7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5eec9cd299aa076f-857603deebbce60b.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5eec9cd299aa076f-857603deebbce60b.json new file mode 100644 index 00000000000000..8ca0a720e1c5ac --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5eec9cd299aa076f-857603deebbce60b.json @@ -0,0 +1,26 @@ +{ + "ids": [ + "etc/uct", + "etc/universal", + "etc/utc", + "etc/zulu", + "uct", + "universal", + "utc", + "zulu" + ], + "tzif": { + "posix": { + "abbr": "UTC", + "offset": 0, + "transition": null + }, + "transition_types": [], + "transitions": [], + "types": [ + { + "offset": 0 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5fd210f528e95871-c650f43dd3590090.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5fd210f528e95871-c650f43dd3590090.json new file mode 100644 index 00000000000000..96d1837748181c --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-5fd210f528e95871-c650f43dd3590090.json @@ -0,0 +1,191 @@ +{ + "ids": [ + "europe/astrakhan" + ], + "tzif": { + "posix": { + "abbr": "+04", + "offset": 14400, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 4, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 2, + 4, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4 + ], + "transitions": [ + -1441249932, + -1247540400, + 354916800, + 370724400, + 386452800, + 402260400, + 417988800, + 433796400, + 449611200, + 465343200, + 481068000, + 496792800, + 512517600, + 528242400, + 543967200, + 559692000, + 575416800, + 591141600, + 606866400, + 606870000, + 622594800, + 638319600, + 654649200, + 670374000, + 701820000, + 701823600, + 717548400, + 733273200, + 748998000, + 764722800, + 780447600, + 796172400, + 811897200, + 828226800, + 846370800, + 859676400, + 877820400, + 891126000, + 909270000, + 922575600, + 941324400, + 954025200, + 972774000, + 985474800, + 1004223600, + 1017529200, + 1035673200, + 1048978800, + 1067122800, + 1080428400, + 1099177200, + 1111878000, + 1130626800, + 1143327600, + 1162076400, + 1174777200, + 1193526000, + 1206831600, + 1224975600, + 1238281200, + 1256425200, + 1269730800, + 1288479600, + 1301180400, + 1414274400, + 1459033200 + ], + "types": [ + { + "offset": 11532 + }, + { + "offset": 10800 + }, + { + "offset": 14400 + }, + { + "offset": 18000 + }, + { + "offset": 14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-609a1c759abb0f9e-a202ec7708c700d8.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-609a1c759abb0f9e-a202ec7708c700d8.json new file mode 100644 index 00000000000000..f7159b308dadbc --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-609a1c759abb0f9e-a202ec7708c700d8.json @@ -0,0 +1,85 @@ +{ + "ids": [ + "america/porto_velho" + ], + "tzif": { + "posix": { + "abbr": "-04", + "offset": -14400, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -1767210264, + -1206954000, + -1191358800, + -1175371200, + -1159822800, + -633816000, + -622065600, + -602280000, + -591829200, + -570744000, + -560206800, + -539121600, + -531349200, + -191361600, + -184194000, + -155160000, + -150066000, + -128894400, + -121122000, + -99950400, + -89586000, + -68414400, + -57963600, + 499752000, + 511239600, + 530596800, + 540270000, + 562132800, + 571201200 + ], + "types": [ + { + "offset": -15336 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6156cfed77f2a26c-d5c8e957d52b5aa1.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6156cfed77f2a26c-d5c8e957d52b5aa1.json new file mode 100644 index 00000000000000..beed623276a5ca --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6156cfed77f2a26c-d5c8e957d52b5aa1.json @@ -0,0 +1,193 @@ +{ + "ids": [ + "asia/irkutsk" + ], + "tzif": { + "posix": { + "abbr": "+08", + "offset": 28800, + "transition": null + }, + "transition_types": [ + 0, + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 4, + 2, + 4, + 1, + 3, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 5, + 2, + 4 + ], + "transitions": [ + -2840165825, + -1575874625, + -1247554800, + 354902400, + 370710000, + 386438400, + 402246000, + 417974400, + 433782000, + 449596800, + 465328800, + 481053600, + 496778400, + 512503200, + 528228000, + 543952800, + 559677600, + 575402400, + 591127200, + 606852000, + 622576800, + 638301600, + 654631200, + 670356000, + 670359600, + 686084400, + 695761200, + 701805600, + 717530400, + 733255200, + 748980000, + 764704800, + 780429600, + 796154400, + 811879200, + 828208800, + 846352800, + 859658400, + 877802400, + 891108000, + 909252000, + 922557600, + 941306400, + 954007200, + 972756000, + 985456800, + 1004205600, + 1017511200, + 1035655200, + 1048960800, + 1067104800, + 1080410400, + 1099159200, + 1111860000, + 1130608800, + 1143309600, + 1162058400, + 1174759200, + 1193508000, + 1206813600, + 1224957600, + 1238263200, + 1256407200, + 1269712800, + 1288461600, + 1301162400, + 1414256400 + ], + "types": [ + { + "offset": 25025 + }, + { + "offset": 25200 + }, + { + "offset": 28800 + }, + { + "offset": 32400 + }, + { + "offset": 28800 + }, + { + "offset": 32400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6196bbf525d4d50a-c1285ce65c03319.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6196bbf525d4d50a-c1285ce65c03319.json new file mode 100644 index 00000000000000..6da298bc9ba616 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6196bbf525d4d50a-c1285ce65c03319.json @@ -0,0 +1,47 @@ +{ + "ids": [ + "hst", + "pacific/honolulu", + "pacific/johnston", + "us/hawaii" + ], + "tzif": { + "posix": { + "abbr": "HST", + "offset": -36000, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 2, + 1, + 3 + ], + "transitions": [ + -2334101314, + -1157283000, + -1155436200, + -880198200, + -769395600, + -765376200, + -712150200 + ], + "types": [ + { + "offset": -37886 + }, + { + "offset": -37800 + }, + { + "offset": -34200 + }, + { + "offset": -36000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-622cbc57a076ea5d-616edf8039af4f62.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-622cbc57a076ea5d-616edf8039af4f62.json new file mode 100644 index 00000000000000..d39f25e9fae739 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-622cbc57a076ea5d-616edf8039af4f62.json @@ -0,0 +1,190 @@ +{ + "ids": [ + "asia/qyzylorda" + ], + "tzif": { + "posix": { + "abbr": "+05", + "offset": 18000, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 2, + 5, + 2, + 5, + 2, + 5, + 6, + 3, + 4, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 3, + 4, + 2, + 5 + ], + "transitions": [ + -1441167712, + -1247544000, + 354913200, + 370720800, + 386445600, + 386449200, + 402256800, + 417985200, + 433792800, + 449607600, + 465339600, + 481064400, + 496789200, + 512514000, + 528238800, + 543963600, + 559688400, + 575413200, + 591138000, + 606862800, + 622587600, + 638312400, + 654642000, + 670366800, + 670370400, + 686095200, + 695768400, + 701812800, + 701816400, + 717541200, + 733266000, + 748990800, + 764715600, + 780440400, + 796165200, + 811890000, + 828219600, + 846363600, + 859669200, + 877813200, + 891118800, + 909262800, + 922568400, + 941317200, + 954018000, + 972766800, + 985467600, + 1004216400, + 1017522000, + 1035666000, + 1048971600, + 1067115600, + 1080421200, + 1099170000, + 1545328800 + ], + "types": [ + { + "offset": 15712 + }, + { + "offset": 14400 + }, + { + "offset": 18000 + }, + { + "offset": 21600 + }, + { + "offset": 21600 + }, + { + "offset": 18000 + }, + { + "offset": 25200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6268b48b2e959066-91294d0f7013ba84.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6268b48b2e959066-91294d0f7013ba84.json new file mode 100644 index 00000000000000..acb768b14bd852 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6268b48b2e959066-91294d0f7013ba84.json @@ -0,0 +1,37 @@ +{ + "ids": [ + "asia/pyongyang" + ], + "tzif": { + "posix": { + "abbr": "KST", + "offset": 32400, + "transition": null + }, + "transition_types": [ + 1, + 2, + 2, + 1, + 2 + ], + "transitions": [ + -1948782180, + -1830414600, + -768646800, + 1439564400, + 1525446000 + ], + "types": [ + { + "offset": 30180 + }, + { + "offset": 30600 + }, + { + "offset": 32400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-638a1ae9aef4e05b-74d152a85f1741cd.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-638a1ae9aef4e05b-74d152a85f1741cd.json new file mode 100644 index 00000000000000..b805f4a0cbcdf4 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-638a1ae9aef4e05b-74d152a85f1741cd.json @@ -0,0 +1,228 @@ +{ + "ids": [ + "europe/malta" + ], + "tzif": { + "posix": { + "abbr": "CET", + "offset": 3600, + "transition": { + "abbr": "CEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 10800 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -2403478684, + -1690765200, + -1680487200, + -1664758800, + -1648951200, + -1635123600, + -1616896800, + -1604278800, + -1585533600, + -1571014800, + -1555293600, + -932432400, + -857257200, + -844556400, + -828226800, + -812588400, + -798073200, + -781052400, + -766717200, + -750898800, + -733359600, + -719456400, + -701917200, + -689209200, + -670460400, + -114051600, + -103168800, + -81997200, + -71715600, + -50547600, + -40266000, + -18493200, + -8211600, + 12956400, + 23238000, + 43801200, + 54687600, + 75855600, + 86742000, + 102380400, + 118105200, + 135730800, + 148518000, + 167187600, + 180489600, + 198637200, + 211939200, + 230086800, + 243388800, + 261536400, + 274838400, + 292986000, + 306288000, + 323312400, + 338342400, + 347151600, + 370400400, + 386125200, + 401850000, + 417574800, + 433299600, + 449024400, + 465354000, + 481078800, + 496803600, + 512528400, + 528253200, + 543978000, + 559702800, + 575427600, + 591152400, + 606877200, + 622602000, + 638326800, + 654656400, + 670381200, + 686106000, + 701830800, + 717555600, + 733280400, + 749005200, + 764730000, + 780454800, + 796179600, + 811904400, + 828234000, + 846378000 + ], + "types": [ + { + "offset": 3484 + }, + { + "offset": 3600 + }, + { + "offset": 7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6415eb3f74777957-6f718f12281286a3.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6415eb3f74777957-6f718f12281286a3.json new file mode 100644 index 00000000000000..31cfbae1ce6028 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6415eb3f74777957-6f718f12281286a3.json @@ -0,0 +1,317 @@ +{ + "ids": [ + "cet", + "europe/amsterdam", + "europe/brussels", + "europe/luxembourg", + "met" + ], + "tzif": { + "posix": { + "abbr": "CET", + "offset": 3600, + "transition": { + "abbr": "CEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 10800 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 0, + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4 + ], + "transitions": [ + -2840141850, + -2450995200, + -1740355200, + -1693702800, + -1680483600, + -1663455600, + -1650150000, + -1632006000, + -1618700400, + -1613826000, + -1604278800, + -1585530000, + -1574038800, + -1552266000, + -1539997200, + -1520557200, + -1507510800, + -1490576400, + -1473642000, + -1459126800, + -1444006800, + -1427677200, + -1411952400, + -1396227600, + -1379293200, + -1364778000, + -1348448400, + -1333328400, + -1316394000, + -1301263200, + -1284328800, + -1269813600, + -1253484000, + -1238364000, + -1221429600, + -1206914400, + -1191189600, + -1175464800, + -1160344800, + -1143410400, + -1127685600, + -1111960800, + -1096840800, + -1080511200, + -1063576800, + -1049061600, + -1033336800, + -1017612000, + -1002492000, + -986162400, + -969228000, + -950479200, + -942012000, + -934668000, + -857257200, + -844556400, + -828226800, + -812502000, + -798073200, + -781052400, + -766623600, + -745455600, + -733273200, + 228877200, + 243997200, + 260326800, + 276051600, + 291776400, + 307501200, + 323830800, + 338950800, + 354675600, + 370400400, + 386125200, + 401850000, + 417574800, + 433299600, + 449024400, + 465354000, + 481078800, + 496803600, + 512528400, + 528253200, + 543978000, + 559702800, + 575427600, + 591152400, + 606877200, + 622602000, + 638326800, + 654656400, + 670381200, + 686106000, + 701830800, + 717555600, + 733280400, + 749005200, + 764730000, + 780454800, + 796179600, + 811904400, + 828234000, + 846378000 + ], + "types": [ + { + "offset": 1050 + }, + { + "offset": 0 + }, + { + "offset": 3600 + }, + { + "offset": 7200 + }, + { + "offset": 3600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6493d17f054bfdfb-35ed6c8176f0fbed.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6493d17f054bfdfb-35ed6c8176f0fbed.json new file mode 100644 index 00000000000000..26cff7a5a7f15d --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6493d17f054bfdfb-35ed6c8176f0fbed.json @@ -0,0 +1,28 @@ +{ + "ids": [ + "pacific/guadalcanal", + "pacific/pohnpei", + "pacific/ponape" + ], + "tzif": { + "posix": { + "abbr": "+11", + "offset": 39600, + "transition": null + }, + "transition_types": [ + 1 + ], + "transitions": [ + -1806748788 + ], + "types": [ + { + "offset": 38388 + }, + { + "offset": 39600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-650685fe5c95ce2a-2f3eb2e60291229d.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-650685fe5c95ce2a-2f3eb2e60291229d.json new file mode 100644 index 00000000000000..1c276e33922918 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-650685fe5c95ce2a-2f3eb2e60291229d.json @@ -0,0 +1,172 @@ +{ + "ids": [ + "asia/tehran", + "iran" + ], + "tzif": { + "posix": { + "abbr": "+0330", + "offset": 12600, + "transition": null + }, + "transition_types": [ + 0, + 1, + 2, + 3, + 4, + 3, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -1704165944, + -1090466744, + 227820600, + 246223800, + 259617600, + 271108800, + 279576000, + 296598600, + 306531000, + 322432200, + 338499000, + 673216200, + 685481400, + 701209800, + 717103800, + 732745800, + 748639800, + 764281800, + 780175800, + 795817800, + 811711800, + 827353800, + 843247800, + 858976200, + 874870200, + 890512200, + 906406200, + 922048200, + 937942200, + 953584200, + 969478200, + 985206600, + 1001100600, + 1016742600, + 1032636600, + 1048278600, + 1064172600, + 1079814600, + 1095708600, + 1111437000, + 1127331000, + 1206045000, + 1221939000, + 1237667400, + 1253561400, + 1269203400, + 1285097400, + 1300739400, + 1316633400, + 1332275400, + 1348169400, + 1363897800, + 1379791800, + 1395433800, + 1411327800, + 1426969800, + 1442863800, + 1458505800, + 1474399800, + 1490128200, + 1506022200, + 1521664200, + 1537558200, + 1553200200, + 1569094200, + 1584736200, + 1600630200, + 1616358600, + 1632252600 + ], + "types": [ + { + "offset": 12344 + }, + { + "offset": 12600 + }, + { + "offset": 16200 + }, + { + "offset": 14400 + }, + { + "offset": 18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-65401a13577707c6-bb9f9264b43c1451.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-65401a13577707c6-bb9f9264b43c1451.json new file mode 100644 index 00000000000000..7735182749215f --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-65401a13577707c6-bb9f9264b43c1451.json @@ -0,0 +1,19 @@ +{ + "ids": [ + "etc/gmt-6" + ], + "tzif": { + "posix": { + "abbr": "+06", + "offset": 21600, + "transition": null + }, + "transition_types": [], + "transitions": [], + "types": [ + { + "offset": 21600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-65badfa9c283e8d3-9bc658cd314193fd.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-65badfa9c283e8d3-9bc658cd314193fd.json new file mode 100644 index 00000000000000..403eca7a96e6ff --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-65badfa9c283e8d3-9bc658cd314193fd.json @@ -0,0 +1,126 @@ +{ + "ids": [ + "asia/hovd" + ], + "tzif": { + "posix": { + "abbr": "+07", + "offset": 25200, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2 + ], + "transitions": [ + -2032927596, + 252439200, + 417978000, + 433785600, + 449600400, + 465321600, + 481050000, + 496771200, + 512499600, + 528220800, + 543949200, + 559670400, + 575398800, + 591120000, + 606848400, + 622569600, + 638298000, + 654624000, + 670352400, + 686073600, + 701802000, + 717523200, + 733251600, + 748972800, + 764701200, + 780422400, + 796150800, + 811872000, + 828205200, + 843926400, + 859654800, + 875376000, + 891104400, + 906825600, + 988398000, + 1001700000, + 1017428400, + 1033149600, + 1048878000, + 1064599200, + 1080327600, + 1096048800, + 1111777200, + 1127498400, + 1143226800, + 1159552800, + 1427482800, + 1443196800 + ], + "types": [ + { + "offset": 21996 + }, + { + "offset": 21600 + }, + { + "offset": 25200 + }, + { + "offset": 28800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-66a5515c6139ad2d-8cdcb912670ca415.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-66a5515c6139ad2d-8cdcb912670ca415.json new file mode 100644 index 00000000000000..d99868efa3569b --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-66a5515c6139ad2d-8cdcb912670ca415.json @@ -0,0 +1,33 @@ +{ + "ids": [ + "america/la_paz" + ], + "tzif": { + "posix": { + "abbr": "-04", + "offset": -14400, + "transition": null + }, + "transition_types": [ + 0, + 1, + 2 + ], + "transitions": [ + -2524505244, + -1205954844, + -1192307244 + ], + "types": [ + { + "offset": -16356 + }, + { + "offset": -12756 + }, + { + "offset": -14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-66fc406d3b90ff90-42d7c96cbf80d3ca.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-66fc406d3b90ff90-42d7c96cbf80d3ca.json new file mode 100644 index 00000000000000..0ffdb46840ca70 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-66fc406d3b90ff90-42d7c96cbf80d3ca.json @@ -0,0 +1,101 @@ +{ + "ids": [ + "africa/juba" + ], + "tzif": { + "posix": { + "abbr": "CAT", + "offset": 7200, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 3, + 1 + ], + "transitions": [ + -1230775588, + 10360800, + 24786000, + 41810400, + 56322000, + 73432800, + 87944400, + 104882400, + 119480400, + 136332000, + 151016400, + 167781600, + 182552400, + 199231200, + 214174800, + 230680800, + 245710800, + 262735200, + 277246800, + 294184800, + 308782800, + 325634400, + 340405200, + 357084000, + 371941200, + 388533600, + 403477200, + 419983200, + 435013200, + 452037600, + 466635600, + 483487200, + 498171600, + 947930400, + 1612126800 + ], + "types": [ + { + "offset": 7588 + }, + { + "offset": 7200 + }, + { + "offset": 10800 + }, + { + "offset": 10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6797b3dc466b8334-28780ef70fbe052e.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6797b3dc466b8334-28780ef70fbe052e.json new file mode 100644 index 00000000000000..7621427102d8db --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6797b3dc466b8334-28780ef70fbe052e.json @@ -0,0 +1,26 @@ +{ + "ids": [ + "pacific/marquesas" + ], + "tzif": { + "posix": { + "abbr": "-0930", + "offset": -34200, + "transition": null + }, + "transition_types": [ + 1 + ], + "transitions": [ + -1806676920 + ], + "types": [ + { + "offset": -33480 + }, + { + "offset": -34200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-67d3e39540d85c91-f13f9d0367c68c92.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-67d3e39540d85c91-f13f9d0367c68c92.json new file mode 100644 index 00000000000000..31e6c002035674 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-67d3e39540d85c91-f13f9d0367c68c92.json @@ -0,0 +1,121 @@ +{ + "ids": [ + "atlantic/faeroe", + "atlantic/faroe" + ], + "tzif": { + "posix": { + "abbr": "WET", + "offset": 0, + "transition": { + "abbr": "WEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 3600 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -1955748776, + 347155200, + 370400400, + 386125200, + 401850000, + 417574800, + 433299600, + 449024400, + 465354000, + 481078800, + 496803600, + 512528400, + 528253200, + 543978000, + 559702800, + 575427600, + 591152400, + 606877200, + 622602000, + 638326800, + 654656400, + 670381200, + 686106000, + 701830800, + 717555600, + 733280400, + 749005200, + 764730000, + 780454800, + 796179600, + 811904400, + 828234000, + 846378000 + ], + "types": [ + { + "offset": -1624 + }, + { + "offset": 0 + }, + { + "offset": 3600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-68b74f8e8d191761-a8eaae70013bbfdf.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-68b74f8e8d191761-a8eaae70013bbfdf.json new file mode 100644 index 00000000000000..4f1697e5af6bf1 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-68b74f8e8d191761-a8eaae70013bbfdf.json @@ -0,0 +1,34 @@ +{ + "ids": [ + "pacific/midway", + "pacific/pago_pago", + "pacific/samoa", + "us/samoa" + ], + "tzif": { + "posix": { + "abbr": "SST", + "offset": -39600, + "transition": null + }, + "transition_types": [ + 1, + 2 + ], + "transitions": [ + -2445424632, + -1861879032 + ], + "types": [ + { + "offset": 45432 + }, + { + "offset": -40968 + }, + { + "offset": -39600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-69530af9af6cd0cb-6e2e37393c7f8e5d.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-69530af9af6cd0cb-6e2e37393c7f8e5d.json new file mode 100644 index 00000000000000..131456fd291f5c --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-69530af9af6cd0cb-6e2e37393c7f8e5d.json @@ -0,0 +1,61 @@ +{ + "ids": [ + "america/hermosillo" + ], + "tzif": { + "posix": { + "abbr": "MST", + "offset": -25200, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1 + ], + "transitions": [ + -1514739600, + -1343149200, + -1234807200, + -1220461200, + -1207159200, + -1191344400, + -873828000, + 828867600, + 846403200, + 860317200, + 877852800, + 891766800, + 909302400 + ], + "types": [ + { + "offset": -26632 + }, + { + "offset": -25200 + }, + { + "offset": -21600 + }, + { + "offset": -21600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6a52098e032992a5-e1eb00358541c6a0.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6a52098e032992a5-e1eb00358541c6a0.json new file mode 100644 index 00000000000000..390fea5d856afe --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6a52098e032992a5-e1eb00358541c6a0.json @@ -0,0 +1,249 @@ +{ + "ids": [ + "atlantic/bermuda" + ], + "tzif": { + "posix": { + "abbr": "AST", + "offset": -14400, + "transition": { + "abbr": "ADT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 0, + 1, + 0, + 1, + 0, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2 + ], + "transitions": [ + -2524506042, + -1664307642, + -1648932042, + -1632080442, + -1618692042, + -1262281242, + -882727200, + -858538800, + -845229600, + -825879600, + -814384800, + -793825200, + -782935200, + -762375600, + -713988000, + -703710000, + -681933600, + -672865200, + -650484000, + -641415600, + -618429600, + -609966000, + -586980000, + -578516400, + -555530400, + -546462000, + -429127200, + -415825200, + 136360800, + 152082000, + 167810400, + 183531600, + 199260000, + 215586000, + 230709600, + 247035600, + 262764000, + 278485200, + 294213600, + 309934800, + 325663200, + 341384400, + 357112800, + 372834000, + 388562400, + 404888400, + 420012000, + 436338000, + 452066400, + 467787600, + 483516000, + 499237200, + 514965600, + 530686800, + 544600800, + 562136400, + 576050400, + 594190800, + 607500000, + 625640400, + 638949600, + 657090000, + 671004000, + 688539600, + 702453600, + 719989200, + 733903200, + 752043600, + 765352800, + 783493200, + 796802400, + 814942800, + 828856800, + 846392400, + 860306400, + 877842000, + 891756000, + 909291600, + 923205600, + 941346000, + 954655200, + 972795600, + 986104800, + 1004245200, + 1018159200, + 1035694800, + 1049608800, + 1067144400, + 1081058400, + 1099198800, + 1112508000, + 1130648400, + 1143957600, + 1162098000, + 1173592800, + 1194152400 + ], + "types": [ + { + "offset": -15558 + }, + { + "offset": -11958 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6ad7cbb6af2e6144-d93cfc8ee54a6b99.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6ad7cbb6af2e6144-d93cfc8ee54a6b99.json new file mode 100644 index 00000000000000..68164c639c125c --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6ad7cbb6af2e6144-d93cfc8ee54a6b99.json @@ -0,0 +1,192 @@ +{ + "ids": [ + "europe/saratov" + ], + "tzif": { + "posix": { + "abbr": "+04", + "offset": 14400, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 4, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 2, + 4, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4 + ], + "transitions": [ + -1593820800, + -1247540400, + 354916800, + 370724400, + 386452800, + 402260400, + 417988800, + 433796400, + 449611200, + 465343200, + 481068000, + 496792800, + 512517600, + 528242400, + 543967200, + 559692000, + 575416800, + 575420400, + 591145200, + 606870000, + 622594800, + 638319600, + 654649200, + 670374000, + 701820000, + 701823600, + 717548400, + 733273200, + 748998000, + 764722800, + 780447600, + 796172400, + 811897200, + 828226800, + 846370800, + 859676400, + 877820400, + 891126000, + 909270000, + 922575600, + 941324400, + 954025200, + 972774000, + 985474800, + 1004223600, + 1017529200, + 1035673200, + 1048978800, + 1067122800, + 1080428400, + 1099177200, + 1111878000, + 1130626800, + 1143327600, + 1162076400, + 1174777200, + 1193526000, + 1206831600, + 1224975600, + 1238281200, + 1256425200, + 1269730800, + 1288479600, + 1301180400, + 1414274400, + 1480806000 + ], + "types": [ + { + "offset": 11058 + }, + { + "offset": 10800 + }, + { + "offset": 14400 + }, + { + "offset": 18000 + }, + { + "offset": 14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6bfb62f5e4b63e4a-5a7d3b172eb114d5.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6bfb62f5e4b63e4a-5a7d3b172eb114d5.json new file mode 100644 index 00000000000000..a29182e62fd491 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6bfb62f5e4b63e4a-5a7d3b172eb114d5.json @@ -0,0 +1,412 @@ +{ + "ids": [ + "europe/belfast", + "europe/guernsey", + "europe/isle_of_man", + "europe/jersey", + "europe/london", + "gb", + "gb-eire" + ], + "tzif": { + "posix": { + "abbr": "GMT", + "offset": 0, + "transition": { + "abbr": "BST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 3600 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 1, + 2, + 1, + 2, + 3, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1 + ], + "transitions": [ + -3852662325, + -1691964000, + -1680472800, + -1664143200, + -1650146400, + -1633903200, + -1617487200, + -1601848800, + -1586037600, + -1570399200, + -1552168800, + -1538344800, + -1522533600, + -1507500000, + -1490565600, + -1473631200, + -1460930400, + -1442786400, + -1428876000, + -1410732000, + -1396216800, + -1379282400, + -1364767200, + -1348437600, + -1333317600, + -1315778400, + -1301263200, + -1284328800, + -1269813600, + -1253484000, + -1238364000, + -1221429600, + -1206914400, + -1189980000, + -1175464800, + -1159135200, + -1143410400, + -1126476000, + -1111960800, + -1095631200, + -1080511200, + -1063576800, + -1049061600, + -1032127200, + -1017612000, + -1001282400, + -986162400, + -969228000, + -950479200, + -942012000, + -904518000, + -896050800, + -875487600, + -864601200, + -844038000, + -832546800, + -812588400, + -798073200, + -781052400, + -772066800, + -764805600, + -748476000, + -733356000, + -719445600, + -717030000, + -706748400, + -699487200, + -687996000, + -668037600, + -654732000, + -636588000, + -622072800, + -605743200, + -590623200, + -574293600, + -558568800, + -542239200, + -527119200, + -512604000, + -496274400, + -481154400, + -464220000, + -449704800, + -432165600, + -417650400, + -401320800, + -386200800, + -369266400, + -354751200, + -337816800, + -323301600, + -306972000, + -291852000, + -276732000, + -257983200, + -245282400, + -226533600, + -213228000, + -195084000, + -182383200, + -163634400, + -150933600, + -132184800, + -119484000, + -100735200, + -88034400, + -68680800, + -59004000, + -37242000, + 57722400, + 69818400, + 89172000, + 101268000, + 120621600, + 132717600, + 152071200, + 164167200, + 183520800, + 196221600, + 214970400, + 227671200, + 246420000, + 259120800, + 278474400, + 290570400, + 309924000, + 322020000, + 341373600, + 354675600, + 372819600, + 386125200, + 404269200, + 417574800, + 435718800, + 449024400, + 467773200, + 481078800, + 499222800, + 512528400, + 530672400, + 543978000, + 562122000, + 575427600, + 593571600, + 606877200, + 625626000, + 638326800, + 657075600, + 670381200, + 688525200, + 701830800, + 719974800, + 733280400, + 751424400, + 764730000, + 782874000, + 796179600, + 814323600, + 828234000, + 846378000 + ], + "types": [ + { + "offset": -75 + }, + { + "offset": 0 + }, + { + "offset": 3600 + }, + { + "offset": 7200 + }, + { + "offset": 3600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6d168cde30b3c19-24342dd0af895908.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6d168cde30b3c19-24342dd0af895908.json new file mode 100644 index 00000000000000..16c7fb41dc71f1 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6d168cde30b3c19-24342dd0af895908.json @@ -0,0 +1,32 @@ +{ + "ids": [ + "asia/kathmandu", + "asia/katmandu" + ], + "tzif": { + "posix": { + "abbr": "+0545", + "offset": 20700, + "transition": null + }, + "transition_types": [ + 1, + 2 + ], + "transitions": [ + -1577943676, + 504901800 + ], + "types": [ + { + "offset": 20476 + }, + { + "offset": 19800 + }, + { + "offset": 20700 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6d3285599a38ae5a-e146c246881dc5ed.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6d3285599a38ae5a-e146c246881dc5ed.json new file mode 100644 index 00000000000000..d7e0f6a227740a --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6d3285599a38ae5a-e146c246881dc5ed.json @@ -0,0 +1,180 @@ +{ + "ids": [ + "europe/bratislava", + "europe/prague" + ], + "tzif": { + "posix": { + "abbr": "CET", + "offset": 3600, + "transition": { + "abbr": "CEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 10800 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 0, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 3, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -3786829064, + -2469401864, + -1693706400, + -1680483600, + -1663455600, + -1650150000, + -1632006000, + -1618700400, + -938905200, + -857257200, + -844556400, + -828226800, + -812502000, + -796777200, + -781052400, + -765327600, + -746578800, + -733359600, + -728517600, + -721260000, + -701910000, + -684975600, + -670460400, + -654217200, + -639010800, + 291776400, + 307501200, + 323830800, + 338950800, + 354675600, + 370400400, + 386125200, + 401850000, + 417574800, + 433299600, + 449024400, + 465354000, + 481078800, + 496803600, + 512528400, + 528253200, + 543978000, + 559702800, + 575427600, + 591152400, + 606877200, + 622602000, + 638326800, + 654656400, + 670381200, + 686106000, + 701830800, + 717555600, + 733280400, + 749005200, + 764730000, + 780454800, + 796179600, + 811904400, + 828234000, + 846378000 + ], + "types": [ + { + "offset": 3464 + }, + { + "offset": 3600 + }, + { + "offset": 7200 + }, + { + "offset": 0 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6fbdbfed85292c81-468d78f0fb8a53ac.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6fbdbfed85292c81-468d78f0fb8a53ac.json new file mode 100644 index 00000000000000..78378c54a5053b --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6fbdbfed85292c81-468d78f0fb8a53ac.json @@ -0,0 +1,35 @@ +{ + "ids": [ + "america/atikokan", + "america/cayman", + "america/coral_harbour", + "america/panama", + "est" + ], + "tzif": { + "posix": { + "abbr": "EST", + "offset": -18000, + "transition": null + }, + "transition_types": [ + 1, + 2 + ], + "transitions": [ + -2524502512, + -1946918424 + ], + "types": [ + { + "offset": -19088 + }, + { + "offset": -19176 + }, + { + "offset": -18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6fbdea510dc8bdff-a0d6c86f83720461.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6fbdea510dc8bdff-a0d6c86f83720461.json new file mode 100644 index 00000000000000..b518ed931c3a65 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-6fbdea510dc8bdff-a0d6c86f83720461.json @@ -0,0 +1,140 @@ +{ + "ids": [ + "america/cancun" + ], + "tzif": { + "posix": { + "abbr": "EST", + "offset": -18000, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 3, + 1, + 2, + 3, + 2, + 3, + 4, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3 + ], + "transitions": [ + -1514743200, + 378201600, + 410504400, + 828864000, + 846399600, + 860313600, + 877849200, + 891759600, + 902037600, + 909298800, + 923212800, + 941353200, + 954662400, + 972802800, + 989136000, + 1001833200, + 1018166400, + 1035702000, + 1049616000, + 1067151600, + 1081065600, + 1099206000, + 1112515200, + 1130655600, + 1143964800, + 1162105200, + 1175414400, + 1193554800, + 1207468800, + 1225004400, + 1238918400, + 1256454000, + 1270368000, + 1288508400, + 1301817600, + 1319958000, + 1333267200, + 1351407600, + 1365321600, + 1382857200, + 1396771200, + 1414306800, + 1422777600 + ], + "types": [ + { + "offset": -20824 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + }, + { + "offset": -18000 + }, + { + "offset": -14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-70408e1d981309b7-da99eb025c30159.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-70408e1d981309b7-da99eb025c30159.json new file mode 100644 index 00000000000000..390cf37f795f28 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-70408e1d981309b7-da99eb025c30159.json @@ -0,0 +1,285 @@ +{ + "ids": [ + "america/boise" + ], + "tzif": { + "posix": { + "abbr": "MST", + "offset": -25200, + "transition": { + "abbr": "MDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 3, + 4, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3 + ], + "transitions": [ + -2717640000, + -1633269600, + -1615129200, + -1601820000, + -1583679600, + -1471788000, + -880210800, + -769395600, + -765388800, + -84380400, + -68659200, + -52930800, + -37209600, + -21481200, + -5760000, + 9968400, + 25689600, + 41418000, + 57744000, + 73472400, + 89193600, + 104922000, + 120643200, + 129114000, + 152092800, + 162378000, + 183542400, + 199270800, + 215596800, + 230720400, + 247046400, + 262774800, + 278496000, + 294224400, + 309945600, + 325674000, + 341395200, + 357123600, + 372844800, + 388573200, + 404899200, + 420022800, + 436348800, + 452077200, + 467798400, + 483526800, + 499248000, + 514976400, + 530697600, + 544611600, + 562147200, + 576061200, + 594201600, + 607510800, + 625651200, + 638960400, + 657100800, + 671014800, + 688550400, + 702464400, + 720000000, + 733914000, + 752054400, + 765363600, + 783504000, + 796813200, + 814953600, + 828867600, + 846403200, + 860317200, + 877852800, + 891766800, + 909302400, + 923216400, + 941356800, + 954666000, + 972806400, + 986115600, + 1004256000, + 1018170000, + 1035705600, + 1049619600, + 1067155200, + 1081069200, + 1099209600, + 1112518800, + 1130659200, + 1143968400, + 1162108800, + 1173603600, + 1194163200 + ], + "types": [ + { + "offset": -27889 + }, + { + "offset": -28800 + }, + { + "offset": -25200 + }, + { + "offset": -25200 + }, + { + "offset": -21600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-70c6eef1cba9528e-fa6fd92ebfdcf3ad.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-70c6eef1cba9528e-fa6fd92ebfdcf3ad.json new file mode 100644 index 00000000000000..479dbc2a1261c2 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-70c6eef1cba9528e-fa6fd92ebfdcf3ad.json @@ -0,0 +1,512 @@ +{ + "ids": [ + "africa/casablanca" + ], + "tzif": { + "posix": { + "abbr": "+01", + "offset": 3600, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3 + ], + "transitions": [ + -1773012580, + -956361600, + -950490000, + -942019200, + -761187600, + -617241600, + -605149200, + -81432000, + -71110800, + 141264000, + 147222000, + 199756800, + 207702000, + 231292800, + 244249200, + 265507200, + 271033200, + 448243200, + 504918000, + 1212278400, + 1220223600, + 1243814400, + 1250809200, + 1272758400, + 1281222000, + 1301788800, + 1312066800, + 1335664800, + 1342749600, + 1345428000, + 1348970400, + 1367114400, + 1373162400, + 1376100000, + 1382839200, + 1396144800, + 1403920800, + 1406944800, + 1414288800, + 1427594400, + 1434247200, + 1437271200, + 1445738400, + 1459044000, + 1465092000, + 1468116000, + 1477792800, + 1490493600, + 1495332000, + 1498960800, + 1509242400, + 1521943200, + 1526176800, + 1529200800, + 1557021600, + 1560045600, + 1587261600, + 1590890400, + 1618106400, + 1621130400, + 1648346400, + 1651975200, + 1679191200, + 1682215200, + 1710036000, + 1713060000, + 1740276000, + 1743904800, + 1771120800, + 1774144800, + 1801965600, + 1804989600, + 1832205600, + 1835834400, + 1863050400, + 1866074400, + 1893290400, + 1896919200, + 1924135200, + 1927159200, + 1954980000, + 1958004000, + 1985220000, + 1988848800, + 2016064800, + 2019088800, + 2046304800, + 2049933600, + 2077149600, + 2080778400, + 2107994400, + 2111018400, + 2138234400, + 2141863200, + 2169079200, + 2172103200, + 2199924000, + 2202948000, + 2230164000, + 2233792800, + 2261008800, + 2264032800, + 2291248800, + 2294877600, + 2322093600, + 2325722400, + 2352938400, + 2355962400, + 2383178400, + 2386807200, + 2414023200, + 2417047200, + 2444868000, + 2447892000, + 2475108000, + 2478736800, + 2505952800, + 2508976800, + 2536192800, + 2539821600, + 2567037600, + 2570666400, + 2597882400, + 2600906400, + 2628122400, + 2631751200, + 2658967200, + 2661991200, + 2689812000, + 2692836000, + 2720052000, + 2723680800, + 2750896800, + 2753920800, + 2781136800, + 2784765600, + 2811981600, + 2815610400, + 2842826400, + 2845850400, + 2873066400, + 2876695200, + 2903911200, + 2906935200, + 2934756000, + 2937780000, + 2964996000, + 2968624800, + 2995840800, + 2998864800, + 3026080800, + 3029709600, + 3056925600, + 3060554400, + 3087770400, + 3090794400, + 3118010400, + 3121639200, + 3148855200, + 3151879200, + 3179700000, + 3182724000, + 3209940000, + 3213568800, + 3240784800, + 3243808800, + 3271024800, + 3274653600, + 3301869600, + 3305498400, + 3332714400, + 3335738400, + 3362954400, + 3366583200, + 3393799200, + 3396823200, + 3424644000, + 3427668000, + 3454884000, + 3458512800, + 3485728800, + 3488752800, + 3515968800, + 3519597600, + 3546813600, + 3549837600, + 3577658400, + 3580682400, + 3607898400, + 3611527200, + 3638743200, + 3641767200, + 3669588000, + 3672612000, + 3699828000, + 3703456800 + ], + "types": [ + { + "offset": -1820 + }, + { + "offset": 0 + }, + { + "offset": 3600 + }, + { + "offset": 3600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-715448d734f9507a-f4183ed224275281.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-715448d734f9507a-f4183ed224275281.json new file mode 100644 index 00000000000000..c3ecbed4489f94 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-715448d734f9507a-f4183ed224275281.json @@ -0,0 +1,170 @@ +{ + "ids": [ + "america/argentina/tucuman" + ], + "tzif": { + "posix": { + "abbr": "-03", + "offset": -10800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 2, + 5, + 3, + 4, + 5, + 3, + 4, + 3, + 4, + 3, + 4, + 2, + 3, + 4, + 5, + 3, + 4, + 5 + ], + "transitions": [ + -2372096348, + -1567453392, + -1233432000, + -1222981200, + -1205956800, + -1194037200, + -1172865600, + -1162501200, + -1141329600, + -1130965200, + -1109793600, + -1099429200, + -1078257600, + -1067806800, + -1046635200, + -1036270800, + -1015099200, + -1004734800, + -983563200, + -973198800, + -952027200, + -941576400, + -931032000, + -900882000, + -890337600, + -833749200, + -827265600, + -752274000, + -733780800, + -197326800, + -190843200, + -184194000, + -164491200, + -152658000, + -132955200, + -121122000, + -101419200, + -86821200, + -71092800, + -54766800, + -39038400, + -23317200, + -7588800, + 128142000, + 136605600, + 596948400, + 605066400, + 624423600, + 636516000, + 656478000, + 667965600, + 687931200, + 699415200, + 719377200, + 731469600, + 938919600, + 952052400, + 1086058800, + 1087099200, + 1198983600, + 1205632800, + 1224385200 + ], + "types": [ + { + "offset": -15652 + }, + { + "offset": -15408 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + }, + { + "offset": -10800 + }, + { + "offset": -7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7238398358c87edf-bc2588b2ce94bc20.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7238398358c87edf-bc2588b2ce94bc20.json new file mode 100644 index 00000000000000..e103ef78905fe7 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7238398358c87edf-bc2588b2ce94bc20.json @@ -0,0 +1,41 @@ +{ + "ids": [ + "pacific/noumea" + ], + "tzif": { + "posix": { + "abbr": "+11", + "offset": 39600, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -1829387148, + 250002000, + 257342400, + 281451600, + 288878400, + 849366000, + 857228400 + ], + "types": [ + { + "offset": 39948 + }, + { + "offset": 39600 + }, + { + "offset": 43200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7241c1457aae4357-3c4783fc5e291a5.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7241c1457aae4357-3c4783fc5e291a5.json new file mode 100644 index 00000000000000..8d92255c9acba2 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7241c1457aae4357-3c4783fc5e291a5.json @@ -0,0 +1,74 @@ +{ + "ids": [ + "asia/baghdad" + ], + "tzif": { + "posix": { + "abbr": "+03", + "offset": 10800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2 + ], + "transitions": [ + -2524532260, + -1641005856, + 389048400, + 402264000, + 417906000, + 433800000, + 449614800, + 465422400, + 481150800, + 496792800, + 512517600, + 528242400, + 543967200, + 559692000, + 575416800, + 591141600, + 606866400, + 622591200, + 638316000, + 654645600, + 670464000, + 686275200 + ], + "types": [ + { + "offset": 10660 + }, + { + "offset": 10656 + }, + { + "offset": 10800 + }, + { + "offset": 14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7285bd926fe2dc70-a6ffff1cf5147cbf.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7285bd926fe2dc70-a6ffff1cf5147cbf.json new file mode 100644 index 00000000000000..f32ffbd11b050e --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7285bd926fe2dc70-a6ffff1cf5147cbf.json @@ -0,0 +1,31 @@ +{ + "ids": [ + "pacific/niue" + ], + "tzif": { + "posix": { + "abbr": "-11", + "offset": -39600, + "transition": null + }, + "transition_types": [ + 1, + 2 + ], + "transitions": [ + -543069620, + -173623200 + ], + "types": [ + { + "offset": -40780 + }, + { + "offset": -40800 + }, + { + "offset": -39600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-72be3d5f2c49eb87-7e9fa5340a3dee71.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-72be3d5f2c49eb87-7e9fa5340a3dee71.json new file mode 100644 index 00000000000000..f88776e5d634d2 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-72be3d5f2c49eb87-7e9fa5340a3dee71.json @@ -0,0 +1,26 @@ +{ + "ids": [ + "pacific/tahiti" + ], + "tzif": { + "posix": { + "abbr": "-10", + "offset": -36000, + "transition": null + }, + "transition_types": [ + 1 + ], + "transitions": [ + -1806674504 + ], + "types": [ + { + "offset": -35896 + }, + { + "offset": -36000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7459e3ffacdde5a6-a596288a1fff51a3.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7459e3ffacdde5a6-a596288a1fff51a3.json new file mode 100644 index 00000000000000..5e67dae5ee840a --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7459e3ffacdde5a6-a596288a1fff51a3.json @@ -0,0 +1,29 @@ +{ + "ids": [ + "asia/dubai", + "asia/muscat", + "indian/mahe", + "indian/reunion" + ], + "tzif": { + "posix": { + "abbr": "+04", + "offset": 14400, + "transition": null + }, + "transition_types": [ + 1 + ], + "transitions": [ + -1577936472 + ], + "types": [ + { + "offset": 13272 + }, + { + "offset": 14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7481a99701104a1c-da931bd1c7d61a9.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7481a99701104a1c-da931bd1c7d61a9.json new file mode 100644 index 00000000000000..9e0954bdae7a8d --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7481a99701104a1c-da931bd1c7d61a9.json @@ -0,0 +1,105 @@ +{ + "ids": [ + "america/recife" + ], + "tzif": { + "posix": { + "abbr": "-03", + "offset": -10800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -1767217224, + -1206957600, + -1191362400, + -1175374800, + -1159826400, + -633819600, + -622069200, + -602283600, + -591832800, + -570747600, + -560210400, + -539125200, + -531352800, + -191365200, + -184197600, + -155163600, + -150069600, + -128898000, + -121125600, + -99954000, + -89589600, + -68418000, + -57967200, + 499748400, + 511236000, + 530593200, + 540266400, + 562129200, + 571197600, + 592974000, + 602042400, + 624423600, + 634701600, + 938919600, + 951616800, + 970974000, + 971575200, + 1003028400, + 1013911200 + ], + "types": [ + { + "offset": -8376 + }, + { + "offset": -10800 + }, + { + "offset": -7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-748e0c2c22be393e-9159f30a64f07d32.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-748e0c2c22be393e-9159f30a64f07d32.json new file mode 100644 index 00000000000000..23814008143a83 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-748e0c2c22be393e-9159f30a64f07d32.json @@ -0,0 +1,205 @@ +{ + "ids": [ + "asia/amman" + ], + "tzif": { + "posix": { + "abbr": "+03", + "offset": 10800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 3 + ], + "transitions": [ + -1230776624, + 108165600, + 118270800, + 136591200, + 149806800, + 168127200, + 181342800, + 199749600, + 215643600, + 231285600, + 244501200, + 262735200, + 275950800, + 481154400, + 496962000, + 512949600, + 528670800, + 544399200, + 560120400, + 575848800, + 592174800, + 610581600, + 623624400, + 641167200, + 655074000, + 671839200, + 685918800, + 702856800, + 717973200, + 733701600, + 749422800, + 765151200, + 779662800, + 797205600, + 811116000, + 828655200, + 843170400, + 860104800, + 874620000, + 891554400, + 906069600, + 930780000, + 938124000, + 954367200, + 970178400, + 985816800, + 1001628000, + 1017352800, + 1033077600, + 1048802400, + 1066946400, + 1080252000, + 1097791200, + 1112306400, + 1128031200, + 1143756000, + 1161900000, + 1175205600, + 1193349600, + 1206655200, + 1225404000, + 1238104800, + 1256853600, + 1269554400, + 1288303200, + 1301608800, + 1319752800, + 1333058400, + 1387486800, + 1395957600, + 1414706400, + 1427407200, + 1446156000, + 1459461600, + 1477605600, + 1490911200, + 1509055200, + 1522360800, + 1540504800, + 1553810400, + 1571954400, + 1585260000, + 1604008800, + 1616709600, + 1635458400, + 1645740000, + 1666908000 + ], + "types": [ + { + "offset": 8624 + }, + { + "offset": 7200 + }, + { + "offset": 10800 + }, + { + "offset": 10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-74fc38128e80b92d-871756115f3d1b05.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-74fc38128e80b92d-871756115f3d1b05.json new file mode 100644 index 00000000000000..2e53b9b856b88a --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-74fc38128e80b92d-871756115f3d1b05.json @@ -0,0 +1,230 @@ +{ + "ids": [ + "asia/famagusta" + ], + "tzif": { + "posix": { + "abbr": "EET", + "offset": 7200, + "transition": { + "abbr": "EEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 14400 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 10800 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 3, + 1 + ], + "transitions": [ + -1518920148, + 166572000, + 182293200, + 200959200, + 213829200, + 228866400, + 243982800, + 260316000, + 276123600, + 291765600, + 307486800, + 323820000, + 338936400, + 354664800, + 370386000, + 386114400, + 401835600, + 417564000, + 433285200, + 449013600, + 465339600, + 481068000, + 496789200, + 512517600, + 528238800, + 543967200, + 559688400, + 575416800, + 591138000, + 606866400, + 622587600, + 638316000, + 654642000, + 670370400, + 686091600, + 701820000, + 717541200, + 733269600, + 748990800, + 764719200, + 780440400, + 796168800, + 811890000, + 828223200, + 843944400, + 859672800, + 875394000, + 891122400, + 909277200, + 922582800, + 941331600, + 954032400, + 972781200, + 985482000, + 1004230800, + 1017536400, + 1035680400, + 1048986000, + 1067130000, + 1080435600, + 1099184400, + 1111885200, + 1130634000, + 1143334800, + 1162083600, + 1174784400, + 1193533200, + 1206838800, + 1224982800, + 1238288400, + 1256432400, + 1269738000, + 1288486800, + 1301187600, + 1319936400, + 1332637200, + 1351386000, + 1364691600, + 1382835600, + 1396141200, + 1414285200, + 1427590800, + 1445734800, + 1459040400, + 1473282000, + 1509238800 + ], + "types": [ + { + "offset": 8148 + }, + { + "offset": 7200 + }, + { + "offset": 10800 + }, + { + "offset": 10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-754b9e4bdb20aa95-1c5b7a1b811c5ae3.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-754b9e4bdb20aa95-1c5b7a1b811c5ae3.json new file mode 100644 index 00000000000000..8fd2df3513d126 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-754b9e4bdb20aa95-1c5b7a1b811c5ae3.json @@ -0,0 +1,147 @@ +{ + "ids": [ + "america/fort_wayne", + "america/indiana/indianapolis", + "america/indianapolis", + "us/east-indiana" + ], + "tzif": { + "posix": { + "abbr": "EST", + "offset": -18000, + "transition": { + "abbr": "EDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 3, + 1, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3 + ], + "transitions": [ + -2717647200, + -1633276800, + -1615136400, + -1601827200, + -1583686800, + -900259200, + -891795600, + -880214400, + -769395600, + -765392400, + -757360800, + -733942800, + -715795200, + -702493200, + -684345600, + -671043600, + -652896000, + -639594000, + -620841600, + -608144400, + -589392000, + -576090000, + -557942400, + -544640400, + -526492800, + -513190800, + -495043200, + -481741200, + -463593600, + -386787600, + -368640000, + -21488400, + -5767200, + 9961200, + 25682400, + 1143961200, + 1162101600, + 1173596400, + 1194156000 + ], + "types": [ + { + "offset": -20678 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + }, + { + "offset": -18000 + }, + { + "offset": -14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-758d7fde6833ba8c-65256d0857a2f636.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-758d7fde6833ba8c-65256d0857a2f636.json new file mode 100644 index 00000000000000..1e68e6b7b766c6 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-758d7fde6833ba8c-65256d0857a2f636.json @@ -0,0 +1,264 @@ +{ + "ids": [ + "asia/jerusalem", + "asia/tel_aviv", + "israel" + ], + "tzif": { + "posix": { + "abbr": "IST", + "offset": 7200, + "transition": { + "abbr": "IDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 4, + 5 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 4, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2 + ], + "transitions": [ + -2840149254, + -1641003640, + -933638400, + -923097600, + -919036800, + -857347200, + -844300800, + -825811200, + -812678400, + -794188800, + -779846400, + -762652800, + -748310400, + -731116800, + -681955200, + -673228800, + -667958400, + -652320000, + -636422400, + -622080000, + -608947200, + -591840000, + -572486400, + -558576000, + -542851200, + -527731200, + -514425600, + -490838400, + -482976000, + -459388800, + -451526400, + -428544000, + -418262400, + -400118400, + -387417600, + 142380000, + 150843600, + 167176800, + 178664400, + 334101600, + 337730400, + 452642400, + 462319200, + 482277600, + 494370000, + 516751200, + 526424400, + 545436000, + 558478800, + 576626400, + 589323600, + 609890400, + 620773200, + 638316000, + 651618000, + 669765600, + 683672400, + 701820000, + 715726800, + 733701600, + 747176400, + 765151200, + 778021200, + 796600800, + 810075600, + 826840800, + 842821200, + 858895200, + 874184400, + 890344800, + 905029200, + 923011200, + 936313200, + 955670400, + 970783200, + 986770800, + 1001282400, + 1017356400, + 1033941600, + 1048806000, + 1065132000, + 1081292400, + 1095804000, + 1112313600, + 1128812400, + 1143763200, + 1159657200, + 1175212800, + 1189897200, + 1206662400, + 1223161200, + 1238112000, + 1254006000, + 1269561600, + 1284246000, + 1301616000, + 1317510000, + 1333065600, + 1348354800, + 1364515200, + 1382828400 + ], + "types": [ + { + "offset": 8454 + }, + { + "offset": 8440 + }, + { + "offset": 7200 + }, + { + "offset": 10800 + }, + { + "offset": 14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7599edfd11a3db64-4bf8d694826715ae.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7599edfd11a3db64-4bf8d694826715ae.json new file mode 100644 index 00000000000000..693b0c4c3e9053 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7599edfd11a3db64-4bf8d694826715ae.json @@ -0,0 +1,339 @@ +{ + "ids": [ + "america/kentucky/louisville", + "america/louisville" + ], + "tzif": { + "posix": { + "abbr": "EST", + "offset": -18000, + "transition": { + "abbr": "EDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 2, + 3, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3 + ], + "transitions": [ + -2717647200, + -1633276800, + -1615136400, + -1601827200, + -1583686800, + -1535904000, + -1525280400, + -905097600, + -891795600, + -880214400, + -769395600, + -765392400, + -747251940, + -744224400, + -620841600, + -608144400, + -589392000, + -576090000, + -557942400, + -544640400, + -526492800, + -513190800, + -495043200, + -481741200, + -463593600, + -450291600, + -431539200, + -415818000, + -400089600, + -384368400, + -368640000, + -352918800, + -337190400, + -321469200, + -305740800, + -289414800, + -273686400, + -266432400, + -52938000, + -37216800, + -21488400, + -5767200, + 9961200, + 25682400, + 41410800, + 57736800, + 73465200, + 89186400, + 104914800, + 120636000, + 126687600, + 152089200, + 162370800, + 183535200, + 199263600, + 215589600, + 230713200, + 247039200, + 262767600, + 278488800, + 294217200, + 309938400, + 325666800, + 341388000, + 357116400, + 372837600, + 388566000, + 404892000, + 420015600, + 436341600, + 452070000, + 467791200, + 483519600, + 499240800, + 514969200, + 530690400, + 544604400, + 562140000, + 576054000, + 594194400, + 607503600, + 625644000, + 638953200, + 657093600, + 671007600, + 688543200, + 702457200, + 719992800, + 733906800, + 752047200, + 765356400, + 783496800, + 796806000, + 814946400, + 828860400, + 846396000, + 860310000, + 877845600, + 891759600, + 909295200, + 923209200, + 941349600, + 954658800, + 972799200, + 986108400, + 1004248800, + 1018162800, + 1035698400, + 1049612400, + 1067148000, + 1081062000, + 1099202400, + 1112511600, + 1130652000, + 1143961200, + 1162101600, + 1173596400, + 1194156000 + ], + "types": [ + { + "offset": -20582 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + }, + { + "offset": -18000 + }, + { + "offset": -14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-75a476630c4f3c06-6cc92a5fc490dfa3.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-75a476630c4f3c06-6cc92a5fc490dfa3.json new file mode 100644 index 00000000000000..18b872c8a44cca --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-75a476630c4f3c06-6cc92a5fc490dfa3.json @@ -0,0 +1,129 @@ +{ + "ids": [ + "america/araguaina" + ], + "tzif": { + "posix": { + "abbr": "-03", + "offset": -10800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -1767214032, + -1206957600, + -1191362400, + -1175374800, + -1159826400, + -633819600, + -622069200, + -602283600, + -591832800, + -570747600, + -560210400, + -539125200, + -531352800, + -191365200, + -184197600, + -155163600, + -150069600, + -128898000, + -121125600, + -99954000, + -89589600, + -68418000, + -57967200, + 499748400, + 511236000, + 530593200, + 540266400, + 562129200, + 571197600, + 592974000, + 602042400, + 624423600, + 634701600, + 813726000, + 824004000, + 844570800, + 856058400, + 876106800, + 888717600, + 908074800, + 919562400, + 938919600, + 951616800, + 970974000, + 982461600, + 1003028400, + 1013911200, + 1036292400, + 1045360800, + 1350788400, + 1361066400 + ], + "types": [ + { + "offset": -11568 + }, + { + "offset": -10800 + }, + { + "offset": -7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7622c5c99b380b37-74a373c9f92241c7.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7622c5c99b380b37-74a373c9f92241c7.json new file mode 100644 index 00000000000000..4cff8fa3fe6bd6 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7622c5c99b380b37-74a373c9f92241c7.json @@ -0,0 +1,224 @@ +{ + "ids": [ + "europe/chisinau", + "europe/tiraspol" + ], + "tzif": { + "posix": { + "abbr": "EET", + "offset": 7200, + "transition": { + "abbr": "EEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 10800 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 5, + 6, + 3, + 5, + 6, + 3, + 5, + 4, + 7, + 8, + 4, + 7, + 8, + 4, + 7, + 8, + 4, + 7, + 8, + 4, + 7, + 8, + 4, + 7, + 8, + 4, + 7, + 8, + 4, + 7, + 8, + 4, + 7, + 8, + 4, + 7, + 8, + 4, + 7, + 3, + 5, + 4, + 7, + 3, + 5, + 4, + 7, + 3, + 5, + 4, + 7, + 3, + 5, + 4, + 7, + 3, + 5, + 4, + 7, + 3, + 5, + 4, + 7, + 3, + 5, + 4, + 7, + 3, + 5 + ], + "transitions": [ + -2840147720, + -1637114100, + -1213148664, + -1187056800, + -1175479200, + -1159754400, + -1144029600, + -1127700000, + -1111975200, + -1096250400, + -1080525600, + -1064800800, + -1049076000, + -1033351200, + -1017626400, + -1001901600, + -986176800, + -970452000, + -954727200, + -927165600, + -898138800, + -857257200, + -844556400, + -828226800, + -812502000, + -800157600, + 354920400, + 370728000, + 386456400, + 402264000, + 417992400, + 433800000, + 449614800, + 465346800, + 481071600, + 496796400, + 512521200, + 528246000, + 543970800, + 559695600, + 575420400, + 591145200, + 606870000, + 622594800, + 638319600, + 641944800, + 654652800, + 670377600, + 686102400, + 694216800, + 717541200, + 733269600, + 748990800, + 764719200, + 780440400, + 796168800, + 811890000, + 828223200, + 846363600, + 859680000, + 877824000 + ], + "types": [ + { + "offset": 6920 + }, + { + "offset": 6900 + }, + { + "offset": 6264 + }, + { + "offset": 7200 + }, + { + "offset": 10800 + }, + { + "offset": 7200 + }, + { + "offset": 3600 + }, + { + "offset": 10800 + }, + { + "offset": 14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-762fa57e245bdc0d-c5a018de141b4cb3.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-762fa57e245bdc0d-c5a018de141b4cb3.json new file mode 100644 index 00000000000000..67ea7ea99cdd55 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-762fa57e245bdc0d-c5a018de141b4cb3.json @@ -0,0 +1,32 @@ +{ + "ids": [ + "asia/thimbu", + "asia/thimphu" + ], + "tzif": { + "posix": { + "abbr": "+06", + "offset": 21600, + "transition": null + }, + "transition_types": [ + 1, + 2 + ], + "transitions": [ + -706341516, + 560025000 + ], + "types": [ + { + "offset": 21516 + }, + { + "offset": 19800 + }, + { + "offset": 21600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-768158f1c3d3089e-e43bac17424df347.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-768158f1c3d3089e-e43bac17424df347.json new file mode 100644 index 00000000000000..68796ec7b64e72 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-768158f1c3d3089e-e43bac17424df347.json @@ -0,0 +1,258 @@ +{ + "ids": [ + "america/sitka" + ], + "tzif": { + "posix": { + "abbr": "AKST", + "offset": -32400, + "transition": { + "abbr": "AKDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 3, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 4, + 5, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5 + ], + "transitions": [ + -3225223727, + -2188954727, + -880207200, + -769395600, + -765385200, + -21477600, + -5756400, + 9972000, + 25693200, + 41421600, + 57747600, + 73476000, + 89197200, + 104925600, + 120646800, + 126698400, + 152096400, + 162381600, + 183546000, + 199274400, + 215600400, + 230724000, + 247050000, + 262778400, + 278499600, + 294228000, + 309949200, + 325677600, + 341398800, + 357127200, + 372848400, + 388576800, + 404902800, + 420026400, + 436352400, + 436356000, + 439030800, + 452084400, + 467805600, + 483534000, + 499255200, + 514983600, + 530704800, + 544618800, + 562154400, + 576068400, + 594208800, + 607518000, + 625658400, + 638967600, + 657108000, + 671022000, + 688557600, + 702471600, + 720007200, + 733921200, + 752061600, + 765370800, + 783511200, + 796820400, + 814960800, + 828874800, + 846410400, + 860324400, + 877860000, + 891774000, + 909309600, + 923223600, + 941364000, + 954673200, + 972813600, + 986122800, + 1004263200, + 1018177200, + 1035712800, + 1049626800, + 1067162400, + 1081076400, + 1099216800, + 1112526000, + 1130666400, + 1143975600, + 1162116000, + 1173610800, + 1194170400 + ], + "types": [ + { + "offset": 53927 + }, + { + "offset": -32473 + }, + { + "offset": -28800 + }, + { + "offset": -25200 + }, + { + "offset": -28800 + }, + { + "offset": -32400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7776a42ce751a29e-1629f5ee8a6e924e.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7776a42ce751a29e-1629f5ee8a6e924e.json new file mode 100644 index 00000000000000..a0c506cd63eb2e --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7776a42ce751a29e-1629f5ee8a6e924e.json @@ -0,0 +1,98 @@ +{ + "ids": [ + "america/danmarkshavn" + ], + "tzif": { + "posix": { + "abbr": "GMT", + "offset": 0, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 3 + ], + "transitions": [ + -1686091520, + 323845200, + 338950800, + 354675600, + 370400400, + 386125200, + 401850000, + 417574800, + 433299600, + 449024400, + 465354000, + 481078800, + 496803600, + 512528400, + 528253200, + 543978000, + 559702800, + 575427600, + 591152400, + 606877200, + 622602000, + 638326800, + 654656400, + 670381200, + 686106000, + 701830800, + 717555600, + 733280400, + 749005200, + 764730000, + 780454800, + 796179600, + 811904400, + 820465200 + ], + "types": [ + { + "offset": -4480 + }, + { + "offset": -10800 + }, + { + "offset": -7200 + }, + { + "offset": 0 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-794b5729aca99b8f-8dcbb73848fb52db.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-794b5729aca99b8f-8dcbb73848fb52db.json new file mode 100644 index 00000000000000..60e3cc9f6bff2a --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-794b5729aca99b8f-8dcbb73848fb52db.json @@ -0,0 +1,49 @@ +{ + "ids": [ + "australia/darwin", + "australia/north" + ], + "tzif": { + "posix": { + "abbr": "ACST", + "offset": 34200, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3 + ], + "transitions": [ + -2364108200, + -2230189200, + -1672558200, + -1665387000, + -883639800, + -876123000, + -860398200, + -844673400, + -828343800 + ], + "types": [ + { + "offset": 31400 + }, + { + "offset": 32400 + }, + { + "offset": 34200 + }, + { + "offset": 37800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-79a67056f030a883-f33ddefe3e35e4d0.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-79a67056f030a883-f33ddefe3e35e4d0.json new file mode 100644 index 00000000000000..fa4a8618b71ff3 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-79a67056f030a883-f33ddefe3e35e4d0.json @@ -0,0 +1,27 @@ +{ + "ids": [ + "asia/kashgar", + "asia/urumqi" + ], + "tzif": { + "posix": { + "abbr": "+06", + "offset": 21600, + "transition": null + }, + "transition_types": [ + 1 + ], + "transitions": [ + -1325483420 + ], + "types": [ + { + "offset": 21020 + }, + { + "offset": 21600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7a158f0aed162547-27577cc8813fb4ed.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7a158f0aed162547-27577cc8813fb4ed.json new file mode 100644 index 00000000000000..abe95e637b857f --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7a158f0aed162547-27577cc8813fb4ed.json @@ -0,0 +1,82 @@ +{ + "ids": [ + "asia/dushanbe" + ], + "tzif": { + "posix": { + "abbr": "+05", + "offset": 18000, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 4, + 1 + ], + "transitions": [ + -1441168512, + -1247547600, + 354909600, + 370717200, + 386445600, + 402253200, + 417981600, + 433789200, + 449604000, + 465336000, + 481060800, + 496785600, + 512510400, + 528235200, + 543960000, + 559684800, + 575409600, + 591134400, + 606859200, + 622584000, + 638308800, + 654638400, + 670363200, + 684363600 + ], + "types": [ + { + "offset": 16512 + }, + { + "offset": 18000 + }, + { + "offset": 21600 + }, + { + "offset": 25200 + }, + { + "offset": 21600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7aa0aebc84b44c67-973b0b87d9034391.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7aa0aebc84b44c67-973b0b87d9034391.json new file mode 100644 index 00000000000000..298de1ce9a3048 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7aa0aebc84b44c67-973b0b87d9034391.json @@ -0,0 +1,38 @@ +{ + "ids": [ + "africa/sao_tome" + ], + "tzif": { + "posix": { + "abbr": "GMT", + "offset": 0, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2 + ], + "transitions": [ + -2713912016, + -1830384000, + 1514768400, + 1546304400 + ], + "types": [ + { + "offset": 1616 + }, + { + "offset": -2205 + }, + { + "offset": 0 + }, + { + "offset": 3600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7ba4aaa7dba09bb0-567af4b250c89d25.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7ba4aaa7dba09bb0-567af4b250c89d25.json new file mode 100644 index 00000000000000..dc696146bc098e --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7ba4aaa7dba09bb0-567af4b250c89d25.json @@ -0,0 +1,210 @@ +{ + "ids": [ + "america/ojinaga" + ], + "tzif": { + "posix": { + "abbr": "CST", + "offset": -21600, + "transition": { + "abbr": "CDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 3, + 1, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 2, + 3 + ], + "transitions": [ + -1514739600, + -1343149200, + -1234807200, + -1220461200, + -1207159200, + -1191344400, + 828864000, + 846399600, + 860313600, + 877849200, + 891766800, + 909302400, + 923216400, + 941356800, + 954666000, + 972806400, + 989139600, + 1001836800, + 1018170000, + 1035705600, + 1049619600, + 1067155200, + 1081069200, + 1099209600, + 1112518800, + 1130659200, + 1143968400, + 1162108800, + 1175418000, + 1193558400, + 1207472400, + 1225008000, + 1238922000, + 1256457600, + 1268557200, + 1289116800, + 1300006800, + 1320566400, + 1331456400, + 1352016000, + 1362906000, + 1383465600, + 1394355600, + 1414915200, + 1425805200, + 1446364800, + 1457859600, + 1478419200, + 1489309200, + 1509868800, + 1520758800, + 1541318400, + 1552208400, + 1572768000, + 1583658000, + 1604217600, + 1615712400, + 1636272000, + 1647162000, + 1667116800 + ], + "types": [ + { + "offset": -25060 + }, + { + "offset": -25200 + }, + { + "offset": -21600 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7bce416a66d38e42-b58b08c4c731f7dc.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7bce416a66d38e42-b58b08c4c731f7dc.json new file mode 100644 index 00000000000000..99725a71edd578 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7bce416a66d38e42-b58b08c4c731f7dc.json @@ -0,0 +1,34 @@ +{ + "ids": [ + "asia/tokyo", + "japan" + ], + "tzif": { + "posix": { + "abbr": "JST", + "offset": 32400, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1 + ], + "transitions": [ + -2587712400, + -683802000, + -672310800 + ], + "types": [ + { + "offset": 33539 + }, + { + "offset": 32400 + }, + { + "offset": 36000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7be16635ecf890b5-161efc0ab3ac2299.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7be16635ecf890b5-161efc0ab3ac2299.json new file mode 100644 index 00000000000000..4e6910e6c2e01f --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7be16635ecf890b5-161efc0ab3ac2299.json @@ -0,0 +1,193 @@ +{ + "ids": [ + "asia/magadan" + ], + "tzif": { + "posix": { + "abbr": "+11", + "offset": 39600, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 4, + 2, + 4, + 1, + 3, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 5, + 1, + 2, + 4 + ], + "transitions": [ + -1441188192, + -1247565600, + 354891600, + 370699200, + 386427600, + 402235200, + 417963600, + 433771200, + 449586000, + 465318000, + 481042800, + 496767600, + 512492400, + 528217200, + 543942000, + 559666800, + 575391600, + 591116400, + 606841200, + 622566000, + 638290800, + 654620400, + 670345200, + 670348800, + 686073600, + 695750400, + 701794800, + 717519600, + 733244400, + 748969200, + 764694000, + 780418800, + 796143600, + 811868400, + 828198000, + 846342000, + 859647600, + 877791600, + 891097200, + 909241200, + 922546800, + 941295600, + 953996400, + 972745200, + 985446000, + 1004194800, + 1017500400, + 1035644400, + 1048950000, + 1067094000, + 1080399600, + 1099148400, + 1111849200, + 1130598000, + 1143298800, + 1162047600, + 1174748400, + 1193497200, + 1206802800, + 1224946800, + 1238252400, + 1256396400, + 1269702000, + 1288450800, + 1301151600, + 1414245600, + 1461427200 + ], + "types": [ + { + "offset": 36192 + }, + { + "offset": 36000 + }, + { + "offset": 39600 + }, + { + "offset": 43200 + }, + { + "offset": 39600 + }, + { + "offset": 43200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7cca7c8a1af35285-679fdca550b074a0.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7cca7c8a1af35285-679fdca550b074a0.json new file mode 100644 index 00000000000000..48271b49fc4192 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7cca7c8a1af35285-679fdca550b074a0.json @@ -0,0 +1,35 @@ +{ + "ids": [ + "asia/dili" + ], + "tzif": { + "posix": { + "abbr": "+09", + "offset": 32400, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2 + ], + "transitions": [ + -1830412800, + -879152400, + 199897200, + 969120000 + ], + "types": [ + { + "offset": 30140 + }, + { + "offset": 28800 + }, + { + "offset": 32400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7d33da447360d55c-52583d8c13b6f677.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7d33da447360d55c-52583d8c13b6f677.json new file mode 100644 index 00000000000000..f8070aa53de5c4 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7d33da447360d55c-52583d8c13b6f677.json @@ -0,0 +1,250 @@ +{ + "ids": [ + "europe/madrid" + ], + "tzif": { + "posix": { + "abbr": "CET", + "offset": 3600, + "transition": { + "abbr": "CEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 10800 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 3, + 2, + 1, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4 + ], + "transitions": [ + -2177452800, + -1631926800, + -1616889600, + -1601168400, + -1585353600, + -1442451600, + -1427673600, + -1379293200, + -1364774400, + -1348448400, + -1333324800, + -1316390400, + -1301270400, + -1284339600, + -1269820800, + -1026954000, + -1017619200, + -1001898000, + -999482400, + -986090400, + -954115200, + -940208400, + -873079200, + -862621200, + -842839200, + -828320400, + -811389600, + -796870800, + -779940000, + -765421200, + -748490400, + -733971600, + -652327200, + -639018000, + 135122400, + 150246000, + 166572000, + 181695600, + 196812000, + 212540400, + 228866400, + 243990000, + 260326800, + 276051600, + 291776400, + 307501200, + 323830800, + 338950800, + 354675600, + 370400400, + 386125200, + 401850000, + 417574800, + 433299600, + 449024400, + 465354000, + 481078800, + 496803600, + 512528400, + 528253200, + 543978000, + 559702800, + 575427600, + 591152400, + 606877200, + 622602000, + 638326800, + 654656400, + 670381200, + 686106000, + 701830800, + 717555600, + 733280400, + 749005200, + 764730000, + 780454800, + 796179600, + 811904400, + 828234000, + 846378000 + ], + "types": [ + { + "offset": -884 + }, + { + "offset": 0 + }, + { + "offset": 3600 + }, + { + "offset": 7200 + }, + { + "offset": 3600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7d7635957a94c158-89410cc4ecfceda2.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7d7635957a94c158-89410cc4ecfceda2.json new file mode 100644 index 00000000000000..3ca5c1a8678149 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7d7635957a94c158-89410cc4ecfceda2.json @@ -0,0 +1,332 @@ +{ + "ids": [ + "america/punta_arenas" + ], + "tzif": { + "posix": { + "abbr": "-03", + "offset": -10800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 3, + 1, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 3, + 4, + 2, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 5, + 6 + ], + "transitions": [ + -2524504580, + -1892661435, + -1688410800, + -1619205435, + -1593806400, + -1335986235, + -1335985200, + -1317585600, + -1304362800, + -1286049600, + -1272826800, + -1254513600, + -1241290800, + -1222977600, + -1209754800, + -1191355200, + -1178132400, + -870552000, + -865278000, + -736632000, + -718056000, + -713649600, + -36619200, + -23922000, + -3355200, + 7527600, + 24465600, + 37767600, + 55915200, + 69217200, + 87969600, + 100666800, + 118209600, + 132116400, + 150868800, + 163566000, + 182318400, + 195620400, + 213768000, + 227070000, + 245217600, + 258519600, + 277272000, + 289969200, + 308721600, + 321418800, + 340171200, + 353473200, + 371620800, + 384922800, + 403070400, + 416372400, + 434520000, + 447822000, + 466574400, + 479271600, + 498024000, + 510721200, + 529473600, + 545194800, + 560923200, + 574225200, + 592372800, + 605674800, + 624427200, + 637124400, + 653457600, + 668574000, + 687326400, + 700628400, + 718776000, + 732078000, + 750225600, + 763527600, + 781675200, + 794977200, + 813729600, + 826426800, + 845179200, + 859690800, + 876628800, + 889930800, + 906868800, + 923194800, + 939528000, + 952830000, + 971582400, + 984279600, + 1003032000, + 1015729200, + 1034481600, + 1047178800, + 1065931200, + 1079233200, + 1097380800, + 1110682800, + 1128830400, + 1142132400, + 1160884800, + 1173582000, + 1192334400, + 1206846000, + 1223784000, + 1237086000, + 1255233600, + 1270350000, + 1286683200, + 1304823600, + 1313899200, + 1335668400, + 1346558400, + 1367118000, + 1378612800, + 1398567600, + 1410062400, + 1463281200, + 1471147200, + 1480820400 + ], + "types": [ + { + "offset": -17020 + }, + { + "offset": -16965 + }, + { + "offset": -18000 + }, + { + "offset": -14400 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + }, + { + "offset": -10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7ec2120f35e8ce46-9f313b48e73a78c4.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7ec2120f35e8ce46-9f313b48e73a78c4.json new file mode 100644 index 00000000000000..4e237e8d4114eb --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-7ec2120f35e8ce46-9f313b48e73a78c4.json @@ -0,0 +1,55 @@ +{ + "ids": [ + "america/anguilla", + "america/antigua", + "america/aruba", + "america/blanc-sablon", + "america/curacao", + "america/dominica", + "america/grenada", + "america/guadeloupe", + "america/kralendijk", + "america/lower_princes", + "america/marigot", + "america/montserrat", + "america/port_of_spain", + "america/puerto_rico", + "america/st_barthelemy", + "america/st_kitts", + "america/st_lucia", + "america/st_thomas", + "america/st_vincent", + "america/tortola", + "america/virgin" + ], + "tzif": { + "posix": { + "abbr": "AST", + "offset": -14400, + "transition": null + }, + "transition_types": [ + 1, + 2, + 2, + 1 + ], + "transitions": [ + -2233035335, + -873057600, + -769395600, + -765399600 + ], + "types": [ + { + "offset": -15865 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-806417e5a9e6e27a-d183a9f9e82d72df.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-806417e5a9e6e27a-d183a9f9e82d72df.json new file mode 100644 index 00000000000000..0686889e5f3aa0 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-806417e5a9e6e27a-d183a9f9e82d72df.json @@ -0,0 +1,284 @@ +{ + "ids": [ + "america/scoresbysund" + ], + "tzif": { + "posix": { + "abbr": "-02", + "offset": -7200, + "transition": { + "abbr": "-01", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 0 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": -3600 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 2, + 4 + ], + "transitions": [ + -1686090728, + 323841600, + 338961600, + 354679200, + 370400400, + 386125200, + 401850000, + 417574800, + 433299600, + 449024400, + 465354000, + 481078800, + 496803600, + 512528400, + 528253200, + 543978000, + 559702800, + 575427600, + 591152400, + 606877200, + 622602000, + 638326800, + 654656400, + 670381200, + 686106000, + 701830800, + 717555600, + 733280400, + 749005200, + 764730000, + 780454800, + 796179600, + 811904400, + 828234000, + 846378000, + 859683600, + 877827600, + 891133200, + 909277200, + 922582800, + 941331600, + 954032400, + 972781200, + 985482000, + 1004230800, + 1017536400, + 1035680400, + 1048986000, + 1067130000, + 1080435600, + 1099184400, + 1111885200, + 1130634000, + 1143334800, + 1162083600, + 1174784400, + 1193533200, + 1206838800, + 1224982800, + 1238288400, + 1256432400, + 1269738000, + 1288486800, + 1301187600, + 1319936400, + 1332637200, + 1351386000, + 1364691600, + 1382835600, + 1396141200, + 1414285200, + 1427590800, + 1445734800, + 1459040400, + 1477789200, + 1490490000, + 1509238800, + 1521939600, + 1540688400, + 1553994000, + 1572138000, + 1585443600, + 1603587600, + 1616893200, + 1635642000, + 1648342800, + 1667091600, + 1679792400, + 1698541200, + 1711846800 + ], + "types": [ + { + "offset": -5272 + }, + { + "offset": -7200 + }, + { + "offset": -3600 + }, + { + "offset": 0 + }, + { + "offset": -3600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-81a0c2bb7c8a41da-7b4ebb9a4aa49253.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-81a0c2bb7c8a41da-7b4ebb9a4aa49253.json new file mode 100644 index 00000000000000..777730cf5e7e0d --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-81a0c2bb7c8a41da-7b4ebb9a4aa49253.json @@ -0,0 +1,109 @@ +{ + "ids": [ + "africa/tripoli", + "libya" + ], + "tzif": { + "posix": { + "abbr": "EET", + "offset": 7200, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 2, + 3, + 1, + 2, + 3, + 2, + 3 + ], + "transitions": [ + -1577926364, + -574902000, + -568087200, + -512175600, + -504928800, + -449888400, + -441856800, + -347158800, + 378684000, + 386463600, + 402271200, + 417999600, + 433807200, + 449622000, + 465429600, + 481590000, + 496965600, + 512953200, + 528674400, + 544230000, + 560037600, + 575852400, + 591660000, + 607388400, + 623196000, + 641775600, + 844034400, + 860108400, + 875916000, + 1352505600, + 1364515200, + 1382659200 + ], + "types": [ + { + "offset": 3164 + }, + { + "offset": 3600 + }, + { + "offset": 7200 + }, + { + "offset": 7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-83ab6f3e7a54b242-140e172ea09b920.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-83ab6f3e7a54b242-140e172ea09b920.json new file mode 100644 index 00000000000000..590c3ee9a6d4ec --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-83ab6f3e7a54b242-140e172ea09b920.json @@ -0,0 +1,164 @@ +{ + "ids": [ + "america/argentina/cordoba", + "america/cordoba", + "america/rosario" + ], + "tzif": { + "posix": { + "abbr": "-03", + "offset": -10800, + "transition": null + }, + "transition_types": [ + 0, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 1, + 4, + 2, + 3, + 4, + 2, + 3, + 2, + 3, + 2, + 3, + 4, + 2, + 3, + 4 + ], + "transitions": [ + -2372096592, + -1567453392, + -1233432000, + -1222981200, + -1205956800, + -1194037200, + -1172865600, + -1162501200, + -1141329600, + -1130965200, + -1109793600, + -1099429200, + -1078257600, + -1067806800, + -1046635200, + -1036270800, + -1015099200, + -1004734800, + -983563200, + -973198800, + -952027200, + -941576400, + -931032000, + -900882000, + -890337600, + -833749200, + -827265600, + -752274000, + -733780800, + -197326800, + -190843200, + -184194000, + -164491200, + -152658000, + -132955200, + -121122000, + -101419200, + -86821200, + -71092800, + -54766800, + -39038400, + -23317200, + -7588800, + 128142000, + 136605600, + 596948400, + 605066400, + 624423600, + 636516000, + 656478000, + 667965600, + 687931200, + 699415200, + 719377200, + 731469600, + 938919600, + 952052400, + 1198983600, + 1205632800, + 1224385200 + ], + "types": [ + { + "offset": -15408 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + }, + { + "offset": -10800 + }, + { + "offset": -7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-843bd4f4a13e936f-e20d11612a15d3e6.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-843bd4f4a13e936f-e20d11612a15d3e6.json new file mode 100644 index 00000000000000..82f98cd6a1c762 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-843bd4f4a13e936f-e20d11612a15d3e6.json @@ -0,0 +1,191 @@ +{ + "ids": [ + "asia/srednekolymsk" + ], + "tzif": { + "posix": { + "abbr": "+11", + "offset": 39600, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 4, + 2, + 4, + 1, + 3, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 5, + 2, + 4 + ], + "transitions": [ + -1441188892, + -1247565600, + 354891600, + 370699200, + 386427600, + 402235200, + 417963600, + 433771200, + 449586000, + 465318000, + 481042800, + 496767600, + 512492400, + 528217200, + 543942000, + 559666800, + 575391600, + 591116400, + 606841200, + 622566000, + 638290800, + 654620400, + 670345200, + 670348800, + 686073600, + 695750400, + 701794800, + 717519600, + 733244400, + 748969200, + 764694000, + 780418800, + 796143600, + 811868400, + 828198000, + 846342000, + 859647600, + 877791600, + 891097200, + 909241200, + 922546800, + 941295600, + 953996400, + 972745200, + 985446000, + 1004194800, + 1017500400, + 1035644400, + 1048950000, + 1067094000, + 1080399600, + 1099148400, + 1111849200, + 1130598000, + 1143298800, + 1162047600, + 1174748400, + 1193497200, + 1206802800, + 1224946800, + 1238252400, + 1256396400, + 1269702000, + 1288450800, + 1301151600, + 1414245600 + ], + "types": [ + { + "offset": 36892 + }, + { + "offset": 36000 + }, + { + "offset": 39600 + }, + { + "offset": 43200 + }, + { + "offset": 39600 + }, + { + "offset": 43200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-84569b5d12891e1e-dfbd7173ea59c56d.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-84569b5d12891e1e-dfbd7173ea59c56d.json new file mode 100644 index 00000000000000..d4039851b9b0f9 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-84569b5d12891e1e-dfbd7173ea59c56d.json @@ -0,0 +1,31 @@ +{ + "ids": [ + "africa/bissau" + ], + "tzif": { + "posix": { + "abbr": "GMT", + "offset": 0, + "transition": null + }, + "transition_types": [ + 1, + 2 + ], + "transitions": [ + -1830380400, + 157770000 + ], + "types": [ + { + "offset": -3740 + }, + { + "offset": -3600 + }, + { + "offset": 0 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8494d6017f05e49d-6fa1752d1f7aa8c3.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8494d6017f05e49d-6fa1752d1f7aa8c3.json new file mode 100644 index 00000000000000..8d634798272261 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8494d6017f05e49d-6fa1752d1f7aa8c3.json @@ -0,0 +1,161 @@ +{ + "ids": [ + "america/indiana/winamac" + ], + "tzif": { + "posix": { + "abbr": "EST", + "offset": -18000, + "transition": { + "abbr": "EDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 1, + 2, + 3, + 1, + 4, + 2, + 3 + ], + "transitions": [ + -2717647200, + -1633276800, + -1615136400, + -1601827200, + -1583686800, + -880214400, + -769395600, + -765392400, + -747244800, + -733942800, + -715795200, + -702493200, + -684345600, + -671043600, + -652896000, + -639594000, + -620841600, + -608144400, + -589392000, + -576090000, + -557942400, + -544640400, + -526492800, + -513190800, + -495043200, + -481741200, + -463593600, + -447267600, + -431539200, + -415818000, + -400089600, + -386787600, + -368640000, + -355338000, + -337190400, + -323888400, + -305740800, + -292438800, + -273686400, + -21488400, + -5767200, + 9961200, + 25682400, + 1143961200, + 1143964800, + 1162105200, + 1173600000, + 1194156000 + ], + "types": [ + { + "offset": -20785 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + }, + { + "offset": -18000 + }, + { + "offset": -14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-849b49f0ce1dac82-89b53710eb7d9371.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-849b49f0ce1dac82-89b53710eb7d9371.json new file mode 100644 index 00000000000000..f78d08044adf7b --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-849b49f0ce1dac82-89b53710eb7d9371.json @@ -0,0 +1,196 @@ +{ + "ids": [ + "asia/yekaterinburg" + ], + "tzif": { + "posix": { + "abbr": "+05", + "offset": 18000, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 3, + 5, + 3, + 5, + 2, + 4, + 4, + 3, + 5, + 4, + 3, + 5, + 4, + 3, + 5, + 4, + 3, + 5, + 4, + 3, + 5, + 4, + 3, + 5, + 4, + 3, + 5, + 4, + 3, + 5, + 4, + 3, + 5, + 4, + 3, + 5, + 4, + 3, + 5, + 4, + 3, + 5, + 4, + 3, + 5, + 4, + 3, + 5, + 4, + 3, + 5, + 4, + 3, + 5, + 4, + 3, + 5, + 4, + 3, + 5, + 4, + 3, + 5, + 4, + 6, + 3, + 5 + ], + "transitions": [ + -1688270553, + -1592610305, + -1247544000, + 354913200, + 370720800, + 386449200, + 402256800, + 417985200, + 433792800, + 449607600, + 465339600, + 481064400, + 496789200, + 512514000, + 528238800, + 543963600, + 559688400, + 575413200, + 591138000, + 606862800, + 622587600, + 638312400, + 654642000, + 670366800, + 670370400, + 686095200, + 695772000, + 701816400, + 717541200, + 733266000, + 748990800, + 764715600, + 780440400, + 796165200, + 811890000, + 828219600, + 846363600, + 859669200, + 877813200, + 891118800, + 909262800, + 922568400, + 941317200, + 954018000, + 972766800, + 985467600, + 1004216400, + 1017522000, + 1035666000, + 1048971600, + 1067115600, + 1080421200, + 1099170000, + 1111870800, + 1130619600, + 1143320400, + 1162069200, + 1174770000, + 1193518800, + 1206824400, + 1224968400, + 1238274000, + 1256418000, + 1269723600, + 1288472400, + 1301173200, + 1414267200 + ], + "types": [ + { + "offset": 14553 + }, + { + "offset": 13505 + }, + { + "offset": 14400 + }, + { + "offset": 18000 + }, + { + "offset": 21600 + }, + { + "offset": 18000 + }, + { + "offset": 21600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-86245dd795582456-61d8c9f7c4ad177a.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-86245dd795582456-61d8c9f7c4ad177a.json new file mode 100644 index 00000000000000..65a3121ee65c06 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-86245dd795582456-61d8c9f7c4ad177a.json @@ -0,0 +1,191 @@ +{ + "ids": [ + "asia/omsk" + ], + "tzif": { + "posix": { + "abbr": "+06", + "offset": 21600, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 4, + 2, + 4, + 1, + 3, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 5, + 2, + 4 + ], + "transitions": [ + -1582088010, + -1247547600, + 354909600, + 370717200, + 386445600, + 402253200, + 417981600, + 433789200, + 449604000, + 465336000, + 481060800, + 496785600, + 512510400, + 528235200, + 543960000, + 559684800, + 575409600, + 591134400, + 606859200, + 622584000, + 638308800, + 654638400, + 670363200, + 670366800, + 686091600, + 695768400, + 701812800, + 717537600, + 733262400, + 748987200, + 764712000, + 780436800, + 796161600, + 811886400, + 828216000, + 846360000, + 859665600, + 877809600, + 891115200, + 909259200, + 922564800, + 941313600, + 954014400, + 972763200, + 985464000, + 1004212800, + 1017518400, + 1035662400, + 1048968000, + 1067112000, + 1080417600, + 1099166400, + 1111867200, + 1130616000, + 1143316800, + 1162065600, + 1174766400, + 1193515200, + 1206820800, + 1224964800, + 1238270400, + 1256414400, + 1269720000, + 1288468800, + 1301169600, + 1414263600 + ], + "types": [ + { + "offset": 17610 + }, + { + "offset": 18000 + }, + { + "offset": 21600 + }, + { + "offset": 25200 + }, + { + "offset": 21600 + }, + { + "offset": 25200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-87649f3d059a10f2-a8c51b0e84c40a85.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-87649f3d059a10f2-a8c51b0e84c40a85.json new file mode 100644 index 00000000000000..127ea90d9ed46c --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-87649f3d059a10f2-a8c51b0e84c40a85.json @@ -0,0 +1,265 @@ +{ + "ids": [ + "america/whitehorse", + "canada/yukon" + ], + "tzif": { + "posix": { + "abbr": "MST", + "offset": -25200, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 1, + 3, + 1, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 3, + 5 + ], + "transitions": [ + -2188997988, + -1632056400, + -1615125600, + -1596978000, + -1583164800, + -880203600, + -769395600, + -765381600, + -147884400, + -131554800, + -121273200, + 325677600, + 341398800, + 357127200, + 372848400, + 388576800, + 404902800, + 420026400, + 436352400, + 452080800, + 467802000, + 483530400, + 499251600, + 514980000, + 530701200, + 544615200, + 562150800, + 576064800, + 594205200, + 607514400, + 625654800, + 638964000, + 657104400, + 671018400, + 688554000, + 702468000, + 720003600, + 733917600, + 752058000, + 765367200, + 783507600, + 796816800, + 814957200, + 828871200, + 846406800, + 860320800, + 877856400, + 891770400, + 909306000, + 923220000, + 941360400, + 954669600, + 972810000, + 986119200, + 1004259600, + 1018173600, + 1035709200, + 1049623200, + 1067158800, + 1081072800, + 1099213200, + 1112522400, + 1130662800, + 1143972000, + 1162112400, + 1173607200, + 1194166800, + 1205056800, + 1225616400, + 1236506400, + 1257066000, + 1268560800, + 1289120400, + 1300010400, + 1320570000, + 1331460000, + 1352019600, + 1362909600, + 1383469200, + 1394359200, + 1414918800, + 1425808800, + 1446368400, + 1457863200, + 1478422800, + 1489312800, + 1509872400, + 1520762400, + 1541322000, + 1552212000, + 1572771600, + 1583661600, + 1604214000 + ], + "types": [ + { + "offset": -32412 + }, + { + "offset": -32400 + }, + { + "offset": -28800 + }, + { + "offset": -25200 + }, + { + "offset": -28800 + }, + { + "offset": -25200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-87ef4dab5f3e3941-c43fb003c147a77.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-87ef4dab5f3e3941-c43fb003c147a77.json new file mode 100644 index 00000000000000..2d47ed00cfc64e --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-87ef4dab5f3e3941-c43fb003c147a77.json @@ -0,0 +1,212 @@ +{ + "ids": [ + "america/resolute" + ], + "tzif": { + "posix": { + "abbr": "CST", + "offset": -21600, + "transition": { + "abbr": "CDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 3, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 1 + ], + "transitions": [ + -704937600, + 73468800, + 89190000, + 104918400, + 120639600, + 136368000, + 152089200, + 167817600, + 183538800, + 199267200, + 215593200, + 230716800, + 247042800, + 262771200, + 278492400, + 294220800, + 309942000, + 325670400, + 341391600, + 357120000, + 372841200, + 388569600, + 404895600, + 420019200, + 436345200, + 452073600, + 467794800, + 483523200, + 499244400, + 514972800, + 530694000, + 544608000, + 562143600, + 576057600, + 594198000, + 607507200, + 625647600, + 638956800, + 657097200, + 671011200, + 688546800, + 702460800, + 719996400, + 733910400, + 752050800, + 765360000, + 783500400, + 796809600, + 814950000, + 828864000, + 846399600, + 860313600, + 877849200, + 891763200, + 909298800, + 923212800, + 941353200, + 954662400, + 972802800, + 986112000, + 1004252400, + 1018166400, + 1035702000, + 1049616000, + 1067151600, + 1081065600, + 1099206000, + 1112515200, + 1130655600, + 1143964800, + 1162105200, + 1173600000, + 1194159600 + ], + "types": [ + { + "offset": 0 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + }, + { + "offset": -18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-89cd9f4224d1324a-6ddbd3de8874993f.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-89cd9f4224d1324a-6ddbd3de8874993f.json new file mode 100644 index 00000000000000..46f441957cfd4e --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-89cd9f4224d1324a-6ddbd3de8874993f.json @@ -0,0 +1,36 @@ +{ + "ids": [ + "asia/makassar", + "asia/ujung_pandang" + ], + "tzif": { + "posix": { + "abbr": "WITA", + "offset": 28800, + "transition": null + }, + "transition_types": [ + 0, + 1, + 2, + 1 + ], + "transitions": [ + -1577951856, + -1172908656, + -880272000, + -766054800 + ], + "types": [ + { + "offset": 28656 + }, + { + "offset": 28800 + }, + { + "offset": 32400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8a0ec5e44a49e44e-1f9e21f2398d2965.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8a0ec5e44a49e44e-1f9e21f2398d2965.json new file mode 100644 index 00000000000000..c12886d95c4fc7 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8a0ec5e44a49e44e-1f9e21f2398d2965.json @@ -0,0 +1,200 @@ +{ + "ids": [ + "nz-chat", + "pacific/chatham" + ], + "tzif": { + "posix": { + "abbr": "+1245", + "offset": 45900, + "transition": { + "abbr": "+1345", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 4, + 1, + 0 + ] + }, + "time": 9900 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 9, + 5, + 0 + ] + }, + "time": 13500 + } + } + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3 + ], + "transitions": [ + -3192437628, + -757426500, + 152632800, + 162309600, + 183477600, + 194968800, + 215532000, + 226418400, + 246981600, + 257868000, + 278431200, + 289317600, + 309880800, + 320767200, + 341330400, + 352216800, + 372780000, + 384271200, + 404834400, + 415720800, + 436284000, + 447170400, + 467733600, + 478620000, + 499183200, + 510069600, + 530632800, + 541519200, + 562082400, + 573573600, + 594136800, + 605023200, + 623772000, + 637682400, + 655221600, + 669132000, + 686671200, + 700581600, + 718120800, + 732636000, + 749570400, + 764085600, + 781020000, + 795535200, + 812469600, + 826984800, + 844524000, + 858434400, + 875973600, + 889884000, + 907423200, + 921938400, + 938872800, + 953388000, + 970322400, + 984837600, + 1002376800, + 1016287200, + 1033826400, + 1047736800, + 1065276000, + 1079791200, + 1096725600, + 1111240800, + 1128175200, + 1142690400, + 1159624800, + 1174140000, + 1191074400, + 1207404000, + 1222524000 + ], + "types": [ + { + "offset": 44028 + }, + { + "offset": 44100 + }, + { + "offset": 45900 + }, + { + "offset": 49500 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8b129baceef3898a-389e46393fa915f2.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8b129baceef3898a-389e46393fa915f2.json new file mode 100644 index 00000000000000..73e1c200375a69 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8b129baceef3898a-389e46393fa915f2.json @@ -0,0 +1,90 @@ +{ + "ids": [ + "america/manaus", + "brazil/west" + ], + "tzif": { + "posix": { + "abbr": "-04", + "offset": -14400, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -1767211196, + -1206954000, + -1191358800, + -1175371200, + -1159822800, + -633816000, + -622065600, + -602280000, + -591829200, + -570744000, + -560206800, + -539121600, + -531349200, + -191361600, + -184194000, + -155160000, + -150066000, + -128894400, + -121122000, + -99950400, + -89586000, + -68414400, + -57963600, + 499752000, + 511239600, + 530596800, + 540270000, + 562132800, + 571201200, + 750830400, + 761713200 + ], + "types": [ + { + "offset": -14404 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8b312fc28eb6d503-b57cea257edd1731.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8b312fc28eb6d503-b57cea257edd1731.json new file mode 100644 index 00000000000000..a9ce4bc9bcf3dd --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8b312fc28eb6d503-b57cea257edd1731.json @@ -0,0 +1,50 @@ +{ + "ids": [ + "pacific/tongatapu" + ], + "tzif": { + "posix": { + "abbr": "+13", + "offset": 46800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2 + ], + "transitions": [ + -767189952, + -284041200, + 939214800, + 953384400, + 973342800, + 980596800, + 1004792400, + 1012046400, + 1478350800, + 1484398800 + ], + "types": [ + { + "offset": 44352 + }, + { + "offset": 44400 + }, + { + "offset": 46800 + }, + { + "offset": 50400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8b944106b8f9db7e-1d2f4ecd91296f4.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8b944106b8f9db7e-1d2f4ecd91296f4.json new file mode 100644 index 00000000000000..f998ecc93d01fc --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8b944106b8f9db7e-1d2f4ecd91296f4.json @@ -0,0 +1,199 @@ +{ + "ids": [ + "asia/ust-nera" + ], + "tzif": { + "posix": { + "abbr": "+10", + "offset": 36000, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 4, + 5, + 4, + 5, + 6, + 3, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 7, + 4, + 5, + 6 + ], + "transitions": [ + -1579426374, + -1247558400, + 354898800, + 370699200, + 386427600, + 402235200, + 417963600, + 433771200, + 449586000, + 465318000, + 481042800, + 496767600, + 512492400, + 528217200, + 543942000, + 559666800, + 575391600, + 591116400, + 606841200, + 622566000, + 638290800, + 654620400, + 670345200, + 670348800, + 686073600, + 695750400, + 701794800, + 717519600, + 733244400, + 748969200, + 764694000, + 780418800, + 796143600, + 811868400, + 828198000, + 846342000, + 859647600, + 877791600, + 891097200, + 909241200, + 922546800, + 941295600, + 953996400, + 972745200, + 985446000, + 1004194800, + 1017500400, + 1035644400, + 1048950000, + 1067094000, + 1080399600, + 1099148400, + 1111849200, + 1130598000, + 1143298800, + 1162047600, + 1174748400, + 1193497200, + 1206802800, + 1224946800, + 1238252400, + 1256396400, + 1269702000, + 1288450800, + 1301151600, + 1315828800, + 1414249200 + ], + "types": [ + { + "offset": 34374 + }, + { + "offset": 28800 + }, + { + "offset": 32400 + }, + { + "offset": 43200 + }, + { + "offset": 39600 + }, + { + "offset": 39600 + }, + { + "offset": 36000 + }, + { + "offset": 43200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8bf0f826f4c6e05e-9c27d3058e34d93b.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8bf0f826f4c6e05e-9c27d3058e34d93b.json new file mode 100644 index 00000000000000..6b6d2ef41bf993 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8bf0f826f4c6e05e-9c27d3058e34d93b.json @@ -0,0 +1,51 @@ +{ + "ids": [ + "asia/dacca", + "asia/dhaka" + ], + "tzif": { + "posix": { + "abbr": "+06", + "offset": 21600, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 4, + 5, + 4 + ], + "transitions": [ + -2524543300, + -891582800, + -872058600, + -862637400, + -576138600, + 1245430800, + 1262278800 + ], + "types": [ + { + "offset": 21700 + }, + { + "offset": 21200 + }, + { + "offset": 23400 + }, + { + "offset": 19800 + }, + { + "offset": 21600 + }, + { + "offset": 25200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8c010856ba3febe1-a27521eb7d78dbf6.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8c010856ba3febe1-a27521eb7d78dbf6.json new file mode 100644 index 00000000000000..a64aa68e838fe8 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8c010856ba3febe1-a27521eb7d78dbf6.json @@ -0,0 +1,19 @@ +{ + "ids": [ + "factory" + ], + "tzif": { + "posix": { + "abbr": "-00", + "offset": 0, + "transition": null + }, + "transition_types": [], + "transitions": [], + "types": [ + { + "offset": 0 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8e1e620dda961a84-8cb519c7f5594e81.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8e1e620dda961a84-8cb519c7f5594e81.json new file mode 100644 index 00000000000000..9b7167da26dbc5 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8e1e620dda961a84-8cb519c7f5594e81.json @@ -0,0 +1,196 @@ +{ + "ids": [ + "europe/vilnius" + ], + "tzif": { + "posix": { + "abbr": "EET", + "offset": 7200, + "transition": { + "abbr": "EEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 14400 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 10800 + } + } + }, + "transition_types": [ + 1, + 2, + 3, + 4, + 3, + 5, + 4, + 6, + 3, + 4, + 6, + 3, + 4, + 6, + 5, + 7, + 5, + 7, + 5, + 7, + 5, + 7, + 5, + 7, + 5, + 7, + 5, + 7, + 5, + 7, + 5, + 5, + 8, + 4, + 6, + 5, + 8, + 4, + 6, + 5, + 8, + 4, + 6, + 5, + 8, + 4, + 6, + 5, + 8, + 4, + 6, + 5, + 8, + 4, + 6, + 5, + 8, + 4, + 6, + 5, + 8, + 4, + 6, + 5, + 8, + 4, + 6, + 4, + 6, + 3, + 4, + 6, + 4, + 6 + ], + "transitions": [ + -2840146876, + -1672536240, + -1585100136, + -1561251600, + -1553565600, + -928198800, + -900126000, + -857257200, + -844556400, + -828226800, + -812502000, + -802144800, + 354920400, + 370728000, + 386456400, + 402264000, + 417992400, + 433800000, + 449614800, + 465346800, + 481071600, + 496796400, + 512521200, + 528246000, + 543970800, + 559695600, + 575420400, + 591145200, + 606870000, + 622598400, + 638323200, + 654652800, + 670377600, + 686102400, + 701827200, + 717552000, + 733276800, + 749001600, + 764726400, + 780451200, + 796176000, + 811900800, + 828230400, + 846374400, + 859680000, + 877824000, + 891133200, + 909277200, + 922582800, + 941331600 + ], + "types": [ + { + "offset": 6076 + }, + { + "offset": 5040 + }, + { + "offset": 5736 + }, + { + "offset": 3600 + }, + { + "offset": 7200 + }, + { + "offset": 10800 + }, + { + "offset": 7200 + }, + { + "offset": 14400 + }, + { + "offset": 10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8e605032c3ce6342-6a27beeec5d94fef.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8e605032c3ce6342-6a27beeec5d94fef.json new file mode 100644 index 00000000000000..6e0eec8bc5b79e --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8e605032c3ce6342-6a27beeec5d94fef.json @@ -0,0 +1,91 @@ +{ + "ids": [ + "america/santarem" + ], + "tzif": { + "posix": { + "abbr": "-03", + "offset": -10800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 3 + ], + "transitions": [ + -1767212472, + -1206954000, + -1191358800, + -1175371200, + -1159822800, + -633816000, + -622065600, + -602280000, + -591829200, + -570744000, + -560206800, + -539121600, + -531349200, + -191361600, + -184194000, + -155160000, + -150066000, + -128894400, + -121122000, + -99950400, + -89586000, + -68414400, + -57963600, + 499752000, + 511239600, + 530596800, + 540270000, + 562132800, + 571201200, + 1214280000 + ], + "types": [ + { + "offset": -13128 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + }, + { + "offset": -10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8fec2819cc677405-6cfb65330c2f1fa0.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8fec2819cc677405-6cfb65330c2f1fa0.json new file mode 100644 index 00000000000000..a9d30047317be7 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-8fec2819cc677405-6cfb65330c2f1fa0.json @@ -0,0 +1,264 @@ +{ + "ids": [ + "america/juneau" + ], + "tzif": { + "posix": { + "abbr": "AKST", + "offset": -32400, + "transition": { + "abbr": "AKDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 3, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 4, + 2, + 5, + 2, + 5, + 3, + 2, + 5, + 3, + 2, + 5, + 3, + 2, + 5, + 4, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4 + ], + "transitions": [ + -3225223727, + -2188954939, + -880207200, + -769395600, + -765385200, + -21477600, + -5756400, + 9972000, + 25693200, + 41421600, + 57747600, + 73476000, + 89197200, + 104925600, + 120646800, + 126698400, + 152096400, + 162381600, + 183546000, + 199274400, + 215600400, + 230724000, + 247050000, + 262778400, + 278499600, + 294228000, + 309949200, + 325677600, + 325681200, + 341402400, + 357127200, + 372848400, + 388576800, + 404902800, + 420026400, + 436352400, + 436356000, + 439030800, + 452084400, + 467805600, + 483534000, + 499255200, + 514983600, + 530704800, + 544618800, + 562154400, + 576068400, + 594208800, + 607518000, + 625658400, + 638967600, + 657108000, + 671022000, + 688557600, + 702471600, + 720007200, + 733921200, + 752061600, + 765370800, + 783511200, + 796820400, + 814960800, + 828874800, + 846410400, + 860324400, + 877860000, + 891774000, + 909309600, + 923223600, + 941364000, + 954673200, + 972813600, + 986122800, + 1004263200, + 1018177200, + 1035712800, + 1049626800, + 1067162400, + 1081076400, + 1099216800, + 1112526000, + 1130666400, + 1143975600, + 1162116000, + 1173610800, + 1194170400 + ], + "types": [ + { + "offset": 54139 + }, + { + "offset": -32261 + }, + { + "offset": -28800 + }, + { + "offset": -25200 + }, + { + "offset": -32400 + }, + { + "offset": -28800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-905f75931d73bd53-38c9d0ddc82eec2a.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-905f75931d73bd53-38c9d0ddc82eec2a.json new file mode 100644 index 00000000000000..0275b01d5619e9 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-905f75931d73bd53-38c9d0ddc82eec2a.json @@ -0,0 +1,39 @@ +{ + "ids": [ + "pacific/galapagos" + ], + "tzif": { + "posix": { + "abbr": "-06", + "offset": -21600, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 3, + 2 + ], + "transitions": [ + -1230746496, + 504939600, + 722930400, + 728888400 + ], + "types": [ + { + "offset": -21504 + }, + { + "offset": -18000 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-90e0499f7b80422b-16e03eeaaf192844.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-90e0499f7b80422b-16e03eeaaf192844.json new file mode 100644 index 00000000000000..bae3bd72a112d6 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-90e0499f7b80422b-16e03eeaaf192844.json @@ -0,0 +1,95 @@ +{ + "ids": [ + "america/porto_acre", + "america/rio_branco", + "brazil/acre" + ], + "tzif": { + "posix": { + "abbr": "-05", + "offset": -18000, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 3, + 1 + ], + "transitions": [ + -1767209328, + -1206950400, + -1191355200, + -1175367600, + -1159819200, + -633812400, + -622062000, + -602276400, + -591825600, + -570740400, + -560203200, + -539118000, + -531345600, + -191358000, + -184190400, + -155156400, + -150062400, + -128890800, + -121118400, + -99946800, + -89582400, + -68410800, + -57960000, + 499755600, + 511243200, + 530600400, + 540273600, + 562136400, + 571204800, + 1214283600, + 1384056000 + ], + "types": [ + { + "offset": -16272 + }, + { + "offset": -18000 + }, + { + "offset": -14400 + }, + { + "offset": -14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-916c7f697e6af49e-cd5f0c23c53bde30.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-916c7f697e6af49e-cd5f0c23c53bde30.json new file mode 100644 index 00000000000000..6fe4d27249274f --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-916c7f697e6af49e-cd5f0c23c53bde30.json @@ -0,0 +1,433 @@ +{ + "ids": [ + "america/st_johns", + "canada/newfoundland" + ], + "tzif": { + "posix": { + "abbr": "NST", + "offset": -12600, + "transition": { + "abbr": "NDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 4, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3 + ], + "transitions": [ + -2713897748, + -1664130548, + -1650137348, + -1632076148, + -1615145348, + -1598650148, + -1590100148, + -1567286948, + -1551565748, + -1535837348, + -1520116148, + -1503782948, + -1488666548, + -1472333348, + -1457216948, + -1440883748, + -1425767348, + -1409434148, + -1394317748, + -1377984548, + -1362263348, + -1346534948, + -1330813748, + -1314480548, + -1299364148, + -1283030948, + -1267914548, + -1251581348, + -1236464948, + -1220131748, + -1205015348, + -1188682148, + -1172960948, + -1156627748, + -1141511348, + -1125178148, + -1110061748, + -1096921748, + -1093728600, + -1078612200, + -1061670600, + -1048973400, + -1030221000, + -1017523800, + -998771400, + -986074200, + -966717000, + -954624600, + -935267400, + -922570200, + -903817800, + -891120600, + -872368200, + -769395600, + -765401400, + -746044200, + -733347000, + -714594600, + -701897400, + -683145000, + -670447800, + -651695400, + -638998200, + -619641000, + -606943800, + -589401000, + -576099000, + -557951400, + -544649400, + -526501800, + -513199800, + -495052200, + -481750200, + -463602600, + -450300600, + -431548200, + -418246200, + -400098600, + -386796600, + -368649000, + -355347000, + -337199400, + -323897400, + -305749800, + -289423800, + -273695400, + -257974200, + -242245800, + -226524600, + -210796200, + -195075000, + -179346600, + -163625400, + -147897000, + -131571000, + -116447400, + -100121400, + -84393000, + -68671800, + -52943400, + -37222200, + -21493800, + -5772600, + 9955800, + 25677000, + 41405400, + 57731400, + 73459800, + 89181000, + 104909400, + 120630600, + 136359000, + 152080200, + 167808600, + 183529800, + 199258200, + 215584200, + 230707800, + 247033800, + 262762200, + 278483400, + 294211800, + 309933000, + 325661400, + 341382600, + 357111000, + 372832200, + 388560600, + 404886600, + 420010200, + 436336200, + 452064600, + 467785800, + 483514200, + 499235400, + 514963800, + 530685000, + 544591860, + 562127460, + 576041460, + 594178260, + 607491060, + 625631460, + 638940660, + 657081060, + 670995060, + 688530660, + 702444660, + 719980260, + 733894260, + 752034660, + 765343860, + 783484260, + 796793460, + 814933860, + 828847860, + 846383460, + 860297460, + 877833060, + 891747060, + 909282660, + 923196660, + 941337060, + 954646260, + 972786660, + 986095860, + 1004236260, + 1018150260, + 1035685860, + 1049599860, + 1067135460, + 1081049460, + 1099189860, + 1112499060, + 1130639460, + 1143948660, + 1162089060, + 1173583860, + 1194143460, + 1205033460, + 1225593060, + 1236483060, + 1257042660, + 1268537460, + 1289097060, + 1299987060 + ], + "types": [ + { + "offset": -12652 + }, + { + "offset": -9052 + }, + { + "offset": -12600 + }, + { + "offset": -9000 + }, + { + "offset": -5400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-93ba37d78a84866e-364c3b71717bb302.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-93ba37d78a84866e-364c3b71717bb302.json new file mode 100644 index 00000000000000..1838edfb9947c3 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-93ba37d78a84866e-364c3b71717bb302.json @@ -0,0 +1,85 @@ +{ + "ids": [ + "america/belem" + ], + "tzif": { + "posix": { + "abbr": "-03", + "offset": -10800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -1767213964, + -1206957600, + -1191362400, + -1175374800, + -1159826400, + -633819600, + -622069200, + -602283600, + -591832800, + -570747600, + -560210400, + -539125200, + -531352800, + -191365200, + -184197600, + -155163600, + -150069600, + -128898000, + -121125600, + -99954000, + -89589600, + -68418000, + -57967200, + 499748400, + 511236000, + 530593200, + 540266400, + 562129200, + 571197600 + ], + "types": [ + { + "offset": -11636 + }, + { + "offset": -10800 + }, + { + "offset": -7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-94731e7a96e16727-b9bdd49f2158b98c.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-94731e7a96e16727-b9bdd49f2158b98c.json new file mode 100644 index 00000000000000..42498a53f7cb8b --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-94731e7a96e16727-b9bdd49f2158b98c.json @@ -0,0 +1,69 @@ +{ + "ids": [ + "asia/chongqing", + "asia/chungking", + "asia/harbin", + "asia/shanghai", + "prc" + ], + "tzif": { + "posix": { + "abbr": "CST", + "offset": 28800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -2177481943, + -1600675200, + -1585904400, + -933667200, + -922093200, + -908870400, + -888829200, + -881049600, + -767869200, + -745833600, + -733827600, + -716889600, + -699613200, + -683884800, + -670669200, + -652348800, + -650019600, + 515527200, + 527014800 + ], + "types": [ + { + "offset": 29143 + }, + { + "offset": 28800 + }, + { + "offset": 32400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-95eb641ddc74061f-5a914528a766049d.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-95eb641ddc74061f-5a914528a766049d.json new file mode 100644 index 00000000000000..cce4aec02b37d9 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-95eb641ddc74061f-5a914528a766049d.json @@ -0,0 +1,103 @@ +{ + "ids": [ + "america/mexico_city", + "mexico/general" + ], + "tzif": { + "posix": { + "abbr": "CST", + "offset": -21600, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 3, + 1, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3 + ], + "transitions": [ + -1514739600, + -1343149200, + -1234807200, + -1220461200, + -1207159200, + -1191344400, + -975261600, + -963169200, + -917114400, + -907354800, + -821901600, + -810068400, + -627501600, + -612990000, + 828864000, + 846399600, + 860313600, + 877849200, + 891763200, + 909298800, + 923212800, + 941353200, + 954662400, + 972802800, + 989136000, + 1001833200, + 1018166400, + 1035702000 + ], + "types": [ + { + "offset": -23796 + }, + { + "offset": -25200 + }, + { + "offset": -21600 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-96a7050f6c4d3e34-7cc5980522f3fef5.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-96a7050f6c4d3e34-7cc5980522f3fef5.json new file mode 100644 index 00000000000000..9e9b3e55b34cf3 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-96a7050f6c4d3e34-7cc5980522f3fef5.json @@ -0,0 +1,379 @@ +{ + "ids": [ + "eire", + "europe/dublin" + ], + "tzif": { + "posix": { + "abbr": "GMT", + "offset": 0, + "transition": { + "abbr": "IST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 3600 + } + } + }, + "transition_types": [ + 0, + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2 + ], + "transitions": [ + -2821649679, + -1691962479, + -1680471279, + -1664143200, + -1650146400, + -1633903200, + -1617487200, + -1601848800, + -1586037600, + -1570399200, + -1552168800, + -1538344800, + -1522533600, + -1507500000, + -1490565600, + -1473631200, + -1460930400, + -1442786400, + -1428876000, + -1410732000, + -1396216800, + -1379282400, + -1364767200, + -1348437600, + -1333317600, + -1315778400, + -1301263200, + -1284328800, + -1269813600, + -1253484000, + -1238364000, + -1221429600, + -1206914400, + -1189980000, + -1175464800, + -1159135200, + -1143410400, + -1126476000, + -1111960800, + -1095631200, + -1080511200, + -1063576800, + -1049061600, + -1032127200, + -1017612000, + -1001282400, + -986162400, + -969228000, + -950479200, + -942012000, + -733356000, + -719445600, + -699487200, + -684972000, + -668037600, + -654732000, + -636588000, + -622072800, + -605743200, + -590623200, + -574293600, + -558568800, + -542239200, + -527119200, + -512604000, + -496274400, + -481154400, + -464220000, + -449704800, + -432165600, + -417650400, + -401320800, + -386200800, + -369266400, + -354751200, + -337816800, + -323301600, + -306972000, + -291852000, + -276732000, + -257983200, + -245282400, + -226533600, + -213228000, + -195084000, + -182383200, + -163634400, + -150933600, + -132184800, + -119484000, + -100735200, + -88034400, + -68680800, + -59004000, + -37242000, + 57722400, + 69818400, + 89172000, + 101268000, + 120621600, + 132717600, + 152071200, + 164167200, + 183520800, + 196221600, + 214970400, + 227671200, + 246420000, + 259120800, + 278474400, + 290570400, + 309924000, + 322020000, + 341373600, + 354675600, + 372819600, + 386125200, + 404269200, + 417574800, + 435718800, + 449024400, + 467773200, + 481078800, + 499222800, + 512528400, + 530672400, + 543978000, + 562122000, + 575427600, + 593571600, + 606877200, + 625626000, + 638326800, + 657075600, + 670381200, + 688525200, + 701830800, + 719974800, + 733280400, + 751424400, + 764730000, + 782874000, + 796179600, + 814323600, + 828234000, + 846378000 + ], + "types": [ + { + "offset": -1521 + }, + { + "offset": 2079 + }, + { + "offset": 0 + }, + { + "offset": 3600 + }, + { + "offset": 3600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-98fb8731f72daeb6-4585fdc50640db42.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-98fb8731f72daeb6-4585fdc50640db42.json new file mode 100644 index 00000000000000..5df843b2e10c6f --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-98fb8731f72daeb6-4585fdc50640db42.json @@ -0,0 +1,72 @@ +{ + "ids": [ + "america/jamaica", + "jamaica" + ], + "tzif": { + "posix": { + "abbr": "EST", + "offset": -18000, + "transition": null + }, + "transition_types": [ + 0, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -2524503170, + -1827687170, + 126687600, + 152085600, + 162370800, + 183535200, + 199263600, + 215589600, + 230713200, + 247039200, + 262767600, + 278488800, + 294217200, + 309938400, + 325666800, + 341388000, + 357116400, + 372837600, + 388566000, + 404892000, + 420015600, + 436341600 + ], + "types": [ + { + "offset": -18430 + }, + { + "offset": -18000 + }, + { + "offset": -14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-98fc8236fccd3576-88ddb973d46096e3.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-98fc8236fccd3576-88ddb973d46096e3.json new file mode 100644 index 00000000000000..ac840f8e01103a --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-98fc8236fccd3576-88ddb973d46096e3.json @@ -0,0 +1,192 @@ +{ + "ids": [ + "asia/novosibirsk" + ], + "tzif": { + "posix": { + "abbr": "+07", + "offset": 25200, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 4, + 2, + 4, + 1, + 3, + 3, + 2, + 4, + 3, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4 + ], + "transitions": [ + -1579476700, + -1247551200, + 354906000, + 370713600, + 386442000, + 402249600, + 417978000, + 433785600, + 449600400, + 465332400, + 481057200, + 496782000, + 512506800, + 528231600, + 543956400, + 559681200, + 575406000, + 591130800, + 606855600, + 622580400, + 638305200, + 654634800, + 670359600, + 670363200, + 686088000, + 695764800, + 701809200, + 717534000, + 733258800, + 738086400, + 748987200, + 764712000, + 780436800, + 796161600, + 811886400, + 828216000, + 846360000, + 859665600, + 877809600, + 891115200, + 909259200, + 922564800, + 941313600, + 954014400, + 972763200, + 985464000, + 1004212800, + 1017518400, + 1035662400, + 1048968000, + 1067112000, + 1080417600, + 1099166400, + 1111867200, + 1130616000, + 1143316800, + 1162065600, + 1174766400, + 1193515200, + 1206820800, + 1224964800, + 1238270400, + 1256414400, + 1269720000, + 1288468800, + 1301169600, + 1414263600, + 1469304000 + ], + "types": [ + { + "offset": 19900 + }, + { + "offset": 21600 + }, + { + "offset": 25200 + }, + { + "offset": 28800 + }, + { + "offset": 25200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-996739b4c558f747-935dbc63456811c2.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-996739b4c558f747-935dbc63456811c2.json new file mode 100644 index 00000000000000..f05ac0a8703108 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-996739b4c558f747-935dbc63456811c2.json @@ -0,0 +1,57 @@ +{ + "ids": [ + "asia/colombo" + ], + "tzif": { + "posix": { + "abbr": "+0530", + "offset": 19800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 4, + 2, + 4, + 5, + 3, + 6, + 2 + ], + "transitions": [ + -2840159964, + -2019705572, + -883287000, + -862639200, + -764051400, + 832962600, + 846266400, + 1145039400 + ], + "types": [ + { + "offset": 19164 + }, + { + "offset": 19172 + }, + { + "offset": 19800 + }, + { + "offset": 21600 + }, + { + "offset": 23400 + }, + { + "offset": 23400 + }, + { + "offset": 21600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-99cdd052561a0879-89252b18a95154e3.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-99cdd052561a0879-89252b18a95154e3.json new file mode 100644 index 00000000000000..2fc893d79b09c3 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-99cdd052561a0879-89252b18a95154e3.json @@ -0,0 +1,169 @@ +{ + "ids": [ + "africa/windhoek" + ], + "tzif": { + "posix": { + "abbr": "CAT", + "offset": 7200, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 2, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 4, + 2, + 5, + 2, + 5 + ], + "transitions": [ + -2458170504, + -2109288600, + -860976000, + -845254800, + 637970400, + 764200800, + 778640400, + 796780800, + 810090000, + 828835200, + 841539600, + 860284800, + 873594000, + 891734400, + 905043600, + 923184000, + 936493200, + 954633600, + 967942800, + 986083200, + 999392400, + 1018137600, + 1030842000, + 1049587200, + 1062896400, + 1081036800, + 1094346000, + 1112486400, + 1125795600, + 1143936000, + 1157245200, + 1175385600, + 1188694800, + 1207440000, + 1220749200, + 1238889600, + 1252198800, + 1270339200, + 1283648400, + 1301788800, + 1315098000, + 1333238400, + 1346547600, + 1365292800, + 1377997200, + 1396742400, + 1410051600, + 1428192000, + 1441501200, + 1459641600, + 1472950800, + 1491091200, + 1504400400, + 1508796000 + ], + "types": [ + { + "offset": 4104 + }, + { + "offset": 5400 + }, + { + "offset": 7200 + }, + { + "offset": 10800 + }, + { + "offset": 3600 + }, + { + "offset": 7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-99ce61a08c1199af-56326eb4ceecfd35.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-99ce61a08c1199af-56326eb4ceecfd35.json new file mode 100644 index 00000000000000..5699c5fb1696f5 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-99ce61a08c1199af-56326eb4ceecfd35.json @@ -0,0 +1,124 @@ +{ + "ids": [ + "america/thule" + ], + "tzif": { + "posix": { + "abbr": "AST", + "offset": -14400, + "transition": { + "abbr": "ADT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -1686079492, + 670399200, + 686120400, + 701848800, + 717570000, + 733903200, + 752043600, + 765352800, + 783493200, + 796802400, + 814942800, + 828856800, + 846392400, + 860306400, + 877842000, + 891756000, + 909291600, + 923205600, + 941346000, + 954655200, + 972795600, + 986104800, + 1004245200, + 1018159200, + 1035694800, + 1049608800, + 1067144400, + 1081058400, + 1099198800, + 1112508000, + 1130648400, + 1143957600, + 1162098000, + 1173592800, + 1194152400 + ], + "types": [ + { + "offset": -16508 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-9a2f8cce797280e8-37784cc07103f2f3.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-9a2f8cce797280e8-37784cc07103f2f3.json new file mode 100644 index 00000000000000..ea52b0d54b7d9c --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-9a2f8cce797280e8-37784cc07103f2f3.json @@ -0,0 +1,195 @@ +{ + "ids": [ + "asia/sakhalin" + ], + "tzif": { + "posix": { + "abbr": "+11", + "offset": 39600, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 4, + 2, + 4, + 5, + 3, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4 + ], + "transitions": [ + -2031039048, + -768560400, + 354891600, + 370699200, + 386427600, + 402235200, + 417963600, + 433771200, + 449586000, + 465318000, + 481042800, + 496767600, + 512492400, + 528217200, + 543942000, + 559666800, + 575391600, + 591116400, + 606841200, + 622566000, + 638290800, + 654620400, + 670345200, + 670348800, + 686073600, + 695750400, + 701794800, + 717519600, + 733244400, + 748969200, + 764694000, + 780418800, + 796143600, + 811868400, + 828198000, + 846342000, + 859647600, + 859651200, + 877795200, + 891100800, + 909244800, + 922550400, + 941299200, + 954000000, + 972748800, + 985449600, + 1004198400, + 1017504000, + 1035648000, + 1048953600, + 1067097600, + 1080403200, + 1099152000, + 1111852800, + 1130601600, + 1143302400, + 1162051200, + 1174752000, + 1193500800, + 1206806400, + 1224950400, + 1238256000, + 1256400000, + 1269705600, + 1288454400, + 1301155200, + 1414249200, + 1459008000 + ], + "types": [ + { + "offset": 34248 + }, + { + "offset": 32400 + }, + { + "offset": 39600 + }, + { + "offset": 43200 + }, + { + "offset": 39600 + }, + { + "offset": 36000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-9af11812af42f7cb-8d70b106abb9243f.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-9af11812af42f7cb-8d70b106abb9243f.json new file mode 100644 index 00000000000000..a01d5875eeb30c --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-9af11812af42f7cb-8d70b106abb9243f.json @@ -0,0 +1,233 @@ +{ + "ids": [ + "australia/broken_hill", + "australia/yancowinna" + ], + "tzif": { + "posix": { + "abbr": "ACST", + "offset": 34200, + "transition": { + "abbr": "ACDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 4, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 1, + 0 + ] + }, + "time": 10800 + } + } + }, + "transition_types": [ + 1, + 2, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4 + ], + "transitions": [ + -2364110748, + -2314951200, + -2230189200, + -1672558200, + -1665387000, + -883639800, + -876123000, + -860398200, + -844673400, + -828343800, + -813223800, + 57688200, + 67969800, + 89137800, + 100024200, + 120587400, + 131473800, + 152037000, + 162923400, + 183486600, + 194977800, + 215541000, + 226427400, + 246990600, + 257877000, + 278440200, + 289326600, + 309889800, + 320776200, + 341339400, + 352225800, + 372789000, + 386699400, + 404843400, + 415729800, + 436293000, + 447179400, + 467742600, + 478629000, + 499192200, + 511288200, + 530037000, + 542737800, + 562091400, + 574792200, + 594145800, + 606241800, + 625595400, + 636481800, + 657045000, + 667931400, + 688494600, + 699381000, + 719944200, + 731435400, + 751998600, + 762885000, + 783448200, + 794334600, + 814897800, + 828203400, + 846347400, + 859653000, + 877797000, + 891102600, + 909246600, + 922552200, + 941301000, + 954001800, + 972750600, + 985451400, + 1004200200, + 1017505800, + 1035649800, + 1048955400, + 1067099400, + 1080405000, + 1099153800, + 1111854600, + 1130603400, + 1143909000, + 1162053000, + 1174753800, + 1193502600, + 1207413000, + 1223137800 + ], + "types": [ + { + "offset": 33948 + }, + { + "offset": 36000 + }, + { + "offset": 32400 + }, + { + "offset": 34200 + }, + { + "offset": 37800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-9afb6f21d74a3dbd-d76c18d684813924.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-9afb6f21d74a3dbd-d76c18d684813924.json new file mode 100644 index 00000000000000..b6b0ff5364b316 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-9afb6f21d74a3dbd-d76c18d684813924.json @@ -0,0 +1,19 @@ +{ + "ids": [ + "etc/gmt+6" + ], + "tzif": { + "posix": { + "abbr": "-06", + "offset": -21600, + "transition": null + }, + "transition_types": [], + "transitions": [], + "types": [ + { + "offset": -21600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-9b4491a5a7233cc3-9416dbeeb6810774.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-9b4491a5a7233cc3-9416dbeeb6810774.json new file mode 100644 index 00000000000000..200dcbe71c06b6 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-9b4491a5a7233cc3-9416dbeeb6810774.json @@ -0,0 +1,235 @@ +{ + "ids": [ + "america/inuvik" + ], + "tzif": { + "posix": { + "abbr": "MST", + "offset": -25200, + "transition": { + "abbr": "MDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4 + ], + "transitions": [ + -536457600, + 73476000, + 89197200, + 104925600, + 120646800, + 136375200, + 152096400, + 167824800, + 183546000, + 199274400, + 215600400, + 230724000, + 247050000, + 262778400, + 278499600, + 294228000, + 309945600, + 325674000, + 341395200, + 357123600, + 372844800, + 388573200, + 404899200, + 420022800, + 436348800, + 452077200, + 467798400, + 483526800, + 499248000, + 514976400, + 530697600, + 544611600, + 562147200, + 576061200, + 594201600, + 607510800, + 625651200, + 638960400, + 657100800, + 671014800, + 688550400, + 702464400, + 720000000, + 733914000, + 752054400, + 765363600, + 783504000, + 796813200, + 814953600, + 828867600, + 846403200, + 860317200, + 877852800, + 891766800, + 909302400, + 923216400, + 941356800, + 954666000, + 972806400, + 986115600, + 1004256000, + 1018170000, + 1035705600, + 1049619600, + 1067155200, + 1081069200, + 1099209600, + 1112518800, + 1130659200, + 1143968400, + 1162108800, + 1173603600, + 1194163200 + ], + "types": [ + { + "offset": 0 + }, + { + "offset": -28800 + }, + { + "offset": -25200 + }, + { + "offset": -21600 + }, + { + "offset": -25200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-9bd926151a997a3e-9909ffff90c3207.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-9bd926151a997a3e-9909ffff90c3207.json new file mode 100644 index 00000000000000..a5a60fba00a4b7 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-9bd926151a997a3e-9909ffff90c3207.json @@ -0,0 +1,289 @@ +{ + "ids": [ + "america/asuncion" + ], + "tzif": { + "posix": { + "abbr": "-03", + "offset": -10800, + "transition": null + }, + "transition_types": [ + 0, + 1, + 2, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 2, + 3 + ], + "transitions": [ + -2524507760, + -1206389360, + 86760000, + 134017200, + 181368000, + 194497200, + 212990400, + 226033200, + 244526400, + 257569200, + 276062400, + 291783600, + 307598400, + 323406000, + 339220800, + 354942000, + 370756800, + 386478000, + 402292800, + 418014000, + 433828800, + 449636400, + 465451200, + 481172400, + 496987200, + 512708400, + 528523200, + 544244400, + 560059200, + 575866800, + 591681600, + 607402800, + 625032000, + 638938800, + 654753600, + 670474800, + 686721600, + 699418800, + 718257600, + 733546800, + 749448000, + 762318000, + 780984000, + 793767600, + 812520000, + 825649200, + 844574400, + 856666800, + 876024000, + 888721200, + 907473600, + 920775600, + 938923200, + 952225200, + 970372800, + 983674800, + 1002427200, + 1018148400, + 1030852800, + 1049598000, + 1062907200, + 1081047600, + 1097985600, + 1110682800, + 1129435200, + 1142132400, + 1160884800, + 1173582000, + 1192939200, + 1205031600, + 1224388800, + 1236481200, + 1255838400, + 1270954800, + 1286078400, + 1302404400, + 1317528000, + 1333854000, + 1349582400, + 1364094000, + 1381032000, + 1395543600, + 1412481600, + 1426993200, + 1443931200, + 1459047600, + 1475380800, + 1490497200, + 1506830400, + 1521946800, + 1538884800, + 1553396400, + 1570334400, + 1584846000, + 1601784000, + 1616900400, + 1633233600, + 1648350000, + 1664683200, + 1679799600, + 1696132800, + 1711249200, + 1728187200, + 1728961200 + ], + "types": [ + { + "offset": -13840 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + }, + { + "offset": -10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-9c7ac303ad5d20d8-9111a17e7b78de54.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-9c7ac303ad5d20d8-9111a17e7b78de54.json new file mode 100644 index 00000000000000..a6cb19c4626a00 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-9c7ac303ad5d20d8-9111a17e7b78de54.json @@ -0,0 +1,194 @@ +{ + "ids": [ + "europe/tallinn" + ], + "tzif": { + "posix": { + "abbr": "EET", + "offset": 7200, + "transition": { + "abbr": "EEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 14400 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 10800 + } + } + }, + "transition_types": [ + 0, + 1, + 2, + 1, + 0, + 2, + 3, + 4, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 4, + 6, + 2, + 3, + 4, + 6, + 2, + 3, + 4, + 6, + 2, + 3, + 4, + 6, + 2, + 3, + 4, + 6, + 2, + 3, + 4, + 6, + 2, + 3, + 4, + 6, + 2, + 3, + 4, + 6, + 2, + 3, + 4, + 6, + 2, + 3, + 4, + 6, + 2, + 3, + 4, + 6, + 2, + 3 + ], + "transitions": [ + -2840146740, + -1638322740, + -1632006000, + -1618700400, + -1593824400, + -1535938740, + -927943200, + -892954800, + -857257200, + -844556400, + -828226800, + -812502000, + -797652000, + 354920400, + 370728000, + 386456400, + 402264000, + 417992400, + 433800000, + 449614800, + 465346800, + 481071600, + 496796400, + 512521200, + 528246000, + 543970800, + 559695600, + 575420400, + 591145200, + 606870000, + 622598400, + 638323200, + 654652800, + 670377600, + 686102400, + 701827200, + 717552000, + 733276800, + 749001600, + 764726400, + 780451200, + 796176000, + 811900800, + 828230400, + 846374400, + 859680000, + 877824000, + 891129600, + 909277200, + 922582800, + 941331600 + ], + "types": [ + { + "offset": 5940 + }, + { + "offset": 3600 + }, + { + "offset": 7200 + }, + { + "offset": 7200 + }, + { + "offset": 10800 + }, + { + "offset": 14400 + }, + { + "offset": 10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-9c98c8b92084c36-47e6455e977d6bb3.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-9c98c8b92084c36-47e6455e977d6bb3.json new file mode 100644 index 00000000000000..1af0e6a2f982ac --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-9c98c8b92084c36-47e6455e977d6bb3.json @@ -0,0 +1,248 @@ +{ + "ids": [ + "australia/currie", + "australia/hobart", + "australia/tasmania" + ], + "tzif": { + "posix": { + "abbr": "AEST", + "offset": 36000, + "transition": { + "abbr": "AEDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 4, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 1, + 0 + ] + }, + "time": 10800 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2 + ], + "transitions": [ + -2345795356, + -1680508800, + -1665388800, + -1646640000, + -1635753600, + -1615190400, + -1604304000, + -883641600, + -876124800, + -860400000, + -844675200, + -828345600, + -813225600, + -71136000, + -55411200, + -37267200, + -25776000, + -5817600, + 5673600, + 25632000, + 37728000, + 57686400, + 67968000, + 89136000, + 100022400, + 120585600, + 131472000, + 152035200, + 162921600, + 183484800, + 194976000, + 215539200, + 226425600, + 246988800, + 257875200, + 278438400, + 289324800, + 309888000, + 320774400, + 341337600, + 352224000, + 372787200, + 386092800, + 404841600, + 417542400, + 436291200, + 447177600, + 467740800, + 478627200, + 499190400, + 510076800, + 530035200, + 542736000, + 562089600, + 574790400, + 594144000, + 606240000, + 625593600, + 637689600, + 657043200, + 670348800, + 686678400, + 701798400, + 718128000, + 733248000, + 749577600, + 764697600, + 781027200, + 796147200, + 812476800, + 828201600, + 844531200, + 859651200, + 875980800, + 891100800, + 907430400, + 922550400, + 938880000, + 954000000, + 967305600, + 985449600, + 1002384000, + 1017504000, + 1033833600, + 1048953600, + 1065283200, + 1080403200, + 1096732800, + 1111852800, + 1128182400, + 1143907200, + 1159632000, + 1174752000, + 1191686400, + 1207411200, + 1223136000 + ], + "types": [ + { + "offset": 35356 + }, + { + "offset": 36000 + }, + { + "offset": 39600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-9d02412abb136ce4-bfde68530f93fb26.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-9d02412abb136ce4-bfde68530f93fb26.json new file mode 100644 index 00000000000000..8ad61452233ae5 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-9d02412abb136ce4-bfde68530f93fb26.json @@ -0,0 +1,26 @@ +{ + "ids": [ + "atlantic/south_georgia" + ], + "tzif": { + "posix": { + "abbr": "-02", + "offset": -7200, + "transition": null + }, + "transition_types": [ + 1 + ], + "transitions": [ + -2524512832 + ], + "types": [ + { + "offset": -8768 + }, + { + "offset": -7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a053c1334aeab356-645c110894da15be.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a053c1334aeab356-645c110894da15be.json new file mode 100644 index 00000000000000..57cd31cb0f6ece --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a053c1334aeab356-645c110894da15be.json @@ -0,0 +1,154 @@ +{ + "ids": [ + "asia/almaty" + ], + "tzif": { + "posix": { + "abbr": "+05", + "offset": 18000, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 4, + 2, + 4, + 1, + 3, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 1 + ], + "transitions": [ + -1441170468, + -1247547600, + 354909600, + 370717200, + 386445600, + 402253200, + 417981600, + 433789200, + 449604000, + 465336000, + 481060800, + 496785600, + 512510400, + 528235200, + 543960000, + 559684800, + 575409600, + 591134400, + 606859200, + 622584000, + 638308800, + 654638400, + 670363200, + 670366800, + 686091600, + 695768400, + 701812800, + 717537600, + 733262400, + 748987200, + 764712000, + 780436800, + 796161600, + 811886400, + 828216000, + 846360000, + 859665600, + 877809600, + 891115200, + 909259200, + 922564800, + 941313600, + 954014400, + 972763200, + 985464000, + 1004212800, + 1017518400, + 1035662400, + 1048968000, + 1067112000, + 1080417600, + 1099166400, + 1709229600 + ], + "types": [ + { + "offset": 18468 + }, + { + "offset": 18000 + }, + { + "offset": 21600 + }, + { + "offset": 25200 + }, + { + "offset": 21600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a0806703e39bd41f-938b549d3f658065.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a0806703e39bd41f-938b549d3f658065.json new file mode 100644 index 00000000000000..f7ddff0ba32474 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a0806703e39bd41f-938b549d3f658065.json @@ -0,0 +1,19 @@ +{ + "ids": [ + "etc/gmt+5" + ], + "tzif": { + "posix": { + "abbr": "-05", + "offset": -18000, + "transition": null + }, + "transition_types": [], + "transitions": [], + "types": [ + { + "offset": -18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a1347b19ee040601-84e246431e54b763.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a1347b19ee040601-84e246431e54b763.json new file mode 100644 index 00000000000000..0bf320a8587068 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a1347b19ee040601-84e246431e54b763.json @@ -0,0 +1,57 @@ +{ + "ids": [ + "pacific/apia" + ], + "tzif": { + "posix": { + "abbr": "+13", + "offset": 46800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 4, + 3, + 4, + 5, + 6, + 5 + ], + "transitions": [ + -2445424384, + -1861878784, + -631110600, + 1285498800, + 1301752800, + 1316872800, + 1325239200, + 1333202400, + 1348927200 + ], + "types": [ + { + "offset": 45184 + }, + { + "offset": -41216 + }, + { + "offset": -41400 + }, + { + "offset": -39600 + }, + { + "offset": -36000 + }, + { + "offset": 50400 + }, + { + "offset": 46800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a187ee64c8fae572-4985eb67780f1dca.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a187ee64c8fae572-4985eb67780f1dca.json new file mode 100644 index 00000000000000..fa7c7795c288e9 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a187ee64c8fae572-4985eb67780f1dca.json @@ -0,0 +1,45 @@ +{ + "ids": [ + "america/guatemala" + ], + "tzif": { + "posix": { + "abbr": "CST", + "offset": -21600, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -1617040676, + 123055200, + 130914000, + 422344800, + 433054800, + 669708000, + 684219600, + 1146376800, + 1159678800 + ], + "types": [ + { + "offset": -21724 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a1b14d47c3da0459-9beeb6b09fc4bd85.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a1b14d47c3da0459-9beeb6b09fc4bd85.json new file mode 100644 index 00000000000000..fd72fba6a87c29 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a1b14d47c3da0459-9beeb6b09fc4bd85.json @@ -0,0 +1,133 @@ +{ + "ids": [ + "europe/belgrade", + "europe/ljubljana", + "europe/podgorica", + "europe/sarajevo", + "europe/skopje", + "europe/zagreb" + ], + "tzif": { + "posix": { + "abbr": "CET", + "offset": 3600, + "transition": { + "abbr": "CEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 10800 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -2713915320, + -905824800, + -857257200, + -844556400, + -828226800, + -812502000, + -796777200, + -777942000, + -766623600, + 417574800, + 433299600, + 449024400, + 465354000, + 481078800, + 496803600, + 512528400, + 528253200, + 543978000, + 559702800, + 575427600, + 591152400, + 606877200, + 622602000, + 638326800, + 654656400, + 670381200, + 686106000, + 701830800, + 717555600, + 733280400, + 749005200, + 764730000, + 780454800, + 796179600, + 811904400, + 828234000, + 846378000 + ], + "types": [ + { + "offset": 4920 + }, + { + "offset": 3600 + }, + { + "offset": 7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a2c4636cb2de823b-69641876de40969.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a2c4636cb2de823b-69641876de40969.json new file mode 100644 index 00000000000000..9903aba5375d34 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a2c4636cb2de823b-69641876de40969.json @@ -0,0 +1,170 @@ +{ + "ids": [ + "america/argentina/catamarca", + "america/argentina/comodrivadavia", + "america/catamarca" + ], + "tzif": { + "posix": { + "abbr": "-03", + "offset": -10800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 2, + 5, + 3, + 4, + 5, + 3, + 4, + 3, + 4, + 3, + 4, + 2, + 3, + 4, + 5, + 3, + 4 + ], + "transitions": [ + -2372096212, + -1567453392, + -1233432000, + -1222981200, + -1205956800, + -1194037200, + -1172865600, + -1162501200, + -1141329600, + -1130965200, + -1109793600, + -1099429200, + -1078257600, + -1067806800, + -1046635200, + -1036270800, + -1015099200, + -1004734800, + -983563200, + -973198800, + -952027200, + -941576400, + -931032000, + -900882000, + -890337600, + -833749200, + -827265600, + -752274000, + -733780800, + -197326800, + -190843200, + -184194000, + -164491200, + -152658000, + -132955200, + -121122000, + -101419200, + -86821200, + -71092800, + -54766800, + -39038400, + -23317200, + -7588800, + 128142000, + 136605600, + 596948400, + 605066400, + 624423600, + 636516000, + 656478000, + 667965600, + 687931200, + 699415200, + 719377200, + 731469600, + 938919600, + 952052400, + 1086058800, + 1087704000, + 1198983600, + 1205632800 + ], + "types": [ + { + "offset": -15788 + }, + { + "offset": -15408 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + }, + { + "offset": -10800 + }, + { + "offset": -7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a3214de8e358efe8-33b7f8f888f95c0b.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a3214de8e358efe8-33b7f8f888f95c0b.json new file mode 100644 index 00000000000000..ad8b4bd955f0a6 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a3214de8e358efe8-33b7f8f888f95c0b.json @@ -0,0 +1,52 @@ +{ + "ids": [ + "america/creston", + "america/phoenix", + "mst", + "us/arizona" + ], + "tzif": { + "posix": { + "abbr": "MST", + "offset": -25200, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -2717643600, + -1633273200, + -1615132800, + -1601823600, + -1583683200, + -880210800, + -820519140, + -812653140, + -796845540, + -84380400, + -68659200 + ], + "types": [ + { + "offset": -26898 + }, + { + "offset": -25200 + }, + { + "offset": -21600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a3bbf95d113466c0-366de44a51a62cbe.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a3bbf95d113466c0-366de44a51a62cbe.json new file mode 100644 index 00000000000000..6882ee7884f8de --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a3bbf95d113466c0-366de44a51a62cbe.json @@ -0,0 +1,168 @@ +{ + "ids": [ + "america/argentina/san_luis" + ], + "tzif": { + "posix": { + "abbr": "-03", + "offset": -10800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 2, + 3, + 4, + 2, + 3, + 4, + 3, + 4, + 3, + 4, + 2, + 3, + 4, + 5, + 2, + 3, + 4, + 2, + 3, + 4 + ], + "transitions": [ + -2372096076, + -1567453392, + -1233432000, + -1222981200, + -1205956800, + -1194037200, + -1172865600, + -1162501200, + -1141329600, + -1130965200, + -1109793600, + -1099429200, + -1078257600, + -1067806800, + -1046635200, + -1036270800, + -1015099200, + -1004734800, + -983563200, + -973198800, + -952027200, + -941576400, + -931032000, + -900882000, + -890337600, + -833749200, + -827265600, + -752274000, + -733780800, + -197326800, + -190843200, + -184194000, + -164491200, + -152658000, + -132955200, + -121122000, + -101419200, + -86821200, + -71092800, + -54766800, + -39038400, + -23317200, + -7588800, + 128142000, + 136605600, + 596948400, + 605066400, + 624423600, + 637380000, + 655963200, + 667796400, + 675748800, + 938919600, + 952052400, + 1085972400, + 1090728000, + 1198983600, + 1200880800, + 1223784000, + 1236481200, + 1255233600 + ], + "types": [ + { + "offset": -15924 + }, + { + "offset": -15408 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + }, + { + "offset": -10800 + }, + { + "offset": -7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a442eead4fdb53a5-264d7185508cac7f.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a442eead4fdb53a5-264d7185508cac7f.json new file mode 100644 index 00000000000000..8acb9929b07c41 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a442eead4fdb53a5-264d7185508cac7f.json @@ -0,0 +1,149 @@ +{ + "ids": [ + "america/bahia" + ], + "tzif": { + "posix": { + "abbr": "-03", + "offset": -10800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -1767216356, + -1206957600, + -1191362400, + -1175374800, + -1159826400, + -633819600, + -622069200, + -602283600, + -591832800, + -570747600, + -560210400, + -539125200, + -531352800, + -191365200, + -184197600, + -155163600, + -150069600, + -128898000, + -121125600, + -99954000, + -89589600, + -68418000, + -57967200, + 499748400, + 511236000, + 530593200, + 540266400, + 562129200, + 571197600, + 592974000, + 602042400, + 624423600, + 634701600, + 656478000, + 666756000, + 687927600, + 697600800, + 719982000, + 728445600, + 750826800, + 761709600, + 782276400, + 793159200, + 813726000, + 824004000, + 844570800, + 856058400, + 876106800, + 888717600, + 908074800, + 919562400, + 938919600, + 951616800, + 970974000, + 982461600, + 1003028400, + 1013911200, + 1036292400, + 1045360800, + 1318734000, + 1330221600 + ], + "types": [ + { + "offset": -9244 + }, + { + "offset": -10800 + }, + { + "offset": -7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a44c115ed3d72421-692eaf79ab1934a7.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a44c115ed3d72421-692eaf79ab1934a7.json new file mode 100644 index 00000000000000..717eb27430c9f2 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a44c115ed3d72421-692eaf79ab1934a7.json @@ -0,0 +1,340 @@ +{ + "ids": [ + "atlantic/madeira" + ], + "tzif": { + "posix": { + "abbr": "WET", + "offset": 0, + "transition": { + "abbr": "WEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 3600 + } + } + }, + "transition_types": [ + 0, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 3, + 2, + 1, + 2, + 3, + 2, + 1, + 2, + 3, + 2, + 1, + 2, + 3, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4 + ], + "transitions": [ + -2713906344, + -1830380400, + -1689552000, + -1677798000, + -1667430000, + -1647734400, + -1635894000, + -1616198400, + -1604358000, + -1584662400, + -1572735600, + -1553040000, + -1541199600, + -1521504000, + -1442448000, + -1427673600, + -1379289600, + -1364774400, + -1348444800, + -1333324800, + -1316390400, + -1301270400, + -1284336000, + -1269820800, + -1221436800, + -1206921600, + -1191196800, + -1175472000, + -1127692800, + -1111968000, + -1096848000, + -1080518400, + -1063584000, + -1049068800, + -1033344000, + -1017619200, + -1002499200, + -986169600, + -969235200, + -950486400, + -942019200, + -922492800, + -906940800, + -891129600, + -877305600, + -873680400, + -864003600, + -857952000, + -845856000, + -842835600, + -831344400, + -825897600, + -814406400, + -810781200, + -799894800, + -794448000, + -782956800, + -779331600, + -768445200, + -762998400, + -749088000, + -733363200, + -717627600, + -701902800, + -686178000, + -670453200, + -654728400, + -639003600, + -623278800, + -607554000, + -591829200, + -575499600, + -559774800, + -544050000, + -528325200, + -512600400, + -496875600, + -481150800, + -465426000, + -449701200, + -433976400, + -417646800, + -401922000, + -386197200, + -370472400, + -354747600, + -339022800, + -323298000, + -307573200, + -291848400, + -276123600, + -260398800, + -244674000, + -228344400, + -212619600, + -196894800, + -181170000, + -165445200, + -149720400, + -133995600, + -118270800, + -102546000, + 386726400, + 401846400, + 417571200, + 433296000, + 449020800, + 465350400, + 481075200, + 496800000, + 512524800, + 528253200, + 543978000, + 559702800, + 575427600, + 591152400, + 606877200, + 622602000, + 638326800, + 654656400, + 670381200, + 686106000, + 701830800, + 717555600, + 733280400, + 749005200, + 764730000, + 780454800, + 796179600, + 811904400, + 828234000, + 846378000 + ], + "types": [ + { + "offset": -4056 + }, + { + "offset": -3600 + }, + { + "offset": 0 + }, + { + "offset": 3600 + }, + { + "offset": 0 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a685965c91f5b79b-e66cc1c813ce5bd6.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a685965c91f5b79b-e66cc1c813ce5bd6.json new file mode 100644 index 00000000000000..78ad2616286876 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a685965c91f5b79b-e66cc1c813ce5bd6.json @@ -0,0 +1,183 @@ +{ + "ids": [ + "america/chihuahua" + ], + "tzif": { + "posix": { + "abbr": "CST", + "offset": -21600, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 3, + 1, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 2, + 3 + ], + "transitions": [ + -1514739600, + -1343149200, + -1234807200, + -1220461200, + -1207159200, + -1191344400, + 828864000, + 846399600, + 860313600, + 877849200, + 891766800, + 909302400, + 923216400, + 941356800, + 954666000, + 972806400, + 989139600, + 1001836800, + 1018170000, + 1035705600, + 1049619600, + 1067155200, + 1081069200, + 1099209600, + 1112518800, + 1130659200, + 1143968400, + 1162108800, + 1175418000, + 1193558400, + 1207472400, + 1225008000, + 1238922000, + 1256457600, + 1270371600, + 1288512000, + 1301821200, + 1319961600, + 1333270800, + 1351411200, + 1365325200, + 1382860800, + 1396774800, + 1414310400, + 1428224400, + 1445760000, + 1459674000, + 1477814400, + 1491123600, + 1509264000, + 1522573200, + 1540713600, + 1554627600, + 1572163200, + 1586077200, + 1603612800, + 1617526800, + 1635667200, + 1648976400, + 1667116800 + ], + "types": [ + { + "offset": -25460 + }, + { + "offset": -25200 + }, + { + "offset": -21600 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a7b726e2144b8ec3-b273ddcc47da034b.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a7b726e2144b8ec3-b273ddcc47da034b.json new file mode 100644 index 00000000000000..87f65b1a9a06ac --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-a7b726e2144b8ec3-b273ddcc47da034b.json @@ -0,0 +1,129 @@ +{ + "ids": [ + "atlantic/canary" + ], + "tzif": { + "posix": { + "abbr": "WET", + "offset": 0, + "transition": { + "abbr": "WEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 3600 + } + } + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2 + ], + "transitions": [ + -1509663504, + -733874400, + 323827200, + 338950800, + 354675600, + 370400400, + 386125200, + 401850000, + 417574800, + 433299600, + 449024400, + 465354000, + 481078800, + 496803600, + 512528400, + 528253200, + 543978000, + 559702800, + 575427600, + 591152400, + 606877200, + 622602000, + 638326800, + 654656400, + 670381200, + 686106000, + 701830800, + 717555600, + 733280400, + 749005200, + 764730000, + 780454800, + 796179600, + 811904400, + 828234000, + 846378000 + ], + "types": [ + { + "offset": -3696 + }, + { + "offset": -3600 + }, + { + "offset": 0 + }, + { + "offset": 3600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-aa6fbecd6b3089a1-3c3e5535078a0aca.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-aa6fbecd6b3089a1-3c3e5535078a0aca.json new file mode 100644 index 00000000000000..ababf56764b506 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-aa6fbecd6b3089a1-3c3e5535078a0aca.json @@ -0,0 +1,351 @@ +{ + "ids": [ + "america/moncton" + ], + "tzif": { + "posix": { + "abbr": "AST", + "offset": -14400, + "transition": { + "abbr": "ADT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2 + ], + "transitions": [ + -2715882052, + -2131642800, + -1632074400, + -1615143600, + -1153681200, + -1145822400, + -1122231600, + -1114372800, + -1090782000, + -1082923200, + -1059332400, + -1051473600, + -1027882800, + -1020024000, + -996433200, + -988574400, + -965674800, + -955396800, + -934743600, + -923947200, + -904503600, + -891892800, + -880221600, + -769395600, + -765399600, + -747252000, + -733950000, + -715802400, + -702500400, + -684352800, + -671050800, + -652903200, + -639601200, + -620848800, + -608151600, + -589399200, + -576097200, + -557949600, + -544647600, + -526500000, + -513198000, + -495050400, + -481748400, + -463600800, + -450298800, + -431546400, + -418244400, + -400096800, + -384375600, + -368647200, + -352926000, + -337197600, + -321476400, + -305748000, + -289422000, + -273693600, + -257972400, + -242244000, + -226522800, + -210794400, + -195073200, + -179344800, + -163623600, + -147895200, + -131569200, + -116445600, + -100119600, + -84391200, + -68670000, + -52941600, + -37220400, + -21492000, + -5770800, + 9957600, + 25678800, + 41407200, + 57733200, + 73461600, + 89182800, + 136360800, + 152082000, + 167810400, + 183531600, + 199260000, + 215586000, + 230709600, + 247035600, + 262764000, + 278485200, + 294213600, + 309934800, + 325663200, + 341384400, + 357112800, + 372834000, + 388562400, + 404888400, + 420012000, + 436338000, + 452066400, + 467787600, + 483516000, + 499237200, + 514965600, + 530686800, + 544600800, + 562136400, + 576050400, + 594190800, + 607500000, + 625640400, + 638949600, + 657090000, + 671004000, + 688539600, + 702453600, + 719989200, + 733896060, + 752036460, + 765345660, + 783486060, + 796795260, + 814935660, + 828849660, + 846385260, + 860299260, + 877834860, + 891748860, + 909284460, + 923198460, + 941338860, + 954648060, + 972788460, + 986097660, + 1004238060, + 1018152060, + 1035687660, + 1049601660, + 1067137260, + 1081051260, + 1099191660, + 1112500860, + 1130641260, + 1143950460, + 1162090860, + 1173592800, + 1194152400 + ], + "types": [ + { + "offset": -15548 + }, + { + "offset": -18000 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-aba73c12b2e7f46-a62a02047cf0f8be.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-aba73c12b2e7f46-a62a02047cf0f8be.json new file mode 100644 index 00000000000000..edaf2a23ed7924 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-aba73c12b2e7f46-a62a02047cf0f8be.json @@ -0,0 +1,47 @@ +{ + "ids": [ + "africa/bangui", + "africa/brazzaville", + "africa/douala", + "africa/kinshasa", + "africa/lagos", + "africa/libreville", + "africa/luanda", + "africa/malabo", + "africa/niamey", + "africa/porto-novo" + ], + "tzif": { + "posix": { + "abbr": "WAT", + "offset": 3600, + "transition": null + }, + "transition_types": [ + 1, + 0, + 2, + 3 + ], + "transitions": [ + -2035584815, + -1940889600, + -1767226415, + -1588465800 + ], + "types": [ + { + "offset": 815 + }, + { + "offset": 0 + }, + { + "offset": 1800 + }, + { + "offset": 3600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-aeaa8db63bed649c-8a6f5505498821c5.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-aeaa8db63bed649c-8a6f5505498821c5.json new file mode 100644 index 00000000000000..defddbdedb944f --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-aeaa8db63bed649c-8a6f5505498821c5.json @@ -0,0 +1,19 @@ +{ + "ids": [ + "etc/gmt+7" + ], + "tzif": { + "posix": { + "abbr": "-07", + "offset": -25200, + "transition": null + }, + "transition_types": [], + "transitions": [], + "types": [ + { + "offset": -25200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b05b7d10c5ffdad-d39eb7f9fe146506.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b05b7d10c5ffdad-d39eb7f9fe146506.json new file mode 100644 index 00000000000000..91021ebecd260c --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b05b7d10c5ffdad-d39eb7f9fe146506.json @@ -0,0 +1,33 @@ +{ + "ids": [ + "asia/jayapura" + ], + "tzif": { + "posix": { + "abbr": "WIT", + "offset": 32400, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1 + ], + "transitions": [ + -1172913768, + -799491600, + -189423000 + ], + "types": [ + { + "offset": 33768 + }, + { + "offset": 32400 + }, + { + "offset": 34200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b06ac7e52f27518c-ad815076903a307.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b06ac7e52f27518c-ad815076903a307.json new file mode 100644 index 00000000000000..885b5a077a942b --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b06ac7e52f27518c-ad815076903a307.json @@ -0,0 +1,162 @@ +{ + "ids": [ + "europe/bucharest" + ], + "tzif": { + "posix": { + "abbr": "EET", + "offset": 7200, + "transition": { + "abbr": "EEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 14400 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 10800 + } + } + }, + "transition_types": [ + 0, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -2469404664, + -1213148664, + -1187056800, + -1175479200, + -1159754400, + -1144029600, + -1127700000, + -1111975200, + -1096250400, + -1080525600, + -1064800800, + -1049076000, + -1033351200, + -1017626400, + -1001901600, + -986176800, + -970452000, + -954727200, + 296604000, + 307486800, + 323816400, + 338940000, + 354672000, + 370396800, + 386121600, + 401846400, + 417571200, + 433296000, + 449020800, + 465350400, + 481075200, + 496800000, + 512524800, + 528249600, + 543974400, + 559699200, + 575424000, + 591148800, + 606873600, + 622598400, + 638323200, + 654652800, + 670370400, + 686095200, + 701820000, + 717544800, + 733269600, + 748994400, + 757375200, + 780440400, + 796168800, + 811890000, + 828223200, + 846363600 + ], + "types": [ + { + "offset": 6264 + }, + { + "offset": 7200 + }, + { + "offset": 10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b0c86e4e28bb1810-bccad26ea4f4cee2.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b0c86e4e28bb1810-bccad26ea4f4cee2.json new file mode 100644 index 00000000000000..7cae47ada033bd --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b0c86e4e28bb1810-bccad26ea4f4cee2.json @@ -0,0 +1,191 @@ +{ + "ids": [ + "asia/krasnoyarsk" + ], + "tzif": { + "posix": { + "abbr": "+07", + "offset": 25200, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 4, + 2, + 4, + 1, + 3, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 5, + 2, + 4 + ], + "transitions": [ + -1577513486, + -1247551200, + 354906000, + 370713600, + 386442000, + 402249600, + 417978000, + 433785600, + 449600400, + 465332400, + 481057200, + 496782000, + 512506800, + 528231600, + 543956400, + 559681200, + 575406000, + 591130800, + 606855600, + 622580400, + 638305200, + 654634800, + 670359600, + 670363200, + 686088000, + 695764800, + 701809200, + 717534000, + 733258800, + 748983600, + 764708400, + 780433200, + 796158000, + 811882800, + 828212400, + 846356400, + 859662000, + 877806000, + 891111600, + 909255600, + 922561200, + 941310000, + 954010800, + 972759600, + 985460400, + 1004209200, + 1017514800, + 1035658800, + 1048964400, + 1067108400, + 1080414000, + 1099162800, + 1111863600, + 1130612400, + 1143313200, + 1162062000, + 1174762800, + 1193511600, + 1206817200, + 1224961200, + 1238266800, + 1256410800, + 1269716400, + 1288465200, + 1301166000, + 1414260000 + ], + "types": [ + { + "offset": 22286 + }, + { + "offset": 21600 + }, + { + "offset": 25200 + }, + { + "offset": 28800 + }, + { + "offset": 25200 + }, + { + "offset": 28800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b397eb337d51aec5-9d2674bc81a95add.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b397eb337d51aec5-9d2674bc81a95add.json new file mode 100644 index 00000000000000..c3e7f81dd41fc2 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b397eb337d51aec5-9d2674bc81a95add.json @@ -0,0 +1,19 @@ +{ + "ids": [ + "etc/gmt-1" + ], + "tzif": { + "posix": { + "abbr": "+01", + "offset": 3600, + "transition": null + }, + "transition_types": [], + "transitions": [], + "types": [ + { + "offset": 3600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b3a7b6acccb12af9-93f5a4bd9827e971.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b3a7b6acccb12af9-93f5a4bd9827e971.json new file mode 100644 index 00000000000000..20b2577cd9616b --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b3a7b6acccb12af9-93f5a4bd9827e971.json @@ -0,0 +1,31 @@ +{ + "ids": [ + "pacific/palau" + ], + "tzif": { + "posix": { + "abbr": "+09", + "offset": 32400, + "transition": null + }, + "transition_types": [ + 1, + 2 + ], + "transitions": [ + -3944624276, + -2177485076 + ], + "types": [ + { + "offset": -54124 + }, + { + "offset": 32276 + }, + { + "offset": 32400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b3d9e43d648fe2bf-fa688f4eb568be69.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b3d9e43d648fe2bf-fa688f4eb568be69.json new file mode 100644 index 00000000000000..4bfcf3b1a3ee62 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b3d9e43d648fe2bf-fa688f4eb568be69.json @@ -0,0 +1,29 @@ +{ + "ids": [ + "indian/kerguelen", + "indian/maldives" + ], + "tzif": { + "posix": { + "abbr": "+05", + "offset": 18000, + "transition": null + }, + "transition_types": [ + 0, + 1 + ], + "transitions": [ + -2840158440, + -315636840 + ], + "types": [ + { + "offset": 17640 + }, + { + "offset": 18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b445d8dfee87de1d-3d26ba9d3df071ac.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b445d8dfee87de1d-3d26ba9d3df071ac.json new file mode 100644 index 00000000000000..0eed30740f1079 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b445d8dfee87de1d-3d26ba9d3df071ac.json @@ -0,0 +1,19 @@ +{ + "ids": [ + "etc/gmt-12" + ], + "tzif": { + "posix": { + "abbr": "+12", + "offset": 43200, + "transition": null + }, + "transition_types": [], + "transitions": [], + "types": [ + { + "offset": 43200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b6ba868b587cad06-6667a264db5d890e.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b6ba868b587cad06-6667a264db5d890e.json new file mode 100644 index 00000000000000..a2c94b4fa4c881 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b6ba868b587cad06-6667a264db5d890e.json @@ -0,0 +1,208 @@ +{ + "ids": [ + "asia/macao", + "asia/macau" + ], + "tzif": { + "posix": { + "abbr": "CST", + "offset": 28800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1 + ], + "transitions": [ + -2056692850, + -884509200, + -873280800, + -855918000, + -841744800, + -828529200, + -765363600, + -747046800, + -733827600, + -716461200, + -697021200, + -683715600, + -667990800, + -654771600, + -636627600, + -623322000, + -605178000, + -591872400, + -573642000, + -559818000, + -541674000, + -528368400, + -510224400, + -498128400, + -478774800, + -466678800, + -446720400, + -435229200, + -415258200, + -403158600, + -383808600, + -371709000, + -352359000, + -340259400, + -320909400, + -308809800, + -288855000, + -277360200, + -257405400, + -245910600, + -225955800, + -213856200, + -194506200, + -182406600, + -163056600, + -148537800, + -132820200, + -117088200, + -101370600, + -85638600, + -69312600, + -53584200, + -37863000, + -22134600, + -6413400, + 9315000, + 25036200, + 40764600, + 56485800, + 72214200, + 88540200, + 104268600, + 119989800, + 126041400, + 151439400, + 167167800, + 182889000, + 198617400, + 214338600, + 295385400, + 309292200 + ], + "types": [ + { + "offset": 27250 + }, + { + "offset": 28800 + }, + { + "offset": 32400 + }, + { + "offset": 36000 + }, + { + "offset": 32400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b785c09bc525b515-5fd6146854daeb91.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b785c09bc525b515-5fd6146854daeb91.json new file mode 100644 index 00000000000000..2a2e9fad08d8e9 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b785c09bc525b515-5fd6146854daeb91.json @@ -0,0 +1,97 @@ +{ + "ids": [ + "america/eirunepe" + ], + "tzif": { + "posix": { + "abbr": "-05", + "offset": -18000, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 3, + 1 + ], + "transitions": [ + -1767208832, + -1206950400, + -1191355200, + -1175367600, + -1159819200, + -633812400, + -622062000, + -602276400, + -591825600, + -570740400, + -560203200, + -539118000, + -531345600, + -191358000, + -184190400, + -155156400, + -150062400, + -128890800, + -121118400, + -99946800, + -89582400, + -68410800, + -57960000, + 499755600, + 511243200, + 530600400, + 540273600, + 562136400, + 571204800, + 750834000, + 761716800, + 1214283600, + 1384056000 + ], + "types": [ + { + "offset": -16768 + }, + { + "offset": -18000 + }, + { + "offset": -14400 + }, + { + "offset": -14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b89f6da72122ca01-812d173fdcfeaaa6.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b89f6da72122ca01-812d173fdcfeaaa6.json new file mode 100644 index 00000000000000..3c9b0812048233 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b89f6da72122ca01-812d173fdcfeaaa6.json @@ -0,0 +1,88 @@ +{ + "ids": [ + "asia/seoul", + "rok" + ], + "tzif": { + "posix": { + "abbr": "KST", + "offset": 32400, + "transition": null + }, + "transition_types": [ + 1, + 2, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 1, + 4, + 1, + 4, + 1, + 4, + 1, + 4, + 1, + 4, + 1, + 4, + 1, + 2, + 3, + 2 + ], + "transitions": [ + -1948782472, + -1830414600, + -767350800, + -681210000, + -672228000, + -654771600, + -640864800, + -623408400, + -609415200, + -588848400, + -577965600, + -498128400, + -462702600, + -451733400, + -429784200, + -418296600, + -399544200, + -387451800, + -368094600, + -356002200, + -336645000, + -324552600, + -305195400, + -293103000, + -264933000, + 547578000, + 560883600 + ], + "types": [ + { + "offset": 30472 + }, + { + "offset": 30600 + }, + { + "offset": 32400 + }, + { + "offset": 36000 + }, + { + "offset": 34200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b8b54ce37e65e37e-e9672f15a3e270a7.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b8b54ce37e65e37e-e9672f15a3e270a7.json new file mode 100644 index 00000000000000..f48a5ad388b899 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b8b54ce37e65e37e-e9672f15a3e270a7.json @@ -0,0 +1,76 @@ +{ + "ids": [ + "pacific/guam", + "pacific/saipan" + ], + "tzif": { + "posix": { + "abbr": "ChST", + "offset": 36000, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 2 + ], + "transitions": [ + -3944626740, + -2177487540, + -885549600, + -802256400, + -331891200, + -281610000, + -73728000, + -29415540, + -16704000, + -10659600, + 9907200, + 21394800, + 41356800, + 52844400, + 124819200, + 130863600, + 201888000, + 209487660, + 230659200, + 241542000, + 977493600 + ], + "types": [ + { + "offset": -51660 + }, + { + "offset": 34740 + }, + { + "offset": 36000 + }, + { + "offset": 32400 + }, + { + "offset": 39600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b9b18c55e2cd4d53-b3d917ee40af164d.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b9b18c55e2cd4d53-b3d917ee40af164d.json new file mode 100644 index 00000000000000..715b328f90bf50 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b9b18c55e2cd4d53-b3d917ee40af164d.json @@ -0,0 +1,226 @@ +{ + "ids": [ + "america/belize" + ], + "tzif": { + "posix": { + "abbr": "CST", + "offset": -21600, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 3, + 3, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 3, + 1, + 3, + 1 + ], + "transitions": [ + -1822500432, + -1616954400, + -1606069800, + -1585504800, + -1574015400, + -1554055200, + -1542565800, + -1522605600, + -1511116200, + -1490551200, + -1479666600, + -1459101600, + -1448217000, + -1427652000, + -1416162600, + -1396202400, + -1384713000, + -1364752800, + -1353263400, + -1333303200, + -1321813800, + -1301248800, + -1290364200, + -1269799200, + -1258914600, + -1238349600, + -1226860200, + -1206900000, + -1195410600, + -1175450400, + -1163961000, + -1143396000, + -1132511400, + -1111946400, + -1101061800, + -1080496800, + -1069612200, + -1049047200, + -1037557800, + -1017597600, + -1006108200, + -986148000, + -974658600, + -954093600, + -943209000, + -922644000, + -911759400, + -891194400, + -879705000, + -868212000, + -769395600, + -758746800, + -701892000, + -690402600, + -670442400, + -658953000, + -638992800, + -627503400, + -606938400, + -596053800, + -575488800, + -564604200, + -544039200, + -532549800, + -512589600, + -501100200, + -481140000, + -469650600, + -449690400, + -438201000, + -417636000, + -406751400, + -386186400, + -375301800, + -354736800, + -343247400, + -323287200, + -311797800, + -291837600, + -280348200, + -259783200, + -248898600, + -228333600, + -217449000, + -196884000, + -185999400, + -165434400, + -153945000, + -133984800, + -122495400, + -102535200, + -91045800, + -70480800, + -59596200, + 123919200, + 129618000, + 409039200, + 413874000 + ], + "types": [ + { + "offset": -21168 + }, + { + "offset": -21600 + }, + { + "offset": -19800 + }, + { + "offset": -18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b9d3679a03af6191-99d89d33c8fd0b60.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b9d3679a03af6191-99d89d33c8fd0b60.json new file mode 100644 index 00000000000000..54041a69497525 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-b9d3679a03af6191-99d89d33c8fd0b60.json @@ -0,0 +1,184 @@ +{ + "ids": [ + "asia/qostanay" + ], + "tzif": { + "posix": { + "abbr": "+05", + "offset": 18000, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 2, + 5, + 2, + 5, + 1, + 3, + 4, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 3, + 4, + 2, + 5 + ], + "transitions": [ + -1441167268, + -1247544000, + 354913200, + 370720800, + 386445600, + 386449200, + 402256800, + 417985200, + 433792800, + 449607600, + 465339600, + 481064400, + 496789200, + 512514000, + 528238800, + 543963600, + 559688400, + 575413200, + 591138000, + 606862800, + 622587600, + 638312400, + 654642000, + 670366800, + 670370400, + 686095200, + 695772000, + 701816400, + 717541200, + 733266000, + 748990800, + 764715600, + 780440400, + 796165200, + 811890000, + 828219600, + 846363600, + 859669200, + 877813200, + 891118800, + 909262800, + 922568400, + 941317200, + 954018000, + 972766800, + 985467600, + 1004216400, + 1017522000, + 1035666000, + 1048971600, + 1067115600, + 1080421200, + 1099170000, + 1709229600 + ], + "types": [ + { + "offset": 15268 + }, + { + "offset": 14400 + }, + { + "offset": 18000 + }, + { + "offset": 21600 + }, + { + "offset": 21600 + }, + { + "offset": 18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bad7f01dd3f01a92-8ed1d7da904b667d.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bad7f01dd3f01a92-8ed1d7da904b667d.json new file mode 100644 index 00000000000000..f408a0bc99baf3 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bad7f01dd3f01a92-8ed1d7da904b667d.json @@ -0,0 +1,308 @@ +{ + "ids": [ + "america/rainy_river", + "america/winnipeg", + "canada/central" + ], + "tzif": { + "posix": { + "abbr": "CST", + "offset": -21600, + "transition": { + "abbr": "CDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -2602258284, + -1694368800, + -1681671600, + -1632067200, + -1615136400, + -1029686400, + -1018198800, + -880214400, + -769395600, + -765392400, + -746035200, + -732733200, + -715795200, + -702493200, + -684345600, + -671043600, + -652896000, + -639594000, + -620755200, + -607626000, + -589392000, + -576090000, + -557942400, + -544640400, + -526492800, + -513190800, + -495043200, + -481741200, + -463593600, + -450291600, + -431539200, + -418237200, + -400089600, + -386787600, + -368640000, + -355338000, + -337190400, + -321469200, + -305740800, + -292438800, + -210787200, + -198090000, + -116438400, + -100108800, + -84384000, + -68659200, + -52934400, + -37209600, + -21484800, + -5760000, + 9964800, + 25689600, + 41414400, + 57744000, + 73468800, + 89193600, + 104918400, + 120643200, + 136368000, + 152092800, + 167817600, + 183542400, + 199267200, + 215596800, + 230716800, + 247046400, + 262771200, + 278496000, + 294220800, + 309945600, + 325670400, + 341395200, + 357120000, + 372844800, + 388569600, + 404899200, + 420019200, + 436348800, + 452073600, + 467798400, + 483523200, + 499248000, + 514972800, + 530697600, + 544608000, + 562147200, + 576057600, + 594201600, + 607507200, + 625651200, + 638956800, + 657100800, + 671011200, + 688550400, + 702460800, + 720000000, + 733910400, + 752054400, + 765360000, + 783504000, + 796809600, + 814953600, + 828864000, + 846403200, + 860313600, + 877852800, + 891763200, + 909302400, + 923212800, + 941356800, + 954662400, + 972806400, + 986112000, + 1004256000, + 1018166400, + 1035705600, + 1049616000, + 1067155200, + 1081065600, + 1099209600, + 1112515200, + 1130659200, + 1136095200, + 1162105200, + 1173600000, + 1194159600 + ], + "types": [ + { + "offset": -23316 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bafb78fdc913701c-de429c1ed9e982a1.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bafb78fdc913701c-de429c1ed9e982a1.json new file mode 100644 index 00000000000000..e30479fb25238e --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bafb78fdc913701c-de429c1ed9e982a1.json @@ -0,0 +1,168 @@ +{ + "ids": [ + "europe/vienna" + ], + "tzif": { + "posix": { + "abbr": "CET", + "offset": 3600, + "transition": { + "abbr": "CEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 10800 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -2422055121, + -1693706400, + -1680483600, + -1663455600, + -1650150000, + -1632006000, + -1618700400, + -1569711600, + -1555801200, + -938905200, + -857257200, + -844556400, + -828226800, + -812502000, + -796777200, + -781052400, + -780188400, + -748479600, + -733273200, + -717634800, + -701910000, + -684975600, + -670460400, + 323823600, + 338940000, + 347151600, + 370400400, + 386125200, + 401850000, + 417574800, + 433299600, + 449024400, + 465354000, + 481078800, + 496803600, + 512528400, + 528253200, + 543978000, + 559702800, + 575427600, + 591152400, + 606877200, + 622602000, + 638326800, + 654656400, + 670381200, + 686106000, + 701830800, + 717555600, + 733280400, + 749005200, + 764730000, + 780454800, + 796179600, + 811904400, + 828234000, + 846378000 + ], + "types": [ + { + "offset": 3921 + }, + { + "offset": 3600 + }, + { + "offset": 7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bbf3217ce334c3f2-5622ec9ecf81c925.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bbf3217ce334c3f2-5622ec9ecf81c925.json new file mode 100644 index 00000000000000..c17727e02fb0dc --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bbf3217ce334c3f2-5622ec9ecf81c925.json @@ -0,0 +1,19 @@ +{ + "ids": [ + "etc/gmt+11" + ], + "tzif": { + "posix": { + "abbr": "-11", + "offset": -39600, + "transition": null + }, + "transition_types": [], + "transitions": [], + "types": [ + { + "offset": -39600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bbfc9e9111217c11-69684e27be4c3e38.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bbfc9e9111217c11-69684e27be4c3e38.json new file mode 100644 index 00000000000000..0427a357b989f4 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bbfc9e9111217c11-69684e27be4c3e38.json @@ -0,0 +1,144 @@ +{ + "ids": [ + "america/indiana/tell_city" + ], + "tzif": { + "posix": { + "abbr": "CST", + "offset": -21600, + "transition": { + "abbr": "CDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 4, + 2, + 3, + 4, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1 + ], + "transitions": [ + -2717647200, + -1633276800, + -1615136400, + -1601827200, + -1583686800, + -880214400, + -769395600, + -765392400, + -462996000, + -450291600, + -431539200, + -418237200, + -400089600, + -386787600, + -368640000, + -355338000, + -337190400, + -323888400, + -305740800, + -292438800, + -273686400, + -257965200, + -242236800, + -226515600, + -210787200, + -195066000, + -179337600, + -68662800, + -52934400, + -37213200, + -21484800, + -5767200, + 9961200, + 25682400, + 1143961200, + 1143964800, + 1162105200, + 1173600000, + 1194159600 + ], + "types": [ + { + "offset": -20823 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + }, + { + "offset": -18000 + }, + { + "offset": -14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bcd5d242787ff58-595e172a944e8f55.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bcd5d242787ff58-595e172a944e8f55.json new file mode 100644 index 00000000000000..0268d3ed84c3f5 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bcd5d242787ff58-595e172a944e8f55.json @@ -0,0 +1,71 @@ +{ + "ids": [ + "pacific/efate" + ], + "tzif": { + "posix": { + "abbr": "+11", + "offset": 39600, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2 + ], + "transitions": [ + -1829387596, + 125409600, + 133876800, + 433256400, + 448977600, + 464706000, + 480427200, + 496760400, + 511876800, + 528210000, + 543931200, + 559659600, + 575380800, + 591109200, + 606830400, + 622558800, + 638280000, + 654008400, + 669729600, + 686062800, + 696340800, + 719931600 + ], + "types": [ + { + "offset": 40396 + }, + { + "offset": 39600 + }, + { + "offset": 43200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bd05cebe8eecfa2c-408891f6d5e0c72a.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bd05cebe8eecfa2c-408891f6d5e0c72a.json new file mode 100644 index 00000000000000..d9fbf3da578fc1 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bd05cebe8eecfa2c-408891f6d5e0c72a.json @@ -0,0 +1,160 @@ +{ + "ids": [ + "africa/ceuta" + ], + "tzif": { + "posix": { + "abbr": "CET", + "offset": 3600, + "transition": { + "abbr": "CEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 10800 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3 + ], + "transitions": [ + -2177452800, + -1630112400, + -1616810400, + -1442451600, + -1427673600, + -1379293200, + -1364774400, + -1348448400, + -1333324800, + -1316390400, + -1301270400, + -81432000, + -71110800, + 141264000, + 147222000, + 199756800, + 207702000, + 231292800, + 244249200, + 265507200, + 271033200, + 448243200, + 504918000, + 528253200, + 543978000, + 559702800, + 575427600, + 591152400, + 606877200, + 622602000, + 638326800, + 654656400, + 670381200, + 686106000, + 701830800, + 717555600, + 733280400, + 749005200, + 764730000, + 780454800, + 796179600, + 811904400, + 828234000, + 846378000 + ], + "types": [ + { + "offset": -1276 + }, + { + "offset": 0 + }, + { + "offset": 3600 + }, + { + "offset": 3600 + }, + { + "offset": 7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bd9ad03026ed086f-3d5a919e98fa2787.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bd9ad03026ed086f-3d5a919e98fa2787.json new file mode 100644 index 00000000000000..d28ce5b66fb674 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bd9ad03026ed086f-3d5a919e98fa2787.json @@ -0,0 +1,48 @@ +{ + "ids": [ + "asia/calcutta", + "asia/kolkata" + ], + "tzif": { + "posix": { + "abbr": "IST", + "offset": 19800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 4, + 3, + 4, + 3 + ], + "transitions": [ + -3645237208, + -3155694800, + -2019705670, + -891581400, + -872058600, + -862637400, + -764145000 + ], + "types": [ + { + "offset": 21208 + }, + { + "offset": 21200 + }, + { + "offset": 19270 + }, + { + "offset": 19800 + }, + { + "offset": 23400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bda89ec29d33a428-f6c6f1d38129c153.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bda89ec29d33a428-f6c6f1d38129c153.json new file mode 100644 index 00000000000000..c55b9ea8477839 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bda89ec29d33a428-f6c6f1d38129c153.json @@ -0,0 +1,201 @@ +{ + "ids": [ + "america/montevideo" + ], + "tzif": { + "posix": { + "abbr": "-03", + "offset": -10800, + "transition": null + }, + "transition_types": [ + 0, + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 4, + 2, + 5, + 4, + 2, + 5, + 6, + 2, + 5, + 6, + 2, + 5, + 4, + 2, + 5, + 6, + 2, + 5, + 6, + 2, + 5, + 7, + 4, + 2, + 5, + 6, + 2, + 5, + 6, + 2, + 5, + 6, + 2, + 5, + 6, + 2, + 5, + 6, + 2, + 5, + 6, + 2, + 5, + 6, + 2, + 5, + 6, + 2, + 5, + 6, + 2, + 5, + 6, + 2, + 5, + 6, + 2, + 5, + 6, + 2, + 5, + 6, + 2, + 5, + 6 + ], + "transitions": [ + -1942690509, + -1567455309, + -1459627200, + -1443819600, + -1428006600, + -1412283600, + -1396470600, + -1380747600, + -1141590600, + -1128286800, + -1110141000, + -1096837200, + -1078691400, + -1065387600, + -1047241800, + -1033938000, + -1015187400, + -1002488400, + -983737800, + -971038800, + -954707400, + -938984400, + -920838600, + -907534800, + -896819400, + -853621200, + -845847000, + -334789200, + -319671000, + -314226000, + -309996000, + -149720400, + -134604000, + -50446800, + -34205400, + 9860400, + 14176800, + 72846000, + 80100000, + 127278000, + 132111000, + 147234600, + 156913200, + 165376800, + 219812400, + 226461600, + 250052400, + 257911200, + 282711600, + 289360800, + 294202800, + 322020000, + 566449200, + 573012000, + 597812400, + 605066400, + 625633200, + 635911200, + 656478000, + 667965600, + 688532400, + 699415200, + 719377200, + 730864800, + 1095562800, + 1111896000, + 1128834000, + 1142136000, + 1159678800 + ], + "types": [ + { + "offset": -13491 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + }, + { + "offset": -12600 + }, + { + "offset": -9000 + }, + { + "offset": -10800 + }, + { + "offset": -7200 + }, + { + "offset": -5400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bdc0a1977c311c8d-87860ab499ecadb8.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bdc0a1977c311c8d-87860ab499ecadb8.json new file mode 100644 index 00000000000000..ed275181ee8141 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bdc0a1977c311c8d-87860ab499ecadb8.json @@ -0,0 +1,32 @@ +{ + "ids": [ + "asia/bahrain", + "asia/qatar" + ], + "tzif": { + "posix": { + "abbr": "+03", + "offset": 10800, + "transition": null + }, + "transition_types": [ + 1, + 2 + ], + "transitions": [ + -1577935568, + 76190400 + ], + "types": [ + { + "offset": 12368 + }, + { + "offset": 14400 + }, + { + "offset": 10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bdd491f43b0c1c85-6f9616d7048f0cf9.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bdd491f43b0c1c85-6f9616d7048f0cf9.json new file mode 100644 index 00000000000000..afb43838a28d6d --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-bdd491f43b0c1c85-6f9616d7048f0cf9.json @@ -0,0 +1,47 @@ +{ + "ids": [ + "america/costa_rica" + ], + "tzif": { + "posix": { + "abbr": "CST", + "offset": -21600, + "transition": null + }, + "transition_types": [ + 0, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -2524501427, + -1545071027, + 288770400, + 297234000, + 320220000, + 328683600, + 664264800, + 678344400, + 695714400, + 700635600 + ], + "types": [ + { + "offset": -20173 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-be07532f1af7dccb-7a89363e76463570.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-be07532f1af7dccb-7a89363e76463570.json new file mode 100644 index 00000000000000..14de2aaccd59eb --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-be07532f1af7dccb-7a89363e76463570.json @@ -0,0 +1,116 @@ +{ + "ids": [ + "america/matamoros" + ], + "tzif": { + "posix": { + "abbr": "CST", + "offset": -21600, + "transition": { + "abbr": "CDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -1514743200, + 576057600, + 594198000, + 828864000, + 846399600, + 860313600, + 877849200, + 891763200, + 909298800, + 923212800, + 941353200, + 954662400, + 972802800, + 989136000, + 1001833200, + 1018166400, + 1035702000, + 1049616000, + 1067151600, + 1081065600, + 1099206000, + 1112515200, + 1130655600, + 1143964800, + 1162105200, + 1175414400, + 1193554800, + 1207468800, + 1225004400, + 1238918400, + 1256454000 + ], + "types": [ + { + "offset": -23400 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-be7c1ce9358259b9-87fdd35d13d52495.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-be7c1ce9358259b9-87fdd35d13d52495.json new file mode 100644 index 00000000000000..929688bb8df3c7 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-be7c1ce9358259b9-87fdd35d13d52495.json @@ -0,0 +1,109 @@ +{ + "ids": [ + "america/indiana/vevay" + ], + "tzif": { + "posix": { + "abbr": "EST", + "offset": -18000, + "transition": { + "abbr": "EDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3 + ], + "transitions": [ + -2717647200, + -1633276800, + -1615136400, + -1601827200, + -1583686800, + -880214400, + -769395600, + -765392400, + -495043200, + -21488400, + -5767200, + 9961200, + 25682400, + 41410800, + 57736800, + 73465200, + 89186400, + 1143961200, + 1162101600, + 1173596400, + 1194156000 + ], + "types": [ + { + "offset": -20416 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + }, + { + "offset": -18000 + }, + { + "offset": -14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-be9bc4833f21d33b-2a54484e254d46c8.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-be9bc4833f21d33b-2a54484e254d46c8.json new file mode 100644 index 00000000000000..455c8d3107d2b3 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-be9bc4833f21d33b-2a54484e254d46c8.json @@ -0,0 +1,195 @@ +{ + "ids": [ + "america/cuiaba" + ], + "tzif": { + "posix": { + "abbr": "-04", + "offset": -14400, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2 + ], + "transitions": [ + -1767212140, + -1206954000, + -1191358800, + -1175371200, + -1159822800, + -633816000, + -622065600, + -602280000, + -591829200, + -570744000, + -560206800, + -539121600, + -531349200, + -191361600, + -184194000, + -155160000, + -150066000, + -128894400, + -121122000, + -99950400, + -89586000, + -68414400, + -57963600, + 499752000, + 511239600, + 530596800, + 540270000, + 562132800, + 571201200, + 592977600, + 602046000, + 624427200, + 634705200, + 656481600, + 666759600, + 687931200, + 697604400, + 719985600, + 728449200, + 750830400, + 761713200, + 782280000, + 793162800, + 813729600, + 824007600, + 844574400, + 856062000, + 876110400, + 888721200, + 908078400, + 919566000, + 938923200, + 951620400, + 970977600, + 982465200, + 1003032000, + 1013914800, + 1036296000, + 1045364400, + 1099368000, + 1108868400, + 1129435200, + 1140318000, + 1162699200, + 1172372400, + 1192334400, + 1203217200, + 1224388800, + 1234666800, + 1255838400, + 1266721200, + 1287288000, + 1298170800, + 1318737600, + 1330225200, + 1350792000, + 1361070000, + 1382241600, + 1392519600, + 1413691200, + 1424574000, + 1445140800, + 1456023600, + 1476590400 + ], + "types": [ + { + "offset": -13460 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c0a7b3c45458ac17-adf27c3e51a11cf6.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c0a7b3c45458ac17-adf27c3e51a11cf6.json new file mode 100644 index 00000000000000..f72de4814b2dbd --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c0a7b3c45458ac17-adf27c3e51a11cf6.json @@ -0,0 +1,166 @@ +{ + "ids": [ + "america/argentina/jujuy", + "america/jujuy" + ], + "tzif": { + "posix": { + "abbr": "-03", + "offset": -10800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 2, + 3, + 4, + 2, + 5, + 5, + 3, + 4, + 5, + 3, + 4, + 3, + 4, + 3, + 4, + 5, + 3, + 4 + ], + "transitions": [ + -2372096328, + -1567453392, + -1233432000, + -1222981200, + -1205956800, + -1194037200, + -1172865600, + -1162501200, + -1141329600, + -1130965200, + -1109793600, + -1099429200, + -1078257600, + -1067806800, + -1046635200, + -1036270800, + -1015099200, + -1004734800, + -983563200, + -973198800, + -952027200, + -941576400, + -931032000, + -900882000, + -890337600, + -833749200, + -827265600, + -752274000, + -733780800, + -197326800, + -190843200, + -184194000, + -164491200, + -152658000, + -132955200, + -121122000, + -101419200, + -86821200, + -71092800, + -54766800, + -39038400, + -23317200, + -7588800, + 128142000, + 136605600, + 596948400, + 605066400, + 624423600, + 636516000, + 657086400, + 669178800, + 686721600, + 694231200, + 699415200, + 719377200, + 731469600, + 938919600, + 952052400, + 1198983600, + 1205632800 + ], + "types": [ + { + "offset": -15672 + }, + { + "offset": -15408 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + }, + { + "offset": -10800 + }, + { + "offset": -7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c0d9ca8c12b3167c-34f182f235d9fe88.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c0d9ca8c12b3167c-34f182f235d9fe88.json new file mode 100644 index 00000000000000..636723c475117b --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c0d9ca8c12b3167c-34f182f235d9fe88.json @@ -0,0 +1,43 @@ +{ + "ids": [ + "pacific/rarotonga" + ], + "tzif": { + "posix": { + "abbr": "-10", + "offset": -36000, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 4, + 3 + ], + "transitions": [ + -2209555256, + -543072056, + 279714600, + 289387800, + 309952800 + ], + "types": [ + { + "offset": 48056 + }, + { + "offset": -38344 + }, + { + "offset": -37800 + }, + { + "offset": -34200 + }, + { + "offset": -36000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c0f3e562f1a83b48-46259b3efc2044b4.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c0f3e562f1a83b48-46259b3efc2044b4.json new file mode 100644 index 00000000000000..cdb17c6226c28c --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c0f3e562f1a83b48-46259b3efc2044b4.json @@ -0,0 +1,43 @@ +{ + "ids": [ + "pacific/bougainville" + ], + "tzif": { + "posix": { + "abbr": "+11", + "offset": 39600, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 4 + ], + "transitions": [ + -2840178136, + -2366790512, + -868010400, + -768906000, + 1419696000 + ], + "types": [ + { + "offset": 37336 + }, + { + "offset": 35312 + }, + { + "offset": 36000 + }, + { + "offset": 32400 + }, + { + "offset": 39600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c17291eb667fe274-81f01d3c395654a6.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c17291eb667fe274-81f01d3c395654a6.json new file mode 100644 index 00000000000000..ef8ceee1cb46bf --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c17291eb667fe274-81f01d3c395654a6.json @@ -0,0 +1,106 @@ +{ + "ids": [ + "america/noronha", + "brazil/denoronha" + ], + "tzif": { + "posix": { + "abbr": "-02", + "offset": -7200, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -1767217820, + -1206961200, + -1191366000, + -1175378400, + -1159830000, + -633823200, + -622072800, + -602287200, + -591836400, + -570751200, + -560214000, + -539128800, + -531356400, + -191368800, + -184201200, + -155167200, + -150073200, + -128901600, + -121129200, + -99957600, + -89593200, + -68421600, + -57970800, + 499744800, + 511232400, + 530589600, + 540262800, + 562125600, + 571194000, + 592970400, + 602038800, + 624420000, + 634698000, + 938916000, + 951613200, + 970970400, + 971571600, + 1003024800, + 1013907600 + ], + "types": [ + { + "offset": -7780 + }, + { + "offset": -7200 + }, + { + "offset": -3600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c306ac2cd34a373c-ec50d5ecafac2084.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c306ac2cd34a373c-ec50d5ecafac2084.json new file mode 100644 index 00000000000000..222ab4ad352216 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c306ac2cd34a373c-ec50d5ecafac2084.json @@ -0,0 +1,360 @@ +{ + "ids": [ + "atlantic/azores" + ], + "tzif": { + "posix": { + "abbr": "-01", + "offset": -3600, + "transition": { + "abbr": "+00", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 3600 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 0 + } + } + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 4, + 3, + 2, + 3, + 4, + 3, + 2, + 3, + 4, + 3, + 2, + 3, + 4, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 3, + 5, + 4, + 3, + 5, + 4, + 3, + 5, + 4, + 3, + 5, + 4, + 3, + 5, + 4, + 4, + 3, + 5, + 4, + 3, + 5, + 4, + 3, + 5, + 4, + 3, + 5, + 4, + 3, + 5, + 4, + 3, + 5, + 4, + 3, + 5, + 4, + 6, + 7, + 4, + 6, + 3, + 5, + 4, + 6, + 3, + 5, + 4, + 6, + 3, + 5, + 4, + 6, + 3, + 5 + ], + "transitions": [ + -2713904240, + -1830376800, + -1689548400, + -1677794400, + -1667426400, + -1647730800, + -1635890400, + -1616194800, + -1604354400, + -1584658800, + -1572732000, + -1553036400, + -1541196000, + -1521500400, + -1442444400, + -1427670000, + -1379286000, + -1364770800, + -1348441200, + -1333321200, + -1316386800, + -1301266800, + -1284332400, + -1269817200, + -1221433200, + -1206918000, + -1191193200, + -1175468400, + -1127689200, + -1111964400, + -1096844400, + -1080514800, + -1063580400, + -1049065200, + -1033340400, + -1017615600, + -1002495600, + -986166000, + -969231600, + -950482800, + -942015600, + -922489200, + -906937200, + -891126000, + -877302000, + -873676800, + -864000000, + -857948400, + -845852400, + -842832000, + -831340800, + -825894000, + -814402800, + -810777600, + -799891200, + -794444400, + -782953200, + -779328000, + -768441600, + -762994800, + -749084400, + -733359600, + -717624000, + -701899200, + -686174400, + -670449600, + -654724800, + -639000000, + -623275200, + -607550400, + -591825600, + -575496000, + -559771200, + -544046400, + -528321600, + -512596800, + -496872000, + -481147200, + -465422400, + -449697600, + -433972800, + -417643200, + -401918400, + -386193600, + -370468800, + -354744000, + -339019200, + -323294400, + -307569600, + -291844800, + -276120000, + -260395200, + -244670400, + -228340800, + -212616000, + -196891200, + -181166400, + -165441600, + -149716800, + -133992000, + -118267200, + -102542400, + 386125200, + 401850000, + 417574800, + 433299600, + 449024400, + 465354000, + 481078800, + 496803600, + 504925200, + 512528400, + 528253200, + 543978000, + 559702800, + 575427600, + 591152400, + 606877200, + 622602000, + 638326800, + 654656400, + 670381200, + 686106000, + 701830800, + 717555600, + 725421600, + 733280400, + 740278800, + 749005200, + 764730000, + 780454800, + 796179600, + 811904400, + 828234000, + 846378000 + ], + "types": [ + { + "offset": -6160 + }, + { + "offset": -6872 + }, + { + "offset": -7200 + }, + { + "offset": -3600 + }, + { + "offset": 0 + }, + { + "offset": -3600 + }, + { + "offset": 0 + }, + { + "offset": 3600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c3aa55f145295944-50f38632c531aab8.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c3aa55f145295944-50f38632c531aab8.json new file mode 100644 index 00000000000000..4322314cb2af9f --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c3aa55f145295944-50f38632c531aab8.json @@ -0,0 +1,31 @@ +{ + "ids": [ + "america/cayenne" + ], + "tzif": { + "posix": { + "abbr": "-03", + "offset": -10800, + "transition": null + }, + "transition_types": [ + 1, + 2 + ], + "transitions": [ + -1846269040, + -71092800 + ], + "types": [ + { + "offset": -12560 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c4897a4741bd9e82-aaea1d16ea0a4fb8.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c4897a4741bd9e82-aaea1d16ea0a4fb8.json new file mode 100644 index 00000000000000..cdb9065021843f --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c4897a4741bd9e82-aaea1d16ea0a4fb8.json @@ -0,0 +1,256 @@ +{ + "ids": [ + "america/north_dakota/center" + ], + "tzif": { + "posix": { + "abbr": "CST", + "offset": -21600, + "transition": { + "abbr": "CDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3 + ], + "transitions": [ + -2717643600, + -1633273200, + -1615132800, + -1601823600, + -1583683200, + -880210800, + -769395600, + -765388800, + -84380400, + -68659200, + -52930800, + -37209600, + -21481200, + -5760000, + 9968400, + 25689600, + 41418000, + 57744000, + 73472400, + 89193600, + 104922000, + 120643200, + 126694800, + 152092800, + 162378000, + 183542400, + 199270800, + 215596800, + 230720400, + 247046400, + 262774800, + 278496000, + 294224400, + 309945600, + 325674000, + 341395200, + 357123600, + 372844800, + 388573200, + 404899200, + 420022800, + 436348800, + 452077200, + 467798400, + 483526800, + 499248000, + 514976400, + 530697600, + 544611600, + 562147200, + 576061200, + 594201600, + 607510800, + 625651200, + 638960400, + 657100800, + 671014800, + 688550400, + 702464400, + 720000000, + 733910400, + 752050800, + 765360000, + 783500400, + 796809600, + 814950000, + 828864000, + 846399600, + 860313600, + 877849200, + 891763200, + 909298800, + 923212800, + 941353200, + 954662400, + 972802800, + 986112000, + 1004252400, + 1018166400, + 1035702000, + 1049616000, + 1067151600, + 1081065600, + 1099206000, + 1112515200, + 1130655600, + 1143964800, + 1162105200, + 1173600000, + 1194159600 + ], + "types": [ + { + "offset": -24312 + }, + { + "offset": -25200 + }, + { + "offset": -21600 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c595527c9472a8dc-da82dc08bd3d58a0.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c595527c9472a8dc-da82dc08bd3d58a0.json new file mode 100644 index 00000000000000..12dcab2620334d --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c595527c9472a8dc-da82dc08bd3d58a0.json @@ -0,0 +1,60 @@ +{ + "ids": [ + "australia/perth", + "australia/west" + ], + "tzif": { + "posix": { + "abbr": "AWST", + "offset": 28800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2 + ], + "transitions": [ + -2337925404, + -1672552800, + -1665381600, + -883634400, + -876117600, + -860392800, + -844668000, + 152042400, + 162928800, + 436298400, + 447184800, + 690314400, + 699386400, + 1165082400, + 1174759200, + 1193508000 + ], + "types": [ + { + "offset": 27804 + }, + { + "offset": 28800 + }, + { + "offset": 32400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c6ecc61594d93097-34f668d36b185b09.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c6ecc61594d93097-34f668d36b185b09.json new file mode 100644 index 00000000000000..0cd12c4c6fe54b --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c6ecc61594d93097-34f668d36b185b09.json @@ -0,0 +1,19 @@ +{ + "ids": [ + "etc/gmt-10" + ], + "tzif": { + "posix": { + "abbr": "+10", + "offset": 36000, + "transition": null + }, + "transition_types": [], + "transitions": [], + "types": [ + { + "offset": 36000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c711f11538fdc96f-2563abbbef728ca5.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c711f11538fdc96f-2563abbbef728ca5.json new file mode 100644 index 00000000000000..e5680bd20b18ed --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c711f11538fdc96f-2563abbbef728ca5.json @@ -0,0 +1,194 @@ +{ + "ids": [ + "europe/volgograd" + ], + "tzif": { + "posix": { + "abbr": "MSK", + "offset": 10800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 4, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 2, + 4, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1 + ], + "transitions": [ + -1577761060, + -1247540400, + 354916800, + 370724400, + 386452800, + 402260400, + 417988800, + 433796400, + 449611200, + 465343200, + 481068000, + 496792800, + 512517600, + 528242400, + 543967200, + 559692000, + 575416800, + 575420400, + 591145200, + 606870000, + 622594800, + 638319600, + 654649200, + 670374000, + 701820000, + 701823600, + 717548400, + 733273200, + 748998000, + 764722800, + 780447600, + 796172400, + 811897200, + 828226800, + 846370800, + 859676400, + 877820400, + 891126000, + 909270000, + 922575600, + 941324400, + 954025200, + 972774000, + 985474800, + 1004223600, + 1017529200, + 1035673200, + 1048978800, + 1067122800, + 1080428400, + 1099177200, + 1111878000, + 1130626800, + 1143327600, + 1162076400, + 1174777200, + 1193526000, + 1206831600, + 1224975600, + 1238281200, + 1256425200, + 1269730800, + 1288479600, + 1301180400, + 1414274400, + 1540681200, + 1609020000 + ], + "types": [ + { + "offset": 10660 + }, + { + "offset": 10800 + }, + { + "offset": 14400 + }, + { + "offset": 18000 + }, + { + "offset": 14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c79f46dbe8103377-6f330e5ab7f7dc8e.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c79f46dbe8103377-6f330e5ab7f7dc8e.json new file mode 100644 index 00000000000000..904a9e735a71f6 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c79f46dbe8103377-6f330e5ab7f7dc8e.json @@ -0,0 +1,49 @@ +{ + "ids": [ + "asia/ho_chi_minh", + "asia/saigon" + ], + "tzif": { + "posix": { + "abbr": "+07", + "offset": 25200, + "transition": null + }, + "transition_types": [ + 0, + 1, + 2, + 3, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -2004073590, + -1851577590, + -852105600, + -782643600, + -767869200, + -718095600, + -457772400, + -315648000, + 171820800 + ], + "types": [ + { + "offset": 25590 + }, + { + "offset": 25200 + }, + { + "offset": 28800 + }, + { + "offset": 32400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c7a9617c25e2eb1a-67a9e52b4fa102af.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c7a9617c25e2eb1a-67a9e52b4fa102af.json new file mode 100644 index 00000000000000..35a6d3cb1f88e2 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c7a9617c25e2eb1a-67a9e52b4fa102af.json @@ -0,0 +1,171 @@ +{ + "ids": [ + "america/argentina/la_rioja" + ], + "tzif": { + "posix": { + "abbr": "-03", + "offset": -10800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 2, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 3, + 4, + 3, + 4, + 2, + 3, + 4, + 5, + 3, + 4 + ], + "transitions": [ + -2372095956, + -1567453392, + -1233432000, + -1222981200, + -1205956800, + -1194037200, + -1172865600, + -1162501200, + -1141329600, + -1130965200, + -1109793600, + -1099429200, + -1078257600, + -1067806800, + -1046635200, + -1036270800, + -1015099200, + -1004734800, + -983563200, + -973198800, + -952027200, + -941576400, + -931032000, + -900882000, + -890337600, + -833749200, + -827265600, + -752274000, + -733780800, + -197326800, + -190843200, + -184194000, + -164491200, + -152658000, + -132955200, + -121122000, + -101419200, + -86821200, + -71092800, + -54766800, + -39038400, + -23317200, + -7588800, + 128142000, + 136605600, + 596948400, + 605066400, + 624423600, + 636516000, + 656478000, + 667792800, + 673588800, + 687927600, + 699415200, + 719377200, + 731469600, + 938919600, + 952052400, + 1086058800, + 1087704000, + 1198983600, + 1205632800 + ], + "types": [ + { + "offset": -16044 + }, + { + "offset": -15408 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + }, + { + "offset": -10800 + }, + { + "offset": -7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c7d151e4111f596b-82465a65ac1b9a8e.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c7d151e4111f596b-82465a65ac1b9a8e.json new file mode 100644 index 00000000000000..47a71c27eae291 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c7d151e4111f596b-82465a65ac1b9a8e.json @@ -0,0 +1,19 @@ +{ + "ids": [ + "etc/gmt-4" + ], + "tzif": { + "posix": { + "abbr": "+04", + "offset": 14400, + "transition": null + }, + "transition_types": [], + "transitions": [], + "types": [ + { + "offset": 14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c83537c4365f1258-7426b2a60504f417.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c83537c4365f1258-7426b2a60504f417.json new file mode 100644 index 00000000000000..9c3dd07bf43e5d --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c83537c4365f1258-7426b2a60504f417.json @@ -0,0 +1,19 @@ +{ + "ids": [ + "etc/gmt+10" + ], + "tzif": { + "posix": { + "abbr": "-10", + "offset": -36000, + "transition": null + }, + "transition_types": [], + "transitions": [], + "types": [ + { + "offset": -36000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c841f0aca0404a73-5f8447c455db7736.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c841f0aca0404a73-5f8447c455db7736.json new file mode 100644 index 00000000000000..81b4f0ee059add --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-c841f0aca0404a73-5f8447c455db7736.json @@ -0,0 +1,85 @@ +{ + "ids": [ + "asia/tashkent" + ], + "tzif": { + "posix": { + "abbr": "+05", + "offset": 18000, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 4, + 2, + 4, + 1 + ], + "transitions": [ + -1441168631, + -1247547600, + 354909600, + 370717200, + 386445600, + 402253200, + 417981600, + 433789200, + 449604000, + 465336000, + 481060800, + 496785600, + 512510400, + 528235200, + 543960000, + 559684800, + 575409600, + 591134400, + 606859200, + 622584000, + 638308800, + 654638400, + 670363200, + 670366800, + 686091600 + ], + "types": [ + { + "offset": 16631 + }, + { + "offset": 18000 + }, + { + "offset": 21600 + }, + { + "offset": 25200 + }, + { + "offset": 21600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ca31f6cb7d44b091-6a023a6a71d41a7.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ca31f6cb7d44b091-6a023a6a71d41a7.json new file mode 100644 index 00000000000000..dff38d0eb0d15d --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ca31f6cb7d44b091-6a023a6a71d41a7.json @@ -0,0 +1,391 @@ +{ + "ids": [ + "america/halifax", + "canada/atlantic" + ], + "tzif": { + "posix": { + "abbr": "AST", + "offset": -14400, + "transition": { + "abbr": "ADT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -2131645536, + -1696276800, + -1680469200, + -1632074400, + -1615143600, + -1566763200, + -1557090000, + -1535486400, + -1524949200, + -1504468800, + -1493413200, + -1472414400, + -1461963600, + -1440964800, + -1429390800, + -1409515200, + -1396731600, + -1376856000, + -1366491600, + -1346616000, + -1333832400, + -1313956800, + -1303678800, + -1282507200, + -1272661200, + -1251057600, + -1240088400, + -1219608000, + -1207429200, + -1188763200, + -1175979600, + -1157313600, + -1143925200, + -1124049600, + -1113771600, + -1091390400, + -1081026000, + -1059854400, + -1050786000, + -1030910400, + -1018126800, + -999460800, + -986677200, + -965592000, + -955227600, + -935956800, + -923173200, + -904507200, + -891723600, + -880221600, + -769395600, + -765399600, + -747252000, + -733950000, + -715802400, + -702500400, + -684352800, + -671050800, + -652903200, + -639601200, + -589399200, + -576097200, + -557949600, + -544647600, + -526500000, + -513198000, + -495050400, + -481748400, + -431546400, + -418244400, + -400096800, + -386794800, + -368647200, + -355345200, + -337197600, + -323895600, + -242244000, + -226522800, + -210794400, + -195073200, + -179344800, + -163623600, + -147895200, + -131569200, + -116445600, + -100119600, + -84391200, + -68670000, + -52941600, + -37220400, + -21492000, + -5770800, + 9957600, + 25678800, + 41407200, + 57733200, + 73461600, + 89182800, + 104911200, + 120632400, + 136360800, + 152082000, + 167810400, + 183531600, + 199260000, + 215586000, + 230709600, + 247035600, + 262764000, + 278485200, + 294213600, + 309934800, + 325663200, + 341384400, + 357112800, + 372834000, + 388562400, + 404888400, + 420012000, + 436338000, + 452066400, + 467787600, + 483516000, + 499237200, + 514965600, + 530686800, + 544600800, + 562136400, + 576050400, + 594190800, + 607500000, + 625640400, + 638949600, + 657090000, + 671004000, + 688539600, + 702453600, + 719989200, + 733903200, + 752043600, + 765352800, + 783493200, + 796802400, + 814942800, + 828856800, + 846392400, + 860306400, + 877842000, + 891756000, + 909291600, + 923205600, + 941346000, + 954655200, + 972795600, + 986104800, + 1004245200, + 1018159200, + 1035694800, + 1049608800, + 1067144400, + 1081058400, + 1099198800, + 1112508000, + 1130648400, + 1143957600, + 1162098000, + 1173592800, + 1194152400 + ], + "types": [ + { + "offset": -15264 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-cab5fb5bf9e7625f-4aaae2f823b6e6c9.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-cab5fb5bf9e7625f-4aaae2f823b6e6c9.json new file mode 100644 index 00000000000000..6650631a048760 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-cab5fb5bf9e7625f-4aaae2f823b6e6c9.json @@ -0,0 +1,228 @@ +{ + "ids": [ + "australia/adelaide", + "australia/south" + ], + "tzif": { + "posix": { + "abbr": "ACST", + "offset": 34200, + "transition": { + "abbr": "ACDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 4, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 1, + 0 + ] + }, + "time": 10800 + } + } + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3 + ], + "transitions": [ + -2364110060, + -2230189200, + -1672558200, + -1665387000, + -883639800, + -876123000, + -860398200, + -844673400, + -828343800, + -813223800, + 57688200, + 67969800, + 89137800, + 100024200, + 120587400, + 131473800, + 152037000, + 162923400, + 183486600, + 194977800, + 215541000, + 226427400, + 246990600, + 257877000, + 278440200, + 289326600, + 309889800, + 320776200, + 341339400, + 352225800, + 372789000, + 384280200, + 404843400, + 415729800, + 436293000, + 447179400, + 467742600, + 478629000, + 499192200, + 511288200, + 530037000, + 542737800, + 562091400, + 574792200, + 594145800, + 606241800, + 625595400, + 637691400, + 657045000, + 667931400, + 688494600, + 701195400, + 719944200, + 731435400, + 751998600, + 764094600, + 783448200, + 796149000, + 814897800, + 828203400, + 846347400, + 859653000, + 877797000, + 891102600, + 909246600, + 922552200, + 941301000, + 954001800, + 972750600, + 985451400, + 1004200200, + 1017505800, + 1035649800, + 1048955400, + 1067099400, + 1080405000, + 1099153800, + 1111854600, + 1130603400, + 1143909000, + 1162053000, + 1174753800, + 1193502600, + 1207413000, + 1223137800 + ], + "types": [ + { + "offset": 33260 + }, + { + "offset": 32400 + }, + { + "offset": 34200 + }, + { + "offset": 37800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-cad03994b9f9755d-786401d28559cef.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-cad03994b9f9755d-786401d28559cef.json new file mode 100644 index 00000000000000..e3bec085baa6ab --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-cad03994b9f9755d-786401d28559cef.json @@ -0,0 +1,54 @@ +{ + "ids": [ + "pacific/kosrae" + ], + "tzif": { + "posix": { + "abbr": "+11", + "offset": 39600, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 4, + 3, + 2, + 5, + 2 + ], + "transitions": [ + -3944631116, + -2177491916, + -1743678000, + -1606813200, + -1041418800, + -907408800, + -770634000, + -7988400, + 915105600 + ], + "types": [ + { + "offset": -47284 + }, + { + "offset": 39116 + }, + { + "offset": 39600 + }, + { + "offset": 32400 + }, + { + "offset": 36000 + }, + { + "offset": 43200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-cb2104a4192b82ba-ddba0d84d8ea7d92.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-cb2104a4192b82ba-ddba0d84d8ea7d92.json new file mode 100644 index 00000000000000..8bb2c20f4c09b5 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-cb2104a4192b82ba-ddba0d84d8ea7d92.json @@ -0,0 +1,31 @@ +{ + "ids": [ + "asia/kabul" + ], + "tzif": { + "posix": { + "abbr": "+0430", + "offset": 16200, + "transition": null + }, + "transition_types": [ + 1, + 2 + ], + "transitions": [ + -2524538208, + -788932800 + ], + "types": [ + { + "offset": 16608 + }, + { + "offset": 14400 + }, + { + "offset": 16200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-cb56ff55ea32bb92-c654a08c059dae2e.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-cb56ff55ea32bb92-c654a08c059dae2e.json new file mode 100644 index 00000000000000..f0d09903ef5ca1 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-cb56ff55ea32bb92-c654a08c059dae2e.json @@ -0,0 +1,49 @@ +{ + "ids": [ + "asia/pontianak" + ], + "tzif": { + "posix": { + "abbr": "WIB", + "offset": 25200, + "transition": null + }, + "transition_types": [ + 0, + 1, + 2, + 1, + 3, + 1, + 3, + 4 + ], + "transitions": [ + -1946186240, + -1172906240, + -881220600, + -766054800, + -683883000, + -620812800, + -189415800, + 567964800 + ], + "types": [ + { + "offset": 26240 + }, + { + "offset": 27000 + }, + { + "offset": 32400 + }, + { + "offset": 28800 + }, + { + "offset": 25200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-cbcf966225780b1c-8a7f4b3e40c1b2d5.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-cbcf966225780b1c-8a7f4b3e40c1b2d5.json new file mode 100644 index 00000000000000..37dbc6ca9cc4da --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-cbcf966225780b1c-8a7f4b3e40c1b2d5.json @@ -0,0 +1,562 @@ +{ + "ids": [ + "asia/hebron" + ], + "tzif": { + "posix": { + "abbr": "EET", + "offset": 7200, + "transition": { + "abbr": "EEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 4, + 6 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 4, + 6 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -2185410023, + -933638400, + -923097600, + -919036800, + -857347200, + -844300800, + -825811200, + -812678400, + -794188800, + -779846400, + -762652800, + -748310400, + -731116800, + -399088800, + -386650800, + -368330400, + -355114800, + -336790800, + -323654400, + -305168400, + -292032000, + -273632400, + -260496000, + -242096400, + -228960000, + -210560400, + -197424000, + -178938000, + -165801600, + -147402000, + -134265600, + -115866000, + -102643200, + -84330000, + -81313200, + 142380000, + 150843600, + 167176800, + 178664400, + 334101600, + 337730400, + 452642400, + 462319200, + 482277600, + 494370000, + 516751200, + 526424400, + 545436000, + 558478800, + 576626400, + 589323600, + 609890400, + 620773200, + 638316000, + 651618000, + 669765600, + 683672400, + 701820000, + 715726800, + 733701600, + 747176400, + 765151200, + 778021200, + 796600800, + 810075600, + 820447200, + 828655200, + 843170400, + 860104800, + 874620000, + 891554400, + 906069600, + 924213600, + 939934800, + 956268000, + 971989200, + 987717600, + 1003438800, + 1019167200, + 1034888400, + 1050616800, + 1066338000, + 1082066400, + 1096581600, + 1113516000, + 1128380400, + 1143842400, + 1158872400, + 1175378400, + 1189638000, + 1206655200, + 1220216400, + 1238104800, + 1252015200, + 1269554400, + 1281474000, + 1301608860, + 1312146000, + 1314655200, + 1317330000, + 1333058400, + 1348178400, + 1364508000, + 1380229200, + 1395957600, + 1414098000, + 1427493600, + 1445551200, + 1458946800, + 1477692000, + 1490396400, + 1509141600, + 1521846000, + 1540591200, + 1553810400, + 1572037200, + 1585346400, + 1603490400, + 1616796000, + 1635458400, + 1648332000, + 1666998000, + 1682726400, + 1698447600, + 1713571200, + 1729897200, + 1744416000, + 1761346800, + 1774656000, + 1792796400, + 1806105600, + 1824850800, + 1837555200, + 1856300400, + 1869004800, + 1887750000, + 1901059200, + 1919199600, + 1932508800, + 1950649200, + 1963958400, + 1982703600, + 1995408000, + 2014153200, + 2026857600, + 2045602800, + 2058307200, + 2077052400, + 2090361600, + 2107897200, + 2121811200, + 2138742000, + 2153260800, + 2168982000, + 2184710400, + 2199826800, + 2216160000, + 2230066800, + 2234304000, + 2234905200, + 2248214400, + 2260911600, + 2264544000, + 2266354800, + 2279664000, + 2291756400, + 2295388800, + 2297804400, + 2311113600, + 2321996400, + 2326233600, + 2329254000, + 2342563200, + 2352841200, + 2356473600, + 2361308400, + 2374012800, + 2383686000, + 2387318400, + 2392758000, + 2405462400, + 2413926000, + 2418163200, + 2424207600, + 2437516800, + 2444770800, + 2448403200, + 2455657200, + 2468966400, + 2475010800, + 2479248000, + 2487106800, + 2500416000, + 2505855600, + 2509488000, + 2519161200, + 2531865600, + 2536700400, + 2540332800, + 2550610800, + 2563315200, + 2566940400, + 2571177600, + 2582060400, + 2595369600, + 2597785200, + 2601417600, + 2613510000, + 2626819200, + 2628025200, + 2632262400, + 2644959600, + 2658268800, + 2658870000, + 2663107200, + 2676409200, + 2693347200, + 2708463600, + 2724192000, + 2739913200, + 2754432000, + 2771362800, + 2785276800, + 2802812400, + 2816121600, + 2834262000, + 2847571200, + 2866316400, + 2879020800, + 2897766000, + 2910470400, + 2929215600, + 2941920000, + 2960665200, + 2973974400, + 2992114800, + 3005424000, + 3023564400, + 3036873600, + 3055618800, + 3068323200, + 3087068400, + 3099772800, + 3117913200, + 3131827200, + 3148758000, + 3163276800, + 3179602800, + 3194726400, + 3209842800, + 3226176000, + 3240687600, + 3244320000, + 3244921200 + ], + "types": [ + { + "offset": 8423 + }, + { + "offset": 7200 + }, + { + "offset": 10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-cbf2a88472b0862a-de6f37d8951e33ce.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-cbf2a88472b0862a-de6f37d8951e33ce.json new file mode 100644 index 00000000000000..b4485aa08df243 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-cbf2a88472b0862a-de6f37d8951e33ce.json @@ -0,0 +1,128 @@ +{ + "ids": [ + "asia/choibalsan", + "asia/ulaanbaatar", + "asia/ulan_bator" + ], + "tzif": { + "posix": { + "abbr": "+08", + "offset": 28800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2 + ], + "transitions": [ + -2032931252, + 252435600, + 417974400, + 433782000, + 449596800, + 465318000, + 481046400, + 496767600, + 512496000, + 528217200, + 543945600, + 559666800, + 575395200, + 591116400, + 606844800, + 622566000, + 638294400, + 654620400, + 670348800, + 686070000, + 701798400, + 717519600, + 733248000, + 748969200, + 764697600, + 780418800, + 796147200, + 811868400, + 828201600, + 843922800, + 859651200, + 875372400, + 891100800, + 906822000, + 988394400, + 1001696400, + 1017424800, + 1033146000, + 1048874400, + 1064595600, + 1080324000, + 1096045200, + 1111773600, + 1127494800, + 1143223200, + 1159549200, + 1427479200, + 1443193200 + ], + "types": [ + { + "offset": 25652 + }, + { + "offset": 25200 + }, + { + "offset": 28800 + }, + { + "offset": 32400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-cd29e561a284f373-1b38f7643a89adc3.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-cd29e561a284f373-1b38f7643a89adc3.json new file mode 100644 index 00000000000000..ebe9fbb9825922 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-cd29e561a284f373-1b38f7643a89adc3.json @@ -0,0 +1,19 @@ +{ + "ids": [ + "etc/gmt-2" + ], + "tzif": { + "posix": { + "abbr": "+02", + "offset": 7200, + "transition": null + }, + "transition_types": [], + "transitions": [], + "types": [ + { + "offset": 7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ce5eb7cf8993261f-bdd600c9c7fb16d5.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ce5eb7cf8993261f-bdd600c9c7fb16d5.json new file mode 100644 index 00000000000000..77e74376c00a3a --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ce5eb7cf8993261f-bdd600c9c7fb16d5.json @@ -0,0 +1,198 @@ +{ + "ids": [ + "europe/riga" + ], + "tzif": { + "posix": { + "abbr": "EET", + "offset": 7200, + "transition": { + "abbr": "EEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 14400 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 10800 + } + } + }, + "transition_types": [ + 0, + 1, + 0, + 1, + 0, + 2, + 3, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 5, + 3, + 6, + 3, + 6, + 3, + 6, + 3, + 6, + 3, + 6, + 3, + 6, + 3, + 6, + 3, + 6, + 3, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4 + ], + "transitions": [ + -2840146594, + -1632008194, + -1618702594, + -1601681794, + -1597275394, + -1377308194, + -928029600, + -899521200, + -857257200, + -844556400, + -828226800, + -812502000, + -796777200, + -795834000, + 354920400, + 370728000, + 386456400, + 402264000, + 417992400, + 433800000, + 449614800, + 465346800, + 481071600, + 496796400, + 512521200, + 528246000, + 543970800, + 559695600, + 575420400, + 591145200, + 606870000, + 622598400, + 638323200, + 654652800, + 670377600, + 686102400, + 701827200, + 717552000, + 733276800, + 749001600, + 764726400, + 780451200, + 796176000, + 811900800, + 828230400, + 843955200, + 859683600, + 877827600, + 891133200, + 909277200, + 922582800, + 941331600 + ], + "types": [ + { + "offset": 5794 + }, + { + "offset": 9394 + }, + { + "offset": 7200 + }, + { + "offset": 10800 + }, + { + "offset": 7200 + }, + { + "offset": 3600 + }, + { + "offset": 14400 + }, + { + "offset": 10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ce802c28d3beb1b-5157362aadd9dd29.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ce802c28d3beb1b-5157362aadd9dd29.json new file mode 100644 index 00000000000000..baf1c8b2a1746e --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ce802c28d3beb1b-5157362aadd9dd29.json @@ -0,0 +1,388 @@ +{ + "ids": [ + "america/santiago", + "chile/continental" + ], + "tzif": { + "posix": { + "abbr": "-04", + "offset": -14400, + "transition": { + "abbr": "-03", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 4, + 1, + 0 + ] + }, + "time": 0 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 9, + 1, + 0 + ] + }, + "time": 0 + } + } + }, + "transition_types": [ + 0, + 1, + 0, + 2, + 0, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 4, + 2, + 3, + 1, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4 + ], + "transitions": [ + -2524504635, + -1892661435, + -1688410800, + -1619205435, + -1593806400, + -1335986235, + -1335985200, + -1317585600, + -1304362800, + -1286049600, + -1272826800, + -1254513600, + -1241290800, + -1222977600, + -1209754800, + -1191355200, + -1178132400, + -870552000, + -865278000, + -740520000, + -736635600, + -718056000, + -713649600, + -36619200, + -23922000, + -3355200, + 7527600, + 24465600, + 37767600, + 55915200, + 69217200, + 87969600, + 100666800, + 118209600, + 132116400, + 150868800, + 163566000, + 182318400, + 195620400, + 213768000, + 227070000, + 245217600, + 258519600, + 277272000, + 289969200, + 308721600, + 321418800, + 340171200, + 353473200, + 371620800, + 384922800, + 403070400, + 416372400, + 434520000, + 447822000, + 466574400, + 479271600, + 498024000, + 510721200, + 529473600, + 545194800, + 560923200, + 574225200, + 592372800, + 605674800, + 624427200, + 637124400, + 653457600, + 668574000, + 687326400, + 700628400, + 718776000, + 732078000, + 750225600, + 763527600, + 781675200, + 794977200, + 813729600, + 826426800, + 845179200, + 859690800, + 876628800, + 889930800, + 906868800, + 923194800, + 939528000, + 952830000, + 971582400, + 984279600, + 1003032000, + 1015729200, + 1034481600, + 1047178800, + 1065931200, + 1079233200, + 1097380800, + 1110682800, + 1128830400, + 1142132400, + 1160884800, + 1173582000, + 1192334400, + 1206846000, + 1223784000, + 1237086000, + 1255233600, + 1270350000, + 1286683200, + 1304823600, + 1313899200, + 1335668400, + 1346558400, + 1367118000, + 1378612800, + 1398567600, + 1410062400, + 1463281200, + 1471147200, + 1494730800, + 1502596800, + 1526180400, + 1534046400, + 1554606000, + 1567915200, + 1586055600, + 1599364800, + 1617505200, + 1630814400, + 1648954800, + 1662868800, + 1680404400, + 1693713600 + ], + "types": [ + { + "offset": -16965 + }, + { + "offset": -18000 + }, + { + "offset": -14400 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-cec2538008230fcd-486e4621268a0834.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-cec2538008230fcd-486e4621268a0834.json new file mode 100644 index 00000000000000..fa7637e5e7d946 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-cec2538008230fcd-486e4621268a0834.json @@ -0,0 +1,214 @@ +{ + "ids": [ + "america/grand_turk" + ], + "tzif": { + "posix": { + "abbr": "EST", + "offset": -18000, + "transition": { + "abbr": "EDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 4, + 3, + 4 + ], + "transitions": [ + -2524504528, + -1827687170, + 294217200, + 309938400, + 325666800, + 341388000, + 357116400, + 372837600, + 388566000, + 404892000, + 420015600, + 436341600, + 452070000, + 467791200, + 483519600, + 499240800, + 514969200, + 530690400, + 544604400, + 562140000, + 576054000, + 594194400, + 607503600, + 625644000, + 638953200, + 657093600, + 671007600, + 688543200, + 702457200, + 719992800, + 733906800, + 752047200, + 765356400, + 783496800, + 796806000, + 814946400, + 828860400, + 846396000, + 860310000, + 877845600, + 891759600, + 909295200, + 923209200, + 941349600, + 954658800, + 972799200, + 986108400, + 1004248800, + 1018162800, + 1035698400, + 1049612400, + 1067148000, + 1081062000, + 1099202400, + 1112511600, + 1130652000, + 1143961200, + 1162101600, + 1173596400, + 1194156000, + 1205046000, + 1225605600, + 1236495600, + 1257055200, + 1268550000, + 1289109600, + 1299999600, + 1320559200, + 1331449200, + 1352008800, + 1362898800, + 1383458400, + 1394348400, + 1414908000, + 1425798000, + 1520751600 + ], + "types": [ + { + "offset": -17072 + }, + { + "offset": -18430 + }, + { + "offset": -18000 + }, + { + "offset": -14400 + }, + { + "offset": -14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-d1e4208290566f2f-8b7418c65c288188.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-d1e4208290566f2f-8b7418c65c288188.json new file mode 100644 index 00000000000000..8247bc06e46d45 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-d1e4208290566f2f-8b7418c65c288188.json @@ -0,0 +1,19 @@ +{ + "ids": [ + "etc/gmt+4" + ], + "tzif": { + "posix": { + "abbr": "-04", + "offset": -14400, + "transition": null + }, + "transition_types": [], + "transitions": [], + "types": [ + { + "offset": -14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-d28e0bb7485a8522-9d5ad01d4999d0c7.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-d28e0bb7485a8522-9d5ad01d4999d0c7.json new file mode 100644 index 00000000000000..859b8dc2665dbb --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-d28e0bb7485a8522-9d5ad01d4999d0c7.json @@ -0,0 +1,274 @@ +{ + "ids": [ + "america/havana", + "cuba" + ], + "tzif": { + "posix": { + "abbr": "CST", + "offset": -18000, + "transition": { + "abbr": "CDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 0 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 3600 + } + } + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2 + ], + "transitions": [ + -2524501832, + -1402813824, + -1311534000, + -1300996800, + -933534000, + -925675200, + -902084400, + -893620800, + -870030000, + -862171200, + -775681200, + -767822400, + -744231600, + -736372800, + -144702000, + -134251200, + -113425200, + -102542400, + -86295600, + -72907200, + -54154800, + -41457600, + -21495600, + -5774400, + 9954000, + 25675200, + 41403600, + 57729600, + 73458000, + 87364800, + 104907600, + 118900800, + 136357200, + 150436800, + 167806800, + 183528000, + 199256400, + 215582400, + 230706000, + 247032000, + 263365200, + 276667200, + 290581200, + 308721600, + 322030800, + 340171200, + 358318800, + 371620800, + 389768400, + 403070400, + 421218000, + 434520000, + 452667600, + 466574400, + 484117200, + 498024000, + 511333200, + 529473600, + 542782800, + 560923200, + 574837200, + 592372800, + 606286800, + 623822400, + 638946000, + 655876800, + 671000400, + 687330000, + 702450000, + 718779600, + 733899600, + 750229200, + 765349200, + 781678800, + 796798800, + 813128400, + 828853200, + 844578000, + 860302800, + 876632400, + 891147600, + 909291600, + 922597200, + 941346000, + 954651600, + 972795600, + 986101200, + 1004245200, + 1018155600, + 1035694800, + 1049605200, + 1067144400, + 1080450000, + 1162098000, + 1173589200, + 1193547600, + 1205643600, + 1224997200, + 1236488400, + 1256446800, + 1268542800, + 1288501200, + 1300597200, + 1321160400, + 1333256400, + 1352005200, + 1362891600, + 1383454800 + ], + "types": [ + { + "offset": -19768 + }, + { + "offset": -19776 + }, + { + "offset": -18000 + }, + { + "offset": -14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-d3201ec4e70c92f3-5814e30a4cc908b9.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-d3201ec4e70c92f3-5814e30a4cc908b9.json new file mode 100644 index 00000000000000..83693cfce9a908 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-d3201ec4e70c92f3-5814e30a4cc908b9.json @@ -0,0 +1,203 @@ +{ + "ids": [ + "asia/khandyga" + ], + "tzif": { + "posix": { + "abbr": "+09", + "offset": 32400, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 4, + 2, + 4, + 1, + 3, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 5, + 6, + 3, + 5, + 6, + 3, + 5, + 6, + 3, + 5, + 6, + 3, + 5, + 6, + 3, + 5, + 6, + 3, + 5, + 6, + 3, + 5, + 6, + 7, + 3, + 5, + 2, + 4 + ], + "transitions": [ + -1579424533, + -1247558400, + 354898800, + 370706400, + 386434800, + 402242400, + 417970800, + 433778400, + 449593200, + 465325200, + 481050000, + 496774800, + 512499600, + 528224400, + 543949200, + 559674000, + 575398800, + 591123600, + 606848400, + 622573200, + 638298000, + 654627600, + 670352400, + 670356000, + 686080800, + 695757600, + 701802000, + 717526800, + 733251600, + 748976400, + 764701200, + 780426000, + 796150800, + 811875600, + 828205200, + 846349200, + 859654800, + 877798800, + 891104400, + 909248400, + 922554000, + 941302800, + 954003600, + 972752400, + 985453200, + 1004202000, + 1017507600, + 1035651600, + 1048957200, + 1067101200, + 1072882800, + 1080403200, + 1099152000, + 1111852800, + 1130601600, + 1143302400, + 1162051200, + 1174752000, + 1193500800, + 1206806400, + 1224950400, + 1238256000, + 1256400000, + 1269705600, + 1288454400, + 1301155200, + 1315832400, + 1414252800 + ], + "types": [ + { + "offset": 32533 + }, + { + "offset": 28800 + }, + { + "offset": 32400 + }, + { + "offset": 36000 + }, + { + "offset": 32400 + }, + { + "offset": 36000 + }, + { + "offset": 39600 + }, + { + "offset": 39600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-d41aa71f743154ff-cd47b010d657ac37.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-d41aa71f743154ff-cd47b010d657ac37.json new file mode 100644 index 00000000000000..a59edb7a3e41a1 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-d41aa71f743154ff-cd47b010d657ac37.json @@ -0,0 +1,223 @@ +{ + "ids": [ + "asia/anadyr" + ], + "tzif": { + "posix": { + "abbr": "+12", + "offset": 43200, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 1, + 5, + 1, + 5, + 6, + 2, + 4, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 6, + 1, + 5, + 6, + 1, + 5 + ], + "transitions": [ + -1441194596, + -1247572800, + 354884400, + 370692000, + 386420400, + 386424000, + 402231600, + 417960000, + 433767600, + 449582400, + 465314400, + 481039200, + 496764000, + 512488800, + 528213600, + 543938400, + 559663200, + 575388000, + 591112800, + 606837600, + 622562400, + 638287200, + 654616800, + 670341600, + 670345200, + 686070000, + 695746800, + 701791200, + 717516000, + 733240800, + 748965600, + 764690400, + 780415200, + 796140000, + 811864800, + 828194400, + 846338400, + 859644000, + 877788000, + 891093600, + 909237600, + 922543200, + 941292000, + 953992800, + 972741600, + 985442400, + 1004191200, + 1017496800, + 1035640800, + 1048946400, + 1067090400, + 1080396000, + 1099144800, + 1111845600, + 1130594400, + 1143295200, + 1162044000, + 1174744800, + 1193493600, + 1206799200, + 1224943200, + 1238248800, + 1256392800, + 1269698400, + 1269702000, + 1288450800, + 1301151600 + ], + "types": [ + { + "offset": 42596 + }, + { + "offset": 43200 + }, + { + "offset": 46800 + }, + { + "offset": 50400 + }, + { + "offset": 46800 + }, + { + "offset": 43200 + }, + { + "offset": 39600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-d4999f54d6ffa1ff-bdc2dfc5a5de1f94.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-d4999f54d6ffa1ff-bdc2dfc5a5de1f94.json new file mode 100644 index 00000000000000..d4108f93d6367e --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-d4999f54d6ffa1ff-bdc2dfc5a5de1f94.json @@ -0,0 +1,260 @@ +{ + "ids": [ + "america/anchorage", + "us/alaska" + ], + "tzif": { + "posix": { + "abbr": "AKST", + "offset": -32400, + "transition": { + "abbr": "AKDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 3, + 3, + 2, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 3, + 4, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4 + ], + "transitions": [ + -3225223727, + -2188951224, + -880200000, + -769395600, + -765378000, + -86882400, + -21470400, + -5749200, + 9979200, + 25700400, + 41428800, + 57754800, + 73483200, + 89204400, + 104932800, + 120654000, + 126705600, + 152103600, + 162388800, + 183553200, + 199281600, + 215607600, + 230731200, + 247057200, + 262785600, + 278506800, + 294235200, + 309956400, + 325684800, + 341406000, + 357134400, + 372855600, + 388584000, + 404910000, + 420033600, + 436359600, + 439030800, + 452084400, + 467805600, + 483534000, + 499255200, + 514983600, + 530704800, + 544618800, + 562154400, + 576068400, + 594208800, + 607518000, + 625658400, + 638967600, + 657108000, + 671022000, + 688557600, + 702471600, + 720007200, + 733921200, + 752061600, + 765370800, + 783511200, + 796820400, + 814960800, + 828874800, + 846410400, + 860324400, + 877860000, + 891774000, + 909309600, + 923223600, + 941364000, + 954673200, + 972813600, + 986122800, + 1004263200, + 1018177200, + 1035712800, + 1049626800, + 1067162400, + 1081076400, + 1099216800, + 1112526000, + 1130666400, + 1143975600, + 1162116000, + 1173610800, + 1194170400 + ], + "types": [ + { + "offset": 50424 + }, + { + "offset": -35976 + }, + { + "offset": -36000 + }, + { + "offset": -32400 + }, + { + "offset": -32400 + }, + { + "offset": -28800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-d7daa3dddb990290-2188fa690fb895b7.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-d7daa3dddb990290-2188fa690fb895b7.json new file mode 100644 index 00000000000000..170d93d61ce040 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-d7daa3dddb990290-2188fa690fb895b7.json @@ -0,0 +1,243 @@ +{ + "ids": [ + "europe/simferopol" + ], + "tzif": { + "posix": { + "abbr": "MSK", + "offset": 10800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 4, + 5, + 2, + 4, + 5, + 2, + 4, + 3, + 6, + 3, + 6, + 3, + 6, + 3, + 6, + 3, + 6, + 3, + 6, + 3, + 6, + 3, + 6, + 3, + 6, + 3, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 6, + 3, + 7, + 6, + 3, + 7, + 6, + 3, + 7, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 3, + 7, + 2, + 4, + 6, + 8, + 3, + 7 + ], + "transitions": [ + -2840148984, + -1441160160, + -1247536800, + -888894000, + -857257200, + -844556400, + -828226800, + -812502000, + -811648800, + 354920400, + 370728000, + 386456400, + 402264000, + 417992400, + 433800000, + 449614800, + 465346800, + 481071600, + 496796400, + 512521200, + 528246000, + 543970800, + 559695600, + 575420400, + 591145200, + 606870000, + 622594800, + 646786800, + 701042400, + 717552000, + 733276800, + 749001600, + 764726400, + 767739600, + 780447600, + 796172400, + 811897200, + 828219600, + 846374400, + 859683600, + 877827600, + 891133200, + 909277200, + 922582800, + 941331600, + 954032400, + 972781200, + 985482000, + 1004230800, + 1017536400, + 1035680400, + 1048986000, + 1067130000, + 1080435600, + 1099184400, + 1111885200, + 1130634000, + 1143334800, + 1162083600, + 1174784400, + 1193533200, + 1206838800, + 1224982800, + 1238288400, + 1256432400, + 1269738000, + 1288486800, + 1301187600, + 1319936400, + 1332637200, + 1351386000, + 1364691600, + 1382835600, + 1396137600, + 1414274400 + ], + "types": [ + { + "offset": 8184 + }, + { + "offset": 8160 + }, + { + "offset": 7200 + }, + { + "offset": 10800 + }, + { + "offset": 7200 + }, + { + "offset": 3600 + }, + { + "offset": 14400 + }, + { + "offset": 10800 + }, + { + "offset": 14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-daeed2898ecd770c-894d1d81ca85ba4d.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-daeed2898ecd770c-894d1d81ca85ba4d.json new file mode 100644 index 00000000000000..a39e96bdd4b78d --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-daeed2898ecd770c-894d1d81ca85ba4d.json @@ -0,0 +1,324 @@ +{ + "ids": [ + "chile/easterisland", + "pacific/easter" + ], + "tzif": { + "posix": { + "abbr": "-06", + "offset": -21600, + "transition": { + "abbr": "-05", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 4, + 1, + 0 + ] + }, + "time": -7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 9, + 1, + 0 + ] + }, + "time": -7200 + } + } + }, + "transition_types": [ + 0, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4 + ], + "transitions": [ + -2524495352, + -1178124152, + -36619200, + -23922000, + -3355200, + 7527600, + 24465600, + 37767600, + 55915200, + 69217200, + 87969600, + 100666800, + 118209600, + 132116400, + 150868800, + 163566000, + 182318400, + 195620400, + 213768000, + 227070000, + 245217600, + 258519600, + 277272000, + 289969200, + 308721600, + 321418800, + 340171200, + 353473200, + 371620800, + 384922800, + 403070400, + 416372400, + 434520000, + 447822000, + 466574400, + 479271600, + 498024000, + 510721200, + 529473600, + 545194800, + 560923200, + 574225200, + 592372800, + 605674800, + 624427200, + 637124400, + 653457600, + 668574000, + 687326400, + 700628400, + 718776000, + 732078000, + 750225600, + 763527600, + 781675200, + 794977200, + 813729600, + 826426800, + 845179200, + 859690800, + 876628800, + 889930800, + 906868800, + 923194800, + 939528000, + 952830000, + 971582400, + 984279600, + 1003032000, + 1015729200, + 1034481600, + 1047178800, + 1065931200, + 1079233200, + 1097380800, + 1110682800, + 1128830400, + 1142132400, + 1160884800, + 1173582000, + 1192334400, + 1206846000, + 1223784000, + 1237086000, + 1255233600, + 1270350000, + 1286683200, + 1304823600, + 1313899200, + 1335668400, + 1346558400, + 1367118000, + 1378612800, + 1398567600, + 1410062400, + 1463281200, + 1471147200, + 1494730800, + 1502596800, + 1526180400, + 1534046400, + 1554606000, + 1567915200, + 1586055600, + 1599364800, + 1617505200, + 1630814400, + 1648954800, + 1662868800, + 1680404400, + 1693713600 + ], + "types": [ + { + "offset": -26248 + }, + { + "offset": -25200 + }, + { + "offset": -21600 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-dbf1c543882cf4b7-2ee5fc1eb7933ea5.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-dbf1c543882cf4b7-2ee5fc1eb7933ea5.json new file mode 100644 index 00000000000000..b23e96d09caf46 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-dbf1c543882cf4b7-2ee5fc1eb7933ea5.json @@ -0,0 +1,222 @@ +{ + "ids": [ + "europe/ulyanovsk" + ], + "tzif": { + "posix": { + "abbr": "+04", + "offset": 14400, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 4, + 2, + 4, + 1, + 2, + 4, + 1, + 1, + 5, + 1, + 5, + 6, + 2, + 4, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4, + 1, + 5, + 2, + 4 + ], + "transitions": [ + -1593820800, + -1247540400, + 354916800, + 370724400, + 386452800, + 402260400, + 417988800, + 433796400, + 449611200, + 465343200, + 481068000, + 496792800, + 512517600, + 528242400, + 543967200, + 559692000, + 575416800, + 591141600, + 606866400, + 606870000, + 622594800, + 638319600, + 654649200, + 670374000, + 670377600, + 686102400, + 695779200, + 701823600, + 717548400, + 733273200, + 748998000, + 764722800, + 780447600, + 796172400, + 811897200, + 828226800, + 846370800, + 859676400, + 877820400, + 891126000, + 909270000, + 922575600, + 941324400, + 954025200, + 972774000, + 985474800, + 1004223600, + 1017529200, + 1035673200, + 1048978800, + 1067122800, + 1080428400, + 1099177200, + 1111878000, + 1130626800, + 1143327600, + 1162076400, + 1174777200, + 1193526000, + 1206831600, + 1224975600, + 1238281200, + 1256425200, + 1269730800, + 1288479600, + 1301180400, + 1414274400, + 1459033200 + ], + "types": [ + { + "offset": 11616 + }, + { + "offset": 10800 + }, + { + "offset": 14400 + }, + { + "offset": 18000 + }, + { + "offset": 14400 + }, + { + "offset": 10800 + }, + { + "offset": 7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-dc6b1be48367c4f1-5f1fbe94f0718a6a.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-dc6b1be48367c4f1-5f1fbe94f0718a6a.json new file mode 100644 index 00000000000000..999a3c83fe93b9 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-dc6b1be48367c4f1-5f1fbe94f0718a6a.json @@ -0,0 +1,256 @@ +{ + "ids": [ + "europe/kaliningrad" + ], + "tzif": { + "posix": { + "abbr": "EET", + "offset": 7200, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 3, + 4, + 2, + 3, + 4, + 5, + 6, + 4, + 5, + 6, + 4, + 5, + 6, + 4, + 5, + 6, + 4, + 5, + 6, + 4, + 5, + 6, + 4, + 5, + 6, + 4, + 5, + 6, + 4, + 5, + 4, + 5, + 2, + 3, + 4, + 5, + 2, + 3, + 4, + 5, + 2, + 3, + 4, + 5, + 2, + 3, + 4, + 5, + 2, + 3, + 4, + 5, + 2, + 3, + 4, + 5, + 2, + 3, + 4, + 5, + 2, + 3, + 4, + 5, + 2, + 3, + 4, + 5, + 2, + 3, + 4, + 5, + 2, + 3, + 4, + 5, + 2, + 3, + 4, + 5, + 2, + 3, + 4, + 5, + 2, + 3, + 4, + 5, + 2, + 3, + 4, + 5, + 2, + 3, + 4, + 5, + 2, + 3, + 4, + 5, + 2, + 3, + 4, + 5, + 2, + 3, + 4, + 5, + 2, + 3, + 4, + 5, + 2, + 3, + 4, + 5, + 2, + 3, + 4, + 5, + 2, + 3 + ], + "transitions": [ + -2422056120, + -1693706400, + -1680483600, + -1663455600, + -1650150000, + -1632006000, + -1618700400, + -938905200, + -857257200, + -844556400, + -828226800, + -812502000, + -796777200, + -781052400, + -780372000, + -778730400, + -762663600, + -749095200, + 354920400, + 370728000, + 386456400, + 402264000, + 417992400, + 433800000, + 449614800, + 465346800, + 481071600, + 496796400, + 512521200, + 528246000, + 543970800, + 559695600, + 575420400, + 591145200, + 606870000, + 622598400, + 638323200, + 654652800, + 670377600, + 686102400, + 701827200, + 717552000, + 733276800, + 749001600, + 764726400, + 780451200, + 796176000, + 811900800, + 828230400, + 846374400, + 859680000, + 877824000, + 891129600, + 909273600, + 922579200, + 941328000, + 954028800, + 972777600, + 985478400, + 1004227200, + 1017532800, + 1035676800, + 1048982400, + 1067126400, + 1080432000, + 1099180800, + 1111881600, + 1130630400, + 1143331200, + 1162080000, + 1174780800, + 1193529600, + 1206835200, + 1224979200, + 1238284800, + 1256428800, + 1269734400, + 1288483200, + 1301184000, + 1414278000 + ], + "types": [ + { + "offset": 4920 + }, + { + "offset": 3600 + }, + { + "offset": 7200 + }, + { + "offset": 7200 + }, + { + "offset": 10800 + }, + { + "offset": 10800 + }, + { + "offset": 14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-dc8c7c76ac036db-6dcebe24fb293843.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-dc8c7c76ac036db-6dcebe24fb293843.json new file mode 100644 index 00000000000000..938753d8cad4ad --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-dc8c7c76ac036db-6dcebe24fb293843.json @@ -0,0 +1,37 @@ +{ + "ids": [ + "indian/mauritius" + ], + "tzif": { + "posix": { + "abbr": "+04", + "offset": 14400, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -1988164200, + 403041600, + 417034800, + 1224972000, + 1238274000 + ], + "types": [ + { + "offset": 13800 + }, + { + "offset": 14400 + }, + { + "offset": 18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-dc8ea6d022a7ebec-7bdcff969a6b651c.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-dc8ea6d022a7ebec-7bdcff969a6b651c.json new file mode 100644 index 00000000000000..cab20d7b9d07f6 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-dc8ea6d022a7ebec-7bdcff969a6b651c.json @@ -0,0 +1,202 @@ +{ + "ids": [ + "america/sao_paulo", + "brazil/east" + ], + "tzif": { + "posix": { + "abbr": "-03", + "offset": -10800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2 + ], + "transitions": [ + -1767214412, + -1206957600, + -1191362400, + -1175374800, + -1159826400, + -633819600, + -622069200, + -602283600, + -591832800, + -570747600, + -560210400, + -539125200, + -531352800, + -195426000, + -189381600, + -184197600, + -155163600, + -150069600, + -128898000, + -121125600, + -99954000, + -89589600, + -68418000, + -57967200, + 499748400, + 511236000, + 530593200, + 540266400, + 562129200, + 571197600, + 592974000, + 602042400, + 624423600, + 634701600, + 656478000, + 666756000, + 687927600, + 697600800, + 719982000, + 728445600, + 750826800, + 761709600, + 782276400, + 793159200, + 813726000, + 824004000, + 844570800, + 856058400, + 876106800, + 888717600, + 908074800, + 919562400, + 938919600, + 951616800, + 970974000, + 982461600, + 1003028400, + 1013911200, + 1036292400, + 1045360800, + 1066532400, + 1076810400, + 1099364400, + 1108864800, + 1129431600, + 1140314400, + 1162695600, + 1172368800, + 1192330800, + 1203213600, + 1224385200, + 1234663200, + 1255834800, + 1266717600, + 1287284400, + 1298167200, + 1318734000, + 1330221600, + 1350788400, + 1361066400, + 1382238000, + 1392516000, + 1413687600, + 1424570400, + 1445137200, + 1456020000, + 1476586800 + ], + "types": [ + { + "offset": -11188 + }, + { + "offset": -10800 + }, + { + "offset": -7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-dd90c0bd2a5d5bcb-4e3fcc5e29cf94e2.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-dd90c0bd2a5d5bcb-4e3fcc5e29cf94e2.json new file mode 100644 index 00000000000000..ded8f6d0cf89db --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-dd90c0bd2a5d5bcb-4e3fcc5e29cf94e2.json @@ -0,0 +1,38 @@ +{ + "ids": [ + "america/guayaquil" + ], + "tzif": { + "posix": { + "abbr": "-05", + "offset": -18000, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2 + ], + "transitions": [ + -2524502440, + -1230749160, + 722926800, + 728884800 + ], + "types": [ + { + "offset": -19160 + }, + { + "offset": -18840 + }, + { + "offset": -18000 + }, + { + "offset": -14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-df3a174a6f1304b9-f30768cdd2518dd1.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-df3a174a6f1304b9-f30768cdd2518dd1.json new file mode 100644 index 00000000000000..4688e68e5f6af0 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-df3a174a6f1304b9-f30768cdd2518dd1.json @@ -0,0 +1,114 @@ +{ + "ids": [ + "africa/algiers" + ], + "tzif": { + "posix": { + "abbr": "CET", + "offset": 3600, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 3, + 4, + 5, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4 + ], + "transitions": [ + -2486592732, + -1855958961, + -1689814800, + -1680397200, + -1665363600, + -1648342800, + -1635123600, + -1616893200, + -1604278800, + -1585443600, + -1574038800, + -1552266000, + -1539997200, + -1531443600, + -956365200, + -950486400, + -942012000, + -812502000, + -796262400, + -781052400, + -766630800, + -733280400, + -439430400, + -212029200, + 41468400, + 54774000, + 231724800, + 246236400, + 259545600, + 275274000, + 309740400, + 325468800, + 341802000, + 357523200 + ], + "types": [ + { + "offset": 732 + }, + { + "offset": 561 + }, + { + "offset": 0 + }, + { + "offset": 3600 + }, + { + "offset": 3600 + }, + { + "offset": 7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-dfcaab41c352fc41-836527ef6425759.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-dfcaab41c352fc41-836527ef6425759.json new file mode 100644 index 00000000000000..b0c800cc304afa --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-dfcaab41c352fc41-836527ef6425759.json @@ -0,0 +1,26 @@ +{ + "ids": [ + "antarctica/rothera" + ], + "tzif": { + "posix": { + "abbr": "-03", + "offset": -10800, + "transition": null + }, + "transition_types": [ + 1 + ], + "transitions": [ + 218246400 + ], + "types": [ + { + "offset": 0 + }, + { + "offset": -10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e12ae166d8468131-ee348999c2fd8345.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e12ae166d8468131-ee348999c2fd8345.json new file mode 100644 index 00000000000000..eba53856df5a27 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e12ae166d8468131-ee348999c2fd8345.json @@ -0,0 +1,93 @@ +{ + "ids": [ + "america/boa_vista" + ], + "tzif": { + "posix": { + "abbr": "-04", + "offset": -14400, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -1767211040, + -1206954000, + -1191358800, + -1175371200, + -1159822800, + -633816000, + -622065600, + -602280000, + -591829200, + -570744000, + -560206800, + -539121600, + -531349200, + -191361600, + -184194000, + -155160000, + -150066000, + -128894400, + -121122000, + -99950400, + -89586000, + -68414400, + -57963600, + 499752000, + 511239600, + 530596800, + 540270000, + 562132800, + 571201200, + 938923200, + 951620400, + 970977600, + 971578800 + ], + "types": [ + { + "offset": -14560 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e20ebf54a807fe0e-10ef646904348bbe.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e20ebf54a807fe0e-10ef646904348bbe.json new file mode 100644 index 00000000000000..a176b12a77685d --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e20ebf54a807fe0e-10ef646904348bbe.json @@ -0,0 +1,35 @@ +{ + "ids": [ + "america/bogota" + ], + "tzif": { + "posix": { + "abbr": "-05", + "offset": -18000, + "transition": null + }, + "transition_types": [ + 0, + 1, + 2, + 1 + ], + "transitions": [ + -2707671824, + -1739041424, + 704869200, + 729057600 + ], + "types": [ + { + "offset": -17776 + }, + { + "offset": -18000 + }, + { + "offset": -14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e271b0f2662b1c04-20e8607792da4ec7.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e271b0f2662b1c04-20e8607792da4ec7.json new file mode 100644 index 00000000000000..ea81dbe0122400 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e271b0f2662b1c04-20e8607792da4ec7.json @@ -0,0 +1,52 @@ +{ + "ids": [ + "asia/jakarta" + ], + "tzif": { + "posix": { + "abbr": "WIB", + "offset": 25200, + "transition": null + }, + "transition_types": [ + 0, + 1, + 2, + 3, + 2, + 4, + 2, + 5 + ], + "transitions": [ + -3231299232, + -1451719200, + -1172906400, + -876641400, + -766054800, + -683883000, + -620812800, + -189415800 + ], + "types": [ + { + "offset": 25632 + }, + { + "offset": 26400 + }, + { + "offset": 27000 + }, + { + "offset": 32400 + }, + { + "offset": 28800 + }, + { + "offset": 25200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e2789756bce07cca-d7ab71c2384db975.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e2789756bce07cca-d7ab71c2384db975.json new file mode 100644 index 00000000000000..6a5202f7b9c4c3 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e2789756bce07cca-d7ab71c2384db975.json @@ -0,0 +1,175 @@ +{ + "ids": [ + "australia/lhi", + "australia/lord_howe" + ], + "tzif": { + "posix": { + "abbr": "+1030", + "offset": 37800, + "transition": { + "abbr": "+11", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 4, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 1800, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 1, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 4 + ], + "transitions": [ + -2364114980, + 352216800, + 372785400, + 384273000, + 404839800, + 415722600, + 436289400, + 447172200, + 467739000, + 478621800, + 499188600, + 511282800, + 530033400, + 542732400, + 562087800, + 574786800, + 594142200, + 606236400, + 625591800, + 636476400, + 657041400, + 667926000, + 688491000, + 699375600, + 719940600, + 731430000, + 751995000, + 762879600, + 783444600, + 794329200, + 814894200, + 828198000, + 846343800, + 859647600, + 877793400, + 891097200, + 909243000, + 922546800, + 941297400, + 953996400, + 967303800, + 985446000, + 1004196600, + 1017500400, + 1035646200, + 1048950000, + 1067095800, + 1080399600, + 1099150200, + 1111849200, + 1130599800, + 1143903600, + 1162049400, + 1174748400, + 1193499000, + 1207407600, + 1223134200 + ], + "types": [ + { + "offset": 38180 + }, + { + "offset": 36000 + }, + { + "offset": 37800 + }, + { + "offset": 41400 + }, + { + "offset": 39600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e2bf7ec87041f1fb-b61a215ea3b5adb3.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e2bf7ec87041f1fb-b61a215ea3b5adb3.json new file mode 100644 index 00000000000000..be544df5635a80 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e2bf7ec87041f1fb-b61a215ea3b5adb3.json @@ -0,0 +1,19 @@ +{ + "ids": [ + "etc/gmt+12" + ], + "tzif": { + "posix": { + "abbr": "-12", + "offset": -43200, + "transition": null + }, + "transition_types": [], + "transitions": [], + "types": [ + { + "offset": -43200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e330917831501a06-5b1f8ec8b0ab9c4a.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e330917831501a06-5b1f8ec8b0ab9c4a.json new file mode 100644 index 00000000000000..c4d864646d1ea2 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e330917831501a06-5b1f8ec8b0ab9c4a.json @@ -0,0 +1,57 @@ +{ + "ids": [ + "antarctica/troll" + ], + "tzif": { + "posix": { + "abbr": "+00", + "offset": 0, + "transition": { + "abbr": "+02", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 10800 + }, + "savings": 7200, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 3600 + } + } + }, + "transition_types": [ + 0, + 1, + 0 + ], + "transitions": [ + 1108166400, + 1111885200, + 1130634000 + ], + "types": [ + { + "offset": 0 + }, + { + "offset": 7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e3d5b2baffd22f2d-4e475abbb4b8264f.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e3d5b2baffd22f2d-4e475abbb4b8264f.json new file mode 100644 index 00000000000000..9cd2533acd4b53 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e3d5b2baffd22f2d-4e475abbb4b8264f.json @@ -0,0 +1,35 @@ +{ + "ids": [ + "antarctica/vostok" + ], + "tzif": { + "posix": { + "abbr": "+05", + "offset": 18000, + "transition": null + }, + "transition_types": [ + 1, + 0, + 1, + 2 + ], + "transitions": [ + -380073600, + 760035600, + 783648000, + 1702839600 + ], + "types": [ + { + "offset": 0 + }, + { + "offset": 25200 + }, + { + "offset": 18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e4c142bca3031674-44b8ea4e236ae5f5.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e4c142bca3031674-44b8ea4e236ae5f5.json new file mode 100644 index 00000000000000..ef997b3c348b79 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e4c142bca3031674-44b8ea4e236ae5f5.json @@ -0,0 +1,70 @@ +{ + "ids": [ + "pacific/norfolk" + ], + "tzif": { + "posix": { + "abbr": "+11", + "offset": 39600, + "transition": { + "abbr": "+12", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 4, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 1, + 0 + ] + }, + "time": 10800 + } + } + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 4 + ], + "transitions": [ + -2177493112, + -599656320, + 152029800, + 162916200, + 1443882600 + ], + "types": [ + { + "offset": 40312 + }, + { + "offset": 40320 + }, + { + "offset": 41400 + }, + { + "offset": 45000 + }, + { + "offset": 39600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e5822ac52a06a527-c5e561a56943464c.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e5822ac52a06a527-c5e561a56943464c.json new file mode 100644 index 00000000000000..999618d3b0a152 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e5822ac52a06a527-c5e561a56943464c.json @@ -0,0 +1,41 @@ +{ + "ids": [ + "america/tegucigalpa" + ], + "tzif": { + "posix": { + "abbr": "CST", + "offset": -21600, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -1538503868, + 547020000, + 559717200, + 578469600, + 591166800, + 1146981600, + 1154926800 + ], + "types": [ + { + "offset": -20932 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e65fa49c7674041-51ba19ae72a3c69.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e65fa49c7674041-51ba19ae72a3c69.json new file mode 100644 index 00000000000000..d501ee5144672b --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e65fa49c7674041-51ba19ae72a3c69.json @@ -0,0 +1,61 @@ +{ + "ids": [ + "antarctica/casey" + ], + "tzif": { + "posix": { + "abbr": "+08", + "offset": 28800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -31536000, + 1255802400, + 1267714800, + 1319738400, + 1329843600, + 1477065600, + 1520701200, + 1538856000, + 1552752000, + 1570129200, + 1583596800, + 1601740860, + 1615640400, + 1633190460, + 1647090000, + 1664640060, + 1678291200 + ], + "types": [ + { + "offset": 0 + }, + { + "offset": 28800 + }, + { + "offset": 39600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e713de09d9781804-3bc1517947065469.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e713de09d9781804-3bc1517947065469.json new file mode 100644 index 00000000000000..68c377e400228b --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e713de09d9781804-3bc1517947065469.json @@ -0,0 +1,31 @@ +{ + "ids": [ + "indian/chagos" + ], + "tzif": { + "posix": { + "abbr": "+06", + "offset": 21600, + "transition": null + }, + "transition_types": [ + 1, + 2 + ], + "transitions": [ + -1988167780, + 820436400 + ], + "types": [ + { + "offset": 17380 + }, + { + "offset": 18000 + }, + { + "offset": 21600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e7907c2354d7f128-1222f4f18f058093.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e7907c2354d7f128-1222f4f18f058093.json new file mode 100644 index 00000000000000..ea5a63deb89673 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e7907c2354d7f128-1222f4f18f058093.json @@ -0,0 +1,26 @@ +{ + "ids": [ + "pacific/gambier" + ], + "tzif": { + "posix": { + "abbr": "-09", + "offset": -32400, + "transition": null + }, + "transition_types": [ + 1 + ], + "transitions": [ + -1806678012 + ], + "types": [ + { + "offset": -32388 + }, + { + "offset": -32400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e953d2a73bc41375-ef97956cf6178835.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e953d2a73bc41375-ef97956cf6178835.json new file mode 100644 index 00000000000000..ded235059b2071 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-e953d2a73bc41375-ef97956cf6178835.json @@ -0,0 +1,366 @@ +{ + "ids": [ + "europe/lisbon", + "portugal", + "wet" + ], + "tzif": { + "posix": { + "abbr": "WET", + "offset": 0, + "transition": { + "abbr": "WEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 3600 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 3, + 2, + 1, + 2, + 3, + 2, + 1, + 2, + 3, + 2, + 1, + 2, + 3, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 4, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 2, + 4, + 1 + ], + "transitions": [ + -1830384000, + -1689555600, + -1677801600, + -1667433600, + -1647738000, + -1635897600, + -1616202000, + -1604361600, + -1584666000, + -1572739200, + -1553043600, + -1541203200, + -1521507600, + -1442451600, + -1427677200, + -1379293200, + -1364778000, + -1348448400, + -1333328400, + -1316394000, + -1301274000, + -1284339600, + -1269824400, + -1221440400, + -1206925200, + -1191200400, + -1175475600, + -1127696400, + -1111971600, + -1096851600, + -1080522000, + -1063587600, + -1049072400, + -1033347600, + -1017622800, + -1002502800, + -986173200, + -969238800, + -950490000, + -942022800, + -922496400, + -906944400, + -891133200, + -877309200, + -873684000, + -864007200, + -857955600, + -845859600, + -842839200, + -831348000, + -825901200, + -814410000, + -810784800, + -799898400, + -794451600, + -782960400, + -779335200, + -768448800, + -763002000, + -749091600, + -733366800, + -717631200, + -701906400, + -686181600, + -670456800, + -654732000, + -639007200, + -623282400, + -607557600, + -591832800, + -575503200, + -559778400, + -544053600, + -528328800, + -512604000, + -496879200, + -481154400, + -465429600, + -449704800, + -433980000, + -417650400, + -401925600, + -386200800, + -370476000, + -354751200, + -339026400, + -323301600, + -307576800, + -291852000, + -276127200, + -260402400, + -244677600, + -228348000, + -212623200, + -196898400, + -181173600, + -165448800, + -149724000, + -133999200, + -118274400, + -102549600, + 212544000, + 243993600, + 260326800, + 276051600, + 291776400, + 307501200, + 323830800, + 338950800, + 354672000, + 370396800, + 386121600, + 401846400, + 417571200, + 433296000, + 449020800, + 465350400, + 481075200, + 496800000, + 504921600, + 528253200, + 543978000, + 559702800, + 575427600, + 591152400, + 606877200, + 622602000, + 638326800, + 654656400, + 670381200, + 686106000, + 701830800, + 717555600, + 733280400, + 749005200, + 764730000, + 780454800, + 796179600, + 811904400, + 828234000, + 846378000 + ], + "types": [ + { + "offset": -2205 + }, + { + "offset": 0 + }, + { + "offset": 3600 + }, + { + "offset": 7200 + }, + { + "offset": 3600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ea8173f82f8dccac-190f07fa0585582b.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ea8173f82f8dccac-190f07fa0585582b.json new file mode 100644 index 00000000000000..9076a32b30e4d8 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ea8173f82f8dccac-190f07fa0585582b.json @@ -0,0 +1,205 @@ +{ + "ids": [ + "asia/hong_kong", + "hongkong" + ], + "tzif": { + "posix": { + "abbr": "HKT", + "offset": 28800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1 + ], + "transitions": [ + -2056690800, + -900910800, + -891579600, + -884248200, + -761209200, + -747907200, + -728541000, + -717049800, + -697091400, + -683785800, + -668061000, + -654755400, + -636611400, + -623305800, + -605161800, + -591856200, + -573712200, + -559801800, + -541657800, + -528352200, + -510211800, + -498112200, + -478762200, + -466662600, + -446707800, + -435213000, + -415258200, + -403158600, + -383808600, + -371709000, + -352359000, + -340259400, + -320909400, + -308809800, + -288855000, + -277360200, + -257405400, + -245910600, + -225955800, + -213856200, + -194506200, + -182406600, + -163056600, + -148537800, + -132816600, + -117088200, + -101367000, + -85638600, + -69312600, + -53584200, + -37863000, + -22134600, + -6413400, + 9315000, + 25036200, + 40764600, + 56485800, + 72214200, + 88540200, + 104268600, + 119989800, + 126041400, + 151439400, + 167167800, + 182889000, + 198617400, + 214338600, + 295385400, + 309292200 + ], + "types": [ + { + "offset": 27402 + }, + { + "offset": 28800 + }, + { + "offset": 32400 + }, + { + "offset": 30600 + }, + { + "offset": 32400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-eafa00d1ad3ada02-ccfdff510d06498a.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-eafa00d1ad3ada02-ccfdff510d06498a.json new file mode 100644 index 00000000000000..731ecdac17311b --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-eafa00d1ad3ada02-ccfdff510d06498a.json @@ -0,0 +1,187 @@ +{ + "ids": [ + "asia/kamchatka" + ], + "tzif": { + "posix": { + "abbr": "+12", + "offset": 43200, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 4, + 2, + 4, + 1, + 3, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4 + ], + "transitions": [ + -1487759676, + -1247569200, + 354888000, + 370695600, + 386424000, + 402231600, + 417960000, + 433767600, + 449582400, + 465314400, + 481039200, + 496764000, + 512488800, + 528213600, + 543938400, + 559663200, + 575388000, + 591112800, + 606837600, + 622562400, + 638287200, + 654616800, + 670341600, + 670345200, + 686070000, + 695746800, + 701791200, + 717516000, + 733240800, + 748965600, + 764690400, + 780415200, + 796140000, + 811864800, + 828194400, + 846338400, + 859644000, + 877788000, + 891093600, + 909237600, + 922543200, + 941292000, + 953992800, + 972741600, + 985442400, + 1004191200, + 1017496800, + 1035640800, + 1048946400, + 1067090400, + 1080396000, + 1099144800, + 1111845600, + 1130594400, + 1143295200, + 1162044000, + 1174744800, + 1193493600, + 1206799200, + 1224943200, + 1238248800, + 1256392800, + 1269698400, + 1269702000, + 1288450800, + 1301151600 + ], + "types": [ + { + "offset": 38076 + }, + { + "offset": 39600 + }, + { + "offset": 43200 + }, + { + "offset": 46800 + }, + { + "offset": 43200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-eb4384db15894d16-b0aaeb08a0cbe1e0.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-eb4384db15894d16-b0aaeb08a0cbe1e0.json new file mode 100644 index 00000000000000..c68dbf2f3afad8 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-eb4384db15894d16-b0aaeb08a0cbe1e0.json @@ -0,0 +1,67 @@ +{ + "ids": [ + "australia/lindeman" + ], + "tzif": { + "posix": { + "abbr": "AEST", + "offset": 36000, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2 + ], + "transitions": [ + -2366790956, + -1672560000, + -1665388800, + -883641600, + -876124800, + -860400000, + -844675200, + -828345600, + -813225600, + 57686400, + 67968000, + 625593600, + 636480000, + 657043200, + 667929600, + 688492800, + 699379200, + 719942400, + 731433600, + 751996800 + ], + "types": [ + { + "offset": 35756 + }, + { + "offset": 36000 + }, + { + "offset": 39600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-eb9179abb91c8435-726489ced5139013.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-eb9179abb91c8435-726489ced5139013.json new file mode 100644 index 00000000000000..c4365a6ea3f283 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-eb9179abb91c8435-726489ced5139013.json @@ -0,0 +1,372 @@ +{ + "ids": [ + "america/coyhaique" + ], + "tzif": { + "posix": { + "abbr": "-03", + "offset": -10800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 3, + 1, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 3, + 4, + 2, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 5, + 6 + ], + "transitions": [ + -2524504304, + -1892661435, + -1688410800, + -1619205435, + -1593806400, + -1335986235, + -1335985200, + -1317585600, + -1304362800, + -1286049600, + -1272826800, + -1254513600, + -1241290800, + -1222977600, + -1209754800, + -1191355200, + -1178132400, + -870552000, + -865278000, + -736632000, + -718056000, + -713649600, + -36619200, + -23922000, + -3355200, + 7527600, + 24465600, + 37767600, + 55915200, + 69217200, + 87969600, + 100666800, + 118209600, + 132116400, + 150868800, + 163566000, + 182318400, + 195620400, + 213768000, + 227070000, + 245217600, + 258519600, + 277272000, + 289969200, + 308721600, + 321418800, + 340171200, + 353473200, + 371620800, + 384922800, + 403070400, + 416372400, + 434520000, + 447822000, + 466574400, + 479271600, + 498024000, + 510721200, + 529473600, + 545194800, + 560923200, + 574225200, + 592372800, + 605674800, + 624427200, + 637124400, + 653457600, + 668574000, + 687326400, + 700628400, + 718776000, + 732078000, + 750225600, + 763527600, + 781675200, + 794977200, + 813729600, + 826426800, + 845179200, + 859690800, + 876628800, + 889930800, + 906868800, + 923194800, + 939528000, + 952830000, + 971582400, + 984279600, + 1003032000, + 1015729200, + 1034481600, + 1047178800, + 1065931200, + 1079233200, + 1097380800, + 1110682800, + 1128830400, + 1142132400, + 1160884800, + 1173582000, + 1192334400, + 1206846000, + 1223784000, + 1237086000, + 1255233600, + 1270350000, + 1286683200, + 1304823600, + 1313899200, + 1335668400, + 1346558400, + 1367118000, + 1378612800, + 1398567600, + 1410062400, + 1463281200, + 1471147200, + 1494730800, + 1502596800, + 1526180400, + 1534046400, + 1554606000, + 1567915200, + 1586055600, + 1599364800, + 1617505200, + 1630814400, + 1648954800, + 1662868800, + 1680404400, + 1693713600, + 1712458800, + 1725768000, + 1742439600 + ], + "types": [ + { + "offset": -17296 + }, + { + "offset": -16965 + }, + { + "offset": -18000 + }, + { + "offset": -14400 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + }, + { + "offset": -10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ec4f112febcbc032-a69762c688a2158f.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ec4f112febcbc032-a69762c688a2158f.json new file mode 100644 index 00000000000000..6fe9c8f7460995 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ec4f112febcbc032-a69762c688a2158f.json @@ -0,0 +1,227 @@ +{ + "ids": [ + "europe/moscow", + "w-su" + ], + "tzif": { + "posix": { + "abbr": "MSK", + "offset": 10800, + "transition": null + }, + "transition_types": [ + 0, + 1, + 2, + 1, + 3, + 2, + 3, + 4, + 5, + 4, + 6, + 4, + 5, + 7, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 4, + 5, + 5, + 8, + 7, + 4, + 4, + 5, + 8, + 4, + 5, + 8, + 4, + 5, + 8, + 4, + 5, + 8, + 4, + 5, + 8, + 4, + 5, + 8, + 4, + 5, + 8, + 4, + 5, + 8, + 4, + 5, + 8, + 4, + 5, + 8, + 4, + 5, + 8, + 4, + 5, + 8, + 4, + 5, + 8, + 4, + 5, + 8, + 4, + 5, + 8, + 4, + 5, + 8, + 4, + 5, + 8, + 4, + 5, + 8, + 4, + 5, + 8, + 4, + 9, + 5, + 8 + ], + "transitions": [ + -2840149817, + -1688265017, + -1656819079, + -1641353479, + -1627965079, + -1618716679, + -1596429079, + -1593820800, + -1589860800, + -1542427200, + -1539493200, + -1525323600, + -1522728000, + -1491188400, + -1247536800, + 354920400, + 370728000, + 386456400, + 402264000, + 417992400, + 433800000, + 449614800, + 465346800, + 481071600, + 496796400, + 512521200, + 528246000, + 543970800, + 559695600, + 575420400, + 591145200, + 606870000, + 622594800, + 638319600, + 654649200, + 670374000, + 686102400, + 695779200, + 701823600, + 717548400, + 733273200, + 748998000, + 764722800, + 780447600, + 796172400, + 811897200, + 828226800, + 846370800, + 859676400, + 877820400, + 891126000, + 909270000, + 922575600, + 941324400, + 954025200, + 972774000, + 985474800, + 1004223600, + 1017529200, + 1035673200, + 1048978800, + 1067122800, + 1080428400, + 1099177200, + 1111878000, + 1130626800, + 1143327600, + 1162076400, + 1174777200, + 1193526000, + 1206831600, + 1224975600, + 1238281200, + 1256425200, + 1269730800, + 1288479600, + 1301180400, + 1414274400 + ], + "types": [ + { + "offset": 9017 + }, + { + "offset": 9079 + }, + { + "offset": 12679 + }, + { + "offset": 16279 + }, + { + "offset": 14400 + }, + { + "offset": 10800 + }, + { + "offset": 18000 + }, + { + "offset": 7200 + }, + { + "offset": 10800 + }, + { + "offset": 14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ed29bf9f15004c8a-f6def5db1514383c.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ed29bf9f15004c8a-f6def5db1514383c.json new file mode 100644 index 00000000000000..7fde68372da96d --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ed29bf9f15004c8a-f6def5db1514383c.json @@ -0,0 +1,405 @@ +{ + "ids": [ + "america/montreal", + "america/nassau", + "america/nipigon", + "america/thunder_bay", + "america/toronto", + "canada/eastern" + ], + "tzif": { + "posix": { + "abbr": "EST", + "offset": -18000, + "transition": { + "abbr": "EDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -2366736148, + -1632070800, + -1615140000, + -1601753400, + -1583697600, + -1567357200, + -1554667200, + -1534698000, + -1524074400, + -1503248400, + -1492365600, + -1471798800, + -1460916000, + -1440954000, + -1428861600, + -1409504400, + -1397412000, + -1378054800, + -1365962400, + -1346605200, + -1333908000, + -1315155600, + -1301853600, + -1283706000, + -1270404000, + -1252256400, + -1238954400, + -1220806800, + -1207504800, + -1188752400, + -1176055200, + -1157302800, + -1144000800, + -1125853200, + -1112551200, + -1094403600, + -1081101600, + -1062954000, + -1049652000, + -1031504400, + -1018202400, + -1000054800, + -986752800, + -968000400, + -955303200, + -936550800, + -880218000, + -769395600, + -765396000, + -757364400, + -733946400, + -715798800, + -702496800, + -684349200, + -671047200, + -652899600, + -634154400, + -620845200, + -602704800, + -589395600, + -576093600, + -557946000, + -544644000, + -526496400, + -513194400, + -495046800, + -481744800, + -463597200, + -450295200, + -431542800, + -418240800, + -400093200, + -384372000, + -368643600, + -352922400, + -337194000, + -321472800, + -305744400, + -289418400, + -273690000, + -257968800, + -242240400, + -226519200, + -210790800, + -195069600, + -179341200, + -163620000, + -147891600, + -131565600, + -116442000, + -100116000, + -84387600, + -68666400, + -52938000, + -37216800, + -21488400, + -5767200, + 9961200, + 25682400, + 41410800, + 57736800, + 73465200, + 89186400, + 104914800, + 120636000, + 136364400, + 152085600, + 167814000, + 183535200, + 199263600, + 215589600, + 230713200, + 247039200, + 262767600, + 278488800, + 294217200, + 309938400, + 325666800, + 341388000, + 357116400, + 372837600, + 388566000, + 404892000, + 420015600, + 436341600, + 452070000, + 467791200, + 483519600, + 499240800, + 514969200, + 530690400, + 544604400, + 562140000, + 576054000, + 594194400, + 607503600, + 625644000, + 638953200, + 657093600, + 671007600, + 688543200, + 702457200, + 719992800, + 733906800, + 752047200, + 765356400, + 783496800, + 796806000, + 814946400, + 828860400, + 846396000, + 860310000, + 877845600, + 891759600, + 909295200, + 923209200, + 941349600, + 954658800, + 972799200, + 986108400, + 1004248800, + 1018162800, + 1035698400, + 1049612400, + 1067148000, + 1081062000, + 1099202400, + 1112511600, + 1130652000, + 1143961200, + 1162101600, + 1173596400, + 1194156000 + ], + "types": [ + { + "offset": -19052 + }, + { + "offset": -18000 + }, + { + "offset": -14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-edc11c9a67454353-7a49fa82cac12758.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-edc11c9a67454353-7a49fa82cac12758.json new file mode 100644 index 00000000000000..4f4106ec2ba78e --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-edc11c9a67454353-7a49fa82cac12758.json @@ -0,0 +1,169 @@ +{ + "ids": [ + "america/argentina/rio_gallegos" + ], + "tzif": { + "posix": { + "abbr": "-03", + "offset": -10800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 3, + 4, + 3, + 4, + 2, + 3, + 4, + 5, + 3, + 4 + ], + "transitions": [ + -2372095388, + -1567453392, + -1233432000, + -1222981200, + -1205956800, + -1194037200, + -1172865600, + -1162501200, + -1141329600, + -1130965200, + -1109793600, + -1099429200, + -1078257600, + -1067806800, + -1046635200, + -1036270800, + -1015099200, + -1004734800, + -983563200, + -973198800, + -952027200, + -941576400, + -931032000, + -900882000, + -890337600, + -833749200, + -827265600, + -752274000, + -733780800, + -197326800, + -190843200, + -184194000, + -164491200, + -152658000, + -132955200, + -121122000, + -101419200, + -86821200, + -71092800, + -54766800, + -39038400, + -23317200, + -7588800, + 128142000, + 136605600, + 596948400, + 605066400, + 624423600, + 636516000, + 656478000, + 667965600, + 687927600, + 699415200, + 719377200, + 731469600, + 938919600, + 952052400, + 1086058800, + 1087704000, + 1198983600, + 1205632800 + ], + "types": [ + { + "offset": -16612 + }, + { + "offset": -15408 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + }, + { + "offset": -10800 + }, + { + "offset": -7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-edc8df3b48d8f1ae-2f0fe2e55f7ceabf.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-edc8df3b48d8f1ae-2f0fe2e55f7ceabf.json new file mode 100644 index 00000000000000..6baef9f36a1ef4 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-edc8df3b48d8f1ae-2f0fe2e55f7ceabf.json @@ -0,0 +1,37 @@ +{ + "ids": [ + "pacific/enderbury", + "pacific/kanton" + ], + "tzif": { + "posix": { + "abbr": "+13", + "offset": 46800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3 + ], + "transitions": [ + -1020470400, + 307627200, + 788871600 + ], + "types": [ + { + "offset": 0 + }, + { + "offset": -43200 + }, + { + "offset": -39600 + }, + { + "offset": 46800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ee42b17151e8d0d1-557c16a705ea23d1.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ee42b17151e8d0d1-557c16a705ea23d1.json new file mode 100644 index 00000000000000..a7198d18c73873 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ee42b17151e8d0d1-557c16a705ea23d1.json @@ -0,0 +1,132 @@ +{ + "ids": [ + "asia/taipei", + "roc" + ], + "tzif": { + "posix": { + "abbr": "CST", + "offset": 28800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1 + ], + "transitions": [ + -2335248360, + -1017820800, + -766224000, + -745833600, + -733827600, + -716889600, + -699613200, + -683884800, + -670669200, + -652348800, + -639133200, + -620812800, + -607597200, + -589276800, + -576061200, + -562924800, + -541760400, + -528710400, + -510224400, + -497174400, + -478688400, + -465638400, + -449830800, + -434016000, + -418208400, + -402480000, + -386672400, + -370944000, + -355136400, + -339408000, + -323600400, + -302515200, + -291978000, + -270979200, + -260442000, + 133977600, + 149785200, + 165513600, + 181321200, + 299606400, + 307551600 + ], + "types": [ + { + "offset": 29160 + }, + { + "offset": 28800 + }, + { + "offset": 32400 + }, + { + "offset": 32400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ef074bbbac9f5764-af06bb8dad04fbb2.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ef074bbbac9f5764-af06bb8dad04fbb2.json new file mode 100644 index 00000000000000..8cdc8a4cf80486 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ef074bbbac9f5764-af06bb8dad04fbb2.json @@ -0,0 +1,121 @@ +{ + "ids": [ + "america/bahia_banderas" + ], + "tzif": { + "posix": { + "abbr": "CST", + "offset": -21600, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 4 + ], + "transitions": [ + -1514739600, + -1343149200, + -1234807200, + -1220461200, + -1207159200, + -1191344400, + -873828000, + 828867600, + 846403200, + 860317200, + 877852800, + 891766800, + 909302400, + 923216400, + 941356800, + 954666000, + 972806400, + 989139600, + 1001836800, + 1018170000, + 1035705600, + 1049619600, + 1067155200, + 1081069200, + 1099209600, + 1112518800, + 1130659200, + 1143968400, + 1162108800, + 1175418000, + 1193558400, + 1207472400, + 1225008000, + 1238922000, + 1256457600, + 1270371600 + ], + "types": [ + { + "offset": -25260 + }, + { + "offset": -25200 + }, + { + "offset": -21600 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ef99169dd5b3d431-ae45f4711dd0d14b.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ef99169dd5b3d431-ae45f4711dd0d14b.json new file mode 100644 index 00000000000000..ba60ecb570eff0 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ef99169dd5b3d431-ae45f4711dd0d14b.json @@ -0,0 +1,225 @@ +{ + "ids": [ + "australia/act", + "australia/canberra", + "australia/nsw", + "australia/sydney" + ], + "tzif": { + "posix": { + "abbr": "AEST", + "offset": 36000, + "transition": { + "abbr": "AEDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 4, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 1, + 0 + ] + }, + "time": 10800 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2 + ], + "transitions": [ + -2364113092, + -1672560000, + -1665388800, + -883641600, + -876124800, + -860400000, + -844675200, + -828345600, + -813225600, + 57686400, + 67968000, + 89136000, + 100022400, + 120585600, + 131472000, + 152035200, + 162921600, + 183484800, + 194976000, + 215539200, + 226425600, + 246988800, + 257875200, + 278438400, + 289324800, + 309888000, + 320774400, + 341337600, + 352224000, + 372787200, + 386697600, + 404841600, + 415728000, + 436291200, + 447177600, + 467740800, + 478627200, + 499190400, + 511286400, + 530035200, + 542736000, + 562089600, + 574790400, + 594144000, + 606240000, + 625593600, + 636480000, + 657043200, + 667929600, + 688492800, + 699379200, + 719942400, + 731433600, + 751996800, + 762883200, + 783446400, + 794332800, + 814896000, + 828201600, + 846345600, + 859651200, + 877795200, + 891100800, + 909244800, + 922550400, + 941299200, + 954000000, + 967305600, + 985449600, + 1004198400, + 1017504000, + 1035648000, + 1048953600, + 1067097600, + 1080403200, + 1099152000, + 1111852800, + 1130601600, + 1143907200, + 1162051200, + 1174752000, + 1193500800, + 1207411200, + 1223136000 + ], + "types": [ + { + "offset": 36292 + }, + { + "offset": 36000 + }, + { + "offset": 39600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-effb0bd5efab2bad-76ee3ca040667987.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-effb0bd5efab2bad-76ee3ca040667987.json new file mode 100644 index 00000000000000..90e7a7625d0a5e --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-effb0bd5efab2bad-76ee3ca040667987.json @@ -0,0 +1,308 @@ +{ + "ids": [ + "america/los_angeles", + "pst8pdt", + "us/pacific" + ], + "tzif": { + "posix": { + "abbr": "PST", + "offset": -28800, + "transition": { + "abbr": "PDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -2717640000, + -1633269600, + -1615129200, + -1601820000, + -1583679600, + -880207200, + -769395600, + -765385200, + -687967140, + -662655600, + -620838000, + -608137200, + -589388400, + -576082800, + -557938800, + -544633200, + -526489200, + -513183600, + -495039600, + -481734000, + -463590000, + -450284400, + -431535600, + -418230000, + -400086000, + -386780400, + -368636400, + -355330800, + -337186800, + -323881200, + -305737200, + -292431600, + -273682800, + -260982000, + -242233200, + -226508400, + -210783600, + -195058800, + -179334000, + -163609200, + -147884400, + -131554800, + -116434800, + -100105200, + -84376800, + -68655600, + -52927200, + -37206000, + -21477600, + -5756400, + 9972000, + 25693200, + 41421600, + 57747600, + 73476000, + 89197200, + 104925600, + 120646800, + 126698400, + 152096400, + 162381600, + 183546000, + 199274400, + 215600400, + 230724000, + 247050000, + 262778400, + 278499600, + 294228000, + 309949200, + 325677600, + 341398800, + 357127200, + 372848400, + 388576800, + 404902800, + 420026400, + 436352400, + 452080800, + 467802000, + 483530400, + 499251600, + 514980000, + 530701200, + 544615200, + 562150800, + 576064800, + 594205200, + 607514400, + 625654800, + 638964000, + 657104400, + 671018400, + 688554000, + 702468000, + 720003600, + 733917600, + 752058000, + 765367200, + 783507600, + 796816800, + 814957200, + 828871200, + 846406800, + 860320800, + 877856400, + 891770400, + 909306000, + 923220000, + 941360400, + 954669600, + 972810000, + 986119200, + 1004259600, + 1018173600, + 1035709200, + 1049623200, + 1067158800, + 1081072800, + 1099213200, + 1112522400, + 1130662800, + 1143972000, + 1162112400, + 1173607200, + 1194166800 + ], + "types": [ + { + "offset": -28378 + }, + { + "offset": -28800 + }, + { + "offset": -25200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f022b64b061d7846-529fb8a37afd1bc3.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f022b64b061d7846-529fb8a37afd1bc3.json new file mode 100644 index 00000000000000..968e0512175756 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f022b64b061d7846-529fb8a37afd1bc3.json @@ -0,0 +1,31 @@ +{ + "ids": [ + "pacific/pitcairn" + ], + "tzif": { + "posix": { + "abbr": "-08", + "offset": -28800, + "transition": null + }, + "transition_types": [ + 1, + 2 + ], + "transitions": [ + -2177421580, + 893665800 + ], + "types": [ + { + "offset": -31220 + }, + { + "offset": -30600 + }, + { + "offset": -28800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f0d38f589f1464b7-e65390d2a42c7521.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f0d38f589f1464b7-e65390d2a42c7521.json new file mode 100644 index 00000000000000..6d37ac6a3c1fda --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f0d38f589f1464b7-e65390d2a42c7521.json @@ -0,0 +1,313 @@ +{ + "ids": [ + "africa/cairo", + "egypt" + ], + "tzif": { + "posix": { + "abbr": "EET", + "offset": 7200, + "transition": { + "abbr": "EEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 4 + ] + }, + "time": 86400 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 4, + 5, + 5 + ] + }, + "time": 0 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -2185409109, + -929844000, + -923108400, + -906170400, + -892868400, + -875844000, + -857790000, + -844308000, + -825822000, + -812685600, + -794199600, + -779853600, + -762663600, + -399088800, + -386650800, + -368330400, + -355114800, + -336790800, + -323654400, + -305168400, + -292032000, + -273632400, + -260496000, + -242096400, + -228960000, + -210560400, + -197424000, + -178938000, + -165801600, + -147402000, + -134265600, + -115866000, + -102643200, + -84330000, + -71107200, + -52707600, + -39484800, + -21171600, + -7948800, + 10364400, + 23587200, + 41900400, + 55123200, + 73522800, + 86745600, + 105058800, + 118281600, + 136594800, + 149817600, + 168130800, + 181353600, + 199753200, + 212976000, + 231289200, + 244512000, + 262825200, + 276048000, + 294361200, + 307584000, + 325983600, + 339206400, + 357519600, + 370742400, + 396399600, + 402278400, + 426812400, + 433814400, + 452214000, + 465436800, + 483750000, + 496972800, + 515286000, + 528508800, + 546822000, + 560044800, + 578444400, + 591667200, + 610412400, + 623203200, + 641516400, + 654739200, + 673052400, + 686275200, + 704674800, + 717897600, + 736210800, + 749433600, + 767746800, + 780969600, + 799020000, + 812322000, + 830469600, + 843771600, + 861919200, + 875221200, + 893368800, + 906670800, + 925423200, + 938725200, + 956872800, + 970174800, + 988322400, + 1001624400, + 1019772000, + 1033074000, + 1051221600, + 1064523600, + 1083276000, + 1096578000, + 1114725600, + 1128027600, + 1146175200, + 1158872400, + 1177624800, + 1189112400, + 1209074400, + 1219957200, + 1240524000, + 1250802000, + 1272578400, + 1281474000, + 1284069600, + 1285880400, + 1400191200, + 1403816400, + 1406844000, + 1411678800, + 1682632800, + 1698354000 + ], + "types": [ + { + "offset": 7509 + }, + { + "offset": 7200 + }, + { + "offset": 10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f104b0a7be76b68-672d15810abf76ed.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f104b0a7be76b68-672d15810abf76ed.json new file mode 100644 index 00000000000000..3c0b068a47658e --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f104b0a7be76b68-672d15810abf76ed.json @@ -0,0 +1,49 @@ +{ + "ids": [ + "kwajalein", + "pacific/kwajalein" + ], + "tzif": { + "posix": { + "abbr": "+12", + "offset": 43200, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 1, + 4, + 5 + ], + "transitions": [ + -2177492960, + -1041418800, + -907408800, + -817462800, + -7988400, + 745934400 + ], + "types": [ + { + "offset": 40160 + }, + { + "offset": 39600 + }, + { + "offset": 36000 + }, + { + "offset": 32400 + }, + { + "offset": -43200 + }, + { + "offset": 43200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f1b7ca6dc4d0b2b0-d827a5cc52d17740.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f1b7ca6dc4d0b2b0-d827a5cc52d17740.json new file mode 100644 index 00000000000000..132dcf300511bf --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f1b7ca6dc4d0b2b0-d827a5cc52d17740.json @@ -0,0 +1,171 @@ +{ + "ids": [ + "asia/aqtau" + ], + "tzif": { + "posix": { + "abbr": "+05", + "offset": 18000, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 2, + 5, + 2, + 5, + 1, + 3, + 4, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 1, + 2, + 5, + 1, + 2, + 5, + 1, + 2, + 5, + 1, + 2, + 5, + 1, + 2, + 5, + 1, + 2, + 5, + 1, + 2, + 5, + 1, + 2, + 5, + 1, + 2, + 5, + 1, + 2, + 5, + 2, + 5 + ], + "transitions": [ + -1441164064, + -1247544000, + 370724400, + 386445600, + 386449200, + 402256800, + 417985200, + 433792800, + 449607600, + 465339600, + 481064400, + 496789200, + 512514000, + 528238800, + 543963600, + 559688400, + 575413200, + 591138000, + 606862800, + 622587600, + 638312400, + 654642000, + 670366800, + 670370400, + 686095200, + 695772000, + 701816400, + 717541200, + 733266000, + 748990800, + 764715600, + 780440400, + 780444000, + 796168800, + 811893600, + 828223200, + 846367200, + 859672800, + 877816800, + 891122400, + 909266400, + 922572000, + 941320800, + 954021600, + 972770400, + 985471200, + 1004220000, + 1017525600, + 1035669600, + 1048975200, + 1067119200, + 1080424800, + 1099173600 + ], + "types": [ + { + "offset": 12064 + }, + { + "offset": 14400 + }, + { + "offset": 18000 + }, + { + "offset": 21600 + }, + { + "offset": 21600 + }, + { + "offset": 18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f1f0b3541047bfad-8176e7d9a57a1316.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f1f0b3541047bfad-8176e7d9a57a1316.json new file mode 100644 index 00000000000000..b59810738b165d --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f1f0b3541047bfad-8176e7d9a57a1316.json @@ -0,0 +1,234 @@ +{ + "ids": [ + "antarctica/palmer" + ], + "tzif": { + "posix": { + "abbr": "-03", + "offset": -10800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 3, + 4, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 1, + 3 + ], + "transitions": [ + -157766400, + -152658000, + -132955200, + -121122000, + -101419200, + -86821200, + -71092800, + -54766800, + -39038400, + -23317200, + -7588800, + 128142000, + 136605600, + 389070000, + 403070400, + 416372400, + 434520000, + 447822000, + 466574400, + 479271600, + 498024000, + 510721200, + 529473600, + 545194800, + 560923200, + 574225200, + 592372800, + 605674800, + 624427200, + 637124400, + 653457600, + 668574000, + 687326400, + 700628400, + 718776000, + 732078000, + 750225600, + 763527600, + 781675200, + 794977200, + 813729600, + 826426800, + 845179200, + 859690800, + 876628800, + 889930800, + 906868800, + 923194800, + 939528000, + 952830000, + 971582400, + 984279600, + 1003032000, + 1015729200, + 1034481600, + 1047178800, + 1065931200, + 1079233200, + 1097380800, + 1110682800, + 1128830400, + 1142132400, + 1160884800, + 1173582000, + 1192334400, + 1206846000, + 1223784000, + 1237086000, + 1255233600, + 1270350000, + 1286683200, + 1304823600, + 1313899200, + 1335668400, + 1346558400, + 1367118000, + 1378612800, + 1398567600, + 1410062400, + 1463281200, + 1471147200, + 1480820400 + ], + "types": [ + { + "offset": 0 + }, + { + "offset": -10800 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + }, + { + "offset": -7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f2238fc53b0fff96-6f6aee2b55131405.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f2238fc53b0fff96-6f6aee2b55131405.json new file mode 100644 index 00000000000000..1b4bdd86171f85 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f2238fc53b0fff96-6f6aee2b55131405.json @@ -0,0 +1,41 @@ +{ + "ids": [ + "antarctica/davis" + ], + "tzif": { + "posix": { + "abbr": "+07", + "offset": 25200, + "transition": null + }, + "transition_types": [ + 1, + 0, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -409190400, + -163062000, + -28857600, + 1255806000, + 1268251200, + 1319742000, + 1329854400 + ], + "types": [ + { + "offset": 0 + }, + { + "offset": 25200 + }, + { + "offset": 18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f229cb4cd552c448-1e8f29f5b7bc6659.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f229cb4cd552c448-1e8f29f5b7bc6659.json new file mode 100644 index 00000000000000..7b39e9ac249951 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f229cb4cd552c448-1e8f29f5b7bc6659.json @@ -0,0 +1,156 @@ +{ + "ids": [ + "asia/bishkek" + ], + "tzif": { + "posix": { + "abbr": "+06", + "offset": 21600, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 4, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 2, + 4 + ], + "transitions": [ + -1441169904, + -1247547600, + 354909600, + 370717200, + 386445600, + 402253200, + 417981600, + 433789200, + 449604000, + 465336000, + 481060800, + 496785600, + 512510400, + 528235200, + 543960000, + 559684800, + 575409600, + 591134400, + 606859200, + 622584000, + 638308800, + 654638400, + 670363200, + 670366800, + 683582400, + 703018800, + 717530400, + 734468400, + 748980000, + 765918000, + 780429600, + 797367600, + 811879200, + 828817200, + 843933600, + 859671000, + 877811400, + 891120600, + 909261000, + 922570200, + 941315400, + 954019800, + 972765000, + 985469400, + 1004214600, + 1017523800, + 1035664200, + 1048973400, + 1067113800, + 1080423000, + 1099168200, + 1111872600, + 1123783200 + ], + "types": [ + { + "offset": 17904 + }, + { + "offset": 18000 + }, + { + "offset": 21600 + }, + { + "offset": 25200 + }, + { + "offset": 21600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f26b875165969e75-9e25992ccdfbaa1f.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f26b875165969e75-9e25992ccdfbaa1f.json new file mode 100644 index 00000000000000..c9e09d0aecd898 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f26b875165969e75-9e25992ccdfbaa1f.json @@ -0,0 +1,89 @@ +{ + "ids": [ + "asia/ashgabat", + "asia/ashkhabad" + ], + "tzif": { + "posix": { + "abbr": "+05", + "offset": 18000, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 4, + 2, + 4, + 1, + 2, + 4 + ], + "transitions": [ + -1441166012, + -1247544000, + 354913200, + 370720800, + 386449200, + 402256800, + 417985200, + 433792800, + 449607600, + 465339600, + 481064400, + 496789200, + 512514000, + 528238800, + 543963600, + 559688400, + 575413200, + 591138000, + 606862800, + 622587600, + 638312400, + 654642000, + 670366800, + 670370400, + 686095200, + 695772000 + ], + "types": [ + { + "offset": 14012 + }, + { + "offset": 14400 + }, + { + "offset": 18000 + }, + { + "offset": 21600 + }, + { + "offset": 18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f5114ea1ad21a447-657f9c7873c390b2.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f5114ea1ad21a447-657f9c7873c390b2.json new file mode 100644 index 00000000000000..5c3e9b5f33aec7 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f5114ea1ad21a447-657f9c7873c390b2.json @@ -0,0 +1,250 @@ +{ + "ids": [ + "america/north_dakota/beulah" + ], + "tzif": { + "posix": { + "abbr": "CST", + "offset": -21600, + "transition": { + "abbr": "CDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 3 + ], + "transitions": [ + -2717643600, + -1633273200, + -1615132800, + -1601823600, + -1583683200, + -880210800, + -769395600, + -765388800, + -84380400, + -68659200, + -52930800, + -37209600, + -21481200, + -5760000, + 9968400, + 25689600, + 41418000, + 57744000, + 73472400, + 89193600, + 104922000, + 120643200, + 126694800, + 152092800, + 162378000, + 183542400, + 199270800, + 215596800, + 230720400, + 247046400, + 262774800, + 278496000, + 294224400, + 309945600, + 325674000, + 341395200, + 357123600, + 372844800, + 388573200, + 404899200, + 420022800, + 436348800, + 452077200, + 467798400, + 483526800, + 499248000, + 514976400, + 530697600, + 544611600, + 562147200, + 576061200, + 594201600, + 607510800, + 625651200, + 638960400, + 657100800, + 671014800, + 688550400, + 702464400, + 720000000, + 733914000, + 752054400, + 765363600, + 783504000, + 796813200, + 814953600, + 828867600, + 846403200, + 860317200, + 877852800, + 891766800, + 909302400, + 923216400, + 941356800, + 954666000, + 972806400, + 986115600, + 1004256000, + 1018170000, + 1035705600, + 1049619600, + 1067155200, + 1081069200, + 1099209600, + 1112518800, + 1130659200, + 1143968400, + 1162108800, + 1173603600, + 1194163200, + 1205053200, + 1225612800, + 1236502800, + 1257062400, + 1268557200, + 1289116800 + ], + "types": [ + { + "offset": -24427 + }, + { + "offset": -25200 + }, + { + "offset": -21600 + }, + { + "offset": -21600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f58f911ab743ef1d-f57255d26abdda48.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f58f911ab743ef1d-f57255d26abdda48.json new file mode 100644 index 00000000000000..59efca99579c48 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f58f911ab743ef1d-f57255d26abdda48.json @@ -0,0 +1,29 @@ +{ + "ids": [ + "antarctica/syowa", + "asia/aden", + "asia/kuwait", + "asia/riyadh" + ], + "tzif": { + "posix": { + "abbr": "+03", + "offset": 10800, + "transition": null + }, + "transition_types": [ + 1 + ], + "transitions": [ + -719636812 + ], + "types": [ + { + "offset": 11212 + }, + { + "offset": 10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f5b99738d99ddd8c-edf53ab20b57f392.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f5b99738d99ddd8c-edf53ab20b57f392.json new file mode 100644 index 00000000000000..8f2aac78f33316 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f5b99738d99ddd8c-edf53ab20b57f392.json @@ -0,0 +1,171 @@ +{ + "ids": [ + "america/argentina/san_juan" + ], + "tzif": { + "posix": { + "abbr": "-03", + "offset": -10800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 2, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 3, + 4, + 3, + 4, + 2, + 3, + 4, + 5, + 3, + 4 + ], + "transitions": [ + -2372095556, + -1567453392, + -1233432000, + -1222981200, + -1205956800, + -1194037200, + -1172865600, + -1162501200, + -1141329600, + -1130965200, + -1109793600, + -1099429200, + -1078257600, + -1067806800, + -1046635200, + -1036270800, + -1015099200, + -1004734800, + -983563200, + -973198800, + -952027200, + -941576400, + -931032000, + -900882000, + -890337600, + -833749200, + -827265600, + -752274000, + -733780800, + -197326800, + -190843200, + -184194000, + -164491200, + -152658000, + -132955200, + -121122000, + -101419200, + -86821200, + -71092800, + -54766800, + -39038400, + -23317200, + -7588800, + 128142000, + 136605600, + 596948400, + 605066400, + 624423600, + 636516000, + 656478000, + 667792800, + 673588800, + 687927600, + 699415200, + 719377200, + 731469600, + 938919600, + 952052400, + 1085972400, + 1090728000, + 1198983600, + 1205632800 + ], + "types": [ + { + "offset": -16444 + }, + { + "offset": -15408 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + }, + { + "offset": -10800 + }, + { + "offset": -7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f61469e5df5071ba-1d93153e2c1ef413.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f61469e5df5071ba-1d93153e2c1ef413.json new file mode 100644 index 00000000000000..eb858b8e5f7885 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f61469e5df5071ba-1d93153e2c1ef413.json @@ -0,0 +1,138 @@ +{ + "ids": [ + "america/regina", + "canada/saskatchewan" + ], + "tzif": { + "posix": { + "abbr": "CST", + "offset": -21600, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 3 + ], + "transitions": [ + -2030202084, + -1632063600, + -1615132800, + -1251651600, + -1238349600, + -1220202000, + -1206900000, + -1188752400, + -1175450400, + -1156698000, + -1144000800, + -1125248400, + -1111946400, + -1032714000, + -1016992800, + -1001264400, + -986148000, + -969814800, + -954093600, + -937760400, + -922039200, + -906310800, + -890589600, + -880210800, + -769395600, + -765388800, + -748450800, + -732729600, + -715791600, + -702489600, + -684342000, + -671040000, + -652892400, + -639590400, + -620838000, + -608140800, + -589388400, + -576086400, + -557938800, + -544636800, + -526489200, + -513187200, + -495039600, + -481737600, + -463590000, + -450288000, + -431535600, + -418233600, + -400086000, + -386784000, + -337186800, + -321465600, + -305737200 + ], + "types": [ + { + "offset": -25116 + }, + { + "offset": -25200 + }, + { + "offset": -21600 + }, + { + "offset": -21600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f665c39691dff65-eb8beb46e71e4a05.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f665c39691dff65-eb8beb46e71e4a05.json new file mode 100644 index 00000000000000..d865aaa78403d5 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f665c39691dff65-eb8beb46e71e4a05.json @@ -0,0 +1,199 @@ +{ + "ids": [ + "eet", + "europe/athens" + ], + "tzif": { + "posix": { + "abbr": "EET", + "offset": 7200, + "transition": { + "abbr": "EEST", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 5, + 0 + ] + }, + "time": 14400 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 5, + 0 + ] + }, + "time": 10800 + } + } + }, + "transition_types": [ + 0, + 1, + 2, + 1, + 2, + 1, + 3, + 4, + 1, + 3, + 4, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3, + 2, + 1, + 3 + ], + "transitions": [ + -2344642492, + -1686101632, + -1182996000, + -1178161200, + -906861600, + -904878000, + -857257200, + -844477200, + -828237600, + -812422800, + -552362400, + -541652400, + 166485600, + 186184800, + 198028800, + 213753600, + 228873600, + 244080000, + 260323200, + 275446800, + 291798000, + 307407600, + 323388000, + 338936400, + 347148000, + 370400400, + 386125200, + 401850000, + 417574800, + 433299600, + 449024400, + 465354000, + 481078800, + 496803600, + 512528400, + 528253200, + 543978000, + 559702800, + 575427600, + 591152400, + 606877200, + 622602000, + 638326800, + 654656400, + 670381200, + 686106000, + 701830800, + 717555600, + 733280400, + 749005200, + 764730000, + 780454800, + 796179600, + 811904400, + 828234000, + 846378000 + ], + "types": [ + { + "offset": 5692 + }, + { + "offset": 7200 + }, + { + "offset": 10800 + }, + { + "offset": 7200 + }, + { + "offset": 3600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f6698c0e9f2fa661-cfcf92aaf6d6e5be.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f6698c0e9f2fa661-cfcf92aaf6d6e5be.json new file mode 100644 index 00000000000000..b547777f8c6c72 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f6698c0e9f2fa661-cfcf92aaf6d6e5be.json @@ -0,0 +1,19 @@ +{ + "ids": [ + "etc/gmt-14" + ], + "tzif": { + "posix": { + "abbr": "+14", + "offset": 50400, + "transition": null + }, + "transition_types": [], + "transitions": [], + "types": [ + { + "offset": 50400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f677bd8d940386cc-6f4acf146c31eb70.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f677bd8d940386cc-6f4acf146c31eb70.json new file mode 100644 index 00000000000000..47763968465bae --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f677bd8d940386cc-6f4acf146c31eb70.json @@ -0,0 +1,199 @@ +{ + "ids": [ + "america/campo_grande" + ], + "tzif": { + "posix": { + "abbr": "-04", + "offset": -14400, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2 + ], + "transitions": [ + -1767212492, + -1206954000, + -1191358800, + -1175371200, + -1159822800, + -633816000, + -622065600, + -602280000, + -591829200, + -570744000, + -560206800, + -539121600, + -531349200, + -191361600, + -184194000, + -155160000, + -150066000, + -128894400, + -121122000, + -99950400, + -89586000, + -68414400, + -57963600, + 499752000, + 511239600, + 530596800, + 540270000, + 562132800, + 571201200, + 592977600, + 602046000, + 624427200, + 634705200, + 656481600, + 666759600, + 687931200, + 697604400, + 719985600, + 728449200, + 750830400, + 761713200, + 782280000, + 793162800, + 813729600, + 824007600, + 844574400, + 856062000, + 876110400, + 888721200, + 908078400, + 919566000, + 938923200, + 951620400, + 970977600, + 982465200, + 1003032000, + 1013914800, + 1036296000, + 1045364400, + 1066536000, + 1076814000, + 1099368000, + 1108868400, + 1129435200, + 1140318000, + 1162699200, + 1172372400, + 1192334400, + 1203217200, + 1224388800, + 1234666800, + 1255838400, + 1266721200, + 1287288000, + 1298170800, + 1318737600, + 1330225200, + 1350792000, + 1361070000, + 1382241600, + 1392519600, + 1413691200, + 1424574000, + 1445140800, + 1456023600, + 1476590400 + ], + "types": [ + { + "offset": -13108 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f757031187208623-b42f12ebe4b7bfcb.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f757031187208623-b42f12ebe4b7bfcb.json new file mode 100644 index 00000000000000..bd50018f90a8e7 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f757031187208623-b42f12ebe4b7bfcb.json @@ -0,0 +1,35 @@ +{ + "ids": [ + "america/martinique" + ], + "tzif": { + "posix": { + "abbr": "AST", + "offset": -14400, + "transition": null + }, + "transition_types": [ + 0, + 1, + 2, + 1 + ], + "transitions": [ + -2524506940, + -1851537340, + 323841600, + 338958000 + ], + "types": [ + { + "offset": -14660 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f7b886dc80987d1f-1cfc3c180fd77cd3.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f7b886dc80987d1f-1cfc3c180fd77cd3.json new file mode 100644 index 00000000000000..b353610bde65fa --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f7b886dc80987d1f-1cfc3c180fd77cd3.json @@ -0,0 +1,150 @@ +{ + "ids": [ + "america/indiana/vincennes" + ], + "tzif": { + "posix": { + "abbr": "EST", + "offset": -18000, + "transition": { + "abbr": "EDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 2, + 3 + ], + "transitions": [ + -2717647200, + -1633276800, + -1615136400, + -1601827200, + -1583686800, + -880214400, + -769395600, + -765392400, + -747244800, + -733942800, + -526492800, + -513190800, + -495043200, + -481741200, + -462996000, + -450291600, + -431539200, + -418237200, + -400089600, + -386787600, + -368640000, + -355338000, + -337190400, + -323888400, + -305740800, + -289414800, + -273686400, + -260989200, + -242236800, + -226515600, + -210787200, + -195066000, + -179337600, + -21488400, + -5767200, + 9961200, + 25682400, + 1143961200, + 1143964800, + 1162105200, + 1173600000, + 1194159600 + ], + "types": [ + { + "offset": -21007 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + }, + { + "offset": -18000 + }, + { + "offset": -14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f80d3a6707532038-3bae731e777368b6.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f80d3a6707532038-3bae731e777368b6.json new file mode 100644 index 00000000000000..927f2444f49d33 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f80d3a6707532038-3bae731e777368b6.json @@ -0,0 +1,19 @@ +{ + "ids": [ + "etc/gmt+8" + ], + "tzif": { + "posix": { + "abbr": "-08", + "offset": -28800, + "transition": null + }, + "transition_types": [], + "transitions": [], + "types": [ + { + "offset": -28800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f842f34f4c14fee1-6af6c77813d81c95.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f842f34f4c14fee1-6af6c77813d81c95.json new file mode 100644 index 00000000000000..253d5af0774355 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f842f34f4c14fee1-6af6c77813d81c95.json @@ -0,0 +1,33 @@ +{ + "ids": [ + "africa/monrovia" + ], + "tzif": { + "posix": { + "abbr": "GMT", + "offset": 0, + "transition": null + }, + "transition_types": [ + 0, + 1, + 2 + ], + "transitions": [ + -2776979812, + -1604359012, + 63593070 + ], + "types": [ + { + "offset": -2588 + }, + { + "offset": -2670 + }, + { + "offset": 0 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f87d2aa5dfe5efe9-6f6f56db37ced2fd.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f87d2aa5dfe5efe9-6f6f56db37ced2fd.json new file mode 100644 index 00000000000000..b6920701a2982f --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f87d2aa5dfe5efe9-6f6f56db37ced2fd.json @@ -0,0 +1,244 @@ +{ + "ids": [ + "america/kentucky/monticello" + ], + "tzif": { + "posix": { + "abbr": "EST", + "offset": -18000, + "transition": { + "abbr": "EDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3 + ], + "transitions": [ + -2717647200, + -1633276800, + -1615136400, + -1601827200, + -1583686800, + -880214400, + -769395600, + -765392400, + -52934400, + -37213200, + -21484800, + -5763600, + 9964800, + 25686000, + 41414400, + 57740400, + 73468800, + 89190000, + 104918400, + 120639600, + 126691200, + 152089200, + 162374400, + 183538800, + 199267200, + 215593200, + 230716800, + 247042800, + 262771200, + 278492400, + 294220800, + 309942000, + 325670400, + 341391600, + 357120000, + 372841200, + 388569600, + 404895600, + 420019200, + 436345200, + 452073600, + 467794800, + 483523200, + 499244400, + 514972800, + 530694000, + 544608000, + 562143600, + 576057600, + 594198000, + 607507200, + 625647600, + 638956800, + 657097200, + 671011200, + 688546800, + 702460800, + 719996400, + 733910400, + 752050800, + 765360000, + 783500400, + 796809600, + 814950000, + 828864000, + 846399600, + 860313600, + 877849200, + 891763200, + 909298800, + 923212800, + 941353200, + 954662400, + 972802800, + 986108400, + 1004248800, + 1018162800, + 1035698400, + 1049612400, + 1067148000, + 1081062000, + 1099202400, + 1112511600, + 1130652000, + 1143961200, + 1162101600, + 1173596400, + 1194156000 + ], + "types": [ + { + "offset": -20364 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + }, + { + "offset": -18000 + }, + { + "offset": -14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f8baa073f0e62ab0-5c9c06226b1920d5.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f8baa073f0e62ab0-5c9c06226b1920d5.json new file mode 100644 index 00000000000000..99c15cada043d1 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f8baa073f0e62ab0-5c9c06226b1920d5.json @@ -0,0 +1,220 @@ +{ + "ids": [ + "america/detroit", + "us/michigan" + ], + "tzif": { + "posix": { + "abbr": "EST", + "offset": -18000, + "transition": { + "abbr": "EDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 3, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2 + ], + "transitions": [ + -2051202469, + -1724083200, + -880218000, + -769395600, + -765396000, + -684349200, + -671047200, + -80506740, + -68666400, + -52938000, + -37216800, + 104914800, + 120636000, + 126687600, + 152085600, + 167814000, + 183535200, + 199263600, + 215589600, + 230713200, + 247039200, + 262767600, + 278488800, + 294217200, + 309938400, + 325666800, + 341388000, + 357116400, + 372837600, + 388566000, + 404892000, + 420015600, + 436341600, + 452070000, + 467791200, + 483519600, + 499240800, + 514969200, + 530690400, + 544604400, + 562140000, + 576054000, + 594194400, + 607503600, + 625644000, + 638953200, + 657093600, + 671007600, + 688543200, + 702457200, + 719992800, + 733906800, + 752047200, + 765356400, + 783496800, + 796806000, + 814946400, + 828860400, + 846396000, + 860310000, + 877845600, + 891759600, + 909295200, + 923209200, + 941349600, + 954658800, + 972799200, + 986108400, + 1004248800, + 1018162800, + 1035698400, + 1049612400, + 1067148000, + 1081062000, + 1099202400, + 1112511600, + 1130652000, + 1143961200, + 1162101600, + 1173596400, + 1194156000 + ], + "types": [ + { + "offset": -19931 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + }, + { + "offset": -14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f9736e8dcd3eb5de-9c17b925c6652d48.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f9736e8dcd3eb5de-9c17b925c6652d48.json new file mode 100644 index 00000000000000..017b9e2cbb27c0 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f9736e8dcd3eb5de-9c17b925c6652d48.json @@ -0,0 +1,238 @@ +{ + "ids": [ + "antarctica/macquarie" + ], + "tzif": { + "posix": { + "abbr": "AEST", + "offset": 36000, + "transition": { + "abbr": "AEDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 4, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 10, + 1, + 0 + ] + }, + "time": 10800 + } + } + }, + "transition_types": [ + 1, + 2, + 2, + 1, + 0, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1 + ], + "transitions": [ + -2214259200, + -1680508800, + -1669892400, + -1665388800, + -1601719200, + -687052800, + -71136000, + -55411200, + -37267200, + -25776000, + -5817600, + 5673600, + 25632000, + 37728000, + 57686400, + 67968000, + 89136000, + 100022400, + 120585600, + 131472000, + 152035200, + 162921600, + 183484800, + 194976000, + 215539200, + 226425600, + 246988800, + 257875200, + 278438400, + 289324800, + 309888000, + 320774400, + 341337600, + 352224000, + 372787200, + 386092800, + 404841600, + 417542400, + 436291200, + 447177600, + 467740800, + 478627200, + 499190400, + 510076800, + 530035200, + 542736000, + 562089600, + 574790400, + 594144000, + 606240000, + 625593600, + 637689600, + 657043200, + 670348800, + 686678400, + 701798400, + 718128000, + 733248000, + 749577600, + 764697600, + 781027200, + 796147200, + 812476800, + 828201600, + 844531200, + 859651200, + 875980800, + 891100800, + 907430400, + 922550400, + 938880000, + 954000000, + 967305600, + 985449600, + 1002384000, + 1017504000, + 1033833600, + 1048953600, + 1065283200, + 1080403200, + 1096732800, + 1111852800, + 1128182400, + 1143907200, + 1159632000, + 1174752000, + 1191686400, + 1207411200, + 1223136000, + 1238860800, + 1254585600, + 1293800400 + ], + "types": [ + { + "offset": 0 + }, + { + "offset": 36000 + }, + { + "offset": 39600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f9878deac6fa797b-63a1fb86a70f62e5.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f9878deac6fa797b-63a1fb86a70f62e5.json new file mode 100644 index 00000000000000..65edcbca472d58 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-f9878deac6fa797b-63a1fb86a70f62e5.json @@ -0,0 +1,181 @@ +{ + "ids": [ + "asia/yerevan" + ], + "tzif": { + "posix": { + "abbr": "+04", + "offset": 14400, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 4, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4 + ], + "transitions": [ + -1441162680, + -405140400, + 354916800, + 370724400, + 386452800, + 402260400, + 417988800, + 433796400, + 449611200, + 465343200, + 481068000, + 496792800, + 512517600, + 528242400, + 543967200, + 559692000, + 575416800, + 591141600, + 606866400, + 622591200, + 638316000, + 654645600, + 670370400, + 670374000, + 686098800, + 701823600, + 717548400, + 733273200, + 748998000, + 764722800, + 780447600, + 796172400, + 811897200, + 859672800, + 877816800, + 891122400, + 909266400, + 922572000, + 941320800, + 954021600, + 972770400, + 985471200, + 1004220000, + 1017525600, + 1035669600, + 1048975200, + 1067119200, + 1080424800, + 1099173600, + 1111874400, + 1130623200, + 1143324000, + 1162072800, + 1174773600, + 1193522400, + 1206828000, + 1224972000, + 1238277600, + 1256421600, + 1269727200, + 1288476000, + 1301176800, + 1319925600 + ], + "types": [ + { + "offset": 10680 + }, + { + "offset": 10800 + }, + { + "offset": 14400 + }, + { + "offset": 18000 + }, + { + "offset": 14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fb562061c0f6e08b-c76bafb046d43b7.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fb562061c0f6e08b-c76bafb046d43b7.json new file mode 100644 index 00000000000000..793ebc2a041759 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fb562061c0f6e08b-c76bafb046d43b7.json @@ -0,0 +1,63 @@ +{ + "ids": [ + "pacific/fiji" + ], + "tzif": { + "posix": { + "abbr": "+12", + "offset": 43200, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2 + ], + "transitions": [ + -1709985344, + 909842400, + 920124000, + 941896800, + 951573600, + 1259416800, + 1269698400, + 1287842400, + 1299333600, + 1319292000, + 1327154400, + 1350741600, + 1358604000, + 1382796000, + 1390050000, + 1414850400, + 1421503200, + 1446300000 + ], + "types": [ + { + "offset": 42944 + }, + { + "offset": 43200 + }, + { + "offset": 46800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fb66f3417dbb2dfe-e13d26a5a5a0ef65.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fb66f3417dbb2dfe-e13d26a5a5a0ef65.json new file mode 100644 index 00000000000000..fd844e55176c97 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fb66f3417dbb2dfe-e13d26a5a5a0ef65.json @@ -0,0 +1,51 @@ +{ + "ids": [ + "asia/karachi" + ], + "tzif": { + "posix": { + "abbr": "PKT", + "offset": 18000, + "transition": null + }, + "transition_types": [ + 1, + 2, + 1, + 3, + 3, + 4, + 3, + 4, + 3 + ], + "transitions": [ + -1988166492, + -862637400, + -764145000, + -576135000, + 38775600, + 1018119600, + 1033840800, + 1212260400, + 1225476000 + ], + "types": [ + { + "offset": 16092 + }, + { + "offset": 19800 + }, + { + "offset": 23400 + }, + { + "offset": 18000 + }, + { + "offset": 21600 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fbccf04b5b2fd7f2-b508b8cbe01e354b.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fbccf04b5b2fd7f2-b508b8cbe01e354b.json new file mode 100644 index 00000000000000..30a52d91a942b3 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fbccf04b5b2fd7f2-b508b8cbe01e354b.json @@ -0,0 +1,71 @@ +{ + "ids": [ + "america/managua" + ], + "tzif": { + "posix": { + "abbr": "CST", + "offset": -21600, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 3, + 4, + 2 + ], + "transitions": [ + -2524500892, + -1121105688, + 105084000, + 161758800, + 290584800, + 299134800, + 322034400, + 330584400, + 694260000, + 717310800, + 725868000, + 852094800, + 1113112800, + 1128229200, + 1146384000, + 1159682400 + ], + "types": [ + { + "offset": -20708 + }, + { + "offset": -20712 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + }, + { + "offset": -18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fc89b67bba9eff21-ed937c5b2210118e.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fc89b67bba9eff21-ed937c5b2210118e.json new file mode 100644 index 00000000000000..50e98b18b43d37 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fc89b67bba9eff21-ed937c5b2210118e.json @@ -0,0 +1,58 @@ +{ + "ids": [ + "asia/kuala_lumpur", + "asia/singapore", + "singapore" + ], + "tzif": { + "posix": { + "abbr": "+08", + "offset": 28800, + "transition": null + }, + "transition_types": [ + 0, + 1, + 2, + 2, + 3, + 4, + 5, + 4, + 6 + ], + "transitions": [ + -2177477725, + -2038200925, + -1167634800, + -1073028000, + -894180000, + -879665400, + -767005200, + 378662400 + ], + "types": [ + { + "offset": 24925 + }, + { + "offset": 25200 + }, + { + "offset": 26400 + }, + { + "offset": 26400 + }, + { + "offset": 27000 + }, + { + "offset": 32400 + }, + { + "offset": 28800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fc9fd017e19a24e0-530492ba8305e348.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fc9fd017e19a24e0-530492ba8305e348.json new file mode 100644 index 00000000000000..056912956ddca5 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fc9fd017e19a24e0-530492ba8305e348.json @@ -0,0 +1,278 @@ +{ + "ids": [ + "america/indiana/knox", + "america/knox_in", + "us/indiana-starke" + ], + "tzif": { + "posix": { + "abbr": "CST", + "offset": -21600, + "transition": { + "abbr": "CDT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 2, + 3, + 1, + 2, + 3, + 1, + 2, + 3, + 1 + ], + "transitions": [ + -2717647200, + -1633276800, + -1615136400, + -1601827200, + -1583686800, + -880214400, + -769395600, + -765392400, + -715795200, + -702493200, + -684345600, + -671043600, + -652896000, + -639594000, + -620841600, + -608144400, + -589392000, + -576090000, + -557942400, + -544640400, + -526492800, + -513190800, + -495043200, + -481741200, + -463593600, + -447267600, + -431539200, + -415818000, + -400089600, + -386787600, + -368640000, + -355338000, + -337190400, + -321469200, + -305740800, + -289414800, + -273686400, + -257965200, + -242236800, + -195066000, + -84384000, + -68662800, + -52934400, + -37213200, + -21484800, + -5763600, + 9964800, + 25686000, + 41414400, + 57740400, + 73468800, + 89190000, + 104918400, + 120639600, + 126691200, + 152089200, + 162374400, + 183538800, + 199267200, + 215593200, + 230716800, + 247042800, + 262771200, + 278492400, + 294220800, + 309942000, + 325670400, + 341391600, + 357120000, + 372841200, + 388569600, + 404895600, + 420019200, + 436345200, + 452073600, + 467794800, + 483523200, + 499244400, + 514972800, + 530694000, + 544608000, + 562143600, + 576057600, + 594198000, + 607507200, + 625647600, + 638956800, + 657097200, + 671011200, + 688546800, + 1143961200, + 1143964800, + 1162105200, + 1173600000, + 1194159600 + ], + "types": [ + { + "offset": -20790 + }, + { + "offset": -21600 + }, + { + "offset": -18000 + }, + { + "offset": -18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fd03910821368f68-fa54b0ea0f2a14a7.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fd03910821368f68-fa54b0ea0f2a14a7.json new file mode 100644 index 00000000000000..0519e42c2f535a --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fd03910821368f68-fa54b0ea0f2a14a7.json @@ -0,0 +1,169 @@ +{ + "ids": [ + "america/argentina/mendoza", + "america/mendoza" + ], + "tzif": { + "posix": { + "abbr": "-03", + "offset": -10800, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 4, + 5, + 3, + 4, + 5, + 3, + 4, + 5, + 2, + 3, + 4, + 2, + 3, + 4, + 2, + 5, + 3, + 4, + 3, + 4, + 3, + 4, + 2, + 3, + 4, + 5, + 3, + 4 + ], + "transitions": [ + -2372095484, + -1567453392, + -1233432000, + -1222981200, + -1205956800, + -1194037200, + -1172865600, + -1162501200, + -1141329600, + -1130965200, + -1109793600, + -1099429200, + -1078257600, + -1067806800, + -1046635200, + -1036270800, + -1015099200, + -1004734800, + -983563200, + -973198800, + -952027200, + -941576400, + -931032000, + -900882000, + -890337600, + -833749200, + -827265600, + -752274000, + -733780800, + -197326800, + -190843200, + -184194000, + -164491200, + -152658000, + -132955200, + -121122000, + -101419200, + -86821200, + -71092800, + -54766800, + -39038400, + -23317200, + -7588800, + 128142000, + 136605600, + 596948400, + 605066400, + 624423600, + 636516000, + 655963200, + 667796400, + 687499200, + 699418800, + 719380800, + 731469600, + 938919600, + 952052400, + 1085281200, + 1096171200, + 1198983600, + 1205632800 + ], + "types": [ + { + "offset": -16516 + }, + { + "offset": -15408 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + }, + { + "offset": -10800 + }, + { + "offset": -7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fd823ec71e5980ce-fb04074f1843d568.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fd823ec71e5980ce-fb04074f1843d568.json new file mode 100644 index 00000000000000..4b7eff6aad2787 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fd823ec71e5980ce-fb04074f1843d568.json @@ -0,0 +1,31 @@ +{ + "ids": [ + "antarctica/mawson" + ], + "tzif": { + "posix": { + "abbr": "+05", + "offset": 18000, + "transition": null + }, + "transition_types": [ + 1, + 2 + ], + "transitions": [ + -501206400, + 1255809600 + ], + "types": [ + { + "offset": 0 + }, + { + "offset": 21600 + }, + { + "offset": 18000 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fe6e0efb644eced9-f06be10a091cfb41.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fe6e0efb644eced9-f06be10a091cfb41.json new file mode 100644 index 00000000000000..aa384805d2ab72 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fe6e0efb644eced9-f06be10a091cfb41.json @@ -0,0 +1,62 @@ +{ + "ids": [ + "america/lima" + ], + "tzif": { + "posix": { + "abbr": "-05", + "offset": -18000, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2 + ], + "transitions": [ + -2524503108, + -1938538284, + -1009825200, + -1002052800, + -986756400, + -971035200, + -955306800, + -939585600, + 504939600, + 512712000, + 536475600, + 544248000, + 631170000, + 638942400, + 757400400, + 765172800 + ], + "types": [ + { + "offset": -18492 + }, + { + "offset": -18516 + }, + { + "offset": -18000 + }, + { + "offset": -14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fe8583499fe1cbb8-a7cf0ef087069495.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fe8583499fe1cbb8-a7cf0ef087069495.json new file mode 100644 index 00000000000000..ab775569f30b0b --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fe8583499fe1cbb8-a7cf0ef087069495.json @@ -0,0 +1,39 @@ +{ + "ids": [ + "africa/abidjan", + "africa/accra", + "africa/bamako", + "africa/banjul", + "africa/conakry", + "africa/dakar", + "africa/freetown", + "africa/lome", + "africa/nouakchott", + "africa/ouagadougou", + "africa/timbuktu", + "atlantic/reykjavik", + "atlantic/st_helena", + "iceland" + ], + "tzif": { + "posix": { + "abbr": "GMT", + "offset": 0, + "transition": null + }, + "transition_types": [ + 1 + ], + "transitions": [ + -1830383032 + ], + "types": [ + { + "offset": -968 + }, + { + "offset": 0 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fed5f41e1701789d-daf8820af0fe9430.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fed5f41e1701789d-daf8820af0fe9430.json new file mode 100644 index 00000000000000..f3fa17f6c0d9e1 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fed5f41e1701789d-daf8820af0fe9430.json @@ -0,0 +1,19 @@ +{ + "ids": [ + "etc/gmt+3" + ], + "tzif": { + "posix": { + "abbr": "-03", + "offset": -10800, + "transition": null + }, + "transition_types": [], + "transitions": [], + "types": [ + { + "offset": -10800 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fef149820a82a100-d2fff4282c3ad1f4.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fef149820a82a100-d2fff4282c3ad1f4.json new file mode 100644 index 00000000000000..c3dc53bee57efd --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-fef149820a82a100-d2fff4282c3ad1f4.json @@ -0,0 +1,101 @@ +{ + "ids": [ + "asia/baku" + ], + "tzif": { + "posix": { + "abbr": "+04", + "offset": 14400, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 4, + 2, + 4, + 1, + 2, + 4, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4 + ], + "transitions": [ + -1441163964, + -405140400, + 354916800, + 370724400, + 386452800, + 402260400, + 417988800, + 433796400, + 449611200, + 465343200, + 481068000, + 496792800, + 512517600, + 528242400, + 543967200, + 559692000, + 575416800, + 591141600, + 606866400, + 622591200, + 638316000, + 654645600, + 670370400, + 670374000, + 686098800, + 701823600, + 717548400, + 828234000, + 846378000, + 859680000, + 877824000 + ], + "types": [ + { + "offset": 11964 + }, + { + "offset": 10800 + }, + { + "offset": 14400 + }, + { + "offset": 18000 + }, + { + "offset": 14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ff54b8a04d630c85-302a593cf4d0c55a.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ff54b8a04d630c85-302a593cf4d0c55a.json new file mode 100644 index 00000000000000..d242007bcbe260 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ff54b8a04d630c85-302a593cf4d0c55a.json @@ -0,0 +1,192 @@ +{ + "ids": [ + "asia/barnaul" + ], + "tzif": { + "posix": { + "abbr": "+07", + "offset": 25200, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 4, + 2, + 4, + 1, + 3, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 3, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4, + 1, + 2, + 4 + ], + "transitions": [ + -1579844100, + -1247551200, + 354906000, + 370713600, + 386442000, + 402249600, + 417978000, + 433785600, + 449600400, + 465332400, + 481057200, + 496782000, + 512506800, + 528231600, + 543956400, + 559681200, + 575406000, + 591130800, + 606855600, + 622580400, + 638305200, + 654634800, + 670359600, + 670363200, + 686088000, + 695764800, + 701809200, + 717534000, + 733258800, + 748983600, + 764708400, + 780433200, + 796158000, + 801590400, + 811886400, + 828216000, + 846360000, + 859665600, + 877809600, + 891115200, + 909259200, + 922564800, + 941313600, + 954014400, + 972763200, + 985464000, + 1004212800, + 1017518400, + 1035662400, + 1048968000, + 1067112000, + 1080417600, + 1099166400, + 1111867200, + 1130616000, + 1143316800, + 1162065600, + 1174766400, + 1193515200, + 1206820800, + 1224964800, + 1238270400, + 1256414400, + 1269720000, + 1288468800, + 1301169600, + 1414263600, + 1459022400 + ], + "types": [ + { + "offset": 20100 + }, + { + "offset": 21600 + }, + { + "offset": 25200 + }, + { + "offset": 28800 + }, + { + "offset": 25200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ffb42884e83683a9-7d164a9bb116efe3.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ffb42884e83683a9-7d164a9bb116efe3.json new file mode 100644 index 00000000000000..c5a59270882c14 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ffb42884e83683a9-7d164a9bb116efe3.json @@ -0,0 +1,147 @@ +{ + "ids": [ + "america/miquelon" + ], + "tzif": { + "posix": { + "abbr": "-03", + "offset": -10800, + "transition": { + "abbr": "-02", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 3, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 2 + ], + "transitions": [ + -1847650520, + 326001600, + 536468400, + 544593600, + 562132800, + 576046800, + 594187200, + 607496400, + 625636800, + 638946000, + 657086400, + 671000400, + 688536000, + 702450000, + 719985600, + 733899600, + 752040000, + 765349200, + 783489600, + 796798800, + 814939200, + 828853200, + 846388800, + 860302800, + 877838400, + 891752400, + 909288000, + 923202000, + 941342400, + 954651600, + 972792000, + 986101200, + 1004241600, + 1018155600, + 1035691200, + 1049605200, + 1067140800, + 1081054800, + 1099195200, + 1112504400, + 1130644800, + 1143954000, + 1162094400, + 1173589200, + 1194148800 + ], + "types": [ + { + "offset": -13480 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + }, + { + "offset": -7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ffd87968a303e340-9dec629c1fbdf2dc.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ffd87968a303e340-9dec629c1fbdf2dc.json new file mode 100644 index 00000000000000..ca1740bd142674 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ffd87968a303e340-9dec629c1fbdf2dc.json @@ -0,0 +1,72 @@ +{ + "ids": [ + "america/santo_domingo" + ], + "tzif": { + "posix": { + "abbr": "AST", + "offset": -14400, + "transition": null + }, + "transition_types": [ + 1, + 2, + 3, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 4, + 2, + 3, + 5, + 2, + 3, + 5 + ], + "transitions": [ + -2524504824, + -1159773600, + -100119600, + -89668800, + -5770800, + 4422600, + 25678800, + 33193800, + 57733200, + 64816200, + 89182800, + 96438600, + 120632400, + 127974600, + 152082000, + 972799200, + 975823200 + ], + "types": [ + { + "offset": -16776 + }, + { + "offset": -16800 + }, + { + "offset": -18000 + }, + { + "offset": -14400 + }, + { + "offset": -16200 + }, + { + "offset": -14400 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ffd87e4e007fc8e2-442f240405f9b3e2.json b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ffd87e4e007fc8e2-442f240405f9b3e2.json new file mode 100644 index 00000000000000..cb855c3f5c4047 --- /dev/null +++ b/deps/temporal/provider/src/data/debug/zoneinfo/tzifs/tzif-ffd87e4e007fc8e2-442f240405f9b3e2.json @@ -0,0 +1,371 @@ +{ + "ids": [ + "america/goose_bay" + ], + "tzif": { + "posix": { + "abbr": "AST", + "offset": -14400, + "transition": { + "abbr": "ADT", + "end": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 11, + 1, + 0 + ] + }, + "time": 7200 + }, + "savings": 3600, + "start": { + "date": { + "day": null, + "kind": "MonthWeekDay", + "mwd": [ + 3, + 2, + 0 + ] + }, + "time": 7200 + } + } + }, + "transition_types": [ + 1, + 2, + 1, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 4, + 3, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 7, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6 + ], + "transitions": [ + -2713895900, + -1632076148, + -1615145348, + -1096921748, + -1061670600, + -1048973400, + -1030221000, + -1017523800, + -998771400, + -986074200, + -966717000, + -954624600, + -935267400, + -922570200, + -903817800, + -891120600, + -872368200, + -769395600, + -765401400, + -746044200, + -733347000, + -714594600, + -701897400, + -683145000, + -670447800, + -651695400, + -638998200, + -619641000, + -606943800, + -589401000, + -576099000, + -557951400, + -544649400, + -526501800, + -513199800, + -495052200, + -481750200, + -463602600, + -450300600, + -431548200, + -418246200, + -400098600, + -386796600, + -368649000, + -355347000, + -337199400, + -323897400, + -305749800, + -289423800, + -273695400, + -257974200, + -242245800, + -226524600, + -210796200, + -195075000, + -179346600, + -163625400, + -147897000, + -131571000, + -119903400, + -116445600, + -100119600, + -84391200, + -68670000, + -52941600, + -37220400, + -21492000, + -5770800, + 9957600, + 25678800, + 41407200, + 57733200, + 73461600, + 89182800, + 104911200, + 120632400, + 136360800, + 152082000, + 167810400, + 183531600, + 199260000, + 215586000, + 230709600, + 247035600, + 262764000, + 278485200, + 294213600, + 309934800, + 325663200, + 341384400, + 357112800, + 372834000, + 388562400, + 404888400, + 420012000, + 436338000, + 452066400, + 467787600, + 483516000, + 499237200, + 514965600, + 530686800, + 544593660, + 562129260, + 576043260, + 594180060, + 607492860, + 625633260, + 638942460, + 657082860, + 670996860, + 688532460, + 702446460, + 719982060, + 733896060, + 752036460, + 765345660, + 783486060, + 796795260, + 814935660, + 828849660, + 846385260, + 860299260, + 877834860, + 891748860, + 909284460, + 923198460, + 941338860, + 954648060, + 972788460, + 986097660, + 1004238060, + 1018152060, + 1035687660, + 1049601660, + 1067137260, + 1081051260, + 1099191660, + 1112500860, + 1130641260, + 1143950460, + 1162090860, + 1173585660, + 1194145260, + 1205035260, + 1225594860, + 1236484860, + 1257044460, + 1268539260, + 1289098860, + 1299988860 + ], + "types": [ + { + "offset": -14500 + }, + { + "offset": -12652 + }, + { + "offset": -9052 + }, + { + "offset": -12600 + }, + { + "offset": -9000 + }, + { + "offset": -14400 + }, + { + "offset": -10800 + }, + { + "offset": -7200 + } + ] + } +} \ No newline at end of file diff --git a/deps/temporal/provider/src/data/iana_normalizer.rs.data b/deps/temporal/provider/src/data/iana_normalizer.rs.data new file mode 100644 index 00000000000000..40aa9cb95f588c --- /dev/null +++ b/deps/temporal/provider/src/data/iana_normalizer.rs.data @@ -0,0 +1,18 @@ +//@generated +// (by `bakeddata` binary in temporal_rs, using `databake`) + +#[macro_export] +macro_rules! iana_normalizer_singleton { + ($providername:ident) => { + pub const $providername : & 'static timezone_provider::IanaIdentifierNormalizer = + & timezone_provider::IanaIdentifierNormalizer { version : + alloc::borrow::Cow::Borrowed("2025b"), available_id_index : + zerotrie::ZeroAsciiIgnoreCaseTrie { store : unsafe { + zerovec::ZeroVec::from_bytes_unchecked(b"\xE1sabceghijklmnprstuwz\x0F\x0F\x0F\x13\x13\x13\x13\x13\x13\x13\x14\x14\x16\x16\x16\x16\x16\x16\x03*\xC2\x15>M\xD7\xE6\xF0\xF6*=\x17 *1\xC8\xD3\xE1gfmnrstu\x02\t\t\t\r\x0E\x1A(\xA9\xBC\x83\trica/\xE1rabcdefghjklmnopstw\0\0\0\0\0\0\0\0\0\x01\x01\x01\x01\x01\x01\x01\x01/i\x89\xB1\xBA\xC3\xCC\xD3\xE7\x0C@u\x9C\xA8\xB3\xBC\xD6\xC5bcdls\x06\n\x14\x1Aidjan\x80cra\x81dis_ababa\x82giers\x83m\xC2ae\x03ra\x84ra\x85\xC5ailru\x12\x17\x1E(\xC2mn\x04ako\x86\xC2gj\x03ui\x87ul\x88ssau\x89antyre\x8Aazzaville\x8Bjumbura\x8C\xC3aeo\x0F\x13\xC2is\x03ro\x8Dablanca\x8Euta\x8Fnakry\x90\0\xC3ajo\x14\x1C\xC2kr\x04ar\x90\x01_es_salaam\x90\x02ibouti\x90\x03uala\x90\x04l_aaiun\x90\x05reetown\x90\x06aborone\x90\x07arare\x90\x08\xC2ou\x0Channesburg\x90\tba\x90\n\xC3ahi\x07\x0Fmpala\x90\x0Bartoum\x90\x0C\xC2gn\x05ali\x90\rshasa\x90\x0E\xC4aiou\x05\x0F\x13gos\x90\x0Fbreville\x90\x10me\x90\x11\xC3abs\x05\x0Enda\x90\x12umbashi\x90\x13aka\x90\x14\xC3abo\x15\x1C\xC3lps\x05\nabo\x90\x15uto\x90\x16eru\x90\x17abane\x90\x18\xC2gn\x08adishu\x90\x19rovia\x90\x1A\xC4adio\x07\x0F\x15irobi\x90\x1Bjamena\x90\x1Camey\x90\x1Duakchott\x90\x1Euagadougou\x90\x1Forto-novo\x90 ao_tome\x90!\xC3iru\x08\x0Fmbuktu\x90\"ipoli\x90#nis\x90$indhoek\x90%erica/\xE1vabcdefghijklmnoprstvwy\0\x01\x01\x02\x02\x02\x02\x02\x03\x03\x03\x03\x04\x04\x04\x05\x05\x06\x06\x06\x06\xE7F\xF4-Xv\xD1\xEEg\x7F\xB7\xEC\x92\xEC\xF4g\xB0M\x87\x9A\xB0\xC5dnrst\x04\x1F\xC7\xCFak\x90&\xC3cgt\x08\x0Fhorage\x90'uilla\x90(igua\x90)\xC3agu\x08\x9Eguaina\x90*entina/\xC9bcjlmrstu\r17@HUmuuenos_aires\x90+\xC2ao\ttamarca\x90,\xC2mr\rodrivadavia\x90-doba\x90.ujuy\x90/a_rioja\x900endoza\x901io_gallegos\x902a\xC2ln\x04ta\x903_\xC2jl\x05uan\x904uis\x905ucuman\x906shuaia\x907ba\x908uncion\x909\xC2ik\x07kokan\x90:a\x90;\xC5aelou\x1A&2I\xC2hr\x0Fia\x90<_banderas\x90=bados\x90>l\xC2ei\x03m\x90?ze\x90@anc-sablon\x90A\xC3agi\x08\r_vista\x90Bota\x90Cse\x90Denos_aires\x90E\xC6ahioruCTa\x8C\x93\xC5mnrty\x19\x1E$,\xC2bp\x0Bridge_bay\x90Fo_grande\x90Gcun\x90Hacas\x90Iamarca\x90J\xC2em\x05nne\x90Kan\x90Li\xC2ch\x05ago\x90Muahua\x90Nudad_juarez\x90O\xC3rsy\x14\x1D\xC2ad\x0Bl_harbour\x90Poba\x90Qta_rica\x90Rhaique\x90Seston\x90T\xC2ir\x05aba\x90Uacao\x90V\xC3aeo\x1C+\xC2nw\x0Bmarkshavn\x90Wson\x90X_creek\x90Y\xC2nt\x05ver\x90Zroit\x90[minica\x90\\\xC4diln\x08\x10\x1Bmonton\x90]runepe\x90^_salvador\x90_senada\x90`ort\xC2_a\x11\xC2nw\x07elson\x90aayne\x90bleza\x90c\xC4loru\t\x1B.ace_bay\x90d\xC2do\x06thab\x90ese_bay\x90f\xC2ae\tnd_turk\x90gnada\x90h\xC2ay\x1C\xC3dty\x08\x0Feloupe\x90iemala\x90jaquil\x90kana\x90l\xC2ae\x0F\xC2lv\x06ifax\x90mana\x90nrmosillo\x90o\xC2nqn\xC2dueiana\xC2/pW\xC7ikmptvw\r\x12\x1A%/Andianapolis\x90pnox\x90qarengo\x90retersburg\x90sell_city\x90t\xC2ei\x05vay\x90uncennes\x90vinamac\x90wolis\x90xvik\x90yaluit\x90z\xC2au\x07maica\x90{\xC2jn\x04uy\x90|eau\x90}\xC3enr!(ntucky/\xC2lm\x0Bouisville\x90~onticello\x90\x7Fox_in\x91\0alendijk\x91\x01\xC3aio\x06\n_paz\x91\x02ma\x91\x03\xC3suw\n\x13_angeles\x91\x04isville\x91\x05er_princes\x91\x06\xC4aeio;ks\xC5cnrtz\x05\x11\"*eio\x91\x07a\xC2gu\x04ua\x91\x08s\x91\t\xC2it\x05got\x91\ninique\x91\x0Bamoros\x91\x0Catlan\x91\r\xC4nrtx\x10\x15\x1E\xC2do\x05oza\x91\x0Eminee\x91\x0Fida\x91\x10lakatla\x91\x11ico_city\x91\x12quelon\x91\x13n\xC2ct\x05ton\x91\x14\xC3ers\x0F\x14\xC2rv\x05rey\x91\x15ideo\x91\x16eal\x91\x17errat\x91\x18\xC5aeiou\x06\x0E\x15Lssau\x91\x19w_york\x91\x1Apigon\x91\x1B\xC2mr\x03e\x91\x1C\xC2ot\x05nha\x91\x1Dh_dakota/\xC3bcn\x07\x0Eeulah\x91\x1Eenter\x91\x1Few_salem\x91 uk\x91!jinaga\x91\"\xC4ahou\x1E%R\xC2nr\x11\xC2ag\x04ma\x91#nirtung\x91$amaribo\x91%oenix\x91&rt\xC3-_o\x0B\x15au-prince\x91'of_spain\x91(_\xC2av\x05cre\x91)elho\x91*\xC2en\nrto_rico\x91+ta_arenas\x91,\xC4aeio\x190:\xC2in\nny_river\x91-kin_inlet\x91.\xC3cgs\x05\nife\x91/ina\x910olute\x911o_branco\x912sario\x913\xC6achitw2>FK\x84\xC2no&t\xC3aio\x10\x15\xC2_r\x08isabel\x914em\x915ago\x916_domingo\x917_paulo\x918oresbysund\x919iprock\x91:tka\x91;_\xC6bjkltv\x0B\x11\x17\x1D$arthelemy\x91ucia\x91?homas\x91@incent\x91Aift_current\x91B\xC4ehio\x0B\x1C#gucigalpa\x91Cu\xC2ln\x03e\x91Dder_bay\x91Ejuana\x91Fr\xC2ot\x05nto\x91Gola\x91H\xC2ai\tncouver\x91Irgin\x91J\xC2hi\nitehorse\x91Knnipeg\x91L\xC2ae\x07kutat\x91Mllowknife\x91Ntarctica/\xC8cdmprstv\x06\x1D9@H[aasey\x91O\xC2au\x05vis\x91Pmontdurville\x91Q\xC2ac\x11\xC2cw\x08quarie\x91Rson\x91Smurdo\x91Talmer\x91Uothera\x91V\xC2oy\nuth_pole\x91Wowa\x91Xroll\x91Yostok\x91Zctic/longyearbyen\x91[ia/\xE1uabcdfghijkmnopqrstuvy\0\0\0\0\0\0\x01\x01\x01\x01\x01\x02\x02\x02\x02\x02\x02\x03\x03\x03G\x87\xC1\xF0\xFA\xFF,?]\xD0\xFD\x1F+Miz\xC1\x0BD\\\xC7dlmnqst\x04\n\x0F\x15!3en\x91\\maty\x91]man\x91^adyr\x91_t\xC2ao\x03u\x91`be\x91ah\xC2gk\x06abat\x91bhabad\x91cyrau\x91d\xC4aeir%+2\xC5ghknr\x06\x0C\x0F\x15hdad\x91erain\x91fu\x91ggkok\x91hnaul\x91iirut\x91jshkek\x91kunei\x91l\xC3aho\x08-lcutta\x91m\xC3iou\x04\x17ta\x91n\xC2in\x08balsan\x91ogqing\x91pngking\x91qlombo\x91r\xC4ahiu\x0F\x14\x18\xC2cm\x04ca\x91sascus\x91taka\x91uli\x91v\xC2bs\x04ai\x91whanbe\x91xamagusta\x91yaza\x91z\xC3aeo\x06\x0Crbin\x91{bron\x91|\xC3_nv\n\x12chi_minh\x91}g_kong\x91~d\x91\x7F\xC2rs\x07kutsk\x92\0tanbul\x92\x01\xC2ae\x11\xC2ky\x06arta\x92\x02apura\x92\x03rusalem\x92\x04\xC5ahoru3;BM\xC5bmrst\x04\x0C\x12\x18ul\x92\x05chatka\x92\x06achi\x92\x07hgar\x92\x08\xC2hm\x07mandu\x92\tandu\x92\nandyga\x92\x0Blkata\x92\x0Casnoyarsk\x92\r\xC3acw\x0B\x11la_lumpur\x92\x0Ehing\x92\x0Fait\x92\x10\xC2au#\xC4cgkn\t\x0F\x16a\xC2ou\x02\x92\x11\x92\x12adan\x92\x13assar\x92\x14ila\x92\x15scat\x92\x16\xC2io\x07cosia\x92\x17vo\xC2ks\tuznetsk\x92\x18ibirsk\x92\x19\xC2mr\x04sk\x92\x1Aal\x92\x1B\xC3hoy\n\x13nom_penh\x92\x1Cntianak\x92\x1Dongyang\x92\x1E\xC3aoy\x05\rtar\x92\x1Fstanay\x92 zylorda\x92!\xC2ai\x07ngoon\x92\"yadh\x92#\xC5aehir\x1A\x1F'0\xC3ikm\x05\x0Cgon\x92$halin\x92%arkand\x92&oul\x92'anghai\x92(ngapore\x92)ednekolymsk\x92*\xC5abeho\x10\x17'4\xC2is\x05pei\x92+hkent\x92,ilisi\x92-\xC2hl\x05ran\x92._aviv\x92/im\xC2bp\x03u\x920hu\x921\xC2km\x04yo\x922sk\x923\xC4jlrs\r#)ung_pandang\x924a\xC2an\tnbaatar\x925_bator\x926umqi\x927t-nera\x928\xC2il\tentiane\x929adivostok\x92:\xC2ae\x0F\xC2kn\x06utsk\x92;gon\x92<\xC2kr\x0Caterinburg\x92=evan\x92>lantic/\xC8abcfjmrs\x07\x0F\"0:BLzores\x92?ermuda\x92@a\xC2np\x05ary\x92Ae_verde\x92Ba\xC2er\x05roe\x92Coe\x92Dan_mayen\x92Eadeira\x92Feykjavik\x92G\xC2ot\ruth_georgia\x92H\xC2_a\x08helena\x92Inley\x92Jstralia/\xD0abcdehlmnpqstvwy\x0F%7>DKeo{\x81\x8C\x9B\xA4\xAD\xB2\xC2cd\x03t\x92Kelaide\x92Lr\xC2io\x07sbane\x92Mken_hill\x92N\xC2au\x08nberra\x92Orrie\x92Parwin\x92Qucla\x92Robart\x92S\xC3hio\x03\x0Bi\x92Tndeman\x92Urd_howe\x92Velbourne\x92W\xC2os\x05rth\x92Yw\x92Xerth\x92Zueensland\x92[\xC2oy\x05uth\x92\\dney\x92]asmania\x92^ictoria\x92_est\x92`ancowinna\x92arazil/\xC4adew\x05\x0F\x14cre\x92benoronha\x92cast\x92dest\x92e\xC5aehsu_b\x83\x8Anada/\xC8acemnpsy\t\x11\x19\"/7Dtlantic\x92hentral\x92iastern\x92jountain\x92kewfoundland\x92lacific\x92maskatchewan\x92nukon\x92ot\x92file/\xC2ce\x0Continental\x92pasterisland\x92qt6cdt\x92gba\x92r\xE1fegistu\0\0\0\0\0\x03\x08\x0C\x15\xBFt\x92sypt\x92vre\x92wt\x92t5edt\x92uc/\xC3guz\x88\x9D\xC2mr{t\x92x\xC3+-04p\xCA0123456789\x02\x10\x12\x14\x16\x18\x1A\x1C\x1E\x92y\x92z\xC3012\x02\x04\x92{\x92|\x92}\x92~\x92\x7F\x93\0\x93\x01\x93\x02\x93\x03\x93\x04\x93\x05\xCA0123456789\x02\x18\x1A\x1C\x1E \"$&\x93\x06\x93\x07\xC501234\x02\x04\x06\x08\x93\x08\x93\t\x93\n\x93\x0B\x93\x0C\x93\r\x93\x0E\x93\x0F\x93\x10\x93\x11\x93\x12\x93\x13\x93\x14\x93\x15eenwich\x93\x16\xC3cnt\x03\x0Ct\x93\x17iversal\x93\x19c\x93\x18ulu\x93\x1Arope/\xE1uabcdghijklmnoprstuvwz\0\0\0\0\0\0\0\0\0\x01\x01\x01\x01\x01\x01\x01\x01\x01\x02\x02'u\x8B\x92\xA7\xB0\xC6\xCD\xED\x14DLQkw\xC1\xDA\xEF\x1B\"\xC4mnst\t\x10\x19sterdam\x93\x1Bdorra\x93\x1Ctrakhan\x93\x1Dhens\x93\x1E\xC3eru\x18,\xC2lr\x0F\xC2fg\x05ast\x93\x1Frade\x93 lin\x93!\xC2au\ttislava\x93\"ssels\x93#\xC3cds\x08\x0Fharest\x93$apest\x93%ingen\x93&\xC2ho\x08isinau\x93'penhagen\x93(ublin\x93)\xC2iu\tbraltar\x93*ernsey\x93+elsinki\x93,s\xC2lt\ne_of_man\x93-anbul\x93.ersey\x93/\xC3aiy\x0B\x16liningrad\x930\xC2er\x03v\x931ov\x932iv\x933\xC4ijou\x06\x0F\x15sbon\x934ubljana\x935ndon\x936xembourg\x937\xC3aio\x17\x1C\xC3dlr\x05\trid\x938ta\x939iehamn\x93:nsk\x93;\xC2ns\x05aco\x93slo\x93?\xC3aor\x05\x0Eris\x93@dgorica\x93Aague\x93B\xC2io\x04ga\x93Cme\x93D\xC5aikot\",27\xC3mnr\x05\x0Eara\x93E_marino\x93Fa\xC2jt\x05evo\x93Gov\x93Hmferopol\x93Iopje\x93Jfia\x93Kockholm\x93L\xC2ai\x07llinn\x93Mra\xC2ns\x03e\x93Npol\x93O\xC2lz\tyanovsk\x93Phgorod\x93Q\xC3aio\x0E\x1D\xC2dt\x04uz\x93Rican\x93S\xC2el\x05nna\x93Tnius\x93Ulgograd\x93Varsaw\x93W\xC2au\x12\xC2gp\x05reb\x93Xorozhye\x93Yrich\x93Z\xC3bmr\t\x1A\x93[-eire\x93\\t\x93]\xC3+-0\x03\x060\x93^0\x93_\x93`eenwich\x93a\xC2os\x08ngkong\x93ct\x93b\xC4cnrs\x07x|eland\x93ddian/\xC5ackmr\r/9Zntananarivo\x93e\xC2ho\x11\xC2ar\x05gos\x93fistmas\x93g\xC2cm\x04os\x93horo\x93ierguelen\x93ja\xC4hluy\x03\n\x12e\x93kdives\x93lritius\x93motte\x93neunion\x93oan\x93prael\x93qa\xC2mp\x06aica\x93ran\x93swajalein\x93tibya\x93u\xC2es'\xC2tx\x02\x93vico/\xC2bg\x11aja\xC2ns\x06orte\x93yur\x93zeneral\x93{t\x93w7mdt\x93x\xC2az\x06vajo\x93~\x93|-chat\x93}\xE1daors\x01\x01\x01\xB4\xC4\xC7cific/\xE1qabcefghjkmnprstwy\0\0\0\0\0\0\0\0\0\0\0\x01\x01\x01\x01\x01\x10\x1D,F_\x85\x8E\x97\xBE\xD9\xF71;Ijw\xC2pu\x04ia\x94\x01ckland\x94\x02ougainville\x94\x03h\xC2au\x06tham\x94\x04uk\x94\x05\xC3afn\x06\x0Bster\x94\x06ate\x94\x07derbury\x94\x08\xC3aiu\x07\x0Bkaofo\x94\tji\x94\nnafuti\x94\x0B\xC2au\x12\xC2lm\x08apagos\x94\x0Cbier\x94\ra\xC2dm\talcanal\x94\x0E\x94\x0Fonolulu\x94\x10ohnston\x94\x11\xC4aiow\x06\x10\x16nton\x94\x12ritimati\x94\x13srae\x94\x14ajalein\x94\x15\xC2ai\x11\xC2jr\x05uro\x94\x16quesas\x94\x17dway\x94\x18\xC3aio\x05\turu\x94\x19ue\x94\x1A\xC2ru\x06folk\x94\x1Bmea\x94\x1C\xC3aio\x10\x18\xC2gl\x08o_pago\x94\x1Dau\x94\x1Etcairn\x94\x1F\xC3hnr\x06\x0Bnpei\x94 ape\x94!t_moresby\x94\"arotonga\x94#a\xC2im\x05pan\x94$oa\x94%\xC3aor\x0E\x17\xC2hr\x05iti\x94&awa\x94'ngatapu\x94(uk\x94)a\xC2kl\x03e\x94*lis\x94+ap\x94,\xC2lr\x05and\x94-tugal\x94.c\x93\x7Ft8pdt\x94\0o\xC2ck\x02\x94/\x940ingapore\x941urkey\x942\xC4cnst\x03\x0C\x8Ct\x943iversal\x94A/\xC8acehimps\x1B#7>Mai\xC2lr\x10\xC2ae\x05ska\x944utian\x945izona\x946entral\x947ast\xC2-e\tindiana\x948rn\x949awaii\x94:ndiana-starke\x94;\xC2io\x08chigan\x94amoa\x94?c\x94@\xC2-e\x04su\x94Bt\x94Culu\x94D") + }, }, non_canonical_identifiers : unsafe { + zerovec::ZeroVec::from_bytes_unchecked(b"\x01\0\0\0\0\0\0\0\x02\0\0\0+\0\0\0\x04\0\0\0+\0\0\0\x05\0\0\0+\0\0\0\x06\0\0\0\0\0\0\0\x07\0\0\0\x1F\0\0\0\x08\0\0\0\0\0\0\0\n\0\0\0&\0\0\0\x0B\0\0\0\x1F\0\0\0\x0C\0\0\0&\0\0\0\x10\0\0\0\0\0\0\0\x11\0\0\0\0\0\0\0\x12\0\0\0+\0\0\0\x13\0\0\0+\0\0\0\x14\0\0\0\x1F\0\0\0\x16\0\0\0\0\0\0\0\x17\0\0\0&\0\0\0\x18\0\0\0&\0\0\0\x1B\0\0\0+\0\0\0\x1D\0\0\0&\0\0\0\x1E\0\0\0\x1F\0\0\0 \0\0\0\x1F\0\0\0!\0\0\0\0\0\0\0\"\0\0\0\x1F\0\0\0#\0\0\0&\0\0\0$\0\0\0&\0\0\0%\0\0\0\x1F\0\0\0'\0\0\0\x19\0\0\0(\0\0\0\x19\0\0\0)\0\0\0+\0\0\0-\0\0\0\x1F\0\0\0.\0\0\0\0\0\0\0/\0\0\0\0\0\0\x000\0\0\0\x1F\0\0\x002\0\0\0\0\0\0\08\0\0\0\xBB\0\0\09\0\0\0\xBB\0\0\0=\0\0\0<\0\0\0H\0\0\0\xBB\0\0\0J\0\0\0\xB3\0\0\0K\0\0\x006\0\0\0Q\0\0\0\xBB\0\0\0U\0\0\0;\0\0\0Z\0\0\0<\0\0\0\\\0\0\0\xB3\0\0\0`\0\0\0\xB3\0\0\0a\0\0\0>\0\0\0d\0\0\0\xB6\0\0\0f\0\0\0\xBB\0\0\0l\0\0\0\xBB\0\0\0p\0\0\0\xD6\0\0\0r\0\0\0\x80\0\0\0u\0\0\0\xB1\0\0\0x\0\0\0\xBB\0\0\0y\0\0\0\xBB\0\0\0\x88\0\0\0\x80\0\0\0\x8C\0\0\0?\0\0\0\x90\0\0\0\x81\0\0\0\x91\0\0\0\xBB\0\0\0\x95\0\0\0\x8E\0\0\0\x96\0\0\0\xBB\0\0\0\x9A\0\0\0\xBB\0\0\0\x9E\0\0\0A\0\0\0\xA7\0\0\0\xD7\0\0\0\xA8\0\0\0\xBB\0\0\0\xA9\0\0\0\xD7\0\0\0\xAB\0\0\0\xD7\0\0\0\xB4\0\0\0\x8A\0\0\0\xB8\0\0\0\xBB\0\0\0\xB9\0\0\0\xC2\0\0\0\xBD\0\0\0\xDC\0\0\0\xC3\0\0\0>\0\0\0\xC4\0\0\0\xD6\0\0\0\xCA\0\0\0j\0\0\0\xCC\0\0\0\xBB\0\0\0\xCE\0\0\0\xBB\0\0\0\xCF\0\0\0\xBB\0\0\0\xD0\0\0\0\xBB\0\0\0\xD1\0\0\0\xBB\0\0\0\xD5\0\0\0\xD7\0\0\0\xD8\0\0\0\xBB\0\0\0\xDA\0\0\0\xBB\0\0\0\xDE\0\0\0m\0\0\0\xE1\0\0\x002\x02\0\0\xE4\0\0\0\x12\x02\0\0\xE7\0\0\0\x12\x02\0\0\xE8\0\0\x003\x01\0\0\xEB\0\0\0\xB1\x01\0\0\xEC\0\0\x003\x01\0\0\xF3\0\0\0\xF2\0\0\0\xF6\0\0\0/\x01\0\0\xFC\0\0\0\x1F\x01\0\0\xFD\0\0\0\x1C\x01\0\0\xFF\0\0\0E\x01\0\0\0\x01\0\08\x01\0\0\x01\x01\0\08\x01\0\0\x03\x01\0\0\x05\x01\0\0\x0B\x01\0\08\x01\0\0\x11\x01\0\0\xBE\x01\0\0\x18\x01\0\0G\x01\0\0\x1A\x01\0\0\x19\x01\0\0\x1E\x01\0\09\x01\0\0 \x01\0\x003\x01\0\0!\x01\0\0\"\x01\0\0&\x01\0\0\x07\x01\0\0,\x01\0\0\xF8\0\0\x002\x01\0\0L\x01\0\x004\x01\0\0\r\x01\0\0?\x01\0\0\x14\x01\0\0@\x01\0\0A\x01\0\0D\x01\0\0$\x01\0\0F\x01\0\0E\x01\0\0I\x01\0\0\xF8\0\0\0S\x01\0\0T\x01\0\0U\x01\0\0\xB1\x01\0\0W\x01\0\0\0\0\0\0Y\x01\0\0\0\0\0\0[\x01\0\0m\x01\0\0_\x01\0\0m\x01\0\0`\x01\0\0c\x01\0\0d\x01\0\0f\x01\0\0h\x01\0\0m\x01\0\0i\x01\0\0a\x01\0\0k\x01\0\0]\x01\0\0l\x01\0\0\\\x01\0\0n\x01\0\0c\x01\0\0o\x01\0\0g\x01\0\0p\x01\0\0j\x01\0\0q\x01\0\0^\x01\0\0r\x01\0\0\xC2\0\0\0s\x01\0\0\xAD\0\0\0t\x01\0\0\xC8\0\0\0u\x01\0\0\x99\0\0\0v\x01\0\0\xB3\x01\0\0w\x01\0\0]\0\0\0x\x01\0\0}\0\0\0y\x01\0\0\xDC\0\0\0z\x01\0\0\xD7\0\0\0{\x01\0\0m\0\0\0|\x01\0\0\xCD\0\0\0}\x01\0\0\xD9\0\0\0~\x01\0\0\xC0\0\0\0\x7F\x01\0\0\xDB\0\0\0\x80\x01\0\0\xC6\0\0\0\x81\x01\0\0\x16\x02\0\0\x82\x01\0\0~\0\0\0\x83\x01\0\0\xAE\x01\0\0\x84\x01\0\0\xB3\0\0\0\x85\x01\0\0\xAA\0\0\0\x86\x01\0\0\r\0\0\0\x87\x01\0\0\xB9\x01\0\0\x88\x01\0\0P\x02\0\0\x89\x01\0\0P\x02\0\0\x96\x01\0\0P\x02\0\0\xA5\x01\0\0P\x02\0\0\xA6\x01\0\0P\x02\0\0\xA7\x01\0\0P\x02\0\0\xA8\x01\0\0P\x02\0\0\xA9\x01\0\0P\x02\0\0\xAA\x01\0\0P\x02\0\0\xAB\x01\0\0\xB3\x01\0\0\xAF\x01\0\0\xC6\x01\0\0\xB2\x01\0\0\xD2\x01\0\0\xB6\x01\0\0\xEA\x01\0\0\xB8\x01\0\0\xB1\x01\0\0\xBB\x01\0\0\xC6\x01\0\0\xBD\x01\0\0\xC6\x01\0\0\xBF\x01\0\0\xC6\x01\0\0\xC1\x01\0\0\xC3\x01\0\0\xC5\x01\0\0\xB0\x01\0\0\xC7\x01\0\0\xB3\x01\0\0\xCA\x01\0\0\xBC\x01\0\0\xCC\x01\0\0\xD0\x01\0\0\xCE\x01\0\0'\x01\0\0\xCF\x01\0\0\xB1\x01\0\0\xD1\x01\0\0\xB0\x01\0\0\xD6\x01\0\0\xD4\x01\0\0\xD7\x01\0\0\xB0\x01\0\0\xDA\x01\0\0\xB0\x01\0\0\xDC\x01\0\0\xB1\x01\0\0\xDF\x01\0\0\xB7\x01\0\0\xE1\x01\0\0\xC3\x01\0\0\xE2\x01\0\0\xEA\x01\0\0\xE3\x01\0\0\xD4\x01\0\0\xE8\x01\0\0\xB0\x01\0\0\xE9\x01\0\0\xC3\x01\0\0\xEB\x01\0\0\xC6\x01\0\0\xEC\x01\0\0\xC6\x01\0\0\xED\x01\0\0P\x02\0\0\xEE\x01\0\0P\x02\0\0\xEF\x01\0\0P\x02\0\0\xF0\x01\0\0P\x02\0\0\xF1\x01\0\0P\x02\0\0\xF2\x01\0\0 \x02\0\0\xF3\x01\0\0\x0E\x01\0\0\xF4\x01\0\0\0\0\0\0\xF5\x01\0\0+\0\0\0\xF7\x01\0\0\xF8\0\0\0\xF8\x01\0\0L\x01\0\0\xF9\x01\0\0+\0\0\0\xFA\x01\0\0\xFC\x01\0\0\xFB\x01\0\0\x07\x01\0\0\xFE\x01\0\0+\0\0\0\xFF\x01\0\0\x07\x01\0\0\0\x02\0\0>\x01\0\0\x01\x02\0\0\x14\x01\0\0\x02\x02\0\0\x8B\0\0\0\x03\x02\0\0B\x01\0\0\x04\x02\0\0%\x02\0\0\x05\x02\0\x003\0\0\0\x06\x02\0\0\xB3\x01\0\0\x07\x02\0\0\xB6\0\0\0\x08\x02\0\0j\0\0\0\t\x02\0\0\xD6\0\0\0\n\x02\0\0\x9D\0\0\0\x0B\x02\0\0\xA2\0\0\0\x0C\x02\0\0\x12\x02\0\0\r\x02\0\0\x14\x02\0\0\x0E\x02\0\0j\0\0\0\x0F\x02\0\08\x01\0\0\x10\x02\0\0\x94\0\0\0\x15\x02\0\x002\x02\0\0\x18\x02\0\0\"\x02\0\0\x1B\x02\0\x007\x02\0\0!\x02\0\0 \x02\0\0&\x02\0\x007\x02\0\0(\x02\0\0-\x02\0\x000\x02\0\0\x1E\x02\0\x001\x02\0\0\x1E\x02\0\x004\x02\0\0\x1F\x02\0\x005\x02\0\0-\x02\0\09\x02\0\x002\x02\0\0:\x02\0\x007\x02\0\0;\x02\0\x007\x02\0\0<\x02\0\x002\x02\0\0=\x02\0\0\xE7\x01\0\0>\x02\0\0\xC4\x01\0\0?\x02\0\0;\x01\0\0@\x02\0\x007\x01\0\0A\x02\0\09\x01\0\0B\x02\0\0\xBE\x01\0\0C\x02\0\0P\x02\0\0D\x02\0\x007\0\0\0E\x02\0\x006\0\0\0F\x02\0\0\xB6\0\0\0G\x02\0\0]\0\0\0H\x02\0\0\x80\0\0\0I\x02\0\0\xAA\0\0\0J\x02\0\0 \x02\0\0K\x02\0\0\x81\0\0\0L\x02\0\0k\0\0\0M\x02\0\0j\0\0\0N\x02\0\0\x94\0\0\0O\x02\0\0-\x02\0\0Q\x02\0\0P\x02\0\0R\x02\0\0\xCD\x01\0\0S\x02\0\0\xC4\x01\0\0T\x02\0\0P\x02\0\0") + }, normalized_identifiers : unsafe { + zerovec::vecs::VarZeroVec16::from_bytes_unchecked(b"U\x02\x0E\0\x1A\0,\0:\0G\0T\0a\0n\0{\0\x88\0\x97\0\xA9\0\xB9\0\xC5\0\xD6\0\xE2\0\xF0\0\xFC\0\x10\x01\x1F\x01,\x01;\x01J\x01Y\x01f\x01y\x01\x84\x01\x92\x01\xA1\x01\xAE\x01\xBD\x01\xC9\x01\xDA\x01\xE5\x01\xF2\x01\x03\x02\x10\x02\x1D\x02*\x027\x02E\x02U\x02d\x02r\x02\x81\x02\x8E\x02\x9F\x02\xB1\x02\xC2\x02\xD1\x02\xE0\x02\xEE\x02\xFA\x02\t\x03\x15\x03&\x036\x03E\x03V\x03t\x03\x8F\x03\xAF\x03\xC8\x03\xDF\x03\xF9\x03\x12\x040\x04G\x04a\x04{\x04\x94\x04\xAD\x04\xBA\x04\xCA\x04\xDA\x04\xE6\x04\xF3\x04\t\x05\x19\x05&\x054\x05H\x05Y\x05g\x05t\x05\x88\x05\x9D\x05\xB1\x05\xBF\x05\xCE\x05\xDF\x05\xEE\x05\xFC\x05\x0B\x06\x1C\x061\x06F\x06U\x06g\x06x\x06\x87\x06\x95\x06\xA4\x06\xB8\x06\xC6\x06\xDA\x06\xE8\x06\xF7\x06\x07\x07\x17\x07'\x07:\x07J\x07]\x07o\x07\x80\x07\x91\x07\xA0\x07\xB1\x07\xC3\x07\xD2\x07\xE4\x07\xF5\x07\x06\x08\x14\x08#\x081\x08C\x08_\x08s\x08\x8A\x08\xA4\x08\xBD\x08\xD2\x08\xEB\x08\x02\t\x16\t$\t3\tB\tO\t]\tx\t\x93\t\xA2\t\xB4\t\xC2\t\xCE\t\xE1\t\xF3\t\x08\n\x16\n%\n3\nB\nT\ne\nu\n\x84\n\x95\n\xA3\n\xB5\n\xC8\n\xD8\n\xE7\n\xF8\n\n\x0B\x1A\x0B,\x0B:\x0BJ\x0BY\x0Be\x0Bt\x0B\x8F\x0B\xAA\x0B\xC8\x0B\xD4\x0B\xE3\x0B\xF1\x0B\x04\x0C\x16\x0C%\x0C;\x0CP\x0Cb\x0Cu\x0C\x88\x0C\x9C\x0C\xAF\x0C\xC3\x0C\xD1\x0C\xDF\x0C\xEF\x0C\x01\r\x10\r$\r4\rD\rY\rj\r~\r\x8E\r\x9B\r\xB0\r\xC0\r\xD0\r\xE0\r\xF1\r\x03\x0E\x18\x0E+\x0E8\x0EK\x0EZ\x0Ei\x0Ex\x0E\x89\x0E\x97\x0E\xA9\x0E\xB9\x0E\xC8\x0E\xDB\x0E\xEB\x0E\xFB\x0E\x14\x0F(\x0F9\x0FK\x0F\\\x0Fn\x0F\x83\x0F\x93\x0F\xA3\x0F\xB4\x0F\xC7\x0F\xD0\x0F\xDB\x0F\xE5\x0F\xF0\x0F\xFA\x0F\x05\x10\x12\x10 \x10+\x107\x10C\x10L\x10X\x10d\x10o\x10{\x10\x86\x10\x93\x10\x9D\x10\xAC\x10\xBA\x10\xC8\x10\xD4\x10\xDE\x10\xEB\x10\xF5\x10\xFE\x10\x08\x11\x15\x11#\x11,\x117\x11B\x11R\x11`\x11i\x11u\x11\x82\x11\x8E\x11\x9B\x11\xA9\x11\xB3\x11\xC1\x11\xCD\x11\xD9\x11\xE7\x11\xF4\x11\x01\x12\r\x12\x1D\x12.\x12:\x12E\x12O\x12Y\x12e\x12r\x12}\x12\x88\x12\x94\x12\xA5\x12\xB5\x12\xBE\x12\xC7\x12\xD6\x12\xE4\x12\xF2\x12\xFC\x12\t\x13\x17\x13#\x13.\x139\x13F\x13T\x13^\x13k\x13y\x13\x8B\x13\x96\x13\xA3\x13\xAF\x13\xBA\x13\xC7\x13\xD2\x13\xDE\x13\xE8\x13\xF2\x13\x04\x14\x14\x14#\x14.\x14;\x14I\x14Y\x14e\x14p\x14\x82\x14\x8E\x14\x9D\x14\xAD\x14\xBC\x14\xCF\x14\xDE\x14\xEC\x14\xFE\x14\x0E\x15 \x156\x15H\x15X\x15e\x15w\x15\x89\x15\x9E\x15\xB0\x15\xC0\x15\xD0\x15\xDF\x15\xEF\x15\xFC\x15\x0E\x16!\x164\x16A\x16P\x16_\x16s\x16\x82\x16\x92\x16\xA4\x16\xB6\x16\xC4\x16\xD8\x16\xE3\x16\xF3\x16\xFE\x16\t\x17\x0C\x17\x13\x17\"\x170\x17>\x17M\x17`\x17n\x17\x81\x17\x8D\x17\x9E\x17\xB0\x17\xB4\x17\xB7\x17\xBA\x17\xC1\x17\xC6\x17\xCA\x17\xD1\x17\xDA\x17\xE3\x17\xED\x17\xF7\x17\x01\x18\n\x18\x13\x18\x1C\x18%\x18.\x187\x18@\x18I\x18R\x18[\x18e\x18o\x18y\x18\x83\x18\x8D\x18\x96\x18\x9F\x18\xA8\x18\xB1\x18\xBA\x18\xC3\x18\xCC\x18\xD5\x18\xDD\x18\xEA\x18\xF1\x18\xF8\x18\x05\x19\r\x19\x1D\x19+\x19;\x19H\x19V\x19e\x19r\x19\x83\x19\x92\x19\xA2\x19\xB1\x19\xC0\x19\xCF\x19\xE0\x19\xED\x19\xFD\x19\x0C\x1A\x1B\x1A-\x1A<\x1AI\x1A[\x1Af\x1Ar\x1A}\x1A\x8A\x1A\x9A\x1A\xA7\x1A\xB8\x1A\xC5\x1A\xD1\x1A\xE1\x1A\xED\x1A\xFA\x1A\x07\x1B\x15\x1B \x1B,\x1B<\x1BI\x1BT\x1B_\x1Bl\x1B}\x1B\x8C\x1B\x9A\x1B\xAB\x1B\xB8\x1B\xC4\x1B\xD4\x1B\xE2\x1B\xEF\x1B\xFE\x1B\x0E\x1C\x1D\x1C)\x1C7\x1CD\x1CR\x1Cb\x1Co\x1C|\x1C\x8D\x1C\x9A\x1C\x9C\x1C\xA3\x1C\xA6\x1C\xAB\x1C\xB0\x1C\xB4\x1C\xBD\x1C\xC0\x1C\xC8\x1C\xCF\x1C\xE2\x1C\xEF\x1C\xFF\x1C\x0B\x1D\x18\x1D(\x1D3\x1DB\x1DR\x1D`\x1Dn\x1Dr\x1Dx\x1D\x7F\x1D\x84\x1D\x8D\x1D\x92\x1D\x95\x1D\x98\x1D\x9F\x1D\xAF\x1D\xBD\x1D\xCB\x1D\xCD\x1D\xD4\x1D\xDA\x1D\xDD\x1D\xE4\x1D\xF0\x1D\0\x1E\x14\x1E#\x1E0\x1E>\x1EK\x1E\\\x1Ek\x1Ew\x1E\x87\x1E\x98\x1E\xA7\x1E\xBA\x1E\xC6\x1E\xD6\x1E\xE6\x1E\xF4\x1E\x06\x1F\x14\x1F%\x1F3\x1FD\x1FR\x1F_\x1Fk\x1Fz\x1F\x88\x1F\x99\x1F\xA6\x1F\xB6\x1F\xC5\x1F\xD3\x1F\xE7\x1F\xF8\x1F\x06 \x13 ! / @ L X f q w \x7F \x82 \x85 \x8E \x94 \x97 \xA0 \xAB \xB5 \xBF \xCE \xD8 \xE1 \xF2 \xFD \x08!\x12!\x1A!\x1D!&!*!-!Africa/AbidjanAfrica/AccraAfrica/Addis_AbabaAfrica/AlgiersAfrica/AsmaraAfrica/AsmeraAfrica/BamakoAfrica/BanguiAfrica/BanjulAfrica/BissauAfrica/BlantyreAfrica/BrazzavilleAfrica/BujumburaAfrica/CairoAfrica/CasablancaAfrica/CeutaAfrica/ConakryAfrica/DakarAfrica/Dar_es_SalaamAfrica/DjiboutiAfrica/DoualaAfrica/El_AaiunAfrica/FreetownAfrica/GaboroneAfrica/HarareAfrica/JohannesburgAfrica/JubaAfrica/KampalaAfrica/KhartoumAfrica/KigaliAfrica/KinshasaAfrica/LagosAfrica/LibrevilleAfrica/LomeAfrica/LuandaAfrica/LubumbashiAfrica/LusakaAfrica/MalaboAfrica/MaputoAfrica/MaseruAfrica/MbabaneAfrica/MogadishuAfrica/MonroviaAfrica/NairobiAfrica/NdjamenaAfrica/NiameyAfrica/NouakchottAfrica/OuagadougouAfrica/Porto-NovoAfrica/Sao_TomeAfrica/TimbuktuAfrica/TripoliAfrica/TunisAfrica/WindhoekAmerica/AdakAmerica/AnchorageAmerica/AnguillaAmerica/AntiguaAmerica/AraguainaAmerica/Argentina/Buenos_AiresAmerica/Argentina/CatamarcaAmerica/Argentina/ComodRivadaviaAmerica/Argentina/CordobaAmerica/Argentina/JujuyAmerica/Argentina/La_RiojaAmerica/Argentina/MendozaAmerica/Argentina/Rio_GallegosAmerica/Argentina/SaltaAmerica/Argentina/San_JuanAmerica/Argentina/San_LuisAmerica/Argentina/TucumanAmerica/Argentina/UshuaiaAmerica/ArubaAmerica/AsuncionAmerica/AtikokanAmerica/AtkaAmerica/BahiaAmerica/Bahia_BanderasAmerica/BarbadosAmerica/BelemAmerica/BelizeAmerica/Blanc-SablonAmerica/Boa_VistaAmerica/BogotaAmerica/BoiseAmerica/Buenos_AiresAmerica/Cambridge_BayAmerica/Campo_GrandeAmerica/CancunAmerica/CaracasAmerica/CatamarcaAmerica/CayenneAmerica/CaymanAmerica/ChicagoAmerica/ChihuahuaAmerica/Ciudad_JuarezAmerica/Coral_HarbourAmerica/CordobaAmerica/Costa_RicaAmerica/CoyhaiqueAmerica/CrestonAmerica/CuiabaAmerica/CuracaoAmerica/DanmarkshavnAmerica/DawsonAmerica/Dawson_CreekAmerica/DenverAmerica/DetroitAmerica/DominicaAmerica/EdmontonAmerica/EirunepeAmerica/El_SalvadorAmerica/EnsenadaAmerica/Fort_NelsonAmerica/Fort_WayneAmerica/FortalezaAmerica/Glace_BayAmerica/GodthabAmerica/Goose_BayAmerica/Grand_TurkAmerica/GrenadaAmerica/GuadeloupeAmerica/GuatemalaAmerica/GuayaquilAmerica/GuyanaAmerica/HalifaxAmerica/HavanaAmerica/HermosilloAmerica/Indiana/IndianapolisAmerica/Indiana/KnoxAmerica/Indiana/MarengoAmerica/Indiana/PetersburgAmerica/Indiana/Tell_CityAmerica/Indiana/VevayAmerica/Indiana/VincennesAmerica/Indiana/WinamacAmerica/IndianapolisAmerica/InuvikAmerica/IqaluitAmerica/JamaicaAmerica/JujuyAmerica/JuneauAmerica/Kentucky/LouisvilleAmerica/Kentucky/MonticelloAmerica/Knox_INAmerica/KralendijkAmerica/La_PazAmerica/LimaAmerica/Los_AngelesAmerica/LouisvilleAmerica/Lower_PrincesAmerica/MaceioAmerica/ManaguaAmerica/ManausAmerica/MarigotAmerica/MartiniqueAmerica/MatamorosAmerica/MazatlanAmerica/MendozaAmerica/MenomineeAmerica/MeridaAmerica/MetlakatlaAmerica/Mexico_CityAmerica/MiquelonAmerica/MonctonAmerica/MonterreyAmerica/MontevideoAmerica/MontrealAmerica/MontserratAmerica/NassauAmerica/New_YorkAmerica/NipigonAmerica/NomeAmerica/NoronhaAmerica/North_Dakota/BeulahAmerica/North_Dakota/CenterAmerica/North_Dakota/New_SalemAmerica/NuukAmerica/OjinagaAmerica/PanamaAmerica/PangnirtungAmerica/ParamariboAmerica/PhoenixAmerica/Port-au-PrinceAmerica/Port_of_SpainAmerica/Porto_AcreAmerica/Porto_VelhoAmerica/Puerto_RicoAmerica/Punta_ArenasAmerica/Rainy_RiverAmerica/Rankin_InletAmerica/RecifeAmerica/ReginaAmerica/ResoluteAmerica/Rio_BrancoAmerica/RosarioAmerica/Santa_IsabelAmerica/SantaremAmerica/SantiagoAmerica/Santo_DomingoAmerica/Sao_PauloAmerica/ScoresbysundAmerica/ShiprockAmerica/SitkaAmerica/St_BarthelemyAmerica/St_JohnsAmerica/St_KittsAmerica/St_LuciaAmerica/St_ThomasAmerica/St_VincentAmerica/Swift_CurrentAmerica/TegucigalpaAmerica/ThuleAmerica/Thunder_BayAmerica/TijuanaAmerica/TorontoAmerica/TortolaAmerica/VancouverAmerica/VirginAmerica/WhitehorseAmerica/WinnipegAmerica/YakutatAmerica/YellowknifeAntarctica/CaseyAntarctica/DavisAntarctica/DumontDUrvilleAntarctica/MacquarieAntarctica/MawsonAntarctica/McMurdoAntarctica/PalmerAntarctica/RotheraAntarctica/South_PoleAntarctica/SyowaAntarctica/TrollAntarctica/VostokArctic/LongyearbyenAsia/AdenAsia/AlmatyAsia/AmmanAsia/AnadyrAsia/AqtauAsia/AqtobeAsia/AshgabatAsia/AshkhabadAsia/AtyrauAsia/BaghdadAsia/BahrainAsia/BakuAsia/BangkokAsia/BarnaulAsia/BeirutAsia/BishkekAsia/BruneiAsia/CalcuttaAsia/ChitaAsia/ChoibalsanAsia/ChongqingAsia/ChungkingAsia/ColomboAsia/DaccaAsia/DamascusAsia/DhakaAsia/DiliAsia/DubaiAsia/DushanbeAsia/FamagustaAsia/GazaAsia/HarbinAsia/HebronAsia/Ho_Chi_MinhAsia/Hong_KongAsia/HovdAsia/IrkutskAsia/IstanbulAsia/JakartaAsia/JayapuraAsia/JerusalemAsia/KabulAsia/KamchatkaAsia/KarachiAsia/KashgarAsia/KathmanduAsia/KatmanduAsia/KhandygaAsia/KolkataAsia/KrasnoyarskAsia/Kuala_LumpurAsia/KuchingAsia/KuwaitAsia/MacaoAsia/MacauAsia/MagadanAsia/MakassarAsia/ManilaAsia/MuscatAsia/NicosiaAsia/NovokuznetskAsia/NovosibirskAsia/OmskAsia/OralAsia/Phnom_PenhAsia/PontianakAsia/PyongyangAsia/QatarAsia/QostanayAsia/QyzylordaAsia/RangoonAsia/RiyadhAsia/SaigonAsia/SakhalinAsia/SamarkandAsia/SeoulAsia/ShanghaiAsia/SingaporeAsia/SrednekolymskAsia/TaipeiAsia/TashkentAsia/TbilisiAsia/TehranAsia/Tel_AvivAsia/ThimbuAsia/ThimphuAsia/TokyoAsia/TomskAsia/Ujung_PandangAsia/UlaanbaatarAsia/Ulan_BatorAsia/UrumqiAsia/Ust-NeraAsia/VientianeAsia/VladivostokAsia/YakutskAsia/YangonAsia/YekaterinburgAsia/YerevanAtlantic/AzoresAtlantic/BermudaAtlantic/CanaryAtlantic/Cape_VerdeAtlantic/FaeroeAtlantic/FaroeAtlantic/Jan_MayenAtlantic/MadeiraAtlantic/ReykjavikAtlantic/South_GeorgiaAtlantic/St_HelenaAtlantic/StanleyAustralia/ACTAustralia/AdelaideAustralia/BrisbaneAustralia/Broken_HillAustralia/CanberraAustralia/CurrieAustralia/DarwinAustralia/EuclaAustralia/HobartAustralia/LHIAustralia/LindemanAustralia/Lord_HoweAustralia/MelbourneAustralia/NSWAustralia/NorthAustralia/PerthAustralia/QueenslandAustralia/SouthAustralia/SydneyAustralia/TasmaniaAustralia/VictoriaAustralia/WestAustralia/YancowinnaBrazil/AcreBrazil/DeNoronhaBrazil/EastBrazil/WestCETCST6CDTCanada/AtlanticCanada/CentralCanada/EasternCanada/MountainCanada/NewfoundlandCanada/PacificCanada/SaskatchewanCanada/YukonChile/ContinentalChile/EasterIslandCubaEETESTEST5EDTEgyptEireEtc/GMTEtc/GMT+0Etc/GMT+1Etc/GMT+10Etc/GMT+11Etc/GMT+12Etc/GMT+2Etc/GMT+3Etc/GMT+4Etc/GMT+5Etc/GMT+6Etc/GMT+7Etc/GMT+8Etc/GMT+9Etc/GMT-0Etc/GMT-1Etc/GMT-10Etc/GMT-11Etc/GMT-12Etc/GMT-13Etc/GMT-14Etc/GMT-2Etc/GMT-3Etc/GMT-4Etc/GMT-5Etc/GMT-6Etc/GMT-7Etc/GMT-8Etc/GMT-9Etc/GMT0Etc/GreenwichEtc/UCTEtc/UTCEtc/UniversalEtc/ZuluEurope/AmsterdamEurope/AndorraEurope/AstrakhanEurope/AthensEurope/BelfastEurope/BelgradeEurope/BerlinEurope/BratislavaEurope/BrusselsEurope/BucharestEurope/BudapestEurope/BusingenEurope/ChisinauEurope/CopenhagenEurope/DublinEurope/GibraltarEurope/GuernseyEurope/HelsinkiEurope/Isle_of_ManEurope/IstanbulEurope/JerseyEurope/KaliningradEurope/KievEurope/KirovEurope/KyivEurope/LisbonEurope/LjubljanaEurope/LondonEurope/LuxembourgEurope/MadridEurope/MaltaEurope/MariehamnEurope/MinskEurope/MonacoEurope/MoscowEurope/NicosiaEurope/OsloEurope/ParisEurope/PodgoricaEurope/PragueEurope/RigaEurope/RomeEurope/SamaraEurope/San_MarinoEurope/SarajevoEurope/SaratovEurope/SimferopolEurope/SkopjeEurope/SofiaEurope/StockholmEurope/TallinnEurope/TiraneEurope/TiraspolEurope/UlyanovskEurope/UzhgorodEurope/VaduzEurope/VaticanEurope/ViennaEurope/VilniusEurope/VolgogradEurope/WarsawEurope/ZagrebEurope/ZaporozhyeEurope/ZurichGBGB-EireGMTGMT+0GMT-0GMT0GreenwichHSTHongkongIcelandIndian/AntananarivoIndian/ChagosIndian/ChristmasIndian/CocosIndian/ComoroIndian/KerguelenIndian/MaheIndian/MaldivesIndian/MauritiusIndian/MayotteIndian/ReunionIranIsraelJamaicaJapanKwajaleinLibyaMETMSTMST7MDTMexico/BajaNorteMexico/BajaSurMexico/GeneralNZNZ-CHATNavajoPRCPST8PDTPacific/ApiaPacific/AucklandPacific/BougainvillePacific/ChathamPacific/ChuukPacific/EasterPacific/EfatePacific/EnderburyPacific/FakaofoPacific/FijiPacific/FunafutiPacific/GalapagosPacific/GambierPacific/GuadalcanalPacific/GuamPacific/HonoluluPacific/JohnstonPacific/KantonPacific/KiritimatiPacific/KosraePacific/KwajaleinPacific/MajuroPacific/MarquesasPacific/MidwayPacific/NauruPacific/NiuePacific/NorfolkPacific/NoumeaPacific/Pago_PagoPacific/PalauPacific/PitcairnPacific/PohnpeiPacific/PonapePacific/Port_MoresbyPacific/RarotongaPacific/SaipanPacific/SamoaPacific/TahitiPacific/TarawaPacific/TongatapuPacific/TrukPacific/WakePacific/WallisPacific/YapPolandPortugalROCROKSingaporeTurkeyUCTUS/AlaskaUS/AleutianUS/ArizonaUS/CentralUS/East-IndianaUS/EasternUS/HawaiiUS/Indiana-StarkeUS/MichiganUS/MountainUS/PacificUS/SamoaUTCUniversalW-SUWETZulu") + }, }; + }; +} diff --git a/deps/temporal/provider/src/data/mod.rs b/deps/temporal/provider/src/data/mod.rs new file mode 100644 index 00000000000000..f4a6c886f73a25 --- /dev/null +++ b/deps/temporal/provider/src/data/mod.rs @@ -0,0 +1,3 @@ +include!("iana_normalizer.rs.data"); + +include!("compiled_zoneinfo_provider.rs.data"); diff --git a/deps/temporal/provider/src/epoch_nanoseconds.rs b/deps/temporal/provider/src/epoch_nanoseconds.rs new file mode 100644 index 00000000000000..4dcd9fbc7dc8b8 --- /dev/null +++ b/deps/temporal/provider/src/epoch_nanoseconds.rs @@ -0,0 +1,63 @@ +use crate::TimeZoneProviderError; + +/// Number of nanoseconds in a day +#[doc(hidden)] +pub const NS_PER_DAY: u64 = MS_PER_DAY as u64 * 1_000_000; + +pub(crate) const NS_IN_S: i128 = 1_000_000_000; + +/// Milliseconds per day constant: 8.64e+7 +pub(crate) const MS_PER_DAY: u32 = 24 * 60 * 60 * 1000; +/// Max Instant nanosecond constant +#[doc(hidden)] +pub(crate) const NS_MAX_INSTANT: i128 = NS_PER_DAY as i128 * 100_000_000i128; +/// Min Instant nanosecond constant +#[doc(hidden)] +pub(crate) const NS_MIN_INSTANT: i128 = -NS_MAX_INSTANT; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Default)] +pub struct EpochNanoseconds(pub i128); + +impl From for EpochNanoseconds { + fn from(value: i128) -> Self { + Self(value) + } +} + +// Potential TODO: Build out primitive arthmetic methods if needed. +impl EpochNanoseconds { + pub fn as_i128(&self) -> i128 { + self.0 + } + + pub fn check_validity(&self) -> Result<(), TimeZoneProviderError> { + if !is_valid_epoch_nanos(&self.0) { + return Err(TimeZoneProviderError::InstantOutOfRange); + } + Ok(()) + } + + pub fn from_seconds(seconds: i64) -> Self { + Self(seconds as i128 * NS_IN_S) + } +} + +/// Utility for determining if the nanos are within a valid range. +#[inline] +#[must_use] +pub fn is_valid_epoch_nanos(nanos: &i128) -> bool { + (NS_MIN_INSTANT..=NS_MAX_INSTANT).contains(nanos) +} + +#[cfg(feature = "tzif")] +impl From for EpochNanoseconds { + fn from(value: tzif::data::time::Seconds) -> Self { + EpochNanoseconds::from_seconds(value.0) + } +} + +#[inline] +#[cfg(any(feature = "tzif", feature = "zoneinfo64"))] +pub(crate) fn seconds_to_nanoseconds(seconds: i64) -> i128 { + seconds as i128 * NS_IN_S +} diff --git a/deps/temporal/provider/src/error.rs b/deps/temporal/provider/src/error.rs new file mode 100644 index 00000000000000..8066bfb5969185 --- /dev/null +++ b/deps/temporal/provider/src/error.rs @@ -0,0 +1,7 @@ +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +#[non_exhaustive] +pub enum TimeZoneProviderError { + InstantOutOfRange, + Assert(&'static str), + Range(&'static str), +} diff --git a/deps/temporal/provider/src/experimental_tzif/datagen.rs b/deps/temporal/provider/src/experimental_tzif/datagen.rs new file mode 100644 index 00000000000000..bfbc30c4e4899a --- /dev/null +++ b/deps/temporal/provider/src/experimental_tzif/datagen.rs @@ -0,0 +1,96 @@ +use super::*; +use crate::tzdb::datagen::TzdbDataSource; +use alloc::collections::BTreeMap; +use alloc::vec::Vec; +use std::path::Path; +use zerotrie::ZeroTrieBuildError; +use zoneinfo_rs::{compiler::CompiledTransitions, ZoneInfoCompiler, ZoneInfoData}; + +impl From<&zoneinfo_rs::tzif::LocalTimeRecord> for LocalTimeRecord { + fn from(value: &zoneinfo_rs::tzif::LocalTimeRecord) -> Self { + Self { + offset: value.offset, + } + } +} + +impl ZeroTzif<'_> { + fn from_transition_data(data: &CompiledTransitions) -> Self { + let tzif = data.to_v2_data_block(); + let transitions = ZeroVec::alloc_from_slice(&tzif.transition_times); + let transition_types = ZeroVec::alloc_from_slice(&tzif.transition_types); + let mapped_local_records: Vec = + tzif.local_time_types.iter().map(Into::into).collect(); + let types = ZeroVec::alloc_from_slice(&mapped_local_records); + // TODO: handle this much better. + let posix = PosixZone::from(&data.posix_time_zone); + + Self { + transitions, + transition_types, + types, + posix, + } + } +} + +#[derive(Debug)] +pub enum ZoneInfoDataError { + Build(ZeroTrieBuildError), +} + +#[allow(clippy::expect_used, clippy::unwrap_used, reason = "Datagen only")] +impl ZoneInfoProvider<'_> { + pub fn build(tzdata: &Path) -> Result { + let tzdb_source = TzdbDataSource::try_from_rearguard_zoneinfo_dir(tzdata).unwrap(); + let compiled_transitions = ZoneInfoCompiler::new(tzdb_source.data.clone()).build(); + + let mut identifiers = BTreeMap::default(); + let mut primary_zones = Vec::default(); + + // Create a Map of , this is used later to index + let ZoneInfoData { links, zones, .. } = tzdb_source.data; + + for zone_identifier in zones.into_keys() { + primary_zones.push(zone_identifier.clone()); + identifiers.insert(zone_identifier.clone(), zone_identifier); + } + for (link, zone) in links.into_iter() { + identifiers.insert(link, zone); + } + + primary_zones.sort(); + + let identifier_map: BTreeMap, usize> = identifiers + .into_iter() + .map(|(id, zoneid)| { + ( + id.to_ascii_lowercase().as_bytes().to_vec(), + primary_zones.binary_search(&zoneid).unwrap(), + ) + }) + .collect(); + + let tzifs: Vec> = primary_zones + .into_iter() + .map(|id| { + let data = compiled_transitions + .data + .get(&id) + .expect("all zones should be built"); + ZeroTzif::from_transition_data(data) + }) + .collect(); + + let tzifs_zerovec: VarZeroVec<'static, ZeroTzifULE, Index32> = tzifs.as_slice().into(); + + let ids = ZeroAsciiIgnoreCaseTrie::try_from(&identifier_map) + .map_err(ZoneInfoDataError::Build)? + .convert_store(); + + Ok(ZoneInfoProvider { + ids, + tzifs: tzifs_zerovec, + }) + } +} diff --git a/deps/temporal/provider/src/experimental_tzif/mod.rs b/deps/temporal/provider/src/experimental_tzif/mod.rs new file mode 100644 index 00000000000000..a5114243796564 --- /dev/null +++ b/deps/temporal/provider/src/experimental_tzif/mod.rs @@ -0,0 +1,66 @@ +//! A compact, zero copy TZif file. +//! +//! NOTE: This representation does not follow the TZif specification +//! to full detail, but instead attempts to compress TZif data into +//! a functional, data driven equivalent. + +#[cfg(feature = "datagen")] +mod datagen; +pub mod posix; + +use zerotrie::ZeroAsciiIgnoreCaseTrie; +use zerovec::{vecs::Index32, VarZeroVec, ZeroVec}; + +use posix::PosixZone; + +use crate as timezone_provider; +compiled_zoneinfo_provider!(COMPILED_ZONEINFO_PROVIDER); + +#[derive(Debug, Clone)] +#[cfg_attr( + feature = "datagen", + derive(yoke::Yokeable, serde::Serialize, databake::Bake) +)] +#[cfg_attr(feature = "datagen", databake(path = timezone_provider::experimental_tzif))] +pub struct ZoneInfoProvider<'data> { + // IANA identifier map to TZif index. + pub ids: ZeroAsciiIgnoreCaseTrie>, + // Vector of TZif data + pub tzifs: VarZeroVec<'data, ZeroTzifULE, Index32>, +} + +impl ZoneInfoProvider<'_> { + pub fn get(&self, identifier: &str) -> Option<&ZeroTzifULE> { + let idx = self.ids.get(identifier)?; + self.tzifs.get(idx) + } +} + +#[zerovec::make_varule(ZeroTzifULE)] +#[derive(PartialEq, Debug, Clone)] +#[zerovec::skip_derive(Ord)] +#[zerovec::derive(Debug)] +#[cfg_attr( + feature = "datagen", + derive(yoke::Yokeable, serde::Serialize, databake::Bake) +)] +#[cfg_attr(feature = "datagen", zerovec::derive(Serialize))] +#[cfg_attr(feature = "datagen", databake(path = timezone_provider::experimental_tzif))] +pub struct ZeroTzif<'data> { + pub transitions: ZeroVec<'data, i64>, + pub transition_types: ZeroVec<'data, u8>, + // NOTE: zoneinfo64 does a fun little bitmap str + pub types: ZeroVec<'data, LocalTimeRecord>, + pub posix: PosixZone, +} + +#[zerovec::make_ule(LocalTimeRecordULE)] +#[derive(PartialEq, Eq, Debug, Clone, Copy, PartialOrd, Ord)] +#[cfg_attr( + feature = "datagen", + derive(yoke::Yokeable, serde::Serialize, databake::Bake) +)] +#[cfg_attr(feature = "datagen", databake(path = timezone_provider::experimental_tzif))] +pub struct LocalTimeRecord { + pub offset: i64, +} diff --git a/deps/temporal/provider/src/experimental_tzif/posix.rs b/deps/temporal/provider/src/experimental_tzif/posix.rs new file mode 100644 index 00000000000000..1241bd174c4152 --- /dev/null +++ b/deps/temporal/provider/src/experimental_tzif/posix.rs @@ -0,0 +1,132 @@ +use tinystr::TinyAsciiStr; +#[cfg(feature = "datagen")] +use zoneinfo_rs::posix::{MonthWeekDay, PosixDate, PosixDateTime, PosixTimeZone, PosixTransition}; + +#[zerovec::make_ule(PosixZoneULE)] +#[derive(PartialEq, Eq, Debug, Clone, Copy, PartialOrd, Ord)] +#[cfg_attr( + feature = "datagen", + derive(yoke::Yokeable, serde::Serialize, databake::Bake) +)] +#[cfg_attr(feature = "datagen", databake(path = timezone_provider::experimental_tzif::posix))] +pub struct PosixZone { + pub abbr: TinyAsciiStr<5>, + pub offset: i64, + pub transition: Option, +} + +#[cfg(feature = "datagen")] +#[allow(clippy::unwrap_used, reason = "Datagen only")] +impl From<&PosixTimeZone> for PosixZone { + fn from(value: &PosixTimeZone) -> Self { + let abbr = TinyAsciiStr::<5>::try_from_str(&value.abbr.formatted).unwrap(); + let offset = value.offset.as_secs(); + let transition = value + .transition_info + .as_ref() + .map(ZeroPosixTransition::from); + + Self { + abbr, + offset, + transition, + } + } +} + +#[zerovec::make_ule(PosixTransitionULE)] +#[derive(PartialEq, Eq, Debug, Clone, Copy, PartialOrd, Ord)] +#[cfg_attr( + feature = "datagen", + derive(yoke::Yokeable, serde::Serialize, databake::Bake) +)] +#[cfg_attr(feature = "datagen", databake(path = timezone_provider::experimental_tzif::posix))] +pub struct ZeroPosixTransition { + pub abbr: TinyAsciiStr<5>, + pub savings: i64, + pub start: ZeroTransitionDateTime, + pub end: ZeroTransitionDateTime, +} + +#[cfg(feature = "datagen")] +#[allow(clippy::unwrap_used, reason = "Datagen only")] +impl From<&PosixTransition> for ZeroPosixTransition { + fn from(value: &PosixTransition) -> Self { + let abbr = TinyAsciiStr::<5>::try_from_str(&value.abbr.formatted).unwrap(); + let savings = value.savings.as_secs(); + let start = ZeroTransitionDateTime::from(&value.start); + let end = ZeroTransitionDateTime::from(&value.end); + Self { + abbr, + savings, + start, + end, + } + } +} + +#[zerovec::make_ule(TransitionDateTimeULE)] +#[derive(PartialEq, Eq, Debug, Clone, Copy, PartialOrd, Ord)] +#[cfg_attr( + feature = "datagen", + derive(yoke::Yokeable, serde::Serialize, databake::Bake) +)] +#[cfg_attr(feature = "datagen", databake(path = timezone_provider::experimental_tzif::posix))] +pub struct ZeroTransitionDateTime { + /// The date at which a transition should occur. + date: ZeroTransitionDate, + /// The time of day in seconds. + time: i64, +} + +#[cfg(feature = "datagen")] +impl From<&PosixDateTime> for ZeroTransitionDateTime { + fn from(value: &PosixDateTime) -> Self { + Self { + date: value.date.into(), + time: value.time.as_secs(), + } + } +} + +#[zerovec::make_ule(DateULE)] +#[derive(PartialEq, Eq, Debug, Clone, Copy, PartialOrd, Ord)] +#[cfg_attr( + feature = "datagen", + derive(yoke::Yokeable, serde::Serialize, databake::Bake) +)] +#[cfg_attr(feature = "datagen", databake(path = timezone_provider::experimental_tzif::posix))] +pub struct ZeroTransitionDate { + kind: DateKind, + day: Option, + mwd: Option<(u8, u8, u8)>, +} + +#[cfg(feature = "datagen")] +impl From for ZeroTransitionDate { + fn from(value: PosixDate) -> Self { + let (kind, day, mwd) = match value { + PosixDate::JulianLeap(day) => (DateKind::Julian, Some(day), None), + PosixDate::JulianNoLeap(day) => (DateKind::JulianNoLeap, Some(day), None), + PosixDate::MonthWeekDay(MonthWeekDay(month, week, day)) => ( + DateKind::MonthWeekDay, + None, + Some((month as u8, week, day as u8)), + ), + }; + Self { kind, day, mwd } + } +} +#[zerovec::make_ule(DateKindULE)] +#[derive(PartialEq, Eq, Debug, Clone, Copy, PartialOrd, Ord)] +#[cfg_attr( + feature = "datagen", + derive(yoke::Yokeable, serde::Serialize, databake::Bake) +)] +#[cfg_attr(feature = "datagen", databake(path = timezone_provider::experimental_tzif::posix))] +#[repr(u8)] +pub enum DateKind { + JulianNoLeap = 0, + Julian = 1, + MonthWeekDay = 2, +} diff --git a/deps/temporal/provider/src/lib.rs b/deps/temporal/provider/src/lib.rs new file mode 100644 index 00000000000000..a910c90e81aee3 --- /dev/null +++ b/deps/temporal/provider/src/lib.rs @@ -0,0 +1,141 @@ +//! Providers for time zone data +//! +//! Let's talk about time zone data everyone! +//! +//! At a high level, the `timezone_provider` crate provides a set of traits along with a few +//! implementations of those traits. The general intention here is to make providing time zone +//! data as agnostic and easy as possible. +//! +//! This crate is fairly "low level" at least as far as date and time needs are concerned. So +//! we'll cover the basic overview of the trait and some of the general implementations of +//! those traits, and then we will go on a bit further of a dive for the power users that +//! are interested in implementing their own provider or is just really curious about what +//! is going on. +//! +//! ## Available providers +//! +//! Below is a list of currently available time zone providers. +//! +//! - `ZoneInfo64TzdbProvider`: a provider using ICU4C's zoneinfo64 resource bundle (enable with `zoneinfo64` features flag) +//! - `FsTzdbProvider`: a provider that reads and parses tzdata at runtime from the host file system's +//! TZif files (enable with `tzif` feature flag) +//! - `CompiledTzdbProvider`: a provider that reads and parses tzdata at runtime from TZif's compiled +//! into the application (enable with `tzif` feature flag) +//! +//! Coming soon (hopefully), a zero copy compiled tzdb provider (see `experimental_tzif` for more). +//! +//! ## Time zone provider traits +//! +//! This crate provides three primary traits for working with time zone data. +//! +//! - [`TimeZoneProvider`][crate::provider::TimeZoneProvider] +//! - [`TimeZoneNormalizer`][crate::provider::TimeZoneNormalizer] +//! - [`TimeZoneResolver`][crate::provider::TimeZoneResolver] +//! +//! The first trait `TimeZoneProvider` is the primary interface for a time zone provider used by `temporal_rs`. +//! +//! Meanwhile, the two other traits, `TimeZoneNormalizer` and `TimeZoneResolver`, are secondary +//! traits that can be used to implement the core `TimeZoneProvider`. Once implemented, this +//! crate providers a default type for creating a `TimeZoneProvider` by mixing and matching objects that implement the secondary +//! traits, `NormalizerAndResolver`. +//! +//! ### Why two secondary traits? +//! +//! Well that's because `TimeZoneProvider` handles two different concerns: fetching and +//! formatting normalized and canonicalized time zone identifiers, and resolving time +//! zone data requests. This functionality typically requires two different sets of data, +//! each of which may be in a variety of formats. +//! +//! ### Why not just have the two secondary traits without `TimeZoneProvider`? +//! +//! Well while the functionality typically requires two sets of data. Those sets are not +//! necessarily completely unique. The time zone database updates potentially multiple times a +//! year so having your formatting in 2025a while your data is in 2025b could cause some +//! desync. So in order to better represent this `TimeZoneProvider` is used on top of them. +//! +//! **NOTE:** you CAN always just directly use `TimeZoneNormalizer` and +//! `TimeZoneResolver` together if you want. We just wouldn't recommemnd it. +//! + +#![no_std] +#![cfg_attr( + not(test), + warn(clippy::unwrap_used, clippy::expect_used, clippy::indexing_slicing) +)] + +extern crate alloc; + +#[cfg(feature = "std")] +extern crate std; + +#[macro_use] +mod private { + include!("./data/mod.rs"); +} + +mod tzdb; +pub use tzdb::{CompiledNormalizer, IanaIdentifierNormalizer}; + +#[cfg(feature = "tzif")] +pub mod tzif; + +#[cfg(feature = "experimental_tzif")] +pub mod experimental_tzif; + +#[cfg(feature = "zoneinfo64")] +pub mod zoneinfo64; + +pub mod epoch_nanoseconds; + +#[doc(hidden)] +pub mod utils; + +mod error; +pub mod provider; +pub use error::TimeZoneProviderError; + +use crate as timezone_provider; +iana_normalizer_singleton!(SINGLETON_IANA_NORMALIZER); + +#[cfg(test)] +mod tests { + extern crate alloc; + use super::SINGLETON_IANA_NORMALIZER; + + #[test] + fn basic_normalization() { + let index = SINGLETON_IANA_NORMALIZER + .available_id_index + .get("America/CHICAGO") + .unwrap(); + assert_eq!( + SINGLETON_IANA_NORMALIZER.normalized_identifiers.get(index), + Some("America/Chicago") + ); + + let index = SINGLETON_IANA_NORMALIZER + .available_id_index + .get("uTc") + .unwrap(); + assert_eq!( + SINGLETON_IANA_NORMALIZER.normalized_identifiers.get(index), + Some("UTC") + ); + + let index = SINGLETON_IANA_NORMALIZER + .available_id_index + .get("eTC/uTc") + .unwrap(); + assert_eq!( + SINGLETON_IANA_NORMALIZER.normalized_identifiers.get(index), + Some("Etc/UTC") + ); + } + + #[test] + #[cfg(feature = "experimental_tzif")] + fn zone_info_basic() { + let tzif = crate::experimental_tzif::COMPILED_ZONEINFO_PROVIDER.get("America/Chicago"); + assert!(tzif.is_some()) + } +} diff --git a/deps/temporal/provider/src/provider.rs b/deps/temporal/provider/src/provider.rs new file mode 100644 index 00000000000000..d1fba95f7fb6fd --- /dev/null +++ b/deps/temporal/provider/src/provider.rs @@ -0,0 +1,377 @@ +//! Traits and struct for creating time zone data providers. +//! +//! This module contains the traits needed to implement a time zone data +//! provider along with relevant structs. + +use core::str::FromStr; + +use crate::utils; +use crate::CompiledNormalizer; +use crate::{epoch_nanoseconds::EpochNanoseconds, TimeZoneProviderError}; +use alloc::borrow::Cow; + +pub(crate) type TimeZoneProviderResult = Result; + +/// `UtcOffsetSeconds` represents the amount of seconds we need to add to the UTC to reach the local time. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] +pub struct UtcOffsetSeconds(pub i64); + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct IsoDateTime { + pub year: i32, + pub month: u8, + pub day: u8, + pub hour: u8, + pub minute: u8, + pub second: u8, + pub millisecond: u16, + pub microsecond: u16, + pub nanosecond: u16, +} + +impl IsoDateTime { + fn to_epoch_days(self) -> i64 { + utils::epoch_days_from_gregorian_date(self.year, self.month, self.day) + } + /// `IsoTimeToEpochMs` + /// + /// Note: This method is library specific and not in spec + /// + /// Functionally the same as Date's `MakeTime` + fn time_to_epoch_ms(self) -> i64 { + ((i64::from(self.hour) * utils::MS_PER_HOUR + + i64::from(self.minute) * utils::MS_PER_MINUTE) + + i64::from(self.second) * 1000i64) + + i64::from(self.millisecond) + } + + /// Convert this datetime to nanoseconds since the Unix epoch + pub fn as_nanoseconds(&self) -> EpochNanoseconds { + let time_ms = self.time_to_epoch_ms(); + let epoch_ms = utils::epoch_days_to_epoch_ms(self.to_epoch_days(), time_ms); + EpochNanoseconds( + epoch_ms as i128 * 1_000_000 + + self.microsecond as i128 * 1_000 + + self.nanosecond as i128, + ) + } +} + +#[cfg(feature = "tzif")] +use tzif::data::{posix::TimeZoneVariantInfo, tzif::LocalTimeTypeRecord}; + +#[cfg(feature = "tzif")] +impl From<&TimeZoneVariantInfo> for UtcOffsetSeconds { + fn from(value: &TimeZoneVariantInfo) -> Self { + // The POSIX tz string stores offsets as negative offsets; + // i.e. "seconds that must be added to reach UTC" + Self(-value.offset.0) + } +} + +#[cfg(feature = "tzif")] +impl From for UtcOffsetSeconds { + fn from(value: LocalTimeTypeRecord) -> Self { + Self(value.utoff.0) + } +} + +/// An EpochNanoseconds and a UTC offset +#[derive(Copy, Clone, Debug, PartialEq)] +pub struct EpochNanosecondsAndOffset { + /// The resolved nanoseconds value + pub ns: EpochNanoseconds, + /// The resolved time zone offset corresponding + /// to the nanoseconds value, in the given time zone + pub offset: UtcOffsetSeconds, +} + +#[derive(Debug, Clone, Copy, PartialEq)] +pub enum TransitionDirection { + Next, + Previous, +} + +#[derive(Debug, Clone, Copy)] +pub struct ParseDirectionError; + +impl core::fmt::Display for ParseDirectionError { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + f.write_str("provided string was not a valid direction.") + } +} + +impl FromStr for TransitionDirection { + type Err = ParseDirectionError; + fn from_str(s: &str) -> Result { + match s { + "next" => Ok(Self::Next), + "previous" => Ok(Self::Previous), + _ => Err(ParseDirectionError), + } + } +} + +impl core::fmt::Display for TransitionDirection { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + match self { + Self::Next => "next", + Self::Previous => "previous", + } + .fmt(f) + } +} + +/// Used in disambiguate_possible_epoch_nanos +/// +/// When we have a LocalTimeRecordResult::Empty, +/// it is useful to know the offsets before and after. +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] +pub struct GapEntryOffsets { + pub offset_before: UtcOffsetSeconds, + pub offset_after: UtcOffsetSeconds, + pub transition_epoch: EpochNanoseconds, +} + +/// The potential candidates for a given local datetime +#[derive(Copy, Clone, Debug, PartialEq)] +pub enum CandidateEpochNanoseconds { + Zero(GapEntryOffsets), + One(EpochNanosecondsAndOffset), + Two([EpochNanosecondsAndOffset; 2]), +} + +impl CandidateEpochNanoseconds { + pub fn as_slice(&self) -> &[EpochNanosecondsAndOffset] { + match *self { + Self::Zero(..) => &[], + Self::One(ref one) => core::slice::from_ref(one), + Self::Two(ref multiple) => &multiple[..], + } + } + + #[allow(unused)] // Used in tests in some feature configurations + pub fn is_empty(&self) -> bool { + matches!(*self, Self::Zero(..)) + } + + #[allow(unused)] // Used in tests in some feature configurations + pub fn len(&self) -> usize { + match *self { + Self::Zero(..) => 0, + Self::One(..) => 1, + Self::Two(..) => 2, + } + } + + pub fn first(&self) -> Option { + match *self { + Self::Zero(..) => None, + Self::One(one) | Self::Two([one, _]) => Some(one), + } + } + + pub fn last(&self) -> Option { + match *self { + Self::Zero(..) => None, + Self::One(last) | Self::Two([_, last]) => Some(last), + } + } +} + +#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Default)] +pub struct TimeZoneId { + pub normalized: NormalizedId, + pub resolved: ResolvedId, +} + +pub trait TimeZoneProvider { + fn get(&self, ident: &[u8]) -> TimeZoneProviderResult; + fn identifier(&self, id: TimeZoneId) -> TimeZoneProviderResult>; + + fn canonicalized(&self, id: TimeZoneId) -> TimeZoneProviderResult; + + fn candidate_nanoseconds_for_local_epoch_nanoseconds( + &self, + id: TimeZoneId, + local_datetime: IsoDateTime, + ) -> TimeZoneProviderResult; + + fn transition_nanoseconds_for_utc_epoch_nanoseconds( + &self, + id: TimeZoneId, + epoch_nanoseconds: i128, + ) -> TimeZoneProviderResult; + + fn get_time_zone_transition( + &self, + id: TimeZoneId, + epoch_nanoseconds: i128, + direction: TransitionDirection, + ) -> TimeZoneProviderResult>; +} + +/// An id for a resolved timezone, for use with a [`TimeZoneNormalizer`] +#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Default)] +pub struct NormalizedId(pub usize); + +/// A type capable of normalizing and canonicalizing time zones +pub trait TimeZoneNormalizer { + // Needed for temporal support + fn normalized(&self, _: &[u8]) -> TimeZoneProviderResult; + + // Support for Intl support and canonicalize-tz proposal + fn canonicalized(&self, _: NormalizedId) -> TimeZoneProviderResult; + + fn identifier(&self, _: NormalizedId) -> TimeZoneProviderResult<&str>; +} + +/// An id for a resolved timezone, for use with a [`TimeZoneResolver`] +#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Default)] +pub struct ResolvedId(pub usize); + +/// A type capable of resolving time zone data +pub trait TimeZoneResolver { + fn get_id(&self, normalized_identifier: &[u8]) -> TimeZoneProviderResult; + + fn candidate_nanoseconds_for_local_epoch_nanoseconds( + &self, + identifier: ResolvedId, + local_datetime: IsoDateTime, + ) -> TimeZoneProviderResult; + + fn transition_nanoseconds_for_utc_epoch_nanoseconds( + &self, + identifier: ResolvedId, + epoch_nanoseconds: i128, + ) -> TimeZoneProviderResult; + + fn get_time_zone_transition( + &self, + identifier: ResolvedId, + epoch_nanoseconds: i128, + direction: TransitionDirection, + ) -> TimeZoneProviderResult>; +} + +/// A type that can both normalize and resolve, which implements [`TimeZoneProvider`] +#[derive(Default, Copy, Clone, Debug)] +pub struct NormalizerAndResolver { + resolver: R, + canonicalizer: C, +} + +impl NormalizerAndResolver { + /// Create a new [`NormalizerAndResolver`] with a given resolver and compiled normalizer data + pub fn new(resolver: R) -> Self { + Self { + resolver, + canonicalizer: CompiledNormalizer, + } + } +} +impl TimeZoneProvider for NormalizerAndResolver { + fn get(&self, ident: &[u8]) -> TimeZoneProviderResult { + let normalized = self.canonicalizer.normalized(ident)?; + let normalized_id = self.canonicalizer.identifier(normalized)?; + let resolved = self.resolver.get_id(normalized_id.as_bytes())?; + + Ok(TimeZoneId { + normalized, + resolved, + }) + } + + fn identifier(&self, id: TimeZoneId) -> TimeZoneProviderResult> { + self.canonicalizer.identifier(id.normalized).map(Into::into) + } + fn canonicalized(&self, id: TimeZoneId) -> TimeZoneProviderResult { + let canonical = self.canonicalizer.canonicalized(id.normalized)?; + Ok(TimeZoneId { + normalized: canonical, + resolved: id.resolved, + }) + } + fn candidate_nanoseconds_for_local_epoch_nanoseconds( + &self, + id: TimeZoneId, + local_datetime: IsoDateTime, + ) -> TimeZoneProviderResult { + self.resolver + .candidate_nanoseconds_for_local_epoch_nanoseconds(id.resolved, local_datetime) + } + + fn transition_nanoseconds_for_utc_epoch_nanoseconds( + &self, + id: TimeZoneId, + epoch_nanoseconds: i128, + ) -> TimeZoneProviderResult { + self.resolver + .transition_nanoseconds_for_utc_epoch_nanoseconds(id.resolved, epoch_nanoseconds) + } + + fn get_time_zone_transition( + &self, + id: TimeZoneId, + epoch_nanoseconds: i128, + direction: TransitionDirection, + ) -> TimeZoneProviderResult> { + self.resolver + .get_time_zone_transition(id.resolved, epoch_nanoseconds, direction) + } +} + +/// A [`TimeZoneNormalizer`] that always panics +#[derive(Copy, Clone, Debug, Default)] +pub struct NeverNormalizer; +/// A [`TimeZoneResolver`] that always panics +#[derive(Copy, Clone, Debug, Default)] +pub struct NeverResolver; + +impl TimeZoneNormalizer for NeverNormalizer { + fn normalized(&self, _: &[u8]) -> TimeZoneProviderResult { + unimplemented!() + } + + fn canonicalized(&self, _: NormalizedId) -> TimeZoneProviderResult { + unimplemented!() + } + + fn identifier(&self, _: NormalizedId) -> TimeZoneProviderResult<&str> { + unimplemented!() + } +} + +impl TimeZoneResolver for NeverResolver { + fn get_id(&self, _normalized_identifier: &[u8]) -> TimeZoneProviderResult { + unimplemented!() + } + + fn candidate_nanoseconds_for_local_epoch_nanoseconds( + &self, + _identifier: ResolvedId, + _local_datetime: IsoDateTime, + ) -> TimeZoneProviderResult { + unimplemented!() + } + + fn transition_nanoseconds_for_utc_epoch_nanoseconds( + &self, + _identifier: ResolvedId, + _epoch_nanoseconds: i128, + ) -> TimeZoneProviderResult { + unimplemented!() + } + + fn get_time_zone_transition( + &self, + _identifier: ResolvedId, + _epoch_nanoseconds: i128, + _direction: TransitionDirection, + ) -> TimeZoneProviderResult> { + unimplemented!() + } +} + +/// A [`TimeZoneProvider`] which just calls `unimplemented!()` +pub type NeverProvider = NormalizerAndResolver; diff --git a/deps/temporal/provider/src/tzdb.rs b/deps/temporal/provider/src/tzdb.rs new file mode 100644 index 00000000000000..c63c47d12298e2 --- /dev/null +++ b/deps/temporal/provider/src/tzdb.rs @@ -0,0 +1,85 @@ +//! `timezone_provider` is the core data provider implementations for `temporal_rs` + +// What are we even doing here? Why are providers needed? +// +// Two core data sources need to be accounted for: +// +// - IANA identifier normalization (hopefully, semi easy) +// - IANA TZif data (much harder) +// + +use alloc::borrow::Cow; + +use crate::provider::{NormalizedId, TimeZoneNormalizer, TimeZoneProviderResult}; +use crate::TimeZoneProviderError; +use crate::SINGLETON_IANA_NORMALIZER; +use zerotrie::ZeroAsciiIgnoreCaseTrie; +use zerovec::{VarZeroVec, ZeroVec}; + +#[cfg(feature = "datagen")] +pub(crate) mod datagen; + +/// A data struct for IANA identifier normalization +#[derive(PartialEq, Debug, Clone)] +#[cfg_attr( + feature = "datagen", + derive(serde::Serialize, yoke::Yokeable, serde::Deserialize, databake::Bake) +)] +#[cfg_attr(feature = "datagen", databake(path = timezone_provider))] +pub struct IanaIdentifierNormalizer<'data> { + /// TZDB version + pub version: Cow<'data, str>, + /// An index to the location of the normal identifier. + #[cfg_attr(feature = "datagen", serde(borrow))] + pub available_id_index: ZeroAsciiIgnoreCaseTrie>, + /// A "links" table mapping non-canonical IDs to their canonical IDs + #[cfg_attr(feature = "datagen", serde(borrow))] + pub non_canonical_identifiers: ZeroVec<'data, (u32, u32)>, + /// The normalized IANA identifier + #[cfg_attr(feature = "datagen", serde(borrow))] + pub normalized_identifiers: VarZeroVec<'data, str>, +} + +/// A simple [`TimeZoneNormalizer`] that uses compiled data. +#[derive(Default, Copy, Clone, Debug)] +pub struct CompiledNormalizer; + +impl TimeZoneNormalizer for CompiledNormalizer { + fn normalized(&self, identifier: &[u8]) -> TimeZoneProviderResult { + SINGLETON_IANA_NORMALIZER + .available_id_index + .get(identifier) + .map(NormalizedId) + .ok_or(TimeZoneProviderError::Range("Unknown time zone identifier")) + } + + fn canonicalized(&self, index: NormalizedId) -> TimeZoneProviderResult { + let Ok(u32_index) = u32::try_from(index.0) else { + return Ok(index); + }; + let Ok(canonicalized_idx) = SINGLETON_IANA_NORMALIZER + .non_canonical_identifiers + .binary_search_by(|probe| probe.0.cmp(&u32_index)) + else { + return Ok(index); + }; + + Ok(NormalizedId( + usize::try_from( + SINGLETON_IANA_NORMALIZER + .non_canonical_identifiers + .get(canonicalized_idx) + .ok_or(TimeZoneProviderError::Range("Unknown time zone identifier"))? + .1, + ) + .unwrap_or(0), + )) + } + + fn identifier(&self, index: NormalizedId) -> TimeZoneProviderResult<&str> { + SINGLETON_IANA_NORMALIZER + .normalized_identifiers + .get(index.0) + .ok_or(TimeZoneProviderError::Range("Unknown time zone identifier")) + } +} diff --git a/deps/temporal/provider/src/tzdb/datagen.rs b/deps/temporal/provider/src/tzdb/datagen.rs new file mode 100644 index 00000000000000..24479c6bef5d59 --- /dev/null +++ b/deps/temporal/provider/src/tzdb/datagen.rs @@ -0,0 +1,129 @@ +use super::*; +use alloc::string::String; +use alloc::vec::Vec; +use std::{ + borrow::ToOwned, + collections::{BTreeMap, BTreeSet}, + fs, io, + path::Path, +}; +use zoneinfo_rs::{ZoneInfoData, ZoneInfoError}; + +#[derive(Debug)] +pub enum TzdbDataSourceError { + Io(io::Error), + ZoneInfo(ZoneInfoError), +} + +impl From for TzdbDataSourceError { + fn from(value: io::Error) -> Self { + Self::Io(value) + } +} + +impl From for TzdbDataSourceError { + fn from(value: ZoneInfoError) -> Self { + Self::ZoneInfo(value) + } +} + +pub struct TzdbDataSource { + pub version: String, + pub data: ZoneInfoData, +} + +impl TzdbDataSource { + /// Try to create a tzdb source from a tzdata directory. + pub fn try_from_zoneinfo_directory(tzdata_path: &Path) -> Result { + let version_file = tzdata_path.join("version"); + let version = fs::read_to_string(version_file)?.trim().to_owned(); + let data = ZoneInfoData::from_zoneinfo_directory(tzdata_path)?; + Ok(Self { version, data }) + } + + /// Try to create a tzdb source from a tzdata rearguard.zi + /// + /// To generate a rearguard.zi, download tzdata from IANA. Run `make rearguard.zi` + pub fn try_from_rearguard_zoneinfo_dir( + tzdata_path: &Path, + ) -> Result { + let version_file = tzdata_path.join("version"); + let version = fs::read_to_string(version_file)?.trim().to_owned(); + let rearguard_zoneinfo = tzdata_path.join("rearguard.zi"); + let data = ZoneInfoData::from_filepath(rearguard_zoneinfo)?; + Ok(Self { version, data }) + } +} + +// ==== Begin DataProvider impl ==== + +#[derive(Debug)] +pub enum IanaDataError { + Io(io::Error), + Provider(TzdbDataSourceError), + Build(zerotrie::ZeroTrieBuildError), +} + +#[allow(clippy::expect_used, clippy::unwrap_used, reason = "Datagen only")] +impl IanaIdentifierNormalizer<'_> { + pub fn build(tzdata_path: &Path) -> Result { + let provider = TzdbDataSource::try_from_zoneinfo_directory(tzdata_path) + .map_err(IanaDataError::Provider)?; + let mut all_identifiers = BTreeSet::default(); + for zone_id in provider.data.zones.keys() { + // Add canonical identifiers. + let _ = all_identifiers.insert(&**zone_id); + } + + for link_from in provider.data.links.keys() { + // Add link / non-canonical identifiers + let _ = all_identifiers.insert(link_from); + } + // Make a sorted list of canonical timezones + let norm_vec: Vec<&str> = all_identifiers.iter().copied().collect(); + let norm_zerovec: VarZeroVec<'static, str> = norm_vec.as_slice().into(); + + let identifier_map: BTreeMap, usize> = all_identifiers + .iter() + .map(|id| { + let normalized_id = norm_vec.binary_search(id).unwrap(); + + (id.to_ascii_lowercase().as_bytes().to_vec(), normalized_id) + }) + .collect(); + + let mut primary_id_map: BTreeMap = BTreeMap::new(); + // ECMAScript implementations must support an available named time zone with the identifier "UTC", which must be + // the primary time zone identifier for the UTC time zone. In addition, implementations may support any number of other available named time zones. + let utc_index = norm_vec.binary_search(&"UTC").unwrap(); + primary_id_map.insert(norm_vec.binary_search(&"Etc/UTC").unwrap(), utc_index); + primary_id_map.insert(norm_vec.binary_search(&"Etc/GMT").unwrap(), utc_index); + + for (link_from, link_to) in &provider.data.links { + if link_from == "UTC" { + continue; + } + let link_from = norm_vec.binary_search(&&**link_from).unwrap(); + let index = if link_to == "Etc/UTC" || link_to == "Etc/GMT" { + utc_index + } else { + norm_vec.binary_search(&&**link_to).unwrap() + }; + primary_id_map.insert(link_from, index); + } + + Ok(IanaIdentifierNormalizer { + version: provider.version.into(), + available_id_index: ZeroAsciiIgnoreCaseTrie::try_from(&identifier_map) + .map_err(IanaDataError::Build)? + .convert_store(), + non_canonical_identifiers: primary_id_map + .iter() + .map(|(x, y)| (u32::try_from(*x).unwrap(), u32::try_from(*y).unwrap())) + .collect(), + normalized_identifiers: norm_zerovec, + }) + } +} + +// ==== End DataProvider impl ==== diff --git a/deps/temporal/provider/src/tzif.rs b/deps/temporal/provider/src/tzif.rs new file mode 100644 index 00000000000000..6bbbf0076b4a8e --- /dev/null +++ b/deps/temporal/provider/src/tzif.rs @@ -0,0 +1,2007 @@ +// Relevant operations: +// +// - Time Zone Identifiers +// - AvailableNamedTimeZoneIdentifiers +// - SystemTimeZoneIdentifier +// - IsTimeZoneOffsetString +// - GetNamedTimeZoneEpochNanoseconds +// - fn(id, isoDateTimeRecord) -> [epochNanoseconds] +// - GetNamedTimeZoneOffsetNanoseconds +// - fn(id, epochNanoseconds) -> [offset] + +// TODO: Potentially implement a IsoDateTimeRecord type to decouple +// public facing APIs from IsoDateTime + +// Could return type be something like [Option; 2] + +// NOTE: tzif data is computed in glibc's `__tzfile_compute` in `tzfile.c`. +// +// Handling the logic here may be incredibly important for full tzif support. + +// NOTES: +// +// Transitions to DST (in march) + 1. Empty list between 2:00-3:00. +// Transitions to Std (in nov) -1. Two elements 1:00-2:00 is repeated twice. + +// Transition Seconds + (offset diff) +// where +// offset diff = is_dst { dst_off - std_off } else { std_off - dst_off }, i.e. to_offset - from_offset + +use std::path::Path; +#[cfg(target_family = "unix")] +use std::path::PathBuf; + +use crate::provider::EpochNanosecondsAndOffset; +use crate::CompiledNormalizer; +use alloc::collections::BTreeMap; +use alloc::string::String; +use alloc::vec::Vec; +use core::cmp::Ordering; +use core::ops::Range; +use core::str; +use std::sync::RwLock; + +use combine::Parser; + +use tzif::{ + self, + data::{ + posix::{DstTransitionInfo, PosixTzString, TransitionDate, TransitionDay}, + time::Seconds, + tzif::{DataBlock, LocalTimeTypeRecord, TzifData, TzifHeader}, + }, +}; + +use crate::utils; + +use crate::provider::{ + CandidateEpochNanoseconds, GapEntryOffsets, IsoDateTime, NormalizerAndResolver, ResolvedId, + TimeZoneProviderResult, TimeZoneResolver, TransitionDirection, UtcOffsetSeconds, +}; +use crate::{ + epoch_nanoseconds::{seconds_to_nanoseconds, EpochNanoseconds, NS_IN_S}, + TimeZoneProviderError, +}; + +#[cfg(target_family = "unix")] +const ZONEINFO_DIR: &str = "/usr/share/zoneinfo/"; + +// TODO: Workshop record name? +/// The `LocalTimeRecord` result represents the result of searching for a +/// time zone transition without the offset seconds applied to the +/// epoch seconds. +/// +/// As a result of the search, it is possible for the resulting search to be either +/// Empty (due to an invalid time being provided that would be in the +1 tz shift) +/// or two time zones (when a time exists in the ambiguous range of a -1 shift). +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum LocalTimeRecordResult { + Empty(GapEntryOffsets), + Single(UtcOffsetSeconds), + Ambiguous { + first: UtcOffsetSeconds, + second: UtcOffsetSeconds, + }, +} + +/// `TimeZoneTransitionInfo` represents information about a timezone transition. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct TimeZoneTransitionInfo { + /// The transition time epoch at which the offset needs to be applied. + pub transition_epoch: Option, + /// The time zone offset in seconds. + pub offset: UtcOffsetSeconds, +} + +impl From for LocalTimeRecordResult { + fn from(value: UtcOffsetSeconds) -> Self { + Self::Single(value) + } +} + +impl From for LocalTimeRecordResult { + fn from(value: LocalTimeTypeRecord) -> Self { + Self::Single(value.into()) + } +} + +impl From<(LocalTimeTypeRecord, LocalTimeTypeRecord)> for LocalTimeRecordResult { + fn from(value: (LocalTimeTypeRecord, LocalTimeTypeRecord)) -> Self { + Self::Ambiguous { + first: value.0.into(), + second: value.1.into(), + } + } +} + +/// `TZif` stands for Time zone information format is laid out by [RFC 8536][rfc8536] and +/// laid out by the [tzdata manual][tzif-manual] +/// +/// To be specific, this representation of `TZif` is solely to extend functionality +/// fo the parsed type from the `tzif` [rust crate][tzif-crate], which has further detail on the +/// layout in Rust. +/// +/// `TZif` files are compiled via [`zic`][zic-manual], which offers a variety of options for changing the layout +/// and range of a `TZif`. +/// +/// [rfc8536]: https://datatracker.ietf.org/doc/html/rfc8536 +/// [tzif-manual]: https://man7.org/linux/man-pages/man5/tzfile.5.html +/// [tzif-crate]: https://docs.rs/tzif/latest/tzif/ +/// [zic-manual]: https://man7.org/linux/man-pages/man8/zic.8.html +#[derive(Debug, Clone)] +pub struct Tzif { + pub header1: TzifHeader, + pub data_block1: DataBlock, + pub header2: Option, + pub data_block2: Option, + pub footer: Option, +} + +impl From for Tzif { + fn from(value: TzifData) -> Self { + let TzifData { + header1, + data_block1, + header2, + data_block2, + footer, + } = value; + + Self { + header1, + data_block1, + header2, + data_block2, + footer, + } + } +} + +impl Tzif { + pub fn from_bytes(data: &[u8]) -> TimeZoneProviderResult { + let Ok((parse_result, _)) = tzif::parse::tzif::tzif().parse(data) else { + return Err(TimeZoneProviderError::Assert("Illformed Tzif data.")); + }; + Ok(Self::from(parse_result)) + } + + #[cfg(target_family = "unix")] + pub fn read_tzif(identifier: &str) -> TimeZoneProviderResult { + // Protect from path traversal attacks + if identifier.starts_with('/') || identifier.contains('.') { + return Err(TimeZoneProviderError::Range( + "Ill-formed timezone identifier", + )); + } + let mut path = PathBuf::from(ZONEINFO_DIR); + path.push(identifier); + Self::from_path(&path) + } + + pub fn from_path(path: &Path) -> TimeZoneProviderResult { + if !path.exists() { + return Err(TimeZoneProviderError::Range("Unknown timezone identifier")); + } + tzif::parse_tzif_file(path) + .map(Into::into) + .map_err(|_| TimeZoneProviderError::Assert("Tzif parsing error")) + } + + pub fn posix_tz_string(&self) -> Option<&PosixTzString> { + self.footer.as_ref() + } + + pub fn get_data_block2(&self) -> TimeZoneProviderResult<&DataBlock> { + self.data_block2 + .as_ref() + .ok_or(TimeZoneProviderError::Assert("Only Tzif V2+ is supported.")) + } + + pub fn get(&self, epoch_seconds: &Seconds) -> TimeZoneProviderResult { + let db = self.get_data_block2()?; + + let result = db.transition_times.binary_search(epoch_seconds); + + match result { + // The transition time was given. The transition entries *start* at their + // transition time, so we use the same index + Ok(idx) => Ok(get_timezone_offset(db, idx)), + // + // If there are no transitions, local time for all timestamps is specified by the TZ + // string in the footer if present and nonempty; otherwise, it is + // specified by time type 0. + Err(_) if db.transition_times.is_empty() => { + if let Some(posix_tz_string) = self.posix_tz_string() { + resolve_posix_tz_string_for_epoch_seconds(posix_tz_string, epoch_seconds.0) + } else { + Ok(TimeZoneTransitionInfo { + offset: db + .local_time_type_records + .first() + .copied() + .ok_or(TimeZoneProviderError::Assert("Out of transition range"))? + .into(), + transition_epoch: None, + }) + } + } + // Our time is before the first transition. + // Get the first timezone offset + Err(0) => Ok(get_first_timezone_offset(db)), + // Our time is after some transition. + Err(idx) => { + if db.transition_times.len() <= idx { + // The transition time provided is beyond the length of + // the available transition time, so the time zone is + // resolved with the POSIX tz string. + let mut offset = resolve_posix_tz_string_for_epoch_seconds( + self.posix_tz_string().ok_or(TimeZoneProviderError::Assert( + "No POSIX tz string to resolve with.", + ))?, + epoch_seconds.0, + )?; + if offset.transition_epoch.is_none() { + offset.transition_epoch = Some( + db.transition_times + .get(idx - 1) + .ok_or(TimeZoneProviderError::Assert("Out of transition range"))? + .0, + ) + } + return Ok(offset); + } + // binary_search returns the insertion index, which is one after the + // index of the closest lower bound. Fetch that bound. + Ok(get_timezone_offset(db, idx - 1)) + } + } + } + + fn transition_nanoseconds_for_utc_epoch_nanoseconds( + &self, + utc_epoch: i128, + ) -> TimeZoneProviderResult { + let mut seconds = (utc_epoch / NS_IN_S) as i64; + // The rounding is inexact. Transitions are only at second + // boundaries, so the offset at N s is the same as the offset at N.001, + // but the offset at -Ns is not the same as the offset at -N.001, + // the latter matches -N - 1 s instead. + if seconds < 0 && utc_epoch % NS_IN_S != 0 { + seconds -= 1; + } + self.get(&Seconds(seconds)).map(|t| t.offset) + } + + // Helper function to call resolve_posix_tz_string + fn resolve_posix_tz_string( + &self, + local_seconds: &Seconds, + ) -> TimeZoneProviderResult { + resolve_posix_tz_string( + self.posix_tz_string().ok_or(TimeZoneProviderError::Assert( + "Could not resolve time zone.", + ))?, + local_seconds.0, + ) + } + + pub fn get_time_zone_transition( + &self, + epoch_nanoseconds: i128, + direction: TransitionDirection, + ) -> TimeZoneProviderResult> { + // First search the tzif data + + let epoch_seconds = Seconds((epoch_nanoseconds / NS_IN_S) as i64); + // When *exactly* on a transition the spec wants you to + // get the next one, so it's important to know if we are + // actually on epoch_seconds or a couple nanoseconds before/after it + // to handle the exact match case + let seconds_is_exact = (epoch_nanoseconds % NS_IN_S) == 0; + let seconds_is_negative = epoch_nanoseconds < 0; + let db = self.get_data_block2()?; + + let b_search_result = db.transition_times.binary_search(&epoch_seconds); + + let mut transition_idx = match b_search_result { + Ok(idx) => { + match (direction, seconds_is_exact, seconds_is_negative) { + // If we are N.001 for negative N, the next transition is idx + (TransitionDirection::Next, false, true) => idx, + // If we are exactly N, or N.001 for positive N, the next transition is idx + 1 + (TransitionDirection::Next, true, _) + | (TransitionDirection::Next, false, false) => idx + 1, + // If we are N.001 for positive N, the previous transition the one at idx (= N) + (TransitionDirection::Previous, false, false) => idx, + // If we are exactly N, or N.0001 for negative N, the previous transition is idx - 1 + (TransitionDirection::Previous, true, _) + | (TransitionDirection::Previous, false, true) => { + if let Some(idx) = idx.checked_sub(1) { + idx + } else { + // If we found the first transition, there is no previous one, + // return None + return Ok(None); + } + } + } + } + // idx is insertion index here, so it is the index of the closest upper + // transition + Err(idx) => match direction { + TransitionDirection::Next => idx, + // Special case, we're after the end of the array, we want to make + // sure we hit the POSIX tz handling and we should not subtract one. + TransitionDirection::Previous if idx == db.transition_times.len() => idx, + TransitionDirection::Previous => { + // Go one previous + if let Some(idx) = idx.checked_sub(1) { + idx + } else { + // If we found the first transition, there is no previous one, + // return None + return Ok(None); + } + } + }, + }; + + while let Some(tzif_transition) = maybe_get_transition_info(db, transition_idx) { + // This is not a real transition. Skip it. + if tzif_transition.prev.utoff == tzif_transition.next.utoff { + match direction { + TransitionDirection::Next => transition_idx += 1, + TransitionDirection::Previous if transition_idx == 0 => return Ok(None), + TransitionDirection::Previous => transition_idx -= 1, + } + } else { + return Ok(Some(tzif_transition.transition_time.into())); + } + } + + // We went past the Tzif transitions. We need to handle the posix string instead. + let posix_tz_string = self.posix_tz_string().ok_or(TimeZoneProviderError::Assert( + "Could not resolve time zone.", + ))?; + + // The last transition in the tzif tables. + // We should not go back beyond this + let last_tzif_transition = db.transition_times.last().copied(); + + // We need to do a similar backwards iteration to find the last real transition. + // Do it only when needed, this case will only show up when walking Previous for a date + // just after the last tzif transition but before the first posix transition. + let last_real_tzif_transition = || { + debug_assert!(direction == TransitionDirection::Previous); + for last_transition_idx in (0..db.transition_times.len()).rev() { + if let Some(tzif_transition) = maybe_get_transition_info(db, last_transition_idx) { + if tzif_transition.prev.utoff == tzif_transition.next.utoff { + continue; + } + return Some(tzif_transition.transition_time); + } + break; + } + None + }; + + let Some(dst_variant) = &posix_tz_string.dst_info else { + // There are no further transitions. + match direction { + TransitionDirection::Next => return Ok(None), + TransitionDirection::Previous => { + // Go back to the last tzif transition + if last_tzif_transition.is_some() { + if let Some(last_real_tzif_transition) = last_real_tzif_transition() { + return Ok(Some(last_real_tzif_transition.into())); + } + } + return Ok(None); + } + } + }; + + // Calculate year, but clamp it to the last transition + // We do not want to try and apply the posix string to earlier years! + // + // Antarctica/Troll is an example of a timezone that has a posix string + // but no meaningful previous transitions. + let mut epoch_seconds_for_year_calculation = epoch_seconds; + if let Some(last_tzif_transition) = last_tzif_transition { + if epoch_seconds < last_tzif_transition { + epoch_seconds_for_year_calculation = last_tzif_transition; + } + } + let year = utils::epoch_time_to_iso_year(epoch_seconds_for_year_calculation.0 * 1000); + + let transition_info = DstTransitionInfoForYear::compute(posix_tz_string, dst_variant, year); + + let range = transition_info.transition_range(); + + let mut seconds = match direction { + TransitionDirection::Next => { + // Inexact seconds in the negative case means that (seconds == foo) is actually + // seconds < foo + // + // This code will likely not actually be hit: the current Tzif database has no + // entries with DST offset posix strings where the posix string starts + // before the unix epoch. + let seconds_is_inexact_for_negative = seconds_is_negative && !seconds_is_exact; + // We're before the first transition + if epoch_seconds < range.start + || (epoch_seconds == range.start && seconds_is_inexact_for_negative) + { + range.start + } else if epoch_seconds < range.end + || (epoch_seconds == range.end && seconds_is_inexact_for_negative) + { + // We're between the first and second transition + range.end + } else { + // We're after the second transition + let transition_info = + DstTransitionInfoForYear::compute(posix_tz_string, dst_variant, year + 1); + + transition_info.transition_range().start + } + } + TransitionDirection::Previous => { + // Inexact seconds in the positive case means that (seconds == foo) is actually + // seconds > foo + let seconds_is_ineexact_for_positive = !seconds_is_negative && !seconds_is_exact; + // We're after the second transition + // (note that seconds_is_exact means that epoch_seconds == range.end actually means equality) + if epoch_seconds > range.end + || (epoch_seconds == range.end && seconds_is_ineexact_for_positive) + { + range.end + } else if epoch_seconds > range.start + || (epoch_seconds == range.start && seconds_is_ineexact_for_positive) + { + // We're after the first transition + range.start + } else { + // We're before the first transition + let transition_info = + DstTransitionInfoForYear::compute(posix_tz_string, dst_variant, year - 1); + + transition_info.transition_range().end + } + } + }; + + if let Some(last_tzif_transition) = last_tzif_transition { + // When going Previous, we went back into the area of tzif transition + if seconds < last_tzif_transition { + if let Some(last_real_tzif_transition) = last_real_tzif_transition() { + seconds = last_real_tzif_transition; + } else { + return Ok(None); + } + } + } + + Ok(Some(seconds.into())) + } + + // For more information, see /docs/TZDB.md + /// This function determines the Time Zone output for a local epoch + /// nanoseconds value without an offset. + /// + /// Basically, if someone provides a DateTime 2017-11-05T01:30:00, + /// we have no way of knowing if this value is in DST or STD. + /// Furthermore, for the above example, this should return 2 time + /// zones due to there being two 2017-11-05T01:30:00. On the other + /// side of the transition, the DateTime 2017-03-12T02:30:00 could + /// be provided. This time does NOT exist due to the +1 jump from + /// 02:00 -> 03:00 (but of course it does as a nanosecond value). + pub fn v2_estimate_tz_pair( + &self, + local_seconds: &Seconds, + ) -> TimeZoneProviderResult { + // We need to estimate a tz pair. + // First search the ambiguous seconds. + let db = self.get_data_block2()?; + + // Note that this search is *approximate*. transition_times + // is in UTC epoch times, whereas we have a local time. + // + // An assumption we make is that this will at worst give us an off-by-one error; + // transition times should not be less than a day apart. + let b_search_result = db.transition_times.binary_search(local_seconds); + + let mut estimated_idx = match b_search_result { + Ok(idx) => idx, + Err(idx) => idx, + }; + // If we're either out of bounds or at the last + // entry, we need to check if we're after it, since if we + // are we need to use posix_tz_string instead. + // + // This includes the last entry (hence `idx + 1`) since our search was approximate. + if estimated_idx + 1 >= db.transition_times.len() { + // If we are *well past* the last transition time, we want + // to use the posix tz string + let mut use_posix = true; + if !db.transition_times.is_empty() { + // In case idx was out of bounds, bring it back in + estimated_idx = db.transition_times.len() - 1; + let transition_info = get_transition_info(db, estimated_idx); + + // I'm not fully sure if this is correct. + // Is the next_offset valid for the last transition time in its + // vicinity? Probably? It does not seem pleasant to try and do this + // math using half of the transition info and half of the posix info. + // + // TODO(manishearth, nekevss): https://github.com/boa-dev/temporal/issues/469 + if transition_info.transition_time_prev_epoch() > *local_seconds + || transition_info.transition_time_next_epoch() > *local_seconds + { + // We're before the transition fully ends; we should resolve + // with the regular transition time instead of use_posix + use_posix = false; + } + } + if use_posix { + // The transition time provided is beyond the length of + // the available transition time, so the time zone is + // resolved with the POSIX tz string. + return self.resolve_posix_tz_string(local_seconds); + } + } + + debug_assert!(estimated_idx < db.transition_times.len()); + + let transition_info = get_transition_info(db, estimated_idx); + + let range = transition_info.offset_range_local(); + + if range.contains(local_seconds) { + return Ok(transition_info.record_for_contains()); + } else if *local_seconds < range.start { + if estimated_idx == 0 { + // We're at the beginning, there are no timezones before us + // So we just return the first offset + return Ok(LocalTimeRecordResult::Single(transition_info.prev.into())); + } + // Otherwise, try the previous offset + estimated_idx -= 1; + } else { + if estimated_idx + 1 == db.transition_times.len() { + // We're at the end, return posix instead + return self.resolve_posix_tz_string(local_seconds); + } + // Otherwise, try the next offset + estimated_idx += 1; + } + + let transition_info = get_transition_info(db, estimated_idx); + let range = transition_info.offset_range_local(); + + if range.contains(local_seconds) { + Ok(transition_info.record_for_contains()) + } else if *local_seconds < range.start { + // Note that get_transition_info will correctly fetch the first offset + // into .prev when working with the first transition. + Ok(LocalTimeRecordResult::Single(transition_info.prev.into())) + } else { + // We're at the end, return posix instead + if estimated_idx + 1 == db.transition_times.len() { + return self.resolve_posix_tz_string(local_seconds); + } + Ok(LocalTimeRecordResult::Single(transition_info.next.into())) + } + } + + /// Given a *local* datetime, return all possible epoch nanosecond values for it + fn candidate_nanoseconds_for_local_epoch_nanoseconds( + &self, + local_datetime: IsoDateTime, + ) -> TimeZoneProviderResult { + let epoch_nanos = (local_datetime).as_nanoseconds(); + let mut seconds = (epoch_nanos.0 / NS_IN_S) as i64; + + // We just rounded our ns value to seconds. + // This is fine for positive ns: timezones do not transition at sub-second offsets, + // so the offset at N seconds is always the offset at N.0001 seconds. + // + // However, for negative epochs, the offset at -N seconds might be different + // from that at -N.001 seconds. Instead, we calculate the offset at (-N-1) seconds. + if seconds < 0 { + let remainder = epoch_nanos.0 % NS_IN_S; + if remainder != 0 { + seconds -= 1; + } + } + + let local_time_record_result = self.v2_estimate_tz_pair(&Seconds(seconds))?; + let result = match local_time_record_result { + LocalTimeRecordResult::Empty(bounds) => CandidateEpochNanoseconds::Zero(bounds), + LocalTimeRecordResult::Single(r) => { + let epoch_ns = EpochNanoseconds::from(epoch_nanos.0 - seconds_to_nanoseconds(r.0)); + CandidateEpochNanoseconds::One(EpochNanosecondsAndOffset { + ns: epoch_ns, + offset: r, + }) + } + LocalTimeRecordResult::Ambiguous { first, second } => { + let first_epoch_ns = + EpochNanoseconds::from(epoch_nanos.0 - seconds_to_nanoseconds(first.0)); + let second_epoch_ns = + EpochNanoseconds::from(epoch_nanos.0 - seconds_to_nanoseconds(second.0)); + CandidateEpochNanoseconds::Two([ + EpochNanosecondsAndOffset { + ns: first_epoch_ns, + offset: first, + }, + EpochNanosecondsAndOffset { + ns: second_epoch_ns, + offset: second, + }, + ]) + } + }; + Ok(result) + } +} + +#[inline] +fn get_timezone_offset(db: &DataBlock, idx: usize) -> TimeZoneTransitionInfo { + // NOTE: Transition type can be empty. If no transition_type exists, + // then use 0 as the default index of local_time_type_records. + let offset = db + .local_time_type_records + .get(db.transition_types.get(idx).copied().unwrap_or(0)); + debug_assert!(offset.is_some(), "tzif internal invariant violated"); + TimeZoneTransitionInfo { + transition_epoch: db.transition_times.get(idx).map(|s| s.0), + offset: offset.copied().unwrap_or_default().into(), + } +} + +#[inline] +fn get_first_timezone_offset(db: &DataBlock) -> TimeZoneTransitionInfo { + let offset = db.local_time_type_records.first(); + debug_assert!(offset.is_some(), "tzif internal invariant violated"); + TimeZoneTransitionInfo { + // There was no transition into the first timezone + transition_epoch: None, + offset: offset.copied().unwrap_or_default().into(), + } +} + +#[inline] +fn get_local_record(db: &DataBlock, idx: usize) -> LocalTimeTypeRecord { + // NOTE: Transition type can be empty. If no transition_type exists, + // then use 0 as the default index of local_time_type_records. + let idx = db.transition_types.get(idx).copied().unwrap_or(0); + + let get = db.local_time_type_records.get(idx); + debug_assert!(get.is_some(), "tzif internal invariant violated"); + get.copied().unwrap_or_default() +} + +#[inline] +fn get_transition_info(db: &DataBlock, idx: usize) -> TzifTransitionInfo { + let info = maybe_get_transition_info(db, idx); + debug_assert!(info.is_some(), "tzif internal invariant violated"); + info.unwrap_or_default() +} + +#[inline] +fn maybe_get_transition_info(db: &DataBlock, idx: usize) -> Option { + let next = get_local_record(db, idx); + let transition_time = *db.transition_times.get(idx)?; + let prev = if idx == 0 { + *db.local_time_type_records.first()? + } else { + get_local_record(db, idx - 1) + }; + Some(TzifTransitionInfo { + prev, + next, + transition_time, + }) +} + +/// Information obtained from the tzif file about a transition. +#[derive(Debug, Default)] +struct TzifTransitionInfo { + /// The time record from before this transition + prev: LocalTimeTypeRecord, + /// The time record corresponding to this transition and dates after it + next: LocalTimeTypeRecord, + /// The UTC epoch seconds for the transition + transition_time: Seconds, +} + +impl TzifTransitionInfo { + /// Get the previous offset as a number of seconds from + /// 1970-01-01 in local time as reckoned by the previous offset + fn transition_time_prev_epoch(&self) -> Seconds { + // You always add the UTC offset to get the local time; + // so a local time in PST (-08:00) will be `utc - 8h` + self.transition_time + self.prev.utoff + } + /// Get the previous offset as a number of seconds from + /// 1970-01-01 in local time as reckoned by the next offset + fn transition_time_next_epoch(&self) -> Seconds { + // You always add the UTC offset to get the local time; + // so a local time in PST (-08:00) will be `utc - 8h` + self.transition_time + self.next.utoff + } + + /// Gets the range of local times where this transition is active + /// + /// Note that this will always be start..end, NOT prev..next: if the next + /// offset is before prev (e.g. for a TransitionKind::Overlap) year, + /// it will be next..prev. + /// + /// You should use .kind() to understand how to interpret this + fn offset_range_local(&self) -> Range { + let prev = self.transition_time_prev_epoch(); + let next = self.transition_time_next_epoch(); + match self.kind() { + TransitionKind::Overlap => next..prev, + _ => prev..next, + } + } + + /// What is the kind of the transition? + fn kind(&self) -> TransitionKind { + match self.prev.utoff.cmp(&self.next.utoff) { + Ordering::Less => TransitionKind::Gap, + Ordering::Greater => TransitionKind::Overlap, + Ordering::Equal => TransitionKind::Smooth, + } + } + + /// If a time is found to be within self.offset_range_local(), + /// what is the corresponding LocalTimeRecordResult? + fn record_for_contains(&self) -> LocalTimeRecordResult { + match self.kind() { + TransitionKind::Gap => LocalTimeRecordResult::Empty(GapEntryOffsets { + offset_before: self.prev.into(), + offset_after: self.next.into(), + transition_epoch: self.transition_time.into(), + }), + TransitionKind::Overlap => LocalTimeRecordResult::Ambiguous { + first: self.prev.into(), + second: self.next.into(), + }, + TransitionKind::Smooth => LocalTimeRecordResult::Single(self.prev.into()), + } + } +} + +#[derive(Debug)] +enum TransitionKind { + // The offsets didn't change (happens when abbreviations/savings values change) + Smooth, + // The offsets changed in a way that leaves a gap + Gap, + // The offsets changed in a way that produces overlapping time. + Overlap, +} + +/// Stores the information about DST transitions for a given year +struct DstTransitionInfoForYear { + dst_start_seconds: Seconds, + dst_end_seconds: Seconds, + std_offset: UtcOffsetSeconds, + dst_offset: UtcOffsetSeconds, +} + +impl DstTransitionInfoForYear { + fn compute( + posix_tz_string: &PosixTzString, + dst_variant: &DstTransitionInfo, + year: i32, + ) -> Self { + let std_offset = UtcOffsetSeconds::from(&posix_tz_string.std_info); + let dst_offset = UtcOffsetSeconds::from(&dst_variant.variant_info); + let dst_start_seconds = Seconds(calculate_transition_seconds_for_year( + year, + dst_variant.start_date, + std_offset, + )); + let dst_end_seconds = Seconds(calculate_transition_seconds_for_year( + year, + dst_variant.end_date, + dst_offset, + )); + Self { + dst_start_seconds, + dst_end_seconds, + std_offset, + dst_offset, + } + } + + // Returns the range between offsets in this year + // This may cover DST or standard time, whichever starts first + pub fn transition_range(&self) -> Range { + if self.dst_start_seconds > self.dst_end_seconds { + self.dst_end_seconds..self.dst_start_seconds + } else { + self.dst_start_seconds..self.dst_end_seconds + } + } +} + +// NOTE: seconds here are epoch, so they are exact, not wall time. +#[inline] +fn resolve_posix_tz_string_for_epoch_seconds( + posix_tz_string: &PosixTzString, + seconds: i64, +) -> TimeZoneProviderResult { + let Some(dst_variant) = &posix_tz_string.dst_info else { + // Regardless of the time, there is one variant and we can return it. + return Ok(TimeZoneTransitionInfo { + transition_epoch: None, + offset: UtcOffsetSeconds::from(&posix_tz_string.std_info), + }); + }; + + let year = utils::epoch_time_to_iso_year(seconds * 1000); + + let transition_info = DstTransitionInfoForYear::compute(posix_tz_string, dst_variant, year); + let dst_start_seconds = transition_info.dst_start_seconds.0; + let dst_end_seconds = transition_info.dst_end_seconds.0; + + // Need to determine if the range being tested is standard or savings time. + let dst_is_inversed = dst_end_seconds < dst_start_seconds; + + // We have potentially to different variations of the DST start and end time. + // + // Northern hemisphere: dst_start -> dst_end + // Southern hemisphere: dst_end -> dst_start + // + // This is primarily due to the summer / winter months of those areas. + // + // For the northern hemispere, we can check if the range contains the seconds. For the + // southern hemisphere, we check if the range does no contain the value. + let should_return_dst = (!dst_is_inversed + && (dst_start_seconds..dst_end_seconds).contains(&seconds)) + || (dst_is_inversed && !(dst_end_seconds..dst_start_seconds).contains(&seconds)); + + // Expanding on the above, the state of time zones in the year are: + // + // Northern hemisphere: STD -> DST -> STD + // Southern hemisphere: DST -> STD -> DST + // + // This is simple for the returning the offsets, but if the seconds value falls into the first + // available rule. However, the northern hemisphere's first STD rule and the Southern hemisphere's + // first DST rule will have different transition times that are based in the year prior, so if the + // requested seconds falls in that range, we calculate the transition time for the prior year. + let (new_offset, transition_epoch) = if should_return_dst { + let transition_epoch = if dst_is_inversed && seconds < dst_end_seconds { + Some(calculate_transition_seconds_for_year( + year - 1, + dst_variant.start_date, + transition_info.dst_offset, + )) + } else { + Some(dst_start_seconds) + }; + (transition_info.dst_offset, transition_epoch) + } else { + let transition_epoch = if !dst_is_inversed && seconds < dst_start_seconds { + Some(calculate_transition_seconds_for_year( + year - 1, + dst_variant.end_date, + transition_info.std_offset, + )) + } else { + Some(dst_end_seconds) + }; + (transition_info.std_offset, transition_epoch) + }; + Ok(TimeZoneTransitionInfo { + offset: new_offset, + transition_epoch, + }) +} + +fn calculate_transition_seconds_for_year( + year: i32, + transition_date: TransitionDate, + offset: UtcOffsetSeconds, +) -> i64 { + // Determine the year of the requested time. + let year_epoch_seconds = i64::from(utils::epoch_days_for_year(year)) * 86400; + let is_leap = utils::is_leap(year); + + // Calculate the days in the year for the TransitionDate + // This value is zero-indexed so it can be added to the year's epoch seconds + let days = match transition_date.day { + TransitionDay::NoLeap(day) if day > 59 => day - 1 + is_leap as u16, + TransitionDay::NoLeap(day) => day - 1, + TransitionDay::WithLeap(day) => day, + TransitionDay::Mwd(month, week, day) => { + let days_to_month = utils::month_to_day((month - 1) as u8, is_leap); + let days_in_month = u16::from(utils::iso_days_in_month(year, month as u8)); + + // Month starts in the day... + let day_offset = (u16::from(utils::epoch_seconds_to_day_of_week(year_epoch_seconds)) + + days_to_month) + .rem_euclid(7); + + // EXAMPLE: + // + // 0 1 2 3 4 5 6 + // sun mon tue wed thu fri sat + // - - - 0 1 2 3 + // 4 5 6 7 8 9 10 + // 11 12 13 14 15 16 17 + // 18 19 20 21 22 23 24 + // 25 26 27 28 29 30 - + // + // The day_offset = 3, since the month starts on a wednesday. + // + // We're looking for the second friday of the month. Thus, since the month started before + // a friday, we need to start counting from week 0: + // + // day_of_month = (week - u16::from(day_offset <= day)) * 7 + day - day_offset = (2 - 1) * 7 + 5 - 3 = 9 + // + // This works if the month started on a day before the day we want (day_offset <= day). However, if that's not the + // case, we need to start counting on week 1. For example, calculate the day of the month for the third monday + // of the month: + // + // day_of_month = (week - u16::from(day_offset <= day)) * 7 + day - day_offset = (3 - 0) * 7 + 1 - 3 = 19 + + // Note: this day_of_month is zero-indexed! + let mut day_of_month = (week - u16::from(day_offset <= day)) * 7 + day - day_offset; + + // Week 5 actually means "last of month". The day_of_month calculation + // above uses `week` directly; so we might end up spilling into the next month. In that + // case, we normalize to the fourth week of the month. + // + // Note that this only needs to be done once; if a month will have at least four of each + // day of the week since all months have 28 days or greater. + // + // We add one because day_of_month is zero_indexed + if day_of_month + 1 > days_in_month { + day_of_month -= 7 + } + + days_to_month + day_of_month + } + }; + + // Transition time is on local time, so we need to add the UTC offset to get the correct UTC timestamp + // for the transition. + year_epoch_seconds + i64::from(days) * 86400 + transition_date.time.0 - offset.0 +} + +/// Resolve the footer of a tzif file. +/// +/// Seconds are epoch seconds in local time. +#[inline] +fn resolve_posix_tz_string( + posix_tz_string: &PosixTzString, + seconds: i64, +) -> TimeZoneProviderResult { + let std = &posix_tz_string.std_info; + let Some(dst) = &posix_tz_string.dst_info else { + // Regardless of the time, there is one variant and we can return it. + return Ok(UtcOffsetSeconds::from(&posix_tz_string.std_info).into()); + }; + + // TODO: Resolve safety issue around utils. + // Using f64 is a hold over from early implementation days and should + // be moved away from. + + // NOTE: + // STD -> DST == start + // DST -> STD == end + let (is_transition_day, mut is_dst) = + cmp_seconds_to_transitions(&dst.start_date.day, &dst.end_date.day, seconds)?; + if is_transition_day { + let time = utils::epoch_ms_to_ms_in_day(seconds * 1_000) as i64 / 1_000; + let transition_time = if is_dst == TransitionType::Dst { + dst.start_date.time + } else { + dst.end_date.time + }; + // Convert to UtcOffsetSeconds so that these behave like + // normal offsets + let std = UtcOffsetSeconds::from(std); + let dst = UtcOffsetSeconds::from(&dst.variant_info); + let transition_diff = if is_dst == TransitionType::Dst { + dst.0 - std.0 + } else { + std.0 - dst.0 + }; + let offset = offset_range(transition_time.0 + transition_diff, transition_time.0); + match offset.contains(&time) { + true if is_dst == TransitionType::Dst => { + return Ok(LocalTimeRecordResult::Empty(GapEntryOffsets { + offset_before: std, + offset_after: dst, + transition_epoch: transition_time.into(), + })); + } + true => { + // Note(nekevss, manishearth): We may need to more carefully + // handle inverse DST here. + return Ok(LocalTimeRecordResult::Ambiguous { + first: dst, + second: std, + }); + } + _ => {} + } + + // We were not contained in the transition above, + // AND we are before it, which means we are actually in + // the other transition! + // + // NOTE(Manishearth) do we need to do anything special + // here if we end up back at the tzif transition data? + if time < offset.start { + is_dst.invert(); + } + } + + match is_dst { + TransitionType::Dst => Ok(UtcOffsetSeconds::from(&dst.variant_info).into()), + TransitionType::Std => Ok(UtcOffsetSeconds::from(&posix_tz_string.std_info).into()), + } +} + +/// The month, week of month, and day of week value built into the POSIX tz string. +/// +/// For more information, see the [POSIX tz string docs](https://sourceware.org/glibc/manual/2.40/html_node/Proleptic-TZ.html) +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +struct Mwd { + month: u8, + week: u8, + day: u8, +} + +impl Mwd { + fn from_u16(month: u16, week: u16, day: u16) -> Self { + Self::from_u8( + u8::try_from(month).unwrap_or(0), + u8::try_from(week).unwrap_or(0), + u8::try_from(day).unwrap_or(0), + ) + } + + fn from_u8(month: u8, week: u8, day: u8) -> Self { + Self { month, week, day } + } + + /// Given the day of the week of the 0th day in this month, + /// normalize the week to being a week number (1 = first week, ...) + /// rather than a weekday ordinal (1 = first friday, etc) + fn normalize_to_week_number(&mut self, day_of_week_zeroth_day: u8) { + if self.day <= day_of_week_zeroth_day { + self.week += 1; + } + } +} + +/// Represents an MWD for a given time +#[derive(Debug)] +struct MwdForTime { + /// This will never have day = 5 + mwd: Mwd, + /// The day of the week of the 0th day (the day before the month starts) + day_of_week_zeroth_day: u8, + /// This is the day of week of the 29th and the last day of the month, + /// if the month has more than 28 days. + /// Basically, this is the start and end of the "fifth $weekday of the month" period + extra_days: Option<(u8, u8)>, +} + +impl MwdForTime { + fn from_seconds(seconds: i64) -> Self { + let (year, month, day_of_month) = utils::ymd_from_epoch_milliseconds(seconds * 1_000); + let week_of_month = day_of_month / 7 + 1; + let day_of_week = utils::epoch_seconds_to_day_of_week(seconds); + let mut mwd = Mwd::from_u8(month, week_of_month, day_of_week); + let days_in_month = utils::iso_days_in_month(year, month); + let day_of_week_zeroth_day = + (i16::from(day_of_week) - i16::from(day_of_month)).rem_euclid(7) as u8; + mwd.normalize_to_week_number(day_of_week_zeroth_day); + if day_of_month > 28 { + let day_of_week_day_29 = (day_of_week_zeroth_day + 29).rem_euclid(7); + let day_of_week_last_day = (day_of_week_zeroth_day + days_in_month).rem_euclid(7); + Self { + mwd, + day_of_week_zeroth_day, + extra_days: Some((day_of_week_day_29, day_of_week_last_day)), + } + } else { + // No day 5 + Self { + mwd, + day_of_week_zeroth_day, + extra_days: None, + } + } + } + + /// MWDs from Posix data can contain `w=5`, which means the *last* $weekday of the month, + /// not the 5th. For MWDs in the same month, this normalizes the 5 to the actual number of the + /// last weekday of the month (5 or 4) + /// + /// Furthermore, this turns the week number into a true week number: the "second friday in March" + /// will be turned into "the friday in the first week of March" or "the Friday in the second week of March" + /// depending on when March starts. + /// + /// This normalization *only* applies to MWDs in the same month. For other MWDs, such normalization is irrelevant. + fn normalize_mwd(&self, other: &mut Mwd) { + // If we're in the same month, normalization will actually have a useful effect + if self.mwd.month == other.month { + // First normalize MWDs that are like "the last $weekday in the month" + // the last $weekday in the month, we need special handling + if other.week == 5 { + if let Some((day_29, last_day)) = self.extra_days { + if day_29 < last_day { + if other.day < day_29 || other.day > last_day { + // This day isn't found in the last week. Subtract one. + other.week = 4; + } + } else { + // The extra part of the month crosses Sunday + if other.day < day_29 && other.day > last_day { + // This day isn't found in the last week. Subtract one. + other.week = 4; + } + } + } else { + // There is no week 5 in this month, normalize to 4 + other.week = 4; + } + } + + other.normalize_to_week_number(self.day_of_week_zeroth_day); + } + } +} + +fn cmp_seconds_to_transitions( + start: &TransitionDay, + end: &TransitionDay, + seconds: i64, +) -> TimeZoneProviderResult<(bool, TransitionType)> { + let cmp_result = match (start, end) { + ( + TransitionDay::Mwd(start_month, start_week, start_day), + TransitionDay::Mwd(end_month, end_week, end_day), + ) => { + let mwd = MwdForTime::from_seconds(seconds); + let mut start = Mwd::from_u16(*start_month, *start_week, *start_day); + let mut end = Mwd::from_u16(*end_month, *end_week, *end_day); + + mwd.normalize_mwd(&mut start); + mwd.normalize_mwd(&mut end); + + let is_transition = start == mwd.mwd || end == mwd.mwd; + let is_dst = if start > end { + mwd.mwd < end || start <= mwd.mwd + } else { + start <= mwd.mwd && mwd.mwd < end + }; + + (is_transition, is_dst) + } + (TransitionDay::WithLeap(start), TransitionDay::WithLeap(end)) => { + let day_in_year = utils::epoch_time_to_day_in_year(seconds * 1_000) as u16; + let is_transition = *start == day_in_year || *end == day_in_year; + let is_dst = if start > end { + day_in_year < *end || *start <= day_in_year + } else { + *start <= day_in_year && day_in_year < *end + }; + (is_transition, is_dst) + } + // TODO: do we need to modify the logic for leap years? + (TransitionDay::NoLeap(start), TransitionDay::NoLeap(end)) => { + let day_in_year = utils::epoch_time_to_day_in_year(seconds * 1_000) as u16; + let is_transition = *start == day_in_year || *end == day_in_year; + let is_dst = if start > end { + day_in_year < *end || *start <= day_in_year + } else { + *start <= day_in_year && day_in_year < *end + }; + (is_transition, is_dst) + } + // NOTE: The assumption here is that mismatched day types on + // a POSIX string is an illformed string. + _ => { + return Err(TimeZoneProviderError::Assert( + "Mismatched day types on a POSIX string.", + )) + } + }; + + match cmp_result { + (true, dst) if dst => Ok((true, TransitionType::Dst)), + (true, _) => Ok((true, TransitionType::Std)), + (false, dst) if dst => Ok((false, TransitionType::Dst)), + (false, _) => Ok((false, TransitionType::Std)), + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum TransitionType { + Dst, + Std, +} + +impl TransitionType { + fn invert(&mut self) { + *self = match *self { + Self::Dst => Self::Std, + Self::Std => Self::Dst, + } + } +} + +fn offset_range(offset_one: i64, offset_two: i64) -> core::ops::Range { + if offset_one < offset_two { + return offset_one..offset_two; + } + offset_two..offset_one +} + +/// Timezone provider that uses compiled data. +/// +/// This provider includes raw tzdata in the application binary and parses that data into +/// a TZif format, which incurs a runtime cost; however, parsed TZifs are cached, which +/// offsets the runtime cost on repeated requests. +/// +/// This will eventually use pure compiled data () +pub type CompiledTzdbProvider = + NormalizerAndResolver>; + +/// Timezone provider that uses filesystem based tzif data. +/// +/// This provider parses tzdata into a TZif format, which incurs a runtime cost; however, +/// parsed TZifs are cached, which offsets the runtime cost on repeated requests. +/// +/// Important note: the filesystem tzdb is not available on windows; as a result, this provider +/// will fallback to compiled data via `jiff_tzdb`. +/// +/// Currently uses jiff_tzdb and performs parsing; will eventually +/// use pure compiled data () +pub type FsTzdbProvider = NormalizerAndResolver>; + +/// [`TimeZoneResolver`] that uses compiled data. +/// +/// Currently uses jiff_tzdb and performs parsing; will eventually +/// use pure compiled data () +#[derive(Debug, Default)] +pub struct TzdbResolver { + id_cache: RwLock>, + cache: RwLock>, + kind: Kind, +} + +mod sealed { + pub trait Sealed {} +} +pub trait TzdbResolverBackend: sealed::Sealed { + /// The intermediate unparsed Tzif data + type IntermediateTzif<'a>; + /// Looks up a normalized timezone identifier, returning the identifier as + /// used in this timezone database and the Tzif bytes data + fn get<'a, 'b>( + &'a self, + normalized_identifier: &'b [u8], + ) -> TimeZoneProviderResult<(&'b str, Self::IntermediateTzif<'a>)>; + + fn load_tzif<'a>( + &self, + intermediate: Self::IntermediateTzif<'a>, + ) -> TimeZoneProviderResult; +} + +#[derive(Debug, Default)] +pub struct CompiledTzdbResolver; + +impl sealed::Sealed for CompiledTzdbResolver {} +impl TzdbResolverBackend for CompiledTzdbResolver { + type IntermediateTzif<'a> = &'a [u8]; + fn get<'a, 'b>( + &'a self, + normalized_identifier: &'b [u8], + ) -> TimeZoneProviderResult<(&'b str, &'a [u8])> { + let tzdb_val = + jiff_tzdb::get(str::from_utf8(normalized_identifier).map_err(|_| { + TimeZoneProviderError::Range("Time zone identifier does not exist.") + })?); + let Some((canonical_name, tzif_bytes)) = tzdb_val else { + return Err(TimeZoneProviderError::Range( + "Time zone identifier does not exist.", + )); + }; + Ok((canonical_name, tzif_bytes)) + } + + fn load_tzif<'a>( + &self, + intermediate: Self::IntermediateTzif<'a>, + ) -> TimeZoneProviderResult { + Tzif::from_bytes(intermediate) + } +} + +#[derive(Debug, Default)] +pub struct FsTzdbResolver; + +impl sealed::Sealed for FsTzdbResolver {} +impl TzdbResolverBackend for FsTzdbResolver { + #[cfg(target_family = "unix")] + type IntermediateTzif<'a> = PathBuf; + #[cfg(any(target_family = "windows", target_family = "wasm"))] + type IntermediateTzif<'a> = &'a [u8]; + fn get<'a, 'b>( + &'a self, + normalized_identifier: &'b [u8], + ) -> TimeZoneProviderResult<(&'b str, Self::IntermediateTzif<'a>)> { + let normalized_identifier = str::from_utf8(normalized_identifier) + .map_err(|_| TimeZoneProviderError::Range("Time zone identifier does not exist."))?; + #[cfg(target_family = "unix")] + { + // Protect from path traversal attacks + if normalized_identifier.starts_with('/') || normalized_identifier.contains('.') { + return Err(TimeZoneProviderError::Range( + "Ill-formed timezone identifier", + )); + } + + let mut path = PathBuf::from(ZONEINFO_DIR); + path.push(normalized_identifier); + Ok((normalized_identifier, path)) + } + + #[cfg(any(target_family = "windows", target_family = "wasm"))] + { + let Some((canonical_name, data)) = jiff_tzdb::get(normalized_identifier) else { + return Err(TimeZoneProviderError::Range( + "Time zone identifier does not exist.", + )); + }; + return Ok((canonical_name, data)); + }; + } + + fn load_tzif<'a>( + &self, + intermediate: Self::IntermediateTzif<'a>, + ) -> TimeZoneProviderResult { + #[cfg(target_family = "unix")] + let bytes = std::fs::read(intermediate) + .map_err(|_| TimeZoneProviderError::Range("Time zone identifier does not exist."))?; + #[cfg(any(target_family = "windows", target_family = "wasm"))] + let bytes = intermediate; + Tzif::from_bytes(&bytes) + } +} + +impl TzdbResolver { + /// Get timezone data for a single identifier + fn get(&self, id: ResolvedId) -> TimeZoneProviderResult { + self.cache + .read() + .map_err(|_| TimeZoneProviderError::Assert("poisoned RWLock"))? + .get(id.0) + .cloned() + .ok_or(TimeZoneProviderError::Assert( + "Time zone identifier does not exist.", + )) + } +} + +impl TimeZoneResolver for TzdbResolver { + fn get_id(&self, normalized_identifier: &[u8]) -> TimeZoneProviderResult { + let (identifier, tzif_intermediate) = self.kind.get(normalized_identifier)?; + if let Some(id) = self + .id_cache + .read() + .map_err(|_| TimeZoneProviderError::Assert("poisoned RWLock"))? + .get(identifier) + { + return Ok(*id); + } + + let mut vec = self + .cache + .write() + .map_err(|_| TimeZoneProviderError::Assert("poisoned RWLock"))?; + + let id = ResolvedId(vec.len()); + vec.push(self.kind.load_tzif(tzif_intermediate)?); + + self.id_cache + .write() + .map_err(|_| TimeZoneProviderError::Assert("poisoned RWLock"))? + .insert(identifier.into(), id); + Ok(id) + } + + fn candidate_nanoseconds_for_local_epoch_nanoseconds( + &self, + identifier: ResolvedId, + local_datetime: IsoDateTime, + ) -> TimeZoneProviderResult { + self.get(identifier)? + .candidate_nanoseconds_for_local_epoch_nanoseconds(local_datetime) + } + + fn transition_nanoseconds_for_utc_epoch_nanoseconds( + &self, + identifier: ResolvedId, + epoch_nanoseconds: i128, + ) -> TimeZoneProviderResult { + self.get(identifier)? + .transition_nanoseconds_for_utc_epoch_nanoseconds(epoch_nanoseconds) + } + + fn get_time_zone_transition( + &self, + identifier: ResolvedId, + epoch_nanoseconds: i128, + direction: TransitionDirection, + ) -> TimeZoneProviderResult> { + let tzif = self.get(identifier)?; + tzif.get_time_zone_transition(epoch_nanoseconds, direction) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::provider::TimeZoneProvider; + use crate::SINGLETON_IANA_NORMALIZER; + use tzif::data::time::Seconds; + + fn get_singleton_identifier(id: &str) -> Option<&'static str> { + let index = SINGLETON_IANA_NORMALIZER.available_id_index.get(id)?; + SINGLETON_IANA_NORMALIZER.normalized_identifiers.get(index) + } + + #[test] + fn test_singleton() { + let id = get_singleton_identifier("uTc"); + assert_eq!(id, Some("UTC")); + let id = get_singleton_identifier("EURope/BeRlIn").unwrap(); + assert_eq!(id, "Europe/Berlin"); + } + + #[test] + fn available_ids() { + let provider = FsTzdbProvider::default(); + assert!(provider.get(b"uTC").is_ok()); + assert!(provider.get(b"Etc/uTc").is_ok()); + assert!(provider.get(b"AMERIca/CHIcago").is_ok()); + } + + #[test] + fn exactly_transition_time_after_empty_edge_case() { + let provider = FsTzdbProvider::default(); + let today = IsoDateTime { + year: 2017, + month: 3, + day: 12, + hour: 3, + minute: 0, + second: 0, + millisecond: 0, + microsecond: 0, + nanosecond: 0, + }; + + let ny = provider.get(b"America/New_York").unwrap(); + let local = provider + .candidate_nanoseconds_for_local_epoch_nanoseconds(ny, today) + .unwrap(); + assert_eq!(local.len(), 1); + } + + #[test] + fn one_second_before_empty_edge_case() { + let provider = FsTzdbProvider::default(); + let today = IsoDateTime { + year: 2017, + month: 3, + day: 12, + hour: 2, + minute: 59, + second: 59, + millisecond: 0, + microsecond: 0, + nanosecond: 0, + }; + + let ny = provider.get(b"America/New_York").unwrap(); + let local = provider + .candidate_nanoseconds_for_local_epoch_nanoseconds(ny, today) + .unwrap(); + assert!(local.is_empty()); + } + + #[test] + fn new_york_empty_test_case() { + let edge_case = IsoDateTime { + year: 2017, + month: 3, + day: 12, + hour: 2, + minute: 30, + second: 0, + millisecond: 0, + microsecond: 0, + nanosecond: 0, + }; + let edge_case_seconds = ((edge_case).as_nanoseconds().0 / 1_000_000_000) as i64; + + #[cfg(not(target_os = "windows"))] + let new_york = Tzif::read_tzif("America/New_York"); + #[cfg(target_os = "windows")] + let new_york = { + let (_, data) = jiff_tzdb::get("America/New_York").unwrap(); + Tzif::from_bytes(data) + }; + + assert!(new_york.is_ok()); + let new_york = new_york.unwrap(); + + let locals = new_york + .v2_estimate_tz_pair(&Seconds(edge_case_seconds)) + .unwrap(); + assert!(matches!(locals, LocalTimeRecordResult::Empty(..))); + } + + #[test] + fn sydney_empty_test_case() { + // Australia Daylight savings day + let today = IsoDateTime { + year: 2017, + month: 10, + day: 1, + hour: 2, + minute: 30, + second: 0, + millisecond: 0, + microsecond: 0, + nanosecond: 0, + }; + let seconds = ((today).as_nanoseconds().0 / 1_000_000_000) as i64; + + #[cfg(not(target_os = "windows"))] + let sydney = Tzif::read_tzif("Australia/Sydney"); + #[cfg(target_os = "windows")] + let sydney = { + let (_, data) = jiff_tzdb::get("Australia/Sydney").unwrap(); + Tzif::from_bytes(data) + }; + + assert!(sydney.is_ok()); + let sydney = sydney.unwrap(); + + let locals = sydney.v2_estimate_tz_pair(&Seconds(seconds)).unwrap(); + assert!(matches!(locals, LocalTimeRecordResult::Empty(..))); + } + + #[test] + fn new_york_duplicate_case() { + // Moves from DST to STD + let edge_case = IsoDateTime { + year: 2017, + month: 11, + day: 5, + hour: 1, + minute: 30, + second: 0, + millisecond: 0, + microsecond: 0, + nanosecond: 0, + }; + let edge_case_seconds = ((edge_case).as_nanoseconds().0 / 1_000_000_000) as i64; + + #[cfg(not(target_os = "windows"))] + let new_york = Tzif::read_tzif("America/New_York"); + #[cfg(target_os = "windows")] + let new_york = { + let (_, data) = jiff_tzdb::get("America/New_York").unwrap(); + Tzif::from_bytes(data) + }; + + assert!(new_york.is_ok()); + let new_york = new_york.unwrap(); + + let locals = new_york + .v2_estimate_tz_pair(&Seconds(edge_case_seconds)) + .unwrap(); + + assert_eq!( + locals, + LocalTimeRecordResult::Ambiguous { + // DST + first: UtcOffsetSeconds(-14400), + // STD + second: UtcOffsetSeconds(-18000), + } + ); + } + + #[test] + fn sydney_duplicate_case() { + // Australia Daylight savings day + // Moves from DST to STD + let today = IsoDateTime { + year: 2017, + month: 4, + day: 2, + hour: 2, + minute: 30, + second: 0, + millisecond: 0, + microsecond: 0, + nanosecond: 0, + }; + let seconds = ((today).as_nanoseconds().0 / 1_000_000_000) as i64; + + #[cfg(not(target_os = "windows"))] + let sydney = Tzif::read_tzif("Australia/Sydney"); + #[cfg(target_os = "windows")] + let sydney = { + let (_, data) = jiff_tzdb::get("Australia/Sydney").unwrap(); + Tzif::from_bytes(data) + }; + + assert!(sydney.is_ok()); + let sydney = sydney.unwrap(); + + let locals = sydney.v2_estimate_tz_pair(&Seconds(seconds)).unwrap(); + + assert_eq!( + locals, + LocalTimeRecordResult::Ambiguous { + // DST + first: UtcOffsetSeconds(39600), + // STD + second: UtcOffsetSeconds(36000), + } + ); + } + + #[test] + fn new_york_duplicate_with_slim_format() { + let (_, data) = jiff_tzdb::get("America/New_York").unwrap(); + let new_york = Tzif::from_bytes(data); + assert!(new_york.is_ok()); + let new_york = new_york.unwrap(); + + let edge_case = IsoDateTime { + year: 2017, + month: 11, + day: 5, + hour: 1, + minute: 30, + second: 0, + millisecond: 0, + microsecond: 0, + nanosecond: 0, + }; + let edge_case_seconds = ((edge_case).as_nanoseconds().0 / 1_000_000_000) as i64; + + let locals = new_york + .v2_estimate_tz_pair(&Seconds(edge_case_seconds)) + .unwrap(); + + assert_eq!( + locals, + LocalTimeRecordResult::Ambiguous { + first: UtcOffsetSeconds(-14400), + second: UtcOffsetSeconds(-18000), + } + ); + } + + #[test] + fn sydney_duplicate_case_with_slim_format() { + let (_, data) = jiff_tzdb::get("Australia/Sydney").unwrap(); + let sydney = Tzif::from_bytes(data); + assert!(sydney.is_ok()); + let sydney = sydney.unwrap(); + + // Australia Daylight savings day + let today = IsoDateTime { + year: 2017, + month: 4, + day: 2, + hour: 2, + minute: 30, + second: 0, + millisecond: 0, + microsecond: 0, + nanosecond: 0, + }; + let seconds = ((today).as_nanoseconds().0 / 1_000_000_000) as i64; + + let locals = sydney.v2_estimate_tz_pair(&Seconds(seconds)).unwrap(); + + assert_eq!( + locals, + LocalTimeRecordResult::Ambiguous { + first: UtcOffsetSeconds(39600), + second: UtcOffsetSeconds(36000), + } + ); + } + + // TODO: Determine the validity of this test. Primarily, this test + // goes beyond the regularly historic limit of transition_times, so + // even when on a DST boundary the first time zone is returned. The + // question is whether this behavior is consistent with what would + // be expected. + #[test] + fn before_epoch_northern_hemisphere() { + let edge_case = IsoDateTime { + year: 1880, + month: 11, + day: 5, + hour: 1, + minute: 30, + second: 0, + millisecond: 0, + microsecond: 0, + nanosecond: 0, + }; + let edge_case_seconds = ((edge_case).as_nanoseconds().0 / 1_000_000_000) as i64; + + #[cfg(not(target_os = "windows"))] + let new_york = Tzif::read_tzif("America/New_York"); + #[cfg(target_os = "windows")] + let new_york = { + let (_, data) = jiff_tzdb::get("America/New_York").unwrap(); + Tzif::from_bytes(data) + }; + + assert!(new_york.is_ok()); + let new_york = new_york.unwrap(); + + let locals = new_york + .v2_estimate_tz_pair(&Seconds(edge_case_seconds)) + .unwrap(); + + assert!(matches!(locals, LocalTimeRecordResult::Single(_))); + } + + // TODO: Determine the validity of this test. Primarily, this test + // goes beyond the regularly historic limit of transition_times, so + // even when on a DST boundary the first time zone is returned. The + // question is whether this behavior is consistent with what would + // be expected. + #[test] + fn before_epoch_southern_hemisphere() { + // Australia Daylight savings day + let today = IsoDateTime { + year: 1880, + month: 4, + day: 2, + hour: 2, + minute: 30, + second: 0, + millisecond: 0, + microsecond: 0, + nanosecond: 0, + }; + let seconds = ((today).as_nanoseconds().0 / 1_000_000_000) as i64; + + #[cfg(not(target_os = "windows"))] + let sydney = Tzif::read_tzif("Australia/Sydney"); + #[cfg(target_os = "windows")] + let sydney = { + let (_, data) = jiff_tzdb::get("Australia/Sydney").unwrap(); + Tzif::from_bytes(data) + }; + + assert!(sydney.is_ok()); + let sydney = sydney.unwrap(); + + let locals = sydney.v2_estimate_tz_pair(&Seconds(seconds)).unwrap(); + assert!(matches!(locals, LocalTimeRecordResult::Single(_))); + } + + #[test] + #[cfg(not(target_os = "windows"))] + fn mwd_transition_epoch() { + let tzif = Tzif::read_tzif("Europe/Berlin").unwrap(); + + let start_dt = IsoDateTime { + year: 2028, + month: 3, + day: 30, + hour: 6, + minute: 0, + second: 0, + millisecond: 0, + microsecond: 0, + nanosecond: 0, + }; + let start_dt_secs = ((start_dt).as_nanoseconds().0 / 1_000_000_000) as i64; + + let start_seconds = &Seconds(start_dt_secs); + + assert_eq!( + tzif.get(start_seconds).unwrap().transition_epoch.unwrap(), + // Sun, Mar 26 at 2:00 am + 1837645200 + ); + + let end_dt = IsoDateTime { + year: 2028, + month: 10, + day: 29, + hour: 6, + minute: 0, + second: 0, + millisecond: 0, + microsecond: 0, + nanosecond: 0, + }; + let end_dt_secs = ((end_dt).as_nanoseconds().0 / 1_000_000_000) as i64; + + let end_seconds = &Seconds(end_dt_secs); + + assert_eq!( + tzif.get(end_seconds).unwrap().transition_epoch.unwrap(), + // Sun, Oct 29 at 3:00 am + 1856394000 + ); + } + + #[test] + fn compiled_mwd_transition_epoch() { + let tzif = Tzif::from_bytes(CompiledTzdbResolver.get(b"Europe/Berlin").unwrap().1).unwrap(); + + let start_dt = IsoDateTime { + year: 2028, + month: 3, + day: 30, + hour: 6, + minute: 0, + second: 0, + millisecond: 0, + microsecond: 0, + nanosecond: 0, + }; + let start_dt_secs = ((start_dt).as_nanoseconds().0 / 1_000_000_000) as i64; + + let start_seconds = &Seconds(start_dt_secs); + + assert_eq!( + tzif.get(start_seconds).unwrap().transition_epoch.unwrap(), + // Sun, Mar 26 at 2:00 am + 1837645200 + ); + + let end_dt = IsoDateTime { + year: 2028, + month: 10, + day: 29, + hour: 6, + minute: 0, + second: 0, + millisecond: 0, + microsecond: 0, + nanosecond: 0, + }; + let end_dt_secs = ((end_dt).as_nanoseconds().0 / 1_000_000_000) as i64; + + let end_seconds = &Seconds(end_dt_secs); + + assert_eq!( + tzif.get(end_seconds).unwrap().transition_epoch.unwrap(), + // Sun, Oct 29 at 3:00 am + 1856394000 + ); + } + + // This test mimicks the operations present in `temporal_rs`'s `disambiguate_possible_epoch_nanoseconds` + #[test] + fn disambiguate_ambiguous_posix_time() { + let provider = CompiledTzdbProvider::default(); + + fn run_disambiguation_logic( + before: IsoDateTime, + after: IsoDateTime, + id: &str, + before_offset: i64, + after_offset: i64, + provider: &impl TimeZoneProvider, + ) { + let id = provider.get(id.as_bytes()).unwrap(); + let before_possible = provider + .candidate_nanoseconds_for_local_epoch_nanoseconds(id, before) + .unwrap(); + assert_eq!(before_possible.len(), 1); + + let after_possible = provider + .candidate_nanoseconds_for_local_epoch_nanoseconds(id, after) + .unwrap(); + assert_eq!(after_possible.len(), 1); + let before_seconds = before_possible.first().unwrap(); + let after_seconds = after_possible.first().unwrap(); + + let before_transition = provider + .transition_nanoseconds_for_utc_epoch_nanoseconds(id, before_seconds.ns.0) + .unwrap(); + let after_transition = provider + .transition_nanoseconds_for_utc_epoch_nanoseconds(id, after_seconds.ns.0) + .unwrap(); + assert_ne!( + before_transition, after_transition, + "Transition info must not be the same" + ); + assert_eq!(after_transition.0, after_offset); + assert_eq!(before_transition.0, before_offset); + } + + // Test Northern hemisphere + let before = IsoDateTime { + year: 2020, + month: 3, + day: 7, + hour: 23, + minute: 30, + second: 0, + microsecond: 0, + millisecond: 0, + nanosecond: 0, + }; + let after = IsoDateTime { + year: 2020, + month: 3, + day: 8, + hour: 5, + minute: 30, + second: 0, + microsecond: 0, + millisecond: 0, + nanosecond: 0, + }; + run_disambiguation_logic( + before, + after, + "America/Los_Angeles", + -28_800, + -25_200, + &provider, + ); + + // Test southern hemisphere + + let before = IsoDateTime { + year: 2020, + month: 4, + day: 4, + hour: 23, + minute: 30, + second: 0, + microsecond: 0, + millisecond: 0, + nanosecond: 0, + }; + let after = IsoDateTime { + year: 2020, + month: 4, + day: 5, + hour: 5, + minute: 30, + second: 0, + microsecond: 0, + millisecond: 0, + nanosecond: 0, + }; + run_disambiguation_logic(before, after, "Australia/Sydney", 39_600, 36_000, &provider); + } +} diff --git a/deps/temporal/provider/src/utc.rs b/deps/temporal/provider/src/utc.rs new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/deps/temporal/provider/src/utils.rs b/deps/temporal/provider/src/utils.rs new file mode 100644 index 00000000000000..7874c500567a77 --- /dev/null +++ b/deps/temporal/provider/src/utils.rs @@ -0,0 +1,132 @@ +//! Utility date and time equations for Temporal + +use crate::epoch_nanoseconds::MS_PER_DAY; + +pub mod neri_schneider; + +pub use neri_schneider::epoch_days_from_gregorian_date; + +// NOTE: Potentially add more of tests. + +// ==== Begin Date Equations ==== + +pub(crate) const MS_PER_HOUR: i64 = 3_600_000; +pub(crate) const MS_PER_MINUTE: i64 = 60_000; + +/// `EpochDaysToEpochMS` +/// +/// Functionally the same as Date's abstract operation `MakeDate` +pub fn epoch_days_to_epoch_ms(day: i64, time: i64) -> i64 { + (day * MS_PER_DAY as i64) + time +} + +/// `EpochTimeToDayNumber` +/// +/// This equation is the equivalent to `ECMAScript`'s `Date(t)` +#[cfg(feature = "tzif")] +pub(crate) fn epoch_time_to_day_number(t: i64) -> i32 { + t.div_euclid(MS_PER_DAY as i64) as i32 +} + +#[cfg(feature = "tzif")] +pub(crate) fn epoch_ms_to_ms_in_day(t: i64) -> u32 { + (t.rem_euclid(i64::from(MS_PER_DAY))) as u32 +} + +// https://tc39.es/proposal-temporal/#eqn-mathematicalinleapyear +pub(crate) fn is_leap(y: i32) -> bool { + if y % 4 != 0 { + false + } else if y % 4 == 0 && y % 100 != 0 { + true + } else if y % 100 == 0 && y % 400 != 0 { + false + } else { + // Assert that y is divisble by 400 to ensure we are returning the correct result. + assert_eq!(y % 400, 0); + true + } +} + +#[cfg(feature = "tzif")] +pub(crate) fn epoch_time_to_iso_year(t: i64) -> i32 { + let epoch_days = epoch_ms_to_epoch_days(t); + let (rata_die, shift_constant) = neri_schneider::rata_die_for_epoch_days(epoch_days); + neri_schneider::year(rata_die, shift_constant) +} + +/// Returns the epoch day number for a given year. +#[cfg(feature = "tzif")] +pub(crate) fn epoch_days_for_year(y: i32) -> i32 { + 365 * (y - 1970) + (y - 1969).div_euclid(4) - (y - 1901).div_euclid(100) + + (y - 1601).div_euclid(400) +} + +pub(crate) const fn epoch_ms_to_epoch_days(ms: i64) -> i32 { + (ms.div_euclid(MS_PER_DAY as i64)) as i32 +} + +pub fn ymd_from_epoch_milliseconds(epoch_milliseconds: i64) -> (i32, u8, u8) { + let epoch_days = epoch_ms_to_epoch_days(epoch_milliseconds); + neri_schneider::ymd_from_epoch_days(epoch_days) +} + +#[cfg(feature = "tzif")] +pub(crate) fn month_to_day(m: u8, is_leap: bool) -> u16 { + let leap_day = u16::from(is_leap); + match m { + 0 => 0, + 1 => 31, + 2 => 59 + leap_day, + 3 => 90 + leap_day, + 4 => 120 + leap_day, + 5 => 151 + leap_day, + 6 => 181 + leap_day, + 7 => 212 + leap_day, + 8 => 243 + leap_day, + 9 => 273 + leap_day, + 10 => 304 + leap_day, + 11 => 334 + leap_day, + _ => unreachable!(), + } +} + +#[cfg(feature = "tzif")] +pub(crate) fn epoch_time_to_day_in_year(t: i64) -> i32 { + epoch_time_to_day_number(t) - (epoch_days_for_year(epoch_time_to_iso_year(t))) +} + +#[cfg(feature = "tzif")] +pub(crate) fn epoch_seconds_to_day_of_week(t: i64) -> u8 { + ((t / 86_400) + 4).rem_euclid(7) as u8 +} + +// Trait implementations + +// EpochTimeTOWeekDay -> REMOVED + +// ==== End Date Equations ==== + +// ==== Begin Calendar Equations ==== + +// NOTE: below was the iso methods in temporal::calendar -> Need to be reassessed. + +/// 12.2.31 `ISODaysInMonth ( year, month )` +/// +/// NOTE: month is 1 based +pub fn iso_days_in_month(year: i32, month: u8) -> u8 { + match month { + 1 | 3 | 5 | 7 | 8 | 10 | 12 => 31, + 4 | 6 | 9 | 11 => 30, + 2 => 28 + is_leap(year) as u8, + _ => unreachable!("ISODaysInMonth panicking is an implementation error."), + } +} + +// The below calendar abstract equations/utilities were removed for being unused. +// 12.2.32 `ToISOWeekOfYear ( year, month, day )` +// 12.2.33 `ISOMonthCode ( month )` +// 12.2.39 `ToISODayOfYear ( year, month, day )` +// 12.2.40 `ToISODayOfWeek ( year, month, day )` + +// ==== End Calendar Equations ==== diff --git a/deps/temporal/provider/src/utils/neri_schneider.rs b/deps/temporal/provider/src/utils/neri_schneider.rs new file mode 100644 index 00000000000000..95fbb32b97119e --- /dev/null +++ b/deps/temporal/provider/src/utils/neri_schneider.rs @@ -0,0 +1,266 @@ +//! Gregorian Date Calculations +//! +//! This module contains the logic for Gregorian Date Calculations based +//! off Cassio Neri and Lorenz Schneider's paper, [Euclidean affine functions +//! and their application to calendar algorithms][eaf-calendar-algorithms]. +//! +//! ## General Usage Note +//! +//! Unless specified, Rata Die refers to the computational rata die as referenced +//! in the paper. +//! +//! ## Extending Neri-Schneider shift window +//! Temporal must support the year range [-271_821, 275_760] +//! +//! This means the epoch day range must be epoch_days.abs() <= 100_000_001 +//! +//! Neri-Schneider mention shifting for a range of 32_767, so the shift +//! will need to be much greater. +//! +//! (-271_821 / 400).ciel() = s // 680 +//! +//! In their paper, Neri and Schneider calculated for a Rata Die cycle +//! shift of constant of 82, but that was not sufficient in order to +//! support Temporal's date range, so below is a small addendum table +//! on extending the date range from a cyle shift of 82 to 680 in order +//! to accomodate Temporal's range. +//! +//! | Significant Date | Computational Rata Die | Rata Die Shift +//! | -----------------|------------------------|-----------------| +//! | April 19, -271_821 | -99,280,532 | 65,429 | +//! | January 1, 1970 | 719,468 | 100,065,428 | +//! | September 14, 275,760 | 100_719_469 | 200,065,429 | +//! +//! However, this shift has also been implemented by Cassio Neri, who +//! recommends using a [shift of 3670][neri-shift-context] which places the Epoch in the +//! center of the shift +//! +//! [neri-shift-context]: https://hg.mozilla.org/integration/autoland/rev/54ebf8bd2e11#l3.70 +//! [eaf-calendar-algorithms]: https://onlinelibrary.wiley.com/doi/full/10.1002/spe.3172 + +pub const EPOCH_COMPUTATIONAL_RATA_DIE: i32 = 719_468; +pub const DAYS_IN_A_400Y_CYCLE: u32 = 146_097; + +#[cfg(feature = "tzif")] +const TWO_POWER_THIRTY_NINE: u64 = 549_755_813_888; // 2^39 constant +const TWO_POWER_THIRTY_TWO: u64 = 4_294_967_296; // 2^32 constant +const TWO_POWER_SIXTEEN: u32 = 65_536; // 2^16 constant + // NOTE (nekevss): Shift constant is optimized and safe for supported date range. +const SHIFT_CONSTANT: i32 = 3670; +// NOTE (nekevss): Extended const function, because Temporal +// needs to support calculating for an arbitrarily +// large epoch day range. +const SHIFT_CONSTANT_EXTENDED: i64 = 5_368_710; + +/// Calculate Rata Die value from gregorian +pub const fn epoch_days_from_gregorian_date(year: i32, month: u8, day: u8) -> i64 { + let shift = + SHIFT_CONSTANT_EXTENDED * DAYS_IN_A_400Y_CYCLE as i64 + EPOCH_COMPUTATIONAL_RATA_DIE as i64; + let (comp_year, comp_month, comp_day, century) = rata_die_first_equations(year, month, day); + let y_star = 1461 * comp_year / 4 - century + century / 4; + let m_star = (979 * comp_month - 2919) / 32; + (y_star as i64 + m_star + comp_day) - shift +} + +// Returns Y, M, D, C +const fn rata_die_first_equations(year: i32, month: u8, day: u8) -> (u64, i64, i64, u64) { + let j = (month <= 2) as i64; + let computational_year = (year as i64 + 400 * SHIFT_CONSTANT_EXTENDED) - j; + let computation_month = month as i64 + 12 * j; + let computation_day = day as i64 - 1; + ( + computational_year as u64, + computation_month, + computation_day, + computational_year as u64 / 100, + ) +} + +// Computational days to gregorian YMD + +// Determine j +#[cfg(feature = "tzif")] +const fn j(rata_die: u32) -> u32 { + (computational_day_of_year(rata_die) >= 306) as u32 +} + +const fn n_one(rata_die: u32) -> u32 { + 4 * rata_die + 3 +} + +#[cfg(feature = "tzif")] +const fn n_two(rata_die: u32) -> u32 { + century_rem(rata_die) | 3 +} + +// Returns C, N_c AKA century number and century remainder +const fn first_equations(rata_die: u32) -> (u32, u32) { + let n_one = n_one(rata_die); + let century_rem = n_one.rem_euclid(146_097); + let century_num = n_one.div_euclid(DAYS_IN_A_400Y_CYCLE); + (century_num, century_rem) +} + +#[cfg(feature = "tzif")] +const fn century_rem(rata_die: u32) -> u32 { + n_one(rata_die).rem_euclid(DAYS_IN_A_400Y_CYCLE) +} + +#[cfg(feature = "tzif")] +pub const fn century_number(rata_die: u32) -> u32 { + n_one(rata_die).div_euclid(DAYS_IN_A_400Y_CYCLE) +} + +/// returns Y, N_y AKA, year and day_of_year +const fn second_equations(rata_die: u32) -> (u32, u32) { + let (century, rem) = first_equations(rata_die); + let n_two = rem | 3; + let p2 = 2_939_745 * n_two as u64; + let year_of_century = p2.div_euclid(TWO_POWER_THIRTY_TWO) as u32; + let day_of_year = p2 + .rem_euclid(TWO_POWER_THIRTY_TWO) + .div_euclid(2_939_745) + .div_euclid(4) as u32; + let year = 100 * century + year_of_century; + (year, day_of_year) +} + +// Returns Y, M, D, N_y, AKA year, month, day, day_of_year +const fn third_equations(rata_die: u32) -> (u32, u32, u32, u32) { + let (year, day_of_year) = second_equations(rata_die); + let n_three = 2141 * day_of_year + 197_913; + let month = n_three.div_euclid(TWO_POWER_SIXTEEN); + let day = n_three.rem_euclid(TWO_POWER_SIXTEEN).div_euclid(2141); + (year, month, day, day_of_year) +} + +// Z +#[cfg(feature = "tzif")] +pub const fn computational_year_of_century(rata_die: u32) -> u64 { + (376_287_347 * n_two(rata_die) as u64).div_euclid(TWO_POWER_THIRTY_NINE) +} + +// N_y +#[cfg(feature = "tzif")] +pub const fn computational_day_of_year(rata_die: u32) -> u32 { + (n_two(rata_die) - 1461 * computational_year_of_century(rata_die) as u32).div_euclid(4) +} + +// Y +#[cfg(feature = "tzif")] +pub const fn computational_year(rata_die: u32) -> u32 { + 100 * century_number(rata_die) + computational_year_of_century(rata_die) as u32 +} + +#[cfg(feature = "tzif")] +pub const fn year(computational_rata_die: u32, shift_constant: i32) -> i32 { + (computational_year(computational_rata_die) + j(computational_rata_die)) as i32 - shift_constant +} + +const fn gregorian_ymd(rata_die: u32) -> (i32, u8, u8) { + let (year, month, day, day_of_year) = third_equations(rata_die); + let j = (day_of_year >= 306) as u32; + let year = year + j; + let month = month - 12 * j; + let day = day + 1; + (year as i32, month as u8, day as u8) +} + +/// Get the computational Rata Die for given Epoch Days with the cycle shiftc. +/// +/// For more on `cycle_shifts`, see [`ymd_from_epoch_days`] +pub const fn rata_die_for_epoch_days(epoch_days: i32) -> (u32, i32) { + let rata_die = (epoch_days + + EPOCH_COMPUTATIONAL_RATA_DIE + + DAYS_IN_A_400Y_CYCLE as i32 * SHIFT_CONSTANT) as u32; // epoch_days + K + (rata_die, 400 * SHIFT_CONSTANT) +} + +/// Calculate a Gregorian year, month, and date for the provided epoch days. +pub const fn ymd_from_epoch_days(epoch_days: i32) -> (i32, u8, u8) { + let (rata_die, year_shift_constant) = rata_die_for_epoch_days(epoch_days); + + let (year, month, day) = gregorian_ymd(rata_die); + // Shift the year back to the proper date + (year - year_shift_constant, month, day) +} + +#[cfg(test)] +#[cfg(feature = "tzif")] +mod tests { + use super::*; + + const EPOCH_RATA_DIE: u32 = 719_468; // This is the Rata Die for 1970-01-01 + + const fn days_in_century(rata_die: u32) -> u32 { + century_rem(rata_die).div_euclid(4) + } + + #[test] + fn epoch_century_number() { + let century_number = century_number(EPOCH_RATA_DIE); + assert_eq!(century_number, 19); + let day_number_in_century = days_in_century(EPOCH_RATA_DIE); + assert_eq!(day_number_in_century, 25508); + } + + #[test] + fn epoch_year_of_century() { + let year = computational_year_of_century(EPOCH_RATA_DIE); + assert_eq!(year, 69); + } + + #[test] + fn epoch_day_of_year() { + let day = computational_day_of_year(EPOCH_RATA_DIE); + assert_eq!(day, 306); // Beginning of January in the computational calendar is day number 306 + } + + #[test] + fn epoch_year() { + let year = computational_year(EPOCH_RATA_DIE); + assert_eq!(year, 1969); + } + + #[test] + fn epoch_ymd() { + let ymd = gregorian_ymd(EPOCH_RATA_DIE); + assert_eq!(ymd, (1970, 1, 1)) + } + + #[test] + fn rata_die_from_date() { + let epoch_rata_die = epoch_days_from_gregorian_date(1970, 1, 1); + assert_eq!(epoch_rata_die, 0); + let date = ymd_from_epoch_days(epoch_rata_die as i32); + assert_eq!(date, (1970, 1, 1)); + let neri_scneider_limit_max_rata_die = epoch_days_from_gregorian_date(32767, 12, 31); + assert_eq!(neri_scneider_limit_max_rata_die, 11_248_737); + let neri_schneider_limit_min_rata_die = epoch_days_from_gregorian_date(-32767, 1, 1); + assert_eq!(neri_schneider_limit_min_rata_die, -12_687_428); + let js_max_rata_die = epoch_days_from_gregorian_date(275_760, 9, 14); + assert_eq!(js_max_rata_die, 100_000_001); + let js_min_rata_die = epoch_days_from_gregorian_date(-271_821, 4, 19); + assert_eq!(js_min_rata_die, -100_000_001); + } + + #[test] + fn epoch_days_temporal_limit_to_date() { + let max_date = ymd_from_epoch_days(100_000_001); + assert_eq!(max_date, (275_760, 9, 14)); + let min_date = ymd_from_epoch_days(-100_000_001); + assert_eq!(min_date, (-271_821, 4, 19)); + } + + #[test] + fn epoch_days_from() { + let epoch_days = epoch_days_from_gregorian_date(1970, 1, 1); + assert_eq!(epoch_days, 0); + let epoch_days = epoch_days_from_gregorian_date(275_760, 9, 14); + assert_eq!(epoch_days, 100_000_001); + let epoch_days = epoch_days_from_gregorian_date(-271_821, 4, 19); + let result = ymd_from_epoch_days(epoch_days as i32); + assert_eq!(result, (-271_821, 4, 19)); + assert_eq!(epoch_days, -100_000_001); + } +} diff --git a/deps/temporal/provider/src/zoneinfo64.rs b/deps/temporal/provider/src/zoneinfo64.rs new file mode 100644 index 00000000000000..0a439a8b9160f4 --- /dev/null +++ b/deps/temporal/provider/src/zoneinfo64.rs @@ -0,0 +1,166 @@ +use crate::CompiledNormalizer; +use core::str; +use zoneinfo64::{PossibleOffset, Zone, ZoneInfo64}; + +use crate::provider::{ + CandidateEpochNanoseconds, EpochNanosecondsAndOffset, GapEntryOffsets, IsoDateTime, + NormalizerAndResolver, ResolvedId, TimeZoneProviderResult, TimeZoneResolver, + TransitionDirection, UtcOffsetSeconds, +}; +use crate::{ + epoch_nanoseconds::{seconds_to_nanoseconds, EpochNanoseconds, NS_IN_S}, + TimeZoneProviderError, +}; +use zoneinfo64::UtcOffset; + +impl From for UtcOffsetSeconds { + fn from(other: UtcOffset) -> Self { + Self(i64::from(other.seconds())) + } +} + +pub use zoneinfo64::ZONEINFO64_RES_FOR_TESTING; + +/// A TimeZoneProvider that works using ICU4C zoneinfo64.res data +pub type ZoneInfo64TzdbProvider<'a> = NormalizerAndResolver>; + +impl ZoneInfo64TzdbProvider<'_> { + /// Produces a zoneinfo64 provider using the builtin zoneinfo64 data, + /// for testing use only. We do not provide strong guarantees for which version of zoneinfo64 + /// this will be. + pub fn zoneinfo64_provider_for_testing() -> Option { + let zi_data = zoneinfo64::ZoneInfo64::try_from_u32s(ZONEINFO64_RES_FOR_TESTING).ok()?; + Some(ZoneInfo64TzdbProvider::new(zi_data)) + } +} + +fn get<'a>(zi: &'a ZoneInfo64<'a>, id: ResolvedId) -> TimeZoneProviderResult> { + let id = u16::try_from(id.0) + .map_err(|_| TimeZoneProviderError::Range("Unknown timezone identifier"))?; + Ok(Zone::from_raw_parts((id, zi))) +} + +impl TimeZoneResolver for ZoneInfo64<'_> { + fn get_id(&self, normalized_identifier: &[u8]) -> TimeZoneProviderResult { + let utf8 = str::from_utf8(normalized_identifier) + .map_err(|_| TimeZoneProviderError::Range("Unknown timezone identifier"))?; + let zone = self + .get(utf8) + .ok_or(TimeZoneProviderError::Range("Unknown timezone identifier"))?; + let (id, _) = zone.into_raw_parts(); + Ok(ResolvedId(usize::from(id))) + } + + fn candidate_nanoseconds_for_local_epoch_nanoseconds( + &self, + identifier: ResolvedId, + local_datetime: IsoDateTime, + ) -> TimeZoneProviderResult { + let zone = get(self, identifier)?; + let epoch_nanos = (local_datetime).as_nanoseconds(); + let possible_offset = zone.for_date_time( + local_datetime.year, + local_datetime.month, + local_datetime.day, + local_datetime.hour, + local_datetime.minute, + local_datetime.second, + ); + + let result = match possible_offset { + PossibleOffset::None { + before, + after, + transition, + } => CandidateEpochNanoseconds::Zero(GapEntryOffsets { + offset_before: before.offset.into(), + offset_after: after.offset.into(), + transition_epoch: EpochNanoseconds::from(seconds_to_nanoseconds(transition)), + }), + PossibleOffset::Single(o) => { + let epoch_ns = EpochNanoseconds::from( + epoch_nanos.0 - seconds_to_nanoseconds(i64::from(o.offset.seconds())), + ); + CandidateEpochNanoseconds::One(EpochNanosecondsAndOffset { + ns: epoch_ns, + offset: o.offset.into(), + }) + } + PossibleOffset::Ambiguous { before, after, .. } => { + let first_epoch_ns = EpochNanoseconds::from( + epoch_nanos.0 - seconds_to_nanoseconds(i64::from(before.offset.seconds())), + ); + let second_epoch_ns = EpochNanoseconds::from( + epoch_nanos.0 - seconds_to_nanoseconds(i64::from(after.offset.seconds())), + ); + CandidateEpochNanoseconds::Two([ + EpochNanosecondsAndOffset { + ns: first_epoch_ns, + offset: before.offset.into(), + }, + EpochNanosecondsAndOffset { + ns: second_epoch_ns, + offset: after.offset.into(), + }, + ]) + } + }; + Ok(result) + } + + fn transition_nanoseconds_for_utc_epoch_nanoseconds( + &self, + identifier: ResolvedId, + epoch_nanoseconds: i128, + ) -> TimeZoneProviderResult { + let zone = get(self, identifier)?; + + let Ok(mut seconds) = i64::try_from(epoch_nanoseconds / NS_IN_S) else { + return Err(TimeZoneProviderError::Range( + "Epoch nanoseconds out of range", + )); + }; + // The rounding is inexact. Transitions are only at second + // boundaries, so the offset at N s is the same as the offset at N.001, + // but the offset at -Ns is not the same as the offset at -N.001, + // the latter matches -N - 1 s instead. + if seconds < 0 && epoch_nanoseconds % NS_IN_S != 0 { + seconds -= 1; + } + let offset = zone.for_timestamp(seconds); + + Ok(offset.offset.into()) + } + + fn get_time_zone_transition( + &self, + identifier: ResolvedId, + epoch_nanoseconds: i128, + direction: TransitionDirection, + ) -> TimeZoneProviderResult> { + let zone = get(self, identifier)?; + // We want div_floor behavior + let div = epoch_nanoseconds.div_euclid(NS_IN_S); + let Ok(seconds) = i64::try_from(div) else { + return Err(TimeZoneProviderError::Range( + "Epoch nanoseconds out of range", + )); + }; + + let transition = match direction { + TransitionDirection::Previous => { + let seconds_is_exact = (epoch_nanoseconds % NS_IN_S) == 0; + zone.prev_transition( + seconds, + seconds_is_exact, + /* require_offset_change */ true, + ) + } + TransitionDirection::Next => { + zone.next_transition(seconds, /* require_offset_change */ true) + } + }; + + Ok(transition.map(|transition| EpochNanoseconds::from_seconds(transition.since))) + } +} diff --git a/deps/temporal/src/builtins/compiled/duration.rs b/deps/temporal/src/builtins/compiled/duration.rs new file mode 100644 index 00000000000000..8f02933df535fa --- /dev/null +++ b/deps/temporal/src/builtins/compiled/duration.rs @@ -0,0 +1,41 @@ +use crate::{ + builtins::TZ_PROVIDER, + options::{RelativeTo, RoundingOptions, Unit}, + primitive::FiniteF64, + Duration, TemporalResult, +}; + +use core::cmp::Ordering; + +#[cfg(test)] +mod tests; + +impl Duration { + /// Rounds the current [`Duration`] according to the provided [`RoundingOptions`] and an optional + /// [`RelativeTo`] + /// + /// Enable with the `compiled_data` feature flag. + pub fn round( + &self, + options: RoundingOptions, + relative_to: Option, + ) -> TemporalResult { + self.round_with_provider(options, relative_to, &*TZ_PROVIDER) + } + + /// Returns the ordering between two [`Duration`], takes an optional + /// [`RelativeTo`] + /// + /// Enable with the `compiled_data` feature flag. + pub fn compare( + &self, + two: &Duration, + relative_to: Option, + ) -> TemporalResult { + self.compare_with_provider(two, relative_to, &*TZ_PROVIDER) + } + + pub fn total(&self, unit: Unit, relative_to: Option) -> TemporalResult { + self.total_with_provider(unit, relative_to, &*TZ_PROVIDER) + } +} diff --git a/deps/temporal/src/builtins/compiled/duration/tests.rs b/deps/temporal/src/builtins/compiled/duration/tests.rs new file mode 100644 index 00000000000000..72ae0e4a1f67b8 --- /dev/null +++ b/deps/temporal/src/builtins/compiled/duration/tests.rs @@ -0,0 +1,845 @@ +use crate::{ + duration::DateDuration, + options::{ + OffsetDisambiguation, RelativeTo, RoundingIncrement, RoundingMode, RoundingOptions, Unit, + }, + partial::PartialDuration, + Calendar, PlainDate, TimeZone, ZonedDateTime, +}; + +use core::{num::NonZeroU32, str::FromStr}; + +use super::Duration; + +fn get_round_result( + test_duration: &Duration, + relative_to: RelativeTo, + options: RoundingOptions, +) -> Duration { + test_duration.round(options, Some(relative_to)).unwrap() +} + +fn assert_duration(result: Duration, values: (i64, i64, i64, i64, i64, i64, i64, i64, i128, i128)) { + assert_eq!( + ( + result.years(), + result.months(), + result.weeks(), + result.days(), + result.hours(), + result.minutes(), + result.seconds(), + result.milliseconds(), + result.microseconds(), + result.nanoseconds() + ), + values + ) +} + +// roundingmode-floor.js +#[test] +fn basic_positive_floor_rounding_v2() { + let test_duration = Duration::new(5, 6, 7, 8, 40, 30, 20, 123, 987, 500).unwrap(); + let forward_date = PlainDate::new(2020, 4, 1, Calendar::default()).unwrap(); + + let relative_forward = RelativeTo::PlainDate(forward_date); + + let mut options = RoundingOptions { + largest_unit: None, + smallest_unit: None, + increment: None, + rounding_mode: Some(RoundingMode::Floor), + }; + + let _ = options.smallest_unit.insert(Unit::Year); + let result = get_round_result(&test_duration, relative_forward.clone(), options); + assert_duration(result, (5, 0, 0, 0, 0, 0, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Month); + let result = get_round_result(&test_duration, relative_forward.clone(), options); + assert_duration(result, (5, 7, 0, 0, 0, 0, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Week); + let result = get_round_result(&test_duration, relative_forward.clone(), options); + assert_duration(result, (5, 7, 3, 0, 0, 0, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Day); + let result = get_round_result(&test_duration, relative_forward.clone(), options); + assert_duration(result, (5, 7, 0, 27, 0, 0, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Hour); + let result = get_round_result(&test_duration, relative_forward.clone(), options); + assert_duration(result, (5, 7, 0, 27, 16, 0, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Minute); + let result = get_round_result(&test_duration, relative_forward.clone(), options); + assert_duration(result, (5, 7, 0, 27, 16, 30, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Second); + let result = get_round_result(&test_duration, relative_forward.clone(), options); + assert_duration(result, (5, 7, 0, 27, 16, 30, 20, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Millisecond); + let result = get_round_result(&test_duration, relative_forward.clone(), options); + assert_duration(result, (5, 7, 0, 27, 16, 30, 20, 123, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Microsecond); + let result = get_round_result(&test_duration, relative_forward.clone(), options); + assert_duration(result, (5, 7, 0, 27, 16, 30, 20, 123, 987, 0)); + + let _ = options.smallest_unit.insert(Unit::Nanosecond); + let result = get_round_result(&test_duration, relative_forward.clone(), options); + assert_duration(result, (5, 7, 0, 27, 16, 30, 20, 123, 987, 500)); +} + +#[test] +fn basic_negative_floor_rounding_v2() { + // Test setup + let test_duration = Duration::new(5, 6, 7, 8, 40, 30, 20, 123, 987, 500).unwrap(); + let backward_date = PlainDate::new(2020, 12, 1, Calendar::default()).unwrap(); + + let relative_backward = RelativeTo::PlainDate(backward_date); + + let mut options = RoundingOptions { + largest_unit: None, + smallest_unit: None, + increment: None, + rounding_mode: Some(RoundingMode::Floor), + }; + + let _ = options.smallest_unit.insert(Unit::Year); + let result = get_round_result(&test_duration.negated(), relative_backward.clone(), options); + assert_duration(result, (-6, 0, 0, 0, 0, 0, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Month); + let result = get_round_result(&test_duration.negated(), relative_backward.clone(), options); + assert_duration(result, (-5, -8, 0, 0, 0, 0, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Week); + let result = get_round_result(&test_duration.negated(), relative_backward.clone(), options); + assert_duration(result, (-5, -7, -4, 0, 0, 0, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Day); + let result = get_round_result(&test_duration.negated(), relative_backward.clone(), options); + assert_duration(result, (-5, -7, 0, -28, 0, 0, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Hour); + let result = get_round_result(&test_duration.negated(), relative_backward.clone(), options); + assert_duration(result, (-5, -7, 0, -27, -17, 0, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Minute); + let result = get_round_result(&test_duration.negated(), relative_backward.clone(), options); + assert_duration(result, (-5, -7, 0, -27, -16, -31, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Second); + let result = get_round_result(&test_duration.negated(), relative_backward.clone(), options); + assert_duration(result, (-5, -7, 0, -27, -16, -30, -21, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Millisecond); + let result = get_round_result(&test_duration.negated(), relative_backward.clone(), options); + assert_duration(result, (-5, -7, 0, -27, -16, -30, -20, -124, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Microsecond); + let result = get_round_result(&test_duration.negated(), relative_backward.clone(), options); + assert_duration(result, (-5, -7, 0, -27, -16, -30, -20, -123, -988, 0)); + + let _ = options.smallest_unit.insert(Unit::Nanosecond); + let result = get_round_result(&test_duration.negated(), relative_backward.clone(), options); + assert_duration(result, (-5, -7, 0, -27, -16, -30, -20, -123, -987, -500)); +} + +// roundingmode-ceil.js +#[test] +fn basic_positive_ceil_rounding() { + let test_duration = Duration::new(5, 6, 7, 8, 40, 30, 20, 123, 987, 500).unwrap(); + let forward_date = PlainDate::new(2020, 4, 1, Calendar::from_str("iso8601").unwrap()).unwrap(); + + let relative_forward = RelativeTo::PlainDate(forward_date); + + let mut options = RoundingOptions { + largest_unit: None, + smallest_unit: None, + increment: None, + rounding_mode: Some(RoundingMode::Ceil), + }; + + let _ = options.smallest_unit.insert(Unit::Year); + let result = get_round_result(&test_duration, relative_forward.clone(), options); + assert_duration(result, (6, 0, 0, 0, 0, 0, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Month); + let result = get_round_result(&test_duration, relative_forward.clone(), options); + assert_duration(result, (5, 8, 0, 0, 0, 0, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Week); + let result = get_round_result(&test_duration, relative_forward.clone(), options); + assert_duration(result, (5, 7, 4, 0, 0, 0, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Day); + let result = get_round_result(&test_duration, relative_forward.clone(), options); + assert_duration(result, (5, 7, 0, 28, 0, 0, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Hour); + let result = get_round_result(&test_duration, relative_forward.clone(), options); + assert_duration(result, (5, 7, 0, 27, 17, 0, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Minute); + let result = get_round_result(&test_duration, relative_forward.clone(), options); + assert_duration(result, (5, 7, 0, 27, 16, 31, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Second); + let result = get_round_result(&test_duration, relative_forward.clone(), options); + assert_duration(result, (5, 7, 0, 27, 16, 30, 21, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Millisecond); + let result = get_round_result(&test_duration, relative_forward.clone(), options); + assert_duration(result, (5, 7, 0, 27, 16, 30, 20, 124, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Microsecond); + let result = get_round_result(&test_duration, relative_forward.clone(), options); + assert_duration(result, (5, 7, 0, 27, 16, 30, 20, 123, 988, 0)); + + let _ = options.smallest_unit.insert(Unit::Nanosecond); + let result = get_round_result(&test_duration, relative_forward.clone(), options); + assert_duration(result, (5, 7, 0, 27, 16, 30, 20, 123, 987, 500)); +} + +#[test] +fn basic_negative_ceil_rounding() { + let test_duration = Duration::new(5, 6, 7, 8, 40, 30, 20, 123, 987, 500).unwrap(); + let backward_date = + PlainDate::new(2020, 12, 1, Calendar::from_str("iso8601").unwrap()).unwrap(); + let relative_backward = RelativeTo::PlainDate(backward_date); + + let mut options = RoundingOptions { + largest_unit: None, + smallest_unit: None, + increment: None, + rounding_mode: Some(RoundingMode::Ceil), + }; + + let _ = options.smallest_unit.insert(Unit::Year); + let result = get_round_result(&test_duration.negated(), relative_backward.clone(), options); + assert_duration(result, (-5, 0, 0, 0, 0, 0, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Month); + let result = get_round_result(&test_duration.negated(), relative_backward.clone(), options); + assert_duration(result, (-5, -7, 0, 0, 0, 0, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Week); + let result = get_round_result(&test_duration.negated(), relative_backward.clone(), options); + assert_duration(result, (-5, -7, -3, 0, 0, 0, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Day); + let result = get_round_result(&test_duration.negated(), relative_backward.clone(), options); + assert_duration(result, (-5, -7, 0, -27, 0, 0, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Hour); + let result = get_round_result(&test_duration.negated(), relative_backward.clone(), options); + assert_duration(result, (-5, -7, 0, -27, -16, 0, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Minute); + let result = get_round_result(&test_duration.negated(), relative_backward.clone(), options); + assert_duration(result, (-5, -7, 0, -27, -16, -30, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Second); + let result = get_round_result(&test_duration.negated(), relative_backward.clone(), options); + assert_duration(result, (-5, -7, 0, -27, -16, -30, -20, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Millisecond); + let result = get_round_result(&test_duration.negated(), relative_backward.clone(), options); + assert_duration(result, (-5, -7, 0, -27, -16, -30, -20, -123, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Microsecond); + let result = get_round_result(&test_duration.negated(), relative_backward.clone(), options); + assert_duration(result, (-5, -7, 0, -27, -16, -30, -20, -123, -987, 0)); + + let _ = options.smallest_unit.insert(Unit::Nanosecond); + let result = get_round_result(&test_duration.negated(), relative_backward.clone(), options); + assert_duration(result, (-5, -7, 0, -27, -16, -30, -20, -123, -987, -500)); +} + +// roundingmode-expand.js +#[test] +fn basic_positive_expand_rounding() { + let test_duration = Duration::new(5, 6, 7, 8, 40, 30, 20, 123, 987, 500).unwrap(); + let forward_date = PlainDate::new(2020, 4, 1, Calendar::from_str("iso8601").unwrap()).unwrap(); + let relative_forward = RelativeTo::PlainDate(forward_date); + + let mut options = RoundingOptions { + largest_unit: None, + smallest_unit: None, + increment: None, + rounding_mode: Some(RoundingMode::Expand), + }; + + let _ = options.smallest_unit.insert(Unit::Year); + let result = get_round_result(&test_duration, relative_forward.clone(), options); + assert_duration(result, (6, 0, 0, 0, 0, 0, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Month); + let result = get_round_result(&test_duration, relative_forward.clone(), options); + assert_duration(result, (5, 8, 0, 0, 0, 0, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Week); + let result = get_round_result(&test_duration, relative_forward.clone(), options); + assert_duration(result, (5, 7, 4, 0, 0, 0, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Day); + let result = get_round_result(&test_duration, relative_forward.clone(), options); + assert_duration(result, (5, 7, 0, 28, 0, 0, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Hour); + let result = get_round_result(&test_duration, relative_forward.clone(), options); + assert_duration(result, (5, 7, 0, 27, 17, 0, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Minute); + let result = get_round_result(&test_duration, relative_forward.clone(), options); + assert_duration(result, (5, 7, 0, 27, 16, 31, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Second); + let result = get_round_result(&test_duration, relative_forward.clone(), options); + assert_duration(result, (5, 7, 0, 27, 16, 30, 21, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Millisecond); + let result = get_round_result(&test_duration, relative_forward.clone(), options); + assert_duration(result, (5, 7, 0, 27, 16, 30, 20, 124, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Microsecond); + let result = get_round_result(&test_duration, relative_forward.clone(), options); + assert_duration(result, (5, 7, 0, 27, 16, 30, 20, 123, 988, 0)); + + let _ = options.smallest_unit.insert(Unit::Nanosecond); + let result = get_round_result(&test_duration, relative_forward.clone(), options); + assert_duration(result, (5, 7, 0, 27, 16, 30, 20, 123, 987, 500)); +} + +#[test] +fn basic_negative_expand_rounding() { + let test_duration = Duration::new(5, 6, 7, 8, 40, 30, 20, 123, 987, 500).unwrap(); + + let backward_date = + PlainDate::new(2020, 12, 1, Calendar::from_str("iso8601").unwrap()).unwrap(); + + let relative_backward = RelativeTo::PlainDate(backward_date); + + let mut options = RoundingOptions { + largest_unit: None, + smallest_unit: None, + increment: None, + rounding_mode: Some(RoundingMode::Expand), + }; + + let _ = options.smallest_unit.insert(Unit::Year); + let result = get_round_result(&test_duration.negated(), relative_backward.clone(), options); + assert_duration(result, (-6, 0, 0, 0, 0, 0, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Month); + let result = get_round_result(&test_duration.negated(), relative_backward.clone(), options); + assert_duration(result, (-5, -8, 0, 0, 0, 0, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Week); + let result = get_round_result(&test_duration.negated(), relative_backward.clone(), options); + assert_duration(result, (-5, -7, -4, 0, 0, 0, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Day); + let result = get_round_result(&test_duration.negated(), relative_backward.clone(), options); + assert_duration(result, (-5, -7, 0, -28, 0, 0, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Hour); + let result = get_round_result(&test_duration.negated(), relative_backward.clone(), options); + assert_duration(result, (-5, -7, 0, -27, -17, 0, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Minute); + let result = get_round_result(&test_duration.negated(), relative_backward.clone(), options); + assert_duration(result, (-5, -7, 0, -27, -16, -31, 0, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Second); + let result = get_round_result(&test_duration.negated(), relative_backward.clone(), options); + assert_duration(result, (-5, -7, 0, -27, -16, -30, -21, 0, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Millisecond); + let result = get_round_result(&test_duration.negated(), relative_backward.clone(), options); + assert_duration(result, (-5, -7, 0, -27, -16, -30, -20, -124, 0, 0)); + + let _ = options.smallest_unit.insert(Unit::Microsecond); + let result = get_round_result(&test_duration.negated(), relative_backward.clone(), options); + assert_duration(result, (-5, -7, 0, -27, -16, -30, -20, -123, -988, 0)); + + let _ = options.smallest_unit.insert(Unit::Nanosecond); + let result = get_round_result(&test_duration.negated(), relative_backward.clone(), options); + assert_duration(result, (-5, -7, 0, -27, -16, -30, -20, -123, -987, -500)); +} + +#[test] +fn rounding_to_fractional_day_tests() { + let twenty_five_hours = Duration::from_hours(25); + let options = RoundingOptions { + largest_unit: Some(Unit::Day), + smallest_unit: None, + increment: None, + rounding_mode: Some(RoundingMode::Floor), + }; + let result = twenty_five_hours.round(options, None).unwrap(); + assert_duration(result, (0, 0, 0, 1, 1, 0, 0, 0, 0, 0)); + + let sixty_days = Duration::from(DateDuration::new_unchecked(0, 0, 0, 64)); + let options = RoundingOptions { + largest_unit: None, + smallest_unit: Some(Unit::Day), + increment: Some(RoundingIncrement(NonZeroU32::new(5).unwrap())), + rounding_mode: Some(RoundingMode::Floor), + }; + let result = sixty_days.round(options, None).unwrap(); + assert_duration(result, (0, 0, 0, 60, 0, 0, 0, 0, 0, 0)); + + let sixty_days = Duration::from(DateDuration::new_unchecked(0, 0, 0, 64)); + let options = RoundingOptions { + largest_unit: None, + smallest_unit: Some(Unit::Day), + increment: Some(RoundingIncrement(NonZeroU32::new(10).unwrap())), + rounding_mode: Some(RoundingMode::Floor), + }; + let result = sixty_days.round(options, None).unwrap(); + assert_duration(result, (0, 0, 0, 60, 0, 0, 0, 0, 0, 0)); + + let sixty_days = Duration::from(DateDuration::new_unchecked(0, 0, 0, 64)); + let options = RoundingOptions { + largest_unit: None, + smallest_unit: Some(Unit::Day), + increment: Some(RoundingIncrement(NonZeroU32::new(10).unwrap())), + rounding_mode: Some(RoundingMode::Ceil), + }; + let result = sixty_days.round(options, None).unwrap(); + assert_duration(result, (0, 0, 0, 70, 0, 0, 0, 0, 0, 0)); + + let sixty_days = Duration::from(DateDuration::new_unchecked(0, 0, 0, 1000)); + let options = RoundingOptions { + largest_unit: None, + smallest_unit: Some(Unit::Day), + increment: Some(RoundingIncrement(NonZeroU32::new(1_000_000_000).unwrap())), + rounding_mode: Some(RoundingMode::Expand), + }; + let result = sixty_days.round(options, None).unwrap(); + assert_duration(result, (0, 0, 0, 1_000_000_000, 0, 0, 0, 0, 0, 0)); +} + +// test262/test/built-ins/Temporal/Duration/prototype/round/roundingincrement-non-integer.js +#[test] +fn rounding_increment_non_integer() { + let test_duration = Duration::from(DateDuration::new(0, 0, 0, 1).unwrap()); + let binding = PlainDate::new(2000, 1, 1, Calendar::from_str("iso8601").unwrap()).unwrap(); + let relative_to = RelativeTo::PlainDate(binding); + + let mut options = RoundingOptions { + largest_unit: None, + smallest_unit: Some(Unit::Day), + increment: None, + rounding_mode: Some(RoundingMode::Expand), + }; + + let _ = options + .increment + .insert(RoundingIncrement::try_from(2.5).unwrap()); + let result = test_duration + .round(options, Some(relative_to.clone())) + .unwrap(); + + assert_duration(result, (0, 0, 0, 2, 0, 0, 0, 0, 0, 0)); + + let _ = options + .increment + .insert(RoundingIncrement::try_from(1e9 + 0.5).unwrap()); + let result = test_duration.round(options, Some(relative_to)).unwrap(); + assert_duration(result, (0, 0, 0, 1_000_000_000, 0, 0, 0, 0, 0, 0)); +} + +#[test] +fn basic_add_duration() { + let base = Duration::new(0, 0, 0, 1, 0, 5, 0, 0, 0, 0).unwrap(); + let other = Duration::new(0, 0, 0, 2, 0, 5, 0, 0, 0, 0).unwrap(); + let result = base.add(&other).unwrap(); + assert_eq!(result.days(), 3); + assert_eq!(result.minutes(), 10); + + let other = Duration::new(0, 0, 0, -3, 0, -15, 0, 0, 0, 0).unwrap(); + let result = base.add(&other).unwrap(); + assert_eq!(result.days(), -2); + assert_eq!(result.minutes(), -10); +} + +#[test] +fn basic_subtract_duration() { + let base = Duration::new(0, 0, 0, 3, 0, 15, 0, 0, 0, 0).unwrap(); + let other = Duration::new(0, 0, 0, 1, 0, 5, 0, 0, 0, 0).unwrap(); + let result = base.subtract(&other).unwrap(); + assert_eq!(result.days(), 2); + assert_eq!(result.minutes(), 10); + + let other = Duration::new(0, 0, 0, -3, 0, -15, 0, 0, 0, 0).unwrap(); + let result = base.subtract(&other).unwrap(); + assert_eq!(result.days(), 6); + assert_eq!(result.minutes(), 30); +} + +// days-24-hours-relative-to-zoned-date-time.js +#[test] +fn round_relative_to_zoned_datetime() { + let duration = Duration::from_hours(25); + let zdt = ZonedDateTime::try_new( + 1_000_000_000_000_000_000, + TimeZone::try_from_str("+04:30").unwrap(), + Calendar::default(), + ) + .unwrap(); + let options = RoundingOptions { + largest_unit: Some(Unit::Day), + smallest_unit: None, + rounding_mode: None, + increment: None, + }; + let result = duration + .round(options, Some(RelativeTo::ZonedDateTime(zdt))) + .unwrap(); + // Result duration should be: (0, 0, 0, 1, 1, 0, 0, 0, 0, 0) + assert_eq!(result.days(), 1); + assert_eq!(result.hours(), 1); +} + +#[test] +fn test_duration_total() { + let d1 = Duration::from_partial_duration(PartialDuration { + hours: Some(130), + minutes: Some(20), + ..Default::default() + }) + .unwrap(); + assert_eq!(d1.total(Unit::Second, None).unwrap(), 469200.0); + + // How many 24-hour days is 123456789 seconds? + let d2 = Duration::from_str("PT123456789S").unwrap(); + assert_eq!(d2.total(Unit::Day, None).unwrap(), 1428.8980208333332); + + // Find totals in months, with and without taking DST into account + let d3 = Duration::from_partial_duration(PartialDuration { + hours: Some(2756), + ..Default::default() + }) + .unwrap(); + let relative_to = ZonedDateTime::from_utf8( + b"2020-01-01T00:00+01:00[Europe/Rome]", + Default::default(), + OffsetDisambiguation::Reject, + ) + .unwrap(); + assert_eq!( + d3.total(Unit::Month, Some(RelativeTo::ZonedDateTime(relative_to))) + .unwrap(), + 3.7958333333333334 + ); + assert_eq!( + d3.total( + Unit::Month, + Some(RelativeTo::PlainDate( + PlainDate::new(2020, 1, 1, Calendar::default()).unwrap() + )) + ) + .unwrap(), + 3.7944444444444443 + ); +} + +// balance-subseconds.js +#[test] +fn balance_subseconds() { + // Test positive + let pos = Duration::from_partial_duration(PartialDuration { + milliseconds: Some(999), + microseconds: Some(999999), + nanoseconds: Some(999999999), + ..Default::default() + }) + .unwrap(); + assert_eq!(pos.total(Unit::Second, None).unwrap(), 2.998998999); + + // Test negative + let neg = Duration::from_partial_duration(PartialDuration { + milliseconds: Some(-999), + microseconds: Some(-999999), + nanoseconds: Some(-999999999), + ..Default::default() + }) + .unwrap(); + assert_eq!(neg.total(Unit::Second, None).unwrap(), -2.998998999); +} + +// balances-days-up-to-both-years-and-months.js +#[test] +fn balance_days_up_to_both_years_and_months() { + // Test positive + let two_years = Duration::from_partial_duration(PartialDuration { + months: Some(11), + days: Some(396), + ..Default::default() + }) + .unwrap(); + + let relative_to = PlainDate::new(2017, 1, 1, Calendar::default()).unwrap(); + + assert_eq!( + two_years + .total(Unit::Year, Some(RelativeTo::PlainDate(relative_to.clone()))) + .unwrap(), + 2.0 + ); + + // Test negative + let two_years_negative = Duration::from_partial_duration(PartialDuration { + months: Some(-11), + days: Some(-396), + ..Default::default() + }) + .unwrap(); + + assert_eq!( + two_years_negative + .total(Unit::Year, Some(RelativeTo::PlainDate(relative_to.clone()))) + .unwrap(), + -2.0 + ); +} + +// relativeto-plaindate-add24hourdaystoTimeDuration-out-of-range.js +#[test] +fn add_normalized_time_duration_out_of_range() { + let duration = Duration::from_partial_duration(PartialDuration { + years: Some(1), + seconds: Some(9_007_199_254_740_990_i64), + ..Default::default() + }) + .unwrap(); + + let relative_to = PlainDate::new(2000, 1, 1, Calendar::default()).unwrap(); + + let err = duration.total(Unit::Day, Some(RelativeTo::PlainDate(relative_to))); + assert!(err.is_err()) +} + +#[test] +fn test_rounding_boundaries() { + let relative_to = PlainDate::new(2000, 1, 1, Calendar::default()).unwrap(); + + // test year + let duration = Duration::from_partial_duration(PartialDuration { + years: Some((u32::MAX - 1) as i64), + ..Default::default() + }) + .unwrap(); + + let options = RoundingOptions { + smallest_unit: Some(Unit::Week), + ..Default::default() + }; + let err = duration.round(options, Some(RelativeTo::PlainDate(relative_to.clone()))); + assert!(err.is_err()); + + // test month + let duration = Duration::from_partial_duration(PartialDuration { + months: Some((u32::MAX - 1) as i64), + ..Default::default() + }) + .unwrap(); + + let options = RoundingOptions { + smallest_unit: Some(Unit::Week), + ..Default::default() + }; + let err = duration.round(options, Some(RelativeTo::PlainDate(relative_to.clone()))); + assert!(err.is_err()); + + // test week + let duration = Duration::from_partial_duration(PartialDuration { + weeks: Some((u32::MAX - 1) as i64), + ..Default::default() + }) + .unwrap(); + + let options = RoundingOptions { + smallest_unit: Some(Unit::Week), + ..Default::default() + }; + let err = duration.round(options, Some(RelativeTo::PlainDate(relative_to.clone()))); + assert!(err.is_err()); + + // test calendar max + let duration = Duration::from_partial_duration(PartialDuration { + years: Some((u32::MAX - 1) as i64), + months: Some((u32::MAX - 1) as i64), + weeks: Some((u32::MAX - 1) as i64), + ..Default::default() + }) + .unwrap(); + + let options = RoundingOptions { + smallest_unit: Some(Unit::Week), + ..Default::default() + }; + let err = duration.round(options, Some(RelativeTo::PlainDate(relative_to.clone()))); + assert!(err.is_err()); + + // test days for safety + let duration = Duration::from_partial_duration(PartialDuration { + years: Some((u32::MAX - 1) as i64), + months: Some((u32::MAX - 1) as i64), + weeks: Some((u32::MAX - 1) as i64), + days: Some(104_249_991_374), + ..Default::default() + }) + .unwrap(); + + let options = RoundingOptions { + smallest_unit: Some(Unit::Week), + ..Default::default() + }; + let err = duration.round(options, Some(RelativeTo::PlainDate(relative_to.clone()))); + assert!(err.is_err()); + + // test minimum bounds with days for safety + let min_calendar_value = -((u32::MAX - 1) as i64); + let duration = Duration::from_partial_duration(PartialDuration { + years: Some(min_calendar_value), + months: Some(min_calendar_value), + weeks: Some(min_calendar_value), + days: Some(-104_249_991_374), + ..Default::default() + }) + .unwrap(); + + let options = RoundingOptions { + smallest_unit: Some(Unit::Week), + ..Default::default() + }; + let err = duration.round(options, Some(RelativeTo::PlainDate(relative_to))); + assert!(err.is_err()); +} + +#[test] +fn test_duration_compare_boundary() { + let relative_to = PlainDate::new(2000, 1, 1, Calendar::default()).unwrap(); + let zero = Duration::default(); + + let max_days = 2i64.pow(53) / 86_400; + let max_duration = Duration::new(0, 0, 1, max_days, 0, 0, 0, 0, 0, 0).unwrap(); + let err = zero.compare( + &max_duration, + Some(RelativeTo::PlainDate(relative_to.clone())), + ); + assert!(err.is_err()); + let err = max_duration.compare(&zero, Some(RelativeTo::PlainDate(relative_to.clone()))); + assert!(err.is_err()); + + let min_days = -(2i64.pow(53) / 86_400); + let min_duration = Duration::new(0, 0, -1, min_days, 0, 0, 0, 0, 0, 0).unwrap(); + let err = zero.compare( + &min_duration, + Some(RelativeTo::PlainDate(relative_to.clone())), + ); + assert!(err.is_err()); + let err = min_duration.compare(&zero, Some(RelativeTo::PlainDate(relative_to.clone()))); + assert!(err.is_err()); +} + +#[test] +fn rounding_cross_boundary() { + let relative_to = PlainDate::new(2022, 1, 1, Calendar::default()).unwrap(); + + let duration = Duration::from(DateDuration::new(1, 11, 0, 24).unwrap()); + let options = RoundingOptions { + smallest_unit: Some(Unit::Month), + rounding_mode: Some(RoundingMode::Expand), + ..Default::default() + }; + let result = duration + .round(options, Some(RelativeTo::PlainDate(relative_to))) + .unwrap(); + assert_duration(result, (2, 0, 0, 0, 0, 0, 0, 0, 0, 0)); +} + +#[test] +fn rounding_cross_boundary_negative() { + let relative_to = PlainDate::new(2022, 1, 1, Calendar::default()).unwrap(); + + let duration = Duration::from(DateDuration::new(-1, -11, 0, -24).unwrap()); + let options = RoundingOptions { + smallest_unit: Some(Unit::Month), + rounding_mode: Some(RoundingMode::Expand), + ..Default::default() + }; + let result = duration + .round(options, Some(RelativeTo::PlainDate(relative_to))) + .unwrap(); + assert_duration(result, (-2, 0, 0, 0, 0, 0, 0, 0, 0, 0)); +} + +#[test] +fn rounding_cross_boundary_time_units() { + let duration = Duration::new(0, 0, 0, 0, 1, 59, 59, 900, 0, 0).unwrap(); + let options = RoundingOptions { + smallest_unit: Some(Unit::Second), + rounding_mode: Some(RoundingMode::Expand), + ..Default::default() + }; + let result = duration.round(options, None).unwrap(); + assert_duration(result, (0, 0, 0, 0, 2, 0, 0, 0, 0, 0)); + + let neg_duration = Duration::new(0, 0, 0, 0, -1, -59, -59, -900, 0, 0).unwrap(); + let result = neg_duration.round(options, None).unwrap(); + assert_duration(result, (0, 0, 0, 0, -2, 0, 0, 0, 0, 0)); +} + +#[test] +fn nudge_past_end() { + // built-ins/Temporal/Duration/prototype/round/next-day-out-of-range + let duration = Duration::default(); + let relative_to = ZonedDateTime::try_new( + 86_40000_00000_00000_00000, + TimeZone::try_from_str("UTC").unwrap(), + Default::default(), + ) + .unwrap(); + let options = RoundingOptions { + largest_unit: Some(Unit::Day), + smallest_unit: Some(Unit::Minute), + increment: None, + rounding_mode: None, + }; + // This constructs an endDate of MAX_DATE + 1 day (even though the sign is zero). + // This must error. + let rounded = duration.round(options, Some(relative_to.into())); + assert!( + rounded.is_err(), + "Expected rounding to fail, got {rounded:?}" + ); +} + +#[test] +fn bubble_smallest_becomes_day() { + // built-ins/Temporal/Duration/prototype/round/bubble-time-unit + let duration = Duration::new(0, 0, 0, 0, /* hours = */ 14, 0, 0, 0, 0, 0).unwrap(); + let relative_to = PlainDate::try_new(2025, 6, 14, Default::default()).unwrap(); + let options = RoundingOptions { + largest_unit: None, + smallest_unit: Some(Unit::Hour), + increment: Some(RoundingIncrement::try_new(12).unwrap()), + rounding_mode: Some(RoundingMode::Ceil), + }; + // This constructs an endDate of MAX_DATE + 1 day (even though the sign is zero). + // This must error. + let rounded = duration.round(options, Some(relative_to.into())).unwrap(); + assert_eq!( + rounded.hours(), + 24, + "Expected rounding to fail, got {rounded:?}" + ); +} diff --git a/deps/temporal/src/builtins/compiled/instant.rs b/deps/temporal/src/builtins/compiled/instant.rs new file mode 100644 index 00000000000000..fe44de70ea49d6 --- /dev/null +++ b/deps/temporal/src/builtins/compiled/instant.rs @@ -0,0 +1,35 @@ +use crate::{ + builtins::TZ_PROVIDER, options::ToStringRoundingOptions, Instant, TemporalResult, TimeZone, + ZonedDateTime, +}; +use alloc::string::String; + +impl Instant { + /// Returns the RFC9557 (IXDTF) string for this `Instant` with the + /// provided options + /// + /// Enable with the `compiled_data` feature flag. + pub fn to_ixdtf_string( + &self, + timezone: Option, + options: ToStringRoundingOptions, + ) -> TemporalResult { + self.to_ixdtf_string_with_provider(timezone, options, &*TZ_PROVIDER) + } + + /// Returns the RFC9557 (IXDTF) string for this `Instant` with the + /// provided options as a Writeable + /// + /// Enable with the `compiled_data` feature flag. + pub fn to_ixdtf_writeable( + &self, + timezone: Option, + options: ToStringRoundingOptions, + ) -> TemporalResult { + self.to_ixdtf_writeable_with_provider(timezone, options, &*TZ_PROVIDER) + } + + pub fn to_zoned_date_time_iso(&self, time_zone: TimeZone) -> TemporalResult { + self.to_zoned_date_time_iso_with_provider(time_zone, &*TZ_PROVIDER) + } +} diff --git a/deps/temporal/src/builtins/compiled/mod.rs b/deps/temporal/src/builtins/compiled/mod.rs new file mode 100644 index 00000000000000..03a843f1a6765c --- /dev/null +++ b/deps/temporal/src/builtins/compiled/mod.rs @@ -0,0 +1,20 @@ +//! This module implements native Rust wrappers for the Temporal builtins. + +mod duration; +mod instant; +mod now; +mod plain_date; +mod plain_date_time; +mod plain_month_day; +mod plain_year_month; +mod zoned_date_time; + +mod options { + use crate::{builtins::TZ_PROVIDER, options::RelativeTo, TemporalResult}; + + impl RelativeTo { + pub fn try_from_str(source: &str) -> TemporalResult { + Self::try_from_str_with_provider(source, &*TZ_PROVIDER) + } + } +} diff --git a/deps/temporal/src/builtins/compiled/now.rs b/deps/temporal/src/builtins/compiled/now.rs new file mode 100644 index 00000000000000..d3303dd9a6d864 --- /dev/null +++ b/deps/temporal/src/builtins/compiled/now.rs @@ -0,0 +1,43 @@ +use crate::{ + builtins::{ + core::{Now, PlainDate, PlainDateTime, PlainTime}, + TZ_PROVIDER, + }, + host::HostHooks, + TemporalResult, TimeZone, ZonedDateTime, +}; + +impl Now { + pub fn time_zone(self) -> TemporalResult { + self.time_zone_with_provider(&*TZ_PROVIDER) + } + + /// Returns the current system time as a [`PlainDateTime`] with an optional + /// [`TimeZone`]. + /// + /// Enable with the `compiled_data` and `sys` feature flags. + pub fn plain_date_time_iso(self, time_zone: Option) -> TemporalResult { + self.plain_date_time_iso_with_provider(time_zone, &*TZ_PROVIDER) + } + + /// Returns the current system time as a [`PlainDate`] with an optional + /// [`TimeZone`]. + /// + /// Enable with the `compiled_data` and `sys` feature flags. + pub fn plain_date_iso(self, time_zone: Option) -> TemporalResult { + self.plain_date_iso_with_provider(time_zone, &*TZ_PROVIDER) + } + + /// Returns the current system time as a [`PlainTime`] with an optional + /// [`TimeZone`]. + /// + /// Enable with the `compiled_data` and `sys` feature flags. + pub fn plain_time_iso(self, time_zone: Option) -> TemporalResult { + self.plain_time_with_provider(time_zone, &*TZ_PROVIDER) + } + + /// Converts the current [`Now`] into an [`ZonedDateTime`] with an ISO8601 calendar. + pub fn zoned_date_time_iso(self, time_zone: Option) -> TemporalResult { + self.zoned_date_time_iso_with_provider(time_zone, &*TZ_PROVIDER) + } +} diff --git a/deps/temporal/src/builtins/compiled/plain_date.rs b/deps/temporal/src/builtins/compiled/plain_date.rs new file mode 100644 index 00000000000000..da9b8b06a4ce5c --- /dev/null +++ b/deps/temporal/src/builtins/compiled/plain_date.rs @@ -0,0 +1,12 @@ +use crate::{builtins::TZ_PROVIDER, PlainDate, PlainTime, TemporalResult, TimeZone}; + +impl PlainDate { + /// Converts a `Date` to a `ZonedDateTime` in the UTC time zone. + pub fn to_zoned_date_time( + &self, + time_zone: TimeZone, + plain_time: Option, + ) -> TemporalResult { + self.to_zoned_date_time_with_provider(time_zone, plain_time, &*TZ_PROVIDER) + } +} diff --git a/deps/temporal/src/builtins/compiled/plain_date_time.rs b/deps/temporal/src/builtins/compiled/plain_date_time.rs new file mode 100644 index 00000000000000..c9d2675ef3a9ea --- /dev/null +++ b/deps/temporal/src/builtins/compiled/plain_date_time.rs @@ -0,0 +1,47 @@ +use crate::{ + builtins::core::{PlainDateTime, ZonedDateTime}, + builtins::TZ_PROVIDER, + options::Disambiguation, + TemporalResult, TimeZone, +}; + +impl PlainDateTime { + /// Returns a `ZonedDateTime` with the provided `PlainDateTime`, TimeZone` and + /// `Disambiguation`. + /// + /// # Feature gated + /// + /// Enable with the `compiled_data` feature flag. + pub fn to_zoned_date_time( + &self, + time_zone: TimeZone, + disambiguation: Disambiguation, + ) -> TemporalResult { + self.to_zoned_date_time_with_provider(time_zone, disambiguation, &*TZ_PROVIDER) + } +} + +#[cfg(test)] +mod tests { + #[cfg(feature = "tzdb")] + #[test] + fn to_zoned_date_time_edge_cases() { + use crate::{options::Disambiguation, tzdb::CompiledTzdbProvider, PlainDateTime, TimeZone}; + let provider = &CompiledTzdbProvider::default(); + + // Test that a non existent PlainDateTime is successfully disambiguated. + // + // NOTE(nekevss): POSIX time zone logic of the underlying provider if TZDB is in a "slim" format. + let pdt = PlainDateTime::try_new_iso(2020, 3, 8, 2, 30, 0, 0, 0, 0).unwrap(); + let zdt = pdt + .to_zoned_date_time_with_provider( + TimeZone::try_from_identifier_str_with_provider("America/Los_Angeles", provider) + .unwrap(), + Disambiguation::Compatible, + provider, + ) + .unwrap(); + // Should disambiguate to 2020-03-08T01:30:00-08:00[America/Los_Angeles] + assert_eq!(zdt.hour(), 3); + } +} diff --git a/deps/temporal/src/builtins/compiled/plain_month_day.rs b/deps/temporal/src/builtins/compiled/plain_month_day.rs new file mode 100644 index 00000000000000..077a2a0c6a06a5 --- /dev/null +++ b/deps/temporal/src/builtins/compiled/plain_month_day.rs @@ -0,0 +1,9 @@ +use crate::{ + builtins::TZ_PROVIDER, unix_time::EpochNanoseconds, PlainMonthDay, TemporalResult, TimeZone, +}; + +impl PlainMonthDay { + pub fn epoch_ns_for(&self, time_zone: TimeZone) -> TemporalResult { + self.epoch_ns_for_with_provider(time_zone, &*TZ_PROVIDER) + } +} diff --git a/deps/temporal/src/builtins/compiled/plain_year_month.rs b/deps/temporal/src/builtins/compiled/plain_year_month.rs new file mode 100644 index 00000000000000..ab3cebe37927dc --- /dev/null +++ b/deps/temporal/src/builtins/compiled/plain_year_month.rs @@ -0,0 +1,9 @@ +use crate::{ + builtins::TZ_PROVIDER, unix_time::EpochNanoseconds, PlainYearMonth, TemporalResult, TimeZone, +}; + +impl PlainYearMonth { + pub fn epoch_ns_for(&self, time_zone: TimeZone) -> TemporalResult { + self.epoch_ns_for_with_provider(time_zone, &*TZ_PROVIDER) + } +} diff --git a/deps/temporal/src/builtins/compiled/zoned_date_time.rs b/deps/temporal/src/builtins/compiled/zoned_date_time.rs new file mode 100644 index 00000000000000..4a8e4dd19f4a97 --- /dev/null +++ b/deps/temporal/src/builtins/compiled/zoned_date_time.rs @@ -0,0 +1,232 @@ +use crate::builtins::zoned_date_time::ZonedDateTimeFields; +use crate::builtins::TZ_PROVIDER; +use crate::partial::PartialZonedDateTime; +use crate::provider::TransitionDirection; +use crate::{ + options::{ + DifferenceSettings, Disambiguation, DisplayCalendar, DisplayOffset, DisplayTimeZone, + OffsetDisambiguation, Overflow, RoundingOptions, ToStringRoundingOptions, + }, + Calendar, Duration, PlainTime, TemporalResult, TimeZone, +}; +use crate::{Instant, ZonedDateTime}; +use alloc::string::String; + +impl core::fmt::Display for ZonedDateTime { + /// The [`core::fmt::Display`] implementation for `ZonedDateTime`. + /// + /// Enable with the `compiled_data` feature flag. + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let string = self.to_ixdtf_string( + DisplayOffset::Auto, + DisplayTimeZone::Auto, + DisplayCalendar::Auto, + ToStringRoundingOptions::default(), + ); + debug_assert!( + string.is_ok(), + "A valid ZonedDateTime string with default options." + ); + f.write_str(&string.map_err(|_| Default::default())?) + } +} + +// ==== Experimental TZ_PROVIDER calendar method implementations ==== + +/// Calendar method implementations for `ZonedDateTime`. +/// +/// The following [`ZonedDateTime`] methods are feature gated behind the +/// `compiled_data` feature flag. +impl ZonedDateTime { + // TODO: Update direction to correct option + pub fn get_time_zone_transition( + &self, + direction: TransitionDirection, + ) -> TemporalResult> { + self.get_time_zone_transition_with_provider(direction, &*TZ_PROVIDER) + } + + /// Returns the hours in the day. + /// + /// Enable with the `compiled_data` feature flag. + pub fn hours_in_day(&self) -> TemporalResult { + self.hours_in_day_with_provider(&*TZ_PROVIDER) + } +} + +// ==== Experimental TZ_PROVIDER method implementations ==== + +/// The primary `ZonedDateTime` method implementations. +/// +/// The following [`ZonedDateTime`] methods are feature gated behind the +/// `compiled_data` feature flag. +impl ZonedDateTime { + /// Creates a new valid `ZonedDateTime`. + #[inline] + pub fn try_new(nanos: i128, time_zone: TimeZone, calendar: Calendar) -> TemporalResult { + Self::try_new_with_provider(nanos, time_zone, calendar, &*TZ_PROVIDER) + } + + /// Creates a new valid `ZonedDateTime` with an ISO 8601 calendar. + #[inline] + pub fn try_new_iso(nanos: i128, time_zone: TimeZone) -> TemporalResult { + Self::try_new_iso_with_provider(nanos, time_zone, &*TZ_PROVIDER) + } + + /// Creates a new valid `ZonedDateTime` from an [`Instant`]. + #[inline] + pub fn try_new_from_instant( + instant: Instant, + time_zone: TimeZone, + calendar: Calendar, + ) -> TemporalResult { + Self::try_new_from_instant_with_provider(instant, time_zone, calendar, &*TZ_PROVIDER) + } + + /// Creates a new valid `ZonedDateTime` from an [`Instant`] with an ISO 8601 calendar. + #[inline] + pub fn try_new_iso_from_instant(instant: Instant, time_zone: TimeZone) -> TemporalResult { + Self::try_new_iso_from_instant_with_provider(instant, time_zone, &*TZ_PROVIDER) + } + + #[inline] + pub fn from_partial( + partial: PartialZonedDateTime, + overflow: Option, + disambiguation: Option, + offset_option: Option, + ) -> TemporalResult { + Self::from_partial_with_provider( + partial, + overflow, + disambiguation, + offset_option, + &*crate::builtins::TZ_PROVIDER, + ) + } + + #[inline] + pub fn with( + &self, + fields: ZonedDateTimeFields, + disambiguation: Option, + offset_option: Option, + overflow: Option, + ) -> TemporalResult { + self.with_with_provider( + fields, + disambiguation, + offset_option, + overflow, + &*TZ_PROVIDER, + ) + } + + /// Creates a new `ZonedDateTime` from the current `ZonedDateTime` with the provided `PlainTime`. + /// + /// combined with the provided `TimeZone`. + pub fn with_plain_time(&self, time: Option) -> TemporalResult { + self.with_plain_time_and_provider(time, &*TZ_PROVIDER) + } + + /// Creates a new `ZonedDateTime` from the current `ZonedDateTime` + /// combined with the provided `TimeZone`. + pub fn with_timezone(&self, timezone: TimeZone) -> TemporalResult { + self.with_time_zone_with_provider(timezone, &*TZ_PROVIDER) + } + + /// Adds a [`Duration`] to the current `ZonedDateTime`. + /// + /// Enable with the `compiled_data` feature flag. + pub fn add(&self, duration: &Duration, overflow: Option) -> TemporalResult { + self.add_with_provider(duration, overflow, &*TZ_PROVIDER) + } + + /// Subtracts a [`Duration`] to the current `ZonedDateTime`. + /// + /// Enable with the `compiled_data` feature flag. + pub fn subtract( + &self, + duration: &Duration, + overflow: Option, + ) -> TemporalResult { + self.subtract_with_provider(duration, overflow, &*TZ_PROVIDER) + } + + pub fn equals(&self, other: &Self) -> TemporalResult { + self.equals_with_provider(other, &*TZ_PROVIDER) + } + + /// Returns a [`Duration`] representing the period of time from this `ZonedDateTime` since the other `ZonedDateTime`. + /// + /// Enable with the `compiled_data` feature flag. + pub fn since(&self, other: &Self, options: DifferenceSettings) -> TemporalResult { + self.since_with_provider(other, options, &*TZ_PROVIDER) + } + + /// Returns a [`Duration`] representing the period of time from this `ZonedDateTime` since the other `ZonedDateTime`. + /// + /// Enable with the `compiled_data` feature flag. + pub fn until(&self, other: &Self, options: DifferenceSettings) -> TemporalResult { + self.until_with_provider(other, options, &*TZ_PROVIDER) + } + + /// Returns the start of day for the current `ZonedDateTime`. + /// + /// Enable with the `compiled_data` feature flag. + pub fn start_of_day(&self) -> TemporalResult { + self.start_of_day_with_provider(&*TZ_PROVIDER) + } + + /// Rounds this [`ZonedDateTime`] to the nearest value according to the given rounding options. + /// + /// Enable with the `compiled_data` feature flag. + pub fn round(&self, options: RoundingOptions) -> TemporalResult { + self.round_with_provider(options, &*TZ_PROVIDER) + } + + /// Returns a RFC9557 (IXDTF) string with the provided options. + /// + /// Enable with the `compiled_data` feature flag. + pub fn to_ixdtf_string( + &self, + display_offset: DisplayOffset, + display_timezone: DisplayTimeZone, + display_calendar: DisplayCalendar, + options: ToStringRoundingOptions, + ) -> TemporalResult { + self.to_ixdtf_string_with_provider( + display_offset, + display_timezone, + display_calendar, + options, + &*TZ_PROVIDER, + ) + } + + /// Attempts to parse and create a `ZonedDateTime` from an IXDTF formatted [`&str`]. + /// + /// Enable with the `compiled_data` feature flag. + pub fn from_utf8( + source: &[u8], + disambiguation: Disambiguation, + offset_option: OffsetDisambiguation, + ) -> TemporalResult { + ZonedDateTime::from_utf8_with_provider(source, disambiguation, offset_option, &*TZ_PROVIDER) + } + /// Attempts to parse and create a `ZonedDateTime` from an IXDTF formatted [`&str`]. + /// + /// Enable with the `compiled_data` feature flag. + pub fn from_parsed( + parsed: crate::parsed_intermediates::ParsedZonedDateTime, + disambiguation: Disambiguation, + offset_option: OffsetDisambiguation, + ) -> TemporalResult { + ZonedDateTime::from_parsed_with_provider( + parsed, + disambiguation, + offset_option, + &*TZ_PROVIDER, + ) + } +} diff --git a/deps/temporal/src/builtins/core/calendar.rs b/deps/temporal/src/builtins/core/calendar.rs new file mode 100644 index 00000000000000..e05c3f39c6867b --- /dev/null +++ b/deps/temporal/src/builtins/core/calendar.rs @@ -0,0 +1,992 @@ +//! This module implements the calendar traits and related components. +//! +//! The goal of the calendar module of `boa_temporal` is to provide +//! Temporal compatible calendar implementations. + +use crate::{ + builtins::core::{ + duration::DateDuration, Duration, PlainDate, PlainDateTime, PlainMonthDay, PlainYearMonth, + }, + iso::IsoDate, + options::{Overflow, Unit}, + parsers::parse_allowed_calendar_formats, + TemporalError, TemporalResult, +}; +use core::str::FromStr; + +use icu_calendar::{ + cal::{ + Buddhist, Chinese, Coptic, Dangi, Ethiopian, EthiopianEraStyle, Hebrew, HijriSimulated, + HijriTabular, HijriUmmAlQura, Indian, Japanese, JapaneseExtended, Persian, Roc, + }, + AnyCalendar, AnyCalendarKind, Calendar as IcuCalendar, Iso, Ref, +}; +use icu_calendar::{ + cal::{HijriTabularEpoch, HijriTabularLeapYears}, + preferences::CalendarAlgorithm, + types::MonthCode as IcuMonthCode, + Gregorian, +}; +use icu_locale::extensions::unicode::Value; +use tinystr::{tinystr, TinyAsciiStr}; + +use super::ZonedDateTime; + +mod era; +mod fields; +mod types; + +pub use fields::{CalendarFields, YearMonthCalendarFields}; +#[cfg(test)] +pub(crate) use types::month_to_month_code; +pub(crate) use types::ResolutionType; +pub use types::{MonthCode, ResolvedCalendarFields}; + +use era::EraInfo; + +/// The core `Calendar` type for `temporal_rs` +/// +/// A `Calendar` in `temporal_rs` can be any calendar that is currently +/// supported by [`icu_calendar`]. +#[derive(Debug, Clone)] +pub struct Calendar(Ref<'static, AnyCalendar>); + +impl Default for Calendar { + fn default() -> Self { + Self::ISO + } +} + +impl PartialEq for Calendar { + fn eq(&self, other: &Self) -> bool { + self.identifier() == other.identifier() + } +} + +impl Eq for Calendar {} + +impl Calendar { + /// The Buddhist calendar + pub const BUDDHIST: Self = Self::new(AnyCalendarKind::Buddhist); + /// The Chinese calendar + pub const CHINESE: Self = Self::new(AnyCalendarKind::Chinese); + /// The Coptic calendar + pub const COPTIC: Self = Self::new(AnyCalendarKind::Coptic); + /// The Dangi calendar + pub const DANGI: Self = Self::new(AnyCalendarKind::Dangi); + /// The Ethiopian calendar + pub const ETHIOPIAN: Self = Self::new(AnyCalendarKind::Ethiopian); + /// The Ethiopian Amete Alem calendar + pub const ETHIOPIAN_AMETE_ALEM: Self = Self::new(AnyCalendarKind::EthiopianAmeteAlem); + /// The Gregorian calendar + pub const GREGORIAN: Self = Self::new(AnyCalendarKind::Gregorian); + /// The Hebrew calendar + pub const HEBREW: Self = Self::new(AnyCalendarKind::Hebrew); + /// The Indian calendar + pub const INDIAN: Self = Self::new(AnyCalendarKind::Indian); + /// The Hijri Tabular calendar with a Friday epoch + pub const HIJRI_TABULAR_FRIDAY: Self = Self::new(AnyCalendarKind::HijriTabularTypeIIFriday); + /// The Hijri Tabular calendar with a Thursday epoch + pub const HIJRI_TABULAR_THURSDAY: Self = Self::new(AnyCalendarKind::HijriTabularTypeIIThursday); + /// The Hijri Umm al-Qura calendar + pub const HIJRI_UMM_AL_QURA: Self = Self::new(AnyCalendarKind::HijriUmmAlQura); + /// The Hijri simulated calendar + pub const HIJRI_SIMULATED: Self = Self::new(AnyCalendarKind::HijriSimulatedMecca); + /// The ISO 8601 calendar + pub const ISO: Self = Self::new(AnyCalendarKind::Iso); + /// The Japanese calendar + pub const JAPANESE: Self = Self::new(AnyCalendarKind::Japanese); + /// The Persian calendar + pub const PERSIAN: Self = Self::new(AnyCalendarKind::Persian); + /// The ROC calendar + pub const ROC: Self = Self::new(AnyCalendarKind::Roc); + + /// Create a `Calendar` from an ICU [`AnyCalendarKind`]. + #[warn(clippy::wildcard_enum_match_arm)] // Warns if the calendar kind gets out of sync. + pub const fn new(kind: AnyCalendarKind) -> Self { + let cal = match kind { + AnyCalendarKind::Buddhist => &AnyCalendar::Buddhist(Buddhist), + AnyCalendarKind::Chinese => const { &AnyCalendar::Chinese(Chinese::new()) }, + AnyCalendarKind::Coptic => &AnyCalendar::Coptic(Coptic), + AnyCalendarKind::Dangi => const { &AnyCalendar::Dangi(Dangi::new()) }, + AnyCalendarKind::Ethiopian => { + const { + &AnyCalendar::Ethiopian(Ethiopian::new_with_era_style( + EthiopianEraStyle::AmeteMihret, + )) + } + } + AnyCalendarKind::EthiopianAmeteAlem => { + const { + &AnyCalendar::Ethiopian(Ethiopian::new_with_era_style( + EthiopianEraStyle::AmeteAlem, + )) + } + } + AnyCalendarKind::Gregorian => &AnyCalendar::Gregorian(Gregorian), + AnyCalendarKind::Hebrew => &AnyCalendar::Hebrew(Hebrew), + AnyCalendarKind::Indian => &AnyCalendar::Indian(Indian), + AnyCalendarKind::HijriTabularTypeIIFriday => { + const { + &AnyCalendar::HijriTabular(HijriTabular::new( + HijriTabularLeapYears::TypeII, + HijriTabularEpoch::Friday, + )) + } + } + AnyCalendarKind::HijriSimulatedMecca => { + const { &AnyCalendar::HijriSimulated(HijriSimulated::new_mecca()) } + } + AnyCalendarKind::HijriTabularTypeIIThursday => { + const { + &AnyCalendar::HijriTabular(HijriTabular::new( + HijriTabularLeapYears::TypeII, + HijriTabularEpoch::Thursday, + )) + } + } + AnyCalendarKind::HijriUmmAlQura => { + const { &AnyCalendar::HijriUmmAlQura(HijriUmmAlQura::new()) } + } + AnyCalendarKind::Iso => &AnyCalendar::Iso(Iso), + AnyCalendarKind::Japanese => const { &AnyCalendar::Japanese(Japanese::new()) }, + AnyCalendarKind::JapaneseExtended => { + const { &AnyCalendar::JapaneseExtended(JapaneseExtended::new()) } + } + AnyCalendarKind::Persian => &AnyCalendar::Persian(Persian), + AnyCalendarKind::Roc => &AnyCalendar::Roc(Roc), + _ => { + debug_assert!( + false, + "Unreachable: match must handle all variants of `AnyCalendarKind`" + ); + &AnyCalendar::Iso(Iso) + } + }; + + Self(Ref(cal)) + } + + /// Returns a `Calendar` from the a slice of UTF-8 encoded bytes. + pub fn try_from_utf8(bytes: &[u8]) -> TemporalResult { + let kind = Self::try_kind_from_utf8(bytes)?; + Ok(Self::new(kind)) + } + + /// Returns a `Calendar` from the a slice of UTF-8 encoded bytes. + pub(crate) fn try_kind_from_utf8(bytes: &[u8]) -> TemporalResult { + // TODO: Determine the best way to handle "julian" here. + // Not supported by `CalendarAlgorithm` + let icu_locale_value = Value::try_from_utf8(&bytes.to_ascii_lowercase()) + .map_err(|_| TemporalError::range().with_message("unknown calendar"))?; + let algorithm = CalendarAlgorithm::try_from(&icu_locale_value) + .map_err(|_| TemporalError::range().with_message("unknown calendar"))?; + let calendar_kind = match AnyCalendarKind::try_from(algorithm) { + Ok(c) => c, + // Handle `islamic` calendar idenitifier. + // + // This should be updated depending on `icu_calendar` support and + // intl-era-monthcode. + Err(()) if algorithm == CalendarAlgorithm::Hijri(None) => { + AnyCalendarKind::HijriTabularTypeIIFriday + } + Err(()) => return Err(TemporalError::range().with_message("unknown calendar")), + }; + Ok(calendar_kind) + } +} + +impl FromStr for Calendar { + type Err = TemporalError; + + // 13.34 ParseTemporalCalendarString ( string ) + fn from_str(s: &str) -> Result { + match parse_allowed_calendar_formats(s.as_bytes()) { + Some([]) => Ok(Calendar::ISO), + Some(result) => Calendar::try_from_utf8(result), + None => Calendar::try_from_utf8(s.as_bytes()), + } + } +} + +// ==== Public `CalendarSlot` methods ==== + +impl Calendar { + /// Returns whether the current calendar is `ISO` + #[inline] + pub fn is_iso(&self) -> bool { + matches!(self.0 .0, AnyCalendar::Iso(_)) + } + + /// Returns the kind of this calendar + #[inline] + pub fn kind(&self) -> AnyCalendarKind { + self.0 .0.kind() + } + + /// `CalendarDateFromFields` + pub fn date_from_fields( + &self, + fields: CalendarFields, + overflow: Overflow, + ) -> TemporalResult { + let resolved_fields = + ResolvedCalendarFields::try_from_fields(self, &fields, overflow, ResolutionType::Date)?; + + if self.is_iso() { + // Resolve month and monthCode; + return PlainDate::new_with_overflow( + resolved_fields.era_year.arithmetic_year, + resolved_fields.month_code.to_month_integer(), + resolved_fields.day, + self.clone(), + overflow, + ); + } + + let calendar_date = self.0.from_codes( + resolved_fields.era_year.era.as_ref().map(|e| e.0.as_str()), + resolved_fields.era_year.year, + IcuMonthCode(resolved_fields.month_code.0), + resolved_fields.day, + )?; + let iso = self.0.to_iso(&calendar_date); + PlainDate::new_with_overflow( + Iso.extended_year(&iso), + Iso.month(&iso).ordinal, + Iso.day_of_month(&iso).0, + self.clone(), + overflow, + ) + } + + /// `CalendarPlainMonthDayFromFields` + pub fn month_day_from_fields( + &self, + mut fields: CalendarFields, + overflow: Overflow, + ) -> TemporalResult { + // You are allowed to specify year information, however + // it is *only* used for resolving the given month/day data. + // + // For example, constructing a PlainMonthDay for {year: 2025, month: 2, day: 29} + // with overflow: constrain will produce 02-28 since it will constrain + // the date to 2025-02-28 first, and only *then* will it construct an MD. + // + // This is specced partially in https://tc39.es/proposal-temporal/#sec-temporal-calendarmonthdaytoisoreferencedate + // notice that RegulateISODate is called with the passed-in year, but the reference year is used regardless + // of the passed in year in the final result. + // + // There may be more efficient ways to do this, but this works pretty well and doesn't require + // calendrical knowledge. + if fields.year.is_some() || (fields.era.is_some() && fields.era_year.is_some()) { + let date = self.date_from_fields(fields, overflow)?; + fields = CalendarFields::from_date(&date); + } + let resolved_fields = ResolvedCalendarFields::try_from_fields( + self, + &fields, + overflow, + ResolutionType::MonthDay, + )?; + if self.is_iso() { + return PlainMonthDay::new_with_overflow( + resolved_fields.month_code.to_month_integer(), + resolved_fields.day, + self.clone(), + overflow, + None, + ); + } + + // We trust ResolvedCalendarFields to have calculated an appropriate reference year for us + let calendar_date = self.0.from_codes( + resolved_fields.era_year.era.as_ref().map(|e| e.0.as_str()), + resolved_fields.era_year.year, + IcuMonthCode(resolved_fields.month_code.0), + resolved_fields.day, + )?; + let iso = self.0.to_iso(&calendar_date); + PlainMonthDay::new_with_overflow( + Iso.month(&iso).ordinal, + Iso.day_of_month(&iso).0, + self.clone(), + overflow, + Some(Iso.extended_year(&iso)), + ) + } + + /// `CalendarPlainYearMonthFromFields` + pub fn year_month_from_fields( + &self, + fields: YearMonthCalendarFields, + overflow: Overflow, + ) -> TemporalResult { + // TODO: add a from_partial_year_month method on ResolvedCalendarFields + let resolved_fields = ResolvedCalendarFields::try_from_fields( + self, + &CalendarFields::from(fields), + overflow, + ResolutionType::YearMonth, + )?; + if self.is_iso() { + return PlainYearMonth::new_with_overflow( + resolved_fields.era_year.arithmetic_year, + resolved_fields.month_code.to_month_integer(), + Some(resolved_fields.day), + self.clone(), + overflow, + ); + } + + // NOTE: This might preemptively throw as `ICU4X` does not support regulating. + let calendar_date = self.0.from_codes( + resolved_fields.era_year.era.as_ref().map(|e| e.0.as_str()), + resolved_fields.era_year.year, + IcuMonthCode(resolved_fields.month_code.0), + resolved_fields.day, + )?; + let iso = self.0.to_iso(&calendar_date); + PlainYearMonth::new_with_overflow( + Iso.year_info(&iso).year, + Iso.month(&iso).ordinal, + Some(Iso.day_of_month(&iso).0), + self.clone(), + overflow, + ) + } + + /// `CalendarDateAdd` + pub fn date_add( + &self, + date: &IsoDate, + duration: &DateDuration, + overflow: Overflow, + ) -> TemporalResult { + // 1. If calendar is "iso8601", then + if self.is_iso() { + let result = date.add_date_duration(duration, overflow)?; + // 11. Return ? CreateTemporalDate(result.[[Year]], result.[[Month]], result.[[Day]], "iso8601"). + return PlainDate::try_new(result.year, result.month, result.day, self.clone()); + } + + Err(TemporalError::range().with_message("Not yet implemented.")) + } + + /// `CalendarDateUntil` + pub fn date_until( + &self, + one: &IsoDate, + two: &IsoDate, + largest_unit: Unit, + ) -> TemporalResult { + if self.is_iso() { + let date_duration = one.diff_iso_date(two, largest_unit)?; + return Ok(Duration::from(date_duration)); + } + Err(TemporalError::range().with_message("Not yet implemented.")) + } + + /// `CalendarEra` + pub fn era(&self, iso_date: &IsoDate) -> Option> { + if self.is_iso() { + return None; + } + let calendar_date = self.0.from_iso(*iso_date.to_icu4x().inner()); + self.0 + .year_info(&calendar_date) + .era() + .map(|era_info| era_info.era) + } + + /// `CalendarEraYear` + pub fn era_year(&self, iso_date: &IsoDate) -> Option { + if self.is_iso() { + return None; + } + let calendar_date = self.0.from_iso(*iso_date.to_icu4x().inner()); + self.0 + .year_info(&calendar_date) + .era() + .map(|era_info| era_info.year) + } + + /// `CalendarArithmeticYear` + pub fn year(&self, iso_date: &IsoDate) -> i32 { + if self.is_iso() { + return iso_date.year; + } + let calendar_date = self.0.from_iso(*iso_date.to_icu4x().inner()); + self.0.extended_year(&calendar_date) + } + + /// `CalendarMonth` + pub fn month(&self, iso_date: &IsoDate) -> u8 { + if self.is_iso() { + return iso_date.month; + } + let calendar_date = self.0.from_iso(*iso_date.to_icu4x().inner()); + self.0.month(&calendar_date).ordinal + } + + /// `CalendarMonthCode` + pub fn month_code(&self, iso_date: &IsoDate) -> MonthCode { + if self.is_iso() { + let mc = iso_date.to_icu4x().month().standard_code.0; + return MonthCode(mc); + } + let calendar_date = self.0.from_iso(*iso_date.to_icu4x().inner()); + MonthCode(self.0.month(&calendar_date).standard_code.0) + } + + /// `CalendarDay` + pub fn day(&self, iso_date: &IsoDate) -> u8 { + if self.is_iso() { + return iso_date.day; + } + let calendar_date = self.0.from_iso(*iso_date.to_icu4x().inner()); + self.0.day_of_month(&calendar_date).0 + } + + /// `CalendarDayOfWeek` + pub fn day_of_week(&self, iso_date: &IsoDate) -> u16 { + iso_date.to_icu4x().day_of_week() as u16 + } + + /// `CalendarDayOfYear` + pub fn day_of_year(&self, iso_date: &IsoDate) -> u16 { + if self.is_iso() { + return iso_date.to_icu4x().day_of_year().0; + } + let calendar_date = self.0.from_iso(*iso_date.to_icu4x().inner()); + self.0.day_of_year(&calendar_date).0 + } + + /// `CalendarWeekOfYear` + pub fn week_of_year(&self, iso_date: &IsoDate) -> Option { + if self.is_iso() { + return Some(iso_date.to_icu4x().week_of_year().week_number); + } + // TODO: Research in ICU4X and determine best approach. + None + } + + /// `CalendarYearOfWeek` + pub fn year_of_week(&self, iso_date: &IsoDate) -> Option { + if self.is_iso() { + return Some(iso_date.to_icu4x().week_of_year().iso_year); + } + // TODO: Research in ICU4X and determine best approach. + None + } + + /// `CalendarDaysInWeek` + pub fn days_in_week(&self, _iso_date: &IsoDate) -> u16 { + 7 + } + + /// `CalendarDaysInMonth` + pub fn days_in_month(&self, iso_date: &IsoDate) -> u16 { + if self.is_iso() { + return iso_date.to_icu4x().days_in_month() as u16; + } + let calendar_date = self.0.from_iso(*iso_date.to_icu4x().inner()); + self.0.days_in_month(&calendar_date) as u16 + } + + /// `CalendarDaysInYear` + pub fn days_in_year(&self, iso_date: &IsoDate) -> u16 { + if self.is_iso() { + return iso_date.to_icu4x().days_in_year(); + } + let calendar_date = self.0.from_iso(*iso_date.to_icu4x().inner()); + self.0.days_in_year(&calendar_date) + } + + /// `CalendarMonthsInYear` + pub fn months_in_year(&self, iso_date: &IsoDate) -> u16 { + if self.is_iso() { + return 12; + } + let calendar_date = self.0.from_iso(*iso_date.to_icu4x().inner()); + self.0.months_in_year(&calendar_date) as u16 + } + + /// `CalendarInLeapYear` + pub fn in_leap_year(&self, iso_date: &IsoDate) -> bool { + if self.is_iso() { + return iso_date.to_icu4x().is_in_leap_year(); + } + let calendar_date = self.0.from_iso(*iso_date.to_icu4x().inner()); + self.0.is_in_leap_year(&calendar_date) + } + + /// Returns the identifier of this calendar slot. + pub fn identifier(&self) -> &'static str { + // icu_calendar lists iso8601 and julian as None + match self.0.calendar_algorithm() { + Some(c) => c.as_str(), + None if self.is_iso() => "iso8601", + None => "julian", + } + } +} + +impl Calendar { + pub(crate) fn get_era_info(&self, era_alias: &TinyAsciiStr<19>) -> Option { + match self.0 .0.kind() { + AnyCalendarKind::Buddhist if *era_alias == tinystr!(19, "be") => { + Some(era::BUDDHIST_ERA) + } + AnyCalendarKind::Coptic if *era_alias == tinystr!(19, "am") => Some(era::COPTIC_ERA), + AnyCalendarKind::Ethiopian if era::ETHIOPIC_ERA_IDENTIFIERS.contains(era_alias) => { + Some(era::ETHIOPIC_ERA) + } + AnyCalendarKind::Ethiopian + if era::ETHIOPIC_ETHOPICAA_ERA_IDENTIFIERS.contains(era_alias) => + { + Some(era::ETHIOPIC_ETHIOAA_ERA) + } + AnyCalendarKind::EthiopianAmeteAlem + if era::ETHIOAA_ERA_IDENTIFIERS.contains(era_alias) => + { + Some(era::ETHIOAA_ERA) + } + AnyCalendarKind::Gregorian if era::GREGORY_ERA_IDENTIFIERS.contains(era_alias) => { + Some(era::GREGORY_ERA) + } + AnyCalendarKind::Gregorian + if era::GREGORY_INVERSE_ERA_IDENTIFIERS.contains(era_alias) => + { + Some(era::GREGORY_INVERSE_ERA) + } + AnyCalendarKind::Hebrew if *era_alias == tinystr!(19, "am") => Some(era::HEBREW_ERA), + AnyCalendarKind::Indian if *era_alias == tinystr!(19, "shaka") => Some(era::INDIAN_ERA), + AnyCalendarKind::HijriTabularTypeIIFriday + | AnyCalendarKind::HijriSimulatedMecca + | AnyCalendarKind::HijriTabularTypeIIThursday + | AnyCalendarKind::HijriUmmAlQura + if *era_alias == tinystr!(19, "ah") => + { + Some(era::ISLAMIC_ERA) + } + AnyCalendarKind::HijriTabularTypeIIFriday + | AnyCalendarKind::HijriSimulatedMecca + | AnyCalendarKind::HijriTabularTypeIIThursday + | AnyCalendarKind::HijriUmmAlQura + if *era_alias == tinystr!(19, "bh") => + { + Some(era::ISLAMIC_INVERSE_ERA) + } + AnyCalendarKind::Japanese if *era_alias == tinystr!(19, "heisei") => { + Some(era::HEISEI_ERA) + } + AnyCalendarKind::Japanese if era::JAPANESE_ERA_IDENTIFIERS.contains(era_alias) => { + Some(era::JAPANESE_ERA) + } + AnyCalendarKind::Japanese + if era::JAPANESE_INVERSE_ERA_IDENTIFIERS.contains(era_alias) => + { + Some(era::JAPANESE_INVERSE_ERA) + } + AnyCalendarKind::Japanese if *era_alias == tinystr!(19, "meiji") => { + Some(era::MEIJI_ERA) + } + AnyCalendarKind::Japanese if *era_alias == tinystr!(19, "reiwa") => { + Some(era::REIWA_ERA) + } + AnyCalendarKind::Japanese if *era_alias == tinystr!(19, "showa") => { + Some(era::SHOWA_ERA) + } + AnyCalendarKind::Japanese if *era_alias == tinystr!(19, "taisho") => { + Some(era::TAISHO_ERA) + } + AnyCalendarKind::Persian if *era_alias == tinystr!(19, "ap") => Some(era::PERSIAN_ERA), + AnyCalendarKind::Roc if *era_alias == tinystr!(19, "roc") => Some(era::ROC_ERA), + AnyCalendarKind::Roc if *era_alias == tinystr!(19, "broc") => { + Some(era::ROC_INVERSE_ERA) + } + _ => None, + } + } + + pub(crate) fn get_calendar_default_era(&self) -> Option { + match self.0 .0.kind() { + AnyCalendarKind::Buddhist => Some(era::BUDDHIST_ERA), + AnyCalendarKind::Chinese => None, + AnyCalendarKind::Coptic => Some(era::COPTIC_ERA), + AnyCalendarKind::Dangi => None, + AnyCalendarKind::Ethiopian => Some(era::ETHIOPIC_ERA), + AnyCalendarKind::EthiopianAmeteAlem => Some(era::ETHIOAA_ERA), + AnyCalendarKind::Gregorian => Some(era::GREGORY_ERA), + AnyCalendarKind::Hebrew => Some(era::HEBREW_ERA), + AnyCalendarKind::Indian => Some(era::INDIAN_ERA), + AnyCalendarKind::HijriSimulatedMecca => Some(era::ISLAMIC_ERA), + AnyCalendarKind::HijriTabularTypeIIFriday => Some(era::ISLAMIC_ERA), + AnyCalendarKind::HijriTabularTypeIIThursday => Some(era::ISLAMIC_ERA), + AnyCalendarKind::HijriUmmAlQura => Some(era::ISLAMIC_ERA), + AnyCalendarKind::Iso => None, + AnyCalendarKind::Japanese => Some(era::JAPANESE_ERA), + AnyCalendarKind::Persian => Some(era::PERSIAN_ERA), + AnyCalendarKind::Roc => Some(era::ROC_ERA), + _ => None, + } + } + + pub(crate) fn calendar_has_eras(kind: AnyCalendarKind) -> bool { + match kind { + AnyCalendarKind::Buddhist + | AnyCalendarKind::Coptic + | AnyCalendarKind::Ethiopian + | AnyCalendarKind::EthiopianAmeteAlem + | AnyCalendarKind::Gregorian + | AnyCalendarKind::Hebrew + | AnyCalendarKind::Indian + | AnyCalendarKind::HijriSimulatedMecca + | AnyCalendarKind::HijriTabularTypeIIFriday + | AnyCalendarKind::HijriTabularTypeIIThursday + | AnyCalendarKind::HijriUmmAlQura + | AnyCalendarKind::Japanese + | AnyCalendarKind::Persian + | AnyCalendarKind::Roc => true, + AnyCalendarKind::Chinese | AnyCalendarKind::Dangi | AnyCalendarKind::Iso => false, + _ => false, + } + } +} + +impl From for Calendar { + fn from(value: PlainDate) -> Self { + value.calendar().clone() + } +} + +impl From for Calendar { + fn from(value: PlainDateTime) -> Self { + value.calendar().clone() + } +} + +impl From for Calendar { + fn from(value: ZonedDateTime) -> Self { + value.calendar().clone() + } +} + +impl From for Calendar { + fn from(value: PlainMonthDay) -> Self { + value.calendar().clone() + } +} + +impl From for Calendar { + fn from(value: PlainYearMonth) -> Self { + value.calendar().clone() + } +} + +#[cfg(test)] +mod tests { + use crate::{iso::IsoDate, options::Unit}; + use core::str::FromStr; + + use super::Calendar; + + #[test] + fn calendar_from_str_is_case_insensitive() { + let cal_str = "iSo8601"; + let calendar = Calendar::try_from_utf8(cal_str.as_bytes()).unwrap(); + assert_eq!(calendar, Calendar::default()); + + let cal_str = "iSO8601"; + let calendar = Calendar::try_from_utf8(cal_str.as_bytes()).unwrap(); + assert_eq!(calendar, Calendar::default()); + } + + #[test] + fn calendar_invalid_ascii_value() { + let cal_str = "İSO8601"; + let _err = Calendar::from_str(cal_str).unwrap_err(); + + let cal_str = "\u{0130}SO8601"; + let _err = Calendar::from_str(cal_str).unwrap_err(); + + // Verify that an empty calendar is an error. + let cal_str = "2025-02-07T01:24:00-06:00[u-ca=]"; + let _err = Calendar::from_str(cal_str).unwrap_err(); + } + + #[test] + fn date_until_largest_year() { + // tests format: (Date one, PlainDate two, Duration result) + let tests = [ + ((2021, 7, 16), (2021, 7, 16), (0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), + ((2021, 7, 16), (2021, 7, 17), (0, 0, 0, 1, 0, 0, 0, 0, 0, 0)), + ((2021, 7, 16), (2021, 7, 23), (0, 0, 0, 7, 0, 0, 0, 0, 0, 0)), + ((2021, 7, 16), (2021, 8, 16), (0, 1, 0, 0, 0, 0, 0, 0, 0, 0)), + ( + (2020, 12, 16), + (2021, 1, 16), + (0, 1, 0, 0, 0, 0, 0, 0, 0, 0), + ), + ((2021, 1, 5), (2021, 2, 5), (0, 1, 0, 0, 0, 0, 0, 0, 0, 0)), + ((2021, 1, 7), (2021, 3, 7), (0, 2, 0, 0, 0, 0, 0, 0, 0, 0)), + ((2021, 7, 16), (2021, 8, 17), (0, 1, 0, 1, 0, 0, 0, 0, 0, 0)), + ( + (2021, 7, 16), + (2021, 8, 13), + (0, 0, 0, 28, 0, 0, 0, 0, 0, 0), + ), + ((2021, 7, 16), (2021, 9, 16), (0, 2, 0, 0, 0, 0, 0, 0, 0, 0)), + ((2021, 7, 16), (2022, 7, 16), (1, 0, 0, 0, 0, 0, 0, 0, 0, 0)), + ( + (2021, 7, 16), + (2031, 7, 16), + (10, 0, 0, 0, 0, 0, 0, 0, 0, 0), + ), + ((2021, 7, 16), (2022, 7, 19), (1, 0, 0, 3, 0, 0, 0, 0, 0, 0)), + ((2021, 7, 16), (2022, 9, 19), (1, 2, 0, 3, 0, 0, 0, 0, 0, 0)), + ( + (2021, 7, 16), + (2031, 12, 16), + (10, 5, 0, 0, 0, 0, 0, 0, 0, 0), + ), + ( + (1997, 12, 16), + (2021, 7, 16), + (23, 7, 0, 0, 0, 0, 0, 0, 0, 0), + ), + ( + (1997, 7, 16), + (2021, 7, 16), + (24, 0, 0, 0, 0, 0, 0, 0, 0, 0), + ), + ( + (1997, 7, 16), + (2021, 7, 15), + (23, 11, 0, 29, 0, 0, 0, 0, 0, 0), + ), + ( + (1997, 6, 16), + (2021, 6, 15), + (23, 11, 0, 30, 0, 0, 0, 0, 0, 0), + ), + ( + (1960, 2, 16), + (2020, 3, 16), + (60, 1, 0, 0, 0, 0, 0, 0, 0, 0), + ), + ( + (1960, 2, 16), + (2021, 3, 15), + (61, 0, 0, 27, 0, 0, 0, 0, 0, 0), + ), + ( + (1960, 2, 16), + (2020, 3, 15), + (60, 0, 0, 28, 0, 0, 0, 0, 0, 0), + ), + ( + (2021, 3, 30), + (2021, 7, 16), + (0, 3, 0, 16, 0, 0, 0, 0, 0, 0), + ), + ( + (2020, 3, 30), + (2021, 7, 16), + (1, 3, 0, 16, 0, 0, 0, 0, 0, 0), + ), + ( + (1960, 3, 30), + (2021, 7, 16), + (61, 3, 0, 16, 0, 0, 0, 0, 0, 0), + ), + ( + (2019, 12, 30), + (2021, 7, 16), + (1, 6, 0, 16, 0, 0, 0, 0, 0, 0), + ), + ( + (2020, 12, 30), + (2021, 7, 16), + (0, 6, 0, 16, 0, 0, 0, 0, 0, 0), + ), + ( + (1997, 12, 30), + (2021, 7, 16), + (23, 6, 0, 16, 0, 0, 0, 0, 0, 0), + ), + ( + (1, 12, 25), + (2021, 7, 16), + (2019, 6, 0, 21, 0, 0, 0, 0, 0, 0), + ), + ((2019, 12, 30), (2021, 3, 5), (1, 2, 0, 5, 0, 0, 0, 0, 0, 0)), + ( + (2021, 7, 17), + (2021, 7, 16), + (0, 0, 0, -1, 0, 0, 0, 0, 0, 0), + ), + ( + (2021, 7, 23), + (2021, 7, 16), + (0, 0, 0, -7, 0, 0, 0, 0, 0, 0), + ), + ( + (2021, 8, 16), + (2021, 7, 16), + (0, -1, 0, 0, 0, 0, 0, 0, 0, 0), + ), + ( + (2021, 1, 16), + (2020, 12, 16), + (0, -1, 0, 0, 0, 0, 0, 0, 0, 0), + ), + ((2021, 2, 5), (2021, 1, 5), (0, -1, 0, 0, 0, 0, 0, 0, 0, 0)), + ((2021, 3, 7), (2021, 1, 7), (0, -2, 0, 0, 0, 0, 0, 0, 0, 0)), + ( + (2021, 8, 17), + (2021, 7, 16), + (0, -1, 0, -1, 0, 0, 0, 0, 0, 0), + ), + ( + (2021, 8, 13), + (2021, 7, 16), + (0, 0, 0, -28, 0, 0, 0, 0, 0, 0), + ), + ( + (2021, 9, 16), + (2021, 7, 16), + (0, -2, 0, 0, 0, 0, 0, 0, 0, 0), + ), + ( + (2022, 7, 16), + (2021, 7, 16), + (-1, 0, 0, 0, 0, 0, 0, 0, 0, 0), + ), + ( + (2031, 7, 16), + (2021, 7, 16), + (-10, 0, 0, 0, 0, 0, 0, 0, 0, 0), + ), + ( + (2022, 7, 19), + (2021, 7, 16), + (-1, 0, 0, -3, 0, 0, 0, 0, 0, 0), + ), + ( + (2022, 9, 19), + (2021, 7, 16), + (-1, -2, 0, -3, 0, 0, 0, 0, 0, 0), + ), + ( + (2031, 12, 16), + (2021, 7, 16), + (-10, -5, 0, 0, 0, 0, 0, 0, 0, 0), + ), + ( + (2021, 7, 16), + (1997, 12, 16), + (-23, -7, 0, 0, 0, 0, 0, 0, 0, 0), + ), + ( + (2021, 7, 16), + (1997, 7, 16), + (-24, 0, 0, 0, 0, 0, 0, 0, 0, 0), + ), + ( + (2021, 7, 15), + (1997, 7, 16), + (-23, -11, 0, -30, 0, 0, 0, 0, 0, 0), + ), + ( + (2021, 6, 15), + (1997, 6, 16), + (-23, -11, 0, -29, 0, 0, 0, 0, 0, 0), + ), + ( + (2020, 3, 16), + (1960, 2, 16), + (-60, -1, 0, 0, 0, 0, 0, 0, 0, 0), + ), + ( + (2021, 3, 15), + (1960, 2, 16), + (-61, 0, 0, -28, 0, 0, 0, 0, 0, 0), + ), + ( + (2020, 3, 15), + (1960, 2, 16), + (-60, 0, 0, -28, 0, 0, 0, 0, 0, 0), + ), + ( + (2021, 7, 16), + (2021, 3, 30), + (0, -3, 0, -17, 0, 0, 0, 0, 0, 0), + ), + ( + (2021, 7, 16), + (2020, 3, 30), + (-1, -3, 0, -17, 0, 0, 0, 0, 0, 0), + ), + ( + (2021, 7, 16), + (1960, 3, 30), + (-61, -3, 0, -17, 0, 0, 0, 0, 0, 0), + ), + ( + (2021, 7, 16), + (2019, 12, 30), + (-1, -6, 0, -17, 0, 0, 0, 0, 0, 0), + ), + ( + (2021, 7, 16), + (2020, 12, 30), + (0, -6, 0, -17, 0, 0, 0, 0, 0, 0), + ), + ( + (2021, 7, 16), + (1997, 12, 30), + (-23, -6, 0, -17, 0, 0, 0, 0, 0, 0), + ), + ( + (2021, 7, 16), + (1, 12, 25), + (-2019, -6, 0, -22, 0, 0, 0, 0, 0, 0), + ), + ( + (2021, 3, 5), + (2019, 12, 30), + (-1, -2, 0, -6, 0, 0, 0, 0, 0, 0), + ), + ]; + + let calendar = Calendar::default(); + + for test in tests { + let first = IsoDate::new_unchecked(test.0 .0, test.0 .1, test.0 .2); + let second = IsoDate::new_unchecked(test.1 .0, test.1 .1, test.1 .2); + let result = calendar.date_until(&first, &second, Unit::Year).unwrap(); + assert_eq!( + result.years() as i32, + test.2 .0, + "year failed for test \"{test:?}\"" + ); + assert_eq!( + result.months() as i32, + test.2 .1, + "months failed for test \"{test:?}\"" + ); + assert_eq!( + result.weeks() as i32, + test.2 .2, + "weeks failed for test \"{test:?}\"" + ); + assert_eq!( + result.days(), + test.2 .3, + "days failed for test \"{test:?}\"" + ); + } + } +} diff --git a/deps/temporal/src/builtins/core/calendar/era.rs b/deps/temporal/src/builtins/core/calendar/era.rs new file mode 100644 index 00000000000000..5b732abc2fd9d2 --- /dev/null +++ b/deps/temporal/src/builtins/core/calendar/era.rs @@ -0,0 +1,159 @@ +//! Calendar Eras constants + +// The general source for this implementation as of 2024-08-28 is the intl-era-monthcode proposal. +// +// As this source is currently a proposal, its content are subject to change, so full era support +// should be viewed as experimental. +// +// Source: https://tc39.es/proposal-intl-era-monthcode/ + +// TODO (0.1.0): Feature flag certain eras as experimental + +use core::ops::RangeInclusive; + +#[cfg(test)] +use icu_calendar::AnyCalendarKind; +use tinystr::{tinystr, TinyAsciiStr}; + +/// Relevant Era info. +pub(crate) struct EraInfo { + pub(crate) name: TinyAsciiStr<16>, + pub(crate) range: RangeInclusive, + pub(crate) arithmetic_year: ArithmeticYear, +} + +/// The way to map an era to an extended year +pub(crate) enum ArithmeticYear { + // This era is the default era, 1 ERA = 1 ArithmeticYear + DefaultEra, + // This era is a non-default era like reiwa, 1 ERA = offset ArithmeticYear + Offset(i32), + // This era is an inverse era like BC, 0 ERA = -1 ArithmeticYear + Inverse, +} + +impl EraInfo { + pub(crate) fn arithmetic_year_for(&self, era_year: i32) -> i32 { + match self.arithmetic_year { + ArithmeticYear::DefaultEra => era_year, + ArithmeticYear::Offset(offset) => offset + era_year - 1, + ArithmeticYear::Inverse => 1 - era_year, + } + } +} + +macro_rules! era_identifier { + ($name:literal) => { + tinystr!(19, $name) + }; +} + +macro_rules! valid_era { + ($name:literal, $range:expr, $ext:expr ) => { + EraInfo { + name: tinystr!(16, $name), + range: $range, + arithmetic_year: $ext, + } + }; + ($name:literal, $range:expr ) => { + valid_era!($name, $range, ArithmeticYear::DefaultEra) + }; +} + +pub(crate) const ETHIOPIC_ERA_IDENTIFIERS: [TinyAsciiStr<19>; 2] = + [era_identifier!("am"), era_identifier!("incar")]; + +pub(crate) const ETHIOPIC_ETHOPICAA_ERA_IDENTIFIERS: [TinyAsciiStr<19>; 2] = + [era_identifier!("aa"), era_identifier!("mundi")]; + +pub(crate) const ETHIOAA_ERA_IDENTIFIERS: [TinyAsciiStr<19>; 2] = + [era_identifier!("aa"), era_identifier!("mundi")]; + +pub(crate) const GREGORY_ERA_IDENTIFIERS: [TinyAsciiStr<19>; 2] = + [era_identifier!("ce"), era_identifier!("ad")]; + +pub(crate) const GREGORY_INVERSE_ERA_IDENTIFIERS: [TinyAsciiStr<19>; 2] = + [era_identifier!("bc"), era_identifier!("bce")]; +pub(crate) const JAPANESE_ERA_IDENTIFIERS: [TinyAsciiStr<19>; 2] = + [era_identifier!("ce"), era_identifier!("ad")]; + +pub(crate) const JAPANESE_INVERSE_ERA_IDENTIFIERS: [TinyAsciiStr<19>; 2] = + [era_identifier!("bc"), era_identifier!("bce")]; + +// NOTE: The below currently might not align 100% with ICU4X. +// TODO: Update to align with ICU4X depending on any Era updates. +pub(crate) const BUDDHIST_ERA: EraInfo = valid_era!("be", i32::MIN..=i32::MAX); +pub(crate) const COPTIC_ERA: EraInfo = valid_era!("am", 1..=i32::MAX); +pub(crate) const ETHIOPIC_ERA: EraInfo = valid_era!("am", 1..=i32::MAX); +pub(crate) const ETHIOPIC_ETHIOAA_ERA: EraInfo = + valid_era!("aa", i32::MIN..=5500, ArithmeticYear::Offset(-5499)); +pub(crate) const ETHIOAA_ERA: EraInfo = valid_era!("aa", i32::MIN..=i32::MAX); +pub(crate) const GREGORY_ERA: EraInfo = valid_era!("ce", 1..=i32::MAX); +pub(crate) const GREGORY_INVERSE_ERA: EraInfo = + valid_era!("bce", 1..=i32::MAX, ArithmeticYear::Inverse); +pub(crate) const HEBREW_ERA: EraInfo = valid_era!("am", i32::MIN..=i32::MAX); +pub(crate) const INDIAN_ERA: EraInfo = valid_era!("shaka", i32::MIN..=i32::MAX); +pub(crate) const ISLAMIC_ERA: EraInfo = valid_era!("ah", i32::MIN..=i32::MAX); +pub(crate) const ISLAMIC_INVERSE_ERA: EraInfo = + valid_era!("bh", i32::MIN..=i32::MAX, ArithmeticYear::Inverse); +pub(crate) const HEISEI_ERA: EraInfo = valid_era!("heisei", 1..=31, ArithmeticYear::Offset(1989)); +pub(crate) const JAPANESE_ERA: EraInfo = valid_era!("ce", 1..=1868); +pub(crate) const JAPANESE_INVERSE_ERA: EraInfo = + valid_era!("bce", 1..=i32::MAX, ArithmeticYear::Inverse); +pub(crate) const MEIJI_ERA: EraInfo = valid_era!("meiji", 1..=45, ArithmeticYear::Offset(1868)); +pub(crate) const REIWA_ERA: EraInfo = + valid_era!("reiwa", 1..=i32::MAX, ArithmeticYear::Offset(2019)); +pub(crate) const SHOWA_ERA: EraInfo = valid_era!("showa", 1..=64, ArithmeticYear::Offset(1926)); +pub(crate) const TAISHO_ERA: EraInfo = valid_era!("taisho", 1..=45, ArithmeticYear::Offset(1912)); +pub(crate) const PERSIAN_ERA: EraInfo = valid_era!("ap", i32::MIN..=i32::MAX); +pub(crate) const ROC_ERA: EraInfo = valid_era!("roc", 1..=i32::MAX); +pub(crate) const ROC_INVERSE_ERA: EraInfo = + valid_era!("broc", 1..=i32::MAX, ArithmeticYear::Inverse); + +#[cfg(test)] +/// https://tc39.es/proposal-intl-era-monthcode/#sec-temporal-calendarsupportsera +pub(crate) const ALL_ALLOWED_ERAS: &[(AnyCalendarKind, &[EraInfo])] = &[ + (AnyCalendarKind::Buddhist, &[BUDDHIST_ERA]), + (AnyCalendarKind::Coptic, &[COPTIC_ERA]), + ( + AnyCalendarKind::Ethiopian, + &[ETHIOPIC_ERA, ETHIOPIC_ETHIOAA_ERA], + ), + (AnyCalendarKind::EthiopianAmeteAlem, &[ETHIOAA_ERA]), + ( + AnyCalendarKind::Gregorian, + &[GREGORY_ERA, GREGORY_INVERSE_ERA], + ), + (AnyCalendarKind::Hebrew, &[HEBREW_ERA]), + (AnyCalendarKind::Indian, &[INDIAN_ERA]), + ( + AnyCalendarKind::HijriSimulatedMecca, + &[ISLAMIC_ERA, ISLAMIC_INVERSE_ERA], + ), + ( + AnyCalendarKind::HijriTabularTypeIIFriday, + &[ISLAMIC_ERA, ISLAMIC_INVERSE_ERA], + ), + ( + AnyCalendarKind::HijriTabularTypeIIThursday, + &[ISLAMIC_ERA, ISLAMIC_INVERSE_ERA], + ), + ( + AnyCalendarKind::HijriUmmAlQura, + &[ISLAMIC_ERA, ISLAMIC_INVERSE_ERA], + ), + ( + AnyCalendarKind::Japanese, + &[ + JAPANESE_ERA, + JAPANESE_INVERSE_ERA, + MEIJI_ERA, + REIWA_ERA, + SHOWA_ERA, + TAISHO_ERA, + ], + ), + (AnyCalendarKind::Persian, &[PERSIAN_ERA]), + (AnyCalendarKind::Roc, &[ROC_ERA, ROC_INVERSE_ERA]), +]; diff --git a/deps/temporal/src/builtins/core/calendar/fields.rs b/deps/temporal/src/builtins/core/calendar/fields.rs new file mode 100644 index 00000000000000..334693afff11e3 --- /dev/null +++ b/deps/temporal/src/builtins/core/calendar/fields.rs @@ -0,0 +1,389 @@ +use tinystr::TinyAsciiStr; + +use super::types::month_to_month_code; +use crate::{ + error::ErrorMessage, options::Overflow, Calendar, MonthCode, PlainDate, PlainDateTime, + PlainMonthDay, PlainYearMonth, TemporalError, TemporalResult, +}; +use core::ops::Range; + +/// The return value of CalendarFieldKeysToIgnore +#[derive(Copy, Clone, Default)] +pub(crate) struct FieldKeysToIgnore { + /// Ignore all era fields (era-year, era) + pub era: bool, + /// Ignore arithmetical year + pub arithmetical_year: bool, + /// Ignore all month fields (month, month-code) + pub month: bool, +} + +#[derive(Debug, Default, Clone, PartialEq)] +pub struct CalendarFields { + // A potentially set `year` field. + pub year: Option, + // A potentially set `month` field. + pub month: Option, + // A potentially set `month_code` field. + pub month_code: Option, + // A potentially set `day` field. + pub day: Option, + // A potentially set `era` field. + pub era: Option>, + // A potentially set `era_year` field. + pub era_year: Option, +} + +impl CalendarFields { + pub const fn new() -> Self { + Self { + year: None, + month: None, + month_code: None, + day: None, + era: None, + era_year: None, + } + } + + /// Temporal dates are valid between ISO -271821-04-20 and +275760-09-13, + /// but this may not correspond to the same thing for other calendars. + /// + /// These year values are well in range for not needing to worry about overflow/underflow, + /// but we cannot check for them without converting to the calendar first (via ISO). + /// + /// This method provides a quick and easy way to check that the years are in a safe arithmetic + /// range without necessarily needing to resolve calendar specific stuff. + /// + /// This is primarily a defense in depth mechanism; we should still use saturating/checked ops + /// where possible. This works nicely since we have an unambiguous answer for "GIGO or error" + /// since this check can always produce an error when out of range. + pub(crate) fn check_year_in_safe_arithmetical_range(&self) -> TemporalResult<()> { + // No calendars have eras offset more than 6000 years from the ISO epoch, + // and we generously round it up to ±300k + const ROUGH_YEAR_RANGE: Range = -300000..300000; + if let Some(year) = self.year { + if !ROUGH_YEAR_RANGE.contains(&year) { + return Err(TemporalError::range().with_enum(ErrorMessage::DateOutOfRange)); + } + } + if let Some(era_year) = self.era_year { + if !ROUGH_YEAR_RANGE.contains(&era_year) { + return Err(TemporalError::range().with_enum(ErrorMessage::DateOutOfRange)); + } + } + Ok(()) + } + + pub const fn with_era(mut self, era: Option>) -> Self { + self.era = era; + self + } + + pub const fn with_era_year(mut self, era_year: Option) -> Self { + self.era_year = era_year; + self + } + + pub const fn with_year(mut self, year: i32) -> Self { + self.year = Some(year); + self + } + + pub const fn with_optional_year(mut self, year: Option) -> Self { + self.year = year; + self + } + + pub const fn with_month(mut self, month: u8) -> Self { + self.month = Some(month); + self + } + + pub const fn with_optional_month(mut self, month: Option) -> Self { + self.month = month; + self + } + + pub const fn with_month_code(mut self, month_code: MonthCode) -> Self { + self.month_code = Some(month_code); + self + } + + pub const fn with_optional_month_code(mut self, month_code: Option) -> Self { + self.month_code = month_code; + self + } + + pub const fn with_day(mut self, day: u8) -> Self { + self.day = Some(day); + self + } + + pub const fn with_optional_day(mut self, day: Option) -> Self { + self.day = day; + self + } +} + +impl CalendarFields { + pub fn is_empty(&self) -> bool { + *self == Self::new() + } + + pub(crate) fn from_month_day(month_day: &PlainMonthDay) -> Self { + Self { + year: None, + month: None, + month_code: Some(month_day.month_code()), + era: None, + era_year: None, + day: Some(month_day.day()), + } + } + + pub(crate) fn from_date(date: &PlainDate) -> Self { + Self { + year: Some(date.year()), + month: Some(date.month()), + month_code: Some(date.month_code()), + era: date.era().map(TinyAsciiStr::resize), + era_year: date.era_year(), + day: Some(date.day()), + } + } + + crate::impl_with_fallback_method!(with_fallback_date, CalendarFields, (with_day: day) PlainDate); + crate::impl_with_fallback_method!(with_fallback_datetime, CalendarFields, (with_day:day) PlainDateTime); + crate::impl_field_keys_to_ignore!((with_day:day)); +} + +impl From for CalendarFields { + fn from(value: YearMonthCalendarFields) -> Self { + Self { + year: value.year, + month: value.month, + month_code: value.month_code, + day: None, + era: value.era, + era_year: value.era_year, + } + } +} + +impl From for YearMonthCalendarFields { + fn from(value: CalendarFields) -> Self { + Self { + year: value.year, + month: value.month, + month_code: value.month_code, + era: value.era, + era_year: value.era_year, + } + } +} + +#[derive(Debug, Default, Clone, PartialEq)] +pub struct YearMonthCalendarFields { + // A potentially set `year` field. + pub year: Option, + // A potentially set `month` field. + pub month: Option, + // A potentially set `month_code` field. + pub month_code: Option, + // A potentially set `era` field. + pub era: Option>, + // A potentially set `era_year` field. + pub era_year: Option, +} + +impl YearMonthCalendarFields { + pub const fn new() -> Self { + Self { + year: None, + month: None, + month_code: None, + era: None, + era_year: None, + } + } + + pub const fn with_era(mut self, era: Option>) -> Self { + self.era = era; + self + } + + pub const fn with_era_year(mut self, era_year: Option) -> Self { + self.era_year = era_year; + self + } + + pub const fn with_year(mut self, year: i32) -> Self { + self.year = Some(year); + self + } + + pub const fn with_optional_year(mut self, year: Option) -> Self { + self.year = year; + self + } + + pub const fn with_month(mut self, month: u8) -> Self { + self.month = Some(month); + self + } + + pub const fn with_optional_month(mut self, month: Option) -> Self { + self.month = month; + self + } + + pub const fn with_month_code(mut self, month_code: MonthCode) -> Self { + self.month_code = Some(month_code); + self + } + + pub const fn with_optional_month_code(mut self, month_code: Option) -> Self { + self.month_code = month_code; + self + } +} + +impl YearMonthCalendarFields { + pub(crate) fn try_from_year_month(year_month: &PlainYearMonth) -> TemporalResult { + let (year, era, era_year) = if year_month.era().is_some() { + ( + None, + year_month + .era() + .map(|t| TinyAsciiStr::<19>::try_from_utf8(t.as_bytes())) + .transpose() + .map_err(|_| TemporalError::general("Invalid era"))?, + year_month.era_year(), + ) + } else { + (Some(year_month.year()), None, None) + }; + Ok(Self { + year, + month: Some(year_month.month()), + month_code: Some(year_month.month_code()), + era, + era_year, + }) + } + + pub fn is_empty(&self) -> bool { + *self == Self::new() + } + + crate::impl_with_fallback_method!(with_fallback_year_month, CalendarFields, () PlainYearMonth); + crate::impl_field_keys_to_ignore!(()); +} + +// Use macro to impl fallback methods to avoid having a trait method. +#[doc(hidden)] +#[macro_export] +macro_rules! impl_with_fallback_method { + ($method_name:ident, $fields_type:ident, ( $(with_day: $day:ident)? ) $component_type:ty) => { + pub(crate) fn $method_name(&self, fallback: &$component_type, calendar: icu_calendar::AnyCalendarKind, overflow: Overflow) -> TemporalResult { + let keys_to_ignore = self.field_keys_to_ignore(calendar); + let mut era = self.era; + + let mut era_year = self.era_year; + let mut year = self.year; + + if !keys_to_ignore.era { + if era.is_none() { + era = + fallback.era().map(|e| { + TinyAsciiStr::<19>::try_from_utf8(e.as_bytes()) + .map_err(|_| TemporalError::assert().with_message("Produced invalid era code")) + }) + .transpose()? + } + if era_year.is_none() { + era_year = fallback.era_year(); + } + } + if !keys_to_ignore.arithmetical_year { + if year.is_none() { + year = Some(fallback.year()); + } + } + + let (month, month_code) = match (self.month, self.month_code) { + (Some(month), Some(mc)) => (Some(month), Some(mc)), + (Some(month), None) => { + let month_maybe_clamped = if overflow == Overflow::Constrain { + // TODO (manishearth) this should be managed by ICU4X + // https://github.com/unicode-org/icu4x/issues/6790 + month.clamp(1, 12) + } else { + month + }; + + (Some(month_maybe_clamped), Some(month_to_month_code(month_maybe_clamped)?)) + } + (None, Some(mc)) => (Some(mc.to_month_integer()).map(Into::into), Some(mc)), + (None, None) if !keys_to_ignore.month => ( + Some(fallback.month()).map(Into::into), + Some(fallback.month_code()), + ), + // This should currently be unreachable, but it may change as CalendarFieldKeysToIgnore + // changes + (None, None) => (None, None) + }; + #[allow(clippy::needless_update)] { + Ok(Self { + year, + month, + month_code, + $($day: Some(self.day.unwrap_or(fallback.day().into())),)? + era, + era_year, + }) + } + } + }; +} + +#[doc(hidden)] +#[macro_export] +macro_rules! impl_field_keys_to_ignore { + (( $(with_day: $day:ident)? )) => { + /// + fn field_keys_to_ignore(&self, calendar: icu_calendar::AnyCalendarKind) -> $crate::builtins::core::calendar::fields::FieldKeysToIgnore { + let mut keys = $crate::builtins::core::calendar::fields::FieldKeysToIgnore::default(); + // All calendars have months/month codes + if self.month.is_some() || self.month_code.is_some() { + keys.month = true; + } + if Calendar::calendar_has_eras(calendar) { + // We should clear years only if the calendar has eras + if self.year.is_some() || self.era_year.is_some() || self.era.is_some() { + keys.era = true; + keys.arithmetical_year = true; + } + + // In a calendar such as "japanese" where eras do not start and end at year and/or month boundaries, note that the returned + // List should contain era and era-year if keys contains day, month, or month-code + // (not only if it contains era, era-year, or year, as in the example above) because it's possible for + // changing the day or month to cause a conflict with the era. + if calendar == icu_calendar::AnyCalendarKind::Japanese { + if self.month.is_some() || self.month_code.is_some() { + keys.era = true; + } + + $( + if self.$day.is_some() { + keys.era = true; + } + )? + } + } + + keys + } + }; +} diff --git a/deps/temporal/src/builtins/core/calendar/types.rs b/deps/temporal/src/builtins/core/calendar/types.rs new file mode 100644 index 00000000000000..b396b57230aeb8 --- /dev/null +++ b/deps/temporal/src/builtins/core/calendar/types.rs @@ -0,0 +1,790 @@ +//! Implementation of `ResolvedCalendarFields` + +use tinystr::tinystr; +use tinystr::TinyAsciiStr; + +use crate::fields::CalendarFields; +use crate::iso::{constrain_iso_day, is_valid_iso_day}; +use crate::options::Overflow; +use crate::Calendar; +use crate::{TemporalError, TemporalResult}; +use icu_calendar::AnyCalendarKind; + +#[derive(Debug, Clone, Copy, PartialEq)] +pub enum ResolutionType { + Date, + YearMonth, + MonthDay, +} + +/// `ResolvedCalendarFields` represents the resolved field values necessary for +/// creating a Date from potentially partial values. +#[derive(Debug)] +pub struct ResolvedCalendarFields { + pub(crate) era_year: EraYear, + pub(crate) month_code: MonthCode, + pub(crate) day: u8, +} + +impl ResolvedCalendarFields { + // TODO: Potentially make a method on `Calendar`. + #[inline] + pub fn try_from_fields( + calendar: &Calendar, + fields: &CalendarFields, + overflow: Overflow, + resolve_type: ResolutionType, + ) -> TemporalResult { + fields.check_year_in_safe_arithmetical_range()?; + let era_year = EraYear::try_from_fields(calendar, fields, resolve_type)?; + if calendar.is_iso() { + let month_code = resolve_iso_month(calendar, fields, overflow)?; + let day = resolve_day( + fields.day, + resolve_type == ResolutionType::YearMonth, + &era_year, + month_code, + calendar, + )?; + let day = if overflow == Overflow::Constrain { + constrain_iso_day(era_year.year, month_code.to_month_integer(), day) + } else { + if !is_valid_iso_day(era_year.year, month_code.to_month_integer(), day) { + return Err( + TemporalError::range().with_message("day value is not in a valid range.") + ); + } + day + }; + return Ok(Self { + era_year, + month_code, + day, + }); + } + + let month_code = MonthCode::try_from_fields(calendar, fields)?; + let day = resolve_day( + fields.day, + resolve_type == ResolutionType::YearMonth, + &era_year, + month_code, + calendar, + )?; + + Ok(Self { + era_year, + month_code, + day, + }) + } +} + +fn resolve_day( + day: Option, + is_year_month: bool, + year: &EraYear, + month_code: MonthCode, + calendar: &Calendar, +) -> TemporalResult { + if is_year_month { + if calendar.kind() == AnyCalendarKind::Japanese { + Ok( + match (year.arithmetic_year, month_code.to_month_integer()) { + // Meiji begins Oct 23, 1868 + (1868, 10) => 23, + // Taisho begins Jul 30, 1912 + (1912, 7) => 30, + // Showa begins Dec 12, 1926 + (1926, 12) => 25, + // Heisei begins 8 Jan 1989 + (1989, 1) => 8, + // Reiwa begins 1 May 2019 + (2019, 5) => 1, + _ => 1, + }, + ) + } else { + // PlainYearMonth construction paths all *require* setting the day to the first day of the month. + // See https://tc39.es/proposal-temporal/#sec-temporal-calendaryearmonthfromfields + Ok(1) + } + } else { + day.ok_or(TemporalError::r#type().with_message("Required day field is empty.")) + } +} + +#[derive(Debug)] +pub struct Era(pub(crate) TinyAsciiStr<16>); + +// TODO(Manishearth) We should just be using arithmetic_year unconditionally. +// so that https://github.com/boa-dev/temporal/issues/448 is handled. +// +// However, ICU4X has some bugs +// (https://github.com/unicode-org/icu4x/pull/6762/, https://github.com/unicode-org/icu4x/pull/6800) +// so for now we store both. +#[derive(Debug)] +pub struct EraYear { + pub(crate) era: Option, + pub(crate) year: i32, + pub(crate) arithmetic_year: i32, +} + +impl EraYear { + pub(crate) fn try_from_fields( + calendar: &Calendar, + partial: &CalendarFields, + resolution_type: ResolutionType, + ) -> TemporalResult { + match (partial.year, partial.era, partial.era_year) { + _ if resolution_type == ResolutionType::MonthDay => { + let day = partial + .day + .ok_or(TemporalError::r#type().with_message("MonthDay must specify day"))?; + + let arithmetic_year = Self::reference_arithmetic_year_for_month_day( + calendar, + partial.month_code, + day, + )?; + Ok(Self { + // We should just specify these as arithmetic years, no need + // to muck with eras + era: None, + arithmetic_year, + year: arithmetic_year, + }) + } + (maybe_year, Some(era), Some(era_year)) => { + let Some(era_info) = calendar.get_era_info(&era) else { + return Err(TemporalError::range().with_message("Invalid era provided.")); + }; + if !era_info.range.contains(&era_year) { + return Err(TemporalError::range() + .with_message("Year is not valid for the provided era")); + } + let calculated_arith = era_info.arithmetic_year_for(era_year); + // or a RangeError exception if the fields are sufficient but their values are internally inconsistent + // within the calendar (e.g., when fields such as [[Month]] and [[MonthCode]] have conflicting non-unset values). For example: + if let Some(arith) = maybe_year { + if calculated_arith != arith { + return Err( + TemporalError::range().with_message("Conflicting year/eraYear info") + ); + } + } + Ok(Self { + year: era_year, + era: Some(Era(era_info.name)), + arithmetic_year: calculated_arith, + }) + } + (Some(year), None, None) => Ok(Self { + era: calendar.get_calendar_default_era().map(|e| Era(e.name)), + year, + arithmetic_year: year, + }), + _ => Err(TemporalError::r#type() + .with_message("Required fields missing to determine an era and year.")), + } + } + + fn reference_arithmetic_year_for_month_day( + calendar: &Calendar, + month_code: Option, + day: u8, + ) -> TemporalResult { + // For simple calendars without leap days + // (or if leap days have already been handled) + // This needs the date of 1972-12-31 represented in that calendar + fn threshold(month: u8, day: u8, dec_31_1972: (i32, u8, u8)) -> i32 { + // If it's after the day of dec 31 in the primary reference year, + // go one year earlier + if month == dec_31_1972.1 && day > dec_31_1972.2 || month > dec_31_1972.1 { + dec_31_1972.0 - 1 + } else { + // Return the primary reference year + dec_31_1972.0 + } + } + // For simple calendars with a single leap day. + // This needs the date of 1972-12-31 represented in that calendar, the month-day of the leap day, + // and the first reference year where the leap day occurs on or before 1972-12-31 + fn threshold_with_leap_day( + month: u8, + day: u8, + dec_31_1972: (i32, u8, u8), + leap_day: (u8, u8), + leap_year: i32, + ) -> i32 { + // If it's a leap day, just return the leap year + if (month, day) == leap_day { + leap_year + } else { + threshold(month, day, dec_31_1972) + } + } + + let kind = calendar.kind(); + + // This behavior is required by tests, but is not yet specced. + // https://github.com/tc39/proposal-intl-era-monthcode/issues/60 + let Some(month_code) = month_code else { + if kind == AnyCalendarKind::Iso { + return Ok(1972); + } else { + return Err(TemporalError::r#type() + .with_message("MonthDay must be created with a monthCode for non-ISO")); + } + }; + + // The reference date is the latest ISO 8601 date corresponding to the calendar date, that is also earlier than + // or equal to the ISO 8601 date December 31, 1972. If that calendar date never occurs on or before the ISO 8601 date December 31, 1972, + // then the reference date is the earliest ISO 8601 date corresponding to that calendar date. + // The reference year is almost always 1972 (the first ISO 8601 leap year after the epoch), with exceptions + // for calendars where some dates (e.g. leap days or days in leap months) didn't occur during that ISO 8601 year. + // For example, Hebrew calendar leap month Adar I occurred in calendar years 5730 and 5733 (respectively overlapping + // ISO 8601 February/March 1970 and February/March 1973), but did not occur between them, so the reference year for days of that month is 1970. + + Ok(match calendar.kind() { + AnyCalendarKind::Iso | AnyCalendarKind::Gregorian => 1972, + // These calendars just wrap Gregorian with a different epoch + AnyCalendarKind::Buddhist => 1972 + 543, + AnyCalendarKind::Roc => 1972 - 1911, + + AnyCalendarKind::Indian => { + let month = month_code.to_month_integer(); + threshold_with_leap_day(month, day, (1894, 10, 10), (1, 30), 1984) + } + AnyCalendarKind::Persian => { + let month = month_code.to_month_integer(); + threshold_with_leap_day(month, day, (1351, 10, 10), (12, 30), 1350) + } + AnyCalendarKind::HijriTabularTypeIIFriday => { + let month = month_code.to_month_integer(); + threshold_with_leap_day(month, day, (1392, 11, 25), (12, 30), 1390) + } + AnyCalendarKind::HijriTabularTypeIIThursday => { + let month = month_code.to_month_integer(); + threshold_with_leap_day(month, day, (1392, 11, 26), (12, 30), 1390) + } + AnyCalendarKind::Coptic => { + let month = month_code.to_month_integer(); + threshold_with_leap_day(month, day, (1689, 4, 22), (13, 6), 1687) + } + AnyCalendarKind::Ethiopian => { + let month = month_code.to_month_integer(); + threshold_with_leap_day(month, day, (1965, 4, 22), (13, 6), 1963) + } + AnyCalendarKind::EthiopianAmeteAlem => { + let month = month_code.to_month_integer(); + threshold_with_leap_day(month, day, (7465, 4, 22), (13, 6), 7463) + } + AnyCalendarKind::Hebrew => { + // 1972-12-31 is y=5733 am, m=4, d=26. We must produce year 5732 or lower + if month_code.is_leap_month() { + // 5730 is a leap year + 5730 + } else { + let month = month_code.to_month_integer(); + if (month == 4 && day == 26) || month > 4 { + // 5733 will produce dates after 1972, return 5732 instead + 5732 + } else { + // All months have 29 days + if day <= 29 { + 5733 + // Ḥeshvan/Kislev only have 30 days sometimes + // Fortunately 5732 has 30 days for both + } else if month == 2 || month == 3 { + 5732 + } else { + // Some other month, we don't actually need to check + 5733 + } + } + } + } + + // TODO(Manishearth) Chinese, Dangi, waiting on https://github.com/unicode-org/icu4x/pull/6762 + + // These lunar calendars are iffier: The ones above are mathematically defined, + // the algorithm for these may change. This data may need to be updated on occasion. + AnyCalendarKind::HijriUmmAlQura => { + let month = month_code.to_month_integer(); + if day < 30 { + threshold(month, day, (1392, 11, 25)) + } else { + match month { + 1 => 1392, + 2 => 1390, + 3 => 1391, + 4 => 1392, + 5 => 1391, + 6 => 1392, + 7 => 1389, + 8 => 1392, + 9 => 1392, + 10 => 1390, + 11 => 1391, + 12 => 1390, + _ => 1392, + } + } + } + AnyCalendarKind::HijriSimulatedMecca => { + let month = month_code.to_month_integer(); + if day < 30 { + threshold(month, day, (1392, 11, 24)) + } else { + match month { + 1 => 1390, + 2 => 1391, + 3 => 1392, + 4 => 1391, + 5 => 1390, + 6 => 1392, + 7 => 1392, + 8 => 1392, + 9 => 1390, + 10 => 1392, + 11 => 1390, + 12 => 1391, + _ => 1392, + } + } + } + _ => { + return Err(TemporalError::range() + .with_message("Do not currently support MonthDay with this calendar")) + } + }) + } +} + +// MonthCode constants. +const MONTH_ONE: TinyAsciiStr<4> = tinystr!(4, "M01"); +const MONTH_ONE_LEAP: TinyAsciiStr<4> = tinystr!(4, "M01L"); +const MONTH_TWO: TinyAsciiStr<4> = tinystr!(4, "M02"); +const MONTH_TWO_LEAP: TinyAsciiStr<4> = tinystr!(4, "M02L"); +const MONTH_THREE: TinyAsciiStr<4> = tinystr!(4, "M03"); +const MONTH_THREE_LEAP: TinyAsciiStr<4> = tinystr!(4, "M03L"); +const MONTH_FOUR: TinyAsciiStr<4> = tinystr!(4, "M04"); +const MONTH_FOUR_LEAP: TinyAsciiStr<4> = tinystr!(4, "M04L"); +const MONTH_FIVE: TinyAsciiStr<4> = tinystr!(4, "M05"); +const MONTH_FIVE_LEAP: TinyAsciiStr<4> = tinystr!(4, "M05L"); +const MONTH_SIX: TinyAsciiStr<4> = tinystr!(4, "M06"); +const MONTH_SIX_LEAP: TinyAsciiStr<4> = tinystr!(4, "M06L"); +const MONTH_SEVEN: TinyAsciiStr<4> = tinystr!(4, "M07"); +const MONTH_SEVEN_LEAP: TinyAsciiStr<4> = tinystr!(4, "M07L"); +const MONTH_EIGHT: TinyAsciiStr<4> = tinystr!(4, "M08"); +const MONTH_EIGHT_LEAP: TinyAsciiStr<4> = tinystr!(4, "M08L"); +const MONTH_NINE: TinyAsciiStr<4> = tinystr!(4, "M09"); +const MONTH_NINE_LEAP: TinyAsciiStr<4> = tinystr!(4, "M09L"); +const MONTH_TEN: TinyAsciiStr<4> = tinystr!(4, "M10"); +const MONTH_TEN_LEAP: TinyAsciiStr<4> = tinystr!(4, "M10L"); +const MONTH_ELEVEN: TinyAsciiStr<4> = tinystr!(4, "M11"); +const MONTH_ELEVEN_LEAP: TinyAsciiStr<4> = tinystr!(4, "M11L"); +const MONTH_TWELVE: TinyAsciiStr<4> = tinystr!(4, "M12"); +const MONTH_TWELVE_LEAP: TinyAsciiStr<4> = tinystr!(4, "M12L"); +const MONTH_THIRTEEN: TinyAsciiStr<4> = tinystr!(4, "M13"); + +// TODO: Handle instances where month values may be outside of valid +// bounds. In other words, it is totally possible for a value to be +// passed in that is { month: 300 } with overflow::constrain. +/// A MonthCode identifier +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct MonthCode(pub(crate) TinyAsciiStr<4>); + +impl MonthCode { + pub(crate) fn validate(&self, calendar: &Calendar) -> TemporalResult<()> { + const COMMON_MONTH_CODES: [TinyAsciiStr<4>; 12] = [ + MONTH_ONE, + MONTH_TWO, + MONTH_THREE, + MONTH_FOUR, + MONTH_FIVE, + MONTH_SIX, + MONTH_SEVEN, + MONTH_EIGHT, + MONTH_NINE, + MONTH_TEN, + MONTH_ELEVEN, + MONTH_TWELVE, + ]; + + const LUNAR_LEAP_MONTHS: [TinyAsciiStr<4>; 12] = [ + MONTH_ONE_LEAP, + MONTH_TWO_LEAP, + MONTH_THREE_LEAP, + MONTH_FOUR_LEAP, + MONTH_FIVE_LEAP, + MONTH_SIX_LEAP, + MONTH_SEVEN_LEAP, + MONTH_EIGHT_LEAP, + MONTH_NINE_LEAP, + MONTH_TEN_LEAP, + MONTH_ELEVEN_LEAP, + MONTH_TWELVE_LEAP, + ]; + + if COMMON_MONTH_CODES.contains(&self.0) { + return Ok(()); + } + + match calendar.identifier() { + "chinese" | "dangi" if LUNAR_LEAP_MONTHS.contains(&self.0) => Ok(()), + "coptic" | "ethiopic" | "ethiopicaa" if MONTH_THIRTEEN == self.0 => Ok(()), + "hebrew" if MONTH_FIVE_LEAP == self.0 => Ok(()), + _ => Err(TemporalError::range() + .with_message("MonthCode was not valid for the current calendar.")), + } + } + + pub(crate) fn try_from_fields( + calendar: &Calendar, + fields: &CalendarFields, + ) -> TemporalResult { + match fields { + CalendarFields { + month: Some(month), + month_code: None, + .. + } => { + // TODO(manishearth) this is incorrect, + // see https://github.com/unicode-org/icu4x/issues/6790 + let month_code = month_to_month_code(*month)?; + month_code.validate(calendar)?; + Ok(month_code) + } + CalendarFields { + month_code: Some(month_code), + month: None, + .. + } => { + month_code.validate(calendar)?; + Ok(*month_code) + } + CalendarFields { + month: Some(month), + month_code: Some(month_code), + .. + } => { + are_month_and_month_code_resolvable(*month, month_code)?; + month_code.validate(calendar)?; + Ok(*month_code) + } + _ => Err(TemporalError::r#type() + .with_message("Month or monthCode is required to determine date.")), + } + } + + /// Returns the `MonthCode` as an integer + pub fn to_month_integer(&self) -> u8 { + // Sometimes icu_calendar returns "und" + // when the month is calculated to be out of range (usually for + // out-of-astronomic range Islamic and Chinese calendars) + // + // Normalize to something sensible, since ascii_four_to_integer + // will assert for non-digits. + if self.0 == tinystr!(4, "und") { + return 13; + } + ascii_four_to_integer(self.0) + } + + /// Returns whether the `MonthCode` is a leap month. + pub fn is_leap_month(&self) -> bool { + let bytes = self.0.all_bytes(); + bytes[3] == b'L' + } + + pub fn as_str(&self) -> &str { + self.0.as_str() + } + + pub fn as_tinystr(&self) -> TinyAsciiStr<4> { + self.0 + } + + pub fn try_from_utf8(src: &[u8]) -> TemporalResult { + if !(3..=4).contains(&src.len()) { + return Err( + TemporalError::range().with_message("Month codes must have 3 or 4 characters.") + ); + } + + let inner = TinyAsciiStr::<4>::try_from_utf8(src).map_err(|_e| TemporalError::range())?; + + let bytes = inner.all_bytes(); + if bytes[0] != b'M' { + return Err( + TemporalError::range().with_message("First month code character must be 'M'.") + ); + } + if !bytes[1].is_ascii_digit() || !bytes[2].is_ascii_digit() { + return Err(TemporalError::range().with_message("Invalid month code digit.")); + } + if src.len() == 4 && bytes[3] != b'L' { + return Err(TemporalError::range().with_message("Leap month code must end with 'L'.")); + } + + Ok(Self(inner)) + } +} + +impl core::str::FromStr for MonthCode { + type Err = TemporalError; + fn from_str(s: &str) -> Result { + Self::try_from_utf8(s.as_bytes()) + } +} + +// NOTE: This is a greedy function, should handle differently for all calendars. +#[inline] +pub(crate) fn month_to_month_code(month: u8) -> TemporalResult { + if !(1..=13).contains(&month) { + return Err(TemporalError::range().with_message("Month not in a valid range.")); + } + let first = month / 10; + let second = month % 10; + let tinystr = TinyAsciiStr::<4>::try_from_raw([b'M', first + 48, second + 48, b'\0']) + .map_err(|_| TemporalError::range().with_message("Invalid month code"))?; + Ok(MonthCode(tinystr)) +} + +#[inline] +fn are_month_and_month_code_resolvable(_month: u8, _mc: &MonthCode) -> TemporalResult<()> { + // TODO(Manishearth) month is an ordinal month, this check needs year/calendar info + // https://github.com/unicode-org/icu4x/issues/6790 + Ok(()) +} + +// Potentially greedy. Need to verify for all calendars that +// the month code integer aligns with the month integer, which +// may require calendar info +#[inline] +fn ascii_four_to_integer(mc: TinyAsciiStr<4>) -> u8 { + let bytes = mc.all_bytes(); + // Invariant: second and third character (index 1 and 2) are ascii digits. + debug_assert!(bytes[1].is_ascii_digit()); + debug_assert!(bytes[2].is_ascii_digit()); + let first = ascii_digit_to_int(bytes[1]) * 10; + first + ascii_digit_to_int(bytes[2]) +} + +#[inline] +const fn ascii_digit_to_int(ascii_digit: u8) -> u8 { + ascii_digit - 48 +} + +fn resolve_iso_month( + calendar: &Calendar, + fields: &CalendarFields, + overflow: Overflow, +) -> TemporalResult { + let month_code = match (fields.month_code, fields.month) { + (None, None) => { + return Err(TemporalError::r#type().with_message("Month or monthCode must be provided.")) + } + (None, Some(month)) => { + if overflow == Overflow::Constrain { + return month_to_month_code(month.clamp(1, 12)); + } + if !(1..=12).contains(&month) { + return Err( + TemporalError::range().with_message("month value is not in a valid range.") + ); + } + month_to_month_code(month)? + } + (Some(month_code), None) => month_code, + (Some(month_code), Some(month)) => { + if month != month_code.to_month_integer() { + return Err(TemporalError::range() + .with_message("month and monthCode could not be resolved.")); + } + month_code + } + }; + month_code.validate(calendar)?; + Ok(month_code) +} + +#[cfg(test)] +mod tests { + use core::str::FromStr; + + use tinystr::{tinystr, TinyAsciiStr}; + + use crate::{ + builtins::{ + calendar::{types::ResolutionType, CalendarFields}, + core::{calendar::Calendar, PartialDate, PlainDate}, + }, + options::Overflow, + }; + + use super::{month_to_month_code, MonthCode, ResolvedCalendarFields}; + + #[test] + fn valid_month_code() { + let month_code = MonthCode::from_str("M01").unwrap(); + assert!(!month_code.is_leap_month()); + assert_eq!(month_code.to_month_integer(), 1); + + let month_code = MonthCode::from_str("M12").unwrap(); + assert!(!month_code.is_leap_month()); + assert_eq!(month_code.to_month_integer(), 12); + + let month_code = MonthCode::from_str("M13L").unwrap(); + assert!(month_code.is_leap_month()); + assert_eq!(month_code.to_month_integer(), 13); + } + + #[test] + fn invalid_month_code() { + let _ = MonthCode::from_str("01").unwrap_err(); + let _ = MonthCode::from_str("N01").unwrap_err(); + let _ = MonthCode::from_str("M01R").unwrap_err(); + let _ = MonthCode::from_str("M1").unwrap_err(); + let _ = MonthCode::from_str("M1L").unwrap_err(); + } + + #[test] + fn month_to_mc() { + let mc = month_to_month_code(1).unwrap(); + assert_eq!(mc.as_str(), "M01"); + + let mc = month_to_month_code(13).unwrap(); + assert_eq!(mc.as_str(), "M13"); + + let _ = month_to_month_code(0).unwrap_err(); + let _ = month_to_month_code(14).unwrap_err(); + } + + #[test] + fn day_overflow_test() { + let bad_fields = CalendarFields { + year: Some(2019), + month: Some(1), + day: Some(32), + ..Default::default() + }; + + let cal = Calendar::default(); + + let err = cal.date_from_fields(bad_fields.clone(), Overflow::Reject); + assert!(err.is_err()); + let result = cal.date_from_fields(bad_fields, Overflow::Constrain); + assert!(result.is_ok()); + } + + #[test] + fn self_consistent_era_year() { + use crate::builtins::core::calendar::era::ALL_ALLOWED_ERAS; + use icu_calendar::AnyCalendarKind; + + for (cal, eras) in ALL_ALLOWED_ERAS { + for era in *eras { + let expect_str = alloc::format!("Trying {cal:?} with era {}", era.name); + let mut calendar_fields = CalendarFields::new(); + + // We want to pick some valid date. year=1 month=1, day=1 is valid for basically + // all calendars except for Japanese, which has mid-year eras. For Japanese we pick December 31 instead + if *cal == AnyCalendarKind::Japanese { + calendar_fields.month = Some(12); + calendar_fields.day = Some(31); + } else { + calendar_fields.month = Some(1); + calendar_fields.day = Some(1); + } + calendar_fields.era = Some(TinyAsciiStr::from_str(&era.name).unwrap()); + calendar_fields.era_year = Some(1); + let partial = PartialDate { + calendar_fields, + calendar: Calendar::new(*cal), + }; + + let plain_date = + PlainDate::from_partial(partial, Some(Overflow::Constrain)).expect(&expect_str); + + assert_eq!( + plain_date.year(), + era.arithmetic_year_for(1), + "Mismatched year/eraYear for {cal:?} and {}", + era.name + ); + + // Get the full partial date. + let full_partial = CalendarFields::default() + .with_fallback_date(&plain_date, *cal, Overflow::Constrain) + .expect(&expect_str); + + let era_year = super::EraYear::try_from_fields( + &Calendar::new(*cal), + &full_partial, + ResolutionType::Date, + ) + .expect(&expect_str); + + assert_eq!( + &*era_year.era.expect("only testing calendars with era").0, + &*era.name, + "Backcalculated era must match" + ); + assert_eq!(era_year.year, 1, "Backcalculated era must match"); + assert_eq!( + era_year.arithmetic_year, + plain_date.year(), + "Backcalculated arithmetic_year must match" + ); + } + } + } + + #[test] + fn unresolved_month_and_month_code() { + let bad_fields = CalendarFields { + year: Some(1976), + month: Some(11), + month_code: Some(MonthCode(tinystr!(4, "M12"))), + day: Some(18), + ..Default::default() + }; + + let err = ResolvedCalendarFields::try_from_fields( + &Calendar::ISO, + &bad_fields, + Overflow::Reject, + ResolutionType::Date, + ); + assert!(err.is_err()); + } + + #[test] + fn missing_partial_fields() { + let bad_fields = CalendarFields { + year: Some(2019), + day: Some(19), + ..Default::default() + }; + + let err = ResolvedCalendarFields::try_from_fields( + &Calendar::ISO, + &bad_fields, + Overflow::Reject, + ResolutionType::Date, + ); + assert!(err.is_err()); + + let bad_fields = CalendarFields::default(); + let err = ResolvedCalendarFields::try_from_fields( + &Calendar::ISO, + &bad_fields, + Overflow::Reject, + ResolutionType::Date, + ); + assert!(err.is_err()); + } +} diff --git a/deps/temporal/src/builtins/core/duration.rs b/deps/temporal/src/builtins/core/duration.rs new file mode 100644 index 00000000000000..fc19e7912cfb6c --- /dev/null +++ b/deps/temporal/src/builtins/core/duration.rs @@ -0,0 +1,1595 @@ +//! This module implements `Duration` along with it's methods and components. + +use crate::{ + builtins::core::{PlainDateTime, PlainTime}, + error::ErrorMessage, + iso::{IsoDateTime, IsoTime}, + options::{ + Overflow, RelativeTo, ResolvedRoundingOptions, RoundingIncrement, RoundingOptions, + ToStringRoundingOptions, Unit, UnitGroup, + }, + parsers::{FormattableDateDuration, FormattableDuration, FormattableTimeDuration, Precision}, + primitive::FiniteF64, + provider::TimeZoneProvider, + temporal_assert, Sign, TemporalError, TemporalResult, NS_PER_DAY, +}; +use alloc::string::String; +use core::{cmp::Ordering, str::FromStr}; +use ixdtf::{ + encoding::Utf8, parsers::IsoDurationParser, records::Fraction, records::TimeDurationRecord, +}; +use normalized::InternalDurationRecord; +use num_traits::Euclid; + +use self::normalized::TimeDuration; + +mod date; +pub(crate) mod normalized; + +#[cfg(test)] +mod tests; + +#[doc(inline)] +pub use date::DateDuration; + +/// A `PartialDuration` is a Duration that may have fields not set. +#[derive(Debug, Clone, Copy, PartialEq, PartialOrd)] +pub struct PartialDuration { + /// A potentially existent `years` field. + pub years: Option, + /// A potentially existent `months` field. + pub months: Option, + /// A potentially existent `weeks` field. + pub weeks: Option, + /// A potentially existent `days` field. + pub days: Option, + /// A potentially existent `hours` field. + pub hours: Option, + /// A potentially existent `minutes` field. + pub minutes: Option, + /// A potentially existent `seconds` field. + pub seconds: Option, + /// A potentially existent `milliseconds` field. + pub milliseconds: Option, + /// A potentially existent `microseconds` field. + pub microseconds: Option, + /// A potentially existent `nanoseconds` field. + pub nanoseconds: Option, +} + +impl Default for PartialDuration { + fn default() -> Self { + Self::empty() + } +} + +impl PartialDuration { + pub const fn empty() -> Self { + Self { + years: None, + months: None, + weeks: None, + days: None, + hours: None, + minutes: None, + seconds: None, + milliseconds: None, + microseconds: None, + nanoseconds: None, + } + } + + pub const fn with_years(mut self, years: i64) -> Self { + self.years = Some(years); + self + } + + pub const fn with_months(mut self, months: i64) -> Self { + self.months = Some(months); + self + } + + pub const fn with_weeks(mut self, weeks: i64) -> Self { + self.weeks = Some(weeks); + self + } + + pub const fn with_days(mut self, days: i64) -> Self { + self.days = Some(days); + self + } + + pub const fn with_hours(mut self, hours: i64) -> Self { + self.hours = Some(hours); + self + } + + pub const fn with_minutes(mut self, minutes: i64) -> Self { + self.minutes = Some(minutes); + self + } + + pub const fn with_seconds(mut self, seconds: i64) -> Self { + self.seconds = Some(seconds); + self + } + + pub const fn with_milliseconds(mut self, milliseconds: i64) -> Self { + self.milliseconds = Some(milliseconds); + self + } + + pub const fn with_microseconds(mut self, microseconds: i128) -> Self { + self.microseconds = Some(microseconds); + self + } + + pub const fn with_nanoseconds(mut self, nanoseconds: i128) -> Self { + self.nanoseconds = Some(nanoseconds); + self + } +} + +impl PartialDuration { + /// Returns whether the `PartialDuration` is empty. + #[inline] + #[must_use] + pub fn is_empty(&self) -> bool { + self == &Self::default() + } +} + +/// The native Rust implementation of `Temporal.Duration`. +/// +/// Represents a span of time such as "2 hours and 30 minutes" or "3 years, 2 months". +/// Unlike `Instant` which represents a specific moment in time, Duration represents +/// the amount of time between two moments. +/// +/// A Duration consists of two categories of components: +/// - Date components: years, months, weeks, and days +/// - Time components: hours, minutes, seconds, and subsecond units (nanosecond precision) +/// +/// Note that date arithmetic can be complex. For example, adding "1 month" to January 31st +/// could result in February 28th (non-leap year), February 29th (leap year), or March 3rd +/// (if you overflow February), depending on the calendar system and overflow handling. +/// +/// ## Examples +/// +/// ### Creating durations +/// +/// ```rust +/// use temporal_rs::Duration; +/// +/// // Create a duration with specific components +/// let vacation_duration = Duration::new( +/// 0, 0, 2, 3, // 2 weeks and 3 days +/// 0, 0, 0, // no time components +/// 0, 0, 0 // no subsecond components +/// ).unwrap(); +/// +/// assert_eq!(vacation_duration.weeks(), 2); +/// assert_eq!(vacation_duration.days(), 3); +/// ``` +/// +/// ### Parsing ISO 8601 duration strings +/// +/// ```rust +/// use temporal_rs::Duration; +/// use core::str::FromStr; +/// +/// // Complex duration with multiple components +/// let complex = Duration::from_str("P1Y2M3DT4H5M6.789S").unwrap(); +/// assert_eq!(complex.years(), 1); +/// assert_eq!(complex.months(), 2); +/// assert_eq!(complex.days(), 3); +/// assert_eq!(complex.hours(), 4); +/// assert_eq!(complex.minutes(), 5); +/// assert_eq!(complex.seconds(), 6); +/// +/// // Time-only duration +/// let movie_length = Duration::from_str("PT2H30M").unwrap(); +/// assert_eq!(movie_length.hours(), 2); +/// assert_eq!(movie_length.minutes(), 30); +/// +/// // Negative durations +/// let negative = Duration::from_str("-P1D").unwrap(); +/// assert_eq!(negative.days(), -1); +/// ``` +/// +/// ### Duration arithmetic +/// +/// ```rust +/// use temporal_rs::Duration; +/// use core::str::FromStr; +/// +/// let commute_time = Duration::from_str("PT45M").unwrap(); +/// let lunch_break = Duration::from_str("PT1H").unwrap(); +/// +/// // Add durations together +/// let total_time = commute_time.add(&lunch_break).unwrap(); +/// assert_eq!(total_time.hours(), 1); // Results in 1 hour 45 minutes +/// assert_eq!(total_time.minutes(), 45); +/// +/// // Subtract duration components +/// let shortened = lunch_break.subtract(&Duration::from_str("PT15M").unwrap()).unwrap(); +/// assert_eq!(shortened.minutes(), 45); +/// ``` +/// +/// ### Date arithmetic with durations +/// +/// ```rust +/// use temporal_rs::{PlainDate, Duration, options::Overflow}; +/// use core::str::FromStr; +/// +/// // January 31st in different years +/// let jan_31_2023 = PlainDate::try_new_iso(2023, 1, 31).unwrap(); +/// let jan_31_2024 = PlainDate::try_new_iso(2024, 1, 31).unwrap(); // leap year +/// +/// let one_month = Duration::from_str("P1M").unwrap(); +/// +/// // Adding 1 month to Jan 31st gives different results: +/// let feb_2023 = jan_31_2023.add(&one_month, Some(Overflow::Constrain)).unwrap(); +/// let feb_2024 = jan_31_2024.add(&one_month, Some(Overflow::Constrain)).unwrap(); +/// +/// // 2023: Jan 31 + 1 month = Feb 28 (no Feb 31st exists) +/// assert_eq!(feb_2023.day(), 28); +/// // 2024: Jan 31 + 1 month = Feb 29 (leap year) +/// assert_eq!(feb_2024.day(), 29); +/// ``` +/// +/// ### Working with partial durations +/// +/// ```rust +/// use temporal_rs::{Duration, partial::PartialDuration}; +/// +/// let partial = PartialDuration { +/// hours: Some(3), +/// minutes: Some(45), +/// ..Default::default() +/// }; +/// +/// let duration = Duration::from_partial_duration(partial).unwrap(); +/// assert_eq!(duration.hours(), 3); +/// assert_eq!(duration.minutes(), 45); +/// assert_eq!(duration.days(), 0); // other fields default to 0 +/// ``` +/// +/// ### Duration properties +/// +/// ```rust +/// use temporal_rs::Duration; +/// use core::str::FromStr; +/// +/// let duration = Duration::from_str("P1Y2M3D").unwrap(); +/// +/// // Check if duration is zero +/// assert!(!duration.is_zero()); +/// +/// // Get the sign of the duration +/// let sign = duration.sign(); +/// // Note: This particular duration has mixed signs which affects the overall sign +/// +/// // Get absolute value +/// let abs_duration = duration.abs(); +/// assert_eq!(abs_duration.years(), 1); +/// assert_eq!(abs_duration.months(), 2); +/// assert_eq!(abs_duration.days(), 3); +/// +/// // Negate duration +/// let negated = duration.negated(); +/// assert_eq!(negated.years(), -1); +/// assert_eq!(negated.months(), -2); +/// assert_eq!(negated.days(), -3); +/// ``` +/// +/// ## Reference +/// +/// For more information, see the [MDN documentation][mdn-duration]. +/// +/// [mdn-duration]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/Duration +#[non_exhaustive] +#[derive(Debug, Clone, Copy, PartialEq, PartialOrd)] +pub struct Duration { + pub(crate) sign: Sign, + pub(crate) years: u32, + pub(crate) months: u32, + pub(crate) weeks: u32, + pub(crate) days: u64, + pub(crate) hours: u64, + pub(crate) minutes: u64, + pub(crate) seconds: u64, + pub(crate) milliseconds: u64, + pub(crate) microseconds: u128, + pub(crate) nanoseconds: u128, +} + +impl Default for Duration { + fn default() -> Self { + Self { + sign: Sign::Zero, + years: 0, + months: 0, + weeks: 0, + days: 0, + hours: 0, + minutes: 0, + seconds: 0, + milliseconds: 0, + microseconds: 0, + nanoseconds: 0, + } + } +} + +impl core::fmt::Display for Duration { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let string = self.as_temporal_string(ToStringRoundingOptions::default()); + + debug_assert!( + string.is_ok(), + "Duration must return a valid string with default options." + ); + f.write_str(&string.map_err(|_| Default::default())?) + } +} + +impl TryFrom for Duration { + type Error = TemporalError; + fn try_from(partial: PartialDuration) -> Result { + Duration::from_partial_duration(partial) + } +} + +// NOTE(nekevss): Structure of the below is going to be a little convoluted, +// but intended to section everything based on the below +// +// Notation - [section](sub-section(s)). +// +// Sections: +// - Creation (private/public) +// - Getters/Setters +// - Methods (private/public/feature) +// + +#[cfg(test)] +impl Duration { + pub(crate) fn from_hours(value: i64) -> Self { + Self { + sign: Sign::from(value.signum() as i8), + hours: value.saturating_abs() as u64, + ..Default::default() + } + } +} + +// ==== Private Creation methods ==== + +impl Duration { + /// Creates a new `Duration` from a `DateDuration` and `TimeDuration`. + #[allow(clippy::too_many_arguments)] + pub(crate) const fn new_unchecked( + sign: Sign, + years: u32, + months: u32, + weeks: u32, + days: u64, + hours: u64, + minutes: u64, + seconds: u64, + milliseconds: u64, + microseconds: u128, + nanoseconds: u128, + ) -> Self { + Self { + sign, + years, + months, + weeks, + days, + hours, + minutes, + seconds, + milliseconds, + microseconds, + nanoseconds, + } + } + + #[inline] + pub(crate) fn from_internal( + duration_record: InternalDurationRecord, + largest_unit: Unit, + ) -> TemporalResult { + // 1. Let days, hours, minutes, seconds, milliseconds, and microseconds be 0. + let mut days = 0; + let mut hours = 0; + let mut minutes = 0; + let mut seconds = 0; + let mut milliseconds = 0; + let mut microseconds = 0; + + // 2. Let sign be TimeDurationSign(internalDuration.[[Time]]). + let sign = duration_record + .normalized_time_duration() + .sign() + .as_sign_multiplier(); + + // 3. Let nanoseconds be abs(internalDuration.[[Time]]). + let mut nanoseconds = duration_record.normalized_time_duration().0.abs(); + match largest_unit { + // 4. If largestUnit is "year", "month", "week", or "day", then + Unit::Year | Unit::Month | Unit::Week | Unit::Day => { + // a. Set microseconds to floor(nanoseconds / 1000). + // b. Set nanoseconds to nanoseconds modulo 1000. + (microseconds, nanoseconds) = nanoseconds.div_rem_euclid(&1_000); + + // c. Set milliseconds to floor(microseconds / 1000). + // d. Set microseconds to microseconds modulo 1000. + (milliseconds, microseconds) = microseconds.div_rem_euclid(&1_000); + + // e. Set seconds to floor(milliseconds / 1000). + // f. Set milliseconds to milliseconds modulo 1000. + (seconds, milliseconds) = milliseconds.div_rem_euclid(&1_000); + + // g. Set minutes to floor(seconds / 60). + // h. Set seconds to seconds modulo 60. + (minutes, seconds) = seconds.div_rem_euclid(&60); + + // i. Set hours to floor(minutes / 60). + // j. Set minutes to minutes modulo 60. + (hours, minutes) = minutes.div_rem_euclid(&60); + + // k. Set days to floor(hours / 24). + // l. Set hours to hours modulo 24. + (days, hours) = hours.div_rem_euclid(&24); + } + // 5. Else if largestUnit is "hour", then + Unit::Hour => { + // a. Set microseconds to floor(nanoseconds / 1000). + // b. Set nanoseconds to nanoseconds modulo 1000. + (microseconds, nanoseconds) = nanoseconds.div_rem_euclid(&1_000); + + // c. Set milliseconds to floor(microseconds / 1000). + // d. Set microseconds to microseconds modulo 1000. + (milliseconds, microseconds) = microseconds.div_rem_euclid(&1_000); + + // e. Set seconds to floor(milliseconds / 1000). + // f. Set milliseconds to milliseconds modulo 1000. + (seconds, milliseconds) = milliseconds.div_rem_euclid(&1_000); + + // g. Set minutes to floor(seconds / 60). + // h. Set seconds to seconds modulo 60. + (minutes, seconds) = seconds.div_rem_euclid(&60); + + // i. Set hours to floor(minutes / 60). + // j. Set minutes to minutes modulo 60. + (hours, minutes) = minutes.div_rem_euclid(&60); + } + // 6. Else if largestUnit is "minute", then + Unit::Minute => { + // a. Set microseconds to floor(nanoseconds / 1000). + // b. Set nanoseconds to nanoseconds modulo 1000. + (microseconds, nanoseconds) = nanoseconds.div_rem_euclid(&1_000); + + // c. Set milliseconds to floor(microseconds / 1000). + // d. Set microseconds to microseconds modulo 1000. + (milliseconds, microseconds) = microseconds.div_rem_euclid(&1_000); + + // e. Set seconds to floor(milliseconds / 1000). + // f. Set milliseconds to milliseconds modulo 1000. + (seconds, milliseconds) = milliseconds.div_rem_euclid(&1_000); + + // g. Set minutes to floor(seconds / 60). + // h. Set seconds to seconds modulo 60. + (minutes, seconds) = seconds.div_rem_euclid(&60); + } + // 7. Else if largestUnit is "second", then + Unit::Second => { + // a. Set microseconds to floor(nanoseconds / 1000). + // b. Set nanoseconds to nanoseconds modulo 1000. + (microseconds, nanoseconds) = nanoseconds.div_rem_euclid(&1_000); + + // c. Set milliseconds to floor(microseconds / 1000). + // d. Set microseconds to microseconds modulo 1000. + (milliseconds, microseconds) = microseconds.div_rem_euclid(&1_000); + + // e. Set seconds to floor(milliseconds / 1000). + // f. Set milliseconds to milliseconds modulo 1000. + (seconds, milliseconds) = milliseconds.div_rem_euclid(&1_000); + } + // 8. Else if largestUnit is "millisecond", then + Unit::Millisecond => { + // a. Set microseconds to floor(nanoseconds / 1000). + // b. Set nanoseconds to nanoseconds modulo 1000. + (microseconds, nanoseconds) = nanoseconds.div_rem_euclid(&1_000); + + // c. Set milliseconds to floor(microseconds / 1000). + // d. Set microseconds to microseconds modulo 1000. + (milliseconds, microseconds) = microseconds.div_rem_euclid(&1_000); + } + // 9. Else if largestUnit is "microsecond", then + Unit::Microsecond => { + // a. Set microseconds to floor(nanoseconds / 1000). + // b. Set nanoseconds to nanoseconds modulo 1000. + (microseconds, nanoseconds) = nanoseconds.div_rem_euclid(&1_000); + } + // 10. Else, + // a. Assert: largestUnit is "nanosecond". + _ => temporal_assert!(largest_unit == Unit::Nanosecond), + } + // 11. NOTE: When largestUnit is millisecond, microsecond, or nanosecond, milliseconds, microseconds, or + // nanoseconds may be an unsafe integer. In this case, care must be taken when implementing the calculation using + // floating point arithmetic. It can be implemented in C++ using std::fma(). String manipulation will also give an + // exact result, since the multiplication is by a power of 10. + // 12. Return ? CreateTemporalDuration(internalDuration.[[Date]].[[Years]], internalDuration.[[Date]].[[Months]], + // internalDuration.[[Date]].[[Weeks]], internalDuration.[[Date]].[[Days]] + days × sign, hours × sign, minutes × sign, + // seconds × sign, milliseconds × sign, microseconds × sign, nanoseconds × sign). + Duration::new( + duration_record.date().years, + duration_record.date().months, + duration_record.date().weeks, + duration_record.date().days + days as i64 * sign as i64, + hours as i64 * sign as i64, + minutes as i64 * sign as i64, + seconds as i64 * sign as i64, + milliseconds as i64 * sign as i64, + microseconds * sign as i128, + nanoseconds * sign as i128, + ) + } + + /// Returns this `Duration` as a `TimeDuration`. + #[inline] + pub(crate) fn to_normalized(self) -> TimeDuration { + TimeDuration::from_duration(&self) + } + + /// Returns the a `Vec` of the fields values. + #[inline] + #[must_use] + pub(crate) fn fields_signum(&self) -> [i64; 10] { + [ + self.years().signum(), + self.months().signum(), + self.weeks().signum(), + self.days().signum(), + self.hours().signum(), + self.minutes().signum(), + self.seconds().signum(), + self.milliseconds().signum(), + self.microseconds().signum() as i64, + self.nanoseconds().signum() as i64, + ] + } + + /// Returns the `Unit` corresponding to the largest non-zero field. + #[inline] + pub(crate) fn default_largest_unit(&self) -> Unit { + self.fields_signum() + .iter() + .enumerate() + .find(|x| x.1 != &0) + .map(|x| Unit::from(10 - x.0)) + .unwrap_or(Unit::Nanosecond) + } + + // 7.5.5 ToInternalDurationRecord ( duration ) + pub(crate) fn to_internal_duration_record(self) -> InternalDurationRecord { + // 1. Let dateDuration be ! CreateDateDurationRecord(duration.[[Years]], duration.[[Months]], duration.[[Weeks]], duration.[[Days]]). + let date_duration = + DateDuration::new_unchecked(self.years(), self.months(), self.weeks(), self.days()); + // 2. Let timeDuration be TimeDurationFromComponents(duration.[[Hours]], duration.[[Minutes]], duration.[[Seconds]], duration.[[Milliseconds]], duration.[[Microseconds]], duration.[[Nanoseconds]]). + let time_duration = TimeDuration::from_components( + self.hours(), + self.minutes(), + self.seconds(), + self.milliseconds(), + self.microseconds(), + self.nanoseconds(), + ); + // 3. Return CombineDateAndTimeDuration(dateDuration, timeDuration). + InternalDurationRecord::combine(date_duration, time_duration) + } + + /// Equivalent of [`7.5.7 ToDateDurationRecordWithoutTime ( duration )`][spec] + /// + /// [spec]: + /// + // spec(2025-06-23): https://github.com/tc39/proposal-temporal/tree/ed49b0b482981119c9b5e28b0686d877d4a9bae0 + #[allow(clippy::wrong_self_convention)] + pub(crate) fn to_date_duration_record_without_time(&self) -> TemporalResult { + // 1. Let internalDuration be ToInternalDurationRecordWith24HourDays(duration). + let internal_duration = InternalDurationRecord::from_duration_with_24_hour_days(self)?; + + // 2. Let days be truncate(internalDuration.[[Time]] / nsPerDay). + // 3. Return ! CreateDateDurationRecord(internalDuration.[[Date]].[[Years]], internalDuration.[[Date]].[[Months]], internalDuration.[[Date]].[[Weeks]], days). + internal_duration.to_date_duration_record_without_time() + } +} + +// ==== Public Duration API ==== + +impl Duration { + /// Creates a new validated `Duration`. + #[allow(clippy::too_many_arguments)] + pub fn new( + years: i64, + months: i64, + weeks: i64, + days: i64, + hours: i64, + minutes: i64, + seconds: i64, + milliseconds: i64, + microseconds: i128, + nanoseconds: i128, + ) -> TemporalResult { + if !is_valid_duration( + years, + months, + weeks, + days, + hours, + minutes, + seconds, + milliseconds, + microseconds, + nanoseconds, + ) { + return Err(TemporalError::range().with_message("Duration was not valid.")); + } + let sign = duration_sign(&[ + years, + months, + weeks, + days, + hours, + minutes, + seconds, + milliseconds, + microseconds.signum() as i64, + nanoseconds.signum() as i64, + ]); + Ok(Duration::new_unchecked( + sign, + years.saturating_abs() as u32, + months.saturating_abs() as u32, + weeks.saturating_abs() as u32, + days.unsigned_abs(), + hours.unsigned_abs(), + minutes.unsigned_abs(), + seconds.unsigned_abs(), + milliseconds.unsigned_abs(), + microseconds.unsigned_abs(), + nanoseconds.unsigned_abs(), + )) + } + + /// Creates a `Duration` from a provided `PartialDuration`. + /// + /// ## Examples + /// + /// ```rust + /// use temporal_rs::{partial::PartialDuration, Duration}; + /// + /// let duration = Duration::from_partial_duration(PartialDuration { + /// seconds: Some(4), + /// ..Default::default() + /// }).unwrap(); + /// + /// assert_eq!(duration.seconds(), 4); + /// assert_eq!(duration.to_string(), "PT4S"); + /// ``` + pub fn from_partial_duration(partial: PartialDuration) -> TemporalResult { + if partial == PartialDuration::default() { + return Err(TemporalError::r#type() + .with_message("PartialDuration cannot have all empty fields.")); + } + Self::new( + partial.years.unwrap_or_default(), + partial.months.unwrap_or_default(), + partial.weeks.unwrap_or_default(), + partial.days.unwrap_or_default(), + partial.hours.unwrap_or_default(), + partial.minutes.unwrap_or_default(), + partial.seconds.unwrap_or_default(), + partial.milliseconds.unwrap_or_default(), + partial.microseconds.unwrap_or_default(), + partial.nanoseconds.unwrap_or_default(), + ) + } + + // Converts a UTF-8 encoded string into a `Duration`. + pub fn from_utf8(s: &[u8]) -> TemporalResult { + let parse_record = IsoDurationParser::::from_utf8(s).parse()?; + + fn fraction_to_unadjusted_ns(fraction: Option) -> Result { + if let Some(fraction) = fraction { + fraction.to_nanoseconds().ok_or( + TemporalError::range() + .with_enum(ErrorMessage::FractionalTimeMoreThanNineDigits), + ) + } else { + Ok(0) + } + } + + let (hours, minutes, seconds, millis, micros, nanos) = match parse_record.time { + Some(TimeDurationRecord::Hours { hours, fraction }) => { + let unadjusted_fraction = fraction_to_unadjusted_ns(fraction)? as u64; + let fractional_hours_ns = unadjusted_fraction * 3600; + let minutes = fractional_hours_ns.div_euclid(60 * 1_000_000_000); + let fractional_minutes_ns = fractional_hours_ns.rem_euclid(60 * 1_000_000_000); + + let seconds = fractional_minutes_ns.div_euclid(1_000_000_000); + let fractional_seconds = fractional_minutes_ns.rem_euclid(1_000_000_000); + + let milliseconds = fractional_seconds.div_euclid(1_000_000); + let rem = fractional_seconds.rem_euclid(1_000_000); + + let microseconds = rem.div_euclid(1_000); + let nanoseconds = rem.rem_euclid(1_000); + + ( + hours, + minutes, + seconds, + milliseconds, + microseconds, + nanoseconds, + ) + } + // Minutes variant is defined as { hours: u32, minutes: u32, fraction: u64 } + Some(TimeDurationRecord::Minutes { + hours, + minutes, + fraction, + }) => { + let unadjusted_fraction = fraction_to_unadjusted_ns(fraction)? as u64; + let fractional_minutes_ns = unadjusted_fraction * 60; + let seconds = fractional_minutes_ns.div_euclid(1_000_000_000); + let fractional_seconds = fractional_minutes_ns.rem_euclid(1_000_000_000); + + let milliseconds = fractional_seconds.div_euclid(1_000_000); + let rem = fractional_seconds.rem_euclid(1_000_000); + + let microseconds = rem.div_euclid(1_000); + let nanoseconds = rem.rem_euclid(1_000); + + ( + hours, + minutes, + seconds, + milliseconds, + microseconds, + nanoseconds, + ) + } + // Seconds variant is defined as { hours: u32, minutes: u32, seconds: u32, fraction: u32 } + Some(TimeDurationRecord::Seconds { + hours, + minutes, + seconds, + fraction, + }) => { + let ns = fraction_to_unadjusted_ns(fraction)?; + let milliseconds = ns.div_euclid(1_000_000); + let rem = ns.rem_euclid(1_000_000); + + let microseconds = rem.div_euclid(1_000); + let nanoseconds = rem.rem_euclid(1_000); + + ( + hours, + minutes, + seconds, + milliseconds as u64, + microseconds as u64, + nanoseconds as u64, + ) + } + None => (0, 0, 0, 0, 0, 0), + }; + + let (years, months, weeks, days) = if let Some(date) = parse_record.date { + (date.years, date.months, date.weeks, date.days) + } else { + (0, 0, 0, 0) + }; + + let sign = parse_record.sign as i64; + + Self::new( + years as i64 * sign, + months as i64 * sign, + weeks as i64 * sign, + days as i64 * sign, + hours as i64 * sign, + minutes as i64 * sign, + seconds as i64 * sign, + millis as i64 * sign, + micros as i128 * sign as i128, + nanos as i128 * sign as i128, + ) + } + + /// Return if the Durations values are within their valid ranges. + #[inline] + #[must_use] + pub fn is_time_within_range(&self) -> bool { + self.hours < 24 + && self.minutes < 60 + && self.seconds < 60 + && self.milliseconds < 1000 + && self.microseconds < 1000 + && self.nanoseconds < 1000 + } + + #[inline] + pub fn compare_with_provider( + &self, + other: &Duration, + relative_to: Option, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + if self == other { + return Ok(Ordering::Equal); + } + // 8. Let largestUnit1 be DefaultTemporalLargestUnit(one). + // 9. Let largestUnit2 be DefaultTemporalLargestUnit(two). + let largest_unit_1 = self.default_largest_unit(); + let largest_unit_2 = other.default_largest_unit(); + // 10. Let duration1 be ToInternalDurationRecord(one). + let duration_one = self.to_internal_duration_record(); + // 11. Let duration2 be ToInternalDurationRecord(two). + let duration_two = other.to_internal_duration_record(); + // 12. If zonedRelativeTo is not undefined, and either UnitCategory(largestUnit1) or UnitCategory(largestUnit2) is date, then + if let Some(RelativeTo::ZonedDateTime(zdt)) = relative_to.as_ref() { + if largest_unit_1.is_date_unit() || largest_unit_2.is_date_unit() { + // a. Let timeZone be zonedRelativeTo.[[TimeZone]]. + // b. Let calendar be zonedRelativeTo.[[Calendar]]. + // c. Let after1 be ? AddZonedDateTime(zonedRelativeTo.[[EpochNanoseconds]], timeZone, calendar, duration1, constrain). + // d. Let after2 be ? AddZonedDateTime(zonedRelativeTo.[[EpochNanoseconds]], timeZone, calendar, duration2, constrain). + let after1 = + zdt.add_zoned_date_time(duration_one, Overflow::Constrain, provider)?; + let after2 = + zdt.add_zoned_date_time(duration_two, Overflow::Constrain, provider)?; + // e. If after1 > after2, return 1𝔽. + // f. If after1 < after2, return -1𝔽. + // g. Return +0𝔽. + return Ok(after1.cmp(&after2)); + } + } + // 13. If IsCalendarUnit(largestUnit1) is true or IsCalendarUnit(largestUnit2) is true, then + let (days1, days2) = + if largest_unit_1.is_calendar_unit() || largest_unit_2.is_calendar_unit() { + // a. If plainRelativeTo is undefined, throw a RangeError exception. + // b. Let days1 be ? DateDurationDays(duration1.[[Date]], plainRelativeTo). + // c. Let days2 be ? DateDurationDays(duration2.[[Date]], plainRelativeTo). + let Some(RelativeTo::PlainDate(pdt)) = relative_to.as_ref() else { + return Err(TemporalError::range()); + }; + let days1 = self.date().days(pdt)?; + let days2 = other.date().days(pdt)?; + (days1, days2) + } else { + (self.date().days, other.date().days) + }; + // 15. Let timeDuration1 be ? Add24HourDaysToTimeDuration(duration1.[[Time]], days1). + let time_duration_1 = self.to_normalized().add_days(days1)?; + // 16. Let timeDuration2 be ? Add24HourDaysToTimeDuration(duration2.[[Time]], days2). + let time_duration_2 = other.to_normalized().add_days(days2)?; + // 17. Return 𝔽(CompareTimeDuration(timeDuration1, timeDuration2)). + Ok(time_duration_1.cmp(&time_duration_2)) + } +} + +// ==== Public `Duration` Getters/Setters ==== + +impl Duration { + /// Returns a reference to the inner `DateDuration` + #[inline] + #[must_use] + pub fn date(&self) -> DateDuration { + DateDuration::from(self) + } + + /// Returns the `years` field of duration. + #[inline] + #[must_use] + pub const fn years(&self) -> i64 { + self.years as i64 * self.sign.as_sign_multiplier() as i64 + } + + /// Returns the `months` field of duration. + #[inline] + #[must_use] + pub const fn months(&self) -> i64 { + self.months as i64 * self.sign.as_sign_multiplier() as i64 + } + + /// Returns the `weeks` field of duration. + #[inline] + #[must_use] + pub const fn weeks(&self) -> i64 { + self.weeks as i64 * self.sign.as_sign_multiplier() as i64 + } + + /// Returns the `days` field of duration. + #[inline] + #[must_use] + pub const fn days(&self) -> i64 { + self.days as i64 * self.sign.as_sign_multiplier() as i64 + } + + /// Returns the `hours` field of duration. + #[inline] + #[must_use] + pub const fn hours(&self) -> i64 { + self.hours as i64 * self.sign.as_sign_multiplier() as i64 + } + + /// Returns the `hours` field of duration. + #[inline] + #[must_use] + pub const fn minutes(&self) -> i64 { + self.minutes as i64 * self.sign.as_sign_multiplier() as i64 + } + + /// Returns the `seconds` field of duration. + #[inline] + #[must_use] + pub const fn seconds(&self) -> i64 { + self.seconds as i64 * self.sign.as_sign_multiplier() as i64 + } + + /// Returns the `hours` field of duration. + #[inline] + #[must_use] + pub const fn milliseconds(&self) -> i64 { + self.milliseconds as i64 * self.sign.as_sign_multiplier() as i64 + } + + /// Returns the `microseconds` field of duration. + #[inline] + #[must_use] + pub const fn microseconds(&self) -> i128 { + self.microseconds as i128 * self.sign.as_sign_multiplier() as i128 + } + + /// Returns the `nanoseconds` field of duration. + #[inline] + #[must_use] + pub const fn nanoseconds(&self) -> i128 { + self.nanoseconds as i128 * self.sign.as_sign_multiplier() as i128 + } +} + +// ==== Public Duration methods ==== + +impl Duration { + /// Determines the sign for the current self. + #[inline] + #[must_use] + pub fn sign(&self) -> Sign { + self.sign + } + + /// Returns whether the current `Duration` is zero. + /// + /// Equivalant to `Temporal.Duration.blank()`. + #[inline] + #[must_use] + pub fn is_zero(&self) -> bool { + self.sign() == Sign::Zero + } + + /// Returns a negated `Duration` + #[inline] + #[must_use] + pub fn negated(&self) -> Self { + Self { + sign: self.sign.negate(), + ..*self + } + } + + /// Returns the absolute value of `Duration`. + #[inline] + #[must_use] + pub fn abs(&self) -> Self { + Self { + sign: if self.sign == Sign::Zero { + Sign::Zero + } else { + Sign::Positive + }, + ..*self + } + } + + /// Returns the result of adding a `Duration` to the current `Duration` + #[inline] + pub fn add(&self, other: &Self) -> TemporalResult { + // 1. Set other to ? ToTemporalDuration(other). + // 2. If operation is subtract, set other to CreateNegatedTemporalDuration(other). + // 3. Let largestUnit1 be DefaultTemporalLargestUnit(duration). + let largest_unit_one = self.default_largest_unit(); + // 4. Let largestUnit2 be DefaultTemporalLargestUnit(other). + let largest_unit_two = other.default_largest_unit(); + // 5. Let largestUnit be LargerOfTwoTemporalUnits(largestUnit1, largestUnit2). + let largest_unit = largest_unit_one.max(largest_unit_two); + // 6. If IsCalendarUnit(largestUnit) is true, throw a RangeError exception. + if largest_unit.is_calendar_unit() { + return Err(TemporalError::range().with_message( + "Largest unit cannot be a calendar unit when adding two durations.", + )); + } + + // 7. Let d1 be ToInternalDurationRecordWith24HourDays(duration). + let d1 = InternalDurationRecord::from_duration_with_24_hour_days(self)?; + // 8. Let d2 be ToInternalDurationRecordWith24HourDays(other). + let d2 = InternalDurationRecord::from_duration_with_24_hour_days(other)?; + // 9. Let timeResult be ? AddTimeDuration(d1.[[Time]], d2.[[Time]]). + let time_result = (d1.normalized_time_duration() + d2.normalized_time_duration())?; + // 10. Let result be CombineDateAndTimeDuration(ZeroDateDuration(), timeResult). + let result = InternalDurationRecord::combine(DateDuration::default(), time_result); + // 11. Return ? TemporalDurationFromInternal(result, largestUnit). + Duration::from_internal(result, largest_unit) + } + + /// Returns the result of subtracting a `Duration` from the current `Duration` + #[inline] + pub fn subtract(&self, other: &Self) -> TemporalResult { + self.add(&other.negated()) + } + + /// `17.3.20 Temporal.Duration.prototype.round ( roundTo )` + /// + /// Spec: + /// + // Spec last accessed: 2025-09-08, + #[inline] + pub fn round_with_provider( + &self, + options: RoundingOptions, + relative_to: Option, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + // NOTE(HalidOdat): Steps 1-12 are handled before calling the function. + // + // SKIP: 1. Let duration be the this value. + // SKIP: 2. Perform ? RequireInternalSlot(duration, [[InitializedTemporalDuration]]). + // SKIP: 3. If roundTo is undefined, then + // SKIP: a. Throw a TypeError exception. + // SKIP: 4. If roundTo is a String, then + // SKIP: a. Let paramString be roundTo. + // SKIP: b. Set roundTo to OrdinaryObjectCreate(null). + // SKIP: c. Perform ! CreateDataPropertyOrThrow(roundTo, "smallestUnit", paramString). + // SKIP: 5. Else, + // SKIP: a. Set roundTo to ? GetOptionsObject(roundTo). + // SKIP: 6. Let smallestUnitPresent be true. + // SKIP: 7. Let largestUnitPresent be true. + // SKIP: 8. NOTE: The following steps read options and perform independent validation in alphabetical order + // (GetTemporalRelativeToOption reads "relativeTo", + // GetRoundingIncrementOption reads "roundingIncrement" + // and GetRoundingModeOption reads "roundingMode"). + // SKIP: 9. Let largestUnit be ? GetTemporalUnitValuedOption(roundTo, "largestUnit", unset). + // SKIP: 10. Let relativeToRecord be ? GetTemporalRelativeToOption(roundTo). + // SKIP: 11. Let zonedRelativeTo be relativeToRecord.[[ZonedRelativeTo]]. + // SKIP: 12. Let plainRelativeTo be relativeToRecord.[[PlainRelativeTo]]. + + // 13. Let roundingIncrement be ? GetRoundingIncrementOption(roundTo). + let rounding_increment = options.increment.unwrap_or_default(); + + // 14. Let roundingMode be ? GetRoundingModeOption(roundTo, half-expand). + let rounding_mode = options.rounding_mode.unwrap_or_default(); + + // 15. Let smallestUnit be ? GetTemporalUnitValuedOption(roundTo, "smallestUnit", datetime, unset). + let smallest_unit = options.smallest_unit; + + // 16. Perform ?ValidateTemporalUnitValue(smallestUnit, datetime). + UnitGroup::DateTime.validate_unit(smallest_unit, None)?; + + // 17. If smallestUnit is unset, then + // a. Set smallestUnitPresent to false. + // b. Set smallestUnit to nanosecond. + let smallest_unit = smallest_unit.unwrap_or(Unit::Nanosecond); + + // 18. Let existingLargestUnit be DefaultTemporalLargestUnit(duration). + let existing_largest_unit = self.default_largest_unit(); + + // 19. Let defaultLargestUnit be LargerOfTwoTemporalUnits(existingLargestUnit, smallestUnit). + let default_largest_unit = Unit::larger(existing_largest_unit, smallest_unit)?; + + let largest_unit = match options.largest_unit { + // 20. If largestUnit is unset, then + // a. Set largestUnitPresent to false. + // b. Set largestUnit to defaultLargestUnit. + // 21. Else if largestUnit is auto, then + // a. Set largestUnit to defaultLargestUnit. + Some(Unit::Auto) | None => default_largest_unit, + Some(unit) => unit, + }; + + // 22. If smallestUnitPresent is false and largestUnitPresent is false, then + if options.largest_unit.is_none() && options.smallest_unit.is_none() { + // a. Throw a RangeError exception. + return Err(TemporalError::range() + .with_message("smallestUnit and largestUnit cannot both be None.")); + } + + // 23. If LargerOfTwoTemporalUnits(largestUnit, smallestUnit) is not largestUnit, throw a RangeError exception. + if Unit::larger(largest_unit, smallest_unit)? != largest_unit { + return Err( + TemporalError::range().with_message("smallestUnit is larger than largestUnit.") + ); + } + + // 24. Let maximum be MaximumTemporalDurationRoundingIncrement(smallestUnit). + let maximum = smallest_unit.to_maximum_rounding_increment(); + + // 25. If maximum is not unset, perform ? ValidateTemporalRoundingIncrement(roundingIncrement, maximum, false). + if let Some(maximum) = maximum { + rounding_increment.validate(maximum.into(), false)?; + } + + // 26. If roundingIncrement > 1, and largestUnit is not smallestUnit, and TemporalUnitCategory(smallestUnit) is date, throw a RangeError exception. + if rounding_increment > RoundingIncrement::ONE + && largest_unit != smallest_unit + && smallest_unit.is_date_unit() + { + return Err(TemporalError::range().with_message( + "roundingIncrement > 1 and largest_unit is not smallest_unit and smallest_unit is date", + )); + } + + let resolved_options = ResolvedRoundingOptions { + largest_unit, + smallest_unit, + increment: rounding_increment, + rounding_mode, + }; + + match relative_to { + // 27. If zonedRelativeTo is not undefined, then + Some(RelativeTo::ZonedDateTime(zoned_relative_to)) => { + // a. Let internalDuration be ToInternalDurationRecord(duration). + let internal_duration = self.to_internal_duration_record(); + + // b. Let timeZone be zonedRelativeTo.[[TimeZone]]. + // c. Let calendar be zonedRelativeTo.[[Calendar]]. + // (bundled in zoned_relative_to) + + // d. Let relativeEpochNs be zonedRelativeTo.[[EpochNanoseconds]]. + // let relative_epoch_ns = zoned_relative_to.epoch_nanoseconds(); + + // e. Let targetEpochNs be ? AddZonedDateTime(relativeEpochNs, timeZone, calendar, internalDuration, constrain). + let target_epoch_ns = zoned_relative_to.add_zoned_date_time( + internal_duration, + Overflow::Constrain, + provider, + )?; + + // f. Set internalDuration to ? DifferenceZonedDateTimeWithRounding(relativeEpochNs, targetEpochNs, timeZone, calendar, largestUnit, roundingIncrement, smallestUnit, roundingMode). + let internal = zoned_relative_to.diff_with_rounding( + &target_epoch_ns, + resolved_options, + provider, + )?; + + // g. If TemporalUnitCategory(largestUnit) is date, set largestUnit to hour. + let mut largest_unit = resolved_options.largest_unit; + if resolved_options.largest_unit.is_date_unit() { + largest_unit = Unit::Hour; + } + + // h. Return ? TemporalDurationFromInternal(internalDuration, largestUnit). + return Duration::from_internal(internal, largest_unit); + } + + // 28. If plainRelativeTo is not undefined, then + Some(RelativeTo::PlainDate(plain_relative_to)) => { + // a. Let internalDuration be ToInternalDurationRecordWith24HourDays(duration). + let internal_duration = + InternalDurationRecord::from_duration_with_24_hour_days(self)?; + + // b. Let targetTime be AddTime(MidnightTimeRecord(), internalDuration.[[Time]]). + let (target_time_days, target_time) = PlainTime::default() + .add_normalized_time_duration(internal_duration.normalized_time_duration()); + + // c. Let calendar be plainRelativeTo.[[Calendar]]. + let calendar = plain_relative_to.calendar(); + + // d. Let dateDuration be ! AdjustDateDurationRecord(internalDuration.[[Date]], targetTime.[[Days]]). + let date_duration = + internal_duration + .date() + .adjust(target_time_days, None, None)?; + + // e. Let targetDate be ? CalendarDateAdd(calendar, plainRelativeTo.[[ISODate]], dateDuration, constrain). + let target_date = calendar.date_add( + &plain_relative_to.iso, + &date_duration, + Overflow::Constrain, + )?; + + // f. Let isoDateTime be CombineISODateAndTimeRecord(plainRelativeTo.[[ISODate]], MidnightTimeRecord()). + let iso_date_time = + IsoDateTime::new_unchecked(plain_relative_to.iso, IsoTime::default()); + + // g. Let targetDateTime be CombineISODateAndTimeRecord(targetDate, targetTime). + let target_date_time = IsoDateTime::new_unchecked(target_date.iso, target_time.iso); + + // h. Set internalDuration to ? DifferencePlainDateTimeWithRounding(isoDateTime, targetDateTime, calendar, largestUnit, roundingIncrement, smallestUnit, roundingMode). + let internal_duration = + PlainDateTime::new_unchecked(iso_date_time, calendar.clone()) + .diff_dt_with_rounding( + &PlainDateTime::new_unchecked(target_date_time, calendar.clone()), + resolved_options, + )?; + + // i. Return ? TemporalDurationFromInternal(internalDuration, largestUnit). + return Duration::from_internal(internal_duration, resolved_options.largest_unit); + } + None => {} + } + + // 29. If IsCalendarUnit(existingLargestUnit) is true, or IsCalendarUnit(largestUnit) is true, throw a RangeError exception. + if existing_largest_unit.is_calendar_unit() + || resolved_options.largest_unit.is_calendar_unit() + { + return Err(TemporalError::range().with_message( + "largestUnit when rounding Duration was not the largest provided unit", + )); + } + + // 30. Assert: IsCalendarUnit(smallestUnit) is false. + temporal_assert!(!resolved_options.smallest_unit.is_calendar_unit()); + + // 31. Let internalDuration be ToInternalDurationRecordWith24HourDays(duration). + let internal_duration = InternalDurationRecord::from_duration_with_24_hour_days(self)?; + + // 32. If smallestUnit is day, then + let internal_duration = if resolved_options.smallest_unit == Unit::Day { + // a. Let fractionalDays be TotalTimeDuration(internalDuration.[[Time]], day). + // b. Let days be RoundNumberToIncrement(fractionalDays, roundingIncrement, roundingMode). + let days = internal_duration + .normalized_time_duration() + .round_to_fractional_days( + resolved_options.increment, + resolved_options.rounding_mode, + )?; + + // c. Let dateDuration be ? CreateDateDurationRecord(0, 0, 0, days). + let date = DateDuration::new(0, 0, 0, days)?; + + // d. Set internalDuration to CombineDateAndTimeDuration(dateDuration, 0). + InternalDurationRecord::new(date, TimeDuration::default())? + } else { + // 33. Else, + // a. Let timeDuration be ? RoundTimeDuration(internalDuration.[[Time]], roundingIncrement, smallestUnit, roundingMode). + let time_duration = internal_duration + .normalized_time_duration() + .round(resolved_options)?; + + // b. Set internalDuration to CombineDateAndTimeDuration(ZeroDateDuration(), timeDuration). + InternalDurationRecord::new(DateDuration::default(), time_duration)? + }; + + // 34. Return ? TemporalDurationFromInternal(internalDuration, largestUnit). + Duration::from_internal(internal_duration, resolved_options.largest_unit) + } + + /// Returns the total of the `Duration` + pub fn total_with_provider( + &self, + unit: Unit, + relative_to: Option, + provider: &impl TimeZoneProvider, + // Review question what is the return type of duration.prototye.total? + ) -> TemporalResult { + match relative_to { + // 11. If zonedRelativeTo is not undefined, then + Some(RelativeTo::ZonedDateTime(zoned_datetime)) => { + // a. Let internalDuration be ToInternalDurationRecord(duration). + let internal_duration = self.to_internal_duration_record(); + // b. Let timeZone be zonedRelativeTo.[[TimeZone]]. + // c. Let calendar be zonedRelativeTo.[[Calendar]]. + // d. Let relativeEpochNs be zonedRelativeTo.[[EpochNanoseconds]]. + // e. Let targetEpochNs be ? AddZonedDateTime(relativeEpochNs, timeZone, calendar, internalDuration, constrain). + let target_epoch_ns = zoned_datetime.add_zoned_date_time( + internal_duration, + Overflow::Constrain, + provider, + )?; + // f. Let total be ? DifferenceZonedDateTimeWithTotal(relativeEpochNs, targetEpochNs, timeZone, calendar, unit). + let total = zoned_datetime.diff_with_total(&target_epoch_ns, unit, provider)?; + Ok(total) + } + // 12. Else if plainRelativeTo is not undefined, then + Some(RelativeTo::PlainDate(plain_date)) => { + // a. Let internalDuration be ToInternalDurationRecordWith24HourDays(duration). + // b. Let targetTime be AddTime(MidnightTimeRecord(), internalDuration.[[Time]]). + let (balanced_days, time) = + PlainTime::default().add_normalized_time_duration(self.to_normalized()); + // c. Let calendar be plainRelativeTo.[[Calendar]]. + // d. Let dateDuration be ! AdjustDateDurationRecord(internalDuration.[[Date]], targetTime.[[Days]]). + let date_duration = DateDuration::new( + self.years(), + self.months(), + self.weeks(), + self.days() + .checked_add(balanced_days) + .ok_or(TemporalError::range())?, + )?; + // e. Let targetDate be ? CalendarDateAdd(calendar, plainRelativeTo.[[ISODate]], dateDuration, constrain). + let target_date = plain_date.calendar().date_add( + &plain_date.iso, + &date_duration, + Overflow::Constrain, + )?; + // f. Let isoDateTime be CombineISODateAndTimeRecord(plainRelativeTo.[[ISODate]], MidnightTimeRecord()). + let iso_date_time = IsoDateTime::new_unchecked(plain_date.iso, IsoTime::default()); + // g. Let targetDateTime be CombineISODateAndTimeRecord(targetDate, targetTime). + let target_date_time = IsoDateTime::new_unchecked(target_date.iso, time.iso); + // h. Let total be ? DifferencePlainDateTimeWithTotal(isoDateTime, targetDateTime, calendar, unit). + let plain_dt = + PlainDateTime::new_unchecked(iso_date_time, plain_date.calendar().clone()); + let total = plain_dt.diff_dt_with_total( + &PlainDateTime::new_unchecked(target_date_time, plain_date.calendar().clone()), + unit, + )?; + Ok(total) + } + None => { + // a. Let largestUnit be DefaultTemporalLargestUnit(duration). + let largest_unit = self.default_largest_unit(); + // b. If IsCalendarUnit(largestUnit) is true, or IsCalendarUnit(unit) is true, throw a RangeError exception. + if largest_unit.is_calendar_unit() || unit.is_calendar_unit() { + return Err(TemporalError::range()); + } + // c. Let internalDuration be ToInternalDurationRecordWith24HourDays(duration). + let internal = InternalDurationRecord::from_duration_with_24_hour_days(self)?; + // d. Let total be TotalTimeDuration(internalDuration.[[Time]], unit). + let total = internal.normalized_time_duration().total(unit)?; + Ok(total) + } + } + } + + /// Returns the `Duration` as a formatted string + pub fn as_temporal_string(&self, options: ToStringRoundingOptions) -> TemporalResult { + if options.smallest_unit == Some(Unit::Hour) || options.smallest_unit == Some(Unit::Minute) + { + return Err(TemporalError::range().with_message( + "string rounding options cannot have hour or minute smallest unit.", + )); + } + + let resolved_options = options.resolve()?; + if resolved_options.smallest_unit == Unit::Nanosecond + && resolved_options.increment == RoundingIncrement::ONE + { + let duration = duration_to_formattable(self, resolved_options.precision)?; + return Ok(duration.to_string()); + } + + let rounding_options = ResolvedRoundingOptions::from_to_string_options(&resolved_options); + + // 12. Let largestUnit be DefaultTemporalLargestUnit(duration). + let largest = self.default_largest_unit(); + // 13. Let internalDuration be ToInternalDurationRecord(duration). + let internal_duration = self.to_internal_duration_record(); + // 14. Let timeDuration be ? RoundTimeDuration(internalDuration.[[Time]], precision.[[Increment]], precision.[[Unit]], roundingMode). + let time_duration = internal_duration + .normalized_time_duration() + .round(rounding_options)?; + // 15. Set internalDuration to CombineDateAndTimeDuration(internalDuration.[[Date]], timeDuration). + let internal_duration = + InternalDurationRecord::combine(internal_duration.date(), time_duration); + // 16. Let roundedLargestUnit be LargerOfTwoTemporalUnits(largestUnit, second). + let rounded_largest_unit = largest.max(Unit::Second); + + // 17. Let roundedDuration be ? TemporalDurationFromInternal(internalDuration, roundedLargestUnit). + let rounded = Self::from_internal(internal_duration, rounded_largest_unit)?; + + // 18. Return TemporalDurationToString(roundedDuration, precision.[[Precision]]). + Ok(duration_to_formattable(&rounded, resolved_options.precision)?.to_string()) + } +} + +pub fn duration_to_formattable( + duration: &Duration, + precision: Precision, +) -> TemporalResult { + let sign = duration.sign(); + let duration = duration.abs(); + let date = duration.years() + duration.months() + duration.weeks() + duration.days(); + let date = if date != 0 { + Some(FormattableDateDuration { + years: duration.years() as u32, + months: duration.months() as u32, + weeks: duration.weeks() as u32, + days: duration.days() as u64, + }) + } else { + None + }; + + let hours = duration.hours().abs(); + let minutes = duration.minutes().abs(); + + let time = TimeDuration::from_components( + 0, + 0, + duration.seconds(), + duration.milliseconds(), + duration.microseconds(), + duration.nanoseconds(), + ); + + let seconds = time.seconds().unsigned_abs(); + let subseconds = time.subseconds().unsigned_abs(); + + let time = Some(FormattableTimeDuration::Seconds( + hours as u64, + minutes as u64, + seconds, + Some(subseconds), + )); + + Ok(FormattableDuration { + precision, + sign, + date, + time, + }) +} + +// TODO: Update, optimize, and fix the below. is_valid_duration should probably be generic over a T. + +const TWO_POWER_FIFTY_THREE: i128 = 9_007_199_254_740_992; +const MAX_SAFE_NS_PRECISION: i128 = TWO_POWER_FIFTY_THREE * 1_000_000_000; + +// NOTE: Can FiniteF64 optimize the duration_validation +/// Utility function to check whether the `Duration` fields are valid. +#[inline] +#[must_use] +#[allow(clippy::too_many_arguments)] +pub(crate) fn is_valid_duration( + years: i64, + months: i64, + weeks: i64, + days: i64, + hours: i64, + minutes: i64, + seconds: i64, + milliseconds: i64, + microseconds: i128, + nanoseconds: i128, +) -> bool { + // 1. Let sign be ! DurationSign(years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds). + let set = [ + years, + months, + weeks, + days, + hours, + minutes, + seconds, + milliseconds, + microseconds.signum() as i64, + nanoseconds.signum() as i64, + ]; + let sign = duration_sign(&set); + // 2. For each value v of « years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds », do + for v in set { + // FiniteF64 must always be finite. + // a. If 𝔽(v) is not finite, return false. + // b. If v < 0 and sign > 0, return false. + if v < 0 && sign == Sign::Positive { + return false; + } + // c. If v > 0 and sign < 0, return false. + if v > 0 && sign == Sign::Negative { + return false; + } + } + // 3. If abs(years) ≥ 2**32, return false. + // n.b. u32::MAX is 2**32 - 1 + if years.saturating_abs() > u32::MAX as i64 { + return false; + }; + // 4. If abs(months) ≥ 2**32, return false. + if months.saturating_abs() > u32::MAX as i64 { + return false; + }; + // 5. If abs(weeks) ≥ 2**32, return false. + if weeks.saturating_abs() > u32::MAX as i64 { + return false; + }; + + // Work around https://github.com/boa-dev/temporal/issues/189 + // For the purpose of the validity check, we should normalize the i128 values + // to valid floating point values. This may round up! + // + // We only need to do this seconds and below, if any of the larger + // values are near MAX_SAFE_INTEGER then their seconds value will without question + // also be near MAX_SAFE_INTEGER. + let seconds = seconds as f64 as i64; + let milliseconds = milliseconds as f64 as i64; + let microseconds = microseconds as f64 as i128; + let nanoseconds = nanoseconds as f64 as i128; + + // 6. Let normalizedSeconds be days × 86,400 + hours × 3600 + minutes × 60 + seconds + // + ℝ(𝔽(milliseconds)) × 10**-3 + ℝ(𝔽(microseconds)) × 10**-6 + ℝ(𝔽(nanoseconds)) × 10**-9. + // 7. NOTE: The above step cannot be implemented directly using floating-point arithmetic. + // Multiplying by 10**-3, 10**-6, and 10**-9 respectively may be imprecise when milliseconds, + // microseconds, or nanoseconds is an unsafe integer. This multiplication can be implemented + // in C++ with an implementation of core::remquo() with sufficient bits in the quotient. + // String manipulation will also give an exact result, since the multiplication is by a power of 10. + // Seconds part + // TODO: Fix the below parts after clarification around behavior. + let normalized_nanoseconds = (days as i128 * NS_PER_DAY as i128) + + (hours as i128) * 3_600_000_000_000 + + minutes as i128 * 60_000_000_000 + + seconds as i128 * 1_000_000_000; + // Subseconds part + let normalized_subseconds_parts = (milliseconds as i128).saturating_mul(1_000_000) + + microseconds.saturating_mul(1_000) + + nanoseconds; + + let total_normalized_seconds = + normalized_nanoseconds.saturating_add(normalized_subseconds_parts); + // 8. If abs(normalizedSeconds) ≥ 2**53, return false. + if total_normalized_seconds.saturating_abs() >= MAX_SAFE_NS_PRECISION { + return false; + } + + // 9. Return true. + true +} + +/// Utility function for determining the sign for the current set of `Duration` fields. +/// +/// Equivalent: 7.5.10 `DurationSign ( years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds )` +#[inline] +#[must_use] +pub(crate) fn duration_sign(set: &[i64]) -> Sign { + // 1. For each value v of « years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds », do + for v in set { + // a. If v < 0, return -1. + // b. If v > 0, return 1. + match (*v).cmp(&0) { + Ordering::Less => return Sign::Negative, + Ordering::Greater => return Sign::Positive, + _ => {} + } + } + // 2. Return 0. + Sign::Zero +} + +impl From for Duration { + fn from(value: DateDuration) -> Self { + Self { + sign: value.sign(), + years: value.years.unsigned_abs() as u32, + months: value.months.unsigned_abs() as u32, + weeks: value.weeks.unsigned_abs() as u32, + days: value.days.unsigned_abs(), + ..Default::default() + } + } +} + +// ==== FromStr trait impl ==== + +impl FromStr for Duration { + type Err = TemporalError; + + fn from_str(s: &str) -> Result { + Self::from_utf8(s.as_bytes()) + } +} diff --git a/deps/temporal/src/builtins/core/duration/date.rs b/deps/temporal/src/builtins/core/duration/date.rs new file mode 100644 index 00000000000000..273e2c1d2ee20a --- /dev/null +++ b/deps/temporal/src/builtins/core/duration/date.rs @@ -0,0 +1,182 @@ +//! Implementation of a `DateDuration` + +use crate::{ + iso::iso_date_to_epoch_days, options::Overflow, Duration, PlainDate, Sign, TemporalError, + TemporalResult, +}; + +use super::duration_sign; + +/// `DateDuration` represents the [date duration record][spec] of the `Duration.` +/// +/// These fields are laid out in the [Temporal Proposal][field spec] as 64-bit floating point numbers. +/// +/// [spec]: https://tc39.es/proposal-temporal/#sec-temporal-date-duration-records +/// [field spec]: https://tc39.es/proposal-temporal/#sec-properties-of-temporal-duration-instances +#[non_exhaustive] +#[derive(Debug, Default, Clone, Copy, PartialEq, PartialOrd)] +pub struct DateDuration { + /// `DateDuration`'s internal year value. + pub years: i64, + /// `DateDuration`'s internal month value. + pub months: i64, + /// `DateDuration`'s internal week value. + pub weeks: i64, + /// `DateDuration`'s internal day value. + pub days: i64, +} + +impl DateDuration { + /// Creates a new, non-validated `DateDuration`. + #[inline] + #[must_use] + pub(crate) const fn new_unchecked(years: i64, months: i64, weeks: i64, days: i64) -> Self { + Self { + years, + months, + weeks, + days, + } + } +} + +impl From for DateDuration { + /// Converts a `Duration` into a `DateDuration`. + /// + /// This conversion is lossy, as `Duration` can represent time durations + /// that are not strictly date durations. + #[inline] + fn from(duration: Duration) -> Self { + Self::new_unchecked( + duration.years(), + duration.months(), + duration.weeks(), + duration.days(), + ) + } +} + +impl From<&Duration> for DateDuration { + /// Converts a `Duration` into a `DateDuration`. + /// + /// This conversion is lossy, as `Duration` can represent time durations + /// that are not strictly date durations. + #[inline] + fn from(duration: &Duration) -> Self { + Self::new_unchecked( + duration.years(), + duration.months(), + duration.weeks(), + duration.days(), + ) + } +} + +impl DateDuration { + /// Creates a new `DateDuration` with provided values. + /// + /// `7.5.9 CreateDateDurationRecord ( years, months, weeks, days )` + /// + /// Spec: + // + // spec(2025-05-28): https://github.com/tc39/proposal-temporal/tree/69001e954c70e29ba3d2e6433bc7ece2a037377a + #[inline] + pub fn new(years: i64, months: i64, weeks: i64, days: i64) -> TemporalResult { + // 1. If IsValidDuration(years, months, weeks, days, 0, 0, 0, 0, 0, 0) is false, throw a RangeError exception. + if !super::is_valid_duration(years, months, weeks, days, 0, 0, 0, 0, 0, 0) { + return Err(TemporalError::range().with_message("Invalid DateDuration.")); + } + + // 2. Return Date Duration Record { [[Years]]: ℝ(𝔽(years)), [[Months]]: ℝ(𝔽(months)), [[Weeks]]: ℝ(𝔽(weeks)), [[Days]]: ℝ(𝔽(days)) }. + Ok(Self::new_unchecked(years, months, weeks, days)) + } + + /// Returns a negated `DateDuration`. + #[inline] + #[must_use] + pub fn negated(&self) -> Self { + Self { + years: self.years.saturating_neg(), + months: self.months.saturating_neg(), + weeks: self.weeks.saturating_neg(), + days: self.days.saturating_neg(), + } + } + + /// Returns a new `DateDuration` representing the absolute value of the current. + #[inline] + #[must_use] + pub fn abs(&self) -> Self { + Self { + years: self.years.abs(), + months: self.months.abs(), + weeks: self.weeks.abs(), + days: self.days.abs(), + } + } + + /// Returns the sign for the current `DateDuration`. + #[inline] + #[must_use] + pub fn sign(&self) -> Sign { + duration_sign(&[self.years, self.months, self.weeks, self.days]) + } + + /// DateDurationDays + pub(crate) fn days(&self, relative_to: &PlainDate) -> TemporalResult { + // 1. Let yearsMonthsWeeksDuration be ! AdjustDateDurationRecord(dateDuration, 0). + let ymw_duration = self.adjust(0, None, None)?; + // 2. If DateDurationSign(yearsMonthsWeeksDuration) = 0, return dateDuration.[[Days]]. + if ymw_duration.sign() == Sign::Zero { + return Ok(self.days); + } + // 3. Let later be ? CalendarDateAdd(plainRelativeTo.[[Calendar]], plainRelativeTo.[[ISODate]], yearsMonthsWeeksDuration, constrain). + let later = relative_to.calendar().date_add( + &relative_to.iso, + &ymw_duration, + Overflow::Constrain, + )?; + // 4. Let epochDays1 be ISODateToEpochDays(plainRelativeTo.[[ISODate]].[[Year]], plainRelativeTo.[[ISODate]].[[Month]] - 1, plainRelativeTo.[[ISODate]].[[Day]]). + let epoch_days_1 = iso_date_to_epoch_days( + relative_to.iso_year(), + i32::from(relative_to.iso_month()), // this function takes 1 based month number + i32::from(relative_to.iso_day()), + ); + // 5. Let epochDays2 be ISODateToEpochDays(later.[[Year]], later.[[Month]] - 1, later.[[Day]]). + let epoch_days_2 = iso_date_to_epoch_days( + later.iso_year(), + i32::from(later.iso_month()), // this function takes 1 based month number + i32::from(later.iso_day()), + ); + // 6. Let yearsMonthsWeeksInDays be epochDays2 - epochDays1. + let ymd_in_days = epoch_days_2 - epoch_days_1; + // 7. Return dateDuration.[[Days]] + yearsMonthsWeeksInDays. + Ok(self.days + ymd_in_days) + } + + /// `7.5.10 AdjustDateDurationRecord ( dateDuration, days [ , weeks [ , months ] ] )` + /// + /// Spec: + // + // spec(2025-05-28): https://github.com/tc39/proposal-temporal/tree/69001e954c70e29ba3d2e6433bc7ece2a037377a + pub(crate) fn adjust( + &self, + days: i64, + weeks: Option, + months: Option, + ) -> TemporalResult { + // 1. If weeks is not present, set weeks to dateDuration.[[Weeks]]. + let weeks = weeks.unwrap_or(self.weeks); + + // 2. If months is not present, set months to dateDuration.[[Months]]. + let months = months.unwrap_or(self.months); + + // 3. Return ? CreateDateDurationRecord(dateDuration.[[Years]], months, weeks, days). + Ok(Self { + years: self.years, + months, + weeks, + days, + }) + } +} diff --git a/deps/temporal/src/builtins/core/duration/normalized.rs b/deps/temporal/src/builtins/core/duration/normalized.rs new file mode 100644 index 00000000000000..fcd2292425c195 --- /dev/null +++ b/deps/temporal/src/builtins/core/duration/normalized.rs @@ -0,0 +1,1058 @@ +//! This module implements the normalized `Duration` records. + +use core::{cmp, num::NonZeroU128, ops::Add}; + +use num_traits::AsPrimitive; + +use crate::{ + builtins::core::{time_zone::TimeZone, PlainDate, PlainDateTime}, + iso::{IsoDate, IsoDateTime}, + options::{ + Disambiguation, Overflow, ResolvedRoundingOptions, RoundingIncrement, RoundingMode, Unit, + UNIT_VALUE_TABLE, + }, + primitive::FiniteF64, + provider::TimeZoneProvider, + rounding::IncrementRounder, + Calendar, TemporalError, TemporalResult, TemporalUnwrap, NS_PER_DAY, NS_PER_DAY_NONZERO, +}; + +use super::{DateDuration, Duration, Sign}; + +const MAX_TIME_DURATION: i128 = 9_007_199_254_740_991_999_999_999; + +// Nanoseconds constants + +const NS_PER_DAY_128BIT: i128 = NS_PER_DAY as i128; +const NANOSECONDS_PER_MINUTE: i128 = 60 * 1_000_000_000; +const NANOSECONDS_PER_HOUR: i128 = 60 * NANOSECONDS_PER_MINUTE; + +// ==== TimeDuration ==== +// +// A time duration represented in pure nanoseconds. +// +// Invariants: +// +// nanoseconds.abs() <= MAX_TIME_DURATION + +/// A Normalized `TimeDuration` that represents the current `TimeDuration` in nanoseconds. +#[derive(Debug, Clone, Copy, Default, PartialEq, PartialOrd, Eq, Ord)] +pub(crate) struct TimeDuration(pub(crate) i128); + +impl TimeDuration { + /// Creates a `TimeDuration` from signed integer components. + /// This method preserves the sign of each component during the calculation. + pub(crate) fn from_components( + hours: i64, + minutes: i64, + seconds: i64, + milliseconds: i64, + microseconds: i128, + nanoseconds: i128, + ) -> Self { + let mut total_nanoseconds: i128 = 0; + + total_nanoseconds += i128::from(hours) * NANOSECONDS_PER_HOUR; + total_nanoseconds += i128::from(minutes) * NANOSECONDS_PER_MINUTE; + total_nanoseconds += i128::from(seconds) * 1_000_000_000; + total_nanoseconds += i128::from(milliseconds) * 1_000_000; + total_nanoseconds += microseconds * 1_000; + total_nanoseconds += nanoseconds; + + debug_assert!(total_nanoseconds.abs() <= MAX_TIME_DURATION); + Self(total_nanoseconds) + } + + /// Equivalent: 7.5.20 NormalizeTimeDuration ( hours, minutes, seconds, milliseconds, microseconds, nanoseconds ) + pub(crate) fn from_duration(duration: &Duration) -> Self { + // Note: Calculations must be done after casting to `i128` in order to preserve precision + let sign_multiplier = duration.sign().as_sign_multiplier() as i128; + let mut nanoseconds: i128 = + i128::from(duration.hours) * NANOSECONDS_PER_HOUR * sign_multiplier; + nanoseconds += i128::from(duration.minutes) * NANOSECONDS_PER_MINUTE * sign_multiplier; + nanoseconds += i128::from(duration.seconds) * 1_000_000_000 * sign_multiplier; + nanoseconds += i128::from(duration.milliseconds) * 1_000_000 * sign_multiplier; + nanoseconds += duration.microseconds as i128 * 1_000 * sign_multiplier; + nanoseconds += duration.nanoseconds as i128 * sign_multiplier; + // NOTE(nekevss): Is it worth returning a `RangeError` below. + debug_assert!(nanoseconds.abs() <= MAX_TIME_DURATION); + Self(nanoseconds) + } + + /// Equivalent to 7.5.27 TimeDurationFromEpochNanosecondsDifference ( one, two ) + pub(crate) fn from_nanosecond_difference(one: i128, two: i128) -> TemporalResult { + let result = one - two; + if result.abs() > MAX_TIME_DURATION { + return Err( + TemporalError::range().with_message("TimeDuration exceeds maxTimeDuration.") + ); + } + Ok(Self(result)) + } + + /// Equivalent: 7.5.23 Add24HourDaysToTimeDuration ( d, days ) + /// Add24HourDaysToTimeDuration?? + pub(crate) fn add_days(&self, days: i64) -> TemporalResult { + let result = self.0 + i128::from(days) * i128::from(NS_PER_DAY); + if result.abs() > MAX_TIME_DURATION { + return Err(TemporalError::range() + .with_message("SubtractTimeDuration exceeded a valid Duration range.")); + } + Ok(Self(result)) + } + + /// `Divide the NormalizedTimeDuraiton` by a divisor, truncating + /// the result + pub(crate) fn truncated_divide(&self, divisor: u64) -> i128 { + // TODO: Validate. + self.0 / i128::from(divisor) + } + + pub(crate) fn divide(&self, divisor: f64) -> f64 { + self.0 as f64 / divisor + } + + /// Equivalent: 7.5.31 TimeDurationSign ( d ) + #[inline] + #[must_use] + pub(crate) fn sign(&self) -> Sign { + Sign::from(self.0.cmp(&0) as i8) + } + + // NOTE(nekevss): non-euclid is required here for negative rounding. + /// Return the seconds value of the `TimeDuration`. + pub(crate) fn seconds(&self) -> i64 { + // SAFETY: See validate_second_cast test. + (self.0 / 1_000_000_000) as i64 + } + + // NOTE(nekevss): non-euclid is required here for negative rounding. + /// Returns the subsecond components of the `TimeDuration`. + pub(crate) fn subseconds(&self) -> i32 { + // SAFETY: Remainder is 10e9 which is in range of i32 + (self.0 % 1_000_000_000) as i32 + } + + fn negate(&self) -> Self { + Self(-self.0) + } + + pub(crate) fn checked_sub(&self, other: &Self) -> TemporalResult { + let result = self.0 - other.0; + if result.abs() > MAX_TIME_DURATION { + return Err(TemporalError::range() + .with_message("SubtractTimeDuration exceeded a valid TimeDuration range.")); + } + Ok(Self(result)) + } + + /// The equivalent of `RoundTimeDuration` abstract operation. + pub(crate) fn round(&self, options: ResolvedRoundingOptions) -> TemporalResult { + // a. Assert: The value in the "Category" column of the row of Table 22 whose "Singular" column contains unit, is time. + // b. Let divisor be the value in the "Length in Nanoseconds" column of the row of Table 22 whose "Singular" column contains unit. + let divisor = options.smallest_unit.as_nanoseconds().temporal_unwrap()?; + // c. Let total be DivideTimeDuration(norm, divisor). + let increment = options + .increment + .as_extended_increment() + .checked_mul(divisor) + .temporal_unwrap()?; + // d. Set norm to ? RoundTimeDurationToIncrement(norm, divisor × increment, roundingMode). + self.round_inner(increment, options.rounding_mode) + } + + /// Equivalent: 7.5.31 TotalTimeDuration ( timeDuration, unit ) + /// TODO Fix: Arithemtic on floating point numbers is not safe. According to NOTE 2 in the spec + pub(crate) fn total(&self, unit: Unit) -> TemporalResult { + let time_duration = self.0; + // 1. Let divisor be the value in the "Length in Nanoseconds" column of the row of Table 21 whose "Value" column contains unit. + let unit_nanoseconds = unit.as_nanoseconds().temporal_unwrap()?; + // 2. NOTE: The following step cannot be implemented directly using floating-point arithmetic when 𝔽(timeDuration) is not a safe integer. + // The division can be implemented in C++ with the __float128 type if the compiler supports it, or with software emulation such as in the SoftFP library. + // 3. Return timeDuration / divisor. + DurationTotal::new(time_duration, unit_nanoseconds.get() as u64).to_fractional_total() + } + + pub(crate) fn round_to_fractional_days( + &self, + increment: RoundingIncrement, + mode: RoundingMode, + ) -> TemporalResult { + let adjusted_increment = increment + .as_extended_increment() + .saturating_mul(NS_PER_DAY_NONZERO); + let rounded = + IncrementRounder::::from_signed_num(self.0, adjusted_increment)?.round(mode); + Ok((rounded / NS_PER_DAY_128BIT) as i64) + } + + /// Round the current `TimeDuration`. + pub(super) fn round_inner( + &self, + increment: NonZeroU128, + mode: RoundingMode, + ) -> TemporalResult { + let rounded = IncrementRounder::::from_signed_num(self.0, increment)?.round(mode); + if rounded.abs() > MAX_TIME_DURATION { + return Err( + TemporalError::range().with_message("TimeDuration exceeds maxTimeDuration.") + ); + } + Ok(Self(rounded)) + } + + pub(super) fn checked_add(&self, other: i128) -> TemporalResult { + let result = self.0 + other; + if result.abs() > MAX_TIME_DURATION { + return Err( + TemporalError::range().with_message("TimeDuration exceeds maxTimeDuration.") + ); + } + Ok(Self(result)) + } +} + +// NOTE(nekevss): As this `Add` impl is fallible. Maybe it would be best implemented as a method. +/// Equivalent: 7.5.22 AddTimeDuration ( one, two ) +impl Add for TimeDuration { + type Output = TemporalResult; + + fn add(self, rhs: Self) -> Self::Output { + let result = self.0 + rhs.0; + if result.abs() > MAX_TIME_DURATION { + return Err( + TemporalError::range().with_message("TimeDuration exceeds maxTimeDuration.") + ); + } + Ok(Self(result)) + } +} + +// Struct to handle division steps in `TotalTimeDuration` +struct DurationTotal { + quotient: i128, + remainder: i128, + unit_nanoseconds: u64, +} + +impl DurationTotal { + pub fn new(time_duration: i128, unit_nanoseconds: u64) -> Self { + let quotient = time_duration.div_euclid(unit_nanoseconds as i128); + let remainder = time_duration.rem_euclid(unit_nanoseconds as i128); + + Self { + quotient, + remainder, + unit_nanoseconds, + } + } + + pub(crate) fn to_fractional_total(&self) -> TemporalResult { + let fractional = FiniteF64::try_from(self.remainder)? + .checked_div(&FiniteF64::try_from(self.unit_nanoseconds)?)?; + FiniteF64::try_from(self.quotient)?.checked_add(&fractional) + } +} + +// ==== Internal Duration record ==== +// +// A record consisting of a DateDuration and TimeDuration +// + +/// An InternalDurationRecord is a duration record that contains +/// a `DateDuration` and `TimeDuration`. +#[derive(Debug, Default, Clone, Copy)] +pub struct InternalDurationRecord { + date: DateDuration, + norm: TimeDuration, +} + +impl InternalDurationRecord { + pub(crate) fn combine(date: DateDuration, norm: TimeDuration) -> Self { + // 1. Let dateSign be DateDurationSign(dateDuration). + // 2. Let timeSign be TimeDurationSign(timeDuration). + // 3. Assert: If dateSign ≠ 0 and timeSign ≠ 0, dateSign = timeSign. + // 4. Return Internal Duration Record { [[Date]]: dateDuration, [[Time]]: timeDuration }. + Self { date, norm } + } + + /// Creates a new `NormalizedDurationRecord`. + /// + /// Equivalent: `CreateNormalizedDurationRecord` & `CombineDateAndTimeDuration`. + pub(crate) fn new(date: DateDuration, norm: TimeDuration) -> TemporalResult { + if date.sign() != Sign::Zero && norm.sign() != Sign::Zero && date.sign() != norm.sign() { + return Err(TemporalError::range() + .with_message("DateDuration and TimeDuration must agree if both are not zero.")); + } + Ok(Self { date, norm }) + } + + /// Equivalent of `7.5.6 ToInternalDurationRecordWith24HourDays ( duration )` + /// + /// Spec: + pub(crate) fn from_duration_with_24_hour_days(duration: &Duration) -> TemporalResult { + // 1. Let timeDuration be TimeDurationFromComponents(duration.[[Hours]], duration.[[Minutes]], + // duration.[[Seconds]], duration.[[Milliseconds]], duration.[[Microseconds]], duration.[[Nanoseconds]]). + let normalized_time = TimeDuration::from_duration(duration); + // 2. Set timeDuration to ! Add24HourDaysToTimeDuration(timeDuration, duration.[[Days]]). + let normalized_time = normalized_time.add_days(duration.days())?; + // 3. Let dateDuration be ! CreateDateDurationRecord(duration.[[Years]], duration.[[Months]], duration.[[Weeks]], 0). + let date = + DateDuration::new_unchecked(duration.years(), duration.months(), duration.weeks(), 0); + // 4. Return CombineDateAndTimeDuration(dateDuration, timeDuration). + Self::new(date, normalized_time) + } + + /// Equivalent of [`7.5.7 ToDateDurationRecordWithoutTime ( duration )`][spec] + /// + /// [spec]: + /// + // spec(2025-06-23): https://github.com/tc39/proposal-temporal/tree/ed49b0b482981119c9b5e28b0686d877d4a9bae0 + #[allow(clippy::wrong_self_convention)] + pub(crate) fn to_date_duration_record_without_time(&self) -> TemporalResult { + // 1. Let internalDuration be ToInternalDurationRecordWith24HourDays(duration). + let internal_duration = self; + + // NOTE: days SHOULD be in range of an i64. + // MAX_TIME_DURATION / NS_PER_DAY <= i64::MAX + // 2. Let days be truncate(internalDuration.[[Time]] / nsPerDay). + let days = (internal_duration.normalized_time_duration().0 / i128::from(NS_PER_DAY)) as i64; + + // 3. Return ! CreateDateDurationRecord(internalDuration.[[Date]].[[Years]], internalDuration.[[Date]].[[Months]], internalDuration.[[Date]].[[Weeks]], days). + DateDuration::new( + internal_duration.date().years, + internal_duration.date().months, + internal_duration.date().weeks, + days, + ) + } + + pub(crate) fn from_date_duration(date: DateDuration) -> TemporalResult { + Self::new(date, TimeDuration::default()) + } + + pub(crate) fn date(&self) -> DateDuration { + self.date + } + + pub(crate) fn normalized_time_duration(&self) -> TimeDuration { + self.norm + } + + pub(crate) fn sign(&self) -> Sign { + let date_sign = self.date.sign(); + if date_sign == Sign::Zero { + self.norm.sign() + } else { + date_sign + } + } +} + +// ==== Nudge Duration Rounding Functions ==== + +// Below implements the nudge rounding functionality for Duration. +// +// Generally, this rounding is implemented on a NormalizedDurationRecord, +// which is the reason the functionality lives below. + +#[derive(Debug)] +struct NudgeRecord { + normalized: InternalDurationRecord, + total: Option, + nudge_epoch_ns: i128, + expanded: bool, +} + +impl InternalDurationRecord { + // TODO: Add assertion into impl. + // TODO: Add unit tests specifically for nudge_calendar_unit if possible. + fn nudge_calendar_unit( + &self, + sign: Sign, + dest_epoch_ns: i128, + dt: &PlainDateTime, + time_zone: Option<(&TimeZone, &impl TimeZoneProvider)>, // ??? + options: ResolvedRoundingOptions, + ) -> TemporalResult { + // NOTE: r2 may never be used...need to test. + let (r1, r2, start_duration, end_duration) = match options.smallest_unit { + // 1. If unit is "year", then + Unit::Year => { + // a. Let years be RoundNumberToIncrement(duration.[[Years]], increment, "trunc"). + let years = IncrementRounder::from_signed_num( + self.date().years, + options.increment.as_extended_increment(), + )? + .round(RoundingMode::Trunc); + // b. Let r1 be years. + let r1 = years; + // c. Let r2 be years + increment × sign. + let r2 = years + + i128::from(options.increment.get()) * i128::from(sign.as_sign_multiplier()); + // d. Let startDuration be ? CreateNormalizedDurationRecord(r1, 0, 0, 0, ZeroTimeDuration()). + // e. Let endDuration be ? CreateNormalizedDurationRecord(r2, 0, 0, 0, ZeroTimeDuration()). + ( + r1, + r2, + DateDuration::new( + i64::try_from(r1).map_err(|_| TemporalError::range())?, + 0, + 0, + 0, + )?, + DateDuration::new( + i64::try_from(r2).map_err(|_| TemporalError::range())?, + 0, + 0, + 0, + )?, + ) + } + // 2. Else if unit is "month", then + Unit::Month => { + // a. Let months be RoundNumberToIncrement(duration.[[Months]], increment, "trunc"). + let months = IncrementRounder::from_signed_num( + self.date().months, + options.increment.as_extended_increment(), + )? + .round(RoundingMode::Trunc); + // b. Let r1 be months. + let r1 = months; + // c. Let r2 be months + increment × sign. + let r2 = months + + i128::from(options.increment.get()) * i128::from(sign.as_sign_multiplier()); + // d. Let startDuration be ? CreateNormalizedDurationRecord(duration.[[Years]], r1, 0, 0, ZeroTimeDuration()). + // e. Let endDuration be ? CreateNormalizedDurationRecord(duration.[[Years]], r2, 0, 0, ZeroTimeDuration()). + ( + r1, + r2, + DateDuration::new( + self.date().years, + i64::try_from(r1).map_err(|_| TemporalError::range())?, + 0, + 0, + )?, + DateDuration::new( + self.date().years, + i64::try_from(r2).map_err(|_| TemporalError::range())?, + 0, + 0, + )?, + ) + } + // 3. Else if unit is "week", then + Unit::Week => { + // TODO: Reconcile potential overflow on years as i32. `ValidateDuration` + // requires years, months, weeks to be abs(x) <= 2^32. + // + // Do we even care? This needs tests, but even a truncated i32::MAX is still + // FAR TOO LARGE for adding to a duration and will throw at steps c-d. This + // is only really an issue, because we are trying to optimize out floating + // points, but it may really show that a Duration's max range is very very + // very big. Too big. To be tested and determined. + // + // In other words, our year range is roughly +/- 280_000? Let's add 2^32 to + // that. It won't overflow, right? + + // a. Let isoResult1 be BalanceISODate(dateTime.[[Year]] + duration.[[Years]], + // dateTime.[[Month]] + duration.[[Months]], dateTime.[[Day]]). + let iso_one = IsoDate::try_balance( + dt.iso_year() + self.date().years as i32, + i32::from(dt.iso_month()) + self.date().months as i32, + i64::from(dt.iso_day()), + )?; + + // b. Let isoResult2 be BalanceISODate(dateTime.[[Year]] + duration.[[Years]], dateTime.[[Month]] + + // duration.[[Months]], dateTime.[[Day]] + duration.[[Days]]). + let iso_two = IsoDate::try_balance( + dt.iso_year() + self.date().years as i32, + i32::from(dt.iso_month()) + self.date().months as i32, + i64::from(dt.iso_day()) + self.date().days, + )?; + + // c. Let weeksStart be ! CreateTemporalDate(isoResult1.[[Year]], isoResult1.[[Month]], isoResult1.[[Day]], + // calendarRec.[[Receiver]]). + let weeks_start = PlainDate::try_new( + iso_one.year, + iso_one.month, + iso_one.day, + dt.calendar().clone(), + )?; + + // d. Let weeksEnd be ! CreateTemporalDate(isoResult2.[[Year]], isoResult2.[[Month]], isoResult2.[[Day]], + // calendarRec.[[Receiver]]). + let weeks_end = PlainDate::try_new( + iso_two.year, + iso_two.month, + iso_two.day, + dt.calendar().clone(), + )?; + + // e. Let untilOptions be OrdinaryObjectCreate(null). + // f. Perform ! CreateDataPropertyOrThrow(untilOptions, "largestUnit", "week"). + // g. Let untilResult be ? DifferenceDate(calendarRec, weeksStart, weeksEnd, untilOptions). + + let until_result = weeks_start.internal_diff_date(&weeks_end, Unit::Week)?; + + // h. Let weeks be RoundNumberToIncrement(duration.[[Weeks]] + untilResult.[[Weeks]], increment, "trunc"). + let weeks = IncrementRounder::from_signed_num( + self.date().weeks + until_result.weeks(), + options.increment.as_extended_increment(), + )? + .round(RoundingMode::Trunc); + + // i. Let r1 be weeks. + let r1 = weeks; + // j. Let r2 be weeks + increment × sign. + let r2 = weeks + + i128::from(options.increment.get()) * i128::from(sign.as_sign_multiplier()); + // k. Let startDuration be ? CreateNormalizedDurationRecord(duration.[[Years]], duration.[[Months]], r1, 0, ZeroTimeDuration()). + // l. Let endDuration be ? CreateNormalizedDurationRecord(duration.[[Years]], duration.[[Months]], r2, 0, ZeroTimeDuration()). + ( + r1, + r2, + DateDuration::new( + self.date().years, + self.date().months, + i64::try_from(r1).map_err(|_| TemporalError::range())?, + 0, + )?, + DateDuration::new( + self.date().years, + self.date().months, + i64::try_from(r2).map_err(|_| TemporalError::range())?, + 0, + )?, + ) + } + Unit::Day => { + // 4. Else, + // a. Assert: unit is "day". + // b. Let days be RoundNumberToIncrement(duration.[[Days]], increment, "trunc"). + let days = IncrementRounder::from_signed_num( + self.date().days, + options.increment.as_extended_increment(), + )? + .round(RoundingMode::Trunc); + // c. Let r1 be days. + let r1 = days; + // d. Let r2 be days + increment × sign. + let r2 = days + + i128::from(options.increment.get()) * i128::from(sign.as_sign_multiplier()); + // e. Let startDuration be ? CreateNormalizedDurationRecord(duration.[[Years]], duration.[[Months]], duration.[[Weeks]], r1, ZeroTimeDuration()). + // f. Let endDuration be ? CreateNormalizedDurationRecord(duration.[[Years]], duration.[[Months]], duration.[[Weeks]], r2, ZeroTimeDuration()). + ( + r1, + r2, + DateDuration::new( + self.date().years, + self.date().months, + self.date().weeks, + i64::try_from(r1).map_err(|_| TemporalError::range())?, + )?, + DateDuration::new( + self.date().years, + self.date().months, + self.date().weeks, + i64::try_from(r2).map_err(|_| TemporalError::range())?, + )?, + ) + } + _ => { + debug_assert!( + false, + "Found unexpected unit {} in NudgeToCalendarUnit", + options.smallest_unit + ); + return Err(TemporalError::assert() + .with_message("NudgeCalendarUnit invoked with unexpected unit")); + } + }; + + // 7. Let start be ? CalendarDateAdd(calendar, isoDateTime.[[ISODate]], startDuration, constrain). + let start = dt + .calendar() + .date_add(&dt.iso.date, &start_duration, Overflow::Constrain)?; + // 8. Let end be ? CalendarDateAdd(calendar, isoDateTime.[[ISODate]], endDuration, constrain). + let end = dt + .calendar() + .date_add(&dt.iso.date, &end_duration, Overflow::Constrain)?; + // 9. Let startDateTime be CombineISODateAndTimeRecord(start, isoDateTime.[[Time]]). + let start = IsoDateTime::new_unchecked(start.iso, dt.iso.time); + // 10. Let endDateTime be CombineISODateAndTimeRecord(end, isoDateTime.[[Time]]). + let end = IsoDateTime::new_unchecked(end.iso, dt.iso.time); + + // 12. Else, + let (start_epoch_ns, end_epoch_ns) = if let Some((time_zone, provider)) = time_zone { + // a. Let startEpochNs be ? GetEpochNanosecondsFor(timeZone, startDateTime, compatible). + // b. Let endEpochNs be ? GetEpochNanosecondsFor(timeZone, endDateTime, compatible). + let start_epoch_ns = + time_zone.get_epoch_nanoseconds_for(start, Disambiguation::Compatible, provider)?; + let end_epoch_ns = + time_zone.get_epoch_nanoseconds_for(end, Disambiguation::Compatible, provider)?; + (start_epoch_ns.ns, end_epoch_ns.ns) + // 11. If timeZoneRec is unset, then + } else { + // a. Let startEpochNs be GetUTCEpochNanoseconds(start.[[Year]], start.[[Month]], start.[[Day]], start.[[Hour]], start.[[Minute]], start.[[Second]], start.[[Millisecond]], start.[[Microsecond]], start.[[Nanosecond]]). + // b. Let endEpochNs be GetUTCEpochNanoseconds(end.[[Year]], end.[[Month]], end.[[Day]], end.[[Hour]], end.[[Minute]], end.[[Second]], end.[[Millisecond]], end.[[Microsecond]], end.[[Nanosecond]]). + (start.as_nanoseconds(), end.as_nanoseconds()) + }; + + // TODO: look into handling asserts + // 13. If sign is 1, then + // a. Assert: startEpochNs ≤ destEpochNs ≤ endEpochNs. + // 14. Else, + // a. Assert: endEpochNs ≤ destEpochNs ≤ startEpochNs. + // 15. Assert: startEpochNs ≠ endEpochNs. + + // TODO: Don't use f64 below ... + // NOTE(nekevss): Step 12..13 could be problematic...need tests + // and verify, or completely change the approach involved. + // TODO(nekevss): Validate that the `f64` casts here are valid in all scenarios + // 16. Let progress be (destEpochNs - startEpochNs) / (endEpochNs - startEpochNs). + // 17. Let total be r1 + progress × increment × sign. + let progress = + (dest_epoch_ns - start_epoch_ns.0) as f64 / (end_epoch_ns.0 - start_epoch_ns.0) as f64; + let total = r1 as f64 + + progress * options.increment.get() as f64 * f64::from(sign.as_sign_multiplier()); + + // 14. NOTE: The above two steps cannot be implemented directly using floating-point arithmetic. + // This division can be implemented as if constructing Normalized Time Duration Records for the denominator + // and numerator of total and performing one division operation with a floating-point result. + // 15. Let roundedUnit be ApplyUnsignedRoundingMode(total, r1, r2, unsignedRoundingMode). + let rounded_unit = + IncrementRounder::from_signed_num(total, options.increment.as_extended_increment())? + .round(options.rounding_mode); + + // 16. If roundedUnit - total < 0, let roundedSign be -1; else let roundedSign be 1. + // 19. Return Duration Nudge Result Record { [[Duration]]: resultDuration, [[Total]]: total, [[NudgedEpochNs]]: nudgedEpochNs, [[DidExpandCalendarUnit]]: didExpandCalendarUnit }. + // 17. If roundedSign = sign, then + if rounded_unit == r2 { + // a. Let didExpandCalendarUnit be true. + // b. Let resultDuration be endDuration. + // c. Let nudgedEpochNs be endEpochNs. + Ok(NudgeRecord { + normalized: InternalDurationRecord::new(end_duration, TimeDuration::default())?, + total: Some(FiniteF64::try_from(total)?), + nudge_epoch_ns: end_epoch_ns.0, + expanded: true, + }) + // 18. Else, + } else { + // a. Let didExpandCalendarUnit be false. + // b. Let resultDuration be startDuration. + // c. Let nudgedEpochNs be startEpochNs. + Ok(NudgeRecord { + normalized: InternalDurationRecord::new(start_duration, TimeDuration::default())?, + total: Some(FiniteF64::try_from(total)?), + nudge_epoch_ns: start_epoch_ns.0, + expanded: false, + }) + } + } + + // TODO: Clean up + #[inline] + fn nudge_to_zoned_time( + &self, + sign: Sign, + dt: &PlainDateTime, + time_zone: &TimeZone, + options: ResolvedRoundingOptions, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + let d = self.date(); + // 1.Let start be ? CalendarDateAdd(calendar, isoDateTime.[[ISODate]], duration.[[Date]], constrain). + let start = dt + .calendar() + .date_add(&dt.iso.date, &d, Overflow::Constrain)?; + // 2. Let startDateTime be CombineISODateAndTimeRecord(start, isoDateTime.[[Time]]). + let start_dt = IsoDateTime::new_unchecked(start.iso, dt.iso.time); + + // 3. Let endDate be BalanceISODate(start.[[Year]], start.[[Month]], start.[[Day]] + sign). + let end_date = IsoDate::balance( + start.iso_year(), + start.iso_month().into(), + // Use sign_multiplier here, not sign as i8, since spec wants sign to be nonzero (0 => +1) + start.iso_day() as i32 + i32::from(sign.as_sign_multiplier()), + ); + + // 4. Let endDateTime be CombineISODateAndTimeRecord(endDate, isoDateTime.[[Time]]). + let end_dt = IsoDateTime::new_unchecked(end_date, dt.iso.time); + // 5. Let startEpochNs be ? GetEpochNanosecondsFor(timeZone, startDateTime, compatible). + let start = + time_zone.get_epoch_nanoseconds_for(start_dt, Disambiguation::Compatible, provider)?; + // 6. Let endEpochNs be ? GetEpochNanosecondsFor(timeZone, endDateTime, compatible). + let end = + time_zone.get_epoch_nanoseconds_for(end_dt, Disambiguation::Compatible, provider)?; + // 7. Let daySpan be TimeDurationFromEpochNanosecondsDifference(endEpochNs, startEpochNs). + let day_span = TimeDuration::from_nanosecond_difference(end.ns.0, start.ns.0)?; + // 8. Assert: TimeDurationSign(daySpan) = sign. + // 9. Let unitLength be the value in the "Length in Nanoseconds" column of the row of Table 21 whose "Value" column contains unit. + let unit_length = options.smallest_unit.as_nanoseconds().temporal_unwrap()?; + // 10. Let roundedTimeDuration be ? RoundTimeDurationToIncrement(duration.[[Time]], increment × unitLength, roundingMode). + let rounded_time = self.norm.round_inner( + unit_length + .checked_mul(options.increment.as_extended_increment()) + .temporal_unwrap()?, + options.rounding_mode, + )?; + // 11. Let beyondDaySpan be ! AddTimeDuration(roundedTimeDuration, -daySpan). + let beyond_day_span = rounded_time.checked_add(day_span.negate().0)?; + // 12. If TimeDurationSign(beyondDaySpan) ≠ -sign, then + let (expanded, day_delta, rounded_time, nudge_ns) = + if beyond_day_span.sign() != sign.negate() { + // a. Let didRoundBeyondDay be true. + // b. Let dayDelta be sign. + // c. Set roundedTimeDuration to ? RoundTimeDurationToIncrement(beyondDaySpan, increment × unitLength, roundingMode). + let rounded_time = beyond_day_span.round_inner( + unit_length + .checked_mul(options.increment.as_extended_increment()) + .temporal_unwrap()?, + options.rounding_mode, + )?; + // d. Let nudgedEpochNs be AddTimeDurationToEpochNanoseconds(roundedTimeDuration, endEpochNs). + let nudged_ns = rounded_time.checked_add(end.ns.0)?; + (true, sign as i8, rounded_time, nudged_ns) + // 13. Else, + } else { + // a. Let didRoundBeyondDay be false. + // b. Let dayDelta be 0. + // c. Let nudgedEpochNs be AddTimeDurationToEpochNanoseconds(roundedTimeDuration, startEpochNs). + let nudge_ns = rounded_time.checked_add(start.ns.0)?; + (false, 0, rounded_time, nudge_ns) + }; + // 14. Let dateDuration be ! AdjustDateDurationRecord(duration.[[Date]], duration.[[Date]].[[Days]] + dayDelta). + let date = DateDuration::new( + self.date.years, + self.date.months, + self.date.weeks, + self.date + .days + .checked_add(day_delta.into()) + .ok_or(TemporalError::range())?, + )?; + // 15. Let resultDuration be CombineDateAndTimeDuration(dateDuration, roundedTimeDuration). + let normalized = InternalDurationRecord::new(date, rounded_time)?; + // 16. Return Duration Nudge Result Record { [[Duration]]: resultDuration, [[NudgedEpochNs]]: nudgedEpochNs, [[DidExpandCalendarUnit]]: didRoundBeyondDay }. + Ok(NudgeRecord { + normalized, + nudge_epoch_ns: nudge_ns.0, + total: None, + expanded, + }) + } + + #[inline] + fn nudge_to_day_or_time( + &self, + dest_epoch_ns: i128, + options: ResolvedRoundingOptions, + ) -> TemporalResult { + // 1. Let timeDuration be ! Add24HourDaysToTimeDuration(duration.[[Time]], duration.[[Date]].[[Days]]). + let time_duration = self.normalized_time_duration().add_days(self.date().days)?; + // 2. Let unitLength be the value in the "Length in Nanoseconds" column of the row of Table 21 whose "Value" column contains smallestUnit. + let unit_length = options.smallest_unit.as_nanoseconds().temporal_unwrap()?; + // 3. Let roundedTime be ? RoundTimeDurationToIncrement(timeDuration, unitLength × increment, roundingMode). + let rounded_time = time_duration.round_inner( + unit_length + .checked_mul(options.increment.as_extended_increment()) + .temporal_unwrap()?, + options.rounding_mode, + )?; + + // 4. Let diffTime be ! AddTimeDuration(roundedTime, -timeDuration). + let diff_time = rounded_time.checked_sub(&time_duration)?; + + // 5. Let wholeDays be truncate(TotalTimeDuration(timeDuration, day)). + let whole_days = time_duration.truncated_divide(NS_PER_DAY) as i64; + + // 6. Let roundedWholeDays be truncate(TotalTimeDuration(roundedTime, day)). + let rounded_whole_days = rounded_time.truncated_divide(NS_PER_DAY) as i64; + // 7. Let dayDelta be roundedWholeDays - wholeDays. + let delta = rounded_whole_days - whole_days; + // 8. If dayDelta < 0, let dayDeltaSign be -1; else if dayDelta > 0, let dayDeltaSign be 1; else let dayDeltaSign be 0. + // 9. If dayDeltaSign = TimeDurationSign(timeDuration), let didExpandDays be true; else let didExpandDays be false. + let did_expand_days = delta.signum() as i8 == time_duration.sign() as i8; + // 10. Let nudgedEpochNs be AddTimeDurationToEpochNanoseconds(diffTime, destEpochNs). + let nudged_ns = diff_time.0 + dest_epoch_ns; + + // 11. Let days be 0. + let mut days = 0; + // 12. Let remainder be roundedTime. + let mut remainder = rounded_time; + // 13. If TemporalUnitCategory(largestUnit) is date, then + if options.largest_unit.is_date_unit() { + // a. Set days to roundedWholeDays. + days = rounded_whole_days; + // b. Set remainder to ! AddTimeDuration(roundedTime, TimeDurationFromComponents(-roundedWholeDays * HoursPerDay, 0, 0, 0, 0, 0)). + remainder = rounded_time.add(TimeDuration::from_components( + -rounded_whole_days * 24, + 0, + 0, + 0, + 0, + 0, + ))?; + } + + // 14. Let dateDuration be ! AdjustDateDurationRecord(duration.[[Date]], days). + let date_duration = self.date().adjust(days, None, None)?; + // 15. Let resultDuration be CombineDateAndTimeDuration(dateDuration, remainder). + let result_duration = Self::combine(date_duration, remainder); + // 16. Return Duration Nudge Result Record { [[Duration]]: resultDuration, [[NudgedEpochNs]]: nudgedEpochNs, [[DidExpandCalendarUnit]]: didExpandDays }. + Ok(NudgeRecord { + normalized: result_duration, + total: None, + nudge_epoch_ns: nudged_ns, + expanded: did_expand_days, + }) + } + + /// `7.5.36 BubbleRelativeDuration ( sign, duration, nudgedEpochNs, isoDateTime, timeZone, calendar, largestUnit, smallestUnit )` + /// + /// Spec: + // + // spec(2025-05-28): https://github.com/tc39/proposal-temporal/tree/69001e954c70e29ba3d2e6433bc7ece2a037377a + #[inline] + #[allow(clippy::too_many_arguments)] + fn bubble_relative_duration( + &self, + sign: Sign, + nudged_epoch_ns: i128, + iso_date_time: &IsoDateTime, + time_zone: Option<(&TimeZone, &impl TimeZoneProvider)>, + calendar: &Calendar, + largest_unit: Unit, + smallest_unit: Unit, + ) -> TemporalResult { + let mut duration = *self; + + // 1. If smallestUnit is largestUnit, return duration. + if smallest_unit == largest_unit { + return Ok(duration); + } + + // 2. Let largestUnitIndex be the ordinal index of the row of Table 21 whose "Value" column contains largestUnit. + let largest_unit_index = largest_unit.table_index()?; + + // 3. Let smallestUnitIndex be the ordinal index of the row of Table 21 whose "Value" column contains smallestUnit. + let smallest_unit_index = smallest_unit.table_index()?; + + // 4. Let unitIndex be smallestUnitIndex - 1. + // 5. Let done be false. + // 6. Repeat, while unitIndex ≥ largestUnitIndex and done is false, + // a. Let unit be the value in the "Value" column of Table 21 in the row whose ordinal index is unitIndex. + // The caller is able to set smallest_unit_index to `day` here, which would result in a backwards range get + // We clamp to handle that case + let clamped_upper_bound = cmp::max(smallest_unit_index, largest_unit_index); + let unit_values = UNIT_VALUE_TABLE + .get(largest_unit_index..clamped_upper_bound) + .temporal_unwrap()?; + for unit in unit_values.iter().rev().copied() { + // b. If unit is not week, or largestUnit is week, then + if unit != Unit::Week || largest_unit == Unit::Week { + let end_duration = match unit { + // i. If unit is year, then + Unit::Year => { + // 1. Let years be duration.[[Date]].[[Years]] + sign. + let years = self + .date() + .years + .checked_add(sign.as_sign_multiplier().into()) + .ok_or(TemporalError::range())?; + + // 2. Let endDuration be ? CreateDateDurationRecord(years, 0, 0, 0). + DateDuration::new(years, 0, 0, 0)? + } + // ii. Else if unit is month, then + Unit::Month => { + // 1. Let months be duration.[[Date]].[[Months]] + sign. + let months = self + .date() + .months + .checked_add(sign.as_sign_multiplier().into()) + .ok_or(TemporalError::range())?; + + // 2. Let endDuration be ? AdjustDateDurationRecord(duration.[[Date]], 0, 0, months). + duration.date().adjust(0, Some(0), Some(months))? + } + // iii. Else, + unit => { + // 1. Assert: unit is week. + debug_assert!(unit == Unit::Week); + + // 2. Let weeks be duration.[[Date]].[[Weeks]] + sign. + let weeks = self + .date() + .weeks + .checked_add(sign.as_sign_multiplier().into()) + .ok_or(TemporalError::range())?; + + // 3. Let endDuration be ? AdjustDateDurationRecord(duration.[[Date]], 0, weeks). + duration.date().adjust(0, Some(weeks), None)? + } + }; + + // iv. Let end be ? CalendarDateAdd(calendar, isoDateTime.[[ISODate]], endDuration, constrain). + let end = + calendar.date_add(&iso_date_time.date, &end_duration, Overflow::Constrain)?; + + // v. Let endDateTime be CombineISODateAndTimeRecord(end, isoDateTime.[[Time]]). + let end_date_time = IsoDateTime::new_unchecked(end.iso, iso_date_time.time); + + let end_epoch_ns = match time_zone { + // vi. If timeZone is unset, then + None => { + // 1. Let endEpochNs be GetUTCEpochNanoseconds(endDateTime). + end_date_time.as_nanoseconds() + } + // vii. Else, + Some((time_zone, time_zone_provider)) => { + // 1. Let endEpochNs be ? GetEpochNanosecondsFor(timeZone, endDateTime, compatible). + time_zone + .get_epoch_nanoseconds_for( + end_date_time, + Disambiguation::Compatible, + time_zone_provider, + )? + .ns + } + }; + + // viii. Let beyondEnd be nudgedEpochNs - endEpochNs. + let beyond_end = nudged_epoch_ns - end_epoch_ns.as_i128(); + + // ix. If beyondEnd < 0, let beyondEndSign be -1; else if beyondEnd > 0, let beyondEndSign be 1; else let beyondEndSign be 0. + let beyound_end_sign = beyond_end.signum(); + + // x. If beyondEndSign ≠ -sign, then + if beyound_end_sign != -i128::from(sign.as_sign_multiplier()) { + // 1. Set duration to CombineDateAndTimeDuration(endDuration, 0). + duration = InternalDurationRecord::from_date_duration(end_duration)?; + } else { + // 1. Set done to true. + break; + } + } + + // c. Set unitIndex to unitIndex - 1. + } + + // 7. Return duration. + Ok(duration) + } + + /// `7.5.37 RoundRelativeDuration ( duration, destEpochNs, isoDateTime, timeZone, calendar, largestUnit, increment, smallestUnit, roundingMode )` + /// + /// Spec: + // + // spec(2025-05-29): https://github.com/tc39/proposal-temporal/tree/c150e7135c56afc9114032e93b53ac49f980d254 + // + // TODO: Potentially revisit and optimize + #[inline] + pub(crate) fn round_relative_duration( + &self, + dest_epoch_ns: i128, + dt: &PlainDateTime, + time_zone: Option<(&TimeZone, &impl TimeZoneProvider)>, + options: ResolvedRoundingOptions, + ) -> TemporalResult { + let duration = *self; + + // 1. Let irregularLengthUnit be false. + // 2. If IsCalendarUnit(smallestUnit) is true, set irregularLengthUnit to true. + // 3. If timeZone is not unset and smallestUnit is day, set irregularLengthUnit to true. + let irregular_length_unit = options.smallest_unit.is_calendar_unit() + || (time_zone.is_some() && options.smallest_unit == Unit::Day); + + // 4. If InternalDurationSign(duration) < 0, let sign be -1; else let sign be 1. + let sign = duration.sign(); + + // 5. If irregularLengthUnit is true, then + let nudge_result = if irregular_length_unit { + // a. Let record be ? NudgeToCalendarUnit(sign, duration, destEpochNs, isoDateTime, timeZone, calendar, increment, smallestUnit, roundingMode). + // b. Let nudgeResult be record.[[NudgeResult]]. + duration.nudge_calendar_unit(sign, dest_epoch_ns, dt, time_zone, options)? + } else if let Some((time_zone, time_zone_provider)) = time_zone { + // 6. Else if timeZone is not unset, then + // a. Let nudgeResult be ? NudgeToZonedTime(sign, duration, isoDateTime, timeZone, calendar, increment, smallestUnit, roundingMode). + duration.nudge_to_zoned_time(sign, dt, time_zone, options, time_zone_provider)? + } else { + // 7. Else, + // a. Let nudgeResult be ? NudgeToDayOrTime(duration, destEpochNs, largestUnit, increment, smallestUnit, roundingMode). + duration.nudge_to_day_or_time(dest_epoch_ns, options)? + }; + + // 8. Set duration to nudgeResult.[[Duration]]. + let mut duration = nudge_result.normalized; + + // 9. If nudgeResult.[[DidExpandCalendarUnit]] is true and smallestUnit is not week, then + if nudge_result.expanded && options.smallest_unit != Unit::Week { + // a. Let startUnit be LargerOfTwoTemporalUnits(smallestUnit, day). + let start_unit = Unit::larger(options.smallest_unit, Unit::Day)?; + + // b. Set duration to ? BubbleRelativeDuration(sign, duration, nudgeResult.[[NudgedEpochNs]], isoDateTime, timeZone, calendar, largestUnit, startUnit). + duration = duration.bubble_relative_duration( + sign, + nudge_result.nudge_epoch_ns, + &dt.iso, + time_zone, + dt.calendar(), + options.largest_unit, + start_unit, + )?; + } + + // 10. Return duration. + Ok(duration) + } + + // 7.5.38 TotalRelativeDuration ( duration, destEpochNs, isoDateTime, timeZone, calendar, unit ) + pub(crate) fn total_relative_duration( + &self, + dest_epoch_ns: i128, + dt: &PlainDateTime, + time_zone: Option<(&TimeZone, &impl TimeZoneProvider)>, + unit: Unit, + ) -> TemporalResult { + // 1. If IsCalendarUnit(unit) is true, or timeZone is not unset and unit is day, then + if unit.is_calendar_unit() || (time_zone.is_some() && unit == Unit::Day) { + // a. Let sign be InternalDurationSign(duration). + let sign = self.sign(); + // b. Let record be ? NudgeToCalendarUnit(sign, duration, destEpochNs, isoDateTime, timeZone, calendar, 1, unit, trunc). + let record = self.nudge_calendar_unit( + sign, + dest_epoch_ns, + dt, + time_zone, + ResolvedRoundingOptions { + largest_unit: unit, + smallest_unit: unit, + increment: RoundingIncrement::default(), + rounding_mode: RoundingMode::Trunc, + }, + )?; + + // c. Return record.[[Total]]. + return record.total.temporal_unwrap(); + } + // 2. Let timeDuration be ! Add24HourDaysToTimeDuration(duration.[[Time]], duration.[[Date]].[[Days]]). + let time_duration = self + .normalized_time_duration() + .add_days(self.date().days.as_())?; + // Return TotalTimeDuration(timeDuration, unit). + time_duration.total(unit) + } +} + +mod tests { + #[test] + fn validate_seconds_cast() { + let max_seconds = super::MAX_TIME_DURATION.div_euclid(1_000_000_000); + assert!(max_seconds <= i64::MAX.into()) + } + + // TODO: test f64 cast. +} diff --git a/deps/temporal/src/builtins/core/duration/tests.rs b/deps/temporal/src/builtins/core/duration/tests.rs new file mode 100644 index 00000000000000..6ef0453e11792f --- /dev/null +++ b/deps/temporal/src/builtins/core/duration/tests.rs @@ -0,0 +1,420 @@ +use core::str::FromStr; + +use crate::{ + options::{RoundingIncrement, RoundingOptions, ToStringRoundingOptions, Unit}, + parsers::Precision, + partial::PartialDuration, + provider::NeverProvider, +}; + +use super::Duration; + +#[test] +fn partial_duration_empty() { + let err = Duration::from_partial_duration(PartialDuration::default()); + assert!(err.is_err()) +} + +#[test] +fn partial_duration_values() { + let mut partial = PartialDuration::default(); + let _ = partial.years.insert(20); + let result = Duration::from_partial_duration(partial).unwrap(); + assert_eq!(result.years(), 20); +} + +#[test] +fn default_duration_string() { + let duration = Duration::default(); + + let options = ToStringRoundingOptions { + precision: Precision::Auto, + smallest_unit: None, + rounding_mode: None, + }; + let result = duration.as_temporal_string(options).unwrap(); + assert_eq!(&result, "PT0S"); + + let options = ToStringRoundingOptions { + precision: Precision::Digit(0), + smallest_unit: None, + rounding_mode: None, + }; + let result = duration.as_temporal_string(options).unwrap(); + assert_eq!(&result, "PT0S"); + + let options = ToStringRoundingOptions { + precision: Precision::Digit(1), + smallest_unit: None, + rounding_mode: None, + }; + let result = duration.as_temporal_string(options).unwrap(); + assert_eq!(&result, "PT0.0S"); + + let options = ToStringRoundingOptions { + precision: Precision::Digit(3), + smallest_unit: None, + rounding_mode: None, + }; + let result = duration.as_temporal_string(options).unwrap(); + assert_eq!(&result, "PT0.000S"); +} + +#[test] +fn duration_to_string_auto_precision() { + let duration = Duration::new(1, 2, 3, 4, 5, 6, 7, 0, 0, 0).unwrap(); + let result = duration + .as_temporal_string(ToStringRoundingOptions::default()) + .unwrap(); + assert_eq!(&result, "P1Y2M3W4DT5H6M7S"); + + let duration = Duration::new(1, 2, 3, 4, 5, 6, 7, 987, 650, 0).unwrap(); + let result = duration + .as_temporal_string(ToStringRoundingOptions::default()) + .unwrap(); + assert_eq!(&result, "P1Y2M3W4DT5H6M7.98765S"); +} + +#[test] +fn empty_date_duration() { + let duration = Duration::from_partial_duration(PartialDuration { + hours: Some(1.into()), + ..Default::default() + }) + .unwrap(); + let result = duration + .as_temporal_string(ToStringRoundingOptions::default()) + .unwrap(); + assert_eq!(&result, "PT1H"); +} + +#[test] +fn negative_fields_to_string() { + let duration = Duration::from_partial_duration(PartialDuration { + years: Some(-1), + months: Some(-1), + weeks: Some(-1), + days: Some(-1), + hours: Some(-1), + minutes: Some(-1), + seconds: Some(-1), + milliseconds: Some(-1), + microseconds: Some(-1), + nanoseconds: Some(-1), + }) + .unwrap(); + let result = duration + .as_temporal_string(ToStringRoundingOptions::default()) + .unwrap(); + assert_eq!(&result, "-P1Y1M1W1DT1H1M1.001001001S"); + + let duration = Duration::from_partial_duration(PartialDuration { + milliseconds: Some(-250), + ..Default::default() + }) + .unwrap(); + let result = duration + .as_temporal_string(ToStringRoundingOptions::default()) + .unwrap(); + assert_eq!(&result, "-PT0.25S"); + + let duration = Duration::from_partial_duration(PartialDuration { + milliseconds: Some(-3500), + ..Default::default() + }) + .unwrap(); + let result = duration + .as_temporal_string(ToStringRoundingOptions::default()) + .unwrap(); + assert_eq!(&result, "-PT3.5S"); + + let duration = Duration::from_partial_duration(PartialDuration { + milliseconds: Some(-3500), + ..Default::default() + }) + .unwrap(); + let result = duration + .as_temporal_string(ToStringRoundingOptions::default()) + .unwrap(); + assert_eq!(&result, "-PT3.5S"); + + let duration = Duration::from_partial_duration(PartialDuration { + weeks: Some(-1), + days: Some(-1), + ..Default::default() + }) + .unwrap(); + let result = duration + .as_temporal_string(ToStringRoundingOptions::default()) + .unwrap(); + + assert_eq!(&result, "-P1W1D"); +} + +#[test] +fn preserve_precision_loss() { + const MAX_SAFE_INT: i64 = 9_007_199_254_740_991; + let duration = Duration::from_partial_duration(PartialDuration { + milliseconds: Some(MAX_SAFE_INT), + microseconds: Some(MAX_SAFE_INT as i128), + ..Default::default() + }) + .unwrap(); + let result = duration + .as_temporal_string(ToStringRoundingOptions::default()) + .unwrap(); + + assert_eq!(&result, "PT9016206453995.731991S"); +} + +#[test] +fn duration_from_str() { + let duration = Duration::from_str("PT0.999999999H").unwrap(); + assert_eq!(duration.minutes(), 59); + assert_eq!(duration.seconds(), 59); + assert_eq!(duration.milliseconds(), 999); + assert_eq!(duration.microseconds(), 996); + assert_eq!(duration.nanoseconds(), 400); + + let duration = Duration::from_str("PT0.000000011H").unwrap(); + assert_eq!(duration.minutes(), 0); + assert_eq!(duration.seconds(), 0); + assert_eq!(duration.milliseconds(), 0); + assert_eq!(duration.microseconds(), 39); + assert_eq!(duration.nanoseconds(), 600); + + let duration = Duration::from_str("PT0.999999999M").unwrap(); + assert_eq!(duration.seconds(), 59); + assert_eq!(duration.milliseconds(), 999); + assert_eq!(duration.microseconds(), 999); + assert_eq!(duration.nanoseconds(), 940); +} + +#[test] +fn duration_max_safe() { + const MAX_SAFE_INTEGER: i64 = 9007199254740991; + + // From test262 built-ins/Temporal/Duration/prototype/subtract/result-out-of-range-3.js + assert!(Duration::new(0, 0, 0, 0, 0, 0, 0, 0, 9_007_199_254_740_991_926_258, 0).is_err()); + + // https://github.com/tc39/proposal-temporal/issues/3106#issuecomment-2849349391 + let mut options = RoundingOptions { + increment: Some(RoundingIncrement::ONE), + largest_unit: Some(Unit::Nanosecond), + ..Default::default() + }; + let d = Duration::new( + 0, + 0, + 0, + 0, + 0, + 0, + /* s = */ MAX_SAFE_INTEGER, + 0, + 0, + /* ns = */ 463_129_087, + ) + .unwrap(); + let _ = d + .round_with_provider(options, None, &NeverProvider::default()) + .expect("Must successfully round"); + let d = Duration::new( + 0, + 0, + 0, + 0, + 0, + 0, + /* s = */ MAX_SAFE_INTEGER, + 0, + 0, + /* ns = */ 463_129_088, + ) + .unwrap(); + assert!(d + .round_with_provider(options, None, &NeverProvider::default()) + .is_err()); + + options.largest_unit = Some(Unit::Microsecond); + let _ = d + .round_with_provider(options, None, &NeverProvider::default()) + .expect("Must successfully round"); + let d = Duration::new( + 0, + 0, + 0, + 0, + 0, + 0, + /* s = */ MAX_SAFE_INTEGER, + 0, + /* mis = */ 475_712, + 0, + ) + .unwrap(); + assert!(d + .round_with_provider(options, None, &NeverProvider::default()) + .is_err()); + + options.largest_unit = Some(Unit::Millisecond); + let _ = d + .round_with_provider(options, None, &NeverProvider::default()) + .expect("Must successfully round"); +} + +// Temporal/Duration/max.js +#[test] +fn duration_max() { + let cases = [ + ( + Duration::new(0, 0, 0, 104249991374, 7, 36, 31, 999, 999, 999).unwrap(), + "max days", + 9007199254740991.999999999, + ), + ( + Duration::new(0, 0, 0, 0, 2501999792983, 36, 31, 999, 999, 999).unwrap(), + "max hours", + 9007199254740991.999999999, + ), + ( + Duration::new(0, 0, 0, 0, 0, 150119987579016, 31, 999, 999, 999).unwrap(), + "max minutes", + 9007199254740991.999999999, + ), + ( + Duration::new(0, 0, 0, 0, 0, 0, 9007199254740991, 999, 999, 999).unwrap(), + "max seconds", + 9007199254740991.999999999, + ), + ( + Duration::new(0, 0, 0, -104249991374, -7, -36, -31, -999, -999, -999).unwrap(), + "min days", + -9007199254740991.999999999, + ), + ( + Duration::new(0, 0, 0, 0, -2501999792983, -36, -31, -999, -999, -999).unwrap(), + "min hours", + -9007199254740991.999999999, + ), + ( + Duration::new(0, 0, 0, 0, 0, -150119987579016, -31, -999, -999, -999).unwrap(), + "min minutes", + -9007199254740991.999999999, + ), + ( + Duration::new(0, 0, 0, 0, 0, 0, -9007199254740991, -999, -999, -999).unwrap(), + "min seconds", + -9007199254740991.999999999, + ), + ]; + + for (duration, description, result) in cases { + assert_eq!( + duration + .total_with_provider(Unit::Second, None, &NeverProvider::default()) + .unwrap() + .0, + result, + "{description}" + ); + } +} + +#[test] +fn duration_round_negative() { + let duration = Duration::new(0, 0, 0, 0, -60, 0, 0, 0, 0, 0).unwrap(); + let result = duration + .round_with_provider( + RoundingOptions { + smallest_unit: Some(Unit::Day), + ..Default::default() + }, + None, + &NeverProvider::default(), + ) + .unwrap(); + assert_eq!(result.days(), -3); +} + +#[test] +#[cfg(feature = "compiled_data")] +fn test_duration_compare() { + use crate::builtins::FS_TZ_PROVIDER; + use crate::options::{OffsetDisambiguation, RelativeTo}; + use crate::ZonedDateTime; + use alloc::string::ToString; + // TODO(#199): Make this work with Windows + // This should also ideally use the compiled data APIs and live under builtins/compiled + if cfg!(not(windows)) { + let one = Duration::from_partial_duration(PartialDuration { + hours: Some(79), + minutes: Some(10), + ..Default::default() + }) + .unwrap(); + let two = Duration::from_partial_duration(PartialDuration { + days: Some(3), + hours: Some(7), + seconds: Some(630), + ..Default::default() + }) + .unwrap(); + let three = Duration::from_partial_duration(PartialDuration { + days: Some(3), + hours: Some(6), + minutes: Some(50), + ..Default::default() + }) + .unwrap(); + + let mut arr = [&one, &two, &three]; + arr.sort_by(|a, b| Duration::compare_with_provider(a, b, None, &*FS_TZ_PROVIDER).unwrap()); + assert_eq!( + arr.map(ToString::to_string), + [&three, &one, &two].map(ToString::to_string) + ); + + // Sorting relative to a date, taking DST changes into account: + let zdt = ZonedDateTime::from_utf8_with_provider( + b"2020-11-01T00:00-07:00[America/Los_Angeles]", + Default::default(), + OffsetDisambiguation::Reject, + &*FS_TZ_PROVIDER, + ) + .unwrap(); + arr.sort_by(|a, b| { + Duration::compare_with_provider( + a, + b, + Some(RelativeTo::ZonedDateTime(zdt.clone())), + &*FS_TZ_PROVIDER, + ) + .unwrap() + }); + assert_eq!( + arr.map(ToString::to_string), + [&one, &three, &two].map(ToString::to_string) + ) + } +} +/* +TODO: Uncomment + +The below test should fail, but currently doesn't. This has to do with weird +floating point math in IsValidDuration Step 6-8 that defers to C++ std::remquo + +Needs further clarification. + +#[test] +fn duration_round_out_of_range_norm_conversion() { + const MAX_SAFE_INT: i64 = 9_007_199_254_740_991; + let duration = Duration::new(0, 0, 0, 0, 0, 0, MAX_SAFE_INT, 0, 0, 999_999_999).unwrap(); + let err = duration.round_with_provider( RoundingOptions { + largest_unit: Some(Unit::Nanosecond), + increment: Some(RoundingIncrement::ONE), + ..Default::default() + }, None, &NeverProvider::default()); + assert!(err.is_err()) +} +*/ diff --git a/deps/temporal/src/builtins/core/instant.rs b/deps/temporal/src/builtins/core/instant.rs new file mode 100644 index 00000000000000..3a6a870791ad48 --- /dev/null +++ b/deps/temporal/src/builtins/core/instant.rs @@ -0,0 +1,834 @@ +//! An implementation of the Temporal Instant. + +use alloc::string::String; +use core::{num::NonZeroU128, str::FromStr}; + +use crate::{ + builtins::core::{zoned_date_time::nanoseconds_to_formattable_offset_minutes, Duration}, + error::ErrorMessage, + iso::IsoDateTime, + options::{ + DifferenceOperation, DifferenceSettings, DisplayOffset, ResolvedRoundingOptions, + RoundingOptions, ToStringRoundingOptions, Unit, UnitGroup, + }, + parsers::{parse_instant, IxdtfStringBuilder}, + provider::TimeZoneProvider, + rounding::IncrementRounder, + unix_time::EpochNanoseconds, + Calendar, TemporalError, TemporalResult, TemporalUnwrap, TimeZone, +}; + +use ixdtf::records::UtcOffsetRecordOrZ; +use num_traits::Euclid; +use writeable::Writeable; + +use super::{ + duration::normalized::{InternalDurationRecord, TimeDuration}, + DateDuration, ZonedDateTime, +}; + +pub(crate) const NANOSECONDS_PER_SECOND: i64 = 1_000_000_000; +const NANOSECONDS_PER_MINUTE: i64 = 60 * NANOSECONDS_PER_SECOND; +const NANOSECONDS_PER_HOUR: i64 = 60 * NANOSECONDS_PER_MINUTE; + +/// The native Rust implementation of `Temporal.Instant`. +/// +/// Represents a precise moment in time measured as nanoseconds since the Unix epoch +/// (1970-01-01T00:00:00\[UTC\]). An `Instant` provides a universal timestamp +/// that represents the same moment regardless of timezone or calendar system. +/// +/// Use `Instant` when you need to record exact moments in time, measure elapsed time, +/// or work with high-precision timestamps. Unlike `PlainDateTime`, an `Instant` +/// represents an absolute point on the timeline. +/// +/// ## Examples +/// +/// ### Creating instants +/// +/// ```rust +/// use temporal_rs::Instant; +/// +/// // From epoch nanoseconds (high-precision timestamps) +/// let precise_moment = Instant::try_new(1609459200000000000).unwrap(); +/// assert_eq!(precise_moment.epoch_milliseconds(), 1609459200000); +/// +/// // From epoch milliseconds (common in web applications) +/// let web_timestamp = Instant::from_epoch_milliseconds(1609459200000).unwrap(); +/// assert_eq!(web_timestamp.epoch_nanoseconds().as_i128(), 1609459200000000000); +/// ``` +/// +/// ### Parsing ISO 8601 instant strings +/// +/// ```rust +/// use temporal_rs::Instant; +/// use core::str::FromStr; +/// +/// // Parse ISO 8601 instant strings (must include timezone info) +/// let instant = Instant::from_str("2024-03-15T14:30:45.123Z").unwrap(); +/// assert_eq!(instant.epoch_milliseconds(), 1710513045123); +/// +/// // Parse instants with different timezone notations +/// let instant2 = Instant::from_str("2024-03-15T14:30:45.123+00:00").unwrap(); +/// let instant3 = Instant::from_str("2024-03-15T14:30:45.123-00:00").unwrap(); +/// assert_eq!(instant, instant2); +/// assert_eq!(instant2, instant3); +/// ``` +/// +/// ### Instant arithmetic +/// +/// ```rust +/// use temporal_rs::{Instant, Duration}; +/// use core::str::FromStr; +/// +/// let instant = Instant::try_new(1609459200000000000).unwrap(); // 2021-01-01T00:00:00Z +/// +/// // Add time duration (only time durations, not date durations) +/// let later = instant.add(&Duration::from_str("PT1H30M").unwrap()).unwrap(); +/// let expected_ns = 1609459200000000000 + (1 * 3600 + 30 * 60) * 1_000_000_000; +/// assert_eq!(later.epoch_nanoseconds().as_i128(), expected_ns); +/// +/// // Calculate difference between instants +/// let earlier = Instant::try_new(1609459200000000000 - 3600_000_000_000).unwrap(); +/// let duration = earlier.until(&instant, Default::default()).unwrap(); +/// assert_eq!(duration.seconds(), 3600); +/// ``` +/// +/// ### Instant precision and limits +/// +/// ```rust +/// use temporal_rs::Instant; +/// +/// // Instants have well-defined limits based on approximately 100 million days before/after Unix epoch +/// let max_ns = 8_640_000_000_000_000_000_000i128; // ~100M days * 24 * 60 * 60 * 1e9 +/// let min_ns = -max_ns; +/// +/// let max_instant = Instant::try_new(max_ns).unwrap(); +/// let min_instant = Instant::try_new(min_ns).unwrap(); +/// +/// // Values outside the range will fail +/// assert!(Instant::try_new(max_ns + 1).is_err()); +/// assert!(Instant::try_new(min_ns - 1).is_err()); +/// ``` +/// +/// ### Converting to ZonedDateTime (requires provider) +/// +/// ```rust,ignore +/// use temporal_rs::{Instant, TimeZone, Calendar}; +/// +/// let instant = Instant::try_new(1609459200000000000).unwrap(); +/// let timezone = TimeZone::try_from_str("America/New_York").unwrap(); +/// +/// // Convert to a zoned date-time for display in local time +/// let zdt = instant.to_zoned_date_time_iso(timezone); +/// assert_eq!(zdt.timezone().identifier(), "America/New_York"); +/// assert_eq!(zdt.calendar().identifier(), "iso8601"); +/// ``` +/// +/// ### Rounding instants +/// +/// ```rust +/// use temporal_rs::{Instant, options::{RoundingOptions, Unit}}; +/// +/// let instant = Instant::try_new(1609459245123456789).unwrap(); // some precise moment +/// +/// let mut opts = RoundingOptions::default(); +/// opts.smallest_unit = Some(Unit::Second); +/// let rounded = instant.round(opts).unwrap(); +/// +/// // Rounded to the nearest second +/// assert_eq!(rounded.epoch_nanoseconds().as_i128() % 1_000_000_000, 0); +/// ``` +/// +/// ## Reference +/// +/// For more information, see the [MDN documentation][mdn-instant]. +/// +/// [mdn-instant]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/Instant +#[non_exhaustive] +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +pub struct Instant(EpochNanoseconds); + +impl From for Instant { + fn from(value: EpochNanoseconds) -> Self { + Self(value) + } +} + +// ==== Private API ==== + +impl Instant { + /// Adds a `TimeDuration` to the current `Instant`. + /// + /// Temporal-Proposal equivalent: `AddInstant`. + pub(crate) fn add_to_instant(&self, duration: &TimeDuration) -> TemporalResult { + // 1. Let result be AddTimeDurationToEpochNanoseconds(timeDuration, epochNanoseconds). + let result = self.epoch_nanoseconds().0 + duration.0; + let ns = EpochNanoseconds::from(result); + // 2. If IsValidEpochNanoseconds(result) is false, throw a RangeError exception. + ns.check_validity()?; + // 3. Return result. + Ok(Self::from(ns)) + } + + /// 8.5.10 AddDurationToInstant ( operation, instant, temporalDurationLike ) + pub(crate) fn add_duration_to_instant(&self, duration: &Duration) -> TemporalResult { + // 3. Let largestUnit be DefaultTemporalLargestUnit(duration). + let largest_unit = duration.default_largest_unit(); + // 4. If TemporalUnitCategory(largestUnit) is date, throw a RangeError exception. + if largest_unit.is_date_unit() { + return Err(TemporalError::range().with_enum(ErrorMessage::LargestUnitCannotBeDateUnit)); + } + // 5. Let internalDuration be ToInternalDurationRecordWith24HourDays(duration). + let internal_duration = InternalDurationRecord::from_duration_with_24_hour_days(duration)?; + // 6. Let ns be ? AddInstant(instant.[[EpochNanoseconds]], internalDuration.[[Time]]). + // 7. Return ! CreateTemporalInstant(ns). + self.add_to_instant(&internal_duration.normalized_time_duration()) + } + + /// `temporal_rs` equivalent of `DifferenceInstant` + pub(crate) fn diff_instant_internal( + &self, + other: &Self, + resolved_options: ResolvedRoundingOptions, + ) -> TemporalResult { + let diff = TimeDuration::from_nanosecond_difference(other.as_i128(), self.as_i128())?; + let normalized_time = diff.round(resolved_options)?; + InternalDurationRecord::new(DateDuration::default(), normalized_time) + } + + // TODO: Add test for `diff_instant`. + // NOTE(nekevss): As the below is internal, op will be left as a boolean + // with a `since` op being true and `until` being false. + /// Internal operation to handle `since` and `until` difference ops. + pub(crate) fn diff_instant( + &self, + op: DifferenceOperation, + other: &Self, + options: DifferenceSettings, + ) -> TemporalResult { + // 1. If operation is since, let sign be -1. Otherwise, let sign be 1. + // 2. Set other to ? ToTemporalInstant(other). + // 3. Let resolvedOptions be ? SnapshotOwnProperties(? GetOptionsObject(options), null). + // 4. Let settings be ? GetDifferenceSettings(operation, resolvedOptions, time, « », "nanosecond", "second"). + let resolved_options = ResolvedRoundingOptions::from_diff_settings( + options, + op, + UnitGroup::Time, + Unit::Second, + Unit::Nanosecond, + )?; + + // Below are the steps from Difference Instant. + // 5. Let diffRecord be DifferenceInstant(instant.[[Nanoseconds]], other.[[Nanoseconds]], + // settings.[[RoundingIncrement]], settings.[[SmallestUnit]], settings.[[RoundingMode]]). + let internal_record = self.diff_instant_internal(other, resolved_options)?; + + let result = Duration::from_internal(internal_record, resolved_options.largest_unit)?; + + // 6. Let norm be diffRecord.[[TimeDuration]]. + // 7. Let result be ! BalanceTimeDuration(norm, settings.[[LargestUnit]]). + // 8. Return ! CreateTemporalDuration(0, 0, 0, 0, sign × result.[[Hours]], sign × result.[[Minutes]], sign × result.[[Seconds]], sign × result.[[Milliseconds]], sign × result.[[Microseconds]], sign × result.[[Nanoseconds]]). + match op { + DifferenceOperation::Until => Ok(result), + DifferenceOperation::Since => Ok(result.negated()), + } + } + + /// Rounds a current `Instant` given the resolved options, returning a `BigInt` result. + pub(crate) fn round_instant( + &self, + resolved_options: ResolvedRoundingOptions, + ) -> TemporalResult { + let increment = resolved_options.increment.as_extended_increment(); + let increment = match resolved_options.smallest_unit { + Unit::Hour => increment + .checked_mul(NonZeroU128::new(NANOSECONDS_PER_HOUR as u128).temporal_unwrap()?), + Unit::Minute => increment + .checked_mul(NonZeroU128::new(NANOSECONDS_PER_MINUTE as u128).temporal_unwrap()?), + Unit::Second => increment + .checked_mul(NonZeroU128::new(NANOSECONDS_PER_SECOND as u128).temporal_unwrap()?), + Unit::Millisecond => { + increment.checked_mul(NonZeroU128::new(1_000_000).temporal_unwrap()?) + } + Unit::Microsecond => increment.checked_mul(NonZeroU128::new(1_000).temporal_unwrap()?), + Unit::Nanosecond => Some(increment), + _ => { + return Err(TemporalError::range() + .with_message("Invalid unit provided for Instant::round.")) + } + }; + + // NOTE: Potentially remove the below and just `temporal_unwrap` + let Some(increment) = increment else { + return Err(TemporalError::range().with_message("Increment exceeded a valid range.")); + }; + + let rounded = IncrementRounder::::from_signed_num(self.as_i128(), increment)? + .round_as_if_positive(resolved_options.rounding_mode); + + Ok(rounded) + } + + // Utility for converting `Instant` to `i128`. + pub fn as_i128(&self) -> i128 { + self.epoch_nanoseconds().0 + } +} + +// ==== Public API ==== + +impl Instant { + /// Create a new validated `Instant`. + #[inline] + pub fn try_new(nanoseconds: i128) -> TemporalResult { + let ns = EpochNanoseconds::from(nanoseconds); + ns.check_validity()?; + Ok(Self::from(ns)) + } + + /// Creates a new `Instant` from the provided Epoch millisecond value. + pub fn from_epoch_milliseconds(epoch_milliseconds: i64) -> TemporalResult { + // Input at most is `i64::MAX`. This means guarantees that the + // transition into nanoseconds MUST be in range of `i128` + let epoch_nanos = (epoch_milliseconds as i128) * 1_000_000; + Self::try_new(epoch_nanos) + } + + // Converts a UTF-8 encoded string into a `Instant`. + pub fn from_utf8(s: &[u8]) -> TemporalResult { + let ixdtf_record = parse_instant(s)?; + + // Find the offset + let ns_offset = match ixdtf_record.offset { + UtcOffsetRecordOrZ::Offset(offset) => { + let ns = offset + .fraction() + .and_then(|x| x.to_nanoseconds()) + .unwrap_or(0); + (offset.hour() as i64 * NANOSECONDS_PER_HOUR + + i64::from(offset.minute()) * NANOSECONDS_PER_MINUTE + + i64::from(offset.second().unwrap_or(0)) * NANOSECONDS_PER_SECOND + + i64::from(ns)) + * offset.sign() as i64 + } + UtcOffsetRecordOrZ::Z => 0, + }; + + let time_nanoseconds = ixdtf_record + .time + .fraction + .and_then(|x| x.to_nanoseconds()) + .unwrap_or(0); + let (millisecond, rem) = time_nanoseconds.div_rem_euclid(&1_000_000); + let (microsecond, nanosecond) = rem.div_rem_euclid(&1_000); + + let balanced = IsoDateTime::balance( + ixdtf_record.date.year, + ixdtf_record.date.month.into(), + ixdtf_record.date.day.into(), + ixdtf_record.time.hour.into(), + ixdtf_record.time.minute.into(), + ixdtf_record.time.second.clamp(0, 59).into(), + millisecond.into(), + microsecond.into(), + i128::from(nanosecond) - i128::from(ns_offset), + ); + + let nanoseconds = balanced.as_nanoseconds(); + + nanoseconds.check_validity()?; + + Ok(Self(nanoseconds)) + } + + /// Adds a `Duration` to the current `Instant`, returning an error if the `Duration` + /// contains a `DateDuration`. + #[inline] + pub fn add(&self, duration: &Duration) -> TemporalResult { + self.add_duration_to_instant(duration) + } + + /// Subtract a `Duration` to the current `Instant`, returning an error if the `Duration` + /// contains a `DateDuration`. + #[inline] + pub fn subtract(&self, duration: &Duration) -> TemporalResult { + self.add_duration_to_instant(&duration.negated()) + } + + /// Returns a `Duration` representing the duration since provided `Instant` + #[inline] + pub fn since(&self, other: &Self, settings: DifferenceSettings) -> TemporalResult { + self.diff_instant(DifferenceOperation::Since, other, settings) + } + + /// Returns a `Duration` representing the duration until provided `Instant` + #[inline] + pub fn until(&self, other: &Self, settings: DifferenceSettings) -> TemporalResult { + self.diff_instant(DifferenceOperation::Until, other, settings) + } + + /// Returns an `Instant` by rounding the current `Instant` according to the provided settings. + #[inline] + pub fn round(&self, options: RoundingOptions) -> TemporalResult { + let resolved_options = ResolvedRoundingOptions::from_instant_options(options)?; + + let round_result = self.round_instant(resolved_options)?; + Self::try_new(round_result) + } + + /// Returns the `epochMilliseconds` value for this `Instant`. + #[inline] + #[must_use] + pub fn epoch_milliseconds(&self) -> i64 { + self.as_i128().div_euclid(1_000_000) as i64 + } + + /// Returns the [`EpochNanoseconds`] value for this `Instant`. + #[inline] + #[must_use] + pub fn epoch_nanoseconds(&self) -> &EpochNanoseconds { + &self.0 + } + + /// Returns a [`ZonedDateTime`] for the current `Instant`. + #[inline] + pub fn to_zoned_date_time_iso_with_provider( + &self, + time_zone: TimeZone, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + ZonedDateTime::new_unchecked_with_provider(*self, time_zone, Calendar::ISO, provider) + } +} + +// ==== Instant Provider API ==== + +impl Instant { + /// Returns an RFC9557 IXDTF string representing the current `Instant`. + pub fn to_ixdtf_string_with_provider( + &self, + timezone: Option, + options: ToStringRoundingOptions, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + self.to_ixdtf_writeable_with_provider(timezone, options, provider) + .map(|x| x.write_to_string().into()) + } + + /// Returns a [`Writeable`] for formatting the current `Instant` in RFC9557's IXDTF. + pub fn to_ixdtf_writeable_with_provider( + &self, + timezone: Option, + options: ToStringRoundingOptions, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + let resolved_options = options.resolve()?; + let round = self.round_instant(ResolvedRoundingOptions::from_to_string_options( + &resolved_options, + ))?; + let rounded_instant = Instant::try_new(round)?; + + let mut ixdtf = IxdtfStringBuilder::default(); + let datetime = if let Some(timezone) = timezone { + let datetime = timezone.get_iso_datetime_for(&rounded_instant, provider)?; + let nanoseconds = timezone.get_offset_nanos_for(rounded_instant.as_i128(), provider)?; + let (sign, hour, minute) = nanoseconds_to_formattable_offset_minutes(nanoseconds)?; + ixdtf = ixdtf.with_minute_offset(sign, hour, minute, DisplayOffset::Auto); + datetime + } else { + ixdtf = ixdtf.with_z(DisplayOffset::Auto); + TimeZone::utc_with_provider(provider) + .get_iso_datetime_for(&rounded_instant, provider)? + }; + let builder = ixdtf + .with_date(datetime.date) + .with_time(datetime.time, resolved_options.precision); + + Ok(builder) + } +} + +// ==== Utility Functions ==== + +impl FromStr for Instant { + type Err = TemporalError; + + fn from_str(s: &str) -> Result { + Self::from_utf8(s.as_bytes()) + } +} + +// ==== Instant Tests ==== + +#[cfg(test)] +mod tests { + + use core::str::FromStr; + + use crate::{ + builtins::{core::Instant, duration::duration_sign}, + options::{DifferenceSettings, RoundingMode, Unit}, + partial::PartialDuration, + unix_time::EpochNanoseconds, + Duration, NS_MAX_INSTANT, NS_MIN_INSTANT, + }; + + #[test] + #[allow(clippy::float_cmp)] + fn max_and_minimum_instant_bounds() { + // This test is primarily to assert that the `expect` in the epoch methods is + // valid, i.e., a valid instant is within the range of an f64. + let max = NS_MAX_INSTANT; + let min = NS_MIN_INSTANT; + let max_instant = Instant::try_new(max).unwrap(); + let min_instant = Instant::try_new(min).unwrap(); + + assert_eq!(max_instant.epoch_nanoseconds().0, max); + assert_eq!(min_instant.epoch_nanoseconds().0, min); + + let max_plus_one = NS_MAX_INSTANT + 1; + let min_minus_one = NS_MIN_INSTANT - 1; + + assert!(Instant::try_new(max_plus_one).is_err()); + assert!(Instant::try_new(min_minus_one).is_err()); + } + + #[test] + fn max_min_epoch_millseconds() { + // Assert the casting is valid. + let max = NS_MAX_INSTANT; + let min = NS_MIN_INSTANT; + let max_instant = Instant::try_new(max).unwrap(); + let min_instant = Instant::try_new(min).unwrap(); + + // Assert max and min are valid for casting. + assert_eq!( + max_instant.epoch_milliseconds(), + max.div_euclid(1_000_000) as i64 + ); + assert_eq!( + min_instant.epoch_milliseconds(), + min.div_euclid(1_000_000) as i64 + ); + // Assert the max and min are not being truncated. + assert_ne!(max_instant.epoch_milliseconds(), i64::MAX); + assert_ne!(max_instant.epoch_milliseconds(), i64::MIN); + } + + #[test] + fn instant_parsing_limits() { + // valid cases + let valid_str = "-271821-04-20T00:00Z"; + let instant = Instant::from_str(valid_str).unwrap(); + assert_eq!( + instant, + Instant::from(EpochNanoseconds(-8640000000000000000000)) + ); + + let valid_str = "-271821-04-19T23:00-01:00"; + let instant = Instant::from_str(valid_str).unwrap(); + assert_eq!( + instant, + Instant::from(EpochNanoseconds(-8640000000000000000000)) + ); + + let valid_str = "-271821-04-19T00:00:00.000000001-23:59:59.999999999"; + let instant = Instant::from_str(valid_str).unwrap(); + assert_eq!( + instant, + Instant::from(EpochNanoseconds(-8640000000000000000000)) + ); + + let valid_str = "+275760-09-13T00:00Z"; + let instant = Instant::from_str(valid_str).unwrap(); + assert_eq!( + instant, + Instant::from(EpochNanoseconds(8640000000000000000000)) + ); + + // invalid cases + let invalid_str = "-271821-04-19T00:00Z"; + let instant = Instant::from_str(invalid_str); + assert!(instant.is_err()); + + let invalid_str = "-271821-04-19T23:59:59.999999999Z"; + let instant = Instant::from_str(invalid_str); + assert!(instant.is_err()); + + let invalid_str = "-271821-04-19T23:00-00:59:59.999999999"; + let instant = Instant::from_str(invalid_str); + assert!(instant.is_err()); + } + + #[test] + fn basic_instant_until() { + let init_diff_setting = |unit: Unit| -> DifferenceSettings { + DifferenceSettings { + largest_unit: Some(Unit::Hour), + rounding_mode: Some(RoundingMode::Ceil), + increment: None, + smallest_unit: Some(unit), + } + }; + + let assert_duration = |td: Duration, expected: (i64, i64, i64, i64, i128, i128)| { + assert_eq!( + td, + Duration { + sign: duration_sign(&[ + expected.0, + expected.1, + expected.2, + expected.3, + expected.4 as i64, + expected.5 as i64 + ]), + hours: expected.0.unsigned_abs(), + minutes: expected.1.unsigned_abs(), + seconds: expected.2.unsigned_abs(), + milliseconds: expected.3.unsigned_abs(), + microseconds: expected.4.unsigned_abs(), + nanoseconds: expected.5.unsigned_abs(), + ..Default::default() + } + ) + }; + + let earlier = Instant::try_new( + 217_178_610_123_456_789, /* 1976-11-18T15:23:30.123456789Z */ + ) + .unwrap(); + let later = Instant::try_new( + 1_572_345_998_271_986_289, /* 2019-10-29T10:46:38.271986289Z */ + ) + .unwrap(); + + let positive_result = earlier + .until(&later, init_diff_setting(Unit::Hour)) + .unwrap(); + assert_duration(positive_result, (376436, 0, 0, 0, 0, 0)); + let negative_result = later + .until(&earlier, init_diff_setting(Unit::Hour)) + .unwrap(); + assert_duration(negative_result, (-376435, 0, 0, 0, 0, 0)); + + let positive_result = earlier + .until(&later, init_diff_setting(Unit::Minute)) + .unwrap(); + assert_duration(positive_result, (376435, 24, 0, 0, 0, 0)); + let negative_result = later + .until(&earlier, init_diff_setting(Unit::Minute)) + .unwrap(); + assert_duration(negative_result, (-376435, -23, 0, 0, 0, 0)); + + // ... Skip to lower units ... + + let positive_result = earlier + .until(&later, init_diff_setting(Unit::Microsecond)) + .unwrap(); + assert_duration(positive_result, (376435, 23, 8, 148, 530, 0)); + let negative_result = later + .until(&earlier, init_diff_setting(Unit::Microsecond)) + .unwrap(); + assert_duration(negative_result, (-376435, -23, -8, -148, -529, 0)); + + let positive_result = earlier + .until(&later, init_diff_setting(Unit::Nanosecond)) + .unwrap(); + assert_duration(positive_result, (376435, 23, 8, 148, 529, 500)); + let negative_result = later + .until(&earlier, init_diff_setting(Unit::Nanosecond)) + .unwrap(); + assert_duration(negative_result, (-376435, -23, -8, -148, -529, -500)); + } + + #[test] + fn basic_instant_since() { + let init_diff_setting = |unit: Unit| -> DifferenceSettings { + DifferenceSettings { + largest_unit: Some(Unit::Hour), + rounding_mode: Some(RoundingMode::Ceil), + increment: None, + smallest_unit: Some(unit), + } + }; + + let assert_duration = |td: Duration, expected: (i64, i64, i64, i64, i128, i128)| { + assert_eq!( + td, + Duration { + sign: duration_sign(&[ + expected.0, + expected.1, + expected.2, + expected.3, + expected.4 as i64, + expected.5 as i64 + ]), + hours: expected.0.unsigned_abs(), + minutes: expected.1.unsigned_abs(), + seconds: expected.2.unsigned_abs(), + milliseconds: expected.3.unsigned_abs(), + microseconds: expected.4.unsigned_abs(), + nanoseconds: expected.5.unsigned_abs(), + ..Default::default() + } + ) + }; + + let earlier = Instant::try_new( + 217_178_610_123_456_789, /* 1976-11-18T15:23:30.123456789Z */ + ) + .unwrap(); + let later = Instant::try_new( + 1_572_345_998_271_986_289, /* 2019-10-29T10:46:38.271986289Z */ + ) + .unwrap(); + + let positive_result = later + .since(&earlier, init_diff_setting(Unit::Hour)) + .unwrap(); + assert_duration(positive_result, (376436, 0, 0, 0, 0, 0)); + let negative_result = earlier + .since(&later, init_diff_setting(Unit::Hour)) + .unwrap(); + assert_duration(negative_result, (-376435, 0, 0, 0, 0, 0)); + + let positive_result = later + .since(&earlier, init_diff_setting(Unit::Minute)) + .unwrap(); + assert_duration(positive_result, (376435, 24, 0, 0, 0, 0)); + let negative_result = earlier + .since(&later, init_diff_setting(Unit::Minute)) + .unwrap(); + assert_duration(negative_result, (-376435, -23, 0, 0, 0, 0)); + + // ... Skip to lower units ... + + let positive_result = later + .since(&earlier, init_diff_setting(Unit::Microsecond)) + .unwrap(); + assert_duration(positive_result, (376435, 23, 8, 148, 530, 0)); + let negative_result = earlier + .since(&later, init_diff_setting(Unit::Microsecond)) + .unwrap(); + assert_duration(negative_result, (-376435, -23, -8, -148, -529, 0)); + + let positive_result = later + .since(&earlier, init_diff_setting(Unit::Nanosecond)) + .unwrap(); + assert_duration(positive_result, (376435, 23, 8, 148, 529, 500)); + let negative_result = earlier + .since(&later, init_diff_setting(Unit::Nanosecond)) + .unwrap(); + assert_duration(negative_result, (-376435, -23, -8, -148, -529, -500)); + } + + // /test/built-ins/Temporal/Instant/prototype/add/cross-epoch.js + #[cfg(feature = "tzdb")] + #[test] + fn instant_add_across_epoch() { + use crate::builtins::core::Duration; + use crate::{ + options::ToStringRoundingOptions, partial::PartialDuration, tzdb::FsTzdbProvider, + }; + use core::str::FromStr; + + let instant = Instant::from_str("1969-12-25T12:23:45.678901234Z").unwrap(); + let one = instant + .subtract( + &Duration::from_partial_duration(PartialDuration { + hours: Some(240.into()), + nanoseconds: Some(800.into()), + ..Default::default() + }) + .unwrap(), + ) + .unwrap(); + let two = instant + .add( + &Duration::from_partial_duration(PartialDuration { + hours: Some(240.into()), + nanoseconds: Some(800.into()), + ..Default::default() + }) + .unwrap(), + ) + .unwrap(); + let three = two + .subtract( + &Duration::from_partial_duration(PartialDuration { + hours: Some(480.into()), + nanoseconds: Some(1600.into()), + ..Default::default() + }) + .unwrap(), + ) + .unwrap(); + let four = one + .add( + &Duration::from_partial_duration(PartialDuration { + hours: Some(480.into()), + nanoseconds: Some(1600.into()), + ..Default::default() + }) + .unwrap(), + ) + .unwrap(); + + let one_comp = Instant::from_str("1969-12-15T12:23:45.678900434Z").unwrap(); + let two_comp = Instant::from_str("1970-01-04T12:23:45.678902034Z").unwrap(); + + // Assert the comparisons all hold. + assert_eq!(one, one_comp); + assert_eq!(two, two_comp); + assert_eq!(three, one); + assert_eq!(four, two); + + // Assert the to_string is valid. + let provider = &FsTzdbProvider::default(); + let inst_string = instant + .to_ixdtf_string_with_provider(None, ToStringRoundingOptions::default(), provider) + .unwrap(); + let one_string = one + .to_ixdtf_string_with_provider(None, ToStringRoundingOptions::default(), provider) + .unwrap(); + let two_string = two + .to_ixdtf_string_with_provider(None, ToStringRoundingOptions::default(), provider) + .unwrap(); + + assert_eq!(&inst_string, "1969-12-25T12:23:45.678901234Z"); + assert_eq!(&one_string, "1969-12-15T12:23:45.678900434Z"); + assert_eq!(&two_string, "1970-01-04T12:23:45.678902034Z"); + } + + // Adapted from add[subtract]/minimum-maximum-instant.js + #[test] + fn instant_add_subtract_max_min() { + let min = Instant::try_new(-86_40000_00000_00000_00000).unwrap(); + let max = Instant::try_new(86_40000_00000_00000_00000).unwrap(); + + let zero = Duration::from_partial_duration(PartialDuration::default().with_nanoseconds(0)) + .unwrap(); + let one = Duration::from_partial_duration(PartialDuration::default().with_nanoseconds(1)) + .unwrap(); + let neg_one = + Duration::from_partial_duration(PartialDuration::default().with_nanoseconds(-1)) + .unwrap(); + // Adding/subtracting zero does not cross max/min boundary. + assert_eq!(min.add(&zero).unwrap(), min); + assert_eq!(min.subtract(&zero).unwrap(), min); + + // Addition or subtraction crosses boundary. + assert!(max.add(&one).is_err()); + assert!(max.subtract(&neg_one).is_err()); + assert!(min.add(&neg_one).is_err()); + assert!(min.subtract(&one).is_err()); + + let insanely_large_partial = + PartialDuration::default().with_nanoseconds(-86_40000_00000_00000_00000 * 2); + let large_duration = Duration::from_partial_duration(insanely_large_partial).unwrap(); + assert_eq!(min.subtract(&large_duration).unwrap(), max); + assert_eq!(max.add(&large_duration).unwrap(), min); + } +} diff --git a/deps/temporal/src/builtins/core/mod.rs b/deps/temporal/src/builtins/core/mod.rs new file mode 100644 index 00000000000000..39429d41038b1a --- /dev/null +++ b/deps/temporal/src/builtins/core/mod.rs @@ -0,0 +1,41 @@ +//! The primary date-time components provided by Temporal. +//! +//! The Temporal specification, along with this implementation aims to +//! provide full support for time zones and non-gregorian calendars that +//! are compliant with standards like ISO 8601, RFC 3339, and RFC 5545. + +// TODO: Expand upon above introduction. + +pub mod calendar; +pub mod duration; +pub mod time_zone; + +mod instant; +mod plain_date; +mod plain_date_time; +mod plain_month_day; +mod plain_time; +mod plain_year_month; +pub(crate) mod zoned_date_time; + +mod now; + +#[doc(inline)] +pub use now::Now; + +#[doc(inline)] +pub use duration::{DateDuration, Duration, PartialDuration}; +#[doc(inline)] +pub use instant::Instant; +#[doc(inline)] +pub use plain_date::{PartialDate, PlainDate}; +#[doc(inline)] +pub use plain_date_time::{DateTimeFields, PartialDateTime, PlainDateTime}; +#[doc(inline)] +pub use plain_month_day::PlainMonthDay; +#[doc(inline)] +pub use plain_time::{PartialTime, PlainTime}; +#[doc(inline)] +pub use plain_year_month::{PartialYearMonth, PlainYearMonth}; +#[doc(inline)] +pub use zoned_date_time::{PartialZonedDateTime, ZonedDateTime, ZonedDateTimeFields}; diff --git a/deps/temporal/src/builtins/core/now.rs b/deps/temporal/src/builtins/core/now.rs new file mode 100644 index 00000000000000..bc640f50f165ec --- /dev/null +++ b/deps/temporal/src/builtins/core/now.rs @@ -0,0 +1,224 @@ +//! The Temporal Now component + +use crate::iso::IsoDateTime; +use crate::TemporalResult; +use crate::{host::HostHooks, provider::TimeZoneProvider}; + +use super::{ + calendar::Calendar, time_zone::TimeZone, Instant, PlainDate, PlainDateTime, PlainTime, + ZonedDateTime, +}; + +pub struct Now { + host_hooks: H, +} + +impl Now { + /// Create a new `Now` + pub const fn new(host_hooks: H) -> Self { + Self { host_hooks } + } +} + +impl Now { + pub(crate) fn system_datetime_with_provider( + self, + time_zone: Option, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + let system_nanoseconds = self.host_hooks.get_system_epoch_nanoseconds()?; + let time_zone = time_zone.unwrap_or(self.host_hooks.get_system_time_zone(provider)?); + time_zone.get_iso_datetime_for(&Instant::from(system_nanoseconds), provider) + } + + /// Converts the current [`Now`] into a [`TimeZone`]. + pub fn time_zone_with_provider( + self, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + self.host_hooks.get_system_time_zone(provider) + } + + /// Converts the current [`Now`] into an [`Instant`]. + pub fn instant(self) -> TemporalResult { + Ok(Instant::from( + self.host_hooks.get_system_epoch_nanoseconds()?, + )) + } + + /// Converts the current [`Now`] into an [`ZonedDateTime`] with an ISO8601 calendar. + pub fn zoned_date_time_iso_with_provider( + self, + time_zone: Option, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + let system_nanoseconds = self.host_hooks.get_system_epoch_nanoseconds()?; + let time_zone = time_zone.unwrap_or(self.host_hooks.get_system_time_zone(provider)?); + let instant = Instant::from(system_nanoseconds); + ZonedDateTime::new_unchecked_with_provider(instant, time_zone, Calendar::ISO, provider) + } +} + +impl Now { + /// Converts `Now` into the current system [`PlainDateTime`] with an ISO8601 calendar. + /// + /// When `TimeZone` is `None`, the value will default to the + /// system time zone or UTC if the system zone is unavailable. + pub fn plain_date_time_iso_with_provider( + self, + time_zone: Option, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + let iso = self.system_datetime_with_provider(time_zone, provider)?; + Ok(PlainDateTime::new_unchecked(iso, Calendar::ISO)) + } + + /// Converts `Now` into the current system [`PlainDate`] with an ISO8601 calendar. + /// + /// When `TimeZone` is `None`, the value will default to the + /// system time zone or UTC if the system zone is unavailable. + pub fn plain_date_iso_with_provider( + self, + time_zone: Option, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + let iso = self.system_datetime_with_provider(time_zone, provider)?; + Ok(PlainDate::new_unchecked(iso.date, Calendar::ISO)) + } + + /// Converts `Now` into the current system [`PlainTime`]. + /// + /// When `TimeZone` is `None`, the value will default to the + /// system time zone or UTC if the system zone is unavailable. + pub fn plain_time_with_provider( + self, + time_zone: Option, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + let iso = self.system_datetime_with_provider(time_zone, provider)?; + Ok(PlainTime::new_unchecked(iso.time)) + } +} + +#[cfg(test)] +mod tests { + + #[cfg(feature = "tzdb")] + use crate::options::DifferenceSettings; + #[cfg(feature = "tzdb")] + use crate::unix_time::EpochNanoseconds; + + #[cfg(feature = "tzdb")] + #[test] + fn mocked_datetime() { + use timezone_provider::provider::TimeZoneProvider; + + use crate::{ + host::{HostClock, HostHooks, HostTimeZone}, + now::Now, + tzdb::FsTzdbProvider, + TemporalResult, TimeZone, + }; + let provider = FsTzdbProvider::default(); + + // Define mock test hooks + struct TestHooks { + seconds_to_add: i128, + time_zone: TimeZone, + } + + impl TestHooks { + fn new(seconds_to_add: i128, time_zone: TimeZone) -> Self { + Self { + seconds_to_add, + time_zone, + } + } + } + + impl HostHooks for TestHooks {} + + impl HostClock for TestHooks { + fn get_host_epoch_nanoseconds(&self) -> TemporalResult { + // 2025-03-11T10:47-06:00 + const TIME_BASE: i128 = 1_741_751_188_077_363_694; + let epoch_nanoseconds = TIME_BASE + (self.seconds_to_add * 1_000_000_000); + Ok(EpochNanoseconds::from(epoch_nanoseconds)) + } + } + + impl HostTimeZone for TestHooks { + fn get_host_time_zone(&self, _: &impl TimeZoneProvider) -> TemporalResult { + Ok(self.time_zone) + } + } + + // Define a UtcOffset zone + let cdt = TimeZone::try_from_identifier_str_with_provider("-05:00", &provider).unwrap(); + + // Define an IANA id zone + let uschi = + TimeZone::try_from_identifier_str_with_provider("America/Chicago", &provider).unwrap(); + + let now = Now::new(TestHooks::new(0, cdt)); + let cdt_datetime = now + .plain_date_time_iso_with_provider(None, &provider) + .unwrap(); + assert_eq!(cdt_datetime.year(), 2025); + assert_eq!(cdt_datetime.month(), 3); + assert_eq!(cdt_datetime.month_code().as_str(), "M03"); + assert_eq!(cdt_datetime.day(), 11); + assert_eq!(cdt_datetime.hour(), 22); + assert_eq!(cdt_datetime.minute(), 46); + assert_eq!(cdt_datetime.second(), 28); + assert_eq!(cdt_datetime.millisecond(), 77); + assert_eq!(cdt_datetime.microsecond(), 363); + assert_eq!(cdt_datetime.nanosecond(), 694); + + let now_cdt = Now::new(TestHooks::new(0, cdt)); + let uschi_datetime = now_cdt + .plain_date_time_iso_with_provider(Some(uschi), &provider) + .unwrap(); + assert_eq!(cdt_datetime, uschi_datetime); + + let plus_5_now = Now::new(TestHooks::new(5, cdt)); + let plus_5_pdt = plus_5_now + .plain_date_time_iso_with_provider(None, &provider) + .unwrap(); + assert_eq!(plus_5_pdt.second(), 33); + + let duration = cdt_datetime + .until(&plus_5_pdt, DifferenceSettings::default()) + .unwrap(); + assert_eq!(duration.hours(), 0); + assert_eq!(duration.minutes(), 0); + assert_eq!(duration.seconds(), 5); + assert_eq!(duration.milliseconds(), 0); + } + + #[cfg(all(feature = "tzdb", feature = "sys", feature = "compiled_data"))] + #[test] + fn now_datetime_test() { + use crate::Temporal; + use std::thread; + use std::time::Duration as StdDuration; + + let sleep = 2; + + let before = Temporal::now().plain_date_time_iso(None).unwrap(); + thread::sleep(StdDuration::from_secs(sleep)); + let after = Temporal::now().plain_date_time_iso(None).unwrap(); + + let diff = after.since(&before, DifferenceSettings::default()).unwrap(); + + let sleep_base = sleep as i64; + let tolerable_range = sleep_base..=sleep_base + 5; + + // We assert a tolerable range of sleep + 5 because std::thread::sleep + // is only guaranteed to be >= the value to sleep. So to prevent sporadic + // errors, we only assert a range. + assert!(tolerable_range.contains(&diff.seconds())); + assert_eq!(diff.hours(), 0); + assert_eq!(diff.minutes(), 0); + } +} diff --git a/deps/temporal/src/builtins/core/plain_date.rs b/deps/temporal/src/builtins/core/plain_date.rs new file mode 100644 index 00000000000000..90b5c4e4227bc1 --- /dev/null +++ b/deps/temporal/src/builtins/core/plain_date.rs @@ -0,0 +1,1044 @@ +//! This module implements `PlainDate` and any directly related algorithms. + +use crate::parsed_intermediates::ParsedDate; +use crate::{ + builtins::{ + calendar::{CalendarFields, YearMonthCalendarFields}, + core::{ + calendar::Calendar, duration::DateDuration, Duration, PlainDateTime, PlainTime, + ZonedDateTime, + }, + }, + iso::{IsoDate, IsoDateTime, IsoTime}, + options::{ + DifferenceOperation, DifferenceSettings, Disambiguation, DisplayCalendar, Overflow, + ResolvedRoundingOptions, Unit, UnitGroup, + }, + parsers::IxdtfStringBuilder, + provider::{NeverProvider, TimeZoneProvider}, + MonthCode, TemporalError, TemporalResult, TimeZone, +}; +use alloc::string::String; +use core::{cmp::Ordering, str::FromStr}; +use icu_calendar::AnyCalendarKind; +use writeable::Writeable; + +use super::{duration::normalized::InternalDurationRecord, PlainMonthDay, PlainYearMonth}; +use tinystr::TinyAsciiStr; + +// TODO (potentially): Bump era up to TinyAsciiStr<18> to accomodate +// "ethiopic-amete-alem". TODO: PrepareTemporalFields expects a type +// error to be thrown when all partial fields are None/undefined. +/// A partial PlainDate that may or may not be complete. +#[derive(Debug, Default, Clone, PartialEq)] +pub struct PartialDate { + /// The calendar fields representing a calendar date. + pub calendar_fields: CalendarFields, + /// The calendar of this `PartialDate` + pub calendar: Calendar, +} + +/// Convenience methods for building a `PartialDate` +impl PartialDate { + pub const fn new() -> Self { + Self { + calendar_fields: CalendarFields { + year: None, + month: None, + month_code: None, + day: None, + era: None, + era_year: None, + }, + calendar: Calendar::new(AnyCalendarKind::Iso), + } + } + + pub const fn with_era(mut self, era: Option>) -> Self { + self.calendar_fields.era = era; + self + } + + pub const fn with_era_year(mut self, era_year: Option) -> Self { + self.calendar_fields.era_year = era_year; + self + } + + pub const fn with_year(mut self, year: Option) -> Self { + self.calendar_fields.year = year; + self + } + + pub const fn with_month(mut self, month: Option) -> Self { + self.calendar_fields.month = month; + self + } + + pub const fn with_month_code(mut self, month_code: Option) -> Self { + self.calendar_fields.month_code = month_code; + self + } + + pub const fn with_day(mut self, day: Option) -> Self { + self.calendar_fields.day = day; + self + } + + pub const fn with_calendar(mut self, calendar: Calendar) -> Self { + self.calendar = calendar; + self + } +} + +/// The native Rust implementation of `Temporal.PlainDate`. +/// +/// Represents a calendar date without any time or timezone +/// information. Useful for dates where the specific time of day doesn't matter, +/// such as deadlines, birth dates, or historical events. +/// +/// Uses the ISO 8601 calendar (proleptic Gregorian calendar) by default, with +/// support for other calendar systems when needed. +/// +/// ## Examples +/// +/// ### Creating dates +/// +/// ```rust +/// use temporal_rs::{PlainDate, Calendar}; +/// +/// // Create a date using the ISO calendar +/// let christmas = PlainDate::try_new_iso(2024, 12, 25).unwrap(); +/// assert_eq!(christmas.year(), 2024); +/// assert_eq!(christmas.month(), 12); +/// assert_eq!(christmas.day(), 25); +/// +/// // Explicit calendar specification +/// let date = PlainDate::try_new(2024, 12, 25, Calendar::default()).unwrap(); +/// assert_eq!(date.year(), 2024); +/// assert_eq!(christmas, date); // Both represent the same date +/// ``` +/// +/// ### Date arithmetic operations +/// +/// ```rust +/// use temporal_rs::{PlainDate, Duration}; +/// use core::str::FromStr; +/// +/// let start = PlainDate::try_new_iso(2024, 1, 15).unwrap(); +/// +/// // Add one month +/// let later = start.add(&Duration::from_str("P1M").unwrap(), None).unwrap(); +/// assert_eq!(later.month(), 2); // Results in 2024-02-15 +/// assert_eq!(later.day(), 15); +/// +/// // Calculate duration between dates +/// let new_year = PlainDate::try_new_iso(2024, 1, 1).unwrap(); +/// let diff = new_year.until(&start, Default::default()).unwrap(); +/// assert_eq!(diff.days(), 14); +/// ``` +/// +/// ### Parsing ISO 8601 date strings +/// +/// ```rust +/// use temporal_rs::PlainDate; +/// use core::str::FromStr; +/// +/// // Standard ISO date format +/// let date = PlainDate::from_str("2024-03-15").unwrap(); +/// assert_eq!(date.year(), 2024); +/// assert_eq!(date.month(), 3); +/// assert_eq!(date.day(), 15); +/// +/// // With explicit calendar annotation +/// let date2 = PlainDate::from_str("2024-03-15[u-ca=iso8601]").unwrap(); +/// assert_eq!(date, date2); +/// ``` +/// +/// ## Reference +/// +/// For more information, see the [MDN documentation][mdn-plaindate]. +/// +/// [mdn-plaindate]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/PlainDate +#[non_exhaustive] +#[derive(Debug, Default, Clone, PartialEq, Eq)] +pub struct PlainDate { + pub(crate) iso: IsoDate, + calendar: Calendar, +} + +impl core::fmt::Display for PlainDate { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + f.write_str(&self.to_ixdtf_string(DisplayCalendar::Auto)) + } +} + +// ==== Private API ==== + +impl PlainDate { + /// Create a new `PlainDate` with the date values and calendar slot. + #[inline] + #[must_use] + pub(crate) fn new_unchecked(iso: IsoDate, calendar: Calendar) -> Self { + Self { iso, calendar } + } + + // Updated: 2025-08-03 + /// Returns the date after adding the given duration to date. + /// + /// 3.5.14 `AddDurationToDate` + /// + /// More information: + /// + /// - [AO specification](https://tc39.es/proposal-temporal/#sec-temporal-adddurationtodate) + #[inline] + pub(crate) fn add_duration_to_date( + &self, + duration: &Duration, + overflow: Option, + ) -> TemporalResult { + // 3. If operation is subtract, set duration to CreateNegatedTemporalDuration(duration). + // 4. Let dateDuration be ToDateDurationRecordWithoutTime(duration). + // TODO: Look into why this is fallible, and make some adjustments + let date_duration = duration.to_date_duration_record_without_time()?; + // 5. Let resolvedOptions be ? GetOptionsObject(options). + // 6. Let overflow be ? GetTemporalOverflowOption(resolvedOptions). + let overflow = overflow.unwrap_or(Overflow::Constrain); + // 7. Let result be ? CalendarDateAdd(calendar, temporalDate.[[ISODate]], dateDuration, overflow). + // 8. Return ! CreateTemporalDate(result, calendar). + self.calendar() + .date_add(&self.iso, &date_duration, overflow) + } + + /// Returns a duration representing the difference between the dates one and two. + /// + /// Temporal Equivalent: 3.5.6 `DifferenceDate ( calendar, one, two, options )` + #[inline] + pub(crate) fn internal_diff_date( + &self, + other: &Self, + largest_unit: Unit, + ) -> TemporalResult { + if self.iso.year == other.iso.year + && self.iso.month == other.iso.month + && self.iso.day == other.iso.day + { + return Ok(Duration::default()); + } + + if largest_unit == Unit::Day { + let days = self.days_until(other); + return Ok(Duration::from(DateDuration::new(0, 0, 0, days.into())?)); + } + + self.calendar() + .date_until(&self.iso, &other.iso, largest_unit) + } + + /// Equivalent: DifferenceTemporalPlainDate + pub(crate) fn diff_date( + &self, + op: DifferenceOperation, + other: &Self, + settings: DifferenceSettings, + ) -> TemporalResult { + // 1. If operation is SINCE, let sign be -1. Otherwise, let sign be 1. + // 2. Set other to ? ToTemporalDate(other). + + // 3. If ? CalendarEquals(temporalDate.[[Calendar]], other.[[Calendar]]) is false, throw a RangeError exception. + if self.calendar().identifier() != other.calendar().identifier() { + return Err(TemporalError::range() + .with_message("Calendars are for difference operation are not the same.")); + } + + // 4. Let resolvedOptions be ? SnapshotOwnProperties(? GetOptionsObject(options), null). + // 5. Let settings be ? GetDifferenceSettings(operation, resolvedOptions, DATE, « », "day", "day"). + let resolved = ResolvedRoundingOptions::from_diff_settings( + settings, + op, + UnitGroup::Date, + Unit::Day, + Unit::Day, + )?; + + // 6. If temporalDate.[[ISOYear]] = other.[[ISOYear]], and temporalDate.[[ISOMonth]] = other.[[ISOMonth]], + // and temporalDate.[[ISODay]] = other.[[ISODay]], then + if self.iso == other.iso { + // a. Return ! CreateTemporalDuration(0, 0, 0, 0, 0, 0, 0, 0, 0, 0). + return Ok(Duration::default()); + } + + // 7. Let calendarRec be ? CreateCalendarMethodsRecord(temporalDate.[[Calendar]], « DATE-ADD, DATE-UNTIL »). + // 8. Perform ! CreateDataPropertyOrThrow(resolvedOptions, "largestUnit", settings.[[LargestUnit]]). + // 9. Let result be ? DifferenceDate(calendarRec, temporalDate, other, resolvedOptions). + let result = self.internal_diff_date(other, resolved.largest_unit)?; + + // 10. Let duration be ! CreateNormalizedDurationRecord(result.[[Years]], result.[[Months]], result.[[Weeks]], result.[[Days]], ZeroTimeDuration()). + let mut duration = InternalDurationRecord::from_date_duration(result.date())?; + // 11. If settings.[[SmallestUnit]] is "day" and settings.[[RoundingIncrement]] = 1, let roundingGranularityIsNoop be true; else let roundingGranularityIsNoop be false. + let rounding_granularity_is_noop = + resolved.smallest_unit == Unit::Day && resolved.increment.get() == 1; + // 12. If roundingGranularityIsNoop is false, then + if !rounding_granularity_is_noop { + // a. Let destEpochNs be GetUTCEpochNanoseconds(other.[[ISOYear]], other.[[ISOMonth]], other.[[ISODay]], 0, 0, 0, 0, 0, 0). + let dest_epoch_ns = other.iso.as_nanoseconds(); + // b. Let dateTime be ISO Date-Time Record { [[Year]]: temporalDate.[[ISOYear]], [[Month]]: temporalDate.[[ISOMonth]], [[Day]]: temporalDate.[[ISODay]], [[Hour]]: 0, [[Minute]]: 0, [[Second]]: 0, [[Millisecond]]: 0, [[Microsecond]]: 0, [[Nanosecond]]: 0 }. + let dt = PlainDateTime::new_unchecked( + IsoDateTime::new_unchecked(self.iso, IsoTime::default()), + self.calendar.clone(), + ); + // c. Set duration to ? RoundRelativeDuration(duration, destEpochNs, dateTime, calendarRec, unset, settings.[[LargestUnit]], settings.[[RoundingIncrement]], settings.[[SmallestUnit]], settings.[[RoundingMode]]). + duration = duration.round_relative_duration( + dest_epoch_ns.0, + &dt, + Option::<(&TimeZone, &NeverProvider)>::None, + resolved, + )? + } + let result = Duration::from_internal(duration, Unit::Day)?; + // 13. Return ! CreateTemporalDuration(sign × duration.[[Years]], sign × duration.[[Months]], sign × duration.[[Weeks]], sign × duration.[[Days]], 0, 0, 0, 0, 0, 0). + match op { + DifferenceOperation::Until => Ok(result), + DifferenceOperation::Since => Ok(result.negated()), + } + } + + /// Abstract operation `DaysUntil` + /// + /// Calculates the epoch days between two `PlainDate`s + #[inline] + #[must_use] + fn days_until(&self, other: &Self) -> i32 { + // NOTE: cast to i32 is safe as both IsoDates must be in valid range. + debug_assert!(self.iso.check_within_limits().is_ok()); + debug_assert!(other.iso.check_within_limits().is_ok()); + (other.iso.to_epoch_days() - self.iso.to_epoch_days()) as i32 + } + + /// Returns this `PlainDate`'s ISO year value. + #[inline] + #[must_use] + pub(crate) const fn iso_year(&self) -> i32 { + self.iso.year + } + + /// Returns this `PlainDate`'s ISO month value. + #[inline] + #[must_use] + pub(crate) const fn iso_month(&self) -> u8 { + self.iso.month + } + + /// Returns this `PlainDate`'s ISO day value. + #[inline] + #[must_use] + pub(crate) const fn iso_day(&self) -> u8 { + self.iso.day + } +} + +// ==== Public API ==== + +impl PlainDate { + /// Creates a new `PlainDate` automatically constraining any values that may be invalid. + #[inline] + pub fn new(year: i32, month: u8, day: u8, calendar: Calendar) -> TemporalResult { + Self::new_with_overflow(year, month, day, calendar, Overflow::Constrain) + } + + /// Creates a new `PlainDate` with an ISO 8601 calendar automatically constraining any + /// values that may be invalid into a valid range. + #[inline] + pub fn new_iso(year: i32, month: u8, day: u8) -> TemporalResult { + Self::new(year, month, day, Calendar::default()) + } + + /// Creates a new `PlainDate` rejecting any date that may be invalid. + #[inline] + pub fn try_new(year: i32, month: u8, day: u8, calendar: Calendar) -> TemporalResult { + Self::new_with_overflow(year, month, day, calendar, Overflow::Reject) + } + + /// Creates a new `PlainDate` with an ISO 8601 calendar rejecting any date that may be invalid. + #[inline] + pub fn try_new_iso(year: i32, month: u8, day: u8) -> TemporalResult { + Self::try_new(year, month, day, Calendar::default()) + } + + /// Creates a new `PlainDate` with the specified overflow. + /// + /// This operation is the public facing API to Temporal's `RegulateIsoDate` + #[inline] + pub fn new_with_overflow( + year: i32, + month: u8, + day: u8, + calendar: Calendar, + overflow: Overflow, + ) -> TemporalResult { + let iso = IsoDate::new_with_overflow(year, month, day, overflow)?; + Ok(Self::new_unchecked(iso, calendar)) + } + + /// Create a `PlainDate` from a `PartialDate` + /// + /// ```rust + /// use temporal_rs::{PlainDate, fields::CalendarFields, Calendar, partial::PartialDate}; + /// + /// let partial = PartialDate { + /// calendar_fields: CalendarFields::new() + /// .with_year(2000) + /// .with_month(13) + /// .with_day(2), + /// calendar: Calendar::ISO, + /// }; + /// + /// let date = PlainDate::from_partial(partial, None).unwrap(); + /// + /// assert_eq!(date.year(), 2000); + /// assert_eq!(date.month(), 12); + /// assert_eq!(date.day(), 2); + /// assert_eq!(date.calendar().identifier(), "iso8601"); + /// + /// ``` + #[inline] + pub fn from_partial(partial: PartialDate, overflow: Option) -> TemporalResult { + let year_check = partial.calendar_fields.year.is_some() + || (partial.calendar_fields.era.is_some() + && partial.calendar_fields.era_year.is_some()); + let month_check = + partial.calendar_fields.month.is_some() || partial.calendar_fields.month_code.is_some(); + if !year_check || !month_check || partial.calendar_fields.day.is_none() { + return Err(TemporalError::r#type().with_message("Invalid PlainDate fields provided.")); + } + + let overflow = overflow.unwrap_or_default(); + partial + .calendar + .date_from_fields(partial.calendar_fields, overflow) + } + + /// Converts a UTF-8 encoded string into a `PlainDate`. + pub fn from_utf8(s: &[u8]) -> TemporalResult { + let parsed = ParsedDate::from_utf8(s)?; + + Self::from_parsed(parsed) + } + + /// Creates a `PlainDate` from a [`ParsedDate`]. + pub fn from_parsed(parsed: ParsedDate) -> TemporalResult { + Self::try_new( + parsed.record.year, + parsed.record.month, + parsed.record.day, + Calendar::new(parsed.calendar), + ) + } + + /// Creates a `PlainDate` with values from a [`PartialDate`]. + pub fn with(&self, fields: CalendarFields, overflow: Option) -> TemporalResult { + if fields.is_empty() { + return Err(TemporalError::r#type().with_message("CalendarFields must have a field.")); + } + // 6. Let fieldsResult be ? PrepareCalendarFieldsAndFieldNames(calendarRec, temporalDate, « "day", "month", "monthCode", "year" »). + // 7. Let partialDate be ? PrepareTemporalFields(temporalDateLike, fieldsResult.[[FieldNames]], partial). + // 8. Let fields be ? CalendarMergeFields(calendarRec, fieldsResult.[[Fields]], partialDate). + // 9. Set fields to ? PrepareTemporalFields(fields, fieldsResult.[[FieldNames]], «»). + // 10. Return ? CalendarDateFromFields(calendarRec, fields, resolvedOptions). + let overflow = overflow.unwrap_or(Overflow::Constrain); + self.calendar.date_from_fields( + fields.with_fallback_date(self, self.calendar.kind(), overflow)?, + overflow, + ) + } + + /// Creates a new `PlainDate` from the current `PlainDate` and the provided calendar. + pub fn with_calendar(&self, calendar: Calendar) -> Self { + Self::new_unchecked(self.iso, calendar) + } + + #[inline] + #[must_use] + /// Returns a reference to this `PlainDate`'s calendar slot. + pub fn calendar(&self) -> &Calendar { + &self.calendar + } + + /// 3.5.7 `IsValidISODate` + /// + /// Checks if the current date is a valid `ISODate`. + #[must_use] + pub fn is_valid(&self) -> bool { + self.iso.is_valid() + } + + /// Compares one `PlainDate` to another `PlainDate` using their + /// `IsoDate` representation. + /// + /// # Note on Ordering. + /// + /// `temporal_rs` does not implement `PartialOrd`/`Ord` as `PlainDate` does + /// not fulfill all the conditions required to implement the traits. However, + /// it is possible to compare `PlainDate`'s as their `IsoDate` representation. + #[inline] + #[must_use] + pub fn compare_iso(&self, other: &Self) -> Ordering { + self.iso.cmp(&other.iso) + } + + #[inline] + /// Adds a [`Duration`] to the current `PlainDate`. + pub fn add(&self, duration: &Duration, overflow: Option) -> TemporalResult { + self.add_duration_to_date(duration, overflow) + } + + #[inline] + /// Subtracts a [`Duration`] from the current `PlainDate`. + pub fn subtract( + &self, + duration: &Duration, + overflow: Option, + ) -> TemporalResult { + self.add_duration_to_date(&duration.negated(), overflow) + } + + #[inline] + /// Returns a [`Duration`] representing the time from this `PlainDate` until the other `PlainDate`. + pub fn until(&self, other: &Self, settings: DifferenceSettings) -> TemporalResult { + self.diff_date(DifferenceOperation::Until, other, settings) + } + + #[inline] + /// Returns a [`Duration`] representing the time passed from this `PlainDate` since the other `PlainDate`. + pub fn since(&self, other: &Self, settings: DifferenceSettings) -> TemporalResult { + self.diff_date(DifferenceOperation::Since, other, settings) + } +} + +// ==== Calendar-derived Public API ==== + +impl PlainDate { + /// Returns the calendar year value. + pub fn year(&self) -> i32 { + self.calendar.year(&self.iso) + } + + /// Returns the calendar month value. + pub fn month(&self) -> u8 { + self.calendar.month(&self.iso) + } + + /// Returns the calendar month code value. + pub fn month_code(&self) -> MonthCode { + self.calendar.month_code(&self.iso) + } + + /// Returns the calendar day value. + pub fn day(&self) -> u8 { + self.calendar.day(&self.iso) + } + + /// Returns the calendar day of week value. + pub fn day_of_week(&self) -> u16 { + self.calendar.day_of_week(&self.iso) + } + + /// Returns the calendar day of year value. + pub fn day_of_year(&self) -> u16 { + self.calendar.day_of_year(&self.iso) + } + + /// Returns the calendar week of year value. + pub fn week_of_year(&self) -> Option { + self.calendar.week_of_year(&self.iso) + } + + /// Returns the calendar year of week value. + pub fn year_of_week(&self) -> Option { + self.calendar.year_of_week(&self.iso) + } + + /// Returns the calendar days in week value. + pub fn days_in_week(&self) -> u16 { + self.calendar.days_in_week(&self.iso) + } + + /// Returns the calendar days in month value. + pub fn days_in_month(&self) -> u16 { + self.calendar.days_in_month(&self.iso) + } + + /// Returns the calendar days in year value. + pub fn days_in_year(&self) -> u16 { + self.calendar.days_in_year(&self.iso) + } + + /// Returns the calendar months in year value. + pub fn months_in_year(&self) -> u16 { + self.calendar.months_in_year(&self.iso) + } + + /// Returns whether the `PlainDate` is in a leap year for the given calendar. + pub fn in_leap_year(&self) -> bool { + self.calendar.in_leap_year(&self.iso) + } + + /// Returns the era current `PlainDate`. + pub fn era(&self) -> Option> { + self.calendar.era(&self.iso) + } + + /// Returns the era year for the current `PlainDate`. + pub fn era_year(&self) -> Option { + self.calendar.era_year(&self.iso) + } +} + +// ==== ToX Methods ==== + +impl PlainDate { + /// Converts the current `PlainDate` into a [`PlainDateTime`]. + /// + /// # Notes + /// + /// If no time is provided, then the time will default to midnight. + #[inline] + pub fn to_plain_date_time(&self, time: Option) -> TemporalResult { + let time = time.unwrap_or_default(); + let iso = IsoDateTime::new(self.iso, time.iso)?; + Ok(PlainDateTime::new_unchecked(iso, self.calendar().clone())) + } + + /// Converts the current `PlainDate` into a [`PlainYearMonth`]. + #[inline] + pub fn to_plain_year_month(&self) -> TemporalResult { + let era = self + .era() + .map(|e| { + TinyAsciiStr::<19>::try_from_utf8(e.as_bytes()) + .map_err(|_| TemporalError::general("Parsing era failed")) + }) + .transpose()?; + let fields = YearMonthCalendarFields::new() + .with_year(self.year()) + .with_era(era) + .with_era_year(self.era_year()) + .with_month(self.month()) + .with_month_code(self.month_code()); + self.calendar() + .year_month_from_fields(fields, Overflow::Constrain) + } + + /// Converts the current `PlainDate` into a [`PlainMonthDay`]. + #[inline] + pub fn to_plain_month_day(&self) -> TemporalResult { + let overflow = Overflow::Constrain; + self.calendar().month_day_from_fields( + CalendarFields::default().with_fallback_date(self, self.calendar.kind(), overflow)?, + overflow, + ) + } + + #[inline] + pub fn to_ixdtf_string(&self, display_calendar: DisplayCalendar) -> String { + self.to_ixdtf_writeable(display_calendar) + .write_to_string() + .into() + } + + #[inline] + pub fn to_ixdtf_writeable(&self, display_calendar: DisplayCalendar) -> impl Writeable + '_ { + IxdtfStringBuilder::default() + .with_date(self.iso) + .with_calendar(self.calendar.identifier(), display_calendar) + .build() + } + + /// Creates a [`ZonedDateTime`] from the current `PlainDate` with a provided [`TimeZone`] and + /// optional [`PlainTime`]. + #[inline] + pub fn to_zoned_date_time_with_provider( + &self, + time_zone: TimeZone, + plain_time: Option, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + // NOTE (nekevss): Steps 1-4 are engine specific + let epoch_ns = if let Some(time) = plain_time { + // 6. Else, + // a. Set temporalTime to ? ToTemporalTime(temporalTime). + // b. Let isoDateTime be CombineISODateAndTimeRecord(temporalDate.[[ISODate]], temporalTime.[[Time]]). + // c. If ISODateTimeWithinLimits(isoDateTime) is false, throw a RangeError exception. + let result_iso = IsoDateTime::new(self.iso, time.iso)?; + // d. Let epochNs be ? GetEpochNanosecondsFor(timeZone, isoDateTime, compatible). + time_zone.get_epoch_nanoseconds_for(result_iso, Disambiguation::Compatible, provider)? + // 5. If temporalTime is undefined, then + } else { + // a. Let epochNs be ? GetStartOfDay(timeZone, temporalDate.[[ISODate]]). + time_zone.get_start_of_day(&self.iso, provider)? + }; + // 7. Return ! CreateTemporalZonedDateTime(epochNs, timeZone, temporalDate.[[Calendar]]). + ZonedDateTime::try_new_with_cached_offset( + epoch_ns.ns.0, + time_zone, + self.calendar.clone(), + epoch_ns.offset, + ) + } +} + +// ==== Trait impls ==== + +impl From for PlainDate { + fn from(pdt: PlainDateTime) -> Self { + pdt.to_plain_date() + } +} + +impl FromStr for PlainDate { + type Err = TemporalError; + + fn from_str(s: &str) -> Result { + Self::from_utf8(s.as_bytes()) + } +} + +#[cfg(test)] +mod tests { + use tinystr::tinystr; + + use super::*; + + #[test] + fn new_date_limits() { + let err = PlainDate::try_new(-271_821, 4, 18, Calendar::default()); + assert!(err.is_err()); + let err = PlainDate::try_new(275_760, 9, 14, Calendar::default()); + assert!(err.is_err()); + let ok = PlainDate::try_new(-271_821, 4, 19, Calendar::default()); + assert_eq!( + ok, + Ok(PlainDate { + iso: IsoDate { + year: -271_821, + month: 4, + day: 19, + }, + calendar: Calendar::default(), + }) + ); + + let ok = PlainDate::try_new(275_760, 9, 13, Calendar::default()); + assert_eq!( + ok, + Ok(PlainDate { + iso: IsoDate { + year: 275760, + month: 9, + day: 13, + }, + calendar: Calendar::default(), + }) + ); + } + + #[test] + fn simple_date_add() { + let base = PlainDate::from_str("1976-11-18").unwrap(); + + // Test 1 + let result = base + .add(&Duration::from_str("P43Y").unwrap(), None) + .unwrap(); + assert_eq!( + result.iso, + IsoDate { + year: 2019, + month: 11, + day: 18, + } + ); + + // Test 2 + let result = base.add(&Duration::from_str("P3M").unwrap(), None).unwrap(); + assert_eq!( + result.iso, + IsoDate { + year: 1977, + month: 2, + day: 18, + } + ); + + // Test 3 + let result = base + .add(&Duration::from_str("P20D").unwrap(), None) + .unwrap(); + assert_eq!( + result.iso, + IsoDate { + year: 1976, + month: 12, + day: 8, + } + ) + } + + #[test] + fn date_add_limits() { + let max = PlainDate::try_new(275_760, 9, 13, Calendar::default()).unwrap(); + let result = max.add(&Duration::from_str("P1D").unwrap(), None); + assert!(result.is_err()); + + let max = PlainDate::try_new(275_760, 9, 12, Calendar::default()).unwrap(); + let result = max.add(&Duration::from_str("P1D").unwrap(), None); + assert_eq!( + result, + Ok(PlainDate { + iso: IsoDate { + year: 275760, + month: 9, + day: 13 + }, + calendar: Calendar::default(), + }) + ); + + let min = PlainDate::try_new(-271_821, 4, 19, Calendar::default()).unwrap(); + let result = min.add(&Duration::from_str("-P1D").unwrap(), None); + assert!(result.is_err()); + + let min = PlainDate::try_new(-271_821, 4, 20, Calendar::default()).unwrap(); + let result = min.add(&Duration::from_str("-P1D").unwrap(), None); + assert_eq!( + result, + Ok(PlainDate { + iso: IsoDate { + year: -271_821, + month: 4, + day: 19 + }, + calendar: Calendar::default(), + }) + ); + } + + #[test] + fn simple_date_subtract() { + let base = PlainDate::from_str("2019-11-18").unwrap(); + + // Test 1 + let result = base + .subtract(&Duration::from_str("P43Y").unwrap(), None) + .unwrap(); + assert_eq!( + result.iso, + IsoDate { + year: 1976, + month: 11, + day: 18, + } + ); + + // Test 2 + let result = base + .subtract(&Duration::from_str("P11M").unwrap(), None) + .unwrap(); + assert_eq!( + result.iso, + IsoDate { + year: 2018, + month: 12, + day: 18, + } + ); + + // Test 3 + let result = base + .subtract(&Duration::from_str("P20D").unwrap(), None) + .unwrap(); + assert_eq!( + result.iso, + IsoDate { + year: 2019, + month: 10, + day: 29, + } + ) + } + + #[test] + fn simple_date_until() { + let earlier = PlainDate::from_str("1969-07-24").unwrap(); + let later = PlainDate::from_str("1969-10-05").unwrap(); + let result = earlier + .until(&later, DifferenceSettings::default()) + .unwrap(); + assert_eq!(result.days(), 73,); + + let later = PlainDate::from_str("1996-03-03").unwrap(); + let result = earlier + .until(&later, DifferenceSettings::default()) + .unwrap(); + assert_eq!(result.days(), 9719,); + } + + #[test] + fn simple_date_since() { + let earlier = PlainDate::from_str("1969-07-24").unwrap(); + let later = PlainDate::from_str("1969-10-05").unwrap(); + let result = later + .since(&earlier, DifferenceSettings::default()) + .unwrap(); + assert_eq!(result.days(), 73,); + + let later = PlainDate::from_str("1996-03-03").unwrap(); + let result = later + .since(&earlier, DifferenceSettings::default()) + .unwrap(); + assert_eq!(result.days(), 9719,); + } + + #[test] + fn date_with_empty_error() { + let base = PlainDate::new(1976, 11, 18, Calendar::default()).unwrap(); + + let err = base.with(CalendarFields::default(), None); + assert!(err.is_err()); + } + + #[test] + fn basic_date_with() { + let base = PlainDate::new(1976, 11, 18, Calendar::default()).unwrap(); + + // Year + let fields = CalendarFields::new().with_year(2019); + let with_year = base.with(fields, None).unwrap(); + assert_eq!(with_year.year(), 2019); + assert_eq!(with_year.month(), 11); + assert_eq!(with_year.month_code(), MonthCode::from_str("M11").unwrap()); + assert_eq!(with_year.day(), 18); + + // Month + let fields = CalendarFields::new().with_month(5); + let with_month = base.with(fields, None).unwrap(); + assert_eq!(with_month.year(), 1976); + assert_eq!(with_month.month(), 5); + assert_eq!(with_month.month_code(), MonthCode::from_str("M05").unwrap()); + assert_eq!(with_month.day(), 18); + + // Month Code + let fields = CalendarFields::new().with_month_code(MonthCode(tinystr!(4, "M05"))); + let with_mc = base.with(fields, None).unwrap(); + assert_eq!(with_mc.year(), 1976); + assert_eq!(with_mc.month(), 5); + assert_eq!(with_mc.month_code(), MonthCode::from_str("M05").unwrap()); + assert_eq!(with_mc.day(), 18); + + // Day + let fields = CalendarFields::new().with_day(17); + let with_day = base.with(fields, None).unwrap(); + assert_eq!(with_day.year(), 1976); + assert_eq!(with_day.month(), 11); + assert_eq!(with_day.month_code(), MonthCode::from_str("M11").unwrap()); + assert_eq!(with_day.day(), 17); + } + + // test toZonedDateTime + #[cfg(feature = "tzdb")] + #[test] + fn to_zoned_date_time() { + use timezone_provider::tzif::FsTzdbProvider; + let provider = &FsTzdbProvider::default(); + let date = PlainDate::from_str("2020-01-01").unwrap(); + let time_zone = TimeZone::try_from_str_with_provider("UTC", provider).unwrap(); + let zdt = date + .to_zoned_date_time_with_provider(time_zone, None, provider) + .unwrap(); + assert_eq!(zdt.year(), 2020); + assert_eq!(zdt.month(), 1); + assert_eq!(zdt.day(), 1); + assert_eq!(zdt.hour(), 0); + assert_eq!(zdt.minute(), 0); + assert_eq!(zdt.second(), 0); + assert_eq!(zdt.millisecond(), 0); + assert_eq!(zdt.microsecond(), 0); + assert_eq!(zdt.nanosecond(), 0); + } + + #[cfg(feature = "tzdb")] + #[test] + fn to_zoned_date_time_error() { + use timezone_provider::tzif::FsTzdbProvider; + let provider = &FsTzdbProvider::default(); + let date = PlainDate::try_new_iso(-271_821, 4, 19).unwrap(); + let time_zone = TimeZone::try_from_str_with_provider("+00", provider).unwrap(); + let zdt = date.to_zoned_date_time_with_provider(time_zone, None, provider); + assert!(zdt.is_err()) + } + + // test262/test/built-ins/Temporal/Calendar/prototype/month/argument-string-invalid.js + #[test] + fn invalid_strings() { + const INVALID_STRINGS: [&str; 35] = [ + // invalid ISO strings: + "", + "invalid iso8601", + "2020-01-00", + "2020-01-32", + "2020-02-30", + "2021-02-29", + "2020-00-01", + "2020-13-01", + "2020-01-01T", + "2020-01-01T25:00:00", + "2020-01-01T01:60:00", + "2020-01-01T01:60:61", + "2020-01-01junk", + "2020-01-01T00:00:00junk", + "2020-01-01T00:00:00+00:00junk", + "2020-01-01T00:00:00+00:00[UTC]junk", + "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk", + "02020-01-01", + "2020-001-01", + "2020-01-001", + "2020-01-01T001", + "2020-01-01T01:001", + "2020-01-01T01:01:001", + // valid, but forms not supported in Temporal: + "2020-W01-1", + "2020-001", + "+0002020-01-01", + // valid, but this calendar must not exist: + "2020-01-01[u-ca=notexist]", + // may be valid in other contexts, but insufficient information for PlainDate: + "2020-01", + "+002020-01", + "01-01", + "2020-W01", + "P1Y", + "-P12Y", + // valid, but outside the supported range: + "-999999-01-01", + "+999999-01-01", + ]; + for s in INVALID_STRINGS { + assert!(PlainDate::from_str(s).is_err()) + } + } + + // test262/test/built-ins/Temporal/Calendar/prototype/day/argument-string-critical-unknown-annotation.js + #[test] + fn argument_string_critical_unknown_annotation() { + const INVALID_STRINGS: [&str; 6] = [ + "1970-01-01[!foo=bar]", + "1970-01-01T00:00[!foo=bar]", + "1970-01-01T00:00[UTC][!foo=bar]", + "1970-01-01T00:00[u-ca=iso8601][!foo=bar]", + "1970-01-01T00:00[UTC][!foo=bar][u-ca=iso8601]", + "1970-01-01T00:00[foo=bar][!_foo-bar0=Dont-Ignore-This-99999999999]", + ]; + for s in INVALID_STRINGS { + assert!(PlainDate::from_str(s).is_err()) + } + } +} diff --git a/deps/temporal/src/builtins/core/plain_date_time.rs b/deps/temporal/src/builtins/core/plain_date_time.rs new file mode 100644 index 00000000000000..77bdf1b31fd1f5 --- /dev/null +++ b/deps/temporal/src/builtins/core/plain_date_time.rs @@ -0,0 +1,1552 @@ +//! This module implements `PlainDateTime` any directly related algorithms. + +use super::{ + duration::normalized::InternalDurationRecord, Duration, PartialTime, PlainDate, PlainTime, + ZonedDateTime, +}; +use crate::parsed_intermediates::ParsedDateTime; +use crate::{ + builtins::{ + calendar::CalendarFields, + core::{calendar::Calendar, Instant}, + }, + iso::{IsoDate, IsoDateTime, IsoTime}, + options::{ + DifferenceOperation, DifferenceSettings, Disambiguation, DisplayCalendar, Overflow, + ResolvedRoundingOptions, RoundingOptions, ToStringRoundingOptions, Unit, UnitGroup, + }, + parsers::IxdtfStringBuilder, + primitive::FiniteF64, + provider::{NeverProvider, TimeZoneProvider}, + MonthCode, TemporalError, TemporalResult, TimeZone, +}; +use alloc::string::String; +use core::{cmp::Ordering, str::FromStr}; +use tinystr::TinyAsciiStr; +use writeable::Writeable; + +/// A partial PlainDateTime record +#[derive(Debug, Default, Clone)] +pub struct PartialDateTime { + /// The `PartialDate` portion of a `PartialDateTime` + pub fields: DateTimeFields, + /// The calendar of the `PartialDateTime`. + pub calendar: Calendar, +} + +#[derive(Debug, Default, Clone)] +pub struct DateTimeFields { + pub calendar_fields: CalendarFields, + pub time: PartialTime, +} + +impl DateTimeFields { + pub fn is_empty(&self) -> bool { + self.calendar_fields.is_empty() && self.time.is_empty() + } +} + +impl DateTimeFields { + pub const fn new() -> Self { + Self { + calendar_fields: CalendarFields::new(), + time: PartialTime::new(), + } + } + + pub const fn with_partial_date(mut self, fields: CalendarFields) -> Self { + self.calendar_fields = fields; + self + } + + pub const fn with_partial_time(mut self, partial_time: PartialTime) -> Self { + self.time = partial_time; + self + } +} + +/// The native Rust implementation of a Temporal `PlainDateTime`. +/// +/// Combines a date and time into a single value representing a specific moment +/// in calendar time, such as "2024-03-15T14:30:45". Unlike `Instant`, +/// a `PlainDateTime` does not include timezone information. +/// +/// Use `PlainDateTime` when you need to represent a specific date and time but +/// timezone handling is not required, or when working with local times that +/// don't need to be converted across timezones. +/// +/// ## Examples +/// +/// ### Creating date and time values +/// +/// ```rust +/// use temporal_rs::PlainDateTime; +/// use core::str::FromStr; +/// +/// // Create a specific date and time from IXDTF string +/// let meeting = PlainDateTime::from_str("2024-03-15T14:30:45.123456789").unwrap(); +/// assert_eq!(meeting.year(), 2024); +/// assert_eq!(meeting.hour(), 14); +/// assert_eq!(meeting.minute(), 30); +/// ``` +/// +/// ### Parsing ISO 8601 datetime strings +/// +/// ```rust +/// use temporal_rs::PlainDateTime; +/// use core::str::FromStr; +/// +/// let dt = PlainDateTime::from_str("2024-03-15T14:30:45.123456789").unwrap(); +/// assert_eq!(dt.year(), 2024); +/// assert_eq!(dt.month(), 3); +/// assert_eq!(dt.day(), 15); +/// assert_eq!(dt.hour(), 14); +/// assert_eq!(dt.minute(), 30); +/// assert_eq!(dt.second(), 45); +/// assert_eq!(dt.millisecond(), 123); +/// assert_eq!(dt.microsecond(), 456); +/// assert_eq!(dt.nanosecond(), 789); +/// ``` +/// +/// ### DateTime arithmetic +/// +/// ```rust +/// use temporal_rs::{PlainDateTime, Duration}; +/// use core::str::FromStr; +/// +/// let dt = PlainDateTime::from_str("2024-01-15T12:00:00").unwrap(); +/// +/// // Add duration +/// let later = dt.add(&Duration::from_str("P1M2DT3H4M").unwrap(), None).unwrap(); +/// assert_eq!(later.month(), 2); +/// assert_eq!(later.day(), 17); +/// assert_eq!(later.hour(), 15); +/// assert_eq!(later.minute(), 4); +/// +/// // Calculate difference +/// let earlier = PlainDateTime::from_str("2024-01-10T10:30:00").unwrap(); +/// let duration = earlier.until(&dt, Default::default()).unwrap(); +/// assert_eq!(duration.days(), 5); +/// assert_eq!(duration.hours(), 1); +/// assert_eq!(duration.minutes(), 30); +/// ``` +/// +/// ### Working with partial fields +/// +/// ```rust +/// use temporal_rs::{PlainDateTime, fields::DateTimeFields, partial::PartialTime}; +/// use core::str::FromStr; +/// +/// let dt = PlainDateTime::from_str("2024-01-15T12:30:45").unwrap(); +/// +/// // Change only the hour +/// let fields = DateTimeFields::new().with_partial_time(PartialTime::new().with_hour(Some(18))); +/// let modified = dt.with(fields, None).unwrap(); +/// assert_eq!(modified.hour(), 18); +/// assert_eq!(modified.minute(), 30); // unchanged +/// assert_eq!(modified.second(), 45); // unchanged +/// ``` +/// +/// ### Converting to other types +/// +/// ```rust +/// use temporal_rs::{PlainDateTime, PlainTime}; +/// use core::str::FromStr; +/// +/// let dt = PlainDateTime::from_str("2024-03-15T14:30:45").unwrap(); +/// +/// // Extract date component +/// let date = dt.to_plain_date(); +/// assert_eq!(date.year(), 2024); +/// assert_eq!(date.month(), 3); +/// assert_eq!(date.day(), 15); +/// +/// // Extract time component +/// let time = dt.to_plain_time(); +/// assert_eq!(time.hour(), 14); +/// assert_eq!(time.minute(), 30); +/// assert_eq!(time.second(), 45); +/// ``` +/// +/// ## Reference +/// +/// For more information, see the [MDN documentation][mdn-datetime]. +/// +/// [mdn-datetime]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/PlainDateTime +#[non_exhaustive] +#[derive(Debug, Default, Clone, PartialEq, Eq)] +pub struct PlainDateTime { + pub(crate) iso: IsoDateTime, + calendar: Calendar, +} + +impl core::fmt::Display for PlainDateTime { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let string = + self.to_ixdtf_string(ToStringRoundingOptions::default(), DisplayCalendar::Auto); + + debug_assert!( + string.is_ok(), + "Duration must return a valid string with default options." + ); + + f.write_str(&string.map_err(|_| Default::default())?) + } +} + +// ==== Private PlainDateTime API ==== + +impl PlainDateTime { + /// Creates a new unchecked `PlainDateTime`. + #[inline] + #[must_use] + pub(crate) fn new_unchecked(iso: IsoDateTime, calendar: Calendar) -> Self { + Self { iso, calendar } + } + + // TODO: Potentially deprecate and remove. + /// Create a new `PlainDateTime` from an `Instant`. + #[allow(unused)] + #[inline] + pub(crate) fn from_instant(instant: &Instant, offset: i64, calendar: Calendar) -> Self { + let iso = IsoDateTime::from_epoch_nanos(instant.epoch_nanoseconds(), offset); + Self { iso, calendar } + } + + // 5.5.14 AddDurationToOrSubtractDurationFromPlainDateTime ( operation, dateTime, temporalDurationLike, options ) + fn add_or_subtract_duration( + &self, + duration: &Duration, + overflow: Option, + ) -> TemporalResult { + // SKIP: 1, 2, 3, 4 + // 5. Let internalDuration be ToInternalDurationRecordWith24HourDays(duration). + let internal_duration = InternalDurationRecord::from_duration_with_24_hour_days(duration)?; + // 6. Let timeResult be AddTime(dateTime.[[ISODateTime]].[[Time]], internalDuration.[[Time]]). + let (days, time_result) = self + .iso + .time + .add(internal_duration.normalized_time_duration()); + // 7. Let dateDuration be ? AdjustDateDurationRecord(internalDuration.[[Date]], timeResult.[[Days]]). + let date_duration = internal_duration.date().adjust(days, None, None)?; + // 8. Let addedDate be ? CalendarDateAdd(dateTime.[[Calendar]], dateTime.[[ISODateTime]].[[ISODate]], dateDuration, overflow). + let added_date = self.calendar().date_add( + &self.iso.date, + &date_duration, + overflow.unwrap_or(Overflow::Constrain), + )?; + // 9. Let result be CombineISODateAndTimeRecord(addedDate, timeResult). + let result = IsoDateTime::new(added_date.iso, time_result)?; + // 10. Return ? CreateTemporalDateTime(result, dateTime.[[Calendar]]). + Ok(Self::new_unchecked(result, self.calendar().clone())) + } + + /// Difference two `PlainDateTime`s together. + pub(crate) fn diff( + &self, + op: DifferenceOperation, + other: &Self, + settings: DifferenceSettings, + ) -> TemporalResult { + // 3. If ? CalendarEquals(dateTime.[[Calendar]], other.[[Calendar]]) is false, throw a RangeError exception. + if self.calendar != other.calendar { + return Err(TemporalError::range() + .with_message("Calendar must be the same when diffing two PlainDateTimes")); + } + + // 5. Let settings be ? GetDifferenceSettings(operation, resolvedOptions, datetime, « », "nanosecond", "day"). + let options = ResolvedRoundingOptions::from_diff_settings( + settings, + op, + UnitGroup::DateTime, + Unit::Day, + Unit::Nanosecond, + )?; + + // Step 7-8 combined. + if self.iso == other.iso { + return Ok(Duration::default()); + } + + // Step 10-11. + let norm_record = self.diff_dt_with_rounding(other, options)?; + + let result = Duration::from_internal(norm_record, options.largest_unit)?; + + // Step 12 + match op { + DifferenceOperation::Until => Ok(result), + DifferenceOperation::Since => Ok(result.negated()), + } + } + + // TODO: Figure out whether to handle resolvedOptions + // 5.5.12 DifferencePlainDateTimeWithRounding ( y1, mon1, d1, h1, min1, s1, ms1, mus1, ns1, y2, mon2, d2, h2, min2, s2, ms2, + // mus2, ns2, calendarRec, largestUnit, roundingIncrement, smallestUnit, roundingMode, resolvedOptions ) + pub(crate) fn diff_dt_with_rounding( + &self, + other: &Self, + options: ResolvedRoundingOptions, + ) -> TemporalResult { + // 1. If CompareISODateTime(y1, mon1, d1, h1, min1, s1, ms1, mus1, ns1, y2, mon2, d2, h2, min2, s2, ms2, mus2, ns2) = 0, then + if matches!(self.iso.cmp(&other.iso), Ordering::Equal) { + // a. Let durationRecord be CreateDurationRecord(0, 0, 0, 0, 0, 0, 0, 0, 0, 0). + // b. Return the Record { [[DurationRecord]]: durationRecord, [[Total]]: 0 }. + return Ok(InternalDurationRecord::default()); + } + // 2. If ISODateTimeWithinLimits(isoDateTime1) is false or ISODateTimeWithinLimits(isoDateTime2) is false, throw a RangeError exception. + self.iso.check_within_limits()?; + other.iso.check_within_limits()?; + + // 3. Let diff be DifferenceISODateTime(isoDateTime1, isoDateTime2, calendar, largestUnit). + let diff = self + .iso + .diff(&other.iso, &self.calendar, options.largest_unit)?; + // 4. If smallestUnit is nanosecond and roundingIncrement = 1, return diff. + if options.smallest_unit == Unit::Nanosecond && options.increment.get() == 1 { + return Ok(diff); + } + + // 5. Let destEpochNs be GetUTCEpochNanoseconds(isoDateTime2). + let dest_epoch_ns = other.iso.as_nanoseconds(); + // 6. Return ? RoundRelativeDuration(diff, destEpochNs, isoDateTime1, unset, calendar, largestUnit, roundingIncrement, smallestUnit, roundingMode). + diff.round_relative_duration( + dest_epoch_ns.0, + self, + Option::<(&TimeZone, &NeverProvider)>::None, + options, + ) + } + + // 5.5.14 DifferencePlainDateTimeWithTotal ( isoDateTime1, isoDateTime2, calendar, unit ) + pub(crate) fn diff_dt_with_total(&self, other: &Self, unit: Unit) -> TemporalResult { + // 1. If CompareISODateTime(isoDateTime1, isoDateTime2) = 0, then + // a. Return 0. + if matches!(self.iso.cmp(&other.iso), Ordering::Equal) { + return FiniteF64::try_from(0.0); + } + // 2. If ISODateTimeWithinLimits(isoDateTime1) is false or ISODateTimeWithinLimits(isoDateTime2) is false, throw a RangeError exception. + if !self.iso.is_within_limits() || !other.iso.is_within_limits() { + return Err(TemporalError::range().with_message("DateTime is not within valid limits.")); + } + // 3. Let diff be DifferenceISODateTime(isoDateTime1, isoDateTime2, calendar, unit). + let diff = self.iso.diff(&other.iso, &self.calendar, unit)?; + // 4. If unit is nanosecond, return diff.[[Time]]. + if unit == Unit::Nanosecond { + return FiniteF64::try_from(diff.normalized_time_duration().0); + } + // 5. Let destEpochNs be GetUTCEpochNanoseconds(isoDateTime2). + let dest_epoch_ns = other.iso.as_nanoseconds(); + // 6. Return ? TotalRelativeDuration(diff, destEpochNs, isoDateTime1, unset, calendar, unit). + diff.total_relative_duration( + dest_epoch_ns.0, + self, + Option::<(&TimeZone, &NeverProvider)>::None, + unit, + ) + } + + /// Returns this `PlainDateTime`'s ISO year value. + #[inline] + #[must_use] + pub const fn iso_year(&self) -> i32 { + self.iso.date.year + } + + /// Returns this `PlainDateTime`'s ISO month value. + #[inline] + #[must_use] + pub const fn iso_month(&self) -> u8 { + self.iso.date.month + } + + /// Returns this `PlainDateTime`'s ISO day value. + #[inline] + #[must_use] + pub const fn iso_day(&self) -> u8 { + self.iso.date.day + } +} + +// ==== Public PlainDateTime API ==== + +impl PlainDateTime { + /// Creates a new `PlainDateTime`, constraining any arguments that are invalid + /// into a valid range. + #[inline] + #[allow(clippy::too_many_arguments)] + pub fn new( + year: i32, + month: u8, + day: u8, + hour: u8, + minute: u8, + second: u8, + millisecond: u16, + microsecond: u16, + nanosecond: u16, + calendar: Calendar, + ) -> TemporalResult { + Self::new_with_overflow( + year, + month, + day, + hour, + minute, + second, + millisecond, + microsecond, + nanosecond, + calendar, + Overflow::Constrain, + ) + } + + /// Creates a new `PlainDateTime` with an ISO 8601 calendar, constraining any + /// arguments that are invalid into a valid range. + #[inline] + #[allow(clippy::too_many_arguments)] + pub fn new_iso( + year: i32, + month: u8, + day: u8, + hour: u8, + minute: u8, + second: u8, + millisecond: u16, + microsecond: u16, + nanosecond: u16, + ) -> TemporalResult { + Self::new( + year, + month, + day, + hour, + minute, + second, + millisecond, + microsecond, + nanosecond, + Calendar::default(), + ) + } + + /// Creates a new `PlainDateTime`, rejecting any arguments that are not in a valid range. + #[inline] + #[allow(clippy::too_many_arguments)] + pub fn try_new( + year: i32, + month: u8, + day: u8, + hour: u8, + minute: u8, + second: u8, + millisecond: u16, + microsecond: u16, + nanosecond: u16, + calendar: Calendar, + ) -> TemporalResult { + Self::new_with_overflow( + year, + month, + day, + hour, + minute, + second, + millisecond, + microsecond, + nanosecond, + calendar, + Overflow::Reject, + ) + } + + /// Creates a new `PlainDateTime` with an ISO 8601 calendar, rejecting any arguments that are not in a valid range. + #[inline] + #[allow(clippy::too_many_arguments)] + pub fn try_new_iso( + year: i32, + month: u8, + day: u8, + hour: u8, + minute: u8, + second: u8, + millisecond: u16, + microsecond: u16, + nanosecond: u16, + ) -> TemporalResult { + Self::try_new( + year, + month, + day, + hour, + minute, + second, + millisecond, + microsecond, + nanosecond, + Calendar::default(), + ) + } + + /// Creates a new `PlainDateTime` with the provided [`Overflow`] option. + #[inline] + #[allow(clippy::too_many_arguments)] + pub fn new_with_overflow( + year: i32, + month: u8, + day: u8, + hour: u8, + minute: u8, + second: u8, + millisecond: u16, + microsecond: u16, + nanosecond: u16, + calendar: Calendar, + overflow: Overflow, + ) -> TemporalResult { + let iso_date = IsoDate::new_with_overflow(year, month, day, overflow)?; + let iso_time = IsoTime::new( + hour, + minute, + second, + millisecond, + microsecond, + nanosecond, + overflow, + )?; + Ok(Self::new_unchecked( + IsoDateTime::new(iso_date, iso_time)?, + calendar, + )) + } + + /// Create a `PlainDateTime` from a `Date` and a `Time`. + pub fn from_date_and_time(date: PlainDate, time: PlainTime) -> TemporalResult { + Ok(Self::new_unchecked( + IsoDateTime::new(date.iso, time.iso)?, + date.calendar().clone(), + )) + } + + /// Creates a `PlainDateTime` from a `PartialDateTime`. + /// + /// ```rust + /// use temporal_rs::{Calendar, PlainDateTime, fields::{CalendarFields, DateTimeFields}, partial::{PartialDateTime, PartialTime, PartialDate}}; + /// + /// let calendar_fields = CalendarFields::new() + /// .with_year(2000) + /// .with_month(13) + /// .with_day(2); + /// + /// let time = PartialTime { + /// hour: Some(4), + /// minute: Some(25), + /// ..Default::default() + /// }; + /// + /// let fields = PartialDateTime { + /// fields: DateTimeFields { + /// calendar_fields, + /// time, + /// }, + /// calendar: Calendar::ISO, + /// }; + /// + /// let date = PlainDateTime::from_partial(fields, None).unwrap(); + /// + /// assert_eq!(date.year(), 2000); + /// assert_eq!(date.month(), 12); + /// assert_eq!(date.day(), 2); + /// assert_eq!(date.calendar().identifier(), "iso8601"); + /// assert_eq!(date.hour(), 4); + /// assert_eq!(date.minute(), 25); + /// assert_eq!(date.second(), 0); + /// assert_eq!(date.millisecond(), 0); + /// + /// ``` + pub fn from_partial( + partial: PartialDateTime, + overflow: Option, + ) -> TemporalResult { + if partial.fields.is_empty() { + return Err(TemporalError::r#type().with_message("PartialDateTime cannot be empty.")); + } + // The steps here largely follow `InterpretTemporalDateTimeFields` + // 1. Let isoDate be ? CalendarDateFromFields(calendar, fields, overflow). + let date = partial.calendar.date_from_fields( + partial.fields.calendar_fields, + overflow.unwrap_or(Overflow::Constrain), + )?; + // 2. Let time be ? RegulateTime(fields.[[Hour]], fields.[[Minute]], fields.[[Second]], fields.[[Millisecond]], fields.[[Microsecond]], fields.[[Nanosecond]], overflow). + let iso_time = + IsoTime::default().with(partial.fields.time, overflow.unwrap_or_default())?; + // 3. Return CombineISODateAndTimeRecord(isoDate, time). + let iso = IsoDateTime::new(date.iso, iso_time)?; + Ok(Self::new_unchecked(iso, partial.calendar)) + } + + // Converts a UTF-8 encoded string into a `PlainDateTime`. + pub fn from_utf8(s: &[u8]) -> TemporalResult { + let parsed = ParsedDateTime::from_utf8(s)?; + Self::from_parsed(parsed) + } + + pub fn from_parsed(parsed: ParsedDateTime) -> TemporalResult { + let date = IsoDate::new_with_overflow( + parsed.date.record.year, + parsed.date.record.month, + parsed.date.record.day, + Overflow::Reject, + )?; + let iso = IsoDateTime::new(date, parsed.time)?; + + Ok(Self::new_unchecked( + iso, + Calendar::new(parsed.date.calendar), + )) + } + + /// Creates a new `PlainDateTime` with the fields of a `PartialDateTime`. + /// + /// ```rust + /// use temporal_rs::{Calendar, PlainDateTime, fields::{CalendarFields, DateTimeFields}, partial::{PartialDateTime, PartialTime, PartialDate}}; + /// + /// let initial = PlainDateTime::try_new(2000, 12, 2, 0,0,0,0,0,0, Calendar::default()).unwrap(); + /// + /// let calendar_fields = CalendarFields::new() + /// .with_month(5); + /// + /// let time = PartialTime { + /// hour: Some(4), + /// second: Some(30), + /// ..Default::default() + /// }; + /// + /// let fields = DateTimeFields { calendar_fields, time }; + /// + /// let date = initial.with(fields, None).unwrap(); + /// + /// assert_eq!(date.year(), 2000); + /// assert_eq!(date.month(), 5); + /// assert_eq!(date.day(), 2); + /// assert_eq!(date.calendar().identifier(), "iso8601"); + /// assert_eq!(date.hour(), 4); + /// assert_eq!(date.minute(), 0); + /// assert_eq!(date.second(), 30); + /// assert_eq!(date.millisecond(), 0); + /// + /// ``` + #[inline] + pub fn with(&self, fields: DateTimeFields, overflow: Option) -> TemporalResult { + if fields.is_empty() { + return Err( + TemporalError::r#type().with_message("A PartialDateTime must have a valid field.") + ); + } + let overflow = overflow.unwrap_or(Overflow::Constrain); + + let result_date = self.calendar.date_from_fields( + fields + .calendar_fields + .with_fallback_datetime(self, self.calendar.kind(), overflow)?, + overflow, + )?; + + // Determine the `Time` based off the partial values. + let time = self.iso.time.with(fields.time, overflow)?; + + let iso_datetime = IsoDateTime::new(result_date.iso, time)?; + + Ok(Self::new_unchecked(iso_datetime, self.calendar().clone())) + } + + /// Creates a new `PlainDateTime` from the current `PlainDateTime` and the provided `Time`. + #[inline] + pub fn with_time(&self, time: Option) -> TemporalResult { + let time = time.unwrap_or_default(); + Self::try_new( + self.iso_year(), + self.iso_month(), + self.iso_day(), + time.hour(), + time.minute(), + time.second(), + time.millisecond(), + time.microsecond(), + time.nanosecond(), + self.calendar.clone(), + ) + } + + /// Creates a new `PlainDateTime` from the current `PlainDateTime` and a provided [`Calendar`]. + #[inline] + pub fn with_calendar(&self, calendar: Calendar) -> Self { + Self::new_unchecked(self.iso, calendar) + } + + /// Returns the hour value + #[inline] + #[must_use] + pub fn hour(&self) -> u8 { + self.iso.time.hour + } + + /// Returns the minute value + #[inline] + #[must_use] + pub fn minute(&self) -> u8 { + self.iso.time.minute + } + + /// Returns the second value + #[inline] + #[must_use] + pub fn second(&self) -> u8 { + self.iso.time.second + } + + /// Returns the `millisecond` value + #[inline] + #[must_use] + pub fn millisecond(&self) -> u16 { + self.iso.time.millisecond + } + + /// Returns the `microsecond` value + #[inline] + #[must_use] + pub fn microsecond(&self) -> u16 { + self.iso.time.microsecond + } + + /// Returns the `nanosecond` value + #[inline] + #[must_use] + pub fn nanosecond(&self) -> u16 { + self.iso.time.nanosecond + } + + /// Returns the Calendar value. + #[inline] + #[must_use] + pub fn calendar(&self) -> &Calendar { + &self.calendar + } +} + +// ==== Calendar-derived public API ==== + +impl PlainDateTime { + /// Returns the calendar year value. + #[inline] + pub fn year(&self) -> i32 { + self.calendar.year(&self.iso.date) + } + + /// Returns the calendar month value. + #[inline] + pub fn month(&self) -> u8 { + self.calendar.month(&self.iso.date) + } + + /// Returns the calendar month code value. + #[inline] + pub fn month_code(&self) -> MonthCode { + self.calendar.month_code(&self.iso.date) + } + + /// Returns the calendar day value. + #[inline] + pub fn day(&self) -> u8 { + self.calendar.day(&self.iso.date) + } + + /// Returns the calendar day of week value. + #[inline] + pub fn day_of_week(&self) -> u16 { + self.calendar.day_of_week(&self.iso.date) + } + + /// Returns the calendar day of year value. + #[inline] + pub fn day_of_year(&self) -> u16 { + self.calendar.day_of_year(&self.iso.date) + } + + /// Returns the calendar week of year value. + #[inline] + pub fn week_of_year(&self) -> Option { + self.calendar.week_of_year(&self.iso.date) + } + + /// Returns the calendar year of week value. + #[inline] + pub fn year_of_week(&self) -> Option { + self.calendar.year_of_week(&self.iso.date) + } + + /// Returns the calendar days in week value. + #[inline] + pub fn days_in_week(&self) -> u16 { + self.calendar.days_in_week(&self.iso.date) + } + + /// Returns the calendar days in month value. + #[inline] + pub fn days_in_month(&self) -> u16 { + self.calendar.days_in_month(&self.iso.date) + } + + /// Returns the calendar days in year value. + #[inline] + pub fn days_in_year(&self) -> u16 { + self.calendar.days_in_year(&self.iso.date) + } + + /// Returns the calendar months in year value. + #[inline] + pub fn months_in_year(&self) -> u16 { + self.calendar.months_in_year(&self.iso.date) + } + + /// Returns whether the date in a leap year for the given calendar. + #[inline] + pub fn in_leap_year(&self) -> bool { + self.calendar.in_leap_year(&self.iso.date) + } + + /// Returns the era for the current `PlainDateTime`. + #[inline] + pub fn era(&self) -> Option> { + self.calendar.era(&self.iso.date) + } + + /// Returns the era year for the current `PlainDateTime`. + #[inline] + pub fn era_year(&self) -> Option { + self.calendar.era_year(&self.iso.date) + } +} + +impl PlainDateTime { + /// Compares one `PlainDateTime` to another `PlainDateTime` using their + /// `IsoDate` representation. + /// + /// # Note on Ordering + /// + /// `temporal_rs` does not implement `PartialOrd`/`Ord` as `PlainDateTime` does + /// not fulfill all the conditions required to implement the traits. However, + /// it is possible to compare `PlainDate`'s as their `IsoDate` representation. + #[inline] + #[must_use] + pub fn compare_iso(&self, other: &Self) -> Ordering { + self.iso.cmp(&other.iso) + } + + /// Adds a [`Duration`] to the current `PlainDateTime`. + #[inline] + pub fn add(&self, duration: &Duration, overflow: Option) -> TemporalResult { + self.add_or_subtract_duration(duration, overflow) + } + + /// Subtracts a [`Duration`] to the current `PlainDateTime`. + #[inline] + pub fn subtract( + &self, + duration: &Duration, + overflow: Option, + ) -> TemporalResult { + self.add_or_subtract_duration(&duration.negated(), overflow) + } + + /// Returns a [`Duration`] representing the period of time from this `PlainDateTime` until the other `PlainDateTime`. + #[inline] + pub fn until(&self, other: &Self, settings: DifferenceSettings) -> TemporalResult { + self.diff(DifferenceOperation::Until, other, settings) + } + + /// Returns a [`Duration`] representing the period of time from this `PlainDateTime` since the other `PlainDateTime`. + #[inline] + pub fn since(&self, other: &Self, settings: DifferenceSettings) -> TemporalResult { + self.diff(DifferenceOperation::Since, other, settings) + } + + /// Rounds the current `PlainDateTime` based on provided options. + #[inline] + pub fn round(&self, options: RoundingOptions) -> TemporalResult { + let resolved = ResolvedRoundingOptions::from_datetime_options(options)?; + + if resolved.is_noop() { + return Ok(self.clone()); + } + + let result = self.iso.round(resolved)?; + + Ok(Self::new_unchecked(result, self.calendar.clone())) + } + + /// Create a [`ZonedDateTime`] from the current `PlainDateTime` with the provided options. + #[inline] + pub fn to_zoned_date_time_with_provider( + &self, + time_zone: TimeZone, + disambiguation: Disambiguation, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + // 6. Let epochNs be ? GetEpochNanosecondsFor(timeZone, dateTime.[[ISODateTime]], disambiguation). + let epoch_ns = time_zone.get_epoch_nanoseconds_for(self.iso, disambiguation, provider)?; + // 7. Return ! CreateTemporalZonedDateTime(epochNs, timeZone, dateTime.[[Calendar]]). + Ok(ZonedDateTime::new_unchecked( + Instant::from(epoch_ns.ns), + time_zone, + self.calendar.clone(), + epoch_ns.offset, + )) + } + + /// Create a [`PlainDate`] from the current `PlainDateTime`. + #[inline] + pub fn to_plain_date(&self) -> PlainDate { + // 3. Return ! CreateTemporalDate(dateTime.[[ISODateTime]].[[ISODate]], dateTime.[[Calendar]]). + PlainDate::new_unchecked(self.iso.date, self.calendar.clone()) + } + + /// Create a [`PlainTime`] from the current `PlainDateTime`. + #[inline] + pub fn to_plain_time(&self) -> PlainTime { + // 3. Return ! CreateTemporalTime(dateTime.[[ISODateTime]].[[Time]]). + PlainTime::new_unchecked(self.iso.time) + } + + /// Creates an efficient [`Writeable`] implementation for the RFC 9557 IXDTF format + /// using the current `PlainDateTime` and options. + #[inline] + pub fn to_ixdtf_writeable( + &self, + options: ToStringRoundingOptions, + display_calendar: DisplayCalendar, + ) -> TemporalResult { + let resolved_options = options.resolve()?; + let result = self + .iso + .round(ResolvedRoundingOptions::from_to_string_options( + &resolved_options, + ))?; + if !result.is_within_limits() { + return Err(TemporalError::range().with_message("DateTime is not within valid limits.")); + } + let builder = IxdtfStringBuilder::default() + .with_date(result.date) + .with_time(result.time, resolved_options.precision) + .with_calendar(self.calendar.identifier(), display_calendar); + Ok(builder) + } + + /// Returns the RFC 9557 IXDTF string for the current `PlainDateTime` with the provided + /// options. + #[inline] + pub fn to_ixdtf_string( + &self, + options: ToStringRoundingOptions, + display_calendar: DisplayCalendar, + ) -> TemporalResult { + self.to_ixdtf_writeable(options, display_calendar) + .map(|x| x.write_to_string().into()) + } +} + +// ==== Trait impls ==== + +impl FromStr for PlainDateTime { + type Err = TemporalError; + + fn from_str(s: &str) -> Result { + Self::from_utf8(s.as_bytes()) + } +} + +#[cfg(test)] +mod tests { + use tinystr::{tinystr, TinyAsciiStr}; + + use crate::{ + builtins::{ + calendar::CalendarFields, + core::{ + calendar::Calendar, duration::DateDuration, plain_date_time::DateTimeFields, + Duration, PartialTime, PlainDateTime, + }, + }, + iso::{IsoDate, IsoDateTime, IsoTime}, + options::{ + DifferenceSettings, DisplayCalendar, RoundingIncrement, RoundingMode, RoundingOptions, + ToStringRoundingOptions, Unit, + }, + parsers::Precision, + MonthCode, TemporalResult, + }; + + fn assert_datetime( + dt: PlainDateTime, + fields: (i32, u8, TinyAsciiStr<4>, u8, u8, u8, u8, u16, u16, u16), + ) { + assert_eq!(dt.year(), fields.0); + assert_eq!(dt.month(), fields.1); + assert_eq!(dt.month_code(), MonthCode(fields.2)); + assert_eq!(dt.day(), fields.3); + assert_eq!(dt.hour(), fields.4); + assert_eq!(dt.minute(), fields.5); + assert_eq!(dt.second(), fields.6); + assert_eq!(dt.millisecond(), fields.7); + assert_eq!(dt.microsecond(), fields.8); + assert_eq!(dt.nanosecond(), fields.9); + } + + fn pdt_from_date(year: i32, month: u8, day: u8) -> TemporalResult { + PlainDateTime::try_new(year, month, day, 0, 0, 0, 0, 0, 0, Calendar::default()) + } + + #[test] + #[allow(clippy::float_cmp)] + fn plain_date_time_limits() { + // This test is primarily to assert that the `expect` in the epoch methods is + // valid, i.e., a valid instant is within the range of an f64. + let negative_limit = pdt_from_date(-271_821, 4, 19); + assert!(negative_limit.is_err()); + let positive_limit = pdt_from_date(275_760, 9, 14); + assert!(positive_limit.is_err()); + let within_negative_limit = pdt_from_date(-271_821, 4, 20); + assert_eq!( + within_negative_limit, + Ok(PlainDateTime { + iso: IsoDateTime { + date: IsoDate { + year: -271_821, + month: 4, + day: 20, + }, + time: IsoTime::default(), + }, + calendar: Calendar::default(), + }) + ); + + let within_positive_limit = pdt_from_date(275_760, 9, 13); + assert_eq!( + within_positive_limit, + Ok(PlainDateTime { + iso: IsoDateTime { + date: IsoDate { + year: 275_760, + month: 9, + day: 13, + }, + time: IsoTime::default(), + }, + calendar: Calendar::default(), + }) + ); + } + + #[test] + fn basic_with_test() { + let pdt = + PlainDateTime::try_new(1976, 11, 18, 15, 23, 30, 123, 456, 789, Calendar::default()) + .unwrap(); + + // Test year + let fields = DateTimeFields { + calendar_fields: CalendarFields::new().with_year(2019), + time: PartialTime::default(), + }; + let result = pdt.with(fields, None).unwrap(); + assert_datetime( + result, + (2019, 11, tinystr!(4, "M11"), 18, 15, 23, 30, 123, 456, 789), + ); + + // Test month + let fields = DateTimeFields { + calendar_fields: CalendarFields::new().with_month(5), + time: PartialTime::default(), + }; + let result = pdt.with(fields, None).unwrap(); + assert_datetime( + result, + (1976, 5, tinystr!(4, "M05"), 18, 15, 23, 30, 123, 456, 789), + ); + + // Test monthCode + let fields = DateTimeFields { + calendar_fields: CalendarFields::new().with_month_code(MonthCode(tinystr!(4, "M05"))), + time: PartialTime::default(), + }; + let result = pdt.with(fields, None).unwrap(); + assert_datetime( + result, + (1976, 5, tinystr!(4, "M05"), 18, 15, 23, 30, 123, 456, 789), + ); + + // Test day + let fields = DateTimeFields { + calendar_fields: CalendarFields::new().with_day(5), + time: PartialTime::default(), + }; + let result = pdt.with(fields, None).unwrap(); + assert_datetime( + result, + (1976, 11, tinystr!(4, "M11"), 5, 15, 23, 30, 123, 456, 789), + ); + + // Test hour + let fields = DateTimeFields { + calendar_fields: CalendarFields::default(), + time: PartialTime { + hour: Some(5), + ..Default::default() + }, + }; + let result = pdt.with(fields, None).unwrap(); + assert_datetime( + result, + (1976, 11, tinystr!(4, "M11"), 18, 5, 23, 30, 123, 456, 789), + ); + + // Test minute + let fields = DateTimeFields { + calendar_fields: CalendarFields::default(), + time: PartialTime { + minute: Some(5), + ..Default::default() + }, + }; + let result = pdt.with(fields, None).unwrap(); + assert_datetime( + result, + (1976, 11, tinystr!(4, "M11"), 18, 15, 5, 30, 123, 456, 789), + ); + + // Test second + let fields = DateTimeFields { + calendar_fields: CalendarFields::default(), + time: PartialTime { + second: Some(5), + ..Default::default() + }, + }; + let result = pdt.with(fields, None).unwrap(); + assert_datetime( + result, + (1976, 11, tinystr!(4, "M11"), 18, 15, 23, 5, 123, 456, 789), + ); + + // Test second + let fields = DateTimeFields { + calendar_fields: CalendarFields::default(), + time: PartialTime { + millisecond: Some(5), + ..Default::default() + }, + }; + let result = pdt.with(fields, None).unwrap(); + assert_datetime( + result, + (1976, 11, tinystr!(4, "M11"), 18, 15, 23, 30, 5, 456, 789), + ); + + // Test second + let fields = DateTimeFields { + calendar_fields: CalendarFields::default(), + time: PartialTime { + microsecond: Some(5), + ..Default::default() + }, + }; + let result = pdt.with(fields, None).unwrap(); + assert_datetime( + result, + (1976, 11, tinystr!(4, "M11"), 18, 15, 23, 30, 123, 5, 789), + ); + + // Test second + let fields = DateTimeFields { + calendar_fields: CalendarFields::default(), + time: PartialTime { + nanosecond: Some(5), + ..Default::default() + }, + }; + let result = pdt.with(fields, None).unwrap(); + assert_datetime( + result, + (1976, 11, tinystr!(4, "M11"), 18, 15, 23, 30, 123, 456, 5), + ); + } + + #[test] + fn datetime_with_empty_partial() { + let pdt = + PlainDateTime::try_new(2020, 1, 31, 12, 34, 56, 987, 654, 321, Calendar::default()) + .unwrap(); + + let err = pdt.with(DateTimeFields::default(), None); + assert!(err.is_err()); + } + + // options-undefined.js + #[test] + fn datetime_add_test() { + let pdt = + PlainDateTime::try_new(2020, 1, 31, 12, 34, 56, 987, 654, 321, Calendar::default()) + .unwrap(); + + let result = pdt + .add( + &Duration::from(DateDuration::new(0, 1, 0, 0).unwrap()), + None, + ) + .unwrap(); + + assert_eq!(result.month(), 2); + assert_eq!(result.day(), 29); + } + + // options-undefined.js + #[test] + fn datetime_subtract_test() { + let pdt = + PlainDateTime::try_new(2000, 3, 31, 12, 34, 56, 987, 654, 321, Calendar::default()) + .unwrap(); + + let result = pdt + .subtract( + &Duration::from(DateDuration::new(0, 1, 0, 0).unwrap()), + None, + ) + .unwrap(); + + assert_eq!(result.month(), 2); + assert_eq!(result.day(), 29); + } + + // subtract/hour-overflow.js + #[test] + fn datetime_subtract_hour_overflows() { + let dt = + PlainDateTime::try_new(2019, 10, 29, 10, 46, 38, 271, 986, 102, Calendar::default()) + .unwrap(); + + let result = dt.subtract(&Duration::from_hours(12), None).unwrap(); + assert_datetime( + result, + (2019, 10, tinystr!(4, "M10"), 28, 22, 46, 38, 271, 986, 102), + ); + + let result = dt.add(&Duration::from_hours(-12), None).unwrap(); + assert_datetime( + result, + (2019, 10, tinystr!(4, "M10"), 28, 22, 46, 38, 271, 986, 102), + ); + } + + fn create_diff_setting( + smallest: Unit, + increment: u32, + rounding_mode: RoundingMode, + ) -> DifferenceSettings { + DifferenceSettings { + largest_unit: None, + smallest_unit: Some(smallest), + increment: Some(RoundingIncrement::try_new(increment).unwrap()), + rounding_mode: Some(rounding_mode), + } + } + + #[test] + fn dt_until_basic() { + let earlier = + PlainDateTime::try_new(2019, 1, 8, 8, 22, 36, 123, 456, 789, Calendar::default()) + .unwrap(); + let later = + PlainDateTime::try_new(2021, 9, 7, 12, 39, 40, 987, 654, 321, Calendar::default()) + .unwrap(); + + let settings = create_diff_setting(Unit::Hour, 3, RoundingMode::HalfExpand); + let result = earlier.until(&later, settings).unwrap(); + + assert_eq!(result.days(), 973); + assert_eq!(result.hours(), 3); + + let settings = create_diff_setting(Unit::Minute, 30, RoundingMode::HalfExpand); + let result = earlier.until(&later, settings).unwrap(); + + assert_eq!(result.days(), 973); + assert_eq!(result.hours(), 4); + assert_eq!(result.minutes(), 30); + } + + #[test] + fn dt_since_basic() { + let earlier = + PlainDateTime::try_new(2019, 1, 8, 8, 22, 36, 123, 456, 789, Calendar::default()) + .unwrap(); + let later = + PlainDateTime::try_new(2021, 9, 7, 12, 39, 40, 987, 654, 321, Calendar::default()) + .unwrap(); + + let settings = create_diff_setting(Unit::Hour, 3, RoundingMode::HalfExpand); + let result = later.since(&earlier, settings).unwrap(); + + assert_eq!(result.days(), 973); + assert_eq!(result.hours(), 3); + + let settings = create_diff_setting(Unit::Minute, 30, RoundingMode::HalfExpand); + let result = later.since(&earlier, settings).unwrap(); + + assert_eq!(result.days(), 973); + assert_eq!(result.hours(), 4); + assert_eq!(result.minutes(), 30); + } + + #[test] + fn dt_round_basic() { + let assert_datetime = + |dt: PlainDateTime, expected: (i32, u8, u8, u8, u8, u8, u16, u16, u16)| { + assert_eq!(dt.iso_year(), expected.0); + assert_eq!(dt.iso_month(), expected.1); + assert_eq!(dt.iso_day(), expected.2); + assert_eq!(dt.hour(), expected.3); + assert_eq!(dt.minute(), expected.4); + assert_eq!(dt.second(), expected.5); + assert_eq!(dt.millisecond(), expected.6); + assert_eq!(dt.microsecond(), expected.7); + assert_eq!(dt.nanosecond(), expected.8); + }; + + let gen_rounding_options = |smallest: Unit, increment: u32| -> RoundingOptions { + RoundingOptions { + largest_unit: None, + smallest_unit: Some(smallest), + increment: Some(RoundingIncrement::try_new(increment).unwrap()), + rounding_mode: None, + } + }; + let dt = + PlainDateTime::try_new(1976, 11, 18, 14, 23, 30, 123, 456, 789, Calendar::default()) + .unwrap(); + + let result = dt.round(gen_rounding_options(Unit::Hour, 4)).unwrap(); + assert_datetime(result, (1976, 11, 18, 16, 0, 0, 0, 0, 0)); + + let result = dt.round(gen_rounding_options(Unit::Minute, 15)).unwrap(); + assert_datetime(result, (1976, 11, 18, 14, 30, 0, 0, 0, 0)); + + let result = dt.round(gen_rounding_options(Unit::Second, 30)).unwrap(); + assert_datetime(result, (1976, 11, 18, 14, 23, 30, 0, 0, 0)); + + let result = dt + .round(gen_rounding_options(Unit::Millisecond, 10)) + .unwrap(); + assert_datetime(result, (1976, 11, 18, 14, 23, 30, 120, 0, 0)); + + let result = dt + .round(gen_rounding_options(Unit::Microsecond, 10)) + .unwrap(); + assert_datetime(result, (1976, 11, 18, 14, 23, 30, 123, 460, 0)); + + let result = dt + .round(gen_rounding_options(Unit::Nanosecond, 10)) + .unwrap(); + assert_datetime(result, (1976, 11, 18, 14, 23, 30, 123, 456, 790)); + } + + #[test] + fn datetime_round_options() { + let dt = + PlainDateTime::try_new(1976, 11, 18, 14, 23, 30, 123, 456, 789, Calendar::default()) + .unwrap(); + + let bad_options = RoundingOptions { + largest_unit: None, + smallest_unit: None, + rounding_mode: Some(RoundingMode::Ceil), + increment: Some(RoundingIncrement::ONE), + }; + + let err = dt.round(bad_options); + assert!(err.is_err()); + + let err = dt.round(RoundingOptions::default()); + assert!(err.is_err()); + } + + // Mapped from fractionaldigits-number.js + #[test] + fn to_string_precision_digits() { + let few_seconds = + PlainDateTime::try_new(1976, 2, 4, 5, 3, 1, 0, 0, 0, Calendar::default()).unwrap(); + let zero_seconds = + PlainDateTime::try_new(1976, 11, 18, 15, 23, 0, 0, 0, 0, Calendar::default()).unwrap(); + let whole_seconds = + PlainDateTime::try_new(1976, 11, 18, 15, 23, 30, 0, 0, 0, Calendar::default()).unwrap(); + let subseconds = + PlainDateTime::try_new(1976, 11, 18, 15, 23, 30, 123, 400, 0, Calendar::default()) + .unwrap(); + + let options = ToStringRoundingOptions { + precision: Precision::Digit(0), + smallest_unit: None, + rounding_mode: None, + }; + assert_eq!( + &few_seconds + .to_ixdtf_string(options, DisplayCalendar::Auto) + .unwrap(), + "1976-02-04T05:03:01", + "pads parts with 0" + ); + + let options = ToStringRoundingOptions { + precision: Precision::Digit(0), + smallest_unit: None, + rounding_mode: None, + }; + assert_eq!( + &subseconds + .to_ixdtf_string(options, DisplayCalendar::Auto) + .unwrap(), + "1976-11-18T15:23:30", + "truncates 4 decimal places to 0" + ); + + let options = ToStringRoundingOptions { + precision: Precision::Digit(2), + smallest_unit: None, + rounding_mode: None, + }; + assert_eq!( + &zero_seconds + .to_ixdtf_string(options, DisplayCalendar::Auto) + .unwrap(), + "1976-11-18T15:23:00.00", + "pads zero seconds to 2 decimal places" + ); + let options = ToStringRoundingOptions { + precision: Precision::Digit(2), + smallest_unit: None, + rounding_mode: None, + }; + + assert_eq!( + &whole_seconds + .to_ixdtf_string(options, DisplayCalendar::Auto) + .unwrap(), + "1976-11-18T15:23:30.00", + "pads whole seconds to 2 decimal places" + ); + let options = ToStringRoundingOptions { + precision: Precision::Digit(2), + smallest_unit: None, + rounding_mode: None, + }; + assert_eq!( + &subseconds + .to_ixdtf_string(options, DisplayCalendar::Auto) + .unwrap(), + "1976-11-18T15:23:30.12", + "truncates 4 decimal places to 2" + ); + + let options = ToStringRoundingOptions { + precision: Precision::Digit(3), + smallest_unit: None, + rounding_mode: None, + }; + assert_eq!( + &subseconds + .to_ixdtf_string(options, DisplayCalendar::Auto) + .unwrap(), + "1976-11-18T15:23:30.123", + "truncates 4 decimal places to 3" + ); + + let options = ToStringRoundingOptions { + precision: Precision::Digit(6), + smallest_unit: None, + rounding_mode: None, + }; + assert_eq!( + &subseconds + .to_ixdtf_string(options, DisplayCalendar::Auto) + .unwrap(), + "1976-11-18T15:23:30.123400", + "pads 4 decimal places to 6" + ); + let options = ToStringRoundingOptions { + precision: Precision::Digit(7), + smallest_unit: None, + rounding_mode: None, + }; + assert_eq!( + &zero_seconds + .to_ixdtf_string(options, DisplayCalendar::Auto) + .unwrap(), + "1976-11-18T15:23:00.0000000", + "pads zero seconds to 7 decimal places" + ); + let options = ToStringRoundingOptions { + precision: Precision::Digit(7), + smallest_unit: None, + rounding_mode: None, + }; + assert_eq!( + &whole_seconds + .to_ixdtf_string(options, DisplayCalendar::Auto) + .unwrap(), + "1976-11-18T15:23:30.0000000", + "pads whole seconds to 7 decimal places" + ); + let options = ToStringRoundingOptions { + precision: Precision::Digit(7), + smallest_unit: None, + rounding_mode: None, + }; + assert_eq!( + &subseconds + .to_ixdtf_string(options, DisplayCalendar::Auto) + .unwrap(), + "1976-11-18T15:23:30.1234000", + "pads 4 decimal places to 7" + ); + let options = ToStringRoundingOptions { + precision: Precision::Digit(9), + smallest_unit: None, + rounding_mode: None, + }; + assert_eq!( + &subseconds + .to_ixdtf_string(options, DisplayCalendar::Auto) + .unwrap(), + "1976-11-18T15:23:30.123400000", + "pads 4 decimal places to 9" + ); + } + + #[test] + fn datetime_add() { + use crate::{Duration, PlainDateTime}; + use core::str::FromStr; + + let dt = PlainDateTime::from_str("2024-01-15T12:00:00").unwrap(); + + let duration = Duration::from_str("P1M2DT3H4M").unwrap(); + + // Add duration + let later = dt.add(&duration, None).unwrap(); + assert_eq!(later.month(), 2); + assert_eq!(later.day(), 17); + assert_eq!(later.hour(), 15); + assert_eq!(later.minute(), 4); + } +} diff --git a/deps/temporal/src/builtins/core/plain_month_day.rs b/deps/temporal/src/builtins/core/plain_month_day.rs new file mode 100644 index 00000000000000..b60372bce468c6 --- /dev/null +++ b/deps/temporal/src/builtins/core/plain_month_day.rs @@ -0,0 +1,652 @@ +//! This module implements `MonthDay` and any directly related algorithms. + +use alloc::string::String; +use core::str::FromStr; + +use crate::{ + builtins::calendar::CalendarFields, + iso::{IsoDate, IsoDateTime, IsoTime}, + options::{Disambiguation, DisplayCalendar, Overflow}, + parsed_intermediates::ParsedDate, + parsers::{FormattableCalendar, FormattableDate, FormattableMonthDay}, + provider::TimeZoneProvider, + unix_time::EpochNanoseconds, + Calendar, MonthCode, TemporalError, TemporalResult, TimeZone, +}; + +use super::{PartialDate, PlainDate}; +use icu_calendar::AnyCalendarKind; +use writeable::Writeable; + +/// The native Rust implementation of `Temporal.PlainMonthDay`. +/// +/// Represents a calendar month and day without a specific year, such as +/// "December 25th" or "March 15th". Useful for representing recurring annual +/// events where the year is not specified or relevant. +/// +/// Commonly used for holidays, birthdays, anniversaries, and other events +/// that occur on the same date each year. Special handling is required for +/// February 29th when working with non-leap years. +/// +/// ## Examples +/// +/// ### Creating a PlainMonthDay +/// +/// ```rust +/// use temporal_rs::{PlainMonthDay, Calendar, MonthCode, options::Overflow}; +/// +/// // Create March 15th +/// let md = PlainMonthDay::new_with_overflow( +/// 3, 15, // month, day +/// Calendar::default(), // ISO 8601 calendar +/// Overflow::Reject, // reject invalid dates +/// None // no reference year +/// ).unwrap(); +/// +/// assert_eq!(md.month_code(), MonthCode::try_from_utf8("M03".as_bytes()).unwrap()); +/// assert_eq!(md.day(), 15); +/// assert_eq!(md.calendar().identifier(), "iso8601"); +/// ``` +/// +/// ### Parsing ISO 8601 month-day strings +/// +/// ```rust +/// use temporal_rs::{PlainMonthDay, MonthCode}; +/// use core::str::FromStr; +/// +/// // Parse month-day strings +/// let md = PlainMonthDay::from_str("03-15").unwrap(); +/// assert_eq!(md.month_code(), MonthCode::try_from_utf8("M03".as_bytes()).unwrap()); +/// assert_eq!(md.day(), 15); +/// +/// // Also supports various formats +/// let md2 = PlainMonthDay::from_str("--03-15").unwrap(); // RFC 3339 format +/// assert_eq!(md2.month_code(), MonthCode::try_from_utf8("M03".as_bytes()).unwrap()); +/// assert_eq!(md2.day(), 15); +/// assert_eq!(md, md2); // equivalent +/// ``` +/// +/// ### Working with partial fields +/// +/// ```rust +/// use temporal_rs::{PlainMonthDay, MonthCode, fields::CalendarFields}; +/// use core::str::FromStr; +/// +/// let md = PlainMonthDay::from_str("03-15").unwrap(); // March 15th +/// +/// // Change the month +/// let fields = CalendarFields::new().with_month(12); +/// let modified = md.with(fields, None).unwrap(); +/// assert_eq!(modified.month_code(), MonthCode::try_from_utf8("M12".as_bytes()).unwrap()); +/// assert_eq!(modified.day(), 15); // unchanged +/// +/// // Change the day +/// let fields = CalendarFields::new().with_day(25); +/// let modified = md.with(fields, None).unwrap(); +/// assert_eq!(modified.month_code(), MonthCode::try_from_utf8("M03".as_bytes()).unwrap()); // unchanged +/// assert_eq!(modified.day(), 25); +/// ``` +/// +/// ### Converting to PlainDate +/// +/// ```rust +/// use temporal_rs::{PlainMonthDay, fields::CalendarFields}; +/// use core::str::FromStr; +/// +/// let md = PlainMonthDay::from_str("12-25").unwrap(); // December 25th +/// +/// // Convert to a specific date by providing a year +/// let year_fields = CalendarFields::new().with_year(2024); +/// let date = md.to_plain_date(Some(year_fields)).unwrap(); +/// assert_eq!(date.year(), 2024); +/// assert_eq!(date.month(), 12); +/// assert_eq!(date.day(), 25); +/// // This represents December 25th, 2024 +/// ``` +/// +/// ### Handling leap year dates +/// +/// ```rust +/// use temporal_rs::{PlainMonthDay, MonthCode, fields::CalendarFields, Calendar, options::Overflow}; +/// +/// // February 29th (leap day) +/// let leap_day = PlainMonthDay::new_with_overflow( +/// 2, 29, +/// Calendar::default(), +/// Overflow::Reject, +/// Some(2024) // reference year 2024 (a leap year) +/// ).unwrap(); +/// +/// assert_eq!(leap_day.month_code(), MonthCode::try_from_utf8("M02".as_bytes()).unwrap()); +/// assert_eq!(leap_day.day(), 29); +/// +/// // Convert to non-leap year - this would need special handling +/// let year_fields = CalendarFields::new().with_year(2023); // non-leap year +/// let result = leap_day.to_plain_date(Some(year_fields)); +/// // This might fail or be adjusted depending on the calendar's rules +/// ``` +/// +/// ### Practical use cases +/// +/// ```rust +/// use temporal_rs::{PlainMonthDay, fields::CalendarFields}; +/// use core::str::FromStr; +/// +/// // Birthday (recurring annually) +/// let birthday = PlainMonthDay::from_str("07-15").unwrap(); // July 15th +/// +/// // Calculate this year's birthday +/// let this_year = 2024; +/// let year_fields = CalendarFields::new().with_year(this_year); +/// let birthday_2024 = birthday.to_plain_date(Some(year_fields)).unwrap(); +/// assert_eq!(birthday_2024.year(), 2024); +/// assert_eq!(birthday_2024.month(), 7); +/// assert_eq!(birthday_2024.day(), 15); +/// +/// // Holiday (Christmas) +/// let christmas = PlainMonthDay::from_str("12-25").unwrap(); +/// let year_fields = CalendarFields::new().with_year(this_year); +/// let christmas_2024 = christmas.to_plain_date(Some(year_fields)).unwrap(); +/// assert_eq!(christmas_2024.month(), 12); +/// assert_eq!(christmas_2024.day(), 25); +/// ``` +/// +/// ## Reference +/// +/// For more information, see the [MDN documentation][mdn-plainmonthday]. +/// +/// [mdn-plainmonthday]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/PlainMonthDay +#[non_exhaustive] +#[derive(Debug, Default, Clone, PartialEq, Eq)] +pub struct PlainMonthDay { + pub iso: IsoDate, + calendar: Calendar, +} + +impl core::fmt::Display for PlainMonthDay { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + f.write_str(&self.to_ixdtf_string(DisplayCalendar::Auto)) + } +} + +impl PlainMonthDay { + /// Creates a new unchecked `PlainMonthDay` + #[inline] + #[must_use] + pub(crate) fn new_unchecked(iso: IsoDate, calendar: Calendar) -> Self { + Self { iso, calendar } + } + + /// Returns the ISO month value of `PlainMonthDay`. + #[inline] + #[must_use] + pub(crate) fn iso_month(&self) -> u8 { + self.iso.month + } + + /// Returns the ISO year value of `PlainMonthDay`. + #[inline] + #[must_use] + pub(crate) fn iso_year(&self) -> i32 { + self.iso.year + } +} + +impl PlainMonthDay { + /// Creates a new valid `PlainMonthDay`. + #[inline] + pub fn new_with_overflow( + month: u8, + day: u8, + calendar: Calendar, + overflow: Overflow, + ref_year: Option, + ) -> TemporalResult { + let ry = ref_year.unwrap_or(1972); + // 1972 is the first leap year in the Unix epoch (needed to cover all dates) + let iso = IsoDate::new_with_overflow(ry, month, day, overflow)?; + Ok(Self::new_unchecked(iso, calendar)) + } + + // Converts a UTF-8 encoded string into a `PlainMonthDay`. + pub fn from_utf8(s: &[u8]) -> TemporalResult { + let parsed = ParsedDate::month_day_from_utf8(s)?; + Self::from_parsed(parsed) + } + + // Converts a ParsedDate into a `PlainMonthDay`. + // + // Be sure to parse this using [`ParsedDate::month_day_from_utf8()`]~ + pub fn from_parsed(parsed: ParsedDate) -> TemporalResult { + let calendar = Calendar::new(parsed.calendar); + // 10. If calendar is "iso8601", then + if parsed.calendar == AnyCalendarKind::Iso { + // a. Let referenceISOYear be 1972 (the first ISO 8601 leap year after the epoch). + // b. Let isoDate be CreateISODateRecord(referenceISOYear, result.[[Month]], result.[[Day]]). + // c. Return !CreateTemporalMonthDay(isoDate, calendar). + let iso = IsoDate::new_unchecked(1972, parsed.record.month, parsed.record.day); + debug_assert!(iso.check_validity().is_ok(), "Found invalid ParsedDate"); + return Ok(Self::new_unchecked(iso, calendar)); + } + // 11. Let isoDate be CreateISODateRecord(result.[[Year]], result.[[Month]], result.[[Day]]). + // 12. If ISODateWithinLimits(isoDate) is false, throw a RangeError exception. + // Note: parse_month_day will refuse to parse MM-DD format month-days for non-ISO, but + // it will happily parse YYYY-MM-DD[u-ca=CAL]. These will be valid ISO dates; but they + // could potentially be out of Temporal range. + let iso = + IsoDate::new_unchecked(parsed.record.year, parsed.record.month, parsed.record.day); + iso.check_within_limits()?; + debug_assert!(iso.check_validity().is_ok(), "Found invalid ParsedDate"); + + // 13. Set result to ISODateToFields(calendar, isoDate, month-day). + + let intermediate = Self::new_unchecked(iso, Calendar::new(parsed.calendar)); + let fields = CalendarFields::from_month_day(&intermediate); + // 14. NOTE: The following operation is called with constrain regardless of the value of overflow, in + // order for the calendar to store a canonical value in the [[Year]] field of the [[ISODate]] internal slot of the result. + // 15. Set isoDate to ? CalendarMonthDayFromFields(calendar, result, constrain). + intermediate + .calendar() + .month_day_from_fields(fields, Overflow::Constrain) + } + + /// Create a `PlainYearMonth` from a `PartialDate` + pub fn from_partial(partial: PartialDate, overflow: Option) -> TemporalResult { + partial + .calendar + .month_day_from_fields(partial.calendar_fields, overflow.unwrap_or_default()) + } + + /// Create a `PlainMonthDay` with the provided fields from a [`PartialDate`]. + pub fn with(&self, fields: CalendarFields, overflow: Option) -> TemporalResult { + // Steps 1-6 are engine specific. + // 5. Let fields be ISODateToFields(calendar, monthDay.[[ISODate]], month-day). + // 6. Let partialMonthDay be ? PrepareCalendarFields(calendar, temporalMonthDayLike, « year, month, month-code, day », « », partial). + // + // NOTE: We assert that partial is not empty per step 6 + if fields.is_empty() { + return Err(TemporalError::r#type().with_message("partial object must have a field.")); + } + + // NOTE: We only need to set month / month_code and day, per spec. + // 7. Set fields to CalendarMergeFields(calendar, fields, partialMonthDay). + let merged_day = fields.day.unwrap_or(self.day()); + let mut merged = fields.with_day(merged_day); + if merged.month.is_none() && merged.month_code.is_none() { + // MonthDay resolution prefers month codes + // (ordinal months work, but require year information, which + // we may not have) + // We should NOT merge over year information even though we have it. + merged = merged.with_month_code(self.month_code()); + } + // Step 8-9 already handled by engine. + // 8. Let resolvedOptions be ? GetOptionsObject(options). + // 9. Let overflow be ? GetTemporalOverflowOption(resolvedOptions). + // 10. Let isoDate be ? CalendarMonthDayFromFields(calendar, fields, overflow). + // 11. Return ! CreateTemporalMonthDay(isoDate, calendar). + self.calendar + .month_day_from_fields(merged, overflow.unwrap_or(Overflow::Constrain)) + } + + /// Returns the string identifier for the current `Calendar`. + #[inline] + #[must_use] + pub fn calendar_id(&self) -> &'static str { + self.calendar.identifier() + } + + /// Returns a reference to `PlainMonthDay`'s inner `Calendar`. + #[inline] + #[must_use] + pub fn calendar(&self) -> &Calendar { + &self.calendar + } + + /// Returns the calendar `monthCode` value of `PlainMonthDay`. + #[inline] + pub fn month_code(&self) -> MonthCode { + self.calendar.month_code(&self.iso) + } + + /// Returns the calendar day value of `PlainMonthDay`. + #[inline] + pub fn day(&self) -> u8 { + self.calendar.day(&self.iso) + } + + /// Returns the internal reference year used by this MonthDay. + #[inline] + pub fn reference_year(&self) -> i32 { + self.calendar.year(&self.iso) + } + + /// Create a [`PlainDate`] from the current `PlainMonthDay`. + pub fn to_plain_date(&self, year: Option) -> TemporalResult { + let year_partial = match &year { + Some(partial) => partial, + None => return Err(TemporalError::r#type().with_message("Year must be provided")), + }; + + // Fallback logic: prefer year, else era/era_year + let mut fields = CalendarFields::new() + .with_month_code(self.month_code()) + .with_day(self.day()); + + if let Some(year) = year_partial.year { + fields.year = Some(year); + } else if let (Some(era), Some(era_year)) = (year_partial.era, year_partial.era_year) { + fields.era = Some(era); + fields.era_year = Some(era_year); + } else { + return Err(TemporalError::r#type() + .with_message("PartialDate must contain a year or era/era_year fields")); + } + + // 8. Let isoDate be ? CalendarDateFromFields(calendar, mergedFields, constrain). + self.calendar.date_from_fields(fields, Overflow::Constrain) + } + + /// Gets the epochMilliseconds represented by this YearMonth in the given timezone + /// (using the reference year, and noon time) + /// + // Useful for implementing HandleDateTimeTemporalYearMonth + pub fn epoch_ns_for_with_provider( + &self, + time_zone: TimeZone, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + // 2. Let isoDateTime be CombineISODateAndTimeRecord(temporalYearMonth.[[ISODate]], NoonTimeRecord()). + let iso = IsoDateTime::new(self.iso, IsoTime::noon())?; + // 3. Let epochNs be ? GetEpochNanosecondsFor(dateTimeFormat.[[TimeZone]], isoDateTime, compatible). + Ok(time_zone + .get_epoch_nanoseconds_for(iso, Disambiguation::Compatible, provider)? + .ns) + } + + /// Creates a RFC9557 IXDTF string from the current `PlainMonthDay`. + pub fn to_ixdtf_string(&self, display_calendar: DisplayCalendar) -> String { + self.to_ixdtf_writeable(display_calendar) + .write_to_string() + .into() + } + + /// Creates a RFC9557 IXDTF [`Writeable`]. + pub fn to_ixdtf_writeable(&self, display_calendar: DisplayCalendar) -> impl Writeable + '_ { + let ixdtf = FormattableMonthDay { + date: FormattableDate(self.iso_year(), self.iso_month(), self.iso.day), + calendar: FormattableCalendar { + show: display_calendar, + calendar: self.calendar().identifier(), + }, + }; + ixdtf + } +} + +impl FromStr for PlainMonthDay { + type Err = TemporalError; + + fn from_str(s: &str) -> Result { + Self::from_utf8(s.as_bytes()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::Calendar; + use tinystr::tinystr; + + #[test] + fn test_plain_month_day_with() { + let month_day = PlainMonthDay::from_utf8("01-15".as_bytes()).unwrap(); + + let new = month_day + .with(CalendarFields::new().with_day(22), None) + .unwrap(); + assert_eq!( + new.month_code(), + MonthCode::try_from_utf8("M01".as_bytes()).unwrap() + ); + assert_eq!(new.day(), 22,); + + let new = month_day + .with(CalendarFields::new().with_month(12), None) + .unwrap(); + assert_eq!( + new.month_code(), + MonthCode::try_from_utf8("M12".as_bytes()).unwrap() + ); + assert_eq!(new.day(), 15,); + } + + #[test] + fn test_to_plain_date_with_year() { + let month_day = + PlainMonthDay::new_with_overflow(5, 15, Calendar::default(), Overflow::Reject, None) + .unwrap(); + + let fields = CalendarFields::new().with_year(2025); + let plain_date = month_day.to_plain_date(Some(fields)).unwrap(); + assert_eq!(plain_date.iso_year(), 2025); + assert_eq!(plain_date.iso_month(), 5); + assert_eq!(plain_date.iso_day(), 15); + } + + #[test] + fn test_to_plain_date_with_era_and_era_year() { + // Use a calendar that supports era/era_year, e.g., "gregory" + let calendar = Calendar::from_str("gregory").unwrap(); + let month_day = + PlainMonthDay::new_with_overflow(3, 10, calendar.clone(), Overflow::Reject, None) + .unwrap(); + + // Era "ce" and era_year 2020 should resolve to year 2020 in Gregorian + let fields = CalendarFields::new() + .with_era(Some(tinystr!(19, "ce"))) + .with_era_year(Some(2020)); + let plain_date = month_day.to_plain_date(Some(fields)); + // Gregorian calendar in ICU4X may not resolve era/era_year unless year is also provided. + // Accept both Ok and Err, but if Ok, check the values. + match plain_date { + Ok(plain_date) => { + assert_eq!(plain_date.iso_year(), 2020); + assert_eq!(plain_date.iso_month(), 3); + assert_eq!(plain_date.iso_day(), 10); + } + Err(_) => { + // Acceptable if era/era_year fallback is not supported by the calendar impl + } + } + } + + #[test] + fn test_to_plain_date_missing_year_and_era() { + let month_day = + PlainMonthDay::new_with_overflow(7, 4, Calendar::default(), Overflow::Reject, None) + .unwrap(); + + // No year, no era/era_year + let fields = CalendarFields::new(); + let result = month_day.to_plain_date(Some(fields)); + assert!(result.is_err()); + } + + #[test] + fn test_to_plain_date_with_fallback_logic_matches_date() { + // This test ensures that the fallback logic in month_day matches the fallback logic in date.rs + let calendar = Calendar::from_str("gregory").unwrap(); + let month_day = + PlainMonthDay::new_with_overflow(12, 25, calendar.clone(), Overflow::Reject, None) + .unwrap(); + + // Provide only era/era_year, not year + let fields = CalendarFields::new() + .with_era(Some(tinystr!(19, "ce"))) + .with_era_year(Some(1999)); + let plain_date = month_day.to_plain_date(Some(fields)); + match plain_date { + Ok(plain_date) => { + assert_eq!(plain_date.iso_year(), 1999); + assert_eq!(plain_date.iso_month(), 12); + assert_eq!(plain_date.iso_day(), 25); + } + Err(_) => { + // Acceptable if era/era_year fallback is not supported by the calendar impl + } + } + } + #[test] + fn test_valid_strings() { + const TESTS: &[&str] = &[ + "02-29", + "02-28", + "2025-08-05", + "2025-08-05[u-ca=gregory]", + "2024-02-29[u-ca=gregory]", + ]; + for test in TESTS { + assert!(PlainMonthDay::from_utf8(test.as_bytes()).is_ok()); + } + } + #[test] + fn test_invalid_strings() { + const TESTS: &[&str] = &[ + // Out of range + "-99999-01-01", + "-99999-01-01[u-ca=gregory]", + // Not a leap year + "2025-02-29", + "2025-02-29[u-ca=gregory]", + // Format not allowed for non-Gregorian + "02-28[u-ca=gregory]", + ]; + for test in TESTS { + assert!(PlainMonthDay::from_utf8(test.as_bytes()).is_err()); + } + } + + #[test] + /// This test is for calendars where we don't wish to hardcode dates; but we do wish to know + /// that monthcodes can be constructed without issue + fn automated_reference_year() { + let reference_iso = IsoDate::new_unchecked(1972, 12, 31); + for cal in [ + AnyCalendarKind::HijriSimulatedMecca, + AnyCalendarKind::HijriUmmAlQura, + ] { + let calendar = Calendar::new(cal); + for month in 1..=12 { + for day in [29, 30] { + let month_code = crate::builtins::calendar::month_to_month_code(month).unwrap(); + + let calendar_fields = CalendarFields { + month_code: Some(month_code), + day: Some(day), + ..Default::default() + }; + + let md = calendar + .month_day_from_fields(calendar_fields, Overflow::Reject) + .unwrap(); + + assert!( + md.iso <= reference_iso, + "Reference ISO for {month}-{day} must be before 1972-12-31, found, {:?}", + md.iso, + ); + } + } + } + } + + #[test] + fn manual_test_reference_year() { + // monthCode, day, ISO string, expectedReferenceYear + // Some of these parsed strings are deliberately not using the reference year + // so that we can test all code paths. By default, when adding new strings, it is easier + // to just add the reference year + const TESTS: &[(&str, u8, &str, i32)] = &[ + ("M10", 30, "1868-10-30[u-ca=gregory]", 1972), + ("M08", 8, "1868-10-30[u-ca=indian]", 1894), + ("M09", 21, "2000-12-12[u-ca=indian]", 1894), + // Dates in the earlier half of the year get pushed back a year + ("M10", 22, "2000-01-12[u-ca=indian]", 1893), + ("M01", 11, "2000-03-30[u-ca=persian]", 1351), + ("M09", 22, "2000-12-12[u-ca=persian]", 1351), + ("M12", 29, "2025-03-19[u-ca=persian]", 1350), + // Leap day + ("M12", 30, "2025-03-20[u-ca=persian]", 1350), + ("M01", 1, "2025-03-21[u-ca=persian]", 1351), + ("M01", 1, "2025-03-21[u-ca=persian]", 1351), + ("M01", 1, "1972-01-01[u-ca=roc]", 61), + ("M02", 29, "2024-02-29[u-ca=roc]", 61), + ("M12", 1, "1972-12-01[u-ca=roc]", 61), + ("M01", 1, "1972-09-11[u-ca=coptic]", 1689), + ("M12", 1, "1972-08-07[u-ca=coptic]", 1688), + ("M13", 5, "1972-09-10[u-ca=coptic]", 1688), + ("M13", 6, "1971-09-11[u-ca=coptic]", 1687), + ("M01", 1, "1972-09-11[u-ca=ethiopic]", 1965), + ("M12", 1, "1972-08-07[u-ca=ethiopic]", 1964), + ("M13", 5, "1972-09-10[u-ca=ethiopic]", 1964), + ("M13", 6, "1971-09-11[u-ca=ethiopic]", 1963), + ("M01", 1, "1972-09-11[u-ca=ethioaa]", 7465), + ("M12", 1, "1972-08-07[u-ca=ethioaa]", 7464), + ("M13", 5, "1972-09-10[u-ca=ethioaa]", 7464), + ("M13", 6, "1971-09-11[u-ca=ethioaa]", 7463), + ("M01", 1, "1972-09-09[u-ca=hebrew]", 5733), + ("M02", 29, "1972-11-06[u-ca=hebrew]", 5733), + ("M03", 29, "1972-12-05[u-ca=hebrew]", 5733), + ("M03", 30, "1971-12-18[u-ca=hebrew]", 5732), + ("M05L", 29, "1970-03-07[u-ca=hebrew]", 5730), + ("M07", 1, "1972-03-16[u-ca=hebrew]", 5732), + ("M01", 1, "1972-02-16[u-ca=islamic-civil]", 1392), + ("M12", 29, "1972-02-15[u-ca=islamic-civil]", 1391), + ("M12", 30, "1971-02-26[u-ca=islamic-civil]", 1390), + ("M01", 1, "1972-02-15[u-ca=islamic-tbla]", 1392), + ("M12", 29, "1972-02-14[u-ca=islamic-tbla]", 1391), + ("M12", 30, "1971-02-25[u-ca=islamic-tbla]", 1390), + ]; + let reference_iso = IsoDate::new_unchecked(1972, 12, 31); + for (month_code, day, string, year) in TESTS { + let md = PlainMonthDay::from_str(string).expect(string); + + let calendar_fields = CalendarFields { + month_code: Some(month_code.parse().unwrap()), + day: Some(*day), + ..Default::default() + }; + + let md_from_partial = md + .calendar() + .month_day_from_fields(calendar_fields, Overflow::Reject) + .expect(string); + + assert_eq!( + md, + md_from_partial, + "Parsed {string}, compared with {}: Expected {}-{}, Found {}-{}", + md_from_partial.to_ixdtf_string(Default::default()), + md_from_partial.month_code().0, + md_from_partial.day(), + md.month_code().0, + md.day() + ); + + assert_eq!( + md_from_partial.reference_year(), + *year, + "Reference year for {string} ({month_code}-{day}) must be {year}", + ); + + assert!( + md.iso <= reference_iso && md_from_partial.iso <= reference_iso, + "Reference ISO for {string} ({}-{}) must be before 1972-12-31, found, {:?} / {:?}", + md.month_code().0, + md.day(), + md.iso, + md_from_partial.iso + ); + } + } +} diff --git a/deps/temporal/src/builtins/core/plain_time.rs b/deps/temporal/src/builtins/core/plain_time.rs new file mode 100644 index 00000000000000..0edd7ec8f25c35 --- /dev/null +++ b/deps/temporal/src/builtins/core/plain_time.rs @@ -0,0 +1,860 @@ +//! This module implements `Time` and any directly related algorithms. + +use crate::{ + builtins::{ + core::{DateDuration, Duration}, + duration::normalized::InternalDurationRecord, + }, + iso::IsoTime, + options::{ + DifferenceOperation, DifferenceSettings, Overflow, ResolvedRoundingOptions, + RoundingOptions, ToStringRoundingOptions, Unit, UnitGroup, + }, + parsers::{parse_time, IxdtfStringBuilder}, + TemporalError, TemporalResult, +}; +use alloc::string::String; +use core::str::FromStr; +use writeable::Writeable; + +use super::{duration::normalized::TimeDuration, PlainDateTime}; + +// TODO: add a PartialSignedTime + +/// A `PartialTime` represents partially filled `Time` fields. +#[derive(Debug, Default, Clone, Copy, PartialEq)] +pub struct PartialTime { + // A potentially set `hour` field. + pub hour: Option, + // A potentially set `minute` field. + pub minute: Option, + // A potentially set `second` field. + pub second: Option, + // A potentially set `millisecond` field. + pub millisecond: Option, + // A potentially set `microsecond` field. + pub microsecond: Option, + // A potentially set `nanosecond` field. + pub nanosecond: Option, +} + +impl PartialTime { + pub fn is_empty(&self) -> bool { + *self == Self::default() + } +} + +/// Convenience methods for building a `PartialTime` +impl PartialTime { + pub const fn new() -> Self { + Self { + hour: None, + minute: None, + second: None, + millisecond: None, + microsecond: None, + nanosecond: None, + } + } + + pub const fn with_hour(mut self, hour: Option) -> Self { + self.hour = hour; + self + } + + pub const fn with_minute(mut self, minute: Option) -> Self { + self.minute = minute; + self + } + + pub const fn with_second(mut self, second: Option) -> Self { + self.second = second; + self + } + + pub const fn with_millisecond(mut self, millisecond: Option) -> Self { + self.millisecond = millisecond; + self + } + + pub const fn with_microsecond(mut self, microsecond: Option) -> Self { + self.microsecond = microsecond; + self + } + + pub const fn with_nanosecond(mut self, nanosecond: Option) -> Self { + self.nanosecond = nanosecond; + self + } +} + +/// The native Rust implementation of `Temporal.PlainTime`. +/// +/// Represents a time of day such as "14:30:45.123" without any date or timezone +/// information. Contains hour, minute, second, and subsecond components with +/// nanosecond precision. +/// +/// Ideal for representing recurring daily events, schedules, or any time value +/// where the specific date is not relevant. +/// +/// ## Examples +/// +/// ### Creating time values +/// +/// ```rust +/// use temporal_rs::PlainTime; +/// +/// // High-precision time +/// let precise_time = PlainTime::try_new( +/// 14, 30, 45, // 2:30:45 PM +/// 123, 456, 789 // subsecond components +/// ).unwrap(); +/// assert_eq!(precise_time.hour(), 14); +/// assert_eq!(precise_time.millisecond(), 123); +/// +/// // Simple time without subseconds +/// let simple = PlainTime::try_new(9, 0, 0, 0, 0, 0).unwrap(); +/// assert_eq!(simple.hour(), 9); +/// ``` +/// +/// ### Parsing ISO 8601 time strings +/// +/// ```rust +/// use temporal_rs::PlainTime; +/// use core::str::FromStr; +/// +/// let time = PlainTime::from_str("14:30:45.123456789").unwrap(); +/// assert_eq!(time.hour(), 14); +/// assert_eq!(time.minute(), 30); +/// assert_eq!(time.second(), 45); +/// assert_eq!(time.millisecond(), 123); +/// assert_eq!(time.microsecond(), 456); +/// assert_eq!(time.nanosecond(), 789); +/// +/// // Also supports time-only portions of ISO 8601 strings +/// let time = PlainTime::from_str("T09:15:30").unwrap(); +/// assert_eq!(time.hour(), 9); +/// assert_eq!(time.minute(), 15); +/// assert_eq!(time.second(), 30); +/// ``` +/// +/// ### Time arithmetic +/// +/// ```rust +/// use temporal_rs::{PlainTime, Duration}; +/// use core::str::FromStr; +/// +/// let time = PlainTime::from_str("12:30:00").unwrap(); +/// +/// // Add 2 hours and 30 minutes +/// let later = time.add(&Duration::from_str("PT2H30M").unwrap()).unwrap(); +/// assert_eq!(later.hour(), 15); +/// assert_eq!(later.minute(), 0); +/// assert_eq!(later.second(), 0); +/// +/// // Calculate difference between times +/// let earlier = PlainTime::from_str("10:00:00").unwrap(); +/// let duration = earlier.until(&time, Default::default()).unwrap(); +/// assert_eq!(duration.hours(), 2); +/// assert_eq!(duration.minutes(), 30); +/// ``` +/// +/// ### Working with partial time fields +/// +/// ```rust +/// use temporal_rs::{PlainTime, partial::PartialTime}; +/// use core::str::FromStr; +/// +/// let time = PlainTime::from_str("12:30:45").unwrap(); +/// +/// // Change only the minute +/// let partial = PartialTime::new().with_minute(Some(15)); +/// let modified = time.with(partial, None).unwrap(); +/// assert_eq!(modified.hour(), 12); // unchanged +/// assert_eq!(modified.minute(), 15); // changed +/// assert_eq!(modified.second(), 45); // unchanged +/// ``` +/// +/// ### Rounding times +/// +/// ```rust +/// use temporal_rs::{PlainTime, options::{Unit, RoundingOptions}}; +/// use core::str::FromStr; +/// +/// let time = PlainTime::from_str("14:23:47.789").unwrap(); +/// +/// let mut options = RoundingOptions::default(); +/// options.smallest_unit = Some(Unit::Minute); +/// // Round to nearest minute +/// let rounded = time.round(options).unwrap(); +/// assert_eq!(rounded.hour(), 14); +/// assert_eq!(rounded.minute(), 24); +/// assert_eq!(rounded.second(), 0); +/// assert_eq!(rounded.millisecond(), 0); +/// ``` +/// +/// ## Reference +/// +/// For more information, see the [MDN documentation][mdn-plaintime]. +/// +/// [mdn-plaintime]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/PlainTime +#[non_exhaustive] +#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +pub struct PlainTime { + pub(crate) iso: IsoTime, +} + +// ==== Private API ==== + +impl PlainTime { + #[inline] + #[must_use] + /// Creates a new unvalidated `Time`. + pub(crate) fn new_unchecked(iso: IsoTime) -> Self { + Self { iso } + } + + /// Specification equivalent to `4.5.15 AddTime ( time, timeDuration )` + /// + /// Spec: + pub(crate) fn add_normalized_time_duration(&self, norm: TimeDuration) -> (i64, Self) { + // 1. Set second to second + TimeDurationSeconds(norm). + let second = i64::from(self.second()) + norm.seconds(); + // 2. Set nanosecond to nanosecond + TimeDurationSubseconds(norm). + let nanosecond = i32::from(self.nanosecond()) + norm.subseconds(); + // 3. Return BalanceTime(hour, minute, second, millisecond, microsecond, nanosecond). + let (day, balance_result) = IsoTime::balance( + self.hour().into(), + self.minute().into(), + second, + self.millisecond().into(), + self.microsecond().into(), + nanosecond.into(), + ); + + (day, Self::new_unchecked(balance_result)) + } + + /// Adds a `Duration` to the current `Time`. + /// + /// Spec Equivalent: `AddDurationToOrSubtractDurationFromPlainTime`. + pub(crate) fn add_to_time(&self, duration: &Duration) -> TemporalResult { + let (_, result) = IsoTime::balance( + i64::from(self.hour()).saturating_add(duration.hours()), + i64::from(self.minute()).saturating_add(duration.minutes()), + i64::from(self.second()).saturating_add(duration.seconds()), + i64::from(self.millisecond()).saturating_add(duration.milliseconds()), + i128::from(self.microsecond()).saturating_add(duration.microseconds()), + i128::from(self.nanosecond()).saturating_add(duration.nanoseconds()), + ); + + // NOTE (nekevss): IsoTime::balance should never return an invalid `IsoTime` + + Ok(Self::new_unchecked(result)) + } + + // TODO: Migrate to + /// Performs a desired difference op between two `Time`'s, returning the resulting `Duration`. + pub(crate) fn diff_time( + &self, + op: DifferenceOperation, + other: &PlainTime, + settings: DifferenceSettings, + ) -> TemporalResult { + // 1. If operation is SINCE, let sign be -1. Otherwise, let sign be 1. + // 2. Set other to ? ToTemporalTime(other). + // 3. Let resolvedOptions be ? SnapshotOwnProperties(? GetOptionsObject(options), null). + // 4. Let settings be ? GetDifferenceSettings(operation, resolvedOptions, TIME, « », "nanosecond", "hour"). + let resolved = ResolvedRoundingOptions::from_diff_settings( + settings, + op, + UnitGroup::Time, + Unit::Hour, + Unit::Nanosecond, + )?; + // 4. Let timeDuration be DifferenceTime(temporalTime.[[Time]], other.[[Time]]). + let mut normalized_time = self.iso.diff(&other.iso); + // 5. Set timeDuration to ! RoundTimeDuration(timeDuration, settings.[[RoundingIncrement]], settings.[[SmallestUnit]], settings.[[RoundingMode]]). + normalized_time = normalized_time.round(resolved)?; + // 6. Let duration be CombineDateAndTimeDuration(ZeroDateDuration(), timeDuration). + let duration = InternalDurationRecord::combine(DateDuration::default(), normalized_time); + // 7. Let result be ! TemporalDurationFromInternal(duration, settings.[[LargestUnit]]). + let result = Duration::from_internal(duration, resolved.largest_unit)?; + // 8. If operation is since, set result to CreateNegatedTemporalDuration(result). + // 9. Return result. + // 8. Return ! CreateTemporalDuration(0, 0, 0, 0, sign × result.[[Hours]], sign × result.[[Minutes]], sign × result.[[Seconds]], sign × result.[[Milliseconds]], sign × result.[[Microseconds]], sign × result.[[Nanoseconds]]). + match op { + DifferenceOperation::Until => Ok(result), + DifferenceOperation::Since => Ok(result.negated()), + } + } +} + +// ==== Public API ==== + +impl PlainTime { + /// Creates a new `PlainTime`, constraining any field into a valid range. + /// + /// ```rust + /// use temporal_rs::PlainTime; + /// + /// let time = PlainTime::new(23, 59, 59, 999, 999, 999).unwrap(); + /// + /// let constrained_time = PlainTime::new(24, 59, 59, 999, 999, 999).unwrap(); + /// assert_eq!(time, constrained_time); + /// ``` + pub fn new( + hour: u8, + minute: u8, + second: u8, + millisecond: u16, + microsecond: u16, + nanosecond: u16, + ) -> TemporalResult { + Self::new_with_overflow( + hour, + minute, + second, + millisecond, + microsecond, + nanosecond, + Overflow::Constrain, + ) + } + + /// Creates a new `PlainTime`, rejecting any field that is not in a valid range. + /// + /// ```rust + /// use temporal_rs::PlainTime; + /// + /// let time = PlainTime::try_new(23, 59, 59, 999, 999, 999).unwrap(); + /// + /// let invalid_time = PlainTime::try_new(24, 59, 59, 999, 999, 999); + /// assert!(invalid_time.is_err()); + /// ``` + pub fn try_new( + hour: u8, + minute: u8, + second: u8, + millisecond: u16, + microsecond: u16, + nanosecond: u16, + ) -> TemporalResult { + Self::new_with_overflow( + hour, + minute, + second, + millisecond, + microsecond, + nanosecond, + Overflow::Reject, + ) + } + + /// Creates a new `PlainTime` with the provided [`Overflow`] option. + #[inline] + pub fn new_with_overflow( + hour: u8, + minute: u8, + second: u8, + millisecond: u16, + microsecond: u16, + nanosecond: u16, + overflow: Overflow, + ) -> TemporalResult { + let time = IsoTime::new( + hour, + minute, + second, + millisecond, + microsecond, + nanosecond, + overflow, + )?; + Ok(Self::new_unchecked(time)) + } + + /// Creates a new `PlainTime` from a `PartialTime`. + /// + /// ```rust + /// use temporal_rs::{partial::PartialTime, PlainTime}; + /// + /// let partial_time = PartialTime { + /// hour: Some(22), + /// ..Default::default() + /// }; + /// + /// let time = PlainTime::from_partial(partial_time, None).unwrap(); + /// + /// assert_eq!(time.hour(), 22); + /// assert_eq!(time.minute(), 0); + /// assert_eq!(time.second(), 0); + /// assert_eq!(time.millisecond(), 0); + /// assert_eq!(time.microsecond(), 0); + /// assert_eq!(time.nanosecond(), 0); + /// + /// ``` + pub fn from_partial(partial: PartialTime, overflow: Option) -> TemporalResult { + // NOTE: 4.5.12 ToTemporalTimeRecord requires one field to be set. + if partial.is_empty() { + return Err(TemporalError::r#type().with_message("PartialTime cannot be empty.")); + } + + let overflow = overflow.unwrap_or_default(); + let iso = IsoTime::default().with(partial, overflow)?; + Ok(Self::new_unchecked(iso)) + } + + // Converts a UTF-8 encoded string into a `PlainTime`. + pub fn from_utf8(s: &[u8]) -> TemporalResult { + let result = parse_time(s)?; + let iso = IsoTime::from_time_record(result)?; + Ok(Self::new_unchecked(iso)) + } + + /// Creates a new `PlainTime` using the current `PlainTime` fields as a fallback. + /// + /// ```rust + /// use temporal_rs::{partial::PartialTime, PlainTime}; + /// + /// let partial_time = PartialTime { + /// hour: Some(22), + /// ..Default::default() + /// }; + /// + /// let initial = PlainTime::try_new(15, 30, 12, 123, 456, 789).unwrap(); + /// + /// let time = initial.with(partial_time, None).unwrap(); + /// + /// assert_eq!(time.hour(), 22); + /// assert_eq!(time.minute(), 30); + /// assert_eq!(time.second(), 12); + /// assert_eq!(time.millisecond(), 123); + /// assert_eq!(time.microsecond(), 456); + /// assert_eq!(time.nanosecond(), 789); + /// + /// ``` + pub fn with(&self, partial: PartialTime, overflow: Option) -> TemporalResult { + // NOTE: 4.5.12 ToTemporalTimeRecord requires one field to be set. + if partial.is_empty() { + return Err(TemporalError::r#type().with_message("PartialTime cannot be empty.")); + } + + let iso = self + .iso + .with(partial, overflow.unwrap_or(Overflow::Constrain))?; + Ok(Self::new_unchecked(iso)) + } + + /// Returns the internal `hour` field. + #[inline] + #[must_use] + pub const fn hour(&self) -> u8 { + self.iso.hour + } + + /// Returns the internal `minute` field. + #[inline] + #[must_use] + pub const fn minute(&self) -> u8 { + self.iso.minute + } + + /// Returns the internal `second` field. + #[inline] + #[must_use] + pub const fn second(&self) -> u8 { + self.iso.second + } + + /// Returns the internal `millisecond` field. + #[inline] + #[must_use] + pub const fn millisecond(&self) -> u16 { + self.iso.millisecond + } + + /// Returns the internal `microsecond` field. + #[inline] + #[must_use] + pub const fn microsecond(&self) -> u16 { + self.iso.microsecond + } + + /// Returns the internal `nanosecond` field. + #[inline] + #[must_use] + pub const fn nanosecond(&self) -> u16 { + self.iso.nanosecond + } + + /// Add a `Duration` to the current `Time`. + pub fn add(&self, duration: &Duration) -> TemporalResult { + self.add_to_time(duration) + } + + /// Subtract a `Duration` to the current `Time`. + pub fn subtract(&self, duration: &Duration) -> TemporalResult { + self.add_to_time(&duration.negated()) + } + + /// Returns the `Duration` until the provided `Time` from the current `Time`. + /// + /// NOTE: `until` assumes the provided other time will occur in the future relative to the current. + #[inline] + pub fn until(&self, other: &Self, settings: DifferenceSettings) -> TemporalResult { + self.diff_time(DifferenceOperation::Until, other, settings) + } + + /// Returns the `Duration` since the provided `Time` from the current `Time`. + /// + /// NOTE: `since` assumes the provided other time is in the past relative to the current. + #[inline] + pub fn since(&self, other: &Self, settings: DifferenceSettings) -> TemporalResult { + self.diff_time(DifferenceOperation::Since, other, settings) + } + + // TODO (nekevss): optimize and test rounding_increment type (f64 vs. u64). + /// Rounds the current `Time` according to provided options. + pub fn round(&self, options: RoundingOptions) -> TemporalResult { + let resolved = ResolvedRoundingOptions::from_time_options(options)?; + let (_, result) = self.iso.round(resolved)?; + + Ok(Self::new_unchecked(result)) + } + + pub fn to_ixdtf_string(&self, options: ToStringRoundingOptions) -> TemporalResult { + self.to_ixdtf_writeable(options) + .map(|x| x.write_to_string().into()) + } + + #[inline] + pub fn to_ixdtf_writeable( + &self, + options: ToStringRoundingOptions, + ) -> TemporalResult { + let resolved = options.resolve()?; + let (_, result) = self + .iso + .round(ResolvedRoundingOptions::from_to_string_options(&resolved))?; + let builder = IxdtfStringBuilder::default().with_time(result, resolved.precision); + Ok(builder) + } +} + +impl From for PlainTime { + fn from(pdt: PlainDateTime) -> Self { + pdt.to_plain_time() + } +} + +impl FromStr for PlainTime { + type Err = TemporalError; + + fn from_str(s: &str) -> Result { + Self::from_utf8(s.as_bytes()) + } +} + +// ==== Test land ==== + +#[cfg(test)] +mod tests { + use core::str::FromStr; + + use crate::{ + builtins::core::Duration, + iso::IsoTime, + options::{DifferenceSettings, Overflow, RoundingIncrement, RoundingOptions, Unit}, + }; + use num_traits::FromPrimitive; + + use super::PlainTime; + + fn assert_time(result: PlainTime, values: (u8, u8, u8, u16, u16, u16)) { + assert_eq!( + result, + PlainTime { + iso: IsoTime { + hour: values.0, + minute: values.1, + second: values.2, + millisecond: values.3, + microsecond: values.4, + nanosecond: values.5, + } + } + ); + } + + fn assert_duration( + result: Duration, + values: (i64, i64, i64, i64, i64, i64, i64, i64, i128, i128), + ) { + assert_eq!( + ( + result.years(), + result.months(), + result.weeks(), + result.days(), + result.hours(), + result.minutes(), + result.seconds(), + result.milliseconds(), + result.microseconds(), + result.nanoseconds() + ), + values + ) + } + + fn options(unit: Unit, increment: f64) -> RoundingOptions { + RoundingOptions { + smallest_unit: Some(unit), + increment: RoundingIncrement::try_from(increment).ok(), + ..Default::default() + } + } + + #[test] + fn from_str_cast_sanity_test() { + let max = u32::MAX; + let (millisecond, rem) = (max / 1_000_000, max % 1_000_000); + let (microsecond, nanosecond) = (rem / 1_000, rem % 1_000); + + assert!(i32::from_u32(millisecond).is_some()); + assert!(i32::from_u32(microsecond).is_some()); + assert!(i32::from_u32(nanosecond).is_some()); + } + + #[test] + fn basic_parse_time() { + let result = "T12:05:24-05:00[u-ca=iso8601]".parse::(); + assert_time(result.unwrap(), (12, 5, 24, 0, 0, 0)); + + let result = "T12:05:24.123456789-05:00[u-ca=iso8601]".parse::(); + assert_time(result.unwrap(), (12, 5, 24, 123, 456, 789)); + + let result = "2024-05-04 12:05:24.123456789-05:00[u-ca=iso8601]".parse::(); + assert_time(result.unwrap(), (12, 5, 24, 123, 456, 789)); + + let result = "2024-05-04 12:05:24.123456789-05:00[u-ca=iso8601]".parse::(); + assert_time(result.unwrap(), (12, 5, 24, 123, 456, 789)); + } + + #[test] + fn time_round_millisecond() { + let base = PlainTime::new_unchecked(IsoTime::new_unchecked(3, 34, 56, 987, 654, 321)); + + let result_1 = base.round(options(Unit::Millisecond, 1.0)).unwrap(); + assert_time(result_1, (3, 34, 56, 988, 0, 0)); + + let result_2 = base.round(options(Unit::Millisecond, 2.0)).unwrap(); + assert_time(result_2, (3, 34, 56, 988, 0, 0)); + + let result_3 = base.round(options(Unit::Millisecond, 4.0)).unwrap(); + assert_time(result_3, (3, 34, 56, 988, 0, 0)); + + let result_4 = base.round(options(Unit::Millisecond, 5.0)).unwrap(); + assert_time(result_4, (3, 34, 56, 990, 0, 0)); + } + + #[test] + fn time_round_microsecond() { + let base = PlainTime::new_unchecked(IsoTime::new_unchecked(3, 34, 56, 987, 654, 321)); + + let result_1 = base.round(options(Unit::Microsecond, 1.0)).unwrap(); + assert_time(result_1, (3, 34, 56, 987, 654, 0)); + + let result_2 = base.round(options(Unit::Microsecond, 2.0)).unwrap(); + assert_time(result_2, (3, 34, 56, 987, 654, 0)); + + let result_3 = base.round(options(Unit::Microsecond, 4.0)).unwrap(); + assert_time(result_3, (3, 34, 56, 987, 656, 0)); + + let result_4 = base.round(options(Unit::Microsecond, 5.0)).unwrap(); + assert_time(result_4, (3, 34, 56, 987, 655, 0)); + } + + #[test] + fn time_round_nanoseconds() { + let base = PlainTime::new_unchecked(IsoTime::new_unchecked(3, 34, 56, 987, 654, 321)); + + let result_1 = base.round(options(Unit::Nanosecond, 1.0)).unwrap(); + assert_time(result_1, (3, 34, 56, 987, 654, 321)); + + let result_2 = base.round(options(Unit::Nanosecond, 2.0)).unwrap(); + assert_time(result_2, (3, 34, 56, 987, 654, 322)); + + let result_3 = base.round(options(Unit::Nanosecond, 4.0)).unwrap(); + assert_time(result_3, (3, 34, 56, 987, 654, 320)); + + let result_4 = base.round(options(Unit::Nanosecond, 5.0)).unwrap(); + assert_time(result_4, (3, 34, 56, 987, 654, 320)); + } + + #[test] + fn add_duration_basic() { + let base = PlainTime::new_unchecked(IsoTime::new_unchecked(15, 23, 30, 123, 456, 789)); + let result = base.add(&"PT16H".parse::().unwrap()).unwrap(); + + assert_time(result, (7, 23, 30, 123, 456, 789)); + } + + #[test] + fn since_basic() { + let one = + PlainTime::new_with_overflow(15, 23, 30, 123, 456, 789, Overflow::Constrain).unwrap(); + let two = + PlainTime::new_with_overflow(14, 23, 30, 123, 456, 789, Overflow::Constrain).unwrap(); + let three = + PlainTime::new_with_overflow(13, 30, 30, 123, 456, 789, Overflow::Constrain).unwrap(); + + let result = one.since(&two, DifferenceSettings::default()).unwrap(); + assert_eq!(result.hours(), 1); + + let result = two.since(&one, DifferenceSettings::default()).unwrap(); + assert_eq!(result.hours(), -1); + + let result = one.since(&three, DifferenceSettings::default()).unwrap(); + assert_eq!(result.hours(), 1); + assert_eq!(result.minutes(), 53); + + let result = three.since(&one, DifferenceSettings::default()).unwrap(); + assert_eq!(result.hours(), -1); + assert_eq!(result.minutes(), -53); + } + + #[test] + fn until_basic() { + let one = + PlainTime::new_with_overflow(15, 23, 30, 123, 456, 789, Overflow::Constrain).unwrap(); + let two = + PlainTime::new_with_overflow(16, 23, 30, 123, 456, 789, Overflow::Constrain).unwrap(); + let three = + PlainTime::new_with_overflow(17, 0, 30, 123, 456, 789, Overflow::Constrain).unwrap(); + + let result = one.until(&two, DifferenceSettings::default()).unwrap(); + assert_eq!(result.hours(), 1); + + let result = two.until(&one, DifferenceSettings::default()).unwrap(); + assert_eq!(result.hours(), -1); + + let result = one.until(&three, DifferenceSettings::default()).unwrap(); + assert_eq!(result.hours(), 1); + assert_eq!(result.minutes(), 37); + + let result = three.until(&one, DifferenceSettings::default()).unwrap(); + assert_eq!(result.hours(), -1); + assert_eq!(result.minutes(), -37); + } + + #[test] + fn since_rounding() { + let earlier = PlainTime::new(3, 12, 34, 123, 456, 789).unwrap(); + let later = PlainTime::new(13, 47, 57, 988, 655, 322).unwrap(); + + let settings = DifferenceSettings { + smallest_unit: Some(Unit::Second), + increment: Some(RoundingIncrement::try_new(1).unwrap()), + ..Default::default() + }; + assert_duration( + later.since(&earlier, settings).unwrap(), + (0, 0, 0, 0, 10, 35, 23, 0, 0, 0), + ); + + let settings = DifferenceSettings { + smallest_unit: Some(Unit::Second), + increment: Some(RoundingIncrement::try_new(4).unwrap()), + ..Default::default() + }; + assert_duration( + later.since(&earlier, settings).unwrap(), + (0, 0, 0, 0, 10, 35, 20, 0, 0, 0), + ); + } + + #[test] + // test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-nanoseconds.js + fn rounding_increment_nanos() { + let time = + PlainTime::new_with_overflow(3, 34, 56, 987, 654, 321, Overflow::Constrain).unwrap(); + + assert_eq!( + time.round(options(Unit::Nanosecond, 1.0)).unwrap(), + PlainTime::new_with_overflow(3, 34, 56, 987, 654, 321, Overflow::Constrain).unwrap() + ); + assert_eq!( + time.round(options(Unit::Nanosecond, 2.0)).unwrap(), + PlainTime::new_with_overflow(3, 34, 56, 987, 654, 322, Overflow::Constrain).unwrap() + ); + assert_eq!( + time.round(options(Unit::Nanosecond, 4.0)).unwrap(), + PlainTime::new_with_overflow(3, 34, 56, 987, 654, 320, Overflow::Constrain).unwrap() + ); + assert_eq!( + time.round(options(Unit::Nanosecond, 5.0)).unwrap(), + PlainTime::new_with_overflow(3, 34, 56, 987, 654, 320, Overflow::Constrain).unwrap() + ); + assert_eq!( + time.round(options(Unit::Nanosecond, 8.0)).unwrap(), + PlainTime::new_with_overflow(3, 34, 56, 987, 654, 320, Overflow::Constrain).unwrap() + ); + assert_eq!( + time.round(options(Unit::Nanosecond, 10.0)).unwrap(), + PlainTime::new_with_overflow(3, 34, 56, 987, 654, 320, Overflow::Constrain).unwrap() + ); + assert_eq!( + time.round(options(Unit::Nanosecond, 20.0)).unwrap(), + PlainTime::new_with_overflow(3, 34, 56, 987, 654, 320, Overflow::Constrain).unwrap() + ); + assert_eq!( + time.round(options(Unit::Nanosecond, 25.0)).unwrap(), + PlainTime::new_with_overflow(3, 34, 56, 987, 654, 325, Overflow::Constrain).unwrap() + ); + assert_eq!( + time.round(options(Unit::Nanosecond, 40.0)).unwrap(), + PlainTime::new_with_overflow(3, 34, 56, 987, 654, 320, Overflow::Constrain).unwrap() + ); + assert_eq!( + time.round(options(Unit::Nanosecond, 50.0)).unwrap(), + PlainTime::new_with_overflow(3, 34, 56, 987, 654, 300, Overflow::Constrain).unwrap() + ); + assert_eq!( + time.round(options(Unit::Nanosecond, 100.0)).unwrap(), + PlainTime::new_with_overflow(3, 34, 56, 987, 654, 300, Overflow::Constrain).unwrap() + ); + assert_eq!( + time.round(options(Unit::Nanosecond, 125.0)).unwrap(), + PlainTime::new_with_overflow(3, 34, 56, 987, 654, 375, Overflow::Constrain).unwrap() + ); + assert_eq!( + time.round(options(Unit::Nanosecond, 200.0)).unwrap(), + PlainTime::new_with_overflow(3, 34, 56, 987, 654, 400, Overflow::Constrain).unwrap() + ); + assert_eq!( + time.round(options(Unit::Nanosecond, 250.0)).unwrap(), + PlainTime::new_with_overflow(3, 34, 56, 987, 654, 250, Overflow::Constrain).unwrap() + ); + assert_eq!( + time.round(options(Unit::Nanosecond, 500.0)).unwrap(), + PlainTime::new_with_overflow(3, 34, 56, 987, 654, 500, Overflow::Constrain).unwrap() + ); + } + + #[test] + fn invalid_time_from_strs() { + // UTC designator case + let invalid_cases = [ + "2019-10-01T09:00:00Z", + "2019-10-01T09:00:00Z[UTC]", + "09:00:00Z[UTC]", + "09:00:00Z", + ]; + for invalid_str in invalid_cases { + let err = PlainTime::from_str(invalid_str); + assert!(err.is_err()); + } + } +} diff --git a/deps/temporal/src/builtins/core/plain_year_month.rs b/deps/temporal/src/builtins/core/plain_year_month.rs new file mode 100644 index 00000000000000..5a9047f82d6876 --- /dev/null +++ b/deps/temporal/src/builtins/core/plain_year_month.rs @@ -0,0 +1,1132 @@ +//! This module implements `YearMonth` and any directly related algorithms. + +use alloc::string::String; +use core::{cmp::Ordering, str::FromStr}; + +use tinystr::TinyAsciiStr; + +use crate::{ + builtins::calendar::{CalendarFields, YearMonthCalendarFields}, + iso::{year_month_within_limits, IsoDate, IsoDateTime, IsoTime}, + options::{ + DifferenceOperation, DifferenceSettings, Disambiguation, DisplayCalendar, Overflow, + ResolvedRoundingOptions, RoundingIncrement, Unit, UnitGroup, + }, + parsed_intermediates::ParsedDate, + parsers::{FormattableCalendar, FormattableDate, FormattableYearMonth}, + provider::{NeverProvider, TimeZoneProvider}, + temporal_assert, + unix_time::EpochNanoseconds, + Calendar, MonthCode, TemporalError, TemporalResult, TemporalUnwrap, TimeZone, +}; + +use super::{ + duration::normalized::InternalDurationRecord, DateDuration, Duration, PlainDate, PlainDateTime, +}; +use writeable::Writeable; + +/// A partial PlainYearMonth record +#[derive(Debug, Default, Clone, PartialEq)] +pub struct PartialYearMonth { + pub calendar_fields: YearMonthCalendarFields, + /// The calendar field + pub calendar: Calendar, +} + +/// The native Rust implementation of `Temporal.PlainYearMonth`. +/// +/// Represents a specific month within a specific year, such as "January 2024" +/// or "December 2023", without a specific day component. +/// +/// Useful for representing time periods at month granularity, such as billing +/// periods, reporting intervals, or any scenario where you need to work with +/// entire months rather than specific dates. +/// +/// ## Examples +/// +/// ### Creating a PlainYearMonth +/// +/// ```rust +/// use temporal_rs::{PlainYearMonth, Calendar}; +/// +/// // Create with ISO 8601 calendar +/// let ym = PlainYearMonth::try_new_iso(2024, 3, None).unwrap(); +/// assert_eq!(ym.year(), 2024); +/// assert_eq!(ym.month(), 3); +/// assert_eq!(ym.calendar().identifier(), "iso8601"); +/// +/// // Create with explicit calendar and reference day +/// let ym = PlainYearMonth::try_new(2024, 3, Some(15), Calendar::default()).unwrap(); +/// assert_eq!(ym.year(), 2024); +/// assert_eq!(ym.month(), 3); +/// // Reference day helps with calendar calculations but doesn't affect the YearMonth itself +/// ``` +/// +/// ### Parsing ISO 8601 year-month strings +/// +/// ```rust +/// use temporal_rs::PlainYearMonth; +/// use core::str::FromStr; +/// +/// // Parse year-month strings +/// let ym = PlainYearMonth::from_str("2024-03").unwrap(); +/// assert_eq!(ym.year(), 2024); +/// assert_eq!(ym.month(), 3); +/// +/// // Also accepts full date strings (day is ignored for YearMonth semantics) +/// let ym2 = PlainYearMonth::from_str("2024-03-15").unwrap(); +/// assert_eq!(ym2.year(), 2024); +/// assert_eq!(ym2.month(), 3); +/// assert_eq!(ym, ym2); // equivalent +/// ``` +/// +/// ### YearMonth arithmetic +/// +/// ```rust +/// use temporal_rs::{PlainYearMonth, options::DifferenceSettings}; +/// use core::str::FromStr; +/// +/// let ym1 = PlainYearMonth::from_str("2024-01").unwrap(); +/// let ym2 = PlainYearMonth::from_str("2024-04").unwrap(); +/// +/// // Calculate difference between year-months +/// let duration = ym1.until(&ym2, DifferenceSettings::default()).unwrap(); +/// assert_eq!(duration.months(), 3); // January to April = 3 months +/// ``` +/// +/// ### Working with partial fields +/// +/// ```rust +/// use temporal_rs::{PlainYearMonth, fields::YearMonthCalendarFields}; +/// use core::str::FromStr; +/// +/// let ym = PlainYearMonth::from_str("2024-01").unwrap(); +/// +/// // Change only the year +/// let fields = YearMonthCalendarFields::new().with_year(2025); +/// let modified = ym.with(fields, None).unwrap(); +/// assert_eq!(modified.year(), 2025); +/// assert_eq!(modified.month(), 1); // unchanged +/// +/// // Change only the month +/// let fields = YearMonthCalendarFields::new().with_month(6); +/// let modified = ym.with(fields, None).unwrap(); +/// assert_eq!(modified.year(), 2024); // unchanged +/// assert_eq!(modified.month(), 6); +/// ``` +/// +/// ### Converting to PlainDate +/// +/// ```rust +/// use temporal_rs::{PlainYearMonth, fields::CalendarFields}; +/// use core::str::FromStr; +/// +/// let ym = PlainYearMonth::from_str("2024-03").unwrap(); +/// +/// // Convert to a specific date by providing a day +/// let day_fields = CalendarFields::new().with_day(15); +/// let date = ym.to_plain_date(Some(day_fields)).unwrap(); +/// assert_eq!(date.year(), 2024); +/// assert_eq!(date.month(), 3); +/// assert_eq!(date.day(), 15); +/// ``` +/// +/// ### Calendar properties +/// +/// ```rust +/// use temporal_rs::PlainYearMonth; +/// use core::str::FromStr; +/// +/// let ym = PlainYearMonth::from_str("2024-02").unwrap(); // February 2024 +/// +/// // Get calendar-specific properties +/// assert_eq!(ym.days_in_month(), 29); // 2024 is a leap year +/// assert_eq!(ym.days_in_year(), 366); // leap year has 366 days +/// assert_eq!(ym.months_in_year(), 12); // ISO calendar has 12 months +/// assert!(ym.in_leap_year()); // 2024 is indeed a leap year +/// ``` +/// +/// ## Reference +/// +/// For more information, see the [MDN documentation][mdn-plainyearmonth]. +/// +/// [mdn-plainyearmonth]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/PlainYearMonth +#[non_exhaustive] +#[derive(Debug, Default, Clone, PartialEq, Eq)] +pub struct PlainYearMonth { + pub(crate) iso: IsoDate, + calendar: Calendar, +} + +impl core::fmt::Display for PlainYearMonth { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + f.write_str(&self.to_ixdtf_string(DisplayCalendar::Auto)) + } +} + +impl PlainYearMonth { + /// Creates an unvalidated `YearMonth`. + #[inline] + #[must_use] + pub(crate) fn new_unchecked(iso: IsoDate, calendar: Calendar) -> Self { + Self { iso, calendar } + } + + /// [`9.5.8 AddDurationToYearMonth(operation, yearMonth, temporalDurationLike, options)`][spec] + /// + /// Internal addition method for adding `Duration` to a `PlainYearMonth` + /// + /// [spec]: + /// + // spec(2025-06-23): https://github.com/tc39/proposal-temporal/tree/ed49b0b482981119c9b5e28b0686d877d4a9bae0 + pub(crate) fn add_duration( + &self, + duration: &Duration, + overflow: Overflow, + ) -> TemporalResult { + // NOTE: The following are engine specific: + // SKIP: 1. Let duration be ? ToTemporalDuration(temporalDurationLike). + + // NOTE: The following operation has been moved to the caller. + // MOVE: 2. If operation is subtract, set duration to CreateNegatedTemporalDuration(duration). + + // NOTE: The following are engine specific: + // SKIP: 3. Let resolvedOptions be ? GetOptionsObject(options). + // SKIP: 4. Let overflow be ? GetTemporalOverflowOption(resolvedOptions). + + // 5. Let sign be DurationSign(duration). + let sign = duration.sign(); + + // 6. Let calendar be yearMonth.[[Calendar]]. + let calendar = self.calendar(); + + // 7. Let fields be ISODateToFields(calendar, yearMonth.[[ISODate]], year-month). + let fields = CalendarFields::from(YearMonthCalendarFields::try_from_year_month(self)?); + + // 8. Set fields.[[Day]] to 1. + let fields = fields.with_day(1); + + // 9. Let intermediateDate be ? CalendarDateFromFields(calendar, fields, constrain). + let intermediate_date = calendar.date_from_fields(fields, overflow)?; + + // 10. If sign < 0, then + let date = if sign.as_sign_multiplier() < 0 { + // a. Let oneMonthDuration be ! CreateDateDurationRecord(0, 1, 0, 0). + let one_month_duration = DateDuration::new_unchecked(0, 1, 0, 0); + + // b. Let nextMonth be ? CalendarDateAdd(calendar, intermediateDate, oneMonthDuration, constrain). + let next_month = calendar.date_add( + &intermediate_date.iso, + &one_month_duration, + Overflow::Constrain, + )?; + + // c. Let date be BalanceISODate(nextMonth.[[Year]], nextMonth.[[Month]], nextMonth.[[Day]] - 1). + let date = IsoDate::balance( + next_month.year(), + i32::from(next_month.month()), + i32::from(next_month.day()) + .checked_sub(1) + .temporal_unwrap()?, + ); + + // d. Assert: ISODateWithinLimits(date) is true. + temporal_assert!(date.is_valid()); + + date + } else { + // 11. Else, + // a. Let date be intermediateDate. + intermediate_date.iso + }; + + // 12. Let durationToAdd be ToDateDurationRecordWithoutTime(duration). + let duration_to_add = duration.to_date_duration_record_without_time()?; + + // 13. Let addedDate be ? CalendarDateAdd(calendar, date, durationToAdd, overflow). + let added_date = calendar.date_add(&date, &duration_to_add, overflow)?; + + // 14. Let addedDateFields be ISODateToFields(calendar, addedDate, year-month). + let added_date_fields = YearMonthCalendarFields::new() + .with_month_code(added_date.month_code()) + .with_year(added_date.year()); + + // 15. Let isoDate be ? CalendarYearMonthFromFields(calendar, addedDateFields, overflow). + let iso_date = calendar.year_month_from_fields(added_date_fields, overflow)?; + + // 16. Return ! CreateTemporalYearMonth(isoDate, calendar). + Ok(iso_date) + } + + /// The internal difference operation of `PlainYearMonth`. + pub(crate) fn diff( + &self, + op: DifferenceOperation, + other: &Self, + settings: DifferenceSettings, + ) -> TemporalResult { + // 1. Set other to ? ToTemporalYearMonth(other). + // 2. Let calendar be yearMonth.[[Calendar]]. + // 3. If CalendarEquals(calendar, other.[[Calendar]]) is false, throw a RangeError exception. + if self.calendar().identifier() != other.calendar().identifier() { + return Err(TemporalError::range() + .with_message("Calendars for difference operation are not the same.")); + } + + // Check if weeks or days are disallowed in this operation + if matches!(settings.largest_unit, Some(Unit::Week) | Some(Unit::Day)) + || matches!(settings.smallest_unit, Some(Unit::Week) | Some(Unit::Day)) + { + return Err(TemporalError::range() + .with_message("Weeks and days are not allowed in this operation.")); + } + + // 4. Let resolvedOptions be ? GetOptionsObject(options). + // 5. Let settings be ? GetDifferenceSettings(operation, resolvedOptions, date, « week, day », month, year). + let resolved = ResolvedRoundingOptions::from_diff_settings( + settings, + op, + UnitGroup::Date, + Unit::Year, + Unit::Month, + )?; + + // 6. If CompareISODate(yearMonth.[[ISODate]], other.[[ISODate]]) = 0, then + if self.iso == other.iso { + // a. Return ! CreateTemporalDuration(0, 0, 0, 0, 0, 0, 0, 0, 0, 0). + return Ok(Duration::default()); + } + + // 7. Let thisFields be ISODateToFields(calendar, yearMonth.[[ISODate]], year-month). + // 8. Set thisFields.[[Day]] to 1. + // 9. Let thisDate be ? CalendarDateFromFields(calendar, thisFields, constrain). + let mut this_iso = self.iso; + this_iso.day = 1; + this_iso.check_within_limits()?; + // 10. Let otherFields be ISODateToFields(calendar, other.[[ISODate]], year-month). + // 11. Set otherFields.[[Day]] to 1. + // 12. Let otherDate be ? CalendarDateFromFields(calendar, otherFields, constrain). + let mut other_iso = other.iso; + other_iso.day = 1; + other_iso.check_within_limits()?; + // 13. Let dateDifference be CalendarDateUntil(calendar, thisDate, otherDate, settings.[[LargestUnit]]). + let result = self + .calendar() + .date_until(&this_iso, &other_iso, resolved.largest_unit)?; + // 14. Let yearsMonthsDifference be ! AdjustDateDurationRecord(dateDifference, 0, 0). + let result = result.date().adjust(0, Some(0), None)?; + + // 15. Let duration be CombineDateAndTimeDuration(yearsMonthsDifference, 0). + let mut duration = InternalDurationRecord::from_date_duration(result)?; + + // 16. If settings.[[SmallestUnit]] is not month or settings.[[RoundingIncrement]] ≠ 1, then + if resolved.smallest_unit != Unit::Month || resolved.increment != RoundingIncrement::ONE { + // a. Let isoDateTime be CombineISODateAndTimeRecord(thisDate, MidnightTimeRecord()). + let iso_date_time = IsoDateTime::new_unchecked(this_iso, IsoTime::default()); + // b. Let isoDateTimeOther be CombineISODateAndTimeRecord(otherDate, MidnightTimeRecord()). + let target_iso_date_time = IsoDateTime::new_unchecked(other_iso, IsoTime::default()); + // c. Let destEpochNs be GetUTCEpochNanoseconds(isoDateTimeOther). + let dest_epoch_ns = target_iso_date_time.as_nanoseconds(); + // d. Set duration to ? RoundRelativeDuration(duration, destEpochNs, isoDateTime, unset, calendar, resolved.[[LargestUnit]], resolved.[[RoundingIncrement]], resolved.[[SmallestUnit]], resolved.[[RoundingMode]]). + duration = duration.round_relative_duration( + dest_epoch_ns.as_i128(), + &PlainDateTime::new_unchecked(iso_date_time, self.calendar.clone()), + Option::<(&TimeZone, &NeverProvider)>::None, + resolved, + )?; + } + + // 17. Let result be ! TemporalDurationFromInternal(duration, day). + let result = Duration::from_internal(duration, Unit::Day)?; + + // 18. If operation is since, set result to CreateNegatedTemporalDuration(result). + // 19. Return result. + match op { + DifferenceOperation::Since => Ok(result.negated()), + DifferenceOperation::Until => Ok(result), + } + } + + /// Returns the iso month value for this `YearMonth`. + #[inline] + #[must_use] + pub(crate) fn iso_month(&self) -> u8 { + self.iso.month + } + + /// Returns the iso year value for this `YearMonth`. + #[inline] + #[must_use] + pub(crate) fn iso_year(&self) -> i32 { + self.iso.year + } +} + +// ==== Public method implementations ==== + +impl PlainYearMonth { + /// Creates a new `PlainYearMonth`, constraining any arguments that are invalid into a valid range. + #[inline] + pub fn new( + year: i32, + month: u8, + reference_day: Option, + calendar: Calendar, + ) -> TemporalResult { + Self::new_with_overflow(year, month, reference_day, calendar, Overflow::Constrain) + } + + /// Creates a new `PlainYearMonth`, rejecting any date that may be invalid. + #[inline] + pub fn try_new( + year: i32, + month: u8, + reference_day: Option, + calendar: Calendar, + ) -> TemporalResult { + Self::new_with_overflow(year, month, reference_day, calendar, Overflow::Reject) + } + + /// Creates a new `PlainYearMonth` with an ISO 8601 calendar, rejecting any date that may be invalid. + #[inline] + pub fn try_new_iso(year: i32, month: u8, reference_day: Option) -> TemporalResult { + Self::try_new(year, month, reference_day, Calendar::ISO) + } + + /// Creates a new `PlainYearMonth` with an ISO 8601 calendar, constraining any arguments + /// that are invalid into a valid range. + #[inline] + pub fn new_iso(year: i32, month: u8, reference_day: Option) -> TemporalResult { + Self::new(year, month, reference_day, Calendar::ISO) + } + + /// Creates a new valid `YearMonth` with provided [`Overflow`] option. + #[inline] + pub fn new_with_overflow( + year: i32, + month: u8, + reference_day: Option, + calendar: Calendar, + overflow: Overflow, + ) -> TemporalResult { + let day = reference_day.unwrap_or(1); + let iso = IsoDate::regulate(year, month, day, overflow)?; + if !year_month_within_limits(iso.year, iso.month) { + return Err(TemporalError::range().with_message("Exceeded valid range.")); + } + Ok(Self::new_unchecked(iso, calendar)) + } + + /// Create a `PlainYearMonth` from a `PartialYearMonth` + pub fn from_partial( + partial: PartialYearMonth, + overflow: Option, + ) -> TemporalResult { + partial + .calendar + .year_month_from_fields(partial.calendar_fields, overflow.unwrap_or_default()) + } + + // Converts a UTF-8 encoded string into a `PlainYearMonth`. + pub fn from_utf8(s: &[u8]) -> TemporalResult { + let parsed = ParsedDate::year_month_from_utf8(s)?; + Self::from_parsed(parsed) + } + + /// Converts a ParsedDate into a `PlainYearMonth`. + /// + /// Be sure to parse this using [`ParsedDate::year_month_from_utf8()`]~ + pub fn from_parsed(parsed: ParsedDate) -> TemporalResult { + let date = parsed.record; + // The below steps are from `ToTemporalYearMonth` + // 10. Let isoDate be CreateISODateRecord(result.[[Year]], result.[[Month]], result.[[Day]]). + let iso = IsoDate::new_unchecked(date.year, date.month, date.day); + + // 11. If ISOYearMonthWithinLimits(isoDate) is false, throw a RangeError exception. + if !year_month_within_limits(iso.year, iso.month) { + return Err(TemporalError::range().with_message("Exceeded valid range.")); + } + debug_assert!(iso.check_validity().is_ok(), "Found invalid ParsedDate"); + + let intermediate = Self::new_unchecked(iso, Calendar::new(parsed.calendar)); + // 12. Set result to ISODateToFields(calendar, isoDate, year-month). + let fields = YearMonthCalendarFields::try_from_year_month(&intermediate)?; + // 13. NOTE: The following operation is called with constrain regardless of the + // value of overflow, in order for the calendar to store a canonical value in the + // [[Day]] field of the [[ISODate]] internal slot of the result. + // 14. Set isoDate to ? CalendarYearMonthFromFields(calendar, result, constrain). + // 15. Return ! CreateTemporalYearMonth(isoDate, calendar). + intermediate + .calendar() + .year_month_from_fields(fields, Overflow::Constrain) + } + + /// Returns the calendar era of the current `PlainYearMonth` + pub fn era(&self) -> Option> { + self.calendar().era(&self.iso) + } + + /// Returns the calendar era year of the current `PlainYearMonth` + pub fn era_year(&self) -> Option { + self.calendar().era_year(&self.iso) + } + + /// Returns the calendar year of the current `PlainYearMonth` + pub fn year(&self) -> i32 { + self.calendar().year(&self.iso) + } + + /// Returns the calendar month of the current `PlainYearMonth` + pub fn month(&self) -> u8 { + self.calendar().month(&self.iso) + } + + /// Returns the calendar reference day of the current `PlainYearMonth` + pub fn reference_day(&self) -> u8 { + self.calendar().day(&self.iso) + } + + /// Returns the calendar month code of the current `PlainYearMonth` + pub fn month_code(&self) -> MonthCode { + self.calendar().month_code(&self.iso) + } + + /// Returns the days in the calendar year of the current `PlainYearMonth`. + pub fn days_in_year(&self) -> u16 { + self.calendar().days_in_year(&self.iso) + } + + /// Returns the days in the calendar month of the current `PlainYearMonth`. + pub fn days_in_month(&self) -> u16 { + self.calendar().days_in_month(&self.iso) + } + + /// Returns the months in the calendar year of the current `PlainYearMonth`. + pub fn months_in_year(&self) -> u16 { + self.calendar().months_in_year(&self.iso) + } + + #[inline] + #[must_use] + /// Returns a boolean representing whether the current `PlainYearMonth` is in a leap year. + pub fn in_leap_year(&self) -> bool { + self.calendar().in_leap_year(&self.iso) + } +} + +impl PlainYearMonth { + /// Returns the Calendar value. + #[inline] + #[must_use] + pub fn calendar(&self) -> &Calendar { + &self.calendar + } + + /// Returns the string identifier for the current calendar used. + #[inline] + #[must_use] + pub fn calendar_id(&self) -> &'static str { + self.calendar.identifier() + } + + /// Creates a `PlainYearMonth` using the fields provided from a [`PartialYearMonth`] + pub fn with( + &self, + fields: YearMonthCalendarFields, + overflow: Option, + ) -> TemporalResult { + // 1. Let yearMonth be the this value. + // 2. Perform ? RequireInternalSlot(yearMonth, [[InitializedTemporalYearMonth]]). + // 3. If ? IsPartialTemporalObject(temporalYearMonthLike) is false, throw a TypeError exception. + // 4. Let calendar be yearMonth.[[Calendar]]. + // 5. Let fields be ISODateToFields(calendar, yearMonth.[[ISODate]], year-month). + // 6. Let partialYearMonth be ? PrepareCalendarFields(calendar, temporalYearMonthLike, « year, month, month-code », « », partial). + // 7. Set fields to CalendarMergeFields(calendar, fields, partialYearMonth). + // 8. Let resolvedOptions be ? GetOptionsObject(options). + // 9. Let overflow be ? GetTemporalOverflowOption(resolvedOptions). + // 10. Let isoDate be ? CalendarYearMonthFromFields(calendar, fields, overflow). + // 11. Return ! CreateTemporalYearMonth(isoDate, calendar). + let overflow = overflow.unwrap_or(Overflow::Constrain); + self.calendar.year_month_from_fields( + fields.with_fallback_year_month(self, self.calendar.kind(), overflow)?, + overflow, + ) + } + + /// Compares one `PlainYearMonth` to another `PlainYearMonth` using their + /// `IsoDate` representation. + /// + /// # Note on Ordering. + /// + /// `temporal_rs` does not implement `PartialOrd`/`Ord` as `PlainYearMonth` does + /// not fulfill all the conditions required to implement the traits. However, + /// it is possible to compare `PlainDate`'s as their `IsoDate` representation. + #[inline] + #[must_use] + pub fn compare_iso(&self, other: &Self) -> Ordering { + self.iso.cmp(&other.iso) + } + + /// Adds a [`Duration`] from the current `PlainYearMonth`. + #[inline] + pub fn add(&self, duration: &Duration, overflow: Overflow) -> TemporalResult { + self.add_duration(duration, overflow) + } + + /// Subtracts a [`Duration`] from the current `PlainYearMonth`. + #[inline] + pub fn subtract(&self, duration: &Duration, overflow: Overflow) -> TemporalResult { + self.add_duration(&duration.negated(), overflow) + } + + /// Returns a `Duration` representing the period of time from this `PlainYearMonth` until the other `PlainYearMonth`. + #[inline] + pub fn until(&self, other: &Self, settings: DifferenceSettings) -> TemporalResult { + self.diff(DifferenceOperation::Until, other, settings) + } + + /// Returns a `Duration` representing the period of time from this `PlainYearMonth` since the other `PlainYearMonth`. + #[inline] + pub fn since(&self, other: &Self, settings: DifferenceSettings) -> TemporalResult { + self.diff(DifferenceOperation::Since, other, settings) + } + + pub fn to_plain_date(&self, day: Option) -> TemporalResult { + let day_value = match &day { + Some(fields) => fields.day.ok_or_else(|| { + TemporalError::r#type().with_message("CalendarFields must contain a day field") + })?, + None => return Err(TemporalError::r#type().with_message("Day must be provided")), + }; + + let fields = CalendarFields::new() + .with_year(self.year()) + .with_month_code(self.month_code()) + .with_day(day_value); + + // 8. Let isoDate be ? CalendarDateFromFields(calendar, mergedFields, constrain). + self.calendar.date_from_fields(fields, Overflow::Constrain) + } + + /// Gets the epochMilliseconds represented by this YearMonth in the given timezone + /// (using the reference year, and noon time) + /// + // Useful for implementing HandleDateTimeTemporalYearMonth + pub fn epoch_ns_for_with_provider( + &self, + time_zone: TimeZone, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + // 2. Let isoDateTime be CombineISODateAndTimeRecord(temporalYearMonth.[[ISODate]], NoonTimeRecord()). + let iso = IsoDateTime::new(self.iso, IsoTime::noon())?; + // 3. Let epochNs be ? GetEpochNanosecondsFor(dateTimeFormat.[[TimeZone]], isoDateTime, compatible). + Ok(time_zone + .get_epoch_nanoseconds_for(iso, Disambiguation::Compatible, provider)? + .ns) + } + + /// Returns a RFC9557 IXDTF string for the current `PlainYearMonth` + #[inline] + pub fn to_ixdtf_string(&self, display_calendar: DisplayCalendar) -> String { + self.to_ixdtf_writeable(display_calendar) + .write_to_string() + .into() + } + + /// Returns a RFC9557 IXDTF string for the current `PlainYearMonth` as a Writeable + #[inline] + pub fn to_ixdtf_writeable(&self, display_calendar: DisplayCalendar) -> impl Writeable + '_ { + let ixdtf = FormattableYearMonth { + date: FormattableDate(self.iso_year(), self.iso_month(), self.iso.day), + calendar: FormattableCalendar { + show: display_calendar, + calendar: self.calendar().identifier(), + }, + }; + ixdtf + } +} + +impl FromStr for PlainYearMonth { + type Err = TemporalError; + + fn from_str(s: &str) -> Result { + Self::from_utf8(s.as_bytes()) + } +} + +#[cfg(test)] +mod tests { + use core::str::FromStr; + + use super::PlainYearMonth; + + use tinystr::tinystr; + + use super::*; + + #[test] + fn plain_year_month_since_until_diff_tests() { + // Equal year-months + { + let earlier = PlainYearMonth::from_str("2024-03").unwrap(); + let later = PlainYearMonth::from_str("2024-03").unwrap(); + let settings = DifferenceSettings { + smallest_unit: Some(Unit::Month), + ..Default::default() + }; + + let until = earlier.until(&later, settings).unwrap(); + let since = earlier.since(&later, settings).unwrap(); + + assert_eq!(until.days(), 0); + assert_eq!(until.months(), 0); + assert_eq!(until.years(), 0); + + assert_eq!(since.days(), 0); + assert_eq!(since.months(), 0); + assert_eq!(since.years(), 0); + } + + // One month apart + { + let earlier = PlainYearMonth::from_str("2023-01").unwrap(); + let later = PlainYearMonth::from_str("2023-02").unwrap(); + let settings = DifferenceSettings { + smallest_unit: Some(Unit::Month), + ..Default::default() + }; + + let until = earlier.until(&later, settings).unwrap(); + let since = earlier.since(&later, settings).unwrap(); + + assert_eq!(until.months(), 1); + assert_eq!(until.years(), 0); + + assert_eq!(since.months(), -1); + assert_eq!(since.years(), 0); + } + + // Crossing year boundary + { + let earlier = PlainYearMonth::from_str("2022-11").unwrap(); + let later = PlainYearMonth::from_str("2023-02").unwrap(); + let settings = DifferenceSettings { + smallest_unit: Some(Unit::Month), + ..Default::default() + }; + + let until = earlier.until(&later, settings).unwrap(); + let since = earlier.since(&later, settings).unwrap(); + + assert_eq!(until.months(), 3); + assert_eq!(until.years(), 0); + + assert_eq!(since.months(), -3); + assert_eq!(since.years(), 0); + } + + // One year and one month + { + let earlier = PlainYearMonth::from_str("2002-05").unwrap(); + let later = PlainYearMonth::from_str("2003-06").unwrap(); + let settings = DifferenceSettings { + smallest_unit: Some(Unit::Month), + ..Default::default() + }; + + let until = earlier.until(&later, settings).unwrap(); + let since = earlier.since(&later, settings).unwrap(); + + assert_eq!(until.years(), 1); + assert_eq!(until.months(), 1); + assert_eq!(until.days(), 0); + + assert_eq!(since.years(), -1); + assert_eq!(since.months(), -1); + assert_eq!(since.days(), 0); + } + + // One year apart with unit = Year + { + let earlier = PlainYearMonth::from_str("2022-06").unwrap(); + let later = PlainYearMonth::from_str("2023-06").unwrap(); + let settings = DifferenceSettings { + smallest_unit: Some(Unit::Year), + ..Default::default() + }; + + let until = earlier.until(&later, settings).unwrap(); + let since = earlier.since(&later, settings).unwrap(); + + assert_eq!(until.years(), 1); + assert_eq!(until.months(), 0); + + assert_eq!(since.years(), -1); + assert_eq!(since.months(), 0); + } + + // Large year gap + { + let earlier = PlainYearMonth::from_str("1000-01").unwrap(); + let later = PlainYearMonth::from_str("2000-01").unwrap(); + let settings = DifferenceSettings { + smallest_unit: Some(Unit::Year), + ..Default::default() + }; + + let until = earlier.until(&later, settings).unwrap(); + let since = earlier.since(&later, settings).unwrap(); + + assert_eq!(until.years(), 1000); + assert_eq!(since.years(), -1000); + } + + // Lower ISO limit plus one month + // (The lower iso limit iteslf does not work since the day is set to 1) + { + let earlier = PlainYearMonth::from_str("-271821-05").unwrap(); + let later = PlainYearMonth::from_str("-271820-05").unwrap(); + let settings = DifferenceSettings { + smallest_unit: Some(Unit::Year), + ..Default::default() + }; + + let until = earlier.until(&later, settings).unwrap(); + let since = earlier.since(&later, settings).unwrap(); + + assert_eq!(until.years(), 1); + assert_eq!(since.years(), -1); + } + } + #[test] + fn test_diff_with_different_calendars() { + let ym1 = PlainYearMonth::new_with_overflow( + 2021, + 1, + None, + Calendar::from_str("islamic").unwrap(), + Overflow::Reject, + ) + .unwrap(); + + let ym2 = PlainYearMonth::new_with_overflow( + 2021, + 1, + None, + Calendar::from_str("hebrew").unwrap(), + Overflow::Reject, + ) + .unwrap(); + + let settings = DifferenceSettings { + smallest_unit: Some(Unit::Month), + ..Default::default() + }; + + let diff = ym1.until(&ym2, settings); + assert!( + diff.is_err(), + "Expected an error when comparing dates from different calendars" + ); + } + #[test] + fn test_diff_setting() { + let ym1 = PlainYearMonth::from_str("2021-01").unwrap(); + let ym2 = PlainYearMonth::from_str("2023-02").unwrap(); + + let settings = DifferenceSettings { + smallest_unit: Some(Unit::Month), + increment: Some(RoundingIncrement::ONE), + ..Default::default() + }; + + let diff = ym1.until(&ym2, settings).unwrap(); + assert_eq!(diff.months(), 1); + assert_eq!(diff.years(), 2); + } + #[test] + fn test_diff_with_smallest_unit_year() { + let ym1 = PlainYearMonth::from_str("2021-01").unwrap(); + let ym2 = PlainYearMonth::from_str("2023-02").unwrap(); + + let settings = DifferenceSettings { + smallest_unit: Some(Unit::Year), + ..Default::default() + }; + + let diff = ym1.until(&ym2, settings).unwrap(); + assert_eq!(diff.years(), 2); // Rounded to the nearest year + assert_eq!(diff.months(), 0); // Months are ignored + } + + #[test] + fn test_diff_with_smallest_unit_day() { + let ym1 = PlainYearMonth::from_str("2021-01").unwrap(); + let ym2 = PlainYearMonth::from_str("2023-02").unwrap(); + + let settings = DifferenceSettings { + smallest_unit: Some(Unit::Day), + ..Default::default() + }; + + let diff = ym1.until(&ym2, settings); + assert!( + diff.is_err(), + "Expected an error when smallest_unit is set to Day" + ); + } + + #[test] + fn test_diff_with_smallest_unit_week() { + let ym1 = PlainYearMonth::from_str("2021-01").unwrap(); + let ym2 = PlainYearMonth::from_str("2023-02").unwrap(); + + let settings = DifferenceSettings { + smallest_unit: Some(Unit::Week), + ..Default::default() + }; + + let diff = ym1.until(&ym2, settings); + assert!( + diff.is_err(), + "Expected an error when smallest_unit is set to Week" + ); + } + + #[test] + fn test_diff_with_no_rounding_increment() { + let ym1 = PlainYearMonth::from_str("2021-01").unwrap(); + let ym2 = PlainYearMonth::from_str("2023-02").unwrap(); + + let settings = DifferenceSettings { + smallest_unit: Some(Unit::Month), + increment: None, // No rounding increment + ..Default::default() + }; + + let diff = ym1.until(&ym2, settings).unwrap(); + assert_eq!(diff.months(), 1); // Exact difference in months + assert_eq!(diff.years(), 2); // Exact difference in years + } + + #[test] + fn test_plain_year_month_with() { + let base = + PlainYearMonth::new_with_overflow(2025, 3, None, Calendar::default(), Overflow::Reject) + .unwrap(); + + // Year + let fields = YearMonthCalendarFields::new().with_year(2001); + + let with_year = base.with(fields, None).unwrap(); + assert_eq!(with_year.iso_year(), 2001); // year is changed + assert_eq!(with_year.iso_month(), 3); // month is not changed + assert_eq!(with_year.month_code(), MonthCode::from_str("M03").unwrap()); // assert month code has been initialized correctly + + // Month + let fields = YearMonthCalendarFields::new().with_month(2); + let with_month = base.with(fields, None).unwrap(); + assert_eq!(with_month.iso_year(), 2025); // year is not changed + assert_eq!(with_month.iso_month(), 2); // month is changed + assert_eq!(with_month.month_code(), MonthCode::from_str("M02").unwrap()); // assert month code has changed as well as month + + // Month Code + let fields = YearMonthCalendarFields::new().with_month_code(MonthCode(tinystr!(4, "M05"))); // change month to May (5) + let with_month_code = base.with(fields, None).unwrap(); + assert_eq!(with_month_code.iso_year(), 2025); // year is not changed + assert_eq!( + with_month_code.month_code(), + MonthCode::from_str("M05").unwrap() + ); // assert month code has changed + assert_eq!(with_month_code.iso_month(), 5); // month is changed as well + + // Day + let fields = YearMonthCalendarFields::new(); + let with_day = base.with(fields, None).unwrap(); + assert_eq!(with_day.iso_year(), 2025); // year is not changed + assert_eq!(with_day.iso_month(), 3); // month is not changed + assert_eq!(with_day.iso.day, 1); // day is ignored + + // All + let fields = YearMonthCalendarFields::new().with_year(2001).with_month(2); + let with_all = base.with(fields, None).unwrap(); + assert_eq!(with_all.iso_year(), 2001); // year is changed + assert_eq!(with_all.iso_month(), 2); // month is changed + assert_eq!(with_all.iso.day, 1); // day is ignored + } + + #[test] + fn basic_from_str() { + let valid_strings = [ + "-271821-04", + "-271821-04-01", + "-271821-04-01T00:00", + "+275760-09", + "+275760-09-30", + "+275760-09-30T23:59:59.999999999", + ]; + + for valid_case in valid_strings { + let ym = PlainYearMonth::from_str(valid_case); + assert!(ym.is_ok()); + } + } + + #[test] + fn invalid_from_str() { + let invalid_strings = [ + "-271821-03-31", + "-271821-03-31T23:59:59.999999999", + "+275760-10", + "+275760-10-01", + "+275760-10-01T00:00", + "1976-11[u-ca=hebrew]", + ]; + + for invalid_case in invalid_strings { + let err = PlainYearMonth::from_str(invalid_case); + assert!(err.is_err()); + } + + let invalid_strings = ["2019-10-01T09:00:00Z", "2019-10-01T09:00:00Z[UTC]"]; + + for invalid_case in invalid_strings { + let err = PlainYearMonth::from_str(invalid_case); + assert!(err.is_err()); + } + } + + #[test] + fn test_to_plain_date() { + let year_month = PlainYearMonth::new_with_overflow( + 2023, // year + 5, // month + None, // reference_day + Calendar::default(), + Overflow::Reject, + ) + .unwrap(); + + let fields = CalendarFields::new().with_day(3); + let plain_date = year_month.to_plain_date(Some(fields)).unwrap(); + assert_eq!(plain_date.iso_year(), 2023); + assert_eq!(plain_date.iso_month(), 5); + assert_eq!(plain_date.iso_day(), 3); + } + + #[test] + fn test_partial_year_month_try_from_plain() { + let ym = PlainYearMonth::from_str("2024-05").unwrap(); + let partial = YearMonthCalendarFields::try_from_year_month(&ym).unwrap(); + assert_eq!(partial.year, Some(2024)); + assert_eq!(partial.month, Some(5)); + assert_eq!( + partial.month_code, + Some(MonthCode::from_str("M05").unwrap()) + ); + assert_eq!(partial.era, None); + assert_eq!(partial.era_year, None); + } + + #[test] + fn test_year_month_fields_to_calendar_fields_round_trip() { + let partial = YearMonthCalendarFields::new() + .with_year(1999) + .with_month(12); + let pd: CalendarFields = partial.clone().into(); + let reconstructed: YearMonthCalendarFields = pd.into(); + assert_eq!(partial, reconstructed); + } + + #[test] + fn test_partial_year_month_builder_methods() { + let calendar = Calendar::from_str("gregory").unwrap(); + let calendar_fields = YearMonthCalendarFields::new() + .with_year(2020) + .with_month(7) + .with_month_code(MonthCode::from_str("M07").unwrap()) + .with_era(Some(tinystr!(19, "ce"))) + .with_era_year(Some(2020)); + + let partial = PartialYearMonth { + calendar_fields, + calendar: calendar.clone(), + }; + + assert_eq!(partial.calendar_fields.year, Some(2020)); + assert_eq!(partial.calendar_fields.month, Some(7)); + assert_eq!( + partial.calendar_fields.month_code, + Some(MonthCode::from_str("M07").unwrap()) + ); + assert_eq!(partial.calendar_fields.era, Some(tinystr!(19, "ce"))); + assert_eq!(partial.calendar_fields.era_year, Some(2020)); + assert_eq!(partial.calendar, calendar); + } + + #[test] + fn test_year_month_diff_range() { + // built-ins/Temporal/PlainYearMonth/prototype/since/throws-if-year-outside-valid-iso-range + + let min = PlainYearMonth::new(-271821, 4, None, Default::default()).unwrap(); + let max = PlainYearMonth::new(275760, 9, None, Default::default()).unwrap(); + let epoch = PlainYearMonth::new(1970, 1, None, Default::default()).unwrap(); + let _ = min.since(&min, Default::default()).unwrap(); + assert!(min.since(&max, Default::default()).is_err()); + assert!(min.since(&epoch, Default::default()).is_err()); + } + + #[test] + fn test_reference_day() { + assert_eq!( + PlainYearMonth::from_str("1868-10-30[u-ca=japanese]") + .unwrap() + .reference_day(), + 23 + ); + // Still happens for dates that are in the previous era but same month + assert_eq!( + PlainYearMonth::from_str("1868-10-20[u-ca=japanese]") + .unwrap() + .reference_day(), + 23 + ); + // Won't happen for dates in other months + assert_eq!( + PlainYearMonth::from_str("1868-09-30[u-ca=japanese]") + .unwrap() + .reference_day(), + 1 + ); + + // Always 1 in other calendars + assert_eq!( + PlainYearMonth::from_str("2000-09-30[u-ca=chinese]") + .unwrap() + .reference_day(), + 1 + ); + assert_eq!( + PlainYearMonth::from_str("2000-09-30[u-ca=hebrew]") + .unwrap() + .reference_day(), + 1 + ); + } + + #[test] + /// https://g-issues.chromium.org/issues/443275104 + fn test_max_rounding_increment_auto() { + let ym = PlainYearMonth::try_new_iso(1639, 11, None).unwrap(); + assert!(ym + .until( + &ym, + DifferenceSettings { + smallest_unit: Some(Unit::Auto), + ..Default::default() + } + ) + .is_err()); + } +} diff --git a/deps/temporal/src/builtins/core/time_zone.rs b/deps/temporal/src/builtins/core/time_zone.rs new file mode 100644 index 00000000000000..e791f341729261 --- /dev/null +++ b/deps/temporal/src/builtins/core/time_zone.rs @@ -0,0 +1,685 @@ +//! This module implements the Temporal `TimeZone` and components. + +use alloc::string::String; + +use ixdtf::encoding::Utf8; +use ixdtf::{ + parsers::TimeZoneParser, + records::{MinutePrecisionOffset, TimeZoneRecord, UtcOffsetRecord}, +}; +use num_traits::ToPrimitive; + +use crate::error::ErrorMessage; +use crate::parsers::{ + parse_allowed_timezone_formats, parse_identifier, FormattableOffset, FormattableTime, Precision, +}; +use crate::provider::{CandidateEpochNanoseconds, TimeZoneId, TimeZoneProvider}; +use crate::Sign; +use crate::{ + builtins::core::{duration::normalized::TimeDuration, Instant}, + iso::{IsoDate, IsoDateTime, IsoTime}, + options::Disambiguation, + TemporalError, TemporalResult, TemporalUnwrap, ZonedDateTime, +}; + +use crate::provider::EpochNanosecondsAndOffset; + +const NS_IN_S: i64 = 1_000_000_000; +const NS_IN_MIN: i64 = 60_000_000_000; + +/// A UTC time zone offset stored in nanoseconds +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] +pub struct UtcOffset(i64); + +impl From for UtcOffset { + fn from(other: timezone_provider::provider::UtcOffsetSeconds) -> Self { + Self::from_seconds(other.0) + } +} + +impl From for timezone_provider::provider::UtcOffsetSeconds { + fn from(other: UtcOffset) -> Self { + Self(other.seconds()) + } +} + +impl UtcOffset { + pub(crate) fn from_ixdtf_minute_record(record: MinutePrecisionOffset) -> Self { + // NOTE: ixdtf parser restricts minute/second to 0..=60 + let minutes = i16::from(record.hour) * 60 + record.minute as i16; + let minutes = minutes * i16::from(record.sign as i8); + Self::from_minutes(minutes) + } + pub(crate) fn from_ixdtf_record(record: UtcOffsetRecord) -> TemporalResult { + let hours = i64::from(record.hour()); + let minutes = 60 * hours + i64::from(record.minute()); + let sign = record.sign() as i64; + + if let Some(second) = record.second() { + let seconds = 60 * minutes + i64::from(second); + + let mut ns = seconds * NS_IN_S; + + if let Some(frac) = record.fraction() { + ns += i64::from( + frac.to_nanoseconds().ok_or( + TemporalError::range() + .with_enum(ErrorMessage::FractionalTimeMoreThanNineDigits), + )?, + ); + } + + Ok(Self(ns * sign)) + } else { + Ok(Self(minutes * sign * NS_IN_MIN)) + } + } + + pub fn from_utf8(source: &[u8]) -> TemporalResult { + let record = TimeZoneParser::from_utf8(source).parse_offset()?; + Self::from_ixdtf_record(record) + } + + #[allow(clippy::inherent_to_string)] + pub fn to_string(&self) -> String { + let sign = if self.0 < 0 { + Sign::Negative + } else { + Sign::Positive + }; + let nanoseconds_total = self.0.abs(); + + let nanosecond = u32::try_from(nanoseconds_total % NS_IN_S).unwrap_or(0); + let seconds_left = nanoseconds_total / NS_IN_S; + + let second = u8::try_from(seconds_left % 60).unwrap_or(0); + let minutes_left = seconds_left / 60; + + let minute = u8::try_from(minutes_left % 60).unwrap_or(0); + let hour = u8::try_from(minutes_left / 60).unwrap_or(0); + + let precision = if nanosecond == 0 && second == 0 { + Precision::Minute + } else { + Precision::Auto + }; + let formattable_offset = FormattableOffset { + sign, + time: FormattableTime { + hour, + minute, + second, + nanosecond, + precision, + include_sep: true, + }, + }; + formattable_offset.to_string() + } + + pub fn from_minutes(minutes: i16) -> Self { + Self(i64::from(minutes) * NS_IN_MIN) + } + + pub(crate) fn from_seconds(seconds: i64) -> Self { + Self(seconds * crate::builtins::core::instant::NANOSECONDS_PER_SECOND) + } + + pub fn minutes(&self) -> i16 { + i16::try_from(self.0 / NS_IN_MIN).unwrap_or(0) + } + + pub fn seconds(&self) -> i64 { + self.0 / NS_IN_S + } + + pub fn nanoseconds(&self) -> i64 { + self.0 + } + + pub fn is_sub_minute(&self) -> bool { + self.0 % NS_IN_MIN != 0 + } + + /// Partial implementation of GetISODateTimeFor for a cached offset + pub(crate) fn get_iso_datetime_for(&self, instant: &Instant) -> IsoDateTime { + // 2. Let result be GetISOPartsFromEpoch(ℝ(epochNs)). + // 3. Return BalanceISODateTime(result.[[ISODate]].[[Year]], result.[[ISODate]].[[Month]], result.[[ISODate]].[[Day]], + // result.[[Time]].[[Hour]], result.[[Time]].[[Minute]], result.[[Time]].[[Second]], result.[[Time]].[[Millisecond]], + // result.[[Time]].[[Microsecond]], result.[[Time]].[[Nanosecond]] + offsetNanoseconds). + IsoDateTime::from_epoch_nanos(instant.epoch_nanoseconds(), self.nanoseconds()) + } +} + +impl core::str::FromStr for UtcOffset { + type Err = TemporalError; + fn from_str(s: &str) -> Result { + Self::from_utf8(s.as_bytes()) + } +} + +// TODO: Potentially migrate to Cow<'a, str> +// TODO: There may be an argument to have Offset minutes be a (Cow<'a, str>,, i16) to +// prevent allocations / writing, TBD +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum TimeZone { + IanaIdentifier(TimeZoneId), + UtcOffset(UtcOffset), +} + +impl TimeZone { + // Create a `TimeZone` from an ixdtf `TimeZoneRecord`. + #[inline] + pub(crate) fn from_time_zone_record( + record: TimeZoneRecord, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + let timezone = match record { + TimeZoneRecord::Name(name) => TimeZone::IanaIdentifier(provider.get(name)?), + TimeZoneRecord::Offset(offset_record) => { + let offset = UtcOffset::from_ixdtf_minute_record(offset_record); + TimeZone::UtcOffset(offset) + } + // TimeZoneRecord is non_exhaustive, but all current branches are matching. + _ => return Err(TemporalError::assert()), + }; + + Ok(timezone) + } + + /// Parses a `TimeZone` from a provided `&str`. + pub fn try_from_identifier_str_with_provider( + identifier: &str, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + parse_identifier(identifier).map(|tz| match tz { + TimeZoneRecord::Name(name) => Ok(TimeZone::IanaIdentifier(provider.get(name)?)), + TimeZoneRecord::Offset(minute_precision_offset) => Ok(TimeZone::UtcOffset( + UtcOffset::from_ixdtf_minute_record(minute_precision_offset), + )), + _ => Err(TemporalError::range().with_message("Invalid TimeZone Identifier")), + })? + } + + #[cfg(feature = "compiled_data")] + pub fn try_from_identifier_str(src: &str) -> TemporalResult { + Self::try_from_identifier_str_with_provider(src, &*crate::builtins::TZ_PROVIDER) + } + /// Parse a `TimeZone` from a `&str` + /// + /// This is the equivalent to [`ParseTemporalTimeZoneString`](https://tc39.es/proposal-temporal/#sec-temporal-parsetemporaltimezonestring) + pub fn try_from_str_with_provider( + src: &str, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + if let Ok(timezone) = Self::try_from_identifier_str_with_provider(src, provider) { + return Ok(timezone); + } + parse_allowed_timezone_formats(src, provider) + .ok_or_else(|| TemporalError::range().with_message("Not a valid time zone string")) + } + + #[cfg(feature = "compiled_data")] + pub fn try_from_str(src: &str) -> TemporalResult { + Self::try_from_str_with_provider(src, &*crate::builtins::TZ_PROVIDER) + } + + /// Returns the current `TimeZoneSlot`'s identifier. + pub fn identifier_with_provider( + &self, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + Ok(match self { + TimeZone::IanaIdentifier(s) => provider.identifier(*s)?.into(), + TimeZone::UtcOffset(offset) => offset.to_string(), + }) + } + + /// Returns the current `TimeZoneSlot`'s identifier. + #[cfg(feature = "compiled_data")] + pub fn identifier(&self) -> TemporalResult { + self.identifier_with_provider(&*crate::builtins::TZ_PROVIDER) + } + + /// Get the primary identifier for this timezone + pub fn primary_identifier_with_provider( + &self, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + Ok(match self { + TimeZone::IanaIdentifier(s) => TimeZone::IanaIdentifier(provider.canonicalized(*s)?), + TimeZone::UtcOffset(offset) => TimeZone::UtcOffset(*offset), + }) + } + + /// Get the primary identifier for this timezone + #[cfg(feature = "compiled_data")] + pub fn primary_identifier(&self) -> TemporalResult { + self.primary_identifier_with_provider(&*crate::builtins::TZ_PROVIDER) + } + + // TimeZoneEquals, which compares primary identifiers + pub(crate) fn time_zone_equals_with_provider( + &self, + other: &Self, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + Ok(match (self, other) { + (TimeZone::IanaIdentifier(one), TimeZone::IanaIdentifier(two)) => { + let one = provider.canonicalized(*one)?; + let two = provider.canonicalized(*two)?; + one.normalized == two.normalized + } + (&TimeZone::UtcOffset(one), &TimeZone::UtcOffset(two)) => one == two, + _ => false, + }) + } + + /// Return an identifier representing `utc` + #[cfg(feature = "compiled_data")] + pub fn utc() -> Self { + Self::utc_with_provider(&*crate::builtins::TZ_PROVIDER) + } + + /// Get the primary identifier for this timezone + pub fn utc_with_provider(provider: &impl TimeZoneProvider) -> Self { + Self::IanaIdentifier(provider.get(b"UTC").unwrap_or_default()) + } +} + +impl From<&ZonedDateTime> for TimeZone { + fn from(value: &ZonedDateTime) -> Self { + *value.time_zone() + } +} + +impl From for TimeZone { + fn from(value: UtcOffset) -> Self { + Self::UtcOffset(value) + } +} + +impl TimeZone { + pub(crate) fn get_iso_datetime_for( + &self, + instant: &Instant, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + // 1. Let offsetNanoseconds be GetOffsetNanosecondsFor(timeZone, epochNs). + let nanos = self.get_offset_nanos_for(instant.as_i128(), provider)?; + // 2. Let result be GetISOPartsFromEpoch(ℝ(epochNs)). + // 3. Return BalanceISODateTime(result.[[ISODate]].[[Year]], result.[[ISODate]].[[Month]], result.[[ISODate]].[[Day]], + // result.[[Time]].[[Hour]], result.[[Time]].[[Minute]], result.[[Time]].[[Second]], result.[[Time]].[[Millisecond]], + // result.[[Time]].[[Microsecond]], result.[[Time]].[[Nanosecond]] + offsetNanoseconds). + Ok(IsoDateTime::from_epoch_nanos( + instant.epoch_nanoseconds(), + nanos.to_i64().unwrap_or(0), + )) + } + + /// Get the offset for this current `TimeZoneSlot`. + pub(crate) fn get_offset_nanos_for( + &self, + utc_epoch: i128, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + // 1. Let parseResult be ! ParseTimeZoneIdentifier(timeZone). + match self { + // 2. If parseResult.[[OffsetMinutes]] is not empty, return parseResult.[[OffsetMinutes]] × (60 × 10**9). + Self::UtcOffset(offset) => Ok(i128::from(offset.nanoseconds())), + // 3. Return GetNamedTimeZoneOffsetNanoseconds(parseResult.[[Name]], epochNs). + Self::IanaIdentifier(identifier) => { + let offset = provider + .transition_nanoseconds_for_utc_epoch_nanoseconds(*identifier, utc_epoch)?; + Ok(i128::from(offset.0) * 1_000_000_000) + } + } + } + + /// Get the offset for this current `TimeZoneSlot` as a `UtcOffset` + pub(crate) fn get_utc_offset_for( + &self, + utc_epoch: i128, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + let offset = self.get_offset_nanos_for(utc_epoch, provider)?; + let offset = i64::try_from(offset).ok().temporal_unwrap()?; + Ok(UtcOffset(offset)) + } + + pub(crate) fn get_epoch_nanoseconds_for( + &self, + local_iso: IsoDateTime, + disambiguation: Disambiguation, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + // 1. Let possibleEpochNs be ? GetPossibleEpochNanoseconds(timeZone, isoDateTime). + let possible_nanos = self.get_possible_epoch_ns_for(local_iso, provider)?; + // 2. Return ? DisambiguatePossibleEpochNanoseconds(possibleEpochNs, timeZone, isoDateTime, disambiguation). + self.disambiguate_possible_epoch_nanos(possible_nanos, local_iso, disambiguation, provider) + } + + /// Get the possible `Instant`s for this `TimeZoneSlot`. + pub(crate) fn get_possible_epoch_ns_for( + &self, + local_iso: IsoDateTime, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + // 1.Let parseResult be ! ParseTimeZoneIdentifier(timeZone). + let possible_nanoseconds = match self { + // 2. If parseResult.[[OffsetMinutes]] is not empty, then + Self::UtcOffset(offset) => { + // This routine should not be hit with sub-minute offsets + // + // > ...takes arguments timeZone (an available time zone identifier) + // > + // > An available time zone identifier is either an available named time zone identifier or an + // > offset time zone identifier. + // > + // > Offset time zone identifiers are compared using the number of minutes represented (not as a String), + // > and are accepted as input in any the formats specified by UTCOffset[~SubMinutePrecision] + debug_assert!( + !offset.is_sub_minute(), + "Called get_possible_epoch_ns_for on a sub-minute-precision offset" + ); + // a. Let balanced be + // BalanceISODateTime(isoDateTime.[[ISODate]].[[Year]], + // isoDateTime.[[ISODate]].[[Month]], + // isoDateTime.[[ISODate]].[[Day]], + // isoDateTime.[[Time]].[[Hour]], + // isoDateTime.[[Time]].[[Minute]] - + // parseResult.[[OffsetMinutes]], + // isoDateTime.[[Time]].[[Second]], + // isoDateTime.[[Time]].[[Millisecond]], + // isoDateTime.[[Time]].[[Microsecond]], + // isoDateTime.[[Time]].[[Nanosecond]]). + let balanced = IsoDateTime::balance( + local_iso.date.year, + local_iso.date.month.into(), + local_iso.date.day.into(), + local_iso.time.hour.into(), + (i16::from(local_iso.time.minute) - offset.minutes()).into(), + local_iso.time.second.into(), + local_iso.time.millisecond.into(), + local_iso.time.microsecond.into(), + local_iso.time.nanosecond.into(), + ); + // b. Perform ? CheckISODaysRange(balanced.[[ISODate]]). + balanced.date.is_valid_day_range()?; + // c. Let epochNanoseconds be GetUTCEpochNanoseconds(balanced). + let epoch_ns = balanced.as_nanoseconds(); + // d. Let possibleEpochNanoseconds be « epochNanoseconds ». + CandidateEpochNanoseconds::One(EpochNanosecondsAndOffset { + offset: (*offset).into(), + ns: epoch_ns, + }) + } + // 3. Else, + Self::IanaIdentifier(identifier) => { + // a. Let possibleEpochNanoseconds be + // GetNamedTimeZoneEpochNanoseconds(parseResult.[[Name]], + // isoDateTime). + provider.candidate_nanoseconds_for_local_epoch_nanoseconds( + *identifier, + local_iso.into(), + )? + } + }; + // 4. For each value epochNanoseconds in possibleEpochNanoseconds, do + // a . If IsValidEpochNanoseconds(epochNanoseconds) is false, throw a RangeError exception. + for ns in possible_nanoseconds.as_slice() { + ns.ns.check_validity()?; + } + // 5. Return possibleEpochNanoseconds. + Ok(possible_nanoseconds) + } +} + +impl TimeZone { + // TODO: This can be optimized by just not using a vec. + pub(crate) fn disambiguate_possible_epoch_nanos( + &self, + nanos: CandidateEpochNanoseconds, + iso: IsoDateTime, + disambiguation: Disambiguation, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + // 1. Let n be possibleEpochNs's length. + let valid_bounds = match nanos { + // 2. If n = 1, then + CandidateEpochNanoseconds::One(ns) => { + // a. Return possibleEpochNs[0]. + return Ok(ns); + } + // 3. If n ≠ 0, then + CandidateEpochNanoseconds::Two([one, two]) => { + match disambiguation { + // a. If disambiguation is earlier or compatible, then + // i. Return possibleEpochNs[0]. + Disambiguation::Compatible | Disambiguation::Earlier => return Ok(one), + // b. If disambiguation is later, then + // i. Return possibleEpochNs[n - 1]. + Disambiguation::Later => return Ok(two), + // c. Assert: disambiguation is reject. + // d. Throw a RangeError exception. + Disambiguation::Reject => { + return Err( + TemporalError::range().with_message("Rejecting ambiguous time zones.") + ) + } + } + } + CandidateEpochNanoseconds::Zero(vb) => vb, + }; + + // 4. Assert: n = 0. + // 5. If disambiguation is reject, then + if disambiguation == Disambiguation::Reject { + // a. Throw a RangeError exception. + return Err(TemporalError::range().with_message("Rejecting ambiguous time zones.")); + } + + // Instead of calculating the latest/earliest possible ISO datetime record, + // the GapEntryOffsets from CandidateEpochNanoseconds::Zero already has + // the offsets before and after the gap transition. We can use that directly, + // instead of doing a bunch of additional work. + // + // 6. Let before be the latest possible ISO Date-Time Record for + // which CompareISODateTime(before, isoDateTime) = -1 and ! + // GetPossibleEpochNanoseconds(timeZone, before) is not + // empty. + // 7. Let after be the earliest possible ISO Date-Time Record + // for which CompareISODateTime(after, isoDateTime) = 1 and ! + // 8. Let beforePossible be ! + // GetPossibleEpochNanoseconds(timeZone, before). + // 9. Assert: beforePossible's length is 1. + // 10. Let afterPossible be ! + // GetPossibleEpochNanoseconds(timeZone, after). + // 11. Assert: afterPossible's length is 1. + + // 12. Let offsetBefore be GetOffsetNanosecondsFor(timeZone, + // beforePossible[0]). + let offset_before = valid_bounds.offset_before; + // 13. Let offsetAfter be GetOffsetNanosecondsFor(timeZone, + // afterPossible[0]). + let offset_after = valid_bounds.offset_after; + // 14. Let nanoseconds be offsetAfter - offsetBefore. + let seconds = offset_after.0 - offset_before.0; + let nanoseconds = seconds as i128 * 1_000_000_000; + // 15. Assert: abs(nanoseconds) ≤ nsPerDay. + // 16. If disambiguation is earlier, then + if disambiguation == Disambiguation::Earlier { + // a. Let timeDuration be TimeDurationFromComponents(0, 0, 0, 0, 0, -nanoseconds). + let time_duration = TimeDuration(-nanoseconds); + // b. Let earlierTime be AddTime(isoDateTime.[[Time]], timeDuration). + let earlier_time = iso.time.add(time_duration); + // c. Let earlierDate be BalanceISODate(isoDateTime.[[ISODate]].[[Year]], + // isoDateTime.[[ISODate]].[[Month]], + // isoDateTime.[[ISODate]].[[Day]] + earlierTime.[[Days]]). + let earlier_date = IsoDate::try_balance( + iso.date.year, + iso.date.month.into(), + i64::from(iso.date.day) + earlier_time.0, + )?; + + // d. Let earlierDateTime be + // CombineISODateAndTimeRecord(earlierDate, earlierTime). + let earlier = IsoDateTime::new_unchecked(earlier_date, earlier_time.1); + // e. Set possibleEpochNs to ? GetPossibleEpochNanoseconds(timeZone, earlierDateTime). + let possible = self.get_possible_epoch_ns_for(earlier, provider)?; + // f. Assert: possibleEpochNs is not empty. + // g. Return possibleEpochNs[0]. + return possible.first().temporal_unwrap(); + } + // 17. Assert: disambiguation is compatible or later. + // 18. Let timeDuration be TimeDurationFromComponents(0, 0, 0, 0, 0, nanoseconds). + let time_duration = TimeDuration(nanoseconds); + // 19. Let laterTime be AddTime(isoDateTime.[[Time]], timeDuration). + let later_time = iso.time.add(time_duration); + // 20. Let laterDate be BalanceISODate(isoDateTime.[[ISODate]].[[Year]], + // isoDateTime.[[ISODate]].[[Month]], isoDateTime.[[ISODate]].[[Day]] + laterTime.[[Days]]). + let later_date = IsoDate::try_balance( + iso.date.year, + iso.date.month.into(), + i64::from(iso.date.day) + later_time.0, + )?; + // 21. Let laterDateTime be CombineISODateAndTimeRecord(laterDate, laterTime). + let later = IsoDateTime::new_unchecked(later_date, later_time.1); + // 22. Set possibleEpochNs to ? GetPossibleEpochNanoseconds(timeZone, laterDateTime). + let possible = self.get_possible_epoch_ns_for(later, provider)?; + // 23. Set n to possibleEpochNs's length. + // 24. Assert: n ≠ 0. + // 25. Return possibleEpochNs[n - 1]. + possible.last().temporal_unwrap() + } + + pub(crate) fn get_start_of_day( + &self, + iso_date: &IsoDate, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + // 1. Let isoDateTime be CombineISODateAndTimeRecord(isoDate, MidnightTimeRecord()). + let iso = IsoDateTime::new_unchecked(*iso_date, IsoTime::default()); + // 2. Let possibleEpochNs be ? GetPossibleEpochNanoseconds(timeZone, isoDateTime). + let possible_nanos = self.get_possible_epoch_ns_for(iso, provider)?; + // 3. If possibleEpochNs is not empty, return possibleEpochNs[0]. + let gap = match possible_nanos { + CandidateEpochNanoseconds::One(first) | CandidateEpochNanoseconds::Two([first, _]) => { + return Ok(first) + } + CandidateEpochNanoseconds::Zero(gap) => gap, + }; + // 5. Let possibleEpochNsAfter be GetNamedTimeZoneEpochNanoseconds(timeZone, isoDateTimeAfter), where + // isoDateTimeAfter is the ISO Date-Time Record for which ! DifferenceISODateTime(isoDateTime, + // isoDateTimeAfter, "iso8601", hour).[[Time]] is the smallest possible value > 0 for which + // possibleEpochNsAfter is not empty (i.e., isoDateTimeAfter represents the first local time + // after the transition). + + // For a gap entry, possibleEpochNsAfter will just be the transition time. We don't + // actually need to calculate an isoDateTimeAfter and do all that rigmarole; we already + // know the transition time. + + // 6. Assert: possibleEpochNsAfter's length = 1. + // 7. Return possibleEpochNsAfter[0]. + + Ok(EpochNanosecondsAndOffset { + offset: gap.offset_after, + ns: gap.transition_epoch, + }) + } +} + +#[cfg(test)] +mod tests { + #[cfg(feature = "compiled_data")] + use super::TimeZone; + + #[test] + #[cfg(feature = "compiled_data")] + fn from_and_to_string() { + let src = "+09:30"; + let tz = TimeZone::try_from_identifier_str(src).unwrap(); + assert_eq!(tz.identifier().unwrap(), src); + + let src = "-09:30"; + let tz = TimeZone::try_from_identifier_str(src).unwrap(); + assert_eq!(tz.identifier().unwrap(), src); + + let src = "-12:30"; + let tz = TimeZone::try_from_identifier_str(src).unwrap(); + assert_eq!(tz.identifier().unwrap(), src); + + let src = "America/New_York"; + let tz = TimeZone::try_from_identifier_str(src).unwrap(); + assert_eq!(tz.identifier().unwrap(), src); + } + + #[test] + #[cfg(feature = "compiled_data")] + fn canonicalize_equals() { + let calcutta = TimeZone::try_from_identifier_str("Asia/Calcutta").unwrap(); + let kolkata = TimeZone::try_from_identifier_str("Asia/Kolkata").unwrap(); + assert!(calcutta + .time_zone_equals_with_provider(&kolkata, &*crate::builtins::TZ_PROVIDER) + .unwrap()); + } + + #[cfg(feature = "compiled_data")] + fn test_possible_epoch_ns_at_limits_helper( + time_zone_identifier: &str, + offset_sec_at_min: i64, + offset_sec_at_max: i64, + ) { + use crate::iso::IsoDateTime; + use crate::provider::{ + CandidateEpochNanoseconds, EpochNanosecondsAndOffset, UtcOffsetSeconds, + }; + use crate::unix_time::EpochNanoseconds; + use crate::{NS_MAX_INSTANT, NS_MIN_INSTANT}; + + let provider = &*crate::builtins::TZ_PROVIDER; + + let time_zone = TimeZone::try_from_identifier_str(time_zone_identifier).unwrap(); + + let min = IsoDateTime::balance(-271821, 4, 20, 0, 0, offset_sec_at_min, 0, 0, 0); + let min_result = time_zone.get_possible_epoch_ns_for(min, provider).unwrap(); + assert_eq!( + min_result, + CandidateEpochNanoseconds::One(EpochNanosecondsAndOffset { + ns: EpochNanoseconds(NS_MIN_INSTANT), + offset: UtcOffsetSeconds(offset_sec_at_min) + }) + ); + + let max = IsoDateTime::balance(275760, 9, 13, 0, 0, offset_sec_at_max, 0, 0, 0); + let max_result = time_zone.get_possible_epoch_ns_for(max, provider).unwrap(); + assert_eq!( + max_result, + CandidateEpochNanoseconds::One(EpochNanosecondsAndOffset { + ns: EpochNanoseconds(NS_MAX_INSTANT), + offset: UtcOffsetSeconds(offset_sec_at_max) + }) + ); + + let too_early = IsoDateTime::balance(-271821, 4, 20, 0, 0, offset_sec_at_min, 0, 0, -1); + assert!(time_zone + .get_possible_epoch_ns_for(too_early, provider) + .is_err()); + + let too_late = IsoDateTime::balance(275760, 9, 13, 0, 0, offset_sec_at_max, 0, 0, 1); + assert!(time_zone + .get_possible_epoch_ns_for(too_late, provider) + .is_err()); + } + + #[test] + #[cfg(feature = "compiled_data")] + fn test_possible_epoch_ns_at_limits() { + test_possible_epoch_ns_at_limits_helper("UTC", 0, 0); + test_possible_epoch_ns_at_limits_helper("+02:00", 7200, 7200); + test_possible_epoch_ns_at_limits_helper("-07:00", -25200, -25200); + test_possible_epoch_ns_at_limits_helper("Europe/Amsterdam", 1050, 7200); + test_possible_epoch_ns_at_limits_helper("America/Vancouver", -29548, -25200); + test_possible_epoch_ns_at_limits_helper("Australia/Sydney", 36292, 36000); + } +} diff --git a/deps/temporal/src/builtins/core/zoned_date_time.rs b/deps/temporal/src/builtins/core/zoned_date_time.rs new file mode 100644 index 00000000000000..38cc1fc6aa6197 --- /dev/null +++ b/deps/temporal/src/builtins/core/zoned_date_time.rs @@ -0,0 +1,1585 @@ +//! This module contains the core implementation of the `ZonedDateTime` +//! builtin type. + +use crate::provider::EpochNanosecondsAndOffset; +use alloc::string::String; +use core::{cmp::Ordering, num::NonZeroU128}; +use tinystr::TinyAsciiStr; + +use crate::{ + builtins::{ + calendar::CalendarFields, + core::{ + calendar::Calendar, + duration::normalized::{InternalDurationRecord, TimeDuration}, + time_zone::{TimeZone, UtcOffset}, + Duration, Instant, PlainDate, PlainDateTime, PlainTime, + }, + }, + error::ErrorMessage, + iso::{IsoDate, IsoDateTime, IsoTime}, + options::{ + DifferenceOperation, DifferenceSettings, Disambiguation, DisplayCalendar, DisplayOffset, + DisplayTimeZone, OffsetDisambiguation, Overflow, ResolvedRoundingOptions, + RoundingIncrement, RoundingMode, RoundingOptions, ToStringRoundingOptions, Unit, UnitGroup, + }, + parsed_intermediates::ParsedZonedDateTime, + parsers::{FormattableOffset, FormattableTime, IxdtfStringBuilder, Precision}, + partial::PartialTime, + primitive::FiniteF64, + provider::{TimeZoneProvider, TransitionDirection, UtcOffsetSeconds}, + rounding::IncrementRounder, + temporal_assert, + unix_time::EpochNanoseconds, + MonthCode, Sign, TemporalError, TemporalResult, TemporalUnwrap, +}; + +#[cfg(test)] +mod tests; + +/// A struct representing a partial `ZonedDateTime`. +#[derive(Debug, Default, Clone, PartialEq)] +pub struct PartialZonedDateTime { + /// The `ZonedDateTimeFields` portion of a `PartialZonedDateTime` + pub fields: ZonedDateTimeFields, + /// The time zone value of a partial time zone. + pub timezone: Option, + /// The calendar for the `PartialZonedDateTime`. + pub calendar: Calendar, +} + +impl PartialZonedDateTime { + pub fn is_empty(&self) -> bool { + self.fields.is_empty() && self.timezone.is_none() + } + + pub const fn new() -> Self { + Self { + fields: ZonedDateTimeFields::new(), + timezone: None, + calendar: Calendar::ISO, + } + } + + pub const fn with_calendar_fields(mut self, fields: CalendarFields) -> Self { + self.fields.calendar_fields = fields; + self + } + + pub const fn with_time(mut self, time: PartialTime) -> Self { + self.fields.time = time; + self + } + + pub const fn with_offset(mut self, offset: UtcOffset) -> Self { + self.fields.offset = Some(offset); + self + } + + pub fn with_timezone(mut self, timezone: Option) -> Self { + self.timezone = timezone; + self + } +} + +#[derive(Debug, Default, Clone, PartialEq)] +pub struct ZonedDateTimeFields { + pub calendar_fields: CalendarFields, + + pub time: PartialTime, + + /// An optional offset string + pub offset: Option, +} + +impl ZonedDateTimeFields { + pub const fn new() -> Self { + Self { + calendar_fields: CalendarFields::new(), + time: PartialTime::new(), + offset: None, + } + } + + pub fn is_empty(&self) -> bool { + self.calendar_fields.is_empty() && self.time.is_empty() && self.offset.is_none() + } +} + +/// The native Rust implementation of a Temporal `ZonedDateTime`. +/// +/// A `ZonedDateTime` represents a date and time in a specific time zone and calendar. +/// Unlike `PlainDateTime`, it represents an exact moment in time by combining a +/// `PlainDateTime` with time zone information. It is internally represented as +/// an instant (epoch nanoseconds) along with calendar and time zone data. +/// +/// Since `ZonedDateTime` includes timezone information, it can handle daylight saving time +/// transitions and timezone offset changes automatically. The type requires a timezone +/// data provider (implementing `TimeZoneProvider`) for most operations, which supplies +/// the necessary timezone rules and historical data. +/// +/// Unlike `PlainDateTime` which can be ambiguous during DST transitions, `ZonedDateTime` +/// always represents an unambiguous moment in time. +/// +/// ## Time zone provider API +/// +/// The core implementation of `ZonedDateTime` uses time zone provider APIs denoted by +/// a `*_with_provider` suffix. This means a provider that implements the `TimeZoneProvider` +/// trait must be provided for timezone-aware operations. +/// +/// Time zone providers available: +/// - **File system provider**: `FsTzdbProvider` (enabled with `tzdb` feature) +/// - **Compiled data provider**: Default implementation (enabled with `compiled_data` feature) +/// +/// ## Examples +/// +/// ### Creating a ZonedDateTime +/// +/// ```rust +/// # #[cfg(feature = "compiled_data")] { +/// use temporal_rs::{Calendar, Instant, TimeZone, ZonedDateTime}; +/// +/// // Create from epoch nanoseconds +/// let zdt = ZonedDateTime::try_new( +/// 0, // epoch nanoseconds (Unix epoch) +/// TimeZone::utc(), // UTC timezone +/// Calendar::default(), // ISO 8601 calendar +/// ).unwrap(); +/// +/// assert_eq!(zdt.epoch_milliseconds(), 0); +/// assert_eq!(zdt.epoch_nanoseconds().as_i128(), 0); +/// assert_eq!(zdt.time_zone().identifier().unwrap(), "UTC"); +/// assert_eq!(zdt.calendar().identifier(), "iso8601"); +/// # } +/// ``` +/// +/// ### Working with timezones (requires provider, or compiled data) +/// +/// ```rust +/// # #[cfg(feature = "compiled_data")] { +/// use temporal_rs::{ZonedDateTime, TimeZone, Calendar}; +/// +/// let time_zone = TimeZone::try_from_str("America/New_York").unwrap(); +/// let zoned_date_time = ZonedDateTime::try_new( +/// 1609459200000000000, // 2021-01-01T00:00:00Z +/// time_zone, +/// Calendar::default(), +/// ).unwrap(); +/// +/// // Note: This would be December 31, 2020 19:00 in New York (EST) +/// assert_eq!(zoned_date_time.year(), 2020); +/// assert_eq!(zoned_date_time.month(), 12); +/// assert_eq!(zoned_date_time.day(), 31); +/// assert_eq!(zoned_date_time.hour(), 19); +/// # } +/// ``` +/// +/// ### ZonedDateTime arithmetic (requires provider) +/// +/// ```rust +/// # #[cfg(feature = "compiled_data")] { +/// use temporal_rs::{ZonedDateTime, Duration, TimeZone, Calendar}; +/// use std::str::FromStr; +/// +/// let time_zone = TimeZone::try_from_str("Europe/London").unwrap(); +/// let zdt = ZonedDateTime::try_new( +/// 1609459200000000000, // 2021-01-01T00:00:00Z +/// time_zone, +/// Calendar::default(), +/// ).unwrap(); +/// +/// // Add 6 months +/// let later = zdt.add( +/// &Duration::from_str("P6M").unwrap(), +/// None, +/// ).unwrap(); +/// +/// assert_eq!(later.month(), 7); // July +/// # } +/// ``` +/// +/// ### Converting from PlainDateTime +/// +/// ```rust +/// # #[cfg(feature = "compiled_data")] { +/// use temporal_rs::{PlainDateTime, ZonedDateTime, TimeZone, options::Disambiguation}; +/// use std::str::FromStr; +/// +/// let plain_date_time = PlainDateTime::from_str("2024-03-15T14:30:00").unwrap(); +/// let time_zone = TimeZone::try_from_str("America/Los_Angeles").unwrap(); +/// +/// let zdt = plain_date_time.to_zoned_date_time( +/// time_zone, +/// Disambiguation::Compatible, +/// ).unwrap(); +/// +/// // Now we have an exact moment in time in the LA timezone +/// assert_eq!(zdt.time_zone().identifier().unwrap(), "America/Los_Angeles"); +/// # } +/// ``` +/// +/// ### String formatting (requires provider) +/// +/// ```rust +/// # #[cfg(feature = "compiled_data")] { +/// use temporal_rs::{ZonedDateTime, Calendar, TimeZone}; +/// use temporal_rs::options::{DisplayOffset, DisplayTimeZone, DisplayCalendar, ToStringRoundingOptions}; +/// +/// let zdt = ZonedDateTime::try_new( +/// 1609459200000000000, +/// TimeZone::try_from_str("Asia/Tokyo").unwrap(), +/// Calendar::default(), +/// ).unwrap(); +/// +/// let iso_string = zdt.to_ixdtf_string( +/// DisplayOffset::default(), +/// DisplayTimeZone::default(), +/// DisplayCalendar::default(), +/// ToStringRoundingOptions::default() +/// ).unwrap(); +/// +/// // Results in something like "2021-01-01T09:00:00+09:00[Asia/Tokyo]" +/// assert!(iso_string.contains("2021-01-01")); +/// assert!(iso_string.contains("+09:00")); +/// assert!(iso_string.contains("[Asia/Tokyo]")); +/// # } +/// ``` +/// +/// ## Reference +/// +/// For more information, see the [MDN documentation][mdn-zoneddatetime]. +/// +/// [mdn-zoneddatetime]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/ZonedDateTime +#[non_exhaustive] +#[derive(Debug, Clone)] +pub struct ZonedDateTime { + instant: Instant, + calendar: Calendar, + time_zone: TimeZone, + cached_offset: UtcOffset, +} + +// ==== Private API ==== + +impl ZonedDateTime { + /// Creates a `ZonedDateTime` without validating the input. + #[inline] + #[must_use] + pub(crate) fn new_unchecked( + instant: Instant, + time_zone: TimeZone, + calendar: Calendar, + cached_offset: UtcOffsetSeconds, + ) -> Self { + Self { + instant, + calendar, + time_zone, + cached_offset: cached_offset.into(), + } + } + + pub(crate) fn new_unchecked_with_provider( + instant: Instant, + time_zone: TimeZone, + calendar: Calendar, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + let offset = time_zone + .get_utc_offset_for(instant.epoch_nanoseconds().0, provider) + .temporal_unwrap()?; + Ok(Self { + instant, + calendar, + time_zone, + cached_offset: offset, + }) + } + + /// Equivalent to self.tz.get_iso_datetime_for(&self.instant, provider) + /// + /// (which is GetISODateTimeFor(self.[[TimeZone]], self.[[EpochNanoseconds]]).) + pub(crate) fn get_iso_datetime(&self) -> IsoDateTime { + self.cached_offset.get_iso_datetime_for(&self.instant) + } + + pub(crate) fn add_zoned_date_time( + &self, + duration: InternalDurationRecord, + overflow: Overflow, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + // 1. If DateDurationSign(duration.[[Date]]) = 0, then + if duration.date().sign() == Sign::Zero { + // a. Return ? AddInstant(epochNanoseconds, duration.[[Time]]). + return self + .instant + .add_to_instant(&duration.normalized_time_duration()); + } + // 2. Let isoDateTime be GetISODateTimeFor(timeZone, epochNanoseconds). + let iso_datetime = self.get_iso_datetime(); + // 3. Let addedDate be ? CalendarDateAdd(calendar, isoDateTime.[[ISODate]], duration.[[Date]], overflow). + let added_date = + self.calendar() + .date_add(&iso_datetime.date, &duration.date(), overflow)?; + // 4. Let intermediateDateTime be CombineISODateAndTimeRecord(addedDate, isoDateTime.[[Time]]). + let intermediate = IsoDateTime::new_unchecked(added_date.iso, iso_datetime.time); + // 5. If ISODateTimeWithinLimits(intermediateDateTime) is false, throw a RangeError exception. + if !intermediate.is_within_limits() { + return Err( + TemporalError::range().with_enum(ErrorMessage::IntermediateDateTimeOutOfRange) + ); + } + // 6. Let intermediateNs be ! GetEpochNanosecondsFor(timeZone, intermediateDateTime, compatible). + let intermediate_ns = self.time_zone().get_epoch_nanoseconds_for( + intermediate, + Disambiguation::Compatible, + provider, + )?; + + // 7. Return ? AddInstant(intermediateNs, duration.[[Time]]). + Instant::from(intermediate_ns.ns).add_to_instant(&duration.normalized_time_duration()) + } + + /// Adds a duration to the current `ZonedDateTime`, returning the resulting `ZonedDateTime`. + /// + /// Aligns with Abstract Operation 6.5.10 + #[inline] + pub(crate) fn add_internal( + &self, + duration: &Duration, + overflow: Overflow, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + // 1. Let duration be ? ToTemporalDuration(temporalDurationLike). + // 2. If operation is subtract, set duration to CreateNegatedTemporalDuration(duration). + // 3. Let resolvedOptions be ? GetOptionsObject(options). + // 4. Let overflow be ? GetTemporalOverflowOption(resolvedOptions). + // 5. Let calendar be zonedDateTime.[[Calendar]]. + // 6. Let timeZone be zonedDateTime.[[TimeZone]]. + // 7. Let internalDuration be ToInternalDurationRecord(duration). + let internal_duration = duration.to_internal_duration_record(); + // 8. Let epochNanoseconds be ? AddZonedDateTime(zonedDateTime.[[EpochNanoseconds]], timeZone, calendar, internalDuration, overflow). + let epoch_ns = self.add_zoned_date_time(internal_duration, overflow, provider)?; + // 9. Return ! CreateTemporalZonedDateTime(epochNanoseconds, timeZone, calendar). + Self::new_unchecked_with_provider( + epoch_ns, + *self.time_zone(), + self.calendar().clone(), + provider, + ) + } + + /// Internal representation of Abstract Op 6.5.7 + pub(crate) fn diff_with_rounding( + &self, + other: &Instant, + resolved_options: ResolvedRoundingOptions, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + // 1. If UnitCategory(largestUnit) is time, then + if resolved_options.largest_unit.is_time_unit() { + // a. Return DifferenceInstant(ns1, ns2, roundingIncrement, smallestUnit, roundingMode). + return self.instant.diff_instant_internal(other, resolved_options); + } + // 2. let difference be ? differencezoneddatetime(ns1, ns2, timezone, calendar, largestunit). + let diff = self.diff_zoned_datetime(other, resolved_options.largest_unit, provider)?; + // 3. if smallestunit is nanosecond and roundingincrement = 1, return difference. + if resolved_options.smallest_unit == Unit::Nanosecond + && resolved_options.increment == RoundingIncrement::ONE + { + return Ok(diff); + } + // 4. let datetime be getisodatetimefor(timezone, ns1). + let iso = self.get_iso_datetime(); + // 5. Return ? RoundRelativeDuration(difference, ns2, dateTime, timeZone, calendar, largestUnit, roundingIncrement, smallestUnit, roundingMode). + diff.round_relative_duration( + other.epoch_nanoseconds().as_i128(), + &PlainDateTime::new_unchecked(iso, self.calendar().clone()), + Some((self.time_zone(), provider)), + resolved_options, + ) + } + + /// Internal representation of Abstract Op 6.5.8 + pub(crate) fn diff_with_total( + &self, + other: &Instant, + unit: Unit, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + // 1. If UnitCategory(unit) is time, then + if unit.is_time_unit() { + // a. Let difference be TimeDurationFromEpochNanosecondsDifference(ns2, ns1). + let diff = TimeDuration::from_nanosecond_difference( + other.epoch_nanoseconds().as_i128(), + self.epoch_nanoseconds().as_i128(), + )?; + // b. Return TotalTimeDuration(difference, unit). + return diff.total(unit); + } + + // 2. Let difference be ? DifferenceZonedDateTime(ns1, ns2, timeZone, calendar, unit). + let diff = self.diff_zoned_datetime(other, unit, provider)?; + // 3. Let dateTime be GetISODateTimeFor(timeZone, ns1). + let iso = self.get_iso_datetime(); + // 4. Return ? TotalRelativeDuration(difference, ns2, dateTime, timeZone, calendar, unit). + diff.total_relative_duration( + other.epoch_nanoseconds().as_i128(), + &PlainDateTime::new_unchecked(iso, self.calendar().clone()), + Some((self.time_zone(), provider)), + unit, + ) + } + + pub(crate) fn diff_zoned_datetime( + &self, + other: &Instant, + largest_unit: Unit, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + // 1. If ns1 = ns2, return CombineDateAndTimeDuration(ZeroDateDuration(), 0). + if self.epoch_nanoseconds() == other.epoch_nanoseconds() { + return Ok(InternalDurationRecord::default()); + } + // 2. Let startDateTime be GetISODateTimeFor(timeZone, ns1). + let start = self.get_iso_datetime(); + // 3. Let endDateTime be GetISODateTimeFor(timeZone, ns2). + let end = self.time_zone.get_iso_datetime_for(other, provider)?; + // 4. If ns2 - ns1 < 0, let sign be -1; else let sign be 1. + let sign = if other.epoch_nanoseconds().as_i128() - self.epoch_nanoseconds().as_i128() < 0 { + Sign::Negative + } else { + Sign::Positive + }; + // 5. If sign = 1, let maxDayCorrection be 2; else let maxDayCorrection be 1. + let max_correction = if sign == Sign::Positive { 2 } else { 1 }; + // 6. Let dayCorrection be 0. + // 7. Let timeDuration be DifferenceTime(startDateTime.[[Time]], endDateTime.[[Time]]). + let time = start.time.diff(&end.time); + // 8. If TimeDurationSign(timeDuration) = -sign, set dayCorrection to dayCorrection + 1. + let mut day_correction = if time.sign() as i8 == -(sign as i8) { + 1 + } else { + 0 + }; + + // 9. Let success be false. + let mut intermediate_dt = IsoDateTime::default(); + let mut time_duration = TimeDuration::default(); + let mut is_success = false; + // 10. Repeat, while dayCorrection ≤ maxDayCorrection and success is false, + while day_correction <= max_correction && !is_success { + // a. Let intermediateDate be BalanceISODate(endDateTime.[[ISODate]].[[Year]], + // endDateTime.[[ISODate]].[[Month]], endDateTime.[[ISODate]].[[Day]] - dayCorrection × sign). + let intermediate = IsoDate::balance( + end.date.year, + end.date.month.into(), + i32::from(end.date.day) - i32::from(day_correction * sign as i8), + ); + // b. Let intermediateDateTime be CombineISODateAndTimeRecord(intermediateDate, startDateTime.[[Time]]). + intermediate_dt = IsoDateTime::new_unchecked(intermediate, start.time); + // c. Let intermediateNs be ? GetEpochNanosecondsFor(timeZone, intermediateDateTime, compatible). + let intermediate_ns = self.time_zone.get_epoch_nanoseconds_for( + intermediate_dt, + Disambiguation::Compatible, + provider, + )?; + // d. Set timeDuration to TimeDurationFromEpochNanosecondsDifference(ns2, intermediateNs). + time_duration = TimeDuration::from_nanosecond_difference( + other.epoch_nanoseconds().as_i128(), + intermediate_ns.ns.0, + )?; + // e. Let timeSign be TimeDurationSign(timeDuration). + let time_sign = time_duration.sign() as i8; + // f. If sign ≠ -timeSign, then + if sign as i8 != -time_sign { + // i. Set success to true. + is_success = true; + } + // g. Set dayCorrection to dayCorrection + 1. + day_correction += 1; + } + // 11. Assert: success is true. + // 12. Let dateLargestUnit be LargerOfTwoUnits(largestUnit, day). + let date_largest = largest_unit.max(Unit::Day); + // 13. Let dateDifference be CalendarDateUntil(calendar, startDateTime.[[ISODate]], intermediateDateTime.[[ISODate]], dateLargestUnit). + // 14. Return CombineDateAndTimeDuration(dateDifference, timeDuration). + let date_diff = + self.calendar() + .date_until(&start.date, &intermediate_dt.date, date_largest)?; + InternalDurationRecord::new(date_diff.date(), time_duration) + } + + /// `temporal_rs` equivalent to `DifferenceTemporalZonedDateTime`. + pub(crate) fn diff_internal_with_provider( + &self, + op: DifferenceOperation, + other: &Self, + options: DifferenceSettings, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + // NOTE: for order of operations, this should be asserted prior to this point + // by any engine implementors, but asserting out of caution. + if self.calendar != other.calendar { + return Err(TemporalError::range().with_enum(ErrorMessage::CalendarMismatch)); + } + + // 4. Set settings be ? GetDifferenceSettings(operation, resolvedOptions, datetime, « », nanosecond, hour). + let resolved_options = ResolvedRoundingOptions::from_diff_settings( + options, + op, + UnitGroup::DateTime, + Unit::Hour, + Unit::Nanosecond, + )?; + + // 5. If UnitCategory(settings.[[LargestUnit]]) is time, then + if resolved_options.largest_unit.is_time_unit() { + // a. Let internalDuration be DifferenceInstant(zonedDateTime.[[EpochNanoseconds]], other.[[EpochNanoseconds]], settings.[[RoundingIncrement]], settings.[[SmallestUnit]], settings.[[RoundingMode]]). + let internal = self + .instant + .diff_instant_internal(&other.instant, resolved_options)?; + // b. Let result be ! TemporalDurationFromInternal(internalDuration, settings.[[LargestUnit]]). + let result = Duration::from_internal(internal, resolved_options.largest_unit)?; + // c. If operation is since, set result to CreateNegatedTemporalDuration(result). + // d. Return result. + match op { + DifferenceOperation::Since => return Ok(result.negated()), + DifferenceOperation::Until => return Ok(result), + } + } + + // 6. NOTE: To calculate differences in two different time zones, + // settings.[[LargestUnit]] must be a time unit, because day lengths + // can vary between time zones due to DST and other UTC offset shifts. + // 7. If TimeZoneEquals(zonedDateTime.[[TimeZone]], other.[[TimeZone]]) is false, then + if !self + .time_zone + .time_zone_equals_with_provider(&other.time_zone, provider)? + { + // a. Throw a RangeError exception. + return Err(TemporalError::range().with_enum(ErrorMessage::TzMismatch)); + } + + // 8. If zonedDateTime.[[EpochNanoseconds]] = other.[[EpochNanoseconds]], then + if self.instant == other.instant { + // a. Return ! CreateTemporalDuration(0, 0, 0, 0, 0, 0, 0, 0, 0, 0). + return Ok(Duration::default()); + } + + // 9. Let internalDuration be ? DifferenceZonedDateTimeWithRounding(zonedDateTime.[[EpochNanoseconds]], other.[[EpochNanoseconds]], zonedDateTime.[[TimeZone]], zonedDateTime.[[Calendar]], settings.[[LargestUnit]], settings.[[RoundingIncrement]], settings.[[SmallestUnit]], settings.[[RoundingMode]]). + let internal = self.diff_with_rounding(&other.instant, resolved_options, provider)?; + // 10. Let result be ! TemporalDurationFromInternal(internalDuration, hour). + let result = Duration::from_internal(internal, Unit::Hour)?; + // 11. If operation is since, set result to CreateNegatedTemporalDuration(result). + // 12. Return result. + match op { + DifferenceOperation::Since => Ok(result.negated()), + DifferenceOperation::Until => Ok(result), + } + } +} + +// ==== Public API ==== + +impl ZonedDateTime { + /// Creates a new valid `ZonedDateTime`. + #[inline] + pub fn try_new_with_provider( + nanos: i128, + time_zone: TimeZone, + calendar: Calendar, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + let instant = Instant::try_new(nanos)?; + Self::new_unchecked_with_provider(instant, time_zone, calendar, provider) + } + + /// Creates a new valid `ZonedDateTime`. + #[inline] + pub(crate) fn try_new_with_cached_offset( + nanos: i128, + time_zone: TimeZone, + calendar: Calendar, + cached_offset: UtcOffsetSeconds, + ) -> TemporalResult { + let instant = Instant::try_new(nanos)?; + Ok(Self::new_unchecked( + instant, + time_zone, + calendar, + cached_offset, + )) + } + + /// Creates a new valid `ZonedDateTime` with an ISO 8601 calendar. + #[inline] + pub fn try_new_iso_with_provider( + nanos: i128, + time_zone: TimeZone, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + let instant = Instant::try_new(nanos)?; + Self::new_unchecked_with_provider(instant, time_zone, Calendar::ISO, provider) + } + + /// Creates a new valid `ZonedDateTime` from an [`Instant`]. + #[inline] + pub fn try_new_from_instant_with_provider( + instant: Instant, + time_zone: TimeZone, + calendar: Calendar, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + Self::new_unchecked_with_provider(instant, time_zone, calendar, provider) + } + + /// Creates a new valid `ZonedDateTime` from an [`Instant`] with an ISO 8601 calendar. + #[inline] + pub fn try_new_iso_from_instant_with_provider( + instant: Instant, + time_zone: TimeZone, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + Self::new_unchecked_with_provider(instant, time_zone, Calendar::ISO, provider) + } + + /// Returns `ZonedDateTime`'s Calendar. + #[inline] + #[must_use] + pub fn calendar(&self) -> &Calendar { + &self.calendar + } + + /// Returns `ZonedDateTime`'s `TimeZone` slot. + #[inline] + #[must_use] + pub fn time_zone(&self) -> &TimeZone { + &self.time_zone + } + + /// Create a `ZonedDateTime` from a `PartialZonedDateTime`. + #[inline] + pub fn from_partial_with_provider( + partial: PartialZonedDateTime, + overflow: Option, + disambiguation: Option, + offset_option: Option, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + let overflow = overflow.unwrap_or(Overflow::Constrain); + let disambiguation = disambiguation.unwrap_or(Disambiguation::Compatible); + let offset_option = offset_option.unwrap_or(OffsetDisambiguation::Reject); + + let date = partial + .calendar + .date_from_fields(partial.fields.calendar_fields, overflow)? + .iso; + + let time = Some(IsoTime::default().with(partial.fields.time, overflow)?); + + // Handle time zones + let offset_nanos = partial.fields.offset.map(|offset| offset.nanoseconds()); + + let timezone = partial + .timezone + .unwrap_or_else(|| TimeZone::utc_with_provider(provider)); + let epoch_nanos = interpret_isodatetime_offset( + date, + time, + false, + offset_nanos, + &timezone, + disambiguation, + offset_option, + false, + provider, + )?; + + Ok(Self::new_unchecked( + Instant::from(epoch_nanos.ns), + timezone, + partial.calendar, + epoch_nanos.offset, + )) + } + + /// Returns the `epochMilliseconds` value of this `ZonedDateTime`. + #[must_use] + pub fn epoch_milliseconds(&self) -> i64 { + self.instant.epoch_milliseconds() + } + + /// Returns the `epochNanoseconds` value of this `ZonedDateTime`. + #[must_use] + pub fn epoch_nanoseconds(&self) -> &EpochNanoseconds { + self.instant.epoch_nanoseconds() + } + + /// Returns the current `ZonedDateTime` as an [`Instant`]. + #[must_use] + pub fn to_instant(&self) -> Instant { + self.instant + } + + pub fn with_with_provider( + &self, + fields: ZonedDateTimeFields, + disambiguation: Option, + offset_option: Option, + overflow: Option, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + let overflow = overflow.unwrap_or_default(); + let disambiguation = disambiguation.unwrap_or_default(); + let offset_option = offset_option.unwrap_or(OffsetDisambiguation::Reject); + // 8. Let isoDateTime be GetISODateTimeFor(timeZone, epochNs). + let iso_date_time = self.get_iso_datetime(); + let plain_date_time = PlainDateTime::new_unchecked(iso_date_time, self.calendar.clone()); + + // 23. Let dateTimeResult be ? InterpretTemporalDateTimeFields(calendar, fields, overflow). + let result_date = self.calendar.date_from_fields( + fields.calendar_fields.with_fallback_datetime( + &plain_date_time, + self.calendar.kind(), + overflow, + )?, + overflow, + )?; + + let time = iso_date_time.time.with(fields.time, overflow)?; + + // 7. Let offsetNanoseconds be GetOffsetNanosecondsFor(timeZone, epochNs). + let original_offset = self.offset_nanoseconds(); + // 24. Let newOffsetNanoseconds be ! ParseDateTimeUTCOffset(fields.[[OffsetString]]). + let new_offset_nanos = fields + .offset + .map(|offset| offset.nanoseconds()) + .or(Some(original_offset)); + + // 25. Let epochNanoseconds be ? InterpretISODateTimeOffset(dateTimeResult.[[ISODate]], dateTimeResult.[[Time]], option, newOffsetNanoseconds, timeZone, disambiguation, offset, match-exactly). + let epoch_nanos = interpret_isodatetime_offset( + result_date.iso, + Some(time), + // Set to Option ... we don't use an enum here, so any value will do. + true, + new_offset_nanos, + &self.time_zone, + disambiguation, + offset_option, + // match-exactly + false, + provider, + )?; + + // 26. Return ! CreateTemporalZonedDateTime(epochNanoseconds, timeZone, calendar). + Ok(Self::new_unchecked( + Instant::from(epoch_nanos.ns), + self.time_zone, + self.calendar.clone(), + epoch_nanos.offset, + )) + } + + /// Creates a new `ZonedDateTime` from the current `ZonedDateTime` + /// combined with the provided `TimeZone`. + pub fn with_time_zone_with_provider( + &self, + time_zone: TimeZone, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + Self::try_new_with_provider( + self.epoch_nanoseconds().as_i128(), + time_zone, + self.calendar.clone(), + provider, + ) + } + + /// Creates a new `ZonedDateTime` from the current `ZonedDateTime` + /// combined with the provided `Calendar`. + #[inline] + #[must_use] + pub fn with_calendar(&self, calendar: Calendar) -> Self { + Self::new_unchecked( + self.instant, + self.time_zone, + calendar, + self.cached_offset.into(), + ) + } + + /// Compares one `ZonedDateTime` to another `ZonedDateTime` using their + /// `Instant` representation. + /// + /// # Note on Ordering. + /// + /// `temporal_rs` does not implement `PartialOrd`/`Ord` as `ZonedDateTime` does + /// not fulfill all the conditions required to implement the traits. However, + /// it is possible to compare `PlainDate`'s as their `IsoDate` representation. + #[inline] + #[must_use] + pub fn compare_instant(&self, other: &Self) -> Ordering { + self.instant.cmp(&other.instant) + } +} + +// ==== HoursInDay accessor method implementation ==== + +impl ZonedDateTime { + /// Get the previous or next time zone transition for the current `ZonedDateTime`. + pub fn get_time_zone_transition_with_provider( + &self, + direction: TransitionDirection, + provider: &impl TimeZoneProvider, + ) -> TemporalResult> { + // 8. If IsOffsetTimeZoneIdentifier(timeZone) is true, return null. + let TimeZone::IanaIdentifier(identifier) = self.time_zone else { + return Ok(None); + }; + // 9. If direction is next, then + // a. Let transition be GetNamedTimeZoneNextTransition(timeZone, zonedDateTime.[[EpochNanoseconds]]). + // 10. Else, + // a. Assert: direction is previous. + // b. Let transition be GetNamedTimeZonePreviousTransition(timeZone, zonedDateTime.[[EpochNanoseconds]]). + let transition = provider.get_time_zone_transition( + identifier, + self.epoch_nanoseconds().as_i128(), + direction, + )?; + + // 11. If transition is null, return null. + let Some(transition) = transition else { + return Ok(None); + }; + + if transition.check_validity().is_err() { + // GetNamedTimeZoneNextTransition, GetNamedTimeZonePreviousTransition include a check for out-of-bounds + // instants. Instead of requiring providers handle that, we handle it here. + return Ok(None); + } + // 12. Return ! CreateTemporalZonedDateTime(transition, timeZone, zonedDateTime.[[Calendar]]). + Ok(Some( + ZonedDateTime::try_new_with_provider( + transition.0, + self.time_zone, + self.calendar().clone(), + provider, + ) + .ok() + .temporal_unwrap()?, + )) + } + + pub fn hours_in_day_with_provider( + &self, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + // 1-3. Is engine specific steps + // 4. Let isoDateTime be GetISODateTimeFor(timeZone, zonedDateTime.[[EpochNanoseconds]]). + let iso = self.get_iso_datetime(); + // 5. Let today be isoDateTime.[[ISODate]]. + let today = iso.date; + // 6. Let tomorrow be BalanceISODate(today.[[Year]], today.[[Month]], today.[[Day]] + 1). + let tomorrow = IsoDate::balance(today.year, today.month.into(), i32::from(today.day + 1)); + // 7. Let todayNs be ? GetStartOfDay(timeZone, today). + let today = self.time_zone.get_start_of_day(&today, provider)?; + // 8. Let tomorrowNs be ? GetStartOfDay(timeZone, tomorrow). + let tomorrow = self.time_zone.get_start_of_day(&tomorrow, provider)?; + // 9. Let diff be TimeDurationFromEpochNanosecondsDifference(tomorrowNs, todayNs). + let diff = TimeDuration::from_nanosecond_difference(tomorrow.ns.0, today.ns.0)?; + // NOTE: The below should be safe as today_ns and tomorrow_ns should be at most 25 hours. + // TODO: Tests for the below cast. + // 10. Return 𝔽(TotalTimeDuration(diff, hour)). + Ok(diff.divide(3_600_000_000_000.)) + } +} + +// ==== Core accessor methods ==== + +impl ZonedDateTime { + /// Returns the `year` value for this `ZonedDateTime`. + #[inline] + pub fn year(&self) -> i32 { + let iso = self.get_iso_datetime(); + let dt = PlainDateTime::new_unchecked(iso, self.calendar.clone()); + self.calendar.year(&dt.iso.date) + } + + /// Returns the `month` value for this `ZonedDateTime`. + pub fn month(&self) -> u8 { + let iso = self.get_iso_datetime(); + let dt = PlainDateTime::new_unchecked(iso, self.calendar.clone()); + self.calendar.month(&dt.iso.date) + } + + /// Returns the `monthCode` value for this `ZonedDateTime`. + pub fn month_code(&self) -> MonthCode { + let iso = self.get_iso_datetime(); + let dt = PlainDateTime::new_unchecked(iso, self.calendar.clone()); + self.calendar.month_code(&dt.iso.date) + } + + /// Returns the `day` value for this `ZonedDateTime`. + pub fn day(&self) -> u8 { + let iso = self.get_iso_datetime(); + let dt = PlainDateTime::new_unchecked(iso, self.calendar.clone()); + self.calendar.day(&dt.iso.date) + } + + /// Returns the `hour` value for this `ZonedDateTime`. + pub fn hour(&self) -> u8 { + let iso = self.get_iso_datetime(); + iso.time.hour + } + + /// Returns the `minute` value for this `ZonedDateTime`. + pub fn minute(&self) -> u8 { + let iso = self.get_iso_datetime(); + iso.time.minute + } + + /// Returns the `second` value for this `ZonedDateTime`. + pub fn second(&self) -> u8 { + let iso = self.get_iso_datetime(); + iso.time.second + } + + /// Returns the `millisecond` value for this `ZonedDateTime`. + pub fn millisecond(&self) -> u16 { + let iso = self.get_iso_datetime(); + iso.time.millisecond + } + + /// Returns the `microsecond` value for this `ZonedDateTime`. + pub fn microsecond(&self) -> u16 { + let iso = self.get_iso_datetime(); + iso.time.microsecond + } + + /// Returns the `nanosecond` value for this `ZonedDateTime`. + pub fn nanosecond(&self) -> u16 { + let iso = self.get_iso_datetime(); + iso.time.nanosecond + } + + // TODO: Expose a format / writeable API + /// Returns an offset string for the current `ZonedDateTime`. + pub fn offset(&self) -> String { + let offset = self.cached_offset.nanoseconds(); + nanoseconds_to_formattable_offset(offset as i128).to_string() + } + + /// Returns the offset nanoseconds for the current `ZonedDateTime`. + pub fn offset_nanoseconds(&self) -> i64 { + self.cached_offset.nanoseconds() + } +} + +pub(crate) fn nanoseconds_to_formattable_offset(nanoseconds: i128) -> FormattableOffset { + let sign = if nanoseconds >= 0 { + Sign::Positive + } else { + Sign::Negative + }; + let nanos = nanoseconds.unsigned_abs(); + let hour = (nanos / 3_600_000_000_000) as u8; + let minute = ((nanos / 60_000_000_000) % 60) as u8; + let second = ((nanos / 1_000_000_000) % 60) as u8; + let nanosecond = (nanos % 1_000_000_000) as u32; + + let precision = if second == 0 && nanosecond == 0 { + Precision::Minute + } else { + Precision::Auto + }; + + FormattableOffset { + sign, + time: FormattableTime { + hour, + minute, + second, + nanosecond, + precision, + include_sep: true, + }, + } +} + +// ==== Core calendar method implementations ==== + +impl ZonedDateTime { + /// Returns the era for the current `ZonedDateTime`. + pub fn era(&self) -> Option> { + let iso = self.get_iso_datetime(); + let pdt = PlainDateTime::new_unchecked(iso, self.calendar.clone()); + self.calendar.era(&pdt.iso.date) + } + + /// Returns the era-specific year for the current `ZonedDateTime`. + pub fn era_year(&self) -> Option { + let iso = self.get_iso_datetime(); + let pdt = PlainDateTime::new_unchecked(iso, self.calendar.clone()); + self.calendar.era_year(&pdt.iso.date) + } + + /// Returns the calendar day of week value. + pub fn day_of_week(&self) -> u16 { + let iso = self.get_iso_datetime(); + let pdt = PlainDateTime::new_unchecked(iso, self.calendar.clone()); + self.calendar.day_of_week(&pdt.iso.date) + } + + /// Returns the calendar day of year value. + pub fn day_of_year(&self) -> u16 { + let iso = self.get_iso_datetime(); + let pdt = PlainDateTime::new_unchecked(iso, self.calendar.clone()); + self.calendar.day_of_year(&pdt.iso.date) + } + + /// Returns the calendar week of year value. + pub fn week_of_year(&self) -> Option { + let iso = self.get_iso_datetime(); + let pdt = PlainDateTime::new_unchecked(iso, self.calendar.clone()); + self.calendar.week_of_year(&pdt.iso.date) + } + + /// Returns the calendar year of week value. + pub fn year_of_week(&self) -> Option { + let iso = self.get_iso_datetime(); + let pdt = PlainDateTime::new_unchecked(iso, self.calendar.clone()); + self.calendar.year_of_week(&pdt.iso.date) + } + + /// Returns the calendar days in week value. + pub fn days_in_week(&self) -> u16 { + let iso = self.get_iso_datetime(); + let pdt = PlainDateTime::new_unchecked(iso, self.calendar.clone()); + self.calendar.days_in_week(&pdt.iso.date) + } + + /// Returns the calendar days in month value. + pub fn days_in_month(&self) -> u16 { + let iso = self.get_iso_datetime(); + let pdt = PlainDateTime::new_unchecked(iso, self.calendar.clone()); + self.calendar.days_in_month(&pdt.iso.date) + } + + /// Returns the calendar days in year value. + pub fn days_in_year(&self) -> u16 { + let iso = self.get_iso_datetime(); + let pdt = PlainDateTime::new_unchecked(iso, self.calendar.clone()); + self.calendar.days_in_year(&pdt.iso.date) + } + + /// Returns the calendar months in year value. + pub fn months_in_year(&self) -> u16 { + let iso = self.get_iso_datetime(); + let pdt = PlainDateTime::new_unchecked(iso, self.calendar.clone()); + self.calendar.months_in_year(&pdt.iso.date) + } + + /// Returns returns whether the date in a leap year for the given calendar. + pub fn in_leap_year(&self) -> bool { + let iso = self.get_iso_datetime(); + let pdt = PlainDateTime::new_unchecked(iso, self.calendar.clone()); + self.calendar.in_leap_year(&pdt.iso.date) + } +} + +// ==== Core method implementations ==== + +impl ZonedDateTime { + /// Creates a new `ZonedDateTime` from the current `ZonedDateTime` + /// combined with the provided `TimeZone`. + pub fn with_plain_time_and_provider( + &self, + time: Option, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + let iso = self.get_iso_datetime(); + let epoch_ns = if let Some(time) = time { + let result_iso = IsoDateTime::new_unchecked(iso.date, time.iso); + self.time_zone.get_epoch_nanoseconds_for( + result_iso, + Disambiguation::Compatible, + provider, + )? + } else { + self.time_zone.get_start_of_day(&iso.date, provider)? + }; + Self::try_new_with_cached_offset( + epoch_ns.ns.0, + self.time_zone, + self.calendar.clone(), + epoch_ns.offset, + ) + } + + /// Add a duration to the current `ZonedDateTime` + pub fn add_with_provider( + &self, + duration: &Duration, + overflow: Option, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + self.add_internal(duration, overflow.unwrap_or(Overflow::Constrain), provider) + } + + /// Subtract a duration to the current `ZonedDateTime` + pub fn subtract_with_provider( + &self, + duration: &Duration, + overflow: Option, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + self.add_internal( + &duration.negated(), + overflow.unwrap_or(Overflow::Constrain), + provider, + ) + } + + /// Checks if the current `ZonedDateTime` is equal to another `ZonedDateTime`. + pub fn equals_with_provider( + &self, + other: &Self, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + // 4. If zonedDateTime.[[EpochNanoseconds]] ≠ other.[[EpochNanoseconds]], return false. + if self.instant != other.instant { + return Ok(false); + } + + // 5. If TimeZoneEquals(zonedDateTime.[[TimeZone]], other.[[TimeZone]]) is false, return false. + if !self + .time_zone + .time_zone_equals_with_provider(&other.time_zone, provider)? + { + return Ok(false); + } + // 6. Return CalendarEquals(zonedDateTime.[[Calendar]], other.[[Calendar]]). + Ok(self.calendar == other.calendar) + } + + /// Returns a [`Duration`] representing the period of time from this `ZonedDateTime` since the other `ZonedDateTime`. + pub fn since_with_provider( + &self, + other: &Self, + options: DifferenceSettings, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + self.diff_internal_with_provider(DifferenceOperation::Since, other, options, provider) + } + + /// Returns a [`Duration`] representing the period of time from this `ZonedDateTime` since the other `ZonedDateTime`. + pub fn until_with_provider( + &self, + other: &Self, + options: DifferenceSettings, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + self.diff_internal_with_provider(DifferenceOperation::Until, other, options, provider) + } + + /// Return a `ZonedDateTime` representing the start of the day + /// for the current `ZonedDateTime`. + pub fn start_of_day_with_provider( + &self, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + let iso = self.get_iso_datetime(); + let epoch_nanos = self.time_zone.get_start_of_day(&iso.date, provider)?; + Self::try_new_with_cached_offset( + epoch_nanos.ns.0, + self.time_zone, + self.calendar.clone(), + epoch_nanos.offset, + ) + } + + /// Convert the current `ZonedDateTime` to a [`PlainDate`] + pub fn to_plain_date(&self) -> PlainDate { + let iso = self.get_iso_datetime(); + PlainDate::new_unchecked(iso.date, self.calendar.clone()) + } + + /// Convert the current `ZonedDateTime` to a [`PlainTime`] + pub fn to_plain_time(&self) -> PlainTime { + let iso = self.get_iso_datetime(); + PlainTime::new_unchecked(iso.time) + } + + /// Convert the current `ZonedDateTime` to a [`PlainDateTime`] + pub fn to_plain_date_time(&self) -> PlainDateTime { + let iso = self.get_iso_datetime(); + PlainDateTime::new_unchecked(iso, self.calendar.clone()) + } + + /// Creates a default formatted IXDTF (RFC 9557) date/time string for the provided `ZonedDateTime`. + pub fn to_string_with_provider( + &self, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + self.to_ixdtf_string_with_provider( + DisplayOffset::Auto, + DisplayTimeZone::Auto, + DisplayCalendar::Auto, + ToStringRoundingOptions::default(), + provider, + ) + } + + /// 6.3.39 Temporal.ZonedDateTime.prototype.round + pub fn round_with_provider( + &self, + options: RoundingOptions, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + // 1. Let zonedDateTime be the this value. + // 2. Perform ? RequireInternalSlot(zonedDateTime, [[InitializedTemporalZonedDateTime]]). + // 3. If roundTo is undefined, then + // a. Throw a TypeError exception. + // 4. If roundTo is a String, then + // a. Let paramString be roundTo. + // b. Set roundTo to OrdinaryObjectCreate(null). + // c. Perform ! CreateDataPropertyOrThrow(roundTo, "smallestUnit", paramString). + // 5. Else, + // a. Set roundTo to ? GetOptionsObject(roundTo). + // 6. NOTE: The following steps read options and perform independent validation in alphabetical order (GetRoundingIncrementOption reads "roundingIncrement" and GetRoundingModeOption reads "roundingMode"). + // 7. Let roundingIncrement be ? GetRoundingIncrementOption(roundTo). + // 8. Let roundingMode be ? GetRoundingModeOption(roundTo, half-expand). + // 9. Let smallestUnit be ? GetTemporalUnitValuedOption(roundTo, "smallestUnit", time, required, « day »). + // 10. If smallestUnit is day, then + // a. Let maximum be 1. + // b. Let inclusive be true. + // 11. Else, + // a. Let maximum be MaximumTemporalDurationRoundingIncrement(smallestUnit). + // b. Assert: maximum is not unset. + // c. Let inclusive be false. + let resolved = ResolvedRoundingOptions::from_datetime_options(options)?; + // 12. Perform ? ValidateTemporalRoundingIncrement(roundingIncrement, maximum, inclusive). + // 13. If maximum is not unset, perform ? ValidateTemporalRoundingIncrement(roundingIncrement, maximum, false). + // 13. If smallestUnit is nanosecond and roundingIncrement = 1, then + if resolved.smallest_unit == Unit::Nanosecond + && resolved.increment == RoundingIncrement::ONE + { + // a. Return ! CreateTemporalZonedDateTime(zonedDateTime.[[EpochNanoseconds]], zonedDateTime.[[TimeZone]], zonedDateTime.[[Calendar]]). + return Ok(self.clone()); + } + // 14. Let thisNs be zonedDateTime.[[EpochNanoseconds]]. + let this_ns = self.epoch_nanoseconds(); + // 15. Let timeZone be zonedDateTime.[[TimeZone]]. + // 16. Let calendar be zonedDateTime.[[Calendar]]. + // 17. Let isoDateTime be GetISODateTimeFor(timeZone, thisNs). + // 18. If smallestUnit is day, then + if resolved.smallest_unit == Unit::Day { + // a. Let dateStart be isoDateTime.[[ISODate]]. + let iso_start = self.get_iso_datetime(); + // b. Let dateEnd be BalanceISODate(dateStart.[[Year]], dateStart.[[Month]], dateStart.[[Day]] + 1). + let iso_end = IsoDate::balance( + iso_start.date.year, + iso_start.date.month.into(), + i32::from(iso_start.date.day + 1), + ); + // c. Let startNs be ? GetStartOfDay(timeZone, dateStart). + // d. Assert: thisNs ≥ startNs. + // e. Let endNs be ? GetStartOfDay(timeZone, dateEnd). + // f. Assert: thisNs < endNs. + let start = self.time_zone.get_start_of_day(&iso_start.date, provider)?; + let end = self.time_zone.get_start_of_day(&iso_end, provider)?; + if !(this_ns.0 >= start.ns.0 && this_ns.0 < end.ns.0) { + return Err(TemporalError::range().with_enum(ErrorMessage::ZDTOutOfDayBounds)); + } + // g. Let dayLengthNs be ℝ(endNs - startNs). + // h. Let dayProgressNs be TimeDurationFromEpochNanosecondsDifference(thisNs, startNs). + let day_len_ns = TimeDuration::from_nanosecond_difference(end.ns.0, start.ns.0)?; + let day_progress_ns = TimeDuration::from_nanosecond_difference(this_ns.0, start.ns.0)?; + // i. Let roundedDayNs be ! RoundTimeDurationToIncrement(dayProgressNs, dayLengthNs, roundingMode). + let rounded = if let Some(increment) = NonZeroU128::new(day_len_ns.0.unsigned_abs()) { + IncrementRounder::::from_signed_num(day_progress_ns.0, increment)? + .round(resolved.rounding_mode) + } else { + 0 // Zero-length day: round to start of day + }; + + // The cached offset will be based on which way we round + let offset = if rounded == 0 { + start.offset + } else { + end.offset + }; + + // j. Let epochNanoseconds be AddTimeDurationToEpochNanoseconds(roundedDayNs, startNs). + let candidate = start.ns.0 + rounded; + Instant::try_new(candidate)?; + // 20. Return ! CreateTemporalZonedDateTime(epochNanoseconds, timeZone, calendar). + ZonedDateTime::try_new_with_cached_offset( + candidate, + self.time_zone, + self.calendar.clone(), + offset, + ) + } else { + // 19. Else, + // a. Let roundResult be RoundISODateTime(isoDateTime, roundingIncrement, smallestUnit, roundingMode). + // b. Let offsetNanoseconds be GetOffsetNanosecondsFor(timeZone, thisNs). + // c. Let epochNanoseconds be ? InterpretISODateTimeOffset(roundResult.[[ISODate]], roundResult.[[Time]], option, offsetNanoseconds, timeZone, compatible, prefer, match-exactly). + // 20. Return ! CreateTemporalZonedDateTime(epochNanoseconds, timeZone, calendar). + let iso_dt = self.get_iso_datetime(); + let rounded_dt = iso_dt.round(resolved)?; + let offset_ns = self + .time_zone + .get_offset_nanos_for(this_ns.as_i128(), provider)?; + + let epoch_ns = interpret_isodatetime_offset( + rounded_dt.date, + Some(rounded_dt.time), + false, + Some(offset_ns as i64), + &self.time_zone, + Disambiguation::Compatible, + OffsetDisambiguation::Prefer, + // match-exactly + false, + provider, + )?; + + ZonedDateTime::try_new_with_cached_offset( + epoch_ns.ns.0, + self.time_zone, + self.calendar.clone(), + epoch_ns.offset, + ) + } + } + + /// Creates an IXDTF (RFC 9557) date/time string for the provided `ZonedDateTime` according + /// to the provided display options. + pub fn to_ixdtf_string_with_provider( + &self, + display_offset: DisplayOffset, + display_timezone: DisplayTimeZone, + display_calendar: DisplayCalendar, + options: ToStringRoundingOptions, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + let resolved_options = options.resolve()?; + let result = + self.instant + .round_instant(ResolvedRoundingOptions::from_to_string_options( + &resolved_options, + ))?; + let rounded_instant = Instant::try_new(result)?; + + let offset = self.time_zone.get_offset_nanos_for(result, provider)?; + let datetime = self + .time_zone + .get_iso_datetime_for(&rounded_instant, provider)?; + let (sign, hour, minute) = nanoseconds_to_formattable_offset_minutes(offset)?; + let timezone_id = self.time_zone().identifier_with_provider(provider)?; + + let ixdtf_string = IxdtfStringBuilder::default() + .with_date(datetime.date) + .with_time(datetime.time, resolved_options.precision) + .with_minute_offset(sign, hour, minute, display_offset) + .with_timezone(&timezone_id, display_timezone) + .with_calendar(self.calendar.identifier(), display_calendar) + .build(); + + Ok(ixdtf_string) + } + + // TODO: Should IANA Identifier be prechecked or allow potentially invalid IANA Identifer values here? + pub fn from_utf8_with_provider( + source: &[u8], + disambiguation: Disambiguation, + offset_option: OffsetDisambiguation, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + let parsed = ParsedZonedDateTime::from_utf8_with_provider(source, provider)?; + + Self::from_parsed_with_provider(parsed, disambiguation, offset_option, provider) + } + + pub fn from_parsed_with_provider( + parsed: ParsedZonedDateTime, + disambiguation: Disambiguation, + offset_option: OffsetDisambiguation, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + let date = IsoDate::new_with_overflow( + parsed.date.record.year, + parsed.date.record.month, + parsed.date.record.day, + Overflow::Reject, + )?; + + let epoch_nanos = interpret_isodatetime_offset( + date, + parsed.time, + parsed.has_utc_designator, + parsed.offset.map(|o| o.nanoseconds()), + &parsed.timezone, + disambiguation, + offset_option, + parsed.match_minutes, + provider, + )?; + Ok(Self::new_unchecked( + Instant::from(epoch_nanos.ns), + parsed.timezone, + Calendar::new(parsed.date.calendar), + epoch_nanos.offset, + )) + } +} + +/// InterpretISODateTimeOffset +/// +/// offsetBehavior is: +/// - OPTION if offset_nanos is Some +/// - WALL if offset_nanos is None and !is_exact +/// - EXACT if offset_nanos is None and is_exact +/// +/// When offset_nanos is None, offsetNanoseconds is 0 +#[allow(clippy::too_many_arguments)] +pub(crate) fn interpret_isodatetime_offset( + date: IsoDate, + time: Option, + is_exact: bool, + offset_nanos: Option, + timezone: &TimeZone, + disambiguation: Disambiguation, + offset_option: OffsetDisambiguation, + match_minutes: bool, + provider: &impl TimeZoneProvider, +) -> TemporalResult { + // 1. If time is start-of-day, then + let Some(time) = time else { + // a. Assert: offsetBehaviour is wall. + // b. Assert: offsetNanoseconds is 0. + temporal_assert!(offset_nanos.is_none()); + // c. Return ? GetStartOfDay(timeZone, isoDate). + return timezone.get_start_of_day(&date, provider); + }; + + // 2. Let isoDateTime be CombineISODateAndTimeRecord(isoDate, time). + let iso_datetime = IsoDateTime::new_unchecked(date, time); + match (is_exact, offset_nanos, offset_option) { + // 3. If offsetBehaviour is wall, or offsetBehaviour is option and offsetOption is ignore, then + (false, None, _) | (_, Some(_), OffsetDisambiguation::Ignore) => { + // a. Return ? GetEpochNanosecondsFor(timeZone, isoDateTime, disambiguation). + timezone.get_epoch_nanoseconds_for(iso_datetime, disambiguation, provider) + } + // 4. If offsetBehaviour is exact, or offsetBehaviour is option and offsetOption is use, then + (true, None, _) | (_, Some(_), OffsetDisambiguation::Use) => { + let offset = offset_nanos.unwrap_or(0); + // a. Let balanced be BalanceISODateTime(isoDate.[[Year]], isoDate.[[Month]], + // isoDate.[[Day]], time.[[Hour]], time.[[Minute]], time.[[Second]], time.[[Millisecond]], + // time.[[Microsecond]], time.[[Nanosecond]] - offsetNanoseconds). + let iso = IsoDateTime::balance( + date.year, + date.month.into(), + date.day.into(), + time.hour.into(), + time.minute.into(), + time.second.into(), + time.millisecond.into(), + time.microsecond.into(), + (i64::from(time.nanosecond) - offset).into(), + ); + + // b. Perform ? CheckISODaysRange(balanced.[[ISODate]]). + iso.date.is_valid_day_range()?; + + // c. Let epochNanoseconds be GetUTCEpochNanoseconds(balanced). + let ns = iso.as_nanoseconds(); + // d. If IsValidEpochNanoseconds(epochNanoseconds) is false, throw a RangeError exception. + ns.check_validity()?; + + // e. Return epochNanoseconds. + Ok(EpochNanosecondsAndOffset { + ns, + offset: timezone.get_utc_offset_for(ns.0, provider)?.into(), + }) + } + // 5. Assert: offsetBehaviour is option. + // 6. Assert: offsetOption is prefer or reject. + (_, Some(offset), OffsetDisambiguation::Prefer | OffsetDisambiguation::Reject) => { + // 7. Perform ? CheckISODaysRange(isoDate). + date.is_valid_day_range()?; + let iso = IsoDateTime::new_unchecked(date, time); + // 8. Let utcEpochNanoseconds be GetUTCEpochNanoseconds(isoDateTime). + let utc_epochs = iso.as_nanoseconds(); + // 9. Let possibleEpochNs be ? GetPossibleEpochNanoseconds(timeZone, isoDateTime). + let possible_nanos = timezone.get_possible_epoch_ns_for(iso, provider)?; + + // 10. For each element candidate of possibleEpochNs, do + for candidate in possible_nanos.as_slice() { + // a. Let candidateOffset be utcEpochNanoseconds - candidate. + let candidate_offset = utc_epochs.0 - candidate.ns.0; + // b. If candidateOffset = offsetNanoseconds, then + if candidate_offset == offset.into() { + // i. Return candidate. + return Ok(*candidate); + } + // c. If matchBehaviour is match-minutes, then + if match_minutes { + // i. Let roundedCandidateNanoseconds be RoundNumberToIncrement(candidateOffset, 60 × 10**9, half-expand). + let rounded_candidate = + IncrementRounder::from_signed_num(candidate_offset, NS_PER_MINUTE_NONZERO)? + .round(RoundingMode::HalfExpand); + // ii. If roundedCandidateNanoseconds = offsetNanoseconds, then + if rounded_candidate == offset.into() { + // 1. Return candidate. + return Ok(*candidate); + } + } + } + + // 11. If offsetOption is reject, throw a RangeError exception. + if offset_option == OffsetDisambiguation::Reject { + return Err( + TemporalError::range().with_enum(ErrorMessage::OffsetNeedsDisambiguation) + ); + } + // 12. Return ? DisambiguatePossibleEpochNanoseconds(possibleEpochNs, timeZone, isoDateTime, disambiguation). + timezone.disambiguate_possible_epoch_nanos( + possible_nanos, + iso, + disambiguation, + provider, + ) + } + } +} + +// Formatting utils +const NS_PER_MINUTE: i128 = 60_000_000_000; +// Once MSRV is 1.83 we can update this to just calling .unwrap() +const NS_PER_MINUTE_NONZERO: NonZeroU128 = if let Some(nz) = NonZeroU128::new(NS_PER_MINUTE as u128) +{ + nz +} else { + NonZeroU128::MIN +}; + +pub(crate) fn nanoseconds_to_formattable_offset_minutes( + nanoseconds: i128, +) -> TemporalResult<(Sign, u8, u8)> { + // Per 11.1.7 this should be rounding + let nanoseconds = IncrementRounder::from_signed_num(nanoseconds, NS_PER_MINUTE_NONZERO)? + .round(RoundingMode::HalfExpand); + let offset_minutes = (nanoseconds / NS_PER_MINUTE) as i32; + let sign = if offset_minutes < 0 { + Sign::Negative + } else { + Sign::Positive + }; + let hour = offset_minutes.abs() / 60; + let minute = offset_minutes.abs() % 60; + Ok((sign, hour as u8, minute as u8)) +} diff --git a/deps/temporal/src/builtins/core/zoned_date_time/tests.rs b/deps/temporal/src/builtins/core/zoned_date_time/tests.rs new file mode 100644 index 00000000000000..dcb8a3768168a5 --- /dev/null +++ b/deps/temporal/src/builtins/core/zoned_date_time/tests.rs @@ -0,0 +1,1145 @@ +use super::ZonedDateTime; +use crate::{ + builtins::{calendar::CalendarFields, zoned_date_time::ZonedDateTimeFields}, + options::{ + DifferenceSettings, Disambiguation, DisplayCalendar, DisplayOffset, DisplayTimeZone, + OffsetDisambiguation, Overflow, RoundingIncrement, RoundingMode, RoundingOptions, Unit, + }, + partial::{PartialTime, PartialZonedDateTime}, + provider::{TimeZoneProvider, TransitionDirection}, + unix_time::EpochNanoseconds, + Calendar, Duration, MonthCode, TemporalResult, TimeZone, UtcOffset, +}; +use alloc::string::ToString; +use timezone_provider::zoneinfo64::ZONEINFO64_RES_FOR_TESTING; +use tinystr::tinystr; + +macro_rules! test_all_providers { + ($(#[cfg_for_fs($cfg_fs:meta)])? $(#[cfg_for_zi64($cfg_zi:meta)])? $provider:ident: $b:block) => {{ + #[cfg(feature = "compiled_data")] + { + std::println!("Testing compiled_data:"); + let $provider = &*crate::builtins::TZ_PROVIDER; + + $b + } + + $(#[cfg($cfg_zi)])? { + std::println!("Testing ZoneInfo64Provider:"); + let zi_data = + zoneinfo64::ZoneInfo64::try_from_u32s(&ZONEINFO64_RES_FOR_TESTING).unwrap(); + let zi_provider = timezone_provider::zoneinfo64::ZoneInfo64TzdbProvider::new(zi_data); + let $provider = &zi_provider; + + $b + } + + $(#[cfg($cfg_fs)])? #[cfg(feature = "tzdb")] { + std::println!("Testing FS (note: May fail with bad local tzdb data):"); + let fs = timezone_provider::tzif::FsTzdbProvider::default(); + let $provider = &fs; + + $b + } + }}; +} + +#[test] +fn basic_zdt_test() { + test_all_providers!(provider: { + let nov_30_2023_utc = 1_701_308_952_000_000_000i128; + + let zdt = ZonedDateTime::try_new_with_provider( + nov_30_2023_utc, + TimeZone::try_from_str_with_provider("UTC", provider).unwrap(), + Calendar::ISO, + provider, + ) + .unwrap(); + + assert_eq!(zdt.year(), 2023); + assert_eq!(zdt.month(), 11); + assert_eq!(zdt.day(), 30); + assert_eq!(zdt.hour(), 1); + assert_eq!(zdt.minute(), 49); + assert_eq!(zdt.second(), 12); + + let zdt_minus_five = ZonedDateTime::try_new_with_provider( + nov_30_2023_utc, + TimeZone::try_from_str_with_provider("America/New_York", provider).unwrap(), + Calendar::ISO, + provider, + ) + .unwrap(); + + assert_eq!(zdt_minus_five.year(), 2023); + assert_eq!(zdt_minus_five.month(), 11); + assert_eq!(zdt_minus_five.day(), 29); + assert_eq!(zdt_minus_five.hour(), 20); + assert_eq!(zdt_minus_five.minute(), 49); + assert_eq!(zdt_minus_five.second(), 12); + + let zdt_plus_eleven = ZonedDateTime::try_new_with_provider( + nov_30_2023_utc, + TimeZone::try_from_str_with_provider("Australia/Sydney", provider).unwrap(), + Calendar::ISO, + provider, + ) + .unwrap(); + + assert_eq!(zdt_plus_eleven.year(), 2023); + assert_eq!(zdt_plus_eleven.month(), 11); + assert_eq!(zdt_plus_eleven.day(), 30); + assert_eq!(zdt_plus_eleven.hour(), 12); + assert_eq!(zdt_plus_eleven.minute(), 49); + assert_eq!(zdt_plus_eleven.second(), 12); + }) +} + +#[test] +// https://tc39.es/proposal-temporal/docs/zoneddatetime.html#round +fn round_with_provider_test() { + test_all_providers!(provider: { + let dt = b"1995-12-07T03:24:30.000003500-08:00[America/Los_Angeles]"; + let zdt = ZonedDateTime::from_utf8_with_provider( + dt, + Disambiguation::default(), + OffsetDisambiguation::Use, + provider, + ) + .unwrap(); + + let result = zdt + .round_with_provider( + RoundingOptions { + smallest_unit: Some(Unit::Hour), + ..Default::default() + }, + provider, + ) + .unwrap(); + assert_eq!( + result.to_string_with_provider(provider).unwrap(), + "1995-12-07T03:00:00-08:00[America/Los_Angeles]" + ); + + let result = zdt + .round_with_provider( + RoundingOptions { + smallest_unit: Some(Unit::Minute), + increment: Some((RoundingIncrement::try_new(30)).unwrap()), + ..Default::default() + }, + provider, + ) + .unwrap(); + assert_eq!( + result.to_string_with_provider(provider).unwrap(), + "1995-12-07T03:30:00-08:00[America/Los_Angeles]" + ); + + let result = zdt + .round_with_provider( + RoundingOptions { + smallest_unit: Some(Unit::Minute), + increment: Some((RoundingIncrement::try_new(30)).unwrap()), + rounding_mode: Some(RoundingMode::Floor), + ..Default::default() + }, + provider, + ) + .unwrap(); + assert_eq!( + result.to_string_with_provider(provider).unwrap(), + "1995-12-07T03:00:00-08:00[America/Los_Angeles]" + ); + }) +} + +#[test] +fn zdt_from_partial() { + test_all_providers!(provider: { + let fields = ZonedDateTimeFields { + calendar_fields: CalendarFields::new() + .with_year(1970) + .with_month_code(MonthCode(tinystr!(4, "M01"))) + .with_day(1), + time: Default::default(), + offset: None, + }; + let partial = PartialZonedDateTime { + fields, + timezone: Some(TimeZone::utc_with_provider(provider)), + calendar: Calendar::ISO, + }; + + let result = ZonedDateTime::from_partial_with_provider(partial, None, None, None, provider); + assert!(result.is_ok()); + + // This ensures that the start-of-day branch isn't hit by default time + let fields = ZonedDateTimeFields { + calendar_fields: CalendarFields::new() + .with_year(1970) + .with_month_code(MonthCode(tinystr!(4, "M01"))) + .with_day(1), + time: PartialTime::default(), + offset: Some(UtcOffset::from_minutes(30)), + }; + let partial = PartialZonedDateTime { + fields, + timezone: Some(TimeZone::utc_with_provider(provider)), + calendar: Calendar::ISO, + }; + + let result = ZonedDateTime::from_partial_with_provider( + partial, + None, + None, + Some(OffsetDisambiguation::Use), + provider, + ); + assert!(result.is_ok()); + }) +} + +#[test] +fn zdt_from_str() { + test_all_providers!(provider: { + let zdt_str = b"1970-01-01T00:00[UTC][u-ca=iso8601]"; + let result = ZonedDateTime::from_utf8_with_provider( + zdt_str, + Disambiguation::Compatible, + OffsetDisambiguation::Reject, + provider, + ); + assert!(result.is_ok()); + }) +} + +#[test] +fn zdt_hours_in_day() { + test_all_providers!(provider: { + let result = + parse_zdt_with_reject("2025-07-04T12:00[UTC][u-ca=iso8601]", provider).unwrap(); + + assert_eq!(result.hours_in_day_with_provider(provider).unwrap(), 24.) + }) +} + +#[test] +// https://github.com/tc39/test262/blob/d9b10790bc4bb5b3e1aa895f11cbd2d31a5ec743/test/intl402/Temporal/ZonedDateTime/from/dst-skipped-cross-midnight.js +fn dst_skipped_cross_midnight() { + test_all_providers!(provider: { + let start_of_day = + parse_zdt_with_compatible("1919-03-31[America/Toronto]", provider).unwrap(); + let midnight_disambiguated = + parse_zdt_with_compatible("1919-03-31T00[America/Toronto]", provider).unwrap(); + + assert_eq!( + start_of_day.epoch_nanoseconds(), + &EpochNanoseconds(-1601753400000000000) + ); + assert_eq!( + midnight_disambiguated.epoch_nanoseconds(), + &EpochNanoseconds(-1601751600000000000) + ); + let diff = start_of_day + .instant + .until( + &midnight_disambiguated.instant, + DifferenceSettings { + largest_unit: Some(Unit::Hour), + smallest_unit: Some(Unit::Nanosecond), + ..Default::default() + }, + ) + .unwrap(); + assert_eq!(diff.years(), 0); + assert_eq!(diff.months(), 0); + assert_eq!(diff.weeks(), 0); + assert_eq!(diff.days(), 0); + assert_eq!(diff.hours(), 0); + assert_eq!(diff.minutes(), 30); + assert_eq!(diff.seconds(), 0); + assert_eq!(diff.milliseconds(), 0); + assert_eq!(diff.microseconds(), 0); + assert_eq!(diff.nanoseconds(), 0); + }); +} + +#[test] +fn zdt_offset_match_minutes() { + // Cases taken from intl402/Temporal/ZonedDateTime/compare/sub-minute-offset + + test_all_providers!(provider: { + // Rounded mm accepted + let _ = parse_zdt_with_reject("1970-01-01T00:00-00:45[Africa/Monrovia]", provider).unwrap(); + // unrounded mm::ss accepted + let _ = parse_zdt_with_reject("1970-01-01T00:00:00-00:44:30[Africa/Monrovia]", provider) + .unwrap(); + assert!( + parse_zdt_with_compatible("1970-01-01T00:00:00-00:44:40[Africa/Monrovia]", provider) + .is_err(), + "Incorrect unrounded mm::ss rejected" + ); + assert!( + parse_zdt_with_compatible("1970-01-01T00:00:00-00:45:00[Africa/Monrovia]", provider) + .is_err(), + "Rounded mm::ss rejected" + ); + assert!( + parse_zdt_with_compatible("1970-01-01T00:00+00:44:30.123456789[+00:45]", provider) + .is_err(), + "Rounding not accepted between ISO offset and timezone" + ); + + assert!( + ZonedDateTime::from_partial_with_provider( + PartialZonedDateTime { + fields: ZonedDateTimeFields { + calendar_fields: CalendarFields::new() + .with_year(1970) + .with_month_code(MonthCode(tinystr!(4, "M01"))) + .with_day(1), + time: PartialTime::default(), + offset: Some(UtcOffset::from_minutes(30)), + }, + timezone: Some(TimeZone::try_from_identifier_str_with_provider("Africa/Monrovia", provider).unwrap()), + ..PartialZonedDateTime::default() + }, + None, + None, + None, + provider + ) + .is_err(), + "Rounding not accepted between ISO offset and timezone" + ); + }) +} + +// overflow-reject-throws.js +#[test] +fn overflow_reject_throws() { + test_all_providers!(provider: { + let zdt = ZonedDateTime::try_new_with_provider( + 217178610123456789, + TimeZone::utc_with_provider(provider), + Calendar::default(), + provider, + ) + .unwrap(); + + let overflow = Overflow::Reject; + + let result_1 = zdt.with_with_provider( + ZonedDateTimeFields { + calendar_fields: CalendarFields::new().with_month(29), + time: Default::default(), + offset: None, + }, + None, + None, + Some(overflow), + provider, + ); + + let result_2 = zdt.with_with_provider( + ZonedDateTimeFields { + calendar_fields: CalendarFields::new().with_day(31), + time: Default::default(), + offset: None, + }, + None, + None, + Some(overflow), + provider, + ); + + let result_3 = zdt.with_with_provider( + ZonedDateTimeFields { + calendar_fields: CalendarFields::new(), + time: PartialTime { + hour: Some(29), + ..Default::default() + }, + offset: None, + }, + None, + None, + Some(overflow), + provider, + ); + + let result_4 = zdt.with_with_provider( + ZonedDateTimeFields { + calendar_fields: CalendarFields::default(), + time: PartialTime { + nanosecond: Some(9000), + ..Default::default() + }, + offset: None, + }, + None, + None, + Some(overflow), + provider, + ); + + assert!(result_1.is_err()); + assert!(result_2.is_err()); + assert!(result_3.is_err()); + assert!(result_4.is_err()); + }) +} + +#[test] +fn static_tzdb_zdt_test() { + test_all_providers!(#[cfg_for_fs(not(target_os = "windows"))] provider: { + use crate::{Calendar, TimeZone}; + use core::str::FromStr; + + let nov_30_2023_utc = 1_701_308_952_000_000_000i128; + + let zdt = ZonedDateTime::try_new_with_provider( + nov_30_2023_utc, + TimeZone::try_from_str_with_provider("UTC", provider).unwrap(), + Calendar::from_str("iso8601").unwrap(), + provider, + ) + .unwrap(); + + assert_eq!(zdt.year(), 2023); + assert_eq!(zdt.month(), 11); + assert_eq!(zdt.day(), 30); + assert_eq!(zdt.hour(), 1); + assert_eq!(zdt.minute(), 49); + assert_eq!(zdt.second(), 12); + + let zdt_minus_five = ZonedDateTime::try_new_with_provider( + nov_30_2023_utc, + TimeZone::try_from_str_with_provider("America/New_York", provider).unwrap(), + Calendar::from_str("iso8601").unwrap(), + provider, + ) + .unwrap(); + + assert_eq!(zdt_minus_five.year(), 2023); + assert_eq!(zdt_minus_five.month(), 11); + assert_eq!(zdt_minus_five.day(), 29); + assert_eq!(zdt_minus_five.hour(), 20); + assert_eq!(zdt_minus_five.minute(), 49); + assert_eq!(zdt_minus_five.second(), 12); + + let zdt_plus_eleven = ZonedDateTime::try_new_with_provider( + nov_30_2023_utc, + TimeZone::try_from_str_with_provider("Australia/Sydney", provider).unwrap(), + Calendar::from_str("iso8601").unwrap(), + provider, + ) + .unwrap(); + + assert_eq!(zdt_plus_eleven.year(), 2023); + assert_eq!(zdt_plus_eleven.month(), 11); + assert_eq!(zdt_plus_eleven.day(), 30); + assert_eq!(zdt_plus_eleven.hour(), 12); + assert_eq!(zdt_plus_eleven.minute(), 49); + assert_eq!(zdt_plus_eleven.second(), 12); + }) +} + +#[test] +fn basic_zdt_add() { + use crate::{Calendar, Duration, TimeZone}; + test_all_providers!(#[cfg_for_fs(not(target_os = "windows"))] provider: { + let zdt = ZonedDateTime::try_new_with_provider( + -560174321098766, + TimeZone::utc_with_provider(provider), + Calendar::default(), + provider, + ) + .unwrap(); + let d = Duration::new( + 0.into(), + 0.into(), + 0.into(), + 0.into(), + 240.into(), + 0.into(), + 0.into(), + 0.into(), + 0.into(), + 800.into(), + ) + .unwrap(); + // "1970-01-04T12:23:45.678902034+00:00[UTC]" + let expected = ZonedDateTime::try_new_with_provider( + 303825678902034, + TimeZone::utc_with_provider(provider), + Calendar::default(), + provider, + ) + .unwrap(); + + let result = zdt.add_with_provider(&d, None, provider).unwrap(); + assert!(result.equals_with_provider(&expected, provider).unwrap()); + }) +} + +fn parse_zdt_with_reject( + s: &str, + provider: &impl TimeZoneProvider, +) -> TemporalResult { + ZonedDateTime::from_utf8_with_provider( + s.as_bytes(), + Disambiguation::Reject, + OffsetDisambiguation::Reject, + provider, + ) +} + +fn parse_zdt_with_compatible( + s: &str, + provider: &impl TimeZoneProvider, +) -> TemporalResult { + ZonedDateTime::from_utf8_with_provider( + s.as_bytes(), + Disambiguation::Compatible, + OffsetDisambiguation::Reject, + provider, + ) +} + +#[test] +fn test_pacific_niue() { + test_all_providers!(provider: { + // test/intl402/Temporal/ZonedDateTime/compare/sub-minute-offset.js + // Pacific/Niue on October 15, 1952, where + // the offset shifted by 20 seconds to a whole-minute boundary. + // + // The precise transition is from + // 1952-10-15T23:59:59-11:19:40[-11:19:40] to 1952-10-15T23:59:40-11:19:00[-11:19:00] + let ms_pre = -543_069_621_000; + let zdt = + parse_zdt_with_reject("1952-10-15T23:59:59-11:19:40[Pacific/Niue]", provider).unwrap(); + assert_eq!( + zdt.epoch_milliseconds(), + ms_pre, + "-11:19:40 is accepted as -11:19:40 in Pacific/Niue edge case" + ); + + let zdt = + parse_zdt_with_reject("1952-10-15T23:59:59-11:20[Pacific/Niue]", provider).unwrap(); + assert_eq!( + zdt.epoch_milliseconds(), + ms_pre, + "-11:20 matches the first candidate -11:19:40 in the Pacific/Niue edge case" + ); + + let ms_post = -543_069_601_000; + + let zdt = + parse_zdt_with_reject("1952-10-15T23:59:59-11:20:00[Pacific/Niue]", provider).unwrap(); + assert_eq!( + zdt.epoch_milliseconds(), + ms_post, + "-11:19:40 is accepted as -11:19:40 in Pacific/Niue edge case" + ); + + // Additional tests ensuring that boundary cases are handled + + let zdt = + parse_zdt_with_reject("1952-10-15T23:59:40-11:20:00[Pacific/Niue]", provider).unwrap(); + assert_eq!( + zdt.epoch_milliseconds(), + ms_post - 19_000, + "Post-transition Niue time allows up to `1952-10-15T23:59:40`" + ); + let zdt = parse_zdt_with_reject("1952-10-15T23:59:39-11:20:00[Pacific/Niue]", provider); + assert!( + zdt.is_err(), + "Post-transition Niue time does not allow times before `1952-10-15T23:59:40`" + ); + + let zdt = + parse_zdt_with_reject("1952-10-15T23:59:40-11:19:40[Pacific/Niue]", provider).unwrap(); + assert_eq!( + zdt.epoch_milliseconds(), + ms_pre - 19_000, + "Pre-transition Niue time also allows `1952-10-15T23:59:40`" + ); + + let zdt = + parse_zdt_with_reject("1952-10-15T23:59:39-11:19:40[Pacific/Niue]", provider).unwrap(); + assert_eq!( + zdt.epoch_milliseconds(), + ms_pre - 20_000, + "Pre-transition Niue time also allows `1952-10-15T23:59:39`" + ); + + // Tests without explicit offset + let zdt = parse_zdt_with_reject("1952-10-15T23:59:39[Pacific/Niue]", provider).unwrap(); + assert_eq!( + zdt.epoch_milliseconds(), + ms_pre - 20_000, + "Unambiguous before 1952-10-15T23:59:39" + ); + + let zdt = parse_zdt_with_reject("1952-10-16T00:00:00[Pacific/Niue]", provider).unwrap(); + assert_eq!( + zdt.epoch_milliseconds(), + ms_post + 1_000, + "Unambiguous after 1952-10-16T00:00:00" + ); + + let zdt = parse_zdt_with_reject("1952-10-15T23:59:40[Pacific/Niue]", provider); + assert!(zdt.is_err(), "Ambiguity starts at 1952-10-15T23:59:40"); + let zdt = parse_zdt_with_reject("1952-10-15T23:59:59[Pacific/Niue]", provider); + assert!(zdt.is_err(), "Ambiguity ends at 1952-10-15T23:59:59"); + }) +} + +fn total_seconds_for_one_day(s: &str, provider: &impl TimeZoneProvider) -> TemporalResult { + Ok(Duration::new(0, 0, 0, 1, 0, 0, 0, 0, 0, 0) + .unwrap() + .total_with_provider( + Unit::Second, + Some(parse_zdt_with_reject(s, provider).unwrap().into()), + provider, + )? + .as_inner()) +} + +#[test] +fn test_pacific_niue_duration() { + test_all_providers!(provider: { + // Also tests add_to_instant codepaths + // From intl402/Temporal/Duration/prototype/total/relativeto-sub-minute-offset + let total = + total_seconds_for_one_day("1952-10-15T23:59:59-11:19:40[Pacific/Niue]", provider) + .unwrap(); + assert_eq!( + total, 86420., + "-11:19:40 is accepted as -11:19:40 in Pacific/Niue edge case" + ); + + let total = + total_seconds_for_one_day("1952-10-15T23:59:59-11:20[Pacific/Niue]", provider).unwrap(); + assert_eq!( + total, 86420., + "-11:20 matches the first candidate -11:19:40 in the Pacific/Niue edge case" + ); + + let total = + total_seconds_for_one_day("1952-10-15T23:59:59-11:20:00[Pacific/Niue]", provider) + .unwrap(); + assert_eq!( + total, 86400., + "-11:20:00 is accepted as -11:20:00 in the Pacific/Niue edge case" + ); + }) +} + +#[track_caller] +fn assert_tr( + zdt: &ZonedDateTime, + direction: TransitionDirection, + s: &str, + provider: &impl TimeZoneProvider, +) { + assert_eq!( + zdt.get_time_zone_transition_with_provider(direction, provider) + .unwrap() + .unwrap() + .to_string_with_provider(provider) + .unwrap(), + s + ); +} + +// Modern dates + +// Transitions +const DST_2025_03_09: &str = "2025-03-09T03:00:00-07:00[America/Los_Angeles]"; +const DST_2026_03_08: &str = "2026-03-08T03:00:00-07:00[America/Los_Angeles]"; +const STD_2025_11_02: &str = "2025-11-02T01:00:00-08:00[America/Los_Angeles]"; +const STD_2024_11_03: &str = "2024-11-03T01:00:00-08:00[America/Los_Angeles]"; + +// Non transitions +const IN_DST_2025_07_31: &str = "2025-07-31T00:00:00-07:00[America/Los_Angeles]"; +const AFTER_DST_2025_12_31: &str = "2025-12-31T00:00:00-08:00[America/Los_Angeles]"; +const BEFORE_DST_2025_01_31: &str = "2025-01-31T00:00:00-08:00[America/Los_Angeles]"; + +// Transition dates ± 1 +const DST_2025_03_09_PLUS_ONE: &str = "2025-03-09T03:00:00.000000001-07:00[America/Los_Angeles]"; +const DST_2025_03_09_MINUS_ONE: &str = "2025-03-09T01:59:59.999999999-08:00[America/Los_Angeles]"; +const STD_2025_11_02_PLUS_ONE: &str = "2025-11-02T01:00:00.000000001-08:00[America/Los_Angeles]"; +const STD_2025_11_02_MINUS_ONE: &str = "2025-11-02T01:59:59.999999999-07:00[America/Los_Angeles]"; + +// Dates from the tzif data block +// Transitions +const DST_1999_04_04: &str = "1999-04-04T03:00:00-07:00[America/Los_Angeles]"; +const DST_2000_04_02: &str = "2000-04-02T03:00:00-07:00[America/Los_Angeles]"; +const STD_1999_10_31: &str = "1999-10-31T01:00:00-08:00[America/Los_Angeles]"; +const STD_1998_01_31: &str = "1998-10-25T01:00:00-08:00[America/Los_Angeles]"; + +// Non transitions +const IN_DST_1999_07_31: &str = "1999-07-31T00:00:00-07:00[America/Los_Angeles]"; +const AFTER_DST_1999_12_31: &str = "1999-12-31T00:00:00-08:00[America/Los_Angeles]"; +const BEFORE_DST_1999_01_31: &str = "1999-01-31T00:00:00-08:00[America/Los_Angeles]"; + +const LONDON_TRANSITION_1968_02_18: &str = "1968-02-18T03:00:00+01:00[Europe/London]"; +const LONDON_TRANSITION_1968_02_18_MINUS_ONE: &str = + "1968-02-18T01:59:59.999999999+00:00[Europe/London]"; + +const SAMOA_IDL_CHANGE: &str = "2011-12-31T00:00:00+14:00[Pacific/Apia]"; +const SAMOA_IDL_CHANGE_MINUS_ONE: &str = "2011-12-29T23:59:59.999999999-10:00[Pacific/Apia]"; + +// This date is a fifth Sunday +const LONDON_POSIX_TRANSITION_2019_03_31_MINUS_ONE: &str = + "2019-03-31T00:59:59.999999999+00:00[Europe/London]"; +const LONDON_POSIX_TRANSITION_2019_03_31: &str = "2019-03-31T02:00:00+01:00[Europe/London]"; + +// This date is a fourth (but last) Sunday +const LONDON_POSIX_TRANSITION_2017_03_26_MINUS_ONE: &str = + "2017-03-26T00:59:59.999999999+00:00[Europe/London]"; +const LONDON_POSIX_TRANSITION_2017_03_26: &str = "2017-03-26T02:00:00+01:00[Europe/London]"; + +const TROLL_FIRST_TRANSITION: &str = "2005-03-27T03:00:00+02:00[Antarctica/Troll]"; + +/// Vancouver transitions on the first Sunday in November, which may or may not be +/// before the first Friday in November +const VANCOUVER_FIRST_FRIDAY_IN_NOVEMBER_BEFORE_SUNDAY: &str = + "2019-11-01T00:00:00-07:00[America/Vancouver]"; +const VANCOUVER_FIRST_FRIDAY_IN_NOVEMBER_AFTER_SUNDAY: &str = + "2019-11-06T00:00:00-08:00[America/Vancouver]"; + +/// Chile tzdb has a transition on the "first saturday in april", except the transition occurs +/// at 24:00:00, which is, of course, the day after. This is not the same thing as the first Sunday in April +const SANTIAGO_DST_2024: &str = "2024-09-08T01:00:00-03:00[America/Santiago]"; +const SANTIAGO_STD_2025_APRIL: &str = "2025-04-05T23:00:00-04:00[America/Santiago]"; +const SANTIAGO_STD_2025_APRIL_PLUS_ONE: &str = + "2025-04-05T23:00:00.000000001-04:00[America/Santiago]"; +const SANTIAGO_STD_2025_APRIL_MINUS_ONE: &str = + "2025-04-05T23:59:59.999999999-03:00[America/Santiago]"; +const SANTIAGO_DST_2025_SEPT: &str = "2025-09-07T01:00:00-03:00[America/Santiago]"; +const SANTIAGO_DST_2025_SEPT_PLUS_ONE: &str = + "2025-09-07T01:00:00.000000001-03:00[America/Santiago]"; +const SANTIAGO_DST_2025_SEPT_MINUS_ONE: &str = + "2025-09-06T23:59:59.999999999-04:00[America/Santiago]"; +const SANTIAGO_STD_2026: &str = "2026-04-04T23:00:00-04:00[America/Santiago]"; + +// MUST only contain full strings +// The second boolean is whether these are unambiguous when the offset is removed +// As a rule of thumb, anything around an STD->DST transition +// will be unambiguous, but DST->STD will not +const TO_STRING_TESTCASES: &[(&str, bool)] = &[ + (DST_2025_03_09, true), + (DST_2026_03_08, true), + (STD_2025_11_02, false), + (STD_2024_11_03, false), + (IN_DST_2025_07_31, true), + (AFTER_DST_2025_12_31, true), + (BEFORE_DST_2025_01_31, true), + (DST_2025_03_09_PLUS_ONE, true), + (DST_2025_03_09_MINUS_ONE, true), + (STD_2025_11_02_PLUS_ONE, false), + (STD_2025_11_02_MINUS_ONE, false), + (DST_1999_04_04, true), + (DST_2000_04_02, true), + (STD_1999_10_31, false), + (STD_1998_01_31, false), + (IN_DST_1999_07_31, true), + (AFTER_DST_1999_12_31, true), + (BEFORE_DST_1999_01_31, true), + (LONDON_TRANSITION_1968_02_18, true), + (LONDON_TRANSITION_1968_02_18_MINUS_ONE, true), + (SAMOA_IDL_CHANGE, true), + (SAMOA_IDL_CHANGE_MINUS_ONE, true), + (LONDON_POSIX_TRANSITION_2019_03_31_MINUS_ONE, true), + (LONDON_POSIX_TRANSITION_2019_03_31, true), + (LONDON_POSIX_TRANSITION_2017_03_26_MINUS_ONE, true), + (LONDON_POSIX_TRANSITION_2017_03_26_MINUS_ONE, true), + (TROLL_FIRST_TRANSITION, true), + (VANCOUVER_FIRST_FRIDAY_IN_NOVEMBER_BEFORE_SUNDAY, true), + (VANCOUVER_FIRST_FRIDAY_IN_NOVEMBER_AFTER_SUNDAY, true), + (SANTIAGO_DST_2024, true), + (SANTIAGO_STD_2025_APRIL, false), + (SANTIAGO_STD_2025_APRIL_PLUS_ONE, false), + (SANTIAGO_STD_2025_APRIL_MINUS_ONE, false), + (SANTIAGO_DST_2025_SEPT, true), + (SANTIAGO_DST_2025_SEPT_PLUS_ONE, true), + (SANTIAGO_DST_2025_SEPT_MINUS_ONE, true), + (SANTIAGO_STD_2026, false), +]; + +#[test] +fn get_time_zone_transition() { + // This stops it from wrapping + use TransitionDirection::*; + + test_all_providers!(provider: { + // Modern dates that utilize the posix string + + // During DST + let zdt = parse_zdt_with_reject(IN_DST_2025_07_31, provider).unwrap(); + assert_tr(&zdt, Previous, DST_2025_03_09, provider); + assert_tr(&zdt, Next, STD_2025_11_02, provider); + + // After DST + let zdt = parse_zdt_with_reject(AFTER_DST_2025_12_31, provider).unwrap(); + assert_tr(&zdt, Previous, STD_2025_11_02, provider); + assert_tr(&zdt, Next, DST_2026_03_08, provider); + + // Before DST + let zdt = parse_zdt_with_reject(BEFORE_DST_2025_01_31, provider).unwrap(); + assert_tr(&zdt, Previous, STD_2024_11_03, provider); + assert_tr(&zdt, Next, DST_2025_03_09, provider); + + // Boundary test + // Modern date (On start of DST) + let zdt = parse_zdt_with_reject(DST_2025_03_09, provider).unwrap(); + assert_tr(&zdt, Previous, STD_2024_11_03, provider); + assert_tr(&zdt, Next, STD_2025_11_02, provider); + // Modern date (one ns after DST) + let zdt = parse_zdt_with_reject(DST_2025_03_09_PLUS_ONE, provider).unwrap(); + assert_tr(&zdt, Previous, DST_2025_03_09, provider); + assert_tr(&zdt, Next, STD_2025_11_02, provider); + // Modern date (one ns before DST) + let zdt = parse_zdt_with_reject(DST_2025_03_09_MINUS_ONE, provider).unwrap(); + assert_tr(&zdt, Previous, STD_2024_11_03, provider); + assert_tr(&zdt, Next, DST_2025_03_09, provider); + + // Modern date (On start of STD) + let zdt = parse_zdt_with_reject(STD_2025_11_02, provider).unwrap(); + assert_tr(&zdt, Previous, DST_2025_03_09, provider); + assert_tr(&zdt, Next, DST_2026_03_08, provider); + // Modern date (one ns after STD) + let zdt = parse_zdt_with_reject(STD_2025_11_02_PLUS_ONE, provider).unwrap(); + assert_tr(&zdt, Previous, STD_2025_11_02, provider); + assert_tr(&zdt, Next, DST_2026_03_08, provider); + // Modern date (one ns before STD) + let zdt = parse_zdt_with_reject(STD_2025_11_02_MINUS_ONE, provider).unwrap(); + assert_tr(&zdt, Previous, DST_2025_03_09, provider); + assert_tr(&zdt, Next, STD_2025_11_02, provider); + + // Old dates using the Tzif data + + // During DST + let zdt = parse_zdt_with_reject(IN_DST_1999_07_31, provider).unwrap(); + assert_tr(&zdt, Previous, DST_1999_04_04, provider); + assert_tr(&zdt, Next, STD_1999_10_31, provider); + + // After DST + let zdt = parse_zdt_with_reject(AFTER_DST_1999_12_31, provider).unwrap(); + assert_tr(&zdt, Previous, STD_1999_10_31, provider); + assert_tr(&zdt, Next, DST_2000_04_02, provider); + + // Before DST + let zdt = parse_zdt_with_reject(BEFORE_DST_1999_01_31, provider).unwrap(); + assert_tr(&zdt, Previous, STD_1998_01_31, provider); + assert_tr(&zdt, Next, DST_1999_04_04, provider); + + // Santiago tests, testing that transitions with the offset = 24:00:00 + // still work + let zdt = parse_zdt_with_reject(SANTIAGO_DST_2025_SEPT_MINUS_ONE, provider).unwrap(); + assert_tr(&zdt, Previous, SANTIAGO_STD_2025_APRIL, provider); + assert_tr(&zdt, Next, SANTIAGO_DST_2025_SEPT, provider); + let zdt = parse_zdt_with_reject(SANTIAGO_DST_2025_SEPT, provider).unwrap(); + assert_tr(&zdt, Previous, SANTIAGO_STD_2025_APRIL, provider); + assert_tr(&zdt, Next, SANTIAGO_STD_2026, provider); + let zdt = parse_zdt_with_reject(SANTIAGO_DST_2025_SEPT_PLUS_ONE, provider).unwrap(); + assert_tr(&zdt, Previous, SANTIAGO_DST_2025_SEPT, provider); + assert_tr(&zdt, Next, SANTIAGO_STD_2026, provider); + + let zdt = parse_zdt_with_reject(SANTIAGO_STD_2025_APRIL_MINUS_ONE, provider).unwrap(); + assert_tr(&zdt, Previous, SANTIAGO_DST_2024, provider); + assert_tr(&zdt, Next, SANTIAGO_STD_2025_APRIL, provider); + let zdt = parse_zdt_with_reject(SANTIAGO_STD_2025_APRIL, provider).unwrap(); + assert_tr(&zdt, Previous, SANTIAGO_DST_2024, provider); + assert_tr(&zdt, Next, SANTIAGO_DST_2025_SEPT, provider); + let zdt = parse_zdt_with_reject(SANTIAGO_STD_2025_APRIL_PLUS_ONE, provider).unwrap(); + assert_tr(&zdt, Previous, SANTIAGO_STD_2025_APRIL, provider); + assert_tr(&zdt, Next, SANTIAGO_DST_2025_SEPT, provider); + + // Test case from intl402/Temporal/ZonedDateTime/prototype/getTimeZoneTransition/rule-change-without-offset-transition + // This ensures we skip "fake" transition entries that do not actually change the offset + + let zdt = + parse_zdt_with_reject("1970-01-01T01:00:00+01:00[Europe/London]", provider).unwrap(); + assert_tr(&zdt, Previous, LONDON_TRANSITION_1968_02_18, provider); + let zdt = + parse_zdt_with_reject("1968-10-01T00:00:00+01:00[Europe/London]", provider).unwrap(); + assert_tr( + &zdt, + Next, + "1971-10-31T02:00:00+00:00[Europe/London]", + provider, + ); + let zdt = parse_zdt_with_reject("1967-05-01T00:00:00-10:00[America/Anchorage]", provider) + .unwrap(); + assert_tr( + &zdt, + Previous, + "1945-09-30T01:00:00-10:00[America/Anchorage]", + provider, + ); + let zdt = parse_zdt_with_reject("1967-01-01T00:00:00-10:00[America/Anchorage]", provider) + .unwrap(); + assert_tr( + &zdt, + Next, + "1969-04-27T03:00:00-09:00[America/Anchorage]", + provider, + ); + // These dates are one second after a "fake" transition at the end of the tzif data + // Ensure that they find a real transition, not the fake one + let zdt = parse_zdt_with_reject("2020-11-01T00:00:01-07:00[America/Whitehorse]", provider) + .unwrap(); + assert_tr( + &zdt, + Previous, + "2020-03-08T03:00:00-07:00[America/Whitehorse]", + provider, + ); + + let zdt = + parse_zdt_with_reject("1996-05-13T00:00:01+03:00[Europe/Kyiv]", provider).unwrap(); + assert_tr( + &zdt, + Previous, + "1996-03-31T03:00:00+03:00[Europe/Kyiv]", + provider, + ); + + // This ensures that nanosecond-to-second casting works correctly + let zdt = parse_zdt_with_reject(LONDON_TRANSITION_1968_02_18_MINUS_ONE, provider).unwrap(); + assert_tr(&zdt, Next, LONDON_TRANSITION_1968_02_18, provider); + assert_tr( + &zdt, + Previous, + "1967-10-29T02:00:00+00:00[Europe/London]", + provider, + ); + }) +} + +#[test] +fn test_to_string_roundtrip() { + test_all_providers!(provider: { + for (test, is_unambiguous) in TO_STRING_TESTCASES { + let zdt = parse_zdt_with_reject(test, provider).expect(test); + let string = zdt.to_string_with_provider(provider).unwrap(); + + assert_eq!( + *test, &*string, + "ZonedDateTime {test} round trips on ToString" + ); + let without_offset = zdt + .to_ixdtf_string_with_provider( + DisplayOffset::Never, + DisplayTimeZone::Auto, + DisplayCalendar::Never, + Default::default(), + provider + ) + .unwrap(); + assert_eq!( + without_offset[0..19], + test[0..19], + "Stringified object should have same date part" + ); + + // These testcases should all also parse unambiguously when the offset is removed. + if *is_unambiguous { + let zdt = parse_zdt_with_reject(&without_offset, provider).expect(test); + let string = zdt.to_string_with_provider(provider).unwrap(); + assert_eq!( + *test, &*string, + "ZonedDateTime {without_offset} round trips to {test} on ToString" + ); + } + } + }); +} + +#[test] +fn test_apia() { + test_all_providers!(provider: { + // This transition skips an entire day + // From: 2011-12-29T23:59:59.999999999-10:00[Pacific/Apia] + // To: 2011-12-31T00:00:00+14:00[Pacific/Apia] + let zdt = parse_zdt_with_reject(SAMOA_IDL_CHANGE, provider).unwrap(); + let _ = zdt + .add_with_provider(&Duration::new(0, 0, 0, 1, 1, 0, 0, 0, 0, 0).unwrap(), None, provider) + .unwrap(); + + assert_eq!(zdt.hours_in_day_with_provider(provider).unwrap(), 24.); + + let samoa_before = parse_zdt_with_reject(SAMOA_IDL_CHANGE_MINUS_ONE, provider).unwrap(); + assert_eq!(samoa_before.hours_in_day_with_provider(provider).unwrap(), 24.); + }) +} + +#[test] +fn test_london() { + test_all_providers!(provider: { + // Europe/London has an MWD transition where the transitions are on the + // last sundays of March and October. + + // Test that they correctly compute from nanoseconds + let zdt = ZonedDateTime::try_new_with_provider( + 1_553_993_999_999_999_999, + TimeZone::try_from_str_with_provider("Europe/London", provider).unwrap(), + Calendar::ISO, + provider, + ) + .unwrap(); + assert_eq!( + zdt.to_string_with_provider(provider).unwrap(), + LONDON_POSIX_TRANSITION_2019_03_31_MINUS_ONE, + ); + let zdt = ZonedDateTime::try_new_with_provider( + 1_553_994_000_000_000_000, + TimeZone::try_from_str_with_provider("Europe/London", provider).unwrap(), + Calendar::ISO, + provider, + ) + .unwrap(); + assert_eq!(zdt.to_string_with_provider(provider).unwrap(), LONDON_POSIX_TRANSITION_2019_03_31,); + + // Test that they correctly compute from ZDT strings without explicit offset + let zdt = parse_zdt_with_reject("2019-03-31T00:59:59.999999999[Europe/London]", provider) + .unwrap(); + assert_eq!( + zdt.to_string_with_provider(provider).unwrap(), + LONDON_POSIX_TRANSITION_2019_03_31_MINUS_ONE + ); + + let zdt = + parse_zdt_with_reject("2019-03-31T02:00:00+01:00[Europe/London]", provider).unwrap(); + assert_eq!(zdt.to_string_with_provider(provider).unwrap(), LONDON_POSIX_TRANSITION_2019_03_31); + + let zdt = parse_zdt_with_reject("2017-03-26T00:59:59.999999999[Europe/London]", provider) + .unwrap(); + assert_eq!( + zdt.to_string_with_provider(provider).unwrap(), + LONDON_POSIX_TRANSITION_2017_03_26_MINUS_ONE + ); + + let zdt = + parse_zdt_with_reject("2017-03-26T02:00:00+01:00[Europe/London]", provider).unwrap(); + assert_eq!(zdt.to_string_with_provider(provider).unwrap(), LONDON_POSIX_TRANSITION_2017_03_26); + }) +} + +#[test] +fn test_berlin() { + test_all_providers!(provider: { + // Need to ensure that when the transition is the last day of the month it still works + let zdt = parse_zdt_with_reject("2021-03-28T01:00:00Z[Europe/Berlin]", provider).unwrap(); + let prev = zdt + .get_time_zone_transition_with_provider(TransitionDirection::Previous, provider) + .unwrap() + .unwrap(); + + assert_eq!(prev.to_string_with_provider(provider).unwrap(), "2020-10-25T02:00:00+01:00[Europe/Berlin]"); + }) +} + +#[test] +fn test_troll() { + test_all_providers!(provider: { + // Antarctica/Troll started DST in 2005, but had no other transitions before that + let zdt = ZonedDateTime::try_new_with_provider( + 0, + TimeZone::try_from_str_with_provider("Antarctica/Troll", provider).unwrap(), + Calendar::ISO, + provider, + ) + .unwrap(); + + let next = zdt + .get_time_zone_transition_with_provider(TransitionDirection::Next, provider) + .unwrap() + .unwrap(); + assert_eq!(next.to_string_with_provider(provider).unwrap(), TROLL_FIRST_TRANSITION); + }) +} + +#[test] +fn test_zdt_until_rounding() { + test_all_providers!(provider: { + // Regression test for beyondDaySpan rounding behavior + let start = parse_zdt_with_reject("2020-01-01T00:00-08:00[-08:00]", provider).unwrap(); + let end = parse_zdt_with_reject("2020-01-03T23:59-08:00[-08:00]", provider).unwrap(); + let difference = start + .until_with_provider( + &end, + DifferenceSettings { + largest_unit: Some(Unit::Day), + smallest_unit: Some(Unit::Hour), + rounding_mode: Some(RoundingMode::HalfExpand), + ..Default::default() + }, + provider + ) + .unwrap(); + assert_eq!(difference.to_string(), "P3D"); + }) +} + +#[test] +fn test_toronto_half_hour() { + test_all_providers!(provider: { + let zdt = + parse_zdt_with_reject("1919-03-30T12:00:00-05:00[America/Toronto]", provider).unwrap(); + assert_eq!(zdt.hours_in_day_with_provider(provider).unwrap(), 23.5); + }) +} + +#[test] +fn test_round_to_start_of_day() { + test_all_providers!(provider: { + // Round up to DST + let zdt = + parse_zdt_with_reject("1919-03-30T11:45-05:00[America/Toronto]", provider).unwrap(); + let rounded = zdt + .round_with_provider(RoundingOptions { + smallest_unit: Some(Unit::Day), + ..Default::default() + }, provider) + .unwrap(); + let known_rounded = + parse_zdt_with_reject("1919-03-31T00:30:00-04:00[America/Toronto]", provider).unwrap(); + + assert!( + rounded.equals_with_provider(&known_rounded, provider).unwrap(), + "Expected {}, found {}", + known_rounded.to_string_with_provider(provider).unwrap(), + rounded.to_string_with_provider(provider).unwrap() + ); + assert_eq!(rounded.get_iso_datetime(), known_rounded.get_iso_datetime()); + + // Round down (ensure the offset picked is the correct one) + // See https://github.com/boa-dev/temporal/pull/520 + let zdt = + parse_zdt_with_reject("1919-03-30T01:45-05:00[America/Toronto]", provider).unwrap(); + let rounded = zdt + .round_with_provider(RoundingOptions { + smallest_unit: Some(Unit::Day), + ..Default::default() + }, provider) + .unwrap(); + let known_rounded = + parse_zdt_with_reject("1919-03-30T00:00:00-05:00[America/Toronto]", provider).unwrap(); + + assert!( + rounded.equals_with_provider(&known_rounded, provider).unwrap(), + "Expected {}, found {}", + known_rounded.to_string_with_provider(provider).unwrap(), + rounded.to_string_with_provider(provider).unwrap() + ); + assert_eq!(rounded.get_iso_datetime(), known_rounded.get_iso_datetime()); + }) +} diff --git a/deps/temporal/src/builtins/mod.rs b/deps/temporal/src/builtins/mod.rs new file mode 100644 index 00000000000000..97434baf2ddd1f --- /dev/null +++ b/deps/temporal/src/builtins/mod.rs @@ -0,0 +1,21 @@ +//! The builtins module contains the main implementation of the Temporal builtins + +#[cfg(feature = "compiled_data")] +pub mod compiled; +pub mod core; + +pub use core::*; + +#[cfg(feature = "compiled_data")] +use std::sync::LazyLock; +#[cfg(feature = "compiled_data")] +use timezone_provider::tzif::CompiledTzdbProvider; +#[cfg(all(test, feature = "compiled_data"))] +use timezone_provider::tzif::FsTzdbProvider; + +#[cfg(feature = "compiled_data")] +pub static TZ_PROVIDER: LazyLock = + LazyLock::new(CompiledTzdbProvider::default); + +#[cfg(all(test, feature = "compiled_data"))] +pub(crate) static FS_TZ_PROVIDER: LazyLock = LazyLock::new(FsTzdbProvider::default); diff --git a/deps/temporal/src/error.rs b/deps/temporal/src/error.rs new file mode 100644 index 00000000000000..e497f368cca262 --- /dev/null +++ b/deps/temporal/src/error.rs @@ -0,0 +1,386 @@ +//! This module implements `TemporalError`. + +use core::fmt; +use ixdtf::ParseError; +use timezone_provider::TimeZoneProviderError; + +use icu_calendar::DateError; + +/// `TemporalError`'s error type. +#[derive(Debug, Default, Clone, Copy, PartialEq)] +pub enum ErrorKind { + /// Error. + #[default] + Generic, + /// TypeError + Type, + /// RangeError + Range, + /// SyntaxError + Syntax, + /// Assert + Assert, +} + +impl fmt::Display for ErrorKind { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Generic => "Error", + Self::Type => "TypeError", + Self::Range => "RangeError", + Self::Syntax => "SyntaxError", + Self::Assert => "ImplementationError", + } + .fmt(f) + } +} + +/// The error type for `boa_temporal`. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct TemporalError { + kind: ErrorKind, + msg: ErrorMessage, +} + +impl TemporalError { + #[inline] + #[must_use] + const fn new(kind: ErrorKind) -> Self { + Self { + kind, + msg: ErrorMessage::None, + } + } + + /// Create a generic error + #[inline] + #[must_use] + pub fn general(msg: &'static str) -> Self { + Self::new(ErrorKind::Generic).with_message(msg) + } + + /// Create a range error. + #[inline] + #[must_use] + pub const fn range() -> Self { + Self::new(ErrorKind::Range) + } + + /// Create a type error. + #[inline] + #[must_use] + pub const fn r#type() -> Self { + Self::new(ErrorKind::Type) + } + + /// Create a syntax error. + #[inline] + #[must_use] + pub const fn syntax() -> Self { + Self::new(ErrorKind::Syntax) + } + + /// Creates an assertion error + #[inline] + #[must_use] + #[cfg_attr(debug_assertions, track_caller)] + pub(crate) const fn assert() -> Self { + #[cfg(not(debug_assertions))] + { + Self::new(ErrorKind::Assert) + } + #[cfg(debug_assertions)] + Self { + kind: ErrorKind::Assert, + msg: ErrorMessage::String(core::panic::Location::caller().file()), + } + } + + /// Create an abrupt end error. + #[inline] + #[must_use] + pub fn abrupt_end() -> Self { + Self::syntax().with_message("Abrupt end to parsing target.") + } + + /// Add a message to the error. + #[inline] + #[must_use] + pub fn with_message(mut self, msg: &'static str) -> Self { + self.msg = ErrorMessage::String(msg); + self + } + + /// Add a message enum to the error. + #[inline] + #[must_use] + pub(crate) fn with_enum(mut self, msg: ErrorMessage) -> Self { + self.msg = msg; + self + } + + /// Returns this error's kind. + #[inline] + #[must_use] + pub const fn kind(&self) -> ErrorKind { + self.kind + } + + /// Extracts the error message. + #[inline] + #[must_use] + pub fn into_message(self) -> &'static str { + self.msg.to_string() + } +} + +impl fmt::Display for TemporalError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.kind)?; + + let msg = self.msg.to_string(); + if !msg.is_empty() { + write!(f, ": {msg}")?; + } + + Ok(()) + } +} + +impl From for TemporalError { + fn from(error: DateError) -> Self { + TemporalError::range().with_enum(ErrorMessage::Icu4xDate(error)) + } +} + +impl From for TemporalError { + fn from(error: ParseError) -> Self { + TemporalError::range().with_enum(ErrorMessage::Ixdtf(error)) + } +} + +/// The error message +#[derive(Clone, Copy, PartialEq, Debug)] +pub(crate) enum ErrorMessage { + // Range + InstantOutOfRange, + IntermediateDateTimeOutOfRange, + ZDTOutOfDayBounds, + LargestUnitCannotBeDateUnit, + DateOutOfRange, + + // Numerical errors + NumberNotFinite, + NumberNotIntegral, + NumberNotPositive, + NumberOutOfRange, + FractionalDigitsPrecisionInvalid, + + // Options validity + SmallestUnitIsRequired, + SmallestUnitNotTimeUnit, + SmallestUnitLargerThanLargestUnit, + UnitNotDate, + UnitNotTime, + UnitRequired, + UnitNoAutoDuringComparison, + RoundToUnitInvalid, + RoundingModeInvalid, + CalendarNameInvalid, + OffsetOptionInvalid, + TimeZoneNameInvalid, + + // Field mismatches + CalendarMismatch, + TzMismatch, + + // Parsing + ParserNeedsDate, + FractionalTimeMoreThanNineDigits, + + // Other + OffsetNeedsDisambiguation, + + // Typed + None, + String(&'static str), + Ixdtf(ParseError), + Icu4xDate(DateError), +} + +impl ErrorMessage { + pub fn to_string(self) -> &'static str { + match self { + Self::InstantOutOfRange => "Instant nanoseconds are not within a valid epoch range.", + Self::IntermediateDateTimeOutOfRange => { + "Intermediate ISO datetime was not within a valid range." + } + Self::ZDTOutOfDayBounds => "ZonedDateTime is outside the expected day bounds", + Self::LargestUnitCannotBeDateUnit => "Largest unit cannot be a date unit", + Self::DateOutOfRange => "Date is not within ISO date time limits.", + Self::NumberNotFinite => "number value is not a finite value.", + Self::NumberNotIntegral => "value must be integral.", + Self::NumberNotPositive => "integer must be positive.", + Self::NumberOutOfRange => "number exceeded a valid range.", + Self::FractionalDigitsPrecisionInvalid => "Invalid fractionalDigits precision value", + Self::SmallestUnitIsRequired => "smallestUnit is required", + Self::SmallestUnitNotTimeUnit => "smallestUnit must be a valid time unit.", + Self::SmallestUnitLargerThanLargestUnit => { + "smallestUnit was larger than largestunit in DifferenceeSettings" + } + Self::UnitNotDate => "Unit was not part of the date unit group.", + Self::UnitNotTime => "Unit was not part of the time unit group.", + Self::UnitRequired => "Unit is required", + Self::UnitNoAutoDuringComparison => "'auto' units are not allowed during comparison", + Self::RoundToUnitInvalid => "Invalid roundTo unit provided.", + Self::RoundingModeInvalid => "Invalid roundingMode option provided", + Self::CalendarNameInvalid => "Invalid calendarName option provided", + Self::OffsetOptionInvalid => "Invalid offsetOption option provided", + Self::TimeZoneNameInvalid => "Invalid timeZoneName option provided", + Self::CalendarMismatch => { + "Calendar must be the same for operations involving two calendared types." + } + Self::TzMismatch => "Timezones must be the same if unit is a day unit.", + + Self::ParserNeedsDate => "Could not find a valid DateRecord node during parsing.", + Self::FractionalTimeMoreThanNineDigits => "Fractional time exceeds nine digits.", + Self::OffsetNeedsDisambiguation => { + "Offsets could not be determined without disambiguation" + } + Self::None => "", + Self::String(s) => s, + Self::Ixdtf(s) => ixdtf_error_to_static_string(s), + Self::Icu4xDate(DateError::Range { field, .. }) => match field { + "year" => "Year out of range.", + "month" => "Month out of range.", + "day" => "Day out of range.", + _ => "Field out of range.", + }, + Self::Icu4xDate(DateError::UnknownEra) => "Unknown era.", + Self::Icu4xDate(DateError::UnknownMonthCode(..)) => "Unknown month code.", + Self::Icu4xDate(_) => "Date error.", + } + } +} + +impl From for TemporalError { + fn from(other: TimeZoneProviderError) -> Self { + match other { + TimeZoneProviderError::InstantOutOfRange => { + Self::range().with_enum(ErrorMessage::InstantOutOfRange) + } + TimeZoneProviderError::Assert(s) => Self::assert().with_message(s), + TimeZoneProviderError::Range(s) => Self::range().with_message(s), + _ => Self::assert().with_message("Unknown TimeZoneProviderError"), + } + } +} + +// ICU4X will get this API natively eventually +// https://github.com/unicode-org/icu4x/issues/6904 +pub fn ixdtf_error_to_static_string(error: ParseError) -> &'static str { + match error { + ParseError::ImplAssert => "Implementation error: this error must not throw.", + + ParseError::NonAsciiCodePoint => "Code point was not ASCII", + + ParseError::ParseFloat => "Invalid float while parsing fraction part.", + + ParseError::AbruptEnd { .. } => "Parsing ended abruptly.", + + ParseError::InvalidEnd => "Unexpected character found after parsing was completed.", + // Date related errors + ParseError::InvalidMonthRange => "Parsed month value not in a valid range.", + + ParseError::InvalidDayRange => "Parsed day value not in a valid range.", + + ParseError::DateYear => "Invalid chracter while parsing year value.", + + ParseError::DateExtendedYear => "Invalid character while parsing extended year value.", + + ParseError::DateMonth => "Invalid character while parsing month value.", + + ParseError::DateDay => "Invalid character while parsing day value.", + + ParseError::DateUnexpectedEnd => "Unexpected end while parsing a date value.", + + ParseError::TimeRequired => "Time is required.", + + ParseError::TimeHour => "Invalid character while parsing hour value.", + + ParseError::TimeMinuteSecond => { + "Invalid character while parsing minute/second value in (0, 59] range." + } + + ParseError::TimeSecond => "Invalid character while parsing second value in (0, 60] range.", + + ParseError::FractionPart => "Invalid character while parsing fraction part value.", + + ParseError::DateSeparator => "Invalid character while parsing date separator.", + + ParseError::TimeSeparator => "Invalid character while parsing time separator.", + + ParseError::DecimalSeparator => "Invalid character while parsing decimal separator.", + // Annotation Related Errors + ParseError::InvalidAnnotation => "Invalid annotation.", + + ParseError::AnnotationOpen => "Invalid annotation open character.", + + ParseError::AnnotationClose => "Invalid annotation close character.", + + ParseError::AnnotationChar => "Invalid annotation character.", + + ParseError::AnnotationKeyValueSeparator => { + "Invalid annotation key-value separator character." + } + + ParseError::AnnotationKeyLeadingChar => "Invalid annotation key leading character.", + + ParseError::AnnotationKeyChar => "Invalid annotation key character.", + + ParseError::AnnotationValueCharPostHyphen => { + "Expected annotation value character must exist after hyphen." + } + + ParseError::AnnotationValueChar => "Invalid annotation value character.", + + ParseError::InvalidMinutePrecisionOffset => "Offset must be minute precision", + + ParseError::CriticalDuplicateCalendar => { + "Duplicate calendars cannot be provided when one is critical." + } + + ParseError::UnrecognizedCritical => "Unrecognized annoation is marked as critical.", + + ParseError::TzLeadingChar => "Invalid time zone leading character.", + + ParseError::IanaCharPostSeparator => "Expected time zone character after '/'.", + + ParseError::IanaChar => "Invalid IANA time zone character after '/'.", + + ParseError::UtcTimeSeparator => "Invalid time zone character after '/'.", + + ParseError::OffsetNeedsSign => "UTC offset needs a sign", + + ParseError::MonthDayHyphen => "MonthDay must begin with a month or '--'", + + ParseError::DurationDisgnator => "Invalid duration designator.", + + ParseError::DurationValueExceededRange => { + "Provided Duration field value exceeds supported range." + } + + ParseError::DateDurationPartOrder => "Invalid date duration part order.", + + ParseError::TimeDurationPartOrder => "Invalid time duration part order.", + + ParseError::TimeDurationDesignator => "Invalid time duration designator.", + + ParseError::AmbiguousTimeMonthDay => "Time is ambiguous with MonthDay", + + ParseError::AmbiguousTimeYearMonth => "Time is ambiguous with YearMonth", + + ParseError::InvalidMonthDay => "MonthDay was not valid.", + _ => "General IXDTF parsing error", + } +} diff --git a/deps/temporal/src/host.rs b/deps/temporal/src/host.rs new file mode 100644 index 00000000000000..df090c570d5660 --- /dev/null +++ b/deps/temporal/src/host.rs @@ -0,0 +1,62 @@ +//! Trait definitions for accessing values from the host environment. +//! +//! NOTE: This is a power user API. + +use timezone_provider::{epoch_nanoseconds::EpochNanoseconds, provider::TimeZoneProvider}; + +use crate::{TemporalResult, TimeZone, UtcOffset}; + +/// The `HostClock` trait defines an accessor to the host's clock. +pub trait HostClock { + fn get_host_epoch_nanoseconds(&self) -> TemporalResult; +} + +/// The `HostTimeZone` trait defines the host's time zone. +pub trait HostTimeZone { + fn get_host_time_zone(&self, provider: &impl TimeZoneProvider) -> TemporalResult; +} + +/// `HostHooks` marks whether a trait implements the required host hooks with some +/// system methods. +pub trait HostHooks: HostClock + HostTimeZone { + fn get_system_epoch_nanoseconds(&self) -> TemporalResult { + self.get_host_epoch_nanoseconds() + } + + fn get_system_time_zone(&self, provider: &impl TimeZoneProvider) -> TemporalResult { + self.get_host_time_zone(provider) + } +} + +/// The empty host is a default implementation of a system host. +/// +/// This implementation will always return zero epoch nanoseconds and +/// a +00:00 time zone. +/// +/// ``` +/// # #[cfg(feature = "compiled_data")] { +/// use temporal_rs::host::EmptyHostSystem; +/// use temporal_rs::now::Now; +/// +/// let now = Now::new(EmptyHostSystem); +/// let zoned_date_time = now.zoned_date_time_iso(None).unwrap(); +/// +/// assert_eq!(zoned_date_time.to_string(), "1970-01-01T00:00:00+00:00[+00:00]"); +/// +/// # } +/// ``` +pub struct EmptyHostSystem; + +impl HostClock for EmptyHostSystem { + fn get_host_epoch_nanoseconds(&self) -> TemporalResult { + Ok(EpochNanoseconds::from_seconds(0)) + } +} + +impl HostTimeZone for EmptyHostSystem { + fn get_host_time_zone(&self, _: &impl TimeZoneProvider) -> TemporalResult { + Ok(TimeZone::from(UtcOffset::default())) + } +} + +impl HostHooks for EmptyHostSystem {} diff --git a/deps/temporal/src/iso.rs b/deps/temporal/src/iso.rs new file mode 100644 index 00000000000000..a36ca499b0248e --- /dev/null +++ b/deps/temporal/src/iso.rs @@ -0,0 +1,1097 @@ +//! This module implements the internal ISO field records. +//! +//! While these are public structs, the records are primarily +//! meant for internal Temporal calculations or calling `Calendar` +//! methods. Prefer using `PlainDateTime`, `PlainDate`, or `PlainTime` +//! +//! The three main types of records are: +//! - `IsoDateTime` +//! - `IsoDate` +//! - `IsoTime` +//! +//! ## `IsoDate` +//! +//! An `IsoDate` represents the `[[ISOYear]]`, `[[ISOMonth]]`, and `[[ISODay]]` internal slots. +//! +//! ## `IsoTime` +//! +//! An `IsoTime` represents the `[[ISOHour]]`, `[[ISOMinute]]`, `[[ISOsecond]]`, `[[ISOmillisecond]]`, +//! `[[ISOmicrosecond]]`, and `[[ISOnanosecond]]` internal slots. +//! +//! ## `IsoDateTime` +//! +//! An `IsoDateTime` has the internal slots of both an `IsoDate` and `IsoTime`. + +use core::num::NonZeroU128; +use ixdtf::records::TimeRecord; + +use crate::{ + builtins::core::{ + calendar::Calendar, + duration::{ + normalized::{InternalDurationRecord, TimeDuration}, + DateDuration, + }, + PartialTime, PlainDate, + }, + error::{ErrorMessage, TemporalError}, + options::{Overflow, ResolvedRoundingOptions, Unit}, + rounding::IncrementRounder, + unix_time::EpochNanoseconds, + utils, TemporalResult, TemporalUnwrap, NS_PER_DAY, +}; +use icu_calendar::{Date as IcuDate, Iso}; +use num_traits::{cast::FromPrimitive, Euclid}; + +/// `IsoDateTime` is the record of the `IsoDate` and `IsoTime` internal slots. +#[non_exhaustive] +#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +pub struct IsoDateTime { + /// The `IsoDate` fields. + pub date: IsoDate, + /// The `IsoTime` fields. + pub time: IsoTime, +} + +impl IsoDateTime { + /// Creates a new `IsoDateTime` without any validaiton. + pub(crate) fn new_unchecked(date: IsoDate, time: IsoTime) -> Self { + Self { date, time } + } + + /// Creates a new validated `IsoDateTime` that is within valid limits. + pub fn new(date: IsoDate, time: IsoTime) -> TemporalResult { + if !iso_dt_within_valid_limits(date, &time) { + return Err( + TemporalError::range().with_message("IsoDateTime not within a valid range.") + ); + } + Ok(Self::new_unchecked(date, time)) + } + + /// + pub fn check_within_limits(&self) -> TemporalResult<()> { + if !iso_dt_within_valid_limits(self.date, &self.time) { + return Err( + TemporalError::range().with_message("IsoDateTime not within a valid range.") + ); + } + Ok(()) + } + + // NOTE: The below assumes that nanos is from an `Instant` and thus in a valid range. -> Needs validation. + // + // TODO: Move away from offset use of f64 + /// Creates an `IsoDateTime` from a `BigInt` of epochNanoseconds. + #[allow(clippy::neg_cmp_op_on_partial_ord)] + pub(crate) fn from_epoch_nanos(epoch_nanoseconds: &EpochNanoseconds, offset: i64) -> Self { + // Skip the assert as nanos should be validated by Instant. + // TODO: Determine whether value needs to be validated as integral. + // Get the component ISO parts + + // 2. Let remainderNs be epochNanoseconds modulo 10^6. + let remainder_nanos = epoch_nanoseconds.0.rem_euclid(1_000_000); + + // 3. Let epochMilliseconds be 𝔽((epochNanoseconds - remainderNs) / 10^6). + let epoch_millis = (epoch_nanoseconds.0 - remainder_nanos).div_euclid(1_000_000) as i64; + + let (year, month, day) = utils::ymd_from_epoch_milliseconds(epoch_millis); + + // 7. Let hour be ℝ(! HourFromTime(epochMilliseconds)). + let hour = epoch_millis.div_euclid(3_600_000).rem_euclid(24); + // 8. Let minute be ℝ(! MinFromTime(epochMilliserhs)conds)). + let minute = epoch_millis.div_euclid(60_000).rem_euclid(60); + // 9. Let second be ℝ(! SecFromTime(epochMilliseconds)). + let second = epoch_millis.div_euclid(1000).rem_euclid(60); + // 10. Let millisecond be ℝ(! msFromTime(epochMilliseconds)). + let millis = epoch_millis.rem_euclid(1000); + + // 11. Let microsecond be floor(remainderNs / 1000). + let micros = remainder_nanos.div_euclid(1_000) as i64; + // 12. Assert: microsecond < 1000. + debug_assert!(micros < 1000); + // 13. Let nanosecond be remainderNs modulo 1000. + let nanos = remainder_nanos.rem_euclid(1000) as i64; + + Self::balance( + year, + i32::from(month), + i32::from(day), + hour, + minute, + second, + millis, + micros.into(), + (nanos + offset).into(), + ) + } + + #[allow(clippy::too_many_arguments)] + pub(crate) fn balance( + year: i32, + month: i32, + day: i32, + hour: i64, + minute: i64, + second: i64, + millisecond: i64, + microsecond: i128, + nanosecond: i128, + ) -> Self { + let (overflow_day, time) = + IsoTime::balance(hour, minute, second, millisecond, microsecond, nanosecond); + // TODO: Address truncation with `try_balance` + let date = IsoDate::balance(year, month, day + overflow_day as i32); + Self::new_unchecked(date, time) + } + + /// Returns whether the `IsoDateTime` is within valid limits. + pub(crate) fn is_within_limits(&self) -> bool { + iso_dt_within_valid_limits(self.date, &self.time) + } + + /// Returns this `IsoDateTime` in nanoseconds + pub fn as_nanoseconds(&self) -> EpochNanoseconds { + utc_epoch_nanos(self.date, &self.time) + } + + pub(crate) fn round(&self, resolved_options: ResolvedRoundingOptions) -> TemporalResult { + let (rounded_days, rounded_time) = self.time.round(resolved_options)?; + let balance_result = IsoDate::try_balance( + self.date.year, + self.date.month.into(), + i64::from(self.date.day) + rounded_days, + )?; + Self::new(balance_result, rounded_time) + } + + // TODO: UPDATE TO CURRENT SPECIFICATION + // TODO: Determine whether to provide an options object...seems duplicative. + /// 5.5.11 DifferenceISODateTime ( y1, mon1, d1, h1, min1, s1, ms1, mus1, ns1, y2, mon2, d2, h2, min2, s2, ms2, mus2, ns2, calendarRec, largestUnit, options ) + pub(crate) fn diff( + &self, + other: &Self, + calendar: &Calendar, + largest_unit: Unit, + ) -> TemporalResult { + // 1. Assert: ISODateTimeWithinLimits(y1, mon1, d1, h1, min1, s1, ms1, mus1, ns1) is true. + // 2. Assert: ISODateTimeWithinLimits(y2, mon2, d2, h2, min2, s2, ms2, mus2, ns2) is true. + // 3. Assert: If y1 ≠ y2, and mon1 ≠ mon2, and d1 ≠ d2, and LargerOfTwoUnits(largestUnit, "day") + // is not "day", CalendarMethodsRecordHasLookedUp(calendarRec, date-until) is true. + + // 4. Let timeDuration be DifferenceTime(h1, min1, s1, ms1, mus1, ns1, h2, min2, s2, ms2, mus2, ns2). + let mut time_duration = self.time.diff(&other.time); + + // 5. Let timeSign be TimeDurationSign(timeDuration). + let time_sign = time_duration.sign() as i8; + + // 6. Let dateSign be CompareISODate(y2, mon2, d2, y1, mon1, d1). + let date_sign = other.date.cmp(&self.date) as i32; + // 7. Let adjustedDate be CreateISODateRecord(y2, mon2, d2). + let mut adjusted_date = other.date; + + // 8. If timeSign = -dateSign, then + if i32::from(time_sign) == -date_sign { + // a. Set adjustedDate to BalanceISODate(adjustedDate.[[Year]], adjustedDate.[[Month]], adjustedDate.[[Day]] + timeSign). + adjusted_date = IsoDate::balance( + adjusted_date.year, + i32::from(adjusted_date.month), + i32::from(adjusted_date.day) + i32::from(time_sign), + ); + // b. Set timeDuration to ? Add24HourDaysToTimeDuration(timeDuration, -timeSign). + time_duration = time_duration.add_days(-i64::from(time_sign))?; + } + + // 9. Let date1 be ! CreateTemporalDate(y1, mon1, d1, calendarRec.[[Receiver]]). + let date_one = PlainDate::new_unchecked(self.date, calendar.clone()); + // 10. Let date2 be ! CreateTemporalDate(adjustedDate.[[Year]], adjustedDate.[[Month]], + // adjustedDate.[[Day]], calendarRec.[[Receiver]]). + let date_two = PlainDate::try_new( + adjusted_date.year, + adjusted_date.month, + adjusted_date.day, + calendar.clone(), + )?; + + // 11. Let dateLargestUnit be LargerOfTwoUnits("day", largestUnit). + // 12. Let untilOptions be ! SnapshotOwnProperties(options, null). + let date_largest_unit = largest_unit.max(Unit::Day); + + // 13. Perform ! CreateDataPropertyOrThrow(untilOptions, "largestUnit", dateLargestUnit). + // 14. Let dateDifference be ? DifferenceDate(calendarRec, date1, date2, untilOptions). + let date_diff = date_one.internal_diff_date(&date_two, date_largest_unit)?; + + // 16. If largestUnit is not dateLargestUnit, then + let days = if largest_unit == date_largest_unit { + // 15. Let days be dateDifference.[[Days]]. + date_diff.days() + } else { + // a. Set timeDuration to ? Add24HourDaysToTimeDuration(timeDuration, dateDifference.[[Days]]). + time_duration = time_duration.add_days(date_diff.days())?; + // b. Set days to 0. + 0 + }; + + // 17. Return ? CreateNormalizedDurationRecord(dateDifference.[[Years]], dateDifference.[[Months]], dateDifference.[[Weeks]], days, timeDuration). + InternalDurationRecord::new( + DateDuration::new_unchecked( + date_diff.years(), + date_diff.months(), + date_diff.weeks(), + days, + ), + time_duration, + ) + } +} + +// ==== `IsoDate` section ==== + +/// `IsoDate` serves as a record for the `[[ISOYear]]`, `[[ISOMonth]]`, +/// and `[[ISODay]]` internal fields. +/// +/// These fields are used for the `Temporal.PlainDate` object, the +/// `Temporal.YearMonth` object, and the `Temporal.MonthDay` object. +#[non_exhaustive] +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord)] +pub struct IsoDate { + /// An ISO year within a range -271821..=275760 + pub year: i32, + /// An ISO month within a valid range 1..=12 + pub month: u8, + /// An ISO day within a valid range of 1..=31 + pub day: u8, +} + +impl IsoDate { + /// Creates a new `IsoDate` without determining the validity. + pub(crate) const fn new_unchecked(year: i32, month: u8, day: u8) -> Self { + Self { year, month, day } + } + + pub(crate) fn regulate( + year: i32, + month: u8, + day: u8, + overflow: Overflow, + ) -> TemporalResult { + match overflow { + Overflow::Constrain => { + let month = month.clamp(1, 12); + let day = constrain_iso_day(year, month, day); + // NOTE: Values are clamped in a u8 range. + Ok(Self::new_unchecked(year, month, day)) + } + Overflow::Reject => { + if !is_valid_date(year, month, day) { + return Err(TemporalError::range().with_message("not a valid ISO date.")); + } + // NOTE: Values have been verified to be in a u8 range. + Ok(Self::new_unchecked(year, month, day)) + } + } + } + + /// + pub fn check_within_limits(self) -> TemporalResult<()> { + if !iso_dt_within_valid_limits(self, &IsoTime::noon()) { + return Err(TemporalError::range().with_message("IsoDate not within a valid range.")); + } + Ok(()) + } + + // + pub fn check_validity(&self) -> TemporalResult<()> { + if !self.is_valid() { + return Err( + TemporalError::range().with_message("IsoDateTime does not have valid fields.") + ); + } + Ok(()) + } + + pub(crate) fn new_with_overflow( + year: i32, + month: u8, + day: u8, + overflow: Overflow, + ) -> TemporalResult { + let date = Self::regulate(year, month, day, overflow)?; + if !iso_dt_within_valid_limits(date, &IsoTime::noon()) { + return Err(TemporalError::range().with_enum(ErrorMessage::DateOutOfRange)); + } + Ok(date) + } + + /// Create a balance date while rejecting invalid intermediates + pub(crate) fn try_balance(year: i32, month: i32, day: i64) -> TemporalResult { + let epoch_days = iso_date_to_epoch_days(year, month, 1) + day - 1; + if (MAX_EPOCH_DAYS) < epoch_days.abs() { + return Err(TemporalError::range().with_message("epoch days exceed maximum range.")); + } + // NOTE The cast is to i32 is safe due to MAX_EPOCH_DAYS check + let ms = utils::epoch_days_to_epoch_ms(epoch_days, 0); + let (year, month, day) = utils::ymd_from_epoch_milliseconds(ms); + Ok(Self::new_unchecked(year, month, day)) + } + + /// Create a balanced `IsoDate` + /// + /// Equivalent to `BalanceISODate`. + pub(crate) fn balance(year: i32, month: i32, day: i32) -> Self { + let epoch_days = iso_date_to_epoch_days(year, month, day); + let ms = utils::epoch_days_to_epoch_ms(epoch_days, 0); + let (year, month, day) = utils::ymd_from_epoch_milliseconds(ms); + Self::new_unchecked(year, month, day) + } + + pub(crate) fn is_valid_day_range(&self) -> TemporalResult<()> { + if self.to_epoch_days().abs() > 100_000_000 { + return Err(TemporalError::range().with_message("Not in a valid ISO day range.")); + } + Ok(()) + } + + /// Returns this `IsoDate` in nanoseconds. + #[inline] + pub(crate) fn as_nanoseconds(&self) -> EpochNanoseconds { + utc_epoch_nanos(*self, &IsoTime::default()) + } + + /// Functionally the same as Date's abstract operation `MakeDay` + /// + /// Equivalent to `IsoDateToEpochDays` + #[inline] + pub(crate) fn to_epoch_days(self) -> i64 { + utils::epoch_days_from_gregorian_date(self.year, self.month, self.day) + } + + /// Returns if the current `IsoDate` is valid. + pub(crate) fn is_valid(self) -> bool { + is_valid_date(self.year, self.month, self.day) + } + + /// Returns the resulting `IsoDate` from adding a provided `Duration` to this `IsoDate` + pub(crate) fn add_date_duration( + self, + duration: &DateDuration, + overflow: Overflow, + ) -> TemporalResult { + // 1. Assert: year, month, day, years, months, weeks, and days are integers. + // 2. Assert: overflow is either "constrain" or "reject". + // 3. Let intermediate be ! BalanceISOYearMonth(year + years, month + months). + let intermediate = balance_iso_year_month_with_clamp( + i64::from(self.year) + duration.years, + i64::from(self.month) + duration.months, + ); + + // 4. Let intermediate be ? RegulateISODate(intermediate.[[Year]], intermediate.[[Month]], day, overflow). + let intermediate = + Self::new_with_overflow(intermediate.0, intermediate.1, self.day, overflow)?; + + // 5. Set days to days + 7 × weeks. + let additional_days = duration.days + (7 * duration.weeks); + + // 6. Let d be intermediate.[[Day]] + days. + let intermediate_days = i64::from(intermediate.day) + additional_days; + + // 7. Return BalanceISODate(intermediate.[[Year]], intermediate.[[Month]], d). + Self::try_balance( + intermediate.year, + intermediate.month.into(), + intermediate_days, + ) + } + + pub(crate) fn diff_iso_date( + &self, + other: &Self, + largest_unit: Unit, + ) -> TemporalResult { + // 1. Assert: IsValidISODate(y1, m1, d1) is true. + // 2. Assert: IsValidISODate(y2, m2, d2) is true. + // 3. Let sign be -CompareISODate(y1, m1, d1, y2, m2, d2). + let sign = -(self.cmp(other) as i8); + // 4. If sign = 0, return ! CreateDateDurationRecord(0, 0, 0, 0). + if sign == 0 { + return Ok(DateDuration::default()); + }; + + // 5. Let years be 0. + let mut years = 0; + let mut months = 0; + // 6. If largestUnit is "year", then + if largest_unit == Unit::Year || largest_unit == Unit::Month { + // others.year - self.year is adopted from temporal-proposal/polyfill as it saves iterations. + // a. Let candidateYears be sign. + let mut candidate_years: i32 = other.year - self.year; + if candidate_years != 0 { + candidate_years -= i32::from(sign); + } + // b. Repeat, while ISODateSurpasses(sign, y1 + candidateYears, m1, d1, y2, m2, d2) is false, + while !iso_date_surpasses( + &IsoDate::new_unchecked(self.year + candidate_years, self.month, self.day), + other, + sign, + ) { + // i. Set years to candidateYears. + years = candidate_years; + // ii. Set candidateYears to candidateYears + sign. + candidate_years += i32::from(sign); + } + + // 7. Let months be 0. + // 8. If largestUnit is "year" or largestUnit is "month", then + // a. Let candidateMonths be sign. + let mut candidate_months: i32 = sign.into(); + // b. Let intermediate be BalanceISOYearMonth(y1 + years, m1 + candidateMonths). + let mut intermediate = + balance_iso_year_month(self.year + years, i32::from(self.month) + candidate_months); + // c. Repeat, while ISODateSurpasses(sign, intermediate.[[Year]], intermediate.[[Month]], d1, y2, m2, d2) is false, + // Safety: balance_iso_year_month should always return a month value from 1..=12 + while !iso_date_surpasses( + &IsoDate::new_unchecked(intermediate.0, intermediate.1 as u8, self.day), + other, + sign, + ) { + // i. Set months to candidateMonths. + months = candidate_months; + // ii. Set candidateMonths to candidateMonths + sign. + candidate_months += i32::from(sign); + // iii. Set intermediate to BalanceISOYearMonth(intermediate.[[Year]], intermediate.[[Month]] + sign). + intermediate = balance_iso_year_month( + intermediate.0, + i32::from(intermediate.1) + i32::from(sign), + ); + } + + if largest_unit == Unit::Month { + months += years * 12; + years = 0; + } + } + + // 9. Set intermediate to BalanceISOYearMonth(y1 + years, m1 + months). + let intermediate = + balance_iso_year_month(self.year + years, i32::from(self.month) + months); + // 10. Let constrained be ! RegulateISODate(intermediate.[[Year]], intermediate.[[Month]], d1, "constrain"). + let constrained = Self::new_with_overflow( + intermediate.0, + intermediate.1, + self.day, + Overflow::Constrain, + )?; + + // NOTE: Below is adapted from the polyfill. Preferring this as it avoids looping. + // 11. Let weeks be 0. + let days = utils::epoch_days_from_gregorian_date(other.year, other.month, other.day) + - utils::epoch_days_from_gregorian_date( + constrained.year, + constrained.month, + constrained.day, + ); + + let (weeks, days) = if largest_unit == Unit::Week { + (days / 7, days % 7) + } else { + (0, days) + }; + + // 17. Return ! CreateDateDurationRecord(years, months, weeks, days). + DateDuration::new(years as i64, months as i64, weeks, days) + } +} + +impl IsoDate { + /// Creates `[[ISOYear]]`, `[[isoMonth]]`, `[[isoDay]]` fields from `ICU4X`'s `Date` struct. + pub(crate) fn to_icu4x(self) -> IcuDate { + let d = IcuDate::try_new_iso(self.year, self.month, self.day); + debug_assert!(d.is_ok(), "ICU4X ISODate conversion must not fail"); + d.unwrap_or_else(|_| IcuDate::from_rata_die(icu_calendar::types::RataDie::new(0), Iso)) + } +} + +// ==== `IsoTime` section ==== + +/// An `IsoTime` record that contains `Temporal`'s +/// time slots. +#[non_exhaustive] +#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +pub struct IsoTime { + /// A valid hour value between 0..=23 + pub hour: u8, // 0..=23 + /// A valid minute value between 0..=59 + pub minute: u8, // 0..=59 + /// A valid second value between 0..=59 + pub second: u8, // 0..=59 + /// A valid millisecond value between 0..=999 + pub millisecond: u16, // 0..=999 + /// A valid microsecond value between 0..=999 + pub microsecond: u16, // 0..=999 + /// A valid nanosecond value between 0..=999 + pub nanosecond: u16, // 0..=999 +} + +impl IsoTime { + /// Creates a new `IsoTime` without any validation. + pub(crate) fn new_unchecked( + hour: u8, + minute: u8, + second: u8, + millisecond: u16, + microsecond: u16, + nanosecond: u16, + ) -> Self { + Self { + hour, + minute, + second, + millisecond, + microsecond, + nanosecond, + } + } + + /// Creates a new regulated `IsoTime`. + pub fn new( + hour: u8, + minute: u8, + second: u8, + millisecond: u16, + microsecond: u16, + nanosecond: u16, + overflow: Overflow, + ) -> TemporalResult { + match overflow { + Overflow::Constrain => { + let h = hour.clamp(0, 23); + let min = minute.clamp(0, 59); + let sec = second.clamp(0, 59); + let milli = millisecond.clamp(0, 999); + let micro = microsecond.clamp(0, 999); + let nano = nanosecond.clamp(0, 999); + Ok(Self::new_unchecked(h, min, sec, milli, micro, nano)) + } + Overflow::Reject => { + if !is_valid_time(hour, minute, second, millisecond, microsecond, nanosecond) { + return Err(TemporalError::range().with_message("IsoTime is not valid")); + }; + Ok(Self::new_unchecked( + hour, + minute, + second, + millisecond, + microsecond, + nanosecond, + )) + } + } + } + + /// Creates a new `Time` with the fields provided from a `PartialTime`. + #[inline] + pub(crate) fn with(&self, partial: PartialTime, overflow: Overflow) -> TemporalResult { + let hour = partial.hour.unwrap_or(self.hour); + let minute = partial.minute.unwrap_or(self.minute); + let second = partial.second.unwrap_or(self.second); + let millisecond = partial.millisecond.unwrap_or(self.millisecond); + let microsecond = partial.microsecond.unwrap_or(self.microsecond); + let nanosecond = partial.nanosecond.unwrap_or(self.nanosecond); + Self::new( + hour, + minute, + second, + millisecond, + microsecond, + nanosecond, + overflow, + ) + } + + /// Returns an `IsoTime` set to 12:00:00 + pub(crate) const fn noon() -> Self { + Self { + hour: 12, + minute: 0, + second: 0, + millisecond: 0, + microsecond: 0, + nanosecond: 0, + } + } + + /// Returns an `IsoTime` based off parse components. + pub(crate) fn from_time_record(time_record: TimeRecord) -> TemporalResult { + let second = time_record.second.clamp(0, 59); + let fractional_seconds = time_record + .fraction + .map(|x| { + x.to_nanoseconds().ok_or( + TemporalError::range() + .with_enum(ErrorMessage::FractionalTimeMoreThanNineDigits), + ) + }) + .transpose()? + .unwrap_or(0); + + let (millisecond, rem) = fractional_seconds.div_rem_euclid(&1_000_000); + let (micros, nanos) = rem.div_rem_euclid(&1_000); + + Self::new( + time_record.hour, + time_record.minute, + second, + millisecond as u16, + micros as u16, + nanos as u16, + Overflow::Reject, + ) + } + + /// Balances and creates a new `IsoTime` with `day` overflow from the provided values. + pub(crate) fn balance( + hour: i64, + minute: i64, + second: i64, + millisecond: i64, + microsecond: i128, + nanosecond: i128, + ) -> (i64, Self) { + // 1. Set microsecond to microsecond + floor(nanosecond / 1000). + // 2. Set nanosecond to nanosecond modulo 1000. + let (quotient, nanosecond) = (nanosecond.div_euclid(1000), nanosecond.rem_euclid(1000)); + let microsecond = microsecond + quotient; + + // 3. Set millisecond to millisecond + floor(microsecond / 1000). + // 4. Set microsecond to microsecond modulo 1000. + let (quotient, microsecond) = (microsecond.div_euclid(1000), microsecond.rem_euclid(1000)); + let millisecond = millisecond + quotient as i64; + + // 5. Set second to second + floor(millisecond / 1000). + // 6. Set millisecond to millisecond modulo 1000. + let (quotient, millisecond) = div_mod(millisecond, 1000); + let second = second + quotient; + + // 7. Set minute to minute + floor(second / 60). + // 8. Set second to second modulo 60. + let (quotient, second) = div_mod(second, 60); + let minute = minute + quotient; + + // 9. Set hour to hour + floor(minute / 60). + // 10. Set minute to minute modulo 60. + let (quotient, minute) = div_mod(minute, 60); + let hour = hour + quotient; + + // 11. Let days be floor(hour / 24). + // 12. Set hour to hour modulo 24. + let (days, hour) = div_mod(hour, 24); + + let time = Self::new_unchecked( + hour as u8, + minute as u8, + second as u8, + millisecond as u16, + microsecond as u16, + nanosecond as u16, + ); + + (days, time) + } + + /// Difference this `IsoTime` against another and returning a `TimeDuration`. + pub(crate) fn diff(&self, other: &Self) -> TimeDuration { + let h = i64::from(other.hour) - i64::from(self.hour); + let m = i64::from(other.minute) - i64::from(self.minute); + let s = i64::from(other.second) - i64::from(self.second); + let ms = i64::from(other.millisecond) - i64::from(self.millisecond); + let mis = i128::from(other.microsecond) - i128::from(self.microsecond); + let ns = i128::from(other.nanosecond) - i128::from(self.nanosecond); + + TimeDuration::from_components(h, m, s, ms, mis, ns) + } + + // NOTE (nekevss): Specification seemed to be off / not entirely working, so the below was adapted from the + // temporal-polyfill + // TODO: DayLengthNS can probably be a u64, but keep as is for now and optimize. + /// Rounds the current `IsoTime` according to the provided settings. + pub(crate) fn round( + &self, + resolved_options: ResolvedRoundingOptions, + ) -> TemporalResult<(i64, Self)> { + // 1. If unit is "day" or "hour", then + let quantity = match resolved_options.smallest_unit { + Unit::Day | Unit::Hour => { + // a. Let quantity be ((((hour × 60 + minute) × 60 + second) × 1000 + millisecond) + // × 1000 + microsecond) × 1000 + nanosecond. + let minutes = i128::from(self.hour) * 60 + i128::from(self.minute); + let seconds = minutes * 60 + i128::from(self.second); + let millis = seconds * 1000 + i128::from(self.millisecond); + let micros = millis * 1000 + i128::from(self.microsecond); + micros * 1000 + i128::from(self.nanosecond) + } + // 2. Else if unit is "minute", then + Unit::Minute => { + // a. Let quantity be (((minute × 60 + second) × 1000 + millisecond) × 1000 + microsecond) × 1000 + nanosecond. + let seconds = i128::from(self.minute) * 60 + i128::from(self.second); + let millis = seconds * 1000 + i128::from(self.millisecond); + let micros = millis * 1000 + i128::from(self.microsecond); + micros * 1000 + i128::from(self.nanosecond) + } + // 3. Else if unit is "second", then + Unit::Second => { + // a. Let quantity be ((second × 1000 + millisecond) × 1000 + microsecond) × 1000 + nanosecond. + let millis = i128::from(self.second) * 1000 + i128::from(self.millisecond); + let micros = millis * 1000 + i128::from(self.microsecond); + micros * 1000 + i128::from(self.nanosecond) + } + // 4. Else if unit is "millisecond", then + Unit::Millisecond => { + // a. Let quantity be (millisecond × 1000 + microsecond) × 1000 + nanosecond. + let micros = i128::from(self.millisecond) * 1000 + i128::from(self.microsecond); + micros * 1000 + i128::from(self.nanosecond) + } + // 5. Else if unit is "microsecond", then + Unit::Microsecond => { + // a. Let quantity be microsecond × 1000 + nanosecond. + i128::from(self.microsecond) * 1000 + i128::from(self.nanosecond) + } + // 6. Else, + Unit::Nanosecond => { + // a. Assert: unit is "nanosecond". + // b. Let quantity be nanosecond. + i128::from(self.nanosecond) + } + _ => { + return Err(TemporalError::range() + .with_message("Invalid smallestUnit value for time rounding.")) + } + }; + // 7. Let unitLength be the value in the "Length in Nanoseconds" column of the row of Table 22 whose "Singular" column contains unit. + let length = NonZeroU128::new( + resolved_options + .smallest_unit + .as_nanoseconds() + .temporal_unwrap()? + .into(), + ) + .temporal_unwrap()?; + + let increment = resolved_options + .increment + .as_extended_increment() + .checked_mul(length) + .ok_or(TemporalError::range().with_message("increment exceeded valid range."))?; + + // 8. Let result be RoundNumberToIncrement(quantity, increment × unitLength, roundingMode) / unitLength. + let result = IncrementRounder::::from_signed_num(quantity, increment)? + .round(resolved_options.rounding_mode) + / length.get() as i128; + + let result_i64 = i64::from_i128(result) + .ok_or(TemporalError::range().with_message("round result valid range."))?; + + match resolved_options.smallest_unit { + // 9. If unit is "day", then + // a. Return Time Record { [[Days]]: result, [[Hour]]: 0, [[Minute]]: 0, [[Second]]: 0, [[Millisecond]]: 0, [[Microsecond]]: 0, [[Nanosecond]]: 0 }. + Unit::Day => Ok((result_i64, Self::default())), + // 10. If unit is "hour", then + // a. Return BalanceTime(result, 0, 0, 0, 0, 0). + Unit::Hour => Ok(Self::balance(result_i64, 0, 0, 0, 0, 0)), + // 11. If unit is "minute", then + // a. Return BalanceTime(hour, result, 0.0, 0.0, 0.0, 0). + Unit::Minute => Ok(Self::balance(self.hour.into(), result_i64, 0, 0, 0, 0)), + // 12. If unit is "second", then + // a. Return BalanceTime(hour, minute, result, 0.0, 0.0, 0). + Unit::Second => Ok(Self::balance( + self.hour.into(), + self.minute.into(), + result_i64, + 0, + 0, + 0, + )), + // 13. If unit is "millisecond", then + // a. Return BalanceTime(hour, minute, second, result, 0.0, 0). + Unit::Millisecond => Ok(Self::balance( + self.hour.into(), + self.minute.into(), + self.second.into(), + result_i64, + 0, + 0, + )), + // 14. If unit is "microsecond", then + // a. Return BalanceTime(hour, minute, second, millisecond, result, 0). + Unit::Microsecond => Ok(Self::balance( + self.hour.into(), + self.minute.into(), + self.second.into(), + self.millisecond.into(), + result_i64.into(), + 0, + )), + // 15. Assert: unit is "nanosecond". + // 16. Return BalanceTime(hour, minute, second, millisecond, microsecond, result). + Unit::Nanosecond => Ok(Self::balance( + self.hour.into(), + self.minute.into(), + self.second.into(), + self.millisecond.into(), + self.microsecond.into(), + result_i64.into(), + )), + _ => Err(TemporalError::assert()), + } + } + + pub(crate) fn add(&self, norm: TimeDuration) -> (i64, Self) { + // 1. Set second to second + TimeDurationSeconds(norm). + let seconds = i64::from(self.second) + norm.seconds(); + // 2. Set nanosecond to nanosecond + TimeDurationSubseconds(norm). + let nanos = i32::from(self.nanosecond) + norm.subseconds(); + // 3. Return BalanceTime(hour, minute, second, millisecond, microsecond, nanosecond). + Self::balance( + self.hour.into(), + self.minute.into(), + seconds, + self.millisecond.into(), + self.microsecond.into(), + nanos.into(), + ) + } + + /// `IsoTimeToEpochMs` + /// + /// Note: This method is library specific and not in spec + /// + /// Functionally the same as Date's `MakeTime` + pub(crate) fn to_epoch_ms(self) -> i64 { + ((i64::from(self.hour) * utils::MS_PER_HOUR + + i64::from(self.minute) * utils::MS_PER_MINUTE) + + i64::from(self.second) * 1000i64) + + i64::from(self.millisecond) + } +} + +// ==== `IsoDateTime` specific utility functions ==== + +const MAX_EPOCH_DAYS: i64 = 10i64.pow(8) + 1; + +#[inline] +/// Utility function to determine if a `DateTime`'s components create a `DateTime` within valid limits +fn iso_dt_within_valid_limits(date: IsoDate, time: &IsoTime) -> bool { + if utils::epoch_days_from_gregorian_date(date.year, date.month, date.day).abs() > MAX_EPOCH_DAYS + { + return false; + } + + let ns = to_unchecked_epoch_nanoseconds(date, time); + let max = crate::NS_MAX_INSTANT + i128::from(NS_PER_DAY); + let min = crate::NS_MIN_INSTANT - i128::from(NS_PER_DAY); + + min < ns && max > ns +} + +#[inline] +/// Utility function to convert a `IsoDate` and `IsoTime` values into epoch nanoseconds +fn utc_epoch_nanos(date: IsoDate, time: &IsoTime) -> EpochNanoseconds { + let epoch_nanos = to_unchecked_epoch_nanoseconds(date, time); + EpochNanoseconds::from(epoch_nanos) +} + +#[inline] +fn to_unchecked_epoch_nanoseconds(date: IsoDate, time: &IsoTime) -> i128 { + let ms = time.to_epoch_ms(); + let epoch_ms = utils::epoch_days_to_epoch_ms(date.to_epoch_days(), ms); + epoch_ms as i128 * 1_000_000 + time.microsecond as i128 * 1_000 + time.nanosecond as i128 +} + +// ==== `IsoDate` specific utiltiy functions ==== + +/// Returns the Epoch days based off the given year, month, and day. +/// Note: Month should be 1 indexed +#[inline] +pub(crate) fn iso_date_to_epoch_days(year: i32, month: i32, day: i32) -> i64 { + // 1. Let resolvedYear be year + floor(month / 12). + let resolved_year = year + month.div_euclid(12); + // 2. Let resolvedMonth be month modulo 12. + let resolved_month = month.rem_euclid(12) as u8; + // 3. Find a time t such that EpochTimeToEpochYear(t) is resolvedYear, + // EpochTimeToMonthInYear(t) is resolvedMonth, and EpochTimeToDate(t) is 1. + let epoch_days = utils::epoch_days_from_gregorian_date(resolved_year, resolved_month, 1); + + // 4. Return EpochTimeToDayNumber(t) + date - 1. + epoch_days + day as i64 - 1 +} + +#[inline] +// Determines if the month and day are valid for the given year. +pub(crate) fn is_valid_date(year: i32, month: u8, day: u8) -> bool { + if !(1..=12).contains(&month) { + return false; + } + is_valid_iso_day(year, month, day) +} + +#[inline] +/// Returns with the `this` surpasses `other`. +fn iso_date_surpasses(this: &IsoDate, other: &IsoDate, sign: i8) -> bool { + this.cmp(other) as i8 * sign == 1 +} + +#[inline] +pub(crate) fn year_month_within_limits(year: i32, month: u8) -> bool { + // 1. If isoDate.[[Year]] < -271821 or isoDate.[[Year]] > 275760, then + if !(-271821..=275760).contains(&year) { + // a. Return false. + return false; + // 2. If isoDate.[[Year]] = -271821 and isoDate.[[Month]] < 4, then + } else if year == -271821 && month < 4 { + // a. Return false. + return false; + // 3. If isoDate.[[Year]] = 275760 and isoDate.[[Month]] > 9, then + } else if year == 275760 && month > 9 { + // a. Return false. + return false; + } + // 4. Return true. + true +} + +fn balance_iso_year_month_with_clamp(year: i64, month: i64) -> (i32, u8) { + // 1. Assert: year and month are integers. + // 2. Set year to year + floor((month - 1) / 12). + let y = year + (month - 1).div_euclid(12); + // 3. Set month to ((month - 1) modulo 12) + 1. + let m = (month - 1).rem_euclid(12) + 1; + // 4. Return the Record { [[Year]]: year, [[Month]]: month }. + (y.clamp(i32::MIN as i64, i32::MAX as i64) as i32, m as u8) +} + +#[inline] +fn balance_iso_year_month(year: i32, month: i32) -> (i32, u8) { + // 1. Assert: year and month are integers. + // 2. Set year to year + floor((month - 1) / 12). + let y = year + (month - 1).div_euclid(12); + // 3. Set month to ((month - 1) modulo 12) + 1. + let m = (month - 1).rem_euclid(12) + 1; + // 4. Return the Record { [[Year]]: year, [[Month]]: month }. + (y, m as u8) +} + +/// Note: month is 1 based. +#[inline] +pub(crate) fn constrain_iso_day(year: i32, month: u8, day: u8) -> u8 { + let days_in_month = utils::iso_days_in_month(year, month); + day.clamp(1, days_in_month) +} + +#[inline] +pub(crate) fn is_valid_iso_day(year: i32, month: u8, day: u8) -> bool { + let days_in_month = utils::iso_days_in_month(year, month); + (1..=days_in_month).contains(&day) +} + +// ==== `IsoTime` specific utilities ==== + +#[inline] +pub(crate) fn is_valid_time(hour: u8, minute: u8, second: u8, ms: u16, mis: u16, ns: u16) -> bool { + if !(0..=23).contains(&hour) { + return false; + } + + let min_sec = 0..=59; + if !min_sec.contains(&minute) || !min_sec.contains(&second) { + return false; + } + + let sub_second = 0..=999; + sub_second.contains(&ms) && sub_second.contains(&mis) && sub_second.contains(&ns) +} + +// NOTE(nekevss): Considering the below: Balance can probably be altered from f64. +#[inline] +fn div_mod(dividend: i64, divisor: i64) -> (i64, i64) { + (dividend.div_euclid(divisor), dividend.rem_euclid(divisor)) +} + +impl From for IsoDateTime { + fn from(other: timezone_provider::provider::IsoDateTime) -> Self { + Self::new_unchecked( + IsoDate::new_unchecked(other.year, other.month, other.day), + IsoTime::new_unchecked( + other.hour, + other.minute, + other.second, + other.millisecond, + other.microsecond, + other.nanosecond, + ), + ) + } +} + +impl From for timezone_provider::provider::IsoDateTime { + fn from(other: IsoDateTime) -> Self { + Self { + year: other.date.year, + month: other.date.month, + day: other.date.day, + hour: other.time.hour, + minute: other.time.minute, + second: other.time.second, + millisecond: other.time.millisecond, + microsecond: other.time.microsecond, + nanosecond: other.time.nanosecond, + } + } +} + +#[cfg(test)] +mod tests { + use super::{iso_date_to_epoch_days, IsoDate}; + + const MAX_DAYS_BASE: i64 = 100_000_000; + + #[test] + fn icu4x_max_conversion_test() { + // Test that the max ISO date does not panic on conversion + let _ = IsoDate::new_unchecked(275_760, 9, 13).to_icu4x(); + // Test that the min ISO date does not panic on conversion + let _ = IsoDate::new_unchecked(-271_821, 4, 20).to_icu4x(); + } + + #[test] + fn iso_date_to_epoch_days_limits() { + // Succeeds + assert_eq!(iso_date_to_epoch_days(-271_821, 4, 20).abs(), MAX_DAYS_BASE); + // Succeeds + assert_eq!( + iso_date_to_epoch_days(-271_821, 4, 19).abs(), + MAX_DAYS_BASE + 1 + ); + // Fails + assert_eq!( + iso_date_to_epoch_days(-271_821, 4, 18).abs(), + MAX_DAYS_BASE + 2 + ); + // Succeeds + assert_eq!(iso_date_to_epoch_days(275_760, 9, 13).abs(), MAX_DAYS_BASE); + // Succeeds + assert_eq!( + iso_date_to_epoch_days(275_760, 9, 14).abs(), + MAX_DAYS_BASE + 1 + ); + // Fails + assert_eq!( + iso_date_to_epoch_days(275_760, 9, 15).abs(), + MAX_DAYS_BASE + 2 + ); + } + + #[test] + fn test_month_limits() { + assert_eq!(iso_date_to_epoch_days(1970, 1, 1), 0); + assert_eq!(iso_date_to_epoch_days(1969, 12, 31), -1); + } +} diff --git a/deps/temporal/src/lib.rs b/deps/temporal/src/lib.rs new file mode 100644 index 00000000000000..28a9d59b8957ba --- /dev/null +++ b/deps/temporal/src/lib.rs @@ -0,0 +1,456 @@ +//! A native Rust implementation of ECMAScript's Temporal API. +//! +//! Temporal is an API for working with date and time in a calendar +//! and time zone aware manner. +//! +//! temporal_rs is designed with ECMAScript implementations and general +//! purpose Rust usage in mind, meaning that temporal_rs can be used to implement +//! the Temporal built-ins in an ECMAScript implementation or generally +//! used as a date and time library in a Rust project. +//! +//! temporal_rs is the primary library for the Temporal API implementation in Boa, Kiesel, +//! and V8. Each of these engines pass the large ECMAScript conformance test suite for +//! the specification. +//! +//! ## Why use temporal_rs? +//! +//! As previously mentioned, Temporal is an API for working with date and time in +//! a calendar and time zone aware manner. This means that calendar and time zone support +//! are first class in Temporal as well as in temporal_rs. +//! +//! For instance, converting between calendars is as simple as providing the calendar as +//! shown below. +//! +//! ```rust +//! use temporal_rs::{PlainDate, Calendar}; +//! use tinystr::tinystr; +//! use core::str::FromStr; +//! +//! // Create a date with an ISO calendar +//! let iso8601_date = PlainDate::try_new_iso(2025, 3, 3).unwrap(); +//! +//! // Create a new date with the japanese calendar +//! let japanese_date = iso8601_date.with_calendar(Calendar::JAPANESE); +//! assert_eq!(japanese_date.era(), Some(tinystr!(16, "reiwa"))); +//! assert_eq!(japanese_date.era_year(), Some(7)); +//! assert_eq!(japanese_date.month(), 3) +//! ``` +//! +//! Beyond the general calendar use case, temporal_rs has robust support for +//! time zones which can generally by applied to a `PlainDate` via [`ZonedDateTime`]. +//! +//! **Important Note:** The below API is enabled with the +//! `compiled_data` feature flag. +//! +//! ```rust +//! # #[cfg(feature = "compiled_data")] { +//! use temporal_rs::{ZonedDateTime, TimeZone}; +//! use temporal_rs::options::{Disambiguation, OffsetDisambiguation}; +//! +//! let zdt = ZonedDateTime::from_utf8( +//! b"2025-03-01T11:16:10Z[America/Chicago][u-ca=iso8601]", +//! Disambiguation::Compatible, +//! OffsetDisambiguation::Reject +//! ).unwrap(); +//! assert_eq!(zdt.year(), 2025); +//! assert_eq!(zdt.month(), 3); +//! assert_eq!(zdt.day(), 1); +//! // Using Z and a timezone projects a UTC datetime into the timezone. +//! assert_eq!(zdt.hour(), 5); +//! assert_eq!(zdt.minute(), 16); +//! assert_eq!(zdt.second(), 10); +//! +//! // You can also update a time zone easily. +//! let zurich_zone = TimeZone::try_from_str("Europe/Zurich").unwrap(); +//! let zdt_zurich = zdt.with_timezone(zurich_zone).unwrap(); +//! assert_eq!(zdt_zurich.year(), 2025); +//! assert_eq!(zdt_zurich.month(), 3); +//! assert_eq!(zdt_zurich.day(), 1); +//! assert_eq!(zdt_zurich.hour(), 12); +//! assert_eq!(zdt_zurich.minute(), 16); +//! assert_eq!(zdt_zurich.second(), 10); +//! +//! # } +//! ``` +//! +//! ## Overview +//! +//! temporal_rs provides 8 core types for working with date and time. The core types are: +//! +//! - [PlainDate] +//! - [PlainTime] +//! - [PlainDateTime] +//! - [ZonedDateTime] +//! - [Instant] +//! - [Duration] +//! - [PlainYearMonth] +//! - [PlainMonthDay] +//! +//! In addition to these types, there are the [`Calendar`] and [`TimeZone`] type that +//! support the calendars or time zones. The specific support for calendars and time +//! zones per type are as follows. +//! +//! | Temporal type | Category | Calendar support | Time zone support | +//! |----------------|--------------------------------------|--------------------|--------------------| +//! | PlainDate | Calendar date | yes | no | +//! | PlainTime | Wall-clock time | no | no | +//! | PlainDateTime | Calendar date and wall-clock time | yes | no | +//! | ZonedDateTime | Calendar date and exact time | yes | yes | +//! | Instant | Exact time | no | no | +//! | Duration | None | no | no | +//! | PlainYearMonth | Calendar date | yes | no | +//! | PlainMonthDay | Calendar date | yes | no | +//! +//! There is also the [`Now`][now::Now], which provides access to the current host system +//! time. This can then be used to map to any of the above Temporal types. +//! +//! **Important Note:** the below example is only available with the `sys` and +//! `compiled_data` feature flag enabled. +//! +//! ```rust +//! # #[cfg(all(feature = "sys", feature = "compiled_data"))] { +//! use core::cmp::Ordering; +//! use temporal_rs::{Temporal, Calendar, ZonedDateTime}; +//! let current_instant = Temporal::now().instant().unwrap(); +//! let current_zoned_date_time = Temporal::now().zoned_date_time_iso(None).unwrap(); +//! +//! /// Create a `ZonedDateTime` from the requested instant. +//! let zoned_date_time_from_instant = ZonedDateTime::try_new( +//! current_instant.as_i128(), +//! *current_zoned_date_time.time_zone(), +//! Calendar::ISO, +//! ).unwrap(); +//! +//! // The two `ZonedDateTime` will be equal down to the second. +//! assert_eq!(current_zoned_date_time.year(), zoned_date_time_from_instant.year()); +//! assert_eq!(current_zoned_date_time.month(), zoned_date_time_from_instant.month()); +//! assert_eq!(current_zoned_date_time.day(), zoned_date_time_from_instant.day()); +//! assert_eq!(current_zoned_date_time.hour(), zoned_date_time_from_instant.hour()); +//! assert_eq!(current_zoned_date_time.minute(), zoned_date_time_from_instant.minute()); +//! assert_eq!(current_zoned_date_time.second(), zoned_date_time_from_instant.second()); +//! +//! // The `Instant` reading that occurred first will be less than the ZonedDateTime +//! // reading +//! assert_eq!( +//! zoned_date_time_from_instant.compare_instant(¤t_zoned_date_time), +//! Ordering::Less +//! ); +//! # } +//! ``` +//! +//! ## General design +//! +//! While temporal_rs can be used in native Rust programs, the library is -- first and +//! foremost -- designed for use in ECMAScript implementations. This is not to detract +//! from temporal_rs's use in a native Rust program, but it is important information to +//! understand in order to understand the library's architecture and general API design. +//! +//! Without default feature flags, temporal_rs does not have with access to the host +//! environment and it does not embed any time zone data. This is important from an +//! interpreter perspective, because access to the host environment and time zone data +//! comes from the interpreter's agent, not from a dependency. +//! +//! Instead, temporal_rs provides the [`HostHooks`][host::HostHooks] and [`TimeZoneProvider`][provider::TimeZoneProvider] +//! traits that can be implemented and provided as function arguments that temporal_rs will +//! use to access the host system or time zone data. temporal_rs also provides some baseline +//! implementations of the traits that can be selected from depending on application needs. +//! +//! That being said, this does not mean that everyone must implement their own trait +//! implementations for that functionality to exist, but the APIs are there for power +//! users who may need a custom host system or time zone data implementation. +//! +//! A default host system and time zone provider have been implemented and are automatically +//! active as default features. +//! +//! ### A quick walkthrough +//! +//! For instance, the examples thus far have been using the general usage Rust API with +//! the `sys` and `compiled_data` feature. +//! +//! For instance, let's manually write our [`Now`][now::Now] implementation instead of using +//! [`Temporal::now()`] with an empty host system implementation. +//! +//! ```rust +//! # #[cfg(feature = "compiled_data")] { +//! use temporal_rs::{Instant, now::Now, host::EmptyHostSystem}; +//! +//! // The empty host system is a system implementation HostHooks that always +//! // returns the UNIX_EPOCH and the "+00:00" time zone. +//! let now = Now::new(EmptyHostSystem); +//! let time_zone = now.time_zone().unwrap(); +//! assert_eq!(time_zone.identifier().unwrap(), "+00:00"); +//! let now = Now::new(EmptyHostSystem); +//! assert_eq!(now.instant(), Instant::try_new(0)); +//! # } +//! ``` +//! +//! However, even in our above example, we cheated a bit. We were still relying on the +//! `compiled_data` feature flag that provided time zone data for us. Let's try again, +//! but this time without the feature flag. +//! +//! ```rust +//! # #[cfg(feature = "tzdb")] { +//! use temporal_rs::{Instant, now::Now, host::EmptyHostSystem}; +//! use timezone_provider::tzif::CompiledTzdbProvider; +//! +//! let provider = CompiledTzdbProvider::default(); +//! +//! // The empty host system is a system implementation HostHooks that always +//! // returns the UNIX_EPOCH and the "+00:00" time zone. +//! let now = Now::new(EmptyHostSystem); +//! let time_zone = now.time_zone_with_provider(&provider).unwrap(); +//! assert_eq!(time_zone.identifier_with_provider(&provider).unwrap(), "+00:00"); +//! +//! let now = Now::new(EmptyHostSystem); +//! assert_eq!(now.instant(), Instant::try_new(0)); +//! # } +//! ``` +//! +//! Now -- pun only partially intended -- we've successfully written a no-default-features +//! example with temporal_rs! +//! +//! ### What have we learned going over this all this? +//! +//! First, any API that has the suffix `_with_provider` is a power user API for supplying +//! a custom or specific time zone data provider. Furthermore, any API that has a +//! `_with_provider` suffix will also have a version without the suffix that automagically +//! provides time zone data for you. +//! +//! Finally, sourcing time zone data is a very scary (but fun!) business. If you're interested +//! in learning more, feel free to check out the `timezone_provider` crate! +//! +//! With any luck, this also highlights the general design of temporal_rs. It provides a +//! general usage API that aligns with the Temporal specification while also being +//! flexible enough to provide an power user to take control of their host system access +//! and time zone data sourcing as needed. +//! +//! ## Formatting +//! +//! temporal_rs adheres to Temporal grammar, which is a strict version of +//! [RFC9557's IXDTF][ixdtf]. RFC9557 is an update to RFC3339 that adds +//! extensions to the format. +//! +//! ## More information +//! +//! [`Temporal`][proposal] is the Stage 3 proposal for ECMAScript that +//! provides new JS objects and functions for working with dates and +//! times that fully supports time zones and non-gregorian calendars. +//! +//! This library's primary development source is the Temporal +//! Proposal [specification][spec]. +//! +//! [ixdtf]: https://www.rfc-editor.org/rfc/rfc9557.txt +//! [proposal]: https://github.com/tc39/proposal-temporal +//! [spec]: https://tc39.es/proposal-temporal/ +#![doc( + html_logo_url = "https://raw.githubusercontent.com/boa-dev/boa/main/assets/logo.svg", + html_favicon_url = "https://raw.githubusercontent.com/boa-dev/boa/main/assets/logo.svg" +)] +#![no_std] +#![cfg_attr(not(test), forbid(clippy::unwrap_used))] +// We wish to reduce the number of panics, .expect() must be justified +// to never occur. Opt to have GIGO or .temporal_unwrap() behavior where possible. +#![cfg_attr(not(test), warn(clippy::expect_used, clippy::indexing_slicing))] +#![allow( + // Currently throws a false positive regarding dependencies that are only used in benchmarks. + unused_crate_dependencies, + clippy::module_name_repetitions, + clippy::redundant_pub_crate, + clippy::too_many_lines, + clippy::cognitive_complexity, + clippy::missing_errors_doc, + clippy::let_unit_value, + clippy::option_if_let_else, +)] +#![forbid(unsafe_code)] + +extern crate alloc; +extern crate core; + +#[cfg(any(test, feature = "std"))] +extern crate std; + +pub mod error; +pub mod host; +pub mod iso; +pub mod options; +pub mod parsers; +pub mod primitive; +pub mod provider; + +#[cfg(feature = "sys")] +pub(crate) mod sys; + +mod builtins; + +#[cfg(feature = "tzdb")] +pub(crate) mod tzdb; + +#[doc(hidden)] +pub(crate) mod rounding; +#[doc(hidden)] +pub(crate) mod utils; + +use core::cmp::Ordering; + +// TODO: evaluate positives and negatives of using tinystr. Re-exporting +// tinystr as a convenience, as it is currently tied into the API. +/// Re-export of `TinyAsciiStr` from `tinystr`. +pub use tinystr::TinyAsciiStr; + +/// The `Temporal` result type +pub type TemporalResult = Result; + +#[doc(inline)] +pub use error::TemporalError; + +#[cfg(feature = "sys")] +#[doc(inline)] +pub use sys::Temporal; + +pub mod partial { + //! Partial date and time component records + //! + //! The partial records are `temporal_rs`'s method of addressing + //! `TemporalFields` in the specification. + pub use crate::builtins::core::{ + PartialDate, PartialDateTime, PartialDuration, PartialTime, PartialYearMonth, + PartialZonedDateTime, + }; +} + +pub mod parsed_intermediates; + +// TODO: Potentially bikeshed how `EpochNanoseconds` should be exported. +/// A module for structs related to the UNIX epoch +pub mod unix_time { + pub use timezone_provider::epoch_nanoseconds::EpochNanoseconds; +} + +/// The `Now` module includes type for building a Now +pub mod now { + pub use crate::builtins::Now; +} + +/// Duration related types +pub mod duration { + pub use crate::builtins::DateDuration; +} + +/// Calendar field records +pub mod fields { + pub use crate::builtins::{ + calendar::{CalendarFields, YearMonthCalendarFields}, + DateTimeFields, ZonedDateTimeFields, + }; +} + +// TODO: Should we be exporting MonthCode and UtcOffset here. +pub use crate::builtins::{ + calendar::{Calendar, MonthCode}, + core::time_zone::{TimeZone, UtcOffset}, + Duration, Instant, PlainDate, PlainDateTime, PlainMonthDay, PlainTime, PlainYearMonth, + ZonedDateTime, +}; + +/// A library specific trait for unwrapping assertions. +pub(crate) trait TemporalUnwrap { + type Output; + + /// `temporal_rs` based assertion for unwrapping. This will panic in + /// debug builds, but throws error during runtime. + fn temporal_unwrap(self) -> TemporalResult; +} + +impl TemporalUnwrap for Option { + type Output = T; + + fn temporal_unwrap(self) -> TemporalResult { + debug_assert!(self.is_some()); + self.ok_or(TemporalError::assert()) + } +} + +impl TemporalUnwrap for TemporalResult { + type Output = T; + + fn temporal_unwrap(self) -> Self { + debug_assert!(self.is_ok(), "Assertion failed: {:?}", self.err()); + self.map_err(|e| TemporalError::assert().with_message(e.into_message())) + } +} + +#[doc(hidden)] +#[macro_export] +macro_rules! temporal_assert { + ($condition:expr $(,)*) => { + if !$condition { + return Err(TemporalError::assert()); + } + }; + ($condition:expr, $($args:tt)+) => { + if !$condition { + #[cfg(feature = "log")] + log::error!($($args)+); + return Err(TemporalError::assert()); + } + }; +} + +// TODO: Determine final home or leave in the top level? ops::Sign, +// types::Sign, etc. +/// A general Sign type. +#[repr(i8)] +#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +pub enum Sign { + #[default] + Positive = 1, + Zero = 0, + Negative = -1, +} + +impl From for Sign { + fn from(value: i8) -> Self { + match value.cmp(&0) { + Ordering::Greater => Self::Positive, + Ordering::Equal => Self::Zero, + Ordering::Less => Self::Negative, + } + } +} + +impl Sign { + /// Coerces the current `Sign` to be either negative or positive. + pub(crate) const fn as_sign_multiplier(&self) -> i8 { + if matches!(self, Self::Zero) { + return 1; + } + *self as i8 + } + + pub(crate) fn negate(&self) -> Sign { + Sign::from(-(*self as i8)) + } +} + +// Relevant numeric constants + +/// Nanoseconds per day constant: 8.64e+13 +#[doc(hidden)] +pub const NS_PER_DAY: u64 = MS_PER_DAY as u64 * 1_000_000; +#[doc(hidden)] +pub const NS_PER_DAY_NONZERO: core::num::NonZeroU128 = + if let Some(nz) = core::num::NonZeroU128::new(NS_PER_DAY as u128) { + nz + } else { + unreachable!() + }; +/// Milliseconds per day constant: 8.64e+7 +#[doc(hidden)] +pub const MS_PER_DAY: u32 = 24 * 60 * 60 * 1000; +/// Max Instant nanosecond constant +#[doc(hidden)] +pub(crate) const NS_MAX_INSTANT: i128 = NS_PER_DAY as i128 * 100_000_000i128; +/// Min Instant nanosecond constant +#[doc(hidden)] +pub(crate) const NS_MIN_INSTANT: i128 = -NS_MAX_INSTANT; diff --git a/deps/temporal/src/options.rs b/deps/temporal/src/options.rs new file mode 100644 index 00000000000000..c7f6c025a1789c --- /dev/null +++ b/deps/temporal/src/options.rs @@ -0,0 +1,989 @@ +//! Native implementation of the `Temporal` options. +//! +//! Temporal has various instances where user's can define options for how an +//! operation may be completed. + +use crate::parsers::Precision; +use crate::TemporalUnwrap; +use crate::{error::ErrorMessage, TemporalError, TemporalResult, MS_PER_DAY, NS_PER_DAY}; +use core::num::NonZeroU128; +use core::ops::Add; +use core::{fmt, str::FromStr}; + +mod increment; +mod relative_to; + +pub use increment::RoundingIncrement; +pub use relative_to::RelativeTo; + +// ==== RoundingOptions / DifferenceSettings ==== + +#[derive(Debug, Clone, Copy)] +pub(crate) enum DifferenceOperation { + Until, + Since, +} + +#[derive(Debug, Default)] +pub struct ToStringRoundingOptions { + pub precision: Precision, + pub smallest_unit: Option, + pub rounding_mode: Option, +} + +#[derive(Debug)] +pub(crate) struct ResolvedToStringRoundingOptions { + pub(crate) precision: Precision, + pub(crate) smallest_unit: Unit, + pub(crate) rounding_mode: RoundingMode, + pub(crate) increment: RoundingIncrement, +} + +impl ToStringRoundingOptions { + pub(crate) fn resolve(&self) -> TemporalResult { + let rounding_mode = self.rounding_mode.unwrap_or(RoundingMode::Trunc); + match self.smallest_unit { + Some(Unit::Minute) => Ok(ResolvedToStringRoundingOptions { + precision: Precision::Minute, + smallest_unit: Unit::Minute, + rounding_mode, + increment: RoundingIncrement::ONE, + }), + Some(Unit::Second) => Ok(ResolvedToStringRoundingOptions { + precision: Precision::Digit(0), + smallest_unit: Unit::Second, + rounding_mode, + increment: RoundingIncrement::ONE, + }), + Some(Unit::Millisecond) => Ok(ResolvedToStringRoundingOptions { + precision: Precision::Digit(3), + smallest_unit: Unit::Millisecond, + rounding_mode, + increment: RoundingIncrement::ONE, + }), + Some(Unit::Microsecond) => Ok(ResolvedToStringRoundingOptions { + precision: Precision::Digit(6), + smallest_unit: Unit::Microsecond, + rounding_mode, + increment: RoundingIncrement::ONE, + }), + Some(Unit::Nanosecond) => Ok(ResolvedToStringRoundingOptions { + precision: Precision::Digit(9), + smallest_unit: Unit::Nanosecond, + rounding_mode, + increment: RoundingIncrement::ONE, + }), + None => match self.precision { + Precision::Auto => Ok(ResolvedToStringRoundingOptions { + precision: Precision::Auto, + smallest_unit: Unit::Nanosecond, + rounding_mode, + increment: RoundingIncrement::ONE, + }), + Precision::Digit(0) => Ok(ResolvedToStringRoundingOptions { + precision: Precision::Digit(0), + smallest_unit: Unit::Second, + rounding_mode, + increment: RoundingIncrement::ONE, + }), + Precision::Digit(d) if (1..=3).contains(&d) => { + Ok(ResolvedToStringRoundingOptions { + precision: Precision::Digit(d), + smallest_unit: Unit::Millisecond, + rounding_mode, + increment: RoundingIncrement::try_new(10_u32.pow(3 - d as u32)) + .temporal_unwrap()?, + }) + } + Precision::Digit(d) if (4..=6).contains(&d) => { + Ok(ResolvedToStringRoundingOptions { + precision: Precision::Digit(d), + smallest_unit: Unit::Microsecond, + rounding_mode, + increment: RoundingIncrement::try_new(10_u32.pow(6 - d as u32)) + .temporal_unwrap()?, + }) + } + Precision::Digit(d) if (7..=9).contains(&d) => { + Ok(ResolvedToStringRoundingOptions { + precision: Precision::Digit(d), + smallest_unit: Unit::Nanosecond, + rounding_mode, + increment: RoundingIncrement::try_new(10_u32.pow(9 - d as u32)) + .temporal_unwrap()?, + }) + } + _ => Err(TemporalError::range() + .with_enum(ErrorMessage::FractionalDigitsPrecisionInvalid)), + }, + _ => Err(TemporalError::range().with_enum(ErrorMessage::SmallestUnitNotTimeUnit)), + } + } +} + +#[non_exhaustive] +#[derive(Debug, Default, Clone, Copy)] +pub struct DifferenceSettings { + pub largest_unit: Option, + pub smallest_unit: Option, + pub rounding_mode: Option, + pub increment: Option, +} + +#[non_exhaustive] +#[derive(Debug, Clone, Copy)] +pub struct RoundingOptions { + pub largest_unit: Option, + pub smallest_unit: Option, + pub rounding_mode: Option, + pub increment: Option, +} + +// Note: Specification does not clearly state a default, but +// having both largest and smallest unit None would auto throw. + +impl Default for RoundingOptions { + fn default() -> Self { + Self { + largest_unit: Some(Unit::Auto), + smallest_unit: None, + rounding_mode: None, + increment: None, + } + } +} + +/// Internal options object that represents the resolved rounding options. +#[derive(Debug, Clone, Copy)] +pub(crate) struct ResolvedRoundingOptions { + pub(crate) largest_unit: Unit, + pub(crate) smallest_unit: Unit, + pub(crate) increment: RoundingIncrement, + pub(crate) rounding_mode: RoundingMode, +} + +impl ResolvedRoundingOptions { + pub(crate) fn from_to_string_options(options: &ResolvedToStringRoundingOptions) -> Self { + Self { + largest_unit: Unit::Auto, + smallest_unit: options.smallest_unit, + increment: options.increment, + rounding_mode: options.rounding_mode, + } + } + + pub(crate) fn from_diff_settings( + options: DifferenceSettings, + operation: DifferenceOperation, + unit_group: UnitGroup, + fallback_largest: Unit, + fallback_smallest: Unit, + ) -> TemporalResult { + // 1. NOTE: The following steps read options and perform independent validation in alphabetical order. + // 2. Let largestUnit be ? GetUnitValuedOption(options, "largestUnit", unitGroup, auto). + unit_group.validate_unit(options.largest_unit, Some(Unit::Auto))?; + + // 4. Let resolvedOptions be ? SnapshotOwnProperties(? GetOptionsObject(options), null). + // 5. Let settings be ? GetDifferenceSettings(operation, resolvedOptions, DATE, « », "day", "day"). + + // 3. If disallowedUnits contains largestUnit, throw a RangeError exception. + // 4. Let roundingIncrement be ? GetRoundingIncrementOption(options). + let increment = options.increment.unwrap_or_default(); + // 5. Let roundingMode be ? GetRoundingModeOption(options, trunc). + // 6. If operation is since, then + // a. Set roundingMode to NegateRoundingMode(roundingMode). + let rounding_mode = match operation { + DifferenceOperation::Since => options + .rounding_mode + .unwrap_or(RoundingMode::Trunc) + .negate(), + DifferenceOperation::Until => options.rounding_mode.unwrap_or(RoundingMode::Trunc), + }; + // 7. Let smallestUnit be ? GetUnitValuedOption(options, "smallestUnit", unitGroup, fallbackSmallestUnit). + let smallest_unit = options.smallest_unit.unwrap_or(fallback_smallest); + // 8. If disallowedUnits contains smallestUnit, throw a RangeError exception. + unit_group.validate_unit(options.smallest_unit, None)?; + // 9. Let defaultLargestUnit be LargerOfTwoUnits(smallestLargestDefaultUnit, smallestUnit). + let default_largest_unit = smallest_unit.max(fallback_largest); + // 10. If largestUnit is auto, set largestUnit to defaultLargestUnit. + let mut largest_unit = options.largest_unit.unwrap_unit_or(default_largest_unit); + if largest_unit == Unit::Auto { + largest_unit = default_largest_unit; + } + // 11. If LargerOfTwoUnits(largestUnit, smallestUnit) is not largestUnit, throw a RangeError exception. + if largest_unit < smallest_unit { + return Err( + TemporalError::range().with_enum(ErrorMessage::SmallestUnitLargerThanLargestUnit) + ); + } + + // 12. Let maximum be MaximumTemporalDurationRoundingIncrement(smallestUnit). + let maximum = smallest_unit.to_maximum_rounding_increment(); + // 13. If maximum is not unset, perform ? ValidateTemporalRoundingIncrement(roundingIncrement, maximum, false). + if let Some(max) = maximum { + increment.validate(max.into(), false)?; + } + // 14. Return the Record { [[SmallestUnit]]: smallestUnit, [[LargestUnit]]: largestUnit, [[RoundingMode]]: + // roundingMode, [[RoundingIncrement]]: roundingIncrement, }. + Ok(ResolvedRoundingOptions { + largest_unit, + smallest_unit, + increment, + rounding_mode, + }) + } + + // NOTE: Should the GetUnitValuedOption check be integrated into these validations. + pub(crate) fn from_datetime_options(options: RoundingOptions) -> TemporalResult { + let increment = options.increment.unwrap_or_default(); + let rounding_mode = options.rounding_mode.unwrap_or_default(); + let smallest_unit = + UnitGroup::Time.validate_required_unit(options.smallest_unit, Some(Unit::Day))?; + let (maximum, inclusive) = if smallest_unit == Unit::Day { + (1, true) + } else { + let maximum = smallest_unit + .to_maximum_rounding_increment() + .ok_or(TemporalError::range().with_enum(ErrorMessage::SmallestUnitNotTimeUnit))?; + (maximum, false) + }; + + increment.validate(maximum.into(), inclusive)?; + + Ok(Self { + largest_unit: Unit::Auto, + smallest_unit, + increment, + rounding_mode, + }) + } + + pub(crate) fn from_time_options(options: RoundingOptions) -> TemporalResult { + let Some(smallest_unit) = options.smallest_unit else { + return Err(TemporalError::range().with_enum(ErrorMessage::SmallestUnitIsRequired)); + }; + let increment = options.increment.unwrap_or(RoundingIncrement::ONE); + let rounding_mode = options.rounding_mode.unwrap_or(RoundingMode::HalfExpand); + + let max = smallest_unit + .to_maximum_rounding_increment() + .ok_or_else(|| { + TemporalError::range().with_enum(ErrorMessage::SmallestUnitNotTimeUnit) + })?; + + // Safety (nekevss): to_rounding_increment returns a value in the range of a u32. + increment.validate(u64::from(max), false)?; + + Ok(ResolvedRoundingOptions { + largest_unit: Unit::Auto, + increment, + smallest_unit, + rounding_mode, + }) + } + + pub(crate) fn from_instant_options(options: RoundingOptions) -> TemporalResult { + let increment = options.increment.unwrap_or_default(); + let rounding_mode = options.rounding_mode.unwrap_or_default(); + let smallest_unit = UnitGroup::Time.validate_required_unit(options.smallest_unit, None)?; + let maximum = match smallest_unit { + Unit::Hour => 24u64, + Unit::Minute => 24 * 60, + Unit::Second => 24 * 3600, + Unit::Millisecond => MS_PER_DAY as u64, + Unit::Microsecond => MS_PER_DAY as u64 * 1000, + Unit::Nanosecond => NS_PER_DAY, + _ => return Err(TemporalError::range().with_enum(ErrorMessage::RoundToUnitInvalid)), + }; + + increment.validate(maximum, true)?; + + Ok(Self { + largest_unit: Unit::Auto, + smallest_unit, + increment, + rounding_mode, + }) + } + + pub(crate) fn is_noop(&self) -> bool { + self.smallest_unit == Unit::Nanosecond && self.increment == RoundingIncrement::ONE + } +} + +// ==== Options enums and methods ==== + +#[derive(Debug, Clone, Copy)] +pub enum UnitGroup { + Date, + Time, + DateTime, +} + +impl UnitGroup { + pub fn validate_required_unit( + self, + unit: Option, + extra_unit: Option, + ) -> TemporalResult { + let Some(unit) = unit else { + return Err(TemporalError::range().with_enum(ErrorMessage::UnitRequired)); + }; + self.validate_unit(Some(unit), extra_unit)?; + Ok(unit) + } + + /// Note: this always rejects Auto unless extra_unit is specified + /// + /// + pub fn validate_unit(self, unit: Option, extra_unit: Option) -> TemporalResult<()> { + match self { + _ if unit == extra_unit => Ok(()), + UnitGroup::Date => match unit { + Some(unit) if unit.is_date_unit() => Ok(()), + None => Ok(()), + _ => Err(TemporalError::range().with_enum(ErrorMessage::UnitNotDate)), + }, + UnitGroup::Time => match unit { + Some(unit) if unit.is_time_unit() => Ok(()), + None => Ok(()), + _ => Err(TemporalError::range().with_enum(ErrorMessage::UnitNotTime)), + }, + UnitGroup::DateTime if unit != Some(Unit::Auto) => Ok(()), + _ => Err(TemporalError::range().with_enum(ErrorMessage::UnitNoAutoDuringComparison)), + } + } +} + +/// `Table 21: Temporal units by descending magnitude` +/// +/// Subset of the spec table containing only the value column. +/// +/// Spec: +// +// Spec last accessed: 2025-05-16, +pub(crate) const UNIT_VALUE_TABLE: [Unit; 10] = [ + Unit::Year, + Unit::Month, + Unit::Week, + Unit::Day, + Unit::Hour, + Unit::Minute, + Unit::Second, + Unit::Millisecond, + Unit::Microsecond, + Unit::Nanosecond, +]; + +// TODO: Need to decide whether to make auto default or remove. Blocker was one +// of Duration::round / Duration::total +/// The relevant unit that should be used for the operation that +/// this option is provided as a value. +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +pub enum Unit { + /// The `Auto` unit + Auto = 0, + /// The `Nanosecond` unit + Nanosecond, + /// The `Microsecond` unit + Microsecond, + /// The `Millisecond` unit + Millisecond, + /// The `Second` unit + Second, + /// The `Minute` unit + Minute, + /// The `Hour` unit + Hour, + /// The `Day` unit + Day, + /// The `Week` unit + Week, + /// The `Month` unit + Month, + /// The `Year` unit + Year, +} + +impl Unit { + #[inline] + #[must_use] + /// Returns the `MaximumRoundingIncrement` for the current `Unit`. + pub fn to_maximum_rounding_increment(self) -> Option { + use Unit::{ + Auto, Day, Hour, Microsecond, Millisecond, Minute, Month, Nanosecond, Second, Week, + Year, + }; + // 1. If unit is "year", "month", "week", or "day", then + // a. Return undefined. + // 2. If unit is "hour", then + // a. Return 24. + // 3. If unit is "minute" or "second", then + // a. Return 60. + // 4. Assert: unit is one of "millisecond", "microsecond", or "nanosecond". + // 5. Return 1000. + let max = match self { + Year | Month | Week | Day => return None, + Hour => 24, + Minute | Second => 60, + Millisecond | Microsecond | Nanosecond => 1000, + Auto => { + debug_assert!(false, "Auto units should be resolved by this point"); + return None; + } + }; + + Some(max) + } + + // TODO: potentiall use a u64 + /// Returns the `Nanosecond amount for any given value.` + #[must_use] + pub const fn as_nanoseconds(&self) -> Option { + use Unit::{ + Auto, Day, Hour, Microsecond, Millisecond, Minute, Month, Nanosecond, Second, Week, + Year, + }; + match self { + Year | Month | Week | Auto => None, + Day => NonZeroU128::new(NS_PER_DAY as u128), + Hour => NonZeroU128::new(3_600_000_000_000), + Minute => NonZeroU128::new(60_000_000_000), + Second => NonZeroU128::new(1_000_000_000), + Millisecond => NonZeroU128::new(1_000_000), + Microsecond => NonZeroU128::new(1_000), + Nanosecond => NonZeroU128::new(1), + } + } + + #[inline] + #[must_use] + pub fn is_calendar_unit(&self) -> bool { + use Unit::{Month, Week, Year}; + matches!(self, Year | Month | Week) + } + + #[inline] + #[must_use] + pub fn is_date_unit(&self) -> bool { + use Unit::{Day, Month, Week, Year}; + matches!(self, Day | Year | Month | Week) + } + + #[inline] + #[must_use] + pub fn is_time_unit(&self) -> bool { + use Unit::{Hour, Microsecond, Millisecond, Minute, Nanosecond, Second}; + matches!( + self, + Hour | Minute | Second | Millisecond | Microsecond | Nanosecond + ) + } + + /// `13.19 LargerOfTwoTemporalUnits ( u1, u2 )` + /// + /// Spec: + // + // Spec last accessed: 2025-05-16, + #[inline] + pub fn larger(u1: Unit, u2: Unit) -> TemporalResult { + // 1. For each row of Table 21, except the header row, in table order, do + // a. Let unit be the value in the "Value" column of the row. + for unit in UNIT_VALUE_TABLE { + // b. If u1 is unit, return unit. + if u1 == unit { + return Ok(unit); + } + // c. If u2 is unit, return unit. + if u2 == unit { + return Ok(unit); + } + } + + // NOTE(HalidOdat): deviation from specification. + Err(TemporalError::assert().with_enum(ErrorMessage::UnitNoAutoDuringComparison)) + } + + /// Helper method for getting the index into the [`UNIT_VALUE_TABLE`]. + /// + /// # Error + /// + /// If the given [`Unit`] is [`Unit::Auto`]. + pub(crate) fn table_index(&self) -> TemporalResult { + // Taken from: + // + // spec(2025-05-28): https://github.com/tc39/proposal-temporal/tree/69001e954c70e29ba3d2e6433bc7ece2a037377a + // + // 2. Let largestUnitIndex be the ordinal index of the row of Table 21 whose "Value" column contains largestUnit. + // 3. Let smallestUnitIndex be the ordinal index of the row of Table 21 whose "Value" column contains smallestUnit. + for (i, unit) in UNIT_VALUE_TABLE.iter().enumerate() { + if self == unit { + return Ok(i); + } + } + + Err(TemporalError::assert().with_enum(ErrorMessage::UnitNoAutoDuringComparison)) + } +} + +trait UnwrapUnit { + type Result; + fn unwrap_unit_or(self, unit: Unit) -> Self::Result; +} + +impl UnwrapUnit for Option { + type Result = Unit; + fn unwrap_unit_or(self, unit: Unit) -> Self::Result { + if self == Some(Unit::Auto) { + return unit; + } + self.unwrap_or(unit) + } +} + +impl From for Unit { + fn from(value: usize) -> Self { + match value { + 10 => Self::Year, + 9 => Self::Month, + 8 => Self::Week, + 7 => Self::Day, + 6 => Self::Hour, + 5 => Self::Minute, + 4 => Self::Second, + 3 => Self::Millisecond, + 2 => Self::Microsecond, + 1 => Self::Nanosecond, + _ => Self::Auto, + } + } +} + +impl Add for Unit { + type Output = Unit; + + fn add(self, rhs: usize) -> Self::Output { + Unit::from(self as usize + rhs) + } +} + +/// A parsing error for `Unit` +#[derive(Debug, Clone, Copy)] +pub struct ParseUnitError; + +impl fmt::Display for ParseUnitError { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + f.write_str("provided string was not a valid Unit") + } +} + +impl FromStr for Unit { + type Err = ParseUnitError; + + fn from_str(s: &str) -> Result { + match s { + "auto" => Ok(Self::Auto), + "year" | "years" => Ok(Self::Year), + "month" | "months" => Ok(Self::Month), + "week" | "weeks" => Ok(Self::Week), + "day" | "days" => Ok(Self::Day), + "hour" | "hours" => Ok(Self::Hour), + "minute" | "minutes" => Ok(Self::Minute), + "second" | "seconds" => Ok(Self::Second), + "millisecond" | "milliseconds" => Ok(Self::Millisecond), + "microsecond" | "microseconds" => Ok(Self::Microsecond), + "nanosecond" | "nanoseconds" => Ok(Self::Nanosecond), + _ => Err(ParseUnitError), + } + } +} + +impl fmt::Display for Unit { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + match self { + Self::Auto => "auto", + Self::Year => "year", + Self::Month => "month", + Self::Week => "week", + Self::Day => "day", + Self::Hour => "hour", + Self::Minute => "minute", + Self::Second => "second", + Self::Millisecond => "millsecond", + Self::Microsecond => "microsecond", + Self::Nanosecond => "nanosecond", + } + .fmt(f) + } +} + +/// `Overflow` can also be used as an +/// assignment overflow and consists of the "constrain" +/// and "reject" options. +#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)] +pub enum Overflow { + /// Constrain option + #[default] + Constrain, + /// Constrain option + Reject, +} + +/// A parsing error for `ArithemeticOverflow` +#[derive(Debug, Clone, Copy)] +pub struct ParseOverflowError; + +impl fmt::Display for ParseOverflowError { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + f.write_str("provided string was not a valid overflow value") + } +} + +impl FromStr for Overflow { + type Err = ParseOverflowError; + + fn from_str(s: &str) -> Result { + match s { + "constrain" => Ok(Self::Constrain), + "reject" => Ok(Self::Reject), + _ => Err(ParseOverflowError), + } + } +} + +impl fmt::Display for Overflow { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + match self { + Self::Constrain => "constrain", + Self::Reject => "reject", + } + .fmt(f) + } +} + +/// The disambiguation options for an instant. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] +pub enum Disambiguation { + /// Compatible option + /// + /// This is the default according to GetTemporalDisambiguationOption + #[default] + Compatible, + /// Earlier option + Earlier, + /// Later option + Later, + /// Reject option + Reject, +} + +/// A parsing error on `InstantDisambiguation` options. +#[derive(Debug, Clone, Copy)] +pub struct ParseDisambiguationError; + +impl fmt::Display for ParseDisambiguationError { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + f.write_str("provided string was not a valid instant disambiguation value") + } +} + +impl FromStr for Disambiguation { + type Err = ParseDisambiguationError; + + fn from_str(s: &str) -> Result { + match s { + "compatible" => Ok(Self::Compatible), + "earlier" => Ok(Self::Earlier), + "later" => Ok(Self::Later), + "reject" => Ok(Self::Reject), + _ => Err(ParseDisambiguationError), + } + } +} + +impl fmt::Display for Disambiguation { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + match self { + Self::Compatible => "compatible", + Self::Earlier => "earlier", + Self::Later => "later", + Self::Reject => "reject", + } + .fmt(f) + } +} + +/// Offset disambiguation options. +#[derive(Debug, Clone, Copy, PartialEq, PartialOrd)] +pub enum OffsetDisambiguation { + /// Use option + Use, + /// Prefer option + Prefer, + /// Ignore option + Ignore, + /// Reject option + Reject, +} + +/// A parsing error for `OffsetDisambiguation` parsing. +#[derive(Debug, Clone, Copy)] +pub struct ParseOffsetDisambiguationError; + +impl fmt::Display for ParseOffsetDisambiguationError { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + f.write_str("provided string was not a valid offset disambiguation value") + } +} + +impl FromStr for OffsetDisambiguation { + type Err = ParseOffsetDisambiguationError; + + fn from_str(s: &str) -> Result { + match s { + "use" => Ok(Self::Use), + "prefer" => Ok(Self::Prefer), + "ignore" => Ok(Self::Ignore), + "reject" => Ok(Self::Reject), + _ => Err(ParseOffsetDisambiguationError), + } + } +} + +impl fmt::Display for OffsetDisambiguation { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + match self { + Self::Use => "use", + Self::Prefer => "prefer", + Self::Ignore => "ignore", + Self::Reject => "reject", + } + .fmt(f) + } +} + +// TODO: Figure out what to do with intl's RoundingMode + +/// Declares the specified `RoundingMode` for the operation. +#[derive(Debug, Copy, Clone, Default)] +pub enum RoundingMode { + /// Ceil RoundingMode + Ceil, + /// Floor RoundingMode + Floor, + /// Expand RoundingMode + Expand, + /// Truncate RoundingMode + Trunc, + /// HalfCeil RoundingMode + HalfCeil, + /// HalfFloor RoundingMode + HalfFloor, + /// HalfExpand RoundingMode - Default + #[default] + HalfExpand, + /// HalfTruncate RoundingMode + HalfTrunc, + /// HalfEven RoundingMode + HalfEven, +} + +/// The `UnsignedRoundingMode` +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum UnsignedRoundingMode { + /// `Infinity` `RoundingMode` + Infinity, + /// `Zero` `RoundingMode` + Zero, + /// `HalfInfinity` `RoundingMode` + HalfInfinity, + /// `HalfZero` `RoundingMode` + HalfZero, + /// `HalfEven` `RoundingMode` + HalfEven, +} + +impl RoundingMode { + #[inline] + #[must_use] + /// Negates the current `RoundingMode`. + pub const fn negate(self) -> Self { + use RoundingMode::{ + Ceil, Expand, Floor, HalfCeil, HalfEven, HalfExpand, HalfFloor, HalfTrunc, Trunc, + }; + + match self { + Ceil => Self::Floor, + Floor => Self::Ceil, + HalfCeil => Self::HalfFloor, + HalfFloor => Self::HalfCeil, + Trunc => Self::Trunc, + Expand => Self::Expand, + HalfTrunc => Self::HalfTrunc, + HalfExpand => Self::HalfExpand, + HalfEven => Self::HalfEven, + } + } + + #[inline] + #[must_use] + /// Returns the `UnsignedRoundingMode` + pub const fn get_unsigned_round_mode(self, is_positive: bool) -> UnsignedRoundingMode { + use RoundingMode::{ + Ceil, Expand, Floor, HalfCeil, HalfEven, HalfExpand, HalfFloor, HalfTrunc, Trunc, + }; + + match self { + Ceil if is_positive => UnsignedRoundingMode::Infinity, + Ceil | Trunc => UnsignedRoundingMode::Zero, + Floor if is_positive => UnsignedRoundingMode::Zero, + Floor | Expand => UnsignedRoundingMode::Infinity, + HalfCeil if is_positive => UnsignedRoundingMode::HalfInfinity, + HalfCeil | HalfTrunc => UnsignedRoundingMode::HalfZero, + HalfFloor if is_positive => UnsignedRoundingMode::HalfZero, + HalfFloor | HalfExpand => UnsignedRoundingMode::HalfInfinity, + HalfEven => UnsignedRoundingMode::HalfEven, + } + } +} + +impl FromStr for RoundingMode { + type Err = TemporalError; + + fn from_str(s: &str) -> Result { + match s { + "ceil" => Ok(Self::Ceil), + "floor" => Ok(Self::Floor), + "expand" => Ok(Self::Expand), + "trunc" => Ok(Self::Trunc), + "halfCeil" => Ok(Self::HalfCeil), + "halfFloor" => Ok(Self::HalfFloor), + "halfExpand" => Ok(Self::HalfExpand), + "halfTrunc" => Ok(Self::HalfTrunc), + "halfEven" => Ok(Self::HalfEven), + _ => Err(TemporalError::range().with_enum(ErrorMessage::RoundingModeInvalid)), + } + } +} + +impl fmt::Display for RoundingMode { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + match self { + Self::Ceil => "ceil", + Self::Floor => "floor", + Self::Expand => "expand", + Self::Trunc => "trunc", + Self::HalfCeil => "halfCeil", + Self::HalfFloor => "halfFloor", + Self::HalfExpand => "halfExpand", + Self::HalfTrunc => "halfTrunc", + Self::HalfEven => "halfEven", + } + .fmt(f) + } +} + +/// values for `CalendarName`, whether to show the calendar in toString() methods +/// +#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +pub enum DisplayCalendar { + #[default] + /// `Auto` option + Auto, + /// `Always` option + Always, + /// `Never` option + Never, + // `Critical` option + Critical, +} + +impl fmt::Display for DisplayCalendar { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + match self { + DisplayCalendar::Auto => "auto", + DisplayCalendar::Always => "always", + DisplayCalendar::Never => "never", + DisplayCalendar::Critical => "critical", + } + .fmt(f) + } +} + +impl FromStr for DisplayCalendar { + type Err = TemporalError; + + fn from_str(s: &str) -> Result { + match s { + "auto" => Ok(Self::Auto), + "always" => Ok(Self::Always), + "never" => Ok(Self::Never), + "critical" => Ok(Self::Critical), + _ => Err(TemporalError::range().with_enum(ErrorMessage::CalendarNameInvalid)), + } + } +} + +#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +pub enum DisplayOffset { + #[default] + Auto, + Never, +} + +impl fmt::Display for DisplayOffset { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + match self { + DisplayOffset::Auto => "auto", + DisplayOffset::Never => "never", + } + .fmt(f) + } +} + +impl FromStr for DisplayOffset { + type Err = TemporalError; + + fn from_str(s: &str) -> Result { + match s { + "auto" => Ok(Self::Auto), + "never" => Ok(Self::Never), + _ => Err(TemporalError::range().with_enum(ErrorMessage::OffsetOptionInvalid)), + } + } +} + +#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +pub enum DisplayTimeZone { + #[default] + /// `Auto` option + Auto, + /// `Never` option + Never, + // `Critical` option + Critical, +} + +impl fmt::Display for DisplayTimeZone { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + match self { + DisplayTimeZone::Auto => "auto", + DisplayTimeZone::Never => "never", + DisplayTimeZone::Critical => "critical", + } + .fmt(f) + } +} + +impl FromStr for DisplayTimeZone { + type Err = TemporalError; + + fn from_str(s: &str) -> Result { + match s { + "auto" => Ok(Self::Auto), + "never" => Ok(Self::Never), + "critical" => Ok(Self::Critical), + _ => Err(TemporalError::range().with_enum(ErrorMessage::TimeZoneNameInvalid)), + } + } +} diff --git a/deps/temporal/src/options/increment.rs b/deps/temporal/src/options/increment.rs new file mode 100644 index 00000000000000..f229e85a7825ff --- /dev/null +++ b/deps/temporal/src/options/increment.rs @@ -0,0 +1,117 @@ +use core::num::{NonZeroU128, NonZeroU32}; + +use crate::{TemporalError, TemporalResult}; +use num_traits::float::FloatCore; + +// ==== RoundingIncrement option ==== + +// Invariants: +// RoundingIncrement(n): 1 <= n < 10^9 +// TODO: Add explanation on what exactly are rounding increments. + +/// A numeric rounding increment. +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +pub struct RoundingIncrement(pub(crate) NonZeroU32); + +impl Default for RoundingIncrement { + fn default() -> Self { + Self::ONE + } +} + +impl TryFrom for RoundingIncrement { + type Error = TemporalError; + + fn try_from(value: f64) -> Result { + // GetRoundingIncrementOption ( options ) + // https://tc39.es/proposal-temporal/#sec-temporal-getroundingincrementoption + + // 4. If increment is not finite, throw a RangeError exception. + if !value.is_finite() { + return Err(TemporalError::range().with_message("roundingIncrement must be finite")); + } + + // 5. Let integerIncrement be truncate(ℝ(increment)). + let integer_increment = FloatCore::trunc(value); + // 6. If integerIncrement < 1 or integerIncrement > 10**9, throw a RangeError exception. + // 7. Return integerIncrement. + if !(1.0..=1_000_000_000.0).contains(&integer_increment) { + Err(TemporalError::range() + .with_message("roundingIncrement cannot be less that 1 or bigger than 10**9")) + } else { + // We already range-checked, so we can just unwrap_or and expect it to never be reached + Ok(Self( + NonZeroU32::new(integer_increment as u32).unwrap_or(NonZeroU32::MIN), + )) + } + } +} + +impl RoundingIncrement { + // Using `MIN` avoids either a panic or using NonZeroU32::new_unchecked + /// A rounding increment of 1 (normal rounding). + pub const ONE: Self = Self(NonZeroU32::MIN); + + /// Create a new `RoundingIncrement`. + /// + /// # Errors + /// + /// - If `increment` is less than 1 or bigger than 10**9. + pub fn try_new(increment: u32) -> TemporalResult { + if !(1..=1_000_000_000).contains(&increment) { + Err(TemporalError::range() + .with_message("roundingIncrement cannot be less that 1 or bigger than 10**9")) + } else { + // We already range-checked, so we can just unwrap_or and expect it to never be reached + Ok(Self(NonZeroU32::new(increment).unwrap_or(NonZeroU32::MIN))) + } + } + + /// Create a new `RoundingIncrement` without checking the validity of the + /// increment. + /// + /// The increment is expected to be in `1..=10⁹` + /// + /// This is safe to invoke (and will result in incorrect but not unsafe behavior if + /// invoked with an out-of-range `increment`). + pub const fn new_unchecked(increment: NonZeroU32) -> Self { + Self(increment) + } + + /// Gets the numeric value of this `RoundingIncrement`. + pub const fn get(self) -> u32 { + self.0.get() + } + + // ValidateTemporalRoundingIncrement ( increment, dividend, inclusive ) + // https://tc39.es/proposal-temporal/#sec-validatetemporalroundingincrement + pub(crate) fn validate(self, dividend: u64, inclusive: bool) -> TemporalResult<()> { + // 1. If inclusive is true, then + // a. Let maximum be dividend. + // 2. Else, + // a. Assert: dividend > 1. + // b. Let maximum be dividend - 1. + let max = dividend - u64::from(!inclusive); + + let increment = u64::from(self.get()); + + // 3. If increment > maximum, throw a RangeError exception. + if increment > max { + return Err(TemporalError::range().with_message("roundingIncrement exceeds maximum")); + } + + // 4. If dividend modulo increment ≠ 0, then + if dividend.rem_euclid(increment) != 0 { + // a. Throw a RangeError exception. + return Err(TemporalError::range() + .with_message("dividend is not divisible by roundingIncrement")); + } + + // 5. Return unused. + Ok(()) + } + + pub(crate) fn as_extended_increment(&self) -> NonZeroU128 { + NonZeroU128::from(self.0) + } +} diff --git a/deps/temporal/src/options/relative_to.rs b/deps/temporal/src/options/relative_to.rs new file mode 100644 index 00000000000000..2f65fbbf5f0067 --- /dev/null +++ b/deps/temporal/src/options/relative_to.rs @@ -0,0 +1,181 @@ +//! RelativeTo rounding option + +use crate::builtins::core::zoned_date_time::interpret_isodatetime_offset; +use crate::builtins::core::{calendar::Calendar, time_zone::TimeZone, PlainDate, ZonedDateTime}; +use crate::iso::{IsoDate, IsoTime}; +use crate::options::{Disambiguation, OffsetDisambiguation, Overflow}; +use crate::parsers::{parse_date_time, parse_zoned_date_time}; +use crate::provider::TimeZoneProvider; +use crate::{TemporalResult, TemporalUnwrap}; + +use ixdtf::records::UtcOffsetRecordOrZ; + +// ==== RelativeTo Object ==== + +#[derive(Debug, Clone)] +pub enum RelativeTo { + PlainDate(PlainDate), + ZonedDateTime(ZonedDateTime), +} + +impl From for RelativeTo { + fn from(value: PlainDate) -> Self { + Self::PlainDate(value) + } +} + +impl From for RelativeTo { + fn from(value: ZonedDateTime) -> Self { + Self::ZonedDateTime(value) + } +} + +impl RelativeTo { + /// Attempts to parse a `ZonedDateTime` string falling back to a `PlainDate` + /// if possible. + /// + /// If the fallback fails or either the `ZonedDateTime` or `PlainDate` + /// is invalid, then an error is returned. + pub fn try_from_str_with_provider( + source: &str, + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + // b. Let result be ? ParseISODateTime(value, « TemporalDateTimeString[+Zoned], TemporalDateTimeString[~Zoned] »). + let bytes = source.as_bytes(); + let result = parse_date_time(bytes).or_else(|_| parse_zoned_date_time(bytes))?; + + let Some(annotation) = result.tz else { + let date_record = result.date.temporal_unwrap()?; + + let calendar = result + .calendar + .map(Calendar::try_from_utf8) + .transpose()? + .unwrap_or_default(); + + return Ok(PlainDate::try_new( + date_record.year, + date_record.month, + date_record.day, + calendar, + )? + .into()); + }; + + // iv. Set matchBehaviour to match-minutes. + let mut match_minutes = true; + + let time_zone = TimeZone::from_time_zone_record(annotation.tz, provider)?; + + let (offset_nanos, is_exact) = result + .offset + .map(|record| { + let UtcOffsetRecordOrZ::Offset(offset) = record else { + return (None, true); + }; + let hours_in_ns = i64::from(offset.hour()) * 3_600_000_000_000_i64; + let minutes_in_ns = i64::from(offset.minute()) * 60_000_000_000_i64; + let seconds_in_ns = i64::from(offset.second().unwrap_or(0)) * 1_000_000_000_i64; + // 3. If offsetParseResult contains more than one MinuteSecond Parse Node, set matchBehaviour to match-exactly. + if offset.second().is_some() { + match_minutes = false; + } + + let ns = offset + .fraction() + .and_then(|x| x.to_nanoseconds()) + .unwrap_or(0); + ( + Some( + (hours_in_ns + minutes_in_ns + seconds_in_ns + i64::from(ns)) + * i64::from(offset.sign() as i8), + ), + false, + ) + }) + .unwrap_or((None, false)); + + let calendar = result + .calendar + .map(Calendar::try_from_utf8) + .transpose()? + .unwrap_or_default(); + + let time = result.time.map(IsoTime::from_time_record).transpose()?; + + let date = result.date.temporal_unwrap()?; + let iso = IsoDate::new_with_overflow(date.year, date.month, date.day, Overflow::Constrain)?; + + let epoch_ns = interpret_isodatetime_offset( + iso, + time, + is_exact, + offset_nanos, + &time_zone, + Disambiguation::Compatible, + OffsetDisambiguation::Reject, + match_minutes, + provider, + )?; + + Ok(ZonedDateTime::try_new_with_cached_offset( + epoch_ns.ns.0, + time_zone, + calendar, + epoch_ns.offset, + )? + .into()) + } +} + +#[cfg(test)] +mod tests { + #[cfg(feature = "compiled_data")] + use super::*; + #[cfg(feature = "compiled_data")] + #[test] + fn relativeto_offset_parse() { + // Cases taken from intl402/Temporal/Duration/prototype/total/relativeto-sub-minute-offset + + let provider = &*crate::builtins::TZ_PROVIDER; + let _ = + RelativeTo::try_from_str_with_provider("1970-01-01T00:00-00:45:00[-00:45]", provider) + .unwrap(); + // Rounded mm accepted + let _ = RelativeTo::try_from_str_with_provider( + "1970-01-01T00:00:00-00:45[Africa/Monrovia]", + provider, + ) + .unwrap(); + // unrounded mm::ss accepted + let _ = RelativeTo::try_from_str_with_provider( + "1970-01-01T00:00:00-00:44:30[Africa/Monrovia]", + provider, + ) + .unwrap(); + assert!( + RelativeTo::try_from_str_with_provider( + "1970-01-01T00:00:00-00:44:40[Africa/Monrovia]", + provider + ) + .is_err(), + "Incorrect unrounded mm::ss rejected" + ); + assert!( + RelativeTo::try_from_str_with_provider( + "1970-01-01T00:00:00-00:45:00[Africa/Monrovia]", + provider + ) + .is_err(), + "Rounded mm::ss rejected" + ); + assert!( + RelativeTo::try_from_str_with_provider( + "1970-01-01T00:00+00:44:30.123456789[+00:45]", + provider + ) + .is_err(), + "Rounding not accepted between ISO offset and timezone" + ); + } +} diff --git a/deps/temporal/src/parsed_intermediates.rs b/deps/temporal/src/parsed_intermediates.rs new file mode 100644 index 00000000000000..c4ff2cc0d98fd4 --- /dev/null +++ b/deps/temporal/src/parsed_intermediates.rs @@ -0,0 +1,210 @@ +//! Parsed intermediate types +//! +//! These are types which have been *parsed* from an IXDTF string, extracting +//! calendar/time zone/etc information, but have not yet been validated. +//! +//! They are primarily useful for clients implementing the Temporal specification +//! since the specification performs observable operations +//! between the parse and validate steps. + +use crate::error::ErrorMessage; +use crate::error::TemporalError; +use crate::iso::IsoTime; +use crate::parsers; +use crate::provider::TimeZoneProvider; +use crate::Calendar; +use crate::TemporalResult; +use crate::TemporalUnwrap; +use crate::TimeZone; +use crate::UtcOffset; +use icu_calendar::AnyCalendarKind; +use ixdtf::records::DateRecord; +use ixdtf::records::UtcOffsetRecordOrZ; + +fn extract_kind(calendar: Option<&[u8]>) -> TemporalResult { + Ok(calendar + .map(Calendar::try_kind_from_utf8) + .transpose()? + .unwrap_or(AnyCalendarKind::Iso)) +} + +/// A parsed-but-not-validated date +#[derive(Copy, Clone, Debug)] +pub struct ParsedDate { + pub(crate) record: DateRecord, + pub(crate) calendar: AnyCalendarKind, +} + +impl ParsedDate { + /// Converts a UTF-8 encoded string into a `ParsedDate`. + pub fn from_utf8(s: &[u8]) -> TemporalResult { + let parse_record = parsers::parse_date_time(s)?; + + let calendar = extract_kind(parse_record.calendar)?; + + // Assertion: PlainDate must exist on a DateTime parse. + let record = parse_record.date.temporal_unwrap()?; + + Ok(Self { record, calendar }) + } + /// Converts a UTF-8 encoded YearMonth string into a `ParsedDate`. + pub fn year_month_from_utf8(s: &[u8]) -> TemporalResult { + let parse_record = parsers::parse_year_month(s)?; + + let calendar = extract_kind(parse_record.calendar)?; + + // Assertion: PlainDate must exist on a DateTime parse. + let record = parse_record.date.temporal_unwrap()?; + + Ok(Self { record, calendar }) + } + /// Converts a UTF-8 encoded MonthDay string into a `ParsedDate`. + pub fn month_day_from_utf8(s: &[u8]) -> TemporalResult { + let parse_record = parsers::parse_month_day(s)?; + + let calendar = extract_kind(parse_record.calendar)?; + + // Assertion: PlainDate must exist on a DateTime parse. + let record = parse_record.date.temporal_unwrap()?; + + Ok(Self { record, calendar }) + } +} + +/// A parsed-but-not-validated datetime +#[derive(Copy, Clone, Debug)] +pub struct ParsedDateTime { + pub(crate) date: ParsedDate, + pub(crate) time: IsoTime, +} + +impl ParsedDateTime { + /// Converts a UTF-8 encoded string into a `ParsedDateTime`. + pub fn from_utf8(s: &[u8]) -> TemporalResult { + let parse_record = parsers::parse_date_time(s)?; + + let calendar = extract_kind(parse_record.calendar)?; + + let time = parse_record + .time + .map(IsoTime::from_time_record) + .transpose()? + .unwrap_or_default(); + + let record = parse_record.date.temporal_unwrap()?; + Ok(Self { + date: ParsedDate { record, calendar }, + time, + }) + } +} + +/// A parsed-but-not-validated zoned datetime +#[derive(Clone, Debug)] +pub struct ParsedZonedDateTime { + pub(crate) date: ParsedDate, + /// None time is START-OF-DAY + pub(crate) time: Option, + /// Whether or not the string has a UTC designator (`Z`) + /// + /// Incompatible with having an offset (you can still have a offset-format timezone) + pub(crate) has_utc_designator: bool, + /// Whether or not to allow offsets rounded to the minute + /// + /// (Typically only needs to be set when parsing, can be false otherwise) + pub(crate) match_minutes: bool, + /// An optional offset string + pub(crate) offset: Option, + /// The time zone + pub(crate) timezone: TimeZone, +} + +impl ParsedZonedDateTime { + /// Converts a UTF-8 encoded string into a `ParsedZonedDateTime`, using compiled data + #[cfg(feature = "compiled_data")] + pub fn from_utf8(source: &[u8]) -> TemporalResult { + Self::from_utf8_with_provider(source, &*crate::builtins::TZ_PROVIDER) + } + + /// Converts a UTF-8 encoded string into a `ParsedZonedDateTime`. + pub fn from_utf8_with_provider( + source: &[u8], + provider: &impl TimeZoneProvider, + ) -> TemporalResult { + // Steps from the parse bits of of ToZonedDateTime + + // 3. Let matchBehaviour be match-minutes. + let mut match_minutes = true; + + // b. Let result be ? ParseISODateTime(item, « TemporalDateTimeString[+Zoned] »). + let parse_result = parsers::parse_zoned_date_time(source)?; + + // c. Let annotation be result.[[TimeZone]].[[TimeZoneAnnotation]]. + // d. Assert: annotation is not empty. + // NOTE (nekevss): `parse_zoned_date_time` guarantees that this value exists. + let annotation = parse_result.tz.temporal_unwrap()?; + + // e. Let timeZone be ? ToTemporalTimeZoneIdentifier(annotation). + let time_zone = TimeZone::from_time_zone_record(annotation.tz, provider)?; + + // f. Let offsetString be result.[[TimeZone]].[[OffsetString]]. + let (offset, has_utc_designator) = match parse_result.offset { + // g. If result.[[TimeZone]].[[Z]] is true, then + // i. Set hasUTCDesignator to true. + Some(UtcOffsetRecordOrZ::Z) => (None, true), + Some(UtcOffsetRecordOrZ::Offset(offset)) => { + if offset.second().is_some() { + // iii. If offsetParseResult contains more than one MinuteSecond Parse Node, set matchBehaviour to match-exactly. + match_minutes = false; + } + (Some(UtcOffset::from_ixdtf_record(offset)?), false) + } + None => (None, false), + }; + + // h. Let calendar be result.[[Calendar]]. + // i. If calendar is empty, set calendar to "iso8601". + // j. Set calendar to ? CanonicalizeCalendar(calendar). + let calendar = extract_kind(parse_result.calendar)?; + + let Some(date) = parse_result.date else { + return Err(TemporalError::range().with_enum(ErrorMessage::ParserNeedsDate)); + }; + + let time = parse_result + .time + .map(IsoTime::from_time_record) + .transpose()?; + + Ok(Self { + date: ParsedDate { + record: date, + calendar, + }, + time, + has_utc_designator, + match_minutes, + offset, + timezone: time_zone, + }) + } +} + +#[test] +fn test_parsed_intermediate_invalid_dates() { + // https://tc39.es/proposal-temporal/#sec-temporal-iso8601grammar-static-semantics-early-errors + // + // We need to error on invalid date/times *before* producing a ParsedFoo, since this is observable + assert!(ParsedDate::from_utf8(b"2025-02-29").is_err()); + assert!(ParsedDate::from_utf8(b"2025-02-28").is_ok()); + assert!(ParsedDate::year_month_from_utf8(b"202513").is_err()); + assert!(ParsedDate::year_month_from_utf8(b"202512").is_ok()); + assert!(ParsedDate::month_day_from_utf8(b"1000").is_err()); + assert!(ParsedDate::month_day_from_utf8(b"1001").is_ok()); + assert!(ParsedDateTime::from_utf8(b"2025-02-28T25:69:69").is_err()); + assert!(ParsedDateTime::from_utf8(b"2025-02-28T23:59:59").is_ok()); + #[cfg(feature = "compiled_data")] + assert!(ParsedZonedDateTime::from_utf8(b"2025-02-29T00:00:00Z[utc]").is_err()); + #[cfg(feature = "compiled_data")] + assert!(ParsedZonedDateTime::from_utf8(b"2025-02-28T00:00:00Z[utc]").is_ok()); +} diff --git a/deps/temporal/src/parsers.rs b/deps/temporal/src/parsers.rs new file mode 100644 index 00000000000000..43a7d778802a5b --- /dev/null +++ b/deps/temporal/src/parsers.rs @@ -0,0 +1,1025 @@ +//! This module implements Temporal Date/Time parsing functionality. + +use crate::{ + iso::{IsoDate, IsoTime}, + options::{DisplayCalendar, DisplayOffset, DisplayTimeZone}, + Sign, TemporalError, TemporalResult, +}; +use ixdtf::{ + encoding::Utf8, + parsers::IxdtfParser, + records::{Annotation, DateRecord, IxdtfParseRecord, TimeRecord, UtcOffsetRecordOrZ}, +}; +use writeable::{impl_display_with_writeable, LengthHint, Writeable}; + +mod time_zone; + +pub(crate) use time_zone::{parse_allowed_timezone_formats, parse_identifier}; + +// TODO: Move `Writeable` functionality to `ixdtf` crate + +#[derive(Debug, Default)] +pub struct IxdtfStringBuilder<'a> { + inner: FormattableIxdtf<'a>, +} + +impl<'a> IxdtfStringBuilder<'a> { + pub fn with_date(mut self, iso: IsoDate) -> Self { + self.inner.date = Some(FormattableDate(iso.year, iso.month, iso.day)); + self + } + + pub fn with_time(mut self, time: IsoTime, precision: Precision) -> Self { + let nanosecond = (time.millisecond as u32 * 1_000_000) + + (time.microsecond as u32 * 1000) + + time.nanosecond as u32; + + self.inner.time = Some(FormattableTime { + hour: time.hour, + minute: time.minute, + second: time.second, + nanosecond, + precision, + include_sep: true, + }); + self + } + + pub fn with_minute_offset( + mut self, + sign: Sign, + hour: u8, + minute: u8, + show: DisplayOffset, + ) -> Self { + let time = FormattableTime { + hour, + minute, + second: 9, + nanosecond: 0, + precision: Precision::Minute, + include_sep: true, + }; + + self.inner.utc_offset = Some(FormattableUtcOffset { + show, + offset: UtcOffset::Offset(FormattableOffset { sign, time }), + }); + self + } + + pub fn with_z(mut self, show: DisplayOffset) -> Self { + self.inner.utc_offset = Some(FormattableUtcOffset { + show, + offset: UtcOffset::Z, + }); + self + } + + pub fn with_timezone(mut self, timezone: &'a str, show: DisplayTimeZone) -> Self { + self.inner.timezone = Some(FormattableTimeZone { show, timezone }); + self + } + + pub fn with_calendar(mut self, calendar: &'static str, show: DisplayCalendar) -> Self { + self.inner.calendar = Some(FormattableCalendar { show, calendar }); + self + } + + pub fn build(self) -> alloc::string::String { + self.inner.to_string() + } +} + +impl Writeable for IxdtfStringBuilder<'_> { + fn write_to(&self, sink: &mut W) -> core::fmt::Result { + self.inner.write_to(sink) + } + + fn writeable_length_hint(&self) -> LengthHint { + self.inner.writeable_length_hint() + } +} + +#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +pub enum Precision { + #[default] + Auto, + Minute, + Digit(u8), +} + +#[derive(Debug)] +pub struct FormattableTime { + pub hour: u8, + pub minute: u8, + pub second: u8, + pub nanosecond: u32, + pub precision: Precision, + pub include_sep: bool, +} + +impl Writeable for FormattableTime { + fn write_to(&self, sink: &mut W) -> core::fmt::Result { + write_padded_u8(self.hour, sink)?; + if self.include_sep { + sink.write_char(':')?; + } + write_padded_u8(self.minute, sink)?; + if self.precision == Precision::Minute { + return Ok(()); + } + if self.include_sep { + sink.write_char(':')?; + } + write_padded_u8(self.second, sink)?; + if (self.nanosecond == 0 && self.precision == Precision::Auto) + || self.precision == Precision::Digit(0) + { + return Ok(()); + } + sink.write_char('.')?; + write_nanosecond(self.nanosecond, self.precision, sink) + } + + fn writeable_length_hint(&self) -> LengthHint { + let sep = self.include_sep as usize; + if self.precision == Precision::Minute { + return LengthHint::exact(4 + sep); + } + let time_base = 6 + (sep * 2); + if self.nanosecond == 0 || self.precision == Precision::Digit(0) { + return LengthHint::exact(time_base); + } + if let Precision::Digit(d) = self.precision { + return LengthHint::exact(time_base + 1 + d as usize); + } + LengthHint::between(time_base + 2, time_base + 10) + } +} + +#[derive(Debug)] +pub struct FormattableUtcOffset { + pub show: DisplayOffset, + pub offset: UtcOffset, +} + +#[derive(Debug)] +pub enum UtcOffset { + Z, + Offset(FormattableOffset), +} + +impl Writeable for FormattableUtcOffset { + fn write_to(&self, sink: &mut W) -> core::fmt::Result { + if self.show == DisplayOffset::Never { + return Ok(()); + } + match &self.offset { + UtcOffset::Z => sink.write_char('Z'), + UtcOffset::Offset(offset) => offset.write_to(sink), + } + } + + fn writeable_length_hint(&self) -> LengthHint { + match &self.offset { + UtcOffset::Z => LengthHint::exact(1), + UtcOffset::Offset(o) => o.writeable_length_hint(), + } + } +} + +fn write_padded_u8(num: u8, sink: &mut W) -> core::fmt::Result { + if num < 10 { + sink.write_char('0')?; + } + num.write_to(sink) +} + +fn write_nanosecond( + nanoseconds: u32, + precision: Precision, + sink: &mut W, +) -> core::fmt::Result { + let (digits, index) = u32_to_digits(nanoseconds); + let precision = match precision { + Precision::Digit(digit) if digit <= 9 => digit as usize, + _ => index, + }; + write_digit_slice_to_precision(digits, 0, precision, sink) +} + +pub fn u32_to_digits(mut value: u32) -> ([u8; 9], usize) { + let mut output = [0; 9]; + let mut precision = 0; + for (i, out) in output.iter_mut().enumerate().rev() { + let v = (value % 10) as u8; + value /= 10; + if precision == 0 && v != 0 { + // i is 0-indexed, but we want a 1-indexed precision + precision = i + 1; + } + *out = v; + } + + (output, precision) +} + +pub fn write_digit_slice_to_precision( + digits: [u8; 9], + base: usize, + precision: usize, + sink: &mut W, +) -> core::fmt::Result { + for digit in digits.iter().take(precision).skip(base) { + digit.write_to(sink)?; + } + Ok(()) +} + +#[derive(Debug)] +pub struct FormattableOffset { + pub sign: Sign, + pub time: FormattableTime, +} + +impl Writeable for FormattableOffset { + fn write_to(&self, sink: &mut W) -> core::fmt::Result { + match self.sign { + Sign::Negative => sink.write_char('-')?, + _ => sink.write_char('+')?, + } + self.time.write_to(sink) + } + + fn writeable_length_hint(&self) -> LengthHint { + self.time.writeable_length_hint() + 1 + } +} + +impl_display_with_writeable!(FormattableIxdtf<'_>); +impl_display_with_writeable!(FormattableMonthDay<'_>); +impl_display_with_writeable!(FormattableYearMonth<'_>); +impl_display_with_writeable!(FormattableDuration); +impl_display_with_writeable!(FormattableDate); +impl_display_with_writeable!(FormattableTime); +impl_display_with_writeable!(FormattableUtcOffset); +impl_display_with_writeable!(FormattableOffset); +impl_display_with_writeable!(FormattableTimeZone<'_>); +impl_display_with_writeable!(FormattableCalendar<'_>); + +#[derive(Debug)] +pub struct FormattableDate(pub i32, pub u8, pub u8); + +impl Writeable for FormattableDate { + fn write_to(&self, sink: &mut W) -> core::fmt::Result { + write_year(self.0, sink)?; + sink.write_char('-')?; + write_padded_u8(self.1, sink)?; + sink.write_char('-')?; + write_padded_u8(self.2, sink) + } + + fn writeable_length_hint(&self) -> LengthHint { + let year_length = if (0..=9999).contains(&self.0) { 4 } else { 7 }; + + LengthHint::exact(6 + year_length) + } +} + +fn write_year(year: i32, sink: &mut W) -> core::fmt::Result { + if (0..=9999).contains(&year) { + write_four_digit_year(year, sink) + } else { + write_extended_year(year, sink) + } +} + +fn write_four_digit_year( + mut y: i32, + sink: &mut W, +) -> core::fmt::Result { + (y / 1_000).write_to(sink)?; + y %= 1_000; + (y / 100).write_to(sink)?; + y %= 100; + (y / 10).write_to(sink)?; + y %= 10; + y.write_to(sink) +} + +fn write_extended_year(y: i32, sink: &mut W) -> core::fmt::Result { + let sign = if y < 0 { '-' } else { '+' }; + sink.write_char(sign)?; + let (digits, _) = u32_to_digits(y.unsigned_abs()); + // SAFETY: digits slice is made up up valid ASCII digits. + write_digit_slice_to_precision(digits, 3, 9, sink) +} + +#[derive(Debug)] +pub struct FormattableTimeZone<'a> { + pub show: DisplayTimeZone, + pub timezone: &'a str, +} + +impl Writeable for FormattableTimeZone<'_> { + fn write_to(&self, sink: &mut W) -> core::fmt::Result { + if self.show == DisplayTimeZone::Never { + return Ok(()); + } + sink.write_char('[')?; + if self.show == DisplayTimeZone::Critical { + sink.write_char('!')?; + } + sink.write_str(self.timezone)?; + sink.write_char(']') + } + + fn writeable_length_hint(&self) -> writeable::LengthHint { + if self.show == DisplayTimeZone::Never { + return LengthHint::exact(0); + } + let critical = (self.show == DisplayTimeZone::Critical) as usize; + LengthHint::exact(2 + critical + self.timezone.len()) + } +} + +#[derive(Debug)] +pub struct FormattableCalendar<'a> { + pub show: DisplayCalendar, + pub calendar: &'a str, +} + +impl Writeable for FormattableCalendar<'_> { + fn write_to(&self, sink: &mut W) -> core::fmt::Result { + if self.show == DisplayCalendar::Never + || self.show == DisplayCalendar::Auto && self.calendar == "iso8601" + { + return Ok(()); + } + sink.write_char('[')?; + if self.show == DisplayCalendar::Critical { + sink.write_char('!')?; + } + sink.write_str("u-ca=")?; + sink.write_str(self.calendar)?; + sink.write_char(']') + } + + fn writeable_length_hint(&self) -> LengthHint { + if self.show == DisplayCalendar::Never + || self.show == DisplayCalendar::Auto && self.calendar == "iso8601" + { + return LengthHint::exact(0); + } + let critical = (self.show == DisplayCalendar::Critical) as usize; + LengthHint::exact(7 + critical + self.calendar.len()) + } +} + +#[derive(Debug)] +pub struct FormattableMonthDay<'a> { + pub date: FormattableDate, + pub calendar: FormattableCalendar<'a>, +} + +impl Writeable for FormattableMonthDay<'_> { + fn write_to(&self, sink: &mut W) -> core::fmt::Result { + if self.calendar.show == DisplayCalendar::Always + || self.calendar.show == DisplayCalendar::Critical + || self.calendar.calendar != "iso8601" + { + write_year(self.date.0, sink)?; + sink.write_char('-')?; + } + write_padded_u8(self.date.1, sink)?; + sink.write_char('-')?; + write_padded_u8(self.date.2, sink)?; + self.calendar.write_to(sink) + } + + fn writeable_length_hint(&self) -> LengthHint { + let base_length = self.calendar.writeable_length_hint() + LengthHint::exact(5); + if self.calendar.show == DisplayCalendar::Always + || self.calendar.show == DisplayCalendar::Critical + || self.calendar.calendar != "iso8601" + { + let year_length = if (0..=9999).contains(&self.date.0) { + 4 + } else { + 7 + }; + return base_length + LengthHint::exact(year_length); + } + base_length + } +} + +#[derive(Debug)] +pub struct FormattableYearMonth<'a> { + pub date: FormattableDate, + pub calendar: FormattableCalendar<'a>, +} + +impl Writeable for FormattableYearMonth<'_> { + fn write_to(&self, sink: &mut W) -> core::fmt::Result { + write_year(self.date.0, sink)?; + sink.write_char('-')?; + write_padded_u8(self.date.1, sink)?; + if self.calendar.show == DisplayCalendar::Always + || self.calendar.show == DisplayCalendar::Critical + || self.calendar.calendar != "iso8601" + { + sink.write_char('-')?; + write_padded_u8(self.date.2, sink)?; + } + + self.calendar.write_to(sink) + } + + fn writeable_length_hint(&self) -> LengthHint { + let year_length = if (0..=9999).contains(&self.date.0) { + 4 + } else { + 7 + }; + let base_length = + self.calendar.writeable_length_hint() + LengthHint::exact(year_length + 3); + if self.calendar.show == DisplayCalendar::Always + || self.calendar.show == DisplayCalendar::Critical + || self.calendar.calendar != "iso8601" + { + return base_length + LengthHint::exact(3); + } + base_length + } +} + +#[derive(Debug, Default)] +pub struct FormattableIxdtf<'a> { + pub date: Option, + pub time: Option, + pub utc_offset: Option, + pub timezone: Option>, + pub calendar: Option>, +} + +impl Writeable for FormattableIxdtf<'_> { + fn write_to(&self, sink: &mut W) -> core::fmt::Result { + if let Some(date) = &self.date { + date.write_to(sink)?; + } + if let Some(time) = &self.time { + if self.date.is_some() { + sink.write_char('T')?; + } + time.write_to(sink)?; + } + if let Some(offset) = &self.utc_offset { + offset.write_to(sink)?; + } + if let Some(timezone) = &self.timezone { + timezone.write_to(sink)?; + } + if let Some(calendar) = &self.calendar { + calendar.write_to(sink)?; + } + + Ok(()) + } + + fn writeable_length_hint(&self) -> LengthHint { + let date_length = self + .date + .as_ref() + .map(|d| d.writeable_length_hint()) + .unwrap_or(LengthHint::exact(0)); + let time_length = self + .time + .as_ref() + .map(|t| { + let t_present = self.date.is_some() as usize; + t.writeable_length_hint() + t_present + }) + .unwrap_or(LengthHint::exact(0)); + let utc_length = self + .utc_offset + .as_ref() + .map(|utc| utc.writeable_length_hint()) + .unwrap_or(LengthHint::exact(0)); + let timezone_length = self + .timezone + .as_ref() + .map(|tz| tz.writeable_length_hint()) + .unwrap_or(LengthHint::exact(0)); + let cal_length = self + .calendar + .as_ref() + .map(|cal| cal.writeable_length_hint()) + .unwrap_or(LengthHint::exact(0)); + + date_length + time_length + utc_length + timezone_length + cal_length + } +} + +#[derive(Debug, Clone, Copy)] +pub struct FormattableDateDuration { + pub years: u32, + pub months: u32, + pub weeks: u32, + pub days: u64, +} + +#[derive(Debug, Clone, Copy)] +pub enum FormattableTimeDuration { + Hours(u64, Option), + Minutes(u64, u64, Option), + Seconds(u64, u64, u64, Option), +} + +pub struct FormattableDuration { + pub precision: Precision, + pub sign: Sign, + pub date: Option, + pub time: Option, +} + +impl Writeable for FormattableDuration { + fn write_to(&self, sink: &mut W) -> core::fmt::Result { + if self.sign == Sign::Negative { + sink.write_char('-')?; + } + sink.write_char('P')?; + if let Some(date) = self.date { + checked_write_u32_with_suffix(date.years, 'Y', sink)?; + checked_write_u32_with_suffix(date.months, 'M', sink)?; + checked_write_u32_with_suffix(date.weeks, 'W', sink)?; + checked_write_u64_with_suffix(date.days, 'D', sink)?; + } + if let Some(time) = self.time { + match time { + FormattableTimeDuration::Hours(hours, fraction) => { + let ns = fraction.unwrap_or(0); + if hours + u64::from(ns) != 0 { + sink.write_char('T')?; + } + if hours == 0 { + return Ok(()); + } + hours.write_to(sink)?; + if ns != 0 { + sink.write_char('.')?; + ns.write_to(sink)?; + } + sink.write_char('H')?; + } + FormattableTimeDuration::Minutes(hours, minutes, fraction) => { + let ns = fraction.unwrap_or(0); + if hours + minutes + u64::from(ns) != 0 { + sink.write_char('T')?; + } + checked_write_u64_with_suffix(hours, 'H', sink)?; + if minutes == 0 { + return Ok(()); + } + minutes.write_to(sink)?; + if ns != 0 { + sink.write_char('.')?; + ns.write_to(sink)?; + } + sink.write_char('M')?; + } + FormattableTimeDuration::Seconds(hours, minutes, seconds, fraction) => { + let ns = fraction.unwrap_or(0); + let unit_below_minute = self.date.is_none() && hours == 0 && minutes == 0; + + let write_second = seconds != 0 + || unit_below_minute + || matches!(self.precision, Precision::Digit(_)); + + if hours != 0 || minutes != 0 || write_second { + sink.write_char('T')?; + } + + checked_write_u64_with_suffix(hours, 'H', sink)?; + checked_write_u64_with_suffix(minutes, 'M', sink)?; + if write_second { + seconds.write_to(sink)?; + if self.precision == Precision::Digit(0) + || (self.precision == Precision::Auto && ns == 0) + { + sink.write_char('S')?; + return Ok(()); + } + sink.write_char('.')?; + write_nanosecond(ns, self.precision, sink)?; + sink.write_char('S')?; + } + } + } + } + Ok(()) + } +} + +fn checked_write_u32_with_suffix( + val: u32, + suffix: char, + sink: &mut W, +) -> core::fmt::Result { + if val == 0 { + return Ok(()); + } + val.write_to(sink)?; + sink.write_char(suffix) +} + +fn checked_write_u64_with_suffix( + val: u64, + suffix: char, + sink: &mut W, +) -> core::fmt::Result { + if val == 0 { + return Ok(()); + } + val.write_to(sink)?; + sink.write_char(suffix) +} + +// TODO: Determine if these should be separate structs, i.e. TemporalDateTimeParser/TemporalInstantParser, or +// maybe on global `TemporalParser` around `IxdtfParser` that handles the Temporal idiosyncracies. +#[derive(PartialEq)] +enum ParseVariant { + YearMonth, + MonthDay, + DateTime, + Time, +} + +#[inline] +fn parse_ixdtf(source: &[u8], variant: ParseVariant) -> TemporalResult> { + fn cast_handler<'a>( + _: &mut IxdtfParser<'a, Utf8>, + handler: impl FnMut(Annotation<'a, Utf8>) -> Option>, + ) -> impl FnMut(Annotation<'a, Utf8>) -> Option> { + handler + } + + let mut first_calendar: Option> = None; + let mut critical_duplicate_calendar = false; + let mut parser = IxdtfParser::from_utf8(source); + + let handler = cast_handler(&mut parser, |annotation: Annotation| { + if annotation.key == "u-ca".as_bytes() { + match first_calendar { + Some(ref cal) => { + if cal.critical || annotation.critical { + critical_duplicate_calendar = true + } + } + None => first_calendar = Some(annotation), + } + return None; + } + + // Make the parser handle any unknown annotation. + Some(annotation) + }); + + let mut record = match variant { + ParseVariant::YearMonth => parser.parse_year_month_with_annotation_handler(handler), + ParseVariant::MonthDay => parser.parse_month_day_with_annotation_handler(handler), + ParseVariant::DateTime => parser.parse_with_annotation_handler(handler), + ParseVariant::Time => parser.parse_time_with_annotation_handler(handler), + }?; + + record.calendar = first_calendar.map(|v| v.value); + + // Note: this method only handles the specific AnnotatedFoo nonterminals; + // so if we are parsing MonthDay/YearMonth we will never have a DateDay/DateYear parse node. + // + // 3. If goal is TemporalYearMonthString, and parseResult does not contain a DateDay Parse Node, then + // a. If calendar is not empty, and the ASCII-lowercase of calendar is not "iso8601", throw a RangeError exception. + // 4. If goal is TemporalMonthDayString and parseResult does not contain a DateYear Parse Node, then + // a. If calendar is not empty, and the ASCII-lowercase of calendar is not "iso8601", throw a RangeError exception. + // b. Set yearAbsent to true. + if variant == ParseVariant::MonthDay || variant == ParseVariant::YearMonth { + if let Some(cal) = record.calendar { + if !cal.eq_ignore_ascii_case(b"iso8601") { + return Err(TemporalError::range() + .with_message("YearMonth/MonthDay formats only allowed for ISO calendar.")); + } + } + } + + if critical_duplicate_calendar { + // TODO: Add tests for the below. + // Parser handles non-matching calendar, so the value thrown here should only be duplicates. + return Err(TemporalError::range() + .with_message("Duplicate calendar value with critical flag found.")); + } + + // Validate that the DateRecord exists. + if variant != ParseVariant::Time && record.date.is_none() { + return Err( + TemporalError::range().with_message("DateTime strings must contain a Date value.") + ); + } + + // Temporal requires parsed dates to be checked for validity at parse time + // https://tc39.es/proposal-temporal/#sec-temporal-iso8601grammar-static-semantics-early-errors + // https://tc39.es/proposal-temporal/#sec-temporal-iso8601grammar-static-semantics-isvaliddate + // https://tc39.es/proposal-temporal/#sec-temporal-iso8601grammar-static-semantics-isvalidmonthday + if let Some(date) = record.date { + // ixdtf currently returns always-valid reference years/days + // in these cases (year = 0, day = 1), but we should set our own + // for robustness. + let year = if variant == ParseVariant::MonthDay { + 1972 + } else { + date.year + }; + let day = if variant == ParseVariant::YearMonth { + 1 + } else { + date.day + }; + if !crate::iso::is_valid_date(year, date.month, day) { + return Err(TemporalError::range() + .with_message("DateTime strings must contain a valid ISO date.")); + } + } + + Ok(record) +} + +/// A utility function for parsing a `DateTime` string +#[inline] +pub(crate) fn parse_date_time(source: &[u8]) -> TemporalResult> { + let record = parse_ixdtf(source, ParseVariant::DateTime)?; + + if record.offset == Some(UtcOffsetRecordOrZ::Z) { + return Err(TemporalError::range() + .with_message("UTC designator is not valid for DateTime parsing.")); + } + + Ok(record) +} + +#[inline] +pub(crate) fn parse_zoned_date_time(source: &[u8]) -> TemporalResult> { + let record = parse_ixdtf(source, ParseVariant::DateTime)?; + + // TODO: Support rejecting subminute precision in time zone annootations + if record.tz.is_none() { + return Err(TemporalError::range() + .with_message("Time zone annotation is required for parsing a zoned date time.")); + } + + Ok(record) +} + +pub(crate) struct IxdtfParseInstantRecord { + pub(crate) date: DateRecord, + pub(crate) time: TimeRecord, + pub(crate) offset: UtcOffsetRecordOrZ, +} + +/// A utility function for parsing an `Instant` string +#[inline] +pub(crate) fn parse_instant(source: &[u8]) -> TemporalResult { + let record = parse_ixdtf(source, ParseVariant::DateTime)?; + + let IxdtfParseRecord { + date: Some(date), + time: Some(time), + offset: Some(offset), + .. + } = record + else { + return Err( + TemporalError::range().with_message("Required fields missing from Instant string.") + ); + }; + + Ok(IxdtfParseInstantRecord { date, time, offset }) +} + +// Ensure that the record does not have an offset element. +// +// This handles the [~Zoned] in TemporalFooString productions +fn check_offset(record: IxdtfParseRecord<'_, Utf8>) -> TemporalResult> { + if record.offset == Some(UtcOffsetRecordOrZ::Z) { + return Err(TemporalError::range() + .with_message("UTC designator is not valid for plain date/time parsing.")); + } + Ok(record) +} + +/// A utility function for parsing a `YearMonth` string +#[inline] +pub(crate) fn parse_year_month(source: &[u8]) -> TemporalResult> { + let ym_record = parse_ixdtf(source, ParseVariant::YearMonth); + + let Err(e) = ym_record else { + return ym_record.and_then(check_offset); + }; + + let dt_parse = parse_date_time(source); + + match dt_parse { + Ok(dt) => check_offset(dt), + // Format and return the error from parsing YearMonth. + _ => Err(e), + } +} + +/// A utilty function for parsing a `MonthDay` String. +pub(crate) fn parse_month_day(source: &[u8]) -> TemporalResult> { + let md_record = parse_ixdtf(source, ParseVariant::MonthDay); + let Err(e) = md_record else { + return md_record.and_then(check_offset); + }; + + let dt_parse = parse_date_time(source); + + match dt_parse { + Ok(dt) => check_offset(dt), + // Format and return the error from parsing MonthDay. + _ => Err(e), + } +} + +// Ensures that an IxdtfParseRecord was parsed with [~Zoned][+TimeRequired] +fn check_time_record(record: IxdtfParseRecord) -> TemporalResult { + // Handle [~Zoned] + let record = check_offset(record)?; + // Handle [+TimeRequired] + let Some(time) = record.time else { + return Err(TemporalError::range() + .with_message("PlainTime can only be parsed from strings with a time component.")); + }; + Ok(time) +} + +#[inline] +pub(crate) fn parse_time(source: &[u8]) -> TemporalResult { + let time_record = parse_ixdtf(source, ParseVariant::Time); + + let Err(e) = time_record else { + return time_record.and_then(check_time_record); + }; + + let dt_parse = parse_date_time(source); + + match dt_parse { + Ok(dt) => check_time_record(dt), + // Format and return the error from parsing MonthDay. + _ => Err(e), + } +} + +/// Consider this API to be unstable: it is used internally by temporal_capi but +/// will likely be replaced with a proper TemporalParser API at some point. +#[inline] +pub fn parse_allowed_calendar_formats(s: &[u8]) -> Option<&[u8]> { + if let Ok(r) = parse_ixdtf(s, ParseVariant::DateTime).map(|r| r.calendar) { + return Some(r.unwrap_or(&[])); + } else if let Ok(r) = IxdtfParser::from_utf8(s).parse_time().map(|r| r.calendar) { + return Some(r.unwrap_or(&[])); + } else if let Ok(r) = parse_ixdtf(s, ParseVariant::YearMonth).map(|r| r.calendar) { + return Some(r.unwrap_or(&[])); + } else if let Ok(r) = parse_ixdtf(s, ParseVariant::MonthDay).map(|r| r.calendar) { + return Some(r.unwrap_or(&[])); + } + None +} + +// TODO: ParseTimeZoneString, ParseZonedDateTimeString + +#[cfg(test)] +mod tests { + use super::{FormattableDate, FormattableOffset}; + use crate::parsers::{FormattableTime, Precision}; + use alloc::format; + use writeable::assert_writeable_eq; + + #[test] + fn offset_string() { + let offset = FormattableOffset { + sign: crate::Sign::Positive, + time: FormattableTime { + hour: 4, + minute: 0, + second: 0, + nanosecond: 0, + precision: Precision::Minute, + include_sep: true, + }, + }; + assert_writeable_eq!(offset, "+04:00"); + + let offset = FormattableOffset { + sign: crate::Sign::Negative, + time: FormattableTime { + hour: 5, + minute: 0, + second: 30, + nanosecond: 0, + precision: Precision::Minute, + include_sep: true, + }, + }; + assert_writeable_eq!(offset, "-05:00"); + + let offset = FormattableOffset { + sign: crate::Sign::Negative, + time: FormattableTime { + hour: 5, + minute: 0, + second: 30, + nanosecond: 0, + precision: Precision::Auto, + include_sep: true, + }, + }; + assert_writeable_eq!(offset, "-05:00:30"); + + let offset = FormattableOffset { + sign: crate::Sign::Negative, + time: FormattableTime { + hour: 5, + minute: 0, + second: 00, + nanosecond: 123050000, + precision: Precision::Auto, + include_sep: true, + }, + }; + assert_writeable_eq!(offset, "-05:00:00.12305"); + } + + #[test] + fn time_to_precision() { + let time = FormattableTime { + hour: 5, + minute: 0, + second: 00, + nanosecond: 123050000, + precision: Precision::Digit(8), + include_sep: true, + }; + assert_writeable_eq!(time, "05:00:00.12305000"); + + let time = FormattableTime { + hour: 5, + minute: 0, + second: 00, + nanosecond: 123050002, + precision: Precision::Digit(9), + include_sep: true, + }; + assert_writeable_eq!(time, "05:00:00.123050002"); + + let time = FormattableTime { + hour: 5, + minute: 0, + second: 00, + nanosecond: 123050000, + precision: Precision::Digit(1), + include_sep: true, + }; + assert_writeable_eq!(time, "05:00:00.1"); + + let time = FormattableTime { + hour: 5, + minute: 0, + second: 00, + nanosecond: 123050000, + precision: Precision::Digit(0), + include_sep: true, + }; + assert_writeable_eq!(time, "05:00:00"); + } + + #[test] + fn date_string() { + let date = FormattableDate(2024, 12, 8); + assert_writeable_eq!(date, "2024-12-08"); + + let date = FormattableDate(987654, 12, 8); + assert_writeable_eq!(date, "+987654-12-08"); + + let date = FormattableDate(-987654, 12, 8); + assert_writeable_eq!(date, "-987654-12-08"); + + let date = FormattableDate(0, 12, 8); + assert_writeable_eq!(date, "0000-12-08"); + + let date = FormattableDate(10_000, 12, 8); + assert_writeable_eq!(date, "+010000-12-08"); + + let date = FormattableDate(-10_000, 12, 8); + assert_writeable_eq!(date, "-010000-12-08"); + } +} diff --git a/deps/temporal/src/parsers/time_zone.rs b/deps/temporal/src/parsers/time_zone.rs new file mode 100644 index 00000000000000..51b9d10c434161 --- /dev/null +++ b/deps/temporal/src/parsers/time_zone.rs @@ -0,0 +1,66 @@ +use ixdtf::{ + encoding::Utf8, + parsers::{IxdtfParser, TimeZoneParser}, + records::{TimeZoneRecord, UtcOffsetRecord, UtcOffsetRecordOrZ}, +}; + +use crate::provider::TimeZoneProvider; +use crate::{builtins::time_zone::UtcOffset, TemporalError, TemporalResult, TimeZone}; + +use super::{parse_ixdtf, ParseVariant}; + +#[inline] +pub(crate) fn parse_allowed_timezone_formats( + s: &str, + provider: &impl TimeZoneProvider, +) -> Option { + let (offset, annotation) = if let Ok((offset, annotation)) = + parse_ixdtf(s.as_bytes(), ParseVariant::DateTime).map(|r| (r.offset, r.tz)) + { + (offset, annotation) + } else if let Ok((offset, annotation)) = IxdtfParser::from_str(s) + .parse_time() + .map(|r| (r.offset, r.tz)) + { + (offset, annotation) + } else if let Ok((offset, annotation)) = + parse_ixdtf(s.as_bytes(), ParseVariant::YearMonth).map(|r| (r.offset, r.tz)) + { + (offset, annotation) + } else if let Ok((offset, annotation)) = + parse_ixdtf(s.as_bytes(), ParseVariant::MonthDay).map(|r| (r.offset, r.tz)) + { + (offset, annotation) + } else { + return None; + }; + + if let Some(annotation) = annotation { + return TimeZone::from_time_zone_record(annotation.tz, provider).ok(); + }; + + if let Some(offset) = offset { + match offset { + UtcOffsetRecordOrZ::Z => return Some(TimeZone::utc_with_provider(provider)), + UtcOffsetRecordOrZ::Offset(offset) => { + let offset = match offset { + UtcOffsetRecord::MinutePrecision(offset) => offset, + _ => return None, + }; + return Some(TimeZone::UtcOffset(UtcOffset::from_ixdtf_minute_record( + offset, + ))); + } + } + } + + None +} + +#[inline] +pub(crate) fn parse_identifier(source: &str) -> TemporalResult> { + let mut parser = TimeZoneParser::from_str(source); + parser.parse_identifier().or(Err( + TemporalError::range().with_message("Invalid TimeZone Identifier") + )) +} diff --git a/deps/temporal/src/primitive.rs b/deps/temporal/src/primitive.rs new file mode 100644 index 00000000000000..bc7cfe302379df --- /dev/null +++ b/deps/temporal/src/primitive.rs @@ -0,0 +1,378 @@ +//! Implementation of the FiniteF64 primitive + +use core::cmp::Ordering; + +use crate::{error::ErrorMessage, TemporalError, TemporalResult}; +use num_traits::float::FloatCore; +use num_traits::{AsPrimitive, FromPrimitive, PrimInt}; + +#[derive(Debug, Default, Clone, Copy, PartialEq, PartialOrd)] +pub struct FiniteF64(pub(crate) f64); + +impl core::fmt::Display for FiniteF64 { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + f.write_fmt(format_args!("{}", self.0)) + } +} + +impl FiniteF64 { + #[inline] + pub fn as_inner(&self) -> f64 { + self.0 + } + + #[inline] + pub fn is_zero(&self) -> bool { + self.0 == 0.0 + } + + #[inline] + pub fn negate(&self) -> Self { + if !self.is_zero() { + Self(-self.0) + } else { + *self + } + } + + #[inline] + pub fn abs(&self) -> Self { + Self(self.0.abs()) + } + + #[inline] + pub fn checked_add(&self, other: &Self) -> TemporalResult { + let result = Self(self.0 + other.0); + if !result.0.is_finite() { + return Err(TemporalError::range().with_enum(ErrorMessage::NumberNotFinite)); + } + Ok(result) + } + + #[inline] + pub fn checked_mul_add(&self, a: FiniteF64, b: FiniteF64) -> TemporalResult { + let result = Self(core_maths::CoreFloat::mul_add(self.0, a.0, b.0)); + if !result.0.is_finite() { + return Err(TemporalError::range().with_enum(ErrorMessage::NumberNotFinite)); + } + Ok(result) + } + + #[inline] + pub fn checked_div(&self, other: &Self) -> TemporalResult { + let result = Self(self.0 / other.0); + if !result.0.is_finite() { + return Err(TemporalError::range().with_enum(ErrorMessage::NumberNotFinite)); + } + Ok(result) + } + + pub fn copysign(&self, other: f64) -> Self { + if !self.is_zero() { + Self(self.0.copysign(other)) + } else { + *self + } + } + + /// Returns an integer of type `T` if if value is integral + pub fn as_integer_if_integral>(&self) -> TemporalResult + where + f64: AsPrimitive, + { + if self.0 != FloatCore::trunc(self.0) { + return Err(TemporalError::range().with_enum(ErrorMessage::NumberNotIntegral)); + } + Ok(self.0.as_()) + } + + /// Truncate the current `FiniteF64` to an integer `T` + pub fn as_integer_with_truncation>(&self) -> T + where + f64: AsPrimitive, + { + let clamped = + num_traits::clamp(self.as_inner(), T::min_value().as_(), T::max_value().as_()); + clamped.as_() + } + + /// Truncate the current `FiniteF64` to an integer `T`, throwing an error if the value is not positive. + pub fn as_positive_integer_with_truncation>( + &self, + ) -> TemporalResult + where + f64: AsPrimitive, + i8: AsPrimitive, + { + let truncated_value = self.as_integer_with_truncation::(); + if truncated_value <= 0i8.as_() { + return Err(TemporalError::range().with_enum(ErrorMessage::NumberNotPositive)); + } + Ok(truncated_value) + } +} + +impl AsPrimitive for FiniteF64 { + fn as_(self) -> i64 { + self.0 as i64 + } +} + +impl AsPrimitive for FiniteF64 { + fn as_(self) -> i128 { + self.0 as i128 + } +} + +impl TryFrom for FiniteF64 { + type Error = TemporalError; + fn try_from(value: f64) -> Result { + if !value.is_finite() { + return Err(TemporalError::range().with_enum(ErrorMessage::NumberNotFinite)); + } + Ok(Self(value)) + } +} + +impl TryFrom for FiniteF64 { + type Error = TemporalError; + fn try_from(value: i64) -> Result { + let result = f64::from_i64(value) + .ok_or(TemporalError::range().with_enum(ErrorMessage::NumberOutOfRange))?; + Ok(Self(result)) + } +} + +impl TryFrom for FiniteF64 { + type Error = TemporalError; + fn try_from(value: u64) -> Result { + let result = f64::from_u64(value) + .ok_or(TemporalError::range().with_enum(ErrorMessage::NumberOutOfRange))?; + Ok(Self(result)) + } +} + +impl TryFrom for FiniteF64 { + type Error = TemporalError; + fn try_from(value: i128) -> Result { + let result = f64::from_i128(value) + .ok_or(TemporalError::range().with_enum(ErrorMessage::NumberOutOfRange))?; + debug_assert!(result.is_finite()); + Ok(Self(result)) + } +} + +impl TryFrom for FiniteF64 { + type Error = TemporalError; + fn try_from(value: u128) -> Result { + let result = f64::from_u128(value) + .ok_or(TemporalError::range().with_enum(ErrorMessage::NumberOutOfRange))?; + debug_assert!(result.is_finite()); + Ok(Self(result)) + } +} + +impl From for FiniteF64 { + fn from(value: i8) -> Self { + Self(f64::from(value)) + } +} + +impl From for FiniteF64 { + fn from(value: i16) -> Self { + Self(f64::from(value)) + } +} + +impl From for FiniteF64 { + fn from(value: i32) -> Self { + Self(f64::from(value)) + } +} + +impl From for FiniteF64 { + fn from(value: u8) -> Self { + Self(f64::from(value)) + } +} + +impl From for FiniteF64 { + fn from(value: u16) -> Self { + Self(f64::from(value)) + } +} + +impl From for FiniteF64 { + fn from(value: u32) -> Self { + Self(f64::from(value)) + } +} + +impl PartialEq for FiniteF64 { + fn eq(&self, other: &f64) -> bool { + self.0 == *other + } +} + +impl PartialOrd for FiniteF64 { + fn partial_cmp(&self, other: &f64) -> Option { + self.0.partial_cmp(other) + } +} + +impl Eq for FiniteF64 {} + +#[allow(clippy::derive_ord_xor_partial_ord)] +impl Ord for FiniteF64 { + fn cmp(&self, other: &Self) -> Ordering { + match self.0.partial_cmp(&other.0) { + Some(ordering) => ordering, + None => { + debug_assert!(false, "could not compare finite f64: {self} {other}"); + Ordering::Equal + } + } + } +} + +#[cfg(test)] +mod tests { + use super::FiniteF64; + + use num_traits::FromPrimitive; + + #[test] + fn finitef64_i128_limits() { + let max = f64::from_i128(i128::MAX).unwrap(); + assert_eq!(max, 170_141_183_460_469_231_731_687_303_715_884_105_727.0); + let min = f64::from_i128(i128::MIN).unwrap(); + assert_eq!(min, -170_141_183_460_469_231_731_687_303_715_884_105_728.0); + } + + #[test] + fn finitef64_u128_limits() { + let max = f64::from_u128(u128::MAX).unwrap(); + assert_eq!(max, 340_282_366_920_938_463_463_374_607_431_768_211_455.0); + let min = f64::from_u128(u128::MIN).unwrap(); + assert_eq!(min, 0.0); + } + + #[test] + fn finitef64_truncate() { + let value = 8_640_000_000_000_000i64; + let finite = FiniteF64::try_from(value).unwrap(); + + let num_usize = finite.as_integer_with_truncation::(); + #[cfg(target_pointer_width = "64")] + assert_eq!(num_usize, 8_640_000_000_000_000); + #[cfg(target_pointer_width = "32")] + assert_eq!(num_usize, usize::MAX); + let num_u8 = finite.as_integer_with_truncation::(); + assert_eq!(num_u8, u8::MAX); + let num_u16 = finite.as_integer_with_truncation::(); + assert_eq!(num_u16, u16::MAX); + let num_u32 = finite.as_integer_with_truncation::(); + assert_eq!(num_u32, u32::MAX); + let num_u64 = finite.as_integer_with_truncation::(); + assert_eq!(num_u64, 8_640_000_000_000_000); + let num_u128 = finite.as_integer_with_truncation::(); + assert_eq!(num_u128, 8_640_000_000_000_000); + + let num_isize = finite.as_integer_with_truncation::(); + #[cfg(target_pointer_width = "64")] + assert_eq!(num_isize, 8_640_000_000_000_000); + #[cfg(target_pointer_width = "32")] + assert_eq!(num_isize, isize::MAX); + let num_i8 = finite.as_integer_with_truncation::(); + assert_eq!(num_i8, i8::MAX); + let num_i16 = finite.as_integer_with_truncation::(); + assert_eq!(num_i16, i16::MAX); + let num_i32 = finite.as_integer_with_truncation::(); + assert_eq!(num_i32, i32::MAX); + let num_i64 = finite.as_integer_with_truncation::(); + assert_eq!(num_i64, 8_640_000_000_000_000); + let num_i128 = finite.as_integer_with_truncation::(); + assert_eq!(num_i128, 8_640_000_000_000_000); + } + + #[test] + fn finitef64_as_positive_integer_with_truncation_int() { + let positive = FiniteF64::from(5); + let truncated = positive + .as_positive_integer_with_truncation::() + .unwrap(); + assert_eq!(truncated, 5); + + let negative = FiniteF64::from(-4); + let truncated = negative.as_positive_integer_with_truncation::(); + assert!(truncated.is_err()); + } + + #[test] + fn finitef64_as_positive_integer_with_truncation_correct_floor() { + let floors_to_zero = FiniteF64::try_from(0.5).unwrap(); + let truncated = floors_to_zero.as_positive_integer_with_truncation::(); + assert!(truncated.is_err()); + + let floors_to_zero = FiniteF64::try_from(-0.5).unwrap(); + let truncated = floors_to_zero.as_positive_integer_with_truncation::(); + assert!(truncated.is_err()); + + let floors_to_zero = FiniteF64::try_from(0.9).unwrap(); + let truncated = floors_to_zero.as_positive_integer_with_truncation::(); + assert!(truncated.is_err()); + + let floors_to_one = FiniteF64::try_from(1.1).unwrap(); + let truncated = floors_to_one + .as_positive_integer_with_truncation::() + .unwrap(); + assert_eq!(truncated, 1); + + let floors_to_one = FiniteF64::try_from(1.9).unwrap(); + let truncated = floors_to_one + .as_positive_integer_with_truncation::() + .unwrap(); + assert_eq!(truncated, 1); + } + + #[test] + fn finitef64_truncate_correct_floor() { + let floors_to_zero = FiniteF64::try_from(0.5).unwrap(); + let truncated = floors_to_zero.as_integer_with_truncation::(); + assert_eq!(truncated, 0); + + let floors_to_zero = FiniteF64::try_from(-0.5).unwrap(); + let truncated = floors_to_zero.as_integer_with_truncation::(); + assert_eq!(truncated, 0); + + let floors_to_one = FiniteF64::try_from(-1.2).unwrap(); + let truncated = floors_to_one.as_integer_with_truncation::(); + assert_eq!(truncated, -1); + + let floors_to_one = FiniteF64::try_from(1.9).unwrap(); + let truncated = floors_to_one.as_integer_with_truncation::(); + assert_eq!(truncated, 1); + } + + #[test] + fn finitef64_integer_if_integral_returns_err() { + let test_value = FiniteF64::try_from(0.999).unwrap(); + let integer = test_value.as_integer_if_integral::(); + assert!(integer.is_err()); + + let test_value = FiniteF64::try_from(1.5).unwrap(); + let integer = test_value.as_integer_if_integral::(); + assert!(integer.is_err()); + } + + #[test] + fn finitef64_integer_if_integral_returns_int() { + let test_value = FiniteF64::from(0); + let integer = test_value.as_integer_if_integral::(); + assert_eq!(integer, Ok(0)); + + let test_value = FiniteF64::from(1); + let integer = test_value.as_integer_if_integral::(); + assert_eq!(integer, Ok(1)); + } +} diff --git a/deps/temporal/src/provider.rs b/deps/temporal/src/provider.rs new file mode 100644 index 00000000000000..2b18bbc0658b8b --- /dev/null +++ b/deps/temporal/src/provider.rs @@ -0,0 +1,9 @@ +//! The `TimeZoneProvider` trait. + +pub use timezone_provider::provider::{ + CandidateEpochNanoseconds, EpochNanosecondsAndOffset, GapEntryOffsets, NeverProvider, + ParseDirectionError, TimeZoneId, TimeZoneProvider, TransitionDirection, UtcOffsetSeconds, +}; + +#[cfg(feature = "compiled_data")] +pub use crate::builtins::TZ_PROVIDER as COMPILED_TZ_PROVIDER; diff --git a/deps/temporal/src/rounding.rs b/deps/temporal/src/rounding.rs new file mode 100644 index 00000000000000..217bc66cebf8ab --- /dev/null +++ b/deps/temporal/src/rounding.rs @@ -0,0 +1,626 @@ +//! Implementation of increment rounding functionality + +use crate::{ + options::{RoundingMode, UnsignedRoundingMode}, + TemporalResult, TemporalUnwrap, +}; + +use core::{ + cmp::Ordering, + num::NonZeroU128, + ops::{Div, Neg}, +}; + +use num_traits::float::FloatCore; +use num_traits::{ConstZero, Euclid, FromPrimitive, NumCast, Signed, ToPrimitive}; + +pub(crate) trait Roundable: + Euclid + Div + PartialOrd + Signed + FromPrimitive + ToPrimitive + NumCast + ConstZero + Copy +{ + /// Is dividend an exact multiple of divisor? + fn is_exact(dividend: Self, divisor: Self) -> bool; + /// Compare dividend/divisor with the midpoint of result_floor/result_ceil. + fn compare_remainder(dividend: Self, divisor: Self) -> Ordering; + fn is_even_cardinal(dividend: Self, divisor: Self) -> bool; + /// Return dividend/divisor rounded down (floor) + fn result_floor(dividend: Self, divisor: Self) -> i128; + /// Return dividend/divisor rounded up (ceil) + fn result_ceil(dividend: Self, divisor: Self) -> i128 { + Self::result_floor(dividend, divisor) + 1 + } +} + +#[derive(Debug, Clone, Copy, PartialEq, PartialOrd)] +pub(crate) struct IncrementRounder { + sign: bool, + dividend: T, + divisor: T, +} + +impl IncrementRounder { + #[inline] + pub(crate) fn from_signed_num(number: T, increment: NonZeroU128) -> TemporalResult { + let increment = ::from(increment.get()).temporal_unwrap()?; + Ok(Self { + sign: number >= T::ZERO, + dividend: number, + divisor: increment, + }) + } +} + +impl IncrementRounder { + #[inline] + /// https://tc39.es/proposal-temporal/#sec-temporal-roundnumbertoincrement + pub fn round(&self, mode: RoundingMode) -> i128 { + let unsigned_rounding_mode = mode.get_unsigned_round_mode(self.sign); + + let dividend = if self.sign { + self.dividend + } else { + -self.dividend + }; + + let mut rounded = + apply_unsigned_rounding_mode(dividend, self.divisor, unsigned_rounding_mode); + if !self.sign { + rounded = rounded.neg(); + } + // TODO: Add unit tests for the below + let divisor = ::from(self.divisor); + debug_assert!(divisor.is_some(), "increment is representable by a u64"); + rounded.saturating_mul(divisor.unwrap_or_default()) + } + #[inline] + /// https://tc39.es/proposal-temporal/#sec-temporal-roundnumbertoincrementasifpositive + pub fn round_as_if_positive(&self, mode: RoundingMode) -> i128 { + // 2. Let unsignedRoundingMode be GetUnsignedRoundingMode(roundingMode, positive). + let unsigned_rounding_mode = mode.get_unsigned_round_mode(true); + + // 5. Let rounded be ApplyUnsignedRoundingMode(quotient, r1, r2, unsignedRoundingMode). + let rounded = + apply_unsigned_rounding_mode(self.dividend, self.divisor, unsigned_rounding_mode); + + // TODO: Add unit tests for the below + let divisor = ::from(self.divisor); + debug_assert!(divisor.is_some(), "increment is representable by a u64"); + rounded.saturating_mul(divisor.unwrap_or_default()) + } +} + +impl Roundable for i128 { + fn is_exact(dividend: Self, divisor: Self) -> bool { + dividend.rem_euclid(divisor) == 0 + } + + fn compare_remainder(dividend: Self, divisor: Self) -> Ordering { + let midway = divisor.div_euclid(2); + let cmp = dividend.rem_euclid(divisor).cmp(&midway); + if cmp == Ordering::Equal && divisor.rem_euclid(2) != 0 { + Ordering::Less + } else { + cmp + } + } + + fn is_even_cardinal(dividend: Self, divisor: Self) -> bool { + Roundable::result_floor(dividend, divisor).rem_euclid(2) == 0 + } + + fn result_floor(dividend: Self, divisor: Self) -> i128 { + dividend.div_euclid(divisor) + } +} + +impl Roundable for f64 { + fn is_exact(dividend: Self, divisor: Self) -> bool { + let quotient_abs = (dividend / divisor).abs(); + quotient_abs == quotient_abs.floor() + } + + fn compare_remainder(dividend: Self, divisor: Self) -> Ordering { + let quotient = dividend / divisor; + let d1 = quotient - FloatCore::floor(quotient); + let d2 = FloatCore::ceil(quotient) - quotient; + let result = d1.partial_cmp(&d2); + debug_assert!( + result.is_some(), + "Should never have non-finite floats in rounding code" + ); + result.unwrap_or(Ordering::Equal) + } + + fn is_even_cardinal(dividend: Self, divisor: Self) -> bool { + let quotient = dividend / divisor; + (FloatCore::floor(quotient) / (FloatCore::ceil(quotient) - FloatCore::floor(quotient)) + % 2.0) + == 0.0 + } + + fn result_floor(dividend: Self, divisor: Self) -> i128 { + Euclid::div_euclid(÷nd, &divisor) as i128 + } +} + +impl Roundable for i64 { + fn is_exact(dividend: Self, divisor: Self) -> bool { + dividend.rem_euclid(divisor) == 0 + } + + fn compare_remainder(dividend: Self, divisor: Self) -> Ordering { + let midway = divisor.div_euclid(2); + let cmp = dividend.rem_euclid(divisor).cmp(&midway); + if cmp == Ordering::Equal && divisor.rem_euclid(2) != 0 { + Ordering::Less + } else { + cmp + } + } + + fn is_even_cardinal(dividend: Self, divisor: Self) -> bool { + Roundable::result_floor(dividend, divisor).rem_euclid(2) == 0 + } + + fn result_floor(dividend: Self, divisor: Self) -> i128 { + dividend.div_euclid(divisor).into() + } +} + +/// Applies the unsigned rounding mode. +fn apply_unsigned_rounding_mode( + dividend: T, + divisor: T, + unsigned_rounding_mode: UnsignedRoundingMode, +) -> i128 { + // (x is dividend / divisor) + + // (from RoundNumberToIncrement, RoundNumberToIncrementAsIfPositive) + // 5. Let r1 be the largest integer such that r1 ≤ quotient. + // 6. Let r2 be the smallest integer such that r2 > quotient. + let r1 = Roundable::result_floor(dividend, divisor); + let r2 = Roundable::result_ceil(dividend, divisor); + + // is_floor + // 1. If x is equal to r1, return r1. + if Roundable::is_exact(dividend, divisor) { + return r1; + } + // 2. Assert: r1 < x < r2. + // 3. Assert: unsignedRoundingMode is not undefined. + + // 4. If unsignedRoundingMode is zero, return r1. + if unsigned_rounding_mode == UnsignedRoundingMode::Zero { + return r1; + }; + // 5. If unsignedRoundingMode is infinity, return r2. + if unsigned_rounding_mode == UnsignedRoundingMode::Infinity { + return r2; + }; + + // 6. Let d1 be x – r1. + // 7. Let d2 be r2 – x. + // 8. If d1 < d2, return r1. + // 9. If d2 < d1, return r2. + match Roundable::compare_remainder(dividend, divisor) { + Ordering::Less => r1, + Ordering::Greater => r2, + Ordering::Equal => { + // 10. Assert: d1 is equal to d2. + // 11. If unsignedRoundingMode is half-zero, return r1. + if unsigned_rounding_mode == UnsignedRoundingMode::HalfZero { + return r1; + }; + // 12. If unsignedRoundingMode is half-infinity, return r2. + if unsigned_rounding_mode == UnsignedRoundingMode::HalfInfinity { + return r2; + }; + // 13. Assert: unsignedRoundingMode is half-even. + debug_assert!(unsigned_rounding_mode == UnsignedRoundingMode::HalfEven); + // 14. Let cardinality be (r1 / (r2 – r1)) modulo 2. + // 15. If cardinality is 0, return r1. + if Roundable::is_even_cardinal(dividend, divisor) { + return r1; + } + // 16. Return r2. + r2 + } + } +} + +#[cfg(test)] +mod tests { + use core::num::NonZeroU128; + + use super::{IncrementRounder, Roundable, RoundingMode}; + use core::fmt::Debug; + + #[derive(Debug)] + struct TestCase { + x: T, + increment: u128, + ceil: i128, + floor: i128, + expand: i128, + trunc: i128, + half_ceil: i128, + half_floor: i128, + half_expand: i128, + half_trunc: i128, + half_even: i128, + } + + impl TestCase { + fn run(&self) { + let rounder = IncrementRounder::from_signed_num( + self.x, + TryFrom::try_from(self.increment).unwrap(), + ) + .unwrap(); + + assert_eq!( + self.ceil, + rounder.round(RoundingMode::Ceil), + "Rounding {:?}/{:?} with mode Ceil", + self.x, + self.increment + ); + assert_eq!( + self.floor, + rounder.round(RoundingMode::Floor), + "Rounding {:?}/{:?} with mode Floor", + self.x, + self.increment + ); + assert_eq!( + self.trunc, + rounder.round(RoundingMode::Trunc), + "Rounding {:?}/{:?} with mode Trunc", + self.x, + self.increment + ); + assert_eq!( + self.floor, + rounder.round_as_if_positive(RoundingMode::Trunc), + "Rounding (as if positive) {:?}/{:?} with mode Trunc", + self.x, + self.increment + ); + + assert_eq!( + self.half_ceil, + rounder.round(RoundingMode::HalfCeil), + "Rounding {:?}/{:?} with mode HalfCeil", + self.x, + self.increment + ); + assert_eq!( + self.half_floor, + rounder.round(RoundingMode::HalfFloor), + "Rounding {:?}/{:?} with mode HalfFloor", + self.x, + self.increment + ); + assert_eq!( + self.half_expand, + rounder.round(RoundingMode::HalfExpand), + "Rounding {:?}/{:?} with mode HalfExpand", + self.x, + self.increment + ); + assert_eq!( + self.half_trunc, + rounder.round(RoundingMode::HalfTrunc), + "Rounding {:?}/{:?} with mode HalfTrunc", + self.x, + self.increment + ); + assert_eq!( + self.half_even, + rounder.round(RoundingMode::HalfEven), + "Rounding {:?}/{:?} with mode HalfEven", + self.x, + self.increment + ); + + // Ceil and floor are the same for as_if_positive + assert_eq!( + self.ceil, + rounder.round_as_if_positive(RoundingMode::Ceil), + "Rounding (as if positive) {:?}/{:?} with mode Ceil", + self.x, + self.increment + ); + assert_eq!( + self.floor, + rounder.round_as_if_positive(RoundingMode::Floor), + "Rounding (as if positive) {:?}/{:?} with mode Floor", + self.x, + self.increment + ); + // Expand and Trunc are equivalent to Ceil and Floor for as_if_positive + assert_eq!( + self.expand, + rounder.round(RoundingMode::Expand), + "Rounding {:?}/{:?} with mode Expand", + self.x, + self.increment + ); + assert_eq!( + self.ceil, + rounder.round_as_if_positive(RoundingMode::Expand), + "Rounding (as if positive) {:?}/{:?} with mode Expand", + self.x, + self.increment + ); + // Same goes for the half ones + assert_eq!( + self.half_ceil, + rounder.round_as_if_positive(RoundingMode::HalfCeil), + "Rounding (as if positive) {:?}/{:?} with mode HalfCeil", + self.x, + self.increment + ); + assert_eq!( + self.half_floor, + rounder.round_as_if_positive(RoundingMode::HalfFloor), + "Rounding (as if positive) {:?}/{:?} with mode HalfFloor", + self.x, + self.increment + ); + assert_eq!( + self.half_ceil, + rounder.round_as_if_positive(RoundingMode::HalfExpand), + "Rounding (as if positive) {:?}/{:?} with mode HalfExpand", + self.x, + self.increment + ); + assert_eq!( + self.half_floor, + rounder.round_as_if_positive(RoundingMode::HalfTrunc), + "Rounding (as if positive) {:?}/{:?} with mode HalfTrunc", + self.x, + self.increment + ); + // HalfEven is just HalfEven + assert_eq!( + self.half_even, + rounder.round_as_if_positive(RoundingMode::HalfEven), + "Rounding (as if positive) {:?}/{:?} with mode HalfEven", + self.x, + self.increment + ); + } + } + + #[test] + fn test_basic_rounding_cases() { + const CASES: &[TestCase] = &[ + TestCase { + x: 100, + increment: 10, + ceil: 100, + floor: 100, + expand: 100, + trunc: 100, + half_ceil: 100, + half_floor: 100, + half_expand: 100, + half_trunc: 100, + half_even: 100, + }, + TestCase { + x: 101, + increment: 10, + ceil: 110, + floor: 100, + expand: 110, + trunc: 100, + half_ceil: 100, + half_floor: 100, + half_expand: 100, + half_trunc: 100, + half_even: 100, + }, + TestCase { + x: 105, + increment: 10, + ceil: 110, + floor: 100, + expand: 110, + trunc: 100, + half_ceil: 110, + half_floor: 100, + half_expand: 110, + half_trunc: 100, + half_even: 100, + }, + TestCase { + x: 107, + increment: 10, + ceil: 110, + floor: 100, + expand: 110, + trunc: 100, + half_ceil: 110, + half_floor: 110, + half_expand: 110, + half_trunc: 110, + half_even: 110, + }, + TestCase { + x: -100, + increment: 10, + ceil: -100, + floor: -100, + expand: -100, + trunc: -100, + half_ceil: -100, + half_floor: -100, + half_expand: -100, + half_trunc: -100, + half_even: -100, + }, + TestCase { + x: -101, + increment: 10, + ceil: -100, + floor: -110, + expand: -110, + trunc: -100, + half_ceil: -100, + half_floor: -100, + half_expand: -100, + half_trunc: -100, + half_even: -100, + }, + TestCase { + x: -105, + increment: 10, + ceil: -100, + floor: -110, + expand: -110, + trunc: -100, + half_ceil: -100, + half_floor: -110, + half_expand: -110, + half_trunc: -100, + half_even: -100, + }, + TestCase { + x: -107, + increment: 10, + ceil: -100, + floor: -110, + expand: -110, + trunc: -100, + half_ceil: -110, + half_floor: -110, + half_expand: -110, + half_trunc: -110, + half_even: -110, + }, + // More negative number tests + TestCase { + x: -9i128, + increment: 2, + ceil: -8, + floor: -10, + expand: -10, + trunc: -8, + half_ceil: -8, + half_floor: -10, + half_expand: -10, + half_trunc: -8, + half_even: -8, + }, + TestCase { + x: -14i128, + increment: 3, + ceil: -12, + floor: -15, + expand: -15, + trunc: -12, + half_ceil: -15, + half_floor: -15, + half_expand: -15, + half_trunc: -15, + half_even: -15, + }, + ]; + + for case in CASES { + case.run(); + + TestCase { + x: case.x as f64, + increment: case.increment, + ceil: case.ceil, + floor: case.floor, + expand: case.expand, + trunc: case.trunc, + half_ceil: case.half_ceil, + half_floor: case.half_floor, + half_expand: case.half_expand, + half_trunc: case.half_trunc, + half_even: case.half_even, + } + .run(); + + TestCase { + x: case.x as i64, + increment: case.increment, + ceil: case.ceil, + floor: case.floor, + expand: case.expand, + trunc: case.trunc, + half_ceil: case.half_ceil, + half_floor: case.half_floor, + half_expand: case.half_expand, + half_trunc: case.half_trunc, + half_even: case.half_even, + } + .run(); + } + } + + #[test] + fn test_float_rounding_cases() { + const CASES: &[TestCase] = &[ + TestCase { + x: -8.5f64, + increment: 1, + ceil: -8, + floor: -9, + expand: -9, + trunc: -8, + half_ceil: -8, + half_floor: -9, + half_expand: -9, + half_trunc: -8, + half_even: -8, + }, + TestCase { + x: -8.5f64, + increment: 2, + ceil: -8, + floor: -10, + expand: -10, + trunc: -8, + half_ceil: -8, + half_floor: -8, + half_expand: -8, + half_trunc: -8, + half_even: -8, + }, + TestCase { + x: -9.5f64, + increment: 2, + ceil: -8, + floor: -10, + expand: -10, + trunc: -8, + half_ceil: -10, + half_floor: -10, + half_expand: -10, + half_trunc: -10, + half_even: -10, + }, + ]; + + for case in CASES { + case.run() + } + } + + #[test] + fn dt_since_basic_rounding() { + let result = IncrementRounder::::from_signed_num( + -84082624864197532, + NonZeroU128::new(1800000000000).unwrap(), + ) + .unwrap() + .round(RoundingMode::HalfExpand); + + assert_eq!(result, -84083400000000000); + } +} diff --git a/deps/temporal/src/sys.rs b/deps/temporal/src/sys.rs new file mode 100644 index 00000000000000..a530dc88358fcc --- /dev/null +++ b/deps/temporal/src/sys.rs @@ -0,0 +1,79 @@ +use crate::builtins::Now; +use crate::host::HostClock; +use crate::host::HostHooks; +use crate::host::HostTimeZone; +use crate::TemporalResult; + +use crate::unix_time::EpochNanoseconds; +use crate::TemporalError; +use crate::TimeZone; +#[cfg(feature = "sys")] +use timezone_provider::provider::TimeZoneProvider; +use web_time::{SystemTime, UNIX_EPOCH}; + +// TODO: Look into and potentially implement a `SystemTime` struct allows +// providing closures or trait implementations that can then +// be used to construct [`Now`]. Basically `Temporal` but with +// traits or closures. +// +// Temporal could then be something like: +// +// pub struct Temporal(SystemTime) +// + +/// The Temporal object for accessing current system time +#[cfg(feature = "sys")] +pub struct Temporal; + +#[cfg(feature = "sys")] +impl Temporal { + /// Get a `Now` object for the default host system. + pub fn now() -> Now { + Now::new(DefaultHostSystem) + } +} + +/// A default host system implementation +/// +/// This implementation is backed by [`SystemTime`] and [`iana_time_zone`] +#[cfg(feature = "sys")] +pub struct DefaultHostSystem; + +#[cfg(feature = "sys")] +impl HostHooks for DefaultHostSystem {} + +#[cfg(feature = "sys")] +impl HostClock for DefaultHostSystem { + fn get_host_epoch_nanoseconds(&self) -> TemporalResult { + get_system_nanoseconds() + } +} + +#[cfg(feature = "sys")] +impl HostTimeZone for DefaultHostSystem { + fn get_host_time_zone( + &self, + provider: &impl timezone_provider::provider::TimeZoneProvider, + ) -> TemporalResult { + get_system_timezone(provider) + } +} + +#[cfg(feature = "sys")] +#[inline] +pub(crate) fn get_system_timezone(provider: &impl TimeZoneProvider) -> TemporalResult { + iana_time_zone::get_timezone() + .map(|s| TimeZone::try_from_identifier_str_with_provider(&s, provider)) + .map_err(|_| TemporalError::general("Error fetching system time"))? +} + +/// Returns the system time in nanoseconds. +#[cfg(feature = "sys")] +pub(crate) fn get_system_nanoseconds() -> TemporalResult { + use crate::unix_time::EpochNanoseconds; + + SystemTime::now() + .duration_since(UNIX_EPOCH) + .map_err(|_| TemporalError::general("Error fetching system time")) + .map(|d| EpochNanoseconds::from(d.as_nanos() as i128)) +} diff --git a/deps/temporal/src/tzdb.rs b/deps/temporal/src/tzdb.rs new file mode 100644 index 00000000000000..4f2026381fdb91 --- /dev/null +++ b/deps/temporal/src/tzdb.rs @@ -0,0 +1,68 @@ +// We can clean these imports up eventually + +#[cfg(feature = "compiled_data")] +#[cfg(test)] +pub use timezone_provider::tzif::CompiledTzdbProvider; +#[cfg(test)] +pub use timezone_provider::tzif::FsTzdbProvider; + +#[cfg(test)] +mod tests { + use crate::{ + builtins::calendar::CalendarFields, partial::PartialZonedDateTime, TimeZone, ZonedDateTime, + }; + + use super::FsTzdbProvider; + + #[test] + fn canonical_time_zone() { + let provider = FsTzdbProvider::default(); + let valid_iana_identifiers = [ + ("AFRICA/Bissau", "Africa/Bissau", "-01:00"), + ("America/Belem", "America/Belem", "-03:00"), + ("Europe/Vienna", "Europe/Vienna", "+01:00"), + ("America/New_York", "America/New_York", "-05:00"), + ("Africa/CAIRO", "Africa/Cairo", "+02:00"), + ("Asia/Ulan_Bator", "Asia/Ulan_Bator", "+07:00"), + ("GMT", "GMT", "+00:00"), + ("etc/gmt", "Etc/GMT", "+00:00"), + ( + "1994-11-05T08:15:30-05:00[America/New_York]", + "America/New_York", + "-05:00", + ), + ( + "1994-11-05T08:15:30-05[America/Chicago]", + "America/Chicago", + "-06:00", + ), + ("EuROpe/DUBLIn", "Europe/Dublin", "+01:00"), + ]; + + for (valid_iana_identifier, canonical, offset) in valid_iana_identifiers { + let time_zone = + TimeZone::try_from_str_with_provider(valid_iana_identifier, &provider).unwrap(); + + assert_eq!( + time_zone.identifier_with_provider(&provider).unwrap(), + canonical + ); + let result = ZonedDateTime::from_partial_with_provider( + PartialZonedDateTime::default() + .with_calendar_fields( + CalendarFields::new() + .with_year(1970) + .with_month(1) + .with_day(1), + ) + .with_timezone(Some(time_zone)), + None, + None, + None, + &provider, + ) + .unwrap(); + assert_eq!(result.offset(), offset); + } + } +} diff --git a/deps/temporal/src/utils.rs b/deps/temporal/src/utils.rs new file mode 100644 index 00000000000000..bb85c67cc99515 --- /dev/null +++ b/deps/temporal/src/utils.rs @@ -0,0 +1,16 @@ +//! Utility date and time equations for Temporal + +pub(crate) use timezone_provider::utils::epoch_days_from_gregorian_date; + +// NOTE: Potentially add more of tests. + +// ==== Begin Date Equations ==== + +pub(crate) const MS_PER_HOUR: i64 = 3_600_000; +pub(crate) const MS_PER_MINUTE: i64 = 60_000; + +pub(crate) use timezone_provider::utils::{ + epoch_days_to_epoch_ms, iso_days_in_month, ymd_from_epoch_milliseconds, +}; + +// ==== End Calendar Equations ==== diff --git a/deps/temporal/temporal_capi/.gitattributes b/deps/temporal/temporal_capi/.gitattributes new file mode 100644 index 00000000000000..49065d790bda1e --- /dev/null +++ b/deps/temporal/temporal_capi/.gitattributes @@ -0,0 +1 @@ +bindings/** linguist-generated=true diff --git a/deps/temporal/temporal_capi/.gitignore b/deps/temporal/temporal_capi/.gitignore new file mode 100644 index 00000000000000..fa929750c2d889 --- /dev/null +++ b/deps/temporal/temporal_capi/.gitignore @@ -0,0 +1 @@ +*.out \ No newline at end of file diff --git a/deps/temporal/temporal_capi/Cargo.toml b/deps/temporal/temporal_capi/Cargo.toml new file mode 100644 index 00000000000000..c6201edbf1137d --- /dev/null +++ b/deps/temporal/temporal_capi/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "temporal_capi" +description = "C interface to temporal_rs" +edition.workspace = true +version.workspace = true +rust-version.workspace = true +authors.workspace = true +license.workspace = true +repository.workspace = true +include = [ + "bindings/**/*", + "src/**/*", + "tests/**/*", + "Cargo.toml", + "LICENSE-Apache", + "LICENSE-MIT", + "README.md", +] + +[dependencies] +diplomat.workspace = true +diplomat-runtime.workspace = true +num-traits.workspace = true +temporal_rs = { workspace = true, default-features = false } +timezone_provider = { workspace = true, default-features = false } +icu_calendar = { version = "2.0.2", default-features = false } +icu_locale = { version = "2.0.0" } +writeable = "0.6.1" +zoneinfo64 = { workspace = true, optional = true } + +[features] +compiled_data = ["temporal_rs/compiled_data"] +zoneinfo64 = ["dep:zoneinfo64", "timezone_provider/zoneinfo64"] + +[package.metadata.docs.rs] +all-features = true diff --git a/deps/temporal/temporal_capi/LICENSE-Apache b/deps/temporal/temporal_capi/LICENSE-Apache new file mode 100644 index 00000000000000..551045b58932a5 --- /dev/null +++ b/deps/temporal/temporal_capi/LICENSE-Apache @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2024 Boa + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/deps/temporal/temporal_capi/LICENSE-MIT b/deps/temporal/temporal_capi/LICENSE-MIT new file mode 100644 index 00000000000000..d5624ad0c1fb69 --- /dev/null +++ b/deps/temporal/temporal_capi/LICENSE-MIT @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Boa + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/deps/temporal/temporal_capi/README.md b/deps/temporal/temporal_capi/README.md new file mode 100644 index 00000000000000..284b0e2e1ab274 --- /dev/null +++ b/deps/temporal/temporal_capi/README.md @@ -0,0 +1,14 @@ +# temporal_capi [![crates.io](https://img.shields.io/crates/v/temporal_capi)](https://crates.io/crates/temporal_capi) + + + +This crate contains the original definitions of [`temporal_rs`] APIs consumed by [Diplomat](https://github.com/rust-diplomat/diplomat) +to generate FFI bindings. We currently generate bindings for C++ and `extern "C"` APIs. + +The APIs exposed by this crate are *not intended to be used from Rust* and as such this crate may change its Rust API +across compatible semver versions. In contrast, the `extern "C"` APIs and all the language bindings are stable within +the same major semver version. + +[`temporal_rs`]: http://crates.io/crates/temporal_rs + + diff --git a/deps/temporal/temporal_capi/bindings/c/AnyCalendarKind.d.h b/deps/temporal/temporal_capi/bindings/c/AnyCalendarKind.d.h new file mode 100644 index 00000000000000..44bed28e18cb5a --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/AnyCalendarKind.d.h @@ -0,0 +1,39 @@ +#ifndef AnyCalendarKind_D_H +#define AnyCalendarKind_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + + + + +typedef enum AnyCalendarKind { + AnyCalendarKind_Buddhist = 0, + AnyCalendarKind_Chinese = 1, + AnyCalendarKind_Coptic = 2, + AnyCalendarKind_Dangi = 3, + AnyCalendarKind_Ethiopian = 4, + AnyCalendarKind_EthiopianAmeteAlem = 5, + AnyCalendarKind_Gregorian = 6, + AnyCalendarKind_Hebrew = 7, + AnyCalendarKind_Indian = 8, + AnyCalendarKind_HijriTabularTypeIIFriday = 9, + AnyCalendarKind_HijriSimulatedMecca = 10, + AnyCalendarKind_HijriTabularTypeIIThursday = 11, + AnyCalendarKind_HijriUmmAlQura = 12, + AnyCalendarKind_Iso = 13, + AnyCalendarKind_Japanese = 14, + AnyCalendarKind_JapaneseExtended = 15, + AnyCalendarKind_Persian = 16, + AnyCalendarKind_Roc = 17, +} AnyCalendarKind; + +typedef struct AnyCalendarKind_option {union { AnyCalendarKind ok; }; bool is_ok; } AnyCalendarKind_option; + + + +#endif // AnyCalendarKind_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/AnyCalendarKind.h b/deps/temporal/temporal_capi/bindings/c/AnyCalendarKind.h new file mode 100644 index 00000000000000..7422307c618a61 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/AnyCalendarKind.h @@ -0,0 +1,28 @@ +#ifndef AnyCalendarKind_H +#define AnyCalendarKind_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + +#include "AnyCalendarKind.d.h" + + + + + + +typedef struct temporal_rs_AnyCalendarKind_get_for_str_result {union {AnyCalendarKind ok; }; bool is_ok;} temporal_rs_AnyCalendarKind_get_for_str_result; +temporal_rs_AnyCalendarKind_get_for_str_result temporal_rs_AnyCalendarKind_get_for_str(DiplomatStringView s); + +typedef struct temporal_rs_AnyCalendarKind_parse_temporal_calendar_string_result {union {AnyCalendarKind ok; }; bool is_ok;} temporal_rs_AnyCalendarKind_parse_temporal_calendar_string_result; +temporal_rs_AnyCalendarKind_parse_temporal_calendar_string_result temporal_rs_AnyCalendarKind_parse_temporal_calendar_string(DiplomatStringView s); + + + + + +#endif // AnyCalendarKind_H diff --git a/deps/temporal/temporal_capi/bindings/c/ArithmeticOverflow.d.h b/deps/temporal/temporal_capi/bindings/c/ArithmeticOverflow.d.h new file mode 100644 index 00000000000000..47d8f551a2bac7 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/ArithmeticOverflow.d.h @@ -0,0 +1,23 @@ +#ifndef ArithmeticOverflow_D_H +#define ArithmeticOverflow_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + + + + +typedef enum ArithmeticOverflow { + ArithmeticOverflow_Constrain = 0, + ArithmeticOverflow_Reject = 1, +} ArithmeticOverflow; + +typedef struct ArithmeticOverflow_option {union { ArithmeticOverflow ok; }; bool is_ok; } ArithmeticOverflow_option; + + + +#endif // ArithmeticOverflow_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/ArithmeticOverflow.h b/deps/temporal/temporal_capi/bindings/c/ArithmeticOverflow.h new file mode 100644 index 00000000000000..4406c69ff59356 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/ArithmeticOverflow.h @@ -0,0 +1,22 @@ +#ifndef ArithmeticOverflow_H +#define ArithmeticOverflow_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + +#include "ArithmeticOverflow.d.h" + + + + + + + + + + +#endif // ArithmeticOverflow_H diff --git a/deps/temporal/temporal_capi/bindings/c/Calendar.d.h b/deps/temporal/temporal_capi/bindings/c/Calendar.d.h new file mode 100644 index 00000000000000..d748ff0cb9d933 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/Calendar.d.h @@ -0,0 +1,19 @@ +#ifndef Calendar_D_H +#define Calendar_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + + + + +typedef struct Calendar Calendar; + + + + +#endif // Calendar_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/Calendar.h b/deps/temporal/temporal_capi/bindings/c/Calendar.h new file mode 100644 index 00000000000000..6393eac71a49a3 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/Calendar.h @@ -0,0 +1,37 @@ +#ifndef Calendar_H +#define Calendar_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + +#include "AnyCalendarKind.d.h" +#include "TemporalError.d.h" + +#include "Calendar.d.h" + + + + + + +Calendar* temporal_rs_Calendar_try_new_constrain(AnyCalendarKind kind); + +typedef struct temporal_rs_Calendar_from_utf8_result {union {Calendar* ok; TemporalError err;}; bool is_ok;} temporal_rs_Calendar_from_utf8_result; +temporal_rs_Calendar_from_utf8_result temporal_rs_Calendar_from_utf8(DiplomatStringView s); + +bool temporal_rs_Calendar_is_iso(const Calendar* self); + +DiplomatStringView temporal_rs_Calendar_identifier(const Calendar* self); + +AnyCalendarKind temporal_rs_Calendar_kind(const Calendar* self); + +void temporal_rs_Calendar_destroy(Calendar* self); + + + + + +#endif // Calendar_H diff --git a/deps/temporal/temporal_capi/bindings/c/DateDuration.d.h b/deps/temporal/temporal_capi/bindings/c/DateDuration.d.h new file mode 100644 index 00000000000000..b92c029df696b7 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/DateDuration.d.h @@ -0,0 +1,19 @@ +#ifndef DateDuration_D_H +#define DateDuration_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + + + + +typedef struct DateDuration DateDuration; + + + + +#endif // DateDuration_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/DateDuration.h b/deps/temporal/temporal_capi/bindings/c/DateDuration.h new file mode 100644 index 00000000000000..56b8aadcab7b8e --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/DateDuration.h @@ -0,0 +1,35 @@ +#ifndef DateDuration_H +#define DateDuration_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + +#include "Sign.d.h" +#include "TemporalError.d.h" + +#include "DateDuration.d.h" + + + + + + +typedef struct temporal_rs_DateDuration_try_new_result {union {DateDuration* ok; TemporalError err;}; bool is_ok;} temporal_rs_DateDuration_try_new_result; +temporal_rs_DateDuration_try_new_result temporal_rs_DateDuration_try_new(int64_t years, int64_t months, int64_t weeks, int64_t days); + +DateDuration* temporal_rs_DateDuration_abs(const DateDuration* self); + +DateDuration* temporal_rs_DateDuration_negated(const DateDuration* self); + +Sign temporal_rs_DateDuration_sign(const DateDuration* self); + +void temporal_rs_DateDuration_destroy(DateDuration* self); + + + + + +#endif // DateDuration_H diff --git a/deps/temporal/temporal_capi/bindings/c/DifferenceSettings.d.h b/deps/temporal/temporal_capi/bindings/c/DifferenceSettings.d.h new file mode 100644 index 00000000000000..f738a609387a2b --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/DifferenceSettings.d.h @@ -0,0 +1,27 @@ +#ifndef DifferenceSettings_D_H +#define DifferenceSettings_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + +#include "RoundingMode.d.h" +#include "Unit.d.h" + + + + +typedef struct DifferenceSettings { + Unit_option largest_unit; + Unit_option smallest_unit; + RoundingMode_option rounding_mode; + OptionU32 increment; +} DifferenceSettings; + +typedef struct DifferenceSettings_option {union { DifferenceSettings ok; }; bool is_ok; } DifferenceSettings_option; + + + +#endif // DifferenceSettings_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/DifferenceSettings.h b/deps/temporal/temporal_capi/bindings/c/DifferenceSettings.h new file mode 100644 index 00000000000000..c43fa6b9d84658 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/DifferenceSettings.h @@ -0,0 +1,22 @@ +#ifndef DifferenceSettings_H +#define DifferenceSettings_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + +#include "DifferenceSettings.d.h" + + + + + + + + + + +#endif // DifferenceSettings_H diff --git a/deps/temporal/temporal_capi/bindings/c/Disambiguation.d.h b/deps/temporal/temporal_capi/bindings/c/Disambiguation.d.h new file mode 100644 index 00000000000000..cfe99859b04344 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/Disambiguation.d.h @@ -0,0 +1,25 @@ +#ifndef Disambiguation_D_H +#define Disambiguation_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + + + + +typedef enum Disambiguation { + Disambiguation_Compatible = 0, + Disambiguation_Earlier = 1, + Disambiguation_Later = 2, + Disambiguation_Reject = 3, +} Disambiguation; + +typedef struct Disambiguation_option {union { Disambiguation ok; }; bool is_ok; } Disambiguation_option; + + + +#endif // Disambiguation_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/Disambiguation.h b/deps/temporal/temporal_capi/bindings/c/Disambiguation.h new file mode 100644 index 00000000000000..f4aeaa7d58e29d --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/Disambiguation.h @@ -0,0 +1,22 @@ +#ifndef Disambiguation_H +#define Disambiguation_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + +#include "Disambiguation.d.h" + + + + + + + + + + +#endif // Disambiguation_H diff --git a/deps/temporal/temporal_capi/bindings/c/DisplayCalendar.d.h b/deps/temporal/temporal_capi/bindings/c/DisplayCalendar.d.h new file mode 100644 index 00000000000000..5aca25e6db57d4 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/DisplayCalendar.d.h @@ -0,0 +1,25 @@ +#ifndef DisplayCalendar_D_H +#define DisplayCalendar_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + + + + +typedef enum DisplayCalendar { + DisplayCalendar_Auto = 0, + DisplayCalendar_Always = 1, + DisplayCalendar_Never = 2, + DisplayCalendar_Critical = 3, +} DisplayCalendar; + +typedef struct DisplayCalendar_option {union { DisplayCalendar ok; }; bool is_ok; } DisplayCalendar_option; + + + +#endif // DisplayCalendar_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/DisplayCalendar.h b/deps/temporal/temporal_capi/bindings/c/DisplayCalendar.h new file mode 100644 index 00000000000000..1d80f822b2f213 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/DisplayCalendar.h @@ -0,0 +1,22 @@ +#ifndef DisplayCalendar_H +#define DisplayCalendar_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + +#include "DisplayCalendar.d.h" + + + + + + + + + + +#endif // DisplayCalendar_H diff --git a/deps/temporal/temporal_capi/bindings/c/DisplayOffset.d.h b/deps/temporal/temporal_capi/bindings/c/DisplayOffset.d.h new file mode 100644 index 00000000000000..668e20d36e4c3d --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/DisplayOffset.d.h @@ -0,0 +1,23 @@ +#ifndef DisplayOffset_D_H +#define DisplayOffset_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + + + + +typedef enum DisplayOffset { + DisplayOffset_Auto = 0, + DisplayOffset_Never = 1, +} DisplayOffset; + +typedef struct DisplayOffset_option {union { DisplayOffset ok; }; bool is_ok; } DisplayOffset_option; + + + +#endif // DisplayOffset_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/DisplayOffset.h b/deps/temporal/temporal_capi/bindings/c/DisplayOffset.h new file mode 100644 index 00000000000000..e59ccac16c725d --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/DisplayOffset.h @@ -0,0 +1,22 @@ +#ifndef DisplayOffset_H +#define DisplayOffset_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + +#include "DisplayOffset.d.h" + + + + + + + + + + +#endif // DisplayOffset_H diff --git a/deps/temporal/temporal_capi/bindings/c/DisplayTimeZone.d.h b/deps/temporal/temporal_capi/bindings/c/DisplayTimeZone.d.h new file mode 100644 index 00000000000000..f9b743749abedb --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/DisplayTimeZone.d.h @@ -0,0 +1,24 @@ +#ifndef DisplayTimeZone_D_H +#define DisplayTimeZone_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + + + + +typedef enum DisplayTimeZone { + DisplayTimeZone_Auto = 0, + DisplayTimeZone_Never = 1, + DisplayTimeZone_Critical = 2, +} DisplayTimeZone; + +typedef struct DisplayTimeZone_option {union { DisplayTimeZone ok; }; bool is_ok; } DisplayTimeZone_option; + + + +#endif // DisplayTimeZone_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/DisplayTimeZone.h b/deps/temporal/temporal_capi/bindings/c/DisplayTimeZone.h new file mode 100644 index 00000000000000..736cd05c44d302 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/DisplayTimeZone.h @@ -0,0 +1,22 @@ +#ifndef DisplayTimeZone_H +#define DisplayTimeZone_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + +#include "DisplayTimeZone.d.h" + + + + + + + + + + +#endif // DisplayTimeZone_H diff --git a/deps/temporal/temporal_capi/bindings/c/Duration.d.h b/deps/temporal/temporal_capi/bindings/c/Duration.d.h new file mode 100644 index 00000000000000..b44d572600b98a --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/Duration.d.h @@ -0,0 +1,19 @@ +#ifndef Duration_D_H +#define Duration_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + + + + +typedef struct Duration Duration; + + + + +#endif // Duration_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/Duration.h b/deps/temporal/temporal_capi/bindings/c/Duration.h new file mode 100644 index 00000000000000..08ef9952ccdf70 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/Duration.h @@ -0,0 +1,106 @@ +#ifndef Duration_H +#define Duration_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + +#include "PartialDuration.d.h" +#include "Provider.d.h" +#include "RelativeTo.d.h" +#include "RoundingOptions.d.h" +#include "Sign.d.h" +#include "TemporalError.d.h" +#include "ToStringRoundingOptions.d.h" +#include "Unit.d.h" + +#include "Duration.d.h" + + + + + + +typedef struct temporal_rs_Duration_create_result {union {Duration* ok; TemporalError err;}; bool is_ok;} temporal_rs_Duration_create_result; +temporal_rs_Duration_create_result temporal_rs_Duration_create(int64_t years, int64_t months, int64_t weeks, int64_t days, int64_t hours, int64_t minutes, int64_t seconds, int64_t milliseconds, double microseconds, double nanoseconds); + +typedef struct temporal_rs_Duration_try_new_result {union {Duration* ok; TemporalError err;}; bool is_ok;} temporal_rs_Duration_try_new_result; +temporal_rs_Duration_try_new_result temporal_rs_Duration_try_new(int64_t years, int64_t months, int64_t weeks, int64_t days, int64_t hours, int64_t minutes, int64_t seconds, int64_t milliseconds, double microseconds, double nanoseconds); + +typedef struct temporal_rs_Duration_from_partial_duration_result {union {Duration* ok; TemporalError err;}; bool is_ok;} temporal_rs_Duration_from_partial_duration_result; +temporal_rs_Duration_from_partial_duration_result temporal_rs_Duration_from_partial_duration(PartialDuration partial); + +typedef struct temporal_rs_Duration_from_utf8_result {union {Duration* ok; TemporalError err;}; bool is_ok;} temporal_rs_Duration_from_utf8_result; +temporal_rs_Duration_from_utf8_result temporal_rs_Duration_from_utf8(DiplomatStringView s); + +typedef struct temporal_rs_Duration_from_utf16_result {union {Duration* ok; TemporalError err;}; bool is_ok;} temporal_rs_Duration_from_utf16_result; +temporal_rs_Duration_from_utf16_result temporal_rs_Duration_from_utf16(DiplomatString16View s); + +bool temporal_rs_Duration_is_time_within_range(const Duration* self); + +int64_t temporal_rs_Duration_years(const Duration* self); + +int64_t temporal_rs_Duration_months(const Duration* self); + +int64_t temporal_rs_Duration_weeks(const Duration* self); + +int64_t temporal_rs_Duration_days(const Duration* self); + +int64_t temporal_rs_Duration_hours(const Duration* self); + +int64_t temporal_rs_Duration_minutes(const Duration* self); + +int64_t temporal_rs_Duration_seconds(const Duration* self); + +int64_t temporal_rs_Duration_milliseconds(const Duration* self); + +double temporal_rs_Duration_microseconds(const Duration* self); + +double temporal_rs_Duration_nanoseconds(const Duration* self); + +Sign temporal_rs_Duration_sign(const Duration* self); + +bool temporal_rs_Duration_is_zero(const Duration* self); + +Duration* temporal_rs_Duration_abs(const Duration* self); + +Duration* temporal_rs_Duration_negated(const Duration* self); + +typedef struct temporal_rs_Duration_add_result {union {Duration* ok; TemporalError err;}; bool is_ok;} temporal_rs_Duration_add_result; +temporal_rs_Duration_add_result temporal_rs_Duration_add(const Duration* self, const Duration* other); + +typedef struct temporal_rs_Duration_subtract_result {union {Duration* ok; TemporalError err;}; bool is_ok;} temporal_rs_Duration_subtract_result; +temporal_rs_Duration_subtract_result temporal_rs_Duration_subtract(const Duration* self, const Duration* other); + +typedef struct temporal_rs_Duration_to_string_result {union { TemporalError err;}; bool is_ok;} temporal_rs_Duration_to_string_result; +temporal_rs_Duration_to_string_result temporal_rs_Duration_to_string(const Duration* self, ToStringRoundingOptions options, DiplomatWrite* write); + +typedef struct temporal_rs_Duration_round_result {union {Duration* ok; TemporalError err;}; bool is_ok;} temporal_rs_Duration_round_result; +temporal_rs_Duration_round_result temporal_rs_Duration_round(const Duration* self, RoundingOptions options, RelativeTo relative_to); + +typedef struct temporal_rs_Duration_round_with_provider_result {union {Duration* ok; TemporalError err;}; bool is_ok;} temporal_rs_Duration_round_with_provider_result; +temporal_rs_Duration_round_with_provider_result temporal_rs_Duration_round_with_provider(const Duration* self, RoundingOptions options, RelativeTo relative_to, const Provider* p); + +typedef struct temporal_rs_Duration_compare_result {union {int8_t ok; TemporalError err;}; bool is_ok;} temporal_rs_Duration_compare_result; +temporal_rs_Duration_compare_result temporal_rs_Duration_compare(const Duration* self, const Duration* other, RelativeTo relative_to); + +typedef struct temporal_rs_Duration_compare_with_provider_result {union {int8_t ok; TemporalError err;}; bool is_ok;} temporal_rs_Duration_compare_with_provider_result; +temporal_rs_Duration_compare_with_provider_result temporal_rs_Duration_compare_with_provider(const Duration* self, const Duration* other, RelativeTo relative_to, const Provider* p); + +typedef struct temporal_rs_Duration_total_result {union {double ok; TemporalError err;}; bool is_ok;} temporal_rs_Duration_total_result; +temporal_rs_Duration_total_result temporal_rs_Duration_total(const Duration* self, Unit unit, RelativeTo relative_to); + +typedef struct temporal_rs_Duration_total_with_provider_result {union {double ok; TemporalError err;}; bool is_ok;} temporal_rs_Duration_total_with_provider_result; +temporal_rs_Duration_total_with_provider_result temporal_rs_Duration_total_with_provider(const Duration* self, Unit unit, RelativeTo relative_to, const Provider* p); + +Duration* temporal_rs_Duration_clone(const Duration* self); + +void temporal_rs_Duration_destroy(Duration* self); + + + + + +#endif // Duration_H diff --git a/deps/temporal/temporal_capi/bindings/c/ErrorKind.d.h b/deps/temporal/temporal_capi/bindings/c/ErrorKind.d.h new file mode 100644 index 00000000000000..94619441568b57 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/ErrorKind.d.h @@ -0,0 +1,26 @@ +#ifndef ErrorKind_D_H +#define ErrorKind_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + + + + +typedef enum ErrorKind { + ErrorKind_Generic = 0, + ErrorKind_Type = 1, + ErrorKind_Range = 2, + ErrorKind_Syntax = 3, + ErrorKind_Assert = 4, +} ErrorKind; + +typedef struct ErrorKind_option {union { ErrorKind ok; }; bool is_ok; } ErrorKind_option; + + + +#endif // ErrorKind_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/ErrorKind.h b/deps/temporal/temporal_capi/bindings/c/ErrorKind.h new file mode 100644 index 00000000000000..113613977f13ba --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/ErrorKind.h @@ -0,0 +1,22 @@ +#ifndef ErrorKind_H +#define ErrorKind_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + +#include "ErrorKind.d.h" + + + + + + + + + + +#endif // ErrorKind_H diff --git a/deps/temporal/temporal_capi/bindings/c/I128Nanoseconds.d.h b/deps/temporal/temporal_capi/bindings/c/I128Nanoseconds.d.h new file mode 100644 index 00000000000000..268a534e550948 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/I128Nanoseconds.d.h @@ -0,0 +1,23 @@ +#ifndef I128Nanoseconds_D_H +#define I128Nanoseconds_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + + + + +typedef struct I128Nanoseconds { + uint64_t high; + uint64_t low; +} I128Nanoseconds; + +typedef struct I128Nanoseconds_option {union { I128Nanoseconds ok; }; bool is_ok; } I128Nanoseconds_option; + + + +#endif // I128Nanoseconds_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/I128Nanoseconds.h b/deps/temporal/temporal_capi/bindings/c/I128Nanoseconds.h new file mode 100644 index 00000000000000..b026864d65f2f2 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/I128Nanoseconds.h @@ -0,0 +1,24 @@ +#ifndef I128Nanoseconds_H +#define I128Nanoseconds_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + +#include "I128Nanoseconds.d.h" + + + + + + +bool temporal_rs_I128Nanoseconds_is_valid(I128Nanoseconds self); + + + + + +#endif // I128Nanoseconds_H diff --git a/deps/temporal/temporal_capi/bindings/c/Instant.d.h b/deps/temporal/temporal_capi/bindings/c/Instant.d.h new file mode 100644 index 00000000000000..77d95421e5f17e --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/Instant.d.h @@ -0,0 +1,19 @@ +#ifndef Instant_D_H +#define Instant_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + + + + +typedef struct Instant Instant; + + + + +#endif // Instant_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/Instant.h b/deps/temporal/temporal_capi/bindings/c/Instant.h new file mode 100644 index 00000000000000..3f82c47c2dd207 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/Instant.h @@ -0,0 +1,82 @@ +#ifndef Instant_H +#define Instant_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + +#include "DifferenceSettings.d.h" +#include "Duration.d.h" +#include "I128Nanoseconds.d.h" +#include "Provider.d.h" +#include "RoundingOptions.d.h" +#include "TemporalError.d.h" +#include "TimeZone.d.h" +#include "ToStringRoundingOptions.d.h" +#include "ZonedDateTime.d.h" + +#include "Instant.d.h" + + + + + + +typedef struct temporal_rs_Instant_try_new_result {union {Instant* ok; TemporalError err;}; bool is_ok;} temporal_rs_Instant_try_new_result; +temporal_rs_Instant_try_new_result temporal_rs_Instant_try_new(I128Nanoseconds ns); + +typedef struct temporal_rs_Instant_from_epoch_milliseconds_result {union {Instant* ok; TemporalError err;}; bool is_ok;} temporal_rs_Instant_from_epoch_milliseconds_result; +temporal_rs_Instant_from_epoch_milliseconds_result temporal_rs_Instant_from_epoch_milliseconds(int64_t epoch_milliseconds); + +typedef struct temporal_rs_Instant_from_utf8_result {union {Instant* ok; TemporalError err;}; bool is_ok;} temporal_rs_Instant_from_utf8_result; +temporal_rs_Instant_from_utf8_result temporal_rs_Instant_from_utf8(DiplomatStringView s); + +typedef struct temporal_rs_Instant_from_utf16_result {union {Instant* ok; TemporalError err;}; bool is_ok;} temporal_rs_Instant_from_utf16_result; +temporal_rs_Instant_from_utf16_result temporal_rs_Instant_from_utf16(DiplomatString16View s); + +typedef struct temporal_rs_Instant_add_result {union {Instant* ok; TemporalError err;}; bool is_ok;} temporal_rs_Instant_add_result; +temporal_rs_Instant_add_result temporal_rs_Instant_add(const Instant* self, const Duration* duration); + +typedef struct temporal_rs_Instant_subtract_result {union {Instant* ok; TemporalError err;}; bool is_ok;} temporal_rs_Instant_subtract_result; +temporal_rs_Instant_subtract_result temporal_rs_Instant_subtract(const Instant* self, const Duration* duration); + +typedef struct temporal_rs_Instant_since_result {union {Duration* ok; TemporalError err;}; bool is_ok;} temporal_rs_Instant_since_result; +temporal_rs_Instant_since_result temporal_rs_Instant_since(const Instant* self, const Instant* other, DifferenceSettings settings); + +typedef struct temporal_rs_Instant_until_result {union {Duration* ok; TemporalError err;}; bool is_ok;} temporal_rs_Instant_until_result; +temporal_rs_Instant_until_result temporal_rs_Instant_until(const Instant* self, const Instant* other, DifferenceSettings settings); + +typedef struct temporal_rs_Instant_round_result {union {Instant* ok; TemporalError err;}; bool is_ok;} temporal_rs_Instant_round_result; +temporal_rs_Instant_round_result temporal_rs_Instant_round(const Instant* self, RoundingOptions options); + +int8_t temporal_rs_Instant_compare(const Instant* self, const Instant* other); + +bool temporal_rs_Instant_equals(const Instant* self, const Instant* other); + +int64_t temporal_rs_Instant_epoch_milliseconds(const Instant* self); + +I128Nanoseconds temporal_rs_Instant_epoch_nanoseconds(const Instant* self); + +typedef struct temporal_rs_Instant_to_ixdtf_string_with_compiled_data_result {union { TemporalError err;}; bool is_ok;} temporal_rs_Instant_to_ixdtf_string_with_compiled_data_result; +temporal_rs_Instant_to_ixdtf_string_with_compiled_data_result temporal_rs_Instant_to_ixdtf_string_with_compiled_data(const Instant* self, TimeZone_option zone, ToStringRoundingOptions options, DiplomatWrite* write); + +typedef struct temporal_rs_Instant_to_ixdtf_string_with_provider_result {union { TemporalError err;}; bool is_ok;} temporal_rs_Instant_to_ixdtf_string_with_provider_result; +temporal_rs_Instant_to_ixdtf_string_with_provider_result temporal_rs_Instant_to_ixdtf_string_with_provider(const Instant* self, TimeZone_option zone, ToStringRoundingOptions options, const Provider* p, DiplomatWrite* write); + +typedef struct temporal_rs_Instant_to_zoned_date_time_iso_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_Instant_to_zoned_date_time_iso_result; +temporal_rs_Instant_to_zoned_date_time_iso_result temporal_rs_Instant_to_zoned_date_time_iso(const Instant* self, TimeZone zone); + +typedef struct temporal_rs_Instant_to_zoned_date_time_iso_with_provider_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_Instant_to_zoned_date_time_iso_with_provider_result; +temporal_rs_Instant_to_zoned_date_time_iso_with_provider_result temporal_rs_Instant_to_zoned_date_time_iso_with_provider(const Instant* self, TimeZone zone, const Provider* p); + +Instant* temporal_rs_Instant_clone(const Instant* self); + +void temporal_rs_Instant_destroy(Instant* self); + + + + + +#endif // Instant_H diff --git a/deps/temporal/temporal_capi/bindings/c/OffsetDisambiguation.d.h b/deps/temporal/temporal_capi/bindings/c/OffsetDisambiguation.d.h new file mode 100644 index 00000000000000..aa46cf3de918ff --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/OffsetDisambiguation.d.h @@ -0,0 +1,25 @@ +#ifndef OffsetDisambiguation_D_H +#define OffsetDisambiguation_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + + + + +typedef enum OffsetDisambiguation { + OffsetDisambiguation_Use = 0, + OffsetDisambiguation_Prefer = 1, + OffsetDisambiguation_Ignore = 2, + OffsetDisambiguation_Reject = 3, +} OffsetDisambiguation; + +typedef struct OffsetDisambiguation_option {union { OffsetDisambiguation ok; }; bool is_ok; } OffsetDisambiguation_option; + + + +#endif // OffsetDisambiguation_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/OffsetDisambiguation.h b/deps/temporal/temporal_capi/bindings/c/OffsetDisambiguation.h new file mode 100644 index 00000000000000..8227ec084b5d52 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/OffsetDisambiguation.h @@ -0,0 +1,22 @@ +#ifndef OffsetDisambiguation_H +#define OffsetDisambiguation_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + +#include "OffsetDisambiguation.d.h" + + + + + + + + + + +#endif // OffsetDisambiguation_H diff --git a/deps/temporal/temporal_capi/bindings/c/OwnedRelativeTo.d.h b/deps/temporal/temporal_capi/bindings/c/OwnedRelativeTo.d.h new file mode 100644 index 00000000000000..297922d5207af7 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/OwnedRelativeTo.d.h @@ -0,0 +1,25 @@ +#ifndef OwnedRelativeTo_D_H +#define OwnedRelativeTo_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + +#include "PlainDate.d.h" +#include "ZonedDateTime.d.h" + + + + +typedef struct OwnedRelativeTo { + PlainDate* date; + ZonedDateTime* zoned; +} OwnedRelativeTo; + +typedef struct OwnedRelativeTo_option {union { OwnedRelativeTo ok; }; bool is_ok; } OwnedRelativeTo_option; + + + +#endif // OwnedRelativeTo_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/OwnedRelativeTo.h b/deps/temporal/temporal_capi/bindings/c/OwnedRelativeTo.h new file mode 100644 index 00000000000000..cfe0587720b353 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/OwnedRelativeTo.h @@ -0,0 +1,38 @@ +#ifndef OwnedRelativeTo_H +#define OwnedRelativeTo_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + +#include "Provider.d.h" +#include "TemporalError.d.h" + +#include "OwnedRelativeTo.d.h" + + + + + + +typedef struct temporal_rs_OwnedRelativeTo_from_utf8_result {union {OwnedRelativeTo ok; TemporalError err;}; bool is_ok;} temporal_rs_OwnedRelativeTo_from_utf8_result; +temporal_rs_OwnedRelativeTo_from_utf8_result temporal_rs_OwnedRelativeTo_from_utf8(DiplomatStringView s); + +typedef struct temporal_rs_OwnedRelativeTo_from_utf8_with_provider_result {union {OwnedRelativeTo ok; TemporalError err;}; bool is_ok;} temporal_rs_OwnedRelativeTo_from_utf8_with_provider_result; +temporal_rs_OwnedRelativeTo_from_utf8_with_provider_result temporal_rs_OwnedRelativeTo_from_utf8_with_provider(DiplomatStringView s, const Provider* p); + +typedef struct temporal_rs_OwnedRelativeTo_from_utf16_result {union {OwnedRelativeTo ok; TemporalError err;}; bool is_ok;} temporal_rs_OwnedRelativeTo_from_utf16_result; +temporal_rs_OwnedRelativeTo_from_utf16_result temporal_rs_OwnedRelativeTo_from_utf16(DiplomatString16View s); + +typedef struct temporal_rs_OwnedRelativeTo_from_utf16_with_provider_result {union {OwnedRelativeTo ok; TemporalError err;}; bool is_ok;} temporal_rs_OwnedRelativeTo_from_utf16_with_provider_result; +temporal_rs_OwnedRelativeTo_from_utf16_with_provider_result temporal_rs_OwnedRelativeTo_from_utf16_with_provider(DiplomatString16View s, const Provider* p); + +OwnedRelativeTo temporal_rs_OwnedRelativeTo_empty(void); + + + + + +#endif // OwnedRelativeTo_H diff --git a/deps/temporal/temporal_capi/bindings/c/ParsedDate.d.h b/deps/temporal/temporal_capi/bindings/c/ParsedDate.d.h new file mode 100644 index 00000000000000..ae75840aabae68 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/ParsedDate.d.h @@ -0,0 +1,19 @@ +#ifndef ParsedDate_D_H +#define ParsedDate_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + + + + +typedef struct ParsedDate ParsedDate; + + + + +#endif // ParsedDate_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/ParsedDate.h b/deps/temporal/temporal_capi/bindings/c/ParsedDate.h new file mode 100644 index 00000000000000..d92f3a0d78a29c --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/ParsedDate.h @@ -0,0 +1,43 @@ +#ifndef ParsedDate_H +#define ParsedDate_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + +#include "TemporalError.d.h" + +#include "ParsedDate.d.h" + + + + + + +typedef struct temporal_rs_ParsedDate_from_utf8_result {union {ParsedDate* ok; TemporalError err;}; bool is_ok;} temporal_rs_ParsedDate_from_utf8_result; +temporal_rs_ParsedDate_from_utf8_result temporal_rs_ParsedDate_from_utf8(DiplomatStringView s); + +typedef struct temporal_rs_ParsedDate_from_utf16_result {union {ParsedDate* ok; TemporalError err;}; bool is_ok;} temporal_rs_ParsedDate_from_utf16_result; +temporal_rs_ParsedDate_from_utf16_result temporal_rs_ParsedDate_from_utf16(DiplomatString16View s); + +typedef struct temporal_rs_ParsedDate_year_month_from_utf8_result {union {ParsedDate* ok; TemporalError err;}; bool is_ok;} temporal_rs_ParsedDate_year_month_from_utf8_result; +temporal_rs_ParsedDate_year_month_from_utf8_result temporal_rs_ParsedDate_year_month_from_utf8(DiplomatStringView s); + +typedef struct temporal_rs_ParsedDate_year_month_from_utf16_result {union {ParsedDate* ok; TemporalError err;}; bool is_ok;} temporal_rs_ParsedDate_year_month_from_utf16_result; +temporal_rs_ParsedDate_year_month_from_utf16_result temporal_rs_ParsedDate_year_month_from_utf16(DiplomatString16View s); + +typedef struct temporal_rs_ParsedDate_month_day_from_utf8_result {union {ParsedDate* ok; TemporalError err;}; bool is_ok;} temporal_rs_ParsedDate_month_day_from_utf8_result; +temporal_rs_ParsedDate_month_day_from_utf8_result temporal_rs_ParsedDate_month_day_from_utf8(DiplomatStringView s); + +typedef struct temporal_rs_ParsedDate_month_day_from_utf16_result {union {ParsedDate* ok; TemporalError err;}; bool is_ok;} temporal_rs_ParsedDate_month_day_from_utf16_result; +temporal_rs_ParsedDate_month_day_from_utf16_result temporal_rs_ParsedDate_month_day_from_utf16(DiplomatString16View s); + +void temporal_rs_ParsedDate_destroy(ParsedDate* self); + + + + + +#endif // ParsedDate_H diff --git a/deps/temporal/temporal_capi/bindings/c/ParsedDateTime.d.h b/deps/temporal/temporal_capi/bindings/c/ParsedDateTime.d.h new file mode 100644 index 00000000000000..96bbbe4cc84998 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/ParsedDateTime.d.h @@ -0,0 +1,19 @@ +#ifndef ParsedDateTime_D_H +#define ParsedDateTime_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + + + + +typedef struct ParsedDateTime ParsedDateTime; + + + + +#endif // ParsedDateTime_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/ParsedDateTime.h b/deps/temporal/temporal_capi/bindings/c/ParsedDateTime.h new file mode 100644 index 00000000000000..cdb6a54e66a33b --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/ParsedDateTime.h @@ -0,0 +1,31 @@ +#ifndef ParsedDateTime_H +#define ParsedDateTime_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + +#include "TemporalError.d.h" + +#include "ParsedDateTime.d.h" + + + + + + +typedef struct temporal_rs_ParsedDateTime_from_utf8_result {union {ParsedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ParsedDateTime_from_utf8_result; +temporal_rs_ParsedDateTime_from_utf8_result temporal_rs_ParsedDateTime_from_utf8(DiplomatStringView s); + +typedef struct temporal_rs_ParsedDateTime_from_utf16_result {union {ParsedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ParsedDateTime_from_utf16_result; +temporal_rs_ParsedDateTime_from_utf16_result temporal_rs_ParsedDateTime_from_utf16(DiplomatString16View s); + +void temporal_rs_ParsedDateTime_destroy(ParsedDateTime* self); + + + + + +#endif // ParsedDateTime_H diff --git a/deps/temporal/temporal_capi/bindings/c/ParsedZonedDateTime.d.h b/deps/temporal/temporal_capi/bindings/c/ParsedZonedDateTime.d.h new file mode 100644 index 00000000000000..48c89d3e175d2d --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/ParsedZonedDateTime.d.h @@ -0,0 +1,19 @@ +#ifndef ParsedZonedDateTime_D_H +#define ParsedZonedDateTime_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + + + + +typedef struct ParsedZonedDateTime ParsedZonedDateTime; + + + + +#endif // ParsedZonedDateTime_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/ParsedZonedDateTime.h b/deps/temporal/temporal_capi/bindings/c/ParsedZonedDateTime.h new file mode 100644 index 00000000000000..3663529ef4d6a9 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/ParsedZonedDateTime.h @@ -0,0 +1,38 @@ +#ifndef ParsedZonedDateTime_H +#define ParsedZonedDateTime_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + +#include "Provider.d.h" +#include "TemporalError.d.h" + +#include "ParsedZonedDateTime.d.h" + + + + + + +typedef struct temporal_rs_ParsedZonedDateTime_from_utf8_result {union {ParsedZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ParsedZonedDateTime_from_utf8_result; +temporal_rs_ParsedZonedDateTime_from_utf8_result temporal_rs_ParsedZonedDateTime_from_utf8(DiplomatStringView s); + +typedef struct temporal_rs_ParsedZonedDateTime_from_utf8_with_provider_result {union {ParsedZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ParsedZonedDateTime_from_utf8_with_provider_result; +temporal_rs_ParsedZonedDateTime_from_utf8_with_provider_result temporal_rs_ParsedZonedDateTime_from_utf8_with_provider(DiplomatStringView s, const Provider* p); + +typedef struct temporal_rs_ParsedZonedDateTime_from_utf16_result {union {ParsedZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ParsedZonedDateTime_from_utf16_result; +temporal_rs_ParsedZonedDateTime_from_utf16_result temporal_rs_ParsedZonedDateTime_from_utf16(DiplomatString16View s); + +typedef struct temporal_rs_ParsedZonedDateTime_from_utf16_with_provider_result {union {ParsedZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ParsedZonedDateTime_from_utf16_with_provider_result; +temporal_rs_ParsedZonedDateTime_from_utf16_with_provider_result temporal_rs_ParsedZonedDateTime_from_utf16_with_provider(DiplomatString16View s, const Provider* p); + +void temporal_rs_ParsedZonedDateTime_destroy(ParsedZonedDateTime* self); + + + + + +#endif // ParsedZonedDateTime_H diff --git a/deps/temporal/temporal_capi/bindings/c/PartialDate.d.h b/deps/temporal/temporal_capi/bindings/c/PartialDate.d.h new file mode 100644 index 00000000000000..b4157fcccdb157 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/PartialDate.d.h @@ -0,0 +1,29 @@ +#ifndef PartialDate_D_H +#define PartialDate_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + +#include "AnyCalendarKind.d.h" + + + + +typedef struct PartialDate { + OptionI32 year; + OptionU8 month; + DiplomatStringView month_code; + OptionU8 day; + DiplomatStringView era; + OptionI32 era_year; + AnyCalendarKind calendar; +} PartialDate; + +typedef struct PartialDate_option {union { PartialDate ok; }; bool is_ok; } PartialDate_option; + + + +#endif // PartialDate_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/PartialDate.h b/deps/temporal/temporal_capi/bindings/c/PartialDate.h new file mode 100644 index 00000000000000..824a8e03422bf1 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/PartialDate.h @@ -0,0 +1,22 @@ +#ifndef PartialDate_H +#define PartialDate_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + +#include "PartialDate.d.h" + + + + + + + + + + +#endif // PartialDate_H diff --git a/deps/temporal/temporal_capi/bindings/c/PartialDateTime.d.h b/deps/temporal/temporal_capi/bindings/c/PartialDateTime.d.h new file mode 100644 index 00000000000000..735baf3fc10397 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/PartialDateTime.d.h @@ -0,0 +1,25 @@ +#ifndef PartialDateTime_D_H +#define PartialDateTime_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + +#include "PartialDate.d.h" +#include "PartialTime.d.h" + + + + +typedef struct PartialDateTime { + PartialDate date; + PartialTime time; +} PartialDateTime; + +typedef struct PartialDateTime_option {union { PartialDateTime ok; }; bool is_ok; } PartialDateTime_option; + + + +#endif // PartialDateTime_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/PartialDateTime.h b/deps/temporal/temporal_capi/bindings/c/PartialDateTime.h new file mode 100644 index 00000000000000..11efc7104cfb3c --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/PartialDateTime.h @@ -0,0 +1,22 @@ +#ifndef PartialDateTime_H +#define PartialDateTime_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + +#include "PartialDateTime.d.h" + + + + + + + + + + +#endif // PartialDateTime_H diff --git a/deps/temporal/temporal_capi/bindings/c/PartialDuration.d.h b/deps/temporal/temporal_capi/bindings/c/PartialDuration.d.h new file mode 100644 index 00000000000000..f0189fc9ae56c7 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/PartialDuration.d.h @@ -0,0 +1,31 @@ +#ifndef PartialDuration_D_H +#define PartialDuration_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + + + + +typedef struct PartialDuration { + OptionI64 years; + OptionI64 months; + OptionI64 weeks; + OptionI64 days; + OptionI64 hours; + OptionI64 minutes; + OptionI64 seconds; + OptionI64 milliseconds; + OptionF64 microseconds; + OptionF64 nanoseconds; +} PartialDuration; + +typedef struct PartialDuration_option {union { PartialDuration ok; }; bool is_ok; } PartialDuration_option; + + + +#endif // PartialDuration_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/PartialDuration.h b/deps/temporal/temporal_capi/bindings/c/PartialDuration.h new file mode 100644 index 00000000000000..afe0bfb00be7e6 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/PartialDuration.h @@ -0,0 +1,24 @@ +#ifndef PartialDuration_H +#define PartialDuration_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + +#include "PartialDuration.d.h" + + + + + + +bool temporal_rs_PartialDuration_is_empty(PartialDuration self); + + + + + +#endif // PartialDuration_H diff --git a/deps/temporal/temporal_capi/bindings/c/PartialTime.d.h b/deps/temporal/temporal_capi/bindings/c/PartialTime.d.h new file mode 100644 index 00000000000000..6dd1fe9be90fcf --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/PartialTime.d.h @@ -0,0 +1,27 @@ +#ifndef PartialTime_D_H +#define PartialTime_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + + + + +typedef struct PartialTime { + OptionU8 hour; + OptionU8 minute; + OptionU8 second; + OptionU16 millisecond; + OptionU16 microsecond; + OptionU16 nanosecond; +} PartialTime; + +typedef struct PartialTime_option {union { PartialTime ok; }; bool is_ok; } PartialTime_option; + + + +#endif // PartialTime_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/PartialTime.h b/deps/temporal/temporal_capi/bindings/c/PartialTime.h new file mode 100644 index 00000000000000..8662bb27a60ee8 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/PartialTime.h @@ -0,0 +1,22 @@ +#ifndef PartialTime_H +#define PartialTime_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + +#include "PartialTime.d.h" + + + + + + + + + + +#endif // PartialTime_H diff --git a/deps/temporal/temporal_capi/bindings/c/PartialZonedDateTime.d.h b/deps/temporal/temporal_capi/bindings/c/PartialZonedDateTime.d.h new file mode 100644 index 00000000000000..eec6a876a69ed4 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/PartialZonedDateTime.d.h @@ -0,0 +1,28 @@ +#ifndef PartialZonedDateTime_D_H +#define PartialZonedDateTime_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + +#include "PartialDate.d.h" +#include "PartialTime.d.h" +#include "TimeZone.d.h" + + + + +typedef struct PartialZonedDateTime { + PartialDate date; + PartialTime time; + OptionStringView offset; + TimeZone_option timezone; +} PartialZonedDateTime; + +typedef struct PartialZonedDateTime_option {union { PartialZonedDateTime ok; }; bool is_ok; } PartialZonedDateTime_option; + + + +#endif // PartialZonedDateTime_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/PartialZonedDateTime.h b/deps/temporal/temporal_capi/bindings/c/PartialZonedDateTime.h new file mode 100644 index 00000000000000..2f8305ae3d18c8 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/PartialZonedDateTime.h @@ -0,0 +1,22 @@ +#ifndef PartialZonedDateTime_H +#define PartialZonedDateTime_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + +#include "PartialZonedDateTime.d.h" + + + + + + + + + + +#endif // PartialZonedDateTime_H diff --git a/deps/temporal/temporal_capi/bindings/c/PlainDate.d.h b/deps/temporal/temporal_capi/bindings/c/PlainDate.d.h new file mode 100644 index 00000000000000..680fa1e8370f5b --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/PlainDate.d.h @@ -0,0 +1,19 @@ +#ifndef PlainDate_D_H +#define PlainDate_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + + + + +typedef struct PlainDate PlainDate; + + + + +#endif // PlainDate_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/PlainDate.h b/deps/temporal/temporal_capi/bindings/c/PlainDate.h new file mode 100644 index 00000000000000..d196dc30ab7a83 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/PlainDate.h @@ -0,0 +1,151 @@ +#ifndef PlainDate_H +#define PlainDate_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + +#include "AnyCalendarKind.d.h" +#include "ArithmeticOverflow.d.h" +#include "Calendar.d.h" +#include "DifferenceSettings.d.h" +#include "DisplayCalendar.d.h" +#include "Duration.d.h" +#include "I128Nanoseconds.d.h" +#include "ParsedDate.d.h" +#include "PartialDate.d.h" +#include "PlainDateTime.d.h" +#include "PlainMonthDay.d.h" +#include "PlainTime.d.h" +#include "PlainYearMonth.d.h" +#include "Provider.d.h" +#include "TemporalError.d.h" +#include "TimeZone.d.h" +#include "ZonedDateTime.d.h" + +#include "PlainDate.d.h" + + + + + + +typedef struct temporal_rs_PlainDate_try_new_constrain_result {union {PlainDate* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_try_new_constrain_result; +temporal_rs_PlainDate_try_new_constrain_result temporal_rs_PlainDate_try_new_constrain(int32_t year, uint8_t month, uint8_t day, AnyCalendarKind calendar); + +typedef struct temporal_rs_PlainDate_try_new_result {union {PlainDate* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_try_new_result; +temporal_rs_PlainDate_try_new_result temporal_rs_PlainDate_try_new(int32_t year, uint8_t month, uint8_t day, AnyCalendarKind calendar); + +typedef struct temporal_rs_PlainDate_try_new_with_overflow_result {union {PlainDate* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_try_new_with_overflow_result; +temporal_rs_PlainDate_try_new_with_overflow_result temporal_rs_PlainDate_try_new_with_overflow(int32_t year, uint8_t month, uint8_t day, AnyCalendarKind calendar, ArithmeticOverflow overflow); + +typedef struct temporal_rs_PlainDate_from_partial_result {union {PlainDate* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_from_partial_result; +temporal_rs_PlainDate_from_partial_result temporal_rs_PlainDate_from_partial(PartialDate partial, ArithmeticOverflow_option overflow); + +typedef struct temporal_rs_PlainDate_from_parsed_result {union {PlainDate* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_from_parsed_result; +temporal_rs_PlainDate_from_parsed_result temporal_rs_PlainDate_from_parsed(const ParsedDate* parsed); + +typedef struct temporal_rs_PlainDate_from_epoch_milliseconds_result {union {PlainDate* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_from_epoch_milliseconds_result; +temporal_rs_PlainDate_from_epoch_milliseconds_result temporal_rs_PlainDate_from_epoch_milliseconds(int64_t ms, TimeZone tz); + +typedef struct temporal_rs_PlainDate_from_epoch_milliseconds_with_provider_result {union {PlainDate* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_from_epoch_milliseconds_with_provider_result; +temporal_rs_PlainDate_from_epoch_milliseconds_with_provider_result temporal_rs_PlainDate_from_epoch_milliseconds_with_provider(int64_t ms, TimeZone tz, const Provider* p); + +typedef struct temporal_rs_PlainDate_from_epoch_nanoseconds_result {union {PlainDate* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_from_epoch_nanoseconds_result; +temporal_rs_PlainDate_from_epoch_nanoseconds_result temporal_rs_PlainDate_from_epoch_nanoseconds(I128Nanoseconds ns, TimeZone tz); + +typedef struct temporal_rs_PlainDate_from_epoch_nanoseconds_with_provider_result {union {PlainDate* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_from_epoch_nanoseconds_with_provider_result; +temporal_rs_PlainDate_from_epoch_nanoseconds_with_provider_result temporal_rs_PlainDate_from_epoch_nanoseconds_with_provider(I128Nanoseconds ns, TimeZone tz, const Provider* p); + +typedef struct temporal_rs_PlainDate_with_result {union {PlainDate* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_with_result; +temporal_rs_PlainDate_with_result temporal_rs_PlainDate_with(const PlainDate* self, PartialDate partial, ArithmeticOverflow_option overflow); + +PlainDate* temporal_rs_PlainDate_with_calendar(const PlainDate* self, AnyCalendarKind calendar); + +typedef struct temporal_rs_PlainDate_from_utf8_result {union {PlainDate* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_from_utf8_result; +temporal_rs_PlainDate_from_utf8_result temporal_rs_PlainDate_from_utf8(DiplomatStringView s); + +typedef struct temporal_rs_PlainDate_from_utf16_result {union {PlainDate* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_from_utf16_result; +temporal_rs_PlainDate_from_utf16_result temporal_rs_PlainDate_from_utf16(DiplomatString16View s); + +const Calendar* temporal_rs_PlainDate_calendar(const PlainDate* self); + +bool temporal_rs_PlainDate_is_valid(const PlainDate* self); + +typedef struct temporal_rs_PlainDate_add_result {union {PlainDate* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_add_result; +temporal_rs_PlainDate_add_result temporal_rs_PlainDate_add(const PlainDate* self, const Duration* duration, ArithmeticOverflow_option overflow); + +typedef struct temporal_rs_PlainDate_subtract_result {union {PlainDate* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_subtract_result; +temporal_rs_PlainDate_subtract_result temporal_rs_PlainDate_subtract(const PlainDate* self, const Duration* duration, ArithmeticOverflow_option overflow); + +typedef struct temporal_rs_PlainDate_until_result {union {Duration* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_until_result; +temporal_rs_PlainDate_until_result temporal_rs_PlainDate_until(const PlainDate* self, const PlainDate* other, DifferenceSettings settings); + +typedef struct temporal_rs_PlainDate_since_result {union {Duration* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_since_result; +temporal_rs_PlainDate_since_result temporal_rs_PlainDate_since(const PlainDate* self, const PlainDate* other, DifferenceSettings settings); + +bool temporal_rs_PlainDate_equals(const PlainDate* self, const PlainDate* other); + +int8_t temporal_rs_PlainDate_compare(const PlainDate* one, const PlainDate* two); + +int32_t temporal_rs_PlainDate_year(const PlainDate* self); + +uint8_t temporal_rs_PlainDate_month(const PlainDate* self); + +void temporal_rs_PlainDate_month_code(const PlainDate* self, DiplomatWrite* write); + +uint8_t temporal_rs_PlainDate_day(const PlainDate* self); + +uint16_t temporal_rs_PlainDate_day_of_week(const PlainDate* self); + +uint16_t temporal_rs_PlainDate_day_of_year(const PlainDate* self); + +typedef struct temporal_rs_PlainDate_week_of_year_result {union {uint8_t ok; }; bool is_ok;} temporal_rs_PlainDate_week_of_year_result; +temporal_rs_PlainDate_week_of_year_result temporal_rs_PlainDate_week_of_year(const PlainDate* self); + +typedef struct temporal_rs_PlainDate_year_of_week_result {union {int32_t ok; }; bool is_ok;} temporal_rs_PlainDate_year_of_week_result; +temporal_rs_PlainDate_year_of_week_result temporal_rs_PlainDate_year_of_week(const PlainDate* self); + +uint16_t temporal_rs_PlainDate_days_in_week(const PlainDate* self); + +uint16_t temporal_rs_PlainDate_days_in_month(const PlainDate* self); + +uint16_t temporal_rs_PlainDate_days_in_year(const PlainDate* self); + +uint16_t temporal_rs_PlainDate_months_in_year(const PlainDate* self); + +bool temporal_rs_PlainDate_in_leap_year(const PlainDate* self); + +void temporal_rs_PlainDate_era(const PlainDate* self, DiplomatWrite* write); + +typedef struct temporal_rs_PlainDate_era_year_result {union {int32_t ok; }; bool is_ok;} temporal_rs_PlainDate_era_year_result; +temporal_rs_PlainDate_era_year_result temporal_rs_PlainDate_era_year(const PlainDate* self); + +typedef struct temporal_rs_PlainDate_to_plain_date_time_result {union {PlainDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_to_plain_date_time_result; +temporal_rs_PlainDate_to_plain_date_time_result temporal_rs_PlainDate_to_plain_date_time(const PlainDate* self, const PlainTime* time); + +typedef struct temporal_rs_PlainDate_to_plain_month_day_result {union {PlainMonthDay* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_to_plain_month_day_result; +temporal_rs_PlainDate_to_plain_month_day_result temporal_rs_PlainDate_to_plain_month_day(const PlainDate* self); + +typedef struct temporal_rs_PlainDate_to_plain_year_month_result {union {PlainYearMonth* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_to_plain_year_month_result; +temporal_rs_PlainDate_to_plain_year_month_result temporal_rs_PlainDate_to_plain_year_month(const PlainDate* self); + +typedef struct temporal_rs_PlainDate_to_zoned_date_time_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_to_zoned_date_time_result; +temporal_rs_PlainDate_to_zoned_date_time_result temporal_rs_PlainDate_to_zoned_date_time(const PlainDate* self, TimeZone time_zone, const PlainTime* time); + +typedef struct temporal_rs_PlainDate_to_zoned_date_time_with_provider_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_to_zoned_date_time_with_provider_result; +temporal_rs_PlainDate_to_zoned_date_time_with_provider_result temporal_rs_PlainDate_to_zoned_date_time_with_provider(const PlainDate* self, TimeZone time_zone, const PlainTime* time, const Provider* p); + +void temporal_rs_PlainDate_to_ixdtf_string(const PlainDate* self, DisplayCalendar display_calendar, DiplomatWrite* write); + +PlainDate* temporal_rs_PlainDate_clone(const PlainDate* self); + +void temporal_rs_PlainDate_destroy(PlainDate* self); + + + + + +#endif // PlainDate_H diff --git a/deps/temporal/temporal_capi/bindings/c/PlainDateTime.d.h b/deps/temporal/temporal_capi/bindings/c/PlainDateTime.d.h new file mode 100644 index 00000000000000..83eafb5e8b90d5 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/PlainDateTime.d.h @@ -0,0 +1,19 @@ +#ifndef PlainDateTime_D_H +#define PlainDateTime_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + + + + +typedef struct PlainDateTime PlainDateTime; + + + + +#endif // PlainDateTime_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/PlainDateTime.h b/deps/temporal/temporal_capi/bindings/c/PlainDateTime.h new file mode 100644 index 00000000000000..32b5e35b80467d --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/PlainDateTime.h @@ -0,0 +1,161 @@ +#ifndef PlainDateTime_H +#define PlainDateTime_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + +#include "AnyCalendarKind.d.h" +#include "ArithmeticOverflow.d.h" +#include "Calendar.d.h" +#include "DifferenceSettings.d.h" +#include "Disambiguation.d.h" +#include "DisplayCalendar.d.h" +#include "Duration.d.h" +#include "I128Nanoseconds.d.h" +#include "ParsedDateTime.d.h" +#include "PartialDateTime.d.h" +#include "PlainDate.d.h" +#include "PlainTime.d.h" +#include "Provider.d.h" +#include "RoundingOptions.d.h" +#include "TemporalError.d.h" +#include "TimeZone.d.h" +#include "ToStringRoundingOptions.d.h" +#include "ZonedDateTime.d.h" + +#include "PlainDateTime.d.h" + + + + + + +typedef struct temporal_rs_PlainDateTime_try_new_constrain_result {union {PlainDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_try_new_constrain_result; +temporal_rs_PlainDateTime_try_new_constrain_result temporal_rs_PlainDateTime_try_new_constrain(int32_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint16_t millisecond, uint16_t microsecond, uint16_t nanosecond, AnyCalendarKind calendar); + +typedef struct temporal_rs_PlainDateTime_try_new_result {union {PlainDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_try_new_result; +temporal_rs_PlainDateTime_try_new_result temporal_rs_PlainDateTime_try_new(int32_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint16_t millisecond, uint16_t microsecond, uint16_t nanosecond, AnyCalendarKind calendar); + +typedef struct temporal_rs_PlainDateTime_from_partial_result {union {PlainDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_from_partial_result; +temporal_rs_PlainDateTime_from_partial_result temporal_rs_PlainDateTime_from_partial(PartialDateTime partial, ArithmeticOverflow_option overflow); + +typedef struct temporal_rs_PlainDateTime_from_parsed_result {union {PlainDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_from_parsed_result; +temporal_rs_PlainDateTime_from_parsed_result temporal_rs_PlainDateTime_from_parsed(const ParsedDateTime* parsed); + +typedef struct temporal_rs_PlainDateTime_from_epoch_milliseconds_result {union {PlainDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_from_epoch_milliseconds_result; +temporal_rs_PlainDateTime_from_epoch_milliseconds_result temporal_rs_PlainDateTime_from_epoch_milliseconds(int64_t ms, TimeZone tz); + +typedef struct temporal_rs_PlainDateTime_from_epoch_milliseconds_with_provider_result {union {PlainDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_from_epoch_milliseconds_with_provider_result; +temporal_rs_PlainDateTime_from_epoch_milliseconds_with_provider_result temporal_rs_PlainDateTime_from_epoch_milliseconds_with_provider(int64_t ms, TimeZone tz, const Provider* p); + +typedef struct temporal_rs_PlainDateTime_from_epoch_nanoseconds_result {union {PlainDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_from_epoch_nanoseconds_result; +temporal_rs_PlainDateTime_from_epoch_nanoseconds_result temporal_rs_PlainDateTime_from_epoch_nanoseconds(I128Nanoseconds ns, TimeZone tz); + +typedef struct temporal_rs_PlainDateTime_from_epoch_nanoseconds_with_provider_result {union {PlainDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_from_epoch_nanoseconds_with_provider_result; +temporal_rs_PlainDateTime_from_epoch_nanoseconds_with_provider_result temporal_rs_PlainDateTime_from_epoch_nanoseconds_with_provider(I128Nanoseconds ns, TimeZone tz, const Provider* p); + +typedef struct temporal_rs_PlainDateTime_with_result {union {PlainDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_with_result; +temporal_rs_PlainDateTime_with_result temporal_rs_PlainDateTime_with(const PlainDateTime* self, PartialDateTime partial, ArithmeticOverflow_option overflow); + +typedef struct temporal_rs_PlainDateTime_with_time_result {union {PlainDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_with_time_result; +temporal_rs_PlainDateTime_with_time_result temporal_rs_PlainDateTime_with_time(const PlainDateTime* self, const PlainTime* time); + +PlainDateTime* temporal_rs_PlainDateTime_with_calendar(const PlainDateTime* self, AnyCalendarKind calendar); + +typedef struct temporal_rs_PlainDateTime_from_utf8_result {union {PlainDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_from_utf8_result; +temporal_rs_PlainDateTime_from_utf8_result temporal_rs_PlainDateTime_from_utf8(DiplomatStringView s); + +typedef struct temporal_rs_PlainDateTime_from_utf16_result {union {PlainDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_from_utf16_result; +temporal_rs_PlainDateTime_from_utf16_result temporal_rs_PlainDateTime_from_utf16(DiplomatString16View s); + +uint8_t temporal_rs_PlainDateTime_hour(const PlainDateTime* self); + +uint8_t temporal_rs_PlainDateTime_minute(const PlainDateTime* self); + +uint8_t temporal_rs_PlainDateTime_second(const PlainDateTime* self); + +uint16_t temporal_rs_PlainDateTime_millisecond(const PlainDateTime* self); + +uint16_t temporal_rs_PlainDateTime_microsecond(const PlainDateTime* self); + +uint16_t temporal_rs_PlainDateTime_nanosecond(const PlainDateTime* self); + +const Calendar* temporal_rs_PlainDateTime_calendar(const PlainDateTime* self); + +int32_t temporal_rs_PlainDateTime_year(const PlainDateTime* self); + +uint8_t temporal_rs_PlainDateTime_month(const PlainDateTime* self); + +void temporal_rs_PlainDateTime_month_code(const PlainDateTime* self, DiplomatWrite* write); + +uint8_t temporal_rs_PlainDateTime_day(const PlainDateTime* self); + +uint16_t temporal_rs_PlainDateTime_day_of_week(const PlainDateTime* self); + +uint16_t temporal_rs_PlainDateTime_day_of_year(const PlainDateTime* self); + +typedef struct temporal_rs_PlainDateTime_week_of_year_result {union {uint8_t ok; }; bool is_ok;} temporal_rs_PlainDateTime_week_of_year_result; +temporal_rs_PlainDateTime_week_of_year_result temporal_rs_PlainDateTime_week_of_year(const PlainDateTime* self); + +typedef struct temporal_rs_PlainDateTime_year_of_week_result {union {int32_t ok; }; bool is_ok;} temporal_rs_PlainDateTime_year_of_week_result; +temporal_rs_PlainDateTime_year_of_week_result temporal_rs_PlainDateTime_year_of_week(const PlainDateTime* self); + +uint16_t temporal_rs_PlainDateTime_days_in_week(const PlainDateTime* self); + +uint16_t temporal_rs_PlainDateTime_days_in_month(const PlainDateTime* self); + +uint16_t temporal_rs_PlainDateTime_days_in_year(const PlainDateTime* self); + +uint16_t temporal_rs_PlainDateTime_months_in_year(const PlainDateTime* self); + +bool temporal_rs_PlainDateTime_in_leap_year(const PlainDateTime* self); + +void temporal_rs_PlainDateTime_era(const PlainDateTime* self, DiplomatWrite* write); + +typedef struct temporal_rs_PlainDateTime_era_year_result {union {int32_t ok; }; bool is_ok;} temporal_rs_PlainDateTime_era_year_result; +temporal_rs_PlainDateTime_era_year_result temporal_rs_PlainDateTime_era_year(const PlainDateTime* self); + +typedef struct temporal_rs_PlainDateTime_add_result {union {PlainDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_add_result; +temporal_rs_PlainDateTime_add_result temporal_rs_PlainDateTime_add(const PlainDateTime* self, const Duration* duration, ArithmeticOverflow_option overflow); + +typedef struct temporal_rs_PlainDateTime_subtract_result {union {PlainDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_subtract_result; +temporal_rs_PlainDateTime_subtract_result temporal_rs_PlainDateTime_subtract(const PlainDateTime* self, const Duration* duration, ArithmeticOverflow_option overflow); + +typedef struct temporal_rs_PlainDateTime_until_result {union {Duration* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_until_result; +temporal_rs_PlainDateTime_until_result temporal_rs_PlainDateTime_until(const PlainDateTime* self, const PlainDateTime* other, DifferenceSettings settings); + +typedef struct temporal_rs_PlainDateTime_since_result {union {Duration* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_since_result; +temporal_rs_PlainDateTime_since_result temporal_rs_PlainDateTime_since(const PlainDateTime* self, const PlainDateTime* other, DifferenceSettings settings); + +bool temporal_rs_PlainDateTime_equals(const PlainDateTime* self, const PlainDateTime* other); + +int8_t temporal_rs_PlainDateTime_compare(const PlainDateTime* one, const PlainDateTime* two); + +typedef struct temporal_rs_PlainDateTime_round_result {union {PlainDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_round_result; +temporal_rs_PlainDateTime_round_result temporal_rs_PlainDateTime_round(const PlainDateTime* self, RoundingOptions options); + +PlainDate* temporal_rs_PlainDateTime_to_plain_date(const PlainDateTime* self); + +PlainTime* temporal_rs_PlainDateTime_to_plain_time(const PlainDateTime* self); + +typedef struct temporal_rs_PlainDateTime_to_zoned_date_time_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_to_zoned_date_time_result; +temporal_rs_PlainDateTime_to_zoned_date_time_result temporal_rs_PlainDateTime_to_zoned_date_time(const PlainDateTime* self, TimeZone time_zone, Disambiguation disambiguation); + +typedef struct temporal_rs_PlainDateTime_to_zoned_date_time_with_provider_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_to_zoned_date_time_with_provider_result; +temporal_rs_PlainDateTime_to_zoned_date_time_with_provider_result temporal_rs_PlainDateTime_to_zoned_date_time_with_provider(const PlainDateTime* self, TimeZone time_zone, Disambiguation disambiguation, const Provider* p); + +typedef struct temporal_rs_PlainDateTime_to_ixdtf_string_result {union { TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_to_ixdtf_string_result; +temporal_rs_PlainDateTime_to_ixdtf_string_result temporal_rs_PlainDateTime_to_ixdtf_string(const PlainDateTime* self, ToStringRoundingOptions options, DisplayCalendar display_calendar, DiplomatWrite* write); + +PlainDateTime* temporal_rs_PlainDateTime_clone(const PlainDateTime* self); + +void temporal_rs_PlainDateTime_destroy(PlainDateTime* self); + + + + + +#endif // PlainDateTime_H diff --git a/deps/temporal/temporal_capi/bindings/c/PlainMonthDay.d.h b/deps/temporal/temporal_capi/bindings/c/PlainMonthDay.d.h new file mode 100644 index 00000000000000..12d40c36d1d27a --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/PlainMonthDay.d.h @@ -0,0 +1,19 @@ +#ifndef PlainMonthDay_D_H +#define PlainMonthDay_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + + + + +typedef struct PlainMonthDay PlainMonthDay; + + + + +#endif // PlainMonthDay_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/PlainMonthDay.h b/deps/temporal/temporal_capi/bindings/c/PlainMonthDay.h new file mode 100644 index 00000000000000..64c5dfd732af12 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/PlainMonthDay.h @@ -0,0 +1,73 @@ +#ifndef PlainMonthDay_H +#define PlainMonthDay_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + +#include "AnyCalendarKind.d.h" +#include "ArithmeticOverflow.d.h" +#include "Calendar.d.h" +#include "DisplayCalendar.d.h" +#include "ParsedDate.d.h" +#include "PartialDate.d.h" +#include "PlainDate.d.h" +#include "Provider.d.h" +#include "TemporalError.d.h" +#include "TimeZone.d.h" + +#include "PlainMonthDay.d.h" + + + + + + +typedef struct temporal_rs_PlainMonthDay_try_new_with_overflow_result {union {PlainMonthDay* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainMonthDay_try_new_with_overflow_result; +temporal_rs_PlainMonthDay_try_new_with_overflow_result temporal_rs_PlainMonthDay_try_new_with_overflow(uint8_t month, uint8_t day, AnyCalendarKind calendar, ArithmeticOverflow overflow, OptionI32 ref_year); + +typedef struct temporal_rs_PlainMonthDay_from_partial_result {union {PlainMonthDay* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainMonthDay_from_partial_result; +temporal_rs_PlainMonthDay_from_partial_result temporal_rs_PlainMonthDay_from_partial(PartialDate partial, ArithmeticOverflow_option overflow); + +typedef struct temporal_rs_PlainMonthDay_from_parsed_result {union {PlainMonthDay* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainMonthDay_from_parsed_result; +temporal_rs_PlainMonthDay_from_parsed_result temporal_rs_PlainMonthDay_from_parsed(const ParsedDate* parsed); + +typedef struct temporal_rs_PlainMonthDay_with_result {union {PlainMonthDay* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainMonthDay_with_result; +temporal_rs_PlainMonthDay_with_result temporal_rs_PlainMonthDay_with(const PlainMonthDay* self, PartialDate partial, ArithmeticOverflow_option overflow); + +bool temporal_rs_PlainMonthDay_equals(const PlainMonthDay* self, const PlainMonthDay* other); + +typedef struct temporal_rs_PlainMonthDay_from_utf8_result {union {PlainMonthDay* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainMonthDay_from_utf8_result; +temporal_rs_PlainMonthDay_from_utf8_result temporal_rs_PlainMonthDay_from_utf8(DiplomatStringView s); + +typedef struct temporal_rs_PlainMonthDay_from_utf16_result {union {PlainMonthDay* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainMonthDay_from_utf16_result; +temporal_rs_PlainMonthDay_from_utf16_result temporal_rs_PlainMonthDay_from_utf16(DiplomatString16View s); + +uint8_t temporal_rs_PlainMonthDay_day(const PlainMonthDay* self); + +const Calendar* temporal_rs_PlainMonthDay_calendar(const PlainMonthDay* self); + +void temporal_rs_PlainMonthDay_month_code(const PlainMonthDay* self, DiplomatWrite* write); + +typedef struct temporal_rs_PlainMonthDay_to_plain_date_result {union {PlainDate* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainMonthDay_to_plain_date_result; +temporal_rs_PlainMonthDay_to_plain_date_result temporal_rs_PlainMonthDay_to_plain_date(const PlainMonthDay* self, PartialDate_option year); + +typedef struct temporal_rs_PlainMonthDay_epoch_ms_for_result {union {int64_t ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainMonthDay_epoch_ms_for_result; +temporal_rs_PlainMonthDay_epoch_ms_for_result temporal_rs_PlainMonthDay_epoch_ms_for(const PlainMonthDay* self, TimeZone time_zone); + +typedef struct temporal_rs_PlainMonthDay_epoch_ms_for_with_provider_result {union {int64_t ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainMonthDay_epoch_ms_for_with_provider_result; +temporal_rs_PlainMonthDay_epoch_ms_for_with_provider_result temporal_rs_PlainMonthDay_epoch_ms_for_with_provider(const PlainMonthDay* self, TimeZone time_zone, const Provider* p); + +void temporal_rs_PlainMonthDay_to_ixdtf_string(const PlainMonthDay* self, DisplayCalendar display_calendar, DiplomatWrite* write); + +PlainMonthDay* temporal_rs_PlainMonthDay_clone(const PlainMonthDay* self); + +void temporal_rs_PlainMonthDay_destroy(PlainMonthDay* self); + + + + + +#endif // PlainMonthDay_H diff --git a/deps/temporal/temporal_capi/bindings/c/PlainTime.d.h b/deps/temporal/temporal_capi/bindings/c/PlainTime.d.h new file mode 100644 index 00000000000000..0d3ca8e327bb46 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/PlainTime.d.h @@ -0,0 +1,19 @@ +#ifndef PlainTime_D_H +#define PlainTime_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + + + + +typedef struct PlainTime PlainTime; + + + + +#endif // PlainTime_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/PlainTime.h b/deps/temporal/temporal_capi/bindings/c/PlainTime.h new file mode 100644 index 00000000000000..0d897da90a9f49 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/PlainTime.h @@ -0,0 +1,100 @@ +#ifndef PlainTime_H +#define PlainTime_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + +#include "ArithmeticOverflow.d.h" +#include "DifferenceSettings.d.h" +#include "Duration.d.h" +#include "I128Nanoseconds.d.h" +#include "PartialTime.d.h" +#include "Provider.d.h" +#include "RoundingOptions.d.h" +#include "TemporalError.d.h" +#include "TimeZone.d.h" +#include "ToStringRoundingOptions.d.h" + +#include "PlainTime.d.h" + + + + + + +typedef struct temporal_rs_PlainTime_try_new_constrain_result {union {PlainTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainTime_try_new_constrain_result; +temporal_rs_PlainTime_try_new_constrain_result temporal_rs_PlainTime_try_new_constrain(uint8_t hour, uint8_t minute, uint8_t second, uint16_t millisecond, uint16_t microsecond, uint16_t nanosecond); + +typedef struct temporal_rs_PlainTime_try_new_result {union {PlainTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainTime_try_new_result; +temporal_rs_PlainTime_try_new_result temporal_rs_PlainTime_try_new(uint8_t hour, uint8_t minute, uint8_t second, uint16_t millisecond, uint16_t microsecond, uint16_t nanosecond); + +typedef struct temporal_rs_PlainTime_from_partial_result {union {PlainTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainTime_from_partial_result; +temporal_rs_PlainTime_from_partial_result temporal_rs_PlainTime_from_partial(PartialTime partial, ArithmeticOverflow_option overflow); + +typedef struct temporal_rs_PlainTime_from_epoch_milliseconds_result {union {PlainTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainTime_from_epoch_milliseconds_result; +temporal_rs_PlainTime_from_epoch_milliseconds_result temporal_rs_PlainTime_from_epoch_milliseconds(int64_t ms, TimeZone tz); + +typedef struct temporal_rs_PlainTime_from_epoch_milliseconds_with_provider_result {union {PlainTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainTime_from_epoch_milliseconds_with_provider_result; +temporal_rs_PlainTime_from_epoch_milliseconds_with_provider_result temporal_rs_PlainTime_from_epoch_milliseconds_with_provider(int64_t ms, TimeZone tz, const Provider* p); + +typedef struct temporal_rs_PlainTime_from_epoch_nanoseconds_result {union {PlainTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainTime_from_epoch_nanoseconds_result; +temporal_rs_PlainTime_from_epoch_nanoseconds_result temporal_rs_PlainTime_from_epoch_nanoseconds(I128Nanoseconds ns, TimeZone tz); + +typedef struct temporal_rs_PlainTime_from_epoch_nanoseconds_with_provider_result {union {PlainTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainTime_from_epoch_nanoseconds_with_provider_result; +temporal_rs_PlainTime_from_epoch_nanoseconds_with_provider_result temporal_rs_PlainTime_from_epoch_nanoseconds_with_provider(I128Nanoseconds ns, TimeZone tz, const Provider* p); + +typedef struct temporal_rs_PlainTime_with_result {union {PlainTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainTime_with_result; +temporal_rs_PlainTime_with_result temporal_rs_PlainTime_with(const PlainTime* self, PartialTime partial, ArithmeticOverflow_option overflow); + +typedef struct temporal_rs_PlainTime_from_utf8_result {union {PlainTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainTime_from_utf8_result; +temporal_rs_PlainTime_from_utf8_result temporal_rs_PlainTime_from_utf8(DiplomatStringView s); + +typedef struct temporal_rs_PlainTime_from_utf16_result {union {PlainTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainTime_from_utf16_result; +temporal_rs_PlainTime_from_utf16_result temporal_rs_PlainTime_from_utf16(DiplomatString16View s); + +uint8_t temporal_rs_PlainTime_hour(const PlainTime* self); + +uint8_t temporal_rs_PlainTime_minute(const PlainTime* self); + +uint8_t temporal_rs_PlainTime_second(const PlainTime* self); + +uint16_t temporal_rs_PlainTime_millisecond(const PlainTime* self); + +uint16_t temporal_rs_PlainTime_microsecond(const PlainTime* self); + +uint16_t temporal_rs_PlainTime_nanosecond(const PlainTime* self); + +typedef struct temporal_rs_PlainTime_add_result {union {PlainTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainTime_add_result; +temporal_rs_PlainTime_add_result temporal_rs_PlainTime_add(const PlainTime* self, const Duration* duration); + +typedef struct temporal_rs_PlainTime_subtract_result {union {PlainTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainTime_subtract_result; +temporal_rs_PlainTime_subtract_result temporal_rs_PlainTime_subtract(const PlainTime* self, const Duration* duration); + +typedef struct temporal_rs_PlainTime_until_result {union {Duration* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainTime_until_result; +temporal_rs_PlainTime_until_result temporal_rs_PlainTime_until(const PlainTime* self, const PlainTime* other, DifferenceSettings settings); + +typedef struct temporal_rs_PlainTime_since_result {union {Duration* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainTime_since_result; +temporal_rs_PlainTime_since_result temporal_rs_PlainTime_since(const PlainTime* self, const PlainTime* other, DifferenceSettings settings); + +bool temporal_rs_PlainTime_equals(const PlainTime* self, const PlainTime* other); + +int8_t temporal_rs_PlainTime_compare(const PlainTime* one, const PlainTime* two); + +typedef struct temporal_rs_PlainTime_round_result {union {PlainTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainTime_round_result; +temporal_rs_PlainTime_round_result temporal_rs_PlainTime_round(const PlainTime* self, RoundingOptions options); + +typedef struct temporal_rs_PlainTime_to_ixdtf_string_result {union { TemporalError err;}; bool is_ok;} temporal_rs_PlainTime_to_ixdtf_string_result; +temporal_rs_PlainTime_to_ixdtf_string_result temporal_rs_PlainTime_to_ixdtf_string(const PlainTime* self, ToStringRoundingOptions options, DiplomatWrite* write); + +PlainTime* temporal_rs_PlainTime_clone(const PlainTime* self); + +void temporal_rs_PlainTime_destroy(PlainTime* self); + + + + + +#endif // PlainTime_H diff --git a/deps/temporal/temporal_capi/bindings/c/PlainYearMonth.d.h b/deps/temporal/temporal_capi/bindings/c/PlainYearMonth.d.h new file mode 100644 index 00000000000000..beff08754ac718 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/PlainYearMonth.d.h @@ -0,0 +1,19 @@ +#ifndef PlainYearMonth_D_H +#define PlainYearMonth_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + + + + +typedef struct PlainYearMonth PlainYearMonth; + + + + +#endif // PlainYearMonth_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/PlainYearMonth.h b/deps/temporal/temporal_capi/bindings/c/PlainYearMonth.h new file mode 100644 index 00000000000000..2283264e3ea980 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/PlainYearMonth.h @@ -0,0 +1,104 @@ +#ifndef PlainYearMonth_H +#define PlainYearMonth_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + +#include "AnyCalendarKind.d.h" +#include "ArithmeticOverflow.d.h" +#include "Calendar.d.h" +#include "DifferenceSettings.d.h" +#include "DisplayCalendar.d.h" +#include "Duration.d.h" +#include "ParsedDate.d.h" +#include "PartialDate.d.h" +#include "PlainDate.d.h" +#include "Provider.d.h" +#include "TemporalError.d.h" +#include "TimeZone.d.h" + +#include "PlainYearMonth.d.h" + + + + + + +typedef struct temporal_rs_PlainYearMonth_try_new_with_overflow_result {union {PlainYearMonth* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainYearMonth_try_new_with_overflow_result; +temporal_rs_PlainYearMonth_try_new_with_overflow_result temporal_rs_PlainYearMonth_try_new_with_overflow(int32_t year, uint8_t month, OptionU8 reference_day, AnyCalendarKind calendar, ArithmeticOverflow overflow); + +typedef struct temporal_rs_PlainYearMonth_from_partial_result {union {PlainYearMonth* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainYearMonth_from_partial_result; +temporal_rs_PlainYearMonth_from_partial_result temporal_rs_PlainYearMonth_from_partial(PartialDate partial, ArithmeticOverflow_option overflow); + +typedef struct temporal_rs_PlainYearMonth_from_parsed_result {union {PlainYearMonth* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainYearMonth_from_parsed_result; +temporal_rs_PlainYearMonth_from_parsed_result temporal_rs_PlainYearMonth_from_parsed(const ParsedDate* parsed); + +typedef struct temporal_rs_PlainYearMonth_with_result {union {PlainYearMonth* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainYearMonth_with_result; +temporal_rs_PlainYearMonth_with_result temporal_rs_PlainYearMonth_with(const PlainYearMonth* self, PartialDate partial, ArithmeticOverflow_option overflow); + +typedef struct temporal_rs_PlainYearMonth_from_utf8_result {union {PlainYearMonth* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainYearMonth_from_utf8_result; +temporal_rs_PlainYearMonth_from_utf8_result temporal_rs_PlainYearMonth_from_utf8(DiplomatStringView s); + +typedef struct temporal_rs_PlainYearMonth_from_utf16_result {union {PlainYearMonth* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainYearMonth_from_utf16_result; +temporal_rs_PlainYearMonth_from_utf16_result temporal_rs_PlainYearMonth_from_utf16(DiplomatString16View s); + +int32_t temporal_rs_PlainYearMonth_year(const PlainYearMonth* self); + +uint8_t temporal_rs_PlainYearMonth_month(const PlainYearMonth* self); + +void temporal_rs_PlainYearMonth_month_code(const PlainYearMonth* self, DiplomatWrite* write); + +bool temporal_rs_PlainYearMonth_in_leap_year(const PlainYearMonth* self); + +uint16_t temporal_rs_PlainYearMonth_days_in_month(const PlainYearMonth* self); + +uint16_t temporal_rs_PlainYearMonth_days_in_year(const PlainYearMonth* self); + +uint16_t temporal_rs_PlainYearMonth_months_in_year(const PlainYearMonth* self); + +void temporal_rs_PlainYearMonth_era(const PlainYearMonth* self, DiplomatWrite* write); + +typedef struct temporal_rs_PlainYearMonth_era_year_result {union {int32_t ok; }; bool is_ok;} temporal_rs_PlainYearMonth_era_year_result; +temporal_rs_PlainYearMonth_era_year_result temporal_rs_PlainYearMonth_era_year(const PlainYearMonth* self); + +const Calendar* temporal_rs_PlainYearMonth_calendar(const PlainYearMonth* self); + +typedef struct temporal_rs_PlainYearMonth_add_result {union {PlainYearMonth* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainYearMonth_add_result; +temporal_rs_PlainYearMonth_add_result temporal_rs_PlainYearMonth_add(const PlainYearMonth* self, const Duration* duration, ArithmeticOverflow overflow); + +typedef struct temporal_rs_PlainYearMonth_subtract_result {union {PlainYearMonth* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainYearMonth_subtract_result; +temporal_rs_PlainYearMonth_subtract_result temporal_rs_PlainYearMonth_subtract(const PlainYearMonth* self, const Duration* duration, ArithmeticOverflow overflow); + +typedef struct temporal_rs_PlainYearMonth_until_result {union {Duration* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainYearMonth_until_result; +temporal_rs_PlainYearMonth_until_result temporal_rs_PlainYearMonth_until(const PlainYearMonth* self, const PlainYearMonth* other, DifferenceSettings settings); + +typedef struct temporal_rs_PlainYearMonth_since_result {union {Duration* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainYearMonth_since_result; +temporal_rs_PlainYearMonth_since_result temporal_rs_PlainYearMonth_since(const PlainYearMonth* self, const PlainYearMonth* other, DifferenceSettings settings); + +bool temporal_rs_PlainYearMonth_equals(const PlainYearMonth* self, const PlainYearMonth* other); + +int8_t temporal_rs_PlainYearMonth_compare(const PlainYearMonth* one, const PlainYearMonth* two); + +typedef struct temporal_rs_PlainYearMonth_to_plain_date_result {union {PlainDate* ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainYearMonth_to_plain_date_result; +temporal_rs_PlainYearMonth_to_plain_date_result temporal_rs_PlainYearMonth_to_plain_date(const PlainYearMonth* self, PartialDate_option day); + +typedef struct temporal_rs_PlainYearMonth_epoch_ms_for_result {union {int64_t ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainYearMonth_epoch_ms_for_result; +temporal_rs_PlainYearMonth_epoch_ms_for_result temporal_rs_PlainYearMonth_epoch_ms_for(const PlainYearMonth* self, TimeZone time_zone); + +typedef struct temporal_rs_PlainYearMonth_epoch_ms_for_with_provider_result {union {int64_t ok; TemporalError err;}; bool is_ok;} temporal_rs_PlainYearMonth_epoch_ms_for_with_provider_result; +temporal_rs_PlainYearMonth_epoch_ms_for_with_provider_result temporal_rs_PlainYearMonth_epoch_ms_for_with_provider(const PlainYearMonth* self, TimeZone time_zone, const Provider* p); + +void temporal_rs_PlainYearMonth_to_ixdtf_string(const PlainYearMonth* self, DisplayCalendar display_calendar, DiplomatWrite* write); + +PlainYearMonth* temporal_rs_PlainYearMonth_clone(const PlainYearMonth* self); + +void temporal_rs_PlainYearMonth_destroy(PlainYearMonth* self); + + + + + +#endif // PlainYearMonth_H diff --git a/deps/temporal/temporal_capi/bindings/c/Precision.d.h b/deps/temporal/temporal_capi/bindings/c/Precision.d.h new file mode 100644 index 00000000000000..858901bc4ef254 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/Precision.d.h @@ -0,0 +1,23 @@ +#ifndef Precision_D_H +#define Precision_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + + + + +typedef struct Precision { + bool is_minute; + OptionU8 precision; +} Precision; + +typedef struct Precision_option {union { Precision ok; }; bool is_ok; } Precision_option; + + + +#endif // Precision_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/Precision.h b/deps/temporal/temporal_capi/bindings/c/Precision.h new file mode 100644 index 00000000000000..b184fe14192c7c --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/Precision.h @@ -0,0 +1,22 @@ +#ifndef Precision_H +#define Precision_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + +#include "Precision.d.h" + + + + + + + + + + +#endif // Precision_H diff --git a/deps/temporal/temporal_capi/bindings/c/Provider.d.h b/deps/temporal/temporal_capi/bindings/c/Provider.d.h new file mode 100644 index 00000000000000..f55779116fdf38 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/Provider.d.h @@ -0,0 +1,19 @@ +#ifndef Provider_D_H +#define Provider_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + + + + +typedef struct Provider Provider; + + + + +#endif // Provider_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/Provider.h b/deps/temporal/temporal_capi/bindings/c/Provider.h new file mode 100644 index 00000000000000..3a60b153eee086 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/Provider.h @@ -0,0 +1,31 @@ +#ifndef Provider_H +#define Provider_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + +#include "Provider.d.h" + + + + + + +typedef struct temporal_rs_Provider_new_zoneinfo64_result {union {Provider* ok; }; bool is_ok;} temporal_rs_Provider_new_zoneinfo64_result; +temporal_rs_Provider_new_zoneinfo64_result temporal_rs_Provider_new_zoneinfo64(DiplomatU32View data); + +Provider* temporal_rs_Provider_new_compiled(void); + +Provider* temporal_rs_Provider_empty(void); + +void temporal_rs_Provider_destroy(Provider* self); + + + + + +#endif // Provider_H diff --git a/deps/temporal/temporal_capi/bindings/c/RelativeTo.d.h b/deps/temporal/temporal_capi/bindings/c/RelativeTo.d.h new file mode 100644 index 00000000000000..fde7f3c6c1b870 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/RelativeTo.d.h @@ -0,0 +1,25 @@ +#ifndef RelativeTo_D_H +#define RelativeTo_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + +#include "PlainDate.d.h" +#include "ZonedDateTime.d.h" + + + + +typedef struct RelativeTo { + const PlainDate* date; + const ZonedDateTime* zoned; +} RelativeTo; + +typedef struct RelativeTo_option {union { RelativeTo ok; }; bool is_ok; } RelativeTo_option; + + + +#endif // RelativeTo_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/RelativeTo.h b/deps/temporal/temporal_capi/bindings/c/RelativeTo.h new file mode 100644 index 00000000000000..d40bc871f08922 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/RelativeTo.h @@ -0,0 +1,22 @@ +#ifndef RelativeTo_H +#define RelativeTo_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + +#include "RelativeTo.d.h" + + + + + + + + + + +#endif // RelativeTo_H diff --git a/deps/temporal/temporal_capi/bindings/c/RoundingMode.d.h b/deps/temporal/temporal_capi/bindings/c/RoundingMode.d.h new file mode 100644 index 00000000000000..b6bdd3aa0f1662 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/RoundingMode.d.h @@ -0,0 +1,30 @@ +#ifndef RoundingMode_D_H +#define RoundingMode_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + + + + +typedef enum RoundingMode { + RoundingMode_Ceil = 0, + RoundingMode_Floor = 1, + RoundingMode_Expand = 2, + RoundingMode_Trunc = 3, + RoundingMode_HalfCeil = 4, + RoundingMode_HalfFloor = 5, + RoundingMode_HalfExpand = 6, + RoundingMode_HalfTrunc = 7, + RoundingMode_HalfEven = 8, +} RoundingMode; + +typedef struct RoundingMode_option {union { RoundingMode ok; }; bool is_ok; } RoundingMode_option; + + + +#endif // RoundingMode_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/RoundingMode.h b/deps/temporal/temporal_capi/bindings/c/RoundingMode.h new file mode 100644 index 00000000000000..5c028595f86548 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/RoundingMode.h @@ -0,0 +1,22 @@ +#ifndef RoundingMode_H +#define RoundingMode_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + +#include "RoundingMode.d.h" + + + + + + + + + + +#endif // RoundingMode_H diff --git a/deps/temporal/temporal_capi/bindings/c/RoundingOptions.d.h b/deps/temporal/temporal_capi/bindings/c/RoundingOptions.d.h new file mode 100644 index 00000000000000..37c2bc25a60cfc --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/RoundingOptions.d.h @@ -0,0 +1,27 @@ +#ifndef RoundingOptions_D_H +#define RoundingOptions_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + +#include "RoundingMode.d.h" +#include "Unit.d.h" + + + + +typedef struct RoundingOptions { + Unit_option largest_unit; + Unit_option smallest_unit; + RoundingMode_option rounding_mode; + OptionU32 increment; +} RoundingOptions; + +typedef struct RoundingOptions_option {union { RoundingOptions ok; }; bool is_ok; } RoundingOptions_option; + + + +#endif // RoundingOptions_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/RoundingOptions.h b/deps/temporal/temporal_capi/bindings/c/RoundingOptions.h new file mode 100644 index 00000000000000..0d0c4f6cbee25d --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/RoundingOptions.h @@ -0,0 +1,22 @@ +#ifndef RoundingOptions_H +#define RoundingOptions_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + +#include "RoundingOptions.d.h" + + + + + + + + + + +#endif // RoundingOptions_H diff --git a/deps/temporal/temporal_capi/bindings/c/Sign.d.h b/deps/temporal/temporal_capi/bindings/c/Sign.d.h new file mode 100644 index 00000000000000..787837d280e5f7 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/Sign.d.h @@ -0,0 +1,24 @@ +#ifndef Sign_D_H +#define Sign_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + + + + +typedef enum Sign { + Sign_Positive = 1, + Sign_Zero = 0, + Sign_Negative = -1, +} Sign; + +typedef struct Sign_option {union { Sign ok; }; bool is_ok; } Sign_option; + + + +#endif // Sign_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/Sign.h b/deps/temporal/temporal_capi/bindings/c/Sign.h new file mode 100644 index 00000000000000..10f470c3427db4 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/Sign.h @@ -0,0 +1,22 @@ +#ifndef Sign_H +#define Sign_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + +#include "Sign.d.h" + + + + + + + + + + +#endif // Sign_H diff --git a/deps/temporal/temporal_capi/bindings/c/TemporalError.d.h b/deps/temporal/temporal_capi/bindings/c/TemporalError.d.h new file mode 100644 index 00000000000000..3c37cf5f339b16 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/TemporalError.d.h @@ -0,0 +1,24 @@ +#ifndef TemporalError_D_H +#define TemporalError_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + +#include "ErrorKind.d.h" + + + + +typedef struct TemporalError { + ErrorKind kind; + OptionStringView msg; +} TemporalError; + +typedef struct TemporalError_option {union { TemporalError ok; }; bool is_ok; } TemporalError_option; + + + +#endif // TemporalError_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/TemporalError.h b/deps/temporal/temporal_capi/bindings/c/TemporalError.h new file mode 100644 index 00000000000000..5386db88391af0 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/TemporalError.h @@ -0,0 +1,22 @@ +#ifndef TemporalError_H +#define TemporalError_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + +#include "TemporalError.d.h" + + + + + + + + + + +#endif // TemporalError_H diff --git a/deps/temporal/temporal_capi/bindings/c/TimeZone.d.h b/deps/temporal/temporal_capi/bindings/c/TimeZone.d.h new file mode 100644 index 00000000000000..892eea11c2796a --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/TimeZone.d.h @@ -0,0 +1,25 @@ +#ifndef TimeZone_D_H +#define TimeZone_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + + + + +typedef struct TimeZone { + int16_t offset_minutes; + size_t resolved_id; + size_t normalized_id; + bool is_iana_id; +} TimeZone; + +typedef struct TimeZone_option {union { TimeZone ok; }; bool is_ok; } TimeZone_option; + + + +#endif // TimeZone_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/TimeZone.h b/deps/temporal/temporal_capi/bindings/c/TimeZone.h new file mode 100644 index 00000000000000..152aa5b7054152 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/TimeZone.h @@ -0,0 +1,57 @@ +#ifndef TimeZone_H +#define TimeZone_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + +#include "Provider.d.h" +#include "TemporalError.d.h" + +#include "TimeZone.d.h" + + + + + + +typedef struct temporal_rs_TimeZone_try_from_identifier_str_result {union {TimeZone ok; TemporalError err;}; bool is_ok;} temporal_rs_TimeZone_try_from_identifier_str_result; +temporal_rs_TimeZone_try_from_identifier_str_result temporal_rs_TimeZone_try_from_identifier_str(DiplomatStringView ident); + +typedef struct temporal_rs_TimeZone_try_from_identifier_str_with_provider_result {union {TimeZone ok; TemporalError err;}; bool is_ok;} temporal_rs_TimeZone_try_from_identifier_str_with_provider_result; +temporal_rs_TimeZone_try_from_identifier_str_with_provider_result temporal_rs_TimeZone_try_from_identifier_str_with_provider(DiplomatStringView ident, const Provider* p); + +typedef struct temporal_rs_TimeZone_try_from_offset_str_result {union {TimeZone ok; TemporalError err;}; bool is_ok;} temporal_rs_TimeZone_try_from_offset_str_result; +temporal_rs_TimeZone_try_from_offset_str_result temporal_rs_TimeZone_try_from_offset_str(DiplomatStringView ident); + +typedef struct temporal_rs_TimeZone_try_from_str_result {union {TimeZone ok; TemporalError err;}; bool is_ok;} temporal_rs_TimeZone_try_from_str_result; +temporal_rs_TimeZone_try_from_str_result temporal_rs_TimeZone_try_from_str(DiplomatStringView ident); + +typedef struct temporal_rs_TimeZone_try_from_str_with_provider_result {union {TimeZone ok; TemporalError err;}; bool is_ok;} temporal_rs_TimeZone_try_from_str_with_provider_result; +temporal_rs_TimeZone_try_from_str_with_provider_result temporal_rs_TimeZone_try_from_str_with_provider(DiplomatStringView ident, const Provider* p); + +void temporal_rs_TimeZone_identifier(TimeZone self, DiplomatWrite* write); + +typedef struct temporal_rs_TimeZone_identifier_with_provider_result {union { TemporalError err;}; bool is_ok;} temporal_rs_TimeZone_identifier_with_provider_result; +temporal_rs_TimeZone_identifier_with_provider_result temporal_rs_TimeZone_identifier_with_provider(TimeZone self, const Provider* p, DiplomatWrite* write); + +TimeZone temporal_rs_TimeZone_utc(void); + +typedef struct temporal_rs_TimeZone_utc_with_provider_result {union {TimeZone ok; TemporalError err;}; bool is_ok;} temporal_rs_TimeZone_utc_with_provider_result; +temporal_rs_TimeZone_utc_with_provider_result temporal_rs_TimeZone_utc_with_provider(const Provider* p); + +TimeZone temporal_rs_TimeZone_zero(void); + +typedef struct temporal_rs_TimeZone_primary_identifier_result {union {TimeZone ok; TemporalError err;}; bool is_ok;} temporal_rs_TimeZone_primary_identifier_result; +temporal_rs_TimeZone_primary_identifier_result temporal_rs_TimeZone_primary_identifier(TimeZone self); + +typedef struct temporal_rs_TimeZone_primary_identifier_with_provider_result {union {TimeZone ok; TemporalError err;}; bool is_ok;} temporal_rs_TimeZone_primary_identifier_with_provider_result; +temporal_rs_TimeZone_primary_identifier_with_provider_result temporal_rs_TimeZone_primary_identifier_with_provider(TimeZone self, const Provider* p); + + + + + +#endif // TimeZone_H diff --git a/deps/temporal/temporal_capi/bindings/c/ToStringRoundingOptions.d.h b/deps/temporal/temporal_capi/bindings/c/ToStringRoundingOptions.d.h new file mode 100644 index 00000000000000..7cb50707916f95 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/ToStringRoundingOptions.d.h @@ -0,0 +1,27 @@ +#ifndef ToStringRoundingOptions_D_H +#define ToStringRoundingOptions_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + +#include "Precision.d.h" +#include "RoundingMode.d.h" +#include "Unit.d.h" + + + + +typedef struct ToStringRoundingOptions { + Precision precision; + Unit_option smallest_unit; + RoundingMode_option rounding_mode; +} ToStringRoundingOptions; + +typedef struct ToStringRoundingOptions_option {union { ToStringRoundingOptions ok; }; bool is_ok; } ToStringRoundingOptions_option; + + + +#endif // ToStringRoundingOptions_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/ToStringRoundingOptions.h b/deps/temporal/temporal_capi/bindings/c/ToStringRoundingOptions.h new file mode 100644 index 00000000000000..cc43e6f5efc0fc --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/ToStringRoundingOptions.h @@ -0,0 +1,22 @@ +#ifndef ToStringRoundingOptions_H +#define ToStringRoundingOptions_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + +#include "ToStringRoundingOptions.d.h" + + + + + + + + + + +#endif // ToStringRoundingOptions_H diff --git a/deps/temporal/temporal_capi/bindings/c/TransitionDirection.d.h b/deps/temporal/temporal_capi/bindings/c/TransitionDirection.d.h new file mode 100644 index 00000000000000..0976c3ee6e28f0 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/TransitionDirection.d.h @@ -0,0 +1,23 @@ +#ifndef TransitionDirection_D_H +#define TransitionDirection_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + + + + +typedef enum TransitionDirection { + TransitionDirection_Next = 0, + TransitionDirection_Previous = 1, +} TransitionDirection; + +typedef struct TransitionDirection_option {union { TransitionDirection ok; }; bool is_ok; } TransitionDirection_option; + + + +#endif // TransitionDirection_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/TransitionDirection.h b/deps/temporal/temporal_capi/bindings/c/TransitionDirection.h new file mode 100644 index 00000000000000..2bc20dd00d8a4a --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/TransitionDirection.h @@ -0,0 +1,22 @@ +#ifndef TransitionDirection_H +#define TransitionDirection_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + +#include "TransitionDirection.d.h" + + + + + + + + + + +#endif // TransitionDirection_H diff --git a/deps/temporal/temporal_capi/bindings/c/Unit.d.h b/deps/temporal/temporal_capi/bindings/c/Unit.d.h new file mode 100644 index 00000000000000..00d816ee88dbd6 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/Unit.d.h @@ -0,0 +1,32 @@ +#ifndef Unit_D_H +#define Unit_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + + + + +typedef enum Unit { + Unit_Auto = 0, + Unit_Nanosecond = 1, + Unit_Microsecond = 2, + Unit_Millisecond = 3, + Unit_Second = 4, + Unit_Minute = 5, + Unit_Hour = 6, + Unit_Day = 7, + Unit_Week = 8, + Unit_Month = 9, + Unit_Year = 10, +} Unit; + +typedef struct Unit_option {union { Unit ok; }; bool is_ok; } Unit_option; + + + +#endif // Unit_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/Unit.h b/deps/temporal/temporal_capi/bindings/c/Unit.h new file mode 100644 index 00000000000000..7ad63612212d6e --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/Unit.h @@ -0,0 +1,22 @@ +#ifndef Unit_H +#define Unit_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + +#include "Unit.d.h" + + + + + + + + + + +#endif // Unit_H diff --git a/deps/temporal/temporal_capi/bindings/c/UnsignedRoundingMode.d.h b/deps/temporal/temporal_capi/bindings/c/UnsignedRoundingMode.d.h new file mode 100644 index 00000000000000..c0f18ebb43e175 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/UnsignedRoundingMode.d.h @@ -0,0 +1,26 @@ +#ifndef UnsignedRoundingMode_D_H +#define UnsignedRoundingMode_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + + + + +typedef enum UnsignedRoundingMode { + UnsignedRoundingMode_Infinity = 0, + UnsignedRoundingMode_Zero = 1, + UnsignedRoundingMode_HalfInfinity = 2, + UnsignedRoundingMode_HalfZero = 3, + UnsignedRoundingMode_HalfEven = 4, +} UnsignedRoundingMode; + +typedef struct UnsignedRoundingMode_option {union { UnsignedRoundingMode ok; }; bool is_ok; } UnsignedRoundingMode_option; + + + +#endif // UnsignedRoundingMode_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/UnsignedRoundingMode.h b/deps/temporal/temporal_capi/bindings/c/UnsignedRoundingMode.h new file mode 100644 index 00000000000000..4e68a3ba351f69 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/UnsignedRoundingMode.h @@ -0,0 +1,22 @@ +#ifndef UnsignedRoundingMode_H +#define UnsignedRoundingMode_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + +#include "UnsignedRoundingMode.d.h" + + + + + + + + + + +#endif // UnsignedRoundingMode_H diff --git a/deps/temporal/temporal_capi/bindings/c/ZonedDateTime.d.h b/deps/temporal/temporal_capi/bindings/c/ZonedDateTime.d.h new file mode 100644 index 00000000000000..f1380f58043c71 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/ZonedDateTime.d.h @@ -0,0 +1,19 @@ +#ifndef ZonedDateTime_D_H +#define ZonedDateTime_D_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + + + + + +typedef struct ZonedDateTime ZonedDateTime; + + + + +#endif // ZonedDateTime_D_H diff --git a/deps/temporal/temporal_capi/bindings/c/ZonedDateTime.h b/deps/temporal/temporal_capi/bindings/c/ZonedDateTime.h new file mode 100644 index 00000000000000..b2faad335ea200 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/ZonedDateTime.h @@ -0,0 +1,238 @@ +#ifndef ZonedDateTime_H +#define ZonedDateTime_H + +#include +#include +#include +#include +#include "diplomat_runtime.h" + +#include "AnyCalendarKind.d.h" +#include "ArithmeticOverflow.d.h" +#include "Calendar.d.h" +#include "DifferenceSettings.d.h" +#include "Disambiguation.d.h" +#include "DisplayCalendar.d.h" +#include "DisplayOffset.d.h" +#include "DisplayTimeZone.d.h" +#include "Duration.d.h" +#include "I128Nanoseconds.d.h" +#include "Instant.d.h" +#include "OffsetDisambiguation.d.h" +#include "ParsedZonedDateTime.d.h" +#include "PartialZonedDateTime.d.h" +#include "PlainDate.d.h" +#include "PlainDateTime.d.h" +#include "PlainTime.d.h" +#include "Provider.d.h" +#include "RoundingOptions.d.h" +#include "TemporalError.d.h" +#include "TimeZone.d.h" +#include "ToStringRoundingOptions.d.h" +#include "TransitionDirection.d.h" + +#include "ZonedDateTime.d.h" + + + + + + +typedef struct temporal_rs_ZonedDateTime_try_new_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_try_new_result; +temporal_rs_ZonedDateTime_try_new_result temporal_rs_ZonedDateTime_try_new(I128Nanoseconds nanosecond, AnyCalendarKind calendar, TimeZone time_zone); + +typedef struct temporal_rs_ZonedDateTime_try_new_with_provider_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_try_new_with_provider_result; +temporal_rs_ZonedDateTime_try_new_with_provider_result temporal_rs_ZonedDateTime_try_new_with_provider(I128Nanoseconds nanosecond, AnyCalendarKind calendar, TimeZone time_zone, const Provider* p); + +typedef struct temporal_rs_ZonedDateTime_from_partial_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_from_partial_result; +temporal_rs_ZonedDateTime_from_partial_result temporal_rs_ZonedDateTime_from_partial(PartialZonedDateTime partial, ArithmeticOverflow_option overflow, Disambiguation_option disambiguation, OffsetDisambiguation_option offset_option); + +typedef struct temporal_rs_ZonedDateTime_from_partial_with_provider_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_from_partial_with_provider_result; +temporal_rs_ZonedDateTime_from_partial_with_provider_result temporal_rs_ZonedDateTime_from_partial_with_provider(PartialZonedDateTime partial, ArithmeticOverflow_option overflow, Disambiguation_option disambiguation, OffsetDisambiguation_option offset_option, const Provider* p); + +typedef struct temporal_rs_ZonedDateTime_from_parsed_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_from_parsed_result; +temporal_rs_ZonedDateTime_from_parsed_result temporal_rs_ZonedDateTime_from_parsed(const ParsedZonedDateTime* parsed, Disambiguation disambiguation, OffsetDisambiguation offset_option); + +typedef struct temporal_rs_ZonedDateTime_from_parsed_with_provider_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_from_parsed_with_provider_result; +temporal_rs_ZonedDateTime_from_parsed_with_provider_result temporal_rs_ZonedDateTime_from_parsed_with_provider(const ParsedZonedDateTime* parsed, Disambiguation disambiguation, OffsetDisambiguation offset_option, const Provider* p); + +typedef struct temporal_rs_ZonedDateTime_from_utf8_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_from_utf8_result; +temporal_rs_ZonedDateTime_from_utf8_result temporal_rs_ZonedDateTime_from_utf8(DiplomatStringView s, Disambiguation disambiguation, OffsetDisambiguation offset_disambiguation); + +typedef struct temporal_rs_ZonedDateTime_from_utf8_with_provider_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_from_utf8_with_provider_result; +temporal_rs_ZonedDateTime_from_utf8_with_provider_result temporal_rs_ZonedDateTime_from_utf8_with_provider(DiplomatStringView s, Disambiguation disambiguation, OffsetDisambiguation offset_disambiguation, const Provider* p); + +typedef struct temporal_rs_ZonedDateTime_from_utf16_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_from_utf16_result; +temporal_rs_ZonedDateTime_from_utf16_result temporal_rs_ZonedDateTime_from_utf16(DiplomatString16View s, Disambiguation disambiguation, OffsetDisambiguation offset_disambiguation); + +typedef struct temporal_rs_ZonedDateTime_from_utf16_with_provider_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_from_utf16_with_provider_result; +temporal_rs_ZonedDateTime_from_utf16_with_provider_result temporal_rs_ZonedDateTime_from_utf16_with_provider(DiplomatString16View s, Disambiguation disambiguation, OffsetDisambiguation offset_disambiguation, const Provider* p); + +int64_t temporal_rs_ZonedDateTime_epoch_milliseconds(const ZonedDateTime* self); + +typedef struct temporal_rs_ZonedDateTime_from_epoch_milliseconds_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_from_epoch_milliseconds_result; +temporal_rs_ZonedDateTime_from_epoch_milliseconds_result temporal_rs_ZonedDateTime_from_epoch_milliseconds(int64_t ms, TimeZone tz); + +typedef struct temporal_rs_ZonedDateTime_from_epoch_milliseconds_with_provider_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_from_epoch_milliseconds_with_provider_result; +temporal_rs_ZonedDateTime_from_epoch_milliseconds_with_provider_result temporal_rs_ZonedDateTime_from_epoch_milliseconds_with_provider(int64_t ms, TimeZone tz, const Provider* p); + +typedef struct temporal_rs_ZonedDateTime_from_epoch_nanoseconds_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_from_epoch_nanoseconds_result; +temporal_rs_ZonedDateTime_from_epoch_nanoseconds_result temporal_rs_ZonedDateTime_from_epoch_nanoseconds(I128Nanoseconds ns, TimeZone tz); + +typedef struct temporal_rs_ZonedDateTime_from_epoch_nanoseconds_with_provider_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_from_epoch_nanoseconds_with_provider_result; +temporal_rs_ZonedDateTime_from_epoch_nanoseconds_with_provider_result temporal_rs_ZonedDateTime_from_epoch_nanoseconds_with_provider(I128Nanoseconds ns, TimeZone tz, const Provider* p); + +I128Nanoseconds temporal_rs_ZonedDateTime_epoch_nanoseconds(const ZonedDateTime* self); + +int64_t temporal_rs_ZonedDateTime_offset_nanoseconds(const ZonedDateTime* self); + +Instant* temporal_rs_ZonedDateTime_to_instant(const ZonedDateTime* self); + +typedef struct temporal_rs_ZonedDateTime_with_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_with_result; +temporal_rs_ZonedDateTime_with_result temporal_rs_ZonedDateTime_with(const ZonedDateTime* self, PartialZonedDateTime partial, Disambiguation_option disambiguation, OffsetDisambiguation_option offset_option, ArithmeticOverflow_option overflow); + +typedef struct temporal_rs_ZonedDateTime_with_with_provider_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_with_with_provider_result; +temporal_rs_ZonedDateTime_with_with_provider_result temporal_rs_ZonedDateTime_with_with_provider(const ZonedDateTime* self, PartialZonedDateTime partial, Disambiguation_option disambiguation, OffsetDisambiguation_option offset_option, ArithmeticOverflow_option overflow, const Provider* p); + +typedef struct temporal_rs_ZonedDateTime_with_timezone_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_with_timezone_result; +temporal_rs_ZonedDateTime_with_timezone_result temporal_rs_ZonedDateTime_with_timezone(const ZonedDateTime* self, TimeZone zone); + +typedef struct temporal_rs_ZonedDateTime_with_timezone_with_provider_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_with_timezone_with_provider_result; +temporal_rs_ZonedDateTime_with_timezone_with_provider_result temporal_rs_ZonedDateTime_with_timezone_with_provider(const ZonedDateTime* self, TimeZone zone, const Provider* p); + +TimeZone temporal_rs_ZonedDateTime_timezone(const ZonedDateTime* self); + +int8_t temporal_rs_ZonedDateTime_compare_instant(const ZonedDateTime* self, const ZonedDateTime* other); + +bool temporal_rs_ZonedDateTime_equals(const ZonedDateTime* self, const ZonedDateTime* other); + +typedef struct temporal_rs_ZonedDateTime_equals_with_provider_result {union {bool ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_equals_with_provider_result; +temporal_rs_ZonedDateTime_equals_with_provider_result temporal_rs_ZonedDateTime_equals_with_provider(const ZonedDateTime* self, const ZonedDateTime* other, const Provider* p); + +typedef struct temporal_rs_ZonedDateTime_offset_result {union { TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_offset_result; +temporal_rs_ZonedDateTime_offset_result temporal_rs_ZonedDateTime_offset(const ZonedDateTime* self, DiplomatWrite* write); + +typedef struct temporal_rs_ZonedDateTime_start_of_day_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_start_of_day_result; +temporal_rs_ZonedDateTime_start_of_day_result temporal_rs_ZonedDateTime_start_of_day(const ZonedDateTime* self); + +typedef struct temporal_rs_ZonedDateTime_start_of_day_with_provider_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_start_of_day_with_provider_result; +temporal_rs_ZonedDateTime_start_of_day_with_provider_result temporal_rs_ZonedDateTime_start_of_day_with_provider(const ZonedDateTime* self, const Provider* p); + +typedef struct temporal_rs_ZonedDateTime_get_time_zone_transition_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_get_time_zone_transition_result; +temporal_rs_ZonedDateTime_get_time_zone_transition_result temporal_rs_ZonedDateTime_get_time_zone_transition(const ZonedDateTime* self, TransitionDirection direction); + +typedef struct temporal_rs_ZonedDateTime_get_time_zone_transition_with_provider_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_get_time_zone_transition_with_provider_result; +temporal_rs_ZonedDateTime_get_time_zone_transition_with_provider_result temporal_rs_ZonedDateTime_get_time_zone_transition_with_provider(const ZonedDateTime* self, TransitionDirection direction, const Provider* p); + +typedef struct temporal_rs_ZonedDateTime_hours_in_day_result {union {double ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_hours_in_day_result; +temporal_rs_ZonedDateTime_hours_in_day_result temporal_rs_ZonedDateTime_hours_in_day(const ZonedDateTime* self); + +typedef struct temporal_rs_ZonedDateTime_hours_in_day_with_provider_result {union {double ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_hours_in_day_with_provider_result; +temporal_rs_ZonedDateTime_hours_in_day_with_provider_result temporal_rs_ZonedDateTime_hours_in_day_with_provider(const ZonedDateTime* self, const Provider* p); + +PlainDateTime* temporal_rs_ZonedDateTime_to_plain_datetime(const ZonedDateTime* self); + +PlainDate* temporal_rs_ZonedDateTime_to_plain_date(const ZonedDateTime* self); + +PlainTime* temporal_rs_ZonedDateTime_to_plain_time(const ZonedDateTime* self); + +typedef struct temporal_rs_ZonedDateTime_to_ixdtf_string_result {union { TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_to_ixdtf_string_result; +temporal_rs_ZonedDateTime_to_ixdtf_string_result temporal_rs_ZonedDateTime_to_ixdtf_string(const ZonedDateTime* self, DisplayOffset display_offset, DisplayTimeZone display_timezone, DisplayCalendar display_calendar, ToStringRoundingOptions options, DiplomatWrite* write); + +typedef struct temporal_rs_ZonedDateTime_to_ixdtf_string_with_provider_result {union { TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_to_ixdtf_string_with_provider_result; +temporal_rs_ZonedDateTime_to_ixdtf_string_with_provider_result temporal_rs_ZonedDateTime_to_ixdtf_string_with_provider(const ZonedDateTime* self, DisplayOffset display_offset, DisplayTimeZone display_timezone, DisplayCalendar display_calendar, ToStringRoundingOptions options, const Provider* p, DiplomatWrite* write); + +ZonedDateTime* temporal_rs_ZonedDateTime_with_calendar(const ZonedDateTime* self, AnyCalendarKind calendar); + +typedef struct temporal_rs_ZonedDateTime_with_plain_time_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_with_plain_time_result; +temporal_rs_ZonedDateTime_with_plain_time_result temporal_rs_ZonedDateTime_with_plain_time(const ZonedDateTime* self, const PlainTime* time); + +typedef struct temporal_rs_ZonedDateTime_with_plain_time_and_provider_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_with_plain_time_and_provider_result; +temporal_rs_ZonedDateTime_with_plain_time_and_provider_result temporal_rs_ZonedDateTime_with_plain_time_and_provider(const ZonedDateTime* self, const PlainTime* time, const Provider* p); + +typedef struct temporal_rs_ZonedDateTime_add_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_add_result; +temporal_rs_ZonedDateTime_add_result temporal_rs_ZonedDateTime_add(const ZonedDateTime* self, const Duration* duration, ArithmeticOverflow_option overflow); + +typedef struct temporal_rs_ZonedDateTime_add_with_provider_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_add_with_provider_result; +temporal_rs_ZonedDateTime_add_with_provider_result temporal_rs_ZonedDateTime_add_with_provider(const ZonedDateTime* self, const Duration* duration, ArithmeticOverflow_option overflow, const Provider* p); + +typedef struct temporal_rs_ZonedDateTime_subtract_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_subtract_result; +temporal_rs_ZonedDateTime_subtract_result temporal_rs_ZonedDateTime_subtract(const ZonedDateTime* self, const Duration* duration, ArithmeticOverflow_option overflow); + +typedef struct temporal_rs_ZonedDateTime_subtract_with_provider_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_subtract_with_provider_result; +temporal_rs_ZonedDateTime_subtract_with_provider_result temporal_rs_ZonedDateTime_subtract_with_provider(const ZonedDateTime* self, const Duration* duration, ArithmeticOverflow_option overflow, const Provider* p); + +typedef struct temporal_rs_ZonedDateTime_until_result {union {Duration* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_until_result; +temporal_rs_ZonedDateTime_until_result temporal_rs_ZonedDateTime_until(const ZonedDateTime* self, const ZonedDateTime* other, DifferenceSettings settings); + +typedef struct temporal_rs_ZonedDateTime_until_with_provider_result {union {Duration* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_until_with_provider_result; +temporal_rs_ZonedDateTime_until_with_provider_result temporal_rs_ZonedDateTime_until_with_provider(const ZonedDateTime* self, const ZonedDateTime* other, DifferenceSettings settings, const Provider* p); + +typedef struct temporal_rs_ZonedDateTime_since_result {union {Duration* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_since_result; +temporal_rs_ZonedDateTime_since_result temporal_rs_ZonedDateTime_since(const ZonedDateTime* self, const ZonedDateTime* other, DifferenceSettings settings); + +typedef struct temporal_rs_ZonedDateTime_since_with_provider_result {union {Duration* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_since_with_provider_result; +temporal_rs_ZonedDateTime_since_with_provider_result temporal_rs_ZonedDateTime_since_with_provider(const ZonedDateTime* self, const ZonedDateTime* other, DifferenceSettings settings, const Provider* p); + +typedef struct temporal_rs_ZonedDateTime_round_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_round_result; +temporal_rs_ZonedDateTime_round_result temporal_rs_ZonedDateTime_round(const ZonedDateTime* self, RoundingOptions options); + +typedef struct temporal_rs_ZonedDateTime_round_with_provider_result {union {ZonedDateTime* ok; TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_round_with_provider_result; +temporal_rs_ZonedDateTime_round_with_provider_result temporal_rs_ZonedDateTime_round_with_provider(const ZonedDateTime* self, RoundingOptions options, const Provider* p); + +uint8_t temporal_rs_ZonedDateTime_hour(const ZonedDateTime* self); + +uint8_t temporal_rs_ZonedDateTime_minute(const ZonedDateTime* self); + +uint8_t temporal_rs_ZonedDateTime_second(const ZonedDateTime* self); + +uint16_t temporal_rs_ZonedDateTime_millisecond(const ZonedDateTime* self); + +uint16_t temporal_rs_ZonedDateTime_microsecond(const ZonedDateTime* self); + +uint16_t temporal_rs_ZonedDateTime_nanosecond(const ZonedDateTime* self); + +const Calendar* temporal_rs_ZonedDateTime_calendar(const ZonedDateTime* self); + +int32_t temporal_rs_ZonedDateTime_year(const ZonedDateTime* self); + +uint8_t temporal_rs_ZonedDateTime_month(const ZonedDateTime* self); + +void temporal_rs_ZonedDateTime_month_code(const ZonedDateTime* self, DiplomatWrite* write); + +uint8_t temporal_rs_ZonedDateTime_day(const ZonedDateTime* self); + +uint16_t temporal_rs_ZonedDateTime_day_of_week(const ZonedDateTime* self); + +uint16_t temporal_rs_ZonedDateTime_day_of_year(const ZonedDateTime* self); + +typedef struct temporal_rs_ZonedDateTime_week_of_year_result {union {uint8_t ok; }; bool is_ok;} temporal_rs_ZonedDateTime_week_of_year_result; +temporal_rs_ZonedDateTime_week_of_year_result temporal_rs_ZonedDateTime_week_of_year(const ZonedDateTime* self); + +typedef struct temporal_rs_ZonedDateTime_year_of_week_result {union {int32_t ok; }; bool is_ok;} temporal_rs_ZonedDateTime_year_of_week_result; +temporal_rs_ZonedDateTime_year_of_week_result temporal_rs_ZonedDateTime_year_of_week(const ZonedDateTime* self); + +uint16_t temporal_rs_ZonedDateTime_days_in_week(const ZonedDateTime* self); + +uint16_t temporal_rs_ZonedDateTime_days_in_month(const ZonedDateTime* self); + +uint16_t temporal_rs_ZonedDateTime_days_in_year(const ZonedDateTime* self); + +uint16_t temporal_rs_ZonedDateTime_months_in_year(const ZonedDateTime* self); + +bool temporal_rs_ZonedDateTime_in_leap_year(const ZonedDateTime* self); + +void temporal_rs_ZonedDateTime_era(const ZonedDateTime* self, DiplomatWrite* write); + +typedef struct temporal_rs_ZonedDateTime_era_year_result {union {int32_t ok; }; bool is_ok;} temporal_rs_ZonedDateTime_era_year_result; +temporal_rs_ZonedDateTime_era_year_result temporal_rs_ZonedDateTime_era_year(const ZonedDateTime* self); + +ZonedDateTime* temporal_rs_ZonedDateTime_clone(const ZonedDateTime* self); + +void temporal_rs_ZonedDateTime_destroy(ZonedDateTime* self); + + + + + +#endif // ZonedDateTime_H diff --git a/deps/temporal/temporal_capi/bindings/c/diplomat_runtime.h b/deps/temporal/temporal_capi/bindings/c/diplomat_runtime.h new file mode 100644 index 00000000000000..e5d6b298d73c5b --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/c/diplomat_runtime.h @@ -0,0 +1,82 @@ +#ifndef DIPLOMAT_RUNTIME_C_H +#define DIPLOMAT_RUNTIME_C_H + +#include +#include +#include +#include + +// These come from `uchar.h`, which is not available on all platforms. +// Redefining them in C is no problem, however in >C++11 they are fundamental +// types, which don't like being redefined. +#if !(__cplusplus >= 201100) +// https://en.cppreference.com/w/c/string/multibyte/char16_t +typedef uint_least16_t char16_t; +// https://en.cppreference.com/w/c/string/multibyte/char32_t +typedef uint_least32_t char32_t; +#endif + +static_assert(sizeof(char) == sizeof(uint8_t), "your architecture's `char` is not 8 bits"); +static_assert(sizeof(char16_t) == sizeof(uint16_t), "your architecture's `char16_t` is not 16 bits"); +static_assert(sizeof(char32_t) == sizeof(uint32_t), "your architecture's `char32_t` is not 32 bits"); + +typedef struct DiplomatWrite { + void* context; + char* buf; + size_t len; + size_t cap; + bool grow_failed; + void (*flush)(struct DiplomatWrite*); + bool (*grow)(struct DiplomatWrite*, size_t); +} DiplomatWrite; + +bool diplomat_is_str(const char* buf, size_t len); + +#define MAKE_SLICES(name, c_ty) \ + typedef struct Diplomat##name##View { \ + const c_ty* data; \ + size_t len; \ + } Diplomat##name##View; \ + typedef struct Diplomat##name##ViewMut { \ + c_ty* data; \ + size_t len; \ + } Diplomat##name##ViewMut; \ + typedef struct Diplomat##name##Array { \ + const c_ty* data; \ + size_t len; \ + } Diplomat##name##Array; + +#define MAKE_SLICES_AND_OPTIONS(name, c_ty) \ + MAKE_SLICES(name, c_ty) \ + typedef struct Option##name {union { c_ty ok; }; bool is_ok; } Option##name; \ + typedef struct Option##name##View {union { Diplomat##name##View ok; }; bool is_ok; } Option##name##View; \ + typedef struct Option##name##ViewMut {union { Diplomat##name##ViewMut ok; }; bool is_ok; } Option##name##ViewMut; \ + typedef struct Option##name##Array {union { Diplomat##name##Array ok; }; bool is_ok; } Option##name##Array; \ + +MAKE_SLICES_AND_OPTIONS(I8, int8_t) +MAKE_SLICES_AND_OPTIONS(U8, uint8_t) +MAKE_SLICES_AND_OPTIONS(I16, int16_t) +MAKE_SLICES_AND_OPTIONS(U16, uint16_t) +MAKE_SLICES_AND_OPTIONS(I32, int32_t) +MAKE_SLICES_AND_OPTIONS(U32, uint32_t) +MAKE_SLICES_AND_OPTIONS(I64, int64_t) +MAKE_SLICES_AND_OPTIONS(U64, uint64_t) +MAKE_SLICES_AND_OPTIONS(Isize, intptr_t) +MAKE_SLICES_AND_OPTIONS(Usize, size_t) +MAKE_SLICES_AND_OPTIONS(F32, float) +MAKE_SLICES_AND_OPTIONS(F64, double) +MAKE_SLICES_AND_OPTIONS(Bool, bool) +MAKE_SLICES_AND_OPTIONS(Char, char32_t) +MAKE_SLICES_AND_OPTIONS(String, char) +MAKE_SLICES_AND_OPTIONS(String16, char16_t) +MAKE_SLICES_AND_OPTIONS(Strings, DiplomatStringView) +MAKE_SLICES_AND_OPTIONS(Strings16, DiplomatString16View) + +DiplomatWrite diplomat_simple_write(char* buf, size_t buf_size); + +DiplomatWrite* diplomat_buffer_write_create(size_t cap); +char* diplomat_buffer_write_get_bytes(DiplomatWrite* t); +size_t diplomat_buffer_write_len(DiplomatWrite* t); +void diplomat_buffer_write_destroy(DiplomatWrite* t); + +#endif diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/AnyCalendarKind.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/AnyCalendarKind.d.hpp new file mode 100644 index 00000000000000..d7d93fd3386c8d --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/AnyCalendarKind.d.hpp @@ -0,0 +1,89 @@ +#ifndef TEMPORAL_RS_AnyCalendarKind_D_HPP +#define TEMPORAL_RS_AnyCalendarKind_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" +namespace temporal_rs { +class AnyCalendarKind; +} // namespace temporal_rs + + + +namespace temporal_rs { +namespace capi { + enum AnyCalendarKind { + AnyCalendarKind_Buddhist = 0, + AnyCalendarKind_Chinese = 1, + AnyCalendarKind_Coptic = 2, + AnyCalendarKind_Dangi = 3, + AnyCalendarKind_Ethiopian = 4, + AnyCalendarKind_EthiopianAmeteAlem = 5, + AnyCalendarKind_Gregorian = 6, + AnyCalendarKind_Hebrew = 7, + AnyCalendarKind_Indian = 8, + AnyCalendarKind_HijriTabularTypeIIFriday = 9, + AnyCalendarKind_HijriSimulatedMecca = 10, + AnyCalendarKind_HijriTabularTypeIIThursday = 11, + AnyCalendarKind_HijriUmmAlQura = 12, + AnyCalendarKind_Iso = 13, + AnyCalendarKind_Japanese = 14, + AnyCalendarKind_JapaneseExtended = 15, + AnyCalendarKind_Persian = 16, + AnyCalendarKind_Roc = 17, + }; + + typedef struct AnyCalendarKind_option {union { AnyCalendarKind ok; }; bool is_ok; } AnyCalendarKind_option; +} // namespace capi +} // namespace + +namespace temporal_rs { +class AnyCalendarKind { +public: + enum Value { + Buddhist = 0, + Chinese = 1, + Coptic = 2, + Dangi = 3, + Ethiopian = 4, + EthiopianAmeteAlem = 5, + Gregorian = 6, + Hebrew = 7, + Indian = 8, + HijriTabularTypeIIFriday = 9, + HijriSimulatedMecca = 10, + HijriTabularTypeIIThursday = 11, + HijriUmmAlQura = 12, + Iso = 13, + Japanese = 14, + JapaneseExtended = 15, + Persian = 16, + Roc = 17, + }; + + AnyCalendarKind(): value(Value::Buddhist) {} + + // Implicit conversions between enum and ::Value + constexpr AnyCalendarKind(Value v) : value(v) {} + constexpr operator Value() const { return value; } + // Prevent usage as boolean value + explicit operator bool() const = delete; + + inline static std::optional get_for_str(std::string_view s); + + inline static std::optional parse_temporal_calendar_string(std::string_view s); + + inline temporal_rs::capi::AnyCalendarKind AsFFI() const; + inline static temporal_rs::AnyCalendarKind FromFFI(temporal_rs::capi::AnyCalendarKind c_enum); +private: + Value value; +}; + +} // namespace +#endif // TEMPORAL_RS_AnyCalendarKind_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/AnyCalendarKind.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/AnyCalendarKind.hpp new file mode 100644 index 00000000000000..810aae25a504f3 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/AnyCalendarKind.hpp @@ -0,0 +1,70 @@ +#ifndef TEMPORAL_RS_AnyCalendarKind_HPP +#define TEMPORAL_RS_AnyCalendarKind_HPP + +#include "AnyCalendarKind.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + typedef struct temporal_rs_AnyCalendarKind_get_for_str_result {union {temporal_rs::capi::AnyCalendarKind ok; }; bool is_ok;} temporal_rs_AnyCalendarKind_get_for_str_result; + temporal_rs_AnyCalendarKind_get_for_str_result temporal_rs_AnyCalendarKind_get_for_str(temporal_rs::diplomat::capi::DiplomatStringView s); + + typedef struct temporal_rs_AnyCalendarKind_parse_temporal_calendar_string_result {union {temporal_rs::capi::AnyCalendarKind ok; }; bool is_ok;} temporal_rs_AnyCalendarKind_parse_temporal_calendar_string_result; + temporal_rs_AnyCalendarKind_parse_temporal_calendar_string_result temporal_rs_AnyCalendarKind_parse_temporal_calendar_string(temporal_rs::diplomat::capi::DiplomatStringView s); + + } // extern "C" +} // namespace capi +} // namespace + +inline temporal_rs::capi::AnyCalendarKind temporal_rs::AnyCalendarKind::AsFFI() const { + return static_cast(value); +} + +inline temporal_rs::AnyCalendarKind temporal_rs::AnyCalendarKind::FromFFI(temporal_rs::capi::AnyCalendarKind c_enum) { + switch (c_enum) { + case temporal_rs::capi::AnyCalendarKind_Buddhist: + case temporal_rs::capi::AnyCalendarKind_Chinese: + case temporal_rs::capi::AnyCalendarKind_Coptic: + case temporal_rs::capi::AnyCalendarKind_Dangi: + case temporal_rs::capi::AnyCalendarKind_Ethiopian: + case temporal_rs::capi::AnyCalendarKind_EthiopianAmeteAlem: + case temporal_rs::capi::AnyCalendarKind_Gregorian: + case temporal_rs::capi::AnyCalendarKind_Hebrew: + case temporal_rs::capi::AnyCalendarKind_Indian: + case temporal_rs::capi::AnyCalendarKind_HijriTabularTypeIIFriday: + case temporal_rs::capi::AnyCalendarKind_HijriSimulatedMecca: + case temporal_rs::capi::AnyCalendarKind_HijriTabularTypeIIThursday: + case temporal_rs::capi::AnyCalendarKind_HijriUmmAlQura: + case temporal_rs::capi::AnyCalendarKind_Iso: + case temporal_rs::capi::AnyCalendarKind_Japanese: + case temporal_rs::capi::AnyCalendarKind_JapaneseExtended: + case temporal_rs::capi::AnyCalendarKind_Persian: + case temporal_rs::capi::AnyCalendarKind_Roc: + return static_cast(c_enum); + default: + std::abort(); + } +} + +inline std::optional temporal_rs::AnyCalendarKind::get_for_str(std::string_view s) { + auto result = temporal_rs::capi::temporal_rs_AnyCalendarKind_get_for_str({s.data(), s.size()}); + return result.is_ok ? std::optional(temporal_rs::AnyCalendarKind::FromFFI(result.ok)) : std::nullopt; +} + +inline std::optional temporal_rs::AnyCalendarKind::parse_temporal_calendar_string(std::string_view s) { + auto result = temporal_rs::capi::temporal_rs_AnyCalendarKind_parse_temporal_calendar_string({s.data(), s.size()}); + return result.is_ok ? std::optional(temporal_rs::AnyCalendarKind::FromFFI(result.ok)) : std::nullopt; +} +#endif // TEMPORAL_RS_AnyCalendarKind_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ArithmeticOverflow.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ArithmeticOverflow.d.hpp new file mode 100644 index 00000000000000..0e912957885a68 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ArithmeticOverflow.d.hpp @@ -0,0 +1,49 @@ +#ifndef TEMPORAL_RS_ArithmeticOverflow_D_HPP +#define TEMPORAL_RS_ArithmeticOverflow_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + enum ArithmeticOverflow { + ArithmeticOverflow_Constrain = 0, + ArithmeticOverflow_Reject = 1, + }; + + typedef struct ArithmeticOverflow_option {union { ArithmeticOverflow ok; }; bool is_ok; } ArithmeticOverflow_option; +} // namespace capi +} // namespace + +namespace temporal_rs { +class ArithmeticOverflow { +public: + enum Value { + Constrain = 0, + Reject = 1, + }; + + ArithmeticOverflow(): value(Value::Constrain) {} + + // Implicit conversions between enum and ::Value + constexpr ArithmeticOverflow(Value v) : value(v) {} + constexpr operator Value() const { return value; } + // Prevent usage as boolean value + explicit operator bool() const = delete; + + inline temporal_rs::capi::ArithmeticOverflow AsFFI() const; + inline static temporal_rs::ArithmeticOverflow FromFFI(temporal_rs::capi::ArithmeticOverflow c_enum); +private: + Value value; +}; + +} // namespace +#endif // TEMPORAL_RS_ArithmeticOverflow_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ArithmeticOverflow.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ArithmeticOverflow.hpp new file mode 100644 index 00000000000000..10a1773866e934 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ArithmeticOverflow.hpp @@ -0,0 +1,38 @@ +#ifndef TEMPORAL_RS_ArithmeticOverflow_HPP +#define TEMPORAL_RS_ArithmeticOverflow_HPP + +#include "ArithmeticOverflow.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + } // extern "C" +} // namespace capi +} // namespace + +inline temporal_rs::capi::ArithmeticOverflow temporal_rs::ArithmeticOverflow::AsFFI() const { + return static_cast(value); +} + +inline temporal_rs::ArithmeticOverflow temporal_rs::ArithmeticOverflow::FromFFI(temporal_rs::capi::ArithmeticOverflow c_enum) { + switch (c_enum) { + case temporal_rs::capi::ArithmeticOverflow_Constrain: + case temporal_rs::capi::ArithmeticOverflow_Reject: + return static_cast(c_enum); + default: + std::abort(); + } +} +#endif // TEMPORAL_RS_ArithmeticOverflow_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Calendar.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Calendar.d.hpp new file mode 100644 index 00000000000000..fe042ea08e224f --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Calendar.d.hpp @@ -0,0 +1,64 @@ +#ifndef TEMPORAL_RS_Calendar_D_HPP +#define TEMPORAL_RS_Calendar_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" +namespace temporal_rs { +namespace capi { struct Calendar; } +class Calendar; +struct TemporalError; +class AnyCalendarKind; +} // namespace temporal_rs + + + +namespace temporal_rs { +namespace capi { + struct Calendar; +} // namespace capi +} // namespace + +namespace temporal_rs { +/** + * By and large one should not need to construct this type; it mostly exists + * to represent calendar data found on other Temporal types, obtained via `.calendar()`. + */ +class Calendar { +public: + + inline static std::unique_ptr try_new_constrain(temporal_rs::AnyCalendarKind kind); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_utf8(std::string_view s); + + inline bool is_iso() const; + + inline std::string_view identifier() const; + + /** + * Returns the kind of this calendar + */ + inline temporal_rs::AnyCalendarKind kind() const; + + inline const temporal_rs::capi::Calendar* AsFFI() const; + inline temporal_rs::capi::Calendar* AsFFI(); + inline static const temporal_rs::Calendar* FromFFI(const temporal_rs::capi::Calendar* ptr); + inline static temporal_rs::Calendar* FromFFI(temporal_rs::capi::Calendar* ptr); + inline static void operator delete(void* ptr); +private: + Calendar() = delete; + Calendar(const temporal_rs::Calendar&) = delete; + Calendar(temporal_rs::Calendar&&) noexcept = delete; + Calendar operator=(const temporal_rs::Calendar&) = delete; + Calendar operator=(temporal_rs::Calendar&&) noexcept = delete; + static void operator delete[](void*, size_t) = delete; +}; + +} // namespace +#endif // TEMPORAL_RS_Calendar_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Calendar.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Calendar.hpp new file mode 100644 index 00000000000000..06509ab1a3f078 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Calendar.hpp @@ -0,0 +1,86 @@ +#ifndef TEMPORAL_RS_Calendar_HPP +#define TEMPORAL_RS_Calendar_HPP + +#include "Calendar.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "AnyCalendarKind.hpp" +#include "TemporalError.hpp" +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + temporal_rs::capi::Calendar* temporal_rs_Calendar_try_new_constrain(temporal_rs::capi::AnyCalendarKind kind); + + typedef struct temporal_rs_Calendar_from_utf8_result {union {temporal_rs::capi::Calendar* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_Calendar_from_utf8_result; + temporal_rs_Calendar_from_utf8_result temporal_rs_Calendar_from_utf8(temporal_rs::diplomat::capi::DiplomatStringView s); + + bool temporal_rs_Calendar_is_iso(const temporal_rs::capi::Calendar* self); + + temporal_rs::diplomat::capi::DiplomatStringView temporal_rs_Calendar_identifier(const temporal_rs::capi::Calendar* self); + + temporal_rs::capi::AnyCalendarKind temporal_rs_Calendar_kind(const temporal_rs::capi::Calendar* self); + + void temporal_rs_Calendar_destroy(Calendar* self); + + } // extern "C" +} // namespace capi +} // namespace + +inline std::unique_ptr temporal_rs::Calendar::try_new_constrain(temporal_rs::AnyCalendarKind kind) { + auto result = temporal_rs::capi::temporal_rs_Calendar_try_new_constrain(kind.AsFFI()); + return std::unique_ptr(temporal_rs::Calendar::FromFFI(result)); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::Calendar::from_utf8(std::string_view s) { + auto result = temporal_rs::capi::temporal_rs_Calendar_from_utf8({s.data(), s.size()}); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::Calendar::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline bool temporal_rs::Calendar::is_iso() const { + auto result = temporal_rs::capi::temporal_rs_Calendar_is_iso(this->AsFFI()); + return result; +} + +inline std::string_view temporal_rs::Calendar::identifier() const { + auto result = temporal_rs::capi::temporal_rs_Calendar_identifier(this->AsFFI()); + return std::string_view(result.data, result.len); +} + +inline temporal_rs::AnyCalendarKind temporal_rs::Calendar::kind() const { + auto result = temporal_rs::capi::temporal_rs_Calendar_kind(this->AsFFI()); + return temporal_rs::AnyCalendarKind::FromFFI(result); +} + +inline const temporal_rs::capi::Calendar* temporal_rs::Calendar::AsFFI() const { + return reinterpret_cast(this); +} + +inline temporal_rs::capi::Calendar* temporal_rs::Calendar::AsFFI() { + return reinterpret_cast(this); +} + +inline const temporal_rs::Calendar* temporal_rs::Calendar::FromFFI(const temporal_rs::capi::Calendar* ptr) { + return reinterpret_cast(ptr); +} + +inline temporal_rs::Calendar* temporal_rs::Calendar::FromFFI(temporal_rs::capi::Calendar* ptr) { + return reinterpret_cast(ptr); +} + +inline void temporal_rs::Calendar::operator delete(void* ptr) { + temporal_rs::capi::temporal_rs_Calendar_destroy(reinterpret_cast(ptr)); +} + + +#endif // TEMPORAL_RS_Calendar_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DateDuration.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DateDuration.d.hpp new file mode 100644 index 00000000000000..f677dcfe065563 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DateDuration.d.hpp @@ -0,0 +1,55 @@ +#ifndef TEMPORAL_RS_DateDuration_D_HPP +#define TEMPORAL_RS_DateDuration_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" +namespace temporal_rs { +namespace capi { struct DateDuration; } +class DateDuration; +struct TemporalError; +class Sign; +} // namespace temporal_rs + + + +namespace temporal_rs { +namespace capi { + struct DateDuration; +} // namespace capi +} // namespace + +namespace temporal_rs { +class DateDuration { +public: + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> try_new(int64_t years, int64_t months, int64_t weeks, int64_t days); + + inline std::unique_ptr abs() const; + + inline std::unique_ptr negated() const; + + inline temporal_rs::Sign sign() const; + + inline const temporal_rs::capi::DateDuration* AsFFI() const; + inline temporal_rs::capi::DateDuration* AsFFI(); + inline static const temporal_rs::DateDuration* FromFFI(const temporal_rs::capi::DateDuration* ptr); + inline static temporal_rs::DateDuration* FromFFI(temporal_rs::capi::DateDuration* ptr); + inline static void operator delete(void* ptr); +private: + DateDuration() = delete; + DateDuration(const temporal_rs::DateDuration&) = delete; + DateDuration(temporal_rs::DateDuration&&) noexcept = delete; + DateDuration operator=(const temporal_rs::DateDuration&) = delete; + DateDuration operator=(temporal_rs::DateDuration&&) noexcept = delete; + static void operator delete[](void*, size_t) = delete; +}; + +} // namespace +#endif // TEMPORAL_RS_DateDuration_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DateDuration.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DateDuration.hpp new file mode 100644 index 00000000000000..b41b4610e25779 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DateDuration.hpp @@ -0,0 +1,82 @@ +#ifndef TEMPORAL_RS_DateDuration_HPP +#define TEMPORAL_RS_DateDuration_HPP + +#include "DateDuration.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "Sign.hpp" +#include "TemporalError.hpp" +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + typedef struct temporal_rs_DateDuration_try_new_result {union {temporal_rs::capi::DateDuration* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_DateDuration_try_new_result; + temporal_rs_DateDuration_try_new_result temporal_rs_DateDuration_try_new(int64_t years, int64_t months, int64_t weeks, int64_t days); + + temporal_rs::capi::DateDuration* temporal_rs_DateDuration_abs(const temporal_rs::capi::DateDuration* self); + + temporal_rs::capi::DateDuration* temporal_rs_DateDuration_negated(const temporal_rs::capi::DateDuration* self); + + temporal_rs::capi::Sign temporal_rs_DateDuration_sign(const temporal_rs::capi::DateDuration* self); + + void temporal_rs_DateDuration_destroy(DateDuration* self); + + } // extern "C" +} // namespace capi +} // namespace + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::DateDuration::try_new(int64_t years, int64_t months, int64_t weeks, int64_t days) { + auto result = temporal_rs::capi::temporal_rs_DateDuration_try_new(years, + months, + weeks, + days); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::DateDuration::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline std::unique_ptr temporal_rs::DateDuration::abs() const { + auto result = temporal_rs::capi::temporal_rs_DateDuration_abs(this->AsFFI()); + return std::unique_ptr(temporal_rs::DateDuration::FromFFI(result)); +} + +inline std::unique_ptr temporal_rs::DateDuration::negated() const { + auto result = temporal_rs::capi::temporal_rs_DateDuration_negated(this->AsFFI()); + return std::unique_ptr(temporal_rs::DateDuration::FromFFI(result)); +} + +inline temporal_rs::Sign temporal_rs::DateDuration::sign() const { + auto result = temporal_rs::capi::temporal_rs_DateDuration_sign(this->AsFFI()); + return temporal_rs::Sign::FromFFI(result); +} + +inline const temporal_rs::capi::DateDuration* temporal_rs::DateDuration::AsFFI() const { + return reinterpret_cast(this); +} + +inline temporal_rs::capi::DateDuration* temporal_rs::DateDuration::AsFFI() { + return reinterpret_cast(this); +} + +inline const temporal_rs::DateDuration* temporal_rs::DateDuration::FromFFI(const temporal_rs::capi::DateDuration* ptr) { + return reinterpret_cast(ptr); +} + +inline temporal_rs::DateDuration* temporal_rs::DateDuration::FromFFI(temporal_rs::capi::DateDuration* ptr) { + return reinterpret_cast(ptr); +} + +inline void temporal_rs::DateDuration::operator delete(void* ptr) { + temporal_rs::capi::temporal_rs_DateDuration_destroy(reinterpret_cast(ptr)); +} + + +#endif // TEMPORAL_RS_DateDuration_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DifferenceSettings.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DifferenceSettings.d.hpp new file mode 100644 index 00000000000000..e87224fe4289ab --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DifferenceSettings.d.hpp @@ -0,0 +1,48 @@ +#ifndef TEMPORAL_RS_DifferenceSettings_D_HPP +#define TEMPORAL_RS_DifferenceSettings_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "RoundingMode.d.hpp" +#include "Unit.d.hpp" +#include "diplomat_runtime.hpp" +namespace temporal_rs { +class RoundingMode; +class Unit; +} // namespace temporal_rs + + + +namespace temporal_rs { +namespace capi { + struct DifferenceSettings { + temporal_rs::capi::Unit_option largest_unit; + temporal_rs::capi::Unit_option smallest_unit; + temporal_rs::capi::RoundingMode_option rounding_mode; + temporal_rs::diplomat::capi::OptionU32 increment; + }; + + typedef struct DifferenceSettings_option {union { DifferenceSettings ok; }; bool is_ok; } DifferenceSettings_option; +} // namespace capi +} // namespace + + +namespace temporal_rs { +struct DifferenceSettings { + std::optional largest_unit; + std::optional smallest_unit; + std::optional rounding_mode; + std::optional increment; + + inline temporal_rs::capi::DifferenceSettings AsFFI() const; + inline static temporal_rs::DifferenceSettings FromFFI(temporal_rs::capi::DifferenceSettings c_struct); +}; + +} // namespace +#endif // TEMPORAL_RS_DifferenceSettings_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DifferenceSettings.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DifferenceSettings.hpp new file mode 100644 index 00000000000000..d00ab0e5b7590c --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DifferenceSettings.hpp @@ -0,0 +1,47 @@ +#ifndef TEMPORAL_RS_DifferenceSettings_HPP +#define TEMPORAL_RS_DifferenceSettings_HPP + +#include "DifferenceSettings.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "RoundingMode.hpp" +#include "Unit.hpp" +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + } // extern "C" +} // namespace capi +} // namespace + + +inline temporal_rs::capi::DifferenceSettings temporal_rs::DifferenceSettings::AsFFI() const { + return temporal_rs::capi::DifferenceSettings { + /* .largest_unit = */ largest_unit.has_value() ? (temporal_rs::capi::Unit_option{ { largest_unit.value().AsFFI() }, true }) : (temporal_rs::capi::Unit_option{ {}, false }), + /* .smallest_unit = */ smallest_unit.has_value() ? (temporal_rs::capi::Unit_option{ { smallest_unit.value().AsFFI() }, true }) : (temporal_rs::capi::Unit_option{ {}, false }), + /* .rounding_mode = */ rounding_mode.has_value() ? (temporal_rs::capi::RoundingMode_option{ { rounding_mode.value().AsFFI() }, true }) : (temporal_rs::capi::RoundingMode_option{ {}, false }), + /* .increment = */ increment.has_value() ? (temporal_rs::diplomat::capi::OptionU32{ { increment.value() }, true }) : (temporal_rs::diplomat::capi::OptionU32{ {}, false }), + }; +} + +inline temporal_rs::DifferenceSettings temporal_rs::DifferenceSettings::FromFFI(temporal_rs::capi::DifferenceSettings c_struct) { + return temporal_rs::DifferenceSettings { + /* .largest_unit = */ c_struct.largest_unit.is_ok ? std::optional(temporal_rs::Unit::FromFFI(c_struct.largest_unit.ok)) : std::nullopt, + /* .smallest_unit = */ c_struct.smallest_unit.is_ok ? std::optional(temporal_rs::Unit::FromFFI(c_struct.smallest_unit.ok)) : std::nullopt, + /* .rounding_mode = */ c_struct.rounding_mode.is_ok ? std::optional(temporal_rs::RoundingMode::FromFFI(c_struct.rounding_mode.ok)) : std::nullopt, + /* .increment = */ c_struct.increment.is_ok ? std::optional(c_struct.increment.ok) : std::nullopt, + }; +} + + +#endif // TEMPORAL_RS_DifferenceSettings_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Disambiguation.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Disambiguation.d.hpp new file mode 100644 index 00000000000000..648cdc6e67bd81 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Disambiguation.d.hpp @@ -0,0 +1,53 @@ +#ifndef TEMPORAL_RS_Disambiguation_D_HPP +#define TEMPORAL_RS_Disambiguation_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + enum Disambiguation { + Disambiguation_Compatible = 0, + Disambiguation_Earlier = 1, + Disambiguation_Later = 2, + Disambiguation_Reject = 3, + }; + + typedef struct Disambiguation_option {union { Disambiguation ok; }; bool is_ok; } Disambiguation_option; +} // namespace capi +} // namespace + +namespace temporal_rs { +class Disambiguation { +public: + enum Value { + Compatible = 0, + Earlier = 1, + Later = 2, + Reject = 3, + }; + + Disambiguation(): value(Value::Compatible) {} + + // Implicit conversions between enum and ::Value + constexpr Disambiguation(Value v) : value(v) {} + constexpr operator Value() const { return value; } + // Prevent usage as boolean value + explicit operator bool() const = delete; + + inline temporal_rs::capi::Disambiguation AsFFI() const; + inline static temporal_rs::Disambiguation FromFFI(temporal_rs::capi::Disambiguation c_enum); +private: + Value value; +}; + +} // namespace +#endif // TEMPORAL_RS_Disambiguation_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Disambiguation.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Disambiguation.hpp new file mode 100644 index 00000000000000..15476c9ed7512d --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Disambiguation.hpp @@ -0,0 +1,40 @@ +#ifndef TEMPORAL_RS_Disambiguation_HPP +#define TEMPORAL_RS_Disambiguation_HPP + +#include "Disambiguation.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + } // extern "C" +} // namespace capi +} // namespace + +inline temporal_rs::capi::Disambiguation temporal_rs::Disambiguation::AsFFI() const { + return static_cast(value); +} + +inline temporal_rs::Disambiguation temporal_rs::Disambiguation::FromFFI(temporal_rs::capi::Disambiguation c_enum) { + switch (c_enum) { + case temporal_rs::capi::Disambiguation_Compatible: + case temporal_rs::capi::Disambiguation_Earlier: + case temporal_rs::capi::Disambiguation_Later: + case temporal_rs::capi::Disambiguation_Reject: + return static_cast(c_enum); + default: + std::abort(); + } +} +#endif // TEMPORAL_RS_Disambiguation_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DisplayCalendar.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DisplayCalendar.d.hpp new file mode 100644 index 00000000000000..272ccb3e6afc75 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DisplayCalendar.d.hpp @@ -0,0 +1,53 @@ +#ifndef TEMPORAL_RS_DisplayCalendar_D_HPP +#define TEMPORAL_RS_DisplayCalendar_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + enum DisplayCalendar { + DisplayCalendar_Auto = 0, + DisplayCalendar_Always = 1, + DisplayCalendar_Never = 2, + DisplayCalendar_Critical = 3, + }; + + typedef struct DisplayCalendar_option {union { DisplayCalendar ok; }; bool is_ok; } DisplayCalendar_option; +} // namespace capi +} // namespace + +namespace temporal_rs { +class DisplayCalendar { +public: + enum Value { + Auto = 0, + Always = 1, + Never = 2, + Critical = 3, + }; + + DisplayCalendar(): value(Value::Auto) {} + + // Implicit conversions between enum and ::Value + constexpr DisplayCalendar(Value v) : value(v) {} + constexpr operator Value() const { return value; } + // Prevent usage as boolean value + explicit operator bool() const = delete; + + inline temporal_rs::capi::DisplayCalendar AsFFI() const; + inline static temporal_rs::DisplayCalendar FromFFI(temporal_rs::capi::DisplayCalendar c_enum); +private: + Value value; +}; + +} // namespace +#endif // TEMPORAL_RS_DisplayCalendar_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DisplayCalendar.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DisplayCalendar.hpp new file mode 100644 index 00000000000000..4225d477d4510a --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DisplayCalendar.hpp @@ -0,0 +1,40 @@ +#ifndef TEMPORAL_RS_DisplayCalendar_HPP +#define TEMPORAL_RS_DisplayCalendar_HPP + +#include "DisplayCalendar.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + } // extern "C" +} // namespace capi +} // namespace + +inline temporal_rs::capi::DisplayCalendar temporal_rs::DisplayCalendar::AsFFI() const { + return static_cast(value); +} + +inline temporal_rs::DisplayCalendar temporal_rs::DisplayCalendar::FromFFI(temporal_rs::capi::DisplayCalendar c_enum) { + switch (c_enum) { + case temporal_rs::capi::DisplayCalendar_Auto: + case temporal_rs::capi::DisplayCalendar_Always: + case temporal_rs::capi::DisplayCalendar_Never: + case temporal_rs::capi::DisplayCalendar_Critical: + return static_cast(c_enum); + default: + std::abort(); + } +} +#endif // TEMPORAL_RS_DisplayCalendar_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DisplayOffset.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DisplayOffset.d.hpp new file mode 100644 index 00000000000000..da19e959cd4f0f --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DisplayOffset.d.hpp @@ -0,0 +1,49 @@ +#ifndef TEMPORAL_RS_DisplayOffset_D_HPP +#define TEMPORAL_RS_DisplayOffset_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + enum DisplayOffset { + DisplayOffset_Auto = 0, + DisplayOffset_Never = 1, + }; + + typedef struct DisplayOffset_option {union { DisplayOffset ok; }; bool is_ok; } DisplayOffset_option; +} // namespace capi +} // namespace + +namespace temporal_rs { +class DisplayOffset { +public: + enum Value { + Auto = 0, + Never = 1, + }; + + DisplayOffset(): value(Value::Auto) {} + + // Implicit conversions between enum and ::Value + constexpr DisplayOffset(Value v) : value(v) {} + constexpr operator Value() const { return value; } + // Prevent usage as boolean value + explicit operator bool() const = delete; + + inline temporal_rs::capi::DisplayOffset AsFFI() const; + inline static temporal_rs::DisplayOffset FromFFI(temporal_rs::capi::DisplayOffset c_enum); +private: + Value value; +}; + +} // namespace +#endif // TEMPORAL_RS_DisplayOffset_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DisplayOffset.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DisplayOffset.hpp new file mode 100644 index 00000000000000..ab63e3fe1d7d27 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DisplayOffset.hpp @@ -0,0 +1,38 @@ +#ifndef TEMPORAL_RS_DisplayOffset_HPP +#define TEMPORAL_RS_DisplayOffset_HPP + +#include "DisplayOffset.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + } // extern "C" +} // namespace capi +} // namespace + +inline temporal_rs::capi::DisplayOffset temporal_rs::DisplayOffset::AsFFI() const { + return static_cast(value); +} + +inline temporal_rs::DisplayOffset temporal_rs::DisplayOffset::FromFFI(temporal_rs::capi::DisplayOffset c_enum) { + switch (c_enum) { + case temporal_rs::capi::DisplayOffset_Auto: + case temporal_rs::capi::DisplayOffset_Never: + return static_cast(c_enum); + default: + std::abort(); + } +} +#endif // TEMPORAL_RS_DisplayOffset_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DisplayTimeZone.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DisplayTimeZone.d.hpp new file mode 100644 index 00000000000000..3e2ec215506047 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DisplayTimeZone.d.hpp @@ -0,0 +1,51 @@ +#ifndef TEMPORAL_RS_DisplayTimeZone_D_HPP +#define TEMPORAL_RS_DisplayTimeZone_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + enum DisplayTimeZone { + DisplayTimeZone_Auto = 0, + DisplayTimeZone_Never = 1, + DisplayTimeZone_Critical = 2, + }; + + typedef struct DisplayTimeZone_option {union { DisplayTimeZone ok; }; bool is_ok; } DisplayTimeZone_option; +} // namespace capi +} // namespace + +namespace temporal_rs { +class DisplayTimeZone { +public: + enum Value { + Auto = 0, + Never = 1, + Critical = 2, + }; + + DisplayTimeZone(): value(Value::Auto) {} + + // Implicit conversions between enum and ::Value + constexpr DisplayTimeZone(Value v) : value(v) {} + constexpr operator Value() const { return value; } + // Prevent usage as boolean value + explicit operator bool() const = delete; + + inline temporal_rs::capi::DisplayTimeZone AsFFI() const; + inline static temporal_rs::DisplayTimeZone FromFFI(temporal_rs::capi::DisplayTimeZone c_enum); +private: + Value value; +}; + +} // namespace +#endif // TEMPORAL_RS_DisplayTimeZone_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DisplayTimeZone.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DisplayTimeZone.hpp new file mode 100644 index 00000000000000..3341bd73be3c61 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/DisplayTimeZone.hpp @@ -0,0 +1,39 @@ +#ifndef TEMPORAL_RS_DisplayTimeZone_HPP +#define TEMPORAL_RS_DisplayTimeZone_HPP + +#include "DisplayTimeZone.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + } // extern "C" +} // namespace capi +} // namespace + +inline temporal_rs::capi::DisplayTimeZone temporal_rs::DisplayTimeZone::AsFFI() const { + return static_cast(value); +} + +inline temporal_rs::DisplayTimeZone temporal_rs::DisplayTimeZone::FromFFI(temporal_rs::capi::DisplayTimeZone c_enum) { + switch (c_enum) { + case temporal_rs::capi::DisplayTimeZone_Auto: + case temporal_rs::capi::DisplayTimeZone_Never: + case temporal_rs::capi::DisplayTimeZone_Critical: + return static_cast(c_enum); + default: + std::abort(); + } +} +#endif // TEMPORAL_RS_DisplayTimeZone_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Duration.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Duration.d.hpp new file mode 100644 index 00000000000000..8357d229f8e36e --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Duration.d.hpp @@ -0,0 +1,119 @@ +#ifndef TEMPORAL_RS_Duration_D_HPP +#define TEMPORAL_RS_Duration_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" +namespace temporal_rs { +namespace capi { struct Duration; } +class Duration; +namespace capi { struct Provider; } +class Provider; +struct PartialDuration; +struct RelativeTo; +struct RoundingOptions; +struct TemporalError; +struct ToStringRoundingOptions; +class Sign; +class Unit; +} // namespace temporal_rs + + + +namespace temporal_rs { +namespace capi { + struct Duration; +} // namespace capi +} // namespace + +namespace temporal_rs { +class Duration { +public: + + /** + * Temporary API until v8 can move off of it + */ + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> create(int64_t years, int64_t months, int64_t weeks, int64_t days, int64_t hours, int64_t minutes, int64_t seconds, int64_t milliseconds, double microseconds, double nanoseconds); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> try_new(int64_t years, int64_t months, int64_t weeks, int64_t days, int64_t hours, int64_t minutes, int64_t seconds, int64_t milliseconds, double microseconds, double nanoseconds); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_partial_duration(temporal_rs::PartialDuration partial); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_utf8(std::string_view s); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_utf16(std::u16string_view s); + + inline bool is_time_within_range() const; + + inline int64_t years() const; + + inline int64_t months() const; + + inline int64_t weeks() const; + + inline int64_t days() const; + + inline int64_t hours() const; + + inline int64_t minutes() const; + + inline int64_t seconds() const; + + inline int64_t milliseconds() const; + + inline double microseconds() const; + + inline double nanoseconds() const; + + inline temporal_rs::Sign sign() const; + + inline bool is_zero() const; + + inline std::unique_ptr abs() const; + + inline std::unique_ptr negated() const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> add(const temporal_rs::Duration& other) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> subtract(const temporal_rs::Duration& other) const; + + inline temporal_rs::diplomat::result to_string(temporal_rs::ToStringRoundingOptions options) const; + template + inline temporal_rs::diplomat::result to_string_write(temporal_rs::ToStringRoundingOptions options, W& writeable_output) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> round(temporal_rs::RoundingOptions options, temporal_rs::RelativeTo relative_to) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> round_with_provider(temporal_rs::RoundingOptions options, temporal_rs::RelativeTo relative_to, const temporal_rs::Provider& p) const; + + inline temporal_rs::diplomat::result compare(const temporal_rs::Duration& other, temporal_rs::RelativeTo relative_to) const; + + inline temporal_rs::diplomat::result compare_with_provider(const temporal_rs::Duration& other, temporal_rs::RelativeTo relative_to, const temporal_rs::Provider& p) const; + + inline temporal_rs::diplomat::result total(temporal_rs::Unit unit, temporal_rs::RelativeTo relative_to) const; + + inline temporal_rs::diplomat::result total_with_provider(temporal_rs::Unit unit, temporal_rs::RelativeTo relative_to, const temporal_rs::Provider& p) const; + + inline std::unique_ptr clone() const; + + inline const temporal_rs::capi::Duration* AsFFI() const; + inline temporal_rs::capi::Duration* AsFFI(); + inline static const temporal_rs::Duration* FromFFI(const temporal_rs::capi::Duration* ptr); + inline static temporal_rs::Duration* FromFFI(temporal_rs::capi::Duration* ptr); + inline static void operator delete(void* ptr); +private: + Duration() = delete; + Duration(const temporal_rs::Duration&) = delete; + Duration(temporal_rs::Duration&&) noexcept = delete; + Duration operator=(const temporal_rs::Duration&) = delete; + Duration operator=(temporal_rs::Duration&&) noexcept = delete; + static void operator delete[](void*, size_t) = delete; +}; + +} // namespace +#endif // TEMPORAL_RS_Duration_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Duration.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Duration.hpp new file mode 100644 index 00000000000000..af3f0cd449d42d --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Duration.hpp @@ -0,0 +1,327 @@ +#ifndef TEMPORAL_RS_Duration_HPP +#define TEMPORAL_RS_Duration_HPP + +#include "Duration.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "PartialDuration.hpp" +#include "Provider.hpp" +#include "RelativeTo.hpp" +#include "RoundingOptions.hpp" +#include "Sign.hpp" +#include "TemporalError.hpp" +#include "ToStringRoundingOptions.hpp" +#include "Unit.hpp" +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + typedef struct temporal_rs_Duration_create_result {union {temporal_rs::capi::Duration* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_Duration_create_result; + temporal_rs_Duration_create_result temporal_rs_Duration_create(int64_t years, int64_t months, int64_t weeks, int64_t days, int64_t hours, int64_t minutes, int64_t seconds, int64_t milliseconds, double microseconds, double nanoseconds); + + typedef struct temporal_rs_Duration_try_new_result {union {temporal_rs::capi::Duration* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_Duration_try_new_result; + temporal_rs_Duration_try_new_result temporal_rs_Duration_try_new(int64_t years, int64_t months, int64_t weeks, int64_t days, int64_t hours, int64_t minutes, int64_t seconds, int64_t milliseconds, double microseconds, double nanoseconds); + + typedef struct temporal_rs_Duration_from_partial_duration_result {union {temporal_rs::capi::Duration* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_Duration_from_partial_duration_result; + temporal_rs_Duration_from_partial_duration_result temporal_rs_Duration_from_partial_duration(temporal_rs::capi::PartialDuration partial); + + typedef struct temporal_rs_Duration_from_utf8_result {union {temporal_rs::capi::Duration* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_Duration_from_utf8_result; + temporal_rs_Duration_from_utf8_result temporal_rs_Duration_from_utf8(temporal_rs::diplomat::capi::DiplomatStringView s); + + typedef struct temporal_rs_Duration_from_utf16_result {union {temporal_rs::capi::Duration* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_Duration_from_utf16_result; + temporal_rs_Duration_from_utf16_result temporal_rs_Duration_from_utf16(temporal_rs::diplomat::capi::DiplomatString16View s); + + bool temporal_rs_Duration_is_time_within_range(const temporal_rs::capi::Duration* self); + + int64_t temporal_rs_Duration_years(const temporal_rs::capi::Duration* self); + + int64_t temporal_rs_Duration_months(const temporal_rs::capi::Duration* self); + + int64_t temporal_rs_Duration_weeks(const temporal_rs::capi::Duration* self); + + int64_t temporal_rs_Duration_days(const temporal_rs::capi::Duration* self); + + int64_t temporal_rs_Duration_hours(const temporal_rs::capi::Duration* self); + + int64_t temporal_rs_Duration_minutes(const temporal_rs::capi::Duration* self); + + int64_t temporal_rs_Duration_seconds(const temporal_rs::capi::Duration* self); + + int64_t temporal_rs_Duration_milliseconds(const temporal_rs::capi::Duration* self); + + double temporal_rs_Duration_microseconds(const temporal_rs::capi::Duration* self); + + double temporal_rs_Duration_nanoseconds(const temporal_rs::capi::Duration* self); + + temporal_rs::capi::Sign temporal_rs_Duration_sign(const temporal_rs::capi::Duration* self); + + bool temporal_rs_Duration_is_zero(const temporal_rs::capi::Duration* self); + + temporal_rs::capi::Duration* temporal_rs_Duration_abs(const temporal_rs::capi::Duration* self); + + temporal_rs::capi::Duration* temporal_rs_Duration_negated(const temporal_rs::capi::Duration* self); + + typedef struct temporal_rs_Duration_add_result {union {temporal_rs::capi::Duration* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_Duration_add_result; + temporal_rs_Duration_add_result temporal_rs_Duration_add(const temporal_rs::capi::Duration* self, const temporal_rs::capi::Duration* other); + + typedef struct temporal_rs_Duration_subtract_result {union {temporal_rs::capi::Duration* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_Duration_subtract_result; + temporal_rs_Duration_subtract_result temporal_rs_Duration_subtract(const temporal_rs::capi::Duration* self, const temporal_rs::capi::Duration* other); + + typedef struct temporal_rs_Duration_to_string_result {union { temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_Duration_to_string_result; + temporal_rs_Duration_to_string_result temporal_rs_Duration_to_string(const temporal_rs::capi::Duration* self, temporal_rs::capi::ToStringRoundingOptions options, temporal_rs::diplomat::capi::DiplomatWrite* write); + + typedef struct temporal_rs_Duration_round_result {union {temporal_rs::capi::Duration* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_Duration_round_result; + temporal_rs_Duration_round_result temporal_rs_Duration_round(const temporal_rs::capi::Duration* self, temporal_rs::capi::RoundingOptions options, temporal_rs::capi::RelativeTo relative_to); + + typedef struct temporal_rs_Duration_round_with_provider_result {union {temporal_rs::capi::Duration* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_Duration_round_with_provider_result; + temporal_rs_Duration_round_with_provider_result temporal_rs_Duration_round_with_provider(const temporal_rs::capi::Duration* self, temporal_rs::capi::RoundingOptions options, temporal_rs::capi::RelativeTo relative_to, const temporal_rs::capi::Provider* p); + + typedef struct temporal_rs_Duration_compare_result {union {int8_t ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_Duration_compare_result; + temporal_rs_Duration_compare_result temporal_rs_Duration_compare(const temporal_rs::capi::Duration* self, const temporal_rs::capi::Duration* other, temporal_rs::capi::RelativeTo relative_to); + + typedef struct temporal_rs_Duration_compare_with_provider_result {union {int8_t ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_Duration_compare_with_provider_result; + temporal_rs_Duration_compare_with_provider_result temporal_rs_Duration_compare_with_provider(const temporal_rs::capi::Duration* self, const temporal_rs::capi::Duration* other, temporal_rs::capi::RelativeTo relative_to, const temporal_rs::capi::Provider* p); + + typedef struct temporal_rs_Duration_total_result {union {double ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_Duration_total_result; + temporal_rs_Duration_total_result temporal_rs_Duration_total(const temporal_rs::capi::Duration* self, temporal_rs::capi::Unit unit, temporal_rs::capi::RelativeTo relative_to); + + typedef struct temporal_rs_Duration_total_with_provider_result {union {double ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_Duration_total_with_provider_result; + temporal_rs_Duration_total_with_provider_result temporal_rs_Duration_total_with_provider(const temporal_rs::capi::Duration* self, temporal_rs::capi::Unit unit, temporal_rs::capi::RelativeTo relative_to, const temporal_rs::capi::Provider* p); + + temporal_rs::capi::Duration* temporal_rs_Duration_clone(const temporal_rs::capi::Duration* self); + + void temporal_rs_Duration_destroy(Duration* self); + + } // extern "C" +} // namespace capi +} // namespace + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::Duration::create(int64_t years, int64_t months, int64_t weeks, int64_t days, int64_t hours, int64_t minutes, int64_t seconds, int64_t milliseconds, double microseconds, double nanoseconds) { + auto result = temporal_rs::capi::temporal_rs_Duration_create(years, + months, + weeks, + days, + hours, + minutes, + seconds, + milliseconds, + microseconds, + nanoseconds); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::Duration::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::Duration::try_new(int64_t years, int64_t months, int64_t weeks, int64_t days, int64_t hours, int64_t minutes, int64_t seconds, int64_t milliseconds, double microseconds, double nanoseconds) { + auto result = temporal_rs::capi::temporal_rs_Duration_try_new(years, + months, + weeks, + days, + hours, + minutes, + seconds, + milliseconds, + microseconds, + nanoseconds); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::Duration::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::Duration::from_partial_duration(temporal_rs::PartialDuration partial) { + auto result = temporal_rs::capi::temporal_rs_Duration_from_partial_duration(partial.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::Duration::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::Duration::from_utf8(std::string_view s) { + auto result = temporal_rs::capi::temporal_rs_Duration_from_utf8({s.data(), s.size()}); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::Duration::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::Duration::from_utf16(std::u16string_view s) { + auto result = temporal_rs::capi::temporal_rs_Duration_from_utf16({s.data(), s.size()}); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::Duration::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline bool temporal_rs::Duration::is_time_within_range() const { + auto result = temporal_rs::capi::temporal_rs_Duration_is_time_within_range(this->AsFFI()); + return result; +} + +inline int64_t temporal_rs::Duration::years() const { + auto result = temporal_rs::capi::temporal_rs_Duration_years(this->AsFFI()); + return result; +} + +inline int64_t temporal_rs::Duration::months() const { + auto result = temporal_rs::capi::temporal_rs_Duration_months(this->AsFFI()); + return result; +} + +inline int64_t temporal_rs::Duration::weeks() const { + auto result = temporal_rs::capi::temporal_rs_Duration_weeks(this->AsFFI()); + return result; +} + +inline int64_t temporal_rs::Duration::days() const { + auto result = temporal_rs::capi::temporal_rs_Duration_days(this->AsFFI()); + return result; +} + +inline int64_t temporal_rs::Duration::hours() const { + auto result = temporal_rs::capi::temporal_rs_Duration_hours(this->AsFFI()); + return result; +} + +inline int64_t temporal_rs::Duration::minutes() const { + auto result = temporal_rs::capi::temporal_rs_Duration_minutes(this->AsFFI()); + return result; +} + +inline int64_t temporal_rs::Duration::seconds() const { + auto result = temporal_rs::capi::temporal_rs_Duration_seconds(this->AsFFI()); + return result; +} + +inline int64_t temporal_rs::Duration::milliseconds() const { + auto result = temporal_rs::capi::temporal_rs_Duration_milliseconds(this->AsFFI()); + return result; +} + +inline double temporal_rs::Duration::microseconds() const { + auto result = temporal_rs::capi::temporal_rs_Duration_microseconds(this->AsFFI()); + return result; +} + +inline double temporal_rs::Duration::nanoseconds() const { + auto result = temporal_rs::capi::temporal_rs_Duration_nanoseconds(this->AsFFI()); + return result; +} + +inline temporal_rs::Sign temporal_rs::Duration::sign() const { + auto result = temporal_rs::capi::temporal_rs_Duration_sign(this->AsFFI()); + return temporal_rs::Sign::FromFFI(result); +} + +inline bool temporal_rs::Duration::is_zero() const { + auto result = temporal_rs::capi::temporal_rs_Duration_is_zero(this->AsFFI()); + return result; +} + +inline std::unique_ptr temporal_rs::Duration::abs() const { + auto result = temporal_rs::capi::temporal_rs_Duration_abs(this->AsFFI()); + return std::unique_ptr(temporal_rs::Duration::FromFFI(result)); +} + +inline std::unique_ptr temporal_rs::Duration::negated() const { + auto result = temporal_rs::capi::temporal_rs_Duration_negated(this->AsFFI()); + return std::unique_ptr(temporal_rs::Duration::FromFFI(result)); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::Duration::add(const temporal_rs::Duration& other) const { + auto result = temporal_rs::capi::temporal_rs_Duration_add(this->AsFFI(), + other.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::Duration::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::Duration::subtract(const temporal_rs::Duration& other) const { + auto result = temporal_rs::capi::temporal_rs_Duration_subtract(this->AsFFI(), + other.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::Duration::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result temporal_rs::Duration::to_string(temporal_rs::ToStringRoundingOptions options) const { + std::string output; + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteFromString(output); + auto result = temporal_rs::capi::temporal_rs_Duration_to_string(this->AsFFI(), + options.AsFFI(), + &write); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok(std::move(output))) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} +template +inline temporal_rs::diplomat::result temporal_rs::Duration::to_string_write(temporal_rs::ToStringRoundingOptions options, W& writeable) const { + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteTrait::Construct(writeable); + auto result = temporal_rs::capi::temporal_rs_Duration_to_string(this->AsFFI(), + options.AsFFI(), + &write); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok()) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::Duration::round(temporal_rs::RoundingOptions options, temporal_rs::RelativeTo relative_to) const { + auto result = temporal_rs::capi::temporal_rs_Duration_round(this->AsFFI(), + options.AsFFI(), + relative_to.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::Duration::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::Duration::round_with_provider(temporal_rs::RoundingOptions options, temporal_rs::RelativeTo relative_to, const temporal_rs::Provider& p) const { + auto result = temporal_rs::capi::temporal_rs_Duration_round_with_provider(this->AsFFI(), + options.AsFFI(), + relative_to.AsFFI(), + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::Duration::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result temporal_rs::Duration::compare(const temporal_rs::Duration& other, temporal_rs::RelativeTo relative_to) const { + auto result = temporal_rs::capi::temporal_rs_Duration_compare(this->AsFFI(), + other.AsFFI(), + relative_to.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok(result.ok)) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result temporal_rs::Duration::compare_with_provider(const temporal_rs::Duration& other, temporal_rs::RelativeTo relative_to, const temporal_rs::Provider& p) const { + auto result = temporal_rs::capi::temporal_rs_Duration_compare_with_provider(this->AsFFI(), + other.AsFFI(), + relative_to.AsFFI(), + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok(result.ok)) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result temporal_rs::Duration::total(temporal_rs::Unit unit, temporal_rs::RelativeTo relative_to) const { + auto result = temporal_rs::capi::temporal_rs_Duration_total(this->AsFFI(), + unit.AsFFI(), + relative_to.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok(result.ok)) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result temporal_rs::Duration::total_with_provider(temporal_rs::Unit unit, temporal_rs::RelativeTo relative_to, const temporal_rs::Provider& p) const { + auto result = temporal_rs::capi::temporal_rs_Duration_total_with_provider(this->AsFFI(), + unit.AsFFI(), + relative_to.AsFFI(), + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok(result.ok)) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline std::unique_ptr temporal_rs::Duration::clone() const { + auto result = temporal_rs::capi::temporal_rs_Duration_clone(this->AsFFI()); + return std::unique_ptr(temporal_rs::Duration::FromFFI(result)); +} + +inline const temporal_rs::capi::Duration* temporal_rs::Duration::AsFFI() const { + return reinterpret_cast(this); +} + +inline temporal_rs::capi::Duration* temporal_rs::Duration::AsFFI() { + return reinterpret_cast(this); +} + +inline const temporal_rs::Duration* temporal_rs::Duration::FromFFI(const temporal_rs::capi::Duration* ptr) { + return reinterpret_cast(ptr); +} + +inline temporal_rs::Duration* temporal_rs::Duration::FromFFI(temporal_rs::capi::Duration* ptr) { + return reinterpret_cast(ptr); +} + +inline void temporal_rs::Duration::operator delete(void* ptr) { + temporal_rs::capi::temporal_rs_Duration_destroy(reinterpret_cast(ptr)); +} + + +#endif // TEMPORAL_RS_Duration_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ErrorKind.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ErrorKind.d.hpp new file mode 100644 index 00000000000000..f6506bdec1cae8 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ErrorKind.d.hpp @@ -0,0 +1,55 @@ +#ifndef TEMPORAL_RS_ErrorKind_D_HPP +#define TEMPORAL_RS_ErrorKind_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + enum ErrorKind { + ErrorKind_Generic = 0, + ErrorKind_Type = 1, + ErrorKind_Range = 2, + ErrorKind_Syntax = 3, + ErrorKind_Assert = 4, + }; + + typedef struct ErrorKind_option {union { ErrorKind ok; }; bool is_ok; } ErrorKind_option; +} // namespace capi +} // namespace + +namespace temporal_rs { +class ErrorKind { +public: + enum Value { + Generic = 0, + Type = 1, + Range = 2, + Syntax = 3, + Assert = 4, + }; + + ErrorKind(): value(Value::Generic) {} + + // Implicit conversions between enum and ::Value + constexpr ErrorKind(Value v) : value(v) {} + constexpr operator Value() const { return value; } + // Prevent usage as boolean value + explicit operator bool() const = delete; + + inline temporal_rs::capi::ErrorKind AsFFI() const; + inline static temporal_rs::ErrorKind FromFFI(temporal_rs::capi::ErrorKind c_enum); +private: + Value value; +}; + +} // namespace +#endif // TEMPORAL_RS_ErrorKind_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ErrorKind.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ErrorKind.hpp new file mode 100644 index 00000000000000..bb6ff87a377f78 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ErrorKind.hpp @@ -0,0 +1,41 @@ +#ifndef TEMPORAL_RS_ErrorKind_HPP +#define TEMPORAL_RS_ErrorKind_HPP + +#include "ErrorKind.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + } // extern "C" +} // namespace capi +} // namespace + +inline temporal_rs::capi::ErrorKind temporal_rs::ErrorKind::AsFFI() const { + return static_cast(value); +} + +inline temporal_rs::ErrorKind temporal_rs::ErrorKind::FromFFI(temporal_rs::capi::ErrorKind c_enum) { + switch (c_enum) { + case temporal_rs::capi::ErrorKind_Generic: + case temporal_rs::capi::ErrorKind_Type: + case temporal_rs::capi::ErrorKind_Range: + case temporal_rs::capi::ErrorKind_Syntax: + case temporal_rs::capi::ErrorKind_Assert: + return static_cast(c_enum); + default: + std::abort(); + } +} +#endif // TEMPORAL_RS_ErrorKind_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/I128Nanoseconds.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/I128Nanoseconds.d.hpp new file mode 100644 index 00000000000000..21119b41494454 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/I128Nanoseconds.d.hpp @@ -0,0 +1,47 @@ +#ifndef TEMPORAL_RS_I128Nanoseconds_D_HPP +#define TEMPORAL_RS_I128Nanoseconds_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + struct I128Nanoseconds { + uint64_t high; + uint64_t low; + }; + + typedef struct I128Nanoseconds_option {union { I128Nanoseconds ok; }; bool is_ok; } I128Nanoseconds_option; +} // namespace capi +} // namespace + + +namespace temporal_rs { +/** + * For portability, we use two u64s instead of an i128. + * The high bit of the u64 is the sign. + * This cannot represent i128::MIN, and has a -0, but those are largely + * irrelevant for this purpose. + * + * This could potentially instead be a bit-by-bit split, or something else + */ +struct I128Nanoseconds { + uint64_t high; + uint64_t low; + + inline bool is_valid() const; + + inline temporal_rs::capi::I128Nanoseconds AsFFI() const; + inline static temporal_rs::I128Nanoseconds FromFFI(temporal_rs::capi::I128Nanoseconds c_struct); +}; + +} // namespace +#endif // TEMPORAL_RS_I128Nanoseconds_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/I128Nanoseconds.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/I128Nanoseconds.hpp new file mode 100644 index 00000000000000..706d643cc55718 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/I128Nanoseconds.hpp @@ -0,0 +1,48 @@ +#ifndef TEMPORAL_RS_I128Nanoseconds_HPP +#define TEMPORAL_RS_I128Nanoseconds_HPP + +#include "I128Nanoseconds.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + bool temporal_rs_I128Nanoseconds_is_valid(temporal_rs::capi::I128Nanoseconds self); + + } // extern "C" +} // namespace capi +} // namespace + +inline bool temporal_rs::I128Nanoseconds::is_valid() const { + auto result = temporal_rs::capi::temporal_rs_I128Nanoseconds_is_valid(this->AsFFI()); + return result; +} + + +inline temporal_rs::capi::I128Nanoseconds temporal_rs::I128Nanoseconds::AsFFI() const { + return temporal_rs::capi::I128Nanoseconds { + /* .high = */ high, + /* .low = */ low, + }; +} + +inline temporal_rs::I128Nanoseconds temporal_rs::I128Nanoseconds::FromFFI(temporal_rs::capi::I128Nanoseconds c_struct) { + return temporal_rs::I128Nanoseconds { + /* .high = */ c_struct.high, + /* .low = */ c_struct.low, + }; +} + + +#endif // TEMPORAL_RS_I128Nanoseconds_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Instant.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Instant.d.hpp new file mode 100644 index 00000000000000..e6cff3029d0e0f --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Instant.d.hpp @@ -0,0 +1,97 @@ +#ifndef TEMPORAL_RS_Instant_D_HPP +#define TEMPORAL_RS_Instant_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" +namespace temporal_rs { +namespace capi { struct Duration; } +class Duration; +namespace capi { struct Instant; } +class Instant; +namespace capi { struct Provider; } +class Provider; +namespace capi { struct ZonedDateTime; } +class ZonedDateTime; +struct DifferenceSettings; +struct I128Nanoseconds; +struct RoundingOptions; +struct TemporalError; +struct TimeZone; +struct ToStringRoundingOptions; +} // namespace temporal_rs + + + +namespace temporal_rs { +namespace capi { + struct Instant; +} // namespace capi +} // namespace + +namespace temporal_rs { +class Instant { +public: + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> try_new(temporal_rs::I128Nanoseconds ns); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_epoch_milliseconds(int64_t epoch_milliseconds); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_utf8(std::string_view s); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_utf16(std::u16string_view s); + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> add(const temporal_rs::Duration& duration) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> subtract(const temporal_rs::Duration& duration) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> since(const temporal_rs::Instant& other, temporal_rs::DifferenceSettings settings) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> until(const temporal_rs::Instant& other, temporal_rs::DifferenceSettings settings) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> round(temporal_rs::RoundingOptions options) const; + + inline int8_t compare(const temporal_rs::Instant& other) const; + + inline bool equals(const temporal_rs::Instant& other) const; + + inline int64_t epoch_milliseconds() const; + + inline temporal_rs::I128Nanoseconds epoch_nanoseconds() const; + + inline temporal_rs::diplomat::result to_ixdtf_string_with_compiled_data(std::optional zone, temporal_rs::ToStringRoundingOptions options) const; + template + inline temporal_rs::diplomat::result to_ixdtf_string_with_compiled_data_write(std::optional zone, temporal_rs::ToStringRoundingOptions options, W& writeable_output) const; + + inline temporal_rs::diplomat::result to_ixdtf_string_with_provider(std::optional zone, temporal_rs::ToStringRoundingOptions options, const temporal_rs::Provider& p) const; + template + inline temporal_rs::diplomat::result to_ixdtf_string_with_provider_write(std::optional zone, temporal_rs::ToStringRoundingOptions options, const temporal_rs::Provider& p, W& writeable_output) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> to_zoned_date_time_iso(temporal_rs::TimeZone zone) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> to_zoned_date_time_iso_with_provider(temporal_rs::TimeZone zone, const temporal_rs::Provider& p) const; + + inline std::unique_ptr clone() const; + + inline const temporal_rs::capi::Instant* AsFFI() const; + inline temporal_rs::capi::Instant* AsFFI(); + inline static const temporal_rs::Instant* FromFFI(const temporal_rs::capi::Instant* ptr); + inline static temporal_rs::Instant* FromFFI(temporal_rs::capi::Instant* ptr); + inline static void operator delete(void* ptr); +private: + Instant() = delete; + Instant(const temporal_rs::Instant&) = delete; + Instant(temporal_rs::Instant&&) noexcept = delete; + Instant operator=(const temporal_rs::Instant&) = delete; + Instant operator=(temporal_rs::Instant&&) noexcept = delete; + static void operator delete[](void*, size_t) = delete; +}; + +} // namespace +#endif // TEMPORAL_RS_Instant_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Instant.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Instant.hpp new file mode 100644 index 00000000000000..7f260f5cf8dd74 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Instant.hpp @@ -0,0 +1,238 @@ +#ifndef TEMPORAL_RS_Instant_HPP +#define TEMPORAL_RS_Instant_HPP + +#include "Instant.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "DifferenceSettings.hpp" +#include "Duration.hpp" +#include "I128Nanoseconds.hpp" +#include "Provider.hpp" +#include "RoundingOptions.hpp" +#include "TemporalError.hpp" +#include "TimeZone.hpp" +#include "ToStringRoundingOptions.hpp" +#include "ZonedDateTime.hpp" +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + typedef struct temporal_rs_Instant_try_new_result {union {temporal_rs::capi::Instant* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_Instant_try_new_result; + temporal_rs_Instant_try_new_result temporal_rs_Instant_try_new(temporal_rs::capi::I128Nanoseconds ns); + + typedef struct temporal_rs_Instant_from_epoch_milliseconds_result {union {temporal_rs::capi::Instant* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_Instant_from_epoch_milliseconds_result; + temporal_rs_Instant_from_epoch_milliseconds_result temporal_rs_Instant_from_epoch_milliseconds(int64_t epoch_milliseconds); + + typedef struct temporal_rs_Instant_from_utf8_result {union {temporal_rs::capi::Instant* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_Instant_from_utf8_result; + temporal_rs_Instant_from_utf8_result temporal_rs_Instant_from_utf8(temporal_rs::diplomat::capi::DiplomatStringView s); + + typedef struct temporal_rs_Instant_from_utf16_result {union {temporal_rs::capi::Instant* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_Instant_from_utf16_result; + temporal_rs_Instant_from_utf16_result temporal_rs_Instant_from_utf16(temporal_rs::diplomat::capi::DiplomatString16View s); + + typedef struct temporal_rs_Instant_add_result {union {temporal_rs::capi::Instant* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_Instant_add_result; + temporal_rs_Instant_add_result temporal_rs_Instant_add(const temporal_rs::capi::Instant* self, const temporal_rs::capi::Duration* duration); + + typedef struct temporal_rs_Instant_subtract_result {union {temporal_rs::capi::Instant* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_Instant_subtract_result; + temporal_rs_Instant_subtract_result temporal_rs_Instant_subtract(const temporal_rs::capi::Instant* self, const temporal_rs::capi::Duration* duration); + + typedef struct temporal_rs_Instant_since_result {union {temporal_rs::capi::Duration* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_Instant_since_result; + temporal_rs_Instant_since_result temporal_rs_Instant_since(const temporal_rs::capi::Instant* self, const temporal_rs::capi::Instant* other, temporal_rs::capi::DifferenceSettings settings); + + typedef struct temporal_rs_Instant_until_result {union {temporal_rs::capi::Duration* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_Instant_until_result; + temporal_rs_Instant_until_result temporal_rs_Instant_until(const temporal_rs::capi::Instant* self, const temporal_rs::capi::Instant* other, temporal_rs::capi::DifferenceSettings settings); + + typedef struct temporal_rs_Instant_round_result {union {temporal_rs::capi::Instant* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_Instant_round_result; + temporal_rs_Instant_round_result temporal_rs_Instant_round(const temporal_rs::capi::Instant* self, temporal_rs::capi::RoundingOptions options); + + int8_t temporal_rs_Instant_compare(const temporal_rs::capi::Instant* self, const temporal_rs::capi::Instant* other); + + bool temporal_rs_Instant_equals(const temporal_rs::capi::Instant* self, const temporal_rs::capi::Instant* other); + + int64_t temporal_rs_Instant_epoch_milliseconds(const temporal_rs::capi::Instant* self); + + temporal_rs::capi::I128Nanoseconds temporal_rs_Instant_epoch_nanoseconds(const temporal_rs::capi::Instant* self); + + typedef struct temporal_rs_Instant_to_ixdtf_string_with_compiled_data_result {union { temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_Instant_to_ixdtf_string_with_compiled_data_result; + temporal_rs_Instant_to_ixdtf_string_with_compiled_data_result temporal_rs_Instant_to_ixdtf_string_with_compiled_data(const temporal_rs::capi::Instant* self, temporal_rs::capi::TimeZone_option zone, temporal_rs::capi::ToStringRoundingOptions options, temporal_rs::diplomat::capi::DiplomatWrite* write); + + typedef struct temporal_rs_Instant_to_ixdtf_string_with_provider_result {union { temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_Instant_to_ixdtf_string_with_provider_result; + temporal_rs_Instant_to_ixdtf_string_with_provider_result temporal_rs_Instant_to_ixdtf_string_with_provider(const temporal_rs::capi::Instant* self, temporal_rs::capi::TimeZone_option zone, temporal_rs::capi::ToStringRoundingOptions options, const temporal_rs::capi::Provider* p, temporal_rs::diplomat::capi::DiplomatWrite* write); + + typedef struct temporal_rs_Instant_to_zoned_date_time_iso_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_Instant_to_zoned_date_time_iso_result; + temporal_rs_Instant_to_zoned_date_time_iso_result temporal_rs_Instant_to_zoned_date_time_iso(const temporal_rs::capi::Instant* self, temporal_rs::capi::TimeZone zone); + + typedef struct temporal_rs_Instant_to_zoned_date_time_iso_with_provider_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_Instant_to_zoned_date_time_iso_with_provider_result; + temporal_rs_Instant_to_zoned_date_time_iso_with_provider_result temporal_rs_Instant_to_zoned_date_time_iso_with_provider(const temporal_rs::capi::Instant* self, temporal_rs::capi::TimeZone zone, const temporal_rs::capi::Provider* p); + + temporal_rs::capi::Instant* temporal_rs_Instant_clone(const temporal_rs::capi::Instant* self); + + void temporal_rs_Instant_destroy(Instant* self); + + } // extern "C" +} // namespace capi +} // namespace + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::Instant::try_new(temporal_rs::I128Nanoseconds ns) { + auto result = temporal_rs::capi::temporal_rs_Instant_try_new(ns.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::Instant::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::Instant::from_epoch_milliseconds(int64_t epoch_milliseconds) { + auto result = temporal_rs::capi::temporal_rs_Instant_from_epoch_milliseconds(epoch_milliseconds); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::Instant::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::Instant::from_utf8(std::string_view s) { + auto result = temporal_rs::capi::temporal_rs_Instant_from_utf8({s.data(), s.size()}); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::Instant::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::Instant::from_utf16(std::u16string_view s) { + auto result = temporal_rs::capi::temporal_rs_Instant_from_utf16({s.data(), s.size()}); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::Instant::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::Instant::add(const temporal_rs::Duration& duration) const { + auto result = temporal_rs::capi::temporal_rs_Instant_add(this->AsFFI(), + duration.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::Instant::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::Instant::subtract(const temporal_rs::Duration& duration) const { + auto result = temporal_rs::capi::temporal_rs_Instant_subtract(this->AsFFI(), + duration.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::Instant::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::Instant::since(const temporal_rs::Instant& other, temporal_rs::DifferenceSettings settings) const { + auto result = temporal_rs::capi::temporal_rs_Instant_since(this->AsFFI(), + other.AsFFI(), + settings.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::Duration::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::Instant::until(const temporal_rs::Instant& other, temporal_rs::DifferenceSettings settings) const { + auto result = temporal_rs::capi::temporal_rs_Instant_until(this->AsFFI(), + other.AsFFI(), + settings.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::Duration::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::Instant::round(temporal_rs::RoundingOptions options) const { + auto result = temporal_rs::capi::temporal_rs_Instant_round(this->AsFFI(), + options.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::Instant::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline int8_t temporal_rs::Instant::compare(const temporal_rs::Instant& other) const { + auto result = temporal_rs::capi::temporal_rs_Instant_compare(this->AsFFI(), + other.AsFFI()); + return result; +} + +inline bool temporal_rs::Instant::equals(const temporal_rs::Instant& other) const { + auto result = temporal_rs::capi::temporal_rs_Instant_equals(this->AsFFI(), + other.AsFFI()); + return result; +} + +inline int64_t temporal_rs::Instant::epoch_milliseconds() const { + auto result = temporal_rs::capi::temporal_rs_Instant_epoch_milliseconds(this->AsFFI()); + return result; +} + +inline temporal_rs::I128Nanoseconds temporal_rs::Instant::epoch_nanoseconds() const { + auto result = temporal_rs::capi::temporal_rs_Instant_epoch_nanoseconds(this->AsFFI()); + return temporal_rs::I128Nanoseconds::FromFFI(result); +} + +inline temporal_rs::diplomat::result temporal_rs::Instant::to_ixdtf_string_with_compiled_data(std::optional zone, temporal_rs::ToStringRoundingOptions options) const { + std::string output; + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteFromString(output); + auto result = temporal_rs::capi::temporal_rs_Instant_to_ixdtf_string_with_compiled_data(this->AsFFI(), + zone.has_value() ? (temporal_rs::capi::TimeZone_option{ { zone.value().AsFFI() }, true }) : (temporal_rs::capi::TimeZone_option{ {}, false }), + options.AsFFI(), + &write); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok(std::move(output))) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} +template +inline temporal_rs::diplomat::result temporal_rs::Instant::to_ixdtf_string_with_compiled_data_write(std::optional zone, temporal_rs::ToStringRoundingOptions options, W& writeable) const { + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteTrait::Construct(writeable); + auto result = temporal_rs::capi::temporal_rs_Instant_to_ixdtf_string_with_compiled_data(this->AsFFI(), + zone.has_value() ? (temporal_rs::capi::TimeZone_option{ { zone.value().AsFFI() }, true }) : (temporal_rs::capi::TimeZone_option{ {}, false }), + options.AsFFI(), + &write); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok()) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result temporal_rs::Instant::to_ixdtf_string_with_provider(std::optional zone, temporal_rs::ToStringRoundingOptions options, const temporal_rs::Provider& p) const { + std::string output; + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteFromString(output); + auto result = temporal_rs::capi::temporal_rs_Instant_to_ixdtf_string_with_provider(this->AsFFI(), + zone.has_value() ? (temporal_rs::capi::TimeZone_option{ { zone.value().AsFFI() }, true }) : (temporal_rs::capi::TimeZone_option{ {}, false }), + options.AsFFI(), + p.AsFFI(), + &write); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok(std::move(output))) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} +template +inline temporal_rs::diplomat::result temporal_rs::Instant::to_ixdtf_string_with_provider_write(std::optional zone, temporal_rs::ToStringRoundingOptions options, const temporal_rs::Provider& p, W& writeable) const { + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteTrait::Construct(writeable); + auto result = temporal_rs::capi::temporal_rs_Instant_to_ixdtf_string_with_provider(this->AsFFI(), + zone.has_value() ? (temporal_rs::capi::TimeZone_option{ { zone.value().AsFFI() }, true }) : (temporal_rs::capi::TimeZone_option{ {}, false }), + options.AsFFI(), + p.AsFFI(), + &write); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok()) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::Instant::to_zoned_date_time_iso(temporal_rs::TimeZone zone) const { + auto result = temporal_rs::capi::temporal_rs_Instant_to_zoned_date_time_iso(this->AsFFI(), + zone.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::Instant::to_zoned_date_time_iso_with_provider(temporal_rs::TimeZone zone, const temporal_rs::Provider& p) const { + auto result = temporal_rs::capi::temporal_rs_Instant_to_zoned_date_time_iso_with_provider(this->AsFFI(), + zone.AsFFI(), + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline std::unique_ptr temporal_rs::Instant::clone() const { + auto result = temporal_rs::capi::temporal_rs_Instant_clone(this->AsFFI()); + return std::unique_ptr(temporal_rs::Instant::FromFFI(result)); +} + +inline const temporal_rs::capi::Instant* temporal_rs::Instant::AsFFI() const { + return reinterpret_cast(this); +} + +inline temporal_rs::capi::Instant* temporal_rs::Instant::AsFFI() { + return reinterpret_cast(this); +} + +inline const temporal_rs::Instant* temporal_rs::Instant::FromFFI(const temporal_rs::capi::Instant* ptr) { + return reinterpret_cast(ptr); +} + +inline temporal_rs::Instant* temporal_rs::Instant::FromFFI(temporal_rs::capi::Instant* ptr) { + return reinterpret_cast(ptr); +} + +inline void temporal_rs::Instant::operator delete(void* ptr) { + temporal_rs::capi::temporal_rs_Instant_destroy(reinterpret_cast(ptr)); +} + + +#endif // TEMPORAL_RS_Instant_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/OffsetDisambiguation.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/OffsetDisambiguation.d.hpp new file mode 100644 index 00000000000000..b39f3cd9ed28e0 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/OffsetDisambiguation.d.hpp @@ -0,0 +1,53 @@ +#ifndef TEMPORAL_RS_OffsetDisambiguation_D_HPP +#define TEMPORAL_RS_OffsetDisambiguation_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + enum OffsetDisambiguation { + OffsetDisambiguation_Use = 0, + OffsetDisambiguation_Prefer = 1, + OffsetDisambiguation_Ignore = 2, + OffsetDisambiguation_Reject = 3, + }; + + typedef struct OffsetDisambiguation_option {union { OffsetDisambiguation ok; }; bool is_ok; } OffsetDisambiguation_option; +} // namespace capi +} // namespace + +namespace temporal_rs { +class OffsetDisambiguation { +public: + enum Value { + Use = 0, + Prefer = 1, + Ignore = 2, + Reject = 3, + }; + + OffsetDisambiguation(): value(Value::Use) {} + + // Implicit conversions between enum and ::Value + constexpr OffsetDisambiguation(Value v) : value(v) {} + constexpr operator Value() const { return value; } + // Prevent usage as boolean value + explicit operator bool() const = delete; + + inline temporal_rs::capi::OffsetDisambiguation AsFFI() const; + inline static temporal_rs::OffsetDisambiguation FromFFI(temporal_rs::capi::OffsetDisambiguation c_enum); +private: + Value value; +}; + +} // namespace +#endif // TEMPORAL_RS_OffsetDisambiguation_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/OffsetDisambiguation.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/OffsetDisambiguation.hpp new file mode 100644 index 00000000000000..46313f67c332d5 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/OffsetDisambiguation.hpp @@ -0,0 +1,40 @@ +#ifndef TEMPORAL_RS_OffsetDisambiguation_HPP +#define TEMPORAL_RS_OffsetDisambiguation_HPP + +#include "OffsetDisambiguation.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + } // extern "C" +} // namespace capi +} // namespace + +inline temporal_rs::capi::OffsetDisambiguation temporal_rs::OffsetDisambiguation::AsFFI() const { + return static_cast(value); +} + +inline temporal_rs::OffsetDisambiguation temporal_rs::OffsetDisambiguation::FromFFI(temporal_rs::capi::OffsetDisambiguation c_enum) { + switch (c_enum) { + case temporal_rs::capi::OffsetDisambiguation_Use: + case temporal_rs::capi::OffsetDisambiguation_Prefer: + case temporal_rs::capi::OffsetDisambiguation_Ignore: + case temporal_rs::capi::OffsetDisambiguation_Reject: + return static_cast(c_enum); + default: + std::abort(); + } +} +#endif // TEMPORAL_RS_OffsetDisambiguation_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/OwnedRelativeTo.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/OwnedRelativeTo.d.hpp new file mode 100644 index 00000000000000..27fb77ef341b38 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/OwnedRelativeTo.d.hpp @@ -0,0 +1,62 @@ +#ifndef TEMPORAL_RS_OwnedRelativeTo_D_HPP +#define TEMPORAL_RS_OwnedRelativeTo_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" +namespace temporal_rs { +namespace capi { struct PlainDate; } +class PlainDate; +namespace capi { struct Provider; } +class Provider; +namespace capi { struct ZonedDateTime; } +class ZonedDateTime; +struct OwnedRelativeTo; +struct TemporalError; +} // namespace temporal_rs + + + +namespace temporal_rs { +namespace capi { + struct OwnedRelativeTo { + temporal_rs::capi::PlainDate* date; + temporal_rs::capi::ZonedDateTime* zoned; + }; + + typedef struct OwnedRelativeTo_option {union { OwnedRelativeTo ok; }; bool is_ok; } OwnedRelativeTo_option; +} // namespace capi +} // namespace + + +namespace temporal_rs { +/** + * GetTemporalRelativeToOption can create fresh PlainDate/ZonedDateTimes by parsing them, + * we need a way to produce that result. + */ +struct OwnedRelativeTo { + std::unique_ptr date; + std::unique_ptr zoned; + + inline static temporal_rs::diplomat::result from_utf8(std::string_view s); + + inline static temporal_rs::diplomat::result from_utf8_with_provider(std::string_view s, const temporal_rs::Provider& p); + + inline static temporal_rs::diplomat::result from_utf16(std::u16string_view s); + + inline static temporal_rs::diplomat::result from_utf16_with_provider(std::u16string_view s, const temporal_rs::Provider& p); + + inline static temporal_rs::OwnedRelativeTo empty(); + + inline temporal_rs::capi::OwnedRelativeTo AsFFI() const; + inline static temporal_rs::OwnedRelativeTo FromFFI(temporal_rs::capi::OwnedRelativeTo c_struct); +}; + +} // namespace +#endif // TEMPORAL_RS_OwnedRelativeTo_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/OwnedRelativeTo.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/OwnedRelativeTo.hpp new file mode 100644 index 00000000000000..4ba8b6554c78bc --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/OwnedRelativeTo.hpp @@ -0,0 +1,86 @@ +#ifndef TEMPORAL_RS_OwnedRelativeTo_HPP +#define TEMPORAL_RS_OwnedRelativeTo_HPP + +#include "OwnedRelativeTo.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "PlainDate.hpp" +#include "Provider.hpp" +#include "TemporalError.hpp" +#include "ZonedDateTime.hpp" +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + typedef struct temporal_rs_OwnedRelativeTo_from_utf8_result {union {temporal_rs::capi::OwnedRelativeTo ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_OwnedRelativeTo_from_utf8_result; + temporal_rs_OwnedRelativeTo_from_utf8_result temporal_rs_OwnedRelativeTo_from_utf8(temporal_rs::diplomat::capi::DiplomatStringView s); + + typedef struct temporal_rs_OwnedRelativeTo_from_utf8_with_provider_result {union {temporal_rs::capi::OwnedRelativeTo ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_OwnedRelativeTo_from_utf8_with_provider_result; + temporal_rs_OwnedRelativeTo_from_utf8_with_provider_result temporal_rs_OwnedRelativeTo_from_utf8_with_provider(temporal_rs::diplomat::capi::DiplomatStringView s, const temporal_rs::capi::Provider* p); + + typedef struct temporal_rs_OwnedRelativeTo_from_utf16_result {union {temporal_rs::capi::OwnedRelativeTo ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_OwnedRelativeTo_from_utf16_result; + temporal_rs_OwnedRelativeTo_from_utf16_result temporal_rs_OwnedRelativeTo_from_utf16(temporal_rs::diplomat::capi::DiplomatString16View s); + + typedef struct temporal_rs_OwnedRelativeTo_from_utf16_with_provider_result {union {temporal_rs::capi::OwnedRelativeTo ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_OwnedRelativeTo_from_utf16_with_provider_result; + temporal_rs_OwnedRelativeTo_from_utf16_with_provider_result temporal_rs_OwnedRelativeTo_from_utf16_with_provider(temporal_rs::diplomat::capi::DiplomatString16View s, const temporal_rs::capi::Provider* p); + + temporal_rs::capi::OwnedRelativeTo temporal_rs_OwnedRelativeTo_empty(void); + + } // extern "C" +} // namespace capi +} // namespace + +inline temporal_rs::diplomat::result temporal_rs::OwnedRelativeTo::from_utf8(std::string_view s) { + auto result = temporal_rs::capi::temporal_rs_OwnedRelativeTo_from_utf8({s.data(), s.size()}); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok(temporal_rs::OwnedRelativeTo::FromFFI(result.ok))) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result temporal_rs::OwnedRelativeTo::from_utf8_with_provider(std::string_view s, const temporal_rs::Provider& p) { + auto result = temporal_rs::capi::temporal_rs_OwnedRelativeTo_from_utf8_with_provider({s.data(), s.size()}, + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok(temporal_rs::OwnedRelativeTo::FromFFI(result.ok))) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result temporal_rs::OwnedRelativeTo::from_utf16(std::u16string_view s) { + auto result = temporal_rs::capi::temporal_rs_OwnedRelativeTo_from_utf16({s.data(), s.size()}); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok(temporal_rs::OwnedRelativeTo::FromFFI(result.ok))) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result temporal_rs::OwnedRelativeTo::from_utf16_with_provider(std::u16string_view s, const temporal_rs::Provider& p) { + auto result = temporal_rs::capi::temporal_rs_OwnedRelativeTo_from_utf16_with_provider({s.data(), s.size()}, + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok(temporal_rs::OwnedRelativeTo::FromFFI(result.ok))) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::OwnedRelativeTo temporal_rs::OwnedRelativeTo::empty() { + auto result = temporal_rs::capi::temporal_rs_OwnedRelativeTo_empty(); + return temporal_rs::OwnedRelativeTo::FromFFI(result); +} + + +inline temporal_rs::capi::OwnedRelativeTo temporal_rs::OwnedRelativeTo::AsFFI() const { + return temporal_rs::capi::OwnedRelativeTo { + /* .date = */ date ? date->AsFFI() : nullptr, + /* .zoned = */ zoned ? zoned->AsFFI() : nullptr, + }; +} + +inline temporal_rs::OwnedRelativeTo temporal_rs::OwnedRelativeTo::FromFFI(temporal_rs::capi::OwnedRelativeTo c_struct) { + return temporal_rs::OwnedRelativeTo { + /* .date = */ std::unique_ptr(temporal_rs::PlainDate::FromFFI(c_struct.date)), + /* .zoned = */ std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(c_struct.zoned)), + }; +} + + +#endif // TEMPORAL_RS_OwnedRelativeTo_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ParsedDate.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ParsedDate.d.hpp new file mode 100644 index 00000000000000..6e3327c006925c --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ParsedDate.d.hpp @@ -0,0 +1,58 @@ +#ifndef TEMPORAL_RS_ParsedDate_D_HPP +#define TEMPORAL_RS_ParsedDate_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" +namespace temporal_rs { +namespace capi { struct ParsedDate; } +class ParsedDate; +struct TemporalError; +} // namespace temporal_rs + + + +namespace temporal_rs { +namespace capi { + struct ParsedDate; +} // namespace capi +} // namespace + +namespace temporal_rs { +class ParsedDate { +public: + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_utf8(std::string_view s); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_utf16(std::u16string_view s); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> year_month_from_utf8(std::string_view s); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> year_month_from_utf16(std::u16string_view s); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> month_day_from_utf8(std::string_view s); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> month_day_from_utf16(std::u16string_view s); + + inline const temporal_rs::capi::ParsedDate* AsFFI() const; + inline temporal_rs::capi::ParsedDate* AsFFI(); + inline static const temporal_rs::ParsedDate* FromFFI(const temporal_rs::capi::ParsedDate* ptr); + inline static temporal_rs::ParsedDate* FromFFI(temporal_rs::capi::ParsedDate* ptr); + inline static void operator delete(void* ptr); +private: + ParsedDate() = delete; + ParsedDate(const temporal_rs::ParsedDate&) = delete; + ParsedDate(temporal_rs::ParsedDate&&) noexcept = delete; + ParsedDate operator=(const temporal_rs::ParsedDate&) = delete; + ParsedDate operator=(temporal_rs::ParsedDate&&) noexcept = delete; + static void operator delete[](void*, size_t) = delete; +}; + +} // namespace +#endif // TEMPORAL_RS_ParsedDate_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ParsedDate.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ParsedDate.hpp new file mode 100644 index 00000000000000..6a149424702e89 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ParsedDate.hpp @@ -0,0 +1,97 @@ +#ifndef TEMPORAL_RS_ParsedDate_HPP +#define TEMPORAL_RS_ParsedDate_HPP + +#include "ParsedDate.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "TemporalError.hpp" +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + typedef struct temporal_rs_ParsedDate_from_utf8_result {union {temporal_rs::capi::ParsedDate* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ParsedDate_from_utf8_result; + temporal_rs_ParsedDate_from_utf8_result temporal_rs_ParsedDate_from_utf8(temporal_rs::diplomat::capi::DiplomatStringView s); + + typedef struct temporal_rs_ParsedDate_from_utf16_result {union {temporal_rs::capi::ParsedDate* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ParsedDate_from_utf16_result; + temporal_rs_ParsedDate_from_utf16_result temporal_rs_ParsedDate_from_utf16(temporal_rs::diplomat::capi::DiplomatString16View s); + + typedef struct temporal_rs_ParsedDate_year_month_from_utf8_result {union {temporal_rs::capi::ParsedDate* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ParsedDate_year_month_from_utf8_result; + temporal_rs_ParsedDate_year_month_from_utf8_result temporal_rs_ParsedDate_year_month_from_utf8(temporal_rs::diplomat::capi::DiplomatStringView s); + + typedef struct temporal_rs_ParsedDate_year_month_from_utf16_result {union {temporal_rs::capi::ParsedDate* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ParsedDate_year_month_from_utf16_result; + temporal_rs_ParsedDate_year_month_from_utf16_result temporal_rs_ParsedDate_year_month_from_utf16(temporal_rs::diplomat::capi::DiplomatString16View s); + + typedef struct temporal_rs_ParsedDate_month_day_from_utf8_result {union {temporal_rs::capi::ParsedDate* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ParsedDate_month_day_from_utf8_result; + temporal_rs_ParsedDate_month_day_from_utf8_result temporal_rs_ParsedDate_month_day_from_utf8(temporal_rs::diplomat::capi::DiplomatStringView s); + + typedef struct temporal_rs_ParsedDate_month_day_from_utf16_result {union {temporal_rs::capi::ParsedDate* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ParsedDate_month_day_from_utf16_result; + temporal_rs_ParsedDate_month_day_from_utf16_result temporal_rs_ParsedDate_month_day_from_utf16(temporal_rs::diplomat::capi::DiplomatString16View s); + + void temporal_rs_ParsedDate_destroy(ParsedDate* self); + + } // extern "C" +} // namespace capi +} // namespace + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ParsedDate::from_utf8(std::string_view s) { + auto result = temporal_rs::capi::temporal_rs_ParsedDate_from_utf8({s.data(), s.size()}); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ParsedDate::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ParsedDate::from_utf16(std::u16string_view s) { + auto result = temporal_rs::capi::temporal_rs_ParsedDate_from_utf16({s.data(), s.size()}); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ParsedDate::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ParsedDate::year_month_from_utf8(std::string_view s) { + auto result = temporal_rs::capi::temporal_rs_ParsedDate_year_month_from_utf8({s.data(), s.size()}); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ParsedDate::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ParsedDate::year_month_from_utf16(std::u16string_view s) { + auto result = temporal_rs::capi::temporal_rs_ParsedDate_year_month_from_utf16({s.data(), s.size()}); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ParsedDate::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ParsedDate::month_day_from_utf8(std::string_view s) { + auto result = temporal_rs::capi::temporal_rs_ParsedDate_month_day_from_utf8({s.data(), s.size()}); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ParsedDate::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ParsedDate::month_day_from_utf16(std::u16string_view s) { + auto result = temporal_rs::capi::temporal_rs_ParsedDate_month_day_from_utf16({s.data(), s.size()}); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ParsedDate::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline const temporal_rs::capi::ParsedDate* temporal_rs::ParsedDate::AsFFI() const { + return reinterpret_cast(this); +} + +inline temporal_rs::capi::ParsedDate* temporal_rs::ParsedDate::AsFFI() { + return reinterpret_cast(this); +} + +inline const temporal_rs::ParsedDate* temporal_rs::ParsedDate::FromFFI(const temporal_rs::capi::ParsedDate* ptr) { + return reinterpret_cast(ptr); +} + +inline temporal_rs::ParsedDate* temporal_rs::ParsedDate::FromFFI(temporal_rs::capi::ParsedDate* ptr) { + return reinterpret_cast(ptr); +} + +inline void temporal_rs::ParsedDate::operator delete(void* ptr) { + temporal_rs::capi::temporal_rs_ParsedDate_destroy(reinterpret_cast(ptr)); +} + + +#endif // TEMPORAL_RS_ParsedDate_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ParsedDateTime.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ParsedDateTime.d.hpp new file mode 100644 index 00000000000000..aa89382523e4ba --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ParsedDateTime.d.hpp @@ -0,0 +1,50 @@ +#ifndef TEMPORAL_RS_ParsedDateTime_D_HPP +#define TEMPORAL_RS_ParsedDateTime_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" +namespace temporal_rs { +namespace capi { struct ParsedDateTime; } +class ParsedDateTime; +struct TemporalError; +} // namespace temporal_rs + + + +namespace temporal_rs { +namespace capi { + struct ParsedDateTime; +} // namespace capi +} // namespace + +namespace temporal_rs { +class ParsedDateTime { +public: + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_utf8(std::string_view s); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_utf16(std::u16string_view s); + + inline const temporal_rs::capi::ParsedDateTime* AsFFI() const; + inline temporal_rs::capi::ParsedDateTime* AsFFI(); + inline static const temporal_rs::ParsedDateTime* FromFFI(const temporal_rs::capi::ParsedDateTime* ptr); + inline static temporal_rs::ParsedDateTime* FromFFI(temporal_rs::capi::ParsedDateTime* ptr); + inline static void operator delete(void* ptr); +private: + ParsedDateTime() = delete; + ParsedDateTime(const temporal_rs::ParsedDateTime&) = delete; + ParsedDateTime(temporal_rs::ParsedDateTime&&) noexcept = delete; + ParsedDateTime operator=(const temporal_rs::ParsedDateTime&) = delete; + ParsedDateTime operator=(temporal_rs::ParsedDateTime&&) noexcept = delete; + static void operator delete[](void*, size_t) = delete; +}; + +} // namespace +#endif // TEMPORAL_RS_ParsedDateTime_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ParsedDateTime.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ParsedDateTime.hpp new file mode 100644 index 00000000000000..16b77809436e31 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ParsedDateTime.hpp @@ -0,0 +1,65 @@ +#ifndef TEMPORAL_RS_ParsedDateTime_HPP +#define TEMPORAL_RS_ParsedDateTime_HPP + +#include "ParsedDateTime.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "TemporalError.hpp" +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + typedef struct temporal_rs_ParsedDateTime_from_utf8_result {union {temporal_rs::capi::ParsedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ParsedDateTime_from_utf8_result; + temporal_rs_ParsedDateTime_from_utf8_result temporal_rs_ParsedDateTime_from_utf8(temporal_rs::diplomat::capi::DiplomatStringView s); + + typedef struct temporal_rs_ParsedDateTime_from_utf16_result {union {temporal_rs::capi::ParsedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ParsedDateTime_from_utf16_result; + temporal_rs_ParsedDateTime_from_utf16_result temporal_rs_ParsedDateTime_from_utf16(temporal_rs::diplomat::capi::DiplomatString16View s); + + void temporal_rs_ParsedDateTime_destroy(ParsedDateTime* self); + + } // extern "C" +} // namespace capi +} // namespace + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ParsedDateTime::from_utf8(std::string_view s) { + auto result = temporal_rs::capi::temporal_rs_ParsedDateTime_from_utf8({s.data(), s.size()}); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ParsedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ParsedDateTime::from_utf16(std::u16string_view s) { + auto result = temporal_rs::capi::temporal_rs_ParsedDateTime_from_utf16({s.data(), s.size()}); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ParsedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline const temporal_rs::capi::ParsedDateTime* temporal_rs::ParsedDateTime::AsFFI() const { + return reinterpret_cast(this); +} + +inline temporal_rs::capi::ParsedDateTime* temporal_rs::ParsedDateTime::AsFFI() { + return reinterpret_cast(this); +} + +inline const temporal_rs::ParsedDateTime* temporal_rs::ParsedDateTime::FromFFI(const temporal_rs::capi::ParsedDateTime* ptr) { + return reinterpret_cast(ptr); +} + +inline temporal_rs::ParsedDateTime* temporal_rs::ParsedDateTime::FromFFI(temporal_rs::capi::ParsedDateTime* ptr) { + return reinterpret_cast(ptr); +} + +inline void temporal_rs::ParsedDateTime::operator delete(void* ptr) { + temporal_rs::capi::temporal_rs_ParsedDateTime_destroy(reinterpret_cast(ptr)); +} + + +#endif // TEMPORAL_RS_ParsedDateTime_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ParsedZonedDateTime.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ParsedZonedDateTime.d.hpp new file mode 100644 index 00000000000000..0f8b2c3e02f59d --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ParsedZonedDateTime.d.hpp @@ -0,0 +1,56 @@ +#ifndef TEMPORAL_RS_ParsedZonedDateTime_D_HPP +#define TEMPORAL_RS_ParsedZonedDateTime_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" +namespace temporal_rs { +namespace capi { struct ParsedZonedDateTime; } +class ParsedZonedDateTime; +namespace capi { struct Provider; } +class Provider; +struct TemporalError; +} // namespace temporal_rs + + + +namespace temporal_rs { +namespace capi { + struct ParsedZonedDateTime; +} // namespace capi +} // namespace + +namespace temporal_rs { +class ParsedZonedDateTime { +public: + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_utf8(std::string_view s); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_utf8_with_provider(std::string_view s, const temporal_rs::Provider& p); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_utf16(std::u16string_view s); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_utf16_with_provider(std::u16string_view s, const temporal_rs::Provider& p); + + inline const temporal_rs::capi::ParsedZonedDateTime* AsFFI() const; + inline temporal_rs::capi::ParsedZonedDateTime* AsFFI(); + inline static const temporal_rs::ParsedZonedDateTime* FromFFI(const temporal_rs::capi::ParsedZonedDateTime* ptr); + inline static temporal_rs::ParsedZonedDateTime* FromFFI(temporal_rs::capi::ParsedZonedDateTime* ptr); + inline static void operator delete(void* ptr); +private: + ParsedZonedDateTime() = delete; + ParsedZonedDateTime(const temporal_rs::ParsedZonedDateTime&) = delete; + ParsedZonedDateTime(temporal_rs::ParsedZonedDateTime&&) noexcept = delete; + ParsedZonedDateTime operator=(const temporal_rs::ParsedZonedDateTime&) = delete; + ParsedZonedDateTime operator=(temporal_rs::ParsedZonedDateTime&&) noexcept = delete; + static void operator delete[](void*, size_t) = delete; +}; + +} // namespace +#endif // TEMPORAL_RS_ParsedZonedDateTime_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ParsedZonedDateTime.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ParsedZonedDateTime.hpp new file mode 100644 index 00000000000000..c8e95b2ad93f5c --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ParsedZonedDateTime.hpp @@ -0,0 +1,84 @@ +#ifndef TEMPORAL_RS_ParsedZonedDateTime_HPP +#define TEMPORAL_RS_ParsedZonedDateTime_HPP + +#include "ParsedZonedDateTime.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "Provider.hpp" +#include "TemporalError.hpp" +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + typedef struct temporal_rs_ParsedZonedDateTime_from_utf8_result {union {temporal_rs::capi::ParsedZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ParsedZonedDateTime_from_utf8_result; + temporal_rs_ParsedZonedDateTime_from_utf8_result temporal_rs_ParsedZonedDateTime_from_utf8(temporal_rs::diplomat::capi::DiplomatStringView s); + + typedef struct temporal_rs_ParsedZonedDateTime_from_utf8_with_provider_result {union {temporal_rs::capi::ParsedZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ParsedZonedDateTime_from_utf8_with_provider_result; + temporal_rs_ParsedZonedDateTime_from_utf8_with_provider_result temporal_rs_ParsedZonedDateTime_from_utf8_with_provider(temporal_rs::diplomat::capi::DiplomatStringView s, const temporal_rs::capi::Provider* p); + + typedef struct temporal_rs_ParsedZonedDateTime_from_utf16_result {union {temporal_rs::capi::ParsedZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ParsedZonedDateTime_from_utf16_result; + temporal_rs_ParsedZonedDateTime_from_utf16_result temporal_rs_ParsedZonedDateTime_from_utf16(temporal_rs::diplomat::capi::DiplomatString16View s); + + typedef struct temporal_rs_ParsedZonedDateTime_from_utf16_with_provider_result {union {temporal_rs::capi::ParsedZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ParsedZonedDateTime_from_utf16_with_provider_result; + temporal_rs_ParsedZonedDateTime_from_utf16_with_provider_result temporal_rs_ParsedZonedDateTime_from_utf16_with_provider(temporal_rs::diplomat::capi::DiplomatString16View s, const temporal_rs::capi::Provider* p); + + void temporal_rs_ParsedZonedDateTime_destroy(ParsedZonedDateTime* self); + + } // extern "C" +} // namespace capi +} // namespace + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ParsedZonedDateTime::from_utf8(std::string_view s) { + auto result = temporal_rs::capi::temporal_rs_ParsedZonedDateTime_from_utf8({s.data(), s.size()}); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ParsedZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ParsedZonedDateTime::from_utf8_with_provider(std::string_view s, const temporal_rs::Provider& p) { + auto result = temporal_rs::capi::temporal_rs_ParsedZonedDateTime_from_utf8_with_provider({s.data(), s.size()}, + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ParsedZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ParsedZonedDateTime::from_utf16(std::u16string_view s) { + auto result = temporal_rs::capi::temporal_rs_ParsedZonedDateTime_from_utf16({s.data(), s.size()}); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ParsedZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ParsedZonedDateTime::from_utf16_with_provider(std::u16string_view s, const temporal_rs::Provider& p) { + auto result = temporal_rs::capi::temporal_rs_ParsedZonedDateTime_from_utf16_with_provider({s.data(), s.size()}, + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ParsedZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline const temporal_rs::capi::ParsedZonedDateTime* temporal_rs::ParsedZonedDateTime::AsFFI() const { + return reinterpret_cast(this); +} + +inline temporal_rs::capi::ParsedZonedDateTime* temporal_rs::ParsedZonedDateTime::AsFFI() { + return reinterpret_cast(this); +} + +inline const temporal_rs::ParsedZonedDateTime* temporal_rs::ParsedZonedDateTime::FromFFI(const temporal_rs::capi::ParsedZonedDateTime* ptr) { + return reinterpret_cast(ptr); +} + +inline temporal_rs::ParsedZonedDateTime* temporal_rs::ParsedZonedDateTime::FromFFI(temporal_rs::capi::ParsedZonedDateTime* ptr) { + return reinterpret_cast(ptr); +} + +inline void temporal_rs::ParsedZonedDateTime::operator delete(void* ptr) { + temporal_rs::capi::temporal_rs_ParsedZonedDateTime_destroy(reinterpret_cast(ptr)); +} + + +#endif // TEMPORAL_RS_ParsedZonedDateTime_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialDate.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialDate.d.hpp new file mode 100644 index 00000000000000..781c7b0c93b739 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialDate.d.hpp @@ -0,0 +1,52 @@ +#ifndef TEMPORAL_RS_PartialDate_D_HPP +#define TEMPORAL_RS_PartialDate_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "AnyCalendarKind.d.hpp" +#include "diplomat_runtime.hpp" +namespace temporal_rs { +class AnyCalendarKind; +} // namespace temporal_rs + + + +namespace temporal_rs { +namespace capi { + struct PartialDate { + temporal_rs::diplomat::capi::OptionI32 year; + temporal_rs::diplomat::capi::OptionU8 month; + temporal_rs::diplomat::capi::DiplomatStringView month_code; + temporal_rs::diplomat::capi::OptionU8 day; + temporal_rs::diplomat::capi::DiplomatStringView era; + temporal_rs::diplomat::capi::OptionI32 era_year; + temporal_rs::capi::AnyCalendarKind calendar; + }; + + typedef struct PartialDate_option {union { PartialDate ok; }; bool is_ok; } PartialDate_option; +} // namespace capi +} // namespace + + +namespace temporal_rs { +struct PartialDate { + std::optional year; + std::optional month; + std::string_view month_code; + std::optional day; + std::string_view era; + std::optional era_year; + temporal_rs::AnyCalendarKind calendar; + + inline temporal_rs::capi::PartialDate AsFFI() const; + inline static temporal_rs::PartialDate FromFFI(temporal_rs::capi::PartialDate c_struct); +}; + +} // namespace +#endif // TEMPORAL_RS_PartialDate_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialDate.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialDate.hpp new file mode 100644 index 00000000000000..b7b9dc43998fc1 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialDate.hpp @@ -0,0 +1,52 @@ +#ifndef TEMPORAL_RS_PartialDate_HPP +#define TEMPORAL_RS_PartialDate_HPP + +#include "PartialDate.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "AnyCalendarKind.hpp" +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + } // extern "C" +} // namespace capi +} // namespace + + +inline temporal_rs::capi::PartialDate temporal_rs::PartialDate::AsFFI() const { + return temporal_rs::capi::PartialDate { + /* .year = */ year.has_value() ? (temporal_rs::diplomat::capi::OptionI32{ { year.value() }, true }) : (temporal_rs::diplomat::capi::OptionI32{ {}, false }), + /* .month = */ month.has_value() ? (temporal_rs::diplomat::capi::OptionU8{ { month.value() }, true }) : (temporal_rs::diplomat::capi::OptionU8{ {}, false }), + /* .month_code = */ {month_code.data(), month_code.size()}, + /* .day = */ day.has_value() ? (temporal_rs::diplomat::capi::OptionU8{ { day.value() }, true }) : (temporal_rs::diplomat::capi::OptionU8{ {}, false }), + /* .era = */ {era.data(), era.size()}, + /* .era_year = */ era_year.has_value() ? (temporal_rs::diplomat::capi::OptionI32{ { era_year.value() }, true }) : (temporal_rs::diplomat::capi::OptionI32{ {}, false }), + /* .calendar = */ calendar.AsFFI(), + }; +} + +inline temporal_rs::PartialDate temporal_rs::PartialDate::FromFFI(temporal_rs::capi::PartialDate c_struct) { + return temporal_rs::PartialDate { + /* .year = */ c_struct.year.is_ok ? std::optional(c_struct.year.ok) : std::nullopt, + /* .month = */ c_struct.month.is_ok ? std::optional(c_struct.month.ok) : std::nullopt, + /* .month_code = */ std::string_view(c_struct.month_code.data, c_struct.month_code.len), + /* .day = */ c_struct.day.is_ok ? std::optional(c_struct.day.ok) : std::nullopt, + /* .era = */ std::string_view(c_struct.era.data, c_struct.era.len), + /* .era_year = */ c_struct.era_year.is_ok ? std::optional(c_struct.era_year.ok) : std::nullopt, + /* .calendar = */ temporal_rs::AnyCalendarKind::FromFFI(c_struct.calendar), + }; +} + + +#endif // TEMPORAL_RS_PartialDate_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialDateTime.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialDateTime.d.hpp new file mode 100644 index 00000000000000..31ef4d5b68f657 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialDateTime.d.hpp @@ -0,0 +1,44 @@ +#ifndef TEMPORAL_RS_PartialDateTime_D_HPP +#define TEMPORAL_RS_PartialDateTime_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "PartialDate.d.hpp" +#include "PartialTime.d.hpp" +#include "diplomat_runtime.hpp" +namespace temporal_rs { +struct PartialDate; +struct PartialTime; +} // namespace temporal_rs + + + +namespace temporal_rs { +namespace capi { + struct PartialDateTime { + temporal_rs::capi::PartialDate date; + temporal_rs::capi::PartialTime time; + }; + + typedef struct PartialDateTime_option {union { PartialDateTime ok; }; bool is_ok; } PartialDateTime_option; +} // namespace capi +} // namespace + + +namespace temporal_rs { +struct PartialDateTime { + temporal_rs::PartialDate date; + temporal_rs::PartialTime time; + + inline temporal_rs::capi::PartialDateTime AsFFI() const; + inline static temporal_rs::PartialDateTime FromFFI(temporal_rs::capi::PartialDateTime c_struct); +}; + +} // namespace +#endif // TEMPORAL_RS_PartialDateTime_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialDateTime.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialDateTime.hpp new file mode 100644 index 00000000000000..a1f79dc5253982 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialDateTime.hpp @@ -0,0 +1,43 @@ +#ifndef TEMPORAL_RS_PartialDateTime_HPP +#define TEMPORAL_RS_PartialDateTime_HPP + +#include "PartialDateTime.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "PartialDate.hpp" +#include "PartialTime.hpp" +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + } // extern "C" +} // namespace capi +} // namespace + + +inline temporal_rs::capi::PartialDateTime temporal_rs::PartialDateTime::AsFFI() const { + return temporal_rs::capi::PartialDateTime { + /* .date = */ date.AsFFI(), + /* .time = */ time.AsFFI(), + }; +} + +inline temporal_rs::PartialDateTime temporal_rs::PartialDateTime::FromFFI(temporal_rs::capi::PartialDateTime c_struct) { + return temporal_rs::PartialDateTime { + /* .date = */ temporal_rs::PartialDate::FromFFI(c_struct.date), + /* .time = */ temporal_rs::PartialTime::FromFFI(c_struct.time), + }; +} + + +#endif // TEMPORAL_RS_PartialDateTime_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialDuration.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialDuration.d.hpp new file mode 100644 index 00000000000000..bac2b06bb5a9b5 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialDuration.d.hpp @@ -0,0 +1,55 @@ +#ifndef TEMPORAL_RS_PartialDuration_D_HPP +#define TEMPORAL_RS_PartialDuration_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + struct PartialDuration { + temporal_rs::diplomat::capi::OptionI64 years; + temporal_rs::diplomat::capi::OptionI64 months; + temporal_rs::diplomat::capi::OptionI64 weeks; + temporal_rs::diplomat::capi::OptionI64 days; + temporal_rs::diplomat::capi::OptionI64 hours; + temporal_rs::diplomat::capi::OptionI64 minutes; + temporal_rs::diplomat::capi::OptionI64 seconds; + temporal_rs::diplomat::capi::OptionI64 milliseconds; + temporal_rs::diplomat::capi::OptionF64 microseconds; + temporal_rs::diplomat::capi::OptionF64 nanoseconds; + }; + + typedef struct PartialDuration_option {union { PartialDuration ok; }; bool is_ok; } PartialDuration_option; +} // namespace capi +} // namespace + + +namespace temporal_rs { +struct PartialDuration { + std::optional years; + std::optional months; + std::optional weeks; + std::optional days; + std::optional hours; + std::optional minutes; + std::optional seconds; + std::optional milliseconds; + std::optional microseconds; + std::optional nanoseconds; + + inline bool is_empty() const; + + inline temporal_rs::capi::PartialDuration AsFFI() const; + inline static temporal_rs::PartialDuration FromFFI(temporal_rs::capi::PartialDuration c_struct); +}; + +} // namespace +#endif // TEMPORAL_RS_PartialDuration_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialDuration.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialDuration.hpp new file mode 100644 index 00000000000000..b73924d78365e9 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialDuration.hpp @@ -0,0 +1,64 @@ +#ifndef TEMPORAL_RS_PartialDuration_HPP +#define TEMPORAL_RS_PartialDuration_HPP + +#include "PartialDuration.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + bool temporal_rs_PartialDuration_is_empty(temporal_rs::capi::PartialDuration self); + + } // extern "C" +} // namespace capi +} // namespace + +inline bool temporal_rs::PartialDuration::is_empty() const { + auto result = temporal_rs::capi::temporal_rs_PartialDuration_is_empty(this->AsFFI()); + return result; +} + + +inline temporal_rs::capi::PartialDuration temporal_rs::PartialDuration::AsFFI() const { + return temporal_rs::capi::PartialDuration { + /* .years = */ years.has_value() ? (temporal_rs::diplomat::capi::OptionI64{ { years.value() }, true }) : (temporal_rs::diplomat::capi::OptionI64{ {}, false }), + /* .months = */ months.has_value() ? (temporal_rs::diplomat::capi::OptionI64{ { months.value() }, true }) : (temporal_rs::diplomat::capi::OptionI64{ {}, false }), + /* .weeks = */ weeks.has_value() ? (temporal_rs::diplomat::capi::OptionI64{ { weeks.value() }, true }) : (temporal_rs::diplomat::capi::OptionI64{ {}, false }), + /* .days = */ days.has_value() ? (temporal_rs::diplomat::capi::OptionI64{ { days.value() }, true }) : (temporal_rs::diplomat::capi::OptionI64{ {}, false }), + /* .hours = */ hours.has_value() ? (temporal_rs::diplomat::capi::OptionI64{ { hours.value() }, true }) : (temporal_rs::diplomat::capi::OptionI64{ {}, false }), + /* .minutes = */ minutes.has_value() ? (temporal_rs::diplomat::capi::OptionI64{ { minutes.value() }, true }) : (temporal_rs::diplomat::capi::OptionI64{ {}, false }), + /* .seconds = */ seconds.has_value() ? (temporal_rs::diplomat::capi::OptionI64{ { seconds.value() }, true }) : (temporal_rs::diplomat::capi::OptionI64{ {}, false }), + /* .milliseconds = */ milliseconds.has_value() ? (temporal_rs::diplomat::capi::OptionI64{ { milliseconds.value() }, true }) : (temporal_rs::diplomat::capi::OptionI64{ {}, false }), + /* .microseconds = */ microseconds.has_value() ? (temporal_rs::diplomat::capi::OptionF64{ { microseconds.value() }, true }) : (temporal_rs::diplomat::capi::OptionF64{ {}, false }), + /* .nanoseconds = */ nanoseconds.has_value() ? (temporal_rs::diplomat::capi::OptionF64{ { nanoseconds.value() }, true }) : (temporal_rs::diplomat::capi::OptionF64{ {}, false }), + }; +} + +inline temporal_rs::PartialDuration temporal_rs::PartialDuration::FromFFI(temporal_rs::capi::PartialDuration c_struct) { + return temporal_rs::PartialDuration { + /* .years = */ c_struct.years.is_ok ? std::optional(c_struct.years.ok) : std::nullopt, + /* .months = */ c_struct.months.is_ok ? std::optional(c_struct.months.ok) : std::nullopt, + /* .weeks = */ c_struct.weeks.is_ok ? std::optional(c_struct.weeks.ok) : std::nullopt, + /* .days = */ c_struct.days.is_ok ? std::optional(c_struct.days.ok) : std::nullopt, + /* .hours = */ c_struct.hours.is_ok ? std::optional(c_struct.hours.ok) : std::nullopt, + /* .minutes = */ c_struct.minutes.is_ok ? std::optional(c_struct.minutes.ok) : std::nullopt, + /* .seconds = */ c_struct.seconds.is_ok ? std::optional(c_struct.seconds.ok) : std::nullopt, + /* .milliseconds = */ c_struct.milliseconds.is_ok ? std::optional(c_struct.milliseconds.ok) : std::nullopt, + /* .microseconds = */ c_struct.microseconds.is_ok ? std::optional(c_struct.microseconds.ok) : std::nullopt, + /* .nanoseconds = */ c_struct.nanoseconds.is_ok ? std::optional(c_struct.nanoseconds.ok) : std::nullopt, + }; +} + + +#endif // TEMPORAL_RS_PartialDuration_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialTime.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialTime.d.hpp new file mode 100644 index 00000000000000..7465f6b3bdc3d6 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialTime.d.hpp @@ -0,0 +1,45 @@ +#ifndef TEMPORAL_RS_PartialTime_D_HPP +#define TEMPORAL_RS_PartialTime_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + struct PartialTime { + temporal_rs::diplomat::capi::OptionU8 hour; + temporal_rs::diplomat::capi::OptionU8 minute; + temporal_rs::diplomat::capi::OptionU8 second; + temporal_rs::diplomat::capi::OptionU16 millisecond; + temporal_rs::diplomat::capi::OptionU16 microsecond; + temporal_rs::diplomat::capi::OptionU16 nanosecond; + }; + + typedef struct PartialTime_option {union { PartialTime ok; }; bool is_ok; } PartialTime_option; +} // namespace capi +} // namespace + + +namespace temporal_rs { +struct PartialTime { + std::optional hour; + std::optional minute; + std::optional second; + std::optional millisecond; + std::optional microsecond; + std::optional nanosecond; + + inline temporal_rs::capi::PartialTime AsFFI() const; + inline static temporal_rs::PartialTime FromFFI(temporal_rs::capi::PartialTime c_struct); +}; + +} // namespace +#endif // TEMPORAL_RS_PartialTime_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialTime.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialTime.hpp new file mode 100644 index 00000000000000..8ac03c53ae11d9 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialTime.hpp @@ -0,0 +1,49 @@ +#ifndef TEMPORAL_RS_PartialTime_HPP +#define TEMPORAL_RS_PartialTime_HPP + +#include "PartialTime.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + } // extern "C" +} // namespace capi +} // namespace + + +inline temporal_rs::capi::PartialTime temporal_rs::PartialTime::AsFFI() const { + return temporal_rs::capi::PartialTime { + /* .hour = */ hour.has_value() ? (temporal_rs::diplomat::capi::OptionU8{ { hour.value() }, true }) : (temporal_rs::diplomat::capi::OptionU8{ {}, false }), + /* .minute = */ minute.has_value() ? (temporal_rs::diplomat::capi::OptionU8{ { minute.value() }, true }) : (temporal_rs::diplomat::capi::OptionU8{ {}, false }), + /* .second = */ second.has_value() ? (temporal_rs::diplomat::capi::OptionU8{ { second.value() }, true }) : (temporal_rs::diplomat::capi::OptionU8{ {}, false }), + /* .millisecond = */ millisecond.has_value() ? (temporal_rs::diplomat::capi::OptionU16{ { millisecond.value() }, true }) : (temporal_rs::diplomat::capi::OptionU16{ {}, false }), + /* .microsecond = */ microsecond.has_value() ? (temporal_rs::diplomat::capi::OptionU16{ { microsecond.value() }, true }) : (temporal_rs::diplomat::capi::OptionU16{ {}, false }), + /* .nanosecond = */ nanosecond.has_value() ? (temporal_rs::diplomat::capi::OptionU16{ { nanosecond.value() }, true }) : (temporal_rs::diplomat::capi::OptionU16{ {}, false }), + }; +} + +inline temporal_rs::PartialTime temporal_rs::PartialTime::FromFFI(temporal_rs::capi::PartialTime c_struct) { + return temporal_rs::PartialTime { + /* .hour = */ c_struct.hour.is_ok ? std::optional(c_struct.hour.ok) : std::nullopt, + /* .minute = */ c_struct.minute.is_ok ? std::optional(c_struct.minute.ok) : std::nullopt, + /* .second = */ c_struct.second.is_ok ? std::optional(c_struct.second.ok) : std::nullopt, + /* .millisecond = */ c_struct.millisecond.is_ok ? std::optional(c_struct.millisecond.ok) : std::nullopt, + /* .microsecond = */ c_struct.microsecond.is_ok ? std::optional(c_struct.microsecond.ok) : std::nullopt, + /* .nanosecond = */ c_struct.nanosecond.is_ok ? std::optional(c_struct.nanosecond.ok) : std::nullopt, + }; +} + + +#endif // TEMPORAL_RS_PartialTime_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialZonedDateTime.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialZonedDateTime.d.hpp new file mode 100644 index 00000000000000..0d879eff5412aa --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialZonedDateTime.d.hpp @@ -0,0 +1,50 @@ +#ifndef TEMPORAL_RS_PartialZonedDateTime_D_HPP +#define TEMPORAL_RS_PartialZonedDateTime_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "PartialDate.d.hpp" +#include "PartialTime.d.hpp" +#include "TimeZone.d.hpp" +#include "diplomat_runtime.hpp" +namespace temporal_rs { +struct PartialDate; +struct PartialTime; +struct TimeZone; +} // namespace temporal_rs + + + +namespace temporal_rs { +namespace capi { + struct PartialZonedDateTime { + temporal_rs::capi::PartialDate date; + temporal_rs::capi::PartialTime time; + temporal_rs::diplomat::capi::OptionStringView offset; + temporal_rs::capi::TimeZone_option timezone; + }; + + typedef struct PartialZonedDateTime_option {union { PartialZonedDateTime ok; }; bool is_ok; } PartialZonedDateTime_option; +} // namespace capi +} // namespace + + +namespace temporal_rs { +struct PartialZonedDateTime { + temporal_rs::PartialDate date; + temporal_rs::PartialTime time; + std::optional offset; + std::optional timezone; + + inline temporal_rs::capi::PartialZonedDateTime AsFFI() const; + inline static temporal_rs::PartialZonedDateTime FromFFI(temporal_rs::capi::PartialZonedDateTime c_struct); +}; + +} // namespace +#endif // TEMPORAL_RS_PartialZonedDateTime_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialZonedDateTime.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialZonedDateTime.hpp new file mode 100644 index 00000000000000..47bf1d218c6f22 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PartialZonedDateTime.hpp @@ -0,0 +1,48 @@ +#ifndef TEMPORAL_RS_PartialZonedDateTime_HPP +#define TEMPORAL_RS_PartialZonedDateTime_HPP + +#include "PartialZonedDateTime.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "PartialDate.hpp" +#include "PartialTime.hpp" +#include "TimeZone.hpp" +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + } // extern "C" +} // namespace capi +} // namespace + + +inline temporal_rs::capi::PartialZonedDateTime temporal_rs::PartialZonedDateTime::AsFFI() const { + return temporal_rs::capi::PartialZonedDateTime { + /* .date = */ date.AsFFI(), + /* .time = */ time.AsFFI(), + /* .offset = */ offset.has_value() ? (temporal_rs::diplomat::capi::OptionStringView{ { {offset.value().data(), offset.value().size()} }, true }) : (temporal_rs::diplomat::capi::OptionStringView{ {}, false }), + /* .timezone = */ timezone.has_value() ? (temporal_rs::capi::TimeZone_option{ { timezone.value().AsFFI() }, true }) : (temporal_rs::capi::TimeZone_option{ {}, false }), + }; +} + +inline temporal_rs::PartialZonedDateTime temporal_rs::PartialZonedDateTime::FromFFI(temporal_rs::capi::PartialZonedDateTime c_struct) { + return temporal_rs::PartialZonedDateTime { + /* .date = */ temporal_rs::PartialDate::FromFFI(c_struct.date), + /* .time = */ temporal_rs::PartialTime::FromFFI(c_struct.time), + /* .offset = */ c_struct.offset.is_ok ? std::optional(std::string_view(c_struct.offset.ok.data, c_struct.offset.ok.len)) : std::nullopt, + /* .timezone = */ c_struct.timezone.is_ok ? std::optional(temporal_rs::TimeZone::FromFFI(c_struct.timezone.ok)) : std::nullopt, + }; +} + + +#endif // TEMPORAL_RS_PartialZonedDateTime_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainDate.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainDate.d.hpp new file mode 100644 index 00000000000000..e586d7cebd4a78 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainDate.d.hpp @@ -0,0 +1,163 @@ +#ifndef TEMPORAL_RS_PlainDate_D_HPP +#define TEMPORAL_RS_PlainDate_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" +namespace temporal_rs { +namespace capi { struct Calendar; } +class Calendar; +namespace capi { struct Duration; } +class Duration; +namespace capi { struct ParsedDate; } +class ParsedDate; +namespace capi { struct PlainDate; } +class PlainDate; +namespace capi { struct PlainDateTime; } +class PlainDateTime; +namespace capi { struct PlainMonthDay; } +class PlainMonthDay; +namespace capi { struct PlainTime; } +class PlainTime; +namespace capi { struct PlainYearMonth; } +class PlainYearMonth; +namespace capi { struct Provider; } +class Provider; +namespace capi { struct ZonedDateTime; } +class ZonedDateTime; +struct DifferenceSettings; +struct I128Nanoseconds; +struct PartialDate; +struct TemporalError; +struct TimeZone; +class AnyCalendarKind; +class ArithmeticOverflow; +class DisplayCalendar; +} // namespace temporal_rs + + + +namespace temporal_rs { +namespace capi { + struct PlainDate; +} // namespace capi +} // namespace + +namespace temporal_rs { +class PlainDate { +public: + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> try_new_constrain(int32_t year, uint8_t month, uint8_t day, temporal_rs::AnyCalendarKind calendar); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> try_new(int32_t year, uint8_t month, uint8_t day, temporal_rs::AnyCalendarKind calendar); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> try_new_with_overflow(int32_t year, uint8_t month, uint8_t day, temporal_rs::AnyCalendarKind calendar, temporal_rs::ArithmeticOverflow overflow); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_partial(temporal_rs::PartialDate partial, std::optional overflow); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_parsed(const temporal_rs::ParsedDate& parsed); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_epoch_milliseconds(int64_t ms, temporal_rs::TimeZone tz); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_epoch_milliseconds_with_provider(int64_t ms, temporal_rs::TimeZone tz, const temporal_rs::Provider& p); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_epoch_nanoseconds(temporal_rs::I128Nanoseconds ns, temporal_rs::TimeZone tz); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_epoch_nanoseconds_with_provider(temporal_rs::I128Nanoseconds ns, temporal_rs::TimeZone tz, const temporal_rs::Provider& p); + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> with(temporal_rs::PartialDate partial, std::optional overflow) const; + + inline std::unique_ptr with_calendar(temporal_rs::AnyCalendarKind calendar) const; + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_utf8(std::string_view s); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_utf16(std::u16string_view s); + + inline const temporal_rs::Calendar& calendar() const; + + inline bool is_valid() const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> add(const temporal_rs::Duration& duration, std::optional overflow) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> subtract(const temporal_rs::Duration& duration, std::optional overflow) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> until(const temporal_rs::PlainDate& other, temporal_rs::DifferenceSettings settings) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> since(const temporal_rs::PlainDate& other, temporal_rs::DifferenceSettings settings) const; + + inline bool equals(const temporal_rs::PlainDate& other) const; + + inline static int8_t compare(const temporal_rs::PlainDate& one, const temporal_rs::PlainDate& two); + + inline int32_t year() const; + + inline uint8_t month() const; + + inline std::string month_code() const; + template + inline void month_code_write(W& writeable_output) const; + + inline uint8_t day() const; + + inline uint16_t day_of_week() const; + + inline uint16_t day_of_year() const; + + inline std::optional week_of_year() const; + + inline std::optional year_of_week() const; + + inline uint16_t days_in_week() const; + + inline uint16_t days_in_month() const; + + inline uint16_t days_in_year() const; + + inline uint16_t months_in_year() const; + + inline bool in_leap_year() const; + + inline std::string era() const; + template + inline void era_write(W& writeable_output) const; + + inline std::optional era_year() const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> to_plain_date_time(const temporal_rs::PlainTime* time) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> to_plain_month_day() const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> to_plain_year_month() const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> to_zoned_date_time(temporal_rs::TimeZone time_zone, const temporal_rs::PlainTime* time) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> to_zoned_date_time_with_provider(temporal_rs::TimeZone time_zone, const temporal_rs::PlainTime* time, const temporal_rs::Provider& p) const; + + inline std::string to_ixdtf_string(temporal_rs::DisplayCalendar display_calendar) const; + template + inline void to_ixdtf_string_write(temporal_rs::DisplayCalendar display_calendar, W& writeable_output) const; + + inline std::unique_ptr clone() const; + + inline const temporal_rs::capi::PlainDate* AsFFI() const; + inline temporal_rs::capi::PlainDate* AsFFI(); + inline static const temporal_rs::PlainDate* FromFFI(const temporal_rs::capi::PlainDate* ptr); + inline static temporal_rs::PlainDate* FromFFI(temporal_rs::capi::PlainDate* ptr); + inline static void operator delete(void* ptr); +private: + PlainDate() = delete; + PlainDate(const temporal_rs::PlainDate&) = delete; + PlainDate(temporal_rs::PlainDate&&) noexcept = delete; + PlainDate operator=(const temporal_rs::PlainDate&) = delete; + PlainDate operator=(temporal_rs::PlainDate&&) noexcept = delete; + static void operator delete[](void*, size_t) = delete; +}; + +} // namespace +#endif // TEMPORAL_RS_PlainDate_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainDate.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainDate.hpp new file mode 100644 index 00000000000000..10673ade8f81f3 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainDate.hpp @@ -0,0 +1,455 @@ +#ifndef TEMPORAL_RS_PlainDate_HPP +#define TEMPORAL_RS_PlainDate_HPP + +#include "PlainDate.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "AnyCalendarKind.hpp" +#include "ArithmeticOverflow.hpp" +#include "Calendar.hpp" +#include "DifferenceSettings.hpp" +#include "DisplayCalendar.hpp" +#include "Duration.hpp" +#include "I128Nanoseconds.hpp" +#include "ParsedDate.hpp" +#include "PartialDate.hpp" +#include "PlainDateTime.hpp" +#include "PlainMonthDay.hpp" +#include "PlainTime.hpp" +#include "PlainYearMonth.hpp" +#include "Provider.hpp" +#include "TemporalError.hpp" +#include "TimeZone.hpp" +#include "ZonedDateTime.hpp" +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + typedef struct temporal_rs_PlainDate_try_new_constrain_result {union {temporal_rs::capi::PlainDate* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_try_new_constrain_result; + temporal_rs_PlainDate_try_new_constrain_result temporal_rs_PlainDate_try_new_constrain(int32_t year, uint8_t month, uint8_t day, temporal_rs::capi::AnyCalendarKind calendar); + + typedef struct temporal_rs_PlainDate_try_new_result {union {temporal_rs::capi::PlainDate* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_try_new_result; + temporal_rs_PlainDate_try_new_result temporal_rs_PlainDate_try_new(int32_t year, uint8_t month, uint8_t day, temporal_rs::capi::AnyCalendarKind calendar); + + typedef struct temporal_rs_PlainDate_try_new_with_overflow_result {union {temporal_rs::capi::PlainDate* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_try_new_with_overflow_result; + temporal_rs_PlainDate_try_new_with_overflow_result temporal_rs_PlainDate_try_new_with_overflow(int32_t year, uint8_t month, uint8_t day, temporal_rs::capi::AnyCalendarKind calendar, temporal_rs::capi::ArithmeticOverflow overflow); + + typedef struct temporal_rs_PlainDate_from_partial_result {union {temporal_rs::capi::PlainDate* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_from_partial_result; + temporal_rs_PlainDate_from_partial_result temporal_rs_PlainDate_from_partial(temporal_rs::capi::PartialDate partial, temporal_rs::capi::ArithmeticOverflow_option overflow); + + typedef struct temporal_rs_PlainDate_from_parsed_result {union {temporal_rs::capi::PlainDate* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_from_parsed_result; + temporal_rs_PlainDate_from_parsed_result temporal_rs_PlainDate_from_parsed(const temporal_rs::capi::ParsedDate* parsed); + + typedef struct temporal_rs_PlainDate_from_epoch_milliseconds_result {union {temporal_rs::capi::PlainDate* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_from_epoch_milliseconds_result; + temporal_rs_PlainDate_from_epoch_milliseconds_result temporal_rs_PlainDate_from_epoch_milliseconds(int64_t ms, temporal_rs::capi::TimeZone tz); + + typedef struct temporal_rs_PlainDate_from_epoch_milliseconds_with_provider_result {union {temporal_rs::capi::PlainDate* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_from_epoch_milliseconds_with_provider_result; + temporal_rs_PlainDate_from_epoch_milliseconds_with_provider_result temporal_rs_PlainDate_from_epoch_milliseconds_with_provider(int64_t ms, temporal_rs::capi::TimeZone tz, const temporal_rs::capi::Provider* p); + + typedef struct temporal_rs_PlainDate_from_epoch_nanoseconds_result {union {temporal_rs::capi::PlainDate* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_from_epoch_nanoseconds_result; + temporal_rs_PlainDate_from_epoch_nanoseconds_result temporal_rs_PlainDate_from_epoch_nanoseconds(temporal_rs::capi::I128Nanoseconds ns, temporal_rs::capi::TimeZone tz); + + typedef struct temporal_rs_PlainDate_from_epoch_nanoseconds_with_provider_result {union {temporal_rs::capi::PlainDate* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_from_epoch_nanoseconds_with_provider_result; + temporal_rs_PlainDate_from_epoch_nanoseconds_with_provider_result temporal_rs_PlainDate_from_epoch_nanoseconds_with_provider(temporal_rs::capi::I128Nanoseconds ns, temporal_rs::capi::TimeZone tz, const temporal_rs::capi::Provider* p); + + typedef struct temporal_rs_PlainDate_with_result {union {temporal_rs::capi::PlainDate* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_with_result; + temporal_rs_PlainDate_with_result temporal_rs_PlainDate_with(const temporal_rs::capi::PlainDate* self, temporal_rs::capi::PartialDate partial, temporal_rs::capi::ArithmeticOverflow_option overflow); + + temporal_rs::capi::PlainDate* temporal_rs_PlainDate_with_calendar(const temporal_rs::capi::PlainDate* self, temporal_rs::capi::AnyCalendarKind calendar); + + typedef struct temporal_rs_PlainDate_from_utf8_result {union {temporal_rs::capi::PlainDate* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_from_utf8_result; + temporal_rs_PlainDate_from_utf8_result temporal_rs_PlainDate_from_utf8(temporal_rs::diplomat::capi::DiplomatStringView s); + + typedef struct temporal_rs_PlainDate_from_utf16_result {union {temporal_rs::capi::PlainDate* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_from_utf16_result; + temporal_rs_PlainDate_from_utf16_result temporal_rs_PlainDate_from_utf16(temporal_rs::diplomat::capi::DiplomatString16View s); + + const temporal_rs::capi::Calendar* temporal_rs_PlainDate_calendar(const temporal_rs::capi::PlainDate* self); + + bool temporal_rs_PlainDate_is_valid(const temporal_rs::capi::PlainDate* self); + + typedef struct temporal_rs_PlainDate_add_result {union {temporal_rs::capi::PlainDate* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_add_result; + temporal_rs_PlainDate_add_result temporal_rs_PlainDate_add(const temporal_rs::capi::PlainDate* self, const temporal_rs::capi::Duration* duration, temporal_rs::capi::ArithmeticOverflow_option overflow); + + typedef struct temporal_rs_PlainDate_subtract_result {union {temporal_rs::capi::PlainDate* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_subtract_result; + temporal_rs_PlainDate_subtract_result temporal_rs_PlainDate_subtract(const temporal_rs::capi::PlainDate* self, const temporal_rs::capi::Duration* duration, temporal_rs::capi::ArithmeticOverflow_option overflow); + + typedef struct temporal_rs_PlainDate_until_result {union {temporal_rs::capi::Duration* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_until_result; + temporal_rs_PlainDate_until_result temporal_rs_PlainDate_until(const temporal_rs::capi::PlainDate* self, const temporal_rs::capi::PlainDate* other, temporal_rs::capi::DifferenceSettings settings); + + typedef struct temporal_rs_PlainDate_since_result {union {temporal_rs::capi::Duration* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_since_result; + temporal_rs_PlainDate_since_result temporal_rs_PlainDate_since(const temporal_rs::capi::PlainDate* self, const temporal_rs::capi::PlainDate* other, temporal_rs::capi::DifferenceSettings settings); + + bool temporal_rs_PlainDate_equals(const temporal_rs::capi::PlainDate* self, const temporal_rs::capi::PlainDate* other); + + int8_t temporal_rs_PlainDate_compare(const temporal_rs::capi::PlainDate* one, const temporal_rs::capi::PlainDate* two); + + int32_t temporal_rs_PlainDate_year(const temporal_rs::capi::PlainDate* self); + + uint8_t temporal_rs_PlainDate_month(const temporal_rs::capi::PlainDate* self); + + void temporal_rs_PlainDate_month_code(const temporal_rs::capi::PlainDate* self, temporal_rs::diplomat::capi::DiplomatWrite* write); + + uint8_t temporal_rs_PlainDate_day(const temporal_rs::capi::PlainDate* self); + + uint16_t temporal_rs_PlainDate_day_of_week(const temporal_rs::capi::PlainDate* self); + + uint16_t temporal_rs_PlainDate_day_of_year(const temporal_rs::capi::PlainDate* self); + + typedef struct temporal_rs_PlainDate_week_of_year_result {union {uint8_t ok; }; bool is_ok;} temporal_rs_PlainDate_week_of_year_result; + temporal_rs_PlainDate_week_of_year_result temporal_rs_PlainDate_week_of_year(const temporal_rs::capi::PlainDate* self); + + typedef struct temporal_rs_PlainDate_year_of_week_result {union {int32_t ok; }; bool is_ok;} temporal_rs_PlainDate_year_of_week_result; + temporal_rs_PlainDate_year_of_week_result temporal_rs_PlainDate_year_of_week(const temporal_rs::capi::PlainDate* self); + + uint16_t temporal_rs_PlainDate_days_in_week(const temporal_rs::capi::PlainDate* self); + + uint16_t temporal_rs_PlainDate_days_in_month(const temporal_rs::capi::PlainDate* self); + + uint16_t temporal_rs_PlainDate_days_in_year(const temporal_rs::capi::PlainDate* self); + + uint16_t temporal_rs_PlainDate_months_in_year(const temporal_rs::capi::PlainDate* self); + + bool temporal_rs_PlainDate_in_leap_year(const temporal_rs::capi::PlainDate* self); + + void temporal_rs_PlainDate_era(const temporal_rs::capi::PlainDate* self, temporal_rs::diplomat::capi::DiplomatWrite* write); + + typedef struct temporal_rs_PlainDate_era_year_result {union {int32_t ok; }; bool is_ok;} temporal_rs_PlainDate_era_year_result; + temporal_rs_PlainDate_era_year_result temporal_rs_PlainDate_era_year(const temporal_rs::capi::PlainDate* self); + + typedef struct temporal_rs_PlainDate_to_plain_date_time_result {union {temporal_rs::capi::PlainDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_to_plain_date_time_result; + temporal_rs_PlainDate_to_plain_date_time_result temporal_rs_PlainDate_to_plain_date_time(const temporal_rs::capi::PlainDate* self, const temporal_rs::capi::PlainTime* time); + + typedef struct temporal_rs_PlainDate_to_plain_month_day_result {union {temporal_rs::capi::PlainMonthDay* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_to_plain_month_day_result; + temporal_rs_PlainDate_to_plain_month_day_result temporal_rs_PlainDate_to_plain_month_day(const temporal_rs::capi::PlainDate* self); + + typedef struct temporal_rs_PlainDate_to_plain_year_month_result {union {temporal_rs::capi::PlainYearMonth* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_to_plain_year_month_result; + temporal_rs_PlainDate_to_plain_year_month_result temporal_rs_PlainDate_to_plain_year_month(const temporal_rs::capi::PlainDate* self); + + typedef struct temporal_rs_PlainDate_to_zoned_date_time_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_to_zoned_date_time_result; + temporal_rs_PlainDate_to_zoned_date_time_result temporal_rs_PlainDate_to_zoned_date_time(const temporal_rs::capi::PlainDate* self, temporal_rs::capi::TimeZone time_zone, const temporal_rs::capi::PlainTime* time); + + typedef struct temporal_rs_PlainDate_to_zoned_date_time_with_provider_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDate_to_zoned_date_time_with_provider_result; + temporal_rs_PlainDate_to_zoned_date_time_with_provider_result temporal_rs_PlainDate_to_zoned_date_time_with_provider(const temporal_rs::capi::PlainDate* self, temporal_rs::capi::TimeZone time_zone, const temporal_rs::capi::PlainTime* time, const temporal_rs::capi::Provider* p); + + void temporal_rs_PlainDate_to_ixdtf_string(const temporal_rs::capi::PlainDate* self, temporal_rs::capi::DisplayCalendar display_calendar, temporal_rs::diplomat::capi::DiplomatWrite* write); + + temporal_rs::capi::PlainDate* temporal_rs_PlainDate_clone(const temporal_rs::capi::PlainDate* self); + + void temporal_rs_PlainDate_destroy(PlainDate* self); + + } // extern "C" +} // namespace capi +} // namespace + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDate::try_new_constrain(int32_t year, uint8_t month, uint8_t day, temporal_rs::AnyCalendarKind calendar) { + auto result = temporal_rs::capi::temporal_rs_PlainDate_try_new_constrain(year, + month, + day, + calendar.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainDate::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDate::try_new(int32_t year, uint8_t month, uint8_t day, temporal_rs::AnyCalendarKind calendar) { + auto result = temporal_rs::capi::temporal_rs_PlainDate_try_new(year, + month, + day, + calendar.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainDate::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDate::try_new_with_overflow(int32_t year, uint8_t month, uint8_t day, temporal_rs::AnyCalendarKind calendar, temporal_rs::ArithmeticOverflow overflow) { + auto result = temporal_rs::capi::temporal_rs_PlainDate_try_new_with_overflow(year, + month, + day, + calendar.AsFFI(), + overflow.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainDate::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDate::from_partial(temporal_rs::PartialDate partial, std::optional overflow) { + auto result = temporal_rs::capi::temporal_rs_PlainDate_from_partial(partial.AsFFI(), + overflow.has_value() ? (temporal_rs::capi::ArithmeticOverflow_option{ { overflow.value().AsFFI() }, true }) : (temporal_rs::capi::ArithmeticOverflow_option{ {}, false })); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainDate::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDate::from_parsed(const temporal_rs::ParsedDate& parsed) { + auto result = temporal_rs::capi::temporal_rs_PlainDate_from_parsed(parsed.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainDate::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDate::from_epoch_milliseconds(int64_t ms, temporal_rs::TimeZone tz) { + auto result = temporal_rs::capi::temporal_rs_PlainDate_from_epoch_milliseconds(ms, + tz.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainDate::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDate::from_epoch_milliseconds_with_provider(int64_t ms, temporal_rs::TimeZone tz, const temporal_rs::Provider& p) { + auto result = temporal_rs::capi::temporal_rs_PlainDate_from_epoch_milliseconds_with_provider(ms, + tz.AsFFI(), + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainDate::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDate::from_epoch_nanoseconds(temporal_rs::I128Nanoseconds ns, temporal_rs::TimeZone tz) { + auto result = temporal_rs::capi::temporal_rs_PlainDate_from_epoch_nanoseconds(ns.AsFFI(), + tz.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainDate::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDate::from_epoch_nanoseconds_with_provider(temporal_rs::I128Nanoseconds ns, temporal_rs::TimeZone tz, const temporal_rs::Provider& p) { + auto result = temporal_rs::capi::temporal_rs_PlainDate_from_epoch_nanoseconds_with_provider(ns.AsFFI(), + tz.AsFFI(), + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainDate::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDate::with(temporal_rs::PartialDate partial, std::optional overflow) const { + auto result = temporal_rs::capi::temporal_rs_PlainDate_with(this->AsFFI(), + partial.AsFFI(), + overflow.has_value() ? (temporal_rs::capi::ArithmeticOverflow_option{ { overflow.value().AsFFI() }, true }) : (temporal_rs::capi::ArithmeticOverflow_option{ {}, false })); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainDate::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline std::unique_ptr temporal_rs::PlainDate::with_calendar(temporal_rs::AnyCalendarKind calendar) const { + auto result = temporal_rs::capi::temporal_rs_PlainDate_with_calendar(this->AsFFI(), + calendar.AsFFI()); + return std::unique_ptr(temporal_rs::PlainDate::FromFFI(result)); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDate::from_utf8(std::string_view s) { + auto result = temporal_rs::capi::temporal_rs_PlainDate_from_utf8({s.data(), s.size()}); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainDate::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDate::from_utf16(std::u16string_view s) { + auto result = temporal_rs::capi::temporal_rs_PlainDate_from_utf16({s.data(), s.size()}); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainDate::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline const temporal_rs::Calendar& temporal_rs::PlainDate::calendar() const { + auto result = temporal_rs::capi::temporal_rs_PlainDate_calendar(this->AsFFI()); + return *temporal_rs::Calendar::FromFFI(result); +} + +inline bool temporal_rs::PlainDate::is_valid() const { + auto result = temporal_rs::capi::temporal_rs_PlainDate_is_valid(this->AsFFI()); + return result; +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDate::add(const temporal_rs::Duration& duration, std::optional overflow) const { + auto result = temporal_rs::capi::temporal_rs_PlainDate_add(this->AsFFI(), + duration.AsFFI(), + overflow.has_value() ? (temporal_rs::capi::ArithmeticOverflow_option{ { overflow.value().AsFFI() }, true }) : (temporal_rs::capi::ArithmeticOverflow_option{ {}, false })); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainDate::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDate::subtract(const temporal_rs::Duration& duration, std::optional overflow) const { + auto result = temporal_rs::capi::temporal_rs_PlainDate_subtract(this->AsFFI(), + duration.AsFFI(), + overflow.has_value() ? (temporal_rs::capi::ArithmeticOverflow_option{ { overflow.value().AsFFI() }, true }) : (temporal_rs::capi::ArithmeticOverflow_option{ {}, false })); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainDate::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDate::until(const temporal_rs::PlainDate& other, temporal_rs::DifferenceSettings settings) const { + auto result = temporal_rs::capi::temporal_rs_PlainDate_until(this->AsFFI(), + other.AsFFI(), + settings.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::Duration::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDate::since(const temporal_rs::PlainDate& other, temporal_rs::DifferenceSettings settings) const { + auto result = temporal_rs::capi::temporal_rs_PlainDate_since(this->AsFFI(), + other.AsFFI(), + settings.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::Duration::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline bool temporal_rs::PlainDate::equals(const temporal_rs::PlainDate& other) const { + auto result = temporal_rs::capi::temporal_rs_PlainDate_equals(this->AsFFI(), + other.AsFFI()); + return result; +} + +inline int8_t temporal_rs::PlainDate::compare(const temporal_rs::PlainDate& one, const temporal_rs::PlainDate& two) { + auto result = temporal_rs::capi::temporal_rs_PlainDate_compare(one.AsFFI(), + two.AsFFI()); + return result; +} + +inline int32_t temporal_rs::PlainDate::year() const { + auto result = temporal_rs::capi::temporal_rs_PlainDate_year(this->AsFFI()); + return result; +} + +inline uint8_t temporal_rs::PlainDate::month() const { + auto result = temporal_rs::capi::temporal_rs_PlainDate_month(this->AsFFI()); + return result; +} + +inline std::string temporal_rs::PlainDate::month_code() const { + std::string output; + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteFromString(output); + temporal_rs::capi::temporal_rs_PlainDate_month_code(this->AsFFI(), + &write); + return output; +} +template +inline void temporal_rs::PlainDate::month_code_write(W& writeable) const { + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteTrait::Construct(writeable); + temporal_rs::capi::temporal_rs_PlainDate_month_code(this->AsFFI(), + &write); +} + +inline uint8_t temporal_rs::PlainDate::day() const { + auto result = temporal_rs::capi::temporal_rs_PlainDate_day(this->AsFFI()); + return result; +} + +inline uint16_t temporal_rs::PlainDate::day_of_week() const { + auto result = temporal_rs::capi::temporal_rs_PlainDate_day_of_week(this->AsFFI()); + return result; +} + +inline uint16_t temporal_rs::PlainDate::day_of_year() const { + auto result = temporal_rs::capi::temporal_rs_PlainDate_day_of_year(this->AsFFI()); + return result; +} + +inline std::optional temporal_rs::PlainDate::week_of_year() const { + auto result = temporal_rs::capi::temporal_rs_PlainDate_week_of_year(this->AsFFI()); + return result.is_ok ? std::optional(result.ok) : std::nullopt; +} + +inline std::optional temporal_rs::PlainDate::year_of_week() const { + auto result = temporal_rs::capi::temporal_rs_PlainDate_year_of_week(this->AsFFI()); + return result.is_ok ? std::optional(result.ok) : std::nullopt; +} + +inline uint16_t temporal_rs::PlainDate::days_in_week() const { + auto result = temporal_rs::capi::temporal_rs_PlainDate_days_in_week(this->AsFFI()); + return result; +} + +inline uint16_t temporal_rs::PlainDate::days_in_month() const { + auto result = temporal_rs::capi::temporal_rs_PlainDate_days_in_month(this->AsFFI()); + return result; +} + +inline uint16_t temporal_rs::PlainDate::days_in_year() const { + auto result = temporal_rs::capi::temporal_rs_PlainDate_days_in_year(this->AsFFI()); + return result; +} + +inline uint16_t temporal_rs::PlainDate::months_in_year() const { + auto result = temporal_rs::capi::temporal_rs_PlainDate_months_in_year(this->AsFFI()); + return result; +} + +inline bool temporal_rs::PlainDate::in_leap_year() const { + auto result = temporal_rs::capi::temporal_rs_PlainDate_in_leap_year(this->AsFFI()); + return result; +} + +inline std::string temporal_rs::PlainDate::era() const { + std::string output; + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteFromString(output); + temporal_rs::capi::temporal_rs_PlainDate_era(this->AsFFI(), + &write); + return output; +} +template +inline void temporal_rs::PlainDate::era_write(W& writeable) const { + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteTrait::Construct(writeable); + temporal_rs::capi::temporal_rs_PlainDate_era(this->AsFFI(), + &write); +} + +inline std::optional temporal_rs::PlainDate::era_year() const { + auto result = temporal_rs::capi::temporal_rs_PlainDate_era_year(this->AsFFI()); + return result.is_ok ? std::optional(result.ok) : std::nullopt; +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDate::to_plain_date_time(const temporal_rs::PlainTime* time) const { + auto result = temporal_rs::capi::temporal_rs_PlainDate_to_plain_date_time(this->AsFFI(), + time ? time->AsFFI() : nullptr); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDate::to_plain_month_day() const { + auto result = temporal_rs::capi::temporal_rs_PlainDate_to_plain_month_day(this->AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainMonthDay::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDate::to_plain_year_month() const { + auto result = temporal_rs::capi::temporal_rs_PlainDate_to_plain_year_month(this->AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainYearMonth::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDate::to_zoned_date_time(temporal_rs::TimeZone time_zone, const temporal_rs::PlainTime* time) const { + auto result = temporal_rs::capi::temporal_rs_PlainDate_to_zoned_date_time(this->AsFFI(), + time_zone.AsFFI(), + time ? time->AsFFI() : nullptr); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDate::to_zoned_date_time_with_provider(temporal_rs::TimeZone time_zone, const temporal_rs::PlainTime* time, const temporal_rs::Provider& p) const { + auto result = temporal_rs::capi::temporal_rs_PlainDate_to_zoned_date_time_with_provider(this->AsFFI(), + time_zone.AsFFI(), + time ? time->AsFFI() : nullptr, + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline std::string temporal_rs::PlainDate::to_ixdtf_string(temporal_rs::DisplayCalendar display_calendar) const { + std::string output; + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteFromString(output); + temporal_rs::capi::temporal_rs_PlainDate_to_ixdtf_string(this->AsFFI(), + display_calendar.AsFFI(), + &write); + return output; +} +template +inline void temporal_rs::PlainDate::to_ixdtf_string_write(temporal_rs::DisplayCalendar display_calendar, W& writeable) const { + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteTrait::Construct(writeable); + temporal_rs::capi::temporal_rs_PlainDate_to_ixdtf_string(this->AsFFI(), + display_calendar.AsFFI(), + &write); +} + +inline std::unique_ptr temporal_rs::PlainDate::clone() const { + auto result = temporal_rs::capi::temporal_rs_PlainDate_clone(this->AsFFI()); + return std::unique_ptr(temporal_rs::PlainDate::FromFFI(result)); +} + +inline const temporal_rs::capi::PlainDate* temporal_rs::PlainDate::AsFFI() const { + return reinterpret_cast(this); +} + +inline temporal_rs::capi::PlainDate* temporal_rs::PlainDate::AsFFI() { + return reinterpret_cast(this); +} + +inline const temporal_rs::PlainDate* temporal_rs::PlainDate::FromFFI(const temporal_rs::capi::PlainDate* ptr) { + return reinterpret_cast(ptr); +} + +inline temporal_rs::PlainDate* temporal_rs::PlainDate::FromFFI(temporal_rs::capi::PlainDate* ptr) { + return reinterpret_cast(ptr); +} + +inline void temporal_rs::PlainDate::operator delete(void* ptr) { + temporal_rs::capi::temporal_rs_PlainDate_destroy(reinterpret_cast(ptr)); +} + + +#endif // TEMPORAL_RS_PlainDate_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainDateTime.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainDateTime.d.hpp new file mode 100644 index 00000000000000..f5052625fcfe95 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainDateTime.d.hpp @@ -0,0 +1,172 @@ +#ifndef TEMPORAL_RS_PlainDateTime_D_HPP +#define TEMPORAL_RS_PlainDateTime_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" +namespace temporal_rs { +namespace capi { struct Calendar; } +class Calendar; +namespace capi { struct Duration; } +class Duration; +namespace capi { struct ParsedDateTime; } +class ParsedDateTime; +namespace capi { struct PlainDate; } +class PlainDate; +namespace capi { struct PlainDateTime; } +class PlainDateTime; +namespace capi { struct PlainTime; } +class PlainTime; +namespace capi { struct Provider; } +class Provider; +namespace capi { struct ZonedDateTime; } +class ZonedDateTime; +struct DifferenceSettings; +struct I128Nanoseconds; +struct PartialDateTime; +struct RoundingOptions; +struct TemporalError; +struct TimeZone; +struct ToStringRoundingOptions; +class AnyCalendarKind; +class ArithmeticOverflow; +class Disambiguation; +class DisplayCalendar; +} // namespace temporal_rs + + + +namespace temporal_rs { +namespace capi { + struct PlainDateTime; +} // namespace capi +} // namespace + +namespace temporal_rs { +class PlainDateTime { +public: + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> try_new_constrain(int32_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint16_t millisecond, uint16_t microsecond, uint16_t nanosecond, temporal_rs::AnyCalendarKind calendar); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> try_new(int32_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint16_t millisecond, uint16_t microsecond, uint16_t nanosecond, temporal_rs::AnyCalendarKind calendar); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_partial(temporal_rs::PartialDateTime partial, std::optional overflow); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_parsed(const temporal_rs::ParsedDateTime& parsed); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_epoch_milliseconds(int64_t ms, temporal_rs::TimeZone tz); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_epoch_milliseconds_with_provider(int64_t ms, temporal_rs::TimeZone tz, const temporal_rs::Provider& p); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_epoch_nanoseconds(temporal_rs::I128Nanoseconds ns, temporal_rs::TimeZone tz); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_epoch_nanoseconds_with_provider(temporal_rs::I128Nanoseconds ns, temporal_rs::TimeZone tz, const temporal_rs::Provider& p); + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> with(temporal_rs::PartialDateTime partial, std::optional overflow) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> with_time(const temporal_rs::PlainTime* time) const; + + inline std::unique_ptr with_calendar(temporal_rs::AnyCalendarKind calendar) const; + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_utf8(std::string_view s); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_utf16(std::u16string_view s); + + inline uint8_t hour() const; + + inline uint8_t minute() const; + + inline uint8_t second() const; + + inline uint16_t millisecond() const; + + inline uint16_t microsecond() const; + + inline uint16_t nanosecond() const; + + inline const temporal_rs::Calendar& calendar() const; + + inline int32_t year() const; + + inline uint8_t month() const; + + inline std::string month_code() const; + template + inline void month_code_write(W& writeable_output) const; + + inline uint8_t day() const; + + inline uint16_t day_of_week() const; + + inline uint16_t day_of_year() const; + + inline std::optional week_of_year() const; + + inline std::optional year_of_week() const; + + inline uint16_t days_in_week() const; + + inline uint16_t days_in_month() const; + + inline uint16_t days_in_year() const; + + inline uint16_t months_in_year() const; + + inline bool in_leap_year() const; + + inline std::string era() const; + template + inline void era_write(W& writeable_output) const; + + inline std::optional era_year() const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> add(const temporal_rs::Duration& duration, std::optional overflow) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> subtract(const temporal_rs::Duration& duration, std::optional overflow) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> until(const temporal_rs::PlainDateTime& other, temporal_rs::DifferenceSettings settings) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> since(const temporal_rs::PlainDateTime& other, temporal_rs::DifferenceSettings settings) const; + + inline bool equals(const temporal_rs::PlainDateTime& other) const; + + inline static int8_t compare(const temporal_rs::PlainDateTime& one, const temporal_rs::PlainDateTime& two); + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> round(temporal_rs::RoundingOptions options) const; + + inline std::unique_ptr to_plain_date() const; + + inline std::unique_ptr to_plain_time() const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> to_zoned_date_time(temporal_rs::TimeZone time_zone, temporal_rs::Disambiguation disambiguation) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> to_zoned_date_time_with_provider(temporal_rs::TimeZone time_zone, temporal_rs::Disambiguation disambiguation, const temporal_rs::Provider& p) const; + + inline temporal_rs::diplomat::result to_ixdtf_string(temporal_rs::ToStringRoundingOptions options, temporal_rs::DisplayCalendar display_calendar) const; + template + inline temporal_rs::diplomat::result to_ixdtf_string_write(temporal_rs::ToStringRoundingOptions options, temporal_rs::DisplayCalendar display_calendar, W& writeable_output) const; + + inline std::unique_ptr clone() const; + + inline const temporal_rs::capi::PlainDateTime* AsFFI() const; + inline temporal_rs::capi::PlainDateTime* AsFFI(); + inline static const temporal_rs::PlainDateTime* FromFFI(const temporal_rs::capi::PlainDateTime* ptr); + inline static temporal_rs::PlainDateTime* FromFFI(temporal_rs::capi::PlainDateTime* ptr); + inline static void operator delete(void* ptr); +private: + PlainDateTime() = delete; + PlainDateTime(const temporal_rs::PlainDateTime&) = delete; + PlainDateTime(temporal_rs::PlainDateTime&&) noexcept = delete; + PlainDateTime operator=(const temporal_rs::PlainDateTime&) = delete; + PlainDateTime operator=(temporal_rs::PlainDateTime&&) noexcept = delete; + static void operator delete[](void*, size_t) = delete; +}; + +} // namespace +#endif // TEMPORAL_RS_PlainDateTime_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainDateTime.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainDateTime.hpp new file mode 100644 index 00000000000000..2513e06d722aac --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainDateTime.hpp @@ -0,0 +1,502 @@ +#ifndef TEMPORAL_RS_PlainDateTime_HPP +#define TEMPORAL_RS_PlainDateTime_HPP + +#include "PlainDateTime.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "AnyCalendarKind.hpp" +#include "ArithmeticOverflow.hpp" +#include "Calendar.hpp" +#include "DifferenceSettings.hpp" +#include "Disambiguation.hpp" +#include "DisplayCalendar.hpp" +#include "Duration.hpp" +#include "I128Nanoseconds.hpp" +#include "ParsedDateTime.hpp" +#include "PartialDateTime.hpp" +#include "PlainDate.hpp" +#include "PlainTime.hpp" +#include "Provider.hpp" +#include "RoundingOptions.hpp" +#include "TemporalError.hpp" +#include "TimeZone.hpp" +#include "ToStringRoundingOptions.hpp" +#include "ZonedDateTime.hpp" +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + typedef struct temporal_rs_PlainDateTime_try_new_constrain_result {union {temporal_rs::capi::PlainDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_try_new_constrain_result; + temporal_rs_PlainDateTime_try_new_constrain_result temporal_rs_PlainDateTime_try_new_constrain(int32_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint16_t millisecond, uint16_t microsecond, uint16_t nanosecond, temporal_rs::capi::AnyCalendarKind calendar); + + typedef struct temporal_rs_PlainDateTime_try_new_result {union {temporal_rs::capi::PlainDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_try_new_result; + temporal_rs_PlainDateTime_try_new_result temporal_rs_PlainDateTime_try_new(int32_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint16_t millisecond, uint16_t microsecond, uint16_t nanosecond, temporal_rs::capi::AnyCalendarKind calendar); + + typedef struct temporal_rs_PlainDateTime_from_partial_result {union {temporal_rs::capi::PlainDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_from_partial_result; + temporal_rs_PlainDateTime_from_partial_result temporal_rs_PlainDateTime_from_partial(temporal_rs::capi::PartialDateTime partial, temporal_rs::capi::ArithmeticOverflow_option overflow); + + typedef struct temporal_rs_PlainDateTime_from_parsed_result {union {temporal_rs::capi::PlainDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_from_parsed_result; + temporal_rs_PlainDateTime_from_parsed_result temporal_rs_PlainDateTime_from_parsed(const temporal_rs::capi::ParsedDateTime* parsed); + + typedef struct temporal_rs_PlainDateTime_from_epoch_milliseconds_result {union {temporal_rs::capi::PlainDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_from_epoch_milliseconds_result; + temporal_rs_PlainDateTime_from_epoch_milliseconds_result temporal_rs_PlainDateTime_from_epoch_milliseconds(int64_t ms, temporal_rs::capi::TimeZone tz); + + typedef struct temporal_rs_PlainDateTime_from_epoch_milliseconds_with_provider_result {union {temporal_rs::capi::PlainDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_from_epoch_milliseconds_with_provider_result; + temporal_rs_PlainDateTime_from_epoch_milliseconds_with_provider_result temporal_rs_PlainDateTime_from_epoch_milliseconds_with_provider(int64_t ms, temporal_rs::capi::TimeZone tz, const temporal_rs::capi::Provider* p); + + typedef struct temporal_rs_PlainDateTime_from_epoch_nanoseconds_result {union {temporal_rs::capi::PlainDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_from_epoch_nanoseconds_result; + temporal_rs_PlainDateTime_from_epoch_nanoseconds_result temporal_rs_PlainDateTime_from_epoch_nanoseconds(temporal_rs::capi::I128Nanoseconds ns, temporal_rs::capi::TimeZone tz); + + typedef struct temporal_rs_PlainDateTime_from_epoch_nanoseconds_with_provider_result {union {temporal_rs::capi::PlainDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_from_epoch_nanoseconds_with_provider_result; + temporal_rs_PlainDateTime_from_epoch_nanoseconds_with_provider_result temporal_rs_PlainDateTime_from_epoch_nanoseconds_with_provider(temporal_rs::capi::I128Nanoseconds ns, temporal_rs::capi::TimeZone tz, const temporal_rs::capi::Provider* p); + + typedef struct temporal_rs_PlainDateTime_with_result {union {temporal_rs::capi::PlainDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_with_result; + temporal_rs_PlainDateTime_with_result temporal_rs_PlainDateTime_with(const temporal_rs::capi::PlainDateTime* self, temporal_rs::capi::PartialDateTime partial, temporal_rs::capi::ArithmeticOverflow_option overflow); + + typedef struct temporal_rs_PlainDateTime_with_time_result {union {temporal_rs::capi::PlainDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_with_time_result; + temporal_rs_PlainDateTime_with_time_result temporal_rs_PlainDateTime_with_time(const temporal_rs::capi::PlainDateTime* self, const temporal_rs::capi::PlainTime* time); + + temporal_rs::capi::PlainDateTime* temporal_rs_PlainDateTime_with_calendar(const temporal_rs::capi::PlainDateTime* self, temporal_rs::capi::AnyCalendarKind calendar); + + typedef struct temporal_rs_PlainDateTime_from_utf8_result {union {temporal_rs::capi::PlainDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_from_utf8_result; + temporal_rs_PlainDateTime_from_utf8_result temporal_rs_PlainDateTime_from_utf8(temporal_rs::diplomat::capi::DiplomatStringView s); + + typedef struct temporal_rs_PlainDateTime_from_utf16_result {union {temporal_rs::capi::PlainDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_from_utf16_result; + temporal_rs_PlainDateTime_from_utf16_result temporal_rs_PlainDateTime_from_utf16(temporal_rs::diplomat::capi::DiplomatString16View s); + + uint8_t temporal_rs_PlainDateTime_hour(const temporal_rs::capi::PlainDateTime* self); + + uint8_t temporal_rs_PlainDateTime_minute(const temporal_rs::capi::PlainDateTime* self); + + uint8_t temporal_rs_PlainDateTime_second(const temporal_rs::capi::PlainDateTime* self); + + uint16_t temporal_rs_PlainDateTime_millisecond(const temporal_rs::capi::PlainDateTime* self); + + uint16_t temporal_rs_PlainDateTime_microsecond(const temporal_rs::capi::PlainDateTime* self); + + uint16_t temporal_rs_PlainDateTime_nanosecond(const temporal_rs::capi::PlainDateTime* self); + + const temporal_rs::capi::Calendar* temporal_rs_PlainDateTime_calendar(const temporal_rs::capi::PlainDateTime* self); + + int32_t temporal_rs_PlainDateTime_year(const temporal_rs::capi::PlainDateTime* self); + + uint8_t temporal_rs_PlainDateTime_month(const temporal_rs::capi::PlainDateTime* self); + + void temporal_rs_PlainDateTime_month_code(const temporal_rs::capi::PlainDateTime* self, temporal_rs::diplomat::capi::DiplomatWrite* write); + + uint8_t temporal_rs_PlainDateTime_day(const temporal_rs::capi::PlainDateTime* self); + + uint16_t temporal_rs_PlainDateTime_day_of_week(const temporal_rs::capi::PlainDateTime* self); + + uint16_t temporal_rs_PlainDateTime_day_of_year(const temporal_rs::capi::PlainDateTime* self); + + typedef struct temporal_rs_PlainDateTime_week_of_year_result {union {uint8_t ok; }; bool is_ok;} temporal_rs_PlainDateTime_week_of_year_result; + temporal_rs_PlainDateTime_week_of_year_result temporal_rs_PlainDateTime_week_of_year(const temporal_rs::capi::PlainDateTime* self); + + typedef struct temporal_rs_PlainDateTime_year_of_week_result {union {int32_t ok; }; bool is_ok;} temporal_rs_PlainDateTime_year_of_week_result; + temporal_rs_PlainDateTime_year_of_week_result temporal_rs_PlainDateTime_year_of_week(const temporal_rs::capi::PlainDateTime* self); + + uint16_t temporal_rs_PlainDateTime_days_in_week(const temporal_rs::capi::PlainDateTime* self); + + uint16_t temporal_rs_PlainDateTime_days_in_month(const temporal_rs::capi::PlainDateTime* self); + + uint16_t temporal_rs_PlainDateTime_days_in_year(const temporal_rs::capi::PlainDateTime* self); + + uint16_t temporal_rs_PlainDateTime_months_in_year(const temporal_rs::capi::PlainDateTime* self); + + bool temporal_rs_PlainDateTime_in_leap_year(const temporal_rs::capi::PlainDateTime* self); + + void temporal_rs_PlainDateTime_era(const temporal_rs::capi::PlainDateTime* self, temporal_rs::diplomat::capi::DiplomatWrite* write); + + typedef struct temporal_rs_PlainDateTime_era_year_result {union {int32_t ok; }; bool is_ok;} temporal_rs_PlainDateTime_era_year_result; + temporal_rs_PlainDateTime_era_year_result temporal_rs_PlainDateTime_era_year(const temporal_rs::capi::PlainDateTime* self); + + typedef struct temporal_rs_PlainDateTime_add_result {union {temporal_rs::capi::PlainDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_add_result; + temporal_rs_PlainDateTime_add_result temporal_rs_PlainDateTime_add(const temporal_rs::capi::PlainDateTime* self, const temporal_rs::capi::Duration* duration, temporal_rs::capi::ArithmeticOverflow_option overflow); + + typedef struct temporal_rs_PlainDateTime_subtract_result {union {temporal_rs::capi::PlainDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_subtract_result; + temporal_rs_PlainDateTime_subtract_result temporal_rs_PlainDateTime_subtract(const temporal_rs::capi::PlainDateTime* self, const temporal_rs::capi::Duration* duration, temporal_rs::capi::ArithmeticOverflow_option overflow); + + typedef struct temporal_rs_PlainDateTime_until_result {union {temporal_rs::capi::Duration* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_until_result; + temporal_rs_PlainDateTime_until_result temporal_rs_PlainDateTime_until(const temporal_rs::capi::PlainDateTime* self, const temporal_rs::capi::PlainDateTime* other, temporal_rs::capi::DifferenceSettings settings); + + typedef struct temporal_rs_PlainDateTime_since_result {union {temporal_rs::capi::Duration* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_since_result; + temporal_rs_PlainDateTime_since_result temporal_rs_PlainDateTime_since(const temporal_rs::capi::PlainDateTime* self, const temporal_rs::capi::PlainDateTime* other, temporal_rs::capi::DifferenceSettings settings); + + bool temporal_rs_PlainDateTime_equals(const temporal_rs::capi::PlainDateTime* self, const temporal_rs::capi::PlainDateTime* other); + + int8_t temporal_rs_PlainDateTime_compare(const temporal_rs::capi::PlainDateTime* one, const temporal_rs::capi::PlainDateTime* two); + + typedef struct temporal_rs_PlainDateTime_round_result {union {temporal_rs::capi::PlainDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_round_result; + temporal_rs_PlainDateTime_round_result temporal_rs_PlainDateTime_round(const temporal_rs::capi::PlainDateTime* self, temporal_rs::capi::RoundingOptions options); + + temporal_rs::capi::PlainDate* temporal_rs_PlainDateTime_to_plain_date(const temporal_rs::capi::PlainDateTime* self); + + temporal_rs::capi::PlainTime* temporal_rs_PlainDateTime_to_plain_time(const temporal_rs::capi::PlainDateTime* self); + + typedef struct temporal_rs_PlainDateTime_to_zoned_date_time_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_to_zoned_date_time_result; + temporal_rs_PlainDateTime_to_zoned_date_time_result temporal_rs_PlainDateTime_to_zoned_date_time(const temporal_rs::capi::PlainDateTime* self, temporal_rs::capi::TimeZone time_zone, temporal_rs::capi::Disambiguation disambiguation); + + typedef struct temporal_rs_PlainDateTime_to_zoned_date_time_with_provider_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_to_zoned_date_time_with_provider_result; + temporal_rs_PlainDateTime_to_zoned_date_time_with_provider_result temporal_rs_PlainDateTime_to_zoned_date_time_with_provider(const temporal_rs::capi::PlainDateTime* self, temporal_rs::capi::TimeZone time_zone, temporal_rs::capi::Disambiguation disambiguation, const temporal_rs::capi::Provider* p); + + typedef struct temporal_rs_PlainDateTime_to_ixdtf_string_result {union { temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainDateTime_to_ixdtf_string_result; + temporal_rs_PlainDateTime_to_ixdtf_string_result temporal_rs_PlainDateTime_to_ixdtf_string(const temporal_rs::capi::PlainDateTime* self, temporal_rs::capi::ToStringRoundingOptions options, temporal_rs::capi::DisplayCalendar display_calendar, temporal_rs::diplomat::capi::DiplomatWrite* write); + + temporal_rs::capi::PlainDateTime* temporal_rs_PlainDateTime_clone(const temporal_rs::capi::PlainDateTime* self); + + void temporal_rs_PlainDateTime_destroy(PlainDateTime* self); + + } // extern "C" +} // namespace capi +} // namespace + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDateTime::try_new_constrain(int32_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint16_t millisecond, uint16_t microsecond, uint16_t nanosecond, temporal_rs::AnyCalendarKind calendar) { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_try_new_constrain(year, + month, + day, + hour, + minute, + second, + millisecond, + microsecond, + nanosecond, + calendar.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDateTime::try_new(int32_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint16_t millisecond, uint16_t microsecond, uint16_t nanosecond, temporal_rs::AnyCalendarKind calendar) { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_try_new(year, + month, + day, + hour, + minute, + second, + millisecond, + microsecond, + nanosecond, + calendar.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDateTime::from_partial(temporal_rs::PartialDateTime partial, std::optional overflow) { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_from_partial(partial.AsFFI(), + overflow.has_value() ? (temporal_rs::capi::ArithmeticOverflow_option{ { overflow.value().AsFFI() }, true }) : (temporal_rs::capi::ArithmeticOverflow_option{ {}, false })); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDateTime::from_parsed(const temporal_rs::ParsedDateTime& parsed) { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_from_parsed(parsed.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDateTime::from_epoch_milliseconds(int64_t ms, temporal_rs::TimeZone tz) { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_from_epoch_milliseconds(ms, + tz.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDateTime::from_epoch_milliseconds_with_provider(int64_t ms, temporal_rs::TimeZone tz, const temporal_rs::Provider& p) { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_from_epoch_milliseconds_with_provider(ms, + tz.AsFFI(), + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDateTime::from_epoch_nanoseconds(temporal_rs::I128Nanoseconds ns, temporal_rs::TimeZone tz) { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_from_epoch_nanoseconds(ns.AsFFI(), + tz.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDateTime::from_epoch_nanoseconds_with_provider(temporal_rs::I128Nanoseconds ns, temporal_rs::TimeZone tz, const temporal_rs::Provider& p) { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_from_epoch_nanoseconds_with_provider(ns.AsFFI(), + tz.AsFFI(), + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDateTime::with(temporal_rs::PartialDateTime partial, std::optional overflow) const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_with(this->AsFFI(), + partial.AsFFI(), + overflow.has_value() ? (temporal_rs::capi::ArithmeticOverflow_option{ { overflow.value().AsFFI() }, true }) : (temporal_rs::capi::ArithmeticOverflow_option{ {}, false })); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDateTime::with_time(const temporal_rs::PlainTime* time) const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_with_time(this->AsFFI(), + time ? time->AsFFI() : nullptr); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline std::unique_ptr temporal_rs::PlainDateTime::with_calendar(temporal_rs::AnyCalendarKind calendar) const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_with_calendar(this->AsFFI(), + calendar.AsFFI()); + return std::unique_ptr(temporal_rs::PlainDateTime::FromFFI(result)); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDateTime::from_utf8(std::string_view s) { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_from_utf8({s.data(), s.size()}); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDateTime::from_utf16(std::u16string_view s) { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_from_utf16({s.data(), s.size()}); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline uint8_t temporal_rs::PlainDateTime::hour() const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_hour(this->AsFFI()); + return result; +} + +inline uint8_t temporal_rs::PlainDateTime::minute() const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_minute(this->AsFFI()); + return result; +} + +inline uint8_t temporal_rs::PlainDateTime::second() const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_second(this->AsFFI()); + return result; +} + +inline uint16_t temporal_rs::PlainDateTime::millisecond() const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_millisecond(this->AsFFI()); + return result; +} + +inline uint16_t temporal_rs::PlainDateTime::microsecond() const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_microsecond(this->AsFFI()); + return result; +} + +inline uint16_t temporal_rs::PlainDateTime::nanosecond() const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_nanosecond(this->AsFFI()); + return result; +} + +inline const temporal_rs::Calendar& temporal_rs::PlainDateTime::calendar() const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_calendar(this->AsFFI()); + return *temporal_rs::Calendar::FromFFI(result); +} + +inline int32_t temporal_rs::PlainDateTime::year() const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_year(this->AsFFI()); + return result; +} + +inline uint8_t temporal_rs::PlainDateTime::month() const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_month(this->AsFFI()); + return result; +} + +inline std::string temporal_rs::PlainDateTime::month_code() const { + std::string output; + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteFromString(output); + temporal_rs::capi::temporal_rs_PlainDateTime_month_code(this->AsFFI(), + &write); + return output; +} +template +inline void temporal_rs::PlainDateTime::month_code_write(W& writeable) const { + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteTrait::Construct(writeable); + temporal_rs::capi::temporal_rs_PlainDateTime_month_code(this->AsFFI(), + &write); +} + +inline uint8_t temporal_rs::PlainDateTime::day() const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_day(this->AsFFI()); + return result; +} + +inline uint16_t temporal_rs::PlainDateTime::day_of_week() const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_day_of_week(this->AsFFI()); + return result; +} + +inline uint16_t temporal_rs::PlainDateTime::day_of_year() const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_day_of_year(this->AsFFI()); + return result; +} + +inline std::optional temporal_rs::PlainDateTime::week_of_year() const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_week_of_year(this->AsFFI()); + return result.is_ok ? std::optional(result.ok) : std::nullopt; +} + +inline std::optional temporal_rs::PlainDateTime::year_of_week() const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_year_of_week(this->AsFFI()); + return result.is_ok ? std::optional(result.ok) : std::nullopt; +} + +inline uint16_t temporal_rs::PlainDateTime::days_in_week() const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_days_in_week(this->AsFFI()); + return result; +} + +inline uint16_t temporal_rs::PlainDateTime::days_in_month() const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_days_in_month(this->AsFFI()); + return result; +} + +inline uint16_t temporal_rs::PlainDateTime::days_in_year() const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_days_in_year(this->AsFFI()); + return result; +} + +inline uint16_t temporal_rs::PlainDateTime::months_in_year() const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_months_in_year(this->AsFFI()); + return result; +} + +inline bool temporal_rs::PlainDateTime::in_leap_year() const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_in_leap_year(this->AsFFI()); + return result; +} + +inline std::string temporal_rs::PlainDateTime::era() const { + std::string output; + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteFromString(output); + temporal_rs::capi::temporal_rs_PlainDateTime_era(this->AsFFI(), + &write); + return output; +} +template +inline void temporal_rs::PlainDateTime::era_write(W& writeable) const { + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteTrait::Construct(writeable); + temporal_rs::capi::temporal_rs_PlainDateTime_era(this->AsFFI(), + &write); +} + +inline std::optional temporal_rs::PlainDateTime::era_year() const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_era_year(this->AsFFI()); + return result.is_ok ? std::optional(result.ok) : std::nullopt; +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDateTime::add(const temporal_rs::Duration& duration, std::optional overflow) const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_add(this->AsFFI(), + duration.AsFFI(), + overflow.has_value() ? (temporal_rs::capi::ArithmeticOverflow_option{ { overflow.value().AsFFI() }, true }) : (temporal_rs::capi::ArithmeticOverflow_option{ {}, false })); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDateTime::subtract(const temporal_rs::Duration& duration, std::optional overflow) const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_subtract(this->AsFFI(), + duration.AsFFI(), + overflow.has_value() ? (temporal_rs::capi::ArithmeticOverflow_option{ { overflow.value().AsFFI() }, true }) : (temporal_rs::capi::ArithmeticOverflow_option{ {}, false })); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDateTime::until(const temporal_rs::PlainDateTime& other, temporal_rs::DifferenceSettings settings) const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_until(this->AsFFI(), + other.AsFFI(), + settings.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::Duration::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDateTime::since(const temporal_rs::PlainDateTime& other, temporal_rs::DifferenceSettings settings) const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_since(this->AsFFI(), + other.AsFFI(), + settings.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::Duration::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline bool temporal_rs::PlainDateTime::equals(const temporal_rs::PlainDateTime& other) const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_equals(this->AsFFI(), + other.AsFFI()); + return result; +} + +inline int8_t temporal_rs::PlainDateTime::compare(const temporal_rs::PlainDateTime& one, const temporal_rs::PlainDateTime& two) { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_compare(one.AsFFI(), + two.AsFFI()); + return result; +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDateTime::round(temporal_rs::RoundingOptions options) const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_round(this->AsFFI(), + options.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline std::unique_ptr temporal_rs::PlainDateTime::to_plain_date() const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_to_plain_date(this->AsFFI()); + return std::unique_ptr(temporal_rs::PlainDate::FromFFI(result)); +} + +inline std::unique_ptr temporal_rs::PlainDateTime::to_plain_time() const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_to_plain_time(this->AsFFI()); + return std::unique_ptr(temporal_rs::PlainTime::FromFFI(result)); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDateTime::to_zoned_date_time(temporal_rs::TimeZone time_zone, temporal_rs::Disambiguation disambiguation) const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_to_zoned_date_time(this->AsFFI(), + time_zone.AsFFI(), + disambiguation.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainDateTime::to_zoned_date_time_with_provider(temporal_rs::TimeZone time_zone, temporal_rs::Disambiguation disambiguation, const temporal_rs::Provider& p) const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_to_zoned_date_time_with_provider(this->AsFFI(), + time_zone.AsFFI(), + disambiguation.AsFFI(), + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result temporal_rs::PlainDateTime::to_ixdtf_string(temporal_rs::ToStringRoundingOptions options, temporal_rs::DisplayCalendar display_calendar) const { + std::string output; + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteFromString(output); + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_to_ixdtf_string(this->AsFFI(), + options.AsFFI(), + display_calendar.AsFFI(), + &write); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok(std::move(output))) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} +template +inline temporal_rs::diplomat::result temporal_rs::PlainDateTime::to_ixdtf_string_write(temporal_rs::ToStringRoundingOptions options, temporal_rs::DisplayCalendar display_calendar, W& writeable) const { + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteTrait::Construct(writeable); + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_to_ixdtf_string(this->AsFFI(), + options.AsFFI(), + display_calendar.AsFFI(), + &write); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok()) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline std::unique_ptr temporal_rs::PlainDateTime::clone() const { + auto result = temporal_rs::capi::temporal_rs_PlainDateTime_clone(this->AsFFI()); + return std::unique_ptr(temporal_rs::PlainDateTime::FromFFI(result)); +} + +inline const temporal_rs::capi::PlainDateTime* temporal_rs::PlainDateTime::AsFFI() const { + return reinterpret_cast(this); +} + +inline temporal_rs::capi::PlainDateTime* temporal_rs::PlainDateTime::AsFFI() { + return reinterpret_cast(this); +} + +inline const temporal_rs::PlainDateTime* temporal_rs::PlainDateTime::FromFFI(const temporal_rs::capi::PlainDateTime* ptr) { + return reinterpret_cast(ptr); +} + +inline temporal_rs::PlainDateTime* temporal_rs::PlainDateTime::FromFFI(temporal_rs::capi::PlainDateTime* ptr) { + return reinterpret_cast(ptr); +} + +inline void temporal_rs::PlainDateTime::operator delete(void* ptr) { + temporal_rs::capi::temporal_rs_PlainDateTime_destroy(reinterpret_cast(ptr)); +} + + +#endif // TEMPORAL_RS_PlainDateTime_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainMonthDay.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainMonthDay.d.hpp new file mode 100644 index 00000000000000..5638252ac2fd00 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainMonthDay.d.hpp @@ -0,0 +1,93 @@ +#ifndef TEMPORAL_RS_PlainMonthDay_D_HPP +#define TEMPORAL_RS_PlainMonthDay_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" +namespace temporal_rs { +namespace capi { struct Calendar; } +class Calendar; +namespace capi { struct ParsedDate; } +class ParsedDate; +namespace capi { struct PlainDate; } +class PlainDate; +namespace capi { struct PlainMonthDay; } +class PlainMonthDay; +namespace capi { struct Provider; } +class Provider; +struct PartialDate; +struct TemporalError; +struct TimeZone; +class AnyCalendarKind; +class ArithmeticOverflow; +class DisplayCalendar; +} // namespace temporal_rs + + + +namespace temporal_rs { +namespace capi { + struct PlainMonthDay; +} // namespace capi +} // namespace + +namespace temporal_rs { +class PlainMonthDay { +public: + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> try_new_with_overflow(uint8_t month, uint8_t day, temporal_rs::AnyCalendarKind calendar, temporal_rs::ArithmeticOverflow overflow, std::optional ref_year); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_partial(temporal_rs::PartialDate partial, std::optional overflow); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_parsed(const temporal_rs::ParsedDate& parsed); + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> with(temporal_rs::PartialDate partial, std::optional overflow) const; + + inline bool equals(const temporal_rs::PlainMonthDay& other) const; + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_utf8(std::string_view s); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_utf16(std::u16string_view s); + + inline uint8_t day() const; + + inline const temporal_rs::Calendar& calendar() const; + + inline std::string month_code() const; + template + inline void month_code_write(W& writeable_output) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> to_plain_date(std::optional year) const; + + inline temporal_rs::diplomat::result epoch_ms_for(temporal_rs::TimeZone time_zone) const; + + inline temporal_rs::diplomat::result epoch_ms_for_with_provider(temporal_rs::TimeZone time_zone, const temporal_rs::Provider& p) const; + + inline std::string to_ixdtf_string(temporal_rs::DisplayCalendar display_calendar) const; + template + inline void to_ixdtf_string_write(temporal_rs::DisplayCalendar display_calendar, W& writeable_output) const; + + inline std::unique_ptr clone() const; + + inline const temporal_rs::capi::PlainMonthDay* AsFFI() const; + inline temporal_rs::capi::PlainMonthDay* AsFFI(); + inline static const temporal_rs::PlainMonthDay* FromFFI(const temporal_rs::capi::PlainMonthDay* ptr); + inline static temporal_rs::PlainMonthDay* FromFFI(temporal_rs::capi::PlainMonthDay* ptr); + inline static void operator delete(void* ptr); +private: + PlainMonthDay() = delete; + PlainMonthDay(const temporal_rs::PlainMonthDay&) = delete; + PlainMonthDay(temporal_rs::PlainMonthDay&&) noexcept = delete; + PlainMonthDay operator=(const temporal_rs::PlainMonthDay&) = delete; + PlainMonthDay operator=(temporal_rs::PlainMonthDay&&) noexcept = delete; + static void operator delete[](void*, size_t) = delete; +}; + +} // namespace +#endif // TEMPORAL_RS_PlainMonthDay_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainMonthDay.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainMonthDay.hpp new file mode 100644 index 00000000000000..01e409f4ca5b1a --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainMonthDay.hpp @@ -0,0 +1,204 @@ +#ifndef TEMPORAL_RS_PlainMonthDay_HPP +#define TEMPORAL_RS_PlainMonthDay_HPP + +#include "PlainMonthDay.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "AnyCalendarKind.hpp" +#include "ArithmeticOverflow.hpp" +#include "Calendar.hpp" +#include "DisplayCalendar.hpp" +#include "ParsedDate.hpp" +#include "PartialDate.hpp" +#include "PlainDate.hpp" +#include "Provider.hpp" +#include "TemporalError.hpp" +#include "TimeZone.hpp" +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + typedef struct temporal_rs_PlainMonthDay_try_new_with_overflow_result {union {temporal_rs::capi::PlainMonthDay* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainMonthDay_try_new_with_overflow_result; + temporal_rs_PlainMonthDay_try_new_with_overflow_result temporal_rs_PlainMonthDay_try_new_with_overflow(uint8_t month, uint8_t day, temporal_rs::capi::AnyCalendarKind calendar, temporal_rs::capi::ArithmeticOverflow overflow, temporal_rs::diplomat::capi::OptionI32 ref_year); + + typedef struct temporal_rs_PlainMonthDay_from_partial_result {union {temporal_rs::capi::PlainMonthDay* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainMonthDay_from_partial_result; + temporal_rs_PlainMonthDay_from_partial_result temporal_rs_PlainMonthDay_from_partial(temporal_rs::capi::PartialDate partial, temporal_rs::capi::ArithmeticOverflow_option overflow); + + typedef struct temporal_rs_PlainMonthDay_from_parsed_result {union {temporal_rs::capi::PlainMonthDay* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainMonthDay_from_parsed_result; + temporal_rs_PlainMonthDay_from_parsed_result temporal_rs_PlainMonthDay_from_parsed(const temporal_rs::capi::ParsedDate* parsed); + + typedef struct temporal_rs_PlainMonthDay_with_result {union {temporal_rs::capi::PlainMonthDay* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainMonthDay_with_result; + temporal_rs_PlainMonthDay_with_result temporal_rs_PlainMonthDay_with(const temporal_rs::capi::PlainMonthDay* self, temporal_rs::capi::PartialDate partial, temporal_rs::capi::ArithmeticOverflow_option overflow); + + bool temporal_rs_PlainMonthDay_equals(const temporal_rs::capi::PlainMonthDay* self, const temporal_rs::capi::PlainMonthDay* other); + + typedef struct temporal_rs_PlainMonthDay_from_utf8_result {union {temporal_rs::capi::PlainMonthDay* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainMonthDay_from_utf8_result; + temporal_rs_PlainMonthDay_from_utf8_result temporal_rs_PlainMonthDay_from_utf8(temporal_rs::diplomat::capi::DiplomatStringView s); + + typedef struct temporal_rs_PlainMonthDay_from_utf16_result {union {temporal_rs::capi::PlainMonthDay* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainMonthDay_from_utf16_result; + temporal_rs_PlainMonthDay_from_utf16_result temporal_rs_PlainMonthDay_from_utf16(temporal_rs::diplomat::capi::DiplomatString16View s); + + uint8_t temporal_rs_PlainMonthDay_day(const temporal_rs::capi::PlainMonthDay* self); + + const temporal_rs::capi::Calendar* temporal_rs_PlainMonthDay_calendar(const temporal_rs::capi::PlainMonthDay* self); + + void temporal_rs_PlainMonthDay_month_code(const temporal_rs::capi::PlainMonthDay* self, temporal_rs::diplomat::capi::DiplomatWrite* write); + + typedef struct temporal_rs_PlainMonthDay_to_plain_date_result {union {temporal_rs::capi::PlainDate* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainMonthDay_to_plain_date_result; + temporal_rs_PlainMonthDay_to_plain_date_result temporal_rs_PlainMonthDay_to_plain_date(const temporal_rs::capi::PlainMonthDay* self, temporal_rs::capi::PartialDate_option year); + + typedef struct temporal_rs_PlainMonthDay_epoch_ms_for_result {union {int64_t ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainMonthDay_epoch_ms_for_result; + temporal_rs_PlainMonthDay_epoch_ms_for_result temporal_rs_PlainMonthDay_epoch_ms_for(const temporal_rs::capi::PlainMonthDay* self, temporal_rs::capi::TimeZone time_zone); + + typedef struct temporal_rs_PlainMonthDay_epoch_ms_for_with_provider_result {union {int64_t ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainMonthDay_epoch_ms_for_with_provider_result; + temporal_rs_PlainMonthDay_epoch_ms_for_with_provider_result temporal_rs_PlainMonthDay_epoch_ms_for_with_provider(const temporal_rs::capi::PlainMonthDay* self, temporal_rs::capi::TimeZone time_zone, const temporal_rs::capi::Provider* p); + + void temporal_rs_PlainMonthDay_to_ixdtf_string(const temporal_rs::capi::PlainMonthDay* self, temporal_rs::capi::DisplayCalendar display_calendar, temporal_rs::diplomat::capi::DiplomatWrite* write); + + temporal_rs::capi::PlainMonthDay* temporal_rs_PlainMonthDay_clone(const temporal_rs::capi::PlainMonthDay* self); + + void temporal_rs_PlainMonthDay_destroy(PlainMonthDay* self); + + } // extern "C" +} // namespace capi +} // namespace + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainMonthDay::try_new_with_overflow(uint8_t month, uint8_t day, temporal_rs::AnyCalendarKind calendar, temporal_rs::ArithmeticOverflow overflow, std::optional ref_year) { + auto result = temporal_rs::capi::temporal_rs_PlainMonthDay_try_new_with_overflow(month, + day, + calendar.AsFFI(), + overflow.AsFFI(), + ref_year.has_value() ? (temporal_rs::diplomat::capi::OptionI32{ { ref_year.value() }, true }) : (temporal_rs::diplomat::capi::OptionI32{ {}, false })); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainMonthDay::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainMonthDay::from_partial(temporal_rs::PartialDate partial, std::optional overflow) { + auto result = temporal_rs::capi::temporal_rs_PlainMonthDay_from_partial(partial.AsFFI(), + overflow.has_value() ? (temporal_rs::capi::ArithmeticOverflow_option{ { overflow.value().AsFFI() }, true }) : (temporal_rs::capi::ArithmeticOverflow_option{ {}, false })); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainMonthDay::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainMonthDay::from_parsed(const temporal_rs::ParsedDate& parsed) { + auto result = temporal_rs::capi::temporal_rs_PlainMonthDay_from_parsed(parsed.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainMonthDay::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainMonthDay::with(temporal_rs::PartialDate partial, std::optional overflow) const { + auto result = temporal_rs::capi::temporal_rs_PlainMonthDay_with(this->AsFFI(), + partial.AsFFI(), + overflow.has_value() ? (temporal_rs::capi::ArithmeticOverflow_option{ { overflow.value().AsFFI() }, true }) : (temporal_rs::capi::ArithmeticOverflow_option{ {}, false })); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainMonthDay::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline bool temporal_rs::PlainMonthDay::equals(const temporal_rs::PlainMonthDay& other) const { + auto result = temporal_rs::capi::temporal_rs_PlainMonthDay_equals(this->AsFFI(), + other.AsFFI()); + return result; +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainMonthDay::from_utf8(std::string_view s) { + auto result = temporal_rs::capi::temporal_rs_PlainMonthDay_from_utf8({s.data(), s.size()}); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainMonthDay::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainMonthDay::from_utf16(std::u16string_view s) { + auto result = temporal_rs::capi::temporal_rs_PlainMonthDay_from_utf16({s.data(), s.size()}); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainMonthDay::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline uint8_t temporal_rs::PlainMonthDay::day() const { + auto result = temporal_rs::capi::temporal_rs_PlainMonthDay_day(this->AsFFI()); + return result; +} + +inline const temporal_rs::Calendar& temporal_rs::PlainMonthDay::calendar() const { + auto result = temporal_rs::capi::temporal_rs_PlainMonthDay_calendar(this->AsFFI()); + return *temporal_rs::Calendar::FromFFI(result); +} + +inline std::string temporal_rs::PlainMonthDay::month_code() const { + std::string output; + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteFromString(output); + temporal_rs::capi::temporal_rs_PlainMonthDay_month_code(this->AsFFI(), + &write); + return output; +} +template +inline void temporal_rs::PlainMonthDay::month_code_write(W& writeable) const { + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteTrait::Construct(writeable); + temporal_rs::capi::temporal_rs_PlainMonthDay_month_code(this->AsFFI(), + &write); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainMonthDay::to_plain_date(std::optional year) const { + auto result = temporal_rs::capi::temporal_rs_PlainMonthDay_to_plain_date(this->AsFFI(), + year.has_value() ? (temporal_rs::capi::PartialDate_option{ { year.value().AsFFI() }, true }) : (temporal_rs::capi::PartialDate_option{ {}, false })); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainDate::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result temporal_rs::PlainMonthDay::epoch_ms_for(temporal_rs::TimeZone time_zone) const { + auto result = temporal_rs::capi::temporal_rs_PlainMonthDay_epoch_ms_for(this->AsFFI(), + time_zone.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok(result.ok)) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result temporal_rs::PlainMonthDay::epoch_ms_for_with_provider(temporal_rs::TimeZone time_zone, const temporal_rs::Provider& p) const { + auto result = temporal_rs::capi::temporal_rs_PlainMonthDay_epoch_ms_for_with_provider(this->AsFFI(), + time_zone.AsFFI(), + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok(result.ok)) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline std::string temporal_rs::PlainMonthDay::to_ixdtf_string(temporal_rs::DisplayCalendar display_calendar) const { + std::string output; + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteFromString(output); + temporal_rs::capi::temporal_rs_PlainMonthDay_to_ixdtf_string(this->AsFFI(), + display_calendar.AsFFI(), + &write); + return output; +} +template +inline void temporal_rs::PlainMonthDay::to_ixdtf_string_write(temporal_rs::DisplayCalendar display_calendar, W& writeable) const { + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteTrait::Construct(writeable); + temporal_rs::capi::temporal_rs_PlainMonthDay_to_ixdtf_string(this->AsFFI(), + display_calendar.AsFFI(), + &write); +} + +inline std::unique_ptr temporal_rs::PlainMonthDay::clone() const { + auto result = temporal_rs::capi::temporal_rs_PlainMonthDay_clone(this->AsFFI()); + return std::unique_ptr(temporal_rs::PlainMonthDay::FromFFI(result)); +} + +inline const temporal_rs::capi::PlainMonthDay* temporal_rs::PlainMonthDay::AsFFI() const { + return reinterpret_cast(this); +} + +inline temporal_rs::capi::PlainMonthDay* temporal_rs::PlainMonthDay::AsFFI() { + return reinterpret_cast(this); +} + +inline const temporal_rs::PlainMonthDay* temporal_rs::PlainMonthDay::FromFFI(const temporal_rs::capi::PlainMonthDay* ptr) { + return reinterpret_cast(ptr); +} + +inline temporal_rs::PlainMonthDay* temporal_rs::PlainMonthDay::FromFFI(temporal_rs::capi::PlainMonthDay* ptr) { + return reinterpret_cast(ptr); +} + +inline void temporal_rs::PlainMonthDay::operator delete(void* ptr) { + temporal_rs::capi::temporal_rs_PlainMonthDay_destroy(reinterpret_cast(ptr)); +} + + +#endif // TEMPORAL_RS_PlainMonthDay_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainTime.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainTime.d.hpp new file mode 100644 index 00000000000000..b4f01054eb44dc --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainTime.d.hpp @@ -0,0 +1,109 @@ +#ifndef TEMPORAL_RS_PlainTime_D_HPP +#define TEMPORAL_RS_PlainTime_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" +namespace temporal_rs { +namespace capi { struct Duration; } +class Duration; +namespace capi { struct PlainTime; } +class PlainTime; +namespace capi { struct Provider; } +class Provider; +struct DifferenceSettings; +struct I128Nanoseconds; +struct PartialTime; +struct RoundingOptions; +struct TemporalError; +struct TimeZone; +struct ToStringRoundingOptions; +class ArithmeticOverflow; +} // namespace temporal_rs + + + +namespace temporal_rs { +namespace capi { + struct PlainTime; +} // namespace capi +} // namespace + +namespace temporal_rs { +class PlainTime { +public: + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> try_new_constrain(uint8_t hour, uint8_t minute, uint8_t second, uint16_t millisecond, uint16_t microsecond, uint16_t nanosecond); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> try_new(uint8_t hour, uint8_t minute, uint8_t second, uint16_t millisecond, uint16_t microsecond, uint16_t nanosecond); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_partial(temporal_rs::PartialTime partial, std::optional overflow); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_epoch_milliseconds(int64_t ms, temporal_rs::TimeZone tz); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_epoch_milliseconds_with_provider(int64_t ms, temporal_rs::TimeZone tz, const temporal_rs::Provider& p); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_epoch_nanoseconds(temporal_rs::I128Nanoseconds ns, temporal_rs::TimeZone tz); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_epoch_nanoseconds_with_provider(temporal_rs::I128Nanoseconds ns, temporal_rs::TimeZone tz, const temporal_rs::Provider& p); + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> with(temporal_rs::PartialTime partial, std::optional overflow) const; + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_utf8(std::string_view s); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_utf16(std::u16string_view s); + + inline uint8_t hour() const; + + inline uint8_t minute() const; + + inline uint8_t second() const; + + inline uint16_t millisecond() const; + + inline uint16_t microsecond() const; + + inline uint16_t nanosecond() const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> add(const temporal_rs::Duration& duration) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> subtract(const temporal_rs::Duration& duration) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> until(const temporal_rs::PlainTime& other, temporal_rs::DifferenceSettings settings) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> since(const temporal_rs::PlainTime& other, temporal_rs::DifferenceSettings settings) const; + + inline bool equals(const temporal_rs::PlainTime& other) const; + + inline static int8_t compare(const temporal_rs::PlainTime& one, const temporal_rs::PlainTime& two); + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> round(temporal_rs::RoundingOptions options) const; + + inline temporal_rs::diplomat::result to_ixdtf_string(temporal_rs::ToStringRoundingOptions options) const; + template + inline temporal_rs::diplomat::result to_ixdtf_string_write(temporal_rs::ToStringRoundingOptions options, W& writeable_output) const; + + inline std::unique_ptr clone() const; + + inline const temporal_rs::capi::PlainTime* AsFFI() const; + inline temporal_rs::capi::PlainTime* AsFFI(); + inline static const temporal_rs::PlainTime* FromFFI(const temporal_rs::capi::PlainTime* ptr); + inline static temporal_rs::PlainTime* FromFFI(temporal_rs::capi::PlainTime* ptr); + inline static void operator delete(void* ptr); +private: + PlainTime() = delete; + PlainTime(const temporal_rs::PlainTime&) = delete; + PlainTime(temporal_rs::PlainTime&&) noexcept = delete; + PlainTime operator=(const temporal_rs::PlainTime&) = delete; + PlainTime operator=(temporal_rs::PlainTime&&) noexcept = delete; + static void operator delete[](void*, size_t) = delete; +}; + +} // namespace +#endif // TEMPORAL_RS_PlainTime_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainTime.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainTime.hpp new file mode 100644 index 00000000000000..b15878bcbbc623 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainTime.hpp @@ -0,0 +1,289 @@ +#ifndef TEMPORAL_RS_PlainTime_HPP +#define TEMPORAL_RS_PlainTime_HPP + +#include "PlainTime.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "ArithmeticOverflow.hpp" +#include "DifferenceSettings.hpp" +#include "Duration.hpp" +#include "I128Nanoseconds.hpp" +#include "PartialTime.hpp" +#include "Provider.hpp" +#include "RoundingOptions.hpp" +#include "TemporalError.hpp" +#include "TimeZone.hpp" +#include "ToStringRoundingOptions.hpp" +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + typedef struct temporal_rs_PlainTime_try_new_constrain_result {union {temporal_rs::capi::PlainTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainTime_try_new_constrain_result; + temporal_rs_PlainTime_try_new_constrain_result temporal_rs_PlainTime_try_new_constrain(uint8_t hour, uint8_t minute, uint8_t second, uint16_t millisecond, uint16_t microsecond, uint16_t nanosecond); + + typedef struct temporal_rs_PlainTime_try_new_result {union {temporal_rs::capi::PlainTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainTime_try_new_result; + temporal_rs_PlainTime_try_new_result temporal_rs_PlainTime_try_new(uint8_t hour, uint8_t minute, uint8_t second, uint16_t millisecond, uint16_t microsecond, uint16_t nanosecond); + + typedef struct temporal_rs_PlainTime_from_partial_result {union {temporal_rs::capi::PlainTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainTime_from_partial_result; + temporal_rs_PlainTime_from_partial_result temporal_rs_PlainTime_from_partial(temporal_rs::capi::PartialTime partial, temporal_rs::capi::ArithmeticOverflow_option overflow); + + typedef struct temporal_rs_PlainTime_from_epoch_milliseconds_result {union {temporal_rs::capi::PlainTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainTime_from_epoch_milliseconds_result; + temporal_rs_PlainTime_from_epoch_milliseconds_result temporal_rs_PlainTime_from_epoch_milliseconds(int64_t ms, temporal_rs::capi::TimeZone tz); + + typedef struct temporal_rs_PlainTime_from_epoch_milliseconds_with_provider_result {union {temporal_rs::capi::PlainTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainTime_from_epoch_milliseconds_with_provider_result; + temporal_rs_PlainTime_from_epoch_milliseconds_with_provider_result temporal_rs_PlainTime_from_epoch_milliseconds_with_provider(int64_t ms, temporal_rs::capi::TimeZone tz, const temporal_rs::capi::Provider* p); + + typedef struct temporal_rs_PlainTime_from_epoch_nanoseconds_result {union {temporal_rs::capi::PlainTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainTime_from_epoch_nanoseconds_result; + temporal_rs_PlainTime_from_epoch_nanoseconds_result temporal_rs_PlainTime_from_epoch_nanoseconds(temporal_rs::capi::I128Nanoseconds ns, temporal_rs::capi::TimeZone tz); + + typedef struct temporal_rs_PlainTime_from_epoch_nanoseconds_with_provider_result {union {temporal_rs::capi::PlainTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainTime_from_epoch_nanoseconds_with_provider_result; + temporal_rs_PlainTime_from_epoch_nanoseconds_with_provider_result temporal_rs_PlainTime_from_epoch_nanoseconds_with_provider(temporal_rs::capi::I128Nanoseconds ns, temporal_rs::capi::TimeZone tz, const temporal_rs::capi::Provider* p); + + typedef struct temporal_rs_PlainTime_with_result {union {temporal_rs::capi::PlainTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainTime_with_result; + temporal_rs_PlainTime_with_result temporal_rs_PlainTime_with(const temporal_rs::capi::PlainTime* self, temporal_rs::capi::PartialTime partial, temporal_rs::capi::ArithmeticOverflow_option overflow); + + typedef struct temporal_rs_PlainTime_from_utf8_result {union {temporal_rs::capi::PlainTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainTime_from_utf8_result; + temporal_rs_PlainTime_from_utf8_result temporal_rs_PlainTime_from_utf8(temporal_rs::diplomat::capi::DiplomatStringView s); + + typedef struct temporal_rs_PlainTime_from_utf16_result {union {temporal_rs::capi::PlainTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainTime_from_utf16_result; + temporal_rs_PlainTime_from_utf16_result temporal_rs_PlainTime_from_utf16(temporal_rs::diplomat::capi::DiplomatString16View s); + + uint8_t temporal_rs_PlainTime_hour(const temporal_rs::capi::PlainTime* self); + + uint8_t temporal_rs_PlainTime_minute(const temporal_rs::capi::PlainTime* self); + + uint8_t temporal_rs_PlainTime_second(const temporal_rs::capi::PlainTime* self); + + uint16_t temporal_rs_PlainTime_millisecond(const temporal_rs::capi::PlainTime* self); + + uint16_t temporal_rs_PlainTime_microsecond(const temporal_rs::capi::PlainTime* self); + + uint16_t temporal_rs_PlainTime_nanosecond(const temporal_rs::capi::PlainTime* self); + + typedef struct temporal_rs_PlainTime_add_result {union {temporal_rs::capi::PlainTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainTime_add_result; + temporal_rs_PlainTime_add_result temporal_rs_PlainTime_add(const temporal_rs::capi::PlainTime* self, const temporal_rs::capi::Duration* duration); + + typedef struct temporal_rs_PlainTime_subtract_result {union {temporal_rs::capi::PlainTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainTime_subtract_result; + temporal_rs_PlainTime_subtract_result temporal_rs_PlainTime_subtract(const temporal_rs::capi::PlainTime* self, const temporal_rs::capi::Duration* duration); + + typedef struct temporal_rs_PlainTime_until_result {union {temporal_rs::capi::Duration* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainTime_until_result; + temporal_rs_PlainTime_until_result temporal_rs_PlainTime_until(const temporal_rs::capi::PlainTime* self, const temporal_rs::capi::PlainTime* other, temporal_rs::capi::DifferenceSettings settings); + + typedef struct temporal_rs_PlainTime_since_result {union {temporal_rs::capi::Duration* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainTime_since_result; + temporal_rs_PlainTime_since_result temporal_rs_PlainTime_since(const temporal_rs::capi::PlainTime* self, const temporal_rs::capi::PlainTime* other, temporal_rs::capi::DifferenceSettings settings); + + bool temporal_rs_PlainTime_equals(const temporal_rs::capi::PlainTime* self, const temporal_rs::capi::PlainTime* other); + + int8_t temporal_rs_PlainTime_compare(const temporal_rs::capi::PlainTime* one, const temporal_rs::capi::PlainTime* two); + + typedef struct temporal_rs_PlainTime_round_result {union {temporal_rs::capi::PlainTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainTime_round_result; + temporal_rs_PlainTime_round_result temporal_rs_PlainTime_round(const temporal_rs::capi::PlainTime* self, temporal_rs::capi::RoundingOptions options); + + typedef struct temporal_rs_PlainTime_to_ixdtf_string_result {union { temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainTime_to_ixdtf_string_result; + temporal_rs_PlainTime_to_ixdtf_string_result temporal_rs_PlainTime_to_ixdtf_string(const temporal_rs::capi::PlainTime* self, temporal_rs::capi::ToStringRoundingOptions options, temporal_rs::diplomat::capi::DiplomatWrite* write); + + temporal_rs::capi::PlainTime* temporal_rs_PlainTime_clone(const temporal_rs::capi::PlainTime* self); + + void temporal_rs_PlainTime_destroy(PlainTime* self); + + } // extern "C" +} // namespace capi +} // namespace + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainTime::try_new_constrain(uint8_t hour, uint8_t minute, uint8_t second, uint16_t millisecond, uint16_t microsecond, uint16_t nanosecond) { + auto result = temporal_rs::capi::temporal_rs_PlainTime_try_new_constrain(hour, + minute, + second, + millisecond, + microsecond, + nanosecond); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainTime::try_new(uint8_t hour, uint8_t minute, uint8_t second, uint16_t millisecond, uint16_t microsecond, uint16_t nanosecond) { + auto result = temporal_rs::capi::temporal_rs_PlainTime_try_new(hour, + minute, + second, + millisecond, + microsecond, + nanosecond); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainTime::from_partial(temporal_rs::PartialTime partial, std::optional overflow) { + auto result = temporal_rs::capi::temporal_rs_PlainTime_from_partial(partial.AsFFI(), + overflow.has_value() ? (temporal_rs::capi::ArithmeticOverflow_option{ { overflow.value().AsFFI() }, true }) : (temporal_rs::capi::ArithmeticOverflow_option{ {}, false })); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainTime::from_epoch_milliseconds(int64_t ms, temporal_rs::TimeZone tz) { + auto result = temporal_rs::capi::temporal_rs_PlainTime_from_epoch_milliseconds(ms, + tz.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainTime::from_epoch_milliseconds_with_provider(int64_t ms, temporal_rs::TimeZone tz, const temporal_rs::Provider& p) { + auto result = temporal_rs::capi::temporal_rs_PlainTime_from_epoch_milliseconds_with_provider(ms, + tz.AsFFI(), + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainTime::from_epoch_nanoseconds(temporal_rs::I128Nanoseconds ns, temporal_rs::TimeZone tz) { + auto result = temporal_rs::capi::temporal_rs_PlainTime_from_epoch_nanoseconds(ns.AsFFI(), + tz.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainTime::from_epoch_nanoseconds_with_provider(temporal_rs::I128Nanoseconds ns, temporal_rs::TimeZone tz, const temporal_rs::Provider& p) { + auto result = temporal_rs::capi::temporal_rs_PlainTime_from_epoch_nanoseconds_with_provider(ns.AsFFI(), + tz.AsFFI(), + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainTime::with(temporal_rs::PartialTime partial, std::optional overflow) const { + auto result = temporal_rs::capi::temporal_rs_PlainTime_with(this->AsFFI(), + partial.AsFFI(), + overflow.has_value() ? (temporal_rs::capi::ArithmeticOverflow_option{ { overflow.value().AsFFI() }, true }) : (temporal_rs::capi::ArithmeticOverflow_option{ {}, false })); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainTime::from_utf8(std::string_view s) { + auto result = temporal_rs::capi::temporal_rs_PlainTime_from_utf8({s.data(), s.size()}); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainTime::from_utf16(std::u16string_view s) { + auto result = temporal_rs::capi::temporal_rs_PlainTime_from_utf16({s.data(), s.size()}); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline uint8_t temporal_rs::PlainTime::hour() const { + auto result = temporal_rs::capi::temporal_rs_PlainTime_hour(this->AsFFI()); + return result; +} + +inline uint8_t temporal_rs::PlainTime::minute() const { + auto result = temporal_rs::capi::temporal_rs_PlainTime_minute(this->AsFFI()); + return result; +} + +inline uint8_t temporal_rs::PlainTime::second() const { + auto result = temporal_rs::capi::temporal_rs_PlainTime_second(this->AsFFI()); + return result; +} + +inline uint16_t temporal_rs::PlainTime::millisecond() const { + auto result = temporal_rs::capi::temporal_rs_PlainTime_millisecond(this->AsFFI()); + return result; +} + +inline uint16_t temporal_rs::PlainTime::microsecond() const { + auto result = temporal_rs::capi::temporal_rs_PlainTime_microsecond(this->AsFFI()); + return result; +} + +inline uint16_t temporal_rs::PlainTime::nanosecond() const { + auto result = temporal_rs::capi::temporal_rs_PlainTime_nanosecond(this->AsFFI()); + return result; +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainTime::add(const temporal_rs::Duration& duration) const { + auto result = temporal_rs::capi::temporal_rs_PlainTime_add(this->AsFFI(), + duration.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainTime::subtract(const temporal_rs::Duration& duration) const { + auto result = temporal_rs::capi::temporal_rs_PlainTime_subtract(this->AsFFI(), + duration.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainTime::until(const temporal_rs::PlainTime& other, temporal_rs::DifferenceSettings settings) const { + auto result = temporal_rs::capi::temporal_rs_PlainTime_until(this->AsFFI(), + other.AsFFI(), + settings.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::Duration::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainTime::since(const temporal_rs::PlainTime& other, temporal_rs::DifferenceSettings settings) const { + auto result = temporal_rs::capi::temporal_rs_PlainTime_since(this->AsFFI(), + other.AsFFI(), + settings.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::Duration::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline bool temporal_rs::PlainTime::equals(const temporal_rs::PlainTime& other) const { + auto result = temporal_rs::capi::temporal_rs_PlainTime_equals(this->AsFFI(), + other.AsFFI()); + return result; +} + +inline int8_t temporal_rs::PlainTime::compare(const temporal_rs::PlainTime& one, const temporal_rs::PlainTime& two) { + auto result = temporal_rs::capi::temporal_rs_PlainTime_compare(one.AsFFI(), + two.AsFFI()); + return result; +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainTime::round(temporal_rs::RoundingOptions options) const { + auto result = temporal_rs::capi::temporal_rs_PlainTime_round(this->AsFFI(), + options.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result temporal_rs::PlainTime::to_ixdtf_string(temporal_rs::ToStringRoundingOptions options) const { + std::string output; + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteFromString(output); + auto result = temporal_rs::capi::temporal_rs_PlainTime_to_ixdtf_string(this->AsFFI(), + options.AsFFI(), + &write); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok(std::move(output))) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} +template +inline temporal_rs::diplomat::result temporal_rs::PlainTime::to_ixdtf_string_write(temporal_rs::ToStringRoundingOptions options, W& writeable) const { + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteTrait::Construct(writeable); + auto result = temporal_rs::capi::temporal_rs_PlainTime_to_ixdtf_string(this->AsFFI(), + options.AsFFI(), + &write); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok()) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline std::unique_ptr temporal_rs::PlainTime::clone() const { + auto result = temporal_rs::capi::temporal_rs_PlainTime_clone(this->AsFFI()); + return std::unique_ptr(temporal_rs::PlainTime::FromFFI(result)); +} + +inline const temporal_rs::capi::PlainTime* temporal_rs::PlainTime::AsFFI() const { + return reinterpret_cast(this); +} + +inline temporal_rs::capi::PlainTime* temporal_rs::PlainTime::AsFFI() { + return reinterpret_cast(this); +} + +inline const temporal_rs::PlainTime* temporal_rs::PlainTime::FromFFI(const temporal_rs::capi::PlainTime* ptr) { + return reinterpret_cast(ptr); +} + +inline temporal_rs::PlainTime* temporal_rs::PlainTime::FromFFI(temporal_rs::capi::PlainTime* ptr) { + return reinterpret_cast(ptr); +} + +inline void temporal_rs::PlainTime::operator delete(void* ptr) { + temporal_rs::capi::temporal_rs_PlainTime_destroy(reinterpret_cast(ptr)); +} + + +#endif // TEMPORAL_RS_PlainTime_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainYearMonth.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainYearMonth.d.hpp new file mode 100644 index 00000000000000..b6ea924834db08 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainYearMonth.d.hpp @@ -0,0 +1,122 @@ +#ifndef TEMPORAL_RS_PlainYearMonth_D_HPP +#define TEMPORAL_RS_PlainYearMonth_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" +namespace temporal_rs { +namespace capi { struct Calendar; } +class Calendar; +namespace capi { struct Duration; } +class Duration; +namespace capi { struct ParsedDate; } +class ParsedDate; +namespace capi { struct PlainDate; } +class PlainDate; +namespace capi { struct PlainYearMonth; } +class PlainYearMonth; +namespace capi { struct Provider; } +class Provider; +struct DifferenceSettings; +struct PartialDate; +struct TemporalError; +struct TimeZone; +class AnyCalendarKind; +class ArithmeticOverflow; +class DisplayCalendar; +} // namespace temporal_rs + + + +namespace temporal_rs { +namespace capi { + struct PlainYearMonth; +} // namespace capi +} // namespace + +namespace temporal_rs { +class PlainYearMonth { +public: + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> try_new_with_overflow(int32_t year, uint8_t month, std::optional reference_day, temporal_rs::AnyCalendarKind calendar, temporal_rs::ArithmeticOverflow overflow); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_partial(temporal_rs::PartialDate partial, std::optional overflow); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_parsed(const temporal_rs::ParsedDate& parsed); + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> with(temporal_rs::PartialDate partial, std::optional overflow) const; + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_utf8(std::string_view s); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_utf16(std::u16string_view s); + + inline int32_t year() const; + + inline uint8_t month() const; + + inline std::string month_code() const; + template + inline void month_code_write(W& writeable_output) const; + + inline bool in_leap_year() const; + + inline uint16_t days_in_month() const; + + inline uint16_t days_in_year() const; + + inline uint16_t months_in_year() const; + + inline std::string era() const; + template + inline void era_write(W& writeable_output) const; + + inline std::optional era_year() const; + + inline const temporal_rs::Calendar& calendar() const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> add(const temporal_rs::Duration& duration, temporal_rs::ArithmeticOverflow overflow) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> subtract(const temporal_rs::Duration& duration, temporal_rs::ArithmeticOverflow overflow) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> until(const temporal_rs::PlainYearMonth& other, temporal_rs::DifferenceSettings settings) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> since(const temporal_rs::PlainYearMonth& other, temporal_rs::DifferenceSettings settings) const; + + inline bool equals(const temporal_rs::PlainYearMonth& other) const; + + inline static int8_t compare(const temporal_rs::PlainYearMonth& one, const temporal_rs::PlainYearMonth& two); + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> to_plain_date(std::optional day) const; + + inline temporal_rs::diplomat::result epoch_ms_for(temporal_rs::TimeZone time_zone) const; + + inline temporal_rs::diplomat::result epoch_ms_for_with_provider(temporal_rs::TimeZone time_zone, const temporal_rs::Provider& p) const; + + inline std::string to_ixdtf_string(temporal_rs::DisplayCalendar display_calendar) const; + template + inline void to_ixdtf_string_write(temporal_rs::DisplayCalendar display_calendar, W& writeable_output) const; + + inline std::unique_ptr clone() const; + + inline const temporal_rs::capi::PlainYearMonth* AsFFI() const; + inline temporal_rs::capi::PlainYearMonth* AsFFI(); + inline static const temporal_rs::PlainYearMonth* FromFFI(const temporal_rs::capi::PlainYearMonth* ptr); + inline static temporal_rs::PlainYearMonth* FromFFI(temporal_rs::capi::PlainYearMonth* ptr); + inline static void operator delete(void* ptr); +private: + PlainYearMonth() = delete; + PlainYearMonth(const temporal_rs::PlainYearMonth&) = delete; + PlainYearMonth(temporal_rs::PlainYearMonth&&) noexcept = delete; + PlainYearMonth operator=(const temporal_rs::PlainYearMonth&) = delete; + PlainYearMonth operator=(temporal_rs::PlainYearMonth&&) noexcept = delete; + static void operator delete[](void*, size_t) = delete; +}; + +} // namespace +#endif // TEMPORAL_RS_PlainYearMonth_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainYearMonth.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainYearMonth.hpp new file mode 100644 index 00000000000000..5f66d553e998ed --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/PlainYearMonth.hpp @@ -0,0 +1,313 @@ +#ifndef TEMPORAL_RS_PlainYearMonth_HPP +#define TEMPORAL_RS_PlainYearMonth_HPP + +#include "PlainYearMonth.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "AnyCalendarKind.hpp" +#include "ArithmeticOverflow.hpp" +#include "Calendar.hpp" +#include "DifferenceSettings.hpp" +#include "DisplayCalendar.hpp" +#include "Duration.hpp" +#include "ParsedDate.hpp" +#include "PartialDate.hpp" +#include "PlainDate.hpp" +#include "Provider.hpp" +#include "TemporalError.hpp" +#include "TimeZone.hpp" +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + typedef struct temporal_rs_PlainYearMonth_try_new_with_overflow_result {union {temporal_rs::capi::PlainYearMonth* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainYearMonth_try_new_with_overflow_result; + temporal_rs_PlainYearMonth_try_new_with_overflow_result temporal_rs_PlainYearMonth_try_new_with_overflow(int32_t year, uint8_t month, temporal_rs::diplomat::capi::OptionU8 reference_day, temporal_rs::capi::AnyCalendarKind calendar, temporal_rs::capi::ArithmeticOverflow overflow); + + typedef struct temporal_rs_PlainYearMonth_from_partial_result {union {temporal_rs::capi::PlainYearMonth* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainYearMonth_from_partial_result; + temporal_rs_PlainYearMonth_from_partial_result temporal_rs_PlainYearMonth_from_partial(temporal_rs::capi::PartialDate partial, temporal_rs::capi::ArithmeticOverflow_option overflow); + + typedef struct temporal_rs_PlainYearMonth_from_parsed_result {union {temporal_rs::capi::PlainYearMonth* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainYearMonth_from_parsed_result; + temporal_rs_PlainYearMonth_from_parsed_result temporal_rs_PlainYearMonth_from_parsed(const temporal_rs::capi::ParsedDate* parsed); + + typedef struct temporal_rs_PlainYearMonth_with_result {union {temporal_rs::capi::PlainYearMonth* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainYearMonth_with_result; + temporal_rs_PlainYearMonth_with_result temporal_rs_PlainYearMonth_with(const temporal_rs::capi::PlainYearMonth* self, temporal_rs::capi::PartialDate partial, temporal_rs::capi::ArithmeticOverflow_option overflow); + + typedef struct temporal_rs_PlainYearMonth_from_utf8_result {union {temporal_rs::capi::PlainYearMonth* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainYearMonth_from_utf8_result; + temporal_rs_PlainYearMonth_from_utf8_result temporal_rs_PlainYearMonth_from_utf8(temporal_rs::diplomat::capi::DiplomatStringView s); + + typedef struct temporal_rs_PlainYearMonth_from_utf16_result {union {temporal_rs::capi::PlainYearMonth* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainYearMonth_from_utf16_result; + temporal_rs_PlainYearMonth_from_utf16_result temporal_rs_PlainYearMonth_from_utf16(temporal_rs::diplomat::capi::DiplomatString16View s); + + int32_t temporal_rs_PlainYearMonth_year(const temporal_rs::capi::PlainYearMonth* self); + + uint8_t temporal_rs_PlainYearMonth_month(const temporal_rs::capi::PlainYearMonth* self); + + void temporal_rs_PlainYearMonth_month_code(const temporal_rs::capi::PlainYearMonth* self, temporal_rs::diplomat::capi::DiplomatWrite* write); + + bool temporal_rs_PlainYearMonth_in_leap_year(const temporal_rs::capi::PlainYearMonth* self); + + uint16_t temporal_rs_PlainYearMonth_days_in_month(const temporal_rs::capi::PlainYearMonth* self); + + uint16_t temporal_rs_PlainYearMonth_days_in_year(const temporal_rs::capi::PlainYearMonth* self); + + uint16_t temporal_rs_PlainYearMonth_months_in_year(const temporal_rs::capi::PlainYearMonth* self); + + void temporal_rs_PlainYearMonth_era(const temporal_rs::capi::PlainYearMonth* self, temporal_rs::diplomat::capi::DiplomatWrite* write); + + typedef struct temporal_rs_PlainYearMonth_era_year_result {union {int32_t ok; }; bool is_ok;} temporal_rs_PlainYearMonth_era_year_result; + temporal_rs_PlainYearMonth_era_year_result temporal_rs_PlainYearMonth_era_year(const temporal_rs::capi::PlainYearMonth* self); + + const temporal_rs::capi::Calendar* temporal_rs_PlainYearMonth_calendar(const temporal_rs::capi::PlainYearMonth* self); + + typedef struct temporal_rs_PlainYearMonth_add_result {union {temporal_rs::capi::PlainYearMonth* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainYearMonth_add_result; + temporal_rs_PlainYearMonth_add_result temporal_rs_PlainYearMonth_add(const temporal_rs::capi::PlainYearMonth* self, const temporal_rs::capi::Duration* duration, temporal_rs::capi::ArithmeticOverflow overflow); + + typedef struct temporal_rs_PlainYearMonth_subtract_result {union {temporal_rs::capi::PlainYearMonth* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainYearMonth_subtract_result; + temporal_rs_PlainYearMonth_subtract_result temporal_rs_PlainYearMonth_subtract(const temporal_rs::capi::PlainYearMonth* self, const temporal_rs::capi::Duration* duration, temporal_rs::capi::ArithmeticOverflow overflow); + + typedef struct temporal_rs_PlainYearMonth_until_result {union {temporal_rs::capi::Duration* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainYearMonth_until_result; + temporal_rs_PlainYearMonth_until_result temporal_rs_PlainYearMonth_until(const temporal_rs::capi::PlainYearMonth* self, const temporal_rs::capi::PlainYearMonth* other, temporal_rs::capi::DifferenceSettings settings); + + typedef struct temporal_rs_PlainYearMonth_since_result {union {temporal_rs::capi::Duration* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainYearMonth_since_result; + temporal_rs_PlainYearMonth_since_result temporal_rs_PlainYearMonth_since(const temporal_rs::capi::PlainYearMonth* self, const temporal_rs::capi::PlainYearMonth* other, temporal_rs::capi::DifferenceSettings settings); + + bool temporal_rs_PlainYearMonth_equals(const temporal_rs::capi::PlainYearMonth* self, const temporal_rs::capi::PlainYearMonth* other); + + int8_t temporal_rs_PlainYearMonth_compare(const temporal_rs::capi::PlainYearMonth* one, const temporal_rs::capi::PlainYearMonth* two); + + typedef struct temporal_rs_PlainYearMonth_to_plain_date_result {union {temporal_rs::capi::PlainDate* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainYearMonth_to_plain_date_result; + temporal_rs_PlainYearMonth_to_plain_date_result temporal_rs_PlainYearMonth_to_plain_date(const temporal_rs::capi::PlainYearMonth* self, temporal_rs::capi::PartialDate_option day); + + typedef struct temporal_rs_PlainYearMonth_epoch_ms_for_result {union {int64_t ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainYearMonth_epoch_ms_for_result; + temporal_rs_PlainYearMonth_epoch_ms_for_result temporal_rs_PlainYearMonth_epoch_ms_for(const temporal_rs::capi::PlainYearMonth* self, temporal_rs::capi::TimeZone time_zone); + + typedef struct temporal_rs_PlainYearMonth_epoch_ms_for_with_provider_result {union {int64_t ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_PlainYearMonth_epoch_ms_for_with_provider_result; + temporal_rs_PlainYearMonth_epoch_ms_for_with_provider_result temporal_rs_PlainYearMonth_epoch_ms_for_with_provider(const temporal_rs::capi::PlainYearMonth* self, temporal_rs::capi::TimeZone time_zone, const temporal_rs::capi::Provider* p); + + void temporal_rs_PlainYearMonth_to_ixdtf_string(const temporal_rs::capi::PlainYearMonth* self, temporal_rs::capi::DisplayCalendar display_calendar, temporal_rs::diplomat::capi::DiplomatWrite* write); + + temporal_rs::capi::PlainYearMonth* temporal_rs_PlainYearMonth_clone(const temporal_rs::capi::PlainYearMonth* self); + + void temporal_rs_PlainYearMonth_destroy(PlainYearMonth* self); + + } // extern "C" +} // namespace capi +} // namespace + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainYearMonth::try_new_with_overflow(int32_t year, uint8_t month, std::optional reference_day, temporal_rs::AnyCalendarKind calendar, temporal_rs::ArithmeticOverflow overflow) { + auto result = temporal_rs::capi::temporal_rs_PlainYearMonth_try_new_with_overflow(year, + month, + reference_day.has_value() ? (temporal_rs::diplomat::capi::OptionU8{ { reference_day.value() }, true }) : (temporal_rs::diplomat::capi::OptionU8{ {}, false }), + calendar.AsFFI(), + overflow.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainYearMonth::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainYearMonth::from_partial(temporal_rs::PartialDate partial, std::optional overflow) { + auto result = temporal_rs::capi::temporal_rs_PlainYearMonth_from_partial(partial.AsFFI(), + overflow.has_value() ? (temporal_rs::capi::ArithmeticOverflow_option{ { overflow.value().AsFFI() }, true }) : (temporal_rs::capi::ArithmeticOverflow_option{ {}, false })); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainYearMonth::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainYearMonth::from_parsed(const temporal_rs::ParsedDate& parsed) { + auto result = temporal_rs::capi::temporal_rs_PlainYearMonth_from_parsed(parsed.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainYearMonth::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainYearMonth::with(temporal_rs::PartialDate partial, std::optional overflow) const { + auto result = temporal_rs::capi::temporal_rs_PlainYearMonth_with(this->AsFFI(), + partial.AsFFI(), + overflow.has_value() ? (temporal_rs::capi::ArithmeticOverflow_option{ { overflow.value().AsFFI() }, true }) : (temporal_rs::capi::ArithmeticOverflow_option{ {}, false })); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainYearMonth::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainYearMonth::from_utf8(std::string_view s) { + auto result = temporal_rs::capi::temporal_rs_PlainYearMonth_from_utf8({s.data(), s.size()}); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainYearMonth::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainYearMonth::from_utf16(std::u16string_view s) { + auto result = temporal_rs::capi::temporal_rs_PlainYearMonth_from_utf16({s.data(), s.size()}); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainYearMonth::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline int32_t temporal_rs::PlainYearMonth::year() const { + auto result = temporal_rs::capi::temporal_rs_PlainYearMonth_year(this->AsFFI()); + return result; +} + +inline uint8_t temporal_rs::PlainYearMonth::month() const { + auto result = temporal_rs::capi::temporal_rs_PlainYearMonth_month(this->AsFFI()); + return result; +} + +inline std::string temporal_rs::PlainYearMonth::month_code() const { + std::string output; + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteFromString(output); + temporal_rs::capi::temporal_rs_PlainYearMonth_month_code(this->AsFFI(), + &write); + return output; +} +template +inline void temporal_rs::PlainYearMonth::month_code_write(W& writeable) const { + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteTrait::Construct(writeable); + temporal_rs::capi::temporal_rs_PlainYearMonth_month_code(this->AsFFI(), + &write); +} + +inline bool temporal_rs::PlainYearMonth::in_leap_year() const { + auto result = temporal_rs::capi::temporal_rs_PlainYearMonth_in_leap_year(this->AsFFI()); + return result; +} + +inline uint16_t temporal_rs::PlainYearMonth::days_in_month() const { + auto result = temporal_rs::capi::temporal_rs_PlainYearMonth_days_in_month(this->AsFFI()); + return result; +} + +inline uint16_t temporal_rs::PlainYearMonth::days_in_year() const { + auto result = temporal_rs::capi::temporal_rs_PlainYearMonth_days_in_year(this->AsFFI()); + return result; +} + +inline uint16_t temporal_rs::PlainYearMonth::months_in_year() const { + auto result = temporal_rs::capi::temporal_rs_PlainYearMonth_months_in_year(this->AsFFI()); + return result; +} + +inline std::string temporal_rs::PlainYearMonth::era() const { + std::string output; + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteFromString(output); + temporal_rs::capi::temporal_rs_PlainYearMonth_era(this->AsFFI(), + &write); + return output; +} +template +inline void temporal_rs::PlainYearMonth::era_write(W& writeable) const { + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteTrait::Construct(writeable); + temporal_rs::capi::temporal_rs_PlainYearMonth_era(this->AsFFI(), + &write); +} + +inline std::optional temporal_rs::PlainYearMonth::era_year() const { + auto result = temporal_rs::capi::temporal_rs_PlainYearMonth_era_year(this->AsFFI()); + return result.is_ok ? std::optional(result.ok) : std::nullopt; +} + +inline const temporal_rs::Calendar& temporal_rs::PlainYearMonth::calendar() const { + auto result = temporal_rs::capi::temporal_rs_PlainYearMonth_calendar(this->AsFFI()); + return *temporal_rs::Calendar::FromFFI(result); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainYearMonth::add(const temporal_rs::Duration& duration, temporal_rs::ArithmeticOverflow overflow) const { + auto result = temporal_rs::capi::temporal_rs_PlainYearMonth_add(this->AsFFI(), + duration.AsFFI(), + overflow.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainYearMonth::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainYearMonth::subtract(const temporal_rs::Duration& duration, temporal_rs::ArithmeticOverflow overflow) const { + auto result = temporal_rs::capi::temporal_rs_PlainYearMonth_subtract(this->AsFFI(), + duration.AsFFI(), + overflow.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainYearMonth::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainYearMonth::until(const temporal_rs::PlainYearMonth& other, temporal_rs::DifferenceSettings settings) const { + auto result = temporal_rs::capi::temporal_rs_PlainYearMonth_until(this->AsFFI(), + other.AsFFI(), + settings.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::Duration::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainYearMonth::since(const temporal_rs::PlainYearMonth& other, temporal_rs::DifferenceSettings settings) const { + auto result = temporal_rs::capi::temporal_rs_PlainYearMonth_since(this->AsFFI(), + other.AsFFI(), + settings.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::Duration::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline bool temporal_rs::PlainYearMonth::equals(const temporal_rs::PlainYearMonth& other) const { + auto result = temporal_rs::capi::temporal_rs_PlainYearMonth_equals(this->AsFFI(), + other.AsFFI()); + return result; +} + +inline int8_t temporal_rs::PlainYearMonth::compare(const temporal_rs::PlainYearMonth& one, const temporal_rs::PlainYearMonth& two) { + auto result = temporal_rs::capi::temporal_rs_PlainYearMonth_compare(one.AsFFI(), + two.AsFFI()); + return result; +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::PlainYearMonth::to_plain_date(std::optional day) const { + auto result = temporal_rs::capi::temporal_rs_PlainYearMonth_to_plain_date(this->AsFFI(), + day.has_value() ? (temporal_rs::capi::PartialDate_option{ { day.value().AsFFI() }, true }) : (temporal_rs::capi::PartialDate_option{ {}, false })); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::PlainDate::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result temporal_rs::PlainYearMonth::epoch_ms_for(temporal_rs::TimeZone time_zone) const { + auto result = temporal_rs::capi::temporal_rs_PlainYearMonth_epoch_ms_for(this->AsFFI(), + time_zone.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok(result.ok)) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result temporal_rs::PlainYearMonth::epoch_ms_for_with_provider(temporal_rs::TimeZone time_zone, const temporal_rs::Provider& p) const { + auto result = temporal_rs::capi::temporal_rs_PlainYearMonth_epoch_ms_for_with_provider(this->AsFFI(), + time_zone.AsFFI(), + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok(result.ok)) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline std::string temporal_rs::PlainYearMonth::to_ixdtf_string(temporal_rs::DisplayCalendar display_calendar) const { + std::string output; + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteFromString(output); + temporal_rs::capi::temporal_rs_PlainYearMonth_to_ixdtf_string(this->AsFFI(), + display_calendar.AsFFI(), + &write); + return output; +} +template +inline void temporal_rs::PlainYearMonth::to_ixdtf_string_write(temporal_rs::DisplayCalendar display_calendar, W& writeable) const { + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteTrait::Construct(writeable); + temporal_rs::capi::temporal_rs_PlainYearMonth_to_ixdtf_string(this->AsFFI(), + display_calendar.AsFFI(), + &write); +} + +inline std::unique_ptr temporal_rs::PlainYearMonth::clone() const { + auto result = temporal_rs::capi::temporal_rs_PlainYearMonth_clone(this->AsFFI()); + return std::unique_ptr(temporal_rs::PlainYearMonth::FromFFI(result)); +} + +inline const temporal_rs::capi::PlainYearMonth* temporal_rs::PlainYearMonth::AsFFI() const { + return reinterpret_cast(this); +} + +inline temporal_rs::capi::PlainYearMonth* temporal_rs::PlainYearMonth::AsFFI() { + return reinterpret_cast(this); +} + +inline const temporal_rs::PlainYearMonth* temporal_rs::PlainYearMonth::FromFFI(const temporal_rs::capi::PlainYearMonth* ptr) { + return reinterpret_cast(ptr); +} + +inline temporal_rs::PlainYearMonth* temporal_rs::PlainYearMonth::FromFFI(temporal_rs::capi::PlainYearMonth* ptr) { + return reinterpret_cast(ptr); +} + +inline void temporal_rs::PlainYearMonth::operator delete(void* ptr) { + temporal_rs::capi::temporal_rs_PlainYearMonth_destroy(reinterpret_cast(ptr)); +} + + +#endif // TEMPORAL_RS_PlainYearMonth_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Precision.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Precision.d.hpp new file mode 100644 index 00000000000000..fc8ff6c93bbe91 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Precision.d.hpp @@ -0,0 +1,37 @@ +#ifndef TEMPORAL_RS_Precision_D_HPP +#define TEMPORAL_RS_Precision_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + struct Precision { + bool is_minute; + temporal_rs::diplomat::capi::OptionU8 precision; + }; + + typedef struct Precision_option {union { Precision ok; }; bool is_ok; } Precision_option; +} // namespace capi +} // namespace + + +namespace temporal_rs { +struct Precision { + bool is_minute; + std::optional precision; + + inline temporal_rs::capi::Precision AsFFI() const; + inline static temporal_rs::Precision FromFFI(temporal_rs::capi::Precision c_struct); +}; + +} // namespace +#endif // TEMPORAL_RS_Precision_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Precision.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Precision.hpp new file mode 100644 index 00000000000000..798021ca96cb69 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Precision.hpp @@ -0,0 +1,41 @@ +#ifndef TEMPORAL_RS_Precision_HPP +#define TEMPORAL_RS_Precision_HPP + +#include "Precision.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + } // extern "C" +} // namespace capi +} // namespace + + +inline temporal_rs::capi::Precision temporal_rs::Precision::AsFFI() const { + return temporal_rs::capi::Precision { + /* .is_minute = */ is_minute, + /* .precision = */ precision.has_value() ? (temporal_rs::diplomat::capi::OptionU8{ { precision.value() }, true }) : (temporal_rs::diplomat::capi::OptionU8{ {}, false }), + }; +} + +inline temporal_rs::Precision temporal_rs::Precision::FromFFI(temporal_rs::capi::Precision c_struct) { + return temporal_rs::Precision { + /* .is_minute = */ c_struct.is_minute, + /* .precision = */ c_struct.precision.is_ok ? std::optional(c_struct.precision.ok) : std::nullopt, + }; +} + + +#endif // TEMPORAL_RS_Precision_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Provider.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Provider.d.hpp new file mode 100644 index 00000000000000..f704677b47a9ea --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Provider.d.hpp @@ -0,0 +1,62 @@ +#ifndef TEMPORAL_RS_Provider_D_HPP +#define TEMPORAL_RS_Provider_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" +namespace temporal_rs { +namespace capi { struct Provider; } +class Provider; +} // namespace temporal_rs + + + +namespace temporal_rs { +namespace capi { + struct Provider; +} // namespace capi +} // namespace + +namespace temporal_rs { +/** + * A time zone data provider + */ +class Provider { +public: + + /** + * Construct a provider backed by a zoneinfo64.res file + * + * This failing to construct is not a Temporal error, so it just returns () + */ + inline static temporal_rs::diplomat::result, std::monostate> new_zoneinfo64(temporal_rs::diplomat::span data); + + inline static std::unique_ptr new_compiled(); + + /** + * Fallback type in case construction does not work. + */ + inline static std::unique_ptr empty(); + + inline const temporal_rs::capi::Provider* AsFFI() const; + inline temporal_rs::capi::Provider* AsFFI(); + inline static const temporal_rs::Provider* FromFFI(const temporal_rs::capi::Provider* ptr); + inline static temporal_rs::Provider* FromFFI(temporal_rs::capi::Provider* ptr); + inline static void operator delete(void* ptr); +private: + Provider() = delete; + Provider(const temporal_rs::Provider&) = delete; + Provider(temporal_rs::Provider&&) noexcept = delete; + Provider operator=(const temporal_rs::Provider&) = delete; + Provider operator=(temporal_rs::Provider&&) noexcept = delete; + static void operator delete[](void*, size_t) = delete; +}; + +} // namespace +#endif // TEMPORAL_RS_Provider_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Provider.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Provider.hpp new file mode 100644 index 00000000000000..c01662f0a9fa80 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Provider.hpp @@ -0,0 +1,70 @@ +#ifndef TEMPORAL_RS_Provider_HPP +#define TEMPORAL_RS_Provider_HPP + +#include "Provider.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + typedef struct temporal_rs_Provider_new_zoneinfo64_result {union {temporal_rs::capi::Provider* ok; }; bool is_ok;} temporal_rs_Provider_new_zoneinfo64_result; + temporal_rs_Provider_new_zoneinfo64_result temporal_rs_Provider_new_zoneinfo64(temporal_rs::diplomat::capi::DiplomatU32View data); + + temporal_rs::capi::Provider* temporal_rs_Provider_new_compiled(void); + + temporal_rs::capi::Provider* temporal_rs_Provider_empty(void); + + void temporal_rs_Provider_destroy(Provider* self); + + } // extern "C" +} // namespace capi +} // namespace + +inline temporal_rs::diplomat::result, std::monostate> temporal_rs::Provider::new_zoneinfo64(temporal_rs::diplomat::span data) { + auto result = temporal_rs::capi::temporal_rs_Provider_new_zoneinfo64({data.data(), data.size()}); + return result.is_ok ? temporal_rs::diplomat::result, std::monostate>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::Provider::FromFFI(result.ok)))) : temporal_rs::diplomat::result, std::monostate>(temporal_rs::diplomat::Err()); +} + +inline std::unique_ptr temporal_rs::Provider::new_compiled() { + auto result = temporal_rs::capi::temporal_rs_Provider_new_compiled(); + return std::unique_ptr(temporal_rs::Provider::FromFFI(result)); +} + +inline std::unique_ptr temporal_rs::Provider::empty() { + auto result = temporal_rs::capi::temporal_rs_Provider_empty(); + return std::unique_ptr(temporal_rs::Provider::FromFFI(result)); +} + +inline const temporal_rs::capi::Provider* temporal_rs::Provider::AsFFI() const { + return reinterpret_cast(this); +} + +inline temporal_rs::capi::Provider* temporal_rs::Provider::AsFFI() { + return reinterpret_cast(this); +} + +inline const temporal_rs::Provider* temporal_rs::Provider::FromFFI(const temporal_rs::capi::Provider* ptr) { + return reinterpret_cast(ptr); +} + +inline temporal_rs::Provider* temporal_rs::Provider::FromFFI(temporal_rs::capi::Provider* ptr) { + return reinterpret_cast(ptr); +} + +inline void temporal_rs::Provider::operator delete(void* ptr) { + temporal_rs::capi::temporal_rs_Provider_destroy(reinterpret_cast(ptr)); +} + + +#endif // TEMPORAL_RS_Provider_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/RelativeTo.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/RelativeTo.d.hpp new file mode 100644 index 00000000000000..8c3b80d68706e2 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/RelativeTo.d.hpp @@ -0,0 +1,44 @@ +#ifndef TEMPORAL_RS_RelativeTo_D_HPP +#define TEMPORAL_RS_RelativeTo_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" +namespace temporal_rs { +namespace capi { struct PlainDate; } +class PlainDate; +namespace capi { struct ZonedDateTime; } +class ZonedDateTime; +} // namespace temporal_rs + + + +namespace temporal_rs { +namespace capi { + struct RelativeTo { + const temporal_rs::capi::PlainDate* date; + const temporal_rs::capi::ZonedDateTime* zoned; + }; + + typedef struct RelativeTo_option {union { RelativeTo ok; }; bool is_ok; } RelativeTo_option; +} // namespace capi +} // namespace + + +namespace temporal_rs { +struct RelativeTo { + const temporal_rs::PlainDate* date; + const temporal_rs::ZonedDateTime* zoned; + + inline temporal_rs::capi::RelativeTo AsFFI() const; + inline static temporal_rs::RelativeTo FromFFI(temporal_rs::capi::RelativeTo c_struct); +}; + +} // namespace +#endif // TEMPORAL_RS_RelativeTo_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/RelativeTo.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/RelativeTo.hpp new file mode 100644 index 00000000000000..a5f28a56cdae21 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/RelativeTo.hpp @@ -0,0 +1,43 @@ +#ifndef TEMPORAL_RS_RelativeTo_HPP +#define TEMPORAL_RS_RelativeTo_HPP + +#include "RelativeTo.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "PlainDate.hpp" +#include "ZonedDateTime.hpp" +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + } // extern "C" +} // namespace capi +} // namespace + + +inline temporal_rs::capi::RelativeTo temporal_rs::RelativeTo::AsFFI() const { + return temporal_rs::capi::RelativeTo { + /* .date = */ date ? date->AsFFI() : nullptr, + /* .zoned = */ zoned ? zoned->AsFFI() : nullptr, + }; +} + +inline temporal_rs::RelativeTo temporal_rs::RelativeTo::FromFFI(temporal_rs::capi::RelativeTo c_struct) { + return temporal_rs::RelativeTo { + /* .date = */ temporal_rs::PlainDate::FromFFI(c_struct.date), + /* .zoned = */ temporal_rs::ZonedDateTime::FromFFI(c_struct.zoned), + }; +} + + +#endif // TEMPORAL_RS_RelativeTo_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/RoundingMode.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/RoundingMode.d.hpp new file mode 100644 index 00000000000000..a8ceeb790262bc --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/RoundingMode.d.hpp @@ -0,0 +1,63 @@ +#ifndef TEMPORAL_RS_RoundingMode_D_HPP +#define TEMPORAL_RS_RoundingMode_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + enum RoundingMode { + RoundingMode_Ceil = 0, + RoundingMode_Floor = 1, + RoundingMode_Expand = 2, + RoundingMode_Trunc = 3, + RoundingMode_HalfCeil = 4, + RoundingMode_HalfFloor = 5, + RoundingMode_HalfExpand = 6, + RoundingMode_HalfTrunc = 7, + RoundingMode_HalfEven = 8, + }; + + typedef struct RoundingMode_option {union { RoundingMode ok; }; bool is_ok; } RoundingMode_option; +} // namespace capi +} // namespace + +namespace temporal_rs { +class RoundingMode { +public: + enum Value { + Ceil = 0, + Floor = 1, + Expand = 2, + Trunc = 3, + HalfCeil = 4, + HalfFloor = 5, + HalfExpand = 6, + HalfTrunc = 7, + HalfEven = 8, + }; + + RoundingMode(): value(Value::Ceil) {} + + // Implicit conversions between enum and ::Value + constexpr RoundingMode(Value v) : value(v) {} + constexpr operator Value() const { return value; } + // Prevent usage as boolean value + explicit operator bool() const = delete; + + inline temporal_rs::capi::RoundingMode AsFFI() const; + inline static temporal_rs::RoundingMode FromFFI(temporal_rs::capi::RoundingMode c_enum); +private: + Value value; +}; + +} // namespace +#endif // TEMPORAL_RS_RoundingMode_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/RoundingMode.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/RoundingMode.hpp new file mode 100644 index 00000000000000..7d5b9253118e99 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/RoundingMode.hpp @@ -0,0 +1,45 @@ +#ifndef TEMPORAL_RS_RoundingMode_HPP +#define TEMPORAL_RS_RoundingMode_HPP + +#include "RoundingMode.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + } // extern "C" +} // namespace capi +} // namespace + +inline temporal_rs::capi::RoundingMode temporal_rs::RoundingMode::AsFFI() const { + return static_cast(value); +} + +inline temporal_rs::RoundingMode temporal_rs::RoundingMode::FromFFI(temporal_rs::capi::RoundingMode c_enum) { + switch (c_enum) { + case temporal_rs::capi::RoundingMode_Ceil: + case temporal_rs::capi::RoundingMode_Floor: + case temporal_rs::capi::RoundingMode_Expand: + case temporal_rs::capi::RoundingMode_Trunc: + case temporal_rs::capi::RoundingMode_HalfCeil: + case temporal_rs::capi::RoundingMode_HalfFloor: + case temporal_rs::capi::RoundingMode_HalfExpand: + case temporal_rs::capi::RoundingMode_HalfTrunc: + case temporal_rs::capi::RoundingMode_HalfEven: + return static_cast(c_enum); + default: + std::abort(); + } +} +#endif // TEMPORAL_RS_RoundingMode_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/RoundingOptions.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/RoundingOptions.d.hpp new file mode 100644 index 00000000000000..13256ac3374b74 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/RoundingOptions.d.hpp @@ -0,0 +1,48 @@ +#ifndef TEMPORAL_RS_RoundingOptions_D_HPP +#define TEMPORAL_RS_RoundingOptions_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "RoundingMode.d.hpp" +#include "Unit.d.hpp" +#include "diplomat_runtime.hpp" +namespace temporal_rs { +class RoundingMode; +class Unit; +} // namespace temporal_rs + + + +namespace temporal_rs { +namespace capi { + struct RoundingOptions { + temporal_rs::capi::Unit_option largest_unit; + temporal_rs::capi::Unit_option smallest_unit; + temporal_rs::capi::RoundingMode_option rounding_mode; + temporal_rs::diplomat::capi::OptionU32 increment; + }; + + typedef struct RoundingOptions_option {union { RoundingOptions ok; }; bool is_ok; } RoundingOptions_option; +} // namespace capi +} // namespace + + +namespace temporal_rs { +struct RoundingOptions { + std::optional largest_unit; + std::optional smallest_unit; + std::optional rounding_mode; + std::optional increment; + + inline temporal_rs::capi::RoundingOptions AsFFI() const; + inline static temporal_rs::RoundingOptions FromFFI(temporal_rs::capi::RoundingOptions c_struct); +}; + +} // namespace +#endif // TEMPORAL_RS_RoundingOptions_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/RoundingOptions.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/RoundingOptions.hpp new file mode 100644 index 00000000000000..1804f7be41941b --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/RoundingOptions.hpp @@ -0,0 +1,47 @@ +#ifndef TEMPORAL_RS_RoundingOptions_HPP +#define TEMPORAL_RS_RoundingOptions_HPP + +#include "RoundingOptions.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "RoundingMode.hpp" +#include "Unit.hpp" +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + } // extern "C" +} // namespace capi +} // namespace + + +inline temporal_rs::capi::RoundingOptions temporal_rs::RoundingOptions::AsFFI() const { + return temporal_rs::capi::RoundingOptions { + /* .largest_unit = */ largest_unit.has_value() ? (temporal_rs::capi::Unit_option{ { largest_unit.value().AsFFI() }, true }) : (temporal_rs::capi::Unit_option{ {}, false }), + /* .smallest_unit = */ smallest_unit.has_value() ? (temporal_rs::capi::Unit_option{ { smallest_unit.value().AsFFI() }, true }) : (temporal_rs::capi::Unit_option{ {}, false }), + /* .rounding_mode = */ rounding_mode.has_value() ? (temporal_rs::capi::RoundingMode_option{ { rounding_mode.value().AsFFI() }, true }) : (temporal_rs::capi::RoundingMode_option{ {}, false }), + /* .increment = */ increment.has_value() ? (temporal_rs::diplomat::capi::OptionU32{ { increment.value() }, true }) : (temporal_rs::diplomat::capi::OptionU32{ {}, false }), + }; +} + +inline temporal_rs::RoundingOptions temporal_rs::RoundingOptions::FromFFI(temporal_rs::capi::RoundingOptions c_struct) { + return temporal_rs::RoundingOptions { + /* .largest_unit = */ c_struct.largest_unit.is_ok ? std::optional(temporal_rs::Unit::FromFFI(c_struct.largest_unit.ok)) : std::nullopt, + /* .smallest_unit = */ c_struct.smallest_unit.is_ok ? std::optional(temporal_rs::Unit::FromFFI(c_struct.smallest_unit.ok)) : std::nullopt, + /* .rounding_mode = */ c_struct.rounding_mode.is_ok ? std::optional(temporal_rs::RoundingMode::FromFFI(c_struct.rounding_mode.ok)) : std::nullopt, + /* .increment = */ c_struct.increment.is_ok ? std::optional(c_struct.increment.ok) : std::nullopt, + }; +} + + +#endif // TEMPORAL_RS_RoundingOptions_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Sign.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Sign.d.hpp new file mode 100644 index 00000000000000..26bd59e5695193 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Sign.d.hpp @@ -0,0 +1,51 @@ +#ifndef TEMPORAL_RS_Sign_D_HPP +#define TEMPORAL_RS_Sign_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + enum Sign { + Sign_Positive = 1, + Sign_Zero = 0, + Sign_Negative = -1, + }; + + typedef struct Sign_option {union { Sign ok; }; bool is_ok; } Sign_option; +} // namespace capi +} // namespace + +namespace temporal_rs { +class Sign { +public: + enum Value { + Positive = 1, + Zero = 0, + Negative = -1, + }; + + Sign(): value(Value::Zero) {} + + // Implicit conversions between enum and ::Value + constexpr Sign(Value v) : value(v) {} + constexpr operator Value() const { return value; } + // Prevent usage as boolean value + explicit operator bool() const = delete; + + inline temporal_rs::capi::Sign AsFFI() const; + inline static temporal_rs::Sign FromFFI(temporal_rs::capi::Sign c_enum); +private: + Value value; +}; + +} // namespace +#endif // TEMPORAL_RS_Sign_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Sign.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Sign.hpp new file mode 100644 index 00000000000000..131b59507bdb00 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Sign.hpp @@ -0,0 +1,39 @@ +#ifndef TEMPORAL_RS_Sign_HPP +#define TEMPORAL_RS_Sign_HPP + +#include "Sign.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + } // extern "C" +} // namespace capi +} // namespace + +inline temporal_rs::capi::Sign temporal_rs::Sign::AsFFI() const { + return static_cast(value); +} + +inline temporal_rs::Sign temporal_rs::Sign::FromFFI(temporal_rs::capi::Sign c_enum) { + switch (c_enum) { + case temporal_rs::capi::Sign_Positive: + case temporal_rs::capi::Sign_Zero: + case temporal_rs::capi::Sign_Negative: + return static_cast(c_enum); + default: + std::abort(); + } +} +#endif // TEMPORAL_RS_Sign_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/TemporalError.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/TemporalError.d.hpp new file mode 100644 index 00000000000000..e07208d8003c5d --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/TemporalError.d.hpp @@ -0,0 +1,42 @@ +#ifndef TEMPORAL_RS_TemporalError_D_HPP +#define TEMPORAL_RS_TemporalError_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "ErrorKind.d.hpp" +#include "diplomat_runtime.hpp" +namespace temporal_rs { +class ErrorKind; +} // namespace temporal_rs + + + +namespace temporal_rs { +namespace capi { + struct TemporalError { + temporal_rs::capi::ErrorKind kind; + temporal_rs::diplomat::capi::OptionStringView msg; + }; + + typedef struct TemporalError_option {union { TemporalError ok; }; bool is_ok; } TemporalError_option; +} // namespace capi +} // namespace + + +namespace temporal_rs { +struct TemporalError { + temporal_rs::ErrorKind kind; + std::optional msg; + + inline temporal_rs::capi::TemporalError AsFFI() const; + inline static temporal_rs::TemporalError FromFFI(temporal_rs::capi::TemporalError c_struct); +}; + +} // namespace +#endif // TEMPORAL_RS_TemporalError_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/TemporalError.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/TemporalError.hpp new file mode 100644 index 00000000000000..aaccd0c1938cc1 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/TemporalError.hpp @@ -0,0 +1,42 @@ +#ifndef TEMPORAL_RS_TemporalError_HPP +#define TEMPORAL_RS_TemporalError_HPP + +#include "TemporalError.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "ErrorKind.hpp" +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + } // extern "C" +} // namespace capi +} // namespace + + +inline temporal_rs::capi::TemporalError temporal_rs::TemporalError::AsFFI() const { + return temporal_rs::capi::TemporalError { + /* .kind = */ kind.AsFFI(), + /* .msg = */ msg.has_value() ? (temporal_rs::diplomat::capi::OptionStringView{ { {msg.value().data(), msg.value().size()} }, true }) : (temporal_rs::diplomat::capi::OptionStringView{ {}, false }), + }; +} + +inline temporal_rs::TemporalError temporal_rs::TemporalError::FromFFI(temporal_rs::capi::TemporalError c_struct) { + return temporal_rs::TemporalError { + /* .kind = */ temporal_rs::ErrorKind::FromFFI(c_struct.kind), + /* .msg = */ c_struct.msg.is_ok ? std::optional(std::string_view(c_struct.msg.ok.data, c_struct.msg.ok.len)) : std::nullopt, + }; +} + + +#endif // TEMPORAL_RS_TemporalError_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/TimeZone.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/TimeZone.d.hpp new file mode 100644 index 00000000000000..46f31b1d47c3e2 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/TimeZone.d.hpp @@ -0,0 +1,90 @@ +#ifndef TEMPORAL_RS_TimeZone_D_HPP +#define TEMPORAL_RS_TimeZone_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" +namespace temporal_rs { +namespace capi { struct Provider; } +class Provider; +struct TemporalError; +struct TimeZone; +} // namespace temporal_rs + + + +namespace temporal_rs { +namespace capi { + struct TimeZone { + int16_t offset_minutes; + size_t resolved_id; + size_t normalized_id; + bool is_iana_id; + }; + + typedef struct TimeZone_option {union { TimeZone ok; }; bool is_ok; } TimeZone_option; +} // namespace capi +} // namespace + + +namespace temporal_rs { +/** + * A type representing a time zone over FFI. + * + * It is not recommended to directly manipulate the fields of this type. + */ +struct TimeZone { + int16_t offset_minutes; + size_t resolved_id; + size_t normalized_id; + bool is_iana_id; + + inline static temporal_rs::diplomat::result try_from_identifier_str(std::string_view ident); + + inline static temporal_rs::diplomat::result try_from_identifier_str_with_provider(std::string_view ident, const temporal_rs::Provider& p); + + inline static temporal_rs::diplomat::result try_from_offset_str(std::string_view ident); + + inline static temporal_rs::diplomat::result try_from_str(std::string_view ident); + + inline static temporal_rs::diplomat::result try_from_str_with_provider(std::string_view ident, const temporal_rs::Provider& p); + + inline std::string identifier() const; + template + inline void identifier_write(W& writeable_output) const; + + inline temporal_rs::diplomat::result identifier_with_provider(const temporal_rs::Provider& p) const; + template + inline temporal_rs::diplomat::result identifier_with_provider_write(const temporal_rs::Provider& p, W& writeable_output) const; + + inline static temporal_rs::TimeZone utc(); + + inline static temporal_rs::diplomat::result utc_with_provider(const temporal_rs::Provider& p); + + /** + * Create a TimeZone that represents +00:00 + * + * This is the only way to infallibly make a TimeZone without compiled_data, + * and can be used as a fallback. + */ + inline static temporal_rs::TimeZone zero(); + + /** + * Get the primary time zone identifier corresponding to this time zone + */ + inline temporal_rs::diplomat::result primary_identifier() const; + + inline temporal_rs::diplomat::result primary_identifier_with_provider(const temporal_rs::Provider& p) const; + + inline temporal_rs::capi::TimeZone AsFFI() const; + inline static temporal_rs::TimeZone FromFFI(temporal_rs::capi::TimeZone c_struct); +}; + +} // namespace +#endif // TEMPORAL_RS_TimeZone_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/TimeZone.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/TimeZone.hpp new file mode 100644 index 00000000000000..83f78af6b77388 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/TimeZone.hpp @@ -0,0 +1,164 @@ +#ifndef TEMPORAL_RS_TimeZone_HPP +#define TEMPORAL_RS_TimeZone_HPP + +#include "TimeZone.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "Provider.hpp" +#include "TemporalError.hpp" +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + typedef struct temporal_rs_TimeZone_try_from_identifier_str_result {union {temporal_rs::capi::TimeZone ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_TimeZone_try_from_identifier_str_result; + temporal_rs_TimeZone_try_from_identifier_str_result temporal_rs_TimeZone_try_from_identifier_str(temporal_rs::diplomat::capi::DiplomatStringView ident); + + typedef struct temporal_rs_TimeZone_try_from_identifier_str_with_provider_result {union {temporal_rs::capi::TimeZone ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_TimeZone_try_from_identifier_str_with_provider_result; + temporal_rs_TimeZone_try_from_identifier_str_with_provider_result temporal_rs_TimeZone_try_from_identifier_str_with_provider(temporal_rs::diplomat::capi::DiplomatStringView ident, const temporal_rs::capi::Provider* p); + + typedef struct temporal_rs_TimeZone_try_from_offset_str_result {union {temporal_rs::capi::TimeZone ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_TimeZone_try_from_offset_str_result; + temporal_rs_TimeZone_try_from_offset_str_result temporal_rs_TimeZone_try_from_offset_str(temporal_rs::diplomat::capi::DiplomatStringView ident); + + typedef struct temporal_rs_TimeZone_try_from_str_result {union {temporal_rs::capi::TimeZone ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_TimeZone_try_from_str_result; + temporal_rs_TimeZone_try_from_str_result temporal_rs_TimeZone_try_from_str(temporal_rs::diplomat::capi::DiplomatStringView ident); + + typedef struct temporal_rs_TimeZone_try_from_str_with_provider_result {union {temporal_rs::capi::TimeZone ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_TimeZone_try_from_str_with_provider_result; + temporal_rs_TimeZone_try_from_str_with_provider_result temporal_rs_TimeZone_try_from_str_with_provider(temporal_rs::diplomat::capi::DiplomatStringView ident, const temporal_rs::capi::Provider* p); + + void temporal_rs_TimeZone_identifier(temporal_rs::capi::TimeZone self, temporal_rs::diplomat::capi::DiplomatWrite* write); + + typedef struct temporal_rs_TimeZone_identifier_with_provider_result {union { temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_TimeZone_identifier_with_provider_result; + temporal_rs_TimeZone_identifier_with_provider_result temporal_rs_TimeZone_identifier_with_provider(temporal_rs::capi::TimeZone self, const temporal_rs::capi::Provider* p, temporal_rs::diplomat::capi::DiplomatWrite* write); + + temporal_rs::capi::TimeZone temporal_rs_TimeZone_utc(void); + + typedef struct temporal_rs_TimeZone_utc_with_provider_result {union {temporal_rs::capi::TimeZone ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_TimeZone_utc_with_provider_result; + temporal_rs_TimeZone_utc_with_provider_result temporal_rs_TimeZone_utc_with_provider(const temporal_rs::capi::Provider* p); + + temporal_rs::capi::TimeZone temporal_rs_TimeZone_zero(void); + + typedef struct temporal_rs_TimeZone_primary_identifier_result {union {temporal_rs::capi::TimeZone ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_TimeZone_primary_identifier_result; + temporal_rs_TimeZone_primary_identifier_result temporal_rs_TimeZone_primary_identifier(temporal_rs::capi::TimeZone self); + + typedef struct temporal_rs_TimeZone_primary_identifier_with_provider_result {union {temporal_rs::capi::TimeZone ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_TimeZone_primary_identifier_with_provider_result; + temporal_rs_TimeZone_primary_identifier_with_provider_result temporal_rs_TimeZone_primary_identifier_with_provider(temporal_rs::capi::TimeZone self, const temporal_rs::capi::Provider* p); + + } // extern "C" +} // namespace capi +} // namespace + +inline temporal_rs::diplomat::result temporal_rs::TimeZone::try_from_identifier_str(std::string_view ident) { + auto result = temporal_rs::capi::temporal_rs_TimeZone_try_from_identifier_str({ident.data(), ident.size()}); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok(temporal_rs::TimeZone::FromFFI(result.ok))) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result temporal_rs::TimeZone::try_from_identifier_str_with_provider(std::string_view ident, const temporal_rs::Provider& p) { + auto result = temporal_rs::capi::temporal_rs_TimeZone_try_from_identifier_str_with_provider({ident.data(), ident.size()}, + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok(temporal_rs::TimeZone::FromFFI(result.ok))) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result temporal_rs::TimeZone::try_from_offset_str(std::string_view ident) { + auto result = temporal_rs::capi::temporal_rs_TimeZone_try_from_offset_str({ident.data(), ident.size()}); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok(temporal_rs::TimeZone::FromFFI(result.ok))) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result temporal_rs::TimeZone::try_from_str(std::string_view ident) { + auto result = temporal_rs::capi::temporal_rs_TimeZone_try_from_str({ident.data(), ident.size()}); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok(temporal_rs::TimeZone::FromFFI(result.ok))) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result temporal_rs::TimeZone::try_from_str_with_provider(std::string_view ident, const temporal_rs::Provider& p) { + auto result = temporal_rs::capi::temporal_rs_TimeZone_try_from_str_with_provider({ident.data(), ident.size()}, + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok(temporal_rs::TimeZone::FromFFI(result.ok))) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline std::string temporal_rs::TimeZone::identifier() const { + std::string output; + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteFromString(output); + temporal_rs::capi::temporal_rs_TimeZone_identifier(this->AsFFI(), + &write); + return output; +} +template +inline void temporal_rs::TimeZone::identifier_write(W& writeable) const { + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteTrait::Construct(writeable); + temporal_rs::capi::temporal_rs_TimeZone_identifier(this->AsFFI(), + &write); +} + +inline temporal_rs::diplomat::result temporal_rs::TimeZone::identifier_with_provider(const temporal_rs::Provider& p) const { + std::string output; + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteFromString(output); + auto result = temporal_rs::capi::temporal_rs_TimeZone_identifier_with_provider(this->AsFFI(), + p.AsFFI(), + &write); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok(std::move(output))) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} +template +inline temporal_rs::diplomat::result temporal_rs::TimeZone::identifier_with_provider_write(const temporal_rs::Provider& p, W& writeable) const { + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteTrait::Construct(writeable); + auto result = temporal_rs::capi::temporal_rs_TimeZone_identifier_with_provider(this->AsFFI(), + p.AsFFI(), + &write); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok()) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::TimeZone temporal_rs::TimeZone::utc() { + auto result = temporal_rs::capi::temporal_rs_TimeZone_utc(); + return temporal_rs::TimeZone::FromFFI(result); +} + +inline temporal_rs::diplomat::result temporal_rs::TimeZone::utc_with_provider(const temporal_rs::Provider& p) { + auto result = temporal_rs::capi::temporal_rs_TimeZone_utc_with_provider(p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok(temporal_rs::TimeZone::FromFFI(result.ok))) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::TimeZone temporal_rs::TimeZone::zero() { + auto result = temporal_rs::capi::temporal_rs_TimeZone_zero(); + return temporal_rs::TimeZone::FromFFI(result); +} + +inline temporal_rs::diplomat::result temporal_rs::TimeZone::primary_identifier() const { + auto result = temporal_rs::capi::temporal_rs_TimeZone_primary_identifier(this->AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok(temporal_rs::TimeZone::FromFFI(result.ok))) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result temporal_rs::TimeZone::primary_identifier_with_provider(const temporal_rs::Provider& p) const { + auto result = temporal_rs::capi::temporal_rs_TimeZone_primary_identifier_with_provider(this->AsFFI(), + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok(temporal_rs::TimeZone::FromFFI(result.ok))) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + + +inline temporal_rs::capi::TimeZone temporal_rs::TimeZone::AsFFI() const { + return temporal_rs::capi::TimeZone { + /* .offset_minutes = */ offset_minutes, + /* .resolved_id = */ resolved_id, + /* .normalized_id = */ normalized_id, + /* .is_iana_id = */ is_iana_id, + }; +} + +inline temporal_rs::TimeZone temporal_rs::TimeZone::FromFFI(temporal_rs::capi::TimeZone c_struct) { + return temporal_rs::TimeZone { + /* .offset_minutes = */ c_struct.offset_minutes, + /* .resolved_id = */ c_struct.resolved_id, + /* .normalized_id = */ c_struct.normalized_id, + /* .is_iana_id = */ c_struct.is_iana_id, + }; +} + + +#endif // TEMPORAL_RS_TimeZone_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ToStringRoundingOptions.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ToStringRoundingOptions.d.hpp new file mode 100644 index 00000000000000..0b39d46615b591 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ToStringRoundingOptions.d.hpp @@ -0,0 +1,48 @@ +#ifndef TEMPORAL_RS_ToStringRoundingOptions_D_HPP +#define TEMPORAL_RS_ToStringRoundingOptions_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "Precision.d.hpp" +#include "RoundingMode.d.hpp" +#include "Unit.d.hpp" +#include "diplomat_runtime.hpp" +namespace temporal_rs { +struct Precision; +class RoundingMode; +class Unit; +} // namespace temporal_rs + + + +namespace temporal_rs { +namespace capi { + struct ToStringRoundingOptions { + temporal_rs::capi::Precision precision; + temporal_rs::capi::Unit_option smallest_unit; + temporal_rs::capi::RoundingMode_option rounding_mode; + }; + + typedef struct ToStringRoundingOptions_option {union { ToStringRoundingOptions ok; }; bool is_ok; } ToStringRoundingOptions_option; +} // namespace capi +} // namespace + + +namespace temporal_rs { +struct ToStringRoundingOptions { + temporal_rs::Precision precision; + std::optional smallest_unit; + std::optional rounding_mode; + + inline temporal_rs::capi::ToStringRoundingOptions AsFFI() const; + inline static temporal_rs::ToStringRoundingOptions FromFFI(temporal_rs::capi::ToStringRoundingOptions c_struct); +}; + +} // namespace +#endif // TEMPORAL_RS_ToStringRoundingOptions_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ToStringRoundingOptions.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ToStringRoundingOptions.hpp new file mode 100644 index 00000000000000..e34ebefb8f596f --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ToStringRoundingOptions.hpp @@ -0,0 +1,46 @@ +#ifndef TEMPORAL_RS_ToStringRoundingOptions_HPP +#define TEMPORAL_RS_ToStringRoundingOptions_HPP + +#include "ToStringRoundingOptions.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "Precision.hpp" +#include "RoundingMode.hpp" +#include "Unit.hpp" +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + } // extern "C" +} // namespace capi +} // namespace + + +inline temporal_rs::capi::ToStringRoundingOptions temporal_rs::ToStringRoundingOptions::AsFFI() const { + return temporal_rs::capi::ToStringRoundingOptions { + /* .precision = */ precision.AsFFI(), + /* .smallest_unit = */ smallest_unit.has_value() ? (temporal_rs::capi::Unit_option{ { smallest_unit.value().AsFFI() }, true }) : (temporal_rs::capi::Unit_option{ {}, false }), + /* .rounding_mode = */ rounding_mode.has_value() ? (temporal_rs::capi::RoundingMode_option{ { rounding_mode.value().AsFFI() }, true }) : (temporal_rs::capi::RoundingMode_option{ {}, false }), + }; +} + +inline temporal_rs::ToStringRoundingOptions temporal_rs::ToStringRoundingOptions::FromFFI(temporal_rs::capi::ToStringRoundingOptions c_struct) { + return temporal_rs::ToStringRoundingOptions { + /* .precision = */ temporal_rs::Precision::FromFFI(c_struct.precision), + /* .smallest_unit = */ c_struct.smallest_unit.is_ok ? std::optional(temporal_rs::Unit::FromFFI(c_struct.smallest_unit.ok)) : std::nullopt, + /* .rounding_mode = */ c_struct.rounding_mode.is_ok ? std::optional(temporal_rs::RoundingMode::FromFFI(c_struct.rounding_mode.ok)) : std::nullopt, + }; +} + + +#endif // TEMPORAL_RS_ToStringRoundingOptions_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/TransitionDirection.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/TransitionDirection.d.hpp new file mode 100644 index 00000000000000..73a2be2a101605 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/TransitionDirection.d.hpp @@ -0,0 +1,49 @@ +#ifndef TEMPORAL_RS_TransitionDirection_D_HPP +#define TEMPORAL_RS_TransitionDirection_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + enum TransitionDirection { + TransitionDirection_Next = 0, + TransitionDirection_Previous = 1, + }; + + typedef struct TransitionDirection_option {union { TransitionDirection ok; }; bool is_ok; } TransitionDirection_option; +} // namespace capi +} // namespace + +namespace temporal_rs { +class TransitionDirection { +public: + enum Value { + Next = 0, + Previous = 1, + }; + + TransitionDirection(): value(Value::Next) {} + + // Implicit conversions between enum and ::Value + constexpr TransitionDirection(Value v) : value(v) {} + constexpr operator Value() const { return value; } + // Prevent usage as boolean value + explicit operator bool() const = delete; + + inline temporal_rs::capi::TransitionDirection AsFFI() const; + inline static temporal_rs::TransitionDirection FromFFI(temporal_rs::capi::TransitionDirection c_enum); +private: + Value value; +}; + +} // namespace +#endif // TEMPORAL_RS_TransitionDirection_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/TransitionDirection.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/TransitionDirection.hpp new file mode 100644 index 00000000000000..1241672350775b --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/TransitionDirection.hpp @@ -0,0 +1,38 @@ +#ifndef TEMPORAL_RS_TransitionDirection_HPP +#define TEMPORAL_RS_TransitionDirection_HPP + +#include "TransitionDirection.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + } // extern "C" +} // namespace capi +} // namespace + +inline temporal_rs::capi::TransitionDirection temporal_rs::TransitionDirection::AsFFI() const { + return static_cast(value); +} + +inline temporal_rs::TransitionDirection temporal_rs::TransitionDirection::FromFFI(temporal_rs::capi::TransitionDirection c_enum) { + switch (c_enum) { + case temporal_rs::capi::TransitionDirection_Next: + case temporal_rs::capi::TransitionDirection_Previous: + return static_cast(c_enum); + default: + std::abort(); + } +} +#endif // TEMPORAL_RS_TransitionDirection_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Unit.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Unit.d.hpp new file mode 100644 index 00000000000000..68cd1155102198 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Unit.d.hpp @@ -0,0 +1,67 @@ +#ifndef TEMPORAL_RS_Unit_D_HPP +#define TEMPORAL_RS_Unit_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + enum Unit { + Unit_Auto = 0, + Unit_Nanosecond = 1, + Unit_Microsecond = 2, + Unit_Millisecond = 3, + Unit_Second = 4, + Unit_Minute = 5, + Unit_Hour = 6, + Unit_Day = 7, + Unit_Week = 8, + Unit_Month = 9, + Unit_Year = 10, + }; + + typedef struct Unit_option {union { Unit ok; }; bool is_ok; } Unit_option; +} // namespace capi +} // namespace + +namespace temporal_rs { +class Unit { +public: + enum Value { + Auto = 0, + Nanosecond = 1, + Microsecond = 2, + Millisecond = 3, + Second = 4, + Minute = 5, + Hour = 6, + Day = 7, + Week = 8, + Month = 9, + Year = 10, + }; + + Unit(): value(Value::Auto) {} + + // Implicit conversions between enum and ::Value + constexpr Unit(Value v) : value(v) {} + constexpr operator Value() const { return value; } + // Prevent usage as boolean value + explicit operator bool() const = delete; + + inline temporal_rs::capi::Unit AsFFI() const; + inline static temporal_rs::Unit FromFFI(temporal_rs::capi::Unit c_enum); +private: + Value value; +}; + +} // namespace +#endif // TEMPORAL_RS_Unit_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Unit.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Unit.hpp new file mode 100644 index 00000000000000..6ab07392ce7c52 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/Unit.hpp @@ -0,0 +1,47 @@ +#ifndef TEMPORAL_RS_Unit_HPP +#define TEMPORAL_RS_Unit_HPP + +#include "Unit.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + } // extern "C" +} // namespace capi +} // namespace + +inline temporal_rs::capi::Unit temporal_rs::Unit::AsFFI() const { + return static_cast(value); +} + +inline temporal_rs::Unit temporal_rs::Unit::FromFFI(temporal_rs::capi::Unit c_enum) { + switch (c_enum) { + case temporal_rs::capi::Unit_Auto: + case temporal_rs::capi::Unit_Nanosecond: + case temporal_rs::capi::Unit_Microsecond: + case temporal_rs::capi::Unit_Millisecond: + case temporal_rs::capi::Unit_Second: + case temporal_rs::capi::Unit_Minute: + case temporal_rs::capi::Unit_Hour: + case temporal_rs::capi::Unit_Day: + case temporal_rs::capi::Unit_Week: + case temporal_rs::capi::Unit_Month: + case temporal_rs::capi::Unit_Year: + return static_cast(c_enum); + default: + std::abort(); + } +} +#endif // TEMPORAL_RS_Unit_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/UnsignedRoundingMode.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/UnsignedRoundingMode.d.hpp new file mode 100644 index 00000000000000..b6e3d1a544295a --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/UnsignedRoundingMode.d.hpp @@ -0,0 +1,55 @@ +#ifndef TEMPORAL_RS_UnsignedRoundingMode_D_HPP +#define TEMPORAL_RS_UnsignedRoundingMode_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + enum UnsignedRoundingMode { + UnsignedRoundingMode_Infinity = 0, + UnsignedRoundingMode_Zero = 1, + UnsignedRoundingMode_HalfInfinity = 2, + UnsignedRoundingMode_HalfZero = 3, + UnsignedRoundingMode_HalfEven = 4, + }; + + typedef struct UnsignedRoundingMode_option {union { UnsignedRoundingMode ok; }; bool is_ok; } UnsignedRoundingMode_option; +} // namespace capi +} // namespace + +namespace temporal_rs { +class UnsignedRoundingMode { +public: + enum Value { + Infinity = 0, + Zero = 1, + HalfInfinity = 2, + HalfZero = 3, + HalfEven = 4, + }; + + UnsignedRoundingMode(): value(Value::Infinity) {} + + // Implicit conversions between enum and ::Value + constexpr UnsignedRoundingMode(Value v) : value(v) {} + constexpr operator Value() const { return value; } + // Prevent usage as boolean value + explicit operator bool() const = delete; + + inline temporal_rs::capi::UnsignedRoundingMode AsFFI() const; + inline static temporal_rs::UnsignedRoundingMode FromFFI(temporal_rs::capi::UnsignedRoundingMode c_enum); +private: + Value value; +}; + +} // namespace +#endif // TEMPORAL_RS_UnsignedRoundingMode_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/UnsignedRoundingMode.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/UnsignedRoundingMode.hpp new file mode 100644 index 00000000000000..52f543b73934e3 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/UnsignedRoundingMode.hpp @@ -0,0 +1,41 @@ +#ifndef TEMPORAL_RS_UnsignedRoundingMode_HPP +#define TEMPORAL_RS_UnsignedRoundingMode_HPP + +#include "UnsignedRoundingMode.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + } // extern "C" +} // namespace capi +} // namespace + +inline temporal_rs::capi::UnsignedRoundingMode temporal_rs::UnsignedRoundingMode::AsFFI() const { + return static_cast(value); +} + +inline temporal_rs::UnsignedRoundingMode temporal_rs::UnsignedRoundingMode::FromFFI(temporal_rs::capi::UnsignedRoundingMode c_enum) { + switch (c_enum) { + case temporal_rs::capi::UnsignedRoundingMode_Infinity: + case temporal_rs::capi::UnsignedRoundingMode_Zero: + case temporal_rs::capi::UnsignedRoundingMode_HalfInfinity: + case temporal_rs::capi::UnsignedRoundingMode_HalfZero: + case temporal_rs::capi::UnsignedRoundingMode_HalfEven: + return static_cast(c_enum); + default: + std::abort(); + } +} +#endif // TEMPORAL_RS_UnsignedRoundingMode_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ZonedDateTime.d.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ZonedDateTime.d.hpp new file mode 100644 index 00000000000000..cdf2a0505bd8a6 --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ZonedDateTime.d.hpp @@ -0,0 +1,234 @@ +#ifndef TEMPORAL_RS_ZonedDateTime_D_HPP +#define TEMPORAL_RS_ZonedDateTime_D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "diplomat_runtime.hpp" +namespace temporal_rs { +namespace capi { struct Calendar; } +class Calendar; +namespace capi { struct Duration; } +class Duration; +namespace capi { struct Instant; } +class Instant; +namespace capi { struct ParsedZonedDateTime; } +class ParsedZonedDateTime; +namespace capi { struct PlainDate; } +class PlainDate; +namespace capi { struct PlainDateTime; } +class PlainDateTime; +namespace capi { struct PlainTime; } +class PlainTime; +namespace capi { struct Provider; } +class Provider; +namespace capi { struct ZonedDateTime; } +class ZonedDateTime; +struct DifferenceSettings; +struct I128Nanoseconds; +struct PartialZonedDateTime; +struct RoundingOptions; +struct TemporalError; +struct TimeZone; +struct ToStringRoundingOptions; +class AnyCalendarKind; +class ArithmeticOverflow; +class Disambiguation; +class DisplayCalendar; +class DisplayOffset; +class DisplayTimeZone; +class OffsetDisambiguation; +class TransitionDirection; +} // namespace temporal_rs + + + +namespace temporal_rs { +namespace capi { + struct ZonedDateTime; +} // namespace capi +} // namespace + +namespace temporal_rs { +class ZonedDateTime { +public: + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> try_new(temporal_rs::I128Nanoseconds nanosecond, temporal_rs::AnyCalendarKind calendar, temporal_rs::TimeZone time_zone); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> try_new_with_provider(temporal_rs::I128Nanoseconds nanosecond, temporal_rs::AnyCalendarKind calendar, temporal_rs::TimeZone time_zone, const temporal_rs::Provider& p); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_partial(temporal_rs::PartialZonedDateTime partial, std::optional overflow, std::optional disambiguation, std::optional offset_option); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_partial_with_provider(temporal_rs::PartialZonedDateTime partial, std::optional overflow, std::optional disambiguation, std::optional offset_option, const temporal_rs::Provider& p); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_parsed(const temporal_rs::ParsedZonedDateTime& parsed, temporal_rs::Disambiguation disambiguation, temporal_rs::OffsetDisambiguation offset_option); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_parsed_with_provider(const temporal_rs::ParsedZonedDateTime& parsed, temporal_rs::Disambiguation disambiguation, temporal_rs::OffsetDisambiguation offset_option, const temporal_rs::Provider& p); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_utf8(std::string_view s, temporal_rs::Disambiguation disambiguation, temporal_rs::OffsetDisambiguation offset_disambiguation); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_utf8_with_provider(std::string_view s, temporal_rs::Disambiguation disambiguation, temporal_rs::OffsetDisambiguation offset_disambiguation, const temporal_rs::Provider& p); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_utf16(std::u16string_view s, temporal_rs::Disambiguation disambiguation, temporal_rs::OffsetDisambiguation offset_disambiguation); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_utf16_with_provider(std::u16string_view s, temporal_rs::Disambiguation disambiguation, temporal_rs::OffsetDisambiguation offset_disambiguation, const temporal_rs::Provider& p); + + inline int64_t epoch_milliseconds() const; + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_epoch_milliseconds(int64_t ms, temporal_rs::TimeZone tz); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_epoch_milliseconds_with_provider(int64_t ms, temporal_rs::TimeZone tz, const temporal_rs::Provider& p); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_epoch_nanoseconds(temporal_rs::I128Nanoseconds ns, temporal_rs::TimeZone tz); + + inline static temporal_rs::diplomat::result, temporal_rs::TemporalError> from_epoch_nanoseconds_with_provider(temporal_rs::I128Nanoseconds ns, temporal_rs::TimeZone tz, const temporal_rs::Provider& p); + + inline temporal_rs::I128Nanoseconds epoch_nanoseconds() const; + + inline int64_t offset_nanoseconds() const; + + inline std::unique_ptr to_instant() const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> with(temporal_rs::PartialZonedDateTime partial, std::optional disambiguation, std::optional offset_option, std::optional overflow) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> with_with_provider(temporal_rs::PartialZonedDateTime partial, std::optional disambiguation, std::optional offset_option, std::optional overflow, const temporal_rs::Provider& p) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> with_timezone(temporal_rs::TimeZone zone) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> with_timezone_with_provider(temporal_rs::TimeZone zone, const temporal_rs::Provider& p) const; + + inline temporal_rs::TimeZone timezone() const; + + inline int8_t compare_instant(const temporal_rs::ZonedDateTime& other) const; + + inline bool equals(const temporal_rs::ZonedDateTime& other) const; + + inline temporal_rs::diplomat::result equals_with_provider(const temporal_rs::ZonedDateTime& other, const temporal_rs::Provider& p) const; + + inline temporal_rs::diplomat::result offset() const; + template + inline temporal_rs::diplomat::result offset_write(W& writeable_output) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> start_of_day() const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> start_of_day_with_provider(const temporal_rs::Provider& p) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> get_time_zone_transition(temporal_rs::TransitionDirection direction) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> get_time_zone_transition_with_provider(temporal_rs::TransitionDirection direction, const temporal_rs::Provider& p) const; + + inline temporal_rs::diplomat::result hours_in_day() const; + + inline temporal_rs::diplomat::result hours_in_day_with_provider(const temporal_rs::Provider& p) const; + + inline std::unique_ptr to_plain_datetime() const; + + inline std::unique_ptr to_plain_date() const; + + inline std::unique_ptr to_plain_time() const; + + inline temporal_rs::diplomat::result to_ixdtf_string(temporal_rs::DisplayOffset display_offset, temporal_rs::DisplayTimeZone display_timezone, temporal_rs::DisplayCalendar display_calendar, temporal_rs::ToStringRoundingOptions options) const; + template + inline temporal_rs::diplomat::result to_ixdtf_string_write(temporal_rs::DisplayOffset display_offset, temporal_rs::DisplayTimeZone display_timezone, temporal_rs::DisplayCalendar display_calendar, temporal_rs::ToStringRoundingOptions options, W& writeable_output) const; + + inline temporal_rs::diplomat::result to_ixdtf_string_with_provider(temporal_rs::DisplayOffset display_offset, temporal_rs::DisplayTimeZone display_timezone, temporal_rs::DisplayCalendar display_calendar, temporal_rs::ToStringRoundingOptions options, const temporal_rs::Provider& p) const; + template + inline temporal_rs::diplomat::result to_ixdtf_string_with_provider_write(temporal_rs::DisplayOffset display_offset, temporal_rs::DisplayTimeZone display_timezone, temporal_rs::DisplayCalendar display_calendar, temporal_rs::ToStringRoundingOptions options, const temporal_rs::Provider& p, W& writeable_output) const; + + inline std::unique_ptr with_calendar(temporal_rs::AnyCalendarKind calendar) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> with_plain_time(const temporal_rs::PlainTime* time) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> with_plain_time_and_provider(const temporal_rs::PlainTime* time, const temporal_rs::Provider& p) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> add(const temporal_rs::Duration& duration, std::optional overflow) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> add_with_provider(const temporal_rs::Duration& duration, std::optional overflow, const temporal_rs::Provider& p) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> subtract(const temporal_rs::Duration& duration, std::optional overflow) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> subtract_with_provider(const temporal_rs::Duration& duration, std::optional overflow, const temporal_rs::Provider& p) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> until(const temporal_rs::ZonedDateTime& other, temporal_rs::DifferenceSettings settings) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> until_with_provider(const temporal_rs::ZonedDateTime& other, temporal_rs::DifferenceSettings settings, const temporal_rs::Provider& p) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> since(const temporal_rs::ZonedDateTime& other, temporal_rs::DifferenceSettings settings) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> since_with_provider(const temporal_rs::ZonedDateTime& other, temporal_rs::DifferenceSettings settings, const temporal_rs::Provider& p) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> round(temporal_rs::RoundingOptions options) const; + + inline temporal_rs::diplomat::result, temporal_rs::TemporalError> round_with_provider(temporal_rs::RoundingOptions options, const temporal_rs::Provider& p) const; + + inline uint8_t hour() const; + + inline uint8_t minute() const; + + inline uint8_t second() const; + + inline uint16_t millisecond() const; + + inline uint16_t microsecond() const; + + inline uint16_t nanosecond() const; + + inline const temporal_rs::Calendar& calendar() const; + + inline int32_t year() const; + + inline uint8_t month() const; + + inline std::string month_code() const; + template + inline void month_code_write(W& writeable_output) const; + + inline uint8_t day() const; + + inline uint16_t day_of_week() const; + + inline uint16_t day_of_year() const; + + inline std::optional week_of_year() const; + + inline std::optional year_of_week() const; + + inline uint16_t days_in_week() const; + + inline uint16_t days_in_month() const; + + inline uint16_t days_in_year() const; + + inline uint16_t months_in_year() const; + + inline bool in_leap_year() const; + + inline std::string era() const; + template + inline void era_write(W& writeable_output) const; + + inline std::optional era_year() const; + + inline std::unique_ptr clone() const; + + inline const temporal_rs::capi::ZonedDateTime* AsFFI() const; + inline temporal_rs::capi::ZonedDateTime* AsFFI(); + inline static const temporal_rs::ZonedDateTime* FromFFI(const temporal_rs::capi::ZonedDateTime* ptr); + inline static temporal_rs::ZonedDateTime* FromFFI(temporal_rs::capi::ZonedDateTime* ptr); + inline static void operator delete(void* ptr); +private: + ZonedDateTime() = delete; + ZonedDateTime(const temporal_rs::ZonedDateTime&) = delete; + ZonedDateTime(temporal_rs::ZonedDateTime&&) noexcept = delete; + ZonedDateTime operator=(const temporal_rs::ZonedDateTime&) = delete; + ZonedDateTime operator=(temporal_rs::ZonedDateTime&&) noexcept = delete; + static void operator delete[](void*, size_t) = delete; +}; + +} // namespace +#endif // TEMPORAL_RS_ZonedDateTime_D_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ZonedDateTime.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ZonedDateTime.hpp new file mode 100644 index 00000000000000..350a92bc22d6bc --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/ZonedDateTime.hpp @@ -0,0 +1,779 @@ +#ifndef TEMPORAL_RS_ZonedDateTime_HPP +#define TEMPORAL_RS_ZonedDateTime_HPP + +#include "ZonedDateTime.d.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "AnyCalendarKind.hpp" +#include "ArithmeticOverflow.hpp" +#include "Calendar.hpp" +#include "DifferenceSettings.hpp" +#include "Disambiguation.hpp" +#include "DisplayCalendar.hpp" +#include "DisplayOffset.hpp" +#include "DisplayTimeZone.hpp" +#include "Duration.hpp" +#include "I128Nanoseconds.hpp" +#include "Instant.hpp" +#include "OffsetDisambiguation.hpp" +#include "ParsedZonedDateTime.hpp" +#include "PartialZonedDateTime.hpp" +#include "PlainDate.hpp" +#include "PlainDateTime.hpp" +#include "PlainTime.hpp" +#include "Provider.hpp" +#include "RoundingOptions.hpp" +#include "TemporalError.hpp" +#include "TimeZone.hpp" +#include "ToStringRoundingOptions.hpp" +#include "TransitionDirection.hpp" +#include "diplomat_runtime.hpp" + + +namespace temporal_rs { +namespace capi { + extern "C" { + + typedef struct temporal_rs_ZonedDateTime_try_new_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_try_new_result; + temporal_rs_ZonedDateTime_try_new_result temporal_rs_ZonedDateTime_try_new(temporal_rs::capi::I128Nanoseconds nanosecond, temporal_rs::capi::AnyCalendarKind calendar, temporal_rs::capi::TimeZone time_zone); + + typedef struct temporal_rs_ZonedDateTime_try_new_with_provider_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_try_new_with_provider_result; + temporal_rs_ZonedDateTime_try_new_with_provider_result temporal_rs_ZonedDateTime_try_new_with_provider(temporal_rs::capi::I128Nanoseconds nanosecond, temporal_rs::capi::AnyCalendarKind calendar, temporal_rs::capi::TimeZone time_zone, const temporal_rs::capi::Provider* p); + + typedef struct temporal_rs_ZonedDateTime_from_partial_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_from_partial_result; + temporal_rs_ZonedDateTime_from_partial_result temporal_rs_ZonedDateTime_from_partial(temporal_rs::capi::PartialZonedDateTime partial, temporal_rs::capi::ArithmeticOverflow_option overflow, temporal_rs::capi::Disambiguation_option disambiguation, temporal_rs::capi::OffsetDisambiguation_option offset_option); + + typedef struct temporal_rs_ZonedDateTime_from_partial_with_provider_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_from_partial_with_provider_result; + temporal_rs_ZonedDateTime_from_partial_with_provider_result temporal_rs_ZonedDateTime_from_partial_with_provider(temporal_rs::capi::PartialZonedDateTime partial, temporal_rs::capi::ArithmeticOverflow_option overflow, temporal_rs::capi::Disambiguation_option disambiguation, temporal_rs::capi::OffsetDisambiguation_option offset_option, const temporal_rs::capi::Provider* p); + + typedef struct temporal_rs_ZonedDateTime_from_parsed_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_from_parsed_result; + temporal_rs_ZonedDateTime_from_parsed_result temporal_rs_ZonedDateTime_from_parsed(const temporal_rs::capi::ParsedZonedDateTime* parsed, temporal_rs::capi::Disambiguation disambiguation, temporal_rs::capi::OffsetDisambiguation offset_option); + + typedef struct temporal_rs_ZonedDateTime_from_parsed_with_provider_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_from_parsed_with_provider_result; + temporal_rs_ZonedDateTime_from_parsed_with_provider_result temporal_rs_ZonedDateTime_from_parsed_with_provider(const temporal_rs::capi::ParsedZonedDateTime* parsed, temporal_rs::capi::Disambiguation disambiguation, temporal_rs::capi::OffsetDisambiguation offset_option, const temporal_rs::capi::Provider* p); + + typedef struct temporal_rs_ZonedDateTime_from_utf8_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_from_utf8_result; + temporal_rs_ZonedDateTime_from_utf8_result temporal_rs_ZonedDateTime_from_utf8(temporal_rs::diplomat::capi::DiplomatStringView s, temporal_rs::capi::Disambiguation disambiguation, temporal_rs::capi::OffsetDisambiguation offset_disambiguation); + + typedef struct temporal_rs_ZonedDateTime_from_utf8_with_provider_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_from_utf8_with_provider_result; + temporal_rs_ZonedDateTime_from_utf8_with_provider_result temporal_rs_ZonedDateTime_from_utf8_with_provider(temporal_rs::diplomat::capi::DiplomatStringView s, temporal_rs::capi::Disambiguation disambiguation, temporal_rs::capi::OffsetDisambiguation offset_disambiguation, const temporal_rs::capi::Provider* p); + + typedef struct temporal_rs_ZonedDateTime_from_utf16_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_from_utf16_result; + temporal_rs_ZonedDateTime_from_utf16_result temporal_rs_ZonedDateTime_from_utf16(temporal_rs::diplomat::capi::DiplomatString16View s, temporal_rs::capi::Disambiguation disambiguation, temporal_rs::capi::OffsetDisambiguation offset_disambiguation); + + typedef struct temporal_rs_ZonedDateTime_from_utf16_with_provider_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_from_utf16_with_provider_result; + temporal_rs_ZonedDateTime_from_utf16_with_provider_result temporal_rs_ZonedDateTime_from_utf16_with_provider(temporal_rs::diplomat::capi::DiplomatString16View s, temporal_rs::capi::Disambiguation disambiguation, temporal_rs::capi::OffsetDisambiguation offset_disambiguation, const temporal_rs::capi::Provider* p); + + int64_t temporal_rs_ZonedDateTime_epoch_milliseconds(const temporal_rs::capi::ZonedDateTime* self); + + typedef struct temporal_rs_ZonedDateTime_from_epoch_milliseconds_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_from_epoch_milliseconds_result; + temporal_rs_ZonedDateTime_from_epoch_milliseconds_result temporal_rs_ZonedDateTime_from_epoch_milliseconds(int64_t ms, temporal_rs::capi::TimeZone tz); + + typedef struct temporal_rs_ZonedDateTime_from_epoch_milliseconds_with_provider_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_from_epoch_milliseconds_with_provider_result; + temporal_rs_ZonedDateTime_from_epoch_milliseconds_with_provider_result temporal_rs_ZonedDateTime_from_epoch_milliseconds_with_provider(int64_t ms, temporal_rs::capi::TimeZone tz, const temporal_rs::capi::Provider* p); + + typedef struct temporal_rs_ZonedDateTime_from_epoch_nanoseconds_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_from_epoch_nanoseconds_result; + temporal_rs_ZonedDateTime_from_epoch_nanoseconds_result temporal_rs_ZonedDateTime_from_epoch_nanoseconds(temporal_rs::capi::I128Nanoseconds ns, temporal_rs::capi::TimeZone tz); + + typedef struct temporal_rs_ZonedDateTime_from_epoch_nanoseconds_with_provider_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_from_epoch_nanoseconds_with_provider_result; + temporal_rs_ZonedDateTime_from_epoch_nanoseconds_with_provider_result temporal_rs_ZonedDateTime_from_epoch_nanoseconds_with_provider(temporal_rs::capi::I128Nanoseconds ns, temporal_rs::capi::TimeZone tz, const temporal_rs::capi::Provider* p); + + temporal_rs::capi::I128Nanoseconds temporal_rs_ZonedDateTime_epoch_nanoseconds(const temporal_rs::capi::ZonedDateTime* self); + + int64_t temporal_rs_ZonedDateTime_offset_nanoseconds(const temporal_rs::capi::ZonedDateTime* self); + + temporal_rs::capi::Instant* temporal_rs_ZonedDateTime_to_instant(const temporal_rs::capi::ZonedDateTime* self); + + typedef struct temporal_rs_ZonedDateTime_with_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_with_result; + temporal_rs_ZonedDateTime_with_result temporal_rs_ZonedDateTime_with(const temporal_rs::capi::ZonedDateTime* self, temporal_rs::capi::PartialZonedDateTime partial, temporal_rs::capi::Disambiguation_option disambiguation, temporal_rs::capi::OffsetDisambiguation_option offset_option, temporal_rs::capi::ArithmeticOverflow_option overflow); + + typedef struct temporal_rs_ZonedDateTime_with_with_provider_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_with_with_provider_result; + temporal_rs_ZonedDateTime_with_with_provider_result temporal_rs_ZonedDateTime_with_with_provider(const temporal_rs::capi::ZonedDateTime* self, temporal_rs::capi::PartialZonedDateTime partial, temporal_rs::capi::Disambiguation_option disambiguation, temporal_rs::capi::OffsetDisambiguation_option offset_option, temporal_rs::capi::ArithmeticOverflow_option overflow, const temporal_rs::capi::Provider* p); + + typedef struct temporal_rs_ZonedDateTime_with_timezone_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_with_timezone_result; + temporal_rs_ZonedDateTime_with_timezone_result temporal_rs_ZonedDateTime_with_timezone(const temporal_rs::capi::ZonedDateTime* self, temporal_rs::capi::TimeZone zone); + + typedef struct temporal_rs_ZonedDateTime_with_timezone_with_provider_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_with_timezone_with_provider_result; + temporal_rs_ZonedDateTime_with_timezone_with_provider_result temporal_rs_ZonedDateTime_with_timezone_with_provider(const temporal_rs::capi::ZonedDateTime* self, temporal_rs::capi::TimeZone zone, const temporal_rs::capi::Provider* p); + + temporal_rs::capi::TimeZone temporal_rs_ZonedDateTime_timezone(const temporal_rs::capi::ZonedDateTime* self); + + int8_t temporal_rs_ZonedDateTime_compare_instant(const temporal_rs::capi::ZonedDateTime* self, const temporal_rs::capi::ZonedDateTime* other); + + bool temporal_rs_ZonedDateTime_equals(const temporal_rs::capi::ZonedDateTime* self, const temporal_rs::capi::ZonedDateTime* other); + + typedef struct temporal_rs_ZonedDateTime_equals_with_provider_result {union {bool ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_equals_with_provider_result; + temporal_rs_ZonedDateTime_equals_with_provider_result temporal_rs_ZonedDateTime_equals_with_provider(const temporal_rs::capi::ZonedDateTime* self, const temporal_rs::capi::ZonedDateTime* other, const temporal_rs::capi::Provider* p); + + typedef struct temporal_rs_ZonedDateTime_offset_result {union { temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_offset_result; + temporal_rs_ZonedDateTime_offset_result temporal_rs_ZonedDateTime_offset(const temporal_rs::capi::ZonedDateTime* self, temporal_rs::diplomat::capi::DiplomatWrite* write); + + typedef struct temporal_rs_ZonedDateTime_start_of_day_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_start_of_day_result; + temporal_rs_ZonedDateTime_start_of_day_result temporal_rs_ZonedDateTime_start_of_day(const temporal_rs::capi::ZonedDateTime* self); + + typedef struct temporal_rs_ZonedDateTime_start_of_day_with_provider_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_start_of_day_with_provider_result; + temporal_rs_ZonedDateTime_start_of_day_with_provider_result temporal_rs_ZonedDateTime_start_of_day_with_provider(const temporal_rs::capi::ZonedDateTime* self, const temporal_rs::capi::Provider* p); + + typedef struct temporal_rs_ZonedDateTime_get_time_zone_transition_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_get_time_zone_transition_result; + temporal_rs_ZonedDateTime_get_time_zone_transition_result temporal_rs_ZonedDateTime_get_time_zone_transition(const temporal_rs::capi::ZonedDateTime* self, temporal_rs::capi::TransitionDirection direction); + + typedef struct temporal_rs_ZonedDateTime_get_time_zone_transition_with_provider_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_get_time_zone_transition_with_provider_result; + temporal_rs_ZonedDateTime_get_time_zone_transition_with_provider_result temporal_rs_ZonedDateTime_get_time_zone_transition_with_provider(const temporal_rs::capi::ZonedDateTime* self, temporal_rs::capi::TransitionDirection direction, const temporal_rs::capi::Provider* p); + + typedef struct temporal_rs_ZonedDateTime_hours_in_day_result {union {double ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_hours_in_day_result; + temporal_rs_ZonedDateTime_hours_in_day_result temporal_rs_ZonedDateTime_hours_in_day(const temporal_rs::capi::ZonedDateTime* self); + + typedef struct temporal_rs_ZonedDateTime_hours_in_day_with_provider_result {union {double ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_hours_in_day_with_provider_result; + temporal_rs_ZonedDateTime_hours_in_day_with_provider_result temporal_rs_ZonedDateTime_hours_in_day_with_provider(const temporal_rs::capi::ZonedDateTime* self, const temporal_rs::capi::Provider* p); + + temporal_rs::capi::PlainDateTime* temporal_rs_ZonedDateTime_to_plain_datetime(const temporal_rs::capi::ZonedDateTime* self); + + temporal_rs::capi::PlainDate* temporal_rs_ZonedDateTime_to_plain_date(const temporal_rs::capi::ZonedDateTime* self); + + temporal_rs::capi::PlainTime* temporal_rs_ZonedDateTime_to_plain_time(const temporal_rs::capi::ZonedDateTime* self); + + typedef struct temporal_rs_ZonedDateTime_to_ixdtf_string_result {union { temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_to_ixdtf_string_result; + temporal_rs_ZonedDateTime_to_ixdtf_string_result temporal_rs_ZonedDateTime_to_ixdtf_string(const temporal_rs::capi::ZonedDateTime* self, temporal_rs::capi::DisplayOffset display_offset, temporal_rs::capi::DisplayTimeZone display_timezone, temporal_rs::capi::DisplayCalendar display_calendar, temporal_rs::capi::ToStringRoundingOptions options, temporal_rs::diplomat::capi::DiplomatWrite* write); + + typedef struct temporal_rs_ZonedDateTime_to_ixdtf_string_with_provider_result {union { temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_to_ixdtf_string_with_provider_result; + temporal_rs_ZonedDateTime_to_ixdtf_string_with_provider_result temporal_rs_ZonedDateTime_to_ixdtf_string_with_provider(const temporal_rs::capi::ZonedDateTime* self, temporal_rs::capi::DisplayOffset display_offset, temporal_rs::capi::DisplayTimeZone display_timezone, temporal_rs::capi::DisplayCalendar display_calendar, temporal_rs::capi::ToStringRoundingOptions options, const temporal_rs::capi::Provider* p, temporal_rs::diplomat::capi::DiplomatWrite* write); + + temporal_rs::capi::ZonedDateTime* temporal_rs_ZonedDateTime_with_calendar(const temporal_rs::capi::ZonedDateTime* self, temporal_rs::capi::AnyCalendarKind calendar); + + typedef struct temporal_rs_ZonedDateTime_with_plain_time_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_with_plain_time_result; + temporal_rs_ZonedDateTime_with_plain_time_result temporal_rs_ZonedDateTime_with_plain_time(const temporal_rs::capi::ZonedDateTime* self, const temporal_rs::capi::PlainTime* time); + + typedef struct temporal_rs_ZonedDateTime_with_plain_time_and_provider_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_with_plain_time_and_provider_result; + temporal_rs_ZonedDateTime_with_plain_time_and_provider_result temporal_rs_ZonedDateTime_with_plain_time_and_provider(const temporal_rs::capi::ZonedDateTime* self, const temporal_rs::capi::PlainTime* time, const temporal_rs::capi::Provider* p); + + typedef struct temporal_rs_ZonedDateTime_add_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_add_result; + temporal_rs_ZonedDateTime_add_result temporal_rs_ZonedDateTime_add(const temporal_rs::capi::ZonedDateTime* self, const temporal_rs::capi::Duration* duration, temporal_rs::capi::ArithmeticOverflow_option overflow); + + typedef struct temporal_rs_ZonedDateTime_add_with_provider_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_add_with_provider_result; + temporal_rs_ZonedDateTime_add_with_provider_result temporal_rs_ZonedDateTime_add_with_provider(const temporal_rs::capi::ZonedDateTime* self, const temporal_rs::capi::Duration* duration, temporal_rs::capi::ArithmeticOverflow_option overflow, const temporal_rs::capi::Provider* p); + + typedef struct temporal_rs_ZonedDateTime_subtract_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_subtract_result; + temporal_rs_ZonedDateTime_subtract_result temporal_rs_ZonedDateTime_subtract(const temporal_rs::capi::ZonedDateTime* self, const temporal_rs::capi::Duration* duration, temporal_rs::capi::ArithmeticOverflow_option overflow); + + typedef struct temporal_rs_ZonedDateTime_subtract_with_provider_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_subtract_with_provider_result; + temporal_rs_ZonedDateTime_subtract_with_provider_result temporal_rs_ZonedDateTime_subtract_with_provider(const temporal_rs::capi::ZonedDateTime* self, const temporal_rs::capi::Duration* duration, temporal_rs::capi::ArithmeticOverflow_option overflow, const temporal_rs::capi::Provider* p); + + typedef struct temporal_rs_ZonedDateTime_until_result {union {temporal_rs::capi::Duration* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_until_result; + temporal_rs_ZonedDateTime_until_result temporal_rs_ZonedDateTime_until(const temporal_rs::capi::ZonedDateTime* self, const temporal_rs::capi::ZonedDateTime* other, temporal_rs::capi::DifferenceSettings settings); + + typedef struct temporal_rs_ZonedDateTime_until_with_provider_result {union {temporal_rs::capi::Duration* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_until_with_provider_result; + temporal_rs_ZonedDateTime_until_with_provider_result temporal_rs_ZonedDateTime_until_with_provider(const temporal_rs::capi::ZonedDateTime* self, const temporal_rs::capi::ZonedDateTime* other, temporal_rs::capi::DifferenceSettings settings, const temporal_rs::capi::Provider* p); + + typedef struct temporal_rs_ZonedDateTime_since_result {union {temporal_rs::capi::Duration* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_since_result; + temporal_rs_ZonedDateTime_since_result temporal_rs_ZonedDateTime_since(const temporal_rs::capi::ZonedDateTime* self, const temporal_rs::capi::ZonedDateTime* other, temporal_rs::capi::DifferenceSettings settings); + + typedef struct temporal_rs_ZonedDateTime_since_with_provider_result {union {temporal_rs::capi::Duration* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_since_with_provider_result; + temporal_rs_ZonedDateTime_since_with_provider_result temporal_rs_ZonedDateTime_since_with_provider(const temporal_rs::capi::ZonedDateTime* self, const temporal_rs::capi::ZonedDateTime* other, temporal_rs::capi::DifferenceSettings settings, const temporal_rs::capi::Provider* p); + + typedef struct temporal_rs_ZonedDateTime_round_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_round_result; + temporal_rs_ZonedDateTime_round_result temporal_rs_ZonedDateTime_round(const temporal_rs::capi::ZonedDateTime* self, temporal_rs::capi::RoundingOptions options); + + typedef struct temporal_rs_ZonedDateTime_round_with_provider_result {union {temporal_rs::capi::ZonedDateTime* ok; temporal_rs::capi::TemporalError err;}; bool is_ok;} temporal_rs_ZonedDateTime_round_with_provider_result; + temporal_rs_ZonedDateTime_round_with_provider_result temporal_rs_ZonedDateTime_round_with_provider(const temporal_rs::capi::ZonedDateTime* self, temporal_rs::capi::RoundingOptions options, const temporal_rs::capi::Provider* p); + + uint8_t temporal_rs_ZonedDateTime_hour(const temporal_rs::capi::ZonedDateTime* self); + + uint8_t temporal_rs_ZonedDateTime_minute(const temporal_rs::capi::ZonedDateTime* self); + + uint8_t temporal_rs_ZonedDateTime_second(const temporal_rs::capi::ZonedDateTime* self); + + uint16_t temporal_rs_ZonedDateTime_millisecond(const temporal_rs::capi::ZonedDateTime* self); + + uint16_t temporal_rs_ZonedDateTime_microsecond(const temporal_rs::capi::ZonedDateTime* self); + + uint16_t temporal_rs_ZonedDateTime_nanosecond(const temporal_rs::capi::ZonedDateTime* self); + + const temporal_rs::capi::Calendar* temporal_rs_ZonedDateTime_calendar(const temporal_rs::capi::ZonedDateTime* self); + + int32_t temporal_rs_ZonedDateTime_year(const temporal_rs::capi::ZonedDateTime* self); + + uint8_t temporal_rs_ZonedDateTime_month(const temporal_rs::capi::ZonedDateTime* self); + + void temporal_rs_ZonedDateTime_month_code(const temporal_rs::capi::ZonedDateTime* self, temporal_rs::diplomat::capi::DiplomatWrite* write); + + uint8_t temporal_rs_ZonedDateTime_day(const temporal_rs::capi::ZonedDateTime* self); + + uint16_t temporal_rs_ZonedDateTime_day_of_week(const temporal_rs::capi::ZonedDateTime* self); + + uint16_t temporal_rs_ZonedDateTime_day_of_year(const temporal_rs::capi::ZonedDateTime* self); + + typedef struct temporal_rs_ZonedDateTime_week_of_year_result {union {uint8_t ok; }; bool is_ok;} temporal_rs_ZonedDateTime_week_of_year_result; + temporal_rs_ZonedDateTime_week_of_year_result temporal_rs_ZonedDateTime_week_of_year(const temporal_rs::capi::ZonedDateTime* self); + + typedef struct temporal_rs_ZonedDateTime_year_of_week_result {union {int32_t ok; }; bool is_ok;} temporal_rs_ZonedDateTime_year_of_week_result; + temporal_rs_ZonedDateTime_year_of_week_result temporal_rs_ZonedDateTime_year_of_week(const temporal_rs::capi::ZonedDateTime* self); + + uint16_t temporal_rs_ZonedDateTime_days_in_week(const temporal_rs::capi::ZonedDateTime* self); + + uint16_t temporal_rs_ZonedDateTime_days_in_month(const temporal_rs::capi::ZonedDateTime* self); + + uint16_t temporal_rs_ZonedDateTime_days_in_year(const temporal_rs::capi::ZonedDateTime* self); + + uint16_t temporal_rs_ZonedDateTime_months_in_year(const temporal_rs::capi::ZonedDateTime* self); + + bool temporal_rs_ZonedDateTime_in_leap_year(const temporal_rs::capi::ZonedDateTime* self); + + void temporal_rs_ZonedDateTime_era(const temporal_rs::capi::ZonedDateTime* self, temporal_rs::diplomat::capi::DiplomatWrite* write); + + typedef struct temporal_rs_ZonedDateTime_era_year_result {union {int32_t ok; }; bool is_ok;} temporal_rs_ZonedDateTime_era_year_result; + temporal_rs_ZonedDateTime_era_year_result temporal_rs_ZonedDateTime_era_year(const temporal_rs::capi::ZonedDateTime* self); + + temporal_rs::capi::ZonedDateTime* temporal_rs_ZonedDateTime_clone(const temporal_rs::capi::ZonedDateTime* self); + + void temporal_rs_ZonedDateTime_destroy(ZonedDateTime* self); + + } // extern "C" +} // namespace capi +} // namespace + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::try_new(temporal_rs::I128Nanoseconds nanosecond, temporal_rs::AnyCalendarKind calendar, temporal_rs::TimeZone time_zone) { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_try_new(nanosecond.AsFFI(), + calendar.AsFFI(), + time_zone.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::try_new_with_provider(temporal_rs::I128Nanoseconds nanosecond, temporal_rs::AnyCalendarKind calendar, temporal_rs::TimeZone time_zone, const temporal_rs::Provider& p) { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_try_new_with_provider(nanosecond.AsFFI(), + calendar.AsFFI(), + time_zone.AsFFI(), + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::from_partial(temporal_rs::PartialZonedDateTime partial, std::optional overflow, std::optional disambiguation, std::optional offset_option) { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_from_partial(partial.AsFFI(), + overflow.has_value() ? (temporal_rs::capi::ArithmeticOverflow_option{ { overflow.value().AsFFI() }, true }) : (temporal_rs::capi::ArithmeticOverflow_option{ {}, false }), + disambiguation.has_value() ? (temporal_rs::capi::Disambiguation_option{ { disambiguation.value().AsFFI() }, true }) : (temporal_rs::capi::Disambiguation_option{ {}, false }), + offset_option.has_value() ? (temporal_rs::capi::OffsetDisambiguation_option{ { offset_option.value().AsFFI() }, true }) : (temporal_rs::capi::OffsetDisambiguation_option{ {}, false })); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::from_partial_with_provider(temporal_rs::PartialZonedDateTime partial, std::optional overflow, std::optional disambiguation, std::optional offset_option, const temporal_rs::Provider& p) { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_from_partial_with_provider(partial.AsFFI(), + overflow.has_value() ? (temporal_rs::capi::ArithmeticOverflow_option{ { overflow.value().AsFFI() }, true }) : (temporal_rs::capi::ArithmeticOverflow_option{ {}, false }), + disambiguation.has_value() ? (temporal_rs::capi::Disambiguation_option{ { disambiguation.value().AsFFI() }, true }) : (temporal_rs::capi::Disambiguation_option{ {}, false }), + offset_option.has_value() ? (temporal_rs::capi::OffsetDisambiguation_option{ { offset_option.value().AsFFI() }, true }) : (temporal_rs::capi::OffsetDisambiguation_option{ {}, false }), + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::from_parsed(const temporal_rs::ParsedZonedDateTime& parsed, temporal_rs::Disambiguation disambiguation, temporal_rs::OffsetDisambiguation offset_option) { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_from_parsed(parsed.AsFFI(), + disambiguation.AsFFI(), + offset_option.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::from_parsed_with_provider(const temporal_rs::ParsedZonedDateTime& parsed, temporal_rs::Disambiguation disambiguation, temporal_rs::OffsetDisambiguation offset_option, const temporal_rs::Provider& p) { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_from_parsed_with_provider(parsed.AsFFI(), + disambiguation.AsFFI(), + offset_option.AsFFI(), + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::from_utf8(std::string_view s, temporal_rs::Disambiguation disambiguation, temporal_rs::OffsetDisambiguation offset_disambiguation) { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_from_utf8({s.data(), s.size()}, + disambiguation.AsFFI(), + offset_disambiguation.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::from_utf8_with_provider(std::string_view s, temporal_rs::Disambiguation disambiguation, temporal_rs::OffsetDisambiguation offset_disambiguation, const temporal_rs::Provider& p) { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_from_utf8_with_provider({s.data(), s.size()}, + disambiguation.AsFFI(), + offset_disambiguation.AsFFI(), + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::from_utf16(std::u16string_view s, temporal_rs::Disambiguation disambiguation, temporal_rs::OffsetDisambiguation offset_disambiguation) { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_from_utf16({s.data(), s.size()}, + disambiguation.AsFFI(), + offset_disambiguation.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::from_utf16_with_provider(std::u16string_view s, temporal_rs::Disambiguation disambiguation, temporal_rs::OffsetDisambiguation offset_disambiguation, const temporal_rs::Provider& p) { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_from_utf16_with_provider({s.data(), s.size()}, + disambiguation.AsFFI(), + offset_disambiguation.AsFFI(), + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline int64_t temporal_rs::ZonedDateTime::epoch_milliseconds() const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_epoch_milliseconds(this->AsFFI()); + return result; +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::from_epoch_milliseconds(int64_t ms, temporal_rs::TimeZone tz) { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_from_epoch_milliseconds(ms, + tz.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::from_epoch_milliseconds_with_provider(int64_t ms, temporal_rs::TimeZone tz, const temporal_rs::Provider& p) { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_from_epoch_milliseconds_with_provider(ms, + tz.AsFFI(), + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::from_epoch_nanoseconds(temporal_rs::I128Nanoseconds ns, temporal_rs::TimeZone tz) { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_from_epoch_nanoseconds(ns.AsFFI(), + tz.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::from_epoch_nanoseconds_with_provider(temporal_rs::I128Nanoseconds ns, temporal_rs::TimeZone tz, const temporal_rs::Provider& p) { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_from_epoch_nanoseconds_with_provider(ns.AsFFI(), + tz.AsFFI(), + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::I128Nanoseconds temporal_rs::ZonedDateTime::epoch_nanoseconds() const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_epoch_nanoseconds(this->AsFFI()); + return temporal_rs::I128Nanoseconds::FromFFI(result); +} + +inline int64_t temporal_rs::ZonedDateTime::offset_nanoseconds() const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_offset_nanoseconds(this->AsFFI()); + return result; +} + +inline std::unique_ptr temporal_rs::ZonedDateTime::to_instant() const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_to_instant(this->AsFFI()); + return std::unique_ptr(temporal_rs::Instant::FromFFI(result)); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::with(temporal_rs::PartialZonedDateTime partial, std::optional disambiguation, std::optional offset_option, std::optional overflow) const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_with(this->AsFFI(), + partial.AsFFI(), + disambiguation.has_value() ? (temporal_rs::capi::Disambiguation_option{ { disambiguation.value().AsFFI() }, true }) : (temporal_rs::capi::Disambiguation_option{ {}, false }), + offset_option.has_value() ? (temporal_rs::capi::OffsetDisambiguation_option{ { offset_option.value().AsFFI() }, true }) : (temporal_rs::capi::OffsetDisambiguation_option{ {}, false }), + overflow.has_value() ? (temporal_rs::capi::ArithmeticOverflow_option{ { overflow.value().AsFFI() }, true }) : (temporal_rs::capi::ArithmeticOverflow_option{ {}, false })); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::with_with_provider(temporal_rs::PartialZonedDateTime partial, std::optional disambiguation, std::optional offset_option, std::optional overflow, const temporal_rs::Provider& p) const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_with_with_provider(this->AsFFI(), + partial.AsFFI(), + disambiguation.has_value() ? (temporal_rs::capi::Disambiguation_option{ { disambiguation.value().AsFFI() }, true }) : (temporal_rs::capi::Disambiguation_option{ {}, false }), + offset_option.has_value() ? (temporal_rs::capi::OffsetDisambiguation_option{ { offset_option.value().AsFFI() }, true }) : (temporal_rs::capi::OffsetDisambiguation_option{ {}, false }), + overflow.has_value() ? (temporal_rs::capi::ArithmeticOverflow_option{ { overflow.value().AsFFI() }, true }) : (temporal_rs::capi::ArithmeticOverflow_option{ {}, false }), + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::with_timezone(temporal_rs::TimeZone zone) const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_with_timezone(this->AsFFI(), + zone.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::with_timezone_with_provider(temporal_rs::TimeZone zone, const temporal_rs::Provider& p) const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_with_timezone_with_provider(this->AsFFI(), + zone.AsFFI(), + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::TimeZone temporal_rs::ZonedDateTime::timezone() const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_timezone(this->AsFFI()); + return temporal_rs::TimeZone::FromFFI(result); +} + +inline int8_t temporal_rs::ZonedDateTime::compare_instant(const temporal_rs::ZonedDateTime& other) const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_compare_instant(this->AsFFI(), + other.AsFFI()); + return result; +} + +inline bool temporal_rs::ZonedDateTime::equals(const temporal_rs::ZonedDateTime& other) const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_equals(this->AsFFI(), + other.AsFFI()); + return result; +} + +inline temporal_rs::diplomat::result temporal_rs::ZonedDateTime::equals_with_provider(const temporal_rs::ZonedDateTime& other, const temporal_rs::Provider& p) const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_equals_with_provider(this->AsFFI(), + other.AsFFI(), + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok(result.ok)) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result temporal_rs::ZonedDateTime::offset() const { + std::string output; + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteFromString(output); + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_offset(this->AsFFI(), + &write); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok(std::move(output))) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} +template +inline temporal_rs::diplomat::result temporal_rs::ZonedDateTime::offset_write(W& writeable) const { + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteTrait::Construct(writeable); + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_offset(this->AsFFI(), + &write); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok()) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::start_of_day() const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_start_of_day(this->AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::start_of_day_with_provider(const temporal_rs::Provider& p) const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_start_of_day_with_provider(this->AsFFI(), + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::get_time_zone_transition(temporal_rs::TransitionDirection direction) const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_get_time_zone_transition(this->AsFFI(), + direction.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::get_time_zone_transition_with_provider(temporal_rs::TransitionDirection direction, const temporal_rs::Provider& p) const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_get_time_zone_transition_with_provider(this->AsFFI(), + direction.AsFFI(), + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result temporal_rs::ZonedDateTime::hours_in_day() const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_hours_in_day(this->AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok(result.ok)) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result temporal_rs::ZonedDateTime::hours_in_day_with_provider(const temporal_rs::Provider& p) const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_hours_in_day_with_provider(this->AsFFI(), + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok(result.ok)) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline std::unique_ptr temporal_rs::ZonedDateTime::to_plain_datetime() const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_to_plain_datetime(this->AsFFI()); + return std::unique_ptr(temporal_rs::PlainDateTime::FromFFI(result)); +} + +inline std::unique_ptr temporal_rs::ZonedDateTime::to_plain_date() const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_to_plain_date(this->AsFFI()); + return std::unique_ptr(temporal_rs::PlainDate::FromFFI(result)); +} + +inline std::unique_ptr temporal_rs::ZonedDateTime::to_plain_time() const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_to_plain_time(this->AsFFI()); + return std::unique_ptr(temporal_rs::PlainTime::FromFFI(result)); +} + +inline temporal_rs::diplomat::result temporal_rs::ZonedDateTime::to_ixdtf_string(temporal_rs::DisplayOffset display_offset, temporal_rs::DisplayTimeZone display_timezone, temporal_rs::DisplayCalendar display_calendar, temporal_rs::ToStringRoundingOptions options) const { + std::string output; + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteFromString(output); + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_to_ixdtf_string(this->AsFFI(), + display_offset.AsFFI(), + display_timezone.AsFFI(), + display_calendar.AsFFI(), + options.AsFFI(), + &write); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok(std::move(output))) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} +template +inline temporal_rs::diplomat::result temporal_rs::ZonedDateTime::to_ixdtf_string_write(temporal_rs::DisplayOffset display_offset, temporal_rs::DisplayTimeZone display_timezone, temporal_rs::DisplayCalendar display_calendar, temporal_rs::ToStringRoundingOptions options, W& writeable) const { + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteTrait::Construct(writeable); + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_to_ixdtf_string(this->AsFFI(), + display_offset.AsFFI(), + display_timezone.AsFFI(), + display_calendar.AsFFI(), + options.AsFFI(), + &write); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok()) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result temporal_rs::ZonedDateTime::to_ixdtf_string_with_provider(temporal_rs::DisplayOffset display_offset, temporal_rs::DisplayTimeZone display_timezone, temporal_rs::DisplayCalendar display_calendar, temporal_rs::ToStringRoundingOptions options, const temporal_rs::Provider& p) const { + std::string output; + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteFromString(output); + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_to_ixdtf_string_with_provider(this->AsFFI(), + display_offset.AsFFI(), + display_timezone.AsFFI(), + display_calendar.AsFFI(), + options.AsFFI(), + p.AsFFI(), + &write); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok(std::move(output))) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} +template +inline temporal_rs::diplomat::result temporal_rs::ZonedDateTime::to_ixdtf_string_with_provider_write(temporal_rs::DisplayOffset display_offset, temporal_rs::DisplayTimeZone display_timezone, temporal_rs::DisplayCalendar display_calendar, temporal_rs::ToStringRoundingOptions options, const temporal_rs::Provider& p, W& writeable) const { + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteTrait::Construct(writeable); + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_to_ixdtf_string_with_provider(this->AsFFI(), + display_offset.AsFFI(), + display_timezone.AsFFI(), + display_calendar.AsFFI(), + options.AsFFI(), + p.AsFFI(), + &write); + return result.is_ok ? temporal_rs::diplomat::result(temporal_rs::diplomat::Ok()) : temporal_rs::diplomat::result(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline std::unique_ptr temporal_rs::ZonedDateTime::with_calendar(temporal_rs::AnyCalendarKind calendar) const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_with_calendar(this->AsFFI(), + calendar.AsFFI()); + return std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result)); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::with_plain_time(const temporal_rs::PlainTime* time) const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_with_plain_time(this->AsFFI(), + time ? time->AsFFI() : nullptr); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::with_plain_time_and_provider(const temporal_rs::PlainTime* time, const temporal_rs::Provider& p) const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_with_plain_time_and_provider(this->AsFFI(), + time ? time->AsFFI() : nullptr, + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::add(const temporal_rs::Duration& duration, std::optional overflow) const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_add(this->AsFFI(), + duration.AsFFI(), + overflow.has_value() ? (temporal_rs::capi::ArithmeticOverflow_option{ { overflow.value().AsFFI() }, true }) : (temporal_rs::capi::ArithmeticOverflow_option{ {}, false })); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::add_with_provider(const temporal_rs::Duration& duration, std::optional overflow, const temporal_rs::Provider& p) const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_add_with_provider(this->AsFFI(), + duration.AsFFI(), + overflow.has_value() ? (temporal_rs::capi::ArithmeticOverflow_option{ { overflow.value().AsFFI() }, true }) : (temporal_rs::capi::ArithmeticOverflow_option{ {}, false }), + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::subtract(const temporal_rs::Duration& duration, std::optional overflow) const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_subtract(this->AsFFI(), + duration.AsFFI(), + overflow.has_value() ? (temporal_rs::capi::ArithmeticOverflow_option{ { overflow.value().AsFFI() }, true }) : (temporal_rs::capi::ArithmeticOverflow_option{ {}, false })); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::subtract_with_provider(const temporal_rs::Duration& duration, std::optional overflow, const temporal_rs::Provider& p) const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_subtract_with_provider(this->AsFFI(), + duration.AsFFI(), + overflow.has_value() ? (temporal_rs::capi::ArithmeticOverflow_option{ { overflow.value().AsFFI() }, true }) : (temporal_rs::capi::ArithmeticOverflow_option{ {}, false }), + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::until(const temporal_rs::ZonedDateTime& other, temporal_rs::DifferenceSettings settings) const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_until(this->AsFFI(), + other.AsFFI(), + settings.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::Duration::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::until_with_provider(const temporal_rs::ZonedDateTime& other, temporal_rs::DifferenceSettings settings, const temporal_rs::Provider& p) const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_until_with_provider(this->AsFFI(), + other.AsFFI(), + settings.AsFFI(), + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::Duration::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::since(const temporal_rs::ZonedDateTime& other, temporal_rs::DifferenceSettings settings) const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_since(this->AsFFI(), + other.AsFFI(), + settings.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::Duration::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::since_with_provider(const temporal_rs::ZonedDateTime& other, temporal_rs::DifferenceSettings settings, const temporal_rs::Provider& p) const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_since_with_provider(this->AsFFI(), + other.AsFFI(), + settings.AsFFI(), + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::Duration::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::round(temporal_rs::RoundingOptions options) const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_round(this->AsFFI(), + options.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline temporal_rs::diplomat::result, temporal_rs::TemporalError> temporal_rs::ZonedDateTime::round_with_provider(temporal_rs::RoundingOptions options, const temporal_rs::Provider& p) const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_round_with_provider(this->AsFFI(), + options.AsFFI(), + p.AsFFI()); + return result.is_ok ? temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Ok>(std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result.ok)))) : temporal_rs::diplomat::result, temporal_rs::TemporalError>(temporal_rs::diplomat::Err(temporal_rs::TemporalError::FromFFI(result.err))); +} + +inline uint8_t temporal_rs::ZonedDateTime::hour() const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_hour(this->AsFFI()); + return result; +} + +inline uint8_t temporal_rs::ZonedDateTime::minute() const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_minute(this->AsFFI()); + return result; +} + +inline uint8_t temporal_rs::ZonedDateTime::second() const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_second(this->AsFFI()); + return result; +} + +inline uint16_t temporal_rs::ZonedDateTime::millisecond() const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_millisecond(this->AsFFI()); + return result; +} + +inline uint16_t temporal_rs::ZonedDateTime::microsecond() const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_microsecond(this->AsFFI()); + return result; +} + +inline uint16_t temporal_rs::ZonedDateTime::nanosecond() const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_nanosecond(this->AsFFI()); + return result; +} + +inline const temporal_rs::Calendar& temporal_rs::ZonedDateTime::calendar() const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_calendar(this->AsFFI()); + return *temporal_rs::Calendar::FromFFI(result); +} + +inline int32_t temporal_rs::ZonedDateTime::year() const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_year(this->AsFFI()); + return result; +} + +inline uint8_t temporal_rs::ZonedDateTime::month() const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_month(this->AsFFI()); + return result; +} + +inline std::string temporal_rs::ZonedDateTime::month_code() const { + std::string output; + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteFromString(output); + temporal_rs::capi::temporal_rs_ZonedDateTime_month_code(this->AsFFI(), + &write); + return output; +} +template +inline void temporal_rs::ZonedDateTime::month_code_write(W& writeable) const { + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteTrait::Construct(writeable); + temporal_rs::capi::temporal_rs_ZonedDateTime_month_code(this->AsFFI(), + &write); +} + +inline uint8_t temporal_rs::ZonedDateTime::day() const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_day(this->AsFFI()); + return result; +} + +inline uint16_t temporal_rs::ZonedDateTime::day_of_week() const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_day_of_week(this->AsFFI()); + return result; +} + +inline uint16_t temporal_rs::ZonedDateTime::day_of_year() const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_day_of_year(this->AsFFI()); + return result; +} + +inline std::optional temporal_rs::ZonedDateTime::week_of_year() const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_week_of_year(this->AsFFI()); + return result.is_ok ? std::optional(result.ok) : std::nullopt; +} + +inline std::optional temporal_rs::ZonedDateTime::year_of_week() const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_year_of_week(this->AsFFI()); + return result.is_ok ? std::optional(result.ok) : std::nullopt; +} + +inline uint16_t temporal_rs::ZonedDateTime::days_in_week() const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_days_in_week(this->AsFFI()); + return result; +} + +inline uint16_t temporal_rs::ZonedDateTime::days_in_month() const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_days_in_month(this->AsFFI()); + return result; +} + +inline uint16_t temporal_rs::ZonedDateTime::days_in_year() const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_days_in_year(this->AsFFI()); + return result; +} + +inline uint16_t temporal_rs::ZonedDateTime::months_in_year() const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_months_in_year(this->AsFFI()); + return result; +} + +inline bool temporal_rs::ZonedDateTime::in_leap_year() const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_in_leap_year(this->AsFFI()); + return result; +} + +inline std::string temporal_rs::ZonedDateTime::era() const { + std::string output; + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteFromString(output); + temporal_rs::capi::temporal_rs_ZonedDateTime_era(this->AsFFI(), + &write); + return output; +} +template +inline void temporal_rs::ZonedDateTime::era_write(W& writeable) const { + temporal_rs::diplomat::capi::DiplomatWrite write = temporal_rs::diplomat::WriteTrait::Construct(writeable); + temporal_rs::capi::temporal_rs_ZonedDateTime_era(this->AsFFI(), + &write); +} + +inline std::optional temporal_rs::ZonedDateTime::era_year() const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_era_year(this->AsFFI()); + return result.is_ok ? std::optional(result.ok) : std::nullopt; +} + +inline std::unique_ptr temporal_rs::ZonedDateTime::clone() const { + auto result = temporal_rs::capi::temporal_rs_ZonedDateTime_clone(this->AsFFI()); + return std::unique_ptr(temporal_rs::ZonedDateTime::FromFFI(result)); +} + +inline const temporal_rs::capi::ZonedDateTime* temporal_rs::ZonedDateTime::AsFFI() const { + return reinterpret_cast(this); +} + +inline temporal_rs::capi::ZonedDateTime* temporal_rs::ZonedDateTime::AsFFI() { + return reinterpret_cast(this); +} + +inline const temporal_rs::ZonedDateTime* temporal_rs::ZonedDateTime::FromFFI(const temporal_rs::capi::ZonedDateTime* ptr) { + return reinterpret_cast(ptr); +} + +inline temporal_rs::ZonedDateTime* temporal_rs::ZonedDateTime::FromFFI(temporal_rs::capi::ZonedDateTime* ptr) { + return reinterpret_cast(ptr); +} + +inline void temporal_rs::ZonedDateTime::operator delete(void* ptr) { + temporal_rs::capi::temporal_rs_ZonedDateTime_destroy(reinterpret_cast(ptr)); +} + + +#endif // TEMPORAL_RS_ZonedDateTime_HPP diff --git a/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/diplomat_runtime.hpp b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/diplomat_runtime.hpp new file mode 100644 index 00000000000000..1e32c8929c99cd --- /dev/null +++ b/deps/temporal/temporal_capi/bindings/cpp/temporal_rs/diplomat_runtime.hpp @@ -0,0 +1,566 @@ +#ifndef TEMPORAL_RS_DIPLOMAT_RUNTIME_CPP_H +#define TEMPORAL_RS_DIPLOMAT_RUNTIME_CPP_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#if __cplusplus >= 202002L +#include +#else +#include +#endif + +namespace temporal_rs { +namespace diplomat { + +namespace capi { +extern "C" { + +static_assert(sizeof(char) == sizeof(uint8_t), "your architecture's `char` is not 8 bits"); +static_assert(sizeof(char16_t) == sizeof(uint16_t), "your architecture's `char16_t` is not 16 bits"); +static_assert(sizeof(char32_t) == sizeof(uint32_t), "your architecture's `char32_t` is not 32 bits"); + +typedef struct DiplomatWrite { + void* context; + char* buf; + size_t len; + size_t cap; + bool grow_failed; + void (*flush)(struct DiplomatWrite*); + bool (*grow)(struct DiplomatWrite*, size_t); +} DiplomatWrite; + +bool diplomat_is_str(const char* buf, size_t len); + +#define MAKE_SLICES(name, c_ty) \ + typedef struct Diplomat##name##View { \ + const c_ty* data; \ + size_t len; \ + } Diplomat##name##View; \ + typedef struct Diplomat##name##ViewMut { \ + c_ty* data; \ + size_t len; \ + } Diplomat##name##ViewMut; \ + typedef struct Diplomat##name##Array { \ + const c_ty* data; \ + size_t len; \ + } Diplomat##name##Array; + +#define MAKE_SLICES_AND_OPTIONS(name, c_ty) \ + MAKE_SLICES(name, c_ty) \ + typedef struct Option##name {union { c_ty ok; }; bool is_ok; } Option##name; \ + typedef struct Option##name##View {union { Diplomat##name##View ok; }; bool is_ok; } Option##name##View; \ + typedef struct Option##name##ViewMut {union { Diplomat##name##ViewMut ok; }; bool is_ok; } Option##name##ViewMut; \ + typedef struct Option##name##Array {union { Diplomat##name##Array ok; }; bool is_ok; } Option##name##Array; \ + +MAKE_SLICES_AND_OPTIONS(I8, int8_t) +MAKE_SLICES_AND_OPTIONS(U8, uint8_t) +MAKE_SLICES_AND_OPTIONS(I16, int16_t) +MAKE_SLICES_AND_OPTIONS(U16, uint16_t) +MAKE_SLICES_AND_OPTIONS(I32, int32_t) +MAKE_SLICES_AND_OPTIONS(U32, uint32_t) +MAKE_SLICES_AND_OPTIONS(I64, int64_t) +MAKE_SLICES_AND_OPTIONS(U64, uint64_t) +MAKE_SLICES_AND_OPTIONS(Isize, intptr_t) +MAKE_SLICES_AND_OPTIONS(Usize, size_t) +MAKE_SLICES_AND_OPTIONS(F32, float) +MAKE_SLICES_AND_OPTIONS(F64, double) +MAKE_SLICES_AND_OPTIONS(Bool, bool) +MAKE_SLICES_AND_OPTIONS(Char, char32_t) +MAKE_SLICES_AND_OPTIONS(String, char) +MAKE_SLICES_AND_OPTIONS(String16, char16_t) +MAKE_SLICES_AND_OPTIONS(Strings, DiplomatStringView) +MAKE_SLICES_AND_OPTIONS(Strings16, DiplomatString16View) + +} // extern "C" +} // namespace capi + +extern "C" inline void _flush(capi::DiplomatWrite* w) { + std::string* string = reinterpret_cast(w->context); + string->resize(w->len); +} + +extern "C" inline bool _grow(capi::DiplomatWrite* w, uintptr_t requested) { + std::string* string = reinterpret_cast(w->context); + string->resize(requested); + w->cap = string->length(); + w->buf = &(*string)[0]; + return true; +} + +inline capi::DiplomatWrite WriteFromString(std::string& string) { + capi::DiplomatWrite w; + w.context = &string; + w.buf = &string[0]; + w.len = string.length(); + w.cap = string.length(); + // Will never become true, as _grow is infallible. + w.grow_failed = false; + w.flush = _flush; + w.grow = _grow; + return w; +} + +// This "trait" allows one to use _write() methods to efficiently +// write to a custom string type. To do this you need to write a specialized +// `WriteTrait` (see WriteTrait below) +// that is capable of constructing a DiplomatWrite, which can wrap +// your string type with appropriate resize/flush functionality. +template struct WriteTrait { + // Fill in this method on a specialization to implement this trait + // static inline capi::DiplomatWrite Construct(T& t); +}; + +template<> struct WriteTrait { + static inline capi::DiplomatWrite Construct(std::string& t) { + return diplomat::WriteFromString(t); + } +}; + +template struct Ok { + T inner; + + // Move constructor always allowed + Ok(T&& i): inner(std::forward(i)) {} + + // copy constructor allowed only for trivially copyable types + template::value>::type> + Ok(const T& i) : inner(i) {} + + Ok() = default; + Ok(Ok&&) noexcept = default; + Ok(const Ok &) = default; + Ok& operator=(const Ok&) = default; + Ok& operator=(Ok&&) noexcept = default; +}; + + +template struct Err { + T inner; + + // Move constructor always allowed + Err(T&& i): inner(std::forward(i)) {} + + // copy constructor allowed only for trivially copyable types + template::value>::type> + Err(const T& i) : inner(i) {} + + Err() = default; + Err(Err&&) noexcept = default; + Err(const Err &) = default; + Err& operator=(const Err&) = default; + Err& operator=(Err&&) noexcept = default; +}; + +template struct fn_traits; + +template +class result { +protected: + std::variant, Err> val; +public: + template + friend struct fn_traits; + + result(Ok&& v): val(std::move(v)) {} + result(Err&& v): val(std::move(v)) {} + result() = default; + result(const result &) = default; + result& operator=(const result&) = default; + result& operator=(result&&) noexcept = default; + result(result &&) noexcept = default; + ~result() = default; + bool is_ok() const { + return std::holds_alternative>(this->val); + } + bool is_err() const { + return std::holds_alternative>(this->val); + } + + template, std::nullptr_t> = nullptr> + std::optional ok() && { + if (!this->is_ok()) { + return std::nullopt; + } + return std::make_optional(std::move(std::get>(std::move(this->val)).inner)); + } + + template, std::nullptr_t> = nullptr> + std::optional err() && { + if (!this->is_err()) { + return std::nullopt; + } + return std::make_optional(std::move(std::get>(std::move(this->val)).inner)); + } + + // std::optional does not work with reference types directly, so wrap them if present + template, std::nullptr_t> = nullptr> + std::optional>> ok() && { + if (!this->is_ok()) { + return std::nullopt; + } + return std::make_optional(std::reference_wrapper(std::forward(std::get>(std::move(this->val)).inner))); + } + + template, std::nullptr_t> = nullptr> + std::optional>> err() && { + if (!this->is_err()) { + return std::nullopt; + } + return std::make_optional(std::reference_wrapper(std::forward(std::get>(std::move(this->val)).inner))); + } + + void set_ok(T&& t) { + this->val = Ok(std::move(t)); + } + + void set_err(E&& e) { + this->val = Err(std::move(e)); + } + + template + result replace_ok(T2&& t) { + if (this->is_err()) { + return result(Err(std::get>(std::move(this->val)))); + } else { + return result(Ok(std::move(t))); + } + } +}; + +class Utf8Error {}; + +// Use custom std::span on C++17, otherwise use std::span +#if __cplusplus >= 202002L + +constexpr std::size_t dynamic_extent = std::dynamic_extent; +template using span = std::span; + +#else // __cplusplus < 202002L + +// C++-17-compatible-ish std::span +constexpr size_t dynamic_extent = std::numeric_limits::max(); +template +class span { +public: + constexpr span(T *data = nullptr, size_t size = Extent) + : data_(data), size_(size) {} + + constexpr span(const span &o) + : data_(o.data_), size_(o.size_) {} + template + constexpr span(std::array, N> &arr) + : data_(const_cast(arr.data())), size_(N) {} + + constexpr T* data() const noexcept { + return this->data_; + } + constexpr size_t size() const noexcept { + return this->size_; + } + + constexpr T *begin() const noexcept { return data(); } + constexpr T *end() const noexcept { return data() + size(); } + + void operator=(span o) { + data_ = o.data_; + size_ = o.size_; + } + +private: + T* data_; + size_t size_; +}; + +#endif // __cplusplus >= 202002L + +// An ABI stable std::basic_string_view equivalent for the case of string +// views in slices +template > +class basic_string_view_for_slice { +public: + using std_string_view = std::basic_string_view; + using traits_type = typename std_string_view::traits_type; + using value_type = typename std_string_view::value_type; + using pointer = typename std_string_view::pointer; + using const_pointer = typename std_string_view::const_pointer; + using size_type = typename std_string_view::size_type; + using difference_type = typename std_string_view::difference_type; + + constexpr basic_string_view_for_slice() noexcept + : basic_string_view_for_slice{std_string_view{}} {} + + constexpr basic_string_view_for_slice(const basic_string_view_for_slice& other) noexcept = default; + + constexpr basic_string_view_for_slice(const const_pointer s, const size_type count) + : basic_string_view_for_slice{std_string_view{s, count}} {} + + constexpr basic_string_view_for_slice(const const_pointer s) + : basic_string_view_for_slice{std_string_view{s}} {} + + constexpr basic_string_view_for_slice& operator=(const basic_string_view_for_slice& view) noexcept = default; + + constexpr basic_string_view_for_slice(const std_string_view& s) noexcept + : data_{s.data(), s.size()} {} + + constexpr basic_string_view_for_slice& operator=(const std_string_view& s) noexcept { + data_ = {s.data(), s.size()}; + return *this; + } + + constexpr operator std_string_view() const noexcept { return {data(), size()}; } + constexpr std_string_view as_sv() const noexcept { return *this; } + + constexpr const_pointer data() const noexcept { return data_.data; } + constexpr size_type size() const noexcept { return data_.len; } + +private: + using capi_type = + std::conditional_t, + capi::DiplomatStringView, + std::conditional_t, + capi::DiplomatString16View, + void>>; + + static_assert(!std::is_void_v, + "ABI compatible string_views are only supported for char and char16_t"); + + capi_type data_; +}; + +// We only implement these specialisations as diplomat doesn't provide c abi +// types for others +using string_view_for_slice = basic_string_view_for_slice; +using u16string_view_for_slice = basic_string_view_for_slice; + +using string_view_span = span; +using u16string_view_span = span; + +// Interop between std::function & our C Callback wrapper type + +template +struct as_ffi { + using type = T; +}; + +template +struct as_ffi>().AsFFI())>> { + using type = decltype(std::declval>().AsFFI()); +}; + +template +using as_ffi_t = typename as_ffi::type; + +template +using replace_string_view_t = std::conditional_t, capi::DiplomatStringView, T>; + +template +struct diplomat_c_span_convert { + using type = T; +}; + +#define MAKE_SLICE_CONVERTERS(name, c_ty) \ + template \ + struct diplomat_c_span_convert>>> { \ + using type = diplomat::capi::Diplomat##name##View; \ + }; \ + template \ + struct diplomat_c_span_convert>>> { \ + using type = diplomat::capi::Diplomat##name##ViewMut; \ + }; \ + +MAKE_SLICE_CONVERTERS(I8, int8_t) +MAKE_SLICE_CONVERTERS(U8, uint8_t) +MAKE_SLICE_CONVERTERS(I16, int16_t) +MAKE_SLICE_CONVERTERS(U16, uint16_t) +MAKE_SLICE_CONVERTERS(I32, int32_t) +MAKE_SLICE_CONVERTERS(U32, uint32_t) +MAKE_SLICE_CONVERTERS(I64, int64_t) +MAKE_SLICE_CONVERTERS(U64, uint64_t) +MAKE_SLICE_CONVERTERS(F32, float) +MAKE_SLICE_CONVERTERS(F64, double) +MAKE_SLICE_CONVERTERS(Bool, bool) +MAKE_SLICE_CONVERTERS(Char, char32_t) +MAKE_SLICE_CONVERTERS(String, char) +MAKE_SLICE_CONVERTERS(String16, char16_t) + +template +using diplomat_c_span_convert_t = typename diplomat_c_span_convert::type; + +/// Replace the argument types from the std::function with the argument types for th function pointer +template +using replace_fn_t = diplomat_c_span_convert_t>>; + +template struct fn_traits> { + using fn_ptr_t = Ret(Args...); + using function_t = std::function; + using ret = Ret; + + // For a given T, creates a function that take in the C ABI version & return the C++ type. + template + static T replace(replace_fn_t val) { + if constexpr(std::is_same_v) { + return std::string_view{val.data, val.len}; + } else if constexpr (!std::is_same_v>) { + return T{ val.data, val.len }; + } else if constexpr (!std::is_same_v>) { + if constexpr (std::is_lvalue_reference_v) { + return *std::remove_reference_t::FromFFI(val); + } + else { + return T::FromFFI(val); + } + } + else { + return val; + } + } + + template + static replace_fn_t replace_ret(T val) { + if constexpr(std::is_same_v) { + return {val.data(), val.size()}; + } else if constexpr (!std::is_same_v>) { + // Can we convert straight away to our slice type, or (in the case of ABI compatible structs), do we have to do a reinterpret cast? + if constexpr(std::is_same_v().data()), decltype(replace_fn_t::data)>) { + return replace_fn_t { val.data(), val.size() }; + } else { + return replace_fn_t { reinterpret_cast::data)>(val.data()), val.size() }; + } + } else if constexpr(!std::is_same_v>) { + return val.AsFFI(); + } else { + return val; + } + } + + static Ret c_run_callback(const void *cb, replace_fn_t... args) { + return (*reinterpret_cast(cb))(replace(args)...); + } + + template + static TOut c_run_callback_result(const void *cb, replace_fn_t... args) { + result res = c_run_callback(cb, args...); + + auto is_ok = res.is_ok(); + + constexpr bool has_ok = !std::is_same_v; + constexpr bool has_err = !std::is_same_v; + + TOut out; + out.is_ok = is_ok; + + if constexpr (has_ok) { + if (is_ok) { + out.ok = replace_ret(std::get>(res.val).inner); + } + } + + if constexpr(has_err) { + if (!is_ok) { + out.err = replace_ret(std::get>(res.val).inner); + } + } + + return out; + } + + // For DiplomatOption<> + template + static TOut c_run_callback_diplomat_option(const void *cb, replace_fn_t... args) { + constexpr bool has_ok = !std::is_same_v; + + std::optional ret = c_run_callback(cb, args...); + + bool is_ok = ret.has_value(); + + TOut out; + out.is_ok = is_ok; + + if constexpr(has_ok) { + if (is_ok) { + out.ok = replace_ret(ret.value()); + } + } + return out; + } + + // All we need to do is just convert one pointer to another, while keeping the arguments the same: + template + static T c_run_callback_diplomat_opaque(const void* cb, replace_fn_t... args) { + Ret out = c_run_callback(cb, args...); + + return out->AsFFI(); + } + + static void c_delete(const void *cb) { + delete reinterpret_cast(cb); + } + + fn_traits(function_t) {} // Allows less clunky construction (avoids decltype) +}; + +// additional deduction guide required +template +fn_traits(T) -> fn_traits; + +// Trait for extracting inner types from either std::optional or std::unique_ptr. +// These are the two potential types returned by next() functions +template struct inner { using type = T; }; +template struct inner> { using type = T; }; +template struct inner>{ using type = T; }; + +template::type> +inline const U get_inner_if_present(T v) { + if constexpr(std::is_same_v) { + return std::move(v); + } else { + return *std::move(v); + } +} + +// Adapter for iterator types +template struct has_next : std::false_type {}; +template struct has_next < T, std::void_t().next())>> : std::true_type {}; +template constexpr bool has_next_v = has_next::value; + +/// Helper template enabling native iteration over unique ptrs to objects which implement next() +template +struct next_to_iter_helper { + static_assert(has_next_v, "next_to_iter_helper may only be used with types implementing next()"); + using next_type = decltype(std::declval().next()); + + // STL Iterator trait definitions + using value_type = typename inner::type; + using difference_type = void; + using reference = std::add_lvalue_reference_t; + using iterator_category = std::input_iterator_tag; + + next_to_iter_helper(std::unique_ptr&& ptr) : _ptr(std::move(ptr)), _curr(_ptr->next()) {} + + // https://en.cppreference.com/w/cpp/named_req/InputIterator requires that the type be copyable + next_to_iter_helper(const next_to_iter_helper& o) : _ptr(o._ptr), _curr(o._curr) {} + + void operator++() { _curr = _ptr->next(); } + void operator++(int) { ++(*this); } + const value_type& operator*() const { return *_curr; } + + bool operator!=(std::nullopt_t) { + return (bool)_curr; + } + + std::shared_ptr _ptr; // shared to satisfy the copyable requirement + next_type _curr; +}; + +} // namespace diplomat +} // namespace temporal_rs +#endif \ No newline at end of file diff --git a/deps/temporal/temporal_capi/src/calendar.rs b/deps/temporal/temporal_capi/src/calendar.rs new file mode 100644 index 00000000000000..5184609e5b67bf --- /dev/null +++ b/deps/temporal/temporal_capi/src/calendar.rs @@ -0,0 +1,84 @@ +#[diplomat::bridge] +#[diplomat::abi_rename = "temporal_rs_{0}"] +pub mod ffi { + use crate::error::ffi::TemporalError; + use alloc::boxed::Box; + use diplomat_runtime::DiplomatStr; + use icu_calendar::preferences::CalendarAlgorithm; + + #[diplomat::enum_convert(icu_calendar::AnyCalendarKind, needs_wildcard)] + pub enum AnyCalendarKind { + Buddhist, + Chinese, + Coptic, + Dangi, + Ethiopian, + EthiopianAmeteAlem, + Gregorian, + Hebrew, + Indian, + HijriTabularTypeIIFriday, + HijriSimulatedMecca, + HijriTabularTypeIIThursday, + HijriUmmAlQura, + Iso, + Japanese, + JapaneseExtended, + Persian, + Roc, + } + + impl AnyCalendarKind { + pub fn get_for_str(s: &DiplomatStr) -> Option { + let value = icu_locale::extensions::unicode::Value::try_from_utf8(s).ok()?; + let algorithm = CalendarAlgorithm::try_from(&value).ok()?; + match icu_calendar::AnyCalendarKind::try_from(algorithm) { + Ok(c) => Some(c.into()), + Err(()) if algorithm == CalendarAlgorithm::Hijri(None) => { + Some(Self::HijriTabularTypeIIFriday) + } + Err(()) => None, + } + } + + // https://tc39.es/proposal-temporal/#sec-temporal-parsetemporalcalendarstring + pub fn parse_temporal_calendar_string(s: &DiplomatStr) -> Option { + match temporal_rs::parsers::parse_allowed_calendar_formats(s) { + Some([]) => Some(AnyCalendarKind::Iso), + Some(result) => Self::get_for_str(result), + None => Self::get_for_str(s), + } + } + } + + #[diplomat::opaque] + #[diplomat::transparent_convert] + /// By and large one should not need to construct this type; it mostly exists + /// to represent calendar data found on other Temporal types, obtained via `.calendar()`. + pub struct Calendar(pub temporal_rs::Calendar); + + impl Calendar { + pub fn try_new_constrain(kind: AnyCalendarKind) -> Box { + Box::new(Calendar(temporal_rs::Calendar::new(kind.into()))) + } + + pub fn from_utf8(s: &DiplomatStr) -> Result, TemporalError> { + temporal_rs::Calendar::try_from_utf8(s) + .map(|c| Box::new(Calendar(c))) + .map_err(Into::into) + } + + pub fn is_iso(&self) -> bool { + self.0.is_iso() + } + + pub fn identifier(&self) -> &'static str { + self.0.identifier() + } + /// Returns the kind of this calendar + #[inline] + pub fn kind(&self) -> AnyCalendarKind { + self.0.kind().into() + } + } +} diff --git a/deps/temporal/temporal_capi/src/duration.rs b/deps/temporal/temporal_capi/src/duration.rs new file mode 100644 index 00000000000000..bfa5d92eb1ae79 --- /dev/null +++ b/deps/temporal/temporal_capi/src/duration.rs @@ -0,0 +1,335 @@ +use crate::error::ffi::TemporalError; + +#[diplomat::bridge] +#[diplomat::abi_rename = "temporal_rs_{0}"] +pub mod ffi { + use crate::error::ffi::TemporalError; + use crate::options::ffi::ToStringRoundingOptions; + use crate::options::ffi::{RoundingOptions, Unit}; + use crate::provider::ffi::Provider; + use crate::zoned_date_time::ffi::RelativeTo; + use alloc::boxed::Box; + use alloc::string::String; + use core::str::FromStr; + use diplomat_runtime::DiplomatOption; + use diplomat_runtime::{DiplomatStr, DiplomatStr16}; + use num_traits::FromPrimitive; + + #[diplomat::opaque] + pub struct Duration(pub(crate) temporal_rs::Duration); + + #[diplomat::opaque] + #[diplomat::transparent_convert] + pub struct DateDuration(pub(crate) temporal_rs::duration::DateDuration); + + pub struct PartialDuration { + pub years: DiplomatOption, + pub months: DiplomatOption, + pub weeks: DiplomatOption, + pub days: DiplomatOption, + pub hours: DiplomatOption, + pub minutes: DiplomatOption, + pub seconds: DiplomatOption, + pub milliseconds: DiplomatOption, + pub microseconds: DiplomatOption, + pub nanoseconds: DiplomatOption, + } + + #[diplomat::enum_convert(temporal_rs::Sign)] + pub enum Sign { + Positive = 1, + Zero = 0, + Negative = -1, + } + + impl PartialDuration { + pub fn is_empty(self) -> bool { + temporal_rs::partial::PartialDuration::try_from(self) + .map(|p| p.is_empty()) + .unwrap_or(false) + } + } + + impl DateDuration { + pub fn try_new( + years: i64, + months: i64, + weeks: i64, + days: i64, + ) -> Result, TemporalError> { + temporal_rs::duration::DateDuration::new(years, months, weeks, days) + .map(|x| Box::new(DateDuration(x))) + .map_err(Into::into) + } + + pub fn abs(&self) -> Box { + Box::new(Self(self.0.abs())) + } + pub fn negated(&self) -> Box { + Box::new(Self(self.0.negated())) + } + + pub fn sign(&self) -> Sign { + self.0.sign().into() + } + } + impl Duration { + /// Temporary API until v8 can move off of it + pub fn create( + years: i64, + months: i64, + weeks: i64, + days: i64, + hours: i64, + minutes: i64, + seconds: i64, + milliseconds: i64, + microseconds: f64, + nanoseconds: f64, + ) -> Result, TemporalError> { + Self::try_new( + years, + months, + weeks, + days, + hours, + minutes, + seconds, + milliseconds, + microseconds, + nanoseconds, + ) + } + + pub fn try_new( + years: i64, + months: i64, + weeks: i64, + days: i64, + hours: i64, + minutes: i64, + seconds: i64, + milliseconds: i64, + microseconds: f64, + nanoseconds: f64, + ) -> Result, TemporalError> { + temporal_rs::Duration::new( + years, + months, + weeks, + days, + hours, + minutes, + seconds, + milliseconds, + i128::from_f64(microseconds).ok_or(TemporalError::range("μs out of range"))?, + i128::from_f64(nanoseconds).ok_or(TemporalError::range("ms out of range"))?, + ) + .map(|x| Box::new(Duration(x))) + .map_err(Into::into) + } + + pub fn from_partial_duration(partial: PartialDuration) -> Result, TemporalError> { + temporal_rs::Duration::from_partial_duration(partial.try_into()?) + .map(|x| Box::new(Duration(x))) + .map_err(Into::into) + } + + pub fn from_utf8(s: &DiplomatStr) -> Result, TemporalError> { + temporal_rs::Duration::from_utf8(s) + .map(|c| Box::new(Self(c))) + .map_err(Into::into) + } + + pub fn from_utf16(s: &DiplomatStr16) -> Result, TemporalError> { + // TODO(#275) This should not need to convert + let s = String::from_utf16(s).map_err(|_| temporal_rs::TemporalError::range())?; + temporal_rs::Duration::from_str(&s) + .map(|c| Box::new(Self(c))) + .map_err(Into::into) + } + + pub fn is_time_within_range(&self) -> bool { + self.0.is_time_within_range() + } + + // set_time_duration is NOT safe to expose over FFI if the date()/time() methods are available + // Diplomat plans to make this a hard error. + + pub fn years(&self) -> i64 { + self.0.years() + } + pub fn months(&self) -> i64 { + self.0.months() + } + pub fn weeks(&self) -> i64 { + self.0.weeks() + } + pub fn days(&self) -> i64 { + self.0.days() + } + pub fn hours(&self) -> i64 { + self.0.hours() + } + pub fn minutes(&self) -> i64 { + self.0.minutes() + } + pub fn seconds(&self) -> i64 { + self.0.seconds() + } + pub fn milliseconds(&self) -> i64 { + self.0.milliseconds() + } + pub fn microseconds(&self) -> f64 { + // The error case should never occur since + // duration values are clamped within range + // + // https://github.com/boa-dev/temporal/issues/189 + f64::from_i128(self.0.microseconds()).unwrap_or(0.) + } + pub fn nanoseconds(&self) -> f64 { + // The error case should never occur since + // duration values are clamped within range + // + // https://github.com/boa-dev/temporal/issues/189 + f64::from_i128(self.0.nanoseconds()).unwrap_or(0.) + } + + pub fn sign(&self) -> Sign { + self.0.sign().into() + } + + pub fn is_zero(&self) -> bool { + self.0.is_zero() + } + + pub fn abs(&self) -> Box { + Box::new(Self(self.0.abs())) + } + pub fn negated(&self) -> Box { + Box::new(Self(self.0.negated())) + } + + pub fn add(&self, other: &Self) -> Result, TemporalError> { + self.0 + .add(&other.0) + .map(|x| Box::new(Duration(x))) + .map_err(Into::into) + } + + pub fn subtract(&self, other: &Self) -> Result, TemporalError> { + self.0 + .subtract(&other.0) + .map(|x| Box::new(Duration(x))) + .map_err(Into::into) + } + + pub fn to_string( + &self, + options: ToStringRoundingOptions, + write: &mut DiplomatWrite, + ) -> Result<(), TemporalError> { + use core::fmt::Write; + let string = self.0.as_temporal_string(options.into())?; + // throw away the error, this should always succeed + let _ = write.write_str(&string); + + Ok(()) + } + + #[cfg(feature = "compiled_data")] + pub fn round( + &self, + options: RoundingOptions, + relative_to: RelativeTo, + ) -> Result, TemporalError> { + self.round_with_provider(options, relative_to, &Provider::compiled()) + } + pub fn round_with_provider<'p>( + &self, + options: RoundingOptions, + relative_to: RelativeTo, + p: &Provider<'p>, + ) -> Result, TemporalError> { + with_provider!(p, |p| self.0.round_with_provider( + options.try_into()?, + relative_to.into(), + p + )) + .map(|x| Box::new(Duration(x))) + .map_err(Into::into) + } + + #[cfg(feature = "compiled_data")] + pub fn compare(&self, other: &Self, relative_to: RelativeTo) -> Result { + self.compare_with_provider(other, relative_to, &Provider::compiled()) + } + pub fn compare_with_provider<'p>( + &self, + other: &Self, + relative_to: RelativeTo, + p: &Provider<'p>, + ) -> Result { + // Ideally we'd return core::cmp::Ordering here but Diplomat + // isn't happy about needing to convert the contents of a result + with_provider!(p, |p| self.0.compare_with_provider( + &other.0, + relative_to.into(), + p + )) + .map(|x| x as i8) + .map_err(Into::into) + } + + #[cfg(feature = "compiled_data")] + pub fn total(&self, unit: Unit, relative_to: RelativeTo) -> Result { + self.total_with_provider(unit, relative_to, &Provider::compiled()) + } + pub fn total_with_provider<'p>( + &self, + unit: Unit, + relative_to: RelativeTo, + p: &Provider<'p>, + ) -> Result { + with_provider!(p, |p| self.0.total_with_provider( + unit.into(), + relative_to.into(), + p + )) + .map(|x| x.as_inner()) + .map_err(Into::into) + } + + #[allow(clippy::should_implement_trait)] + pub fn clone(&self) -> Box { + Box::new(Self(self.0)) + } + } +} + +impl TryFrom for temporal_rs::partial::PartialDuration { + type Error = TemporalError; + fn try_from(other: ffi::PartialDuration) -> Result { + use num_traits::FromPrimitive; + Ok(Self { + years: other.years.into_option(), + months: other.months.into_option(), + weeks: other.weeks.into_option(), + days: other.days.into_option(), + hours: other.hours.into_option(), + minutes: other.minutes.into_option(), + seconds: other.seconds.into_option(), + milliseconds: other.milliseconds.into_option(), + microseconds: other + .microseconds + .into_option() + .map(|v| i128::from_f64(v).ok_or(TemporalError::range("μs out of range"))) + .transpose()?, + nanoseconds: other + .nanoseconds + .into_option() + .map(|v| i128::from_f64(v).ok_or(TemporalError::range("ns out of range"))) + .transpose()?, + }) + } +} diff --git a/deps/temporal/temporal_capi/src/error.rs b/deps/temporal/temporal_capi/src/error.rs new file mode 100644 index 00000000000000..95c632d14b3d77 --- /dev/null +++ b/deps/temporal/temporal_capi/src/error.rs @@ -0,0 +1,46 @@ +#[diplomat::bridge] +#[diplomat::abi_rename = "temporal_rs_{0}"] +pub mod ffi { + use diplomat_runtime::{DiplomatOption, DiplomatUtf8StrSlice}; + + #[diplomat::enum_convert(temporal_rs::error::ErrorKind)] + pub enum ErrorKind { + Generic, + Type, + Range, + Syntax, + Assert, + } + + // In the future we might turn this into an opaque type with a msg() field + pub struct TemporalError { + pub kind: ErrorKind, + pub msg: DiplomatOption>, + } + + impl TemporalError { + pub(crate) fn range(msg: &'static str) -> Self { + TemporalError { + kind: ErrorKind::Range, + msg: Some(DiplomatUtf8StrSlice::from(msg)).into(), + } + } + pub(crate) fn assert(msg: &'static str) -> Self { + TemporalError { + kind: ErrorKind::Assert, + msg: Some(DiplomatUtf8StrSlice::from(msg)).into(), + } + } + } +} + +impl From for ffi::TemporalError { + fn from(other: temporal_rs::TemporalError) -> Self { + let kind = other.kind().into(); + let msg = other.into_message(); + Self { + kind, + msg: Some(msg.into()).into(), + } + } +} diff --git a/deps/temporal/temporal_capi/src/instant.rs b/deps/temporal/temporal_capi/src/instant.rs new file mode 100644 index 00000000000000..e14a8b8a72c316 --- /dev/null +++ b/deps/temporal/temporal_capi/src/instant.rs @@ -0,0 +1,246 @@ +#[diplomat::bridge] +#[diplomat::abi_rename = "temporal_rs_{0}"] +pub mod ffi { + use crate::duration::ffi::Duration; + use crate::error::ffi::TemporalError; + use crate::options::ffi::{DifferenceSettings, RoundingOptions}; + use crate::zoned_date_time::ffi::ZonedDateTime; + use alloc::boxed::Box; + use alloc::string::String; + use core::str::FromStr; + use diplomat_runtime::{DiplomatStr, DiplomatStr16}; + + use crate::options::ffi::ToStringRoundingOptions; + use crate::provider::ffi::Provider; + use crate::time_zone::ffi::TimeZone; + + #[diplomat::opaque] + pub struct Instant(pub temporal_rs::Instant); + + /// For portability, we use two u64s instead of an i128. + /// The high bit of the u64 is the sign. + /// This cannot represent i128::MIN, and has a -0, but those are largely + /// irrelevant for this purpose. + /// + /// This could potentially instead be a bit-by-bit split, or something else + #[derive(Debug, Copy, Clone)] + pub struct I128Nanoseconds { + pub high: u64, + pub low: u64, + } + + impl I128Nanoseconds { + pub fn is_valid(self) -> bool { + let ns = i128::from(self); + temporal_rs::unix_time::EpochNanoseconds::from(ns) + .check_validity() + .is_ok() + } + } + + impl Instant { + pub fn try_new(ns: I128Nanoseconds) -> Result, TemporalError> { + temporal_rs::Instant::try_new(ns.into()) + .map(|c| Box::new(Self(c))) + .map_err(Into::into) + } + + pub fn from_epoch_milliseconds( + epoch_milliseconds: i64, + ) -> Result, TemporalError> { + temporal_rs::Instant::from_epoch_milliseconds(epoch_milliseconds) + .map(|c| Box::new(Self(c))) + .map_err(Into::into) + } + + pub fn from_utf8(s: &DiplomatStr) -> Result, TemporalError> { + temporal_rs::Instant::from_utf8(s) + .map(|c| Box::new(Self(c))) + .map_err(Into::into) + } + + pub fn from_utf16(s: &DiplomatStr16) -> Result, TemporalError> { + // TODO(#275) This should not need to convert + let s = String::from_utf16(s).map_err(|_| temporal_rs::TemporalError::range())?; + temporal_rs::Instant::from_str(&s) + .map(|c| Box::new(Self(c))) + .map_err(Into::into) + } + + pub fn add(&self, duration: &Duration) -> Result, TemporalError> { + self.0 + .add(&duration.0) + .map(|c| Box::new(Self(c))) + .map_err(Into::into) + } + pub fn subtract(&self, duration: &Duration) -> Result, TemporalError> { + self.0 + .subtract(&duration.0) + .map(|c| Box::new(Self(c))) + .map_err(Into::into) + } + pub fn since( + &self, + other: &Self, + settings: DifferenceSettings, + ) -> Result, TemporalError> { + self.0 + .since(&other.0, settings.try_into()?) + .map(|c| Box::new(Duration(c))) + .map_err(Into::into) + } + pub fn until( + &self, + other: &Self, + settings: DifferenceSettings, + ) -> Result, TemporalError> { + self.0 + .until(&other.0, settings.try_into()?) + .map(|c| Box::new(Duration(c))) + .map_err(Into::into) + } + pub fn round(&self, options: RoundingOptions) -> Result, TemporalError> { + self.0 + .round(options.try_into()?) + .map(|c| Box::new(Self(c))) + .map_err(Into::into) + } + + pub fn compare(&self, other: &Self) -> core::cmp::Ordering { + self.0.cmp(&other.0) + } + + pub fn equals(&self, other: &Self) -> bool { + self.0 == other.0 + } + + pub fn epoch_milliseconds(&self) -> i64 { + self.0.epoch_milliseconds() + } + + pub fn epoch_nanoseconds(&self) -> I128Nanoseconds { + let ns = self.0.epoch_nanoseconds().as_i128(); + ns.into() + } + + // TODO: rename after 0.15/0.1.0 to remove the with_compiled_data + #[cfg(feature = "compiled_data")] + pub fn to_ixdtf_string_with_compiled_data( + &self, + zone: Option, + options: ToStringRoundingOptions, + write: &mut DiplomatWrite, + ) -> Result<(), TemporalError> { + self.to_ixdtf_string_with_provider(zone, options, &Provider::compiled(), write) + } + pub fn to_ixdtf_string_with_provider<'p>( + &self, + zone: Option, + options: ToStringRoundingOptions, + p: &Provider<'p>, + write: &mut DiplomatWrite, + ) -> Result<(), TemporalError> { + use writeable::Writeable; + with_provider!(p, |p| { + let writeable = self.0.to_ixdtf_writeable_with_provider( + zone.map(Into::into), + options.into(), + p, + )?; + // This can only fail in cases where the DiplomatWriteable is capped, we + // don't care about that. + let _ = writeable.write_to(write); + }); + Ok(()) + } + + #[cfg(feature = "compiled_data")] + pub fn to_zoned_date_time_iso( + &self, + zone: TimeZone, + ) -> Result, TemporalError> { + self.to_zoned_date_time_iso_with_provider(zone, &Provider::compiled()) + } + pub fn to_zoned_date_time_iso_with_provider<'p>( + &self, + zone: TimeZone, + p: &Provider<'p>, + ) -> Result, TemporalError> { + with_provider!(p, |p| self + .0 + .to_zoned_date_time_iso_with_provider(zone.into(), p)) + .map(|c| Box::new(ZonedDateTime(c))) + .map_err(Into::into) + } + + #[allow(clippy::should_implement_trait)] + pub fn clone(&self) -> Box { + Box::new(Self(self.0)) + } + } +} + +const U64_HIGH_BIT_MASK: u64 = 1 << 63; + +impl From for i128 { + fn from(ns: ffi::I128Nanoseconds) -> Self { + let is_neg = (ns.high & U64_HIGH_BIT_MASK) != 0; + // Remove the bitflag + let ns_high = (ns.high & !U64_HIGH_BIT_MASK) as u128; + // Stick them together + let total = ((ns_high << 64) + ns.low as u128) as i128; + // Reintroduce the sign + if is_neg { + -total + } else { + total + } + } +} + +impl From for ffi::I128Nanoseconds { + fn from(ns: i128) -> Self { + debug_assert!( + ns != i128::MIN, + "temporal_rs should never produce i128::MIN, it is out of valid range" + ); + let is_neg = ns < 0; + let ns = ns.unsigned_abs(); + + let high = (ns >> 64) as u64; + let low = (ns & u64::MAX as u128) as u64; + let high = if (is_neg) { + high | U64_HIGH_BIT_MASK + } else { + high + }; + + ffi::I128Nanoseconds { high, low } + } +} + +#[test] +fn test_i128_roundtrip() { + #[track_caller] + fn roundtrip(x: i128) { + let ns = ffi::I128Nanoseconds::from(x); + let round = i128::from(ns); + assert_eq!(x, round, "{x} does not roundtrip via {ns:?}"); + } + + roundtrip(0); + roundtrip(-1); + roundtrip(1); + roundtrip(100); + roundtrip(1000); + roundtrip(-1000); + roundtrip(1000000000); + roundtrip(-100000000); + roundtrip(u64::MAX as i128); + roundtrip(-(u64::MIN as i128)); + roundtrip(100 * (u64::MAX as i128)); + roundtrip(-100 * (u64::MAX as i128)); + roundtrip(i128::MIN + 1); + roundtrip(i128::MAX); + roundtrip(i128::MAX - 10); +} diff --git a/deps/temporal/temporal_capi/src/lib.rs b/deps/temporal/temporal_capi/src/lib.rs new file mode 100644 index 00000000000000..f9ba98e653f3b2 --- /dev/null +++ b/deps/temporal/temporal_capi/src/lib.rs @@ -0,0 +1,40 @@ +#![allow(unused)] // Until we add all the APIs +#![warn(unused_imports)] // But we want to clean up imports +#![allow(clippy::needless_lifetimes)] // Diplomat requires explicit lifetimes at times +#![allow(clippy::too_many_arguments)] // We're mapping APIs with the same argument size +#![allow(clippy::wrong_self_convention)] // Diplomat forces self conventions that may not always be ideal + +//! This crate contains the original definitions of [`temporal_rs`] APIs consumed by [Diplomat](https://github.com/rust-diplomat/diplomat) +//! to generate FFI bindings. We currently generate bindings for C++ and `extern "C"` APIs. +//! +//! The APIs exposed by this crate are *not intended to be used from Rust* and as such this crate may change its Rust API +//! across compatible semver versions. In contrast, the `extern "C"` APIs and all the language bindings are stable within +//! the same major semver version. +//! +//! [`temporal_rs`]: http://crates.io/crates/temporal_rs + +#![no_std] +#![cfg_attr( + not(test), + forbid(clippy::unwrap_used, clippy::expect_used, clippy::indexing_slicing) +)] + +extern crate alloc; + +#[macro_use] +pub mod provider; + +pub mod calendar; +pub mod duration; +pub mod error; +pub mod instant; +pub mod options; + +pub mod plain_date; +pub mod plain_date_time; +pub mod plain_month_day; +pub mod plain_time; +pub mod plain_year_month; +pub mod zoned_date_time; + +pub mod time_zone; diff --git a/deps/temporal/temporal_capi/src/options.rs b/deps/temporal/temporal_capi/src/options.rs new file mode 100644 index 00000000000000..445cf1549d825a --- /dev/null +++ b/deps/temporal/temporal_capi/src/options.rs @@ -0,0 +1,175 @@ +use crate::error::ffi::TemporalError; + +#[diplomat::bridge] +#[diplomat::abi_rename = "temporal_rs_{0}"] +pub mod ffi { + use diplomat_runtime::DiplomatOption; + use temporal_rs::options; + + #[diplomat::enum_convert(options::Overflow)] + pub enum ArithmeticOverflow { + #[diplomat::attr(auto, default)] + Constrain, + Reject, + } + #[diplomat::enum_convert(options::Disambiguation)] + pub enum Disambiguation { + #[diplomat::attr(auto, default)] + Compatible, + Earlier, + Later, + Reject, + } + + #[diplomat::enum_convert(options::DisplayCalendar)] + pub enum DisplayCalendar { + #[diplomat::attr(auto, default)] + Auto, + Always, + Never, + Critical, + } + + #[diplomat::enum_convert(options::DisplayOffset)] + pub enum DisplayOffset { + #[diplomat::attr(auto, default)] + Auto, + Never, + } + + #[diplomat::enum_convert(options::DisplayTimeZone)] + pub enum DisplayTimeZone { + #[diplomat::attr(auto, default)] + Auto, + Never, + Critical, + } + + #[diplomat::enum_convert(options::OffsetDisambiguation)] + pub enum OffsetDisambiguation { + Use, + Prefer, + Ignore, + Reject, + } + + #[diplomat::enum_convert(options::RoundingMode)] + pub enum RoundingMode { + Ceil, + Floor, + Expand, + Trunc, + HalfCeil, + HalfFloor, + HalfExpand, + HalfTrunc, + HalfEven, + } + + #[diplomat::enum_convert(options::Unit)] + pub enum Unit { + #[diplomat::attr(auto, default)] + Auto = 0, + Nanosecond = 1, + Microsecond = 2, + Millisecond = 3, + Second = 4, + Minute = 5, + Hour = 6, + Day = 7, + Week = 8, + Month = 9, + Year = 10, + } + + #[diplomat::enum_convert(options::UnsignedRoundingMode)] + pub enum UnsignedRoundingMode { + Infinity, + Zero, + HalfInfinity, + HalfZero, + HalfEven, + } + + #[diplomat::enum_convert(temporal_rs::provider::TransitionDirection)] + pub enum TransitionDirection { + Next, + Previous, + } + + pub struct Precision { + /// Sets the precision to minute precision. + pub is_minute: bool, + /// Sets the number of digits. Auto when None. Has no effect if is_minute is set. + pub precision: DiplomatOption, + } + + pub struct RoundingOptions { + pub largest_unit: DiplomatOption, + pub smallest_unit: DiplomatOption, + pub rounding_mode: DiplomatOption, + pub increment: DiplomatOption, + } + + pub struct ToStringRoundingOptions { + pub precision: Precision, + pub smallest_unit: DiplomatOption, + pub rounding_mode: DiplomatOption, + } + + pub struct DifferenceSettings { + pub largest_unit: DiplomatOption, + pub smallest_unit: DiplomatOption, + pub rounding_mode: DiplomatOption, + pub increment: DiplomatOption, + } +} + +impl From for temporal_rs::parsers::Precision { + fn from(other: ffi::Precision) -> Self { + if other.is_minute { + Self::Minute + } else if let Some(digit) = other.precision.into() { + Self::Digit(digit) + } else { + Self::Auto + } + } +} + +impl From for temporal_rs::options::ToStringRoundingOptions { + fn from(other: ffi::ToStringRoundingOptions) -> Self { + Self { + precision: other.precision.into(), + smallest_unit: other.smallest_unit.into_converted_option(), + rounding_mode: other.rounding_mode.into_converted_option(), + } + } +} + +impl TryFrom for temporal_rs::options::DifferenceSettings { + type Error = TemporalError; + fn try_from(other: ffi::DifferenceSettings) -> Result { + let mut ret = Self::default(); + ret.largest_unit = other.largest_unit.into_converted_option(); + ret.smallest_unit = other.smallest_unit.into_converted_option(); + ret.rounding_mode = other.rounding_mode.into_converted_option(); + if let Some(increment) = other.increment.into() { + ret.increment = Some(temporal_rs::options::RoundingIncrement::try_new(increment)?); + } + Ok(ret) + } +} +impl TryFrom for temporal_rs::options::RoundingOptions { + type Error = TemporalError; + fn try_from(other: ffi::RoundingOptions) -> Result { + let mut ret = Self::default(); + ret.largest_unit = other.largest_unit.into_converted_option(); + ret.smallest_unit = other.smallest_unit.into_converted_option(); + ret.rounding_mode = other.rounding_mode.into_converted_option(); + if let Some(increment) = other.increment.into() { + ret.increment = Some(temporal_rs::options::RoundingIncrement::try_new(increment)?); + } + Ok(ret) + } +} diff --git a/deps/temporal/temporal_capi/src/plain_date.rs b/deps/temporal/temporal_capi/src/plain_date.rs new file mode 100644 index 00000000000000..7752e3bd68bf6e --- /dev/null +++ b/deps/temporal/temporal_capi/src/plain_date.rs @@ -0,0 +1,469 @@ +use temporal_rs::MonthCode; + +use crate::error::ffi::TemporalError; + +#[diplomat::bridge] +#[diplomat::abi_rename = "temporal_rs_{0}"] +pub mod ffi { + use crate::calendar::ffi::{AnyCalendarKind, Calendar}; + use crate::duration::ffi::Duration; + use crate::error::ffi::TemporalError; + use crate::instant::ffi::I128Nanoseconds; + use crate::options::ffi::{ArithmeticOverflow, DifferenceSettings, DisplayCalendar}; + use crate::plain_date_time::ffi::PlainDateTime; + use crate::plain_month_day::ffi::PlainMonthDay; + use crate::plain_time::ffi::PlainTime; + use crate::plain_year_month::ffi::PlainYearMonth; + use crate::provider::ffi::Provider; + use crate::time_zone::ffi::TimeZone; + use crate::zoned_date_time::ffi::ZonedDateTime; + use alloc::boxed::Box; + use alloc::string::String; + use core::fmt::Write; + use diplomat_runtime::{DiplomatOption, DiplomatStrSlice, DiplomatWrite}; + use diplomat_runtime::{DiplomatStr, DiplomatStr16}; + use writeable::Writeable; + + use core::str::FromStr; + + #[diplomat::opaque] + pub struct PlainDate(pub(crate) temporal_rs::PlainDate); + + pub struct PartialDate<'a> { + pub year: DiplomatOption, + pub month: DiplomatOption, + // None if empty + pub month_code: DiplomatStrSlice<'a>, + pub day: DiplomatOption, + // None if empty + pub era: DiplomatStrSlice<'a>, + pub era_year: DiplomatOption, + pub calendar: AnyCalendarKind, + } + + #[diplomat::opaque] + pub struct ParsedDate(pub(crate) temporal_rs::parsed_intermediates::ParsedDate); + + impl ParsedDate { + pub fn from_utf8(s: &DiplomatStr) -> Result, TemporalError> { + temporal_rs::parsed_intermediates::ParsedDate::from_utf8(s) + .map(|x| Box::new(ParsedDate(x))) + .map_err(Into::::into) + } + pub fn from_utf16(s: &DiplomatStr16) -> Result, TemporalError> { + // TODO(#275) This should not need to convert + let s = String::from_utf16(s).map_err(|_| temporal_rs::TemporalError::range())?; + + temporal_rs::parsed_intermediates::ParsedDate::from_utf8(s.as_bytes()) + .map(|x| Box::new(ParsedDate(x))) + .map_err(Into::::into) + } + + pub fn year_month_from_utf8(s: &DiplomatStr) -> Result, TemporalError> { + temporal_rs::parsed_intermediates::ParsedDate::year_month_from_utf8(s) + .map(|x| Box::new(ParsedDate(x))) + .map_err(Into::::into) + } + pub fn year_month_from_utf16(s: &DiplomatStr16) -> Result, TemporalError> { + // TODO(#275) This should not need to convert + let s = String::from_utf16(s).map_err(|_| temporal_rs::TemporalError::range())?; + + temporal_rs::parsed_intermediates::ParsedDate::year_month_from_utf8(s.as_bytes()) + .map(|x| Box::new(ParsedDate(x))) + .map_err(Into::::into) + } + + pub fn month_day_from_utf8(s: &DiplomatStr) -> Result, TemporalError> { + temporal_rs::parsed_intermediates::ParsedDate::month_day_from_utf8(s) + .map(|x| Box::new(ParsedDate(x))) + .map_err(Into::::into) + } + pub fn month_day_from_utf16(s: &DiplomatStr16) -> Result, TemporalError> { + // TODO(#275) This should not need to convert + let s = String::from_utf16(s).map_err(|_| temporal_rs::TemporalError::range())?; + + temporal_rs::parsed_intermediates::ParsedDate::month_day_from_utf8(s.as_bytes()) + .map(|x| Box::new(ParsedDate(x))) + .map_err(Into::::into) + } + } + + impl PlainDate { + pub fn try_new_constrain( + year: i32, + month: u8, + day: u8, + calendar: AnyCalendarKind, + ) -> Result, TemporalError> { + temporal_rs::PlainDate::new( + year, + month, + day, + temporal_rs::Calendar::new(calendar.into()), + ) + .map(|x| Box::new(PlainDate(x))) + .map_err(Into::into) + } + pub fn try_new( + year: i32, + month: u8, + day: u8, + calendar: AnyCalendarKind, + ) -> Result, TemporalError> { + temporal_rs::PlainDate::try_new( + year, + month, + day, + temporal_rs::Calendar::new(calendar.into()), + ) + .map(|x| Box::new(PlainDate(x))) + .map_err(Into::into) + } + pub fn try_new_with_overflow( + year: i32, + month: u8, + day: u8, + calendar: AnyCalendarKind, + overflow: ArithmeticOverflow, + ) -> Result, TemporalError> { + temporal_rs::PlainDate::new_with_overflow( + year, + month, + day, + temporal_rs::Calendar::new(calendar.into()), + overflow.into(), + ) + .map(|x| Box::new(PlainDate(x))) + .map_err(Into::into) + } + pub fn from_partial( + partial: PartialDate, + overflow: Option, + ) -> Result, TemporalError> { + temporal_rs::PlainDate::from_partial(partial.try_into()?, overflow.map(Into::into)) + .map(|x| Box::new(PlainDate(x))) + .map_err(Into::into) + } + + pub fn from_parsed(parsed: &ParsedDate) -> Result, TemporalError> { + temporal_rs::PlainDate::from_parsed(parsed.0) + .map(|x| Box::new(PlainDate(x))) + .map_err(Into::into) + } + + #[cfg(feature = "compiled_data")] + pub fn from_epoch_milliseconds(ms: i64, tz: TimeZone) -> Result, TemporalError> { + Self::from_epoch_milliseconds_with_provider(ms, tz, &Provider::compiled()) + } + pub fn from_epoch_milliseconds_with_provider<'p>( + ms: i64, + tz: TimeZone, + p: &Provider<'p>, + ) -> Result, TemporalError> { + let zdt = crate::zoned_date_time::zdt_from_epoch_ms_with_provider(ms, tz.into(), p)?; + Ok(Box::new(Self(zdt.to_plain_date()))) + } + + #[cfg(feature = "compiled_data")] + pub fn from_epoch_nanoseconds( + ns: I128Nanoseconds, + tz: TimeZone, + ) -> Result, TemporalError> { + Self::from_epoch_nanoseconds_with_provider(ns, tz, &Provider::compiled()) + } + pub fn from_epoch_nanoseconds_with_provider<'p>( + ns: I128Nanoseconds, + tz: TimeZone, + p: &Provider<'p>, + ) -> Result, TemporalError> { + let zdt = crate::zoned_date_time::zdt_from_epoch_ns_with_provider(ns, tz.into(), p)?; + Ok(Box::new(Self(zdt.to_plain_date()))) + } + + pub fn with( + &self, + partial: PartialDate, + overflow: Option, + ) -> Result, TemporalError> { + self.0 + .with(partial.try_into()?, overflow.map(Into::into)) + .map(|x| Box::new(PlainDate(x))) + .map_err(Into::into) + } + + pub fn with_calendar(&self, calendar: AnyCalendarKind) -> Box { + Box::new(PlainDate( + self.0 + .with_calendar(temporal_rs::Calendar::new(calendar.into())), + )) + } + + pub fn from_utf8(s: &DiplomatStr) -> Result, TemporalError> { + temporal_rs::PlainDate::from_utf8(s) + .map(|c| Box::new(Self(c))) + .map_err(Into::into) + } + + pub fn from_utf16(s: &DiplomatStr16) -> Result, TemporalError> { + // TODO(#275) This should not need to convert + let s = String::from_utf16(s).map_err(|_| temporal_rs::TemporalError::range())?; + temporal_rs::PlainDate::from_str(&s) + .map(|c| Box::new(Self(c))) + .map_err(Into::into) + } + + pub fn calendar<'a>(&'a self) -> &'a Calendar { + Calendar::transparent_convert(self.0.calendar()) + } + + pub fn is_valid(&self) -> bool { + self.0.is_valid() + } + + pub fn add( + &self, + duration: &Duration, + overflow: Option, + ) -> Result, TemporalError> { + self.0 + .add(&duration.0, overflow.map(Into::into)) + .map(|x| Box::new(Self(x))) + .map_err(Into::into) + } + pub fn subtract( + &self, + duration: &Duration, + overflow: Option, + ) -> Result, TemporalError> { + self.0 + .subtract(&duration.0, overflow.map(Into::into)) + .map(|x| Box::new(Self(x))) + .map_err(Into::into) + } + pub fn until( + &self, + other: &Self, + settings: DifferenceSettings, + ) -> Result, TemporalError> { + self.0 + .until(&other.0, settings.try_into()?) + .map(|x| Box::new(Duration(x))) + .map_err(Into::into) + } + pub fn since( + &self, + other: &Self, + settings: DifferenceSettings, + ) -> Result, TemporalError> { + self.0 + .since(&other.0, settings.try_into()?) + .map(|x| Box::new(Duration(x))) + .map_err(Into::into) + } + + pub fn equals(&self, other: &Self) -> bool { + self.0 == other.0 + } + + pub fn compare(one: &Self, two: &Self) -> core::cmp::Ordering { + one.0.compare_iso(&two.0) + } + pub fn year(&self) -> i32 { + self.0.year() + } + pub fn month(&self) -> u8 { + self.0.month() + } + pub fn month_code(&self, write: &mut DiplomatWrite) { + let code = self.0.month_code(); + // throw away the error, this should always succeed + let _ = write.write_str(code.as_str()); + } + pub fn day(&self) -> u8 { + self.0.day() + } + pub fn day_of_week(&self) -> u16 { + self.0.day_of_week() + } + pub fn day_of_year(&self) -> u16 { + self.0.day_of_year() + } + pub fn week_of_year(&self) -> Option { + self.0.week_of_year() + } + pub fn year_of_week(&self) -> Option { + self.0.year_of_week() + } + pub fn days_in_week(&self) -> u16 { + self.0.days_in_week() + } + pub fn days_in_month(&self) -> u16 { + self.0.days_in_month() + } + pub fn days_in_year(&self) -> u16 { + self.0.days_in_year() + } + pub fn months_in_year(&self) -> u16 { + self.0.months_in_year() + } + pub fn in_leap_year(&self) -> bool { + self.0.in_leap_year() + } + // Writes an empty string for no era + pub fn era(&self, write: &mut DiplomatWrite) { + let era = self.0.era(); + if let Some(era) = era { + // throw away the error, this should always succeed + let _ = write.write_str(&era); + } + } + + pub fn era_year(&self) -> Option { + self.0.era_year() + } + + pub fn to_plain_date_time( + &self, + time: Option<&PlainTime>, + ) -> Result, TemporalError> { + self.0 + .to_plain_date_time(time.map(|t| t.0)) + .map(|x| Box::new(PlainDateTime(x))) + .map_err(Into::into) + } + + pub fn to_plain_month_day(&self) -> Result, TemporalError> { + self.0 + .to_plain_month_day() + .map(|x| Box::new(PlainMonthDay(x))) + .map_err(Into::into) + } + + pub fn to_plain_year_month(&self) -> Result, TemporalError> { + self.0 + .to_plain_year_month() + .map(|x| Box::new(PlainYearMonth(x))) + .map_err(Into::into) + } + #[cfg(feature = "compiled_data")] + pub fn to_zoned_date_time( + &self, + time_zone: TimeZone, + time: Option<&PlainTime>, + ) -> Result, TemporalError> { + self.to_zoned_date_time_with_provider(time_zone, time, &Provider::compiled()) + } + pub fn to_zoned_date_time_with_provider<'p>( + &self, + time_zone: TimeZone, + time: Option<&PlainTime>, + p: &Provider<'p>, + ) -> Result, TemporalError> { + with_provider!(p, |p| self.0.to_zoned_date_time_with_provider( + time_zone.into(), + time.map(|x| x.0), + p + )) + .map(|x| Box::new(ZonedDateTime(x))) + .map_err(Into::into) + } + pub fn to_ixdtf_string( + &self, + display_calendar: DisplayCalendar, + write: &mut DiplomatWrite, + ) { + let writeable = self.0.to_ixdtf_writeable(display_calendar.into()); + // This can only fail in cases where the DiplomatWriteable is capped, we + // don't care about that. + let _ = writeable.write_to(write); + } + + #[allow(clippy::should_implement_trait)] + pub fn clone(&self) -> Box { + Box::new(Self(self.0.clone())) + } + } +} + +impl TryFrom> for temporal_rs::partial::PartialDate { + type Error = TemporalError; + fn try_from(other: ffi::PartialDate<'_>) -> Result { + let calendar = temporal_rs::Calendar::new(other.calendar.into()); + Ok(Self { + calendar_fields: other.try_into()?, + calendar, + }) + } +} + +impl TryFrom> for temporal_rs::partial::PartialYearMonth { + type Error = TemporalError; + fn try_from(other: ffi::PartialDate<'_>) -> Result { + let calendar = temporal_rs::Calendar::new(other.calendar.into()); + Ok(Self { + calendar_fields: other.try_into()?, + calendar, + }) + } +} + +impl TryFrom> for temporal_rs::fields::CalendarFields { + type Error = TemporalError; + fn try_from(other: ffi::PartialDate<'_>) -> Result { + use temporal_rs::TinyAsciiStr; + + let month_code = if other.month_code.is_empty() { + None + } else { + Some(MonthCode::try_from_utf8(other.month_code.into()).map_err(TemporalError::from)?) + }; + + let era = if other.era.is_empty() { + None + } else { + Some(TinyAsciiStr::try_from_utf8(other.era.into()).map_err(|_| { + TemporalError::from( + temporal_rs::TemporalError::range().with_message("Invalid era code."), + ) + })?) + }; + Ok(Self { + year: other.year.into(), + month: other.month.into(), + month_code, + day: other.day.into(), + era_year: other.era_year.into(), + era, + }) + } +} + +impl TryFrom> for temporal_rs::fields::YearMonthCalendarFields { + type Error = TemporalError; + fn try_from(other: ffi::PartialDate<'_>) -> Result { + use temporal_rs::TinyAsciiStr; + + let month_code = if other.month_code.is_empty() { + None + } else { + Some(MonthCode::try_from_utf8(other.month_code.into()).map_err(TemporalError::from)?) + }; + + let era = if other.era.is_empty() { + None + } else { + Some(TinyAsciiStr::try_from_utf8(other.era.into()).map_err(|_| { + TemporalError::from( + temporal_rs::TemporalError::range().with_message("Invalid era code."), + ) + })?) + }; + Ok(Self { + year: other.year.into(), + month: other.month.into(), + month_code, + era_year: other.era_year.into(), + era, + }) + } +} diff --git a/deps/temporal/temporal_capi/src/plain_date_time.rs b/deps/temporal/temporal_capi/src/plain_date_time.rs new file mode 100644 index 00000000000000..b0800afdc6da8d --- /dev/null +++ b/deps/temporal/temporal_capi/src/plain_date_time.rs @@ -0,0 +1,401 @@ +use crate::error::ffi::TemporalError; + +#[diplomat::bridge] +#[diplomat::abi_rename = "temporal_rs_{0}"] +pub mod ffi { + use crate::calendar::ffi::{AnyCalendarKind, Calendar}; + use crate::duration::ffi::Duration; + use crate::error::ffi::TemporalError; + use crate::instant::ffi::I128Nanoseconds; + use crate::options::ffi::{ + ArithmeticOverflow, DifferenceSettings, DisplayCalendar, RoundingOptions, + ToStringRoundingOptions, + }; + use crate::provider::ffi::Provider; + use crate::time_zone::ffi::TimeZone; + use crate::zoned_date_time::ffi::ZonedDateTime; + use alloc::boxed::Box; + + use crate::options::ffi::Disambiguation; + use crate::plain_date::ffi::{PartialDate, PlainDate}; + use crate::plain_time::ffi::{PartialTime, PlainTime}; + use alloc::string::String; + use core::fmt::Write; + use core::str::FromStr; + use diplomat_runtime::DiplomatWrite; + use diplomat_runtime::{DiplomatStr, DiplomatStr16}; + use writeable::Writeable; + + #[diplomat::opaque] + pub struct PlainDateTime(pub(crate) temporal_rs::PlainDateTime); + + pub struct PartialDateTime<'a> { + pub date: PartialDate<'a>, + pub time: PartialTime, + } + + #[diplomat::opaque] + pub struct ParsedDateTime(temporal_rs::parsed_intermediates::ParsedDateTime); + + impl ParsedDateTime { + pub fn from_utf8(s: &DiplomatStr) -> Result, TemporalError> { + temporal_rs::parsed_intermediates::ParsedDateTime::from_utf8(s) + .map(|x| Box::new(ParsedDateTime(x))) + .map_err(Into::::into) + } + pub fn from_utf16(s: &DiplomatStr16) -> Result, TemporalError> { + // TODO(#275) This should not need to convert + let s = String::from_utf16(s).map_err(|_| temporal_rs::TemporalError::range())?; + + temporal_rs::parsed_intermediates::ParsedDateTime::from_utf8(s.as_bytes()) + .map(|x| Box::new(ParsedDateTime(x))) + .map_err(Into::::into) + } + } + + impl PlainDateTime { + pub fn try_new_constrain( + year: i32, + month: u8, + day: u8, + hour: u8, + minute: u8, + second: u8, + millisecond: u16, + microsecond: u16, + nanosecond: u16, + calendar: AnyCalendarKind, + ) -> Result, TemporalError> { + temporal_rs::PlainDateTime::new( + year, + month, + day, + hour, + minute, + second, + millisecond, + microsecond, + nanosecond, + temporal_rs::Calendar::new(calendar.into()), + ) + .map(|x| Box::new(PlainDateTime(x))) + .map_err(Into::into) + } + pub fn try_new( + year: i32, + month: u8, + day: u8, + hour: u8, + minute: u8, + second: u8, + millisecond: u16, + microsecond: u16, + nanosecond: u16, + calendar: AnyCalendarKind, + ) -> Result, TemporalError> { + temporal_rs::PlainDateTime::try_new( + year, + month, + day, + hour, + minute, + second, + millisecond, + microsecond, + nanosecond, + temporal_rs::Calendar::new(calendar.into()), + ) + .map(|x| Box::new(PlainDateTime(x))) + .map_err(Into::into) + } + + pub fn from_partial( + partial: PartialDateTime, + overflow: Option, + ) -> Result, TemporalError> { + temporal_rs::PlainDateTime::from_partial(partial.try_into()?, overflow.map(Into::into)) + .map(|x| Box::new(PlainDateTime(x))) + .map_err(Into::into) + } + + pub fn from_parsed(parsed: &ParsedDateTime) -> Result, TemporalError> { + temporal_rs::PlainDateTime::from_parsed(parsed.0) + .map(|x| Box::new(PlainDateTime(x))) + .map_err(Into::into) + } + + #[cfg(feature = "compiled_data")] + pub fn from_epoch_milliseconds(ms: i64, tz: TimeZone) -> Result, TemporalError> { + Self::from_epoch_milliseconds_with_provider(ms, tz, &Provider::compiled()) + } + pub fn from_epoch_milliseconds_with_provider<'p>( + ms: i64, + tz: TimeZone, + p: &Provider<'p>, + ) -> Result, TemporalError> { + let zdt = crate::zoned_date_time::zdt_from_epoch_ms_with_provider(ms, tz.into(), p)?; + Ok(Box::new(Self(zdt.to_plain_date_time()))) + } + #[cfg(feature = "compiled_data")] + pub fn from_epoch_nanoseconds( + ns: I128Nanoseconds, + tz: TimeZone, + ) -> Result, TemporalError> { + Self::from_epoch_nanoseconds_with_provider(ns, tz, &Provider::compiled()) + } + pub fn from_epoch_nanoseconds_with_provider<'p>( + ns: I128Nanoseconds, + tz: TimeZone, + p: &Provider<'p>, + ) -> Result, TemporalError> { + let zdt = crate::zoned_date_time::zdt_from_epoch_ns_with_provider(ns, tz.into(), p)?; + Ok(Box::new(Self(zdt.to_plain_date_time()))) + } + pub fn with( + &self, + partial: PartialDateTime, + overflow: Option, + ) -> Result, TemporalError> { + self.0 + .with(partial.try_into()?, overflow.map(Into::into)) + .map(|x| Box::new(PlainDateTime(x))) + .map_err(Into::into) + } + + pub fn with_time(&self, time: Option<&PlainTime>) -> Result, TemporalError> { + self.0 + .with_time(time.map(|t| t.0)) + .map(|x| Box::new(PlainDateTime(x))) + .map_err(Into::into) + } + + pub fn with_calendar(&self, calendar: AnyCalendarKind) -> Box { + Box::new(PlainDateTime( + self.0 + .with_calendar(temporal_rs::Calendar::new(calendar.into())), + )) + } + + pub fn from_utf8(s: &DiplomatStr) -> Result, TemporalError> { + temporal_rs::PlainDateTime::from_utf8(s) + .map(|c| Box::new(Self(c))) + .map_err(Into::into) + } + + pub fn from_utf16(s: &DiplomatStr16) -> Result, TemporalError> { + // TODO(#275) This should not need to convert + let s = String::from_utf16(s).map_err(|_| temporal_rs::TemporalError::range())?; + temporal_rs::PlainDateTime::from_str(&s) + .map(|c| Box::new(Self(c))) + .map_err(Into::into) + } + + pub fn hour(&self) -> u8 { + self.0.hour() + } + pub fn minute(&self) -> u8 { + self.0.minute() + } + pub fn second(&self) -> u8 { + self.0.second() + } + pub fn millisecond(&self) -> u16 { + self.0.millisecond() + } + pub fn microsecond(&self) -> u16 { + self.0.microsecond() + } + pub fn nanosecond(&self) -> u16 { + self.0.nanosecond() + } + + pub fn calendar<'a>(&'a self) -> &'a Calendar { + Calendar::transparent_convert(self.0.calendar()) + } + + pub fn year(&self) -> i32 { + self.0.year() + } + pub fn month(&self) -> u8 { + self.0.month() + } + pub fn month_code(&self, write: &mut DiplomatWrite) { + let code = self.0.month_code(); + // throw away the error, this should always succeed + let _ = write.write_str(code.as_str()); + } + pub fn day(&self) -> u8 { + self.0.day() + } + pub fn day_of_week(&self) -> u16 { + self.0.day_of_week() + } + pub fn day_of_year(&self) -> u16 { + self.0.day_of_year() + } + pub fn week_of_year(&self) -> Option { + self.0.week_of_year() + } + pub fn year_of_week(&self) -> Option { + self.0.year_of_week() + } + pub fn days_in_week(&self) -> u16 { + self.0.days_in_week() + } + pub fn days_in_month(&self) -> u16 { + self.0.days_in_month() + } + pub fn days_in_year(&self) -> u16 { + self.0.days_in_year() + } + pub fn months_in_year(&self) -> u16 { + self.0.months_in_year() + } + pub fn in_leap_year(&self) -> bool { + self.0.in_leap_year() + } + // Writes an empty string for no era + pub fn era(&self, write: &mut DiplomatWrite) { + let era = self.0.era(); + if let Some(era) = era { + // throw away the error, this should always succeed + let _ = write.write_str(&era); + } + } + + pub fn era_year(&self) -> Option { + self.0.era_year() + } + + pub fn add( + &self, + duration: &Duration, + overflow: Option, + ) -> Result, TemporalError> { + self.0 + .add(&duration.0, overflow.map(Into::into)) + .map(|x| Box::new(Self(x))) + .map_err(Into::into) + } + pub fn subtract( + &self, + duration: &Duration, + overflow: Option, + ) -> Result, TemporalError> { + self.0 + .subtract(&duration.0, overflow.map(Into::into)) + .map(|x| Box::new(Self(x))) + .map_err(Into::into) + } + pub fn until( + &self, + other: &Self, + settings: DifferenceSettings, + ) -> Result, TemporalError> { + self.0 + .until(&other.0, settings.try_into()?) + .map(|x| Box::new(Duration(x))) + .map_err(Into::into) + } + pub fn since( + &self, + other: &Self, + settings: DifferenceSettings, + ) -> Result, TemporalError> { + self.0 + .since(&other.0, settings.try_into()?) + .map(|x| Box::new(Duration(x))) + .map_err(Into::into) + } + + pub fn equals(&self, other: &Self) -> bool { + self.0 == other.0 + } + + pub fn compare(one: &Self, two: &Self) -> core::cmp::Ordering { + one.0.compare_iso(&two.0) + } + + pub fn round(&self, options: RoundingOptions) -> Result, TemporalError> { + self.0 + .round(options.try_into()?) + .map(|x| Box::new(Self(x))) + .map_err(Into::into) + } + + pub fn to_plain_date(&self) -> Box { + Box::new(PlainDate(self.0.to_plain_date())) + } + + pub fn to_plain_time(&self) -> Box { + Box::new(PlainTime(self.0.to_plain_time())) + } + + #[cfg(feature = "compiled_data")] + pub fn to_zoned_date_time( + &self, + time_zone: TimeZone, + disambiguation: Disambiguation, + ) -> Result, TemporalError> { + self.to_zoned_date_time_with_provider(time_zone, disambiguation, &Provider::compiled()) + } + + pub fn to_zoned_date_time_with_provider<'p>( + &self, + time_zone: TimeZone, + disambiguation: Disambiguation, + p: &Provider<'p>, + ) -> Result, TemporalError> { + with_provider!(p, |p| self.0.to_zoned_date_time_with_provider( + time_zone.into(), + disambiguation.into(), + p + )) + .map(|x| Box::new(ZonedDateTime(x))) + .map_err(Into::into) + } + + pub fn to_ixdtf_string( + &self, + options: ToStringRoundingOptions, + + display_calendar: DisplayCalendar, + write: &mut DiplomatWrite, + ) -> Result<(), TemporalError> { + let writeable = self + .0 + .to_ixdtf_writeable(options.into(), display_calendar.into())?; + + // This can only fail in cases where the DiplomatWriteable is capped, we + // don't care about that. + let _ = writeable.write_to(write); + Ok(()) + } + + #[allow(clippy::should_implement_trait)] + pub fn clone(&self) -> Box { + Box::new(Self(self.0.clone())) + } + } +} + +impl TryFrom> for temporal_rs::partial::PartialDateTime { + type Error = TemporalError; + fn try_from(other: ffi::PartialDateTime<'_>) -> Result { + let calendar = temporal_rs::Calendar::new(other.date.calendar.into()); + Ok(Self { + fields: other.try_into()?, + calendar, + }) + } +} + +impl TryFrom> for temporal_rs::fields::DateTimeFields { + type Error = TemporalError; + fn try_from(other: ffi::PartialDateTime<'_>) -> Result { + Ok(Self { + calendar_fields: other.date.try_into()?, + time: other.time.into(), + }) + } +} diff --git a/deps/temporal/temporal_capi/src/plain_month_day.rs b/deps/temporal/temporal_capi/src/plain_month_day.rs new file mode 100644 index 00000000000000..fe3878ab1fffab --- /dev/null +++ b/deps/temporal/temporal_capi/src/plain_month_day.rs @@ -0,0 +1,150 @@ +#[diplomat::bridge] +#[diplomat::abi_rename = "temporal_rs_{0}"] +pub mod ffi { + use crate::calendar::ffi::{AnyCalendarKind, Calendar}; + use crate::error::ffi::TemporalError; + use alloc::boxed::Box; + + use crate::options::ffi::{ArithmeticOverflow, DisplayCalendar}; + use crate::plain_date::ffi::{PartialDate, PlainDate}; + use crate::time_zone::ffi::TimeZone; + + use crate::provider::ffi::Provider; + use alloc::string::String; + use core::fmt::Write; + use core::str::FromStr; + use diplomat_runtime::DiplomatWrite; + use diplomat_runtime::{DiplomatStr, DiplomatStr16}; + use writeable::Writeable; + + #[diplomat::opaque] + pub struct PlainMonthDay(pub(crate) temporal_rs::PlainMonthDay); + + impl PlainMonthDay { + pub fn try_new_with_overflow( + month: u8, + day: u8, + calendar: AnyCalendarKind, + overflow: ArithmeticOverflow, + ref_year: Option, + ) -> Result, TemporalError> { + temporal_rs::PlainMonthDay::new_with_overflow( + month, + day, + temporal_rs::Calendar::new(calendar.into()), + overflow.into(), + ref_year, + ) + .map(|x| Box::new(PlainMonthDay(x))) + .map_err(Into::into) + } + + pub fn from_partial( + partial: PartialDate, + overflow: Option, + ) -> Result, TemporalError> { + temporal_rs::PlainMonthDay::from_partial(partial.try_into()?, overflow.map(Into::into)) + .map(|x| Box::new(PlainMonthDay(x))) + .map_err(Into::into) + } + pub fn from_parsed( + parsed: &crate::plain_date::ffi::ParsedDate, + ) -> Result, TemporalError> { + temporal_rs::PlainMonthDay::from_parsed(parsed.0) + .map(|x| Box::new(PlainMonthDay(x))) + .map_err(Into::into) + } + + pub fn with( + &self, + partial: PartialDate, + overflow: Option, + ) -> Result, TemporalError> { + self.0 + .with(partial.try_into()?, overflow.map(Into::into)) + .map(|x| Box::new(PlainMonthDay(x))) + .map_err(Into::into) + } + + pub fn equals(&self, other: &Self) -> bool { + self.0 == other.0 + } + + pub fn from_utf8(s: &DiplomatStr) -> Result, TemporalError> { + temporal_rs::PlainMonthDay::from_utf8(s) + .map(|c| Box::new(Self(c))) + .map_err(Into::into) + } + + pub fn from_utf16(s: &DiplomatStr16) -> Result, TemporalError> { + // TODO(#275) This should not need to convert + let s = String::from_utf16(s).map_err(|_| temporal_rs::TemporalError::range())?; + temporal_rs::PlainMonthDay::from_str(&s) + .map(|c| Box::new(Self(c))) + .map_err(Into::into) + } + + pub fn day(&self) -> u8 { + self.0.day() + } + pub fn calendar<'a>(&'a self) -> &'a Calendar { + Calendar::transparent_convert(self.0.calendar()) + } + + pub fn month_code(&self, write: &mut DiplomatWrite) { + let code = self.0.month_code(); + // throw away the error, this should always succeed + let _ = write.write_str(code.as_str()); + } + + pub fn to_plain_date( + &self, + year: Option, + ) -> Result, TemporalError> { + self.0 + .to_plain_date(year.map(|y| y.try_into()).transpose()?) + .map(|x| Box::new(PlainDate(x))) + .map_err(Into::into) + } + + #[cfg(feature = "compiled_data")] + pub fn epoch_ms_for(&self, time_zone: TimeZone) -> Result { + self.epoch_ms_for_with_provider(time_zone, &Provider::compiled()) + } + + pub fn epoch_ms_for_with_provider<'p>( + &self, + time_zone: TimeZone, + p: &Provider<'p>, + ) -> Result { + let ns = with_provider!(p, |p| self + .0 + .epoch_ns_for_with_provider(time_zone.into(), p) + .map_err(TemporalError::from))?; + + let ns_i128 = ns.as_i128(); + let ms = ns_i128 / 1_000_000; + if let Ok(ms) = i64::try_from(ms) { + Ok(ms) + } else { + Err(TemporalError::assert("Found an out-of-range MonthDay")) + } + } + + pub fn to_ixdtf_string( + &self, + display_calendar: DisplayCalendar, + write: &mut DiplomatWrite, + ) { + let writeable = self.0.to_ixdtf_writeable(display_calendar.into()); + // This can only fail in cases where the DiplomatWriteable is capped, we + // don't care about that. + let _ = writeable.write_to(write); + } + + #[allow(clippy::should_implement_trait)] + pub fn clone(&self) -> Box { + Box::new(Self(self.0.clone())) + } + } +} diff --git a/deps/temporal/temporal_capi/src/plain_time.rs b/deps/temporal/temporal_capi/src/plain_time.rs new file mode 100644 index 00000000000000..3320d4513bcb85 --- /dev/null +++ b/deps/temporal/temporal_capi/src/plain_time.rs @@ -0,0 +1,239 @@ +#[diplomat::bridge] +#[diplomat::abi_rename = "temporal_rs_{0}"] +pub mod ffi { + use alloc::boxed::Box; + + use crate::duration::ffi::Duration; + use crate::error::ffi::TemporalError; + use crate::instant::ffi::I128Nanoseconds; + use crate::options::ffi::{ + ArithmeticOverflow, DifferenceSettings, RoundingOptions, ToStringRoundingOptions, + }; + use crate::provider::ffi::Provider; + use crate::time_zone::ffi::TimeZone; + use alloc::string::String; + use core::str::FromStr; + use diplomat_runtime::{DiplomatOption, DiplomatWrite}; + use diplomat_runtime::{DiplomatStr, DiplomatStr16}; + use writeable::Writeable; + + #[diplomat::opaque] + pub struct PlainTime(pub(crate) temporal_rs::PlainTime); + + pub struct PartialTime { + pub hour: DiplomatOption, + pub minute: DiplomatOption, + pub second: DiplomatOption, + pub millisecond: DiplomatOption, + pub microsecond: DiplomatOption, + pub nanosecond: DiplomatOption, + } + + impl PlainTime { + pub fn try_new_constrain( + hour: u8, + minute: u8, + second: u8, + millisecond: u16, + microsecond: u16, + nanosecond: u16, + ) -> Result, TemporalError> { + temporal_rs::PlainTime::new(hour, minute, second, millisecond, microsecond, nanosecond) + .map(|x| Box::new(PlainTime(x))) + .map_err(Into::into) + } + pub fn try_new( + hour: u8, + minute: u8, + second: u8, + millisecond: u16, + microsecond: u16, + nanosecond: u16, + ) -> Result, TemporalError> { + temporal_rs::PlainTime::try_new( + hour, + minute, + second, + millisecond, + microsecond, + nanosecond, + ) + .map(|x| Box::new(PlainTime(x))) + .map_err(Into::into) + } + + pub fn from_partial( + partial: PartialTime, + overflow: Option, + ) -> Result, TemporalError> { + temporal_rs::PlainTime::from_partial(partial.into(), overflow.map(Into::into)) + .map(|x| Box::new(PlainTime(x))) + .map_err(Into::into) + } + + #[cfg(feature = "compiled_data")] + pub fn from_epoch_milliseconds(ms: i64, tz: TimeZone) -> Result, TemporalError> { + Self::from_epoch_milliseconds_with_provider(ms, tz, &Provider::compiled()) + } + pub fn from_epoch_milliseconds_with_provider<'p>( + ms: i64, + tz: TimeZone, + p: &Provider<'p>, + ) -> Result, TemporalError> { + let zdt = crate::zoned_date_time::zdt_from_epoch_ms_with_provider(ms, tz.into(), p)?; + Ok(Box::new(Self(zdt.to_plain_time()))) + } + + #[cfg(feature = "compiled_data")] + pub fn from_epoch_nanoseconds( + ns: I128Nanoseconds, + tz: TimeZone, + ) -> Result, TemporalError> { + Self::from_epoch_nanoseconds_with_provider(ns, tz, &Provider::compiled()) + } + pub fn from_epoch_nanoseconds_with_provider<'p>( + ns: I128Nanoseconds, + tz: TimeZone, + p: &Provider<'p>, + ) -> Result, TemporalError> { + let zdt = crate::zoned_date_time::zdt_from_epoch_ns_with_provider(ns, tz.into(), p)?; + Ok(Box::new(Self(zdt.to_plain_time()))) + } + + pub fn with( + &self, + partial: PartialTime, + overflow: Option, + ) -> Result, TemporalError> { + self.0 + .with(partial.into(), overflow.map(Into::into)) + .map(|x| Box::new(PlainTime(x))) + .map_err(Into::into) + } + + pub fn from_utf8(s: &DiplomatStr) -> Result, TemporalError> { + temporal_rs::PlainTime::from_utf8(s) + .map(|c| Box::new(Self(c))) + .map_err(Into::into) + } + + pub fn from_utf16(s: &DiplomatStr16) -> Result, TemporalError> { + // TODO(#275) This should not need to convert + let s = String::from_utf16(s).map_err(|_| temporal_rs::TemporalError::range())?; + temporal_rs::PlainTime::from_str(&s) + .map(|c| Box::new(Self(c))) + .map_err(Into::into) + } + + pub fn hour(&self) -> u8 { + self.0.hour() + } + pub fn minute(&self) -> u8 { + self.0.minute() + } + pub fn second(&self) -> u8 { + self.0.second() + } + pub fn millisecond(&self) -> u16 { + self.0.millisecond() + } + pub fn microsecond(&self) -> u16 { + self.0.microsecond() + } + pub fn nanosecond(&self) -> u16 { + self.0.nanosecond() + } + + pub fn add(&self, duration: &Duration) -> Result, TemporalError> { + self.0 + .add(&duration.0) + .map(|x| Box::new(Self(x))) + .map_err(Into::into) + } + pub fn subtract(&self, duration: &Duration) -> Result, TemporalError> { + self.0 + .subtract(&duration.0) + .map(|x| Box::new(Self(x))) + .map_err(Into::into) + } + pub fn until( + &self, + other: &Self, + settings: DifferenceSettings, + ) -> Result, TemporalError> { + self.0 + .until(&other.0, settings.try_into()?) + .map(|x| Box::new(Duration(x))) + .map_err(Into::into) + } + pub fn since( + &self, + other: &Self, + settings: DifferenceSettings, + ) -> Result, TemporalError> { + self.0 + .since(&other.0, settings.try_into()?) + .map(|x| Box::new(Duration(x))) + .map_err(Into::into) + } + pub fn equals(&self, other: &Self) -> bool { + self.0 == other.0 + } + pub fn compare(one: &Self, two: &Self) -> core::cmp::Ordering { + let tuple1 = ( + one.hour(), + one.minute(), + one.second(), + one.millisecond(), + one.microsecond(), + one.nanosecond(), + ); + let tuple2 = ( + two.hour(), + two.minute(), + two.second(), + two.millisecond(), + two.microsecond(), + two.nanosecond(), + ); + + tuple1.cmp(&tuple2) + } + pub fn round(&self, options: RoundingOptions) -> Result, TemporalError> { + self.0 + .round(options.try_into()?) + .map(|x| Box::new(Self(x))) + .map_err(Into::into) + } + pub fn to_ixdtf_string( + &self, + options: ToStringRoundingOptions, + write: &mut DiplomatWrite, + ) -> Result<(), TemporalError> { + let writeable = self.0.to_ixdtf_writeable(options.into())?; + // This can only fail in cases where the DiplomatWriteable is capped, we + // don't care about that. + let _ = writeable.write_to(write); + + Ok(()) + } + + #[allow(clippy::should_implement_trait)] + pub fn clone(&self) -> Box { + Box::new(Self(self.0)) + } + } +} + +impl From for temporal_rs::partial::PartialTime { + fn from(other: ffi::PartialTime) -> Self { + Self { + hour: other.hour.into(), + minute: other.minute.into(), + second: other.second.into(), + millisecond: other.millisecond.into(), + microsecond: other.microsecond.into(), + nanosecond: other.nanosecond.into(), + } + } +} diff --git a/deps/temporal/temporal_capi/src/plain_year_month.rs b/deps/temporal/temporal_capi/src/plain_year_month.rs new file mode 100644 index 00000000000000..066bbd77593aa0 --- /dev/null +++ b/deps/temporal/temporal_capi/src/plain_year_month.rs @@ -0,0 +1,221 @@ +#[diplomat::bridge] +#[diplomat::abi_rename = "temporal_rs_{0}"] +pub mod ffi { + use crate::calendar::ffi::{AnyCalendarKind, Calendar}; + use crate::duration::ffi::Duration; + use crate::error::ffi::TemporalError; + use crate::provider::ffi::Provider; + use crate::time_zone::ffi::TimeZone; + use alloc::boxed::Box; + + use crate::options::ffi::{ArithmeticOverflow, DifferenceSettings, DisplayCalendar}; + use crate::plain_date::ffi::{PartialDate, PlainDate}; + use alloc::string::String; + use core::fmt::Write; + use diplomat_runtime::DiplomatWrite; + use diplomat_runtime::{DiplomatStr, DiplomatStr16}; + use writeable::Writeable; + + use core::str::FromStr; + + #[diplomat::opaque] + pub struct PlainYearMonth(pub(crate) temporal_rs::PlainYearMonth); + + impl PlainYearMonth { + pub fn try_new_with_overflow( + year: i32, + month: u8, + reference_day: Option, + calendar: AnyCalendarKind, + overflow: ArithmeticOverflow, + ) -> Result, TemporalError> { + temporal_rs::PlainYearMonth::new_with_overflow( + year, + month, + reference_day, + temporal_rs::Calendar::new(calendar.into()), + overflow.into(), + ) + .map(|x| Box::new(PlainYearMonth(x))) + .map_err(Into::into) + } + + pub fn from_partial( + partial: PartialDate, + overflow: Option, + ) -> Result, TemporalError> { + temporal_rs::PlainYearMonth::from_partial(partial.try_into()?, overflow.map(Into::into)) + .map(|x| Box::new(Self(x))) + .map_err(Into::into) + } + + pub fn from_parsed( + parsed: &crate::plain_date::ffi::ParsedDate, + ) -> Result, TemporalError> { + temporal_rs::PlainYearMonth::from_parsed(parsed.0) + .map(|x| Box::new(PlainYearMonth(x))) + .map_err(Into::into) + } + + pub fn with( + &self, + partial: PartialDate, + overflow: Option, + ) -> Result, TemporalError> { + let fields: temporal_rs::fields::YearMonthCalendarFields = partial.try_into()?; + self.0 + .with(fields, overflow.map(Into::into)) + .map(|x| Box::new(Self(x))) + .map_err(Into::into) + } + + pub fn from_utf8(s: &DiplomatStr) -> Result, TemporalError> { + temporal_rs::PlainYearMonth::from_utf8(s) + .map(|c| Box::new(Self(c))) + .map_err(Into::into) + } + + pub fn from_utf16(s: &DiplomatStr16) -> Result, TemporalError> { + // TODO(#275) This should not need to convert + let s = String::from_utf16(s).map_err(|_| temporal_rs::TemporalError::range())?; + temporal_rs::PlainYearMonth::from_str(&s) + .map(|c| Box::new(Self(c))) + .map_err(Into::into) + } + + pub fn year(&self) -> i32 { + self.0.year() + } + pub fn month(&self) -> u8 { + self.0.month() + } + pub fn month_code(&self, write: &mut DiplomatWrite) { + let code = self.0.month_code(); + // throw away the error, this should always succeed + let _ = write.write_str(code.as_str()); + } + + pub fn in_leap_year(&self) -> bool { + self.0.in_leap_year() + } + pub fn days_in_month(&self) -> u16 { + self.0.days_in_month() + } + pub fn days_in_year(&self) -> u16 { + self.0.days_in_year() + } + pub fn months_in_year(&self) -> u16 { + self.0.months_in_year() + } + // Writes an empty string for no era + pub fn era(&self, write: &mut DiplomatWrite) { + let era = self.0.era(); + if let Some(era) = era { + // throw away the error, this should always succeed + let _ = write.write_str(&era); + } + } + + pub fn era_year(&self) -> Option { + self.0.era_year() + } + + pub fn calendar<'a>(&'a self) -> &'a Calendar { + Calendar::transparent_convert(self.0.calendar()) + } + pub fn add( + &self, + duration: &Duration, + overflow: ArithmeticOverflow, + ) -> Result, TemporalError> { + self.0 + .add(&duration.0, overflow.into()) + .map(|x| Box::new(Self(x))) + .map_err(Into::into) + } + pub fn subtract( + &self, + duration: &Duration, + overflow: ArithmeticOverflow, + ) -> Result, TemporalError> { + self.0 + .subtract(&duration.0, overflow.into()) + .map(|x| Box::new(Self(x))) + .map_err(Into::into) + } + pub fn until( + &self, + other: &Self, + settings: DifferenceSettings, + ) -> Result, TemporalError> { + self.0 + .until(&other.0, settings.try_into()?) + .map(|x| Box::new(Duration(x))) + .map_err(Into::into) + } + pub fn since( + &self, + other: &Self, + settings: DifferenceSettings, + ) -> Result, TemporalError> { + self.0 + .since(&other.0, settings.try_into()?) + .map(|x| Box::new(Duration(x))) + .map_err(Into::into) + } + pub fn equals(&self, other: &Self) -> bool { + self.0 == other.0 + } + pub fn compare(one: &Self, two: &Self) -> core::cmp::Ordering { + one.0.compare_iso(&two.0) + } + pub fn to_plain_date( + &self, + day: Option, + ) -> Result, TemporalError> { + self.0 + .to_plain_date(day.map(|d| d.try_into()).transpose()?) + .map(|x| Box::new(PlainDate(x))) + .map_err(Into::into) + } + + #[cfg(feature = "compiled_data")] + pub fn epoch_ms_for(&self, time_zone: TimeZone) -> Result { + self.epoch_ms_for_with_provider(time_zone, &Provider::compiled()) + } + pub fn epoch_ms_for_with_provider<'p>( + &self, + time_zone: TimeZone, + p: &Provider<'p>, + ) -> Result { + let ns = with_provider!(p, |p| self + .0 + .epoch_ns_for_with_provider(time_zone.into(), p)) + .map_err(TemporalError::from)?; + + let ns_i128 = ns.as_i128(); + let ms = ns_i128 / 1_000_000; + if let Ok(ms) = i64::try_from(ms) { + Ok(ms) + } else { + Err(TemporalError::assert("Found an out-of-range YearMonth")) + } + } + + pub fn to_ixdtf_string( + &self, + display_calendar: DisplayCalendar, + write: &mut DiplomatWrite, + ) { + let writeable = self.0.to_ixdtf_writeable(display_calendar.into()); + // This can only fail in cases where the DiplomatWriteable is capped, we + // don't care about that. + let _ = writeable.write_to(write); + } + + #[allow(clippy::should_implement_trait)] + pub fn clone(&self) -> Box { + Box::new(Self(self.0.clone())) + } + } +} diff --git a/deps/temporal/temporal_capi/src/provider.rs b/deps/temporal/temporal_capi/src/provider.rs new file mode 100644 index 00000000000000..70b4e39ef8bf2a --- /dev/null +++ b/deps/temporal/temporal_capi/src/provider.rs @@ -0,0 +1,90 @@ +use core::marker::PhantomData; +#[cfg(feature = "zoneinfo64")] +use timezone_provider::zoneinfo64::ZoneInfo64TzdbProvider; + +/// We use a macro to avoid dynamic dispatch: a given codebase will +/// typically only be compiled with a single provider. +macro_rules! with_provider( + ($provider:ident, |$p:ident| $code:expr) => { + match $provider.0 { + #[cfg(feature = "zoneinfo64")] + crate::provider::ProviderInner::ZoneInfo64(ref zi) => { + let $p = zi; + $code + } + #[cfg(feature = "compiled_data")] + crate::provider::ProviderInner::Compiled => { + let $p = &*temporal_rs::provider::COMPILED_TZ_PROVIDER; + $code + } + crate::provider::ProviderInner::Empty(..) => { + return Err(TemporalError::assert("Failed to load timezone info")); + // This ensures that type inference still works with --no-default-features + #[allow(dead_code)] { + let $p = &timezone_provider::provider::NeverProvider::default(); + $code + } + } + } + }; +); + +#[diplomat::bridge] +#[diplomat::abi_rename = "temporal_rs_{0}"] +pub mod ffi { + use super::ProviderInner; + use alloc::boxed::Box; + + use core::marker::PhantomData; + + #[cfg(feature = "zoneinfo64")] + use zoneinfo64::ZoneInfo64; + + /// A time zone data provider + #[diplomat::opaque] + pub struct Provider<'a>(pub(crate) ProviderInner<'a>); + + impl<'a> Provider<'a> { + #[cfg(feature = "zoneinfo64")] + /// Construct a provider backed by a zoneinfo64.res file + /// + /// This failing to construct is not a Temporal error, so it just returns () + #[allow( + clippy::result_unit_err, + reason = "Diplomat distinguishes between Result and Option" + )] + pub fn new_zoneinfo64(data: &'a [u32]) -> Result>, ()> { + let zi64 = ZoneInfo64::try_from_u32s(data).map_err(|_| ())?; + let data = super::ZoneInfo64TzdbProvider::new(zi64); + + Ok(Box::new(Self(ProviderInner::ZoneInfo64(data)))) + } + + #[cfg(feature = "compiled_data")] + pub fn new_compiled() -> Box { + Box::new(Self(ProviderInner::Compiled)) + } + + /// For internal use + #[cfg(feature = "compiled_data")] + pub(crate) fn compiled() -> Self { + Self(ProviderInner::Compiled) + } + + /// Fallback type in case construction does not work. + pub fn empty() -> Box { + Box::new(Self(ProviderInner::Empty(PhantomData))) + } + } +} + +pub(crate) enum ProviderInner<'a> { + #[cfg(feature = "zoneinfo64")] + ZoneInfo64(ZoneInfo64TzdbProvider<'a>), + + #[cfg(feature = "compiled_data")] + Compiled, + + /// This avoids unused lifetime errors when the feature is disabled + Empty(PhantomData<&'a u8>), +} diff --git a/deps/temporal/temporal_capi/src/time_zone.rs b/deps/temporal/temporal_capi/src/time_zone.rs new file mode 100644 index 00000000000000..60cb33bdf3a8e8 --- /dev/null +++ b/deps/temporal/temporal_capi/src/time_zone.rs @@ -0,0 +1,156 @@ +use temporal_rs::provider::TimeZoneId; +use temporal_rs::UtcOffset; +use timezone_provider::provider::{NormalizedId, ResolvedId}; + +#[diplomat::bridge] +#[diplomat::abi_rename = "temporal_rs_{0}"] +pub mod ffi { + use crate::error::ffi::TemporalError; + use crate::provider::ffi::Provider; + use core::fmt::Write; + use diplomat_runtime::DiplomatWrite; + + /// A type representing a time zone over FFI. + /// + /// It is not recommended to directly manipulate the fields of this type. + #[derive(Copy, Clone)] + pub struct TimeZone { + /// The UTC offset in minutes (is_iana_id = false) + pub offset_minutes: i16, + /// An id which can be used with the resolver (is_iana_id = true) + pub resolved_id: usize, + /// An id which can be used with the normalizer (is_iana_id = true) + pub normalized_id: usize, + /// Whether this is an IANA id or an offset + pub is_iana_id: bool, + } + + impl TimeZone { + #[cfg(feature = "compiled_data")] + pub fn try_from_identifier_str(ident: &DiplomatStr) -> Result { + Self::try_from_identifier_str_with_provider(ident, &Provider::compiled()) + } + pub fn try_from_identifier_str_with_provider<'p>( + ident: &DiplomatStr, + p: &Provider<'p>, + ) -> Result { + let Ok(ident) = core::str::from_utf8(ident) else { + return Err(temporal_rs::TemporalError::range().into()); + }; + with_provider!(p, |p| { + temporal_rs::TimeZone::try_from_identifier_str_with_provider(ident, p) + }) + .map(Into::into) + .map_err(Into::into) + } + pub fn try_from_offset_str(ident: &DiplomatStr) -> Result { + temporal_rs::UtcOffset::from_utf8(ident) + .map(|x| temporal_rs::TimeZone::UtcOffset(x).into()) + .map_err(Into::into) + } + #[cfg(feature = "compiled_data")] + pub fn try_from_str(ident: &DiplomatStr) -> Result { + Self::try_from_str_with_provider(ident, &Provider::compiled()) + } + pub fn try_from_str_with_provider<'p>( + ident: &DiplomatStr, + p: &Provider<'p>, + ) -> Result { + let Ok(ident) = core::str::from_utf8(ident) else { + return Err(temporal_rs::TemporalError::range().into()); + }; + with_provider!(p, |p| temporal_rs::TimeZone::try_from_str_with_provider( + ident, p + )) + .map(Into::into) + .map_err(Into::into) + } + + #[cfg(feature = "compiled_data")] + pub fn identifier(self, write: &mut DiplomatWrite) { + let _ = self.identifier_with_provider(&Provider::compiled(), write); + } + + pub fn identifier_with_provider<'p>( + self, + p: &Provider<'p>, + write: &mut DiplomatWrite, + ) -> Result<(), TemporalError> { + // TODO ideally this would use Writeable instead of allocating + let s = + with_provider!(p, |p| self.tz().identifier_with_provider(p)).unwrap_or_default(); + + // This can only fail in cases where the DiplomatWriteable is capped, we + // don't care about that. + let _ = write.write_str(&s); + Ok(()) + } + + #[cfg(feature = "compiled_data")] + pub fn utc() -> Self { + temporal_rs::TimeZone::utc().into() + } + + pub fn utc_with_provider<'p>(p: &Provider<'p>) -> Result { + Ok(with_provider!(p, |p| { temporal_rs::TimeZone::utc_with_provider(p) }).into()) + } + + /// Create a TimeZone that represents +00:00 + /// + /// This is the only way to infallibly make a TimeZone without compiled_data, + /// and can be used as a fallback. + pub fn zero() -> Self { + temporal_rs::TimeZone::UtcOffset(Default::default()).into() + } + + /// Get the primary time zone identifier corresponding to this time zone + #[cfg(feature = "compiled_data")] + pub fn primary_identifier(self) -> Result { + self.primary_identifier_with_provider(&Provider::compiled()) + } + pub fn primary_identifier_with_provider<'p>( + self, + p: &Provider<'p>, + ) -> Result { + with_provider!(p, |p| self.tz().primary_identifier_with_provider(p)) + .map(Into::into) + .map_err(Into::into) + } + + pub(crate) fn tz(self) -> temporal_rs::TimeZone { + self.into() + } + } +} + +impl From for temporal_rs::TimeZone { + fn from(other: ffi::TimeZone) -> Self { + if other.is_iana_id { + Self::IanaIdentifier(TimeZoneId { + normalized: NormalizedId(other.normalized_id), + resolved: ResolvedId(other.resolved_id), + }) + } else { + Self::UtcOffset(UtcOffset::from_minutes(other.offset_minutes)) + } + } +} + +impl From for ffi::TimeZone { + fn from(other: temporal_rs::TimeZone) -> Self { + match other { + temporal_rs::TimeZone::UtcOffset(offset) => Self { + offset_minutes: offset.minutes(), + is_iana_id: false, + normalized_id: 0, + resolved_id: 0, + }, + temporal_rs::TimeZone::IanaIdentifier(id) => Self { + normalized_id: id.normalized.0, + resolved_id: id.resolved.0, + is_iana_id: true, + offset_minutes: 0, + }, + } + } +} diff --git a/deps/temporal/temporal_capi/src/zoned_date_time.rs b/deps/temporal/temporal_capi/src/zoned_date_time.rs new file mode 100644 index 00000000000000..6d39b3ee177f37 --- /dev/null +++ b/deps/temporal/temporal_capi/src/zoned_date_time.rs @@ -0,0 +1,806 @@ +use crate::error::ffi::TemporalError; +use crate::instant::ffi::I128Nanoseconds; +use crate::provider::ffi::Provider; +use temporal_rs::options::RelativeTo; + +#[diplomat::bridge] +#[diplomat::abi_rename = "temporal_rs_{0}"] +pub mod ffi { + use crate::calendar::ffi::AnyCalendarKind; + use crate::calendar::ffi::Calendar; + use crate::duration::ffi::Duration; + use crate::error::ffi::TemporalError; + use crate::plain_date::ffi::{PartialDate, PlainDate}; + use crate::plain_date_time::ffi::PlainDateTime; + use crate::plain_time::ffi::{PartialTime, PlainTime}; + use alloc::boxed::Box; + + use crate::provider::ffi::Provider; + + use crate::instant::ffi::I128Nanoseconds; + use crate::instant::ffi::Instant; + use crate::options::ffi::{ + ArithmeticOverflow, DifferenceSettings, Disambiguation, DisplayCalendar, DisplayOffset, + DisplayTimeZone, OffsetDisambiguation, RoundingOptions, ToStringRoundingOptions, + TransitionDirection, + }; + + use crate::time_zone::ffi::TimeZone; + + use alloc::string::String; + use core::fmt::Write; + + use diplomat_runtime::DiplomatOption; + use diplomat_runtime::DiplomatStrSlice; + use diplomat_runtime::DiplomatWrite; + + pub struct PartialZonedDateTime<'a> { + pub date: PartialDate<'a>, + pub time: PartialTime, + pub offset: DiplomatOption>, + pub timezone: DiplomatOption, + } + + pub struct RelativeTo<'a> { + pub date: Option<&'a PlainDate>, + pub zoned: Option<&'a ZonedDateTime>, + } + + /// GetTemporalRelativeToOption can create fresh PlainDate/ZonedDateTimes by parsing them, + /// we need a way to produce that result. + #[diplomat::out] + pub struct OwnedRelativeTo { + pub date: Option>, + pub zoned: Option>, + } + + impl OwnedRelativeTo { + #[cfg(feature = "compiled_data")] + pub fn from_utf8(s: &DiplomatStr) -> Result { + Self::from_utf8_with_provider(s, &Provider::compiled()) + } + pub fn from_utf8_with_provider<'p>( + s: &DiplomatStr, + p: &Provider<'p>, + ) -> Result { + // TODO(#275) This should not need to check + let s = core::str::from_utf8(s).map_err(|_| temporal_rs::TemporalError::range())?; + + with_provider!(p, |p| super::RelativeTo::try_from_str_with_provider(s, p)) + .map(Into::into) + .map_err(Into::::into) + } + + #[cfg(feature = "compiled_data")] + pub fn from_utf16(s: &DiplomatStr16) -> Result { + Self::from_utf16_with_provider(s, &Provider::compiled()) + } + pub fn from_utf16_with_provider<'p>( + s: &DiplomatStr16, + p: &Provider<'p>, + ) -> Result { + // TODO(#275) This should not need to convert + let s = String::from_utf16(s).map_err(|_| temporal_rs::TemporalError::range())?; + with_provider!(p, |p| super::RelativeTo::try_from_str_with_provider(&s, p)) + .map(Into::into) + .map_err(Into::::into) + } + + pub fn empty() -> Self { + Self { + date: None, + zoned: None, + } + } + } + + #[diplomat::opaque] + pub struct ParsedZonedDateTime(temporal_rs::parsed_intermediates::ParsedZonedDateTime); + + impl ParsedZonedDateTime { + #[cfg(feature = "compiled_data")] + pub fn from_utf8(s: &DiplomatStr) -> Result, TemporalError> { + Self::from_utf8_with_provider(s, &Provider::compiled()) + } + pub fn from_utf8_with_provider<'p>( + s: &DiplomatStr, + p: &Provider<'p>, + ) -> Result, TemporalError> { + with_provider!(p, |p| { + temporal_rs::parsed_intermediates::ParsedZonedDateTime::from_utf8_with_provider( + s, p, + ) + }) + .map(|x| Box::new(ParsedZonedDateTime(x))) + .map_err(Into::::into) + } + + #[cfg(feature = "compiled_data")] + pub fn from_utf16(s: &DiplomatStr16) -> Result, TemporalError> { + Self::from_utf16_with_provider(s, &Provider::compiled()) + } + pub fn from_utf16_with_provider<'p>( + s: &DiplomatStr16, + p: &Provider<'p>, + ) -> Result, TemporalError> { + // TODO(#275) This should not need to convert + let s = String::from_utf16(s).map_err(|_| temporal_rs::TemporalError::range())?; + + with_provider!(p, |p| { + temporal_rs::parsed_intermediates::ParsedZonedDateTime::from_utf8_with_provider( + s.as_bytes(), + p, + ) + }) + .map(|x| Box::new(ParsedZonedDateTime(x))) + .map_err(Into::::into) + } + } + + #[diplomat::opaque] + pub struct ZonedDateTime(pub(crate) temporal_rs::ZonedDateTime); + + impl ZonedDateTime { + #[cfg(feature = "compiled_data")] + pub fn try_new( + nanosecond: I128Nanoseconds, + calendar: AnyCalendarKind, + time_zone: TimeZone, + ) -> Result, TemporalError> { + Self::try_new_with_provider(nanosecond, calendar, time_zone, &Provider::compiled()) + } + pub fn try_new_with_provider<'p>( + nanosecond: I128Nanoseconds, + calendar: AnyCalendarKind, + time_zone: TimeZone, + p: &Provider<'p>, + ) -> Result, TemporalError> { + with_provider!(p, |p| temporal_rs::ZonedDateTime::try_new_with_provider( + nanosecond.into(), + time_zone.into(), + temporal_rs::Calendar::new(calendar.into()), + p + )) + .map(|x| Box::new(ZonedDateTime(x))) + .map_err(Into::into) + } + #[cfg(feature = "compiled_data")] + pub fn from_partial( + partial: PartialZonedDateTime, + overflow: Option, + disambiguation: Option, + offset_option: Option, + ) -> Result, TemporalError> { + Self::from_partial_with_provider( + partial, + overflow, + disambiguation, + offset_option, + &Provider::compiled(), + ) + } + pub fn from_partial_with_provider<'p>( + partial: PartialZonedDateTime, + overflow: Option, + disambiguation: Option, + offset_option: Option, + p: &Provider<'p>, + ) -> Result, TemporalError> { + with_provider!(p, |p| { + temporal_rs::ZonedDateTime::from_partial_with_provider( + partial.try_into()?, + overflow.map(Into::into), + disambiguation.map(Into::into), + offset_option.map(Into::into), + p, + ) + }) + .map(|x| Box::new(ZonedDateTime(x))) + .map_err(Into::into) + } + #[cfg(feature = "compiled_data")] + pub fn from_parsed( + parsed: &ParsedZonedDateTime, + disambiguation: Disambiguation, + offset_option: OffsetDisambiguation, + ) -> Result, TemporalError> { + Self::from_parsed_with_provider( + parsed, + disambiguation, + offset_option, + &Provider::compiled(), + ) + } + pub fn from_parsed_with_provider<'p>( + parsed: &ParsedZonedDateTime, + disambiguation: Disambiguation, + offset_option: OffsetDisambiguation, + p: &Provider<'p>, + ) -> Result, TemporalError> { + with_provider!( + p, + |p| temporal_rs::ZonedDateTime::from_parsed_with_provider( + parsed.0.clone(), + disambiguation.into(), + offset_option.into(), + p + ) + ) + .map(|x| Box::new(ZonedDateTime(x))) + .map_err(Into::into) + } + #[cfg(feature = "compiled_data")] + pub fn from_utf8( + s: &DiplomatStr, + disambiguation: Disambiguation, + offset_disambiguation: OffsetDisambiguation, + ) -> Result, TemporalError> { + Self::from_utf8_with_provider( + s, + disambiguation, + offset_disambiguation, + &Provider::compiled(), + ) + } + pub fn from_utf8_with_provider<'p>( + s: &DiplomatStr, + disambiguation: Disambiguation, + offset_disambiguation: OffsetDisambiguation, + p: &Provider<'p>, + ) -> Result, TemporalError> { + // TODO(#275) This should not need to check + with_provider!(p, |p| temporal_rs::ZonedDateTime::from_utf8_with_provider( + s, + disambiguation.into(), + offset_disambiguation.into(), + p + )) + .map(|c| Box::new(Self(c))) + .map_err(Into::into) + } + #[cfg(feature = "compiled_data")] + pub fn from_utf16( + s: &DiplomatStr16, + disambiguation: Disambiguation, + offset_disambiguation: OffsetDisambiguation, + ) -> Result, TemporalError> { + Self::from_utf16_with_provider( + s, + disambiguation, + offset_disambiguation, + &Provider::compiled(), + ) + } + pub fn from_utf16_with_provider<'p>( + s: &DiplomatStr16, + disambiguation: Disambiguation, + offset_disambiguation: OffsetDisambiguation, + p: &Provider<'p>, + ) -> Result, TemporalError> { + // TODO(#275) This should not need to convert + let s = String::from_utf16(s).map_err(|_| temporal_rs::TemporalError::range())?; + with_provider!(p, |p| temporal_rs::ZonedDateTime::from_utf8_with_provider( + s.as_bytes(), + disambiguation.into(), + offset_disambiguation.into(), + p + )) + .map(|c| Box::new(Self(c))) + .map_err(Into::into) + } + + pub fn epoch_milliseconds(&self) -> i64 { + self.0.epoch_milliseconds() + } + + #[cfg(feature = "compiled_data")] + pub fn from_epoch_milliseconds(ms: i64, tz: TimeZone) -> Result, TemporalError> { + Self::from_epoch_milliseconds_with_provider(ms, tz, &Provider::compiled()) + } + pub fn from_epoch_milliseconds_with_provider<'p>( + ms: i64, + tz: TimeZone, + p: &Provider<'p>, + ) -> Result, TemporalError> { + super::zdt_from_epoch_ms_with_provider(ms, tz.into(), p).map(|c| Box::new(Self(c))) + } + + #[cfg(feature = "compiled_data")] + pub fn from_epoch_nanoseconds( + ns: I128Nanoseconds, + tz: TimeZone, + ) -> Result, TemporalError> { + Self::from_epoch_nanoseconds_with_provider(ns, tz, &Provider::compiled()) + } + pub fn from_epoch_nanoseconds_with_provider<'p>( + ns: I128Nanoseconds, + tz: TimeZone, + p: &Provider<'p>, + ) -> Result, TemporalError> { + let zdt = crate::zoned_date_time::zdt_from_epoch_ns_with_provider(ns, tz.into(), p)?; + Ok(Box::new(Self(zdt))) + } + + pub fn epoch_nanoseconds(&self) -> I128Nanoseconds { + self.0.epoch_nanoseconds().as_i128().into() + } + + pub fn offset_nanoseconds(&self) -> i64 { + self.0.offset_nanoseconds() + } + + pub fn to_instant(&self) -> Box { + Box::new(Instant(self.0.to_instant())) + } + + #[cfg(feature = "compiled_data")] + pub fn with( + &self, + partial: PartialZonedDateTime, + disambiguation: Option, + offset_option: Option, + overflow: Option, + ) -> Result, TemporalError> { + self.with_with_provider( + partial, + disambiguation, + offset_option, + overflow, + &Provider::compiled(), + ) + } + pub fn with_with_provider<'p>( + &self, + partial: PartialZonedDateTime, + disambiguation: Option, + offset_option: Option, + overflow: Option, + p: &Provider<'p>, + ) -> Result, TemporalError> { + with_provider!(p, |p| self.0.with_with_provider( + partial.try_into()?, + disambiguation.map(Into::into), + offset_option.map(Into::into), + overflow.map(Into::into), + p + )) + .map(|x| Box::new(ZonedDateTime(x))) + .map_err(Into::into) + } + + #[cfg(feature = "compiled_data")] + pub fn with_timezone(&self, zone: TimeZone) -> Result, TemporalError> { + self.with_timezone_with_provider(zone, &Provider::compiled()) + } + pub fn with_timezone_with_provider<'p>( + &self, + zone: TimeZone, + p: &Provider<'p>, + ) -> Result, TemporalError> { + with_provider!(p, |p| self.0.with_time_zone_with_provider(zone.into(), p)) + .map(|x| Box::new(ZonedDateTime(x))) + .map_err(Into::into) + } + + pub fn timezone(&self) -> TimeZone { + TimeZone::from(*self.0.time_zone()) + } + + pub fn compare_instant(&self, other: &Self) -> core::cmp::Ordering { + self.0.compare_instant(&other.0) + } + + #[cfg(feature = "compiled_data")] + pub fn equals(&self, other: &Self) -> bool { + self.equals_with_provider(other, &Provider::compiled()) + .unwrap_or(false) + } + pub fn equals_with_provider<'p>( + &self, + other: &Self, + p: &Provider<'p>, + ) -> Result { + with_provider!(p, |p| self.0.equals_with_provider(&other.0, p)).map_err(Into::into) + } + + pub fn offset(&self, write: &mut DiplomatWrite) -> Result<(), TemporalError> { + let string = self.0.offset(); + // throw away the error, this should always succeed + let _ = write.write_str(&string); + Ok(()) + } + + #[cfg(feature = "compiled_data")] + pub fn start_of_day(&self) -> Result, TemporalError> { + self.start_of_day_with_provider(&Provider::compiled()) + } + pub fn start_of_day_with_provider<'p>( + &self, + p: &Provider<'p>, + ) -> Result, TemporalError> { + with_provider!(p, |p| self.0.start_of_day_with_provider(p)) + .map(|x| Box::new(ZonedDateTime(x))) + .map_err(Into::into) + } + + #[cfg(feature = "compiled_data")] + pub fn get_time_zone_transition( + &self, + direction: TransitionDirection, + ) -> Result>, TemporalError> { + self.get_time_zone_transition_with_provider(direction, &Provider::compiled()) + } + pub fn get_time_zone_transition_with_provider<'p>( + &self, + direction: TransitionDirection, + p: &Provider<'p>, + ) -> Result>, TemporalError> { + with_provider!(p, |p| self + .0 + .get_time_zone_transition_with_provider(direction.into(), p)) + .map(|x| x.map(|y| Box::new(ZonedDateTime(y)))) + .map_err(Into::into) + } + + #[cfg(feature = "compiled_data")] + pub fn hours_in_day(&self) -> Result { + self.hours_in_day_with_provider(&Provider::compiled()) + } + pub fn hours_in_day_with_provider<'p>( + &self, + p: &Provider<'p>, + ) -> Result { + with_provider!(p, |p| self.0.hours_in_day_with_provider(p)).map_err(Into::into) + } + + pub fn to_plain_datetime(&self) -> Box { + Box::new(PlainDateTime(self.0.to_plain_date_time())) + } + + pub fn to_plain_date(&self) -> Box { + Box::new(PlainDate(self.0.to_plain_date())) + } + + pub fn to_plain_time(&self) -> Box { + Box::new(PlainTime(self.0.to_plain_time())) + } + + #[cfg(feature = "compiled_data")] + pub fn to_ixdtf_string( + &self, + display_offset: DisplayOffset, + display_timezone: DisplayTimeZone, + display_calendar: DisplayCalendar, + options: ToStringRoundingOptions, + write: &mut DiplomatWrite, + ) -> Result<(), TemporalError> { + self.to_ixdtf_string_with_provider( + display_offset, + display_timezone, + display_calendar, + options, + &Provider::compiled(), + write, + ) + } + pub fn to_ixdtf_string_with_provider<'p>( + &self, + display_offset: DisplayOffset, + display_timezone: DisplayTimeZone, + display_calendar: DisplayCalendar, + options: ToStringRoundingOptions, + p: &Provider<'p>, + write: &mut DiplomatWrite, + ) -> Result<(), TemporalError> { + // TODO this double-allocates, an API returning a Writeable or impl Write would be better + let string = with_provider!(p, |p| self.0.to_ixdtf_string_with_provider( + display_offset.into(), + display_timezone.into(), + display_calendar.into(), + options.into(), + p + )?); + // throw away the error, this should always succeed + let _ = write.write_str(&string); + Ok(()) + } + + // Same as PlainDateTime (non-getters) + pub fn with_calendar(&self, calendar: AnyCalendarKind) -> Box { + Box::new(ZonedDateTime( + self.0 + .with_calendar(temporal_rs::Calendar::new(calendar.into())), + )) + } + #[cfg(feature = "compiled_data")] + pub fn with_plain_time( + &self, + time: Option<&PlainTime>, + ) -> Result, TemporalError> { + self.with_plain_time_and_provider(time, &Provider::compiled()) + } + pub fn with_plain_time_and_provider<'p>( + &self, + time: Option<&PlainTime>, + p: &Provider<'p>, + ) -> Result, TemporalError> { + with_provider!(p, |p| self + .0 + .with_plain_time_and_provider(time.map(|t| t.0), p)) + .map(|x| Box::new(ZonedDateTime(x))) + .map_err(Into::into) + } + #[cfg(feature = "compiled_data")] + pub fn add( + &self, + duration: &Duration, + overflow: Option, + ) -> Result, TemporalError> { + self.add_with_provider(duration, overflow, &Provider::compiled()) + } + pub fn add_with_provider<'p>( + &self, + duration: &Duration, + overflow: Option, + p: &Provider<'p>, + ) -> Result, TemporalError> { + with_provider!(p, |p| self.0.add_with_provider( + &duration.0, + overflow.map(Into::into), + p + )) + .map(|x| Box::new(Self(x))) + .map_err(Into::into) + } + #[cfg(feature = "compiled_data")] + pub fn subtract( + &self, + duration: &Duration, + overflow: Option, + ) -> Result, TemporalError> { + self.subtract_with_provider(duration, overflow, &Provider::compiled()) + } + pub fn subtract_with_provider<'p>( + &self, + duration: &Duration, + overflow: Option, + p: &Provider<'p>, + ) -> Result, TemporalError> { + with_provider!(p, |p| self.0.subtract_with_provider( + &duration.0, + overflow.map(Into::into), + p + )) + .map(|x| Box::new(Self(x))) + .map_err(Into::into) + } + #[cfg(feature = "compiled_data")] + pub fn until( + &self, + other: &Self, + settings: DifferenceSettings, + ) -> Result, TemporalError> { + self.until_with_provider(other, settings, &Provider::compiled()) + } + pub fn until_with_provider<'p>( + &self, + other: &Self, + settings: DifferenceSettings, + p: &Provider<'p>, + ) -> Result, TemporalError> { + with_provider!(p, |p| self.0.until_with_provider( + &other.0, + settings.try_into()?, + p + )) + .map(|x| Box::new(Duration(x))) + .map_err(Into::into) + } + #[cfg(feature = "compiled_data")] + pub fn since( + &self, + other: &Self, + settings: DifferenceSettings, + ) -> Result, TemporalError> { + self.since_with_provider(other, settings, &Provider::compiled()) + } + pub fn since_with_provider<'p>( + &self, + other: &Self, + settings: DifferenceSettings, + p: &Provider<'p>, + ) -> Result, TemporalError> { + with_provider!(p, |p| self.0.since_with_provider( + &other.0, + settings.try_into()?, + p + )) + .map(|x| Box::new(Duration(x))) + .map_err(Into::into) + } + #[cfg(feature = "compiled_data")] + pub fn round(&self, options: RoundingOptions) -> Result, TemporalError> { + self.round_with_provider(options, &Provider::compiled()) + } + pub fn round_with_provider<'p>( + &self, + options: RoundingOptions, + p: &Provider<'p>, + ) -> Result, TemporalError> { + with_provider!(p, |p| self.0.round_with_provider(options.try_into()?, p)) + .map(|x| Box::new(Self(x))) + .map_err(Into::into) + } + + // Same as PlainDateTime (getters) + pub fn hour(&self) -> u8 { + // unwrap_or_default because of + // https://github.com/boa-dev/temporal/issues/548 + self.0.hour() + } + pub fn minute(&self) -> u8 { + self.0.minute() + } + pub fn second(&self) -> u8 { + self.0.second() + } + pub fn millisecond(&self) -> u16 { + self.0.millisecond() + } + pub fn microsecond(&self) -> u16 { + self.0.microsecond() + } + pub fn nanosecond(&self) -> u16 { + self.0.nanosecond() + } + + pub fn calendar<'a>(&'a self) -> &'a Calendar { + Calendar::transparent_convert(self.0.calendar()) + } + pub fn year(&self) -> i32 { + self.0.year() + } + pub fn month(&self) -> u8 { + self.0.month() + } + pub fn month_code(&self, write: &mut DiplomatWrite) { + // https://github.com/boa-dev/temporal/issues/328 for the fallibility + let code = self.0.month_code(); + // throw away the error, this should always succeed + let _ = write.write_str(code.as_str()); + } + pub fn day(&self) -> u8 { + self.0.day() + } + + pub fn day_of_week(&self) -> u16 { + self.0.day_of_week() + } + + pub fn day_of_year(&self) -> u16 { + self.0.day_of_year() + } + + pub fn week_of_year(&self) -> Option { + self.0.week_of_year() + } + + pub fn year_of_week(&self) -> Option { + self.0.year_of_week() + } + + pub fn days_in_week(&self) -> u16 { + self.0.days_in_week() + } + pub fn days_in_month(&self) -> u16 { + self.0.days_in_month() + } + + pub fn days_in_year(&self) -> u16 { + self.0.days_in_year() + } + + pub fn months_in_year(&self) -> u16 { + self.0.months_in_year() + } + + pub fn in_leap_year(&self) -> bool { + self.0.in_leap_year() + } + // Writes an empty string for no era + pub fn era(&self, write: &mut DiplomatWrite) { + let era = self.0.era(); + if let Some(era) = era { + // throw away the error, this should always succeed + let _ = write.write_str(&era); + } + } + + pub fn era_year(&self) -> Option { + self.0.era_year() + } + + #[allow(clippy::should_implement_trait)] + pub fn clone(&self) -> Box { + Box::new(Self(self.0.clone())) + } + } +} + +pub(crate) fn zdt_from_epoch_ms_with_provider<'p>( + ms: i64, + time_zone: temporal_rs::TimeZone, + p: &Provider<'p>, +) -> Result { + let instant = temporal_rs::Instant::from_epoch_milliseconds(ms)?; + with_provider!(p, |p| instant + .to_zoned_date_time_iso_with_provider(time_zone, p)) + .map_err(Into::into) +} + +pub(crate) fn zdt_from_epoch_ns_with_provider<'p>( + ns: I128Nanoseconds, + time_zone: temporal_rs::TimeZone, + p: &Provider<'p>, +) -> Result { + let instant = temporal_rs::Instant::try_new(ns.into())?; + with_provider!(p, |p| instant + .to_zoned_date_time_iso_with_provider(time_zone, p)) + .map_err(Into::into) +} + +impl TryFrom> for temporal_rs::partial::PartialZonedDateTime { + type Error = TemporalError; + fn try_from(other: ffi::PartialZonedDateTime<'_>) -> Result { + let timezone = other.timezone.clone().into_option().map(|x| x.tz()); + let calendar = temporal_rs::Calendar::new(other.date.calendar.into()); + Ok(Self { + fields: other.try_into()?, + timezone, + calendar, + }) + } +} + +impl TryFrom> for temporal_rs::fields::ZonedDateTimeFields { + type Error = TemporalError; + fn try_from(other: ffi::PartialZonedDateTime<'_>) -> Result { + let offset = match other.offset.into_option() { + Some(o) => Some(temporal_rs::UtcOffset::from_utf8(o.into())?), + None => None, + }; + Ok(Self { + calendar_fields: other.date.try_into()?, + time: other.time.into(), + offset, + }) + } +} + +impl From> for Option { + fn from(other: ffi::RelativeTo) -> Self { + if let Some(pd) = other.date { + Some(temporal_rs::options::RelativeTo::PlainDate(pd.0.clone())) + } else { + other + .zoned + .map(|z| temporal_rs::options::RelativeTo::ZonedDateTime(z.0.clone())) + } + } +} + +impl From for ffi::OwnedRelativeTo { + fn from(other: RelativeTo) -> Self { + use alloc::boxed::Box; + match other { + RelativeTo::PlainDate(d) => Self { + date: Some(Box::new(crate::plain_date::ffi::PlainDate(d))), + zoned: None, + }, + RelativeTo::ZonedDateTime(d) => Self { + zoned: Some(Box::new(ffi::ZonedDateTime(d))), + date: None, + }, + } + } +} diff --git a/deps/temporal/temporal_capi/tests/c/Makefile b/deps/temporal/temporal_capi/tests/c/Makefile new file mode 100644 index 00000000000000..91a6fbef024d5d --- /dev/null +++ b/deps/temporal/temporal_capi/tests/c/Makefile @@ -0,0 +1,25 @@ +.DEFAULT_GOAL := test +.PHONY: build test +FORCE: + +HEADERS := ../../bindings/c/ +ALL_HEADERS := $(wildcard ${HEADERS}/**/*.h) + +C?=gcc + +TEST_FILES := $(wildcard *.c) +OUT_FILES = $(patsubst %.c,%.out,$(TEST_FILES)) + +$(ALL_HEADERS): + +../../../target/debug/libtemporal_capi.a: FORCE + cargo rustc -p temporal_capi --crate-type staticlib + +%.out: %.c ../../../target/debug/libtemporal_capi.a $(ALL_HEADERS) + $(C) -L ../../../target/debug/ -I ${HEADERS} $< -ltemporal_capi -lm -o $@ + ./$@ + +test: $(OUT_FILES) + +clean: + rm $(OUT_FILES) diff --git a/deps/temporal/temporal_capi/tests/c/simple.c b/deps/temporal/temporal_capi/tests/c/simple.c new file mode 100644 index 00000000000000..73c2ee66f3d7a8 --- /dev/null +++ b/deps/temporal/temporal_capi/tests/c/simple.c @@ -0,0 +1,33 @@ +#include "ArithmeticOverflow.d.h" +#include "Calendar.h" +#include "DisplayCalendar.d.h" +#include "PlainDate.h" +#include "diplomat_runtime.h" +#include + +int main() { + temporal_rs_PlainDate_try_new_with_overflow_result result = + temporal_rs_PlainDate_try_new_with_overflow(2025, 1, 33, AnyCalendarKind_Gregorian, ArithmeticOverflow_Constrain); + + if (!result.is_ok) { + fprintf(stderr, "failed to create a PlainDate\n"); + return 1; + } + + PlainDate *date = result.ok; + char formatted[40]; + DiplomatWrite write = diplomat_simple_write(formatted, 40); + + temporal_rs_PlainDate_to_ixdtf_string(date, DisplayCalendar_Always, &write); + if (write.grow_failed) { + fprintf(stderr, "format overflowed the string\n"); + temporal_rs_PlainDate_destroy(date); + return 1; + } + + printf("%s\n", formatted); + + temporal_rs_PlainDate_destroy(date); + + return 0; +} diff --git a/deps/temporal/temporal_capi/tests/cpp/Makefile b/deps/temporal/temporal_capi/tests/cpp/Makefile new file mode 100644 index 00000000000000..2e17a4845e311f --- /dev/null +++ b/deps/temporal/temporal_capi/tests/cpp/Makefile @@ -0,0 +1,25 @@ +.DEFAULT_GOAL := test +.PHONY: build test +FORCE: + +HEADERS := ../../bindings/cpp/ +ALL_HEADERS := $(wildcard ${HEADERS}/**/*.hpp) + +CXX?=g++ + +TEST_FILES := $(wildcard *.cpp) +OUT_FILES = $(patsubst %.cpp,%.out,$(TEST_FILES)) + +$(ALL_HEADERS): + +../../../target/debug/libtemporal_capi.a: FORCE + cargo rustc -p temporal_capi --crate-type staticlib + +%.out: %.cpp ../../../target/debug/libtemporal_capi.a $(ALL_HEADERS) + $(CXX) -std=c++17 -L ../../../target/debug/ -I ${HEADERS} $< -ltemporal_capi -lm -o $@ + ./$@ + +test: $(OUT_FILES) + +clean: + rm $(OUT_FILES) diff --git a/deps/temporal/temporal_capi/tests/cpp/simple.cpp b/deps/temporal/temporal_capi/tests/cpp/simple.cpp new file mode 100644 index 00000000000000..98b2ad56d60549 --- /dev/null +++ b/deps/temporal/temporal_capi/tests/cpp/simple.cpp @@ -0,0 +1,15 @@ +#include +#include + +#include + +using namespace temporal_rs; + +int main() { + auto date = PlainDate::try_new_with_overflow(2025, 1, 33, AnyCalendarKind::Gregorian, ArithmeticOverflow::Constrain).ok().value(); + + auto formatted = date->to_ixdtf_string(DisplayCalendar::Always); + + std::cout< io::Result<()>; + + fn write_debug(&self, debug_path: &Path) -> io::Result<()>; +} + +impl BakedDataProvider for ZoneInfoProvider<'_> { + fn write_data(&self, data_path: &Path) -> io::Result<()> { + fs::create_dir_all(data_path)?; + let generated_file = data_path.join("compiled_zoneinfo_provider.rs.data"); + let baked = self.bake(&Default::default()); + + let baked_macro = quote! { + #[macro_export] + macro_rules! compiled_zoneinfo_provider { + ($providername:ident) => { + pub const $providername: &'static timezone_provider::experimental_tzif::ZoneInfoProvider = &#baked; + } + } + }; + let file = syn::parse_file(&baked_macro.to_string()).unwrap(); + let formatted = prettyplease::unparse(&file); + let mut file = BufWriter::new(File::create(generated_file)?); + write!(file, "//@generated\n// (by `bakeddata` binary in temporal_rs, using `databake`)\n\n{formatted}") + } + + fn write_debug(&self, debug_path: &Path) -> io::Result<()> { + let zoneinfo_debug_path = debug_path.join("zoneinfo"); + // Remove zoneinfo directory and recreate, so we can rely on diff of what is + // changed / missing. + if zoneinfo_debug_path.exists() { + fs::remove_dir_all(zoneinfo_debug_path.clone())?; + } + // Recreate directory. + fs::create_dir_all(zoneinfo_debug_path.clone())?; + + let map_file = zoneinfo_debug_path.join("map.json"); + + // Create id sets for the tzifs + let mut tzif_ids: HashMap> = HashMap::new(); + for (identifier, index) in self.ids.to_btreemap().iter() { + if let Some(id_set) = tzif_ids.get_mut(index) { + id_set.insert(identifier.clone()); + } else { + tzif_ids.insert(*index, BTreeSet::from([identifier.clone()])); + } + } + + let tzif_dir_path = zoneinfo_debug_path.join("tzifs"); + fs::create_dir_all(tzif_dir_path.clone())?; + + let mut id_map: BTreeMap = BTreeMap::new(); + for (id, tzif) in self.tzifs.iter().enumerate() { + let mut tzif_data = serde_json::Map::new(); + let id_set = tzif_ids.get(&id).unwrap(); + tzif_data.insert("ids".into(), serde_json::to_value(id_set)?); + tzif_data.insert("tzif".into(), serde_json::to_value(tzif)?); + let filename = format!("tzif-{}-{}.json", hash_ids(id_set), hash_tzif(tzif)); + let filepath = tzif_dir_path.join(filename.clone()); + for id in id_set { + id_map.insert(id.clone(), filename.clone()); + } + fs::write(filepath, serde_json::to_string_pretty(&tzif_data)?)?; + } + + fs::write( + map_file, + format!("{}\n", serde_json::to_string_pretty(&id_map)?), + )?; + + // TODO: Add version + Ok(()) + } +} + +fn hash_ids(set: &BTreeSet) -> String { + let mut hasher = FxHasher::default(); + set.hash(&mut hasher); + format!("{:x}", hasher.finish()) +} + +fn hash_tzif(tzif: &ZeroTzifULE) -> String { + let mut hasher = FxHasher::default(); + tzif.as_bytes().hash(&mut hasher); + format!("{:x}", hasher.finish()) +} + +impl BakedDataProvider for IanaIdentifierNormalizer<'_> { + fn write_data(&self, data_path: &Path) -> io::Result<()> { + fs::create_dir_all(data_path)?; + let generated_file = data_path.join("iana_normalizer.rs.data"); + let baked = self.bake(&Default::default()); + + let baked_macro = quote! { + #[macro_export] + macro_rules! iana_normalizer_singleton { + ($providername:ident) => { + pub const $providername: &'static timezone_provider::IanaIdentifierNormalizer = &#baked; + } + } + }; + let file = syn::parse_file(&baked_macro.to_string()).unwrap(); + let formatted = prettyplease::unparse(&file); + let mut file = BufWriter::new(File::create(generated_file)?); + write!(file, "//@generated\n// (by `bakeddata` binary in temporal_rs, using `databake`)\n\n{formatted}") + } + + fn write_debug(&self, debug_path: &Path) -> io::Result<()> { + fs::create_dir_all(debug_path)?; + let debug_filename = debug_path.join("iana_normalizer.json"); + let json = serde_json::to_string_pretty(self).unwrap(); + fs::write(debug_filename, json) + } +} + +fn write_data_file_with_debug( + data_path: &Path, + provider: &impl BakedDataProvider, +) -> io::Result<()> { + let debug_path = data_path.join("debug"); + provider.write_debug(&debug_path)?; + provider.write_data(data_path) +} + +fn main() -> io::Result<()> { + let manifest_dir = Path::new(env!("CARGO_MANIFEST_DIR")); + let tzdata_input = std::env::var("TZDATA_DIR").unwrap_or("tzdata".into()); + let tzdata_path = Path::new(&tzdata_input); + let tzdata_dir = manifest_dir + .parent() + .unwrap() + .parent() + .unwrap() + .join(tzdata_path); + println!("Using tzdata directory: {tzdata_dir:?}"); + + let provider = Path::new(manifest_dir) + .parent() + .unwrap() + .parent() + .unwrap() + .join("provider/src"); + println!("Using provider directory: {provider:?}"); + + // Write identifiers + write_data_file_with_debug( + &provider.join("data"), + &IanaIdentifierNormalizer::build(&tzdata_dir).unwrap(), + )?; + + // Write tzif data + write_data_file_with_debug( + &provider.join("data"), + &ZoneInfoProvider::build(&tzdata_dir).unwrap(), + ) +} diff --git a/deps/temporal/tools/depcheck/Cargo.toml b/deps/temporal/tools/depcheck/Cargo.toml new file mode 100644 index 00000000000000..dede26c999aa5b --- /dev/null +++ b/deps/temporal/tools/depcheck/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "depcheck" +edition.workspace = true +version.workspace = true +rust-version.workspace = true +authors.workspace = true +license.workspace = true +repository.workspace = true +readme.workspace = true +exclude.workspace = true +publish = false + +[dependencies] diff --git a/deps/temporal/tools/depcheck/src/main.rs b/deps/temporal/tools/depcheck/src/main.rs new file mode 100644 index 00000000000000..2bfbc7580602fc --- /dev/null +++ b/deps/temporal/tools/depcheck/src/main.rs @@ -0,0 +1,191 @@ +//! Test for ensuring that we don't unintentionally add deps + +use std::collections::BTreeSet; +use std::process::{self, Command}; +use std::str; + +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] +struct DepSpec { + crate_name: String, + crate_version: String, +} + +/// Get the deep (fully resolved) dependency list produced by `cargo tree -p {package} -e {edge_kind}` +fn get_dep_list(package: &str, edge_kind: &str, extra_args: &str) -> Vec { + let mut cmd = Command::new("cargo"); + cmd.arg("tree") + .arg("-p") + .arg(package) + .arg("-e") + .arg(edge_kind) + .arg("--no-default-features"); + for arg in extra_args.split(' ') { + if !arg.is_empty() { + cmd.arg(arg); + } + } + let output = cmd.output().expect("Failed to run `cargo tree`"); + + if !output.status.success() { + eprintln!("Failed to run `cargo tree -p {package} -e {edge_kind} --no-default-features {extra_args}`:"); + if let Ok(s) = str::from_utf8(&output.stderr) { + eprintln!("{s}"); + } + process::exit(1); + } + let mut spec: Vec<_> = output + .stdout + .split(|b| *b == b'\n') + .filter_map(|slice| { + if slice.is_empty() { + return None; + } + if slice[0] == b'[' { + // cargo tree output has sections like `[dev-dependencies]` + return None; + } + + let mut iter = slice.split(|b| *b == b' '); + let mut found_crate_name = None; + for section in &mut iter { + if section.is_empty() { + continue; + } + // The format is {line drawing characters} {crate name} {crate version} + if char::from(section[0]).is_ascii_alphabetic() { + found_crate_name = + Some(str::from_utf8(section).expect("Must be utf-8").to_owned()); + break; + } + } + if let Some(crate_name) = found_crate_name { + let crate_version = iter + .next() + .expect("There must be a version after the crate name!"); + let crate_version = str::from_utf8(crate_version) + .expect("Must be utf-8") + .to_owned(); + Some(DepSpec { + crate_name, + crate_version, + }) + } else { + None + } + }) + .collect(); + spec.sort(); + spec.dedup(); + + spec +} + +/// Given a `cargo tree` invocation and the dependency sets to check, checks for any unlisted or duplicated deps +/// +/// `dep_list_name_for_error` is the name of the const above to show in the error suggestion +fn test_dep_list( + package: &str, + edge_kind: &str, + extra_args: &str, + sets: &[&BTreeSet<&str>], + dep_list_name_for_error: &str, +) { + println!("Testing `cargo tree -p {package} -e {edge_kind} --no-default-features {extra_args}`"); + let mut errors = Vec::new(); + let dep_list = get_dep_list(package, edge_kind, extra_args); + for i in dep_list.windows(2) { + if i[0].crate_name == i[1].crate_name { + errors.push(format!( + "Found two versions for `{0}` ({1} & {2})", + i[0].crate_name, i[0].crate_version, i[1].crate_version + )); + } + } + + 'dep_loop: for i in dep_list { + if i.crate_name == package { + continue; + } + let name = &i.crate_name; + for s in sets { + if s.contains(&**name) { + continue 'dep_loop; + } + } + errors.push(format!( + "Found non-allowlisted crate `{name}`, consider adding to \ + {dep_list_name_for_error} in depcheck/src/main.rs if intentional" + )); + } + + if !errors.is_empty() { + eprintln!("Found invalid dependencies:"); + for e in errors { + eprintln!("\t{e}"); + } + process::exit(1); + } +} + +fn main() { + let basic_runtime: BTreeSet<_> = BASIC_RUNTIME_DEPS.iter().copied().collect(); + let compiled_data: BTreeSet<_> = COMPILED_DEPS.iter().copied().collect(); + + test_dep_list( + "temporal_capi", + "normal,no-proc-macro", + "", + &[&basic_runtime], + "`BASIC_RUNTIME_DEPS`", + ); + + test_dep_list( + "temporal_capi", + "normal,no-proc-macro", + "--features compiled_data", + &[&basic_runtime, &compiled_data], + "`COMPILED_DEPS`", + ); +} + +/// Dependencies that are always allowed as runtime dependencies +/// +pub const BASIC_RUNTIME_DEPS: &[&str] = &[ + // temporal_rs crates + "temporal_rs", + "timezone_provider", + // ICU4X components and utils + "calendrical_calculations", + "core_maths", + "diplomat-runtime", + "icu_calendar", + "icu_calendar_data", + "icu_collections", + "icu_locale", + "icu_locale_core", + "icu_locale_data", + "icu_provider", + "ixdtf", + "litemap", + "potential_utf", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", + // Other deps + "libm", + "num-traits", + "stable_deref_trait", +]; + +// Most of these should be removed +pub const COMPILED_DEPS: &[&str] = &[ + "bytes", + "combine", + "jiff-tzdb", + "memchr", + "tzif", + "timezone_provider", +]; diff --git a/deps/temporal/tools/diplomat-gen/Cargo.toml b/deps/temporal/tools/diplomat-gen/Cargo.toml new file mode 100644 index 00000000000000..80028e3c1732a1 --- /dev/null +++ b/deps/temporal/tools/diplomat-gen/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "diplomat-gen" +edition.workspace = true +version.workspace = true +rust-version.workspace = true +authors.workspace = true +license.workspace = true +repository.workspace = true +readme.workspace = true +exclude.workspace = true +publish = false + +[dependencies] +diplomat-tool.workspace = true diff --git a/deps/temporal/tools/diplomat-gen/src/main.rs b/deps/temporal/tools/diplomat-gen/src/main.rs new file mode 100644 index 00000000000000..5f879b013d5005 --- /dev/null +++ b/deps/temporal/tools/diplomat-gen/src/main.rs @@ -0,0 +1,44 @@ +use std::{io, path::Path}; + +use diplomat_tool::config::Config; + +fn main() -> std::io::Result<()> { + const LANGUAGES: [&str; 2] = ["c", "cpp"]; + + let manifest = Path::new(env!("CARGO_MANIFEST_DIR")); + + let capi = manifest + .parent() + .unwrap() + .parent() + .unwrap() + .join("temporal_capi"); + + let mut library_config = Config::default(); + library_config.shared_config.lib_name = Some("temporal_rs".into()); + + for lang in LANGUAGES { + diplomat_tool::gen( + &capi.join("src/lib.rs"), + lang, + &{ + let mut include = capi.join("bindings").join(lang); + if lang == "cpp" { + include = include.join("temporal_rs"); + } + if let Err(err) = std::fs::remove_dir_all(&include) { + if err.kind() != io::ErrorKind::NotFound { + return Err(err); + } + } + std::fs::create_dir(&include)?; + include + }, + &Default::default(), + library_config.clone(), + false, + )?; + } + + Ok(()) +} diff --git a/deps/temporal/tools/tzif-inspect/Cargo.toml b/deps/temporal/tools/tzif-inspect/Cargo.toml new file mode 100644 index 00000000000000..80131cc5049b36 --- /dev/null +++ b/deps/temporal/tools/tzif-inspect/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "tzif-inspect" +edition.workspace = true +version.workspace = true +rust-version.workspace = true +authors.workspace = true +license.workspace = true +repository.workspace = true +readme.workspace = true +exclude.workspace = true +publish = false + +[dependencies] +jiff-tzdb.workspace = true +tzif.workspace = true +temporal_rs = {workspace = true, features = ["tzdb", "compiled_data"]} +timezone_provider = {workspace = true, features = ["tzif"]} diff --git a/deps/temporal/tools/tzif-inspect/README.md b/deps/temporal/tools/tzif-inspect/README.md new file mode 100644 index 00000000000000..2975394bc5a0e4 --- /dev/null +++ b/deps/temporal/tools/tzif-inspect/README.md @@ -0,0 +1,9 @@ +# tzif-inspect + +Simple utility tool to dump the data for a given tzdb entry + +To run: + +```sh +cargo run -p tzif-inspect -- America/Los_Angeles +``` diff --git a/deps/temporal/tools/tzif-inspect/src/main.rs b/deps/temporal/tools/tzif-inspect/src/main.rs new file mode 100644 index 00000000000000..c05854a3e49fcb --- /dev/null +++ b/deps/temporal/tools/tzif-inspect/src/main.rs @@ -0,0 +1,219 @@ +use std::env; +use std::string::ToString; +use temporal_rs::partial::PartialDuration; +use temporal_rs::{Duration, PlainDate, PlainTime, TimeZone, ZonedDateTime}; +use timezone_provider::tzif::Tzif; +use tzif::data::posix::TransitionDay; +use tzif::data::time::Seconds; +use tzif::data::tzif::{StandardWallIndicator, UtLocalIndicator}; + +macro_rules! format_line( + ($arr:ident[$i:expr], $($args:expr),*) => { + let string = stringify!($arr); + let array = format!("{}[{}]", string, $i); + format_line!(array, $($args),*) + }; + ($a:expr, $b:expr, $c: expr, $d: expr) => { + println!("{:<25} {:<20} {:<5} {}", $a, $b, $c, $d) + }; + ($a:expr, $b:expr, $c: expr) => { + println!("{:<25} {:<20} {}", $a, $b, $c) + }; + ($a:expr, $b:expr) => { + println!("{:<25} {}", $a, $b) + }; +); + +fn seconds_to_zdt_string(s: Seconds, time_zone: TimeZone) -> String { + ZonedDateTime::try_new_iso(s.0 as i128 * 1_000_000_000, time_zone) + .unwrap() + .to_string() +} + +fn seconds_to_offset_time(s: Seconds) -> String { + let is_negative = s.0 < 0; + let seconds = s.0.abs(); + let partial = PartialDuration::default().with_seconds(seconds); + let time = PlainTime::default() + .add(&Duration::from_partial_duration(partial).unwrap()) + .unwrap(); + let string = time.to_ixdtf_string(Default::default()).unwrap(); + if is_negative { + format!("-{string}") + } else { + string + } +} + +fn month(m: u16) -> &'static str { + match m { + 1 => "Jan", + 2 => "Feb", + 3 => "Mar", + 4 => "Apr", + 5 => "May", + 6 => "Jun", + 7 => "Jul", + 8 => "Aug", + 9 => "Sep", + 10 => "Oct", + 11 => "Nov", + 12 => "Dec", + _ => unreachable!(), + } +} + +fn format_transition_day(trans_day: TransitionDay) -> String { + match trans_day { + TransitionDay::NoLeap(d) | TransitionDay::WithLeap(d) => { + let no_leap = matches!(trans_day, TransitionDay::NoLeap(_)); + let start_year = if no_leap { 2001 } else { 2004 }; + let start_date = PlainDate::new(start_year, 1, 1, Default::default()).unwrap(); + let date_duration = Duration::new(0, 0, 0, d.into(), 0, 0, 0, 0, 0, 0).unwrap(); + let adjusted = start_date.add(&date_duration, None).unwrap(); + let m = month(adjusted.month().into()); + let day = adjusted.day(); + if no_leap { + format!("NoLeap({d}): {m} {day}") + } else { + format!("WithLeap({d}): {m} {day}") + } + } + TransitionDay::Mwd(m, w, d) => { + let month = month(m); + let day = match d { + 0 => "Sun", + 1 => "Mon", + 2 => "Tue", + 3 => "Wed", + 4 => "Thu", + 5 => "Fri", + 6 => "Sat", + _ => unreachable!(), + }; + + format!("{day} #{w} of {month}") + } + } +} +fn main() { + let tz = env::args().nth(1).expect("Needs one argument"); + let tzif = jiff_tzdb::get(&tz).unwrap(); + let tzif = Tzif::from_bytes(tzif.1).unwrap(); + let time_zone = TimeZone::try_from_identifier_str(&tz).unwrap(); + let utc = TimeZone::try_from_identifier_str("UTC").unwrap(); + + let Some(header) = tzif.header2 else { + println!("No V2 header"); + return; + }; + let Some(db) = tzif.data_block2 else { + println!("No V2 data"); + return; + }; + + println!("--------- Header ----------"); + format_line!("version", header.version); + format_line!("isutcnt", header.isutcnt); + format_line!("isstdcnt", header.isstdcnt); + format_line!("leapcnt", header.leapcnt); + format_line!("timecnt", header.timecnt); + format_line!("typecnt", header.typecnt); + format_line!("charcnt", header.charcnt); + println!("\n--------- Data ----------"); + format_line!("Transition", "Time", "Type", "Time (formatted)"); + for (i, seconds) in db.transition_times.iter().enumerate() { + format_line!( + transitions[i], + seconds.0, + db.transition_types[i], + seconds_to_zdt_string(*seconds, time_zone) + ); + } + + println!(); + for (i, ltt) in db.local_time_type_records.iter().enumerate() { + format_line!(localtimetype[i], ""); + format_line!(" utcoff", ltt.utoff.0, seconds_to_offset_time(ltt.utoff)); + format_line!(" is_dst", ltt.is_dst); + format_line!(" idx", ltt.idx); + } + + if !db.time_zone_designations.is_empty() { + println!(); + } + for (i, desig) in db.time_zone_designations.iter().enumerate() { + format_line!(desginations[i], desig); + } + + if !db.leap_second_records.is_empty() { + println!(); + } + for (i, leap) in db.leap_second_records.iter().enumerate() { + format_line!( + leap[i], + leap.occurrence.0, + leap.correction, + seconds_to_zdt_string(leap.occurrence, utc) + ); + } + + if !db.ut_local_indicators.is_empty() { + println!(); + } + for (i, utlocal) in db.ut_local_indicators.iter().enumerate() { + let utlocal = if *utlocal == UtLocalIndicator::Ut { + "UT" + } else { + "local" + }; + format_line!(ut_local[i], utlocal); + } + + if !db.standard_wall_indicators.is_empty() { + println!(); + } + for (i, sw) in db.standard_wall_indicators.iter().enumerate() { + let sw = if *sw == StandardWallIndicator::Standard { + "standard" + } else { + "wall" + }; + format_line!(standard_wall[i], sw); + } + + println!("\n--------- Footer ----------"); + if let Some(footer) = tzif.footer { + let offset = footer.std_info.offset.0; + format_line!( + "std_info", + footer.std_info.name, + offset, + // Posix offsets are backwards + seconds_to_offset_time(Seconds(-offset)) + ); + if let Some(dst_info) = footer.dst_info { + format_line!("dst_info", ""); + let offset = dst_info.variant_info.offset.0; + format_line!( + " variant_info", + dst_info.variant_info.name, + offset, + // Posix offsets are backwards + seconds_to_offset_time(Seconds(-offset)) + ); + format_line!( + " start_date", + format_transition_day(dst_info.start_date.day), + dst_info.start_date.time.0, + seconds_to_offset_time(dst_info.start_date.time) + ); + format_line!( + " end_date", + format_transition_day(dst_info.end_date.day), + dst_info.end_date.time.0, + seconds_to_offset_time(dst_info.end_date.time) + ); + } + } +} diff --git a/deps/temporal/tools/zoneinfo-test-gen/Cargo.toml b/deps/temporal/tools/zoneinfo-test-gen/Cargo.toml new file mode 100644 index 00000000000000..f16e0cfe55806b --- /dev/null +++ b/deps/temporal/tools/zoneinfo-test-gen/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "zoneinfo-test-gen" +edition.workspace = true +version.workspace = true +rust-version.workspace = true +authors.workspace = true +license.workspace = true +repository.workspace = true +readme.workspace = true +exclude.workspace = true +publish = false + +[dependencies] +clap = { version = "4.5.47", features = ["derive"] } +serde = { version = "1.0.225", features = ["derive"] } +serde_json = "1.0.145" +tzif.workspace = true diff --git a/deps/temporal/tools/zoneinfo-test-gen/README.md b/deps/temporal/tools/zoneinfo-test-gen/README.md new file mode 100644 index 00000000000000..7d23e9efcb9aed --- /dev/null +++ b/deps/temporal/tools/zoneinfo-test-gen/README.md @@ -0,0 +1,37 @@ +# zoneinfo-test-gen + +`zoneinfo-test-gen` is a tool for generating `zoneinfo` test data from +TZif data. + +To use, run: + +``` +cargo run -p zoneinfo-test-gen +``` + +This tool will by default attempt to read from the local UNIX zoneinfo +directory, `/usr/share/zoneinfo`. + +For specialized data, download a new tzdata from IANA by clicking on the +link below. + +[IANA Download](https://data.iana.org/time-zones/tzdata-latest.tar.gz) + +Once downloaded and extracted, new tzif files can be compiled with the +below command: + +``` +zic [OPTIONS] -d +``` + +Options must be set for the specific configuration that the test data +should be in. + +NOTE: zoneinfo files are in `vanguard` by default. + +From IANA's `tzdata` directory, switching zoneinfo files to rearguard +from vanguard can be completed by running: + +``` +awk -v DATAFORM=rearguard -f ziguard.awk > output +``` diff --git a/deps/temporal/tools/zoneinfo-test-gen/src/main.rs b/deps/temporal/tools/zoneinfo-test-gen/src/main.rs new file mode 100644 index 00000000000000..89684348f13b9e --- /dev/null +++ b/deps/temporal/tools/zoneinfo-test-gen/src/main.rs @@ -0,0 +1,115 @@ +use clap::Parser; +use serde::{Deserialize, Serialize}; +use std::{ + fs, + path::{Path, PathBuf}, +}; + +#[derive(Debug, Serialize, Deserialize)] +struct TzifTestData { + first_record: LocalRecord, + transitions: Vec, +} + +#[derive(Debug, Serialize, Deserialize)] +struct TransitionRecord { + transition_time: i64, + record: LocalRecord, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct LocalRecord { + offset: i64, + is_dst: bool, + abbr: String, +} + +// Utility function for generating example files +fn generate_test_data(input_dir: PathBuf, output_dir: PathBuf, identifier: &str) { + let filename = identifier.to_lowercase().replace("/", "-"); + let test_data_path = output_dir.join(format!("{filename}.json")); + + let tzif_path = input_dir.join(identifier); + std::println!("Parsing tzif from {tzif_path:?}"); + let tzif = tzif::parse_tzif_file(&tzif_path).unwrap(); + + let tzif_block_v2 = tzif.data_block2.unwrap(); + let first_record_data = tzif_block_v2.local_time_type_records[0]; + let first_record = LocalRecord { + offset: first_record_data.utoff.0, + is_dst: first_record_data.is_dst, + abbr: tzif_block_v2.time_zone_designations[0].clone(), + }; + + // TODO: There may be a bug in `tzif` around handling of split abbr (EX: IST/GMT) + let local_records = tzif_block_v2 + .local_time_type_records + .iter() + .map(|r| LocalRecord { + offset: r.utoff.0, + is_dst: r.is_dst, + abbr: tzif_block_v2 + .time_zone_designations + .get(r.idx / 4) + .cloned() + .unwrap_or(String::from("unknown")), + }) + .collect::>(); + + let transitions = tzif_block_v2 + .transition_times + .iter() + .zip(tzif_block_v2.transition_types) + .map(|(time, time_type)| TransitionRecord { + transition_time: time.0, + record: local_records[time_type].clone(), + }) + .collect::>(); + + let tzif_data = TzifTestData { + first_record, + transitions, + }; + + std::println!("Writing generated example data to {test_data_path:?}"); + fs::write( + test_data_path, + serde_json::to_string_pretty(&tzif_data).unwrap(), + ) + .unwrap(); +} + +const UNIX_ZONEINFO: &str = "/usr/share/zoneinfo/"; + +#[derive(clap::Parser)] +struct Args { + /// Output directory relative to `CARGO_MANIFEST_DIR` + #[arg(short, long)] + output_dir: Option, + + /// The zoneinfo / tzdata directory relative to `CARGO_MANIFEST_DIR` (defaults to UNIX zoneinfo) + #[arg(short = 'i', long)] + zoneinfo_dir: Option, + + identifier: String, +} + +fn main() { + let args = Args::parse(); + let manifest_dir = Path::new(env!("CARGO_MANIFEST_DIR")); + + // Create input directory + let zoneinfo_dir = if let Some(dir) = args.zoneinfo_dir { + manifest_dir.join(dir) + } else { + PathBuf::from(UNIX_ZONEINFO) + }; + // Create output directory + let out_dir = if let Some(dir) = args.output_dir { + manifest_dir.join(dir) + } else { + manifest_dir.into() + }; + + generate_test_data(zoneinfo_dir, out_dir, "Antarctica/Troll"); +} diff --git a/deps/temporal/zoneinfo/Cargo.toml b/deps/temporal/zoneinfo/Cargo.toml new file mode 100644 index 00000000000000..f69398319c07c9 --- /dev/null +++ b/deps/temporal/zoneinfo/Cargo.toml @@ -0,0 +1,30 @@ +[package] +name = "zoneinfo_rs" +description = "Zoneinfo parser and compiler" +edition.workspace = true +version = "0.0.17" +rust-version.workspace = true +authors.workspace = true +license.workspace = true +repository.workspace = true +readme.workspace = true +exclude.workspace = true +include = [ + "src/**/*", + "Cargo.toml", + "LICENSE-Apache", + "LICENSE-MIT", + "README.md", +] + +[features] +std = [] + +[dependencies] +hashbrown = "0.16.0" +indexmap = "2.11.4" + +[dev-dependencies] +tzif = { workspace = true } +serde_json = "1.0.145" +serde = { version = "1.0.225", features = ["derive"] } diff --git a/deps/temporal/zoneinfo/README.md b/deps/temporal/zoneinfo/README.md new file mode 100644 index 00000000000000..f5ad045e99e06e --- /dev/null +++ b/deps/temporal/zoneinfo/README.md @@ -0,0 +1,28 @@ + +# Zoneinfo_rs + +**NOTE:** This crate is experimental and should be considered unstable. + +`zoneinfo_rs` provides basic parsing and compilation of IANA's time zone database +zoneinfo files. + +```rust +use std::path::Path; +use zoneinfo_rs::{ZoneInfoData, ZoneInfoCompiler}; +// Below assumes we are in the parent directory of `tzdata` +let zoneinfo_filepath = Path::new("./tzdata/"); +let parsed_data = ZoneInfoData::from_zoneinfo_directory(zoneinfo_filepath)?; +let _compiled_data = ZoneInfoCompiler::new(parsed_data).build(); +``` + +## Extra notes + +Currently, parsing only supports parsing of zoneinfo files and none of the preprocessing +typically completed by `awk` scripts in tzdata. + +It is recommended to still use the baseline awk script until preprocessing is supported. + +## IANA tzdb repository + +The latest version of the time zone database can be found [here](https://www.iana.org/time-zones) + diff --git a/deps/temporal/zoneinfo/src/compiler.rs b/deps/temporal/zoneinfo/src/compiler.rs new file mode 100644 index 00000000000000..48f079b2e9d6cb --- /dev/null +++ b/deps/temporal/zoneinfo/src/compiler.rs @@ -0,0 +1,189 @@ +//! Zone info compiler functionality +//! +//! This module contains the zone info compiler logic along +//! with output types. +//! + +use alloc::collections::BTreeSet; +use alloc::string::String; +use hashbrown::HashMap; + +#[derive(Debug, Clone, PartialEq)] +pub struct LocalTimeRecord { + pub offset: i64, + pub saving: Time, + pub letter: Option, + pub designation: String, // AKA format / abbr +} + +// TODO: improve `Transition` repr this type provides a lot of +// information by design, but the local time record data +// should be separated from the transition info with a clear +// separation. +// +// EX: +// pub struct Transition { +// /// The time to transition at +// pub at_time: i64, +// /// The transition time kind. +// pub time_type: QualifiedTimeKind, +// /// LocalTimeRecord transitioned into +// pub to_local: ZoneInfoLocalTimeRecord, +// } +// +/// The primary transition data. +#[derive(Debug, Clone, PartialEq, Eq)] +#[non_exhaustive] +pub struct Transition { + /// The time to transition at + /// + /// This represents the time in Unix Epoch seconds + /// at which a transition should occur. + pub at_time: i64, + /// The transition time kind. + /// + /// Whether the transition was specified in Local, Standard, or Universal time. + pub time_type: QualifiedTimeKind, + + // TODO: Below are fields that should be split into a + // currently non-existent LocalTime record. + /// The offset of the transition. + pub offset: i64, + /// Whether the transition is a savings offset or not + /// + /// This flag corresponds to the `is_dst` flag + pub dst: bool, + /// The savings for the local time record + /// + /// This field represents the exact [`Time`] value + /// used for savings. + pub savings: Time, + /// The letter designation for the local time record + /// + /// The LETTER designation used in the fully formatted + /// abbreviation + pub letter: Option, + /// The abbreviation format for the local time record. + pub format: String, +} + +impl Ord for Transition { + fn cmp(&self, other: &Self) -> core::cmp::Ordering { + self.at_time.cmp(&other.at_time) + } +} + +impl PartialOrd for Transition { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +/// `CompiledTransitions` is the complete compiled transition data +/// for one zone. +/// +/// The compiled transition data contains an initial local time record, an ordered +/// set of transition data, and a POSIX time zone string. +/// +/// In general, this struct offers the required data in a consummable format +/// for anyone who compiled zoneinfo data. +#[non_exhaustive] +#[derive(Debug, PartialEq)] +pub struct CompiledTransitions { + /// The initial local time record. + /// + /// This is used in the case where a time predates a transition time. + pub initial_record: LocalTimeRecord, + + /// The full set of calculated time zone transitions + pub transitions: BTreeSet, + + /// The POSIX time zone string + /// + /// This string should be used to calculate the time zone beyond the last available transition. + pub posix_time_zone: PosixTimeZone, +} + +// NOTE: candidate for removal? Should this library offer TZif structs long term? +// +// I think I would prefer all of that live in the `tzif` crate, but that will +// be a process to update. So implement it here, and then upstream it? +impl CompiledTransitions { + pub fn to_v2_data_block(&self) -> TzifBlockV2 { + TzifBlockV2::from_transition_data(self) + } +} + +/// The `CompiledTransitionsMap` struct contains a mapping of zone identifiers (AKA IANA identifiers) to +/// the zone's `CompiledTransitions` +#[derive(Debug, Default)] +pub struct CompiledTransitionsMap { + pub data: HashMap, +} + +// ==== ZoneInfoCompiler build / compile methods ==== + +use crate::{ + posix::PosixTimeZone, + types::{QualifiedTimeKind, Time}, + tzif::TzifBlockV2, + zone::ZoneRecord, + ZoneInfoData, +}; + +/// The compiler for turning `ZoneInfoData` into `CompiledTransitionsData` +pub struct ZoneInfoCompiler { + data: ZoneInfoData, +} + +impl ZoneInfoCompiler { + /// Create a new `ZoneInfoCompiler` instance with provided `ZoneInfoData`. + pub fn new(data: ZoneInfoData) -> Self { + Self { data } + } + + /// Build transition data for a specific zone. + pub fn build_zone(&mut self, target: &str) -> CompiledTransitions { + if let Some(zone) = self.data.zones.get_mut(target) { + zone.associate_rules(&self.data.rules); + } + self.build_zone_internal(target) + } + + pub fn build(&mut self) -> CompiledTransitionsMap { + // Associate the necessary rules with the ZoneTable + self.associate(); + // TODO: Validate and resolve settings here. + let mut zoneinfo = CompiledTransitionsMap::default(); + for identifier in self.data.zones.keys() { + let transition_data = self.build_zone_internal(identifier); + let _ = zoneinfo.data.insert(identifier.clone(), transition_data); + } + zoneinfo + } + + /// The internal method for retrieving a zone table and compiling it. + pub(crate) fn build_zone_internal(&self, target: &str) -> CompiledTransitions { + let zone_table = self + .data + .zones + .get(target) + .expect("Invalid identifier provided."); + zone_table.compile() + } + + pub fn get_posix_time_zone(&mut self, target: &str) -> Option { + self.associate(); + self.data + .zones + .get(target) + .map(ZoneRecord::get_posix_time_zone) + } + + /// Associates the current `ZoneTables` with their applicable rules. + pub fn associate(&mut self) { + for zones in self.data.zones.values_mut() { + zones.associate_rules(&self.data.rules); + } + } +} diff --git a/deps/temporal/zoneinfo/src/lib.rs b/deps/temporal/zoneinfo/src/lib.rs new file mode 100644 index 00000000000000..57726bfb4abc06 --- /dev/null +++ b/deps/temporal/zoneinfo/src/lib.rs @@ -0,0 +1,153 @@ +//! A library for parsing and compiling zoneinfo files into +//! time zone transition data that can be used to build +//! TZif files or any other desired time zone format. +//! +//! `zoneinfo_rs` offers default parsing and compiling +//! of zoneinfo files into time zone transition data. +//! +//! Why `zoneinfo_rs`? +//! +//! In general, this library seeks to maximally expose as much +//! data from the zoneinfo files as possible while also supporting +//! extra time zone database features like the zone.tab, PACKRATLIST, +//! and POSIX time zone strings. +//! + +// TODO list: +// +// - Support PACKRATLIST +// - Support zone.tab +// - Support leap second +// - Support vanguard and rear guard parsing (potential backlog) +// - Provide easy defaults for SLIM and FAT compiling. +// - Support v1 TZif with conversion to i32. +// + +// Implementation note: this library is NOT designed to be the most +// optimal speed. Instead invariance and clarity is preferred where +// need be. +// +// We can get away with any performance penalty primarily because +// this library is designed to aid with build time libraries, on +// a limited dataset, NOT at runtime on extremely large datasets. + +#![no_std] + +extern crate alloc; + +use alloc::string::String; +use parser::ZoneInfoParseError; + +use hashbrown::HashMap; + +#[cfg(feature = "std")] +extern crate std; + +#[cfg(feature = "std")] +use std::{io, path::Path}; + +pub(crate) mod utils; + +pub mod compiler; +pub mod parser; +pub mod posix; +pub mod rule; +pub mod types; +pub mod tzif; +pub mod zone; + +#[doc(inline)] +pub use compiler::ZoneInfoCompiler; + +#[doc(inline)] +pub use parser::ZoneInfoParser; + +use rule::Rules; +use zone::ZoneRecord; + +/// Well-known zone info file +pub const ZONEINFO_FILES: [&str; 9] = [ + "africa", + "antarctica", + "asia", + "australasia", + "backward", + "etcetera", + "europe", + "northamerica", + "southamerica", +]; + +/// The general error type for `ZoneInfo` operations +#[derive(Debug)] +pub enum ZoneInfoError { + Parse(ZoneInfoParseError), + #[cfg(feature = "std")] + Io(io::Error), +} + +#[cfg(feature = "std")] +impl From for ZoneInfoError { + fn from(value: io::Error) -> Self { + Self::Io(value) + } +} + +/// `ZoneInfoData` represents raw unprocessed zone info data +/// as parsed from a zone info file. +/// +/// See [`ZoneInfoCompiler`] if transitions are required. +#[non_exhaustive] +#[derive(Debug, Clone, Default)] +pub struct ZoneInfoData { + /// Data parsed from zone info Rule lines keyed by Rule name + pub rules: HashMap, + /// Data parsed from zone info Zone records. + pub zones: HashMap, + /// Data parsed from Link lines + pub links: HashMap, + /// Data parsed from `#PACKRATLIST` lines + pub pack_rat: HashMap, +} + +// ==== ZoneInfoData parsing methods ==== + +impl ZoneInfoData { + /// Parse data from a path to a directory of zoneinfo files, using well known + /// zoneinfo file names. + /// + /// This is usually pointed to a "tzdata" directory. + #[cfg(feature = "std")] + pub fn from_zoneinfo_directory>(dir: P) -> Result { + let mut zoneinfo = Self::default(); + for filename in ZONEINFO_FILES { + let file_path = dir.as_ref().join(filename); + let parsed = Self::from_filepath(file_path)?; + zoneinfo.extend(parsed); + } + Ok(zoneinfo) + } + + /// Parse data from a filepath to a zoneinfo file. + #[cfg(feature = "std")] + pub fn from_filepath + core::fmt::Debug>( + path: P, + ) -> Result { + Self::from_zoneinfo_file(&std::fs::read_to_string(path)?) + } + + /// Parses data from a zoneinfo file as a string slice. + pub fn from_zoneinfo_file(src: &str) -> Result { + ZoneInfoParser::from_zoneinfo_str(src) + .parse() + .map_err(ZoneInfoError::Parse) + } + + /// Extend the current `ZoneInfoCompiler` data from another `ZoneInfoCompiler`. + pub fn extend(&mut self, other: Self) { + self.rules.extend(other.rules); + self.zones.extend(other.zones); + self.links.extend(other.links); + self.pack_rat.extend(other.pack_rat); + } +} diff --git a/deps/temporal/zoneinfo/src/parser.rs b/deps/temporal/zoneinfo/src/parser.rs new file mode 100644 index 00000000000000..efe7606b6e61f7 --- /dev/null +++ b/deps/temporal/zoneinfo/src/parser.rs @@ -0,0 +1,222 @@ +//! Zone info parsing implementation + +use core::{ + iter::Peekable, + num::ParseIntError, + str::{Lines, SplitWhitespace}, +}; + +use alloc::{borrow::ToOwned, string::String, vec, vec::Vec}; + +use crate::{ + rule::{Rule, Rules}, + zone::ZoneRecord, + ZoneInfoData, +}; + +/// The zoneinfo parsing error +#[derive(Debug)] +pub enum ZoneInfoParseError { + InvalidZoneHeader(u32), + MissingIdentifier(u32), + UnexpectedEndOfLine(u32, &'static str), + UnknownValue(u32, String), + ParseIntError(u32, ParseIntError, &'static str), +} + +impl ZoneInfoParseError { + pub(crate) fn unexpected_eol(ctx: &LineParseContext) -> Self { + Self::UnexpectedEndOfLine(ctx.line_number, ctx.span()) + } + + pub(crate) fn unknown(s: &str, ctx: &LineParseContext) -> Self { + Self::UnknownValue(ctx.line_number, s.to_owned()) + } +} + +/// A utility trait for implementing a `try_from_str` with a provided +/// context. +pub trait TryFromStr: Sized { + type Error; + fn try_from_str(s: &str, context: &mut C) -> Result; +} + +/// The context for the line parser +#[derive(Debug, Clone)] +pub struct LineParseContext { + pub line_number: u32, + pub spans: Vec<&'static str>, +} + +impl LineParseContext { + pub fn enter(&mut self, name: &'static str) { + self.spans.push(name); + } + + pub fn span(&self) -> &'static str { + self.spans.last().expect("span not defined") + } + + pub fn exit(&mut self) { + self.spans.pop(); + } +} + +impl Default for LineParseContext { + fn default() -> Self { + Self { + line_number: 1, + spans: vec!["undefined"], + } + } +} + +pub trait ContextParse { + fn context_parse>( + &self, + ctx: &mut LineParseContext, + ) -> Result>::Error>; +} + +impl ContextParse for &str { + fn context_parse>( + &self, + ctx: &mut LineParseContext, + ) -> Result>::Error> { + T::try_from_str(self, ctx) + } +} + +impl ContextParse for String { + fn context_parse>( + &self, + ctx: &mut LineParseContext, + ) -> Result>::Error> { + T::try_from_str(self, ctx) + } +} + +impl TryFromStr for String { + type Error = ZoneInfoParseError; + fn try_from_str(s: &str, _: &mut LineParseContext) -> Result { + Ok(s.to_owned()) + } +} + +impl TryFromStr for i8 { + type Error = ZoneInfoParseError; + fn try_from_str(s: &str, ctx: &mut LineParseContext) -> Result { + s.parse::() + .map_err(|e| ZoneInfoParseError::ParseIntError(ctx.line_number, e, ctx.span())) + } +} + +impl TryFromStr for u8 { + type Error = ZoneInfoParseError; + fn try_from_str(s: &str, ctx: &mut LineParseContext) -> Result { + s.parse::() + .map_err(|e| ZoneInfoParseError::ParseIntError(ctx.line_number, e, ctx.span())) + } +} + +impl TryFromStr for u16 { + type Error = ZoneInfoParseError; + fn try_from_str(s: &str, ctx: &mut LineParseContext) -> Result { + s.parse::() + .map_err(|e| ZoneInfoParseError::ParseIntError(ctx.line_number, e, ctx.span())) + } +} + +impl TryFromStr for i32 { + type Error = ZoneInfoParseError; + fn try_from_str(s: &str, ctx: &mut LineParseContext) -> Result { + s.parse::() + .map_err(|e| ZoneInfoParseError::ParseIntError(ctx.line_number, e, ctx.span())) + } +} + +pub(crate) fn next_split<'a>( + splits: &mut SplitWhitespace<'a>, + context: &LineParseContext, +) -> Result<&'a str, ZoneInfoParseError> { + splits.next().ok_or(ZoneInfoParseError::UnexpectedEndOfLine( + context.line_number, + context.span(), + )) +} + +pub(crate) fn remove_comments(line: &str) -> &str { + if let Some((cleaned, _comment)) = line.split_once("#") { + cleaned + } else { + line + } +} + +/// The primary parser for zoneinfo code points. +/// +/// This parser takes a single `&str` of data and parses the provided +/// `&str` into zoneinfo data. +/// +/// The parser uses the approach of a line parser, and evaluates the text +/// line by line. +#[non_exhaustive] +pub struct ZoneInfoParser<'data> { + lines: Peekable>, +} + +impl<'data> ZoneInfoParser<'data> { + /// Creates a parser from a `&str` + pub fn from_zoneinfo_str(source: &'data str) -> Self { + Self { + lines: source.lines().peekable(), + } + } + + /// Parse the provided lines + pub fn parse(&mut self) -> Result { + let mut zoneinfo = ZoneInfoData::default(); + let mut context = LineParseContext::default(); + + // The allow clippy is used in favor of for so that `ZoneTable` can + // iterate and parse it's own lines in `Zone::parse_full_table`. + #[allow(clippy::while_let_on_iterator)] + while let Some(line) = self.lines.peek() { + // Check if line is empty or a comment + if line.is_empty() || line.starts_with("#") { + // NOTE: This may be able to be consildated with link based off a flag. + if line.starts_with("#PACKRATLIST") { + let mut splits = line.split_whitespace(); + next_split(&mut splits, &context)?; // Consume the #PACKRATLIST + next_split(&mut splits, &context)?; // Consume the zone.tab + next_split(&mut splits, &context)?; // Consume the Link + let zone = next_split(&mut splits, &context)?; + let link = next_split(&mut splits, &context)?; + zoneinfo.pack_rat.insert(link.to_owned(), zone.to_owned()); + } + } else if line.starts_with("Rule") { + // TODO: Return a Rule Table and handle extending the table when needed. + let (identifier, data) = Rule::parse_from_line(line, &mut context).unwrap(); + if let Some(rules) = zoneinfo.rules.get_mut(&identifier) { + rules.extend(data); + } else { + zoneinfo.rules.insert(identifier, Rules::initialize(data)); + } + } else if line.starts_with("Zone") { + let (identifer, table) = + ZoneRecord::parse_full_table(&mut self.lines, &mut context).unwrap(); + zoneinfo.zones.insert(identifer, table); + continue; // Skip the next line call + } else if line.starts_with("Link") { + let mut splits = line.split_whitespace(); + next_split(&mut splits, &context)?; // Consume the Link + let zone = next_split(&mut splits, &context)?; + let link = next_split(&mut splits, &context)?; + zoneinfo.links.insert(link.to_owned(), zone.to_owned()); + } + self.lines.next(); + context.line_number += 1; + } + Ok(zoneinfo) + } +} diff --git a/deps/temporal/zoneinfo/src/posix.rs b/deps/temporal/zoneinfo/src/posix.rs new file mode 100644 index 00000000000000..ff1f7f467fb3ea --- /dev/null +++ b/deps/temporal/zoneinfo/src/posix.rs @@ -0,0 +1,228 @@ +use crate::{ + rule::{LastRules, Rule}, + types::{DayOfMonth, Month, QualifiedTime, Sign, Time, WeekDay}, + utils::month_to_day, + zone::ZoneEntry, +}; +use alloc::string::String; +use core::fmt::Write; + +/// The POSIX time zone designated by the [GNU documentation][gnu-docs] +/// +/// [gnu-docs]: https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html +#[derive(Debug, PartialEq)] +pub struct PosixTimeZone { + pub abbr: PosixAbbreviation, + pub offset: Time, + pub transition_info: Option, +} + +impl PosixTimeZone { + pub(crate) fn from_zone_and_savings(entry: &ZoneEntry, savings: Time) -> Self { + let offset = entry.std_offset.add(savings); + let formatted = entry + .format + .format(offset.as_secs(), None, savings != Time::default()); + let is_numeric = is_numeric(&formatted); + let abbr = PosixAbbreviation { + is_numeric, + formatted, + }; + Self { + abbr, + offset, + transition_info: None, + } + } + + pub(crate) fn from_zone_and_rules(entry: &ZoneEntry, rules: &LastRules) -> Self { + let offset = entry.std_offset.add(rules.standard.save); + let formatted = entry.format.format( + entry.std_offset.as_secs(), + rules.standard.letter.as_deref(), + rules.standard.is_dst(), + ); + let is_numeric = is_numeric(&formatted); + let abbr = PosixAbbreviation { + is_numeric, + formatted, + }; + + let transition_info = rules.saving.as_ref().map(|rule| { + let formatted = entry.format.format( + entry.std_offset.as_secs() + rule.save.as_secs(), + rule.letter.as_deref(), + rule.is_dst(), + ); + let abbr = PosixAbbreviation { + is_numeric, + formatted, + }; + let savings = rule.save; + let start = PosixDateTime::from_rule_and_transition_info( + rule, + entry.std_offset, + rules.standard.save, + ); + let end = PosixDateTime::from_rule_and_transition_info( + &rules.standard, + entry.std_offset, + rule.save, + ); + PosixTransition { + abbr, + savings, + start, + end, + } + }); + + PosixTimeZone { + abbr, + offset, + transition_info, + } + } +} + +impl PosixTimeZone { + pub fn to_string(&self) -> Result { + let mut posix_string = String::new(); + write_abbr(&self.abbr, &mut posix_string)?; + write_inverted_time(&self.offset, &mut posix_string)?; + + if let Some(transition_info) = &self.transition_info { + write_abbr(&transition_info.abbr, &mut posix_string)?; + if transition_info.savings != Time::one_hour() { + write_inverted_time(&self.offset.add(transition_info.savings), &mut posix_string)?; + } + write_date_time(&transition_info.start, &mut posix_string)?; + write_date_time(&transition_info.end, &mut posix_string)?; + } + Ok(posix_string) + } +} + +/// The representation of a POSIX time zone transition +#[non_exhaustive] +#[derive(Debug, PartialEq)] +pub struct PosixTransition { + /// The transitions designated abbreviation + pub abbr: PosixAbbreviation, + /// The savings value to be added to the offset + pub savings: Time, + /// The start time for the transition + pub start: PosixDateTime, + /// The end time for the transition + pub end: PosixDateTime, +} + +#[non_exhaustive] +#[derive(Debug, PartialEq, Clone)] +pub struct PosixAbbreviation { + /// Flag whether formatted abbreviation is numeric + pub is_numeric: bool, + /// The formatted abbreviation + pub formatted: String, +} +#[derive(Debug, PartialEq, Clone, Copy)] +pub struct MonthWeekDay(pub Month, pub u8, pub WeekDay); + +#[derive(Debug, PartialEq, Clone, Copy)] +pub enum PosixDate { + JulianNoLeap(u16), + JulianLeap(u16), + MonthWeekDay(MonthWeekDay), +} + +impl PosixDate { + pub(crate) fn from_rule(rule: &Rule) -> Self { + match rule.on_date { + DayOfMonth::Day(day) if rule.in_month == Month::Jan || rule.in_month == Month::Feb => { + PosixDate::JulianNoLeap(month_to_day(rule.in_month as u8, 1) as u16 + day as u16) + } + DayOfMonth::Day(day) => { + PosixDate::JulianLeap(month_to_day(rule.in_month as u8, 1) as u16 + day as u16) + } + DayOfMonth::Last(wd) => PosixDate::MonthWeekDay(MonthWeekDay(rule.in_month, 5, wd)), + DayOfMonth::WeekDayGEThanMonthDay(week_day, day_of_month) => { + let week = 1 + (day_of_month - 1) / 7; + PosixDate::MonthWeekDay(MonthWeekDay(rule.in_month, week, week_day)) + } + DayOfMonth::WeekDayLEThanMonthDay(week_day, day_of_month) => { + let week = day_of_month / 7; + PosixDate::MonthWeekDay(MonthWeekDay(rule.in_month, week, week_day)) + } + } + } +} + +#[derive(Debug, PartialEq, Clone, Copy)] +pub struct PosixDateTime { + pub date: PosixDate, + pub time: Time, +} + +impl PosixDateTime { + pub(crate) fn from_rule_and_transition_info(rule: &Rule, offset: Time, savings: Time) -> Self { + let date = PosixDate::from_rule(rule); + let time = match rule.at { + QualifiedTime::Local(time) => time, + QualifiedTime::Standard(standard_time) => standard_time.add(rule.save), + QualifiedTime::Universal(universal_time) => universal_time.add(offset).add(savings), + }; + Self { date, time } + } +} + +// ==== Helper functions ==== + +fn is_numeric(str: &str) -> bool { + str.parse::().is_ok() +} + +fn write_abbr(posix_abbr: &PosixAbbreviation, output: &mut String) -> core::fmt::Result { + if posix_abbr.is_numeric { + write!(output, "<")?; + write!(output, "{}", posix_abbr.formatted)?; + write!(output, ">")?; + return Ok(()); + } + write!(output, "{}", posix_abbr.formatted) +} + +fn write_inverted_time(time: &Time, output: &mut String) -> core::fmt::Result { + // Yep, it's inverted + if time.sign == Sign::Positive && time.hour != 0 { + write!(output, "-")?; + } + write_time(time, output) +} + +fn write_time(time: &Time, output: &mut String) -> core::fmt::Result { + write!(output, "{}", time.hour)?; + if time.minute == 0 && time.second == 0 { + return Ok(()); + } + write!(output, ":{}", time.minute)?; + if time.second > 0 { + write!(output, ":{}", time.second)?; + } + Ok(()) +} + +fn write_date_time(datetime: &PosixDateTime, output: &mut String) -> core::fmt::Result { + write!(output, ",")?; + match datetime.date { + PosixDate::JulianLeap(d) => write!(output, "{d}")?, + PosixDate::JulianNoLeap(d) => write!(output, "J{d}")?, + PosixDate::MonthWeekDay(MonthWeekDay(month, week, day)) => { + write!(output, "M{}.{week}.{}", month as u8, day as u8)? + } + } + if datetime.time != Time::two_hour() { + write!(output, "/")?; + write_time(&datetime.time, output)?; + } + Ok(()) +} diff --git a/deps/temporal/zoneinfo/src/rule.rs b/deps/temporal/zoneinfo/src/rule.rs new file mode 100644 index 00000000000000..1a598fb526fba2 --- /dev/null +++ b/deps/temporal/zoneinfo/src/rule.rs @@ -0,0 +1,393 @@ +//! Zone info Rule functionality +//! +//! This module implements the core zoneinfo [`Rule`]. + +use core::ops::RangeInclusive; + +use alloc::{borrow::ToOwned, string::String, vec, vec::Vec}; + +use crate::{ + parser::{next_split, ContextParse, LineParseContext, ZoneInfoParseError}, + types::{DayOfMonth, Month, QualifiedTime, Time, ToYear}, + utils::{self, epoch_seconds_for_epoch_days}, +}; + +#[derive(Debug)] +pub struct LastRules { + pub standard: Rule, + pub saving: Option, +} + +/// The `Rule` is a collection of zone info rules under the same +/// rule name. +/// +/// These rule collections can be seen throughout zoneinfo files. +/// +/// # Example +/// +/// The `Chicago` rules can be seen below. +/// +/// ```txt +/// # Rule NAME FROM TO - IN ON AT SAVE LETTER +/// Rule Chicago 1920 only - Jun 13 2:00 1:00 D +/// Rule Chicago 1920 1921 - Oct lastSun 2:00 0 S +/// Rule Chicago 1921 only - Mar lastSun 2:00 1:00 D +/// Rule Chicago 1922 1966 - Apr lastSun 2:00 1:00 D +/// Rule Chicago 1922 1954 - Sep lastSun 2:00 0 S +/// Rule Chicago 1955 1966 - Oct lastSun 2:00 0 S +/// ``` +/// +/// Interestingly, Rules appear to be sorted in chronological +/// order from their start date (FROM). However, their end dates may differ +/// meaning at any one time there can be rule pairs of: [std, dst], +/// [dst, std], [std, empty], or [dst, empty] +/// +#[derive(Debug, Clone)] +pub struct Rules { + rules: Vec, +} + +impl Rules { + pub fn initialize(rule: Rule) -> Self { + Self { rules: vec![rule] } + } + + pub fn extend(&mut self, rule: Rule) { + self.rules.push(rule); + } + + pub(crate) fn rules_for_year(&self, year: i32) -> Vec { + self.rules + .iter() + .filter(|rule| rule.range().contains(&year)) + .cloned() + .collect() + } + + pub(crate) fn find_initial_transition_letter(&self) -> Option { + let first_rule = self + .rules + .iter() + .find(|rule| rule.save == Time::default()) + .expect("A rule must exist with a SAVE = 0"); + first_rule.letter.clone() + } + + pub(crate) fn search_last_active_rule(&self, transition_point: i64) -> Option<&Rule> { + // Reasonable assumption: when searching for a last Rule, + // we are dealing with an orphan. This means we do not need to check years + // with an upper bound or inside them + let mut rule_savings = (i64::MIN, None); + for rule in &self.rules { + let year = rule.to.map(ToYear::to_i32).unwrap_or(i32::from(rule.from)); + let epoch_days = epoch_days_for_rule_date(year, rule.in_month, rule.on_date); + let rule_date_in_seconds = epoch_seconds_for_epoch_days(epoch_days); + // But we do want to keep track of the savings. + if rule_date_in_seconds < transition_point && rule_savings.0 < rule_date_in_seconds { + rule_savings = (rule_date_in_seconds, Some(rule)) + } else if transition_point < rule_date_in_seconds { + break; + } + } + + rule_savings.1 + } + + pub(crate) fn get_last_rules(&self) -> LastRules { + let mut final_epoch_days = i32::MIN; + let mut final_rule = None; + let mut std_max = None; + let mut savings_max = None; + + for rule in &self.rules { + let calc_to_year = rule + .to + .map(|y| { + if let ToYear::Year(y) = y { + Some(y) + } else { + None + } + }) + .unwrap_or(Some(rule.from)); + if let Some(year) = calc_to_year { + let epoch_days = epoch_days_for_rule_date(year as i32, rule.in_month, rule.on_date); + if final_epoch_days < epoch_days { + final_epoch_days = epoch_days; + final_rule = Some(rule.clone()); + } + } + + if rule.to == Some(ToYear::Max) { + if rule.is_dst() { + savings_max = Some(rule.clone()) + } else { + std_max = Some(rule.clone()) + } + } + } + + let standard = if let Some(max_rule) = std_max { + max_rule + } else { + final_rule.expect("must be set") + }; + + LastRules { + standard, + saving: savings_max, + } + } +} + +/// A zone info rule. +#[derive(Debug, Clone, PartialEq)] +pub struct Rule { + pub from: u16, + pub to: Option, + pub in_month: Month, + pub on_date: DayOfMonth, + pub at: QualifiedTime, + pub save: Time, + pub letter: Option, +} + +impl Rule { + fn range(&self) -> RangeInclusive { + i32::from(self.from)..=self.to.map(ToYear::to_i32).unwrap_or(self.from as i32) + } + + pub(crate) fn is_dst(&self) -> bool { + self.save != Time::default() + } + + /// Returns the transition time for that year + pub(crate) fn transition_time_for_year( + &self, + year: i32, + std_offset: &Time, + saving: &Time, + ) -> i64 { + let epoch_days = epoch_days_for_rule_date(year, self.in_month, self.on_date); + let epoch_seconds = epoch_seconds_for_epoch_days(epoch_days); + epoch_seconds + + self + .at + .to_universal_seconds(std_offset.as_secs(), saving.as_secs()) + } +} + +/// epoch_days_for_rule_date calculates the epoch days given values provided for a specific `Rule` +pub(crate) fn epoch_days_for_rule_date(year: i32, month: Month, day_of_month: DayOfMonth) -> i32 { + let day_of_year_for_month = month.month_start_to_day_of_year(year); + let epoch_days_for_year = utils::epoch_days_for_year(year); + let epoch_days = epoch_days_for_year + day_of_year_for_month; + let day_of_month = match day_of_month { + DayOfMonth::Last(weekday) => { + let mut day_of_month = month.month_end_to_day_of_year(year) - day_of_year_for_month; + loop { + let target_days = epoch_days + day_of_month; + let target_week_day = utils::epoch_days_to_week_day(target_days); + if target_week_day == weekday as u8 { + break; + } + day_of_month -= 1; + } + day_of_month + } + DayOfMonth::WeekDayGEThanMonthDay(week_day, d) => { + let mut day_of_month = d as i32 - 1; + loop { + let target_days = epoch_days + day_of_month; + let target_week_day = utils::epoch_days_to_week_day(target_days); + if week_day as u8 == target_week_day { + break day_of_month; + } + day_of_month += 1; + } + } + DayOfMonth::WeekDayLEThanMonthDay(week_day, d) => { + let mut day_of_month = d as i32 - 1; + loop { + let target_days = epoch_days + day_of_month; + let target_week_day = utils::epoch_days_to_week_day(target_days); + if week_day as u8 == target_week_day { + break day_of_month; + } + day_of_month -= 1; + } + } + DayOfMonth::Day(day) => day as i32 - 1, + }; + epoch_days + day_of_month +} + +impl Rule { + /// Parse a `Rule` from a line + /// + /// A rule line is made up of the following columns: + /// + /// # Rule NAME FROM TO - IN ON AT SAVE LETTER + /// + /// The "-" is a reserved field that represents the deprecated TYPE + /// field. It is preserved for backward compatibility reasons. + pub fn parse_from_line( + line: &str, + context: &mut LineParseContext, + ) -> Result<(String, Self), ZoneInfoParseError> { + context.enter("Rule"); + let mut splits = line.split_whitespace(); + let first = splits.next(); // Consume "Rule" + debug_assert!(first == Some("Rule")); + // AKA the NAME field + let identifier = next_split(&mut splits, context)?.to_owned(); + let from = next_split(&mut splits, context)?.context_parse::(context)?; + let to = ToYear::parse_optional_to_year(next_split(&mut splits, context)?, context)?; + next_split(&mut splits, context)?; // Skip the deprecated TYPE field + let in_month = next_split(&mut splits, context)?.context_parse::(context)?; + let on_date = next_split(&mut splits, context)?.context_parse::(context)?; + let at = next_split(&mut splits, context)?.context_parse::(context)?; + let save = next_split(&mut splits, context)?.context_parse::